OSDN Git Service

update
authorChengcheng Zhang <943420582@qq.com>
Thu, 27 Jun 2019 08:58:14 +0000 (16:58 +0800)
committerChengcheng Zhang <943420582@qq.com>
Thu, 27 Jun 2019 08:58:14 +0000 (16:58 +0800)
test/builder_test.go

index fa99ce0..4394c4a 100644 (file)
@@ -1,10 +1,12 @@
 package test
 
 import (
+       "context"
        "testing"
 
        acc "github.com/vapor/account"
        "github.com/vapor/blockchain/signers"
+       "github.com/vapor/blockchain/txbuilder"
        "github.com/vapor/consensus"
        "github.com/vapor/crypto/ed25519/chainkd"
        "github.com/vapor/protocol/bc"
@@ -205,349 +207,349 @@ func TestBuildBtmTxChain(t *testing.T) {
        }
 }
 
-// func TestMergeSpendAction(t *testing.T) {
-//     testBTM := &bc.AssetID{}
-//     if err := testBTM.UnmarshalText([]byte("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); err != nil {
-//             t.Fatal(err)
-//     }
+func TestMergeSpendAction(t *testing.T) {
+       testBTM := &bc.AssetID{}
+       if err := testBTM.UnmarshalText([]byte("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); err != nil {
+               t.Fatal(err)
+       }
 
-//     testAssetID1 := &bc.AssetID{}
-//     if err := testAssetID1.UnmarshalText([]byte("50ec80b6bc48073f6aa8fa045131a71213c33f3681203b15ddc2e4b81f1f4730")); err != nil {
-//             t.Fatal(err)
-//     }
+       testAssetID1 := &bc.AssetID{}
+       if err := testAssetID1.UnmarshalText([]byte("50ec80b6bc48073f6aa8fa045131a71213c33f3681203b15ddc2e4b81f1f4730")); err != nil {
+               t.Fatal(err)
+       }
 
-//     testAssetID2 := &bc.AssetID{}
-//     if err := testAssetID2.UnmarshalText([]byte("43c6946d092b2959c1a82e90b282c68fca63e66de289048f6acd6cea9383c79c")); err != nil {
-//             t.Fatal(err)
-//     }
+       testAssetID2 := &bc.AssetID{}
+       if err := testAssetID2.UnmarshalText([]byte("43c6946d092b2959c1a82e90b282c68fca63e66de289048f6acd6cea9383c79c")); err != nil {
+               t.Fatal(err)
+       }
 
-//     cases := []struct {
-//             testActions     []txbuilder.Action
-//             wantActions     []txbuilder.Action
-//             testActionCount int
-//             wantActionCount int
-//     }{
-//             {
-//                     testActions: []txbuilder.Action{
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  100,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  200,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  300,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  300,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                     },
-//                     wantActions: []txbuilder.Action{
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  600,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  300,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                     },
-//                     testActionCount: 4,
-//                     wantActionCount: 2,
-//             },
-//             {
-//                     testActions: []txbuilder.Action{
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  100,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  200,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  500,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  300,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                     },
-//                     wantActions: []txbuilder.Action{
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  600,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  500,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                     },
-//                     testActionCount: 4,
-//                     wantActionCount: 2,
-//             },
-//             {
-//                     testActions: []txbuilder.Action{
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  100,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  200,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID2,
-//                                             Amount:  300,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  300,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID2,
-//                                             Amount:  500,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                     },
-//                     wantActions: []txbuilder.Action{
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  100,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  500,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID2,
-//                                             Amount:  800,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                     },
-//                     testActionCount: 5,
-//                     wantActionCount: 3,
-//             },
-//             {
-//                     testActions: []txbuilder.Action{
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  100,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  200,
-//                                     },
-//                                     AccountID: "test_account1",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  500,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  300,
-//                                     },
-//                                     AccountID: "test_account1",
-//                             }),
-//                     },
-//                     wantActions: []txbuilder.Action{
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  600,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  200,
-//                                     },
-//                                     AccountID: "test_account1",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  300,
-//                                     },
-//                                     AccountID: "test_account1",
-//                             }),
-//                     },
-//                     testActionCount: 4,
-//                     wantActionCount: 3,
-//             },
-//             {
-//                     testActions: []txbuilder.Action{
-//                             txbuilder.Action(&spendUTXOAction{
-//                                     OutputID: &bc.Hash{V0: 128},
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  100,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  200,
-//                                     },
-//                                     AccountID: "test_account1",
-//                             }),
-//                             txbuilder.Action(&spendUTXOAction{
-//                                     OutputID: &bc.Hash{V0: 256},
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID2,
-//                                             Amount:  300,
-//                                     },
-//                                     AccountID: "test_account2",
-//                             }),
-//                     },
-//                     wantActions: []txbuilder.Action{
-//                             txbuilder.Action(&spendUTXOAction{
-//                                     OutputID: &bc.Hash{V0: 128},
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testBTM,
-//                                             Amount:  100,
-//                                     },
-//                                     AccountID: "test_account",
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID1,
-//                                             Amount:  200,
-//                                     },
-//                                     AccountID: "test_account1",
-//                             }),
-//                             txbuilder.Action(&spendUTXOAction{
-//                                     OutputID: &bc.Hash{V0: 256},
-//                             }),
-//                             txbuilder.Action(&spendAction{
-//                                     AssetAmount: bc.AssetAmount{
-//                                             AssetId: testAssetID2,
-//                                             Amount:  300,
-//                                     },
-//                                     AccountID: "test_account2",
-//                             }),
-//                     },
-//                     testActionCount: 5,
-//                     wantActionCount: 5,
-//             },
-//     }
+       cases := []struct {
+               testActions     []txbuilder.Action
+               wantActions     []txbuilder.Action
+               testActionCount int
+               wantActionCount int
+       }{
+               {
+                       testActions: []txbuilder.Action{
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  100,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  200,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  300,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  300,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                       },
+                       wantActions: []txbuilder.Action{
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  600,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  300,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                       },
+                       testActionCount: 4,
+                       wantActionCount: 2,
+               },
+               {
+                       testActions: []txbuilder.Action{
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  100,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  200,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  500,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  300,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                       },
+                       wantActions: []txbuilder.Action{
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  600,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  500,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                       },
+                       testActionCount: 4,
+                       wantActionCount: 2,
+               },
+               {
+                       testActions: []txbuilder.Action{
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  100,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  200,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID2,
+                                               Amount:  300,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  300,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID2,
+                                               Amount:  500,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                       },
+                       wantActions: []txbuilder.Action{
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  100,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  500,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID2,
+                                               Amount:  800,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                       },
+                       testActionCount: 5,
+                       wantActionCount: 3,
+               },
+               {
+                       testActions: []txbuilder.Action{
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  100,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  200,
+                                       },
+                                       AccountID: "test_account1",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  500,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  300,
+                                       },
+                                       AccountID: "test_account1",
+                               }),
+                       },
+                       wantActions: []txbuilder.Action{
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  600,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  200,
+                                       },
+                                       AccountID: "test_account1",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  300,
+                                       },
+                                       AccountID: "test_account1",
+                               }),
+                       },
+                       testActionCount: 4,
+                       wantActionCount: 3,
+               },
+               {
+                       testActions: []txbuilder.Action{
+                               txbuilder.Action(&mockSpendUTXOAction{
+                                       OutputID: &bc.Hash{V0: 128},
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  100,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  200,
+                                       },
+                                       AccountID: "test_account1",
+                               }),
+                               txbuilder.Action(&mockSpendUTXOAction{
+                                       OutputID: &bc.Hash{V0: 256},
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID2,
+                                               Amount:  300,
+                                       },
+                                       AccountID: "test_account2",
+                               }),
+                       },
+                       wantActions: []txbuilder.Action{
+                               txbuilder.Action(&mockSpendUTXOAction{
+                                       OutputID: &bc.Hash{V0: 128},
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testBTM,
+                                               Amount:  100,
+                                       },
+                                       AccountID: "test_account",
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID1,
+                                               Amount:  200,
+                                       },
+                                       AccountID: "test_account1",
+                               }),
+                               txbuilder.Action(&mockSpendUTXOAction{
+                                       OutputID: &bc.Hash{V0: 256},
+                               }),
+                               txbuilder.Action(&mockSpendAction{
+                                       AssetAmount: bc.AssetAmount{
+                                               AssetId: testAssetID2,
+                                               Amount:  300,
+                                       },
+                                       AccountID: "test_account2",
+                               }),
+                       },
+                       testActionCount: 5,
+                       wantActionCount: 5,
+               },
+       }
 
