8 "github.com/bytom/blockchain/txbuilder"
9 "github.com/bytom/consensus"
10 "github.com/bytom/crypto/ed25519/chainkd"
11 "github.com/bytom/protocol/bc"
12 "github.com/bytom/testutil"
15 func TestReserveBtmUtxoChain(t *testing.T) {
18 m := mockAccountManager(t)
19 for i := uint64(1); i <= 20; i++ {
21 OutputID: bc.Hash{V0: i},
22 AccountID: "TestAccountID",
23 AssetID: *consensus.BTMAssetID,
24 Amount: i * chainTxMergeGas,
26 utxos = append(utxos, utxo)
28 data, err := json.Marshal(utxo)
33 m.db.Set(StandardUTXOKey(utxo.OutputID), data)
42 amount: 1 * chainTxMergeGas,
46 amount: 888888 * chainTxMergeGas,
51 amount: 7 * chainTxMergeGas,
52 want: []uint64{4, 3, 1},
55 amount: 15 * chainTxMergeGas,
56 want: []uint64{5, 4, 3, 2, 1, 6},
59 amount: 163 * chainTxMergeGas,
60 want: []uint64{20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 2, 1, 3},
64 for i, c := range cases {
65 m.utxoKeeper.expireReservation(time.Unix(999999999, 0))
66 utxos, err := m.reserveBtmUtxoChain(&txbuilder.TemplateBuilder{}, "TestAccountID", c.amount, false)
68 if err != nil != c.err {
69 t.Fatalf("case %d got err %v want err = %v", i, err, c.err)
73 for _, utxo := range utxos {
74 got = append(got, utxo.Amount/chainTxMergeGas)
77 if !testutil.DeepEqual(got, c.want) {
78 t.Fatalf("case %d got %d want %d", i, got, c.want)
84 func TestBuildBtmTxChain(t *testing.T) {
86 m := mockAccountManager(t)
94 inputUtxo: []uint64{5},
95 wantInput: [][]uint64{},
96 wantOutput: [][]uint64{},
97 wantUtxo: 5 * chainTxMergeGas,
100 inputUtxo: []uint64{5, 4},
101 wantInput: [][]uint64{
104 wantOutput: [][]uint64{
107 wantUtxo: 8 * chainTxMergeGas,
110 inputUtxo: []uint64{5, 4, 1, 1},
111 wantInput: [][]uint64{
115 wantOutput: [][]uint64{
119 wantUtxo: 9 * chainTxMergeGas,
122 inputUtxo: []uint64{22, 123, 53, 234, 23, 4, 2423, 24, 23, 43, 34, 234, 234, 24},
123 wantInput: [][]uint64{
124 []uint64{22, 123, 53},
125 []uint64{234, 23, 4},
126 []uint64{2423, 24, 23},
127 []uint64{43, 34, 234},
128 []uint64{234, 24, 197},
129 []uint64{260, 2469, 310},
132 wantOutput: [][]uint64{
141 wantUtxo: 3491 * chainTxMergeGas,
145 acct, err := m.Create([]chainkd.XPub{testutil.TestXPub}, 1, "testAccount")
150 acp, err := m.CreateAddress(acct.ID, false)
155 for caseIndex, c := range cases {
157 for _, amount := range c.inputUtxo {
158 utxos = append(utxos, &UTXO{
159 Amount: amount * chainTxMergeGas,
160 AssetID: *consensus.BTMAssetID,
161 Address: acp.Address,
162 ControlProgram: acp.ControlProgram,
166 tpls, gotUtxo, err := m.buildBtmTxChain(utxos, acct.Signer)
171 for i, tpl := range tpls {
172 gotInput := []uint64{}
173 for _, input := range tpl.Transaction.Inputs {
174 gotInput = append(gotInput, input.Amount()/chainTxMergeGas)
177 gotOutput := []uint64{}
178 for _, output := range tpl.Transaction.Outputs {
179 gotOutput = append(gotOutput, output.Amount/chainTxMergeGas)
182 if !testutil.DeepEqual(c.wantInput[i], gotInput) {
183 t.Fatalf("case %d tx %d input got %d want %d", caseIndex, i, gotInput, c.wantInput[i])
185 if !testutil.DeepEqual(c.wantOutput[i], gotOutput) {
186 t.Fatalf("case %d tx %d output got %d want %d", caseIndex, i, gotOutput, c.wantOutput[i])
190 if c.wantUtxo != gotUtxo.Amount {
191 t.Fatalf("case %d got utxo=%d want utxo=%d", caseIndex, gotUtxo.Amount, c.wantUtxo)
197 func TestMergeSpendAction(t *testing.T) {
198 testBTM := &bc.AssetID{}
199 if err := testBTM.UnmarshalText([]byte("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); err != nil {
203 testAssetID1 := &bc.AssetID{}
204 if err := testAssetID1.UnmarshalText([]byte("50ec80b6bc48073f6aa8fa045131a71213c33f3681203b15ddc2e4b81f1f4730")); err != nil {
208 testAssetID2 := &bc.AssetID{}
209 if err := testAssetID2.UnmarshalText([]byte("43c6946d092b2959c1a82e90b282c68fca63e66de289048f6acd6cea9383c79c")); err != nil {
214 testActions []txbuilder.Action
215 wantActions []txbuilder.Action
220 testActions: []txbuilder.Action{
221 txbuilder.Action(&spendAction{
222 AssetAmount: bc.AssetAmount{
226 AccountID: "test_account",
228 txbuilder.Action(&spendAction{
229 AssetAmount: bc.AssetAmount{
233 AccountID: "test_account",
235 txbuilder.Action(&spendAction{
236 AssetAmount: bc.AssetAmount{
240 AccountID: "test_account",
242 txbuilder.Action(&spendAction{
243 AssetAmount: bc.AssetAmount{
244 AssetId: testAssetID1,
247 AccountID: "test_account",
250 wantActions: []txbuilder.Action{
251 txbuilder.Action(&spendAction{
252 AssetAmount: bc.AssetAmount{
256 AccountID: "test_account",
258 txbuilder.Action(&spendAction{
259 AssetAmount: bc.AssetAmount{
260 AssetId: testAssetID1,
263 AccountID: "test_account",
270 testActions: []txbuilder.Action{
271 txbuilder.Action(&spendAction{
272 AssetAmount: bc.AssetAmount{
276 AccountID: "test_account",
278 txbuilder.Action(&spendAction{
279 AssetAmount: bc.AssetAmount{
280 AssetId: testAssetID1,
283 AccountID: "test_account",
285 txbuilder.Action(&spendAction{
286 AssetAmount: bc.AssetAmount{
290 AccountID: "test_account",
292 txbuilder.Action(&spendAction{
293 AssetAmount: bc.AssetAmount{
294 AssetId: testAssetID1,
297 AccountID: "test_account",
300 wantActions: []txbuilder.Action{
301 txbuilder.Action(&spendAction{
302 AssetAmount: bc.AssetAmount{
306 AccountID: "test_account",
308 txbuilder.Action(&spendAction{
309 AssetAmount: bc.AssetAmount{
310 AssetId: testAssetID1,
313 AccountID: "test_account",
320 testActions: []txbuilder.Action{
321 txbuilder.Action(&spendAction{
322 AssetAmount: bc.AssetAmount{
326 AccountID: "test_account",
328 txbuilder.Action(&spendAction{
329 AssetAmount: bc.AssetAmount{
330 AssetId: testAssetID1,
333 AccountID: "test_account",
335 txbuilder.Action(&spendAction{
336 AssetAmount: bc.AssetAmount{
337 AssetId: testAssetID2,
340 AccountID: "test_account",
342 txbuilder.Action(&spendAction{
343 AssetAmount: bc.AssetAmount{
344 AssetId: testAssetID1,
347 AccountID: "test_account",
349 txbuilder.Action(&spendAction{
350 AssetAmount: bc.AssetAmount{
351 AssetId: testAssetID2,
354 AccountID: "test_account",
357 wantActions: []txbuilder.Action{
358 txbuilder.Action(&spendAction{
359 AssetAmount: bc.AssetAmount{
363 AccountID: "test_account",
365 txbuilder.Action(&spendAction{
366 AssetAmount: bc.AssetAmount{
367 AssetId: testAssetID1,
370 AccountID: "test_account",
372 txbuilder.Action(&spendAction{
373 AssetAmount: bc.AssetAmount{
374 AssetId: testAssetID2,
377 AccountID: "test_account",
384 testActions: []txbuilder.Action{
385 txbuilder.Action(&spendAction{
386 AssetAmount: bc.AssetAmount{
390 AccountID: "test_account",
392 txbuilder.Action(&spendAction{
393 AssetAmount: bc.AssetAmount{
397 AccountID: "test_account1",
399 txbuilder.Action(&spendAction{
400 AssetAmount: bc.AssetAmount{
404 AccountID: "test_account",
406 txbuilder.Action(&spendAction{
407 AssetAmount: bc.AssetAmount{
408 AssetId: testAssetID1,
411 AccountID: "test_account1",
414 wantActions: []txbuilder.Action{
415 txbuilder.Action(&spendAction{
416 AssetAmount: bc.AssetAmount{
420 AccountID: "test_account",
422 txbuilder.Action(&spendAction{
423 AssetAmount: bc.AssetAmount{
427 AccountID: "test_account1",
429 txbuilder.Action(&spendAction{
430 AssetAmount: bc.AssetAmount{
431 AssetId: testAssetID1,
434 AccountID: "test_account1",
441 testActions: []txbuilder.Action{
442 txbuilder.Action(&spendUTXOAction{
443 OutputID: &bc.Hash{V0: 128},
445 txbuilder.Action(&spendAction{
446 AssetAmount: bc.AssetAmount{
450 AccountID: "test_account",
452 txbuilder.Action(&spendAction{
453 AssetAmount: bc.AssetAmount{
454 AssetId: testAssetID1,
457 AccountID: "test_account1",
459 txbuilder.Action(&spendUTXOAction{
460 OutputID: &bc.Hash{V0: 256},
462 txbuilder.Action(&spendAction{
463 AssetAmount: bc.AssetAmount{
464 AssetId: testAssetID2,
467 AccountID: "test_account2",
470 wantActions: []txbuilder.Action{
471 txbuilder.Action(&spendUTXOAction{
472 OutputID: &bc.Hash{V0: 128},
474 txbuilder.Action(&spendAction{
475 AssetAmount: bc.AssetAmount{
479 AccountID: "test_account",
481 txbuilder.Action(&spendAction{
482 AssetAmount: bc.AssetAmount{
483 AssetId: testAssetID1,
486 AccountID: "test_account1",
488 txbuilder.Action(&spendUTXOAction{
489 OutputID: &bc.Hash{V0: 256},
491 txbuilder.Action(&spendAction{
492 AssetAmount: bc.AssetAmount{
493 AssetId: testAssetID2,
496 AccountID: "test_account2",
504 for _, c := range cases {
505 gotActions := MergeSpendAction(c.testActions)
507 gotMap := make(map[string]uint64)
508 wantMap := make(map[string]uint64)
509 for _, got := range gotActions {
510 switch got := got.(type) {
512 gotKey := got.AssetId.String() + got.AccountID
513 gotMap[gotKey] = got.Amount
519 for _, want := range c.wantActions {
520 switch want := want.(type) {
522 wantKey := want.AssetId.String() + want.AccountID
523 wantMap[wantKey] = want.Amount
529 for key := range gotMap {
530 if gotMap[key] != wantMap[key] {
531 t.Fatalf("gotMap[%s]=%v, wantMap[%s]=%v", key, gotMap[key], key, wantMap[key])
535 if len(gotActions) != c.wantActionCount {
536 t.Fatalf("number of gotActions=%d, wantActions=%d", len(gotActions), c.wantActionCount)
541 func TestCalcMergeGas(t *testing.T) {
557 gas: chainTxMergeGas,
561 gas: chainTxMergeGas,
565 gas: chainTxMergeGas * 2,
569 gas: chainTxMergeGas * 3,
573 gas: chainTxMergeGas * 3,
577 gas: chainTxMergeGas * 9,
581 for i, c := range cases {
582 gas := calcMergeGas(c.utxoNum)
584 t.Fatalf("case %d got %d want %d", i, gas, c.gas)