neo-decompiler 0.6.2

Minimal tooling for inspecting Neo N3 NEF bytecode
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
// This file is @generated by tools/generate_opcodes.py. Do not edit manually.
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum OpCode {
    Pushint8,
    Pushint16,
    Pushint32,
    Pushint64,
    Pushint128,
    Pushint256,
    PushT,
    PushF,
    PushA,
    PushNull,
    Pushdata1,
    Pushdata2,
    Pushdata4,
    PushM1,
    Push0,
    Push1,
    Push2,
    Push3,
    Push4,
    Push5,
    Push6,
    Push7,
    Push8,
    Push9,
    Push10,
    Push11,
    Push12,
    Push13,
    Push14,
    Push15,
    Push16,
    Nop,
    Jmp,
    Jmp_L,
    Jmpif,
    Jmpif_L,
    Jmpifnot,
    Jmpifnot_L,
    JmpEq,
    JmpEq_L,
    JmpNe,
    JmpNe_L,
    JmpGt,
    JmpGt_L,
    JmpGe,
    JmpGe_L,
    JmpLt,
    JmpLt_L,
    JmpLe,
    JmpLe_L,
    Call,
    Call_L,
    CallA,
    CallT,
    Abort,
    Assert,
    Throw,
    Try,
    TryL,
    Endtry,
    EndtryL,
    Endfinally,
    Ret,
    Syscall,
    Depth,
    Drop,
    Nip,
    Xdrop,
    Clear,
    Dup,
    Over,
    Pick,
    Tuck,
    Swap,
    Rot,
    Roll,
    Reverse3,
    Reverse4,
    Reversen,
    Initsslot,
    Initslot,
    Ldsfld0,
    Ldsfld1,
    Ldsfld2,
    Ldsfld3,
    Ldsfld4,
    Ldsfld5,
    Ldsfld6,
    Ldsfld,
    Stsfld0,
    Stsfld1,
    Stsfld2,
    Stsfld3,
    Stsfld4,
    Stsfld5,
    Stsfld6,
    Stsfld,
    Ldloc0,
    Ldloc1,
    Ldloc2,
    Ldloc3,
    Ldloc4,
    Ldloc5,
    Ldloc6,
    Ldloc,
    Stloc0,
    Stloc1,
    Stloc2,
    Stloc3,
    Stloc4,
    Stloc5,
    Stloc6,
    Stloc,
    Ldarg0,
    Ldarg1,
    Ldarg2,
    Ldarg3,
    Ldarg4,
    Ldarg5,
    Ldarg6,
    Ldarg,
    Starg0,
    Starg1,
    Starg2,
    Starg3,
    Starg4,
    Starg5,
    Starg6,
    Starg,
    Newbuffer,
    Memcpy,
    Cat,
    Substr,
    Left,
    Right,
    Invert,
    And,
    Or,
    Xor,
    Equal,
    Notequal,
    Sign,
    Abs,
    Negate,
    Inc,
    Dec,
    Add,
    Sub,
    Mul,
    Div,
    Mod,
    Pow,
    Sqrt,
    Modmul,
    Modpow,
    Shl,
    Shr,
    Not,
    Booland,
    Boolor,
    Nz,
    Numequal,
    Numnotequal,
    Lt,
    Le,
    Gt,
    Ge,
    Min,
    Max,
    Within,
    Packmap,
    Packstruct,
    Pack,
    Unpack,
    Newarray0,
    Newarray,
    NewarrayT,
    Newstruct0,
    Newstruct,
    Newmap,
    Size,
    Haskey,
    Keys,
    Values,
    Pickitem,
    Append,
    Setitem,
    Reverseitems,
    Remove,
    Clearitems,
    Popitem,
    Isnull,
    Istype,
    Convert,
    Abortmsg,
    Assertmsg,
    Unknown(u8),
}