-//     for _, c := range cases {
-//             gotActions := acc.MergeSpendAction(c.testActions)
-
-//             gotMap := make(map[string]uint64)
-//             wantMap := make(map[string]uint64)
-//             for _, got := range gotActions {
-//                     switch got := got.(type) {
-//                     case *spendAction:
-//                             gotKey := got.AssetId.String() + got.AccountID
-//                             gotMap[gotKey] = got.Amount
-//                     default:
-//                             continue
-//                     }
-//             }
+       for i, c := range cases {
+               gotActions := acc.MergeSpendAction(c.testActions)
+
+               gotMap := make(map[string]uint64)
+               wantMap := make(map[string]uint64)
+               for _, got := range gotActions {
+                       switch got := got.(type) {
+                       case *mockSpendAction:
+                               gotKey := got.AssetId.String() + got.AccountID
+                               gotMap[gotKey] = got.Amount
+                       default:
+                               continue
+                       }
+               }
 
-//             for _, want := range c.wantActions {
-//                     switch want := want.(type) {
-//                     case *spendAction:
-//                             wantKey := want.AssetId.String() + want.AccountID
-//                             wantMap[wantKey] = want.Amount
-//                     default:
-//                             continue
-//                     }
-//             }
+               for _, want := range c.wantActions {
+                       switch want := want.(type) {
+                       case *mockSpendAction:
+                               wantKey := want.AssetId.String() + want.AccountID
+                               wantMap[wantKey] = want.Amount
+                       default:
+                               continue
+                       }
+               }
 
-//             for key := range gotMap {
-//                     if gotMap[key] != wantMap[key] {
-//                             t.Fatalf("gotMap[%s]=%v, wantMap[%s]=%v", key, gotMap[key], key, wantMap[key])
-//                     }
-//             }
+               for key := range gotMap {
+                       if gotMap[key] != wantMap[key] {
+                               t.Errorf("case: %v, gotMap[%s]=%v, wantMap[%s]=%v", i, key, gotMap[key], key, wantMap[key])
+                       }
+               }
 
-//             if len(gotActions) != c.wantActionCount {
-//                     t.Fatalf("number of gotActions=%d, wantActions=%d", len(gotActions), c.wantActionCount)
-//             }
-//     }
-// }
+               if len(gotActions) != c.wantActionCount {
+                       t.Errorf("case: %v, number of gotActions=%d, wantActions=%d", i, len(gotActions), c.wantActionCount)
+               }
+       }
+}
 
 func TestCalcMergeGas(t *testing.T) {
        chainTxUtxoNum = 10
@@ -603,3 +605,108 @@ type mockSpendAction struct {
        AccountID      string `json:"account_id"`
        UseUnconfirmed bool   `json:"use_unconfirmed"`
 }
+
+func (a *mockSpendAction) ActionType() string {
+       return "spend_account"
+}
+
+func (a *mockSpendAction) Build(ctx context.Context, b *txbuilder.TemplateBuilder) error {
+       // var missing []string
+       // if a.AccountID == "" {
+       //      missing = append(missing, "account_id")
+       // }
+       // if a.AssetId.IsZero() {
+       //      missing = append(missing, "asset_id")
+       // }
+       // if len(missing) > 0 {
+       //      return txbuilder.MissingFieldsError(missing...)
+       // }
+
+       // acct, err := a.accounts.FindByID(a.AccountID)
+       // if err != nil {
+       //      return errors.Wrap(err, "get account info")
+       // }
+
+       // res, err := a.accounts.utxoKeeper.Reserve(a.AccountID, a.AssetId, a.Amount, a.UseUnconfirmed, nil, b.MaxTime())
+       // if err != nil {
+       //      return errors.Wrap(err, "reserving utxos")
+       // }
+
+       // // Cancel the reservation if the build gets rolled back.
+       // b.OnRollback(func() { a.accounts.utxoKeeper.Cancel(res.id) })
+       // for _, r := range res.utxos {
+       //      txInput, sigInst, err := UtxoToInputs(acct.Signer, r)
+       //      if err != nil {
+       //              return errors.Wrap(err, "creating inputs")
+       //      }
+
+       //      if err = b.AddInput(txInput, sigInst); err != nil {
+       //              return errors.Wrap(err, "adding inputs")
+       //      }
+       // }
+
+       // if res.change > 0 {
+       //      acp, err := a.accounts.CreateAddress(a.AccountID, true)
+       //      if err != nil {
+       //              return errors.Wrap(err, "creating control program")
+       //      }
+
+       //      // Don't insert the control program until callbacks are executed.
+       //      a.accounts.insertControlProgramDelayed(b, acp)
+       //      if err = b.AddOutput(types.NewIntraChainOutput(*a.AssetId, res.change, acp.ControlProgram)); err != nil {
+       //              return errors.Wrap(err, "adding change output")
+       //      }
+       // }
+       return nil
+}
+
+type mockSpendUTXOAction struct {
+       accounts       *acc.Manager
+       OutputID       *bc.Hash                     `json:"output_id"`
+       UseUnconfirmed bool                         `json:"use_unconfirmed"`
+       Arguments      []txbuilder.ContractArgument `json:"arguments"`
+}
+
+func (a *mockSpendUTXOAction) ActionType() string {
+       return "spend_account_unspent_output"
+}
+
+func (a *mockSpendUTXOAction) Build(ctx context.Context, b *txbuilder.TemplateBuilder) error {
+       // if a.OutputID == nil {
+       //      return txbuilder.MissingFieldsError("output_id")
+       // }
+
+       // res, err := a.accounts.utxoKeeper.ReserveParticular(*a.OutputID, a.UseUnconfirmed, b.MaxTime())
+       // if err != nil {
+       //      return err
+       // }
+
+       // b.OnRollback(func() { a.accounts.utxoKeeper.Cancel(res.id) })
+       // var accountSigner *signers.Signer
+       // if len(res.utxos[0].AccountID) != 0 {
+       //      account, err := a.accounts.FindByID(res.utxos[0].AccountID)
+       //      if err != nil {
+       //              return err
+       //      }
+
+       //      accountSigner = account.Signers
+       // }
+
+       // txInput, sigInst, err := UtxoToInputs(accountSigner, res.utxos[0])
+       // if err != nil {
+       //      return err
+       // }
+
+       // if a.Arguments == nil {
+       //      return b.AddInput(txInput, sigInst)
+       // }
+
+       // sigInst = &txbuilder.SigningInstruction{}
+       // if err := txbuilder.AddContractArgs(sigInst, a.Arguments); err != nil {
+       //      return err
+       // }
+
+       // return b.AddInput(txInput, sigInst)
+
+       return nil
+}