State store axioms¶
The host-side mutable state stores, as bodyless axioms: transient storage (EIP-1153), the two-layer account and storage overlays (transaction over block), the EIP-7928 block-access-list recorder, the EIP-2929 warm sets, and the log store. Frame rollback is specified separately by the closed state-journal operation algebra.
Non-normative
This page documents the model's host interface — internal contracts of the executable specification, not protocol rules.
val transient_reset¶
Clears all transient storage (EIP-1153); part of the per-transaction reset.
val transient_reset = impure { c: "transient_storage_reset" } : unit -> unitval transient_store¶
Writes a transient storage slot and includes the mutation in the current semantic checkpoint history.
A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val transient_load¶
Reads a transient storage slot; zero when never written (TLOAD).
A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val storage_tx_update¶
Inserts or overwrites a row in the transaction-layer storage overlay
(the raw store behind SSTORE).
val storage_tx_update = impure { c: "storage_tx_update" } : StorageEntry -> unitAn overlay storage row: the form in which storage entries are enumerated at transaction-end merge.
struct StorageEntry = { key : StorageKey, value : StorageValue }val storage_tx_get¶
Resolves a transaction-layer storage key, distinguishing an actual cached row from an uncached slot made known-zero by an account storage clear.
val storage_tx_get = impure { c: "storage_tx_get" } : StorageKey -> StorageTxLookupA fully qualified storage key: account address and 256-bit slot.
struct StorageKey = { addr : address, slot : word }Result of consulting the transaction storage layer. A clear generation is not a slot-row hit: it resolves the value to zero, but the caller must still record the first EIP-7928 read of that slot.
union StorageTxLookup = {
/* the slot's transaction-layer current/original value pair */
StorageTxHit : StorageValue,
/* a clear generation covers the slot: it reads as zero */
StorageTxCleared : unit,
/* the transaction layer holds nothing for the slot */
StorageTxMiss : unit,
}val storage_tx_pop¶
Removes and returns one row of the transaction-layer overlay, or reports exhaustion; the drain loop of the transaction-end merge.
val storage_tx_pop = impure { c: "storage_tx_pop" } : unit -> StorageTxPopResultOne transaction-layer storage row, or exhaustion of the destructive transaction-end drain.
union StorageTxPopResult = {
/* the next drained transaction-layer storage row */
StorageTxPopRow : StorageEntry,
/* the drain has yielded every row */
StorageTxPopExhausted : unit,
}val storage_tx_clear¶
Drops every transaction-layer storage row of an address — the storage side of an account collapsing to empty or clearing its storage.
val storage_tx_clear = impure { c: "storage_tx_clear" } : address -> unitA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val storage_tx_reset¶
Empties the transaction-layer storage overlay (per-transaction reset).
val storage_tx_reset = impure { c: "storage_tx_reset" } : unit -> unitval storage_has_writes¶
Whether the transaction layer holds any storage write for the address — the overlay side of the EIP-684/EIP-7610 occupancy test.
val storage_has_writes = impure { c: "storage_has_writes" } : address -> boolA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val storage_block_get¶
The block-layer row for a storage key. found is false when no earlier
transaction in the block has read or written it.
val storage_block_get = impure { c: "storage_block_get" } : StorageKey -> StorageBlockRowA block-layer storage lookup. value is meaningful exactly when found
is true; the explicit bit keeps a real all-zero row distinct from a miss.
struct StorageBlockRow = { found : bool, value : StorageValue }A fully qualified storage key: account address and 256-bit slot.
struct StorageKey = { addr : address, slot : word }val storage_block_put¶
Writes a merged row into the block-layer overlay (transaction-end merge of a changed slot).
val storage_block_put = impure { c: "storage_block_put" } : StorageEntry -> unitAn overlay storage row: the form in which storage entries are enumerated at transaction-end merge.
struct StorageEntry = { key : StorageKey, value : StorageValue }val storage_block_cache¶
Caches a witness-read value and its already-derived secure slot key in the block layer so later transactions skip both the trie walk and re-hashing.
val storage_block_cache = impure { c: "storage_block_cache" } : (StorageKey, hash, word) -> unitA fully qualified storage key: account address and 256-bit slot.
struct StorageKey = { addr : address, slot : word }The common digest type used by trie, code, and block hashes.
type hash = b256The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val storage_block_clear¶
Drops every block-layer storage row of an address (account deletion or a fresh storage generation).
val storage_block_clear = impure { c: "storage_block_clear" } : address -> unitA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val storage_block_iter_begin¶
Starts a non-destructive ascending traversal of the block-layer storage rows for an address. The iterator is valid until the block layer is mutated.
val storage_block_iter_begin = impure { c: "storage_block_iter_begin" } : address -> unitA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val storage_block_iter_next¶
Returns the next materialized storage row and its cached secure keys in ascending slot-key order, or reports traversal exhaustion.
val storage_block_iter_next = impure { c: "storage_block_iter_next" } : address -> StorageBlockIterResultOne block-layer storage iterator row, or iterator exhaustion.
union StorageBlockIterResult = {
/* the next block-layer storage row, with its cached traversal digests */
StorageBlockIterRow : StorageTrieEntry,
/* the iterator has yielded every row */
StorageBlockIterExhausted : unit,
}A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val acct_tx_get¶
The transaction-layer account row for an address. found is false when
this transaction has not touched it.
val acct_tx_get = impure { c: "acct_tx_get" } : address -> AccountRowAn account-layer lookup. account is meaningful exactly when found is
true; EMPTY_ACCOUNT is the payload sentinel for a miss.
struct AccountRow = { found : bool, account : Account }A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val acct_tx_update¶
Inserts or overwrites the transaction-layer account row for an address.
An account plus its lifecycle flags: existence, EIP-161 storage clearing, same-transaction creation (EIP-6780), and selfdestruction.
struct Account = {
info : AccountInfo,
present : bool,
storage_cleared: bool,
created : bool,
selfdestructed : bool,
}A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val acct_tx_set_balance¶
Balance-only fast path into the transaction-layer row, avoiding a whole-account rewrite.
A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val acct_tx_set_nonce¶
Nonce-only fast path into the transaction-layer row.
val acct_tx_set_nonce = impure { c: "acct_tx_set_nonce" } : (address, account_nonce) -> unitAn account transaction-count nonce (EIP-2681).
type account_nonce = range(0, account_nonce_bound)A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val acct_tx_set_code_hash¶
Code-hash-only fast path into the transaction-layer row.
A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)The common digest type used by trie, code, and block hashes.
type hash = b256val acct_tx_pop¶
Returns the next transaction-layer account row in insertion order, or reports exhaustion. Merge order is not protocol-visible.
val acct_tx_pop = impure { c: "acct_tx_pop" } : unit -> AcctTxPopResultOne transaction-layer account row, or exhaustion of the destructive transaction-end drain.
union AcctTxPopResult = {
/* the next drained transaction-layer account row */
AcctTxPopRow : AcctEntry,
/* the drain has yielded every row */
AcctTxPopExhausted : unit,
}val acct_tx_reset¶
Empties the transaction-layer account overlay (per-transaction reset).
val acct_tx_reset = impure { c: "acct_tx_reset" } : unit -> unitval acct_block_get¶
The block-layer account row for an address. found is false when no
earlier transaction in the block has loaded it.
val acct_block_get = impure { c: "acct_block_get" } : address -> AccountRowAn account-layer lookup. account is meaningful exactly when found is
true; EMPTY_ACCOUNT is the payload sentinel for a miss.
struct AccountRow = { found : bool, account : Account }A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val acct_block_write¶
Writes a merged current/original account pair into the block layer (transaction-end merge).
val acct_block_write = impure { c: "acct_block_write" } : AcctEntry -> unitAn overlay account row: the form in which account entries are enumerated at transaction-end merge.
struct AcctEntry = { addr : address, value : AcctValue }val acct_block_cache¶
Caches a witness-read account and its already-derived secure address key in the block layer so later transactions skip both the trie walk and re-hashing.
An account plus its lifecycle flags: existence, EIP-161 storage clearing, same-transaction creation (EIP-6780), and selfdestruction.
struct Account = {
info : AccountInfo,
present : bool,
storage_cleared: bool,
created : bool,
selfdestructed : bool,
}A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)The common digest type used by trie, code, and block hashes.
type hash = b256val acct_block_iter_begin¶
Starts a non-destructive ascending traversal of block-layer account update candidates. Candidates were written directly or have written storage rows; Sail decides whether their final current/original values differ. The iterator is valid until the block layer is mutated.
val acct_block_iter_begin = impure { c: "acct_block_iter_begin" } : unit -> unitval acct_block_iter_next¶
Returns the next account update candidate and its cached secure key in ascending secure-key order, or reports traversal exhaustion.
val acct_block_iter_next = impure { c: "acct_block_iter_next" } : unit -> AcctBlockIterResultOne block-layer account iterator row, or iterator exhaustion.
union AcctBlockIterResult = {
/* the next block-layer account row, with its cached address digest */
AcctBlockIterRow : AcctTrieEntry,
/* the iterator has yielded every row */
AcctBlockIterExhausted : unit,
}val bal_reset¶
Clears the block-access-list recorder (start of block execution).
val bal_reset = impure { c: "bal_reset" } : unit -> unitval bal_account_touch¶
Records that the address was accessed, so it appears in the block access list even without a change (EIP-7928).
val bal_account_touch = impure { c: "bal_note_account_touch" } : address -> unitA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val bal_storage_change¶
Records a post-transaction storage value for (address, slot) at
the supplied EIP-7928 position.
val bal_storage_change = impure { c: "bal_note_storage_change" } : (block_access_index, address, word, word) -> unitA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)EIP-7928 change position: pre-execution system calls use zero,
transactions use their one-based position, and post-execution system calls
use transaction_count + 1.
type block_access_index = range(0, transaction_count_bound + 1)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val bal_storage_read¶
Records a storage read of (address, slot); reads with no
subsequent change are listed slot-only in EIP-7928.
A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val bal_balance_change¶
Records a post-transaction balance at the supplied EIP-7928 position.
val bal_balance_change = impure { c: "bal_note_balance_change" } : (block_access_index, address, word) -> unitA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)EIP-7928 change position: pre-execution system calls use zero,
transactions use their one-based position, and post-execution system calls
use transaction_count + 1.
type block_access_index = range(0, transaction_count_bound + 1)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val bal_nonce_change¶
Records a post-transaction nonce at the supplied EIP-7928 position.
val bal_nonce_change = impure { c: "bal_note_nonce_change" } : (block_access_index, address, account_nonce) -> unitAn account transaction-count nonce (EIP-2681).
type account_nonce = range(0, account_nonce_bound)A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)EIP-7928 change position: pre-execution system calls use zero,
transactions use their one-based position, and post-execution system calls
use transaction_count + 1.
type block_access_index = range(0, transaction_count_bound + 1)val bal_code_change¶
Records a post-transaction code hash at the supplied EIP-7928 position.
val bal_code_change = impure { c: "bal_note_code_change" } : (block_access_index, address, hash) -> unitA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)EIP-7928 change position: pre-execution system calls use zero,
transactions use their one-based position, and post-execution system calls
use transaction_count + 1.
type block_access_index = range(0, transaction_count_bound + 1)The common digest type used by trie, code, and block hashes.
type hash = b256type BalStorageChangeEntry¶
One recorded storage change in canonical host traversal order.
struct BalStorageChangeEntry = {
slot : word,
index : block_access_index,
value : word,
}EIP-7928 change position: pre-execution system calls use zero,
transactions use their one-based position, and post-execution system calls
use transaction_count + 1.
type block_access_index = range(0, transaction_count_bound + 1)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)type BalBalanceChangeEntry¶
One recorded balance change in canonical host traversal order.
struct BalBalanceChangeEntry = {
index : block_access_index,
value : word,
}EIP-7928 change position: pre-execution system calls use zero,
transactions use their one-based position, and post-execution system calls
use transaction_count + 1.
type block_access_index = range(0, transaction_count_bound + 1)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)type BalNonceChangeEntry¶
One recorded nonce change in canonical host traversal order.
struct BalNonceChangeEntry = {
index : block_access_index,
value : account_nonce,
}An account transaction-count nonce (EIP-2681).
type account_nonce = range(0, account_nonce_bound)EIP-7928 change position: pre-execution system calls use zero,
transactions use their one-based position, and post-execution system calls
use transaction_count + 1.
type block_access_index = range(0, transaction_count_bound + 1)type BalCodeChangeEntry¶
One recorded code change in canonical host traversal order.
struct BalCodeChangeEntry = {
index : block_access_index,
code_hash : hash,
}EIP-7928 change position: pre-execution system calls use zero,
transactions use their one-based position, and post-execution system calls
use transaction_count + 1.
type block_access_index = range(0, transaction_count_bound + 1)The common digest type used by trie, code, and block hashes.
type hash = b256type BalIterEntry¶
One event in the canonical account-delimited BAL stream.
union BalIterEntry = {
/* starts one account and carries its address */
BalAccount : address,
/* one indexed post-transaction value for a changed storage slot */
BalStorageChange : BalStorageChangeEntry,
/* one storage slot that was read but never changed */
BalStorageRead : word,
/* one indexed post-transaction balance */
BalBalanceChange : BalBalanceChangeEntry,
/* one indexed post-transaction nonce */
BalNonceChange : BalNonceChangeEntry,
/* one indexed post-transaction code hash */
BalCodeChange : BalCodeChangeEntry,
/* ends the current account */
BalAccountEnd : unit,
/* marks the end of the complete stream */
BalEmpty : unit,
}One recorded balance change in canonical host traversal order.
struct BalBalanceChangeEntry = {
index : block_access_index,
value : word,
}One recorded code change in canonical host traversal order.
struct BalCodeChangeEntry = {
index : block_access_index,
code_hash : hash,
}One recorded nonce change in canonical host traversal order.
struct BalNonceChangeEntry = {
index : block_access_index,
value : account_nonce,
}One recorded storage change in canonical host traversal order.
struct BalStorageChangeEntry = {
slot : word,
index : block_access_index,
value : word,
}A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val bal_prepare_iter¶
Canonicalizes the recorded keyed tables and resets the flat iterator.
val bal_prepare_iter = impure { c: "bal_prepare_iter" } : unit -> unitval bal_iter_next¶
Pops the next event from the canonical account-delimited BAL stream.
val bal_iter_next = impure { c: "bal_iter_next" } : unit -> BalIterEntryOne event in the canonical account-delimited BAL stream.
union BalIterEntry = {
/* starts one account and carries its address */
BalAccount : address,
/* one indexed post-transaction value for a changed storage slot */
BalStorageChange : BalStorageChangeEntry,
/* one storage slot that was read but never changed */
BalStorageRead : word,
/* one indexed post-transaction balance */
BalBalanceChange : BalBalanceChangeEntry,
/* one indexed post-transaction nonce */
BalNonceChange : BalNonceChangeEntry,
/* one indexed post-transaction code hash */
BalCodeChange : BalCodeChangeEntry,
/* ends the current account */
BalAccountEnd : unit,
/* marks the end of the complete stream */
BalEmpty : unit,
}val warm_reset¶
Clears both warm sets (per-transaction reset; EIP-2929 warmth is transaction-scoped).
val warm_reset = impure { c: "warm_reset" } : block_access_index -> unitEIP-7928 change position: pre-execution system calls use zero,
transactions use their one-based position, and post-execution system calls
use transaction_count + 1.
type block_access_index = range(0, transaction_count_bound + 1)val account_is_warm¶
Returns whether the address is already warm without mutating the warm set.
val account_is_warm = impure { c: "account_is_warm" } : address -> boolA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val account_mark_warm¶
Marks the address warm after its access charge has been paid.
val account_mark_warm = impure { c: "account_mark_warm" } : address -> unitA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val storage_is_warm¶
Returns whether (address, slot) is already warm without mutation.
A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val storage_mark_warm¶
Marks (address, slot) warm after its access charge has been paid.
A 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val authorization_tracker_reset¶
Clears and pre-sizes the authorization tracker for one transaction.
val authorization_tracker_reset = impure { c: "authorization_tracker_reset" } : prepared_authorization_count -> unitThe number of authorization tuples admitted by one valid transaction.
type prepared_authorization_count = range(0, prepared_authorization_count_bound)val authorization_tracker_seen¶
Whether a successfully applied authorization for this authority was seen.
val authorization_tracker_seen = impure { c: "authorization_tracker_seen" } : address -> boolA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val authorization_tracker_originally_delegated¶
Whether the authority was delegated before its first successful tuple.
val authorization_tracker_originally_delegated = impure { c: "authorization_tracker_originally_delegated" } : address -> boolA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val authorization_tracker_delegation_set¶
Whether this transaction has successfully set a delegation for the authority.
val authorization_tracker_delegation_set = impure { c: "authorization_tracker_delegation_set" } : address -> boolA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val authorization_tracker_commit¶
Records one successfully applied authorization.
val authorization_tracker_commit = impure { c: "authorization_tracker_commit" } : (address, bool, bool) -> unitA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val logs_tx_reset¶
Starts a new transaction-local view in the block-lifetime log store.
val logs_tx_reset = impure { c: "logs_tx_reset" } : unit -> unitval log_begin¶
Begins a log record for address.
val log_begin = impure { c: "log_begin" } : address -> unitA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)val log_add_topic¶
Appends one topic to the current record.
val log_add_topic = impure { c: "log_add_topic" } : word -> unitThe EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val log_add_data_memory¶
Copies an EVM-memory payload into the current retained log record.
val log_add_data_memory = impure { c: "log_add_data_memory" } : EvmMemorySlice -> unitAn EVM-memory range with its coordinate and length packed existentially.
type EvmMemorySlice = {
'off 'len,
memory_region_valid_range('off, 'len).
EvmMemorySliceFields('off, 'len)
}val log_add_data_word¶
Appends one canonical big-endian word payload to the current record.
val log_add_data_word = impure { c: "log_add_data_word" } : word -> unitThe EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val logs_tx_start¶
Start and length of the current transaction's retained log range.
val logs_tx_start = impure { c: "logs_tx_start" } : unit -> log_store_indexA position in the block-lifetime host log store.
type log_store_index = range(0, log_store_index_bound)val logs_tx_count¶
Number of retained logs emitted by the current transaction.
val logs_tx_count = impure { c: "logs_tx_count" } : unit -> log_store_indexA position in the block-lifetime host log store.
type log_store_index = range(0, log_store_index_bound)val log_address¶
Indexed access to a retained log record.
val log_address = impure { c: "log_addr" } : log_store_index -> addressA 20-byte account address (YP §4.1), in canonical protocol byte order.
type address = vector(20, inc, byte)A position in the block-lifetime host log store.
type log_store_index = range(0, log_store_index_bound)val log_topics_count¶
Number of topics attached to an indexed retained log.
val log_topics_count = impure { c: "log_topic_count" } : log_store_index -> log_store_indexA position in the block-lifetime host log store.
type log_store_index = range(0, log_store_index_bound)val log_topic¶
Reads one topic from an indexed retained log.
val log_topic = impure { c: "log_topic" } : (log_store_index, log_store_index) -> wordA position in the block-lifetime host log store.
type log_store_index = range(0, log_store_index_bound)The EVM 256-bit machine word (YP §9.1). A transparent range keeps the mathematical subtype relation visible: narrower non-negative ranges can be passed as words without a model-level conversion.
type word = range(0, 2 ^ 256 - 1)val log_data_offset¶
Offset of an indexed retained log's payload in the host log-data arena.
val log_data_offset = impure { c: "log_data_off" } : log_store_index -> log_data_pointerA coordinate in retained log-data storage.
type log_data_pointer = range(0, log_data_region_bound)A position in the block-lifetime host log store.
type log_store_index = range(0, log_store_index_bound)val log_data_length¶
Byte length of an indexed retained log's payload.
val log_data_length = impure { c: "log_data_len" } : log_store_index -> log_data_lengthA length in retained log-data storage.
type log_data_length = range(0, log_data_region_bound)A position in the block-lifetime host log store.
type log_store_index = range(0, log_store_index_bound)