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/config"
16 "github.com/vapor/consensus"
17 "github.com/vapor/crypto/ed25519/chainkd"
18 "github.com/vapor/database"
19 dbm "github.com/vapor/database/leveldb"
20 "github.com/vapor/event"
21 "github.com/vapor/protocol"
22 "github.com/vapor/protocol/bc"
23 "github.com/vapor/protocol/bc/types"
24 wt "github.com/vapor/wallet"
27 func TestWalletUpdate(t *testing.T) {
28 dirPath, err := ioutil.TempDir(".", "")
32 defer os.RemoveAll(dirPath)
34 config.CommonConfig = config.DefaultConfig()
35 testDB := dbm.NewDB("testdb", "leveldb", "temp")
41 store := database.NewStore(testDB)
42 walletStore := database.NewWalletStore(testDB)
43 dispatcher := event.NewDispatcher()
44 txPool := protocol.NewTxPool(store, dispatcher)
46 chain, err := protocol.NewChain(store, txPool, dispatcher)
51 accountStore := database.NewAccountStore(testDB)
52 accountManager := account.NewManager(accountStore, chain)
53 hsm, err := pseudohsm.New(dirPath)
58 xpub1, _, err := hsm.XCreate("test_pub1", "password", "en")
63 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub}, 1, "testAccount", signers.BIP0044)
68 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
73 controlProg.KeyIndex = 1
75 reg := asset.NewRegistry(testDB, chain)
76 // reg := asset.NewRegistry(testDB, nil)
77 asset := bc.AssetID{V0: 5}
79 utxos := []*account.UTXO{}
80 btmUtxo := mockUTXO(controlProg, consensus.BTMAssetID)
81 utxos = append(utxos, btmUtxo)
82 OtherUtxo := mockUTXO(controlProg, &asset)
83 utxos = append(utxos, OtherUtxo)
85 _, txData, err := mockTxData(utxos, testAccount)
90 tx := types.NewTx(*txData)
91 block := mockSingleBlock(tx)
92 txStatus := bc.NewTransactionStatus()
93 txStatus.SetStatus(0, false)
94 txStatus.SetStatus(1, false)
95 store.SaveBlock(block, txStatus)
97 w := newMockWallet(walletStore, accountManager, reg, chain, dispatcher, true)
98 err = w.Wallet.AttachBlock(block)
103 if _, err := w.Wallet.GetTransactionByTxID(tx.ID.String()); err != nil {
107 wants, err := w.Wallet.GetTransactions(testAccount.ID, "", 1, false)
112 if wants[0].ID != tx.ID {
113 t.Fatal("account txID mismatch")
116 for position, tx := range block.Transactions {
117 get := testDB.Get(database.CalcGlobalTxIndexKey(tx.ID.String()))
118 bh := block.BlockHeader.Hash()
119 expect := database.CalcGlobalTxIndex(&bh, uint64(position))
120 if !reflect.DeepEqual(get, expect) {
121 t.Fatalf("position#%d: compare retrieved globalTxIdx err", position)
126 func TestRescanWallet(t *testing.T) {
127 // prepare wallet & db
128 dirPath, err := ioutil.TempDir(".", "")
132 defer os.RemoveAll(dirPath)
134 config.CommonConfig = config.DefaultConfig()
135 testDB := dbm.NewDB("testdb", "leveldb", "temp")
136 walletStore := database.NewWalletStore(testDB)
142 store := database.NewStore(testDB)
143 dispatcher := event.NewDispatcher()
144 txPool := protocol.NewTxPool(store, dispatcher)
145 chain, err := protocol.NewChain(store, txPool, dispatcher)
150 statusInfo := wt.StatusInfo{
152 WorkHash: bc.Hash{V0: 0xff},
154 if err := walletStore.SetWalletInfo(&statusInfo); err != nil {
157 walletInfo, err := walletStore.GetWalletInfo()
162 // rawWallet, err := json.Marshal(statusInfo)
164 // t.Fatal("save wallet info")
167 w := newMockWallet(walletStore, nil, nil, chain, dispatcher, false)
168 w.Wallet.Status = *walletInfo
169 // w.store.SetWalletInfo(rawWallet)
170 // rawWallet = w.store.GetWalletInfo()
171 // if rawWallet == nil {
172 // t.Fatal("fail to load wallet StatusInfo")
175 // if err := json.Unmarshal(rawWallet, &w.Wallet.Status); err != nil {
180 if err := w.Wallet.LoadWalletInfo(); err != nil {
184 block := config.GenesisBlock()
185 if w.Wallet.Status.WorkHash != block.Hash() {
186 t.Fatal("reattach from genesis block")
190 func mockUTXO(controlProg *account.CtrlProgram, assetID *bc.AssetID) *account.UTXO {
191 utxo := &account.UTXO{}
192 utxo.OutputID = bc.Hash{V0: 1}
193 utxo.SourceID = bc.Hash{V0: 2}
194 utxo.AssetID = *assetID
195 utxo.Amount = 1000000000
197 utxo.ControlProgram = controlProg.ControlProgram
198 utxo.AccountID = controlProg.AccountID
199 utxo.Address = controlProg.Address
200 utxo.ControlProgramIndex = controlProg.KeyIndex
204 func mockTxData(utxos []*account.UTXO, testAccount *account.Account) (*txbuilder.Template, *types.TxData, error) {
205 tplBuilder := txbuilder.NewBuilder(time.Now())
207 for _, utxo := range utxos {
208 txInput, sigInst, err := account.UtxoToInputs(testAccount.Signer, utxo)
212 tplBuilder.AddInput(txInput, sigInst)
214 out := &types.TxOutput{}
215 if utxo.AssetID == *consensus.BTMAssetID {
216 out = types.NewIntraChainOutput(utxo.AssetID, 100, utxo.ControlProgram)
218 out = types.NewIntraChainOutput(utxo.AssetID, utxo.Amount, utxo.ControlProgram)
220 tplBuilder.AddOutput(out)
223 return tplBuilder.Build()
226 type mockWallet struct {
230 func newMockWallet(store wt.WalletStore, account *account.Manager, asset *asset.Registry, chain *protocol.Chain, dispatcher *event.Dispatcher, txIndexFlag bool) *mockWallet {
231 w, err := wt.NewWallet(store, account, asset, nil, chain, dispatcher, txIndexFlag)
235 return &mockWallet{w}
238 func mockSingleBlock(tx *types.Tx) *types.Block {
240 BlockHeader: types.BlockHeader{
243 PreviousBlockHash: bc.Hash{
244 V0: uint64(14952355164967094643),
245 V1: uint64(2960316323621296529),
246 V2: uint64(4202730371317372163),
247 V3: uint64(7569611631634777133),
250 Transactions: []*types.Tx{config.GenesisTx(), tx},