OSDN Git Service

fix fee (#523)
[bytom/vapor.git] / application / mov / mock / mock.go
1 package mock
2
3 import (
4         "github.com/bytom/vapor/application/mov/common"
5         "github.com/bytom/vapor/protocol/bc"
6         "github.com/bytom/vapor/protocol/bc/types"
7         "github.com/bytom/vapor/protocol/vm"
8         "github.com/bytom/vapor/protocol/vm/vmutil"
9         "github.com/bytom/vapor/testutil"
10 )
11
12 var (
13         BTC           = bc.NewAssetID([32]byte{1})
14         ETH           = bc.NewAssetID([32]byte{2})
15         EOS           = bc.NewAssetID([32]byte{3})
16         ETC           = bc.NewAssetID([32]byte{4})
17         RewardProgram = []byte{0x58}
18
19         Btc2EthOrders = []*common.Order{
20                 {
21                         FromAssetID:      &BTC,
22                         ToAssetID:        &ETH,
23                         RatioNumerator:   50,
24                         RatioDenominator: 1,
25                         Utxo: &common.MovUtxo{
26                                 SourceID:       hashPtr(testutil.MustDecodeHash("37b8edf656e45a7addf47f5626e114a8c394d918a36f61b5a2905675a09b40ae")),
27                                 SourcePos:      0,
28                                 Amount:         10,
29                                 ControlProgram: MustCreateP2WMCProgram(ETH, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251"), 50, 1),
30                         },
31                 },
32                 {
33                         FromAssetID:      &BTC,
34                         ToAssetID:        &ETH,
35                         RatioNumerator:   53,
36                         RatioDenominator: 1,
37                         Utxo: &common.MovUtxo{
38                                 SourceID:       hashPtr(testutil.MustDecodeHash("3ec2bbfb499a8736d377b547eee5392bcddf7ec2b287e9ed20b5938c3d84e7cd")),
39                                 SourcePos:      0,
40                                 Amount:         20,
41                                 ControlProgram: MustCreateP2WMCProgram(ETH, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19252"), 53, 1),
42                         },
43                 },
44                 {
45                         FromAssetID:      &BTC,
46                         ToAssetID:        &ETH,
47                         RatioNumerator:   52,
48                         RatioDenominator: 1,
49                         Utxo: &common.MovUtxo{
50                                 SourceID:       hashPtr(testutil.MustDecodeHash("1232bbfb499a8736d377b547eee5392bcddf7ec2b287e9ed20b5938c3d84e7cd")),
51                                 SourcePos:      0,
52                                 Amount:         15,
53                                 ControlProgram: MustCreateP2WMCProgram(ETH, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19252"), 53, 1),
54                         },
55                 },
56                 {
57                         FromAssetID:      &BTC,
58                         ToAssetID:        &ETH,
59                         RatioNumerator:   49,
60                         RatioDenominator: 1,
61                         Utxo: &common.MovUtxo{
62                                 SourceID:       hashPtr(testutil.MustDecodeHash("7872bbfb499a8736d377b547eee5392bcddf7ec2b287e9ed20b5938c3d84e7cd")),
63                                 SourcePos:      0,
64                                 Amount:         17,
65                                 ControlProgram: MustCreateP2WMCProgram(ETH, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19252"), 53, 1),
66                         },
67                 },
68         }
69
70         Eth2BtcOrders = []*common.Order{
71                 {
72                         FromAssetID:      &ETH,
73                         ToAssetID:        &BTC,
74                         RatioNumerator:   1,
75                         RatioDenominator: 51,
76                         Utxo: &common.MovUtxo{
77                                 SourceID:       hashPtr(testutil.MustDecodeHash("fba43ff5155209cb1769e2ec0e1d4a33accf899c740865edfc6d1de39b873b29")),
78                                 SourcePos:      0,
79                                 Amount:         510,
80                                 ControlProgram: MustCreateP2WMCProgram(BTC, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19253"), 1, 51.0),
81                         },
82                 },
83                 {
84                         FromAssetID:      &ETH,
85                         ToAssetID:        &BTC,
86                         RatioNumerator:   1,
87                         RatioDenominator: 52,
88                         Utxo: &common.MovUtxo{
89                                 SourceID:       hashPtr(testutil.MustDecodeHash("05f24bb847db823075d81786aa270748e02602199cd009c0284f928503846a5a")),
90                                 SourcePos:      0,
91                                 Amount:         416,
92                                 ControlProgram: MustCreateP2WMCProgram(BTC, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19254"), 1, 52.0),
93                         },
94                 },
95                 {
96                         FromAssetID:      &ETH,
97                         ToAssetID:        &BTC,
98                         RatioNumerator:   1,
99                         RatioDenominator: 54,
100                         Utxo: &common.MovUtxo{
101                                 SourceID:       hashPtr(testutil.MustDecodeHash("119a02980796dc352cf6475457463aef5666f66622088de3551fa73a65f0d201")),
102                                 SourcePos:      0,
103                                 Amount:         810,
104                                 ControlProgram: MustCreateP2WMCProgram(BTC, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255"), 1, 54.0),
105                         },
106                 },
107                 {
108                         FromAssetID:      &ETH,
109                         ToAssetID:        &BTC,
110                         RatioNumerator:   1,
111                         RatioDenominator: 150,
112                         Utxo: &common.MovUtxo{
113                                 SourceID:       hashPtr(testutil.MustDecodeHash("82752cda63c877a8529d7a7461da6096673e45b3e0b019ce44aa18687ad20445")),
114                                 SourcePos:      0,
115                                 Amount:         600,
116                                 ControlProgram: MustCreateP2WMCProgram(BTC, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19256"), 1, 150.0),
117                         },
118                 },
119         }
120
121         Eos2EtcOrders = []*common.Order{
122                 {
123                         FromAssetID:      &EOS,
124                         ToAssetID:        &ETC,
125                         RatioNumerator:   1,
126                         RatioDenominator: 2,
127                         Utxo: &common.MovUtxo{
128                                 SourceID:       hashPtr(testutil.MustDecodeHash("119a02980796dc352cf6475457463aef5666f66622088de3551fa73a65f0d202")),
129                                 SourcePos:      0,
130                                 Amount:         100,
131                                 ControlProgram: MustCreateP2WMCProgram(ETC, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255"), 1, 2.0),
132                         },
133                 },
134         }
135
136         Etc2EosOrders = []*common.Order{
137                 {
138                         FromAssetID:      &ETC,
139                         ToAssetID:        &EOS,
140                         RatioNumerator:   2,
141                         RatioDenominator: 1,
142                         Utxo: &common.MovUtxo{
143                                 SourceID:       hashPtr(testutil.MustDecodeHash("119a02980796dc352cf6475457463aef5666f66622088de3551fa73a65f0d203")),
144                                 SourcePos:      0,
145                                 Amount:         50,
146                                 ControlProgram: MustCreateP2WMCProgram(EOS, testutil.MustDecodeHexString("0014df7a97e53bbe278e4e44810b0a760fb472daa9a3"), 2, 1.0),
147                         },
148                 },
149         }
150
151         Eth2EosOrders = []*common.Order{
152                 {
153                         FromAssetID:      &ETH,
154                         ToAssetID:        &EOS,
155                         RatioNumerator:   2,
156                         RatioDenominator: 1,
157                         Utxo: &common.MovUtxo{
158                                 SourceID:       hashPtr(testutil.MustDecodeHash("c1502d03946e4ea92abdb33f51638b181839bd0d8767acc2ee5c665b659c4b13")),
159                                 SourcePos:      0,
160                                 Amount:         500,
161                                 ControlProgram: MustCreateP2WMCProgram(EOS, testutil.MustDecodeHexString("0014e3178c0f294a9a8f4b304236406507913091df86"), 2, 1.0),
162                         },
163                 },
164         }
165
166         Eos2BtcOrders = []*common.Order{
167                 {
168                         FromAssetID:      &EOS,
169                         ToAssetID:        &BTC,
170                         RatioNumerator:   1,
171                         RatioDenominator: 100,
172                         Utxo: &common.MovUtxo{
173                                 SourceID:       hashPtr(testutil.MustDecodeHash("27cf8a0877dc858968cc06396fe6aa9e02d15f3e44c862fe29fa5fd50497cf20")),
174                                 SourcePos:      0,
175                                 Amount:         1000,
176                                 ControlProgram: MustCreateP2WMCProgram(BTC, testutil.MustDecodeHexString("00144d0dfc8a0c5ce41d31d4f61d99aff70588bff8bc"), 1, 100.0),
177                         },
178                 },
179         }
180
181         Btc2EthCancelTxs = []*types.Tx{
182                 // Btc2EthOrders[0]
183                 types.NewTx(types.TxData{
184                         Inputs:  []*types.TxInput{types.NewSpendInput([][]byte{{}, {}, vm.Int64Bytes(2)}, *Btc2EthOrders[0].Utxo.SourceID, *Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, Btc2EthOrders[0].Utxo.SourcePos, Btc2EthOrders[0].Utxo.ControlProgram)},
185                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251"))},
186                 }),
187
188                 // output 2 of MatchedTxs[2]
189                 types.NewTx(types.TxData{
190                         Inputs:  []*types.TxInput{types.NewSpendInput([][]byte{{}, {}, vm.Int64Bytes(2)}, *MustNewOrderFromOutput(MatchedTxs[2], 2).Utxo.SourceID, *Eth2BtcOrders[2].FromAssetID, 270, 2, Eth2BtcOrders[2].Utxo.ControlProgram)},
191                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Eth2BtcOrders[2].FromAssetID, Eth2BtcOrders[2].Utxo.Amount, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255"))},
192                 }),
193         }
194
195         Btc2EthMakerTxs = []*types.Tx{
196                 // Btc2EthOrders[0]
197                 types.NewTx(types.TxData{
198                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Btc2EthOrders[0].Utxo.SourceID, *Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, Btc2EthOrders[0].Utxo.SourcePos, []byte{0x51})},
199                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, Btc2EthOrders[0].Utxo.ControlProgram)},
200                 }),
201                 // Btc2EthOrders[1]
202                 types.NewTx(types.TxData{
203                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Btc2EthOrders[1].Utxo.SourceID, *Btc2EthOrders[1].FromAssetID, Btc2EthOrders[1].Utxo.Amount, Btc2EthOrders[1].Utxo.SourcePos, []byte{0x51})},
204                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Btc2EthOrders[1].FromAssetID, Btc2EthOrders[1].Utxo.Amount, Btc2EthOrders[1].Utxo.ControlProgram)},
205                 }),
206                 // Btc2EthOrders[2]
207                 types.NewTx(types.TxData{
208                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Btc2EthOrders[2].Utxo.SourceID, *Btc2EthOrders[2].FromAssetID, Btc2EthOrders[2].Utxo.Amount, Btc2EthOrders[2].Utxo.SourcePos, []byte{0x51})},
209                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Btc2EthOrders[2].FromAssetID, Btc2EthOrders[2].Utxo.Amount, Btc2EthOrders[2].Utxo.ControlProgram)},
210                 }),
211                 // Btc2EthOrders[3]
212                 types.NewTx(types.TxData{
213                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Btc2EthOrders[3].Utxo.SourceID, *Btc2EthOrders[3].FromAssetID, Btc2EthOrders[3].Utxo.Amount, Btc2EthOrders[3].Utxo.SourcePos, []byte{0x51})},
214                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Btc2EthOrders[3].FromAssetID, Btc2EthOrders[3].Utxo.Amount, Btc2EthOrders[3].Utxo.ControlProgram)},
215                 }),
216         }
217
218         Eth2BtcMakerTxs = []*types.Tx{
219                 // Eth2Btc[0]
220                 types.NewTx(types.TxData{
221                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Eth2BtcOrders[0].Utxo.SourceID, *Eth2BtcOrders[0].FromAssetID, Eth2BtcOrders[0].Utxo.Amount, Eth2BtcOrders[0].Utxo.SourcePos, []byte{0x51})},
222                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Eth2BtcOrders[0].FromAssetID, Eth2BtcOrders[0].Utxo.Amount, Eth2BtcOrders[0].Utxo.ControlProgram)},
223                 }),
224                 // Eth2Btc[1]
225                 types.NewTx(types.TxData{
226                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Eth2BtcOrders[1].Utxo.SourceID, *Eth2BtcOrders[1].FromAssetID, Eth2BtcOrders[1].Utxo.Amount, Eth2BtcOrders[1].Utxo.SourcePos, []byte{0x51})},
227                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Eth2BtcOrders[1].FromAssetID, Eth2BtcOrders[1].Utxo.Amount, Eth2BtcOrders[1].Utxo.ControlProgram)},
228                 }),
229                 // Eth2Btc[2]
230                 types.NewTx(types.TxData{
231                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Eth2BtcOrders[2].Utxo.SourceID, *Eth2BtcOrders[2].FromAssetID, Eth2BtcOrders[2].Utxo.Amount, Eth2BtcOrders[2].Utxo.SourcePos, []byte{0x51})},
232                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Eth2BtcOrders[2].FromAssetID, Eth2BtcOrders[2].Utxo.Amount, Eth2BtcOrders[2].Utxo.ControlProgram)},
233                 }),
234         }
235
236         Eos2EtcMakerTxs = []*types.Tx{
237                 // Eos2Etc[0]
238                 types.NewTx(types.TxData{
239                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Eos2EtcOrders[0].Utxo.SourceID, *Eos2EtcOrders[0].FromAssetID, Eos2EtcOrders[0].Utxo.Amount, Eos2EtcOrders[0].Utxo.SourcePos, []byte{0x51})},
240                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Eos2EtcOrders[0].FromAssetID, Eos2EtcOrders[0].Utxo.Amount, Eos2EtcOrders[0].Utxo.ControlProgram)},
241                 }),
242         }
243
244         Etc2EosMakerTxs = []*types.Tx{
245                 // Etc2Eos[0]
246                 types.NewTx(types.TxData{
247                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Etc2EosOrders[0].Utxo.SourceID, *Etc2EosOrders[0].FromAssetID, Etc2EosOrders[0].Utxo.Amount, Etc2EosOrders[0].Utxo.SourcePos, []byte{0x51})},
248                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Etc2EosOrders[0].FromAssetID, Etc2EosOrders[0].Utxo.Amount, Etc2EosOrders[0].Utxo.ControlProgram)},
249                 }),
250         }
251
252         Eth2EosMakerTxs = []*types.Tx{
253                 // Eth2Eos[0]
254                 types.NewTx(types.TxData{
255                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Eth2EosOrders[0].Utxo.SourceID, *Eth2EosOrders[0].FromAssetID, Eth2EosOrders[0].Utxo.Amount, Eth2EosOrders[0].Utxo.SourcePos, []byte{0x51})},
256                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Eth2EosOrders[0].FromAssetID, Eth2EosOrders[0].Utxo.Amount, Eth2EosOrders[0].Utxo.ControlProgram)},
257                 }),
258         }
259
260         MatchedTxs = []*types.Tx{
261                 // partial matched transaction from Btc2EthOrders[0], Eth2BtcOrders[1]
262                 types.NewTx(types.TxData{
263                         Inputs: []*types.TxInput{
264                                 types.NewSpendInput([][]byte{vm.Int64Bytes(416), vm.Int64Bytes(0), vm.Int64Bytes(0)}, *Btc2EthOrders[0].Utxo.SourceID, *Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, Btc2EthOrders[0].Utxo.SourcePos, Btc2EthOrders[0].Utxo.ControlProgram),
265                                 types.NewSpendInput([][]byte{vm.Int64Bytes(2), vm.Int64Bytes(1)}, *Eth2BtcOrders[1].Utxo.SourceID, *Eth2BtcOrders[1].FromAssetID, Eth2BtcOrders[1].Utxo.Amount, Eth2BtcOrders[1].Utxo.SourcePos, Eth2BtcOrders[1].Utxo.ControlProgram),
266                         },
267                         Outputs: []*types.TxOutput{
268                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 415, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
269                                 // re-order
270                                 types.NewIntraChainOutput(*Btc2EthOrders[0].FromAssetID, 2, Btc2EthOrders[0].Utxo.ControlProgram),
271                                 types.NewIntraChainOutput(*Eth2BtcOrders[1].ToAssetID, 7, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19254")),
272                                 // fee
273                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 1, RewardProgram),
274                                 types.NewIntraChainOutput(*Eth2BtcOrders[1].ToAssetID, 1, RewardProgram),
275                         },
276                 }),
277
278                 // full matched transaction from Btc2EthOrders[0], Eth2BtcOrders[0]
279                 types.NewTx(types.TxData{
280                         Inputs: []*types.TxInput{
281                                 types.NewSpendInput([][]byte{vm.Int64Bytes(0), vm.Int64Bytes(1)}, *Btc2EthOrders[0].Utxo.SourceID, *Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, Btc2EthOrders[0].Utxo.SourcePos, Btc2EthOrders[0].Utxo.ControlProgram),
282                                 types.NewSpendInput([][]byte{vm.Int64Bytes(1), vm.Int64Bytes(1)}, *Eth2BtcOrders[0].Utxo.SourceID, *Eth2BtcOrders[0].FromAssetID, Eth2BtcOrders[0].Utxo.Amount, Eth2BtcOrders[0].Utxo.SourcePos, Eth2BtcOrders[0].Utxo.ControlProgram),
283                         },
284                         Outputs: []*types.TxOutput{
285                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 499, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
286                                 types.NewIntraChainOutput(*Eth2BtcOrders[0].ToAssetID, 9, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19253")),
287                                 // fee
288                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 11, RewardProgram),
289                                 types.NewIntraChainOutput(*Eth2BtcOrders[0].ToAssetID, 1, RewardProgram),
290                         },
291                 }),
292
293                 // partial matched transaction from Btc2EthOrders[0], Eth2BtcOrders[2]
294                 types.NewTx(types.TxData{
295                         Inputs: []*types.TxInput{
296                                 types.NewSpendInput([][]byte{vm.Int64Bytes(0), vm.Int64Bytes(1)}, *Btc2EthOrders[0].Utxo.SourceID, *Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, Btc2EthOrders[0].Utxo.SourcePos, Btc2EthOrders[0].Utxo.ControlProgram),
297                                 types.NewSpendInput([][]byte{vm.Int64Bytes(10), vm.Int64Bytes(1), vm.Int64Bytes(0)}, *Eth2BtcOrders[2].Utxo.SourceID, *Eth2BtcOrders[2].FromAssetID, Eth2BtcOrders[2].Utxo.Amount, Eth2BtcOrders[2].Utxo.SourcePos, Eth2BtcOrders[2].Utxo.ControlProgram),
298                         },
299                         Outputs: []*types.TxOutput{
300                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 499, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
301                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].ToAssetID, 9, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255")),
302                                 // re-order
303                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].FromAssetID, 270, Eth2BtcOrders[2].Utxo.ControlProgram),
304                                 // fee
305                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].FromAssetID, 25, RewardProgram),
306                                 types.NewIntraChainOutput(*Btc2EthOrders[0].FromAssetID, 1, RewardProgram),
307                                 // refund
308                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].FromAssetID, 8, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
309                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].FromAssetID, 8, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255")),
310                         },
311                 }),
312                 types.NewTx(types.TxData{
313                         Inputs: []*types.TxInput{
314                                 types.NewSpendInput([][]byte{vm.Int64Bytes(0), vm.Int64Bytes(0)}, *Btc2EthOrders[1].Utxo.SourceID, *Btc2EthOrders[1].FromAssetID, Btc2EthOrders[1].Utxo.Amount, Btc2EthOrders[1].Utxo.SourcePos, Btc2EthOrders[1].Utxo.ControlProgram),
315                                 types.NewSpendInput([][]byte{vm.Int64Bytes(2), vm.Int64Bytes(1)}, testutil.MustDecodeHash("39bdb7058a0c31fb740af8e3c382bf608efff1b041cd4dd461332722ad24552a"), *Eth2BtcOrders[2].FromAssetID, 270, 2, Eth2BtcOrders[2].Utxo.ControlProgram),
316                         },
317                         Outputs: []*types.TxOutput{
318                                 types.NewIntraChainOutput(*Btc2EthOrders[1].ToAssetID, 269, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19252")),
319                                 // re-order
320                                 types.NewIntraChainOutput(*Btc2EthOrders[1].FromAssetID, 15, Btc2EthOrders[1].Utxo.ControlProgram),
321                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].ToAssetID, 4, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255")),
322                                 // fee
323                                 types.NewIntraChainOutput(*Btc2EthOrders[1].ToAssetID, 1, RewardProgram),
324                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].ToAssetID, 1, RewardProgram),
325                         },
326                 }),
327
328                 // partial matched transaction from Btc2EthMakerTxs[0], Eth2BtcMakerTxs[1]
329                 types.NewTx(types.TxData{
330                         Inputs: []*types.TxInput{
331                                 types.NewSpendInput([][]byte{vm.Int64Bytes(0), vm.Int64Bytes(1)}, *MustNewOrderFromOutput(Btc2EthMakerTxs[0], 0).Utxo.SourceID, *Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, 0, Btc2EthOrders[0].Utxo.ControlProgram),
332                                 types.NewSpendInput([][]byte{vm.Int64Bytes(1), vm.Int64Bytes(1)}, *MustNewOrderFromOutput(Eth2BtcMakerTxs[1], 0).Utxo.SourceID, *Eth2BtcOrders[1].FromAssetID, Eth2BtcOrders[1].Utxo.Amount, 0, Eth2BtcOrders[1].Utxo.ControlProgram),
333                         },
334                         Outputs: []*types.TxOutput{
335                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 415, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
336                                 // re-order
337                                 types.NewIntraChainOutput(*Btc2EthOrders[0].FromAssetID, 2, Btc2EthOrders[0].Utxo.ControlProgram),
338                                 types.NewIntraChainOutput(*Eth2BtcOrders[1].ToAssetID, 7, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19254")),
339                                 // fee
340                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 1, RewardProgram),
341                                 types.NewIntraChainOutput(*Eth2BtcOrders[1].ToAssetID, 1, RewardProgram),
342                         },
343                 }),
344
345                 // full matched transaction from Eos2EtcMakerTxs[0] Etc2EosMakerTxs[0]
346                 types.NewTx(types.TxData{
347                         Inputs: []*types.TxInput{
348                                 types.NewSpendInput([][]byte{vm.Int64Bytes(0), vm.Int64Bytes(1)}, *MustNewOrderFromOutput(Eos2EtcMakerTxs[0], 0).Utxo.SourceID, *Eos2EtcOrders[0].FromAssetID, Eos2EtcOrders[0].Utxo.Amount, Eos2EtcOrders[0].Utxo.SourcePos, Eos2EtcOrders[0].Utxo.ControlProgram),
349                                 types.NewSpendInput([][]byte{vm.Int64Bytes(1), vm.Int64Bytes(1)}, *MustNewOrderFromOutput(Etc2EosMakerTxs[0], 0).Utxo.SourceID, *Etc2EosOrders[0].FromAssetID, Etc2EosOrders[0].Utxo.Amount, Etc2EosOrders[0].Utxo.SourcePos, Etc2EosOrders[0].Utxo.ControlProgram),
350                         },
351                         Outputs: []*types.TxOutput{
352                                 types.NewIntraChainOutput(*Eos2EtcOrders[0].ToAssetID, 49, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255")),
353                                 types.NewIntraChainOutput(*Etc2EosOrders[0].ToAssetID, 99, testutil.MustDecodeHexString("0014df7a97e53bbe278e4e44810b0a760fb472daa9a3")),
354                                 // fee
355                                 types.NewIntraChainOutput(*Eos2EtcOrders[0].ToAssetID, 1, RewardProgram),
356                                 types.NewIntraChainOutput(*Etc2EosOrders[0].ToAssetID, 1, RewardProgram),
357                         },
358                 }),
359
360                 // cycle matched from Btc2Eth Eth2Eos Eos2Btc
361                 types.NewTx(types.TxData{
362                         Inputs: []*types.TxInput{
363                                 types.NewSpendInput([][]byte{vm.Int64Bytes(0), vm.Int64Bytes(1)}, *Btc2EthOrders[0].Utxo.SourceID, *Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, Btc2EthOrders[0].Utxo.SourcePos, Btc2EthOrders[0].Utxo.ControlProgram),
364                                 types.NewSpendInput([][]byte{vm.Int64Bytes(1), vm.Int64Bytes(1)}, *Eth2EosOrders[0].Utxo.SourceID, *Eth2EosOrders[0].FromAssetID, Eth2EosOrders[0].Utxo.Amount, Eth2EosOrders[0].Utxo.SourcePos, Eth2EosOrders[0].Utxo.ControlProgram),
365                                 types.NewSpendInput([][]byte{vm.Int64Bytes(2), vm.Int64Bytes(1)}, *Eos2BtcOrders[0].Utxo.SourceID, *Eos2BtcOrders[0].FromAssetID, Eos2BtcOrders[0].Utxo.Amount, Eos2BtcOrders[0].Utxo.SourcePos, Eos2BtcOrders[0].Utxo.ControlProgram),
366                         },
367                         Outputs: []*types.TxOutput{
368                                 types.NewIntraChainOutput(ETH, 499, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
369                                 types.NewIntraChainOutput(EOS, 999, testutil.MustDecodeHexString("0014e3178c0f294a9a8f4b304236406507913091df86")),
370                                 types.NewIntraChainOutput(BTC, 9, testutil.MustDecodeHexString("00144d0dfc8a0c5ce41d31d4f61d99aff70588bff8bc")),
371                                 // fee
372                                 types.NewIntraChainOutput(ETH, 1, RewardProgram),
373                                 types.NewIntraChainOutput(EOS, 1, RewardProgram),
374                                 types.NewIntraChainOutput(BTC, 1, RewardProgram),
375                         },
376                 }),
377
378                 // partial matched transaction from MatchedTxs[4], Eth2BtcMakerTxs[0]
379                 types.NewTx(types.TxData{
380                         Inputs: []*types.TxInput{
381                                 types.NewSpendInput([][]byte{vm.Int64Bytes(0), vm.Int64Bytes(1)}, testutil.MustDecodeHash("ed810e1672c3b9de27a1db23e017e6b9cc23334b6e3dbd25dfe8857e289b7f06"), *Btc2EthOrders[0].FromAssetID, 2, 1, Btc2EthOrders[0].Utxo.ControlProgram),
382                                 types.NewSpendInput([][]byte{vm.Int64Bytes(1), vm.Int64Bytes(1)}, *MustNewOrderFromOutput(Eth2BtcMakerTxs[0], 0).Utxo.SourceID, *Eth2BtcOrders[0].FromAssetID, Eth2BtcOrders[0].Utxo.Amount, 0, Eth2BtcOrders[0].Utxo.ControlProgram),
383                         },
384                         Outputs: []*types.TxOutput{
385                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 99, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
386                                 types.NewIntraChainOutput(*Eth2BtcOrders[0].ToAssetID, 1, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19253")),
387                                 // re-order
388                                 types.NewIntraChainOutput(*Eth2BtcOrders[0].FromAssetID, 404, Eth2BtcOrders[0].Utxo.ControlProgram),
389                                 // fee
390                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 1, RewardProgram),
391                                 types.NewIntraChainOutput(*Eth2BtcOrders[0].ToAssetID, 1, RewardProgram),
392                         },
393                 }),
394
395                 // partial matched transaction from Btc2EthOrders[3], Eth2BtcOrders[2]
396                 types.NewTx(types.TxData{
397                         Inputs: []*types.TxInput{
398                                 types.NewSpendInput([][]byte{vm.Int64Bytes(810), vm.Int64Bytes(0), vm.Int64Bytes(0)}, *Btc2EthOrders[3].Utxo.SourceID, *Btc2EthOrders[3].FromAssetID, Btc2EthOrders[3].Utxo.Amount, Btc2EthOrders[3].Utxo.SourcePos, Btc2EthOrders[3].Utxo.ControlProgram),
399                                 types.NewSpendInput([][]byte{vm.Int64Bytes(2), vm.Int64Bytes(1)}, *Eth2BtcOrders[2].Utxo.SourceID, *Eth2BtcOrders[2].FromAssetID, Eth2BtcOrders[2].Utxo.Amount, Eth2BtcOrders[2].Utxo.SourcePos, Eth2BtcOrders[2].Utxo.ControlProgram),
400                         },
401                         Outputs: []*types.TxOutput{
402                                 types.NewIntraChainOutput(*Btc2EthOrders[3].ToAssetID, 809, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19252")),
403                                 // re-order
404                                 types.NewIntraChainOutput(*Btc2EthOrders[3].FromAssetID, 1, Btc2EthOrders[3].Utxo.ControlProgram),
405                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].ToAssetID, 14, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255")),
406                                 // fee
407                                 types.NewIntraChainOutput(*Btc2EthOrders[3].FromAssetID, 2, RewardProgram),
408                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].ToAssetID, 1, RewardProgram),
409                         },
410                 }),
411
412                 // full matched transaction from Eos2EtcOrders[0] Etc2EosOrders[0]
413                 types.NewTx(types.TxData{
414                         Inputs: []*types.TxInput{
415                                 types.NewSpendInput([][]byte{vm.Int64Bytes(0), vm.Int64Bytes(1)}, *Eos2EtcOrders[0].Utxo.SourceID, *Eos2EtcOrders[0].FromAssetID, Eos2EtcOrders[0].Utxo.Amount, Eos2EtcOrders[0].Utxo.SourcePos, Eos2EtcOrders[0].Utxo.ControlProgram),
416                                 types.NewSpendInput([][]byte{vm.Int64Bytes(1), vm.Int64Bytes(1)}, *Etc2EosOrders[0].Utxo.SourceID, *Etc2EosOrders[0].FromAssetID, Etc2EosOrders[0].Utxo.Amount, Etc2EosOrders[0].Utxo.SourcePos, Etc2EosOrders[0].Utxo.ControlProgram),
417                         },
418                         Outputs: []*types.TxOutput{
419                                 types.NewIntraChainOutput(*Eos2EtcOrders[0].ToAssetID, 49, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255")),
420                                 types.NewIntraChainOutput(*Etc2EosOrders[0].ToAssetID, 99, testutil.MustDecodeHexString("0014df7a97e53bbe278e4e44810b0a760fb472daa9a3")),
421                                 // fee
422                                 types.NewIntraChainOutput(*Eos2EtcOrders[0].ToAssetID, 1, RewardProgram),
423                                 types.NewIntraChainOutput(*Etc2EosOrders[0].ToAssetID, 1, RewardProgram),
424                         },
425                 }),
426
427                 // full matched transaction from Btc2EthOrders[0], Eth2BtcMakerTxs[0]
428                 types.NewTx(types.TxData{
429                         Inputs: []*types.TxInput{
430                                 types.NewSpendInput([][]byte{vm.Int64Bytes(0), vm.Int64Bytes(1)}, *Btc2EthOrders[0].Utxo.SourceID, *Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, Btc2EthOrders[0].Utxo.SourcePos, Btc2EthOrders[0].Utxo.ControlProgram),
431                                 types.NewSpendInput([][]byte{vm.Int64Bytes(1), vm.Int64Bytes(1)}, *MustNewOrderFromOutput(Eth2BtcMakerTxs[0], 0).Utxo.SourceID, *Eth2BtcOrders[0].FromAssetID, Eth2BtcOrders[0].Utxo.Amount, 0, Eth2BtcOrders[0].Utxo.ControlProgram),
432                         },
433                         Outputs: []*types.TxOutput{
434                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 499, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
435                                 types.NewIntraChainOutput(*Eth2BtcOrders[0].ToAssetID, 9, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19253")),
436                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 10, RewardProgram),
437                                 // fee
438                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 1, RewardProgram),
439                                 types.NewIntraChainOutput(*Eth2BtcOrders[0].ToAssetID, 1, RewardProgram),
440                         },
441                 }),
442
443                 // full matched transaction from Btc2EthOrders[0] Eth2BtcOrders[3]
444                 types.NewTx(types.TxData{
445                         Inputs: []*types.TxInput{
446                                 types.NewSpendInput([][]byte{vm.Int64Bytes(0), vm.Int64Bytes(1)}, *Btc2EthOrders[0].Utxo.SourceID, *Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, Btc2EthOrders[0].Utxo.SourcePos, Btc2EthOrders[0].Utxo.ControlProgram),
447                                 types.NewSpendInput([][]byte{vm.Int64Bytes(1), vm.Int64Bytes(1)}, *Eth2BtcOrders[3].Utxo.SourceID, *Eth2BtcOrders[3].FromAssetID, Eth2BtcOrders[3].Utxo.Amount, Eth2BtcOrders[3].Utxo.SourcePos, Eth2BtcOrders[3].Utxo.ControlProgram),
448                         },
449                         Outputs: []*types.TxOutput{
450                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 499, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
451                                 types.NewIntraChainOutput(*Eth2BtcOrders[3].ToAssetID, 3, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19256")),
452                                 // fee
453                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 25, RewardProgram),
454                                 types.NewIntraChainOutput(*Eth2BtcOrders[3].ToAssetID, 1, RewardProgram),
455                                 // refund
456                                 types.NewIntraChainOutput(*Eth2BtcOrders[3].ToAssetID, 3, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
457                                 types.NewIntraChainOutput(*Eth2BtcOrders[3].ToAssetID, 3, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19256")),
458                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 38, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
459                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 38, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19256")),
460                         },
461                 }),
462         }
463 )
464
465 func MustCreateP2WMCProgram(requestAsset bc.AssetID, sellerProgram []byte, ratioNumerator, ratioDenominator int64) []byte {
466         contractArgs := vmutil.MagneticContractArgs{
467                 RequestedAsset:   requestAsset,
468                 RatioNumerator:   ratioNumerator,
469                 RatioDenominator: ratioDenominator,
470                 SellerProgram:    sellerProgram,
471                 SellerKey:        testutil.MustDecodeHexString("ad79ec6bd3a6d6dbe4d0ee902afc99a12b9702fb63edce5f651db3081d868b75"),
472         }
473         program, err := vmutil.P2WMCProgram(contractArgs)
474         if err != nil {
475                 panic(err)
476         }
477         return program
478 }
479
480 func MustNewOrderFromOutput(tx *types.Tx, outputIndex int) *common.Order {
481         order, err := common.NewOrderFromOutput(tx, outputIndex)
482         if err != nil {
483                 panic(err)
484         }
485
486         return order
487 }
488
489 func hashPtr(hash bc.Hash) *bc.Hash {
490         return &hash
491 }