OSDN Git Service

complement mov test (#477)
[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         NodeProgram = []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
109         Eos2EtcOrders = []*common.Order{
110                 {
111                         FromAssetID:      &EOS,
112                         ToAssetID:        &ETC,
113                         RatioNumerator:   1,
114                         RatioDenominator: 2,
115                         Utxo: &common.MovUtxo{
116                                 SourceID:       hashPtr(testutil.MustDecodeHash("119a02980796dc352cf6475457463aef5666f66622088de3551fa73a65f0d202")),
117                                 SourcePos:      0,
118                                 Amount:         100,
119                                 ControlProgram: MustCreateP2WMCProgram(ETC, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255"), 1, 2.0),
120                         },
121                 },
122         }
123
124         Etc2EosOrders = []*common.Order{
125                 {
126                         FromAssetID:      &ETC,
127                         ToAssetID:        &EOS,
128                         RatioNumerator:   2,
129                         RatioDenominator: 1,
130                         Utxo: &common.MovUtxo{
131                                 SourceID:       hashPtr(testutil.MustDecodeHash("119a02980796dc352cf6475457463aef5666f66622088de3551fa73a65f0d203")),
132                                 SourcePos:      0,
133                                 Amount:         50,
134                                 ControlProgram: MustCreateP2WMCProgram(EOS, testutil.MustDecodeHexString("0014df7a97e53bbe278e4e44810b0a760fb472daa9a3"), 2, 1.0),
135                         },
136                 },
137         }
138
139         Eth2EosOrders = []*common.Order{
140                 {
141                         FromAssetID:      &ETH,
142                         ToAssetID:        &EOS,
143                         RatioNumerator:   2,
144                         RatioDenominator: 1,
145                         Utxo: &common.MovUtxo{
146                                 SourceID:       hashPtr(testutil.MustDecodeHash("c1502d03946e4ea92abdb33f51638b181839bd0d8767acc2ee5c665b659c4b13")),
147                                 SourcePos:      0,
148                                 Amount:         500,
149                                 ControlProgram: MustCreateP2WMCProgram(EOS, testutil.MustDecodeHexString("0014e3178c0f294a9a8f4b304236406507913091df86"), 2, 1.0),
150                         },
151                 },
152         }
153
154         Eos2BtcOrders = []*common.Order{
155                 {
156                         FromAssetID:      &EOS,
157                         ToAssetID:        &BTC,
158                         RatioNumerator:   1,
159                         RatioDenominator: 100,
160                         Utxo: &common.MovUtxo{
161                                 SourceID:       hashPtr(testutil.MustDecodeHash("27cf8a0877dc858968cc06396fe6aa9e02d15f3e44c862fe29fa5fd50497cf20")),
162                                 SourcePos:      0,
163                                 Amount:         1000,
164                                 ControlProgram: MustCreateP2WMCProgram(BTC, testutil.MustDecodeHexString("00144d0dfc8a0c5ce41d31d4f61d99aff70588bff8bc"), 1, 100.0),
165                         },
166                 },
167         }
168
169         Btc2EthMakerTxs = []*types.Tx{
170                 // Btc2EthOrders[0]
171                 types.NewTx(types.TxData{
172                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Btc2EthOrders[0].Utxo.SourceID, *Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, Btc2EthOrders[0].Utxo.SourcePos, []byte{0x51})},
173                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Btc2EthOrders[0].FromAssetID, Btc2EthOrders[0].Utxo.Amount, Btc2EthOrders[0].Utxo.ControlProgram)},
174                 }),
175                 // Btc2EthOrders[1]
176                 types.NewTx(types.TxData{
177                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Btc2EthOrders[1].Utxo.SourceID, *Btc2EthOrders[1].FromAssetID, Btc2EthOrders[1].Utxo.Amount, Btc2EthOrders[1].Utxo.SourcePos, []byte{0x51})},
178                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Btc2EthOrders[1].FromAssetID, Btc2EthOrders[1].Utxo.Amount, Btc2EthOrders[1].Utxo.ControlProgram)},
179                 }),
180                 // Btc2EthOrders[2]
181                 types.NewTx(types.TxData{
182                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Btc2EthOrders[2].Utxo.SourceID, *Btc2EthOrders[2].FromAssetID, Btc2EthOrders[2].Utxo.Amount, Btc2EthOrders[2].Utxo.SourcePos, []byte{0x51})},
183                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Btc2EthOrders[2].FromAssetID, Btc2EthOrders[2].Utxo.Amount, Btc2EthOrders[2].Utxo.ControlProgram)},
184                 }),
185                 // Btc2EthOrders[3]
186                 types.NewTx(types.TxData{
187                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Btc2EthOrders[3].Utxo.SourceID, *Btc2EthOrders[3].FromAssetID, Btc2EthOrders[3].Utxo.Amount, Btc2EthOrders[3].Utxo.SourcePos, []byte{0x51})},
188                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Btc2EthOrders[3].FromAssetID, Btc2EthOrders[3].Utxo.Amount, Btc2EthOrders[3].Utxo.ControlProgram)},
189                 }),
190         }
191
192         Eth2BtcMakerTxs = []*types.Tx{
193                 // Eth2Btc[0]
194                 types.NewTx(types.TxData{
195                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Eth2BtcOrders[0].Utxo.SourceID, *Eth2BtcOrders[0].FromAssetID, Eth2BtcOrders[0].Utxo.Amount, Eth2BtcOrders[0].Utxo.SourcePos, []byte{0x51})},
196                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Eth2BtcOrders[0].FromAssetID, Eth2BtcOrders[0].Utxo.Amount, Eth2BtcOrders[0].Utxo.ControlProgram)},
197                 }),
198                 // Eth2Btc[1]
199                 types.NewTx(types.TxData{
200                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Eth2BtcOrders[1].Utxo.SourceID, *Eth2BtcOrders[1].FromAssetID, Eth2BtcOrders[1].Utxo.Amount, Eth2BtcOrders[1].Utxo.SourcePos, []byte{0x51})},
201                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Eth2BtcOrders[1].FromAssetID, Eth2BtcOrders[1].Utxo.Amount, Eth2BtcOrders[1].Utxo.ControlProgram)},
202                 }),
203                 // Eth2Btc[2]
204                 types.NewTx(types.TxData{
205                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Eth2BtcOrders[2].Utxo.SourceID, *Eth2BtcOrders[2].FromAssetID, Eth2BtcOrders[2].Utxo.Amount, Eth2BtcOrders[2].Utxo.SourcePos, []byte{0x51})},
206                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Eth2BtcOrders[2].FromAssetID, Eth2BtcOrders[2].Utxo.Amount, Eth2BtcOrders[2].Utxo.ControlProgram)},
207                 }),
208         }
209
210         Eos2EtcMakerTxs = []*types.Tx{
211                 // Eos2Etc[0]
212                 types.NewTx(types.TxData{
213                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Eos2EtcOrders[0].Utxo.SourceID, *Eos2EtcOrders[0].FromAssetID, Eos2EtcOrders[0].Utxo.Amount, Eos2EtcOrders[0].Utxo.SourcePos, []byte{0x51})},
214                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Eos2EtcOrders[0].FromAssetID, Eos2EtcOrders[0].Utxo.Amount, Eos2EtcOrders[0].Utxo.ControlProgram)},
215                 }),
216         }
217
218         Etc2EosMakerTxs = []*types.Tx{
219                 // Etc2Eos[0]
220                 types.NewTx(types.TxData{
221                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Etc2EosOrders[0].Utxo.SourceID, *Etc2EosOrders[0].FromAssetID, Etc2EosOrders[0].Utxo.Amount, Etc2EosOrders[0].Utxo.SourcePos, []byte{0x51})},
222                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Etc2EosOrders[0].FromAssetID, Etc2EosOrders[0].Utxo.Amount, Etc2EosOrders[0].Utxo.ControlProgram)},
223                 }),
224         }
225
226         Eth2EosMakerTxs = []*types.Tx{
227                 // Eth2Eos[0]
228                 types.NewTx(types.TxData{
229                         Inputs:  []*types.TxInput{types.NewSpendInput(nil, *Eth2EosOrders[0].Utxo.SourceID, *Eth2EosOrders[0].FromAssetID, Eth2EosOrders[0].Utxo.Amount, Eth2EosOrders[0].Utxo.SourcePos, []byte{0x51})},
230                         Outputs: []*types.TxOutput{types.NewIntraChainOutput(*Eth2EosOrders[0].FromAssetID, Eth2EosOrders[0].Utxo.Amount, Eth2EosOrders[0].Utxo.ControlProgram)},
231                 }),
232         }
233
234         MatchedTxs = []*types.Tx{
235                 // partial matched transaction from Btc2EthOrders[0], Eth2BtcOrders[1]
236                 types.NewTx(types.TxData{
237                         Inputs: []*types.TxInput{
238                                 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),
239                                 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),
240                         },
241                         Outputs: []*types.TxOutput{
242                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 416, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
243                                 // re-order
244                                 types.NewIntraChainOutput(*Btc2EthOrders[0].FromAssetID, 2, Btc2EthOrders[0].Utxo.ControlProgram),
245                                 types.NewIntraChainOutput(*Eth2BtcOrders[1].ToAssetID, 8, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19254")),
246                         },
247                 }),
248
249                 // full matched transaction from Btc2EthOrders[0], Eth2BtcOrders[0]
250                 types.NewTx(types.TxData{
251                         Inputs: []*types.TxInput{
252                                 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),
253                                 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),
254                         },
255                         Outputs: []*types.TxOutput{
256                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 500, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
257                                 types.NewIntraChainOutput(*Eth2BtcOrders[0].ToAssetID, 10, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19253")),
258                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 10, NodeProgram),
259                         },
260                 }),
261
262                 // partial matched transaction from Btc2EthOrders[0], Eth2BtcOrders[2]
263                 types.NewTx(types.TxData{
264                         Inputs: []*types.TxInput{
265                                 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),
266                                 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),
267                         },
268                         Outputs: []*types.TxOutput{
269                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 500, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
270                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].ToAssetID, 10, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255")),
271                                 // re-order
272                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].FromAssetID, 270, Eth2BtcOrders[2].Utxo.ControlProgram),
273                                 // fee
274                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].FromAssetID, 27, NodeProgram),
275                                 // refund
276                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].FromAssetID, 6, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
277                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].FromAssetID, 7, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255")),
278                         },
279                 }),
280                 types.NewTx(types.TxData{
281                         Inputs: []*types.TxInput{
282                                 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),
283                                 types.NewSpendInput([][]byte{vm.Int64Bytes(2), vm.Int64Bytes(1)}, testutil.MustDecodeHash("39bdb7058a0c31fb740af8e3c382bf608efff1b041cd4dd461332722ad24552a"), *Eth2BtcOrders[2].FromAssetID, 270, 2, Eth2BtcOrders[2].Utxo.ControlProgram),
284                         },
285                         Outputs: []*types.TxOutput{
286                                 types.NewIntraChainOutput(*Btc2EthOrders[1].ToAssetID, 270, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19252")),
287                                 // re-order
288                                 types.NewIntraChainOutput(*Btc2EthOrders[1].FromAssetID, 15, Btc2EthOrders[1].Utxo.ControlProgram),
289                                 types.NewIntraChainOutput(*Eth2BtcOrders[2].ToAssetID, 5, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255")),
290                         },
291                 }),
292
293                 // partial matched transaction from Btc2EthMakerTxs[0], Eth2BtcMakerTxs[1]
294                 types.NewTx(types.TxData{
295                         Inputs: []*types.TxInput{
296                                 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),
297                                 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),
298                         },
299                         Outputs: []*types.TxOutput{
300                                 types.NewIntraChainOutput(*Btc2EthOrders[0].ToAssetID, 416, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
301                                 // re-order
302                                 types.NewIntraChainOutput(*Btc2EthOrders[0].FromAssetID, 2, Btc2EthOrders[0].Utxo.ControlProgram),
303                                 types.NewIntraChainOutput(*Eth2BtcOrders[1].ToAssetID, 8, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19254")),
304                         },
305                 }),
306
307                 // full matched transaction from Eos2Etc[0] Etc2Eos[0]
308                 types.NewTx(types.TxData{
309                         Inputs: []*types.TxInput{
310                                 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),
311                                 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),
312                         },
313                         Outputs: []*types.TxOutput{
314                                 types.NewIntraChainOutput(*Eos2EtcOrders[0].ToAssetID, 50, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19255")),
315                                 types.NewIntraChainOutput(*Etc2EosOrders[0].ToAssetID, 100, testutil.MustDecodeHexString("0014df7a97e53bbe278e4e44810b0a760fb472daa9a3")),
316                         },
317                 }),
318
319                 // cycle matched from Btc2Eth Eth2Eos Eos2Btc
320                 types.NewTx(types.TxData{
321                         Inputs: []*types.TxInput{
322                                 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),
323                                 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),
324                                 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),
325                         },
326                         Outputs: []*types.TxOutput{
327                                 types.NewIntraChainOutput(ETH, 500, testutil.MustDecodeHexString("0014f928b723999312df4ed51cb275a2644336c19251")),
328                                 types.NewIntraChainOutput(EOS, 1000, testutil.MustDecodeHexString("0014e3178c0f294a9a8f4b304236406507913091df86")),
329                                 types.NewIntraChainOutput(BTC, 10, testutil.MustDecodeHexString("00144d0dfc8a0c5ce41d31d4f61d99aff70588bff8bc")),
330                         },
331                 }),
332         }
333 )
334
335 func MustCreateP2WMCProgram(requestAsset bc.AssetID, sellerProgram []byte, ratioNumerator, ratioDenominator int64) []byte {
336         contractArgs := vmutil.MagneticContractArgs{
337                 RequestedAsset:   requestAsset,
338                 RatioNumerator:   ratioNumerator,
339                 RatioDenominator: ratioDenominator,
340                 SellerProgram:    sellerProgram,
341                 SellerKey:        testutil.MustDecodeHexString("ad79ec6bd3a6d6dbe4d0ee902afc99a12b9702fb63edce5f651db3081d868b75"),
342         }
343         program, err := vmutil.P2WMCProgram(contractArgs)
344         if err != nil {
345                 panic(err)
346         }
347         return program
348 }
349
350 func MustNewOrderFromOutput(tx *types.Tx, outputIndex int) *common.Order {
351         order, err := common.NewOrderFromOutput(tx, outputIndex)
352         if err != nil {
353                 panic(err)
354         }
355
356         return order
357 }
358
359 func hashPtr(hash bc.Hash) *bc.Hash {
360         return &hash
361 }