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_view).

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 EmitExternalMessage, EmitInternalMessage, and EmitInternalDeployMessage. Requires deterministic.

call_others#

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

spawn_nondet#

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

A sub-VM that a host delegated to another executor (see Contract Major Version) never holds this permission, whatever its caller holds. Such a sub-VM has no connection to the non-deterministic modules, so the permission cannot be served there.

can_use_balance_for_message_fees#

Allows the contract to draw on its own balance to pay fees for outgoing internal messages (EmitInternalMessage, EmitInternalDeployMessage). The flag has no effect on EmitExternalMessage.

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.

A deployment is the exception: permission is granted unconditionally.