9 dbm "github.com/tendermint/tmlibs/db"
11 "github.com/bytom/account"
12 "github.com/bytom/asset"
13 "github.com/bytom/blockchain/pseudohsm"
14 "github.com/bytom/blockchain/signers"
15 "github.com/bytom/blockchain/txbuilder"
16 "github.com/bytom/consensus"
17 "github.com/bytom/crypto/ed25519/chainkd"
18 "github.com/bytom/database/leveldb"
19 "github.com/bytom/event"
20 "github.com/bytom/protocol"
21 "github.com/bytom/protocol/bc"
22 "github.com/bytom/protocol/bc/types"
25 func TestWalletUpdate(t *testing.T) {
26 dirPath, err := ioutil.TempDir(".", "")
30 defer os.RemoveAll(dirPath)
32 testDB := dbm.NewDB("testdb", "leveldb", "temp")
33 defer os.RemoveAll("temp")
35 store := leveldb.NewStore(testDB)
36 dispatcher := event.NewDispatcher()
37 txPool := protocol.NewTxPool(store, dispatcher)
39 chain, err := protocol.NewChain(store, txPool)
44 accountManager := account.NewManager(testDB, chain)
45 hsm, err := pseudohsm.New(dirPath)
50 xpub1, _, err := hsm.XCreate("test_pub1", "password", "en")
55 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub}, 1, "testAccount", signers.BIP0044)
60 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
65 controlProg.KeyIndex = 1
67 reg := asset.NewRegistry(testDB, chain)
68 asset, err := reg.Define([]chainkd.XPub{xpub1.XPub}, 1, nil, "TESTASSET", nil)
73 utxos := []*account.UTXO{}
74 btmUtxo := mockUTXO(controlProg, consensus.BTMAssetID)
75 utxos = append(utxos, btmUtxo)
76 OtherUtxo := mockUTXO(controlProg, &asset.AssetID)
77 utxos = append(utxos, OtherUtxo)
79 _, txData, err := mockTxData(utxos, testAccount)
84 tx := types.NewTx(*txData)
85 block := mockSingleBlock(tx)
86 txStatus := bc.NewTransactionStatus()
87 txStatus.SetStatus(0, false)
88 store.SaveBlock(block, txStatus)
90 w := mockWallet(testDB, accountManager, reg, chain, dispatcher)
91 err = w.AttachBlock(block)
96 if _, err := w.GetTransactionByTxID(tx.ID.String()); err != nil {
100 wants, err := w.GetTransactions("")
106 func TestMemPoolTxQueryLoop(t *testing.T) {
107 dirPath, err := ioutil.TempDir(".", "")
111 defer os.RemoveAll(dirPath)
113 testDB := dbm.NewDB("testdb", "leveldb", dirPath)
115 store := leveldb.NewStore(testDB)
116 dispatcher := event.NewDispatcher()
117 txPool := protocol.NewTxPool(store, dispatcher)
119 chain, err := protocol.NewChain(store, txPool)
124 accountManager := account.NewManager(testDB, chain)
125 hsm, err := pseudohsm.New(dirPath)
130 xpub1, _, err := hsm.XCreate("test_pub1", "password", "en")
135 testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub}, 1, "testAccount", signers.BIP0044)
140 controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
145 controlProg.KeyIndex = 1
147 reg := asset.NewRegistry(testDB, chain)
148 asset, err := reg.Define([]chainkd.XPub{xpub1.XPub}, 1, nil, "TESTASSET", nil)
153 utxos := []*account.UTXO{}
154 btmUtxo := mockUTXO(controlProg, consensus.BTMAssetID)
155 utxos = append(utxos, btmUtxo)
156 OtherUtxo := mockUTXO(controlProg, &asset.AssetID)
157 utxos = append(utxos, OtherUtxo)
159 _, txData, err := mockTxData(utxos, testAccount)
164 tx := types.NewTx(*txData)
165 //block := mockSingleBlock(tx)
166 txStatus := bc.NewTransactionStatus()
167 txStatus.SetStatus(0, false)
168 w, err := NewWallet(testDB, accountManager, reg, hsm, chain, dispatcher)
169 go w.memPoolTxQueryLoop()
170 w.eventDispatcher.Post(protocol.TxMsgEvent{TxMsg: &protocol.TxPoolMsg{TxDesc: &protocol.TxDesc{Tx: tx}, MsgType: protocol.MsgNewTx}})
171 time.Sleep(time.Millisecond * 10)
172 if _, err = w.GetUnconfirmedTxByTxID(tx.ID.String()); err != nil {
173 t.Fatal("disaptch new tx msg error:", err)
175 w.eventDispatcher.Post(protocol.TxMsgEvent{TxMsg: &protocol.TxPoolMsg{TxDesc: &protocol.TxDesc{Tx: tx}, MsgType: protocol.MsgRemoveTx}})
176 time.Sleep(time.Millisecond * 10)
177 txs, err := w.GetUnconfirmedTxs(testAccount.ID)
179 t.Fatal("get unconfirmed tx error:", err)
183 t.Fatal("disaptch remove tx msg error")
186 w.eventDispatcher.Post(protocol.TxMsgEvent{TxMsg: &protocol.TxPoolMsg{TxDesc: &protocol.TxDesc{Tx: tx}, MsgType: 2}})
189 func mockUTXO(controlProg *account.CtrlProgram, assetID *bc.AssetID) *account.UTXO {
190 utxo := &account.UTXO{}
191 utxo.OutputID = bc.Hash{V0: 1}
192 utxo.SourceID = bc.Hash{V0: 2}
193 utxo.AssetID = *assetID
194 utxo.Amount = 1000000000
196 utxo.ControlProgram = controlProg.ControlProgram
197 utxo.AccountID = controlProg.AccountID
198 utxo.Address = controlProg.Address
199 utxo.ControlProgramIndex = controlProg.KeyIndex
203 func mockTxData(utxos []*account.UTXO, testAccount *account.Account) (*txbuilder.Template, *types.TxData, error) {
204 tplBuilder := txbuilder.NewBuilder(time.Now())
206 for _, utxo := range utxos {
207 txInput, sigInst, err := account.UtxoToInputs(testAccount.Signer, utxo)
211 tplBuilder.AddInput(txInput, sigInst)
213 out := &types.TxOutput{}
214 if utxo.AssetID == *consensus.BTMAssetID {
215 out = types.NewTxOutput(utxo.AssetID, 100, utxo.ControlProgram)
217 out = types.NewTxOutput(utxo.AssetID, utxo.Amount, utxo.ControlProgram)
219 tplBuilder.AddOutput(out)
222 return tplBuilder.Build()
225 func mockWallet(walletDB dbm.DB, account *account.Manager, asset *asset.Registry, chain *protocol.Chain, dispatcher *event.Dispatcher) *Wallet {
231 RecoveryMgr: newRecoveryManager(walletDB, account),
232 eventDispatcher: dispatcher,
234 wallet.txMsgSub, _ = wallet.eventDispatcher.Subscribe(protocol.TxMsgEvent{})
238 func mockSingleBlock(tx *types.Tx) *types.Block {
240 BlockHeader: types.BlockHeader{
243 Bits: 2305843009230471167,
245 Transactions: []*types.Tx{tx},