6 acc "github.com/vapor/account"
10 //chainTxUtxoNum maximum utxo quantity in a tx
12 //chainTxMergeGas chain tx gas
13 chainTxMergeGas = uint64(10000000)
16 // func TestReserveBtmUtxoChain(t *testing.T) {
17 // dirPath, err := ioutil.TempDir(".", "")
21 // defer os.RemoveAll(dirPath)
22 // testDB := dbm.NewDB("testdb", "memdb", dirPath)
23 // store := database.NewAccountStore(testDB)
25 // utxos := []*acc.UTXO{}
26 // m := mockAccountManager(t)
27 // for i := uint64(1); i <= 20; i++ {
29 // OutputID: bc.Hash{V0: i},
30 // AccountID: "TestAccountID",
31 // AssetID: *consensus.BTMAssetID,
32 // Amount: i * chainTxMergeGas,
34 // utxos = append(utxos, utxo)
36 // data, err := json.Marshal(utxo)
41 // store.SetStandardUTXO(utxo.OutputID, data)
44 // cases := []struct {
50 // amount: 1 * chainTxMergeGas,
54 // amount: 888888 * chainTxMergeGas,
59 // amount: 7 * chainTxMergeGas,
60 // want: []uint64{4, 3, 1},
63 // amount: 15 * chainTxMergeGas,
64 // want: []uint64{5, 4, 3, 2, 1, 6},
67 // amount: 163 * chainTxMergeGas,
68 // want: []uint64{20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 2, 1, 3},
72 // for i, c := range cases {
73 // m.Manager.utxoKeeper.expireReservation(time.Unix(999999999, 0))
74 // utxos, err := m.reserveBtmUtxoChain(&txbuilder.TemplateBuilder{}, "TestAccountID", c.amount, false)
76 // if err != nil != c.err {
77 // t.Fatalf("case %d got err %v want err = %v", i, err, c.err)
81 // for _, utxo := range utxos {
82 // got = append(got, utxo.Amount/chainTxMergeGas)
85 // if !testutil.DeepEqual(got, c.want) {
86 // t.Fatalf("case %d got %d want %d", i, got, c.want)
91 // func TestBuildBtmTxChain(t *testing.T) {
93 // m := mockAccountManager(t)
94 // cases := []struct {
96 // wantInput [][]uint64
97 // wantOutput [][]uint64
101 // inputUtxo: []uint64{5},
102 // wantInput: [][]uint64{},
103 // wantOutput: [][]uint64{},
104 // wantUtxo: 5 * chainTxMergeGas,
107 // inputUtxo: []uint64{5, 4},
108 // wantInput: [][]uint64{
111 // wantOutput: [][]uint64{
114 // wantUtxo: 8 * chainTxMergeGas,
117 // inputUtxo: []uint64{5, 4, 1, 1},
118 // wantInput: [][]uint64{
119 // []uint64{5, 4, 1},
122 // wantOutput: [][]uint64{
126 // wantUtxo: 9 * chainTxMergeGas,
129 // inputUtxo: []uint64{22, 123, 53, 234, 23, 4, 2423, 24, 23, 43, 34, 234, 234, 24},
130 // wantInput: [][]uint64{
131 // []uint64{22, 123, 53},
132 // []uint64{234, 23, 4},
133 // []uint64{2423, 24, 23},
134 // []uint64{43, 34, 234},
135 // []uint64{234, 24, 197},
136 // []uint64{260, 2469, 310},
137 // []uint64{454, 3038},
139 // wantOutput: [][]uint64{
148 // wantUtxo: 3491 * chainTxMergeGas,
152 // acct, err := m.Manager.Create([]chainkd.XPub{testutil.TestXPub}, 1, "testAccount", signers.BIP0044)
157 // acp, err := m.Manager.CreateAddress(acct.ID, false)
162 // for caseIndex, c := range cases {
163 // utxos := []*acc.UTXO{}
164 // for _, amount := range c.inputUtxo {
165 // utxos = append(utxos, &acc.UTXO{
166 // Amount: amount * chainTxMergeGas,
167 // AssetID: *consensus.BTMAssetID,
168 // Address: acp.Address,
169 // ControlProgram: acp.ControlProgram,
173 // tpls, gotUtxo, err := m.Manager.buildBtmTxChain(utxos, acct.Signer)
178 // for i, tpl := range tpls {
179 // gotInput := []uint64{}
180 // for _, input := range tpl.Transaction.Inputs {
181 // gotInput = append(gotInput, input.Amount()/chainTxMergeGas)
184 // gotOutput := []uint64{}
185 // for _, output := range tpl.Transaction.Outputs {
186 // gotOutput = append(gotOutput, output.AssetAmount().Amount/chainTxMergeGas)
189 // if !testutil.DeepEqual(c.wantInput[i], gotInput) {
190 // t.Fatalf("case %d tx %d input got %d want %d", caseIndex, i, gotInput, c.wantInput[i])
192 // if !testutil.DeepEqual(c.wantOutput[i], gotOutput) {
193 // t.Fatalf("case %d tx %d output got %d want %d", caseIndex, i, gotOutput, c.wantOutput[i])
197 // if c.wantUtxo != gotUtxo.Amount {
198 // t.Fatalf("case %d got utxo=%d want utxo=%d", caseIndex, gotUtxo.Amount, c.wantUtxo)
203 // func TestMergeSpendAction(t *testing.T) {
204 // testBTM := &bc.AssetID{}
205 // if err := testBTM.UnmarshalText([]byte("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); err != nil {
209 // testAssetID1 := &bc.AssetID{}
210 // if err := testAssetID1.UnmarshalText([]byte("50ec80b6bc48073f6aa8fa045131a71213c33f3681203b15ddc2e4b81f1f4730")); err != nil {
214 // testAssetID2 := &bc.AssetID{}
215 // if err := testAssetID2.UnmarshalText([]byte("43c6946d092b2959c1a82e90b282c68fca63e66de289048f6acd6cea9383c79c")); err != nil {
219 // cases := []struct {
220 // testActions []txbuilder.Action
221 // wantActions []txbuilder.Action
222 // testActionCount int
223 // wantActionCount int
226 // testActions: []txbuilder.Action{
227 // txbuilder.Action(&spendAction{
228 // AssetAmount: bc.AssetAmount{
232 // AccountID: "test_account",
234 // txbuilder.Action(&spendAction{
235 // AssetAmount: bc.AssetAmount{
239 // AccountID: "test_account",
241 // txbuilder.Action(&spendAction{
242 // AssetAmount: bc.AssetAmount{
246 // AccountID: "test_account",
248 // txbuilder.Action(&spendAction{
249 // AssetAmount: bc.AssetAmount{
250 // AssetId: testAssetID1,
253 // AccountID: "test_account",
256 // wantActions: []txbuilder.Action{
257 // txbuilder.Action(&spendAction{
258 // AssetAmount: bc.AssetAmount{
262 // AccountID: "test_account",
264 // txbuilder.Action(&spendAction{
265 // AssetAmount: bc.AssetAmount{
266 // AssetId: testAssetID1,
269 // AccountID: "test_account",
272 // testActionCount: 4,
273 // wantActionCount: 2,
276 // testActions: []txbuilder.Action{
277 // txbuilder.Action(&spendAction{
278 // AssetAmount: bc.AssetAmount{
282 // AccountID: "test_account",
284 // txbuilder.Action(&spendAction{
285 // AssetAmount: bc.AssetAmount{
286 // AssetId: testAssetID1,
289 // AccountID: "test_account",
291 // txbuilder.Action(&spendAction{
292 // AssetAmount: bc.AssetAmount{
296 // AccountID: "test_account",
298 // txbuilder.Action(&spendAction{
299 // AssetAmount: bc.AssetAmount{
300 // AssetId: testAssetID1,
303 // AccountID: "test_account",
306 // wantActions: []txbuilder.Action{
307 // txbuilder.Action(&spendAction{
308 // AssetAmount: bc.AssetAmount{
312 // AccountID: "test_account",
314 // txbuilder.Action(&spendAction{
315 // AssetAmount: bc.AssetAmount{
316 // AssetId: testAssetID1,
319 // AccountID: "test_account",
322 // testActionCount: 4,
323 // wantActionCount: 2,
326 // testActions: []txbuilder.Action{
327 // txbuilder.Action(&spendAction{
328 // AssetAmount: bc.AssetAmount{
332 // AccountID: "test_account",
334 // txbuilder.Action(&spendAction{
335 // AssetAmount: bc.AssetAmount{
336 // AssetId: testAssetID1,
339 // AccountID: "test_account",
341 // txbuilder.Action(&spendAction{
342 // AssetAmount: bc.AssetAmount{
343 // AssetId: testAssetID2,
346 // AccountID: "test_account",
348 // txbuilder.Action(&spendAction{
349 // AssetAmount: bc.AssetAmount{
350 // AssetId: testAssetID1,
353 // AccountID: "test_account",
355 // txbuilder.Action(&spendAction{
356 // AssetAmount: bc.AssetAmount{
357 // AssetId: testAssetID2,
360 // AccountID: "test_account",
363 // wantActions: []txbuilder.Action{
364 // txbuilder.Action(&spendAction{
365 // AssetAmount: bc.AssetAmount{
369 // AccountID: "test_account",
371 // txbuilder.Action(&spendAction{
372 // AssetAmount: bc.AssetAmount{
373 // AssetId: testAssetID1,
376 // AccountID: "test_account",
378 // txbuilder.Action(&spendAction{
379 // AssetAmount: bc.AssetAmount{
380 // AssetId: testAssetID2,
383 // AccountID: "test_account",
386 // testActionCount: 5,
387 // wantActionCount: 3,
390 // testActions: []txbuilder.Action{
391 // txbuilder.Action(&spendAction{
392 // AssetAmount: bc.AssetAmount{
396 // AccountID: "test_account",
398 // txbuilder.Action(&spendAction{
399 // AssetAmount: bc.AssetAmount{
403 // AccountID: "test_account1",
405 // txbuilder.Action(&spendAction{
406 // AssetAmount: bc.AssetAmount{
410 // AccountID: "test_account",
412 // txbuilder.Action(&spendAction{
413 // AssetAmount: bc.AssetAmount{
414 // AssetId: testAssetID1,
417 // AccountID: "test_account1",
420 // wantActions: []txbuilder.Action{
421 // txbuilder.Action(&spendAction{
422 // AssetAmount: bc.AssetAmount{
426 // AccountID: "test_account",
428 // txbuilder.Action(&spendAction{
429 // AssetAmount: bc.AssetAmount{
433 // AccountID: "test_account1",
435 // txbuilder.Action(&spendAction{
436 // AssetAmount: bc.AssetAmount{
437 // AssetId: testAssetID1,
440 // AccountID: "test_account1",
443 // testActionCount: 4,
444 // wantActionCount: 3,
447 // testActions: []txbuilder.Action{
448 // txbuilder.Action(&spendUTXOAction{
449 // OutputID: &bc.Hash{V0: 128},
451 // txbuilder.Action(&spendAction{
452 // AssetAmount: bc.AssetAmount{
456 // AccountID: "test_account",
458 // txbuilder.Action(&spendAction{
459 // AssetAmount: bc.AssetAmount{
460 // AssetId: testAssetID1,
463 // AccountID: "test_account1",
465 // txbuilder.Action(&spendUTXOAction{
466 // OutputID: &bc.Hash{V0: 256},
468 // txbuilder.Action(&spendAction{
469 // AssetAmount: bc.AssetAmount{
470 // AssetId: testAssetID2,
473 // AccountID: "test_account2",
476 // wantActions: []txbuilder.Action{
477 // txbuilder.Action(&spendUTXOAction{
478 // OutputID: &bc.Hash{V0: 128},
480 // txbuilder.Action(&spendAction{
481 // AssetAmount: bc.AssetAmount{
485 // AccountID: "test_account",
487 // txbuilder.Action(&spendAction{
488 // AssetAmount: bc.AssetAmount{
489 // AssetId: testAssetID1,
492 // AccountID: "test_account1",
494 // txbuilder.Action(&spendUTXOAction{
495 // OutputID: &bc.Hash{V0: 256},
497 // txbuilder.Action(&spendAction{
498 // AssetAmount: bc.AssetAmount{
499 // AssetId: testAssetID2,
502 // AccountID: "test_account2",
505 // testActionCount: 5,
506 // wantActionCount: 5,
510 // for _, c := range cases {
511 // gotActions := MergeSpendAction(c.testActions)
513 // gotMap := make(map[string]uint64)
514 // wantMap := make(map[string]uint64)
515 // for _, got := range gotActions {
516 // switch got := got.(type) {
517 // case *spendAction:
518 // gotKey := got.AssetId.String() + got.AccountID
519 // gotMap[gotKey] = got.Amount
525 // for _, want := range c.wantActions {
526 // switch want := want.(type) {
527 // case *spendAction:
528 // wantKey := want.AssetId.String() + want.AccountID
529 // wantMap[wantKey] = want.Amount
535 // for key := range gotMap {
536 // if gotMap[key] != wantMap[key] {
537 // t.Fatalf("gotMap[%s]=%v, wantMap[%s]=%v", key, gotMap[key], key, wantMap[key])
541 // if len(gotActions) != c.wantActionCount {
542 // t.Fatalf("number of gotActions=%d, wantActions=%d", len(gotActions), c.wantActionCount)
547 func TestCalcMergeGas(t *testing.T) {
563 gas: chainTxMergeGas * 2,
567 gas: chainTxMergeGas * 3,
571 gas: chainTxMergeGas * 3,
575 gas: chainTxMergeGas * 5,
579 gas: chainTxMergeGas * 5,
583 gas: chainTxMergeGas * 19,
587 for i, c := range cases {
588 gas := acc.CalcMergeGas(c.utxoNum)
590 t.Fatalf("case %d got %d want %d", i, gas, c.gas)