TVM Instructions
This information is very low-level and could be hard to understand for newcomers.
Introduction
This document provides a list of TVM instructions along with their opcodes and mnemonics.
TVM.pdf original concept TON Virtual Machine (may include outdated information).
Fift is a stack-based programming language designed to manage TON smart contracts. The Fift assembler is a Fift library that converts mnemonics of TVM instructions into their binary representation.
A description of Fift, including an introduction to the Fift assembler, can be found here.
This document specifies the corresponding mnemonic for each instruction.
Note the following:
- Fift is a stack-based language, therefore all the arguments of any instruction are written before it (e.g. 5 PUSHINT,s0 s4 XCHG).
- Stack registers are denoted by s0, s1, ..., s15. Other stack registers (up to 255) are denoted byi s()(e.g.100 s()).
- Control registers are denoted by c0, c1, ..., c15.
Gas prices
The gas price of each instruction is specified in this document. The basic gas price of an instruction is 10 + b, where b is the instruction length in bits. Some operations have additional fees:
- Parsing cells: Transforming a cell into a slice costs 100 gas units if the cell is loading for the first time and 25 for subsequent loads during the same transaction. For such instructions, two gas prices are specified (e.g. CTOS:118/43).
- Cell creation: 500 gas units.
- Throwing exceptions: 50 gas units. In this document the exception fee is only specified for an instruction if its primary purpose is to throw (e.g. THROWIF,FITS). If the instruction only throws in some cases, two gas prices are specified (e.g.FITS:26/76).
- Tuple creation: 1 gas unit for every tuple element.
- Implicit jumps: 10 gas units for an implicit jump, 5 gas units for an implicit back jump. This fee is not a part of any instruction.
- Moving stack elements between continuations: 1 gas unit per element, however moving the first 32 elements is free.
Quick search
A full machine-readable list of TVM instructions is available here.
Feel free to use the search field below to find a specific instruction:
| Opcode | Fift syntax | Stack | Description | Gas | 
|---|---|---|---|---|
| Please enter a search query | ||||
| No results found | ||||
2 Stack manipulation primitives
Here 0 <= i,j,k <= 15 if not stated otherwise.
2.1 Basic stack manipulation primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| 00 | NOP | - | Does nothing. | 18 | 
| 01 | SWAP | x y - y x | Same as s1 XCHG0. | 18 | 
| 0i | s[i] XCHG0 | Interchanges s0withs[i],1 <= i <= 15. | 18 | |
| 10ij | s[i] s[j] XCHG | Interchanges s[i]withs[j],1 <= i < j <= 15. | 26 | |
| 11ii | s0 [ii] s() XCHG | Interchanges s0withs[ii],0 <= ii <= 255. | 26 | |
| 1i | s1 s[i] XCHG | Interchanges s1withs[i],2 <= i <= 15. | 18 | |
| 2i | s[i] PUSH | Pushes a copy of the old s[i]into the stack. | 18 | |
| 20 | DUP | x - x x | Same as s0 PUSH. | 18 | 
| 21 | OVER | x y - x y x | Same as s1 PUSH. | 18 | 
| 3i | s[i] POP | Pops the old s0value into the olds[i]. Equivalent tos[i] XCHG0DROP | 18 | |
| 30 | DROP | x - | Same as s0 POP, discards the top-of-stack value. | 18 | 
| 31 | NIP | x y - y | Same as s1 POP. | 18 | 
2.2 Complex stack manipulation primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| 4ijk | s[i] s[j] s[k] XCHG3 | Equivalent to s2 s[i] XCHGs1 s[j] XCHGs[k] XCHG0. | 26 | |
| 50ij | s[i] s[j] XCHG2 | Equivalent to s1 s[i] XCHGs[j] XCHG0. | 26 | |
| 51ij | s[i] s[j] XCPU | Equivalent to s[i] XCHG0s[j] PUSH. | 26 | |
| 52ij | s[i] s[j-1] PUXC | Equivalent to s[i] PUSHSWAPs[j] XCHG0. | 26 | |
| 53ij | s[i] s[j] PUSH2 | Equivalent to s[i] PUSHs[j+1] PUSH. | 26 | |
| 540ijk | s[i] s[j] s[k] XCHG3_l | Long form of XCHG3. | 34 | |
| 541ijk | s[i] s[j] s[k] XC2PU | Equivalent to s[i] s[j] XCHG2s[k] PUSH. | 34 | |
| 542ijk | s[i] s[j] s[k-1] XCPUXC | Equivalent to s1 s[i] XCHGs[j] s[k-1] PUXC. | 34 | |
| 543ijk | s[i] s[j] s[k] XCPU2 | Equivalent to s[i] XCHG0s[j] s[k] PUSH2. | 34 | |
| 544ijk | s[i] s[j-1] s[k-1] PUXC2 | Equivalent to s[i] PUSHs2 XCHG0s[j] s[k] XCHG2. | 34 | |
| 545ijk | s[i] s[j-1] s[k-1] PUXCPU | Equivalent to s[i] s[j-1] PUXCs[k] PUSH. | 34 | |
| 546ijk | s[i] s[j-1] s[k-2] PU2XC | Equivalent to s[i] PUSHSWAPs[j] s[k-1] PUXC. | 34 | |
| 547ijk | s[i] s[j] s[k] PUSH3 | Equivalent to s[i] PUSHs[j+1] s[k+1] PUSH2. | 34 | |
| 55ij | [i+1] [j+1] BLKSWAP | Permutes two blocks s[j+i+1] … s[j+1]ands[j] … s0.0 <= i,j <= 15Equivalent to [i+1] [j+1] REVERSE[j+1] 0 REVERSE[i+j+2] 0 REVERSE. | 26 | |
| 5513 | ROT22ROT | a b c d e f - c d e f a b | Rotates the three topmost pairs of stack entries. | 26 | 
| 550i | [i+1] ROLL | Rotates the top i+1stack entries.Equivalent to 1 [i+1] BLKSWAP. | 26 | |
| 55i0 | [i+1] -ROLL[i+1] ROLLREV | Rotates the top i+1stack entries in the other direction.Equivalent to [i+1] 1 BLKSWAP. | 26 | |
| 56ii | [ii] s() PUSH | Pushes a copy of the old s[ii]into the stack.0 <= ii <= 255 | 26 | |
| 57ii | [ii] s() POP | Pops the old s0value into the olds[ii].0 <= ii <= 255 | 26 | |
| 58 | ROT | a b c - b c a | Equivalent to 1 2 BLKSWAPor tos2 s1 XCHG2. | 18 | 
| 59 | ROTREV-ROT | a b c - c a b | Equivalent to 2 1 BLKSWAPor tos2 s2 XCHG2. | 18 | 
| 5A | SWAP22SWAP | a b c d - c d a b | Equivalent to 2 2 BLKSWAPor tos3 s2 XCHG2. | 18 | 
| 5B | DROP22DROP | a b -  | Equivalent to DROPDROP. | 18 | 
| 5C | DUP22DUP | a b - a b a b | Equivalent to s1 s0 PUSH2. | 18 | 
| 5D | OVER22OVER | a b c d - a b c d a b | Equivalent to s3 s2 PUSH2. | 18 | 
| 5Eij | [i+2] [j] REVERSE | Reverses the order of s[j+i+1] … s[j]. | 26 | |
| 5F0i | [i] BLKDROP | Equivalent to DROPperformeditimes. | 26 | |
| 5Fij | [i] [j] BLKPUSH | Equivalent to PUSH s(j)performeditimes.1 <= i <= 15,0 <= j <= 15. | 26 | |
| 60 | PICKPUSHX | Pops integer ifrom the stack, then performss[i] PUSH. | 18 | |
| 61 | ROLLX | Pops integer ifrom the stack, then performs1 [i] BLKSWAP. | 18 | |
| 62 | -ROLLXROLLREVX | Pops integer ifrom the stack, then performs[i] 1 BLKSWAP. | 18 | |
| 63 | BLKSWX | Pops integers i,jfrom the stack, then performs[i] [j] BLKSWAP. | 18 | |
| 64 | REVX | Pops integers i,jfrom the stack, then performs[i] [j] REVERSE. | 18 | |
| 65 | DROPX | Pops integer ifrom the stack, then performs[i] BLKDROP. | 18 | |
| 66 | TUCK | a b - b a b | Equivalent to SWAPOVERor tos1 s1 XCPU. | 18 | 
| 67 | XCHGX | Pops integer ifrom the stack, then performss[i] XCHG. | 18 | |
| 68 | DEPTH | - depth | Pushes the current depth of the stack. | 18 | 
| 69 | CHKDEPTH | i - | Pops integer ifrom the stack, then checks whether there are at leastielements, generating a stack underflow exception otherwise. | 18/58 | 
| 6A | ONLYTOPX | Pops integer ifrom the stack, then removes all but the topielements. | 18 | |
| 6B | ONLYX | Pops integer ifrom the stack, then leaves only the bottomielements. Approximately equivalent toDEPTHSWAPSUBDROPX. | 18 | |
| 6Cij | [i] [j] BLKDROP2 | Drops istack elements under the topjelements.1 <= i <= 15,0 <= j <= 15Equivalent to [i+j] 0 REVERSE[i] BLKDROP[j] 0 REVERSE. | 26 | 
3 Tuple, List, and Null primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| 6D | NULLPUSHNULL |  - null | Pushes the only value of type Null. | 18 | 
| 6E | ISNULL | x - ? | Checks whether xis a Null, and returns-1or0accordingly. | 18 | 
| 6F0n | [n] TUPLE | x_1 ... x_n - t | Creates a new Tuple t=(x_1, … ,x_n)containingnvaluesx_1,...,x_n.0 <= n <= 15 | 26+n | 
| 6F00 | NIL | - t | Pushes the only Tuple t=()of length zero. | 26 | 
| 6F01 | SINGLE | x - t | Creates a singleton t:=(x), i.e., a Tuple of length one. | 27 | 
| 6F02 | PAIRCONS | x y - t | Creates pair t:=(x,y). | 28 | 
| 6F03 | TRIPLE | x y z - t | Creates triple t:=(x,y,z). | 29 | 
| 6F1k | [k] INDEX | t - x | Returns the k-th element of a Tuplet.0 <= k <= 15. | 26 | 
| 6F10 | FIRSTCAR | t - x | Returns the first element of a Tuple. | 26 | 
| 6F11 | SECONDCDR | t - y | Returns the second element of a Tuple. | 26 | 
| 6F12 | THIRD | t - z | Returns the third element of a Tuple. | 26 | 
| 6F2n | [n] UNTUPLE | t - x_1 ... x_n | Unpacks a Tuple t=(x_1,...,x_n)of length equal to0 <= n <= 15.If tis not a Tuple, or if\|t\| != n, a type check exception is thrown. | 26+n | 
| 6F21 | UNSINGLE | t - x | Unpacks a singleton t=(x). | 27 | 
| 6F22 | UNPAIRUNCONS | t - x y | Unpacks a pair t=(x,y). | 28 | 
| 6F23 | UNTRIPLE | t - x y z | Unpacks a triple t=(x,y,z). | 29 | 
| 6F3k | [k] UNPACKFIRST | t - x_1 ... x_k | Unpacks first 0 <= k <= 15elements of a Tuplet.If \|t\|<k, throws a type check exception. | 26+k | 
| 6F30 | CHKTUPLE | t - | Checks whether tis a Tuple. If not, throws a type check exception. | 26 | 
| 6F4n | [n] EXPLODE | t - x_1 ... x_m m | Unpacks a Tuple t=(x_1,...,x_m)and returns its lengthm, but only ifm <= n <= 15. Otherwise throws a type check exception. | 26+m | 
| 6F5k | [k] SETINDEX | t x - t' | Computes Tuple t'that differs fromtonly at positiont'_{k+1}, which is set tox.0 <= k <= 15If k >= \|t\|, throws a range check exception. | 26+\|t\| | 
| 6F50 | SETFIRST | t x - t' | Sets the first component of Tuple ttoxand returns the resulting Tuplet'. | 26+\|t\| | 
| 6F51 | SETSECOND | t x - t' | Sets the second component of Tuple ttoxand returns the resulting Tuplet'. | 26+\|t\| | 
| 6F52 | SETTHIRD | t x - t' | Sets the third component of Tuple ttoxand returns the resulting Tuplet'. | 26+\|t\| | 
| 6F6k | [k] INDEXQ | t - x | Returns the k-th element of a Tuplet, where0 <= k <= 15. In other words, returnsx_{k+1}ift=(x_1,...,x_n). Ifk>=n, or iftis Null, returns a Null instead ofx. | 26 | 
| 6F60 | FIRSTQCARQ | t - x | Returns the first element of a Tuple. | 26 | 
| 6F61 | SECONDQCDRQ | t - y | Returns the second element of a Tuple. | 26 | 
| 6F62 | THIRDQ | t - z | Returns the third element of a Tuple. | 26 | 
| 6F7k | [k] SETINDEXQ | t x - t' | Sets the k-th component of Tuplettox, where0 <= k < 16, and returns the resulting Tuplet'.If \|t\| <= k, first extends the original Tuple to lengthn’=k+1by setting all new components to Null. If the original value oftis Null, treats it as an empty Tuple. Iftis not Null or Tuple, throws an exception. Ifxis Null and either\|t\| <= kortis Null, then always returnst'=t(and does not consume tuple creation gas). | 26+\|t’\| | 
| 6F70 | SETFIRSTQ | t x - t' | Sets the first component of Tuple ttoxand returns the resulting Tuplet'. | 26+\|t’\| | 
| 6F71 | SETSECONDQ | t x - t' | Sets the second component of Tuple ttoxand returns the resulting Tuplet'. | 26+\|t’\| | 
| 6F72 | SETTHIRDQ | t x - t' | Sets the third component of Tuple ttoxand returns the resulting Tuplet'. | 26+\|t’\| | 
| 6F80 | TUPLEVAR | x_1 ... x_n n - t | Creates a new Tuple tof lengthnsimilarly toTUPLE, but with0 <= n <= 255taken from the stack. | 26+n | 
| 6F81 | INDEXVAR | t k - x | Similar to k INDEX, but with0 <= k <= 254taken from the stack. | 26 | 
| 6F82 | UNTUPLEVAR | t n - x_1 ... x_n | Similar to n UNTUPLE, but with0 <= n <= 255taken from the stack. | 26+n | 
| 6F83 | UNPACKFIRSTVAR | t n - x_1 ... x_n | Similar to n UNPACKFIRST, but with0 <= n <= 255taken from the stack. | 26+n | 
| 6F84 | EXPLODEVAR | t n - x_1 ... x_m m | Similar to n EXPLODE, but with0 <= n <= 255taken from the stack. | 26+m | 
| 6F85 | SETINDEXVAR | t x k - t' | Similar to k SETINDEX, but with0 <= k <= 254taken from the stack. | 26+\|t’\| | 
| 6F86 | INDEXVARQ | t k - x | Similar to n INDEXQ, but with0 <= k <= 254taken from the stack. | 26 | 
| 6F87 | SETINDEXVARQ | t x k - t' | Similar to k SETINDEXQ, but with0 <= k <= 254taken from the stack. | 26+\|t’\| | 
| 6F88 | TLEN | t - n | Returns the length of a Tuple. | 26 | 
| 6F89 | QTLEN | t - n or -1 | Similar to TLEN, but returns-1iftis not a Tuple. | 26 | 
| 6F8A | ISTUPLE | t - ? | Returns -1or0depending on whethertis a Tuple. | 26 | 
| 6F8B | LAST | t - x | Returns the last element of a non-empty Tuple t. | 26 | 
| 6F8C | TPUSHCOMMA | t x - t' | Appends a value xto a Tuplet=(x_1,...,x_n), but only if the resulting Tuplet'=(x_1,...,x_n,x)is of length at most 255. Otherwise throws a type check exception. | 26+\|t’\| | 
| 6F8D | TPOP | t - t' x | Detaches the last element x=x_nfrom a non-empty Tuplet=(x_1,...,x_n), and returns both the resulting Tuplet'=(x_1,...,x_{n-1})and the original last elementx. | 26+\|t’\| | 
| 6FA0 | NULLSWAPIF | x - x or null x | Pushes a Null under the topmost Integer x, but only ifx!=0. | 26 | 
| 6FA1 | NULLSWAPIFNOT | x - x or null x | Pushes a Null under the topmost Integer x, but only ifx=0. May be used for stack alignment after quiet primitives such asPLDUXQ. | 26 | 
| 6FA2 | NULLROTRIF | x y - x y or null x y | Pushes a Null under the second stack entry from the top, but only if the topmost Integer yis non-zero. | 26 | 
| 6FA3 | NULLROTRIFNOT | x y - x y or null x y | Pushes a Null under the second stack entry from the top, but only if the topmost Integer yis zero. May be used for stack alignment after quiet primitives such asLDUXQ. | 26 | 
| 6FA4 | NULLSWAPIF2 | x - x or null null x | Pushes two nulls under the topmost Integer x, but only ifx!=0.Equivalent to NULLSWAPIFNULLSWAPIF. | 26 | 
| 6FA5 | NULLSWAPIFNOT2 | x - x or null null x | Pushes two nulls under the topmost Integer x, but only ifx=0.Equivalent to NULLSWAPIFNOTNULLSWAPIFNOT. | 26 | 
| 6FA6 | NULLROTRIF2 | x y - x y or null null x y | Pushes two nulls under the second stack entry from the top, but only if the topmost Integer yis non-zero.Equivalent to NULLROTRIFNULLROTRIF. | 26 | 
| 6FA7 | NULLROTRIFNOT2 | x y - x y or null null x y | Pushes two nulls under the second stack entry from the top, but only if the topmost Integer yis zero.Equivalent to NULLROTRIFNOTNULLROTRIFNOT. | 26 | 
| 6FBij | [i] [j] INDEX2 | t - x | Recovers x=(t_{i+1})_{j+1}for0 <= i,j <= 3.Equivalent to [i] INDEX[j] INDEX. | 26 | 
| 6FB4 | CADR | t - x | Recovers x=(t_2)_1. | 26 | 
| 6FB5 | CDDR | t - x | Recovers x=(t_2)_2. | 26 | 
| 6FE_ijk | [i] [j] [k] INDEX3 | t - x | Recovers x=t_{i+1}_{j+1}_{k+1}.0 <= i,j,k <= 3Equivalent to [i] [j] INDEX2[k] INDEX. | 26 | 
| 6FD4 | CADDR | t - x | Recovers x=t_2_2_1. | 26 | 
| 6FD5 | CDDDR | t - x | Recovers x=t_2_2_2. | 26 | 
4 Constant or literal primitives
4.1 Integer and boolean constants
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| 7i | [x] PUSHINT[x] INT | - x | Pushes integer xinto the stack.-5 <= x <= 10.Here iequals four lower-order bits ofx(i=x mod 16). | 18 | 
| 70 | ZEROFALSE | - 0 | 18 | |
| 71 | ONE | - 1 | 18 | |
| 72 | TWO | - 2 | 18 | |
| 7A | TEN | - 10 | 18 | |
| 7F | TRUE | - -1 | 18 | |
| 80xx | [xx] PUSHINT[xx] INT | - xx | Pushes integer xx.-128 <= xx <= 127. | 26 | 
| 81xxxx | [xxxx] PUSHINT[xxxx] INT | - xxxx | Pushes integer xxxx.-2^15 <= xx < 2^15. | 34 | 
| 82lxxx | [xxx] PUSHINT[xxx] INT | - xxx | Pushes integer xxx.Details: 5-bit 0 <= l <= 30determines the lengthn=8l+19of signed big-endian integerxxx.The total length of this instruction is l+4bytes orn+13=8l+32bits. | 23 | 
| 83xx | [xx+1] PUSHPOW2 | - 2^(xx+1) | (Quietly) pushes 2^(xx+1)for0 <= xx <= 255.2^256is aNaN. | 26 | 
| 83FF | PUSHNAN | - NaN | Pushes a NaN. | 26 | 
| 84xx | [xx+1] PUSHPOW2DEC | - 2^(xx+1)-1 | Pushes 2^(xx+1)-1for0 <= xx <= 255. | 26 | 
| 85xx | [xx+1] PUSHNEGPOW2 | - -2^(xx+1) | Pushes -2^(xx+1)for0 <= xx <= 255. | 26 | 
4.2 Constant slices, continuations, cells, and references
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| 88 | [ref] PUSHREF | - c | Pushes the reference refinto the stack.Details: Pushes the first reference of cc.codeinto the stack as a Cell (and removes this reference from the current continuation). | 18 | 
| 89 | [ref] PUSHREFSLICE | - s | Similar to PUSHREF, but converts the cell into a Slice. | 118/43 | 
| 8A | [ref] PUSHREFCONT | - cont | Similar to PUSHREFSLICE, but makes a simple ordinary Continuation out of the cell. | 118/43 | 
| 8Bxsss | [slice] PUSHSLICE[slice] SLICE | - s | Pushes the slice sliceinto the stack.Details: Pushes the (prefix) subslice of cc.codeconsisting of its first8x+4bits and no references (i.e., essentially a bitstring), where0 <= x <= 15.A completion tag is assumed, meaning that all trailing zeroes and the last binary one (if present) are removed from this bitstring. If the original bitstring consists only of zeroes, an empty slice will be pushed. | 22 | 
| 8Crxxssss | [slice] PUSHSLICE[slice] SLICE | - s | Pushes the slice sliceinto the stack.Details: Pushes the (prefix) subslice of cc.codeconsisting of its first1 <= r+1 <= 4references and up to first8xx+1bits of data, with0 <= xx <= 31.A completion tag is also assumed. | 25 | 
| 8Drxxsssss | [slice] PUSHSLICE[slice] SLICE | - s | Pushes the slice sliceinto the stack.Details: Pushes the subslice of cc.codeconsisting of0 <= r <= 4references and up to8xx+6bits of data, with0 <= xx <= 127.A completion tag is assumed. | 28 | 
| x{} PUSHSLICEx{ABCD1234} PUSHSLICEb{01101} PUSHSLICE | - s | Examples of PUSHSLICE.x{}is an empty slice.x{...}is a hexadecimal literal.b{...}is a binary literal.More on slice literals here. Note that the assembler can replace PUSHSLICEwithPUSHREFSLICEin certain situations (e.g. if there’s not enough space in the current continuation). | ||
| <b x{AB12} s, b> PUSHREF<b x{AB12} s, b> PUSHREFSLICE | - c/s | Examples of PUSHREFandPUSHREFSLICE.More on building cells in fift here. | ||
| 8F_rxxcccc | [builder] PUSHCONT[builder] CONT | - c | Pushes a continuation made from builder.Details: Pushes the simple ordinary continuation ccccmade from the first0 <= r <= 3references and the first0 <= xx <= 127bytes ofcc.code. | 26 | 
| 9xccc | [builder] PUSHCONT[builder] CONT | - c | Pushes a continuation made from builder.Details: Pushes an x-byte continuation for0 <= x <= 15. | 18 | 
| <{ code }> PUSHCONT<{ code }> CONTCONT:<{ code }> | - c | Pushes a continuation with code code.Note that the assembler can replace PUSHCONTwithPUSHREFCONTin certain situations (e.g. if there’s not enough space in the current continuation). | 
5 Arithmetic primitives
5.1 Addition, subtraction, multiplication
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| A0 | ADD | x y - x+y | 18 | |
| A1 | SUB | x y - x-y | 18 | |
| A2 | SUBR | x y - y-x | Equivalent to SWAPSUB. | 18 | 
| A3 | NEGATE | x - -x | Equivalent to -1 MULCONSTor toZERO SUBR.Notice that it triggers an integer overflow exception if x=-2^256. | 18 | 
| A4 | INC | x - x+1 | Equivalent to 1 ADDCONST. | 18 | 
| A5 | DEC | x - x-1 | Equivalent to -1 ADDCONST. | 18 | 
| A6cc | [cc] ADDCONST[cc] ADDINT[-cc] SUBCONST[-cc] SUBINT | x - x+cc | -128 <= cc <= 127. | 26 | 
| A7cc | [cc] MULCONST[cc] MULINT | x - x*cc | -128 <= cc <= 127. | 26 | 
| A8 | MUL | x y - x*y | 18 | 
5.2 Division
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| A9mscdf | This is the general encoding of division, with an optional pre-multiplication and an optional replacement of the division or multiplication by a shift. Variable fields are as follows: 0 <= m <= 1-  Indicates whether there is pre-multiplication (MULDIVand its variants), possibly replaced by a left shift.0 <= s <= 2-  Indicates whether either the multiplication or the division have been replaced by shifts:s=0- no replacement,s=1- division replaced by a right shift,s=2- multiplication replaced by a left shift (possible only form=1).0 <= c <= 1-  Indicates whether there is a constant one-byte argumentttfor the shift operator (ifs!=0). Fors=0,c=0. Ifc=1, then0 <= tt <= 255, and the shift is performed bytt+1bits. Ifs!=0andc=0, then the shift amount is provided to the instruction as a top-of-stack Integer in range0...256.1 <= d <= 3-  Indicates which results of division are required:1- only the quotient,2- only the remainder,3- both.0 <= f <= 2-  Rounding mode:0- floor,1- nearest integer,2- ceiling.All instructions below are variants of this. | 26 | ||
| A904 | DIV | x y - q | q=floor(x/y),r=x-y*q | 26 | 
| A905 | DIVR | x y - q’ | q’=round(x/y),r’=x-y*q’ | 26 | 
| A906 | DIVC | x y - q'' | q’’=ceil(x/y),r’’=x-y*q’’ | 26 | 
| A908 | MOD | x y - r | 26 | |
| A90C | DIVMOD | x y - q r | 26 | |
| A90D | DIVMODR | x y - q' r' | 26 | |
| A90E | DIVMODC | x y - q'' r'' | 26 | |
| A925 | RSHIFTR | x y - round(x/2^y) | 26 | |
| A926 | RSHIFTC | x y - ceil(x/2^y) | 34 | |
| A935tt | [tt+1] RSHIFTR# | x y - round(x/2^(tt+1)) | 34 | |
| A936tt | [tt+1] RSHIFTC# | x y - ceil(x/2^(tt+1)) | 34 | |
| A938tt | [tt+1] MODPOW2# | x - x mod 2^(tt+1) | 34 | |
| A98 | MULDIV | x y z - q | q=floor(x*y/z) | 26 | 
| A985 | MULDIVR | x y z - q' | q'=round(x*y/z) | 26 | 
| A98C | MULDIVMOD | x y z - q r | q=floor(x*y/z),r=x*y-z*q | 26 | 
| A9A4 | MULRSHIFT | x y z - floor(x*y/2^z) | 0 <= z <= 256 | 26 | 
| A9A5 | MULRSHIFTR | x y z - round(x*y/2^z) | 0 <= z <= 256 | 26 | 
| A9A6 | MULRSHIFTC | x y z - ceil(x*y/2^z) | 0 <= z <= 256 | 34 | 
| A9B4tt | [tt+1] MULRSHIFT# | x y - floor(x*y/2^(tt+1)) | 34 | |
| A9B5tt | [tt+1] MULRSHIFTR# | x y - round(x*y/2^(tt+1)) | 34 | |
| A9B6tt | [tt+1] MULRSHIFTC# | x y - ceil(x*y/2^(tt+1)) | 26 | |
| A9C4 | LSHIFTDIV | x y z - floor(2^z*x/y) | 0 <= z <= 256 | 26 | 
| A9C5 | LSHIFTDIVR | x y z - round(2^z*x/y) | 0 <= z <= 256 | 26 | 
| A9C6 | LSHIFTDIVC | x y z - ceil(2^z*x/y) | 0 <= z <= 256 | 34 | 
| A9D4tt | [tt+1] LSHIFT#DIV | x y - floor(2^(tt+1)*x/y) | 34 | |
| A9D5tt | [tt+1] LSHIFT#DIVR | x y - round(2^(tt+1)*x/y) | 34 | |
| A9D6tt | [tt+1] LSHIFT#DIVC | x y - ceil(2^(tt+1)*x/y) | 26 | 
5.3 Shifts, logical operations
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| AAcc | [cc+1] LSHIFT# | x - x*2^(cc+1) | 0 <= cc <= 255 | 26 | 
| ABcc | [cc+1] RSHIFT# | x - floor(x/2^(cc+1)) | 0 <= cc <= 255 | 18 | 
| AC | LSHIFT | x y - x*2^y | 0 <= y <= 1023 | 18 | 
| AD | RSHIFT | x y - floor(x/2^y) | 0 <= y <= 1023 | 18 | 
| AE | POW2 | y - 2^y | 0 <= y <= 1023Equivalent to ONESWAPLSHIFT. | 18 | 
| B0 | AND | x y - x&y | Bitwise and of two signed integers xandy, sign-extended to infinity. | 18 | 
| B1 | OR | x y - x\|y | Bitwise or of two integers. | 18 | 
| B2 | XOR | x y - x xor y | Bitwise xor of two integers. | 18 | 
| B3 | NOT | x - ~x | Bitwise not of an integer. | 26 | 
| B4cc | [cc+1] FITS | x - x | Checks whether xis acc+1-bit signed integer for0 <= cc <= 255(i.e., whether-2^cc <= x < 2^cc).If not, either triggers an integer overflow exception, or replaces xwith aNaN(quiet version). | 26/76 | 
| B400 | CHKBOOL | x - x | Checks whether xis a “boolean value'' (i.e., either 0 or -1). | 26/76 | 
| B5cc | [cc+1] UFITS | x - x | Checks whether xis acc+1-bit unsigned integer for0 <= cc <= 255(i.e., whether0 <= x < 2^(cc+1)). | 26/76 | 
| B500 | CHKBIT | x - x | Checks whether xis a binary digit (i.e., zero or one). | 26/76 | 
| B600 | FITSX | x c - x | Checks whether xis ac-bit signed integer for0 <= c <= 1023. | 26/76 | 
| B601 | UFITSX | x c - x | Checks whether xis ac-bit unsigned integer for0 <= c <= 1023. | 26/76 | 
| B602 | BITSIZE | x - c | Computes smallest c >= 0such thatxfits into ac-bit signed integer (-2^(c-1) <= c < 2^(c-1)). | 26 | 
| B603 | UBITSIZE | x - c | Computes smallest c >= 0such thatxfits into ac-bit unsigned integer (0 <= x < 2^c), or throws a range check exception. | 26 | 
| B608 | MIN | x y - x or y | Computes the minimum of two integers xandy. | 26 | 
| B609 | MAX | x y - x or y | Computes the maximum of two integers xandy. | 26 | 
| B60A | MINMAXINTSORT2 | x y - x y or y x | Sorts two integers. Quiet version of this operation returns two NaNs if any of the arguments areNaNs. | 26 | 
| B60B | ABS | x - \|x\| | Computes the absolute value of an integer x. | 26 | 
5.4 Quiet arithmetic primitives
Quiet operations return NaN instead of throwing exceptions if one of their arguments is a NaN or in the case of an integer overflow.
Quiet operations have a prefix Q as shown below. Another way to make an operation quiet is to add QUIET before it (i.e. one can write QUIET ADD instead of QADD).
Quiet versions of integer comparison primitives are also available (QUIET SGN, QUIET LESS etc).
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| B7A0 | QADD | x y - x+y | 26 | |
| B7A1 | QSUB | x y - x-y | 26 | |
| B7A2 | QSUBR | x y - y-x | 26 | |
| B7A3 | QNEGATE | x - -x | 26 | |
| B7A4 | QINC | x - x+1 | 26 | |
| B7A5 | QDEC | x - x-1 | 26 | |
| B7A8 | QMUL | x y - x*y | 26 | |
| B7A904 | QDIV | x y - q | Division returns NaNify=0. | 34 | 
| B7A905 | QDIVR | x y - q’ | 34 | |
| B7A906 | QDIVC | x y - q'' | 34 | |
| B7A908 | QMOD | x y - r | 34 | |
| B7A90C | QDIVMOD | x y - q r | 34 | |
| B7A90D | QDIVMODR | x y - q' r' | 34 | |
| B7A90E | QDIVMODC | x y - q'' r'' | 34 | |
| B7A985 | QMULDIVR | x y z - q' | 34 | |
| B7A98C | QMULDIVMOD | x y z - q r | 34 | |
| B7AC | QLSHIFT | x y - x*2^y | 26 | |
| B7AD | QRSHIFT | x y - floor(x/2^y) | 26 | |
| B7AE | QPOW2 | y - 2^y | 26 | |
| B7B0 | QAND | x y - x&y | 26 | |
| B7B1 | QOR | x y - x\|y | 26 | |
| B7B2 | QXOR | x y - x xor y | 26 | |
| B7B3 | QNOT | x - ~x | 26 | |
| B7B4cc | [cc+1] QFITS | x - x | Replaces xwith aNaNif x is not acc+1-bit signed integer, leaves it intact otherwise. | 34 | 
| B7B5cc | [cc+1] QUFITS | x - x | Replaces xwith aNaNif x is not acc+1-bit unsigned integer, leaves it intact otherwise. | 34 | 
| B7B600 | QFITSX | x c - x | Replaces xwith aNaNif x is not a c-bit signed integer, leaves it intact otherwise. | 34 | 
| B7B601 | QUFITSX | x c - x | Replaces xwith aNaNif x is not a c-bit unsigned integer, leaves it intact otherwise. | 34 | 
6 Comparison primitives
6.1 Integer comparison
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| B8 | SGN | x - sgn(x) | Computes the sign of an integer x:-1ifx<0,0ifx=0,1ifx>0. | 18 | 
| B9 | LESS | x y - x<y | Returns -1ifx<y,0otherwise. | 18 | 
| BA | EQUAL | x y - x=y | Returns -1ifx=y,0otherwise. | 18 | 
| BB | LEQ | x y - x<=y | 18 | |
| BC | GREATER | x y - x>y | 18 | |
| BD | NEQ | x y - x!=y | Equivalent to EQUALNOT. | 18 | 
| BE | GEQ | x y - x>=y | Equivalent to LESSNOT. | 18 | 
| BF | CMP | x y - sgn(x-y) | Computes the sign of x-y:-1ifx<y,0ifx=y,1ifx>y.No integer overflow can occur here unless xoryis aNaN. | 18 | 
| C0yy | [yy] EQINT | x - x=yy | Returns -1ifx=yy,0otherwise.-2^7 <= yy < 2^7. | 26 | 
| C000 | ISZERO | x - x=0 | Checks whether an integer is zero. Corresponds to Forth's 0=. | 26 | 
| C1yy | [yy] LESSINT[yy-1] LEQINT | x - x<yy | Returns -1ifx<yy,0otherwise.-2^7 <= yy < 2^7. | 26 | 
| C100 | ISNEG | x - x<0 | Checks whether an integer is negative. Corresponds to Forth's 0<. | 26 | 
| C101 | ISNPOS | x - x<=0 | Checks whether an integer is non-positive. | 26 | 
| C2yy | [yy] GTINT[yy+1] GEQINT | x - x>yy | Returns -1ifx>yy,0otherwise.-2^7 <= yy < 2^7. | 26 | 
| C200 | ISPOS | x - x>0 | Checks whether an integer is positive. Corresponds to Forth's 0>. | 26 | 
| C2FF | ISNNEG | x - x >=0 | Checks whether an integer is non-negative. | 26 | 
| C3yy | [yy] NEQINT | x - x!=yy | Returns -1ifx!=yy,0otherwise.-2^7 <= yy < 2^7. | 26 | 
| C4 | ISNAN | x - x=NaN | Checks whether xis aNaN. | 18 | 
| C5 | CHKNAN | x - x | Throws an arithmetic overflow exception if xis aNaN. | 18/68 | 
6.2 Other comparison
Most of these "other comparison" primitives actually compare the data portions of Slices as bitstrings (ignoring references if not stated otherwise).
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| C700 | SEMPTY | s - ? | Checks whether a Slice sis empty (i.e., contains no bits of data and no cell references). | 26 | 
| C701 | SDEMPTY | s - ? | Checks whether Slice shas no bits of data. | 26 | 
| C702 | SREMPTY | s - ? | Checks whether Slice shas no references. | 26 | 
| C703 | SDFIRST | s - ? | Checks whether the first bit of Slice sis a one. | 26 | 
| C704 | SDLEXCMP | s s' - x | Compares the data of slexicographically with the data ofs', returning-1, 0, or 1 depending on the result. | 26 | 
| C705 | SDEQ | s s' - ? | Checks whether the data parts of sands'coincide, equivalent toSDLEXCMPISZERO. | 26 | 
| C708 | SDPFX | s s' - ? | Checks whether sis a prefix ofs'. | 26 | 
| C709 | SDPFXREV | s s' - ? | Checks whether s'is a prefix ofs, equivalent toSWAPSDPFX. | 26 | 
| C70A | SDPPFX | s s' - ? | Checks whether sis a proper prefix ofs'(i.e., a prefix distinct froms'). | 26 | 
| C70B | SDPPFXREV | s s' - ? | Checks whether s'is a proper prefix ofs. | 26 | 
| C70C | SDSFX | s s' - ? | Checks whether sis a suffix ofs'. | 26 | 
| C70D | SDSFXREV | s s' - ? | Checks whether s'is a suffix ofs. | 26 | 
| C70E | SDPSFX | s s' - ? | Checks whether sis a proper suffix ofs'. | 26 | 
| C70F | SDPSFXREV | s s' - ? | Checks whether s'is a proper suffix ofs. | 26 | 
| C710 | SDCNTLEAD0 | s - n | Returns the number of leading zeroes in s. | 26 | 
| C711 | SDCNTLEAD1 | s - n | Returns the number of leading ones in s. | 26 | 
| C712 | SDCNTTRAIL0 | s - n | Returns the number of trailing zeroes in s. | 26 | 
| C713 | SDCNTTRAIL1 | s - n | Returns the number of trailing ones in s. | 26 | 
7 Cell primitives
7.1 Cell serialization primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| C8 | NEWC | - b | Creates a new empty Builder. | 18 | 
| C9 | ENDC | b - c | Converts a Builder into an ordinary Cell. | 518 | 
| CAcc | [cc+1] STI | x b - b' | Stores a signed cc+1-bit integerxinto Builderbfor0 <= cc <= 255, throws a range check exception ifxdoes not fit intocc+1bits. | 26 | 
| CBcc | [cc+1] STU | x b - b' | Stores an unsigned cc+1-bit integerxinto Builderb. In all other respects it is similar toSTI. | 26 | 
| CC | STREF | c b - b' | Stores a reference to Cell cinto Builderb. | 18 | 
| CD | STBREFRENDCST | b b'' - b | Equivalent to ENDCSWAPSTREF. | 518 | 
| CE | STSLICE | s b - b' | Stores Slice sinto Builderb. | 18 | 
| CF00 | STIX | x b l - b' | Stores a signed l-bit integerxintobfor0 <= l <= 257. | 26 | 
| CF01 | STUX | x b l - b' | Stores an unsigned l-bit integerxintobfor0 <= l <= 256. | 26 | 
| CF02 | STIXR | b x l - b' | Similar to STIX, but with arguments in a different order. | 26 | 
| CF03 | STUXR | b x l - b' | Similar to STUX, but with arguments in a different order. | 26 | 
| CF04 | STIXQ | x b l - x b f or b' 0 | A quiet version of STIX. If there is no space inb, setsb'=bandf=-1.If xdoes not fit intolbits, setsb'=bandf=1.If the operation succeeds, b'is the new Builder andf=0.However, 0 <= l <= 257, with a range check exception if this is not so. | 26 | 
| CF05 | STUXQ | x b l - x b f or b' 0 | A quiet version of STUX. | 26 | 
| CF06 | STIXRQ | b x l - b x f or b' 0 | A quiet version of STIXR. | 26 | 
| CF07 | STUXRQ | b x l - b x f or b' 0 | A quiet version of STUXR. | 26 | 
| CF08cc | [cc+1] STI_l | x b - b' | A longer version of [cc+1] STI. | 34 | 
| CF09cc | [cc+1] STU_l | x b - b' | A longer version of [cc+1] STU. | 34 | 
| CF0Acc | [cc+1] STIR | b x - b' | Equivalent to SWAP[cc+1] STI. | 34 | 
| CF0Bcc | [cc+1] STUR | b x - b' | Equivalent to SWAP[cc+1] STU. | 34 | 
| CF0Ccc | [cc+1] STIQ | x b - x b f or b' 0 | A quiet version of STI. | 34 | 
| CF0Dcc | [cc+1] STUQ | x b - x b f or b' 0 | A quiet version of STU. | 34 | 
| CF0Ecc | [cc+1] STIRQ | b x - b x f or b' 0 | A quiet version of STIR. | 34 | 
| CF0Fcc | [cc+1] STURQ | b x - b x f or b' 0 | A quiet version of STUR. | 34 | 
| CF10 | STREF_l | c b - b' | A longer version of STREF. | 26 | 
| CF11 | STBREF | b' b - b'' | Equivalent to SWAPSTBREFR. | 526 | 
| CF12 | STSLICE_l | s b - b' | A longer version of STSLICE. | 26 | 
| CF13 | STB | b' b - b'' | Appends all data from Builder b'to Builderb. | 26 | 
| CF14 | STREFR | b c - b' | Equivalent to SWAPSTREF. | 26 | 
| CF15 | STBREFR_l | b b' - b'' | A longer encoding of STBREFR. | 526 | 
| CF16 | STSLICER | b s - b' | Equivalent to SWAPSTSLICE. | 26 | 
| CF17 | STBRBCONCAT | b b' - b'' | Concatenates two builders. Equivalent to SWAPSTB. | 26 | 
| CF18 | STREFQ | c b - c b -1 or b' 0 | Quiet version of STREF. | 26 | 
| CF19 | STBREFQ | b' b - b' b -1 or b'' 0 | Quiet version of STBREF. | 526 | 
| CF1A | STSLICEQ | s b - s b -1 or b' 0 | Quiet version of STSLICE. | 26 | 
| CF1B | STBQ | b' b - b' b -1 or b'' 0 | Quiet version of STB. | 26 | 
| CF1C | STREFRQ | b c - b c -1 or b' 0 | Quiet version of STREFR. | 26 | 
| CF1D | STBREFRQ | b b' - b b' -1 or b'' 0 | Quiet version of STBREFR. | 526 | 
| CF1E | STSLICERQ | b s - b s -1 or b'' 0 | Quiet version of STSLICER. | 26 | 
| CF1F | STBRQBCONCATQ | b b' - b b' -1 or b'' 0 | Quiet version of STBR. | 26 | 
| CF20 | [ref] STREFCONST | b - b’ | Equivalent to PUSHREFSTREFR. | 26 | 
| CF21 | [ref] [ref] STREF2CONST | b - b’ | Equivalent to STREFCONSTSTREFCONST. | 26 | 
| CF23 | b x - c | If x!=0, creates a special or exotic cell from Builderb.The type of the exotic cell must be stored in the first 8 bits of b.If x=0, it is equivalent toENDC. Otherwise some validity checks on the data and references ofbare performed before creating the exotic cell. | 526 | |
| CF28 | STILE4 | x b - b' | Stores a little-endian signed 32-bit integer. | 26 | 
| CF29 | STULE4 | x b - b' | Stores a little-endian unsigned 32-bit integer. | 26 | 
| CF2A | STILE8 | x b - b' | Stores a little-endian signed 64-bit integer. | 26 | 
| CF2B | STULE8 | x b - b' | Stores a little-endian unsigned 64-bit integer. | 26 | 
| CF30 | BDEPTH | b - x | Returns the depth of Builder b. If no cell references are stored inb, thenx=0; otherwisexis one plus the maximum of depths of cells referred to fromb. | 26 | 
| CF31 | BBITS | b - x | Returns the number of data bits already stored in Builder b. | 26 | 
| CF32 | BREFS | b - y | Returns the number of cell references already stored in b. | 26 | 
| CF33 | BBITREFS | b - x y | Returns the numbers of both data bits and cell references in b. | 26 | 
| CF35 | BREMBITS | b - x' | Returns the number of data bits that can still be stored in b. | 26 | 
| CF36 | BREMREFS | b - y' | Returns the number of references that can still be stored in b. | 26 | 
| CF37 | BREMBITREFS | b - x' y' | Returns the numbers of both data bits and references that can still be stored in b. | 26 | 
| CF38cc | [cc+1] BCHKBITS# | b - | Checks whether cc+1bits can be stored intob, where0 <= cc <= 255. | 34/84 | 
| CF39 | BCHKBITS | b x -  | Checks whether xbits can be stored intob,0 <= x <= 1023. If there is no space forxmore bits inb, or ifxis not within the range0...1023, throws an exception. | 26/76 | 
| CF3A | BCHKREFS | b y -  | Checks whether yreferences can be stored intob,0 <= y <= 7. | 26/76 | 
| CF3B | BCHKBITREFS | b x y -  | Checks whether xbits andyreferences can be stored intob,0 <= x <= 1023,0 <= y <= 7. | 26/76 | 
| CF3Ccc | [cc+1] BCHKBITSQ# | b - ? | Checks whether cc+1bits can be stored intob, where0 <= cc <= 255. | 34 | 
| CF3D | BCHKBITSQ | b x - ? | Checks whether xbits can be stored intob,0 <= x <= 1023. | 26 | 
| CF3E | BCHKREFSQ | b y - ? | Checks whether yreferences can be stored intob,0 <= y <= 7. | 26 | 
| CF3F | BCHKBITREFSQ | b x y - ? | Checks whether xbits andyreferences can be stored intob,0 <= x <= 1023,0 <= y <= 7. | 26 | 
| CF40 | STZEROES | b n - b' | Stores nbinary zeroes into Builderb. | 26 | 
| CF41 | STONES | b n - b' | Stores nbinary ones into Builderb. | 26 | 
| CF42 | STSAME | b n x - b' | Stores nbinaryxes (0 <= x <= 1) into Builderb. | 26 | 
| CFC0_xysss | [slice] STSLICECONST | b - b' | Stores a constant subslice sss.Details: sssconsists of0 <= x <= 3references and up to8y+2data bits, with0 <= y <= 7. Completion bit is assumed.Note that the assembler can replace STSLICECONSTwithPUSHSLICESTSLICERif the slice is too big. | 24 | 
| CF81 | STZERO | b - b' | Stores one binary zero. | 24 | 
| CF83 | STONE | b - b' | Stores one binary one. | 24 | 
7.2 Cell deserialization primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| D0 | CTOS | c - s | Converts a Cell into a Slice. Notice that cmust be either an ordinary cell, or an exotic cell which is automatically loaded to yield an ordinary cellc', converted into a Slice afterwards. | 118/43 | 
| D1 | ENDS | s -  | Removes a Slice sfrom the stack, and throws an exception if it is not empty. | 18/68 | 
| D2cc | [cc+1] LDI | s - x s' | Loads (i.e., parses) a signed cc+1-bit integerxfrom Slices, and returns the remainder ofsass'. | 26 | 
| D3cc | [cc+1] LDU | s - x s' | Loads an unsigned cc+1-bit integerxfrom Slices. | 26 | 
| D4 | LDREF | s - c s' | Loads a cell reference cfroms. | 18 | 
| D5 | LDREFRTOS | s - s' s'' | Equivalent to LDREFSWAPCTOS. | 118/43 | 
| D6cc | [cc+1] LDSLICE | s - s'' s' | Cuts the next cc+1bits ofsinto a separate Slices''. | 26 | 
| D700 | LDIX | s l - x s' | Loads a signed l-bit (0 <= l <= 257) integerxfrom Slices, and returns the remainder ofsass'. | 26 | 
| D701 | LDUX | s l - x s' | Loads an unsigned l-bit integerxfrom (the firstlbits of)s, with0 <= l <= 256. | 26 | 
| D702 | PLDIX | s l - x | Preloads a signed l-bit integer from Slices, for0 <= l <= 257. | 26 | 
| D703 | PLDUX | s l - x | Preloads an unsigned l-bit integer froms, for0 <= l <= 256. | 26 | 
| D704 | LDIXQ | s l - x s' -1 or s 0 | Quiet version of LDIX: loads a signedl-bit integer fromssimilarly toLDIX, but returns a success flag, equal to-1on success or to0on failure (ifsdoes not havelbits), instead of throwing a cell underflow exception. | 26 | 
| D705 | LDUXQ | s l - x s' -1 or s 0 | Quiet version of LDUX. | 26 | 
| D706 | PLDIXQ | s l - x -1 or 0 | Quiet version of PLDIX. | 26 | 
| D707 | PLDUXQ | s l - x -1 or 0 | Quiet version of PLDUX. | 26 | 
| D708cc | [cc+1] LDI_l | s - x s' | A longer encoding for LDI. | 34 | 
| D709cc | [cc+1] LDU_l | s - x s' | A longer encoding for LDU. | 34 | 
| D70Acc | [cc+1] PLDI | s - x | Preloads a signed cc+1-bit integer from Slices. | 34 | 
| D70Bcc | [cc+1] PLDU | s - x | Preloads an unsigned cc+1-bit integer froms. | 34 | 
| D70Ccc | [cc+1] LDIQ | s - x s' -1 or s 0 | A quiet version of LDI. | 34 | 
| D70Dcc | [cc+1] LDUQ | s - x s' -1 or s 0 | A quiet version of LDU. | 34 | 
| D70Ecc | [cc+1] PLDIQ | s - x -1 or 0 | A quiet version of PLDI. | 34 | 
| D70Fcc | [cc+1] PLDUQ | s - x -1 or 0 | A quiet version of PLDU. | 34 | 
| D714_c | [32(c+1)] PLDUZ | s - s x | Preloads the first 32(c+1)bits of Slicesinto an unsigned integerx, for0 <= c <= 7. Ifsis shorter than necessary, missing bits are assumed to be zero. This operation is intended to be used along withIFBITJMPand similar instructions. | 26 | 
| D718 | LDSLICEX | s l - s'' s' | Loads the first 0 <= l <= 1023bits from Slicesinto a separate Slices'', returning the remainder ofsass'. | 26 | 
| D719 | PLDSLICEX | s l - s'' | Returns the first 0 <= l <= 1023bits ofsass''. | 26 | 
| D71A | LDSLICEXQ | s l - s'' s' -1 or s 0 | A quiet version of LDSLICEX. | 26 | 
| D71B | PLDSLICEXQ | s l - s' -1 or 0 | A quiet version of LDSLICEXQ. | 26 | 
| D71Ccc | [cc+1] LDSLICE_l | s - s'' s' | A longer encoding for LDSLICE. | 34 | 
| D71Dcc | [cc+1] PLDSLICE | s - s'' | Returns the first 0 < cc+1 <= 256bits ofsass''. | 34 | 
| D71Ecc | [cc+1] LDSLICEQ | s - s'' s' -1 or s 0 | A quiet version of LDSLICE. | 34 | 
| D71Fcc | [cc+1] PLDSLICEQ | s - s'' -1 or 0 | A quiet version of PLDSLICE. | 34 | 
| D720 | SDCUTFIRST | s l - s' | Returns the first 0 <= l <= 1023bits ofs. It is equivalent toPLDSLICEX. | 26 | 
| D721 | SDSKIPFIRST | s l - s' | Returns all but the first 0 <= l <= 1023bits ofs. It is equivalent toLDSLICEXNIP. | 26 | 
| D722 | SDCUTLAST | s l - s' | Returns the last 0 <= l <= 1023bits ofs. | 26 | 
| D723 | SDSKIPLAST | s l - s' | Returns all but the last 0 <= l <= 1023bits ofs. | 26 | 
| D724 | SDSUBSTR | s l l' - s' | Returns 0 <= l' <= 1023bits ofsstarting from offset0 <= l <= 1023, thus extracting a bit substring out of the data ofs. | 26 | 
| D726 | SDBEGINSX | s s' - s'' | Checks whether sbegins with (the data bits of)s', and removess'fromson success. On failure throws a cell deserialization exception. PrimitiveSDPFXREVcan be considered a quiet version ofSDBEGINSX. | 26 | 
| D727 | SDBEGINSXQ | s s' - s'' -1 or s 0 | A quiet version of SDBEGINSX. | 26 | 
| D72A_xsss | [slice] SDBEGINS | s - s'' | Checks whether sbegins with constant bitstringsssof length8x+3(with continuation bit assumed), where0 <= x <= 127, and removessssfromson success. | 31 | 
| D72E_xsss | [slice] SDBEGINSQ | s - s'' -1 or s 0 | A quiet version of SDBEGINS. | 31 | 
| D730 | SCUTFIRST | s l r - s' | Returns the first 0 <= l <= 1023bits and first0 <= r <= 4references ofs. | 26 | 
| D731 | SSKIPFIRST | s l r - s' | Returns all but the first lbits ofsandrreferences ofs. | 26 | 
| D732 | SCUTLAST | s l r - s' | Returns the last 0 <= l <= 1023data bits and last0 <= r <= 4references ofs. | 26 | 
| D733 | SSKIPLAST | s l r - s' | Returns all but the last lbits ofsandrreferences ofs. | 26 | 
| D734 | SUBSLICE | s l r l' r' - s' | Returns 0 <= l' <= 1023bits and0 <= r' <= 4references from Slices, after skipping the first0 <= l <= 1023bits and first0 <= r <= 4references. | 26 | 
| D736 | SPLIT | s l r - s' s'' | Splits the first 0 <= l <= 1023data bits and first0 <= r <= 4references fromsintos', returning the remainder ofsass''. | 26 | 
| D737 | SPLITQ | s l r - s' s'' -1 or s 0 | A quiet version of SPLIT. | 26 | 
| D739 | c - s ? | Transforms an ordinary or exotic cell into a Slice, as if it were an ordinary cell. A flag is returned indicating whether cis exotic. If that be the case, its type can later be deserialized from the first eight bits ofs. | ||
| D73A | c - c' | Loads an exotic cell cand returns an ordinary cellc'. Ifcis already ordinary, does nothing. Ifccannot be loaded, throws an exception. | ||
| D73B | c - c' -1 or c 0 | Loads an exotic cell cand returns an ordinary cellc'. Ifcis already ordinary, does nothing. Ifccannot be loaded, returns 0. | ||
| D741 | SCHKBITS | s l -  | Checks whether there are at least ldata bits in Slices. If this is not the case, throws a cell deserialisation (i.e., cell underflow) exception. | 26/76 | 
| D742 | SCHKREFS | s r -  | Checks whether there are at least rreferences in Slices. | 26/76 | 
| D743 | SCHKBITREFS | s l r -  | Checks whether there are at least ldata bits andrreferences in Slices. | 26/76 | 
| D745 | SCHKBITSQ | s l - ? | Checks whether there are at least ldata bits in Slices. | 26 | 
| D746 | SCHKREFSQ | s r - ? | Checks whether there are at least rreferences in Slices. | 26 | 
| D747 | SCHKBITREFSQ | s l r - ? | Checks whether there are at least ldata bits andrreferences in Slices. | 26 | 
| D748 | PLDREFVAR | s n - c | Returns the n-th cell reference of Slicesfor0 <= n <= 3. | 26 | 
| D749 | SBITS | s - l | Returns the number of data bits in Slice s. | 26 | 
| D74A | SREFS | s - r | Returns the number of references in Slice s. | 26 | 
| D74B | SBITREFS | s - l r | Returns both the number of data bits and the number of references in s. | 26 | 
| D74E_n | [n] PLDREFIDX | s - c | Returns the n-th cell reference of Slices, where0 <= n <= 3. | 26 | 
| D74C | PLDREF | s - c | Preloads the first cell reference of a Slice. | 26 | 
| D750 | LDILE4 | s - x s' | Loads a little-endian signed 32-bit integer. | 26 | 
| D751 | LDULE4 | s - x s' | Loads a little-endian unsigned 32-bit integer. | 26 | 
| D752 | LDILE8 | s - x s' | Loads a little-endian signed 64-bit integer. | 26 | 
| D753 | LDULE8 | s - x s' | Loads a little-endian unsigned 64-bit integer. | 26 | 
| D754 | PLDILE4 | s - x | Preloads a little-endian signed 32-bit integer. | 26 | 
| D755 | PLDULE4 | s - x | Preloads a little-endian unsigned 32-bit integer. | 26 | 
| D756 | PLDILE8 | s - x | Preloads a little-endian signed 64-bit integer. | 26 | 
| D757 | PLDULE8 | s - x | Preloads a little-endian unsigned 64-bit integer. | 26 | 
| D758 | LDILE4Q | s - x s' -1 or s 0 | Quietly loads a little-endian signed 32-bit integer. | 26 | 
| D759 | LDULE4Q | s - x s' -1 or s 0 | Quietly loads a little-endian unsigned 32-bit integer. | 26 | 
| D75A | LDILE8Q | s - x s' -1 or s 0 | Quietly loads a little-endian signed 64-bit integer. | 26 | 
| D75B | LDULE8Q | s - x s' -1 or s 0 | Quietly loads a little-endian unsigned 64-bit integer. | 26 | 
| D75C | PLDILE4Q | s - x -1 or 0 | Quietly preloads a little-endian signed 32-bit integer. | 26 | 
| D75D | PLDULE4Q | s - x -1 or 0 | Quietly preloads a little-endian unsigned 32-bit integer. | 26 | 
| D75E | PLDILE8Q | s - x -1 or 0 | Quietly preloads a little-endian signed 64-bit integer. | 26 | 
| D75F | PLDULE8Q | s - x -1 or 0 | Quietly preloads a little-endian unsigned 64-bit integer. | 26 | 
| D760 | LDZEROES | s - n s' | Returns the count nof leading zero bits ins, and removes these bits froms. | 26 | 
| D761 | LDONES | s - n s' | Returns the count nof leading one bits ins, and removes these bits froms. | 26 | 
| D762 | LDSAME | s x - n s' | Returns the count nof leading bits equal to0 <= x <= 1ins, and removes these bits froms. | 26 | 
| D764 | SDEPTH | s - x | Returns the depth of Slice s. Ifshas no references, thenx=0; otherwisexis one plus the maximum of depths of cells referred to froms. | 26 | 
| D765 | CDEPTH | c - x | Returns the depth of Cell c. Ifchas no references, thenx=0; otherwisexis one plus the maximum of depths of cells referred to fromc. Ifcis a Null instead of a Cell, returns zero. | 26 | 
8 Continuation and control flow primitives
8.1 Unconditional control flow primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| D8 | EXECUTECALLX | c -  | Calls, or executes, continuation c. | 18 | 
| D9 | JMPX | c -  | Jumps, or transfers control, to continuation c.The remainder of the previous current continuation ccis discarded. | 18 | 
| DApr | [p] [r] CALLXARGS | c -  | Calls continuation cwithpparameters and expectingrreturn values0 <= p <= 15,0 <= r <= 15 | 26 | 
| DB0p | [p] -1 CALLXARGS | c -  | Calls continuation cwith0 <= p <= 15parameters, expecting an arbitrary number of return values. | 26 | 
| DB1p | [p] JMPXARGS | c -  | Jumps to continuation c, passing only the top0 <= p <= 15values from the current stack to it (the remainder of the current stack is discarded). | 26 | 
| DB2r | [r] RETARGS | Returns to c0, with0 <= r <= 15return values taken from the current stack. | 26 | |
| DB30 | RETRETTRUE | Returns to the continuation at c0. The remainder of the current continuationccis discarded.Approximately equivalent to c0 PUSHCTRJMPX. | 26 | |
| DB31 | RETALTRETFALSE | Returns to the continuation at c1.Approximately equivalent to c1 PUSHCTRJMPX. | 26 | |
| DB32 | BRANCHRETBOOL | f -  | Performs RETTRUEif integerf!=0, orRETFALSEiff=0. | 26 | 
| DB34 | CALLCC | c -  | Call with current continuation, transfers control to c, pushing the old value ofccintoc's stack (instead of discarding it or writing it into newc0). | 26 | 
| DB35 | JMPXDATA | c -  | Similar to CALLCC, but the remainder of the current continuation (the old value ofcc) is converted into a Slice before pushing it into the stack ofc. | 26 | 
| DB36pr | [p] [r] CALLCCARGS | c -  | Similar to CALLXARGS, but pushes the old value ofcc(along with the top0 <= p <= 15values from the original stack) into the stack of newly-invoked continuationc, settingcc.nargsto-1 <= r <= 14. | 34 | 
| DB38 | CALLXVARARGS | c p r -  | Similar to CALLXARGS, but takes-1 <= p,r <= 254from the stack. The next three operations also takepandrfrom the stack, both in the range-1...254. | 26 | 
| DB39 | RETVARARGS | p r -  | Similar to RETARGS. | 26 | 
| DB3A | JMPXVARARGS | c p r -  | Similar to JMPXARGS. | 26 | 
| DB3B | CALLCCVARARGS | c p r -  | Similar to CALLCCARGS. | 26 | 
| DB3C | [ref] CALLREF | Equivalent to PUSHREFCONTCALLX. | 126/51 | |
| DB3D | [ref] JMPREF | Equivalent to PUSHREFCONTJMPX. | 126/51 | |
| DB3E | [ref] JMPREFDATA | Equivalent to PUSHREFCONTJMPXDATA. | 126/51 | |
| DB3F | RETDATA | Equivalent to c0 PUSHCTRJMPXDATA. In this way, the remainder of the current continuation is converted into a Slice and returned to the caller. | 26 | 
8.2 Conditional control flow primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| DC | IFRETIFNOT: | f -  | Performs a RET, but only if integerfis non-zero. Iffis aNaN, throws an integer overflow exception. | 18 | 
| DD | IFNOTRETIF: | f -  | Performs a RET, but only if integerfis zero. | 18 | 
| DE | IF | f c -  | Performs EXECUTEforc(i.e., executesc), but only if integerfis non-zero. Otherwise simply discards both values. | 18 | 
| DE | IF:<{ code }><{ code }>IF | f - | Equivalent to <{ code }> CONTIF. | |
| DF | IFNOT | f c -  | Executes continuation c, but only if integerfis zero. Otherwise simply discards both values. | 18 | 
| DF | IFNOT:<{ code }><{ code }>IFNOT | f - | Equivalent to <{ code }> CONTIFNOT. | |
| E0 | IFJMP | f c -  | Jumps to c(similarly toJMPX), but only iffis non-zero. | 18 | 
| E0 | IFJMP:<{ code }> | f - | Equivalent to <{ code }> CONTIFJMP. | |
| E1 | IFNOTJMP | f c -  | Jumps to c(similarly toJMPX), but only iffis zero. | 18 | 
| E1 | IFNOTJMP:<{ code }> | f - | Equivalent to <{ code }> CONTIFNOTJMP. | |
| E2 | IFELSE | f c c' -  | If integer fis non-zero, executesc, otherwise executesc'. Equivalent toCONDSELCHKEXECUTE. | 18 | 
| E2 | IF:<{ code1 }>ELSE<{ code2 }> | f - | Equivalent to <{ code1 }> CONT<{ code2 }> CONTIFELSE. | |
| E300 | [ref] IFREF | f -  | Equivalent to PUSHREFCONTIF, with the optimization that the cell reference is not actually loaded into a Slice and then converted into an ordinary Continuation iff=0.Gas consumption of this primitive depends on whether f=0and whether the reference was loaded before.Similar remarks apply other primitives that accept a continuation as a reference. | 26/126/51 | 
| E301 | [ref] IFNOTREF | f -  | Equivalent to PUSHREFCONTIFNOT. | 26/126/51 | 
| E302 | [ref] IFJMPREF | f -  | Equivalent to PUSHREFCONTIFJMP. | 26/126/51 | 
| E303 | [ref] IFNOTJMPREF | f -  | Equivalent to PUSHREFCONTIFNOTJMP. | 26/126/51 | 
| E304 | CONDSEL | f x y - x or y | If integer fis non-zero, returnsx, otherwise returnsy. Notice that no type checks are performed onxandy; as such, it is more like a conditional stack operation. Roughly equivalent toROTISZEROINCROLLXNIP. | 26 | 
| E305 | CONDSELCHK | f x y - x or y | Same as CONDSEL, but first checks whetherxandyhave the same type. | 26 | 
| E308 | IFRETALT | f - | Performs RETALTif integerf!=0. | 26 | 
| E309 | IFNOTRETALT | f - | Performs RETALTif integerf=0. | 26 | 
| E30D | [ref] IFREFELSE | f c - | Equivalent to PUSHREFCONTSWAPIFELSE, with the optimization that the cell reference is not actually loaded into a Slice and then converted into an ordinary Continuation iff=0. Similar remarks apply to the next two primitives: cells are converted into continuations only when necessary. | 26/126/51 | 
| E30E | [ref] IFELSEREF | f c - | Equivalent to PUSHREFCONTIFELSE. | 26/126/51 | 
| E30F | [ref] [ref] IFREFELSEREF | f - | Equivalent to PUSHREFCONTPUSHREFCONTIFELSE. | 126/51 | 
| E39_n | [n] IFBITJMP | x c - x | Checks whether bit 0 <= n <= 31is set in integerx, and if so, performsJMPXto continuationc. Valuexis left in the stack. | 26 | 
| E3B_n | [n] IFNBITJMP | x c - x | Jumps to cif bit0 <= n <= 31is not set in integerx. | 26 | 
| E3D_n | [ref] [n] IFBITJMPREF | x - x | Performs a JMPREFif bit0 <= n <= 31is set in integerx. | 126/51 | 
| E3F_n | [ref] [n] IFNBITJMPREF | x - x | Performs a JMPREFif bit0 <= n <= 31is not set in integerx. | 126/51 | 
8.3 Control flow primitives: loops
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| E4 | REPEAT | n c -  | Executes continuation cntimes, if integernis non-negative. Ifn>=2^31orn<-2^31, generates a range check exception.Notice that a RETinside the code ofcworks as acontinue, not as abreak. One should use either alternative (experimental) loops or alternativeRETALT(along with aSETEXITALTbefore the loop) tobreakout of a loop. | 18 | 
| E4 | REPEAT:<{ code }><{ code }>REPEAT | n - | Equivalent to <{ code }> CONTREPEAT. | |
| E5 | REPEATENDREPEAT: | n -  | Similar to REPEAT, but it is applied to the current continuationcc. | 18 | 
| E6 | UNTIL | c -  | Executes continuation c, then pops an integerxfrom the resulting stack. Ifxis zero, performs another iteration of this loop. The actual implementation of this primitive involves an extraordinary continuationec_untilwith its arguments set to the body of the loop (continuationc) and the original current continuationcc. This extraordinary continuation is then saved into the savelist ofcasc.c0and the modifiedcis then executed. The other loop primitives are implemented similarly with the aid of suitable extraordinary continuations. | 18 | 
| E6 | UNTIL:<{ code }><{ code }>UNTIL | - | Equivalent to <{ code }> CONTUNTIL. | |
| E7 | UNTILENDUNTIL: | - | Similar to UNTIL, but executes the current continuationccin a loop. When the loop exit condition is satisfied, performs aRET. | 18 | 
| E8 | WHILE | c' c -  | Executes c'and pops an integerxfrom the resulting stack. Ifxis zero, exists the loop and transfers control to the originalcc. Ifxis non-zero, executesc, and then begins a new iteration. | 18 | 
| E8 | WHILE:<{ cond }>DO<{ code }> | - | Equivalent to <{ cond }> CONT<{ code }> CONTWHILE. | |
| E9 | WHILEEND | c' -  | Similar to WHILE, but uses the current continuationccas the loop body. | 18 | 
| EA | AGAIN | c -  | Similar to REPEAT, but executescinfinitely many times. ARETonly begins a new iteration of the infinite loop, which can be exited only by an exception, or aRETALT(or an explicitJMPX). | 18 | 
| EA | AGAIN:<{ code }><{ code }>AGAIN | - | Equivalent to <{ code }> CONTAGAIN. | |
| EB | AGAINENDAGAIN: | - | Similar to AGAIN, but performed with respect to the current continuationcc. | 18 | 
| E314 | REPEATBRK | n c - | Similar to REPEAT, but also setsc1to the originalccafter saving the old value ofc1into the savelist of the originalcc. In this wayRETALTcould be used to break out of the loop body. | 26 | 
| E314 | REPEATBRK:<{ code }><{ code }>REPEATBRK | n - | Equivalent to <{ code }> CONTREPEATBRK. | |
| E315 | REPEATENDBRK | n - | Similar to REPEATEND, but also setsc1to the originalc0after saving the old value ofc1into the savelist of the originalc0. Equivalent toSAMEALTSAVEREPEATEND. | 26 | 
| E316 | UNTILBRK | c - | Similar to UNTIL, but also modifiesc1in the same way asREPEATBRK. | 26 | 
| E316 | UNTILBRK:<{ code }> | - | Equivalent to <{ code }> CONTUNTILBRK. | |
| E317 | UNTILENDBRKUNTILBRK: | - | Equivalent to SAMEALTSAVEUNTILEND. | 26 | 
| E318 | WHILEBRK | c' c - | Similar to WHILE, but also modifiesc1in the same way asREPEATBRK. | 26 | 
| E318 | WHILEBRK:<{ cond }>DO<{ code }> | - | Equivalent to <{ cond }> CONT<{ code }> CONTWHILEBRK. | |
| E319 | WHILEENDBRK | c - | Equivalent to SAMEALTSAVEWHILEEND. | 26 | 
| E31A | AGAINBRK | c - | Similar to AGAIN, but also modifiesc1in the same way asREPEATBRK. | 26 | 
| E31A | AGAINBRK:<{ code }> | - | Equivalent to <{ code }> CONTAGAINBRK. | |
| E31B | AGAINENDBRKAGAINBRK: | - | Equivalent to SAMEALTSAVEAGAINEND. | 26 | 
8.4 Manipulating the stack of continuations
Here s" is the fee for moving stack elements between continuations. It is equal to the size of the resulting stack minus 32 (or 0 if the stack is smaller than 32).
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| ECrn | [r] [n] SETCONTARGS | x_1 x_2...x_r c - c' | Similar to [r] -1 SETCONTARGS, but setsc.nargsto the final size of the stack ofc'plusn. In other words, transformscinto a closure or a partially applied function, with0 <= n <= 14arguments missing. | 26+s” | 
| EC0n | [n] SETNUMARGS | c - c' | Sets c.nargstonplus the current depth ofc's stack, where0 <= n <= 14. Ifc.nargsis already set to a non-negative value, does nothing. | 26 | 
| ECrF | [r] -1 SETCONTARGS | x_1 x_2...x_r c - c' | Pushes 0 <= r <= 15valuesx_1...x_rinto the stack of (a copy of) the continuationc, starting withx_1. If the final depth ofc's stack turns out to be greater thanc.nargs, a stack overflow exception is generated. | 26+s” | 
| ED0p | [p] RETURNARGS | - | Leaves only the top 0 <= p <= 15values in the current stack (somewhat similarly toONLYTOPX), with all the unused bottom values not discarded, but saved into continuationc0in the same way asSETCONTARGSdoes. | 26+s” | 
| ED10 | RETURNVARARGS | p - | Similar to RETURNARGS, but with Integer0 <= p <= 255taken from the stack. | 26+s” | 
| ED11 | SETCONTVARARGS | x_1 x_2...x_r c r n - c' | Similar to SETCONTARGS, but with0 <= r <= 255and-1 <= n <= 255taken from the stack. | 26+s” | 
| ED12 | SETNUMVARARGS | c n - c' | -1 <= n <= 255If n=-1, this operation does nothing (c'=c).Otherwise its action is similar to [n] SETNUMARGS, but withntaken from the stack. | 26 | 
8.5 Creating simple continuations and closures
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| ED1E | BLESS | s - c | Transforms a Slice sinto a simple ordinary continuationc, withc.code=sand an empty stack and savelist. | 26 | 
| ED1F | BLESSVARARGS | x_1...x_r s r n - c | Equivalent to ROTBLESSROTREVSETCONTVARARGS. | 26+s” | 
| EErn | [r] [n] BLESSARGS | x_1...x_r s - c | 0 <= r <= 15,-1 <= n <= 14Equivalent to BLESS[r] [n] SETCONTARGS.The value of nis represented inside the instruction by the 4-bit integern mod 16. | 26 | 
| EE0n | [n] BLESSNUMARGS | s - c | Also transforms a Slice sinto a Continuationc, but setsc.nargsto0 <= n <= 14. | 26 | 
8.6 Operations with continuation savelists and control registers
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| ED4i | c[i] PUSHCTRc[i] PUSH | - x | Pushes the current value of control register c(i). If the control register is not supported in the current codepage, or if it does not have a value, an exception is triggered. | 26 | 
| ED44 | c4 PUSHCTRc4 PUSH | - x | Pushes the “global data root'' cell reference, thus enabling access to persistent smart-contract data. | 26 | 
| ED5i | c[i] POPCTRc[i] POP | x -  | Pops a value xfrom the stack and stores it into control registerc(i), if supported in the current codepage. Notice that if a control register accepts only values of a specific type, a type-checking exception may occur. | 26 | 
| ED54 | c4 POPCTRc4 POP | x - | Sets the “global data root'' cell reference, thus allowing modification of persistent smart-contract data. | 26 | 
| ED6i | c[i] SETCONTc[i] SETCONTCTR | x c - c' | Stores xinto the savelist of continuationcasc(i), and returns the resulting continuationc'. Almost all operations with continuations may be expressed in terms ofSETCONTCTR,POPCTR, andPUSHCTR. | 26 | 
| ED7i | c[i] SETRETCTR | x -  | Equivalent to c0 PUSHCTRc[i] SETCONTCTRc0 POPCTR. | 26 | 
| ED8i | c[i] SETALTCTR | x -  | Equivalent to c1 PUSHCTRc[i] SETCONTCTRc1 POPCTR. | 26 | 
| ED9i | c[i] POPSAVEc[i] POPCTRSAVE | x - | Similar to c[i] POPCTR, but also saves the old value ofc[i]into continuationc0.Equivalent (up to exceptions) to c[i] SAVECTRc[i] POPCTR. | 26 | 
| EDAi | c[i] SAVEc[i] SAVECTR | Saves the current value of c(i)into the savelist of continuationc0. If an entry forc[i]is already present in the savelist ofc0, nothing is done. Equivalent toc[i] PUSHCTRc[i] SETRETCTR. | 26 | |
| EDBi | c[i] SAVEALTc[i] SAVEALTCTR | Similar to c[i] SAVE, but saves the current value ofc[i]into the savelist ofc1, notc0. | 26 | |
| EDCi | c[i] SAVEBOTHc[i] SAVEBOTHCTR | Equivalent to c[i] SAVEc[i] SAVEALT. | 26 | |
| EDE0 | PUSHCTRX | i - x | Similar to c[i] PUSHCTR, but withi,0 <= i <= 255, taken from the stack.Notice that this primitive is one of the few “exotic'' primitives, which are not polymorphic like stack manipulation primitives, and at the same time do not have well-defined types of parameters and return values, because the type of xdepends oni. | 26 | 
| EDE1 | POPCTRX | x i -  | Similar to c[i] POPCTR, but with0 <= i <= 255from the stack. | 26 | 
| EDE2 | SETCONTCTRX | x c i - c' | Similar to c[i] SETCONTCTR, but with0 <= i <= 255from the stack. | 26 | 
| EDF0 | COMPOSBOOLAND | c c' - c'' | Computes the composition compose0(c, c’), which has the meaning of “performc, and, if successful, performc''' (ifcis a boolean circuit) or simply “performc, thenc'''. Equivalent toSWAPc0 SETCONT. | 26 | 
| EDF1 | COMPOSALTBOOLOR | c c' - c'' | Computes the alternative composition compose1(c, c’), which has the meaning of “performc, and, if not successful, performc''' (ifcis a boolean circuit). Equivalent toSWAPc1 SETCONT. | 26 | 
| EDF2 | COMPOSBOTH | c c' - c'' | Computes composition compose1(compose0(c, c’), c’), which has the meaning of “compute boolean circuitc, then computec', regardless of the result ofc''. | 26 | 
| EDF3 | ATEXIT | c -  | Sets c0tocompose0(c, c0). In other words,cwill be executed before exiting current subroutine. | 26 | 
| EDF3 | ATEXIT:<{ code }><{ code }>ATEXIT | - | Equivalent to <{ code }> CONTATEXIT. | |
| EDF4 | ATEXITALT | c -  | Sets c1tocompose1(c, c1). In other words,cwill be executed before exiting current subroutine by its alternative return path. | 26 | 
| EDF4 | ATEXITALT:<{ code }><{ code }>ATEXITALT | - | Equivalent to <{ code }> CONTATEXITALT. | |
| EDF5 | SETEXITALT | c -  | Sets c1tocompose1(compose0(c, c0), c1),In this way, a subsequent RETALTwill first executec, then transfer control to the originalc0. This can be used, for instance, to exit from nested loops. | 26 | 
| EDF6 | THENRET | c - c' | Computes compose0(c, c0). | 26 | 
| EDF7 | THENRETALT | c - c' | Computes compose0(c, c1) | 26 | 
| EDF8 | INVERT | - | Interchanges c0andc1. | 26 | 
| EDF9 | BOOLEVAL | c - ? | Performs cc:=compose1(compose0(c, compose0(-1 PUSHINT, cc)), compose0(0 PUSHINT, cc)). Ifcrepresents a boolean circuit, the net effect is to evaluate it and push either-1or0into the stack before continuing. | 26 | 
| EDFA | SAMEALT | - | Sets c1toc0. Equivalent toc0 PUSHCTRc1 POPCTR. | 26 | 
| EDFB | SAMEALTSAVE | - | Sets c1toc0, but first saves the old value ofc1into the savelist ofc0.Equivalent to c1 SAVESAMEALT. | 26 | 
8.7 Dictionary subroutine calls and jumps
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F0nn | [nn] CALL[nn] CALLDICT | - nn | Calls the continuation in c3, pushing integer0 <= nn <= 255into its stack as an argument.Approximately equivalent to [nn] PUSHINTc3 PUSHCTREXECUTE. | |
| F12_n | [n] CALL[n] CALLDICT | - n | For 0 <= n < 2^14, an encoding of[n] CALLfor larger values ofn. | |
| F16_n | [n] JMP |  - n | Jumps to the continuation in c3, pushing integer0 <= n < 2^14as its argument.Approximately equivalent to n PUSHINTc3 PUSHCTRJMPX. | |
| F1A_n | [n] PREPARE[n] PREPAREDICT |  - n c | Equivalent to n PUSHINTc3 PUSHCTR, for0 <= n < 2^14.In this way, [n] CALLis approximately equivalent to[n] PREPAREEXECUTE, and[n] JMPis approximately equivalent to[n] PREPAREJMPX.One might use, for instance, CALLXARGSorCALLCCinstead ofEXECUTEhere. | 
9 Exception generating and handling primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F22_n | [n] THROW |  - 0 n | Throws exception 0 <= n <= 63with parameter zero.In other words, it transfers control to the continuation in c2, pushing0andninto its stack, and discarding the old stack altogether. | 76 | 
| F26_n | [n] THROWIF | f -  | Throws exception 0 <= n <= 63with  parameter zero only if integerf!=0. | 26/76 | 
| F2A_n | [n] THROWIFNOT | f -  | Throws exception 0 <= n <= 63with parameter zero only if integerf=0. | 26/76 | 
| F2C4_n | [n] THROW | - 0 nn | For 0 <= n < 2^11, an encoding of[n] THROWfor larger values ofn. | 84 | 
| F2CC_n | [n] THROWARG | x - x nn | Throws exception 0 <= n <  2^11with parameterx, by copyingxandninto the stack ofc2and transferring control toc2. | 84 | 
| F2D4_n | [n] THROWIF | f -  | For 0 <= n < 2^11, an encoding of[n] THROWIFfor larger values ofn. | 34/84 | 
| F2DC_n | [n] THROWARGIF | x f -  | Throws exception 0 <= nn < 2^11with parameterxonly if integerf!=0. | 34/84 | 
| F2E4_n | [n] THROWIFNOT | f -  | For 0 <= n < 2^11, an encoding of[n] THROWIFNOTfor larger values ofn. | 34/84 | 
| F2EC_n | [n] THROWARGIFNOT | x f -  | Throws exception 0 <= n < 2^11with parameterxonly if integerf=0. | 34/84 | 
| F2F0 | THROWANY | n - 0 n | Throws exception 0 <= n < 2^16with parameter zero.Approximately equivalent to ZEROSWAPTHROWARGANY. | 76 | 
| F2F1 | THROWARGANY | x n - x n | Throws exception 0 <= n < 2^16with parameterx, transferring control to the continuation inc2.Approximately equivalent to c2 PUSHCTR2 JMPXARGS. | 76 | 
| F2F2 | THROWANYIF | n f -  | Throws exception 0 <= n < 2^16with parameter zero only iff!=0. | 26/76 | 
| F2F3 | THROWARGANYIF | x n f -  | Throws exception 0 <= n<2^16with parameterxonly iff!=0. | 26/76 | 
| F2F4 | THROWANYIFNOT | n f -  | Throws exception 0 <= n<2^16with parameter zero only iff=0. | 26/76 | 
| F2F5 | THROWARGANYIFNOT | x n f -  | Throws exception 0 <= n<2^16with parameterxonly iff=0. | 26/76 | 
| F2FF | TRY | c c' -  | Sets c2toc', first saving the old value ofc2both into the savelist ofc'and into the savelist of the current continuation, which is stored intoc.c0andc'.c0. Then runscsimilarly toEXECUTE. Ifcdoes not throw any exceptions, the original value ofc2is automatically restored on return fromc. If an exception occurs, the execution is transferred toc', but the original value ofc2is restored in the process, so thatc'can re-throw the exception byTHROWANYif it cannot handle it by itself. | 26 | 
| F2FF | TRY:<{ code1 }>CATCH<{ code2 }> | - | Equivalent to <{ code1 }> CONT<{ code2 }> CONTTRY. | |
| F3pr | [p] [r] TRYARGS | c c' -  | Similar to TRY, but with[p] [r] CALLXARGSinternally used instead ofEXECUTE.In this way, all but the top 0 <= p <= 15stack elements will be saved into current continuation's stack, and then restored upon return from eithercorc', with the top0 <= r <= 15values of the resulting stack ofcorc'copied as return values. | 26 | 
10 Dictionary manipulation primitives
The gas consumption of most dictionary operations is not fixed, it depends on the contents of the given dictionary.
10.1 Dictionary creation
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| 6D | NEWDICT |  - D | Returns a new empty dictionary. It is an alternative mnemonics for PUSHNULL. | 18 | 
| 6E | DICTEMPTY | D - ? | Checks whether dictionary Dis empty, and returns-1or0accordingly.It is an alternative mnemonics for ISNULL. | 18 | 
10.2 Dictionary serialization and deserialization
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| CE | STDICTS`` | s b - b' | Stores a Slice-represented dictionary sinto Builderb.It is actually a synonym for STSLICE. | 18 | 
| F400 | STDICTSTOPTREF | D b - b' | Stores dictionary Dinto Builderb, returing the resulting Builderb'.In other words, if Dis a cell, performsSTONEandSTREF; ifDis Null, performsNIPandSTZERO; otherwise throws a type checking exception. | 26 | 
| F401 | SKIPDICTSKIPOPTREF | s - s' | Equivalent to LDDICTNIP. | 26 | 
| F402 | LDDICTS | s - s' s'' | Loads (parses) a (Slice-represented) dictionary s'from Slices, and returns the remainder ofsass''.This is a “split function'' for all HashmapE(n,X)dictionary types. | 26 | 
| F403 | PLDDICTS | s - s' | Preloads a (Slice-represented) dictionary s'from Slices.Approximately equivalent to LDDICTSDROP. | 26 | 
| F404 | LDDICTLDOPTREF | s - D s' | Loads (parses) a dictionary Dfrom Slices, and returns the remainder ofsass'. May be applied to dictionaries or to values of arbitrary(^Y)?types. | 26 | 
| F405 | PLDDICTPLDOPTREF | s - D | Preloads a dictionary Dfrom Slices.Approximately equivalent to LDDICTDROP. | 26 | 
| F406 | LDDICTQ | s - D s' -1 or s 0 | A quiet version of LDDICT. | 26 | 
| F407 | PLDDICTQ | s - D -1 or 0 | A quiet version of PLDDICT. | 26 | 
10.3 Get dictionary operations
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F40A | DICTGET | k D n - x -1 or 0 | Looks up key k(represented by a Slice, the first0 <= n <= 1023data bits of which are used as a key) in dictionaryDof typeHashmapE(n,X)withn-bit keys.On success, returns the value found as a Slice x. | |
| F40B | DICTGETREF | k D n - c -1 or 0 | Similar to DICTGET, but with aLDREFENDSapplied toxon success.This operation is useful for dictionaries of type HashmapE(n,^Y). | |
| F40C | DICTIGET | i D n - x -1 or 0 | Similar to DICTGET, but with a signed (big-endian)n-bit Integerias a key. Ifidoes not fit intonbits, returns0. Ifiis aNaN, throws an integer overflow exception. | |
| F40D | DICTIGETREF | i D n - c -1 or 0 | Combines DICTIGETwithDICTGETREF: it uses signedn-bit Integerias a key and returns a Cell instead of a Slice on success. | |
| F40E | DICTUGET | i D n - x -1 or 0 | Similar to DICTIGET, but with unsigned (big-endian)n-bit Integeriused as a key. | |
| F40F | DICTUGETREF | i D n - c -1 or 0 | Similar to DICTIGETREF, but with an unsignedn-bit Integer keyi. | 
10.4 Set/Replace/Add dictionary operations
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F412 | DICTSET | x k D n - D' | Sets the value associated with n-bit keyk(represented by a Slice as inDICTGET) in dictionaryD(also represented by a Slice) to valuex(again a Slice), and returns the resulting dictionary asD'. | |
| F413 | DICTSETREF | c k D n - D' | Similar to DICTSET, but with the value set to a reference to Cellc. | |
| F414 | DICTISET | x i D n - D' | Similar to DICTSET, but with the key represented by a (big-endian) signedn-bit integeri. Ifidoes not fit intonbits, a range check exception is generated. | |
| F415 | DICTISETREF | c i D n - D' | Similar to DICTSETREF, but with the key a signedn-bit integer as inDICTISET. | |
| F416 | DICTUSET | x i D n - D' | Similar to DICTISET, but withian unsignedn-bit integer. | |
| F417 | DICTUSETREF | c i D n - D' | Similar to DICTISETREF, but withiunsigned. | |
| F41A | DICTSETGET | x k D n - D' y -1 or D' 0 | Combines DICTSETwithDICTGET: it sets the value corresponding to keyktox, but also returns the old valueyassociated with the key in question, if present. | |
| F41B | DICTSETGETREF | c k D n - D' c' -1 or D' 0 | Combines DICTSETREFwithDICTGETREFsimilarly toDICTSETGET. | |
| F41C | DICTISETGET | x i D n - D' y -1 or D' 0 | DICTISETGET, but withia signedn-bit integer. | |
| F41D | DICTISETGETREF | c i D n - D' c' -1 or D' 0 | DICTISETGETREF, but withia signedn-bit integer. | |
| F41E | DICTUSETGET | x i D n - D' y -1 or D' 0 | DICTISETGET, but withian unsignedn-bit integer. | |
| F41F | DICTUSETGETREF | c i D n - D' c' -1 or D' 0 | DICTISETGETREF, but withian unsignedn-bit integer. | |
| F422 | DICTREPLACE | x k D n - D' -1 or D 0 | A Replace operation, which is similar to DICTSET, but sets the value of keykin dictionaryDtoxonly if the keykwas already present inD. | |
| F423 | DICTREPLACEREF | c k D n - D' -1 or D 0 | A Replace counterpart of DICTSETREF. | |
| F424 | DICTIREPLACE | x i D n - D' -1 or D 0 | DICTREPLACE, but withia signedn-bit integer. | |
| F425 | DICTIREPLACEREF | c i D n - D' -1 or D 0 | DICTREPLACEREF, but withia signedn-bit integer. | |
| F426 | DICTUREPLACE | x i D n - D' -1 or D 0 | DICTREPLACE, but withian unsignedn-bit integer. | |
| F427 | DICTUREPLACEREF | c i D n - D' -1 or D 0 | DICTREPLACEREF, but withian unsignedn-bit integer. | |
| F42A | DICTREPLACEGET | x k D n - D' y -1 or D 0 | A Replace counterpart of DICTSETGET: on success, also returns the old value associated with the key in question. | |
| F42B | DICTREPLACEGETREF | c k D n - D' c' -1 or D 0 | A Replace counterpart of DICTSETGETREF. | |
| F42C | DICTIREPLACEGET | x i D n - D' y -1 or D 0 | DICTREPLACEGET, but withia signedn-bit integer. | |
| F42D | DICTIREPLACEGETREF | c i D n - D' c' -1 or D 0 | DICTREPLACEGETREF, but withia signedn-bit integer. | |
| F42E | DICTUREPLACEGET | x i D n - D' y -1 or D 0 | DICTREPLACEGET, but withian unsignedn-bit integer. | |
| F42F | DICTUREPLACEGETREF | c i D n - D' c' -1 or D 0 | DICTREPLACEGETREF, but withian unsignedn-bit integer. | |
| F432 | DICTADD | x k D n - D' -1 or D 0 | An Add counterpart of DICTSET: sets the value associated with keykin dictionaryDtox, but only if it is not already present inD. | |
| F433 | DICTADDREF | c k D n - D' -1 or D 0 | An Add counterpart of DICTSETREF. | |
| F434 | DICTIADD | x i D n - D' -1 or D 0 | DICTADD, but withia signedn-bit integer. | |
| F435 | DICTIADDREF | c i D n - D' -1 or D 0 | DICTADDREF, but withia signedn-bit integer. | |
| F436 | DICTUADD | x i D n - D' -1 or D 0 | DICTADD, but withian unsignedn-bit integer. | |
| F437 | DICTUADDREF | c i D n - D' -1 or D 0 | DICTADDREF, but withian unsignedn-bit integer. | |
| F43A | DICTADDGET | x k D n - D' -1 or D y 0 | An Add counterpart of DICTSETGET: sets the value associated with keykin dictionaryDtox, but only if keykis not already present inD. Otherwise, just returns the old valueywithout changing the dictionary. | |
| F43B | DICTADDGETREF | c k D n - D' -1 or D c' 0 | An Add counterpart of DICTSETGETREF. | |
| F43C | DICTIADDGET | x i D n - D' -1 or D y 0 | DICTADDGET, but withia signedn-bit integer. | |
| F43D | DICTIADDGETREF | c i D n - D' -1 or D c' 0 | DICTADDGETREF, but withia signedn-bit integer. | |
| F43E | DICTUADDGET | x i D n - D' -1 or D y 0 | DICTADDGET, but withian unsignedn-bit integer. | |
| F43F | DICTUADDGETREF | c i D n - D' -1 or D c' 0 | DICTADDGETREF, but withian unsignedn-bit integer. | 
10.5 Builder-accepting variants of Set dictionary operations
The following primitives accept the new value as a Builder b instead of a Slice x.
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F441 | DICTSETB | b k D n - D' | ||
| F442 | DICTISETB | b i D n - D' | ||
| F443 | DICTUSETB | b i D n - D' | ||
| F445 | DICTSETGETB | b k D n - D' y -1 or D' 0 | ||
| F446 | DICTISETGETB | b i D n - D' y -1 or D' 0 | ||
| F447 | DICTUSETGETB | b i D n - D' y -1 or D' 0 | ||
| F449 | DICTREPLACEB | b k D n - D' -1 or D 0 | ||
| F44A | DICTIREPLACEB | b i D n - D' -1 or D 0 | ||
| F44B | DICTUREPLACEB | b i D n - D' -1 or D 0 | ||
| F44D | DICTREPLACEGETB | b k D n - D' y -1 or D 0 | ||
| F44E | DICTIREPLACEGETB | b i D n - D' y -1 or D 0 | ||
| F44F | DICTUREPLACEGETB | b i D n - D' y -1 or D 0 | ||
| F451 | DICTADDB | b k D n - D' -1 or D 0 | ||
| F452 | DICTIADDB | b i D n - D' -1 or D 0 | ||
| F453 | DICTUADDB | b i D n - D' -1 or D 0 | ||
| F455 | DICTADDGETB | b k D n - D' -1 or D y 0 | ||
| F456 | DICTIADDGETB | b i D n - D' -1 or D y 0 | ||
| F457 | DICTUADDGETB | b i D n - D' -1 or D y 0 | 
10.6 Delete dictionary operations
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F459 | DICTDEL | k D n - D' -1 or D 0 | Deletes n-bit key, represented by a Slicek, from dictionaryD. If the key is present, returns the modified dictionaryD'and the success flag-1. Otherwise, returns the original dictionaryDand0. | |
| F45A | DICTIDEL | i D n - D' ? | A version of DICTDELwith the key represented by a signedn-bit Integeri. Ifidoes not fit intonbits, simply returnsD0(“key not found, dictionary unmodified''). | |
| F45B | DICTUDEL | i D n - D' ? | Similar to DICTIDEL, but withian unsignedn-bit integer. | |
| F462 | DICTDELGET | k D n - D' x -1 or D 0 | Deletes n-bit key, represented by a Slicek, from dictionaryD. If the key is present, returns the modified dictionaryD', the original valuexassociated with the keyk(represented by a Slice), and the success flag-1. Otherwise, returns the original dictionaryDand0. | |
| F463 | DICTDELGETREF | k D n - D' c -1 or D 0 | Similar to DICTDELGET, but withLDREFENDSapplied toxon success, so that the value returnedcis a Cell. | |
| F464 | DICTIDELGET | i D n - D' x -1 or D 0 | DICTDELGET, but withia signedn-bit integer. | |
| F465 | DICTIDELGETREF | i D n - D' c -1 or D 0 | DICTDELGETREF, but withia signedn-bit integer. | |
| F466 | DICTUDELGET | i D n - D' x -1 or D 0 | DICTDELGET, but withian unsignedn-bit integer. | |
| F467 | DICTUDELGETREF | i D n - D' c -1 or D 0 | DICTDELGETREF, but withian unsignedn-bit integer. | 
10.7 "Maybe reference" dictionary operations
The following operations assume that a dictionary is used to store values c? of type Maybe Cell.  The representation is as follows: if c? is a Cell , it is stored as a value with no data bits and exactly one reference to this Cell.  If c? is Null, then the corresponding key must be absent from the dictionary.
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F469 | DICTGETOPTREF | k D n - c^? | A variant of DICTGETREFthat returns Null instead of the valuec^?if the keykis absent from dictionaryD. | |
| F46A | DICTIGETOPTREF | i D n - c^? | DICTGETOPTREF, but withia signedn-bit integer. If the keyiis out of range, also returns Null. | |
| F46B | DICTUGETOPTREF | i D n - c^? | DICTGETOPTREF, but withian unsignedn-bit integer. If the keyiis out of range, also returns Null. | |
| F46D | DICTSETGETOPTREF | c^? k D n - D' ~c^? | A variant of both DICTGETOPTREFandDICTSETGETREFthat sets the value corresponding to keykin dictionaryDtoc^?(ifc^?is Null, then the key is deleted instead), and returns the old value~c^?(if the keykwas absent before, returns Null instead). | |
| F46E | DICTISETGETOPTREF | c^? i D n - D' ~c^? | Similar to primitive DICTSETGETOPTREF, but using signedn-bit Integerias a key. Ifidoes not fit intonbits, throws a range checking exception. | |
| F46F | DICTUSETGETOPTREF | c^? i D n - D' ~c^? | Similar to primitive DICTSETGETOPTREF, but using unsignedn-bit Integerias a key. | 
10.8 Prefix code dictionary operations
These are some basic operations for constructing prefix code dictionaries.
These primitives are completely similar to their non-prefix code counterparts (DICTSET etc), with the obvious difference that even a Set may fail in a prefix code dictionary, so a success flag must be returned by PFXDICTSET as well.
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F470 | PFXDICTSET | x k D n - D' -1 or D 0 | ||
| F471 | PFXDICTREPLACE | x k D n - D' -1 or D 0 | ||
| F472 | PFXDICTADD | x k D n - D' -1 or D 0 | ||
| F473 | PFXDICTDEL | k D n - D' -1 or D 0 | 
10.9 Variants of GetNext and GetPrev operations
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F474 | DICTGETNEXT | k D n - x' k' -1 or 0 | Computes the minimal key k'in dictionaryDthat is lexicographically greater thank, and returnsk'(represented by a Slice) along with associated valuex'(also represented by a Slice). | |
| F475 | DICTGETNEXTEQ | k D n - x' k' -1 or 0 | Similar to DICTGETNEXT, but computes the minimal keyk'that is lexicographically greater than or equal tok. | |
| F476 | DICTGETPREV | k D n - x' k' -1 or 0 | Similar to DICTGETNEXT, but computes the maximal keyk'lexicographically smaller thank. | |
| F477 | DICTGETPREVEQ | k D n - x' k' -1 or 0 | Similar to DICTGETPREV, but computes the maximal keyk'lexicographically smaller than or equal tok. | |
| F478 | DICTIGETNEXT | i D n - x' i' -1 or 0 | Similar to DICTGETNEXT, but interprets all keys in dictionaryDas big-endian signedn-bit integers, and computes the minimal keyi'that is larger than Integeri(which does not necessarily fit intonbits). | |
| F479 | DICTIGETNEXTEQ | i D n - x' i' -1 or 0 | Similar to DICTGETNEXTEQ, but interprets keys as signedn-bit integers. | |
| F47A | DICTIGETPREV | i D n - x' i' -1 or 0 | Similar to DICTGETPREV, but interprets keys as signedn-bit integers. | |
| F47B | DICTIGETPREVEQ | i D n - x' i' -1 or 0 | Similar to DICTGETPREVEQ, but interprets keys as signedn-bit integers. | |
| F47C | DICTUGETNEXT | i D n - x' i' -1 or 0 | Similar to DICTGETNEXT, but interprets all keys in dictionaryDas big-endian unsignedn-bit integers, and computes the minimal keyi'that is larger than Integeri(which does not necessarily fit intonbits, and is not necessarily non-negative). | |
| F47D | DICTUGETNEXTEQ | i D n - x' i' -1 or 0 | Similar to DICTGETNEXTEQ, but interprets keys as unsignedn-bit integers. | |
| F47E | DICTUGETPREV | i D n - x' i' -1 or 0 | Similar to DICTGETPREV, but interprets keys as unsignedn-bit integers. | |
| F47F | DICTUGETPREVEQ | i D n - x' i' -1 or 0 | Similar to DICTGETPREVEQ, but interprets keys a unsignedn-bit integers. | 
10.10 GetMin, GetMax, RemoveMin, RemoveMax operations
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F482 | DICTMIN | D n - x k -1 or 0 | Computes the minimal key k(represented by a Slice withndata bits) in dictionaryD, and returnskalong with the associated valuex. | |
| F483 | DICTMINREF | D n - c k -1 or 0 | Similar to DICTMIN, but returns the only reference in the value as a Cellc. | |
| F484 | DICTIMIN | D n - x i -1 or 0 | Similar to DICTMIN, but computes the minimal keyiunder the assumption that all keys are big-endian signedn-bit integers. Notice that the key and value returned may differ from those computed byDICTMINandDICTUMIN. | |
| F485 | DICTIMINREF | D n - c i -1 or 0 | Similar to DICTIMIN, but returns the only reference in the value. | |
| F486 | DICTUMIN | D n - x i -1 or 0 | Similar to DICTMIN, but returns the key as an unsignedn-bit Integeri. | |
| F487 | DICTUMINREF | D n - c i -1 or 0 | Similar to DICTUMIN, but returns the only reference in the value. | |
| F48A | DICTMAX | D n - x k -1 or 0 | Computes the maximal key k(represented by a Slice withndata bits) in dictionaryD, and returnskalong with the associated valuex. | |
| F48B | DICTMAXREF | D n - c k -1 or 0 | Similar to DICTMAX, but returns the only reference in the value. | |
| F48C | DICTIMAX | D n - x i -1 or 0 | Similar to DICTMAX, but computes the maximal keyiunder the assumption that all keys are big-endian signedn-bit integers. Notice that the key and value returned may differ from those computed byDICTMAXandDICTUMAX. | |
| F48D | DICTIMAXREF | D n - c i -1 or 0 | Similar to DICTIMAX, but returns the only reference in the value. | |
| F48E | DICTUMAX | D n - x i -1 or 0 | Similar to DICTMAX, but returns the key as an unsignedn-bit Integeri. | |
| F48F | DICTUMAXREF | D n - c i -1 or 0 | Similar to DICTUMAX, but returns the only reference in the value. | |
| F492 | DICTREMMIN | D n - D' x k -1 or D 0 | Computes the minimal key k(represented by a Slice withndata bits) in dictionaryD, removeskfrom the dictionary, and returnskalong with the associated valuexand the modified dictionaryD'. | |
| F493 | DICTREMMINREF | D n - D' c k -1 or D 0 | Similar to DICTREMMIN, but returns the only reference in the value as a Cellc. | |
| F494 | DICTIREMMIN | D n - D' x i -1 or D 0 | Similar to DICTREMMIN, but computes the minimal keyiunder the assumption that all keys are big-endian signedn-bit integers. Notice that the key and value returned may differ from those computed byDICTREMMINandDICTUREMMIN. | |
| F495 | DICTIREMMINREF | D n - D' c i -1 or D 0 | Similar to DICTIREMMIN, but returns the only reference in the value. | |
| F496 | DICTUREMMIN | D n - D' x i -1 or D 0 | Similar to DICTREMMIN, but returns the key as an unsignedn-bit Integeri. | |
| F497 | DICTUREMMINREF | D n - D' c i -1 or D 0 | Similar to DICTUREMMIN, but returns the only reference in the value. | |
| F49A | DICTREMMAX | D n - D' x k -1 or D 0 | Computes the maximal key k(represented by a Slice withndata bits) in dictionaryD, removeskfrom the dictionary, and returnskalong with the associated valuexand the modified dictionaryD'. | |
| F49B | DICTREMMAXREF | D n - D' c k -1 or D 0 | Similar to DICTREMMAX, but returns the only reference in the value as a Cellc. | |
| F49C | DICTIREMMAX | D n - D' x i -1 or D 0 | Similar to DICTREMMAX, but computes the minimal keyiunder the assumption that all keys are big-endian signedn-bit integers. Notice that the key and value returned may differ from those computed byDICTREMMAXandDICTUREMMAX. | |
| F49D | DICTIREMMAXREF | D n - D' c i -1 or D 0 | Similar to DICTIREMMAX, but returns the only reference in the value. | |
| F49E | DICTUREMMAX | D n - D' x i -1 or D 0 | Similar to DICTREMMAX, but returns the key as an unsignedn-bit Integeri. | |
| F49F | DICTUREMMAXREF | D n - D' c i -1 or D 0 | Similar to DICTUREMMAX, but returns the only reference in the value. | 
10.11 Special Get dictionary and prefix code dictionary operations and constant dictionaries
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F4A0 | DICTIGETJMP | i D n -  | Similar to DICTIGET, but withxBLESSed into a continuation with a subsequentJMPXto it on success. On failure, does nothing. This is useful for implementingswitch/caseconstructions. | |
| F4A1 | DICTUGETJMP | i D n -  | Similar to DICTIGETJMP, but performsDICTUGETinstead ofDICTIGET. | |
| F4A2 | DICTIGETEXEC | i D n -  | Similar to DICTIGETJMP, but withEXECUTEinstead ofJMPX. | |
| F4A3 | DICTUGETEXEC | i D n -  | Similar to DICTUGETJMP, but withEXECUTEinstead ofJMPX. | |
| F4A6_n | [ref] [n] DICTPUSHCONST |  - D n | Pushes a non-empty constant dictionary D(as aCell^?) along with its key length0 <= n <= 1023, stored as a part of the instruction. The dictionary itself is created from the first of remaining references of the current continuation. In this way, the completeDICTPUSHCONSTinstruction can be obtained by first serializingxF4A4_, then the non-empty dictionary itself (one1bit and a cell reference), and then the unsigned 10-bit integern(as if by aSTU 10instruction). An empty dictionary can be pushed by aNEWDICTprimitive instead. | 34 | 
| F4A8 | PFXDICTGETQ | s D n - s' x s'' -1 or s 0 | Looks up the unique prefix of Slice spresent in the prefix code dictionary represented byCell^?Dand0 <= n <= 1023. If found, the prefix ofsis returned ass', and the corresponding value (also a Slice) asx. The remainder ofsis returned as a Slices''. If no prefix ofsis a key in prefix code dictionaryD, returns the unchangedsand a zero flag to indicate failure. | |
| F4A9 | PFXDICTGET | s D n - s' x s'' | Similar to PFXDICTGET, but throws a cell deserialization failure exception on failure. | |
| F4AA | PFXDICTGETJMP | s D n - s' s'' or s | Similar to PFXDICTGETQ, but on successBLESSes the valuexinto a Continuation and transfers control to it as if by aJMPX. On failure, returnssunchanged and continues execution. | |
| F4AB | PFXDICTGETEXEC | s D n - s' s'' | Similar to PFXDICTGETJMP, butEXECutes the continuation found instead of jumping to it. On failure, throws a cell deserialization exception. | |
| F4AE_n | [ref] [n] PFXDICTCONSTGETJMP[ref] [n] PFXDICTSWITCH | s - s' s'' or s | Combines [n] DICTPUSHCONSTfor0 <= n <= 1023withPFXDICTGETJMP. | |
| F4BC | DICTIGETJMPZ | i D n - i or nothing | A variant of DICTIGETJMPthat returns indexion failure. | |
| F4BD | DICTUGETJMPZ | i D n - i or nothing | A variant of DICTUGETJMPthat returns indexion failure. | |
| F4BE | DICTIGETEXECZ | i D n - i or nothing | A variant of DICTIGETEXECthat returns indexion failure. | |
| F4BF | DICTUGETEXECZ | i D n - i or nothing | A variant of DICTUGETEXECthat returns indexion failure. | 
10.12 SubDict dictionary operations
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F4B1 | SUBDICTGET | k l D n - D' | Constructs a subdictionary consisting of all keys beginning with prefix k(represented by a Slice, the first0 <= l <= n <= 1023data bits of which are used as a key) of lengthlin dictionaryDof typeHashmapE(n,X)withn-bit keys. On success, returns the new subdictionary of the same typeHashmapE(n,X)as a SliceD'. | |
| F4B2 | SUBDICTIGET | x l D n - D' | Variant of SUBDICTGETwith the prefix represented by a signed big-endianl-bit Integerx, where necessarilyl <= 257. | |
| F4B3 | SUBDICTUGET | x l D n - D' | Variant of SUBDICTGETwith the prefix represented by an unsigned big-endianl-bit Integerx, where necessarilyl <= 256. | |
| F4B5 | SUBDICTRPGET | k l D n - D' | Similar to SUBDICTGET, but removes the common prefixkfrom all keys of the new dictionaryD', which becomes of typeHashmapE(n-l,X). | |
| F4B6 | SUBDICTIRPGET | x l D n - D' | Variant of SUBDICTRPGETwith the prefix represented by a signed big-endianl-bit Integerx, where necessarilyl <= 257. | |
| F4B7 | SUBDICTURPGET | x l D n - D' | Variant of SUBDICTRPGETwith the prefix represented by an unsigned big-endianl-bit Integerx, where necessarilyl <= 256. | 
11 Application-specific primitives
11.1 Gas-related primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F800 | ACCEPT | - | Sets current gas limit g_lto its maximal allowed valueg_m, and resets the gas creditg_cto zero, decreasing the value ofg_rbyg_cin the process.In other words, the current smart contract agrees to buy some gas to finish the current transaction. This action is required to process external messages, which bring no value (hence no gas) with themselves. | 26 | 
| F801 | SETGASLIMIT | g -  | Sets current gas limit g_lto the minimum ofgandg_m, and resets the gas creditg_cto zero. If the gas consumed so far (including the present instruction) exceeds the resulting value ofg_l, an (unhandled) out of gas exception is thrown before setting new gas limits. Notice thatSETGASLIMITwith an argumentg >= 2^63-1is equivalent toACCEPT. | 26 | 
| F80F | COMMIT | - | Commits the current state of registers c4(“persistent data'') andc5(“actions'') so that the current execution is considered “successful'' with the saved values even if an exception is thrown later. | 26 | 
11.2 Pseudo-random number generator primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F810 | RANDU256 | - x | Generates a new pseudo-random unsigned 256-bit Integer x. The algorithm is as follows: ifris the old value of the random seed, considered as a 32-byte array (by constructing the big-endian representation of an unsigned 256-bit integer), then itssha512(r)is computed; the first 32 bytes of this hash are stored as the new valuer'of the random seed, and the remaining 32 bytes are returned as the next random valuex. | 26+\|c7\|+\|c1_1\| | 
| F811 | RAND | y - z | Generates a new pseudo-random integer zin the range0...y-1(ory...-1, ify<0). More precisely, an unsigned random valuexis generated as inRAND256U; thenz:=floor(x*y/2^256)is computed.Equivalent to RANDU256256 MULRSHIFT. | 26+\|c7\|+\|c1_1\| | 
| F814 | SETRAND | x -  | Sets the random seed to unsigned 256-bit Integer x. | 26+\|c7\|+\|c1_1\| | 
| F815 | ADDRANDRANDOMIZE | x -  | Mixes unsigned 256-bit Integer xinto the random seedrby setting the random seed toShaof the concatenation of two 32-byte strings: the first with the big-endian representation of the old seedr, and the second with the big-endian representation ofx. | 26 | 
11.3 Configuration primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F82i | [i] GETPARAM |  - x | Returns the i-th parameter from the Tuple provided atc7for0 <= i <= 15. Equivalent toc7 PUSHCTRFIRST[i] INDEX.If one of these internal operations fails, throws an appropriate type checking or range checking exception. | 26 | 
| F823 | NOW |  - x | Returns the current Unix time as an Integer. If it is impossible to recover the requested value starting from c7, throws a type checking or range checking exception as appropriate.Equivalent to 3 GETPARAM. | 26 | 
| F824 | BLOCKLT |  - x | Returns the starting logical time of the current block. Equivalent to 4 GETPARAM. | 26 | 
| F825 | LTIME |  - x | Returns the logical time of the current transaction. Equivalent to 5 GETPARAM. | 26 | 
| F826 | RANDSEED |  - x | Returns the current random seed as an unsigned 256-bit Integer. Equivalent to 6 GETPARAM. | 26 | 
| F827 | BALANCE |  - t | Returns the remaining balance of the smart contract as a Tuple consisting of an Integer (the remaining Gram balance in nanograms) and a Maybe Cell (a dictionary with 32-bit keys representing the balance of “extra currencies''). Equivalent to 7 GETPARAM.Note that RAWprimitives such asSENDRAWMSGdo not update this field. | 26 | 
| F828 | MYADDR |  - s | Returns the internal address of the current smart contract as a Slice with a MsgAddressInt. If necessary, it can be parsed further using primitives such asPARSEMSGADDRorREWRITESTDADDR.Equivalent to 8 GETPARAM. | 26 | 
| F829 | CONFIGROOT |  - D | Returns the Maybe Cell Dwith the current global configuration dictionary. Equivalent to9 GETPARAM . | 26 | 
| F830 | CONFIGDICT |  - D 32 | Returns the global configuration dictionary along with its key length (32). Equivalent to CONFIGROOT32 PUSHINT. | 26 | 
| F832 | CONFIGPARAM | i - c -1 or 0 | Returns the value of the global configuration parameter with integer index ias a Cellc, and a flag to indicate success.Equivalent to CONFIGDICTDICTIGETREF. | |
| F833 | CONFIGOPTPARAM | i - c^? | Returns the value of the global configuration parameter with integer index ias a Maybe Cellc^?.Equivalent to CONFIGDICTDICTIGETOPTREF. | 
11.4 Global variable primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F840 | GETGLOBVAR | k - x | Returns the k-th global variable for0 <= k < 255.Equivalent to c7 PUSHCTRSWAPINDEXVARQ. | 26 | 
| F85_k | [k] GETGLOB |  - x | Returns the k-th global variable for1 <= k <= 31.Equivalent to c7 PUSHCTR[k] INDEXQ. | 26 | 
| F860 | SETGLOBVAR | x k -  | Assigns xto thek-th global variable for0 <= k < 255.Equivalent to c7 PUSHCTRROTREVSETINDEXVARQc7 POPCTR. | 26+\|c7’\| | 
| F87_k | [k] SETGLOB | x -  | Assigns xto thek-th global variable for1 <= k <= 31.Equivalent to c7 PUSHCTRSWAPk SETINDEXQc7 POPCTR. | 26+\|c7’\| | 
11.5 Hashing and cryptography primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F900 | HASHCU | c - x | Computes the representation hash of a Cell cand returns it as a 256-bit unsigned integerx. Useful for signing and checking signatures of arbitrary entities represented by a tree of cells. | 26 | 
| F901 | HASHSU | s - x | Computes the hash of a Slice sand returns it as a 256-bit unsigned integerx. The result is the same as if an ordinary cell containing only data and references fromshad been created and its hash computed byHASHCU. | 526 | 
| F902 | SHA256U | s - x | Computes Shaof the data bits of Slices. If the bit length ofsis not divisible by eight, throws a cell underflow exception. The hash value is returned as a 256-bit unsigned integerx. | 26 | 
| F910 | CHKSIGNU | h s k - ? | Checks the Ed25519-signature sof a hashh(a 256-bit unsigned integer, usually computed as the hash of some data) using public keyk(also represented by a 256-bit unsigned integer).The signature smust be a Slice containing at least 512 data bits; only the first 512 bits are used. The result is-1if the signature is valid,0otherwise.Notice that CHKSIGNUis equivalent toROTNEWC256 STUENDCROTREVCHKSIGNS, i.e., toCHKSIGNSwith the first argumentdset to 256-bit Slice containingh. Therefore, ifhis computed as the hash of some data, these data are hashed twice, the second hashing occurring insideCHKSIGNS. | 26 | 
| F911 | CHKSIGNS | d s k - ? | Checks whether sis a valid Ed25519-signature of the data portion of Slicedusing public keyk, similarly toCHKSIGNU. If the bit length of Slicedis not divisible by eight, throws a cell underflow exception. The verification of Ed25519 signatures is the standard one, withShaused to reducedto the 256-bit number that is actually signed. | 26 | 
11.6 Miscellaneous primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| F940 | CDATASIZEQ | c n - x y z -1 or 0 | Recursively computes the count of distinct cells x, data bitsy, and cell referenceszin the dag rooted at Cellc, effectively returning the total storage used by this dag taking into account the identification of equal cells. The values ofx,y, andzare computed by a depth-first traversal of this dag, with a hash table of visited cell hashes used to prevent visits of already-visited cells. The total count of visited cellsxcannot exceed non-negative Integern; otherwise the computation is aborted before visiting the(n+1)-st cell and a zero is returned to indicate failure. Ifcis Null, returnsx=y=z=0. | |
| F941 | CDATASIZE | c n - x y z | A non-quiet version of CDATASIZEQthat throws a cell overflow exception (8) on failure. | |
| F942 | SDATASIZEQ | s n - x y z -1 or 0 | Similar to CDATASIZEQ, but accepting a Slicesinstead of a Cell. The returned value ofxdoes not take into account the cell that contains the slicesitself; however, the data bits and the cell references ofsare accounted for inyandz. | |
| F943 | SDATASIZE | s n - x y z | A non-quiet version of SDATASIZEQthat throws a cell overflow exception (8) on failure. | 
11.7 Currency manipulation primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| FA00 | LDGRAMSLDVARUINT16 | s - x s' | Loads (deserializes) a GramorVarUInteger 16amount from Slices, and returns the amount as Integerxalong with the remainders'ofs. The expected serialization ofxconsists of a 4-bit unsigned big-endian integerl, followed by an8l-bit unsigned big-endian representation ofx.The net effect is approximately equivalent to 4 LDUSWAP3 LSHIFT#LDUX. | 26 | 
| FA01 | LDVARINT16 | s - x s' | Similar to LDVARUINT16, but loads a signed Integerx.Approximately equivalent to 4 LDUSWAP3 LSHIFT#LDIX. | 26 | 
| FA02 | STGRAMSSTVARUINT16 | b x - b' | Stores (serializes) an Integer xin the range0...2^120-1into Builderb, and returns the resulting Builderb'. The serialization ofxconsists of a 4-bit unsigned big-endian integerl, which is the smallest integerl>=0, such thatx<2^(8l), followed by an8l-bit unsigned big-endian representation ofx. Ifxdoes not belong to the supported range, a range check exception is thrown. | 26 | 
| FA03 | STVARINT16 | b x - b' | Similar to STVARUINT16, but serializes a signed Integerxin the range-2^119...2^119-1. | 26 | 
11.8 Message and address manipulation primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| FA40 | LDMSGADDR | s - s' s'' | Loads from Slice sthe only prefix that is a validMsgAddress, and returns both this prefixs'and the remainders''ofsas slices. | 26 | 
| FA41 | LDMSGADDRQ | s - s' s'' -1 or s 0 | A quiet version of LDMSGADDR: on success, pushes an extra-1; on failure, pushes the originalsand a zero. | 26 | 
| FA42 | PARSEMSGADDR | s - t | Decomposes Slice scontaining a validMsgAddressinto a Tupletwith separate fields of thisMsgAddress. Ifsis not a validMsgAddress, a cell deserialization exception is thrown. | 26 | 
| FA43 | PARSEMSGADDRQ | s - t -1 or 0 | A quiet version of PARSEMSGADDR: returns a zero on error instead of throwing an exception. | 26 | 
| FA44 | REWRITESTDADDR | s - x y | Parses Slice scontaining a validMsgAddressInt(usually amsg_addr_std), applies rewriting from theanycast(if present) to the same-length prefix of the address, and returns both the workchainxand the 256-bit addressyas integers. If the address is not 256-bit, or ifsis not a valid serialization ofMsgAddressInt, throws a cell deserialization exception. | 26 | 
| FA45 | REWRITESTDADDRQ | s - x y -1 or 0 | A quiet version of primitive REWRITESTDADDR. | 26 | 
| FA46 | REWRITEVARADDR | s - x s' | A variant of REWRITESTDADDRthat returns the (rewritten) address as a Slices, even if it is not exactly 256 bit long (represented by amsg_addr_var). | 26 | 
| FA47 | REWRITEVARADDRQ | s - x s' -1 or 0 | A quiet version of primitive REWRITEVARADDR. | 26 | 
11.9 Outbound message and output action primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| FB00 | SENDRAWMSG | c x -  | Sends a raw message contained in Cell c, which should contain a correctly serialized objectMessage X, with the only exception that the source address is allowed to have dummy valueaddr_none(to be automatically replaced with the current smart-contract address), andihr_fee,fwd_fee,created_ltandcreated_atfields can have arbitrary values (to be rewritten with correct values during the action phase of the current transaction). Integer parameterxcontains the flags. Currentlyx=0is used for ordinary messages;x=128is used for messages that are to carry all the remaining balance of the current smart contract (instead of the value originally indicated in the message);x=64is used for messages that carry all the remaining value of the inbound message in addition to the value initially indicated in the new message (if bit 0 is not set, the gas fees are deducted from this amount);x'=x+1means that the sender wants to pay transfer fees separately;x'=x+2means that any errors arising while processing this message during the action phase should be ignored. Finally,x'=x+32means that the current account must be destroyed if its resulting balance is zero. This flag is usually employed together with+128. | 526 | 
| FB02 | RAWRESERVE | x y -  | Creates an output action which would reserve exactly xnanograms (ify=0), at mostxnanograms (ify=2), or all butxnanograms (ify=1ory=3), from the remaining balance of the account. It is roughly equivalent to creating an outbound message carryingxnanograms (orb-xnanograms, wherebis the remaining balance) to oneself, so that the subsequent output actions would not be able to spend more money than the remainder. Bit+2inymeans that the external action does not fail if the specified amount cannot be reserved; instead, all remaining balance is reserved. Bit+8inymeansx:=-xbefore performing any further actions. Bit+4inymeans thatxis increased by the original balance of the current account (before the compute phase), including all extra currencies, before performing any other checks and actions. Currentlyxmust be a non-negative integer, andymust be in the range0...15. | 526 | 
| FB03 | RAWRESERVEX | x D y -  | Similar to RAWRESERVE, but also accepts a dictionaryD(represented by a Cell or Null) with extra currencies. In this way currencies other than Grams can be reserved. | 526 | 
| FB04 | SETCODE | c -  | Creates an output action that would change this smart contract code to that given by Cell c. Notice that this change will take effect only after the successful termination of the current run of the smart contract. | 526 | 
| FB06 | SETLIBCODE | c x -  | Creates an output action that would modify the collection of this smart contract libraries by adding or removing library with code given in Cell c. Ifx=0, the library is actually removed if it was previously present in the collection (if not, this action does nothing). Ifx=1, the library is added as a private library, and ifx=2, the library is added as a public library (and becomes available to all smart contracts if the current smart contract resides in the masterchain); if the library was present in the collection before, its public/private status is changed according tox. Also,16can be added toxto enable bounce transaction on failure. Values ofxother than0...2 (+16 possible)are invalid. | 526 | 
| FB07 | CHANGELIB | h x -  | Creates an output action similarly to SETLIBCODE, but instead of the library code accepts its hash as an unsigned 256-bit integerh. Ifx!=0and the library with hashhis absent from the library collection of this smart contract, this output action will fail. | 526 | 
12 Debug primitives
Opcodes beginning with FE are reserved for the debug primitives. These primitives have known fixed operation length and behave as (multibyte) NOP operations.
However, when invoked in a TVM instance with debug mode enabled, these primitives can produce a specific output into the text debug log of the TVM instance, never affecting the TVM state.
DEBUG and DEBUGSTR are the two debug primitives, they cover all opcodes that start with FE.
Other primitives listed here have opcodes from the same set. When debug is enabled, they have their specified effects. When debug is disabled, they behave as NOP.
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| FEnn | {nn} DEBUG | - | 0 <= nn < 240 | 26 | 
| FEFnssss | {string} DEBUGSTR{string} {x} DEBUGSTRI | - | 0 <= n < 16. Length ofssssisn+1bytes.{string}is a string literal.DEBUGSTR:ssssis the given string.DEBUGSTRI:ssssis one-byte integer0 <= x <= 255followed by the given string. | 26 | 
| FE00 | DUMPSTK | - | Dumps the stack (at most the top 255 values) and shows the total stack depth. | 26 | 
| FE2i | s[i] DUMP | - | Dumps s[i]. | 26 | 
13 Codepage primitives
| xxxxxxx Opcode | xxxxxxxxxxxxxxxxxxxxxxxxxxxx Fift syntax | xxxxxxxxxxxxxxxxx Stack | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Description | xxxx Gas | 
|---|---|---|---|---|
| FFnn | [nn] SETCP | - | Selects TVM codepage 0 <= nn < 240. If the codepage is not supported, throws an invalid opcode exception. | 26 | 
| FF00 | SETCP0 | - | Selects TVM (test) codepage zero as described in this document. | 26 | 
| FFFz | [z-16] SETCP | - | Selects TVM codepage z-16for1 <= z <= 15. Negative codepages-13...-1are reserved for restricted versions of TVM needed to validate runs of TVM in other codepages. Negative codepage-14is reserved for experimental codepages, not necessarily compatible between different TVM implementations, and should be disabled in the production versions of TVM. | 26 | 
| FFF0 | SETCPX | c -  | Selects codepage cwith-2^15 <= c < 2^15passed in the top of the stack. | 26 | 
See Also
- TVM Overview
- TVM Instructions
- TON TVM TVM Concepts(may include outdated information)