9 dbm "github.com/tendermint/tmlibs/db"
10 "github.com/vapor/account"
11 "github.com/vapor/asset"
12 "github.com/vapor/blockchain/pseudohsm"
13 "github.com/vapor/blockchain/signers"
14 "github.com/vapor/blockchain/txbuilder"
15 "github.com/vapor/common"
16 "github.com/vapor/config"
17 "github.com/vapor/consensus"
18 engine "github.com/vapor/consensus/consensus"
19 "github.com/vapor/consensus/consensus/dpos"
20 "github.com/vapor/crypto/ed25519/chainkd"
21 "github.com/vapor/database/leveldb"
22 "github.com/vapor/protocol"
23 "github.com/vapor/protocol/bc"
24 "github.com/vapor/protocol/bc/types"
27 func TestWalletUpdate(t *testing.T) {
28 config.CommonConfig = config.DefaultConfig()
29 consensus.SoloNetParams.Signer = "78673764e0ba91a4c5ba9ec0c8c23c69e3d73bf27970e05e0a977e81e13bde475264d3b177a96646bc0ce517ae7fd63504c183ab6d330dea184331a4cf5912d5"
30 config.CommonConfig.Consensus.SelfVoteSigners = append(config.CommonConfig.Consensus.SelfVoteSigners, "vsm1qkm743xmgnvh84pmjchq2s4tnfpgu9ae2f9slep")
31 config.CommonConfig.Consensus.XPrv = "a8e281b615809046698fb0b0f2804a36d824d48fa443350f10f1b80649d39e5f1e85cf9855548915e36137345910606cbc8e7dd8497c831dce899ee6ac112445"
32 for _, v := range config.CommonConfig.Consensus.SelfVoteSigners {
33 address, err := common.DecodeAddress(v, &consensus.SoloNetParams)
37 config.CommonConfig.Consensus.Signers = append(config.CommonConfig.Consensus.Signers, address)
39 config.CommonConfig.Consensus.Coinbase = "vsm1qkm743xmgnvh84pmjchq2s4tnfpgu9ae2f9slep"
40 address, err := common.DecodeAddress(config.CommonConfig.Consensus.Coinbase, &consensus.SoloNetParams)
45 dirPath, err := ioutil.TempDir(".", "")
49 defer os.RemoveAll(dirPath)
51 testDB := dbm.NewDB("testdb", "leveldb", "temp")
52 defer os.RemoveAll("temp")
54 store := leveldb.NewStore(testDB)
55 txPool := protocol.NewTxPool(store)
57 var engine engine.Engine
58 switch config.CommonConfig.Consensus.Type {
62 chain, err := protocol.NewChain(store, txPool, engine)
67 accountManager := account.NewManager(testDB, chain)
68 hsm, err := pseudohsm.New(dirPath)
73 xpub1, _, err := hsm.XCreate("test_pub1", "password", "en")
78 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub}, 1, "testAccount", signers.BIP0044)
83 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
88 controlProg.KeyIndex = 1
90 reg := asset.NewRegistry(testDB, chain)
91 asset, err := reg.Define([]chainkd.XPub{xpub1.XPub}, 1, nil, "TESTASSET", nil)
96 utxos := []*account.UTXO{}
97 btmUtxo := mockUTXO(controlProg, consensus.BTMAssetID)
98 utxos = append(utxos, btmUtxo)
99 OtherUtxo := mockUTXO(controlProg, &asset.AssetID)
100 utxos = append(utxos, OtherUtxo)
102 _, txData, err := mockTxData(utxos, testAccount)
107 tx := types.NewTx(*txData)
108 block := mockSingleBlock(tx)
109 txStatus := bc.NewTransactionStatus()
110 txStatus.SetStatus(0, false)
111 store.SaveBlock(block, txStatus)
112 w := mockWallet(testDB, accountManager, reg, chain, address)
113 err = w.AttachBlock(block)
118 if _, err := w.GetTransactionByTxID(tx.ID.String()); err != nil {
122 wants, err := w.GetTransactions("")
128 func mockUTXO(controlProg *account.CtrlProgram, assetID *bc.AssetID) *account.UTXO {
129 utxo := &account.UTXO{}
130 utxo.OutputID = bc.Hash{V0: 1}
131 utxo.SourceID = bc.Hash{V0: 2}
132 utxo.AssetID = *assetID
133 utxo.Amount = 1000000000
135 utxo.ControlProgram = controlProg.ControlProgram
136 utxo.AccountID = controlProg.AccountID
137 utxo.Address = controlProg.Address
138 utxo.ControlProgramIndex = controlProg.KeyIndex
142 func mockTxData(utxos []*account.UTXO, testAccount *account.Account) (*txbuilder.Template, *types.TxData, error) {
143 tplBuilder := txbuilder.NewBuilder(time.Now())
145 for _, utxo := range utxos {
146 txInput, sigInst, err := account.UtxoToInputs(testAccount.Signer, utxo)
150 tplBuilder.AddInput(txInput, sigInst)
152 out := &types.TxOutput{}
153 if utxo.AssetID == *consensus.BTMAssetID {
154 out = types.NewTxOutput(utxo.AssetID, 100, utxo.ControlProgram)
156 out = types.NewTxOutput(utxo.AssetID, utxo.Amount, utxo.ControlProgram)
158 tplBuilder.AddOutput(out)
161 return tplBuilder.Build()
164 func mockWallet(walletDB dbm.DB, account *account.Manager, asset *asset.Registry, chain *protocol.Chain, address common.Address) *Wallet {
170 RecoveryMgr: newRecoveryManager(walletDB, account),
171 dposAddress: address,
176 func mockSingleBlock(tx *types.Tx) *types.Block {
178 BlockHeader: types.BlockHeader{
182 Transactions: []*types.Tx{tx},