Meta-Properties#

Each sub-VM carries VM meta-properties. Some are part of the startup message; others are VM-internal. This page defines those fields; how they are derived when a sub-VM starts is specified in Sub-VM Creation.

Most permission meta-properties are granted by the node for the initial entry. The exception is can_use_balance_for_message_fees, which is owned by the contract: it is stored in the contract’s root slot and read before execution begins.

Execution Meta-Properties#

stack#

Startup-message field containing the view-call stack of contract addresses.

depth#

Internal field containing the nesting depth of the sub-VM.

permissions#

Internal field containing the permission meta-properties granted to the sub-VM.

state_mode#

Internal field selecting the storage view used by reads (a storage_type).

topmost_runner_id#

Internal field selecting the entry runner for this sub-VM.

det_subvm_hashes#

Internal accumulator for deterministic child sub-VM result hashes; see Sub-VM Result Hash.

granted_custom#

Internal field containing custom runners granted to this sub-VM at startup; see Custom-Runner Grants.

Custom runners are not permission meta-properties: they are tracked by the sub-VM’s loaded-runner set (Custom Runner Loading) and by this field.

Permission Meta-Properties#

deterministic#

When true, the sub-VM executes in Deterministic Mode. Storage writes, message sends, contract calls, event emission, and runner registration require this meta-property where specified below.

write_storage#

Allows writing contract storage slots. Requires deterministic.

This meta-property also gates EmitEvent: a sub-VM may emit events iff it can write storage.

send_messages#

Allows sending messages to other addresses. Required by EthSend, PostMessage, and DeployContract. Requires deterministic.

call_others#

Allows calling other contracts. Required by EthCall and CallContract Message. Requires deterministic.

spawn_nondet#

Allows spawning Non-Deterministic Mode sub-VM instances via RunNondet Message.

register_runners#

Allows registering runner archives at runtime via RegisterRunner Message. Requires deterministic.

can_use_balance_for_message_fees#

Allows the contract to draw on its own balance to pay fees for outgoing internal messages (PostMessage, DeployContract). The flag has no effect on external EthSend messages.

Unlike the meta-properties above, this one is stored as a bit in the root slot’s inline permissions bitfield and read before execution begins. The bit offset is the corresponding member of permissions.