From fe849e323526ea132c2a3ab41c8351a24f6e9cf4 Mon Sep 17 00:00:00 2001
From: David Banks <47112877+dbanks12@users.noreply.github.com>
Date: Thu, 7 Dec 2023 11:55:51 -0500
Subject: [PATCH] docs(yellowpaper): rewrite section on tagged memory, misc
rewording/cleanup (#3523)
[See preview
here](https://aztec-packages.vercel.app/docs/public-vm/state-model#types-and-tagged-memory)
- Reworded and cleaned up tagged memory doc, merged it into state model
doc
- Moved random short section on VM security into a separate file
- Made bit-format images opaque
- Did some renaming (in-tag, dst-tag)
- Moved image files to simpler paths
- Misc other cleanup
---
yellow-paper/docs/public-vm/Types.mdx | 0
yellow-paper/docs/public-vm/alu.md | 2 +-
yellow-paper/docs/public-vm/control-flow.md | 2 +-
.../docs/public-vm/gen/_InstructionSet.mdx | 470 +++++++++---------
.../public-vm/gen/images/bit-formats/ADD.png | Bin 5053 -> 5422 bytes
.../gen/images/bit-formats/ADDRESS.png | Bin 3224 -> 3561 bytes
.../public-vm/gen/images/bit-formats/AND.png | Bin 5072 -> 5445 bytes
.../images/bit-formats/BLOCKL1GASLIMIT.png | Bin 3203 -> 3541 bytes
.../images/bit-formats/BLOCKL2GASLIMIT.png | Bin 3216 -> 3564 bytes
.../gen/images/bit-formats/BLOCKNUMBER.png | Bin 3172 -> 3517 bytes
.../gen/images/bit-formats/BLOCKSROOT.png | Bin 4134 -> 4449 bytes
.../public-vm/gen/images/bit-formats/CALL.png | Bin 9061 -> 8813 bytes
.../gen/images/bit-formats/CALLDATACOPY.png | Bin 4636 -> 5315 bytes
.../gen/images/bit-formats/CALLDEPTH.png | Bin 3213 -> 3552 bytes
.../gen/images/bit-formats/CALLER.png | Bin 3204 -> 3546 bytes
.../public-vm/gen/images/bit-formats/CAST.png | Bin 4407 -> 4686 bytes
.../gen/images/bit-formats/CHAINID.png | Bin 3178 -> 3521 bytes
.../public-vm/gen/images/bit-formats/CMOV.png | Bin 5377 -> 5853 bytes
.../gen/images/bit-formats/COINBASE.png | Bin 3200 -> 3542 bytes
.../gen/images/bit-formats/CONTRACTSROOT.png | Bin 4158 -> 4467 bytes
.../public-vm/gen/images/bit-formats/DIV.png | Bin 5061 -> 5438 bytes
.../gen/images/bit-formats/EMITNOTEHASH.png | Bin 3318 -> 3653 bytes
.../gen/images/bit-formats/EMITNULLIFIER.png | Bin 3274 -> 3593 bytes
.../public-vm/gen/images/bit-formats/EQ.png | Bin 5073 -> 5438 bytes
.../gen/images/bit-formats/FEEPERL1GAS.png | Bin 3188 -> 3539 bytes
.../gen/images/bit-formats/FEEPERL2GAS.png | Bin 3220 -> 3553 bytes
.../gen/images/bit-formats/GLOBALSHASH.png | Bin 4129 -> 4450 bytes
.../gen/images/bit-formats/GRANDROOT.png | Bin 4143 -> 4453 bytes
.../public-vm/gen/images/bit-formats/JUMP.png | Bin 2367 -> 2873 bytes
.../gen/images/bit-formats/JUMPI.png | Bin 3916 -> 4232 bytes
.../gen/images/bit-formats/L1GAS.png | Bin 3218 -> 3554 bytes
.../gen/images/bit-formats/L2GAS.png | Bin 3232 -> 3565 bytes
.../public-vm/gen/images/bit-formats/LT.png | Bin 5074 -> 5422 bytes
.../public-vm/gen/images/bit-formats/LTE.png | Bin 5071 -> 5441 bytes
.../public-vm/gen/images/bit-formats/MOV.png | Bin 3994 -> 4293 bytes
.../gen/images/bit-formats/MSGSROOT.png | Bin 4139 -> 4441 bytes
.../public-vm/gen/images/bit-formats/NOT.png | Bin 4352 -> 4670 bytes
.../gen/images/bit-formats/NOTESROOT.png | Bin 4173 -> 4464 bytes
.../gen/images/bit-formats/NULLIFIERSROOT.png | Bin 4158 -> 4462 bytes
.../public-vm/gen/images/bit-formats/OR.png | Bin 5057 -> 5424 bytes
.../gen/images/bit-formats/ORIGIN.png | Bin 3197 -> 3550 bytes
.../gen/images/bit-formats/PORTAL.png | Bin 3204 -> 3547 bytes
.../gen/images/bit-formats/PUBLICDATAROOT.png | Bin 4165 -> 4473 bytes
.../gen/images/bit-formats/REFUNDEE.png | Bin 3210 -> 3553 bytes
.../gen/images/bit-formats/RETURN.png | Bin 3895 -> 4341 bytes
.../gen/images/bit-formats/REVERT.png | Bin 3886 -> 4341 bytes
.../gen/images/bit-formats/SENDL2TOL1MSG.png | Bin 3267 -> 3591 bytes
.../public-vm/gen/images/bit-formats/SET.png | Bin 7004 -> 6614 bytes
.../public-vm/gen/images/bit-formats/SHL.png | Bin 5048 -> 5419 bytes
.../public-vm/gen/images/bit-formats/SHR.png | Bin 5066 -> 5425 bytes
.../gen/images/bit-formats/SLOAD.png | Bin 3969 -> 4292 bytes
.../gen/images/bit-formats/SSTORE.png | Bin 4021 -> 4329 bytes
.../gen/images/bit-formats/STATICCALL.png | Bin 9056 -> 8813 bytes
.../public-vm/gen/images/bit-formats/SUB.png | Bin 5057 -> 5414 bytes
.../gen/images/bit-formats/TIMESTAMP.png | Bin 3223 -> 3552 bytes
.../public-vm/gen/images/bit-formats/ULOG.png | Bin 3861 -> 4435 bytes
.../gen/images/bit-formats/VERSION.png | Bin 3194 -> 3530 bytes
.../public-vm/gen/images/bit-formats/XOR.png | Bin 5089 -> 5451 bytes
.../{gen/images/alu => images}/alu.png | Bin
.../avm-control-flow.png | Bin
.../images/state-model => images}/memory.png | Bin
yellow-paper/docs/public-vm/security.md | 4 +
yellow-paper/docs/public-vm/state-model.md | 147 ++++--
yellow-paper/docs/public-vm/tagged-memory.md | 60 ---
.../InstructionSet/InstructionSet.js | 144 +++---
.../InstructionSet/InstructionSize.js | 8 +-
.../InstructionSet/genBitFormats.js | 1 +
...uctionSetMarkdownGen.js => genMarkdown.js} | 4 +-
yellow-paper/src/preprocess/index.js | 2 +-
69 files changed, 429 insertions(+), 415 deletions(-)
delete mode 100644 yellow-paper/docs/public-vm/Types.mdx
rename yellow-paper/docs/public-vm/{gen/images/alu => images}/alu.png (100%)
rename yellow-paper/docs/public-vm/{gen/images/control-flow => images}/avm-control-flow.png (100%)
rename yellow-paper/docs/public-vm/{gen/images/state-model => images}/memory.png (100%)
create mode 100644 yellow-paper/docs/public-vm/security.md
delete mode 100644 yellow-paper/docs/public-vm/tagged-memory.md
rename yellow-paper/src/preprocess/InstructionSet/{InstructionSetMarkdownGen.js => genMarkdown.js} (96%)
diff --git a/yellow-paper/docs/public-vm/Types.mdx b/yellow-paper/docs/public-vm/Types.mdx
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/yellow-paper/docs/public-vm/alu.md b/yellow-paper/docs/public-vm/alu.md
index bd83dde6a23..d4c0066d936 100644
--- a/yellow-paper/docs/public-vm/alu.md
+++ b/yellow-paper/docs/public-vm/alu.md
@@ -6,7 +6,7 @@ This component of the VM circuit evaluates both base-2 arithmetic operations and
The following block diagram maps out an draft of the internal components of the "ALU"
-![](./gen/images/alu/alu.png)
+![](./images/alu.png)
Notes:
diff --git a/yellow-paper/docs/public-vm/control-flow.md b/yellow-paper/docs/public-vm/control-flow.md
index 707e78ecf8b..836697fa346 100644
--- a/yellow-paper/docs/public-vm/control-flow.md
+++ b/yellow-paper/docs/public-vm/control-flow.md
@@ -14,7 +14,7 @@ The intention is for sub-operations to be implementable as independent VM circui
# Control flow
-![](./gen/images/control-flow/avm-control-flow.png)
+![](./images/avm-control-flow.png)
> Notation note: whenever the VM "sends a signal" to one or more VM components, this is analogous to defining a boolean column in the execution trace that toggles on/off specific functionality
diff --git a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx
index ba11a18a0e9..4f13ec9bd98 100644
--- a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx
+++ b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx
@@ -1,7 +1,7 @@
[comment]: # (THIS IS A GENERATED FILE! DO NOT EDIT!)
[comment]: # (Generated via `yarn preprocess`)
-[comment]: # (Generated by InstructionSetMarkdownGen.tsx and InstructionSet.js)
+[comment]: # (Generated by genMarkdown.js, InstructionSet.js, InstructionSize.js)
import Markdown from 'react-markdown'
import CodeBlock from '@theme/CodeBlock'
@@ -16,7 +16,7 @@ Click on an instruction name to jump to its section.
0x00 | [`ADD`](#isa-section-add) |
Addition (a + b) |
- 96 |
+ 128 |
{
`M[dstOffset] = M[aOffset] + M[bOffset] mod 2^k`
} |
@@ -24,7 +24,7 @@ Click on an instruction name to jump to its section.
0x01 | [`SUB`](#isa-section-sub) |
Subtraction (a - b) |
- 96 |
+ 128 |
{
`M[dstOffset] = M[aOffset] - M[bOffset] mod 2^k`
} |
@@ -32,7 +32,7 @@ Click on an instruction name to jump to its section.
0x02 | [`DIV`](#isa-section-div) |
Unsigned division (a / b) |
- 96 |
+ 128 |
{
`M[dstOffset] = M[aOffset] / M[bOffset]`
} |
@@ -40,7 +40,7 @@ Click on an instruction name to jump to its section.
0x03 | [`EQ`](#isa-section-eq) |
Equality check (a == b) |
- 96 |
+ 128 |
{
`M[dstOffset] = M[aOffset] == M[bOffset] ? 1 : 0`
} |
@@ -48,7 +48,7 @@ Click on an instruction name to jump to its section.
0x04 | [`LT`](#isa-section-lt) |
Less-than check (a < b) |
- 96 |
+ 128 |
{
`M[dstOffset] = M[aOffset] < M[bOffset] ? 1 : 0`
} |
@@ -56,7 +56,7 @@ Click on an instruction name to jump to its section.
0x05 | [`LTE`](#isa-section-lte) |
Less-than-or-equals check (a <= b) |
- 96 |
+ 128 |
{
`M[dstOffset] = M[aOffset] <= M[bOffset] ? 1 : 0`
} |
@@ -64,7 +64,7 @@ Click on an instruction name to jump to its section.
0x06 | [`AND`](#isa-section-and) |
Bitwise AND (a & b) |
- 96 |
+ 128 |
{
`M[dstOffset] = M[aOffset] AND M[bOffset]`
} |
@@ -72,7 +72,7 @@ Click on an instruction name to jump to its section.
0x07 | [`OR`](#isa-section-or) |
Bitwise OR (a | b) |
- 96 |
+ 128 |
{
`M[dstOffset] = M[aOffset] OR M[bOffset]`
} |
@@ -80,7 +80,7 @@ Click on an instruction name to jump to its section.
0x08 | [`XOR`](#isa-section-xor) |
Bitwise XOR (a ^ b) |
- 96 |
+ 128 |
{
`M[dstOffset] = M[aOffset] XOR M[bOffset]`
} |
@@ -88,7 +88,7 @@ Click on an instruction name to jump to its section.
0x09 | [`NOT`](#isa-section-not) |
Bitwise NOT (inversion) |
- 72 |
+ 96 |
{
`M[dstOffset] = NOT M[aOffset]`
} |
@@ -96,7 +96,7 @@ Click on an instruction name to jump to its section.
0x0a | [`SHL`](#isa-section-shl) |
Bitwise leftward shift (a << b) |
- 96 |
+ 128 |
{
`M[dstOffset] = M[aOffset] << M[bOffset]`
} |
@@ -104,7 +104,7 @@ Click on an instruction name to jump to its section.
0x0b | [`SHR`](#isa-section-shr) |
Bitwise rightward shift (a >> b) |
- 96 |
+ 128 |
{
`M[dstOffset] = M[aOffset] >> M[bOffset]`
} |
@@ -112,15 +112,15 @@ Click on an instruction name to jump to its section.
0x0c | [`CAST`](#isa-section-cast) |
Type cast |
- 72 |
+ 96 |
{
- `M[dstOffset] = cast(M[aOffset])`
+ `M[dstOffset] = cast(M[aOffset])`
} |
0x0d | [`SET`](#isa-section-set) |
Set a memory word from a constant in the bytecode. |
- 48+N |
+ 64+N |
{
`M[dstOffset] = const`
} |
@@ -128,7 +128,7 @@ Click on an instruction name to jump to its section.
0x0e | [`MOV`](#isa-section-mov) |
Move a word from source memory location to destination`. |
- 64 |
+ 88 |
{
`M[dstOffset] = M[srcOffset]`
} |
@@ -136,7 +136,7 @@ Click on an instruction name to jump to its section.
0x0f | [`CMOV`](#isa-section-cmov) |
Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`). |
- 112 |
+ 152 |
{
`M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]`
} |
@@ -144,15 +144,15 @@ Click on an instruction name to jump to its section.
0x10 | [`CALLDATACOPY`](#isa-section-calldatacopy) |
Copy calldata into memory. |
- 88 |
+ 120 |
{
- `M[dstOffset:dstOffset+size] = calldata[cdOffset:cdOffset+size]`
+ `M[dstOffset:dstOffset+copySize] = calldata[cdOffset:cdOffset+copySize]`
} |
0x11 | [`SLOAD`](#isa-section-sload) |
Load a word from storage. |
- 64 |
+ 88 |
{
`M[dstOffset] = storage[M[slotOffset]]`
} |
@@ -160,7 +160,7 @@ Click on an instruction name to jump to its section.
0x12 | [`SSTORE`](#isa-section-sstore) |
Write a word to storage. |
- 64 |
+ 88 |
{
`storage[M[slotOffset]] = M[srcOffset]`
} |
@@ -168,25 +168,25 @@ Click on an instruction name to jump to its section.
0x13 | [`EMITNOTEHASH`](#isa-section-emitnotehash) |
Emit a new note hash to be inserted into the notes tree |
- 40 |
+ 56 |
emitNoteHash(M[contentOffset]) |
0x14 | [`EMITNULLIFIER`](#isa-section-emitnullifier) |
Emit a new nullifier to be inserted into the nullifier tree |
- 40 |
+ 56 |
emitNullifier(M[nullifierOffset]) |
0x15 | [`SENDL2TOL1MSG`](#isa-section-sendl2tol1msg) |
Send an L2-to-L1 message |
- 40 |
+ 56 |
sendL2ToL1Message(M[contentOffset]) |
0x16 | [`JUMP`](#isa-section-jump) |
Jump to a location in the bytecode. |
- 32 |
+ 48 |
{
`PC = loc`
} |
@@ -194,7 +194,7 @@ Click on an instruction name to jump to its section.
0x17 | [`JUMPI`](#isa-section-jumpi) |
Conditionally jump to a location in the bytecode. |
- 64 |
+ 88 |
{
`PC = M[condOffset] > 0 ? loc : PC`
} |
@@ -202,26 +202,26 @@ Click on an instruction name to jump to its section.
0x18 | [`RETURN`](#isa-section-return) |
Halt execution with `success`, optionally returning some data. |
- 64 |
+ 88 |
{
- `return(M[offset:offset+size])`
+ `return(M[retOffset:retOffset+retSize])`
} |
0x19 | [`REVERT`](#isa-section-revert) |
Halt execution with `failure`, reverting state changes and optionally returning some data. |
- 64 |
+ 88 |
{
- `revert(M[offset:offset+size])`
+ `revert(M[retOffset:retOffset+retSize])`
} |
0x1a | [`CALL`](#isa-section-call) |
Call into another contract. |
- 208 |
+ 248 |
{`M[successOffset] = call(
- M[l1GasOffset], M[l2GasOffset], M[addrOffset],
+ M[gasOffset], M[gasOffset+1], M[addrOffset],
M[argsOffset], M[argsSize],
M[retOffset], M[retSize])`}
|
@@ -229,10 +229,10 @@ Click on an instruction name to jump to its section.
0x1b | [`STATICCALL`](#isa-section-staticcall) |
Call into another contract, disallowing persistent state modifications. |
- 208 |
+ 248 |
{`M[successOffset] = staticcall(
- M[l1GasOffset], M[l2GasOffset], M[addrOffset],
+ M[gasOffset], M[gasOffset+1], M[addrOffset],
M[argsOffset], M[argsSize],
M[retOffset], M[retSize])`}
|
@@ -240,15 +240,15 @@ Click on an instruction name to jump to its section.
0x1c | [`ULOG`](#isa-section-ulog) |
Emit an unencrypted log with data from the `field` memory page |
- 64 |
+ 88 |
{
- `ulog(M[offset:offset+size])`
+ `ulog(M[logOffset:logOffset+logSize])`
} |
0x1d | [`CHAINID`](#isa-section-chainid) |
Get this rollup's L1 chain ID |
- 40 |
+ 56 |
{
`M[dstOffset] = Globals.chainId`
} |
@@ -256,7 +256,7 @@ Click on an instruction name to jump to its section.
0x1e | [`VERSION`](#isa-section-version) |
Get this rollup's L2 version ID |
- 40 |
+ 56 |
{
`M[dstOffset] = Globals.version`
} |
@@ -264,7 +264,7 @@ Click on an instruction name to jump to its section.
0x1f | [`BLOCKNUMBER`](#isa-section-blocknumber) |
Get this block's number |
- 40 |
+ 56 |
{
`M[dstOffset] = Globals.blocknumber`
} |
@@ -272,7 +272,7 @@ Click on an instruction name to jump to its section.
0x20 | [`TIMESTAMP`](#isa-section-timestamp) |
Get this L2 block's timestamp |
- 40 |
+ 56 |
{
`M[dstOffset] = Globals.timestamp`
} |
@@ -280,7 +280,7 @@ Click on an instruction name to jump to its section.
0x21 | [`COINBASE`](#isa-section-coinbase) |
Get the block's beneficiary address |
- 40 |
+ 56 |
{
`M[dstOffset] = Globals.coinbase`
} |
@@ -288,7 +288,7 @@ Click on an instruction name to jump to its section.
0x22 | [`BLOCKL1GASLIMIT`](#isa-section-blockl1gaslimit) |
Total amount of "L1 gas" that a block can consume |
- 40 |
+ 56 |
{
`M[dstOffset] = Globals.l1GasLimit`
} |
@@ -296,7 +296,7 @@ Click on an instruction name to jump to its section.
0x23 | [`BLOCKL2GASLIMIT`](#isa-section-blockl2gaslimit) |
Total amount of "L2 gas" that a block can consume |
- 40 |
+ 56 |
{
`M[dstOffset] = Globals.l2GasLimit`
} |
@@ -304,7 +304,7 @@ Click on an instruction name to jump to its section.
0x24 | [`NOTESROOT`](#isa-section-notesroot) |
Get the historical note-hash tree root as of the specified block number. |
- 64 |
+ 88 |
{
`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].note_hash_tree_root`
} |
@@ -312,7 +312,7 @@ Click on an instruction name to jump to its section.
0x25 | [`NULLIFIERSROOT`](#isa-section-nullroot) |
Get the historical nullifier tree root as of the specified block number. |
- 64 |
+ 88 |
{
`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].nullifier_tree_root`
} |
@@ -320,7 +320,7 @@ Click on an instruction name to jump to its section.
0x26 | [`CONTRACTSROOT`](#isa-section-contractsroot) |
Get the historical contracts tree root as of the specified block number. |
- 64 |
+ 88 |
{
`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].contracts_tree_root`
} |
@@ -328,7 +328,7 @@ Click on an instruction name to jump to its section.
0x27 | [`MSGSROOT`](#isa-section-msgsroot) |
Get the historical l1-to-l2 messages tree root as of the specified block number. |
- 64 |
+ 88 |
{
`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].l1_to_l2_messages_tree_root`
} |
@@ -336,7 +336,7 @@ Click on an instruction name to jump to its section.
0x28 | [`NOTESROOT`](#isa-section-notesroot) |
Get the historical note-hash tree root as of the specified block number. |
- 64 |
+ 88 |
{
`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].note_hash_tree_root`
} |
@@ -344,7 +344,7 @@ Click on an instruction name to jump to its section.
0x29 | [`PUBLICDATAROOT`](#isa-section-publicdataroot) |
Get the historical public data tree root as of the specified block number. |
- 64 |
+ 88 |
{
`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].public_data_tree_root`
} |
@@ -352,7 +352,7 @@ Click on an instruction name to jump to its section.
0x2a | [`GLOBALSHASH`](#isa-section-globalshash) |
Get the historical global variables hash as of the specified block number. |
- 64 |
+ 88 |
{
`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].global_variables_hash`
} |
@@ -360,7 +360,7 @@ Click on an instruction name to jump to its section.
0x2b | [`BLOCKSROOT`](#isa-section-blocksroot) |
Get the historical blocks tree root as of the specified block number. |
- 64 |
+ 88 |
{
`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].archive_root`
} |
@@ -368,7 +368,7 @@ Click on an instruction name to jump to its section.
0x2c | [`GRANDROOT`](#isa-section-grandroot) |
Get the historical grandfather tree root as of the specified block number. |
- 64 |
+ 88 |
{
`M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].grandfather_tree_root`
} |
@@ -376,7 +376,7 @@ Click on an instruction name to jump to its section.
0x2d | [`ORIGIN`](#isa-section-origin) |
Get the transaction's origination address |
- 40 |
+ 56 |
{
`M[dstOffset] = TxContext.origin`
} |
@@ -384,7 +384,7 @@ Click on an instruction name to jump to its section.
0x2e | [`REFUNDEE`](#isa-section-refundee) |
The recipient of fee refunds for this transaction |
- 40 |
+ 56 |
{
`M[dstOffset] = TxContext.refundee`
} |
@@ -392,7 +392,7 @@ Click on an instruction name to jump to its section.
0x2f | [`FEEPERL1GAS`](#isa-section-feeperl1gas) |
The fee to be paid per "L1 gas" - set by the transaction's original caller |
- 40 |
+ 56 |
{
`M[dstOffset] = TxContext.feePerL1Gas`
} |
@@ -400,7 +400,7 @@ Click on an instruction name to jump to its section.
0x30 | [`FEEPERL2GAS`](#isa-section-feeperl2gas) |
The fee to be paid per "L2 gas" - set by the transaction's original caller |
- 40 |
+ 56 |
{
`M[dstOffset] = TxContext.feePerL2Gas`
} |
@@ -408,7 +408,7 @@ Click on an instruction name to jump to its section.
0x31 | [`CALLER`](#isa-section-caller) |
Get the address of the sender (the caller's context) |
- 40 |
+ 56 |
{
`M[dstOffset] = CallContext.sender`
} |
@@ -416,7 +416,7 @@ Click on an instruction name to jump to its section.
0x32 | [`ADDRESS`](#isa-section-address) |
Get the address of the currently executing l2 contract |
- 40 |
+ 56 |
{
`M[dstOffset] = CallContext.storageContractAddress`
} |
@@ -424,7 +424,7 @@ Click on an instruction name to jump to its section.
0x33 | [`PORTAL`](#isa-section-portal) |
Get the address of the l1 portal contract |
- 40 |
+ 56 |
{
`M[dstOffset] = CallContext.portalAddress`
} |
@@ -432,7 +432,7 @@ Click on an instruction name to jump to its section.
0x34 | [`CALLDEPTH`](#isa-section-calldepth) |
Get how many calls deep the current call context is |
- 40 |
+ 56 |
{
`M[dstOffset] = CallContext.calldepth`
} |
@@ -440,7 +440,7 @@ Click on an instruction name to jump to its section.
0x35 | [`L1GAS`](#isa-section-l1gas) |
Remaining "L1 gas" for this call (after this instruction). |
- 40 |
+ 56 |
{
`M[dstOffset] = LatestContext.l1Gas`
} |
@@ -448,7 +448,7 @@ Click on an instruction name to jump to its section.
0x36 | [`L2GAS`](#isa-section-l2gas) |
Remaining "L2 gas" for this call (after this instruction). |
- 40 |
+ 56 |
{
`M[dstOffset] = LatestContext.l2Gas`
} |
@@ -466,17 +466,17 @@ Addition (a + b)
- **Category**: arithmetic
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's left input
- **bOffset**: memory offset of the operation's right input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = M[aOffset] + M[bOffset] mod 2^k`
-- **Tag checks**: `T[aOffset] == T[bOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 96
+- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 128
-![](./images/bit-formats/ADD.png)
+[![](./images/bit-formats/ADD.png)](./images/bit-formats/ADD.png)
### `SUB` (0x01)
Subtraction (a - b)
@@ -486,17 +486,17 @@ Subtraction (a - b)
- **Category**: arithmetic
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's left input
- **bOffset**: memory offset of the operation's right input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = M[aOffset] - M[bOffset] mod 2^k`
-- **Tag checks**: `T[aOffset] == T[bOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 96
+- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 128
-![](./images/bit-formats/SUB.png)
+[![](./images/bit-formats/SUB.png)](./images/bit-formats/SUB.png)
### `DIV` (0x02)
Unsigned division (a / b)
@@ -506,17 +506,17 @@ Unsigned division (a / b)
- **Category**: arithmetic
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's left input
- **bOffset**: memory offset of the operation's right input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = M[aOffset] / M[bOffset]`
-- **Tag checks**: `T[aOffset] == T[bOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 96
+- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 128
-![](./images/bit-formats/DIV.png)
+[![](./images/bit-formats/DIV.png)](./images/bit-formats/DIV.png)
### `EQ` (0x03)
Equality check (a == b)
@@ -526,17 +526,17 @@ Equality check (a == b)
- **Category**: conditional
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's left input
- **bOffset**: memory offset of the operation's right input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = M[aOffset] == M[bOffset] ? 1 : 0`
-- **Tag checks**: `T[aOffset] == T[bOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 96
+- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 128
-![](./images/bit-formats/EQ.png)
+[![](./images/bit-formats/EQ.png)](./images/bit-formats/EQ.png)
### `LT` (0x04)
Less-than check (a < b)
@@ -546,17 +546,17 @@ Less-than check (a < b)
- **Category**: conditional
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's left input
- **bOffset**: memory offset of the operation's right input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = M[aOffset] < M[bOffset] ? 1 : 0`
-- **Tag checks**: `T[aOffset] == T[bOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 96
+- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 128
-![](./images/bit-formats/LT.png)
+[![](./images/bit-formats/LT.png)](./images/bit-formats/LT.png)
### `LTE` (0x05)
Less-than-or-equals check (a <= b)
@@ -566,17 +566,17 @@ Less-than-or-equals check (a <= b)
- **Category**: conditional
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's left input
- **bOffset**: memory offset of the operation's right input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = M[aOffset] <= M[bOffset] ? 1 : 0`
-- **Tag checks**: `T[aOffset] == T[bOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 96
+- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 128
-![](./images/bit-formats/LTE.png)
+[![](./images/bit-formats/LTE.png)](./images/bit-formats/LTE.png)
### `AND` (0x06)
Bitwise AND (a & b)
@@ -586,17 +586,17 @@ Bitwise AND (a & b)
- **Category**: bitwise
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's left input
- **bOffset**: memory offset of the operation's right input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = M[aOffset] AND M[bOffset]`
-- **Tag checks**: `T[aOffset] == T[bOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 96
+- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 128
-![](./images/bit-formats/AND.png)
+[![](./images/bit-formats/AND.png)](./images/bit-formats/AND.png)
### `OR` (0x07)
Bitwise OR (a | b)
@@ -606,17 +606,17 @@ Bitwise OR (a | b)
- **Category**: bitwise
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's left input
- **bOffset**: memory offset of the operation's right input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = M[aOffset] OR M[bOffset]`
-- **Tag checks**: `T[aOffset] == T[bOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 96
+- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 128
-![](./images/bit-formats/OR.png)
+[![](./images/bit-formats/OR.png)](./images/bit-formats/OR.png)
### `XOR` (0x08)
Bitwise XOR (a ^ b)
@@ -626,17 +626,17 @@ Bitwise XOR (a ^ b)
- **Category**: bitwise
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's left input
- **bOffset**: memory offset of the operation's right input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = M[aOffset] XOR M[bOffset]`
-- **Tag checks**: `T[aOffset] == T[bOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 96
+- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 128
-![](./images/bit-formats/XOR.png)
+[![](./images/bit-formats/XOR.png)](./images/bit-formats/XOR.png)
### `NOT` (0x09)
Bitwise NOT (inversion)
@@ -646,16 +646,16 @@ Bitwise NOT (inversion)
- **Category**: bitwise
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = NOT M[aOffset]`
-- **Tag checks**: `T[aOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 72
+- **Tag checks**: `T[aOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 96
-![](./images/bit-formats/NOT.png)
+[![](./images/bit-formats/NOT.png)](./images/bit-formats/NOT.png)
### `SHL` (0x0a)
Bitwise leftward shift (a << b)
@@ -665,17 +665,17 @@ Bitwise leftward shift (a << b)
- **Category**: bitwise
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's left input
- **bOffset**: memory offset of the operation's right input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = M[aOffset] << M[bOffset]`
-- **Tag checks**: `T[aOffset] == T[bOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 96
+- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 128
-![](./images/bit-formats/SHL.png)
+[![](./images/bit-formats/SHL.png)](./images/bit-formats/SHL.png)
### `SHR` (0x0b)
Bitwise rightward shift (a >> b)
@@ -685,17 +685,17 @@ Bitwise rightward shift (a >> b)
- **Category**: bitwise
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with.
+ - **in-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with.
- **Args**:
- **aOffset**: memory offset of the operation's left input
- **bOffset**: memory offset of the operation's right input
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = M[aOffset] >> M[bOffset]`
-- **Tag checks**: `T[aOffset] == T[bOffset] == op-type`
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 96
+- **Tag checks**: `T[aOffset] == T[bOffset] == in-tag`
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 128
-![](./images/bit-formats/SHR.png)
+[![](./images/bit-formats/SHR.png)](./images/bit-formats/SHR.png)
### `CAST` (0x0c)
Type cast
@@ -705,16 +705,16 @@ Type cast
- **Category**: types
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **dest-type**: The [type/size](./Types) to tag the output with when different from `op-type`.
+ - **dst-tag**: The [tag/size](./state-model#tags-and-tagged-memory) to tag the destination with but not to check inputs against.
- **Args**:
- **aOffset**: memory offset of word to cast
- **dstOffset**: memory offset specifying where to store operation's result
-- **Expression**: `M[dstOffset] = cast(M[aOffset])`
-- **Details**: Cast a word in memory based on the `dest-type` specified in the bytecode. Truncates when casting to a smaller type, left-zero-pads when casting to a larger type.
-- **Tag updates**: `T[dstOffset] = dest-type`
-- **Bit-size**: 72
+- **Expression**: `M[dstOffset] = cast(M[aOffset])`
+- **Details**: Cast a word in memory based on the `dst-tag` specified in the bytecode. Truncates when casting to a smaller type, left-zero-pads when casting to a larger type. See [here](./state-model#cast-and-tag-conversions) for more details.
+- **Tag updates**: `T[dstOffset] = dst-tag`
+- **Bit-size**: 96
-![](./images/bit-formats/CAST.png)
+[![](./images/bit-formats/CAST.png)](./images/bit-formats/CAST.png)
### `SET` (0x0d)
Set a memory word from a constant in the bytecode.
@@ -724,16 +724,16 @@ Set a memory word from a constant in the bytecode.
- **Category**: memory
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- - **op-type**: The [type/size](./Types) to check inputs against and tag the output with. `field` type is NOT supported for SET.
+ - **in-tag**: The [type/size](./state-model#tags-and-tagged-memory) to check inputs against and tag the destination with. `field` type is NOT supported for SET.
- **Args**:
- **const**: an N-bit constant value from the bytecode to store in memory (any type except `field`)
- **dstOffset**: memory offset specifying where to store the constant
- **Expression**: `M[dstOffset] = const`
-- **Details**: Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `op-type`. It _cannot be 254 (`field` type)_!
-- **Tag updates**: `T[dstOffset] = op-type`
-- **Bit-size**: 48+N
+- **Details**: Set memory word at `dstOffset` to `const`'s immediate value. `const`'s bit-size (N) can be 8, 16, 32, 64, or 128 based on `in-tag`. It _cannot be 254 (`field` type)_!
+- **Tag updates**: `T[dstOffset] = in-tag`
+- **Bit-size**: 64+N
-![](./images/bit-formats/SET.png)
+[![](./images/bit-formats/SET.png)](./images/bit-formats/SET.png)
### `MOV` (0x0e)
Move a word from source memory location to destination`.
@@ -748,9 +748,9 @@ Move a word from source memory location to destination`.
- **dstOffset**: memory offset specifying where to store that word
- **Expression**: `M[dstOffset] = M[srcOffset]`
- **Tag updates**: `T[dstOffset] = T[srcOffset]`
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/MOV.png)
+[![](./images/bit-formats/MOV.png)](./images/bit-formats/MOV.png)
### `CMOV` (0x0f)
Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`).
@@ -768,9 +768,9 @@ Move a word (conditionally chosen) from one memory location to another (`d = con
- **Expression**: `M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]`
- **Details**: One of two source memory locations is chosen based on the condition. `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.
- **Tag updates**: `T[dstOffset] = M[condOffset] > 0 ? T[aOffset] : T[bOffset]`
-- **Bit-size**: 112
+- **Bit-size**: 152
-![](./images/bit-formats/CMOV.png)
+[![](./images/bit-formats/CMOV.png)](./images/bit-formats/CMOV.png)
### `CALLDATACOPY` (0x10)
Copy calldata into memory.
@@ -782,14 +782,14 @@ Copy calldata into memory.
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- **Args**:
- **cdOffset**: offset into calldata to copy from
- - **size**: number of words to copy
+ - **copySize**: number of words to copy
- **dstOffset**: memory offset specifying where to copy the first word to
-- **Expression**: `M[dstOffset:dstOffset+size] = calldata[cdOffset:cdOffset+size]`
+- **Expression**: `M[dstOffset:dstOffset+copySize] = calldata[cdOffset:cdOffset+copySize]`
- **Details**: Calldata is read-only and cannot be directly operated on by other instructions. This instruction moves words from calldata into memory so they can be operated on normally.
-- **Tag updates**: `T[dstOffset:dstOffset+size] = field`
-- **Bit-size**: 88
+- **Tag updates**: `T[dstOffset:dstOffset+copySize] = field`
+- **Bit-size**: 120
-![](./images/bit-formats/CALLDATACOPY.png)
+[![](./images/bit-formats/CALLDATACOPY.png)](./images/bit-formats/CALLDATACOPY.png)
### `SLOAD` (0x11)
Load a word from storage.
@@ -805,9 +805,9 @@ Load a word from storage.
- **Expression**: `M[dstOffset] = storage[M[slotOffset]]`
- **Details**: Load a word from this contract's persistent public storage into memory.
- **Tag updates**: `T[dstOffset] = field`
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/SLOAD.png)
+[![](./images/bit-formats/SLOAD.png)](./images/bit-formats/SLOAD.png)
### `SSTORE` (0x12)
Write a word to storage.
@@ -822,9 +822,9 @@ Write a word to storage.
- **slotOffset**: memory offset containing the storage slot to store to
- **Expression**: `storage[M[slotOffset]] = M[srcOffset]`
- **Details**: Store a word from memory into this contract's persistent public storage.
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/SSTORE.png)
+[![](./images/bit-formats/SSTORE.png)](./images/bit-formats/SSTORE.png)
### `EMITNOTEHASH` (0x13)
Emit a new note hash to be inserted into the notes tree
@@ -837,9 +837,9 @@ Emit a new note hash to be inserted into the notes tree
- **Args**:
- **noteHashOffset**: memory offset of the note hash
- **Expression**: emitNoteHash(M[contentOffset])
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/EMITNOTEHASH.png)
+[![](./images/bit-formats/EMITNOTEHASH.png)](./images/bit-formats/EMITNOTEHASH.png)
### `EMITNULLIFIER` (0x14)
Emit a new nullifier to be inserted into the nullifier tree
@@ -852,9 +852,9 @@ Emit a new nullifier to be inserted into the nullifier tree
- **Args**:
- **nullifierOffset**: memory offset of nullifier
- **Expression**: emitNullifier(M[nullifierOffset])
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/EMITNULLIFIER.png)
+[![](./images/bit-formats/EMITNULLIFIER.png)](./images/bit-formats/EMITNULLIFIER.png)
### `SENDL2TOL1MSG` (0x15)
Send an L2-to-L1 message
@@ -867,9 +867,9 @@ Send an L2-to-L1 message
- **Args**:
- **contentOffset**: memory offset of the message content
- **Expression**: sendL2ToL1Message(M[contentOffset])
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/SENDL2TOL1MSG.png)
+[![](./images/bit-formats/SENDL2TOL1MSG.png)](./images/bit-formats/SENDL2TOL1MSG.png)
### `JUMP` (0x16)
Jump to a location in the bytecode.
@@ -881,9 +881,9 @@ Jump to a location in the bytecode.
- **loc**: target location to jump to
- **Expression**: `PC = loc`
- **Details**: Target location is an immediate value (a constant in the bytecode).
-- **Bit-size**: 32
+- **Bit-size**: 48
-![](./images/bit-formats/JUMP.png)
+[![](./images/bit-formats/JUMP.png)](./images/bit-formats/JUMP.png)
### `JUMPI` (0x17)
Conditionally jump to a location in the bytecode.
@@ -898,9 +898,9 @@ Conditionally jump to a location in the bytecode.
- **condOffset**: memory offset of the operations 'conditional' input
- **Expression**: `PC = M[condOffset] > 0 ? loc : PC`
- **Details**: Target location is an immediate value (a constant in the bytecode). `T[condOffset]` is not checked because the greater-than-zero suboperation is the same regardless of type.
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/JUMPI.png)
+[![](./images/bit-formats/JUMPI.png)](./images/bit-formats/JUMPI.png)
### `RETURN` (0x18)
Halt execution with `success`, optionally returning some data.
@@ -911,13 +911,13 @@ Halt execution with `success`, optionally returning some data.
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- **Args**:
- - **offset**: memory offset of first word to return
- - **size**: number of words to return
-- **Expression**: `return(M[offset:offset+size])`
+ - **retOffset**: memory offset of first word to return
+ - **retSize**: number of words to return
+- **Expression**: `return(M[retOffset:retOffset+retSize])`
- **Details**: Return control flow to the calling context/contract.
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/RETURN.png)
+[![](./images/bit-formats/RETURN.png)](./images/bit-formats/RETURN.png)
### `REVERT` (0x19)
Halt execution with `failure`, reverting state changes and optionally returning some data.
@@ -928,13 +928,13 @@ Halt execution with `failure`, reverting state changes and optionally returning
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- **Args**:
- - **offset**: memory offset of first word to return
- - **size**: number of words to return
-- **Expression**: `revert(M[offset:offset+size])`
+ - **retOffset**: memory offset of first word to return
+ - **retSize**: number of words to return
+- **Expression**: `revert(M[retOffset:retOffset+retSize])`
- **Details**: Return control flow to the calling context/contract.
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/REVERT.png)
+[![](./images/bit-formats/REVERT.png)](./images/bit-formats/REVERT.png)
### `CALL` (0x1a)
Call into another contract.
@@ -945,8 +945,7 @@ Call into another contract.
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- **Args**:
- - **l1GasOffset**: amount of L1 gas to provide to the callee
- - **l2GasOffset**: amount of L2 gas to provide to the callee
+ - **gasOffset**: offset to two words containing `{l1Gas, l2Gas}`: amount of L1 and L2 gas to provide to the callee
- **addrOffset**: address of the contract to call
- **argsOffset**: memory offset to args (will become the callee's calldata)
- **argsSize**: number of words to pass via callee's calldata
@@ -956,22 +955,22 @@ Call into another contract.
- **Expression**:
{`M[successOffset] = call(
- M[l1GasOffset], M[l2GasOffset], M[addrOffset],
+ M[gasOffset], M[gasOffset+1], M[addrOffset],
M[argsOffset], M[argsSize],
M[retOffset], M[retSize])`}
- **Details**: Creates a new CallContext, triggers execution of the corresponding contract code,
and then resumes execution in the current CallContext. A non-existent contract or one
with no code will return success. Nested call has an incremented `CallContext.calldepth`.
-- **Tag checks**: `T[l1GasOffset] == T[l2GasOffset] == u32`
+- **Tag checks**: `T[gasOffset] == T[gasOffset+1] == u32`
- **Tag updates**:
{`T[successOffset] = u8
T[retOffset:retOffset+retSize] = field`}
-- **Bit-size**: 208
+- **Bit-size**: 248
-![](./images/bit-formats/CALL.png)
+[![](./images/bit-formats/CALL.png)](./images/bit-formats/CALL.png)
### `STATICCALL` (0x1b)
Call into another contract, disallowing persistent state modifications.
@@ -982,8 +981,7 @@ Call into another contract, disallowing persistent state modifications.
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- **Args**:
- - **l1GasOffset**: amount of L1 gas to provide to the callee
- - **l2GasOffset**: amount of L2 gas to provide to the callee
+ - **gasOffset**: offset to two words containing `{l1Gas, l2Gas}`: amount of L1 and L2 gas to provide to the callee
- **addrOffset**: address of the contract to call
- **argsOffset**: memory offset to args (will become the callee's calldata)
- **argsSize**: number of words to pass via callee's calldata
@@ -993,20 +991,20 @@ Call into another contract, disallowing persistent state modifications.
- **Expression**:
{`M[successOffset] = staticcall(
- M[l1GasOffset], M[l2GasOffset], M[addrOffset],
+ M[gasOffset], M[gasOffset+1], M[addrOffset],
M[argsOffset], M[argsSize],
M[retOffset], M[retSize])`}
- **Details**: Same as `CALL`, but the callee is cannot modify persistent state. Disallowed instructions are `SSTORE`, `ULOG`, `CALL`.
-- **Tag checks**: `T[l1GasOffset] == T[l2GasOffset] == u32`
+- **Tag checks**: `T[gasOffset] == T[gasOffset+1] == u32`
- **Tag updates**:
{`T[successOffset] = u8
T[retOffset:retOffset+retSize] = field`}
-- **Bit-size**: 208
+- **Bit-size**: 248
-![](./images/bit-formats/STATICCALL.png)
+[![](./images/bit-formats/STATICCALL.png)](./images/bit-formats/STATICCALL.png)
### `ULOG` (0x1c)
Emit an unencrypted log with data from the `field` memory page
@@ -1017,12 +1015,12 @@ Emit an unencrypted log with data from the `field` memory page
- **Flags**:
- **indirect**: Toggles whether each memory-offset argument is an indirect offset. 0th bit corresponds to 0th offset arg, etc. Indirect offsets result in memory accesses like `M[M[offset]]` instead of the more standard `M[offset]`.
- **Args**:
- - **offset**: memory offset of the data to log
- - **size**: number of words to log
-- **Expression**: `ulog(M[offset:offset+size])`
-- **Bit-size**: 64
+ - **logOffset**: memory offset of the data to log
+ - **logSize**: number of words to log
+- **Expression**: `ulog(M[logOffset:logOffset+logSize])`
+- **Bit-size**: 88
-![](./images/bit-formats/ULOG.png)
+[![](./images/bit-formats/ULOG.png)](./images/bit-formats/ULOG.png)
### `CHAINID` (0x1d)
Get this rollup's L1 chain ID
@@ -1036,9 +1034,9 @@ Get this rollup's L1 chain ID
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = Globals.chainId`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/CHAINID.png)
+[![](./images/bit-formats/CHAINID.png)](./images/bit-formats/CHAINID.png)
### `VERSION` (0x1e)
Get this rollup's L2 version ID
@@ -1052,9 +1050,9 @@ Get this rollup's L2 version ID
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = Globals.version`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/VERSION.png)
+[![](./images/bit-formats/VERSION.png)](./images/bit-formats/VERSION.png)
### `BLOCKNUMBER` (0x1f)
Get this block's number
@@ -1068,9 +1066,9 @@ Get this block's number
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = Globals.blocknumber`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/BLOCKNUMBER.png)
+[![](./images/bit-formats/BLOCKNUMBER.png)](./images/bit-formats/BLOCKNUMBER.png)
### `TIMESTAMP` (0x20)
Get this L2 block's timestamp
@@ -1084,9 +1082,9 @@ Get this L2 block's timestamp
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = Globals.timestamp`
- **Tag updates**: `T[dstOffset] = u64`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/TIMESTAMP.png)
+[![](./images/bit-formats/TIMESTAMP.png)](./images/bit-formats/TIMESTAMP.png)
### `COINBASE` (0x21)
Get the block's beneficiary address
@@ -1100,9 +1098,9 @@ Get the block's beneficiary address
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = Globals.coinbase`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/COINBASE.png)
+[![](./images/bit-formats/COINBASE.png)](./images/bit-formats/COINBASE.png)
### `BLOCKL1GASLIMIT` (0x22)
Total amount of "L1 gas" that a block can consume
@@ -1116,9 +1114,9 @@ Total amount of "L1 gas" that a block can consume
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = Globals.l1GasLimit`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/BLOCKL1GASLIMIT.png)
+[![](./images/bit-formats/BLOCKL1GASLIMIT.png)](./images/bit-formats/BLOCKL1GASLIMIT.png)
### `BLOCKL2GASLIMIT` (0x23)
Total amount of "L2 gas" that a block can consume
@@ -1132,9 +1130,9 @@ Total amount of "L2 gas" that a block can consume
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = Globals.l2GasLimit`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/BLOCKL2GASLIMIT.png)
+[![](./images/bit-formats/BLOCKL2GASLIMIT.png)](./images/bit-formats/BLOCKL2GASLIMIT.png)
### `NOTESROOT` (0x24)
Get the historical note-hash tree root as of the specified block number.
@@ -1149,9 +1147,9 @@ Get the historical note-hash tree root as of the specified block number.
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].note_hash_tree_root`
- **Tag updates**: `T[dstOffset] = field`
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/NOTESROOT.png)
+[![](./images/bit-formats/NOTESROOT.png)](./images/bit-formats/NOTESROOT.png)
### `NULLIFIERSROOT` (0x25)
Get the historical nullifier tree root as of the specified block number.
@@ -1166,9 +1164,9 @@ Get the historical nullifier tree root as of the specified block number.
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].nullifier_tree_root`
- **Tag updates**: `T[dstOffset] = field`
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/NULLIFIERSROOT.png)
+[![](./images/bit-formats/NULLIFIERSROOT.png)](./images/bit-formats/NULLIFIERSROOT.png)
### `CONTRACTSROOT` (0x26)
Get the historical contracts tree root as of the specified block number.
@@ -1183,9 +1181,9 @@ Get the historical contracts tree root as of the specified block number.
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].contracts_tree_root`
- **Tag updates**: `T[dstOffset] = field`
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/CONTRACTSROOT.png)
+[![](./images/bit-formats/CONTRACTSROOT.png)](./images/bit-formats/CONTRACTSROOT.png)
### `MSGSROOT` (0x27)
Get the historical l1-to-l2 messages tree root as of the specified block number.
@@ -1200,9 +1198,9 @@ Get the historical l1-to-l2 messages tree root as of the specified block number.
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].l1_to_l2_messages_tree_root`
- **Tag updates**: `T[dstOffset] = field`
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/MSGSROOT.png)
+[![](./images/bit-formats/MSGSROOT.png)](./images/bit-formats/MSGSROOT.png)
### `NOTESROOT` (0x28)
Get the historical note-hash tree root as of the specified block number.
@@ -1217,9 +1215,9 @@ Get the historical note-hash tree root as of the specified block number.
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].note_hash_tree_root`
- **Tag updates**: `T[dstOffset] = field`
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/NOTESROOT.png)
+[![](./images/bit-formats/NOTESROOT.png)](./images/bit-formats/NOTESROOT.png)
### `PUBLICDATAROOT` (0x29)
Get the historical public data tree root as of the specified block number.
@@ -1234,9 +1232,9 @@ Get the historical public data tree root as of the specified block number.
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].public_data_tree_root`
- **Tag updates**: `T[dstOffset] = field`
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/PUBLICDATAROOT.png)
+[![](./images/bit-formats/PUBLICDATAROOT.png)](./images/bit-formats/PUBLICDATAROOT.png)
### `GLOBALSHASH` (0x2a)
Get the historical global variables hash as of the specified block number.
@@ -1251,9 +1249,9 @@ Get the historical global variables hash as of the specified block number.
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].global_variables_hash`
- **Tag updates**: `T[dstOffset] = field`
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/GLOBALSHASH.png)
+[![](./images/bit-formats/GLOBALSHASH.png)](./images/bit-formats/GLOBALSHASH.png)
### `BLOCKSROOT` (0x2b)
Get the historical blocks tree root as of the specified block number.
@@ -1268,9 +1266,9 @@ Get the historical blocks tree root as of the specified block number.
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].archive_root`
- **Tag updates**: `T[dstOffset] = field`
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/BLOCKSROOT.png)
+[![](./images/bit-formats/BLOCKSROOT.png)](./images/bit-formats/BLOCKSROOT.png)
### `GRANDROOT` (0x2c)
Get the historical grandfather tree root as of the specified block number.
@@ -1285,9 +1283,9 @@ Get the historical grandfather tree root as of the specified block number.
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].grandfather_tree_root`
- **Tag updates**: `T[dstOffset] = field`
-- **Bit-size**: 64
+- **Bit-size**: 88
-![](./images/bit-formats/GRANDROOT.png)
+[![](./images/bit-formats/GRANDROOT.png)](./images/bit-formats/GRANDROOT.png)
### `ORIGIN` (0x2d)
Get the transaction's origination address
@@ -1301,9 +1299,9 @@ Get the transaction's origination address
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = TxContext.origin`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/ORIGIN.png)
+[![](./images/bit-formats/ORIGIN.png)](./images/bit-formats/ORIGIN.png)
### `REFUNDEE` (0x2e)
The recipient of fee refunds for this transaction
@@ -1317,9 +1315,9 @@ The recipient of fee refunds for this transaction
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = TxContext.refundee`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/REFUNDEE.png)
+[![](./images/bit-formats/REFUNDEE.png)](./images/bit-formats/REFUNDEE.png)
### `FEEPERL1GAS` (0x2f)
The fee to be paid per "L1 gas" - set by the transaction's original caller
@@ -1333,9 +1331,9 @@ The fee to be paid per "L1 gas" - set by the transaction's original caller
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = TxContext.feePerL1Gas`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/FEEPERL1GAS.png)
+[![](./images/bit-formats/FEEPERL1GAS.png)](./images/bit-formats/FEEPERL1GAS.png)
### `FEEPERL2GAS` (0x30)
The fee to be paid per "L2 gas" - set by the transaction's original caller
@@ -1349,9 +1347,9 @@ The fee to be paid per "L2 gas" - set by the transaction's original caller
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = TxContext.feePerL2Gas`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/FEEPERL2GAS.png)
+[![](./images/bit-formats/FEEPERL2GAS.png)](./images/bit-formats/FEEPERL2GAS.png)
### `CALLER` (0x31)
Get the address of the sender (the caller's context)
@@ -1365,9 +1363,9 @@ Get the address of the sender (the caller's context)
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = CallContext.sender`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/CALLER.png)
+[![](./images/bit-formats/CALLER.png)](./images/bit-formats/CALLER.png)
### `ADDRESS` (0x32)
Get the address of the currently executing l2 contract
@@ -1381,9 +1379,9 @@ Get the address of the currently executing l2 contract
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = CallContext.storageContractAddress`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/ADDRESS.png)
+[![](./images/bit-formats/ADDRESS.png)](./images/bit-formats/ADDRESS.png)
### `PORTAL` (0x33)
Get the address of the l1 portal contract
@@ -1397,9 +1395,9 @@ Get the address of the l1 portal contract
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = CallContext.portalAddress`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/PORTAL.png)
+[![](./images/bit-formats/PORTAL.png)](./images/bit-formats/PORTAL.png)
### `CALLDEPTH` (0x34)
Get how many calls deep the current call context is
@@ -1414,9 +1412,9 @@ Get how many calls deep the current call context is
- **Expression**: `M[dstOffset] = CallContext.calldepth`
- **Details**: Note: security issues with EVM's tx.origin can be resolved by asserting the `calldepth == 0`.
- **Tag updates**: `T[dstOffset] = u8`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/CALLDEPTH.png)
+[![](./images/bit-formats/CALLDEPTH.png)](./images/bit-formats/CALLDEPTH.png)
### `L1GAS` (0x35)
Remaining "L1 gas" for this call (after this instruction).
@@ -1430,9 +1428,9 @@ Remaining "L1 gas" for this call (after this instruction).
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = LatestContext.l1Gas`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/L1GAS.png)
+[![](./images/bit-formats/L1GAS.png)](./images/bit-formats/L1GAS.png)
### `L2GAS` (0x36)
Remaining "L2 gas" for this call (after this instruction).
@@ -1446,6 +1444,6 @@ Remaining "L2 gas" for this call (after this instruction).
- **dstOffset**: memory offset specifying where to store operation's result
- **Expression**: `M[dstOffset] = LatestContext.l2Gas`
- **Tag updates**: `T[dstOffset] = u32`
-- **Bit-size**: 40
+- **Bit-size**: 56
-![](./images/bit-formats/L2GAS.png)
+[![](./images/bit-formats/L2GAS.png)](./images/bit-formats/L2GAS.png)
diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/ADD.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/ADD.png
index 4dd6dcc56b3345928a263804b76cac8f671b62c7..ee1a32d95b71b328c86e10fcddb325013c8d6472 100644
GIT binary patch
literal 5422
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
literal 5053
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
diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/ADDRESS.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/ADDRESS.png
index 2c128e55cc325bb99186955506048bc935579b3a..4314acef2a15e859191d557429db52a4884c1a74 100644
GIT binary patch
literal 3561
zcmdT{dpMNq7XQYe$ZZ$7glV_slEfGp!m!g##n4SIgH5?-+|7iUVY?Jj7!|q9Cg~#A
z$+egga*1urC}KuLh#50!Ok+5op3Xkce$IZLy`OXbIp>e}UGKBjde`@TzqQ`qdcVu|
zc88@URU`obkhVE;-~<4O(ZF@*MiFpMof01g^_4aUemsTCn;#v?d{AF4W*_D$T+m(s+&rt3$U)p<0kD2Bna1UCY7A!F2ReZdYFkp~5d1c-rR`*te`C^l}i
z2WLR!|Jt;+Fcx?19V*_rS1K4yYj5k^_kvm#+lQbZvqt5~
zb*$M})atE
zGsR6o$%|ekaZy}+GK>9f_zJmWF<+g7Yl%@T;H}pSl%TmK3hmp=U@Bi#ZM}TuQHUYT
z!2rJ69Hg{sm#jvyDM0kEHQQ)%af@f7Jf*+^03ZUZT#S
z@07V+UMtspR%kGYBu#uu#{L4zuCW|}yX(!qRytgnyaoKxNOrKCGHu6
z<$5hh3?}WUsVB%u(%UaDTDQmKnPg0Li)zPYjkuDm*vZczm1
z`g=`YL#kWa-R2u2GsH-`$D7M;y_I~GE#;zYs`2tcTB;l83QP$BP1HB!Uh~hwvajr{
ztsYL5oQR0$n!%MF0^c*+)Z1m<=_}H4ZwEFuw@$15K8lz6nw0+v*xxbdSQ62OLsto(
zxRZo*4t1ymCj2mMj*iBB>Ay2Q8?|42>F3p0jX!3Bd-CM*6252?WKIQ{mwwfBP<~^EQCjWiyx*&
zoH$)yXgBe>`?*_mqgn#vEIs>qC7jl+u_=)6NGD))#E(=bOiKpb&{p`q&E%JxYjX}R
zu)5uSKcAh;^2(kTXtE6mC_p
z)74@LmZiQFv&|_|TwU0ES(+1o+`wR*m_&;`tZ{$J=5RN$%JQWA+w!Zt~4WM7!
zH#@0A37PK^0&)jo^H!uG;dSdW1Zcjqq@dwV0bT#uX8txq{h>L1+r?bJI?(ojt(DNy
z%tFr-FKqF_s!>eeSMx<%)n(|Bdl{RVn?O48eI4v?X4w%dq(ffcpKEMOu~_@5c_%IE
zW*o;gYhs}HF>y|DF%r75YE-^3?6dzDQk2e?Z)ZCT2l)2)pr#0;VMT>
z;R|-_qs0B(>(l@otkvvHUjJsmWbmD-I*?qGFzvKe>v%fW6kc}oY?DNrvuu`hnjmjm
zoqpYI)2xHYM8rdcb11nDeV%X8RVV8cgdP1dT%jSTAYcLzBU$-SjX}LMr@%se*YTM*
zE4QnP`cl+-73XJ%WP%kD_UitjxU?l)Y)if-49D3aC|iaEx+;K)I9cU;O*!Uo^`rb2@d
z*0cq2Fyz%Rfs}77_PlhVb4dn2&l1!CEN_XvVm;J{+i!8iTYJlGoRLmxr*YPOzMWOG
zch+`~HF(2Q^d@Trb&xxg9uyDOx^E%XROyL5P
z5AvG}zstvRg8{CDqxI#w*>KtETYQ-pA4#QeP8u^DJLnwpwi_xC)ix>e)O?*n{1g8w5Su6%KLPY(VyRdI1^-M
zAwp_sYAj2OHWV7~}?>a?X{v8RLXyo#1*r~W0GKnY+s0ZtEp$8L5MwFke_+V=W>
zSG=|%Z!)$kss)`+oxNUZLtrcUSru#YDo31N2ATV*o^#7ck$y~4*6yp04CAzkw`5m(
zh1m4QxV(q$d-3Eqc5M=irL5QRTfvqOLM?`Zg}k~4JZB4m84+J$6KAban1DO-va|4h
zeypoqb5RVwFA&a9VoG^a%$@lraMSp7mZlle$d8i|I(`SEfz&b|Q99JU9+NN0?v0jhaZWsjf}Pp8F5ZP&fhPRHb2Q7`1nxXLv|wB;tK4u0RbRY
z_z73Q76Y=!-@kfLg>q92)=FxKwqNP8(PXA8^
aTqXv_UznSjZ(Lr7#^#{if%5$x@&5n_D}9gv
literal 3224
zcmds3c~p~E7Jm>#lqEV&D=JH>jtH8FP>U=fQKKLzSdmf_Rv}PFlOV_%OrkJqMUW9>
zDM)H*K*10SBq4@CzzTF&ix8Fsq9SVyVaJjN`eizQ>~bnKS3ie1E+A-gn=<-}n2y
z`|iD8p7C-s-ne}u0KoX9JMJt1dRS=wgMmIY?t;6W0>CKfB<{$$_yXmSBE6vIL;bF$
zy{fgA*`E&jME}{qFIh(=%I-Ovg%Tg%Ax$#f%azQ*Ak$6#LEc*-3BGpFG0?6HfgU6b
zyn!wxQmlXuBpSCcpb@;@fQ3fJj2;3K*m&JdkU+TnFPPOrAYWOtvgAy9AAa2t=)Y6u
z9hWr)%i*qDy%vcWi4F7$;B3)-?KD(@ofb5s#lyP3s(q&aequzJrw~%#rYQU!6oSYp
zfZGnSjy)$o;x-mRPx|)fZb-Yym%Yg8>|9<$pD%WB7r=_)NuO@kTA|c}$S2(F5<@MM
zT|TAN>mk{4@?Y~i3CrkI-@870m=@xn9%Py`vbE`f=KX0)24oLrHHpuFSW}lN$Cn|p
zK6Z_v<5lKca6I4ooODCep#_iSIP<>gV_qh)?%_^d?XJe@W)Pm7sg>n}A)8K}^CZ=|
zGFn`fD`zzhAKpkZS^(}14=9!RQaMD@lWoZ6Fd`4H2$K6fHwG=iWrg`0PhSnE
zW%T0J(}x*JMstX5e6g6BViERTtnOnB;u|g@xDFFddBP~k)zO6lOLn(jaO;TEhTU5h
zEux~t$LwB~A)IKHxx#K`JR*~OOXnDl=~ORiaz-Jx+G7zPStW#3pHrE`aeUuqa~O{M
z8NZj>^22pFg!XsEp?ic#zK^VtFcUPQv^x4z`HH-Db@+rFBcW(0fpkid%2L5!b>Lu}
z|4SjulHdzb-)BO+Gf~>RCVM3LDt71hoD#zseXgV=72Mm)dc5{6YZV3tvhF9YCKH08
zU5xkt=KZ3f1Hc3;Yfe>vi4D(A`8267kHTE3T2QMxA-Ae9eS?fZYvLi<=W25RZ1w*^
z0wI{uQ(WaNArtdfJKCTtZF*}P0<6uLLA>Ag{549)Kg`9A6)QLav##o}Yb{
zF26Yfuem>aYD_{1PP`ngTH&}9E|Iq&@(W3egHF}6VA&S7`#RUb-%PWHu9qhkHFeJ+
zNBs$X*%D<#Z%5r<#!5%@8AQU!O-Zcp4tS)cj(a3EnNcPY#RVYYnJ!hL>`^0&8tG7s
z8DpgUau65t7-e{BC!11ncz!H3+d7xZ=f_H0^XzB`2p$L1KK`2Ztb3j^WT#9}NXjLl
z?^`NCUUhXZweLHw7s&-n4`=A{VlKoT54JTn%y#V)7Q7r?8a^Q8q9;g{Yr28?_RzzTmU79!G7!xcm)$;$DxLb6@8LMt!_Yz15RADge*wV
zp*=(&GG%jD)%HY&(M(VgH+3+cF(T7FwzbH`m3m^e6S=b5-Rdnj3Z@xN#lD*_2Lcfu{WglRYft0Zy#_n
zNXUpzWka@eV2JQ4efa~k^uchZ9kUb>E$h28~
z!K1YGhdYcmF}4z@XAXeSmrXEPE40j!ZZ{BaG_XaHT*TMffKI%%AJBQz4QV^I+7`la18F7Qb$3M%qF_{LhO{=dm;N+M9P}J#;&tH61W#3;TNs>om%+
zI+doyqT57)INAckyLK;{N
zB1z%QL#-FfA*?rN(KCeYdUXxZ$-D|=W%bfRCga$xIx|7xjEalpKFTYs*YAAOCg;j;
zVlm-0U~@H(*km@pU@Vqyz5t1F?xDOUw6l8i6u3*TohXdk^3Rd}AP_{q_YFQ~RO
z3leW*lcsxyrS{Y0Ry;q>*YTc=SILu|Wqv~eCqnfNa->wdfmD-RBvtW3Rz)1XP*$kA
zMq0?P+ma#eC6zCchCkbD*NAil>^ATyRd6e#Q0cPV=DL}d@#9d{X)t_Z4Z|VU*R-#@
zeF`+9;!O77i|2%;#z3%NG^?DapKsP(G8EhK#a%BRP`YZ~(EI?R5U;4m_~b>{^&bH9
zZ6Ksqb~lwDQ&23rA8<)TNqBrvOlU_ZKXr3(@#cN#r@OL+_R}??S3sTyIA_
zicyjW#Rb)wEof+52<&0?rSodDmG0Y^78#Kui{vMQl|+eoa$R6@_b#}F{^6-RpDceF
zo0!5={ZMfsMFV>am6@uglyz}I#+!p@=A*sQrmQ+1`FYu&t~*Q)6hCDPo9&yRlu50f
zip^4)yxjvrejF4%LaH)?)bAwYF{Meuk-E`+Q*Q%CFK>IrL{FEyJON)^yqCy(iIgUJ
zO5=DW%)Gf`)}l)|F1szx0-piWse@0FkFuPS(`ym9{0kP9}T|o
E3-prxb^rhX
diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/AND.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/AND.png
index 28699de39598b22723e0c6ba000438fcb547388b..9bfc38479f18a03e6125819b8976ebc8db798134 100644
GIT binary patch
literal 5445
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
T^`>TN$I2Ja>uKbxTi*L8V(gm4
literal 5072
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
CHpgfH
diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKL1GASLIMIT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKL1GASLIMIT.png
index f9cbd7a4b408af4d61ab568ea9f9ad6d43b18987..20f5ded93909b6cbb22b4eba0b4fdb333ed70e5c 100644
GIT binary patch
literal 3541
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
V1lv(}14ITm^re^E_f`vw32
diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKL2GASLIMIT.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/BLOCKL2GASLIMIT.png
index 9e1160f7e36751161126004c183948ac20e00945..f952f689f04028de22ba6d466fdd24efb78d99ca 100644
GIT binary patch
literal 3564
zcmds4dpMNq7XRF#X^c4^r)Qt@Jm;Lf_rK@-@virM-nHKKt+n3Yx7K=pa&fYg
z-lDt(003$G!`7|XFWk_gaL|Z@oZSMSV
zcxfrT{6M*Jn@q40a&Eua<+$6H0IHPTFoowyYfWrRyMM-R^Y_KV3E0m2iZ=d^y4SxP
zy7NU0D=LpyV5$`jMiZlb0_R*_u{4~ir@s3rl`O8^*kxcC2j3NrtBw{D8<9pY-pQ2-
zGMUp~t+YLrwc2EqdLlkp-!_penzId1f4nbHrreM(;i-QwBzAKrhgA7iQyEraY`Zm~
z<;zDfaF!KKQ;Vo<|y!e;lD_ls*sZU-kCRuPP`Lri{1(SBj
z7xhEz?(4~mQN(W>otl4oQ-5%Yf0c#m=L&lHkL>$nJUAQn2b*77p`DkCeZ8ncr#4jb
zAUD2KLV|t+KzPqr@l6i#{}nfX{>c;%4j?_*Fw4(q;#3XGv350I=XG)y5CWc^4gj!j
zGEpM&)Jk@MTh0Jf6rcweTokQ-Q4YeFKuKKC9|)s{-nIID%qndf#ch5qQj=5-Zahm6Pd`d+OTNqIRY3=H1>rLuNw)3G*VNWX^X)EiwQKE}v)YqZC!{DLb77u@X=lmdI=!{>L{_t9w
zhaUTg-&;l2sT_%#Rb7YXN_nx}UeBV^ORBULG+GVr-dbb(qM-qkeJ+m1m
zlYKj`hbx%2w025<44QM48#o&)y=NKU`}q
z=KEvGDanY@_%CKo5_SUqJ3t!_kn{_BD`jc9zvklOR9HhCr);oCY9_aZ@?79z{q6N?QI!7hU5YX*5{$isNc)Uw
zm`He0p9p5%)zHV|*5JAJzT*
zrDaE(3@~S0QMGHo*uPepKhGBbsWyE(wVp_T!e}2Z@50w6WVNv5sOpm#{CM8WakbUu
zxj>x9g1*QI9U_lU7dVAJn5erxY7T%FnV^4tfMnK+$IHN6W`mx-F(CeQROVD?Ge&eg*d$TbeMjWs0Ai1>6#hP~W=XGljCRwkpxK!mR;
zTuJ>j%GLCK47Nc#*D|oQ7`zD?fr~~-m1?5usZW{;R?Vk`jF7lD-M#o&!N`lbYz4b&
zabW9##BoXbtlsM{+*9Mhc|*)^4&?dnm@Bplre~jZ_iJ$;mvP7
z7bu!X(^d7};^EbDdZLU2V<2$ZG?GE&Ont~2`h{;WU&Oe~^zQjQlKvHB|Tr>Z}8B&Ph6t|3h+9)P)o
zg^p@Yzaq!`r!z|S88JI@c3z1M
z*$gm!6@$$q;zx8vwLu^6+d62(Cge7|4>U2n6qE~|%FC?||pq`=Sx$&Odfz(Rf&DX!E00jpywAxROXhe<04>bvw
zr97{Vr*T#+ts=x?Z|MAxs2}b{RZZlNwpF?M+N4pd4If&`B4~O?-p>jo6e~y0_mOE^pw*aR7|P3L0AAYQ>-lc$
zQIvcrD~yS%|K(YKNASJ_D+ma;`ePvF9@(L0*4BxBblTN7z=E;ZIQF+ME-EC?@*uI=
zJ*fKPffL0Atriq%_t3b9CU%c)75Y-L`m9vD9w#?@;a-%CE7+VItpTDqBK7#`$y3nVvZ_b58$xzwdqb-TUsn?|0w3
z*G_u7Yi~2&1^|HeiN9g6002XS-!I`B;Ao-a?gao^xD%LTr&CI0BeL&G?;C6MSlYhJ
zeEDYGp_xH8L4B){Us!)1n}0hpKS@{dfvu$UwI-;Fd~hb&07RhD9s&nJw;X_h0QUjZ
zK*-tyKtOn=M*&CR%~muxQWP*G2{Pgfjk@8YRaO6EMFn^VV$GxE#|R5QcN$6B&I;HbjY71TmD4fC%0aveuPHuFm<
zzw1HXM8|)hOwuawR;dalIOm-)EF3dvlPq7o(4DdFZB79V0JBPA2p~?YcuC?0>b^QW
znwS|VH`Bu;oo;32X&R2qdAuW<4b40+HI-TyOVG(nk>|TUtX?43(lZfy8c#9x1LM=s
z9O($1G>{qkVbRS?2*CHeq$DtAKu+x=B~}F9TeIH7;&8&^xUEO)vP}T%D^+Q+pB(Nj
zUU~ZS5;7)kckx87>S
z*V1(2<2cX53UJ2~*1Nuzd9cPV6-!;T3_nU6T4CFbUVy|Ogu*P}?!IXhGeB;K_L>b`
zXa`Qo24WTw<8L`zz<~c03x8yc%6G9crYlmF>>DkaKZ{l?o~TCMM5sZM(&x)eQkC3%
znx)!Pmznf`qAzyyTIuNcSXP`Q7BMBb$Z0Vo%WAZiL7-Yh6>_-DPxUMlY3Cn(wbM@22O
zKP0U%B*8)BUHR*`We1tGrql)fB81@6kj&1pdkG}~3o%7l@Xv+uhvad5x
zpRFi+O>CJ3b^9hpoAUZ&b?|FT2M*KnOaP|Y4U;H=UyL&+5r%x4uK}SAhBVP{e{&*(
z!M-igLNxFP5=|-dcxD|xg%aJU9`R8<>A~`Nw}Gv%wI_>}Ea3P
z4|%NB+}KiM0YE0D^rvUJE4}J0^5%{O^;SUCmir=vZ#1vZ
zNaCOl#&zei9YSmzL4hSLD0=v0H&1g6etuz&AID6|nT|`Rmn&}QFA`-%tLw>+(-RHF
zjo|)6Hqfw-Tt;m(cb4{lO15+uCTo7N4+_WcrMcsV>=#YMPfqc;&!N4l$~d
z(!x4%9fJjoi6wEzuDS;!O|8x9?GR4u%vrs9(B2M;7oiR+{QyZ#7$-i@CAB;sl;3<6
zDMnvoulmh3+6V$wwfk_ja{wj*CjcXD$POY{_D(&;vkRL;-M%^YOo(4s))j5VemLHdHs&LV1bbWXPy
z;XF<#iTEiLU|ljyY`y(n_FsA1HZNg{4c4P>XnOILqo_$)bx0WEO@Vs|guNFt>U`Wq
z50e}L6;Df-U|0cdr5zLNn_C*6HPJUOe9;vF98J5amC0jhJ2>?&TN
zRl7r!N<}L`*-TFg;t;f|h_wUnc)gG1w_~6eqY|%ojLy}^3>P1KG5BlEizWQUA%4pp
zi3-+mJ&5qD-wy20%8SFZ16k$@THnMkR23apleCbq!4JRLBC=oGQd!NndzWWlm1~`S
zZ{)N3^lhBIFyzktzb|{x4J(XxUyR2FFkDjDZANbg%1swq+|9(f`spqkQ;jHDJRu?W
z(w&ax=e4QjZnfM;ONkA+w1M=&pf|!t-tumLr}z@j>v0(jVey2RdM-X11wTO{^)nki
zt69Y0k%EEPIzLCAkokxu^so4V1h|E2z`OIyy%4>(`aC1k@np+xUsE&lpzuYzkHz=!
ztVTX7(fv*boV5(}AA)9C4I+-G;g;VVu*M`Wp3|fJbfGsaq&wqam41#FaQs%ShMp+P
z^2@85!2GXiV}dmzV`*(klViu?^tfKPKU=iA4UoQc+*n~9p7+vNQzw)eA*J{d$KH9r
zO42jUy*TodA|rLoqb03J2$?WHv`U{lW1v*iEjB`~OD6rlWAm&~zE0>GZBf-p7l!
zF^iB+*iYK5Mj5L?%%0N_~{pc^V9vgcOKaJ#*zF>qvJ)#tVy7SWmZd$JN}|fQcYOgo
zyUQkj9zFVD>*6pzND`2dokDLQHM)*8-7mF;u9I$76ztgr*vd}vlA0n)d?MFcVg#)#
zd7E3s?wfF4G_41F6zxNdIbE-ayDBKaSRt<4$S^sPtqx$-TkHJko-|{|ilg@)B(-FyAN1{@Rw?I{|DXpn)y}N`k<~e#_nJ;fD^9X82WL-7lNNn;y_VU(0zXq2VVFz6PNErXdk
zv|+4MGhu8omWG*O#=hO(bniLOz0Y%>p8Lmr?(^LH$M4;~-}n3ezTfxre%|k!U=OvD
z5c^pS1OiE%JA39L2qZ)T+O69KfHG-9xE~mgJ9p-!BO-5ha3G`bjg*jmFm`h*+eq?h
z*e<$u{dR?4nf}GDNS=SQpUw$-3P__Q$nsa}rVXd@og-cbcki2gj#o@Ru>4a2$Fk)keGb)#>*?JHp4;q}
z3%2_*>+Iu8lWb1J-S%Ej*OFI;7DecQ#cugbC``f^Nk^(YQJ)V{J2XaDHXKq+v09WH
zSI5&0d6|^lt7_xx#DiJMu%-*q-Zvc%bFke5&mwXA*Fmo)&_R1W}mS*
zO%%$0>vN{^(cOJkGUkmgT!U?JJ4J*fCj8GYjcU&JE#L?7-+^yi48cyDmKMzmo{a8<
z*U@kXHl|AQ8k#gVrmV~v^x4p9EA!Qe{r{B{fG4m6*ewbkw9iA|5kU>vHV2$bXgBW{
zh=&I)D*mj+dr81;5NV*=4BRZWAMo)<==lM#NS?Fu1z-;va;uOJ9Rcb2wZ~gg=4=Wk
zCJP{d%dO(lC}$=M3NH$k;V}S7*R2*o7ty(WBGJ2z(5Ec0M5s=
z0si;{&`KuGzjVZ6n!YtGRPI|@d{P!8Rka$<6QzHszJAp7-sF`!=Eh992Xj!sq)SyO
zY|%N(8)c$nU#_!Onnbp9iYD-ull|AmseUoHYqxBX0u?n2s^)8Idq_Ku
N%E~AF(j7pI1>Su5^_${jv8EX55{wcuexC{>^;HJ**PS
zn=$Q5+QYz@W_9$Mwf7g95w8rPunlK)w1=wj+1GKCVm6)^!s4V`;=ETY{B9z@z>)jk
zUc}@DAPIJ_87#A|49uR;-#dd+7IK1$yi4^-?fI94AANT>$9bun(LSp>f6F_XV7K{m
z56dhYmJ?G=SU^@`OH1hu!7LwH)C7H$Qz9*>=_f2kA5`Tc(eqimCwDOpsMcI%j=of3
z6})ZTn0dKi9F+umb8!$4s75`B73la9-j%g3HHDp@6H8HB3hacM!3&i}Oj$v1923E2
z0$C!ZkyG$bjkyH2A6o%FXUs_c)-m7yp*A(MXS%^lxY0Ht@{QU%Pz0Le?lnCmu@YLu
zT#B$A(ljM5$Q#tiZ?fdeGaFsDx;Xb~jjFBpPMNf(KGRe4G`HDMR|Sqq
z9LRXhv(W7`Om_9f%vW`S7qs23J|OF1@jdZZa2J@ERVlrb`QYVG8u8XzC}2y^4ao;P
zC^y7Zh5#X?L}AADu<+mq+FfmZm7&Tv!-Kx+B$Q+pL5B~ZKBzdd0N9j~A@!ZS3297A
z>^t6t3Y%H38|J3b0K%WS6UR6l9EYsSJvRQ)1GdzWh|Tjy%9tMXrwnAdTt`=&1xeP{
zkOIF&EEBD@NMhhNT&hXA~I!x4vu^U=)ECGK2URJ2{*eR$hm@a3;O
zZj+Ro2twZmQ6OQ%g=HqaLPr}=CY=gZMb$ep+=hAB>&-LY%G4qSIIe(UC*J~yUWw=W
zFzx0SLU(lF4OR7sr#MOoTaR=N_^CNrg?bpQo*Q1ew7Bip`HejE8f^0$Y37LaE%^c?<~8ol
zd1VAt2pms_cwMH2Qch3!u?)o=d245#R$$b@6CgK+9Vbsr;QW(VxM$%Qr9Og~^qyS_
zmxmd?UnOYvz_+4Xo=ck+7_BrfG~TViO3*Vwj8yderbFtXCrsfkV{u}iCR;}0*>rlv{bJfnRs67zmY|O4JW>6UZ8HG4hoo+lR@e1a9IU
zIE)W7q>dStvpfePCG6W-nU*3UC?s8wL0u)72T&7^ZgoT#sx)4;NI-)i7d9ZXNH9WM
z$DVa9ta+S+-c4kR+88`D)Mmi__fDk?1~Vte3;biXr;a_
z77bSnrhTc?^{qt`g6`3d6)UG0uhJ`9RM_6=q-^XL09OMc*|9a2x-a*^Gwzl|vt
zCnU2K?6lo?EV>|rZK}uJ*NV5uL-oG;i5{(fX}6FL?R_4$VK0io7L4|Z?p6FFse9_f
zlZ3MS>bHH}pzRI7#$aSsZn|wv2p$h;vUaR5?C71I4-v^S9tlj%>X`goi8H}{y{L$)
zdK}wp;s83EqjBdW{WR|-I^EIRdIt$Gn84@3NirqjqH596KhXY6|bg^7a5mt_K0$+Lj;O1_ebfu5__sQufYnBhdb
z)at=wUYYA7TD>UC6qZ-`tDM2nA}wyBBWwf=Fh@2nH?vEB`RLITk7{3y8$g>gA4?sp
z?|pb8s4;$K%8LQsTWB<@j5hu(WoS|SIIpHrDQ3r`-Vcm%Aka(Xz1$SAH9&JzYTE8X
z#VJnUYsyGW?Tg95_sP#WurUKy>*{f9k*=dwdgEWq*etcE?s?WzFm+ZX_ugLu-hFk_
z1z)I+ZO{^AggFtyoQR)5^zMWM>+&9#`tT)j0tUCOBc9A2rf?r-zQ^t~tNgV`IM4FT3
r>52ND-`eN=fT{j}o)kZL4~=a3Wh+Ww)z?htGxj+P=$Z0USMK~3ix`38
literal 3172
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 x
z&+j-&1)1AsEs{?j`#WKJ&Tlg>$!!x@daa8bBsVx5NEK6)9{+S$?0O07*jG5P==bc$
zU4(Jgn-qv)P-^tUTzGG7)5ZWyEk&c!-VW#ZeyWlbU{TsSladq>8b`G)bY=?(cb|~qCBzEwO<>&%U
z^fN`py3VThv8ge(uHP&yhG1Dw6pS6jIW
zuA(k9!?|A{$rNIO#QDx`RpD_rjm2+k#=8sX4LO6VxQ2qbim#To=Nsc&X=zHrn*;}QSf+K3UU%;Qd!zpxf9$`)x
z_!1XwD9`QwZGLNfJ|rU|dN$mgq#`y2Q40mUP!WYa3!M#!Bwe)!&@;z9$Kk~vq
E0RtEOGXMYp
diff --git a/yellow-paper/docs/public-vm/gen/images/bit-formats/CALL.png b/yellow-paper/docs/public-vm/gen/images/bit-formats/CALL.png
index c4a26fb27ef598274c60545564edbca939093303..a017035166606fa48e490cb10ce37b273e3cbf42 100644
GIT binary patch
literal 8813
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 |