impl OpCode {
    pub fn from_byte(byte: u8) -> Self {
        match byte {
            0x00 => OpCode::Pushint8,
            0x01 => OpCode::Pushint16,
            0x02 => OpCode::Pushint32,
            0x03 => OpCode::Pushint64,
            0x04 => OpCode::Pushint128,
            0x05 => OpCode::Pushint256,
            0x08 => OpCode::PushT,
            0x09 => OpCode::PushF,
            0x0A => OpCode::PushA,
            0x0B => OpCode::PushNull,
            0x0C => OpCode::Pushdata1,
            0x0D => OpCode::Pushdata2,
            0x0E => OpCode::Pushdata4,
            0x0F => OpCode::PushM1,
            0x10 => OpCode::Push0,
            0x11 => OpCode::Push1,
            0x12 => OpCode::Push2,
            0x13 => OpCode::Push3,
            0x14 => OpCode::Push4,
            0x15 => OpCode::Push5,
            0x16 => OpCode::Push6,
            0x17 => OpCode::Push7,
            0x18 => OpCode::Push8,
            0x19 => OpCode::Push9,
            0x1A => OpCode::Push10,
            0x1B => OpCode::Push11,
            0x1C => OpCode::Push12,
            0x1D => OpCode::Push13,
            0x1E => OpCode::Push14,
            0x1F => OpCode::Push15,
            0x20 => OpCode::Push16,
            0x21 => OpCode::Nop,
            0x22 => OpCode::Jmp,
            0x23 => OpCode::Jmp_L,
            0x24 => OpCode::Jmpif,
            0x25 => OpCode::Jmpif_L,
            0x26 => OpCode::Jmpifnot,
            0x27 => OpCode::Jmpifnot_L,
            0x28 => OpCode::JmpEq,
            0x29 => OpCode::JmpEq_L,
            0x2A => OpCode::JmpNe,
            0x2B => OpCode::JmpNe_L,
            0x2C => OpCode::JmpGt,
            0x2D => OpCode::JmpGt_L,
            0x2E => OpCode::JmpGe,
            0x2F => OpCode::JmpGe_L,
            0x30 => OpCode::JmpLt,
            0x31 => OpCode::JmpLt_L,
            0x32 => OpCode::JmpLe,
            0x33 => OpCode::JmpLe_L,
            0x34 => OpCode::Call,
            0x35 => OpCode::Call_L,
            0x36 => OpCode::CallA,
            0x37 => OpCode::CallT,
            0x38 => OpCode::Abort,
            0x39 => OpCode::Assert,
            0x3A => OpCode::Throw,
            0x3B => OpCode::Try,
            0x3C => OpCode::TryL,
            0x3D => OpCode::Endtry,
            0x3E => OpCode::EndtryL,
            0x3F => OpCode::Endfinally,
            0x40 => OpCode::Ret,
            0x41 => OpCode::Syscall,
            0x43 => OpCode::Depth,
            0x45 => OpCode::Drop,
            0x46 => OpCode::Nip,
            0x48 => OpCode::Xdrop,
            0x49 => OpCode::Clear,
            0x4A => OpCode::Dup,
            0x4B => OpCode::Over,
            0x4D => OpCode::Pick,
            0x4E => OpCode::Tuck,
            0x50 => OpCode::Swap,
            0x51 => OpCode::Rot,
            0x52 => OpCode::Roll,
            0x53 => OpCode::Reverse3,
            0x54 => OpCode::Reverse4,
            0x55 => OpCode::Reversen,
            0x56 => OpCode::Initsslot,
            0x57 => OpCode::Initslot,
            0x58 => OpCode::Ldsfld0,
            0x59 => OpCode::Ldsfld1,
            0x5A => OpCode::Ldsfld2,
            0x5B => OpCode::Ldsfld3,
            0x5C => OpCode::Ldsfld4,
            0x5D => OpCode::Ldsfld5,
            0x5E => OpCode::Ldsfld6,
            0x5F => OpCode::Ldsfld,
            0x60 => OpCode::Stsfld0,
            0x61 => OpCode::Stsfld1,
            0x62 => OpCode::Stsfld2,
            0x63 => OpCode::Stsfld3,
            0x64 => OpCode::Stsfld4,
            0x65 => OpCode::Stsfld5,
            0x66 => OpCode::Stsfld6,
            0x67 => OpCode::Stsfld,
            0x68 => OpCode::Ldloc0,
            0x69 => OpCode::Ldloc1,
            0x6A => OpCode::Ldloc2,
            0x6B => OpCode::Ldloc3,
            0x6C => OpCode::Ldloc4,
            0x6D => OpCode::Ldloc5,
            0x6E => OpCode::Ldloc6,
            0x6F => OpCode::Ldloc,
            0x70 => OpCode::Stloc0,
            0x71 => OpCode::Stloc1,
            0x72 => OpCode::Stloc2,
            0x73 => OpCode::Stloc3,
            0x74 => OpCode::Stloc4,
            0x75 => OpCode::Stloc5,
            0x76 => OpCode::Stloc6,
            0x77 => OpCode::Stloc,
            0x78 => OpCode::Ldarg0,
            0x79 => OpCode::Ldarg1,
            0x7A => OpCode::Ldarg2,
            0x7B => OpCode::Ldarg3,
            0x7C => OpCode::Ldarg4,
            0x7D => OpCode::Ldarg5,
            0x7E => OpCode::Ldarg6,
            0x7F => OpCode::Ldarg,
            0x80 => OpCode::Starg0,
            0x81 => OpCode::Starg1,
            0x82 => OpCode::Starg2,
            0x83 => OpCode::Starg3,
            0x84 => OpCode::Starg4,
            0x85 => OpCode::Starg5,
            0x86 => OpCode::Starg6,
            0x87 => OpCode::Starg,
            0x88 => OpCode::Newbuffer,
            0x89 => OpCode::Memcpy,
            0x8B => OpCode::Cat,
            0x8C => OpCode::Substr,
            0x8D => OpCode::Left,
            0x8E => OpCode::Right,
            0x90 => OpCode::Invert,
            0x91 => OpCode::And,
            0x92 => OpCode::Or,
            0x93 => OpCode::Xor,
            0x97 => OpCode::Equal,
            0x98 => OpCode::Notequal,
            0x99 => OpCode::Sign,
            0x9A => OpCode::Abs,
            0x9B => OpCode::Negate,
            0x9C => OpCode::Inc,
            0x9D => OpCode::Dec,
            0x9E => OpCode::Add,
            0x9F => OpCode::Sub,
            0xA0 => OpCode::Mul,
            0xA1 => OpCode::Div,
            0xA2 => OpCode::Mod,
            0xA3 => OpCode::Pow,
            0xA4 => OpCode::Sqrt,
            0xA5 => OpCode::Modmul,
            0xA6 => OpCode::Modpow,
            0xA8 => OpCode::Shl,
            0xA9 => OpCode::Shr,
            0xAA => OpCode::Not,
            0xAB => OpCode::Booland,
            0xAC => OpCode::Boolor,
            0xB1 => OpCode::Nz,
            0xB3 => OpCode::Numequal,
            0xB4 => OpCode::Numnotequal,
            0xB5 => OpCode::Lt,
            0xB6 => OpCode::Le,
            0xB7 => OpCode::Gt,
            0xB8 => OpCode::Ge,
            0xB9 => OpCode::Min,
            0xBA => OpCode::Max,
            0xBB => OpCode::Within,
            0xBE => OpCode::Packmap,
            0xBF => OpCode::Packstruct,
            0xC0 => OpCode::Pack,
            0xC1 => OpCode::Unpack,
            0xC2 => OpCode::Newarray0,
            0xC3 => OpCode::Newarray,
            0xC4 => OpCode::NewarrayT,
            0xC5 => OpCode::Newstruct0,
            0xC6 => OpCode::Newstruct,
            0xC8 => OpCode::Newmap,
            0xCA => OpCode::Size,
            0xCB => OpCode::Haskey,
            0xCC => OpCode::Keys,
            0xCD => OpCode::Values,
            0xCE => OpCode::Pickitem,
            0xCF => OpCode::Append,
            0xD0 => OpCode::Setitem,
            0xD1 => OpCode::Reverseitems,
            0xD2 => OpCode::Remove,
            0xD3 => OpCode::Clearitems,
            0xD4 => OpCode::Popitem,
            0xD8 => OpCode::Isnull,
            0xD9 => OpCode::Istype,
            0xDB => OpCode::Convert,
            0xE0 => OpCode::Abortmsg,
            0xE1 => OpCode::Assertmsg,
            other => OpCode::Unknown(other),
        }
    }

