OSDN Git Service

Dex database logic implementation (#404)
[bytom/vapor.git] / application / mov / database / mov_store_test.go
1 package database
2
3 import (
4         "encoding/json"
5         "errors"
6         "io/ioutil"
7         "os"
8         "testing"
9
10         "github.com/stretchr/testify/require"
11
12         "github.com/vapor/application/mov/common"
13         "github.com/vapor/consensus"
14         "github.com/vapor/database/leveldb"
15         dbm "github.com/vapor/database/leveldb"
16         chainjson "github.com/vapor/encoding/json"
17         "github.com/vapor/protocol/bc"
18         "github.com/vapor/protocol/bc/types"
19         "github.com/vapor/testutil"
20 )
21
22 var (
23         assetID1 = &bc.AssetID{V0: 1}
24         assetID2 = &bc.AssetID{V0: 2}
25         assetID3 = &bc.AssetID{V0: 3}
26         assetID4 = &bc.AssetID{V0: 4}
27         assetID5 = &bc.AssetID{V0: 5}
28         assetID6 = &bc.AssetID{V0: 6}
29         assetID7 = &bc.AssetID{V0: 7}
30         assetID8 = &bc.AssetID{V0: 8}
31 )
32
33 func TestCalcUTXOHash(t *testing.T) {
34         wantHash := "7cbaf92f950f2a6bededd6cc5ec08c924505f5365b0a8af963e1d52912c99667"
35         controlProgramStr := "0014ab5acbea076f269bfdc8ededbed7d0a13e6e0b19"
36
37         var controlProgram chainjson.HexBytes
38         controlProgram.UnmarshalText([]byte(controlProgramStr))
39
40         sourceID := testutil.MustDecodeHash("ca2faf5fcbf8ee2b43560a32594f608528b12a1fe79cee85252564f886f91060")
41         order := &common.Order{
42                 FromAssetID: consensus.BTMAssetID,
43                 Utxo: &common.MovUtxo{
44                         SourceID:       &sourceID,
45                         SourcePos:      0,
46                         Amount:         31249300000,
47                         ControlProgram: controlProgram[:],
48                 },
49         }
50
51         hash := calcUTXOHash(order)
52         if hash.String() != wantHash {
53                 t.Fatal("The function is incorrect")
54         }
55
56 }
57
58 func TestSortOrderKey(t *testing.T) {
59         dirname, err := ioutil.TempDir("", "db_common_test")
60         require.Nil(t, err)
61
62         db, err := leveldb.NewGoLevelDB("testdb", dirname)
63         if err != nil {
64                 t.Fatal(err)
65         }
66
67         defer func() {
68                 db.Close()
69                 os.RemoveAll(dirname)
70         }()
71
72         type expectedData struct {
73                 rate     float64
74                 utxoHash string
75         }
76
77         cases := []struct {
78                 orders []common.Order
79                 want   []expectedData
80         }{
81                 {
82                         orders: []common.Order{
83                                 common.Order{
84                                         FromAssetID: &bc.AssetID{V0: 1},
85                                         ToAssetID:   &bc.AssetID{V0: 0},
86                                         Rate:        1.00090,
87                                         Utxo: &common.MovUtxo{
88                                                 SourceID:       &bc.Hash{V0: 21},
89                                                 Amount:         1,
90                                                 SourcePos:      0,
91                                                 ControlProgram: []byte("aa"),
92                                         },
93                                 },
94                                 common.Order{
95                                         FromAssetID: &bc.AssetID{V0: 1},
96                                         ToAssetID:   &bc.AssetID{V0: 0},
97                                         Rate:        0.00090,
98                                         Utxo: &common.MovUtxo{
99                                                 SourceID:       &bc.Hash{V0: 22},
100                                                 Amount:         1,
101                                                 SourcePos:      0,
102                                                 ControlProgram: []byte("aa"),
103                                         },
104                                 },
105                                 common.Order{
106                                         FromAssetID: &bc.AssetID{V0: 1},
107                                         ToAssetID:   &bc.AssetID{V0: 0},
108                                         Rate:        0.00097,
109                                         Utxo: &common.MovUtxo{
110                                                 SourceID:       &bc.Hash{V0: 23},
111                                                 Amount:         1,
112                                                 SourcePos:      0,
113                                                 ControlProgram: []byte("aa"),
114                                         },
115                                 },
116                                 common.Order{
117                                         FromAssetID: &bc.AssetID{V0: 1},
118                                         ToAssetID:   &bc.AssetID{V0: 0},
119                                         Rate:        0.00098,
120                                         Utxo: &common.MovUtxo{
121                                                 SourceID:       &bc.Hash{V0: 13},
122                                                 Amount:         1,
123                                                 SourcePos:      0,
124                                                 ControlProgram: []byte("aa"),
125                                         },
126                                 },
127                                 common.Order{
128                                         FromAssetID: &bc.AssetID{V0: 1},
129                                         ToAssetID:   &bc.AssetID{V0: 0},
130                                         Rate:        0.00098,
131                                         Utxo: &common.MovUtxo{
132                                                 SourceID:       &bc.Hash{V0: 24},
133                                                 Amount:         10,
134                                                 SourcePos:      1,
135                                                 ControlProgram: []byte("aa"),
136                                         },
137                                 },
138                                 common.Order{
139                                         FromAssetID: &bc.AssetID{V0: 1},
140                                         ToAssetID:   &bc.AssetID{V0: 0},
141                                         Rate:        0.00099,
142                                         Utxo: &common.MovUtxo{
143                                                 SourceID:       &bc.Hash{V0: 24},
144                                                 Amount:         1,
145                                                 SourcePos:      0,
146                                                 ControlProgram: []byte("aa"),
147                                         },
148                                 },
149                                 common.Order{
150                                         FromAssetID: &bc.AssetID{V0: 1},
151                                         ToAssetID:   &bc.AssetID{V0: 0},
152                                         Rate:        0.00096,
153                                         Utxo: &common.MovUtxo{
154                                                 SourceID:       &bc.Hash{V0: 25},
155                                                 Amount:         1,
156                                                 SourcePos:      0,
157                                                 ControlProgram: []byte("aa"),
158                                         },
159                                 },
160                                 common.Order{
161                                         FromAssetID: &bc.AssetID{V0: 1},
162                                         ToAssetID:   &bc.AssetID{V0: 0},
163                                         Rate:        0.00095,
164                                         Utxo: &common.MovUtxo{
165                                                 SourceID:       &bc.Hash{V0: 26},
166                                                 Amount:         1,
167                                                 SourcePos:      0,
168                                                 ControlProgram: []byte("aa"),
169                                         },
170                                 },
171                                 common.Order{
172                                         FromAssetID: &bc.AssetID{V0: 1},
173                                         ToAssetID:   &bc.AssetID{V0: 0},
174                                         Rate:        0.00091,
175                                         Utxo: &common.MovUtxo{
176                                                 SourceID:       &bc.Hash{V0: 26},
177                                                 Amount:         1,
178                                                 SourcePos:      0,
179                                                 ControlProgram: []byte("aa"),
180                                         },
181                                 },
182                                 common.Order{
183                                         FromAssetID: &bc.AssetID{V0: 1},
184                                         ToAssetID:   &bc.AssetID{V0: 0},
185                                         Rate:        0.00092,
186                                         Utxo: &common.MovUtxo{
187                                                 SourceID:       &bc.Hash{V0: 27},
188                                                 Amount:         1,
189                                                 SourcePos:      0,
190                                                 ControlProgram: []byte("aa"),
191                                         },
192                                 },
193                                 common.Order{
194                                         FromAssetID: &bc.AssetID{V0: 1},
195                                         ToAssetID:   &bc.AssetID{V0: 0},
196                                         Rate:        0.00093,
197                                         Utxo: &common.MovUtxo{
198                                                 SourceID:       &bc.Hash{V0: 28},
199                                                 Amount:         1,
200                                                 SourcePos:      0,
201                                                 ControlProgram: []byte("aa"),
202                                         },
203                                 },
204                                 common.Order{
205                                         FromAssetID: &bc.AssetID{V0: 1},
206                                         ToAssetID:   &bc.AssetID{V0: 0},
207                                         Rate:        0.00094,
208                                         Utxo: &common.MovUtxo{
209                                                 SourceID:       &bc.Hash{V0: 29},
210                                                 Amount:         1,
211                                                 SourcePos:      0,
212                                                 ControlProgram: []byte("aa"),
213                                         },
214                                 },
215                                 common.Order{
216                                         FromAssetID: &bc.AssetID{V0: 1},
217                                         ToAssetID:   &bc.AssetID{V0: 0},
218                                         Rate:        0.00077,
219                                         Utxo: &common.MovUtxo{
220                                                 SourceID:       &bc.Hash{V0: 30},
221                                                 Amount:         1,
222                                                 SourcePos:      0,
223                                                 ControlProgram: []byte("aa"),
224                                         },
225                                 },
226                                 common.Order{
227                                         FromAssetID: &bc.AssetID{V0: 1},
228                                         ToAssetID:   &bc.AssetID{V0: 0},
229                                         Rate:        0.00088,
230                                         Utxo: &common.MovUtxo{
231                                                 SourceID:       &bc.Hash{V0: 31},
232                                                 Amount:         1,
233                                                 SourcePos:      0,
234                                                 ControlProgram: []byte("aa"),
235                                         },
236                                 },
237                                 common.Order{
238                                         FromAssetID: &bc.AssetID{V0: 1},
239                                         ToAssetID:   &bc.AssetID{V0: 0},
240                                         Rate:        999999.9521,
241                                         Utxo: &common.MovUtxo{
242                                                 SourceID:       &bc.Hash{V0: 32},
243                                                 Amount:         1,
244                                                 SourcePos:      0,
245                                                 ControlProgram: []byte("aa"),
246                                         },
247                                 },
248                                 common.Order{
249                                         FromAssetID: &bc.AssetID{V0: 1},
250                                         ToAssetID:   &bc.AssetID{V0: 0},
251                                         Rate:        888888.7954,
252                                         Utxo: &common.MovUtxo{
253                                                 SourceID:       &bc.Hash{V0: 33},
254                                                 Amount:         1,
255                                                 SourcePos:      0,
256                                                 ControlProgram: []byte("aa"),
257                                         },
258                                 },
259                         },
260                         want: []expectedData{
261                                 expectedData{
262                                         rate:     0.00077,
263                                         utxoHash: "f1b85307cf1f4eb6b193b6fc289413fdbb12bc362ced399762589b016e54dd02",
264                                 },
265                                 expectedData{
266                                         rate:     0.00088,
267                                         utxoHash: "49ef60af0f24962ed129a73142048ed0cb589041c629353932e3c3e0a4e822ba",
268                                 },
269                                 expectedData{
270                                         rate:     0.00090,
271                                         utxoHash: "67b2ac6ea71b271e72836e162811866f291ed2fab106c43519ca0c94ef8a5dce",
272                                 },
273                                 expectedData{
274                                         rate:     0.00091,
275                                         utxoHash: "47ff45b7b530512142981c2cee82faad63d6c9e7ffed0e72c3e42668f13b296f",
276                                 },
277                                 expectedData{
278                                         rate:     0.00092,
279                                         utxoHash: "b750d0b95f38043362c8335f242f97cfd3e1cada8fd171b914471a16cc0f14c6",
280                                 },
281                                 expectedData{
282                                         rate:     0.00093,
283                                         utxoHash: "04386ef57f0ca1be0a9be46c413900adbc0ab1e90e773959924aa73ca62edf64",
284                                 },
285                                 expectedData{
286                                         rate:     0.00094,
287                                         utxoHash: "c0fe6227c50da350a5e7b4ff85c18e9c901c323521067b9142acd128cf13ae82",
288                                 },
289                                 expectedData{
290                                         rate:     0.00095,
291                                         utxoHash: "47ff45b7b530512142981c2cee82faad63d6c9e7ffed0e72c3e42668f13b296f",
292                                 },
293                                 expectedData{
294                                         rate:     0.00096,
295                                         utxoHash: "bc92df1cbd20c98b0d18c9d93422a770849235867522a08e492196d16ed0a422",
296                                 },
297                                 expectedData{
298                                         rate:     0.00097,
299                                         utxoHash: "0cc0ded6fb337a3c5e6e4d008d6167dc58bdede43713898e914d65cda3b8499a",
300                                 },
301                                 expectedData{
302                                         rate:     0.00098,
303                                         utxoHash: "1fa9fae83d0a5401a4e92f80636966486e763eecca588aa11dff02b415320602",
304                                 },
305                                 expectedData{
306                                         rate:     0.00098,
307                                         utxoHash: "a4bc534c267d35a9eafc25cd66e0cb270a2537a51186605b7f7591bc567ab4c6",
308                                 },
309                                 expectedData{
310                                         rate:     0.00099,
311                                         utxoHash: "fdedf4117def659e07cc8a8ca318d21ae577a05e1a0197844b54d493bdae5854",
312                                 },
313                                 expectedData{
314                                         rate:     1.0009,
315                                         utxoHash: "20be3bd2d406bb7fe6627b32768fb2073e997b962a4badfa4384210fed2ab9c6",
316                                 },
317                                 expectedData{
318                                         rate:     888888.7954,
319                                         utxoHash: "72192f56b9525c74c6a9f0419563bc0da76b0f3d6e89d9decdb6e67786ac3909",
320                                 },
321                                 expectedData{
322                                         rate:     999999.9521,
323                                         utxoHash: "7886844334659b4feffc41528cf81192925d3aa4a5ccb3652200b9073b7d47c3",
324                                 },
325                         },
326                 },
327         }
328
329         for i, c := range cases {
330                 for _, order := range c.orders {
331                         key := calcOrderKey(order.FromAssetID, order.ToAssetID, calcUTXOHash(&order), order.Rate)
332                         data, err := json.Marshal(order.Utxo)
333                         if err != nil {
334                                 t.Fatal(err)
335                         }
336
337                         db.SetSync(key, data)
338                 }
339
340                 got := []expectedData{}
341
342                 itr := db.IteratorPrefixWithStart(nil, nil, false)
343                 for itr.Next() {
344                         key := itr.Key()
345                         pos := len(ordersPrefix) + assetIDLen*2
346                         b := [32]byte{}
347                         copy(b[:], key[pos+8:])
348                         utxoHash := bc.NewHash(b)
349
350                         rate := getRateFromOrderKey(key, ordersPrefix)
351                         got = append(got, expectedData{
352                                 rate:     rate,
353                                 utxoHash: utxoHash.String(),
354                         })
355                 }
356                 itr.Release()
357
358                 if !testutil.DeepEqual(c.want, got) {
359                         t.Errorf("case %v: got recovery status, got: %v, want: %v.", i, got, c.want)
360                 }
361
362         }
363 }
364
365 func TestMovStore(t *testing.T) {
366         cases := []struct {
367                 desc             string
368                 beforeOrders     []*common.Order
369                 beforeTradePairs []*common.TradePair
370                 beforeDBStatus   *common.MovDatabaseState
371                 addOrders        []*common.Order
372                 delOrders        []*common.Order
373                 blockHeader      *types.BlockHeader
374                 wantOrders       []*common.Order
375                 wantTradePairs   []*common.TradePair
376                 wantDBState      *common.MovDatabaseState
377         }{
378                 {
379                         desc: "add order",
380                         addOrders: []*common.Order{
381                                 &common.Order{
382                                         FromAssetID: assetID1,
383                                         ToAssetID:   assetID2,
384                                         Rate:        1.00090,
385                                         Utxo: &common.MovUtxo{
386                                                 SourceID:       &bc.Hash{V0: 21},
387                                                 Amount:         1,
388                                                 SourcePos:      0,
389                                                 ControlProgram: []byte("aa"),
390                                         },
391                                 },
392                                 &common.Order{
393                                         FromAssetID: assetID1,
394                                         ToAssetID:   assetID2,
395                                         Rate:        0.00090,
396                                         Utxo: &common.MovUtxo{
397                                                 SourceID:       &bc.Hash{V0: 22},
398                                                 Amount:         1,
399                                                 SourcePos:      0,
400                                                 ControlProgram: []byte("aa"),
401                                         },
402                                 },
403                                 &common.Order{
404                                         FromAssetID: assetID1,
405                                         ToAssetID:   assetID2,
406                                         Rate:        0.00097,
407                                         Utxo: &common.MovUtxo{
408                                                 SourceID:       &bc.Hash{V0: 23},
409                                                 Amount:         1,
410                                                 SourcePos:      0,
411                                                 ControlProgram: []byte("aa"),
412                                         },
413                                 },
414                                 &common.Order{
415                                         FromAssetID: assetID1,
416                                         ToAssetID:   assetID2,
417                                         Rate:        0.00098,
418                                         Utxo: &common.MovUtxo{
419                                                 SourceID:       &bc.Hash{V0: 13},
420                                                 Amount:         1,
421                                                 SourcePos:      0,
422                                                 ControlProgram: []byte("aa"),
423                                         },
424                                 },
425                                 &common.Order{
426                                         FromAssetID: assetID1,
427                                         ToAssetID:   assetID2,
428                                         Rate:        0.00098,
429                                         Utxo: &common.MovUtxo{
430                                                 SourceID:       &bc.Hash{V0: 24},
431                                                 Amount:         10,
432                                                 SourcePos:      1,
433                                                 ControlProgram: []byte("aa"),
434                                         },
435                                 },
436                                 &common.Order{
437                                         FromAssetID: assetID1,
438                                         ToAssetID:   assetID2,
439                                         Rate:        0.00099,
440                                         Utxo: &common.MovUtxo{
441                                                 SourceID:       &bc.Hash{V0: 24},
442                                                 Amount:         1,
443                                                 SourcePos:      0,
444                                                 ControlProgram: []byte("aa"),
445                                         },
446                                 },
447                                 &common.Order{
448                                         FromAssetID: assetID1,
449                                         ToAssetID:   assetID2,
450                                         Rate:        0.00096,
451                                         Utxo: &common.MovUtxo{
452                                                 SourceID:       &bc.Hash{V0: 25},
453                                                 Amount:         1,
454                                                 SourcePos:      0,
455                                                 ControlProgram: []byte("aa"),
456                                         },
457                                 },
458                                 &common.Order{
459                                         FromAssetID: assetID1,
460                                         ToAssetID:   assetID2,
461                                         Rate:        0.00095,
462                                         Utxo: &common.MovUtxo{
463                                                 SourceID:       &bc.Hash{V0: 26},
464                                                 Amount:         1,
465                                                 SourcePos:      0,
466                                                 ControlProgram: []byte("aa"),
467                                         },
468                                 },
469                         },
470                         blockHeader: &types.BlockHeader{Height: 1, PreviousBlockHash: bc.Hash{V0: 524821139490765641, V1: 2484214155808702787, V2: 9108473449351508820, V3: 7972721253564512122}},
471                         wantOrders: []*common.Order{
472                                 &common.Order{
473                                         FromAssetID: assetID1,
474                                         ToAssetID:   assetID2,
475                                         Rate:        0.00090,
476                                         Utxo: &common.MovUtxo{
477                                                 SourceID:       &bc.Hash{V0: 22},
478                                                 Amount:         1,
479                                                 SourcePos:      0,
480                                                 ControlProgram: []byte("aa"),
481                                         },
482                                 },
483                                 &common.Order{
484                                         FromAssetID: assetID1,
485                                         ToAssetID:   assetID2,
486                                         Rate:        0.00095,
487                                         Utxo: &common.MovUtxo{
488                                                 SourceID:       &bc.Hash{V0: 26},
489                                                 Amount:         1,
490                                                 SourcePos:      0,
491                                                 ControlProgram: []byte("aa"),
492                                         },
493                                 },
494                                 &common.Order{
495                                         FromAssetID: assetID1,
496                                         ToAssetID:   assetID2,
497                                         Rate:        0.00096,
498                                         Utxo: &common.MovUtxo{
499                                                 SourceID:       &bc.Hash{V0: 25},
500                                                 Amount:         1,
501                                                 SourcePos:      0,
502                                                 ControlProgram: []byte("aa"),
503                                         },
504                                 },
505                                 &common.Order{
506                                         FromAssetID: assetID1,
507                                         ToAssetID:   assetID2,
508                                         Rate:        0.00097,
509                                         Utxo: &common.MovUtxo{
510                                                 SourceID:       &bc.Hash{V0: 23},
511                                                 Amount:         1,
512                                                 SourcePos:      0,
513                                                 ControlProgram: []byte("aa"),
514                                         },
515                                 },
516                                 &common.Order{
517                                         FromAssetID: assetID1,
518                                         ToAssetID:   assetID2,
519                                         Rate:        0.00098,
520                                         Utxo: &common.MovUtxo{
521                                                 SourceID:       &bc.Hash{V0: 13},
522                                                 Amount:         1,
523                                                 SourcePos:      0,
524                                                 ControlProgram: []byte("aa"),
525                                         },
526                                 },
527                                 &common.Order{
528                                         FromAssetID: assetID1,
529                                         ToAssetID:   assetID2,
530                                         Rate:        0.00098,
531                                         Utxo: &common.MovUtxo{
532                                                 SourceID:       &bc.Hash{V0: 24},
533                                                 Amount:         10,
534                                                 SourcePos:      1,
535                                                 ControlProgram: []byte("aa"),
536                                         },
537                                 },
538                                 &common.Order{
539                                         FromAssetID: assetID1,
540                                         ToAssetID:   assetID2,
541                                         Rate:        0.00099,
542                                         Utxo: &common.MovUtxo{
543                                                 SourceID:       &bc.Hash{V0: 24},
544                                                 Amount:         1,
545                                                 SourcePos:      0,
546                                                 ControlProgram: []byte("aa"),
547                                         },
548                                 },
549                                 &common.Order{
550                                         FromAssetID: assetID1,
551                                         ToAssetID:   assetID2,
552                                         Rate:        1.00090,
553                                         Utxo: &common.MovUtxo{
554                                                 SourceID:       &bc.Hash{V0: 21},
555                                                 Amount:         1,
556                                                 SourcePos:      0,
557                                                 ControlProgram: []byte("aa"),
558                                         },
559                                 },
560                         },
561                         wantTradePairs: []*common.TradePair{
562                                 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 8},
563                         },
564                         wantDBState: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
565                 },
566                 {
567                         desc: "del some order",
568                         beforeOrders: []*common.Order{
569                                 &common.Order{
570                                         FromAssetID: assetID1,
571                                         ToAssetID:   assetID2,
572                                         Rate:        1.00090,
573                                         Utxo: &common.MovUtxo{
574                                                 SourceID:       &bc.Hash{V0: 21},
575                                                 Amount:         1,
576                                                 SourcePos:      0,
577                                                 ControlProgram: []byte("aa"),
578                                         },
579                                 },
580                                 &common.Order{
581                                         FromAssetID: assetID1,
582                                         ToAssetID:   assetID2,
583                                         Rate:        0.00090,
584                                         Utxo: &common.MovUtxo{
585                                                 SourceID:       &bc.Hash{V0: 22},
586                                                 Amount:         1,
587                                                 SourcePos:      0,
588                                                 ControlProgram: []byte("aa"),
589                                         },
590                                 },
591                                 &common.Order{
592                                         FromAssetID: assetID1,
593                                         ToAssetID:   assetID2,
594                                         Rate:        0.00097,
595                                         Utxo: &common.MovUtxo{
596                                                 SourceID:       &bc.Hash{V0: 23},
597                                                 Amount:         1,
598                                                 SourcePos:      0,
599                                                 ControlProgram: []byte("aa"),
600                                         },
601                                 },
602                                 &common.Order{
603                                         FromAssetID: assetID1,
604                                         ToAssetID:   assetID2,
605                                         Rate:        0.00098,
606                                         Utxo: &common.MovUtxo{
607                                                 SourceID:       &bc.Hash{V0: 13},
608                                                 Amount:         1,
609                                                 SourcePos:      0,
610                                                 ControlProgram: []byte("aa"),
611                                         },
612                                 },
613                                 &common.Order{
614                                         FromAssetID: assetID1,
615                                         ToAssetID:   assetID2,
616                                         Rate:        0.00098,
617                                         Utxo: &common.MovUtxo{
618                                                 SourceID:       &bc.Hash{V0: 24},
619                                                 Amount:         10,
620                                                 SourcePos:      1,
621                                                 ControlProgram: []byte("aa"),
622                                         },
623                                 },
624                                 &common.Order{
625                                         FromAssetID: assetID1,
626                                         ToAssetID:   assetID2,
627                                         Rate:        0.00099,
628                                         Utxo: &common.MovUtxo{
629                                                 SourceID:       &bc.Hash{V0: 24},
630                                                 Amount:         1,
631                                                 SourcePos:      0,
632                                                 ControlProgram: []byte("aa"),
633                                         },
634                                 },
635                                 &common.Order{
636                                         FromAssetID: assetID1,
637                                         ToAssetID:   assetID2,
638                                         Rate:        0.00096,
639                                         Utxo: &common.MovUtxo{
640                                                 SourceID:       &bc.Hash{V0: 25},
641                                                 Amount:         1,
642                                                 SourcePos:      0,
643                                                 ControlProgram: []byte("aa"),
644                                         },
645                                 },
646                                 &common.Order{
647                                         FromAssetID: assetID1,
648                                         ToAssetID:   assetID2,
649                                         Rate:        0.00095,
650                                         Utxo: &common.MovUtxo{
651                                                 SourceID:       &bc.Hash{V0: 26},
652                                                 Amount:         1,
653                                                 SourcePos:      0,
654                                                 ControlProgram: []byte("aa"),
655                                         },
656                                 },
657                         },
658                         beforeTradePairs: []*common.TradePair{
659                                 &common.TradePair{
660                                         FromAssetID: assetID1,
661                                         ToAssetID:   assetID2,
662                                         Count:       8,
663                                 },
664                         },
665                         beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
666                         delOrders: []*common.Order{
667                                 &common.Order{
668                                         FromAssetID: assetID1,
669                                         ToAssetID:   assetID2,
670                                         Rate:        1.00090,
671                                         Utxo: &common.MovUtxo{
672                                                 SourceID:       &bc.Hash{V0: 21},
673                                                 Amount:         1,
674                                                 SourcePos:      0,
675                                                 ControlProgram: []byte("aa"),
676                                         },
677                                 },
678                                 &common.Order{
679                                         FromAssetID: assetID1,
680                                         ToAssetID:   assetID2,
681                                         Rate:        0.00090,
682                                         Utxo: &common.MovUtxo{
683                                                 SourceID:       &bc.Hash{V0: 22},
684                                                 Amount:         1,
685                                                 SourcePos:      0,
686                                                 ControlProgram: []byte("aa"),
687                                         },
688                                 },
689                                 &common.Order{
690                                         FromAssetID: assetID1,
691                                         ToAssetID:   assetID2,
692                                         Rate:        0.00097,
693                                         Utxo: &common.MovUtxo{
694                                                 SourceID:       &bc.Hash{V0: 23},
695                                                 Amount:         1,
696                                                 SourcePos:      0,
697                                                 ControlProgram: []byte("aa"),
698                                         },
699                                 },
700                         },
701                         blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
702                         wantOrders: []*common.Order{
703                                 &common.Order{
704                                         FromAssetID: assetID1,
705                                         ToAssetID:   assetID2,
706                                         Rate:        0.00095,
707                                         Utxo: &common.MovUtxo{
708                                                 SourceID:       &bc.Hash{V0: 26},
709                                                 Amount:         1,
710                                                 SourcePos:      0,
711                                                 ControlProgram: []byte("aa"),
712                                         },
713                                 },
714                                 &common.Order{
715                                         FromAssetID: assetID1,
716                                         ToAssetID:   assetID2,
717                                         Rate:        0.00096,
718                                         Utxo: &common.MovUtxo{
719                                                 SourceID:       &bc.Hash{V0: 25},
720                                                 Amount:         1,
721                                                 SourcePos:      0,
722                                                 ControlProgram: []byte("aa"),
723                                         },
724                                 },
725                                 &common.Order{
726                                         FromAssetID: assetID1,
727                                         ToAssetID:   assetID2,
728                                         Rate:        0.00098,
729                                         Utxo: &common.MovUtxo{
730                                                 SourceID:       &bc.Hash{V0: 13},
731                                                 Amount:         1,
732                                                 SourcePos:      0,
733                                                 ControlProgram: []byte("aa"),
734                                         },
735                                 },
736                                 &common.Order{
737                                         FromAssetID: assetID1,
738                                         ToAssetID:   assetID2,
739                                         Rate:        0.00098,
740                                         Utxo: &common.MovUtxo{
741                                                 SourceID:       &bc.Hash{V0: 24},
742                                                 Amount:         10,
743                                                 SourcePos:      1,
744                                                 ControlProgram: []byte("aa"),
745                                         },
746                                 },
747                                 &common.Order{
748                                         FromAssetID: assetID1,
749                                         ToAssetID:   assetID2,
750                                         Rate:        0.00099,
751                                         Utxo: &common.MovUtxo{
752                                                 SourceID:       &bc.Hash{V0: 24},
753                                                 Amount:         1,
754                                                 SourcePos:      0,
755                                                 ControlProgram: []byte("aa"),
756                                         },
757                                 },
758                         },
759                         wantTradePairs: []*common.TradePair{
760                                 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 5},
761                         },
762                         wantDBState: &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
763                 },
764                 {
765                         desc: "del all order",
766                         beforeOrders: []*common.Order{
767                                 &common.Order{
768                                         FromAssetID: assetID1,
769                                         ToAssetID:   assetID2,
770                                         Rate:        1.00090,
771                                         Utxo: &common.MovUtxo{
772                                                 SourceID:       &bc.Hash{V0: 21},
773                                                 Amount:         1,
774                                                 SourcePos:      0,
775                                                 ControlProgram: []byte("aa"),
776                                         },
777                                 },
778                                 &common.Order{
779                                         FromAssetID: assetID1,
780                                         ToAssetID:   assetID2,
781                                         Rate:        0.00090,
782                                         Utxo: &common.MovUtxo{
783                                                 SourceID:       &bc.Hash{V0: 22},
784                                                 Amount:         1,
785                                                 SourcePos:      0,
786                                                 ControlProgram: []byte("aa"),
787                                         },
788                                 },
789                                 &common.Order{
790                                         FromAssetID: assetID1,
791                                         ToAssetID:   assetID2,
792                                         Rate:        0.00097,
793                                         Utxo: &common.MovUtxo{
794                                                 SourceID:       &bc.Hash{V0: 23},
795                                                 Amount:         1,
796                                                 SourcePos:      0,
797                                                 ControlProgram: []byte("aa"),
798                                         },
799                                 },
800                                 &common.Order{
801                                         FromAssetID: assetID1,
802                                         ToAssetID:   assetID2,
803                                         Rate:        0.00098,
804                                         Utxo: &common.MovUtxo{
805                                                 SourceID:       &bc.Hash{V0: 13},
806                                                 Amount:         1,
807                                                 SourcePos:      0,
808                                                 ControlProgram: []byte("aa"),
809                                         },
810                                 },
811                                 &common.Order{
812                                         FromAssetID: assetID1,
813                                         ToAssetID:   assetID2,
814                                         Rate:        0.00098,
815                                         Utxo: &common.MovUtxo{
816                                                 SourceID:       &bc.Hash{V0: 24},
817                                                 Amount:         10,
818                                                 SourcePos:      1,
819                                                 ControlProgram: []byte("aa"),
820                                         },
821                                 },
822                                 &common.Order{
823                                         FromAssetID: assetID1,
824                                         ToAssetID:   assetID2,
825                                         Rate:        0.00099,
826                                         Utxo: &common.MovUtxo{
827                                                 SourceID:       &bc.Hash{V0: 24},
828                                                 Amount:         1,
829                                                 SourcePos:      0,
830                                                 ControlProgram: []byte("aa"),
831                                         },
832                                 },
833                                 &common.Order{
834                                         FromAssetID: assetID1,
835                                         ToAssetID:   assetID2,
836                                         Rate:        0.00096,
837                                         Utxo: &common.MovUtxo{
838                                                 SourceID:       &bc.Hash{V0: 25},
839                                                 Amount:         1,
840                                                 SourcePos:      0,
841                                                 ControlProgram: []byte("aa"),
842                                         },
843                                 },
844                                 &common.Order{
845                                         FromAssetID: assetID1,
846                                         ToAssetID:   assetID2,
847                                         Rate:        0.00095,
848                                         Utxo: &common.MovUtxo{
849                                                 SourceID:       &bc.Hash{V0: 26},
850                                                 Amount:         1,
851                                                 SourcePos:      0,
852                                                 ControlProgram: []byte("aa"),
853                                         },
854                                 },
855                         },
856                         beforeTradePairs: []*common.TradePair{
857                                 &common.TradePair{
858                                         FromAssetID: assetID1,
859                                         ToAssetID:   assetID2,
860                                         Count:       8,
861                                 },
862                         },
863                         beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
864                         delOrders: []*common.Order{
865                                 &common.Order{
866                                         FromAssetID: assetID1,
867                                         ToAssetID:   assetID2,
868                                         Rate:        1.00090,
869                                         Utxo: &common.MovUtxo{
870                                                 SourceID:       &bc.Hash{V0: 21},
871                                                 Amount:         1,
872                                                 SourcePos:      0,
873                                                 ControlProgram: []byte("aa"),
874                                         },
875                                 },
876                                 &common.Order{
877                                         FromAssetID: assetID1,
878                                         ToAssetID:   assetID2,
879                                         Rate:        0.00090,
880                                         Utxo: &common.MovUtxo{
881                                                 SourceID:       &bc.Hash{V0: 22},
882                                                 Amount:         1,
883                                                 SourcePos:      0,
884                                                 ControlProgram: []byte("aa"),
885                                         },
886                                 },
887                                 &common.Order{
888                                         FromAssetID: assetID1,
889                                         ToAssetID:   assetID2,
890                                         Rate:        0.00097,
891                                         Utxo: &common.MovUtxo{
892                                                 SourceID:       &bc.Hash{V0: 23},
893                                                 Amount:         1,
894                                                 SourcePos:      0,
895                                                 ControlProgram: []byte("aa"),
896                                         },
897                                 },
898                                 &common.Order{
899                                         FromAssetID: assetID1,
900                                         ToAssetID:   assetID2,
901                                         Rate:        0.00098,
902                                         Utxo: &common.MovUtxo{
903                                                 SourceID:       &bc.Hash{V0: 13},
904                                                 Amount:         1,
905                                                 SourcePos:      0,
906                                                 ControlProgram: []byte("aa"),
907                                         },
908                                 },
909                                 &common.Order{
910                                         FromAssetID: assetID1,
911                                         ToAssetID:   assetID2,
912                                         Rate:        0.00098,
913                                         Utxo: &common.MovUtxo{
914                                                 SourceID:       &bc.Hash{V0: 24},
915                                                 Amount:         10,
916                                                 SourcePos:      1,
917                                                 ControlProgram: []byte("aa"),
918                                         },
919                                 },
920                                 &common.Order{
921                                         FromAssetID: assetID1,
922                                         ToAssetID:   assetID2,
923                                         Rate:        0.00099,
924                                         Utxo: &common.MovUtxo{
925                                                 SourceID:       &bc.Hash{V0: 24},
926                                                 Amount:         1,
927                                                 SourcePos:      0,
928                                                 ControlProgram: []byte("aa"),
929                                         },
930                                 },
931                                 &common.Order{
932                                         FromAssetID: assetID1,
933                                         ToAssetID:   assetID2,
934                                         Rate:        0.00096,
935                                         Utxo: &common.MovUtxo{
936                                                 SourceID:       &bc.Hash{V0: 25},
937                                                 Amount:         1,
938                                                 SourcePos:      0,
939                                                 ControlProgram: []byte("aa"),
940                                         },
941                                 },
942                                 &common.Order{
943                                         FromAssetID: assetID1,
944                                         ToAssetID:   assetID2,
945                                         Rate:        0.00095,
946                                         Utxo: &common.MovUtxo{
947                                                 SourceID:       &bc.Hash{V0: 26},
948                                                 Amount:         1,
949                                                 SourcePos:      0,
950                                                 ControlProgram: []byte("aa"),
951                                         },
952                                 },
953                         },
954                         blockHeader:    &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
955                         wantOrders:     []*common.Order{},
956                         wantTradePairs: []*common.TradePair{},
957                         wantDBState:    &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
958                 },
959                 {
960                         desc: "Add and delete the same trade pair", //Add and delete different transaction pairs
961                         beforeOrders: []*common.Order{
962                                 &common.Order{
963                                         FromAssetID: assetID1,
964                                         ToAssetID:   assetID2,
965                                         Rate:        1.00090,
966                                         Utxo: &common.MovUtxo{
967                                                 SourceID:       &bc.Hash{V0: 21},
968                                                 Amount:         1,
969                                                 SourcePos:      0,
970                                                 ControlProgram: []byte("aa"),
971                                         },
972                                 },
973                                 &common.Order{
974                                         FromAssetID: assetID1,
975                                         ToAssetID:   assetID2,
976                                         Rate:        0.00090,
977                                         Utxo: &common.MovUtxo{
978                                                 SourceID:       &bc.Hash{V0: 22},
979                                                 Amount:         1,
980                                                 SourcePos:      0,
981                                                 ControlProgram: []byte("aa"),
982                                         },
983                                 },
984                                 &common.Order{
985                                         FromAssetID: assetID1,
986                                         ToAssetID:   assetID2,
987                                         Rate:        0.00097,
988                                         Utxo: &common.MovUtxo{
989                                                 SourceID:       &bc.Hash{V0: 23},
990                                                 Amount:         1,
991                                                 SourcePos:      0,
992                                                 ControlProgram: []byte("aa"),
993                                         },
994                                 },
995                                 &common.Order{
996                                         FromAssetID: assetID1,
997                                         ToAssetID:   assetID2,
998                                         Rate:        0.00098,
999                                         Utxo: &common.MovUtxo{
1000                                                 SourceID:       &bc.Hash{V0: 13},
1001                                                 Amount:         1,
1002                                                 SourcePos:      0,
1003                                                 ControlProgram: []byte("aa"),
1004                                         },
1005                                 },
1006                                 &common.Order{
1007                                         FromAssetID: assetID1,
1008                                         ToAssetID:   assetID2,
1009                                         Rate:        0.00098,
1010                                         Utxo: &common.MovUtxo{
1011                                                 SourceID:       &bc.Hash{V0: 24},
1012                                                 Amount:         10,
1013                                                 SourcePos:      1,
1014                                                 ControlProgram: []byte("aa"),
1015                                         },
1016                                 },
1017                                 &common.Order{
1018                                         FromAssetID: assetID1,
1019                                         ToAssetID:   assetID2,
1020                                         Rate:        0.00099,
1021                                         Utxo: &common.MovUtxo{
1022                                                 SourceID:       &bc.Hash{V0: 24},
1023                                                 Amount:         1,
1024                                                 SourcePos:      0,
1025                                                 ControlProgram: []byte("aa"),
1026                                         },
1027                                 },
1028                                 &common.Order{
1029                                         FromAssetID: assetID1,
1030                                         ToAssetID:   assetID2,
1031                                         Rate:        0.00096,
1032                                         Utxo: &common.MovUtxo{
1033                                                 SourceID:       &bc.Hash{V0: 25},
1034                                                 Amount:         1,
1035                                                 SourcePos:      0,
1036                                                 ControlProgram: []byte("aa"),
1037                                         },
1038                                 },
1039                                 &common.Order{
1040                                         FromAssetID: assetID1,
1041                                         ToAssetID:   assetID2,
1042                                         Rate:        0.00095,
1043                                         Utxo: &common.MovUtxo{
1044                                                 SourceID:       &bc.Hash{V0: 26},
1045                                                 Amount:         1,
1046                                                 SourcePos:      0,
1047                                                 ControlProgram: []byte("aa"),
1048                                         },
1049                                 },
1050                         },
1051                         beforeTradePairs: []*common.TradePair{
1052                                 &common.TradePair{
1053                                         FromAssetID: assetID1,
1054                                         ToAssetID:   assetID2,
1055                                         Count:       8,
1056                                 },
1057                         },
1058                         beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
1059                         addOrders: []*common.Order{
1060                                 &common.Order{
1061                                         FromAssetID: assetID1,
1062                                         ToAssetID:   assetID2,
1063                                         Rate:        1.00090,
1064                                         Utxo: &common.MovUtxo{
1065                                                 SourceID:       &bc.Hash{V0: 1},
1066                                                 Amount:         1,
1067                                                 SourcePos:      0,
1068                                                 ControlProgram: []byte("aa"),
1069                                         },
1070                                 },
1071                                 &common.Order{
1072                                         FromAssetID: assetID1,
1073                                         ToAssetID:   assetID2,
1074                                         Rate:        0.00090,
1075                                         Utxo: &common.MovUtxo{
1076                                                 SourceID:       &bc.Hash{V0: 2},
1077                                                 Amount:         1,
1078                                                 SourcePos:      0,
1079                                                 ControlProgram: []byte("aa"),
1080                                         },
1081                                 },
1082                         },
1083                         delOrders: []*common.Order{
1084                                 &common.Order{
1085                                         FromAssetID: assetID1,
1086                                         ToAssetID:   assetID2,
1087                                         Rate:        1.00090,
1088                                         Utxo: &common.MovUtxo{
1089                                                 SourceID:       &bc.Hash{V0: 21},
1090                                                 Amount:         1,
1091                                                 SourcePos:      0,
1092                                                 ControlProgram: []byte("aa"),
1093                                         },
1094                                 },
1095                                 &common.Order{
1096                                         FromAssetID: assetID1,
1097                                         ToAssetID:   assetID2,
1098                                         Rate:        0.00090,
1099                                         Utxo: &common.MovUtxo{
1100                                                 SourceID:       &bc.Hash{V0: 22},
1101                                                 Amount:         1,
1102                                                 SourcePos:      0,
1103                                                 ControlProgram: []byte("aa"),
1104                                         },
1105                                 },
1106                                 &common.Order{
1107                                         FromAssetID: assetID1,
1108                                         ToAssetID:   assetID2,
1109                                         Rate:        0.00097,
1110                                         Utxo: &common.MovUtxo{
1111                                                 SourceID:       &bc.Hash{V0: 23},
1112                                                 Amount:         1,
1113                                                 SourcePos:      0,
1114                                                 ControlProgram: []byte("aa"),
1115                                         },
1116                                 },
1117                                 &common.Order{
1118                                         FromAssetID: assetID1,
1119                                         ToAssetID:   assetID2,
1120                                         Rate:        0.00098,
1121                                         Utxo: &common.MovUtxo{
1122                                                 SourceID:       &bc.Hash{V0: 13},
1123                                                 Amount:         1,
1124                                                 SourcePos:      0,
1125                                                 ControlProgram: []byte("aa"),
1126                                         },
1127                                 },
1128                                 &common.Order{
1129                                         FromAssetID: assetID1,
1130                                         ToAssetID:   assetID2,
1131                                         Rate:        0.00098,
1132                                         Utxo: &common.MovUtxo{
1133                                                 SourceID:       &bc.Hash{V0: 24},
1134                                                 Amount:         10,
1135                                                 SourcePos:      1,
1136                                                 ControlProgram: []byte("aa"),
1137                                         },
1138                                 },
1139                                 &common.Order{
1140                                         FromAssetID: assetID1,
1141                                         ToAssetID:   assetID2,
1142                                         Rate:        0.00099,
1143                                         Utxo: &common.MovUtxo{
1144                                                 SourceID:       &bc.Hash{V0: 24},
1145                                                 Amount:         1,
1146                                                 SourcePos:      0,
1147                                                 ControlProgram: []byte("aa"),
1148                                         },
1149                                 },
1150                                 &common.Order{
1151                                         FromAssetID: assetID1,
1152                                         ToAssetID:   assetID2,
1153                                         Rate:        0.00096,
1154                                         Utxo: &common.MovUtxo{
1155                                                 SourceID:       &bc.Hash{V0: 25},
1156                                                 Amount:         1,
1157                                                 SourcePos:      0,
1158                                                 ControlProgram: []byte("aa"),
1159                                         },
1160                                 },
1161                                 &common.Order{
1162                                         FromAssetID: assetID1,
1163                                         ToAssetID:   assetID2,
1164                                         Rate:        0.00095,
1165                                         Utxo: &common.MovUtxo{
1166                                                 SourceID:       &bc.Hash{V0: 26},
1167                                                 Amount:         1,
1168                                                 SourcePos:      0,
1169                                                 ControlProgram: []byte("aa"),
1170                                         },
1171                                 },
1172                         },
1173                         blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
1174                         wantOrders: []*common.Order{
1175                                 &common.Order{
1176                                         FromAssetID: assetID1,
1177                                         ToAssetID:   assetID2,
1178                                         Rate:        0.00090,
1179                                         Utxo: &common.MovUtxo{
1180                                                 SourceID:       &bc.Hash{V0: 2},
1181                                                 Amount:         1,
1182                                                 SourcePos:      0,
1183                                                 ControlProgram: []byte("aa"),
1184                                         },
1185                                 },
1186                                 &common.Order{
1187                                         FromAssetID: assetID1,
1188                                         ToAssetID:   assetID2,
1189                                         Rate:        1.00090,
1190                                         Utxo: &common.MovUtxo{
1191                                                 SourceID:       &bc.Hash{V0: 1},
1192                                                 Amount:         1,
1193                                                 SourcePos:      0,
1194                                                 ControlProgram: []byte("aa"),
1195                                         },
1196                                 },
1197                         },
1198                         wantTradePairs: []*common.TradePair{
1199                                 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 2},
1200                         },
1201                         wantDBState: &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
1202                 },
1203                 {
1204                         desc: "Add and delete different transaction pairs",
1205                         beforeOrders: []*common.Order{
1206                                 &common.Order{
1207                                         FromAssetID: assetID1,
1208                                         ToAssetID:   assetID2,
1209                                         Rate:        1.00090,
1210                                         Utxo: &common.MovUtxo{
1211                                                 SourceID:       &bc.Hash{V0: 21},
1212                                                 Amount:         1,
1213                                                 SourcePos:      0,
1214                                                 ControlProgram: []byte("aa"),
1215                                         },
1216                                 },
1217                                 &common.Order{
1218                                         FromAssetID: assetID1,
1219                                         ToAssetID:   assetID2,
1220                                         Rate:        0.00090,
1221                                         Utxo: &common.MovUtxo{
1222                                                 SourceID:       &bc.Hash{V0: 22},
1223                                                 Amount:         1,
1224                                                 SourcePos:      0,
1225                                                 ControlProgram: []byte("aa"),
1226                                         },
1227                                 },
1228                                 &common.Order{
1229                                         FromAssetID: assetID1,
1230                                         ToAssetID:   assetID2,
1231                                         Rate:        0.00097,
1232                                         Utxo: &common.MovUtxo{
1233                                                 SourceID:       &bc.Hash{V0: 23},
1234                                                 Amount:         1,
1235                                                 SourcePos:      0,
1236                                                 ControlProgram: []byte("aa"),
1237                                         },
1238                                 },
1239                                 &common.Order{
1240                                         FromAssetID: assetID1,
1241                                         ToAssetID:   assetID2,
1242                                         Rate:        0.00098,
1243                                         Utxo: &common.MovUtxo{
1244                                                 SourceID:       &bc.Hash{V0: 13},
1245                                                 Amount:         1,
1246                                                 SourcePos:      0,
1247                                                 ControlProgram: []byte("aa"),
1248                                         },
1249                                 },
1250                                 &common.Order{
1251                                         FromAssetID: assetID1,
1252                                         ToAssetID:   assetID2,
1253                                         Rate:        0.00098,
1254                                         Utxo: &common.MovUtxo{
1255                                                 SourceID:       &bc.Hash{V0: 24},
1256                                                 Amount:         10,
1257                                                 SourcePos:      1,
1258                                                 ControlProgram: []byte("aa"),
1259                                         },
1260                                 },
1261                                 &common.Order{
1262                                         FromAssetID: assetID1,
1263                                         ToAssetID:   assetID2,
1264                                         Rate:        0.00099,
1265                                         Utxo: &common.MovUtxo{
1266                                                 SourceID:       &bc.Hash{V0: 24},
1267                                                 Amount:         1,
1268                                                 SourcePos:      0,
1269                                                 ControlProgram: []byte("aa"),
1270                                         },
1271                                 },
1272                                 &common.Order{
1273                                         FromAssetID: assetID1,
1274                                         ToAssetID:   assetID2,
1275                                         Rate:        0.00096,
1276                                         Utxo: &common.MovUtxo{
1277                                                 SourceID:       &bc.Hash{V0: 25},
1278                                                 Amount:         1,
1279                                                 SourcePos:      0,
1280                                                 ControlProgram: []byte("aa"),
1281                                         },
1282                                 },
1283                                 &common.Order{
1284                                         FromAssetID: assetID1,
1285                                         ToAssetID:   assetID2,
1286                                         Rate:        0.00095,
1287                                         Utxo: &common.MovUtxo{
1288                                                 SourceID:       &bc.Hash{V0: 26},
1289                                                 Amount:         1,
1290                                                 SourcePos:      0,
1291                                                 ControlProgram: []byte("aa"),
1292                                         },
1293                                 },
1294                                 &common.Order{
1295                                         FromAssetID: assetID3,
1296                                         ToAssetID:   assetID2,
1297                                         Rate:        0.00096,
1298                                         Utxo: &common.MovUtxo{
1299                                                 SourceID:       &bc.Hash{V0: 33},
1300                                                 Amount:         1,
1301                                                 SourcePos:      0,
1302                                                 ControlProgram: []byte("aa"),
1303                                         },
1304                                 },
1305                                 &common.Order{
1306                                         FromAssetID: assetID4,
1307                                         ToAssetID:   assetID2,
1308                                         Rate:        0.00095,
1309                                         Utxo: &common.MovUtxo{
1310                                                 SourceID:       &bc.Hash{V0: 34},
1311                                                 Amount:         1,
1312                                                 SourcePos:      0,
1313                                                 ControlProgram: []byte("aa"),
1314                                         },
1315                                 },
1316                         },
1317                         beforeTradePairs: []*common.TradePair{
1318                                 &common.TradePair{
1319                                         FromAssetID: assetID1,
1320                                         ToAssetID:   assetID2,
1321                                         Count:       8,
1322                                 },
1323                                 &common.TradePair{
1324                                         FromAssetID: assetID3,
1325                                         ToAssetID:   assetID2,
1326                                         Count:       1,
1327                                 },
1328                                 &common.TradePair{
1329                                         FromAssetID: assetID4,
1330                                         ToAssetID:   assetID2,
1331                                         Count:       1,
1332                                 },
1333                         },
1334                         beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
1335                         addOrders: []*common.Order{
1336                                 &common.Order{
1337                                         FromAssetID: assetID4,
1338                                         ToAssetID:   assetID2,
1339                                         Rate:        0.00096,
1340                                         Utxo: &common.MovUtxo{
1341                                                 SourceID:       &bc.Hash{V0: 36},
1342                                                 Amount:         1,
1343                                                 SourcePos:      0,
1344                                                 ControlProgram: []byte("aa"),
1345                                         },
1346                                 },
1347                                 &common.Order{
1348                                         FromAssetID: assetID5,
1349                                         ToAssetID:   assetID2,
1350                                         Rate:        0.00096,
1351                                         Utxo: &common.MovUtxo{
1352                                                 SourceID:       &bc.Hash{V0: 37},
1353                                                 Amount:         1,
1354                                                 SourcePos:      0,
1355                                                 ControlProgram: []byte("aa"),
1356                                         },
1357                                 },
1358                                 &common.Order{
1359                                         FromAssetID: assetID6,
1360                                         ToAssetID:   assetID2,
1361                                         Rate:        0.00098,
1362                                         Utxo: &common.MovUtxo{
1363                                                 SourceID:       &bc.Hash{V0: 38},
1364                                                 Amount:         1,
1365                                                 SourcePos:      0,
1366                                                 ControlProgram: []byte("aa"),
1367                                         },
1368                                 },
1369                         },
1370                         delOrders: []*common.Order{
1371                                 &common.Order{
1372                                         FromAssetID: assetID1,
1373                                         ToAssetID:   assetID2,
1374                                         Rate:        1.00090,
1375                                         Utxo: &common.MovUtxo{
1376                                                 SourceID:       &bc.Hash{V0: 21},
1377                                                 Amount:         1,
1378                                                 SourcePos:      0,
1379                                                 ControlProgram: []byte("aa"),
1380                                         },
1381                                 },
1382                                 &common.Order{
1383                                         FromAssetID: assetID1,
1384                                         ToAssetID:   assetID2,
1385                                         Rate:        0.00090,
1386                                         Utxo: &common.MovUtxo{
1387                                                 SourceID:       &bc.Hash{V0: 22},
1388                                                 Amount:         1,
1389                                                 SourcePos:      0,
1390                                                 ControlProgram: []byte("aa"),
1391                                         },
1392                                 },
1393                                 &common.Order{
1394                                         FromAssetID: assetID1,
1395                                         ToAssetID:   assetID2,
1396                                         Rate:        0.00097,
1397                                         Utxo: &common.MovUtxo{
1398                                                 SourceID:       &bc.Hash{V0: 23},
1399                                                 Amount:         1,
1400                                                 SourcePos:      0,
1401                                                 ControlProgram: []byte("aa"),
1402                                         },
1403                                 },
1404                                 &common.Order{
1405                                         FromAssetID: assetID1,
1406                                         ToAssetID:   assetID2,
1407                                         Rate:        0.00098,
1408                                         Utxo: &common.MovUtxo{
1409                                                 SourceID:       &bc.Hash{V0: 13},
1410                                                 Amount:         1,
1411                                                 SourcePos:      0,
1412                                                 ControlProgram: []byte("aa"),
1413                                         },
1414                                 },
1415                                 &common.Order{
1416                                         FromAssetID: assetID1,
1417                                         ToAssetID:   assetID2,
1418                                         Rate:        0.00098,
1419                                         Utxo: &common.MovUtxo{
1420                                                 SourceID:       &bc.Hash{V0: 24},
1421                                                 Amount:         10,
1422                                                 SourcePos:      1,
1423                                                 ControlProgram: []byte("aa"),
1424                                         },
1425                                 },
1426                                 &common.Order{
1427                                         FromAssetID: assetID1,
1428                                         ToAssetID:   assetID2,
1429                                         Rate:        0.00099,
1430                                         Utxo: &common.MovUtxo{
1431                                                 SourceID:       &bc.Hash{V0: 24},
1432                                                 Amount:         1,
1433                                                 SourcePos:      0,
1434                                                 ControlProgram: []byte("aa"),
1435                                         },
1436                                 },
1437                                 &common.Order{
1438                                         FromAssetID: assetID1,
1439                                         ToAssetID:   assetID2,
1440                                         Rate:        0.00096,
1441                                         Utxo: &common.MovUtxo{
1442                                                 SourceID:       &bc.Hash{V0: 25},
1443                                                 Amount:         1,
1444                                                 SourcePos:      0,
1445                                                 ControlProgram: []byte("aa"),
1446                                         },
1447                                 },
1448                                 &common.Order{
1449                                         FromAssetID: assetID1,
1450                                         ToAssetID:   assetID2,
1451                                         Rate:        0.00095,
1452                                         Utxo: &common.MovUtxo{
1453                                                 SourceID:       &bc.Hash{V0: 26},
1454                                                 Amount:         1,
1455                                                 SourcePos:      0,
1456                                                 ControlProgram: []byte("aa"),
1457                                         },
1458                                 },
1459                                 &common.Order{
1460                                         FromAssetID: assetID3,
1461                                         ToAssetID:   assetID2,
1462                                         Rate:        0.00096,
1463                                         Utxo: &common.MovUtxo{
1464                                                 SourceID:       &bc.Hash{V0: 33},
1465                                                 Amount:         1,
1466                                                 SourcePos:      0,
1467                                                 ControlProgram: []byte("aa"),
1468                                         },
1469                                 },
1470                         },
1471                         blockHeader: &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
1472                         wantOrders: []*common.Order{
1473                                 &common.Order{
1474                                         FromAssetID: assetID4,
1475                                         ToAssetID:   assetID2,
1476                                         Rate:        0.00095,
1477                                         Utxo: &common.MovUtxo{
1478                                                 SourceID:       &bc.Hash{V0: 34},
1479                                                 Amount:         1,
1480                                                 SourcePos:      0,
1481                                                 ControlProgram: []byte("aa"),
1482                                         },
1483                                 },
1484                                 &common.Order{
1485                                         FromAssetID: assetID4,
1486                                         ToAssetID:   assetID2,
1487                                         Rate:        0.00096,
1488                                         Utxo: &common.MovUtxo{
1489                                                 SourceID:       &bc.Hash{V0: 36},
1490                                                 Amount:         1,
1491                                                 SourcePos:      0,
1492                                                 ControlProgram: []byte("aa"),
1493                                         },
1494                                 },
1495                                 &common.Order{
1496                                         FromAssetID: assetID5,
1497                                         ToAssetID:   assetID2,
1498                                         Rate:        0.00096,
1499                                         Utxo: &common.MovUtxo{
1500                                                 SourceID:       &bc.Hash{V0: 37},
1501                                                 Amount:         1,
1502                                                 SourcePos:      0,
1503                                                 ControlProgram: []byte("aa"),
1504                                         },
1505                                 },
1506                                 &common.Order{
1507                                         FromAssetID: assetID6,
1508                                         ToAssetID:   assetID2,
1509                                         Rate:        0.00098,
1510                                         Utxo: &common.MovUtxo{
1511                                                 SourceID:       &bc.Hash{V0: 38},
1512                                                 Amount:         1,
1513                                                 SourcePos:      0,
1514                                                 ControlProgram: []byte("aa"),
1515                                         },
1516                                 },
1517                         },
1518                         wantTradePairs: []*common.TradePair{
1519                                 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID2, Count: 2},
1520                                 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID2, Count: 1},
1521                                 &common.TradePair{FromAssetID: assetID6, ToAssetID: assetID2, Count: 1},
1522                         },
1523                         wantDBState: &common.MovDatabaseState{Height: 2, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
1524                 },
1525         }
1526
1527         initBlockHeader := &types.BlockHeader{
1528                 Height:  0,
1529                 Version: 1,
1530         }
1531
1532         height := initBlockHeader.Height
1533         hash := initBlockHeader.Hash()
1534
1535         defer os.RemoveAll("temp")
1536         for i, c := range cases {
1537                 testDB := dbm.NewDB("testdb", "leveldb", "temp")
1538                 movStore, err := NewMovStore(testDB, height, &hash)
1539                 if err != nil {
1540                         t.Fatalf("case %d: NewMovStore error %v.", i, err)
1541                 }
1542
1543                 batch := movStore.db.NewBatch()
1544                 tradePairsCnt := make(map[common.TradePair]int)
1545                 movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
1546                 if len(c.beforeOrders) > 0 {
1547                         tradePairsCnt = make(map[common.TradePair]int)
1548                         for _, tradePair := range c.beforeTradePairs {
1549                                 tradePairsCnt[*tradePair] = tradePair.Count
1550                         }
1551                         movStore.updateTradePairs(batch, tradePairsCnt)
1552                         movStore.saveMovDatabaseState(batch, c.beforeDBStatus)
1553                 }
1554                 batch.Write()
1555
1556                 if err := movStore.ProcessOrders(c.addOrders, c.delOrders, c.blockHeader); err != nil {
1557                         t.Fatalf("case %d: ProcessOrders error %v.", i, err)
1558                 }
1559
1560                 var gotOrders []*common.Order
1561
1562                 tmp, err := movStore.ListOrders(&common.Order{FromAssetID: assetID1, ToAssetID: assetID2, Rate: 0})
1563                 if err != nil {
1564                         t.Fatalf("case %d: ListOrders(assetID1 and assetID2) error %v.", i, err)
1565                 }
1566
1567                 gotOrders = append(gotOrders, tmp...)
1568
1569                 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID3, ToAssetID: assetID2, Rate: 0})
1570                 if err != nil {
1571                         t.Fatalf("case %d: ListOrders(assetID3 and assetID2)  error %v.", i, err)
1572                 }
1573
1574                 gotOrders = append(gotOrders, tmp...)
1575
1576                 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID4, ToAssetID: assetID2, Rate: 0})
1577                 if err != nil {
1578                         t.Fatalf("case %d: ListOrders(assetID4 and assetID2)  error %v.", i, err)
1579                 }
1580
1581                 gotOrders = append(gotOrders, tmp...)
1582
1583                 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID5, ToAssetID: assetID2, Rate: 0})
1584                 if err != nil {
1585                         t.Fatalf("case %d: ListOrders(assetID5 and assetID2)  error %v.", i, err)
1586                 }
1587
1588                 gotOrders = append(gotOrders, tmp...)
1589
1590                 tmp, err = movStore.ListOrders(&common.Order{FromAssetID: assetID6, ToAssetID: assetID2, Rate: 0})
1591                 if err != nil {
1592                         t.Fatalf("case %d: ListOrders(assetID6 and assetID2)  error %v.", i, err)
1593                 }
1594
1595                 gotOrders = append(gotOrders, tmp...)
1596
1597                 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
1598                         t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
1599                 }
1600
1601                 gotTradePairs, err := movStore.ListTradePairsWithStart(nil, nil)
1602                 if err != nil {
1603                         t.Fatalf("case %d: ListTradePairsWithStart error %v.", i, err)
1604                 }
1605
1606                 if !testutil.DeepEqual(gotTradePairs, c.wantTradePairs) {
1607                         t.Fatalf("case %d: got tradePairs, gotTradePairs: %v, wantTradePairs: %v.", i, gotTradePairs, c.wantTradePairs)
1608                 }
1609
1610                 gotDBState, err := movStore.GetMovDatabaseState()
1611                 if err != nil {
1612                         t.Fatalf("case %d: GetMovDatabaseState error %v.", i, err)
1613                 }
1614
1615                 if !testutil.DeepEqual(gotDBState, c.wantDBState) {
1616                         t.Fatalf("case %d: got tradePairs, gotDBState: %v, wantDBStatus: %v.", i, gotDBState, c.wantDBState)
1617                 }
1618
1619                 testDB.Close()
1620                 os.RemoveAll("temp")
1621         }
1622 }
1623
1624 func TestListOrders(t *testing.T) {
1625         cases := []struct {
1626                 desc        string
1627                 storeOrders []*common.Order
1628                 query       *common.Order
1629                 wantOrders  []*common.Order
1630         }{
1631                 {
1632                         desc:       "empty",
1633                         query:      &common.Order{FromAssetID: assetID1, ToAssetID: assetID2},
1634                         wantOrders: []*common.Order{},
1635                 },
1636                 {
1637                         desc: "query from first",
1638                         storeOrders: []*common.Order{
1639                                 &common.Order{
1640                                         FromAssetID: assetID1,
1641                                         ToAssetID:   assetID2,
1642                                         Rate:        1.00090,
1643                                         Utxo: &common.MovUtxo{
1644                                                 SourceID:       &bc.Hash{V0: 21},
1645                                                 Amount:         1,
1646                                                 SourcePos:      0,
1647                                                 ControlProgram: []byte("aa"),
1648                                         },
1649                                 },
1650                                 &common.Order{
1651                                         FromAssetID: assetID1,
1652                                         ToAssetID:   assetID2,
1653                                         Rate:        0.00090,
1654                                         Utxo: &common.MovUtxo{
1655                                                 SourceID:       &bc.Hash{V0: 22},
1656                                                 Amount:         1,
1657                                                 SourcePos:      0,
1658                                                 ControlProgram: []byte("aa"),
1659                                         },
1660                                 },
1661                                 &common.Order{
1662                                         FromAssetID: assetID1,
1663                                         ToAssetID:   assetID2,
1664                                         Rate:        0.00097,
1665                                         Utxo: &common.MovUtxo{
1666                                                 SourceID:       &bc.Hash{V0: 23},
1667                                                 Amount:         1,
1668                                                 SourcePos:      0,
1669                                                 ControlProgram: []byte("aa"),
1670                                         },
1671                                 },
1672                                 &common.Order{
1673                                         FromAssetID: assetID1,
1674                                         ToAssetID:   assetID2,
1675                                         Rate:        0.00098,
1676                                         Utxo: &common.MovUtxo{
1677                                                 SourceID:       &bc.Hash{V0: 13},
1678                                                 Amount:         1,
1679                                                 SourcePos:      0,
1680                                                 ControlProgram: []byte("aa"),
1681                                         },
1682                                 },
1683                                 &common.Order{
1684                                         FromAssetID: assetID1,
1685                                         ToAssetID:   assetID2,
1686                                         Rate:        0.00098,
1687                                         Utxo: &common.MovUtxo{
1688                                                 SourceID:       &bc.Hash{V0: 24},
1689                                                 Amount:         10,
1690                                                 SourcePos:      1,
1691                                                 ControlProgram: []byte("aa"),
1692                                         },
1693                                 },
1694                                 &common.Order{
1695                                         FromAssetID: assetID1,
1696                                         ToAssetID:   assetID2,
1697                                         Rate:        0.00099,
1698                                         Utxo: &common.MovUtxo{
1699                                                 SourceID:       &bc.Hash{V0: 24},
1700                                                 Amount:         1,
1701                                                 SourcePos:      0,
1702                                                 ControlProgram: []byte("aa"),
1703                                         },
1704                                 },
1705                                 &common.Order{
1706                                         FromAssetID: assetID1,
1707                                         ToAssetID:   assetID2,
1708                                         Rate:        0.00096,
1709                                         Utxo: &common.MovUtxo{
1710                                                 SourceID:       &bc.Hash{V0: 25},
1711                                                 Amount:         1,
1712                                                 SourcePos:      0,
1713                                                 ControlProgram: []byte("aa"),
1714                                         },
1715                                 },
1716                                 &common.Order{
1717                                         FromAssetID: assetID1,
1718                                         ToAssetID:   assetID2,
1719                                         Rate:        0.00095,
1720                                         Utxo: &common.MovUtxo{
1721                                                 SourceID:       &bc.Hash{V0: 26},
1722                                                 Amount:         1,
1723                                                 SourcePos:      0,
1724                                                 ControlProgram: []byte("aa"),
1725                                         },
1726                                 },
1727                         },
1728                         query: &common.Order{FromAssetID: assetID1, ToAssetID: assetID2},
1729                         wantOrders: []*common.Order{
1730                                 &common.Order{
1731                                         FromAssetID: assetID1,
1732                                         ToAssetID:   assetID2,
1733                                         Rate:        0.00090,
1734                                         Utxo: &common.MovUtxo{
1735                                                 SourceID:       &bc.Hash{V0: 22},
1736                                                 Amount:         1,
1737                                                 SourcePos:      0,
1738                                                 ControlProgram: []byte("aa"),
1739                                         },
1740                                 },
1741                                 &common.Order{
1742                                         FromAssetID: assetID1,
1743                                         ToAssetID:   assetID2,
1744                                         Rate:        0.00095,
1745                                         Utxo: &common.MovUtxo{
1746                                                 SourceID:       &bc.Hash{V0: 26},
1747                                                 Amount:         1,
1748                                                 SourcePos:      0,
1749                                                 ControlProgram: []byte("aa"),
1750                                         },
1751                                 },
1752                                 &common.Order{
1753                                         FromAssetID: assetID1,
1754                                         ToAssetID:   assetID2,
1755                                         Rate:        0.00096,
1756                                         Utxo: &common.MovUtxo{
1757                                                 SourceID:       &bc.Hash{V0: 25},
1758                                                 Amount:         1,
1759                                                 SourcePos:      0,
1760                                                 ControlProgram: []byte("aa"),
1761                                         },
1762                                 },
1763                                 &common.Order{
1764                                         FromAssetID: assetID1,
1765                                         ToAssetID:   assetID2,
1766                                         Rate:        0.00097,
1767                                         Utxo: &common.MovUtxo{
1768                                                 SourceID:       &bc.Hash{V0: 23},
1769                                                 Amount:         1,
1770                                                 SourcePos:      0,
1771                                                 ControlProgram: []byte("aa"),
1772                                         },
1773                                 },
1774                                 &common.Order{
1775                                         FromAssetID: assetID1,
1776                                         ToAssetID:   assetID2,
1777                                         Rate:        0.00098,
1778                                         Utxo: &common.MovUtxo{
1779                                                 SourceID:       &bc.Hash{V0: 13},
1780                                                 Amount:         1,
1781                                                 SourcePos:      0,
1782                                                 ControlProgram: []byte("aa"),
1783                                         },
1784                                 },
1785                                 &common.Order{
1786                                         FromAssetID: assetID1,
1787                                         ToAssetID:   assetID2,
1788                                         Rate:        0.00098,
1789                                         Utxo: &common.MovUtxo{
1790                                                 SourceID:       &bc.Hash{V0: 24},
1791                                                 Amount:         10,
1792                                                 SourcePos:      1,
1793                                                 ControlProgram: []byte("aa"),
1794                                         },
1795                                 },
1796                                 &common.Order{
1797                                         FromAssetID: assetID1,
1798                                         ToAssetID:   assetID2,
1799                                         Rate:        0.00099,
1800                                         Utxo: &common.MovUtxo{
1801                                                 SourceID:       &bc.Hash{V0: 24},
1802                                                 Amount:         1,
1803                                                 SourcePos:      0,
1804                                                 ControlProgram: []byte("aa"),
1805                                         },
1806                                 },
1807                                 &common.Order{
1808                                         FromAssetID: assetID1,
1809                                         ToAssetID:   assetID2,
1810                                         Rate:        1.00090,
1811                                         Utxo: &common.MovUtxo{
1812                                                 SourceID:       &bc.Hash{V0: 21},
1813                                                 Amount:         1,
1814                                                 SourcePos:      0,
1815                                                 ControlProgram: []byte("aa"),
1816                                         },
1817                                 },
1818                         },
1819                 },
1820                 {
1821                         desc: "query from middle",
1822                         storeOrders: []*common.Order{
1823                                 &common.Order{
1824                                         FromAssetID: assetID1,
1825                                         ToAssetID:   assetID2,
1826                                         Rate:        1.00090,
1827                                         Utxo: &common.MovUtxo{
1828                                                 SourceID:       &bc.Hash{V0: 21},
1829                                                 Amount:         1,
1830                                                 SourcePos:      0,
1831                                                 ControlProgram: []byte("aa"),
1832                                         },
1833                                 },
1834                                 &common.Order{
1835                                         FromAssetID: assetID1,
1836                                         ToAssetID:   assetID2,
1837                                         Rate:        0.00090,
1838                                         Utxo: &common.MovUtxo{
1839                                                 SourceID:       &bc.Hash{V0: 22},
1840                                                 Amount:         1,
1841                                                 SourcePos:      0,
1842                                                 ControlProgram: []byte("aa"),
1843                                         },
1844                                 },
1845                                 &common.Order{
1846                                         FromAssetID: assetID1,
1847                                         ToAssetID:   assetID2,
1848                                         Rate:        0.00097,
1849                                         Utxo: &common.MovUtxo{
1850                                                 SourceID:       &bc.Hash{V0: 23},
1851                                                 Amount:         1,
1852                                                 SourcePos:      0,
1853                                                 ControlProgram: []byte("aa"),
1854                                         },
1855                                 },
1856                                 &common.Order{
1857                                         FromAssetID: assetID1,
1858                                         ToAssetID:   assetID2,
1859                                         Rate:        0.00098,
1860                                         Utxo: &common.MovUtxo{
1861                                                 SourceID:       &bc.Hash{V0: 13},
1862                                                 Amount:         1,
1863                                                 SourcePos:      0,
1864                                                 ControlProgram: []byte("aa"),
1865                                         },
1866                                 },
1867                                 &common.Order{
1868                                         FromAssetID: assetID1,
1869                                         ToAssetID:   assetID2,
1870                                         Rate:        0.00098,
1871                                         Utxo: &common.MovUtxo{
1872                                                 SourceID:       &bc.Hash{V0: 24},
1873                                                 Amount:         10,
1874                                                 SourcePos:      1,
1875                                                 ControlProgram: []byte("aa"),
1876                                         },
1877                                 },
1878                                 &common.Order{
1879                                         FromAssetID: assetID1,
1880                                         ToAssetID:   assetID2,
1881                                         Rate:        0.00099,
1882                                         Utxo: &common.MovUtxo{
1883                                                 SourceID:       &bc.Hash{V0: 24},
1884                                                 Amount:         1,
1885                                                 SourcePos:      0,
1886                                                 ControlProgram: []byte("aa"),
1887                                         },
1888                                 },
1889                                 &common.Order{
1890                                         FromAssetID: assetID1,
1891                                         ToAssetID:   assetID2,
1892                                         Rate:        0.00096,
1893                                         Utxo: &common.MovUtxo{
1894                                                 SourceID:       &bc.Hash{V0: 25},
1895                                                 Amount:         1,
1896                                                 SourcePos:      0,
1897                                                 ControlProgram: []byte("aa"),
1898                                         },
1899                                 },
1900                                 &common.Order{
1901                                         FromAssetID: assetID1,
1902                                         ToAssetID:   assetID2,
1903                                         Rate:        0.00095,
1904                                         Utxo: &common.MovUtxo{
1905                                                 SourceID:       &bc.Hash{V0: 26},
1906                                                 Amount:         1,
1907                                                 SourcePos:      0,
1908                                                 ControlProgram: []byte("aa"),
1909                                         },
1910                                 },
1911                         },
1912                         query: &common.Order{
1913                                 FromAssetID: assetID1,
1914                                 ToAssetID:   assetID2,
1915                                 Rate:        0.00098,
1916                                 Utxo: &common.MovUtxo{
1917                                         SourceID:       &bc.Hash{V0: 13},
1918                                         Amount:         1,
1919                                         SourcePos:      0,
1920                                         ControlProgram: []byte("aa"),
1921                                 },
1922                         },
1923                         wantOrders: []*common.Order{
1924                                 &common.Order{
1925                                         FromAssetID: assetID1,
1926                                         ToAssetID:   assetID2,
1927                                         Rate:        0.00098,
1928                                         Utxo: &common.MovUtxo{
1929                                                 SourceID:       &bc.Hash{V0: 24},
1930                                                 Amount:         10,
1931                                                 SourcePos:      1,
1932                                                 ControlProgram: []byte("aa"),
1933                                         },
1934                                 },
1935                                 &common.Order{
1936                                         FromAssetID: assetID1,
1937                                         ToAssetID:   assetID2,
1938                                         Rate:        0.00099,
1939                                         Utxo: &common.MovUtxo{
1940                                                 SourceID:       &bc.Hash{V0: 24},
1941                                                 Amount:         1,
1942                                                 SourcePos:      0,
1943                                                 ControlProgram: []byte("aa"),
1944                                         },
1945                                 },
1946                                 &common.Order{
1947                                         FromAssetID: assetID1,
1948                                         ToAssetID:   assetID2,
1949                                         Rate:        1.00090,
1950                                         Utxo: &common.MovUtxo{
1951                                                 SourceID:       &bc.Hash{V0: 21},
1952                                                 Amount:         1,
1953                                                 SourcePos:      0,
1954                                                 ControlProgram: []byte("aa"),
1955                                         },
1956                                 },
1957                         },
1958                 },
1959         }
1960
1961         initBlockHeader := &types.BlockHeader{
1962                 Height:  0,
1963                 Version: 1,
1964         }
1965
1966         height := initBlockHeader.Height
1967         hash := initBlockHeader.Hash()
1968
1969         defer os.RemoveAll("temp")
1970         for i, c := range cases {
1971                 testDB := dbm.NewDB("testdb", "leveldb", "temp")
1972                 movStore, err := NewMovStore(testDB, height, &hash)
1973                 if err != nil {
1974                         t.Fatalf("case %d: NewMovStore error %v.", i, err)
1975                 }
1976
1977                 batch := movStore.db.NewBatch()
1978                 tradePairsCnt := make(map[common.TradePair]int)
1979                 movStore.addOrders(batch, c.storeOrders, tradePairsCnt)
1980                 movStore.updateTradePairs(batch, tradePairsCnt)
1981                 batch.Write()
1982
1983                 gotOrders, err := movStore.ListOrders(c.query)
1984                 if err != nil {
1985                         t.Fatalf("case %d: ListOrders error %v.", i, err)
1986                 }
1987
1988                 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
1989                         t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
1990                 }
1991
1992                 testDB.Close()
1993                 os.RemoveAll("temp")
1994         }
1995 }
1996
1997 func TestAddOrders(t *testing.T) {
1998         cases := []struct {
1999                 desc         string
2000                 beforeOrders []*common.Order
2001                 addOrders    []*common.Order
2002                 wantOrders   []*common.Order
2003         }{
2004                 {
2005                         desc: "empty",
2006                         addOrders: []*common.Order{
2007                                 &common.Order{
2008                                         FromAssetID: assetID1,
2009                                         ToAssetID:   assetID2,
2010                                         Rate:        1.00090,
2011                                         Utxo: &common.MovUtxo{
2012                                                 SourceID:       &bc.Hash{V0: 21},
2013                                                 Amount:         1,
2014                                                 SourcePos:      0,
2015                                                 ControlProgram: []byte("aa"),
2016                                         },
2017                                 },
2018                                 &common.Order{
2019                                         FromAssetID: assetID1,
2020                                         ToAssetID:   assetID2,
2021                                         Rate:        0.00090,
2022                                         Utxo: &common.MovUtxo{
2023                                                 SourceID:       &bc.Hash{V0: 22},
2024                                                 Amount:         1,
2025                                                 SourcePos:      0,
2026                                                 ControlProgram: []byte("aa"),
2027                                         },
2028                                 },
2029                                 &common.Order{
2030                                         FromAssetID: assetID1,
2031                                         ToAssetID:   assetID2,
2032                                         Rate:        0.00097,
2033                                         Utxo: &common.MovUtxo{
2034                                                 SourceID:       &bc.Hash{V0: 23},
2035                                                 Amount:         1,
2036                                                 SourcePos:      0,
2037                                                 ControlProgram: []byte("aa"),
2038                                         },
2039                                 },
2040                                 &common.Order{
2041                                         FromAssetID: assetID1,
2042                                         ToAssetID:   assetID2,
2043                                         Rate:        0.00098,
2044                                         Utxo: &common.MovUtxo{
2045                                                 SourceID:       &bc.Hash{V0: 13},
2046                                                 Amount:         1,
2047                                                 SourcePos:      0,
2048                                                 ControlProgram: []byte("aa"),
2049                                         },
2050                                 },
2051                                 &common.Order{
2052                                         FromAssetID: assetID1,
2053                                         ToAssetID:   assetID2,
2054                                         Rate:        0.00098,
2055                                         Utxo: &common.MovUtxo{
2056                                                 SourceID:       &bc.Hash{V0: 24},
2057                                                 Amount:         10,
2058                                                 SourcePos:      1,
2059                                                 ControlProgram: []byte("aa"),
2060                                         },
2061                                 },
2062                                 &common.Order{
2063                                         FromAssetID: assetID1,
2064                                         ToAssetID:   assetID2,
2065                                         Rate:        0.00099,
2066                                         Utxo: &common.MovUtxo{
2067                                                 SourceID:       &bc.Hash{V0: 24},
2068                                                 Amount:         1,
2069                                                 SourcePos:      0,
2070                                                 ControlProgram: []byte("aa"),
2071                                         },
2072                                 },
2073                                 &common.Order{
2074                                         FromAssetID: assetID1,
2075                                         ToAssetID:   assetID2,
2076                                         Rate:        0.00096,
2077                                         Utxo: &common.MovUtxo{
2078                                                 SourceID:       &bc.Hash{V0: 25},
2079                                                 Amount:         1,
2080                                                 SourcePos:      0,
2081                                                 ControlProgram: []byte("aa"),
2082                                         },
2083                                 },
2084                                 &common.Order{
2085                                         FromAssetID: assetID1,
2086                                         ToAssetID:   assetID2,
2087                                         Rate:        0.00095,
2088                                         Utxo: &common.MovUtxo{
2089                                                 SourceID:       &bc.Hash{V0: 26},
2090                                                 Amount:         1,
2091                                                 SourcePos:      0,
2092                                                 ControlProgram: []byte("aa"),
2093                                         },
2094                                 },
2095                         },
2096                         wantOrders: []*common.Order{
2097                                 &common.Order{
2098                                         FromAssetID: assetID1,
2099                                         ToAssetID:   assetID2,
2100                                         Rate:        0.00090,
2101                                         Utxo: &common.MovUtxo{
2102                                                 SourceID:       &bc.Hash{V0: 22},
2103                                                 Amount:         1,
2104                                                 SourcePos:      0,
2105                                                 ControlProgram: []byte("aa"),
2106                                         },
2107                                 },
2108                                 &common.Order{
2109                                         FromAssetID: assetID1,
2110                                         ToAssetID:   assetID2,
2111                                         Rate:        0.00095,
2112                                         Utxo: &common.MovUtxo{
2113                                                 SourceID:       &bc.Hash{V0: 26},
2114                                                 Amount:         1,
2115                                                 SourcePos:      0,
2116                                                 ControlProgram: []byte("aa"),
2117                                         },
2118                                 },
2119                                 &common.Order{
2120                                         FromAssetID: assetID1,
2121                                         ToAssetID:   assetID2,
2122                                         Rate:        0.00096,
2123                                         Utxo: &common.MovUtxo{
2124                                                 SourceID:       &bc.Hash{V0: 25},
2125                                                 Amount:         1,
2126                                                 SourcePos:      0,
2127                                                 ControlProgram: []byte("aa"),
2128                                         },
2129                                 },
2130                                 &common.Order{
2131                                         FromAssetID: assetID1,
2132                                         ToAssetID:   assetID2,
2133                                         Rate:        0.00097,
2134                                         Utxo: &common.MovUtxo{
2135                                                 SourceID:       &bc.Hash{V0: 23},
2136                                                 Amount:         1,
2137                                                 SourcePos:      0,
2138                                                 ControlProgram: []byte("aa"),
2139                                         },
2140                                 },
2141                                 &common.Order{
2142                                         FromAssetID: assetID1,
2143                                         ToAssetID:   assetID2,
2144                                         Rate:        0.00098,
2145                                         Utxo: &common.MovUtxo{
2146                                                 SourceID:       &bc.Hash{V0: 13},
2147                                                 Amount:         1,
2148                                                 SourcePos:      0,
2149                                                 ControlProgram: []byte("aa"),
2150                                         },
2151                                 },
2152                                 &common.Order{
2153                                         FromAssetID: assetID1,
2154                                         ToAssetID:   assetID2,
2155                                         Rate:        0.00098,
2156                                         Utxo: &common.MovUtxo{
2157                                                 SourceID:       &bc.Hash{V0: 24},
2158                                                 Amount:         10,
2159                                                 SourcePos:      1,
2160                                                 ControlProgram: []byte("aa"),
2161                                         },
2162                                 },
2163                                 &common.Order{
2164                                         FromAssetID: assetID1,
2165                                         ToAssetID:   assetID2,
2166                                         Rate:        0.00099,
2167                                         Utxo: &common.MovUtxo{
2168                                                 SourceID:       &bc.Hash{V0: 24},
2169                                                 Amount:         1,
2170                                                 SourcePos:      0,
2171                                                 ControlProgram: []byte("aa"),
2172                                         },
2173                                 },
2174                                 &common.Order{
2175                                         FromAssetID: assetID1,
2176                                         ToAssetID:   assetID2,
2177                                         Rate:        1.00090,
2178                                         Utxo: &common.MovUtxo{
2179                                                 SourceID:       &bc.Hash{V0: 21},
2180                                                 Amount:         1,
2181                                                 SourcePos:      0,
2182                                                 ControlProgram: []byte("aa"),
2183                                         },
2184                                 },
2185                         },
2186                 },
2187                 {
2188                         desc: "Stored data already exists",
2189                         beforeOrders: []*common.Order{
2190                                 &common.Order{
2191                                         FromAssetID: assetID1,
2192                                         ToAssetID:   assetID2,
2193                                         Rate:        1.00090,
2194                                         Utxo: &common.MovUtxo{
2195                                                 SourceID:       &bc.Hash{V0: 21},
2196                                                 Amount:         1,
2197                                                 SourcePos:      0,
2198                                                 ControlProgram: []byte("aa"),
2199                                         },
2200                                 },
2201                                 &common.Order{
2202                                         FromAssetID: assetID1,
2203                                         ToAssetID:   assetID2,
2204                                         Rate:        0.00090,
2205                                         Utxo: &common.MovUtxo{
2206                                                 SourceID:       &bc.Hash{V0: 22},
2207                                                 Amount:         1,
2208                                                 SourcePos:      0,
2209                                                 ControlProgram: []byte("aa"),
2210                                         },
2211                                 },
2212                                 &common.Order{
2213                                         FromAssetID: assetID1,
2214                                         ToAssetID:   assetID2,
2215                                         Rate:        0.00097,
2216                                         Utxo: &common.MovUtxo{
2217                                                 SourceID:       &bc.Hash{V0: 23},
2218                                                 Amount:         1,
2219                                                 SourcePos:      0,
2220                                                 ControlProgram: []byte("aa"),
2221                                         },
2222                                 },
2223                                 &common.Order{
2224                                         FromAssetID: assetID1,
2225                                         ToAssetID:   assetID2,
2226                                         Rate:        0.00098,
2227                                         Utxo: &common.MovUtxo{
2228                                                 SourceID:       &bc.Hash{V0: 13},
2229                                                 Amount:         1,
2230                                                 SourcePos:      0,
2231                                                 ControlProgram: []byte("aa"),
2232                                         },
2233                                 },
2234                         },
2235                         addOrders: []*common.Order{
2236                                 &common.Order{
2237                                         FromAssetID: assetID1,
2238                                         ToAssetID:   assetID2,
2239                                         Rate:        0.00098,
2240                                         Utxo: &common.MovUtxo{
2241                                                 SourceID:       &bc.Hash{V0: 24},
2242                                                 Amount:         10,
2243                                                 SourcePos:      1,
2244                                                 ControlProgram: []byte("aa"),
2245                                         },
2246                                 },
2247                                 &common.Order{
2248                                         FromAssetID: assetID1,
2249                                         ToAssetID:   assetID2,
2250                                         Rate:        0.00099,
2251                                         Utxo: &common.MovUtxo{
2252                                                 SourceID:       &bc.Hash{V0: 24},
2253                                                 Amount:         1,
2254                                                 SourcePos:      0,
2255                                                 ControlProgram: []byte("aa"),
2256                                         },
2257                                 },
2258                                 &common.Order{
2259                                         FromAssetID: assetID1,
2260                                         ToAssetID:   assetID2,
2261                                         Rate:        0.00096,
2262                                         Utxo: &common.MovUtxo{
2263                                                 SourceID:       &bc.Hash{V0: 25},
2264                                                 Amount:         1,
2265                                                 SourcePos:      0,
2266                                                 ControlProgram: []byte("aa"),
2267                                         },
2268                                 },
2269                                 &common.Order{
2270                                         FromAssetID: assetID1,
2271                                         ToAssetID:   assetID2,
2272                                         Rate:        0.00095,
2273                                         Utxo: &common.MovUtxo{
2274                                                 SourceID:       &bc.Hash{V0: 26},
2275                                                 Amount:         1,
2276                                                 SourcePos:      0,
2277                                                 ControlProgram: []byte("aa"),
2278                                         },
2279                                 },
2280                         },
2281                         wantOrders: []*common.Order{
2282                                 &common.Order{
2283                                         FromAssetID: assetID1,
2284                                         ToAssetID:   assetID2,
2285                                         Rate:        0.00090,
2286                                         Utxo: &common.MovUtxo{
2287                                                 SourceID:       &bc.Hash{V0: 22},
2288                                                 Amount:         1,
2289                                                 SourcePos:      0,
2290                                                 ControlProgram: []byte("aa"),
2291                                         },
2292                                 },
2293                                 &common.Order{
2294                                         FromAssetID: assetID1,
2295                                         ToAssetID:   assetID2,
2296                                         Rate:        0.00095,
2297                                         Utxo: &common.MovUtxo{
2298                                                 SourceID:       &bc.Hash{V0: 26},
2299                                                 Amount:         1,
2300                                                 SourcePos:      0,
2301                                                 ControlProgram: []byte("aa"),
2302                                         },
2303                                 },
2304                                 &common.Order{
2305                                         FromAssetID: assetID1,
2306                                         ToAssetID:   assetID2,
2307                                         Rate:        0.00096,
2308                                         Utxo: &common.MovUtxo{
2309                                                 SourceID:       &bc.Hash{V0: 25},
2310                                                 Amount:         1,
2311                                                 SourcePos:      0,
2312                                                 ControlProgram: []byte("aa"),
2313                                         },
2314                                 },
2315                                 &common.Order{
2316                                         FromAssetID: assetID1,
2317                                         ToAssetID:   assetID2,
2318                                         Rate:        0.00097,
2319                                         Utxo: &common.MovUtxo{
2320                                                 SourceID:       &bc.Hash{V0: 23},
2321                                                 Amount:         1,
2322                                                 SourcePos:      0,
2323                                                 ControlProgram: []byte("aa"),
2324                                         },
2325                                 },
2326                                 &common.Order{
2327                                         FromAssetID: assetID1,
2328                                         ToAssetID:   assetID2,
2329                                         Rate:        0.00098,
2330                                         Utxo: &common.MovUtxo{
2331                                                 SourceID:       &bc.Hash{V0: 13},
2332                                                 Amount:         1,
2333                                                 SourcePos:      0,
2334                                                 ControlProgram: []byte("aa"),
2335                                         },
2336                                 },
2337                                 &common.Order{
2338                                         FromAssetID: assetID1,
2339                                         ToAssetID:   assetID2,
2340                                         Rate:        0.00098,
2341                                         Utxo: &common.MovUtxo{
2342                                                 SourceID:       &bc.Hash{V0: 24},
2343                                                 Amount:         10,
2344                                                 SourcePos:      1,
2345                                                 ControlProgram: []byte("aa"),
2346                                         },
2347                                 },
2348                                 &common.Order{
2349                                         FromAssetID: assetID1,
2350                                         ToAssetID:   assetID2,
2351                                         Rate:        0.00099,
2352                                         Utxo: &common.MovUtxo{
2353                                                 SourceID:       &bc.Hash{V0: 24},
2354                                                 Amount:         1,
2355                                                 SourcePos:      0,
2356                                                 ControlProgram: []byte("aa"),
2357                                         },
2358                                 },
2359                                 &common.Order{
2360                                         FromAssetID: assetID1,
2361                                         ToAssetID:   assetID2,
2362                                         Rate:        1.00090,
2363                                         Utxo: &common.MovUtxo{
2364                                                 SourceID:       &bc.Hash{V0: 21},
2365                                                 Amount:         1,
2366                                                 SourcePos:      0,
2367                                                 ControlProgram: []byte("aa"),
2368                                         },
2369                                 },
2370                         },
2371                 },
2372         }
2373
2374         initBlockHeader := &types.BlockHeader{
2375                 Height:  0,
2376                 Version: 1,
2377         }
2378
2379         height := initBlockHeader.Height
2380         hash := initBlockHeader.Hash()
2381
2382         defer os.RemoveAll("temp")
2383         for i, c := range cases {
2384                 testDB := dbm.NewDB("testdb", "leveldb", "temp")
2385                 movStore, err := NewMovStore(testDB, height, &hash)
2386                 if err != nil {
2387                         t.Fatalf("case %d: NewMovStore error %v.", i, err)
2388                 }
2389
2390                 batch := movStore.db.NewBatch()
2391                 tradePairsCnt := make(map[common.TradePair]int)
2392                 movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
2393                 movStore.updateTradePairs(batch, tradePairsCnt)
2394                 batch.Write()
2395
2396                 tradePairsCnt = make(map[common.TradePair]int)
2397                 movStore.addOrders(batch, c.addOrders, tradePairsCnt)
2398                 batch.Write()
2399
2400                 gotOrders, err := movStore.ListOrders(&common.Order{FromAssetID: assetID1, ToAssetID: assetID2})
2401                 if err != nil {
2402                         t.Fatalf("case %d: ListOrders error %v.", i, err)
2403                 }
2404
2405                 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
2406                         t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
2407                 }
2408
2409                 testDB.Close()
2410                 os.RemoveAll("temp")
2411         }
2412 }
2413
2414 func TestDelOrders(t *testing.T) {
2415         cases := []struct {
2416                 desc         string
2417                 beforeOrders []*common.Order
2418                 delOrders    []*common.Order
2419                 wantOrders   []*common.Order
2420                 err          error
2421         }{
2422                 {
2423                         desc: "empty",
2424                         delOrders: []*common.Order{
2425                                 &common.Order{
2426                                         FromAssetID: assetID1,
2427                                         ToAssetID:   assetID2,
2428                                         Rate:        1.00090,
2429                                         Utxo: &common.MovUtxo{
2430                                                 SourceID:       &bc.Hash{V0: 21},
2431                                                 Amount:         1,
2432                                                 SourcePos:      0,
2433                                                 ControlProgram: []byte("aa"),
2434                                         },
2435                                 },
2436                                 &common.Order{
2437                                         FromAssetID: assetID1,
2438                                         ToAssetID:   assetID2,
2439                                         Rate:        0.00090,
2440                                         Utxo: &common.MovUtxo{
2441                                                 SourceID:       &bc.Hash{V0: 22},
2442                                                 Amount:         1,
2443                                                 SourcePos:      0,
2444                                                 ControlProgram: []byte("aa"),
2445                                         },
2446                                 },
2447                         },
2448                         wantOrders: []*common.Order{},
2449                         err:        errors.New("don't find trade pair"),
2450                 },
2451                 {
2452                         desc: "Delete existing data",
2453                         beforeOrders: []*common.Order{
2454                                 &common.Order{
2455                                         FromAssetID: assetID1,
2456                                         ToAssetID:   assetID2,
2457                                         Rate:        0.00090,
2458                                         Utxo: &common.MovUtxo{
2459                                                 SourceID:       &bc.Hash{V0: 22},
2460                                                 Amount:         1,
2461                                                 SourcePos:      0,
2462                                                 ControlProgram: []byte("aa"),
2463                                         },
2464                                 },
2465                                 &common.Order{
2466                                         FromAssetID: assetID1,
2467                                         ToAssetID:   assetID2,
2468                                         Rate:        0.00095,
2469                                         Utxo: &common.MovUtxo{
2470                                                 SourceID:       &bc.Hash{V0: 26},
2471                                                 Amount:         1,
2472                                                 SourcePos:      0,
2473                                                 ControlProgram: []byte("aa"),
2474                                         },
2475                                 },
2476                                 &common.Order{
2477                                         FromAssetID: assetID1,
2478                                         ToAssetID:   assetID2,
2479                                         Rate:        0.00096,
2480                                         Utxo: &common.MovUtxo{
2481                                                 SourceID:       &bc.Hash{V0: 25},
2482                                                 Amount:         1,
2483                                                 SourcePos:      0,
2484                                                 ControlProgram: []byte("aa"),
2485                                         },
2486                                 },
2487                                 &common.Order{
2488                                         FromAssetID: assetID1,
2489                                         ToAssetID:   assetID2,
2490                                         Rate:        0.00097,
2491                                         Utxo: &common.MovUtxo{
2492                                                 SourceID:       &bc.Hash{V0: 23},
2493                                                 Amount:         1,
2494                                                 SourcePos:      0,
2495                                                 ControlProgram: []byte("aa"),
2496                                         },
2497                                 },
2498                                 &common.Order{
2499                                         FromAssetID: assetID1,
2500                                         ToAssetID:   assetID2,
2501                                         Rate:        0.00098,
2502                                         Utxo: &common.MovUtxo{
2503                                                 SourceID:       &bc.Hash{V0: 13},
2504                                                 Amount:         1,
2505                                                 SourcePos:      0,
2506                                                 ControlProgram: []byte("aa"),
2507                                         },
2508                                 },
2509                                 &common.Order{
2510                                         FromAssetID: assetID1,
2511                                         ToAssetID:   assetID2,
2512                                         Rate:        0.00098,
2513                                         Utxo: &common.MovUtxo{
2514                                                 SourceID:       &bc.Hash{V0: 24},
2515                                                 Amount:         10,
2516                                                 SourcePos:      1,
2517                                                 ControlProgram: []byte("aa"),
2518                                         },
2519                                 },
2520                                 &common.Order{
2521                                         FromAssetID: assetID1,
2522                                         ToAssetID:   assetID2,
2523                                         Rate:        0.00099,
2524                                         Utxo: &common.MovUtxo{
2525                                                 SourceID:       &bc.Hash{V0: 24},
2526                                                 Amount:         1,
2527                                                 SourcePos:      0,
2528                                                 ControlProgram: []byte("aa"),
2529                                         },
2530                                 },
2531                                 &common.Order{
2532                                         FromAssetID: assetID1,
2533                                         ToAssetID:   assetID2,
2534                                         Rate:        1.00090,
2535                                         Utxo: &common.MovUtxo{
2536                                                 SourceID:       &bc.Hash{V0: 21},
2537                                                 Amount:         1,
2538                                                 SourcePos:      0,
2539                                                 ControlProgram: []byte("aa"),
2540                                         },
2541                                 },
2542                         },
2543                         delOrders: []*common.Order{
2544                                 &common.Order{
2545                                         FromAssetID: assetID1,
2546                                         ToAssetID:   assetID2,
2547                                         Rate:        0.00098,
2548                                         Utxo: &common.MovUtxo{
2549                                                 SourceID:       &bc.Hash{V0: 24},
2550                                                 Amount:         10,
2551                                                 SourcePos:      1,
2552                                                 ControlProgram: []byte("aa"),
2553                                         },
2554                                 },
2555                                 &common.Order{
2556                                         FromAssetID: assetID1,
2557                                         ToAssetID:   assetID2,
2558                                         Rate:        0.00099,
2559                                         Utxo: &common.MovUtxo{
2560                                                 SourceID:       &bc.Hash{V0: 24},
2561                                                 Amount:         1,
2562                                                 SourcePos:      0,
2563                                                 ControlProgram: []byte("aa"),
2564                                         },
2565                                 },
2566                                 &common.Order{
2567                                         FromAssetID: assetID1,
2568                                         ToAssetID:   assetID2,
2569                                         Rate:        0.00096,
2570                                         Utxo: &common.MovUtxo{
2571                                                 SourceID:       &bc.Hash{V0: 25},
2572                                                 Amount:         1,
2573                                                 SourcePos:      0,
2574                                                 ControlProgram: []byte("aa"),
2575                                         },
2576                                 },
2577                                 &common.Order{
2578                                         FromAssetID: assetID1,
2579                                         ToAssetID:   assetID2,
2580                                         Rate:        0.00095,
2581                                         Utxo: &common.MovUtxo{
2582                                                 SourceID:       &bc.Hash{V0: 26},
2583                                                 Amount:         1,
2584                                                 SourcePos:      0,
2585                                                 ControlProgram: []byte("aa"),
2586                                         },
2587                                 },
2588                         },
2589                         wantOrders: []*common.Order{
2590                                 &common.Order{
2591                                         FromAssetID: assetID1,
2592                                         ToAssetID:   assetID2,
2593                                         Rate:        0.00090,
2594                                         Utxo: &common.MovUtxo{
2595                                                 SourceID:       &bc.Hash{V0: 22},
2596                                                 Amount:         1,
2597                                                 SourcePos:      0,
2598                                                 ControlProgram: []byte("aa"),
2599                                         },
2600                                 },
2601                                 &common.Order{
2602                                         FromAssetID: assetID1,
2603                                         ToAssetID:   assetID2,
2604                                         Rate:        0.00097,
2605                                         Utxo: &common.MovUtxo{
2606                                                 SourceID:       &bc.Hash{V0: 23},
2607                                                 Amount:         1,
2608                                                 SourcePos:      0,
2609                                                 ControlProgram: []byte("aa"),
2610                                         },
2611                                 },
2612                                 &common.Order{
2613                                         FromAssetID: assetID1,
2614                                         ToAssetID:   assetID2,
2615                                         Rate:        0.00098,
2616                                         Utxo: &common.MovUtxo{
2617                                                 SourceID:       &bc.Hash{V0: 13},
2618                                                 Amount:         1,
2619                                                 SourcePos:      0,
2620                                                 ControlProgram: []byte("aa"),
2621                                         },
2622                                 },
2623                                 &common.Order{
2624                                         FromAssetID: assetID1,
2625                                         ToAssetID:   assetID2,
2626                                         Rate:        1.00090,
2627                                         Utxo: &common.MovUtxo{
2628                                                 SourceID:       &bc.Hash{V0: 21},
2629                                                 Amount:         1,
2630                                                 SourcePos:      0,
2631                                                 ControlProgram: []byte("aa"),
2632                                         },
2633                                 },
2634                         },
2635                         err: nil,
2636                 },
2637                 {
2638                         desc: "Delete all data",
2639                         beforeOrders: []*common.Order{
2640                                 &common.Order{
2641                                         FromAssetID: assetID1,
2642                                         ToAssetID:   assetID2,
2643                                         Rate:        0.00095,
2644                                         Utxo: &common.MovUtxo{
2645                                                 SourceID:       &bc.Hash{V0: 26},
2646                                                 Amount:         1,
2647                                                 SourcePos:      0,
2648                                                 ControlProgram: []byte("aa"),
2649                                         },
2650                                 },
2651                                 &common.Order{
2652                                         FromAssetID: assetID1,
2653                                         ToAssetID:   assetID2,
2654                                         Rate:        0.00096,
2655                                         Utxo: &common.MovUtxo{
2656                                                 SourceID:       &bc.Hash{V0: 25},
2657                                                 Amount:         1,
2658                                                 SourcePos:      0,
2659                                                 ControlProgram: []byte("aa"),
2660                                         },
2661                                 },
2662                                 &common.Order{
2663                                         FromAssetID: assetID1,
2664                                         ToAssetID:   assetID2,
2665                                         Rate:        0.00099,
2666                                         Utxo: &common.MovUtxo{
2667                                                 SourceID:       &bc.Hash{V0: 24},
2668                                                 Amount:         1,
2669                                                 SourcePos:      0,
2670                                                 ControlProgram: []byte("aa"),
2671                                         },
2672                                 },
2673                         },
2674                         delOrders: []*common.Order{
2675                                 &common.Order{
2676                                         FromAssetID: assetID1,
2677                                         ToAssetID:   assetID2,
2678                                         Rate:        0.00099,
2679                                         Utxo: &common.MovUtxo{
2680                                                 SourceID:       &bc.Hash{V0: 24},
2681                                                 Amount:         1,
2682                                                 SourcePos:      0,
2683                                                 ControlProgram: []byte("aa"),
2684                                         },
2685                                 },
2686                                 &common.Order{
2687                                         FromAssetID: assetID1,
2688                                         ToAssetID:   assetID2,
2689                                         Rate:        0.00096,
2690                                         Utxo: &common.MovUtxo{
2691                                                 SourceID:       &bc.Hash{V0: 25},
2692                                                 Amount:         1,
2693                                                 SourcePos:      0,
2694                                                 ControlProgram: []byte("aa"),
2695                                         },
2696                                 },
2697                                 &common.Order{
2698                                         FromAssetID: assetID1,
2699                                         ToAssetID:   assetID2,
2700                                         Rate:        0.00095,
2701                                         Utxo: &common.MovUtxo{
2702                                                 SourceID:       &bc.Hash{V0: 26},
2703                                                 Amount:         1,
2704                                                 SourcePos:      0,
2705                                                 ControlProgram: []byte("aa"),
2706                                         },
2707                                 },
2708                         },
2709                         wantOrders: []*common.Order{},
2710                         err:        nil,
2711                 },
2712         }
2713
2714         initBlockHeader := &types.BlockHeader{
2715                 Height:  0,
2716                 Version: 1,
2717         }
2718
2719         height := initBlockHeader.Height
2720         hash := initBlockHeader.Hash()
2721
2722         defer os.RemoveAll("temp")
2723         for i, c := range cases {
2724                 testDB := dbm.NewDB("testdb", "leveldb", "temp")
2725                 movStore, err := NewMovStore(testDB, height, &hash)
2726                 if err != nil {
2727                         t.Fatalf("case %d: NewMovStore error %v.", i, err)
2728                 }
2729
2730                 batch := movStore.db.NewBatch()
2731                 tradePairsCnt := make(map[common.TradePair]int)
2732                 movStore.addOrders(batch, c.beforeOrders, tradePairsCnt)
2733                 movStore.updateTradePairs(batch, tradePairsCnt)
2734                 batch.Write()
2735
2736                 tradePairsCnt = make(map[common.TradePair]int)
2737                 movStore.deleteOrders(batch, c.delOrders, tradePairsCnt)
2738                 movStore.updateTradePairs(batch, tradePairsCnt)
2739                 batch.Write()
2740
2741                 gotOrders, err := movStore.ListOrders(&common.Order{FromAssetID: assetID1, ToAssetID: assetID2})
2742                 if err != nil {
2743                         t.Fatalf("case %d: ListOrders error %v.", i, err)
2744                 }
2745
2746                 if !testutil.DeepEqual(gotOrders, c.wantOrders) {
2747                         t.Fatalf("case %d: got orders , gotOrders: %v, wantOrders: %v.", i, gotOrders, c.wantOrders)
2748                 }
2749
2750                 testDB.Close()
2751                 os.RemoveAll("temp")
2752         }
2753 }
2754
2755 func TestListTradePairsWithStart(t *testing.T) {
2756         cases := []struct {
2757                 desc            string
2758                 storeTradePairs map[common.TradePair]int
2759                 query           *common.TradePair
2760                 wantTradePairs  []*common.TradePair
2761         }{
2762                 {
2763                         desc:           "empty",
2764                         query:          &common.TradePair{},
2765                         wantTradePairs: []*common.TradePair{},
2766                 },
2767                 {
2768                         desc: "query from first",
2769                         storeTradePairs: map[common.TradePair]int{
2770                                 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
2771                                 common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
2772                                 common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
2773                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
2774                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
2775                                 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
2776                         },
2777                         query: &common.TradePair{},
2778                         wantTradePairs: []*common.TradePair{
2779                                 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
2780                                 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
2781                                 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
2782                                 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
2783                                 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
2784                                 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
2785                         },
2786                 },
2787                 {
2788                         desc: "query from middle",
2789                         storeTradePairs: map[common.TradePair]int{
2790                                 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
2791                                 common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
2792                                 common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
2793                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
2794                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
2795                                 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
2796                                 common.TradePair{FromAssetID: assetID6, ToAssetID: assetID8}: 7,
2797                         },
2798                         query: &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
2799                         wantTradePairs: []*common.TradePair{
2800                                 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
2801                                 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
2802                                 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
2803                                 &common.TradePair{FromAssetID: assetID6, ToAssetID: assetID8, Count: 7},
2804                         },
2805                 },
2806         }
2807
2808         initBlockHeader := &types.BlockHeader{
2809                 Height:  0,
2810                 Version: 1,
2811         }
2812
2813         height := initBlockHeader.Height
2814         hash := initBlockHeader.Hash()
2815
2816         defer os.RemoveAll("temp")
2817         for i, c := range cases {
2818                 testDB := dbm.NewDB("testdb", "leveldb", "temp")
2819                 movStore, err := NewMovStore(testDB, height, &hash)
2820                 if err != nil {
2821                         t.Fatalf("case %d: NewMovStore error %v.", i, err)
2822                 }
2823
2824                 batch := movStore.db.NewBatch()
2825                 movStore.updateTradePairs(batch, c.storeTradePairs)
2826                 batch.Write()
2827
2828                 gotTradePairs, err := movStore.ListTradePairsWithStart(c.query.FromAssetID, c.query.ToAssetID)
2829                 if err != nil {
2830                         t.Fatalf("case %d: ListTradePairsWithStart error %v.", i, err)
2831                 }
2832
2833                 if !testutil.DeepEqual(gotTradePairs, c.wantTradePairs) {
2834                         t.Fatalf("case %d: got TradePairs , gotTradePairs: %v, wantTradePairs: %v.", i, gotTradePairs, c.wantTradePairs)
2835                 }
2836
2837                 testDB.Close()
2838                 os.RemoveAll("temp")
2839         }
2840 }
2841
2842 func TestUpdateTradePairs(t *testing.T) {
2843         cases := []struct {
2844                 desc             string
2845                 beforeTradePairs map[common.TradePair]int
2846                 addTradePairs    map[common.TradePair]int
2847                 delTradePairs    map[common.TradePair]int
2848                 wantTradePairs   []*common.TradePair
2849         }{
2850                 {
2851                         desc: "empty",
2852                         addTradePairs: map[common.TradePair]int{
2853                                 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
2854                                 common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
2855                                 common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
2856                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
2857                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
2858                                 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
2859                         },
2860                         wantTradePairs: []*common.TradePair{
2861                                 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
2862                                 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
2863                                 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
2864                                 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
2865                                 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
2866                                 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
2867                         },
2868                 },
2869                 {
2870                         desc: "Stored data already exists",
2871                         beforeTradePairs: map[common.TradePair]int{
2872                                 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
2873                                 common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
2874                                 common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
2875                         },
2876                         addTradePairs: map[common.TradePair]int{
2877                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
2878                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
2879                                 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
2880                         },
2881                         wantTradePairs: []*common.TradePair{
2882                                 &common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2, Count: 1},
2883                                 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
2884                                 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
2885                                 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5, Count: 4},
2886                                 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 5},
2887                                 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 6},
2888                         },
2889                 },
2890                 {
2891                         desc: "delete some data",
2892                         beforeTradePairs: map[common.TradePair]int{
2893                                 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: 1,
2894                                 common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3}: 2,
2895                                 common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4}: 3,
2896                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: 4,
2897                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: 5,
2898                                 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: 6,
2899                         },
2900                         delTradePairs: map[common.TradePair]int{
2901                                 common.TradePair{FromAssetID: assetID1, ToAssetID: assetID2}: -1,
2902                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID5}: -4,
2903                                 common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6}: -2,
2904                                 common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7}: -4,
2905                         },
2906                         wantTradePairs: []*common.TradePair{
2907                                 &common.TradePair{FromAssetID: assetID2, ToAssetID: assetID3, Count: 2},
2908                                 &common.TradePair{FromAssetID: assetID3, ToAssetID: assetID4, Count: 3},
2909                                 &common.TradePair{FromAssetID: assetID4, ToAssetID: assetID6, Count: 3},
2910                                 &common.TradePair{FromAssetID: assetID5, ToAssetID: assetID7, Count: 2},
2911                         },
2912                 },
2913         }
2914
2915         initBlockHeader := &types.BlockHeader{
2916                 Height:  0,
2917                 Version: 1,
2918         }
2919
2920         height := initBlockHeader.Height
2921         hash := initBlockHeader.Hash()
2922
2923         defer os.RemoveAll("temp")
2924         for i, c := range cases {
2925                 testDB := dbm.NewDB("testdb", "leveldb", "temp")
2926                 movStore, err := NewMovStore(testDB, height, &hash)
2927                 if err != nil {
2928                         t.Fatalf("case %d: NewMovStore error %v.", i, err)
2929                 }
2930
2931                 batch := movStore.db.NewBatch()
2932                 movStore.updateTradePairs(batch, c.beforeTradePairs)
2933                 batch.Write()
2934
2935                 movStore.updateTradePairs(batch, c.addTradePairs)
2936                 movStore.updateTradePairs(batch, c.delTradePairs)
2937                 batch.Write()
2938
2939                 gotTradePairs, err := movStore.ListTradePairsWithStart(nil, nil)
2940                 if err != nil {
2941                         t.Fatalf("case %d: ListTradePairsWithStart error %v.", i, err)
2942                 }
2943
2944                 if !testutil.DeepEqual(gotTradePairs, c.wantTradePairs) {
2945                         t.Fatalf("case %d: got TradePairs , gotTradePairs: %v, wantTradePairs: %v.", i, gotTradePairs, c.wantTradePairs)
2946                 }
2947
2948                 testDB.Close()
2949                 os.RemoveAll("temp")
2950         }
2951 }
2952
2953 func TestCheckMovDatabaseState(t *testing.T) {
2954         cases := []struct {
2955                 desc           string
2956                 beforeDBStatus *common.MovDatabaseState
2957                 blockHeader    *types.BlockHeader
2958                 err            error
2959         }{
2960                 {
2961                         desc:           "attach Block",
2962                         beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
2963                         blockHeader:    &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
2964                         err:            nil,
2965                 },
2966                 {
2967                         desc:           "error attach Block",
2968                         beforeDBStatus: &common.MovDatabaseState{Height: 1, Hash: &bc.Hash{V0: 14213576368347360351, V1: 16287398171800437029, V2: 9513543230620030445, V3: 8534035697182508177}},
2969                         blockHeader:    &types.BlockHeader{Height: 2, PreviousBlockHash: bc.Hash{}},
2970                         err:            errors.New("the status of the block is inconsistent with that of mov-database"),
2971                 },
2972
2973                 {
2974                         desc:           "detach Block",
2975                         beforeDBStatus: &common.MovDatabaseState{Height: 5, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
2976                         blockHeader:    &types.BlockHeader{Height: 4},
2977                         err:            nil,
2978                 },
2979                 {
2980                         desc:           "error detach Block",
2981                         beforeDBStatus: &common.MovDatabaseState{Height: 5, Hash: &bc.Hash{V0: 3724755213446347384, V1: 158878632373345042, V2: 18283800951484248781, V3: 7520797730449067221}},
2982                         blockHeader:    &types.BlockHeader{Height: 3},
2983                         err:            errors.New("the status of the block is inconsistent with that of mov-database"),
2984                 },
2985         }
2986
2987         initBlockHeader := &types.BlockHeader{
2988                 Height:  0,
2989                 Version: 1,
2990         }
2991
2992         height := initBlockHeader.Height
2993         hash := initBlockHeader.Hash()
2994
2995         defer os.RemoveAll("temp")
2996         for i, c := range cases {
2997                 testDB := dbm.NewDB("testdb", "leveldb", "temp")
2998                 movStore, err := NewMovStore(testDB, height, &hash)
2999                 if err != nil {
3000                         t.Fatalf("case %d: NewMovStore error %v.", i, err)
3001                 }
3002
3003                 batch := movStore.db.NewBatch()
3004                 movStore.saveMovDatabaseState(batch, c.beforeDBStatus)
3005                 batch.Write()
3006
3007                 if err := movStore.checkMovDatabaseState(c.blockHeader); c.err != nil && c.err.Error() != err.Error() {
3008                         t.Fatalf("case %d: checkMovDatabaseState error %v.", i, err)
3009                 }
3010
3011                 testDB.Close()
3012                 os.RemoveAll("temp")
3013         }
3014
3015 }