Skip to main content

neo_vm_core/
opcode.rs

1//! Neo VM OpCodes - Based on Neo N3 specification
2
3/// Neo VM Operation Codes
4///
5/// Names follow the official Neo N3 specification exactly.
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7#[repr(u8)]
8#[allow(non_camel_case_types)]
9pub enum OpCode {
10    // Constants
11    PUSHINT8 = 0x00,
12    PUSHINT16 = 0x01,
13    PUSHINT32 = 0x02,
14    PUSHINT64 = 0x03,
15    PUSHINT128 = 0x04,
16    PUSHINT256 = 0x05,
17    PUSHA = 0x0A,
18    PUSHNULL = 0x0B,
19    PUSHDATA1 = 0x0C,
20    PUSHDATA2 = 0x0D,
21    PUSHDATA4 = 0x0E,
22    PUSHM1 = 0x0F,
23    PUSH0 = 0x10,
24    PUSH1 = 0x11,
25    PUSH2 = 0x12,
26    PUSH3 = 0x13,
27    PUSH4 = 0x14,
28    PUSH5 = 0x15,
29    PUSH6 = 0x16,
30    PUSH7 = 0x17,
31    PUSH8 = 0x18,
32    PUSH9 = 0x19,
33    PUSH10 = 0x1A,
34    PUSH11 = 0x1B,
35    PUSH12 = 0x1C,
36    PUSH13 = 0x1D,
37    PUSH14 = 0x1E,
38    PUSH15 = 0x1F,
39    PUSH16 = 0x20,
40
41    // Flow control
42    NOP = 0x21,
43    JMP = 0x22,
44    JMP_L = 0x23,
45    JMPIF = 0x24,
46    JMPIF_L = 0x25,
47    JMPIFNOT = 0x26,
48    JMPIFNOT_L = 0x27,
49    JMPEQ = 0x28,
50    JMPEQ_L = 0x29,
51    JMPNE = 0x2A,
52    JMPNE_L = 0x2B,
53    JMPGT = 0x2C,
54    JMPGT_L = 0x2D,
55    JMPGE = 0x2E,
56    JMPGE_L = 0x2F,
57    JMPLT = 0x30,
58    JMPLT_L = 0x31,
59    JMPLE = 0x32,
60    JMPLE_L = 0x33,
61    CALL = 0x34,
62    CALL_L = 0x35,
63    CALLA = 0x36,
64    CALLT = 0x37,
65    ABORT = 0x38,
66    ASSERT = 0x39,
67    THROW = 0x3A,
68    TRY = 0x3B,
69    TRY_L = 0x3C,
70    ENDTRY = 0x3D,
71    ENDTRY_L = 0x3E,
72    ENDFINALLY = 0x3F,
73    RET = 0x40,
74    SYSCALL = 0x41,
75
76    // Stack operations
77    DEPTH = 0x43,
78    DROP = 0x45,
79    NIP = 0x46,
80    XDROP = 0x48,
81    CLEAR = 0x49,
82    DUP = 0x4A,
83    OVER = 0x4B,
84    PICK = 0x4D,
85    TUCK = 0x4E,
86    SWAP = 0x50,
87    ROT = 0x51,
88    ROLL = 0x52,
89    REVERSE3 = 0x53,
90    REVERSE4 = 0x54,
91    REVERSEN = 0x55,
92
93    // Slot operations
94    INITSSLOT = 0x56,
95    INITSLOT = 0x57,
96    LDSFLD0 = 0x58,
97    LDSFLD = 0x5E,
98    STSFLD0 = 0x5F,
99    STSFLD = 0x65,
100    LDLOC0 = 0x66,
101    LDLOC = 0x6C,
102    STLOC0 = 0x6D,
103    STLOC = 0x73,
104    LDARG0 = 0x74,
105    LDARG = 0x7A,
106    STARG0 = 0x7B,
107    STARG = 0x81,
108
109    // Splice operations
110    NEWBUFFER = 0x88,
111    MEMCPY = 0x89,
112    CAT = 0x8B,
113    SUBSTR = 0x8C,
114    LEFT = 0x8D,
115    RIGHT = 0x8E,
116
117    // Bitwise operations
118    INVERT = 0x90,
119    AND = 0x91,
120    OR = 0x92,
121    XOR = 0x93,
122    EQUAL = 0x97,
123    NOTEQUAL = 0x98,
124
125    // Arithmetic
126    SIGN = 0x99,
127    ABS = 0x9A,
128    NEGATE = 0x9B,
129    INC = 0x9C,
130    DEC = 0x9D,
131    ADD = 0x9E,
132    SUB = 0x9F,
133    MUL = 0xA0,
134    DIV = 0xA1,
135    MOD = 0xA2,
136    POW = 0xA3,
137    SQRT = 0xA4,
138    MODMUL = 0xA5,
139    MODPOW = 0xA6,
140    SHL = 0xA8,
141    SHR = 0xA9,
142    NOT = 0xAA,
143    BOOLAND = 0xAB,
144    BOOLOR = 0xAC,
145    NZ = 0xB1,
146    NUMEQUAL = 0xB3,
147    NUMNOTEQUAL = 0xB4,
148    LT = 0xB5,
149    LE = 0xB6,
150    GT = 0xB7,
151    GE = 0xB8,
152    MIN = 0xB9,
153    MAX = 0xBA,
154    WITHIN = 0xBB,
155
156    // Compound types
157    PACKMAP = 0xBE,
158    PACKSTRUCT = 0xBF,
159    PACK = 0xC0,
160    UNPACK = 0xC1,
161    NEWARRAY0 = 0xC2,
162    NEWARRAY = 0xC3,
163    NEWARRAY_T = 0xC4,
164    NEWSTRUCT0 = 0xC5,
165    NEWSTRUCT = 0xC6,
166    NEWMAP = 0xC8,
167    SIZE = 0xCA,
168    HASKEY = 0xCB,
169    KEYS = 0xCC,
170    VALUES = 0xCD,
171    PICKITEM = 0xCE,
172    APPEND = 0xCF,
173    SETITEM = 0xD0,
174    REVERSEITEMS = 0xD1,
175    REMOVE = 0xD2,
176    CLEARITEMS = 0xD3,
177    POPITEM = 0xD4,
178
179    // Types
180    ISNULL = 0xD8,
181    ISTYPE = 0xD9,
182    CONVERT = 0xDB,
183    ABORTMSG = 0xE0,
184    ASSERTMSG = 0xE1,
185}