    pub fn byte(self) -> u8 {
        match self {
            OpCode::Pushint8 => 0x00,
            OpCode::Pushint16 => 0x01,
            OpCode::Pushint32 => 0x02,
            OpCode::Pushint64 => 0x03,
            OpCode::Pushint128 => 0x04,
            OpCode::Pushint256 => 0x05,
            OpCode::PushT => 0x08,
            OpCode::PushF => 0x09,
            OpCode::PushA => 0x0A,
            OpCode::PushNull => 0x0B,
            OpCode::Pushdata1 => 0x0C,
            OpCode::Pushdata2 => 0x0D,
            OpCode::Pushdata4 => 0x0E,
            OpCode::PushM1 => 0x0F,
            OpCode::Push0 => 0x10,
            OpCode::Push1 => 0x11,
            OpCode::Push2 => 0x12,
            OpCode::Push3 => 0x13,
            OpCode::Push4 => 0x14,
            OpCode::Push5 => 0x15,
            OpCode::Push6 => 0x16,
            OpCode::Push7 => 0x17,
            OpCode::Push8 => 0x18,
            OpCode::Push9 => 0x19,
            OpCode::Push10 => 0x1A,
            OpCode::Push11 => 0x1B,
            OpCode::Push12 => 0x1C,
            OpCode::Push13 => 0x1D,
            OpCode::Push14 => 0x1E,
            OpCode::Push15 => 0x1F,
            OpCode::Push16 => 0x20,
            OpCode::Nop => 0x21,
            OpCode::Jmp => 0x22,
            OpCode::Jmp_L => 0x23,
            OpCode::Jmpif => 0x24,
            OpCode::Jmpif_L => 0x25,
            OpCode::Jmpifnot => 0x26,
            OpCode::Jmpifnot_L => 0x27,
            OpCode::JmpEq => 0x28,
            OpCode::JmpEq_L => 0x29,
            OpCode::JmpNe => 0x2A,
            OpCode::JmpNe_L => 0x2B,
            OpCode::JmpGt => 0x2C,
            OpCode::JmpGt_L => 0x2D,
            OpCode::JmpGe => 0x2E,
            OpCode::JmpGe_L => 0x2F,
            OpCode::JmpLt => 0x30,
            OpCode::JmpLt_L => 0x31,
            OpCode::JmpLe => 0x32,
            OpCode::JmpLe_L => 0x33,
            OpCode::Call => 0x34,
            OpCode::Call_L => 0x35,
            OpCode::CallA => 0x36,
            OpCode::CallT => 0x37,
            OpCode::Abort => 0x38,
            OpCode::Assert => 0x39,
            OpCode::Throw => 0x3A,
            OpCode::Try => 0x3B,
            OpCode::TryL => 0x3C,
            OpCode::Endtry => 0x3D,
            OpCode::EndtryL => 0x3E,
            OpCode::Endfinally => 0x3F,
            OpCode::Ret => 0x40,
            OpCode::Syscall => 0x41,
            OpCode::Depth => 0x43,
            OpCode::Drop => 0x45,
            OpCode::Nip => 0x46,
            OpCode::Xdrop => 0x48,
            OpCode::Clear => 0x49,
            OpCode::Dup => 0x4A,
            OpCode::Over => 0x4B,
            OpCode::Pick => 0x4D,
            OpCode::Tuck => 0x4E,
            OpCode::Swap => 0x50,
            OpCode::Rot => 0x51,
            OpCode::Roll => 0x52,
            OpCode::Reverse3 => 0x53,
            OpCode::Reverse4 => 0x54,
            OpCode::Reversen => 0x55,
            OpCode::Initsslot => 0x56,
            OpCode::Initslot => 0x57,
            OpCode::Ldsfld0 => 0x58,
            OpCode::Ldsfld1 => 0x59,
            OpCode::Ldsfld2 => 0x5A,
            OpCode::Ldsfld3 => 0x5B,
            OpCode::Ldsfld4 => 0x5C,
            OpCode::Ldsfld5 => 0x5D,
            OpCode::Ldsfld6 => 0x5E,
            OpCode::Ldsfld => 0x5F,
            OpCode::Stsfld0 => 0x60,
            OpCode::Stsfld1 => 0x61,
            OpCode::Stsfld2 => 0x62,
            OpCode::Stsfld3 => 0x63,
            OpCode::Stsfld4 => 0x64,
            OpCode::Stsfld5 => 0x65,
            OpCode::Stsfld6 => 0x66,
            OpCode::Stsfld => 0x67,
            OpCode::Ldloc0 => 0x68,
            OpCode::Ldloc1 => 0x69,
            OpCode::Ldloc2 => 0x6A,
            OpCode::Ldloc3 => 0x6B,
            OpCode::Ldloc4 => 0x6C,
            OpCode::Ldloc5 => 0x6D,
            OpCode::Ldloc6 => 0x6E,
            OpCode::Ldloc => 0x6F,
            OpCode::Stloc0 => 0x70,
            OpCode::Stloc1 => 0x71,
            OpCode::Stloc2 => 0x72,
            OpCode::Stloc3 => 0x73,
            OpCode::Stloc4 => 0x74,
            OpCode::Stloc5 => 0x75,
            OpCode::Stloc6 => 0x76,
            OpCode::Stloc => 0x77,
            OpCode::Ldarg0 => 0x78,
            OpCode::Ldarg1 => 0x79,
            OpCode::Ldarg2 => 0x7A,
            OpCode::Ldarg3 => 0x7B,
            OpCode::Ldarg4 => 0x7C,
            OpCode::Ldarg5 => 0x7D,
            OpCode::Ldarg6 => 0x7E,
            OpCode::Ldarg => 0x7F,
            OpCode::Starg0 => 0x80,
            OpCode::Starg1 => 0x81,
            OpCode::Starg2 => 0x82,
            OpCode::Starg3 => 0x83,
            OpCode::Starg4 => 0x84,
            OpCode::Starg5 => 0x85,
            OpCode::Starg6 => 0x86,
            OpCode::Starg => 0x87,
            OpCode::Newbuffer => 0x88,
            OpCode::Memcpy => 0x89,
            OpCode::Cat => 0x8B,
            OpCode::Substr => 0x8C,
            OpCode::Left => 0x8D,
            OpCode::Right => 0x8E,
            OpCode::Invert => 0x90,
            OpCode::And => 0x91,
            OpCode::Or => 0x92,
            OpCode::Xor => 0x93,
            OpCode::Equal => 0x97,
            OpCode::Notequal => 0x98,
            OpCode::Sign => 0x99,
            OpCode::Abs => 0x9A,
            OpCode::Negate => 0x9B,
            OpCode::Inc => 0x9C,
            OpCode::Dec => 0x9D,
            OpCode::Add => 0x9E,
            OpCode::Sub => 0x9F,
            OpCode::Mul => 0xA0,
            OpCode::Div => 0xA1,
            OpCode::Mod => 0xA2,
            OpCode::Pow => 0xA3,
            OpCode::Sqrt => 0xA4,
            OpCode::Modmul => 0xA5,
            OpCode::Modpow => 0xA6,
            OpCode::Shl => 0xA8,
            OpCode::Shr => 0xA9,
            OpCode::Not => 0xAA,
            OpCode::Booland => 0xAB,
            OpCode::Boolor => 0xAC,
            OpCode::Nz => 0xB1,
            OpCode::Numequal => 0xB3,
            OpCode::Numnotequal => 0xB4,
            OpCode::Lt => 0xB5,
            OpCode::Le => 0xB6,
            OpCode::Gt => 0xB7,
            OpCode::Ge => 0xB8,
            OpCode::Min => 0xB9,
            OpCode::Max => 0xBA,
            OpCode::Within => 0xBB,
            OpCode::Packmap => 0xBE,
            OpCode::Packstruct => 0xBF,
            OpCode::Pack => 0xC0,
            OpCode::Unpack => 0xC1,
            OpCode::Newarray0 => 0xC2,
            OpCode::Newarray => 0xC3,
            OpCode::NewarrayT => 0xC4,
            OpCode::Newstruct0 => 0xC5,
            OpCode::Newstruct => 0xC6,
            OpCode::Newmap => 0xC8,
            OpCode::Size => 0xCA,
            OpCode::Haskey => 0xCB,
            OpCode::Keys => 0xCC,
            OpCode::Values => 0xCD,
            OpCode::Pickitem => 0xCE,
            OpCode::Append => 0xCF,
            OpCode::Setitem => 0xD0,
            OpCode::Reverseitems => 0xD1,
            OpCode::Remove => 0xD2,
            OpCode::Clearitems => 0xD3,
            OpCode::Popitem => 0xD4,
            OpCode::Isnull => 0xD8,
            OpCode::Istype => 0xD9,
            OpCode::Convert => 0xDB,
            OpCode::Abortmsg => 0xE0,
            OpCode::Assertmsg => 0xE1,
            OpCode::Unknown(value) => value,
        }
    }

