8 "github.com/vapor/blockchain/signers"
9 "github.com/vapor/blockchain/txbuilder"
10 "github.com/vapor/consensus"
11 "github.com/vapor/crypto/ed25519/chainkd"
12 "github.com/vapor/protocol/bc"
13 "github.com/vapor/testutil"
16 func TestReserveBtmUtxoChain(t *testing.T) {
19 m := mockAccountManager(t)
20 for i := uint64(1); i <= 20; i++ {
22 OutputID: bc.Hash{V0: i},
23 AccountID: "TestAccountID",
24 AssetID: *consensus.BTMAssetID,
25 Amount: i * chainTxMergeGas,
27 utxos = append(utxos, utxo)
29 data, err := json.Marshal(utxo)
34 m.db.Set(StandardUTXOKey(utxo.OutputID), data)
43 amount: 1 * chainTxMergeGas,
47 amount: 888888 * chainTxMergeGas,
52 amount: 7 * chainTxMergeGas,
53 want: []uint64{4, 3, 1},
56 amount: 15 * chainTxMergeGas,
57 want: []uint64{5, 4, 3, 2, 1, 6},
60 amount: 163 * chainTxMergeGas,
61 want: []uint64{20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 2, 1, 3},
65 for i, c := range cases {
66 m.utxoKeeper.expireReservation(time.Unix(999999999, 0))
67 utxos, err := m.reserveBtmUtxoChain(&txbuilder.TemplateBuilder{}, "TestAccountID", c.amount, false)
69 if err != nil != c.err {
70 t.Fatalf("case %d got err %v want err = %v", i, err, c.err)
74 for _, utxo := range utxos {
75 got = append(got, utxo.Amount/chainTxMergeGas)
78 if !testutil.DeepEqual(got, c.want) {
79 t.Fatalf("case %d got %d want %d", i, got, c.want)
85 func TestBuildBtmTxChain(t *testing.T) {
87 m := mockAccountManager(t)
95 inputUtxo: []uint64{5},
96 wantInput: [][]uint64{},
97 wantOutput: [][]uint64{},
98 wantUtxo: 5 * chainTxMergeGas,
101 inputUtxo: []uint64{5, 4},
102 wantInput: [][]uint64{
105 wantOutput: [][]uint64{
108 wantUtxo: 8 * chainTxMergeGas,
111 inputUtxo: []uint64{5, 4, 1, 1},
112 wantInput: [][]uint64{
116 wantOutput: [][]uint64{
120 wantUtxo: 9 * chainTxMergeGas,
123 inputUtxo: []uint64{22, 123, 53, 234, 23, 4, 2423, 24, 23, 43, 34, 234, 234, 24},
124 wantInput: [][]uint64{
125 []uint64{22, 123, 53},
126 []uint64{234, 23, 4},
127 []uint64{2423, 24, 23},
128 []uint64{43, 34, 234},
129 []uint64{234, 24, 197},
130 []uint64{260, 2469, 310},
133 wantOutput: [][]uint64{
142 wantUtxo: 3491 * chainTxMergeGas,
146 acct, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "testAccount", signers.BIP0044)
151 acp, err := m.CreateAddress(acct.ID, false)
156 for caseIndex, c := range cases {
158 for _, amount := range c.inputUtxo {
159 utxos = append(utxos, &UTXO{
160 Amount: amount * chainTxMergeGas,
161 AssetID: *consensus.BTMAssetID,
162 Address: acp.Address,
163 ControlProgram: acp.ControlProgram,
167 tpls, gotUtxo, err := m.buildBtmTxChain(utxos, acct.Signer)
172 for i, tpl := range tpls {
173 gotInput := []uint64{}
174 for _, input := range tpl.Transaction.Inputs {
175 gotInput = append(gotInput, input.Amount()/chainTxMergeGas)
178 gotOutput := []uint64{}
179 for _, output := range tpl.Transaction.Outputs {
180 gotOutput = append(gotOutput, output.Amount/chainTxMergeGas)
183 if !testutil.DeepEqual(c.wantInput[i], gotInput) {
184 t.Fatalf("case %d tx %d input got %d want %d", caseIndex, i, gotInput, c.wantInput[i])
186 if !testutil.DeepEqual(c.wantOutput[i], gotOutput) {
187 t.Fatalf("case %d tx %d output got %d want %d", caseIndex, i, gotOutput, c.wantOutput[i])
191 if c.wantUtxo != gotUtxo.Amount {
192 t.Fatalf("case %d got utxo=%d want utxo=%d", caseIndex, gotUtxo.Amount, c.wantUtxo)
198 func TestMergeSpendAction(t *testing.T) {
199 testBTM := &bc.AssetID{}
200 if err := testBTM.UnmarshalText([]byte("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); err != nil {
204 testAssetID1 := &bc.AssetID{}
205 if err := testAssetID1.UnmarshalText([]byte("50ec80b6bc48073f6aa8fa045131a71213c33f3681203b15ddc2e4b81f1f4730")); err != nil {
209 testAssetID2 := &bc.AssetID{}
210 if err := testAssetID2.UnmarshalText([]byte("43c6946d092b2959c1a82e90b282c68fca63e66de289048f6acd6cea9383c79c")); err != nil {
215 testActions []txbuilder.Action
216 wantActions []txbuilder.Action
221 testActions: []txbuilder.Action{
222 txbuilder.Action(&spendAction{
223 AssetAmount: bc.AssetAmount{
227 AccountID: "test_account",
229 txbuilder.Action(&spendAction{
230 AssetAmount: bc.AssetAmount{
234 AccountID: "test_account",
236 txbuilder.Action(&spendAction{
237 AssetAmount: bc.AssetAmount{
241 AccountID: "test_account",
243 txbuilder.Action(&spendAction{
244 AssetAmount: bc.AssetAmount{
245 AssetId: testAssetID1,
248 AccountID: "test_account",
251 wantActions: []txbuilder.Action{
252 txbuilder.Action(&spendAction{
253 AssetAmount: bc.AssetAmount{
257 AccountID: "test_account",
259 txbuilder.Action(&spendAction{
260 AssetAmount: bc.AssetAmount{
261 AssetId: testAssetID1,
264 AccountID: "test_account",
271 testActions: []txbuilder.Action{
272 txbuilder.Action(&spendAction{
273 AssetAmount: bc.AssetAmount{
277 AccountID: "test_account",
279 txbuilder.Action(&spendAction{
280 AssetAmount: bc.AssetAmount{
281 AssetId: testAssetID1,
284 AccountID: "test_account",
286 txbuilder.Action(&spendAction{
287 AssetAmount: bc.AssetAmount{
291 AccountID: "test_account",
293 txbuilder.Action(&spendAction{
294 AssetAmount: bc.AssetAmount{
295 AssetId: testAssetID1,
298 AccountID: "test_account",
301 wantActions: []txbuilder.Action{
302 txbuilder.Action(&spendAction{
303 AssetAmount: bc.AssetAmount{
307 AccountID: "test_account",
309 txbuilder.Action(&spendAction{
310 AssetAmount: bc.AssetAmount{
311 AssetId: testAssetID1,
314 AccountID: "test_account",
321 testActions: []txbuilder.Action{
322 txbuilder.Action(&spendAction{
323 AssetAmount: bc.AssetAmount{
327 AccountID: "test_account",
329 txbuilder.Action(&spendAction{
330 AssetAmount: bc.AssetAmount{
331 AssetId: testAssetID1,
334 AccountID: "test_account",
336 txbuilder.Action(&spendAction{
337 AssetAmount: bc.AssetAmount{
338 AssetId: testAssetID2,
341 AccountID: "test_account",
343 txbuilder.Action(&spendAction{
344 AssetAmount: bc.AssetAmount{
345 AssetId: testAssetID1,
348 AccountID: "test_account",
350 txbuilder.Action(&spendAction{
351 AssetAmount: bc.AssetAmount{
352 AssetId: testAssetID2,
355 AccountID: "test_account",
358 wantActions: []txbuilder.Action{
359 txbuilder.Action(&spendAction{
360 AssetAmount: bc.AssetAmount{
364 AccountID: "test_account",
366 txbuilder.Action(&spendAction{
367 AssetAmount: bc.AssetAmount{
368 AssetId: testAssetID1,
371 AccountID: "test_account",
373 txbuilder.Action(&spendAction{
374 AssetAmount: bc.AssetAmount{
375 AssetId: testAssetID2,
378 AccountID: "test_account",
385 testActions: []txbuilder.Action{
386 txbuilder.Action(&spendAction{
387 AssetAmount: bc.AssetAmount{
391 AccountID: "test_account",
393 txbuilder.Action(&spendAction{
394 AssetAmount: bc.AssetAmount{
398 AccountID: "test_account1",
400 txbuilder.Action(&spendAction{
401 AssetAmount: bc.AssetAmount{
405 AccountID: "test_account",
407 txbuilder.Action(&spendAction{
408 AssetAmount: bc.AssetAmount{
409 AssetId: testAssetID1,
412 AccountID: "test_account1",
415 wantActions: []txbuilder.Action{
416 txbuilder.Action(&spendAction{
417 AssetAmount: bc.AssetAmount{
421 AccountID: "test_account",
423 txbuilder.Action(&spendAction{
424 AssetAmount: bc.AssetAmount{
428 AccountID: "test_account1",
430 txbuilder.Action(&spendAction{
431 AssetAmount: bc.AssetAmount{
432 AssetId: testAssetID1,
435 AccountID: "test_account1",
442 testActions: []txbuilder.Action{
443 txbuilder.Action(&spendUTXOAction{
444 OutputID: &bc.Hash{V0: 128},
446 txbuilder.Action(&spendAction{
447 AssetAmount: bc.AssetAmount{
451 AccountID: "test_account",
453 txbuilder.Action(&spendAction{
454 AssetAmount: bc.AssetAmount{
455 AssetId: testAssetID1,
458 AccountID: "test_account1",
460 txbuilder.Action(&spendUTXOAction{
461 OutputID: &bc.Hash{V0: 256},
463 txbuilder.Action(&spendAction{
464 AssetAmount: bc.AssetAmount{
465 AssetId: testAssetID2,
468 AccountID: "test_account2",
471 wantActions: []txbuilder.Action{
472 txbuilder.Action(&spendUTXOAction{
473 OutputID: &bc.Hash{V0: 128},
475 txbuilder.Action(&spendAction{
476 AssetAmount: bc.AssetAmount{
480 AccountID: "test_account",
482 txbuilder.Action(&spendAction{
483 AssetAmount: bc.AssetAmount{
484 AssetId: testAssetID1,
487 AccountID: "test_account1",
489 txbuilder.Action(&spendUTXOAction{
490 OutputID: &bc.Hash{V0: 256},
492 txbuilder.Action(&spendAction{
493 AssetAmount: bc.AssetAmount{
494 AssetId: testAssetID2,
497 AccountID: "test_account2",
505 for _, c := range cases {
506 gotActions := MergeSpendAction(c.testActions)
508 gotMap := make(map[string]uint64)
509 wantMap := make(map[string]uint64)
510 for _, got := range gotActions {
511 switch got := got.(type) {
513 gotKey := got.AssetId.String() + got.AccountID
514 gotMap[gotKey] = got.Amount
520 for _, want := range c.wantActions {
521 switch want := want.(type) {
523 wantKey := want.AssetId.String() + want.AccountID
524 wantMap[wantKey] = want.Amount
530 for key := range gotMap {
531 if gotMap[key] != wantMap[key] {
532 t.Fatalf("gotMap[%s]=%v, wantMap[%s]=%v", key, gotMap[key], key, wantMap[key])
536 if len(gotActions) != c.wantActionCount {
537 t.Fatalf("number of gotActions=%d, wantActions=%d", len(gotActions), c.wantActionCount)
542 func TestCalcMergeGas(t *testing.T) {
558 gas: chainTxMergeGas,
562 gas: chainTxMergeGas,
566 gas: chainTxMergeGas * 2,
570 gas: chainTxMergeGas * 3,
574 gas: chainTxMergeGas * 3,
578 gas: chainTxMergeGas * 9,
582 for i, c := range cases {
583 gas := calcMergeGas(c.utxoNum)
585 t.Fatalf("case %d got %d want %d", i, gas, c.gas)