OSDN Git Service

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