    pub fn mnemonic(self) -> &'static str {
        match self {
            OpCode::Pushint8 => "PUSHINT8",
            OpCode::Pushint16 => "PUSHINT16",
            OpCode::Pushint32 => "PUSHINT32",
            OpCode::Pushint64 => "PUSHINT64",
            OpCode::Pushint128 => "PUSHINT128",
            OpCode::Pushint256 => "PUSHINT256",
            OpCode::PushT => "PUSHT",
            OpCode::PushF => "PUSHF",
            OpCode::PushA => "PUSHA",
            OpCode::PushNull => "PUSHNULL",
            OpCode::Pushdata1 => "PUSHDATA1",
            OpCode::Pushdata2 => "PUSHDATA2",
            OpCode::Pushdata4 => "PUSHDATA4",
            OpCode::PushM1 => "PUSHM1",
            OpCode::Push0 => "PUSH0",
            OpCode::Push1 => "PUSH1",
            OpCode::Push2 => "PUSH2",
            OpCode::Push3 => "PUSH3",
            OpCode::Push4 => "PUSH4",
            OpCode::Push5 => "PUSH5",
            OpCode::Push6 => "PUSH6",
            OpCode::Push7 => "PUSH7",
            OpCode::Push8 => "PUSH8",
            OpCode::Push9 => "PUSH9",
            OpCode::Push10 => "PUSH10",
            OpCode::Push11 => "PUSH11",
            OpCode::Push12 => "PUSH12",
            OpCode::Push13 => "PUSH13",
            OpCode::Push14 => "PUSH14",
            OpCode::Push15 => "PUSH15",
            OpCode::Push16 => "PUSH16",
            OpCode::Nop => "NOP",
            OpCode::Jmp => "JMP",
            OpCode::Jmp_L => "JMP_L",
            OpCode::Jmpif => "JMPIF",
            OpCode::Jmpif_L => "JMPIF_L",
            OpCode::Jmpifnot => "JMPIFNOT",
            OpCode::Jmpifnot_L => "JMPIFNOT_L",
            OpCode::JmpEq => "JMPEQ",
            OpCode::JmpEq_L => "JMPEQ_L",
            OpCode::JmpNe => "JMPNE",
            OpCode::JmpNe_L => "JMPNE_L",
            OpCode::JmpGt => "JMPGT",
            OpCode::JmpGt_L => "JMPGT_L",
            OpCode::JmpGe => "JMPGE",
            OpCode::JmpGe_L => "JMPGE_L",
            OpCode::JmpLt => "JMPLT",
            OpCode::JmpLt_L => "JMPLT_L",
            OpCode::JmpLe => "JMPLE",
            OpCode::JmpLe_L => "JMPLE_L",
            OpCode::Call => "CALL",
            OpCode::Call_L => "CALL_L",
            OpCode::CallA => "CALLA",
            OpCode::CallT => "CALLT",
            OpCode::Abort => "ABORT",
            OpCode::Assert => "ASSERT",
            OpCode::Throw => "THROW",
            OpCode::Try => "TRY",
            OpCode::TryL => "TRY_L",
            OpCode::Endtry => "ENDTRY",
            OpCode::EndtryL => "ENDTRY_L",
            OpCode::Endfinally => "ENDFINALLY",
            OpCode::Ret => "RET",
            OpCode::Syscall => "SYSCALL",
            OpCode::Depth => "DEPTH",
            OpCode::Drop => "DROP",
            OpCode::Nip => "NIP",
            OpCode::Xdrop => "XDROP",
            OpCode::Clear => "CLEAR",
            OpCode::Dup => "DUP",
            OpCode::Over => "OVER",
            OpCode::Pick => "PICK",
            OpCode::Tuck => "TUCK",
            OpCode::Swap => "SWAP",
            OpCode::Rot => "ROT",
            OpCode::Roll => "ROLL",
            OpCode::Reverse3 => "REVERSE3",
            OpCode::Reverse4 => "REVERSE4",
            OpCode::Reversen => "REVERSEN",
            OpCode::Initsslot => "INITSSLOT",
            OpCode::Initslot => "INITSLOT",
            OpCode::Ldsfld0 => "LDSFLD0",
            OpCode::Ldsfld1 => "LDSFLD1",
            OpCode::Ldsfld2 => "LDSFLD2",
            OpCode::Ldsfld3 => "LDSFLD3",
            OpCode::Ldsfld4 => "LDSFLD4",
            OpCode::Ldsfld5 => "LDSFLD5",
            OpCode::Ldsfld6 => "LDSFLD6",
            OpCode::Ldsfld => "LDSFLD",
            OpCode::Stsfld0 => "STSFLD0",
            OpCode::Stsfld1 => "STSFLD1",
            OpCode::Stsfld2 => "STSFLD2",
            OpCode::Stsfld3 => "STSFLD3",
            OpCode::Stsfld4 => "STSFLD4",
            OpCode::Stsfld5 => "STSFLD5",
            OpCode::Stsfld6 => "STSFLD6",
            OpCode::Stsfld => "STSFLD",
            OpCode::Ldloc0 => "LDLOC0",
            OpCode::Ldloc1 => "LDLOC1",
            OpCode::Ldloc2 => "LDLOC2",
            OpCode::Ldloc3 => "LDLOC3",
            OpCode::Ldloc4 => "LDLOC4",
            OpCode::Ldloc5 => "LDLOC5",
            OpCode::Ldloc6 => "LDLOC6",
            OpCode::Ldloc => "LDLOC",
            OpCode::Stloc0 => "STLOC0",
            OpCode::Stloc1 => "STLOC1",
            OpCode::Stloc2 => "STLOC2",
            OpCode::Stloc3 => "STLOC3",
            OpCode::Stloc4 => "STLOC4",
            OpCode::Stloc5 => "STLOC5",
            OpCode::Stloc6 => "STLOC6",
            OpCode::Stloc => "STLOC",
            OpCode::Ldarg0 => "LDARG0",
            OpCode::Ldarg1 => "LDARG1",
            OpCode::Ldarg2 => "LDARG2",
            OpCode::Ldarg3 => "LDARG3",
            OpCode::Ldarg4 => "LDARG4",
            OpCode::Ldarg5 => "LDARG5",
            OpCode::Ldarg6 => "LDARG6",
            OpCode::Ldarg => "LDARG",
            OpCode::Starg0 => "STARG0",
            OpCode::Starg1 => "STARG1",
            OpCode::Starg2 => "STARG2",
            OpCode::Starg3 => "STARG3",
            OpCode::Starg4 => "STARG4",
            OpCode::Starg5 => "STARG5",
            OpCode::Starg6 => "STARG6",
            OpCode::Starg => "STARG",
            OpCode::Newbuffer => "NEWBUFFER",
            OpCode::Memcpy => "MEMCPY",
            OpCode::Cat => "CAT",
            OpCode::Substr => "SUBSTR",
            OpCode::Left => "LEFT",
            OpCode::Right => "RIGHT",
            OpCode::Invert => "INVERT",
            OpCode::And => "AND",
            OpCode::Or => "OR",
            OpCode::Xor => "XOR",
            OpCode::Equal => "EQUAL",
            OpCode::Notequal => "NOTEQUAL",
            OpCode::Sign => "SIGN",
            OpCode::Abs => "ABS",
            OpCode::Negate => "NEGATE",
            OpCode::Inc => "INC",
            OpCode::Dec => "DEC",
            OpCode::Add => "ADD",
            OpCode::Sub => "SUB",
            OpCode::Mul => "MUL",
            OpCode::Div => "DIV",
            OpCode::Mod => "MOD",
            OpCode::Pow => "POW",
            OpCode::Sqrt => "SQRT",
            OpCode::Modmul => "MODMUL",
            OpCode::Modpow => "MODPOW",
            OpCode::Shl => "SHL",
            OpCode::Shr => "SHR",
            OpCode::Not => "NOT",
            OpCode::Booland => "BOOLAND",
            OpCode::Boolor => "BOOLOR",
            OpCode::Nz => "NZ",
            OpCode::Numequal => "NUMEQUAL",
            OpCode::Numnotequal => "NUMNOTEQUAL",
            OpCode::Lt => "LT",
            OpCode::Le => "LE",
            OpCode::Gt => "GT",
            OpCode::Ge => "GE",
            OpCode::Min => "MIN",
            OpCode::Max => "MAX",
            OpCode::Within => "WITHIN",
            OpCode::Packmap => "PACKMAP",
            OpCode::Packstruct => "PACKSTRUCT",
            OpCode::Pack => "PACK",
            OpCode::Unpack => "UNPACK",
            OpCode::Newarray0 => "NEWARRAY0",
            OpCode::Newarray => "NEWARRAY",
            OpCode::NewarrayT => "NEWARRAY_T",
            OpCode::Newstruct0 => "NEWSTRUCT0",
            OpCode::Newstruct => "NEWSTRUCT",
            OpCode::Newmap => "NEWMAP",
            OpCode::Size => "SIZE",
            OpCode::Haskey => "HASKEY",
            OpCode::Keys => "KEYS",
            OpCode::Values => "VALUES",
            OpCode::Pickitem => "PICKITEM",
            OpCode::Append => "APPEND",
            OpCode::Setitem => "SETITEM",
            OpCode::Reverseitems => "REVERSEITEMS",
            OpCode::Remove => "REMOVE",
            OpCode::Clearitems => "CLEARITEMS",
            OpCode::Popitem => "POPITEM",
            OpCode::Isnull => "ISNULL",
            OpCode::Istype => "ISTYPE",
            OpCode::Convert => "CONVERT",
            OpCode::Abortmsg => "ABORTMSG",
            OpCode::Assertmsg => "ASSERTMSG",
            OpCode::Unknown(_) => "UNKNOWN",
        }
    }

    pub fn operand_encoding(self) -> OperandEncoding {
        match self {
            OpCode::Pushint8 => OperandEncoding::I8,
            OpCode::Pushint16 => OperandEncoding::I16,
            OpCode::Pushint32 => OperandEncoding::I32,
            OpCode::Pushint64 => OperandEncoding::I64,
            OpCode::Pushint128 => OperandEncoding::Bytes(16),
            OpCode::Pushint256 => OperandEncoding::Bytes(32),
            OpCode::PushT => OperandEncoding::None,
            OpCode::PushF => OperandEncoding::None,
            OpCode::PushA => OperandEncoding::U32,
            OpCode::PushNull => OperandEncoding::None,
            OpCode::Pushdata1 => OperandEncoding::Data1,
            OpCode::Pushdata2 => OperandEncoding::Data2,
            OpCode::Pushdata4 => OperandEncoding::Data4,
            OpCode::PushM1 => OperandEncoding::None,
            OpCode::Push0 => OperandEncoding::None,
            OpCode::Push1 => OperandEncoding::None,
            OpCode::Push2 => OperandEncoding::None,
            OpCode::Push3 => OperandEncoding::None,
            OpCode::Push4 => OperandEncoding::None,
            OpCode::Push5 => OperandEncoding::None,
            OpCode::Push6 => OperandEncoding::None,
            OpCode::Push7 => OperandEncoding::None,
            OpCode::Push8 => OperandEncoding::None,
            OpCode::Push9 => OperandEncoding::None,
            OpCode::Push10 => OperandEncoding::None,
            OpCode::Push11 => OperandEncoding::None,
            OpCode::Push12 => OperandEncoding::None,
            OpCode::Push13 => OperandEncoding::None,
            OpCode::Push14 => OperandEncoding::None,
            OpCode::Push15 => OperandEncoding::None,
            OpCode::Push16 => OperandEncoding::None,
            OpCode::Nop => OperandEncoding::None,
            OpCode::Jmp => OperandEncoding::Jump8,
            OpCode::Jmp_L => OperandEncoding::Jump32,
            OpCode::Jmpif => OperandEncoding::Jump8,
            OpCode::Jmpif_L => OperandEncoding::Jump32,
            OpCode::Jmpifnot => OperandEncoding::Jump8,
            OpCode::Jmpifnot_L => OperandEncoding::Jump32,
            OpCode::JmpEq => OperandEncoding::Jump8,
            OpCode::JmpEq_L => OperandEncoding::Jump32,
            OpCode::JmpNe => OperandEncoding::Jump8,
            OpCode::JmpNe_L => OperandEncoding::Jump32,
            OpCode::JmpGt => OperandEncoding::Jump8,
            OpCode::JmpGt_L => OperandEncoding::Jump32,
            OpCode::JmpGe => OperandEncoding::Jump8,
            OpCode::JmpGe_L => OperandEncoding::Jump32,
            OpCode::JmpLt => OperandEncoding::Jump8,
            OpCode::JmpLt_L => OperandEncoding::Jump32,
            OpCode::JmpLe => OperandEncoding::Jump8,
            OpCode::JmpLe_L => OperandEncoding::Jump32,
            OpCode::Call => OperandEncoding::Jump8,
            OpCode::Call_L => OperandEncoding::Jump32,
            OpCode::CallA => OperandEncoding::None,
            OpCode::CallT => OperandEncoding::U16,
            OpCode::Abort => OperandEncoding::None,
            OpCode::Assert => OperandEncoding::None,
            OpCode::Throw => OperandEncoding::None,
            OpCode::Try => OperandEncoding::Bytes(2),
            OpCode::TryL => OperandEncoding::Bytes(8),
            OpCode::Endtry => OperandEncoding::Jump8,
            OpCode::EndtryL => OperandEncoding::Jump32,
            OpCode::Endfinally => OperandEncoding::None,
            OpCode::Ret => OperandEncoding::None,
            OpCode::Syscall => OperandEncoding::Syscall,
            OpCode::Depth => OperandEncoding::None,
            OpCode::Drop => OperandEncoding::None,
            OpCode::Nip => OperandEncoding::None,
            OpCode::Xdrop => OperandEncoding::None,
            OpCode::Clear => OperandEncoding::None,
            OpCode::Dup => OperandEncoding::None,
            OpCode::Over => OperandEncoding::None,
            OpCode::Pick => OperandEncoding::None,
            OpCode::Tuck => OperandEncoding::None,
            OpCode::Swap => OperandEncoding::None,
            OpCode::Rot => OperandEncoding::None,
            OpCode::Roll => OperandEncoding::None,
            OpCode::Reverse3 => OperandEncoding::None,
            OpCode::Reverse4 => OperandEncoding::None,
            OpCode::Reversen => OperandEncoding::None,
            OpCode::Initsslot => OperandEncoding::U8,
            OpCode::Initslot => OperandEncoding::Bytes(2),
            OpCode::Ldsfld0 => OperandEncoding::None,
            OpCode::Ldsfld1 => OperandEncoding::None,
            OpCode::Ldsfld2 => OperandEncoding::None,
            OpCode::Ldsfld3 => OperandEncoding::None,
            OpCode::Ldsfld4 => OperandEncoding::None,
            OpCode::Ldsfld5 => OperandEncoding::None,
            OpCode::Ldsfld6 => OperandEncoding::None,
            OpCode::Ldsfld => OperandEncoding::U8,
            OpCode::Stsfld0 => OperandEncoding::None,
            OpCode::Stsfld1 => OperandEncoding::None,
            OpCode::Stsfld2 => OperandEncoding::None,
            OpCode::Stsfld3 => OperandEncoding::None,
            OpCode::Stsfld4 => OperandEncoding::None,
            OpCode::Stsfld5 => OperandEncoding::None,
            OpCode::Stsfld6 => OperandEncoding::None,
            OpCode::Stsfld => OperandEncoding::U8,
            OpCode::Ldloc0 => OperandEncoding::None,
            OpCode::Ldloc1 => OperandEncoding::None,
            OpCode::Ldloc2 => OperandEncoding::None,
            OpCode::Ldloc3 => OperandEncoding::None,
            OpCode::Ldloc4 => OperandEncoding::None,
            OpCode::Ldloc5 => OperandEncoding::None,
            OpCode::Ldloc6 => OperandEncoding::None,
            OpCode::Ldloc => OperandEncoding::U8,
            OpCode::Stloc0 => OperandEncoding::None,
            OpCode::Stloc1 => OperandEncoding::None,
            OpCode::Stloc2 => OperandEncoding::None,
            OpCode::Stloc3 => OperandEncoding::None,
            OpCode::Stloc4 => OperandEncoding::None,
            OpCode::Stloc5 => OperandEncoding::None,
            OpCode::Stloc6 => OperandEncoding::None,
            OpCode::Stloc => OperandEncoding::U8,
            OpCode::Ldarg0 => OperandEncoding::None,
            OpCode::Ldarg1 => OperandEncoding::None,
            OpCode::Ldarg2 => OperandEncoding::None,
            OpCode::Ldarg3 => OperandEncoding::None,
            OpCode::Ldarg4 => OperandEncoding::None,
            OpCode::Ldarg5 => OperandEncoding::None,
            OpCode::Ldarg6 => OperandEncoding::None,
            OpCode::Ldarg => OperandEncoding::U8,
            OpCode::Starg0 => OperandEncoding::None,
            OpCode::Starg1 => OperandEncoding::None,
            OpCode::Starg2 => OperandEncoding::None,
            OpCode::Starg3 => OperandEncoding::None,
            OpCode::Starg4 => OperandEncoding::None,
            OpCode::Starg5 => OperandEncoding::None,
            OpCode::Starg6 => OperandEncoding::None,
            OpCode::Starg => OperandEncoding::U8,
            OpCode::Newbuffer => OperandEncoding::None,
            OpCode::Memcpy => OperandEncoding::None,
            OpCode::Cat => OperandEncoding::None,
            OpCode::Substr => OperandEncoding::None,
            OpCode::Left => OperandEncoding::None,
            OpCode::Right => OperandEncoding::None,
            OpCode::Invert => OperandEncoding::None,
            OpCode::And => OperandEncoding::None,
            OpCode::Or => OperandEncoding::None,
            OpCode::Xor => OperandEncoding::None,
            OpCode::Equal => OperandEncoding::None,
            OpCode::Notequal => OperandEncoding::None,
            OpCode::Sign => OperandEncoding::None,
            OpCode::Abs => OperandEncoding::None,
            OpCode::Negate => OperandEncoding::None,
            OpCode::Inc => OperandEncoding::None,
            OpCode::Dec => OperandEncoding::None,
            OpCode::Add => OperandEncoding::None,
            OpCode::Sub => OperandEncoding::None,
            OpCode::Mul => OperandEncoding::None,
            OpCode::Div => OperandEncoding::None,
            OpCode::Mod => OperandEncoding::None,
            OpCode::Pow => OperandEncoding::None,
            OpCode::Sqrt => OperandEncoding::None,
            OpCode::Modmul => OperandEncoding::None,
            OpCode::Modpow => OperandEncoding::None,
            OpCode::Shl => OperandEncoding::None,
            OpCode::Shr => OperandEncoding::None,
            OpCode::Not => OperandEncoding::None,
            OpCode::Booland => OperandEncoding::None,
            OpCode::Boolor => OperandEncoding::None,
            OpCode::Nz => OperandEncoding::None,
            OpCode::Numequal => OperandEncoding::None,
            OpCode::Numnotequal => OperandEncoding::None,
            OpCode::Lt => OperandEncoding::None,
            OpCode::Le => OperandEncoding::None,
            OpCode::Gt => OperandEncoding::None,
            OpCode::Ge => OperandEncoding::None,
            OpCode::Min => OperandEncoding::None,
            OpCode::Max => OperandEncoding::None,
            OpCode::Within => OperandEncoding::None,
            OpCode::Packmap => OperandEncoding::None,
            OpCode::Packstruct => OperandEncoding::None,
            OpCode::Pack => OperandEncoding::None,
            OpCode::Unpack => OperandEncoding::None,
            OpCode::Newarray0 => OperandEncoding::None,
            OpCode::Newarray => OperandEncoding::None,
            OpCode::NewarrayT => OperandEncoding::U8,
            OpCode::Newstruct0 => OperandEncoding::None,
            OpCode::Newstruct => OperandEncoding::None,
            OpCode::Newmap => OperandEncoding::None,
            OpCode::Size => OperandEncoding::None,
            OpCode::Haskey => OperandEncoding::None,
            OpCode::Keys => OperandEncoding::None,
            OpCode::Values => OperandEncoding::None,
            OpCode::Pickitem => OperandEncoding::None,
            OpCode::Append => OperandEncoding::None,
            OpCode::Setitem => OperandEncoding::None,
            OpCode::Reverseitems => OperandEncoding::None,
            OpCode::Remove => OperandEncoding::None,
            OpCode::Clearitems => OperandEncoding::None,
            OpCode::Popitem => OperandEncoding::None,
            OpCode::Isnull => OperandEncoding::None,
            OpCode::Istype => OperandEncoding::U8,
            OpCode::Convert => OperandEncoding::U8,
            OpCode::Abortmsg => OperandEncoding::None,
            OpCode::Assertmsg => OperandEncoding::None,
            OpCode::Unknown(_) => OperandEncoding::None,
        }
    }
}