Skip to main content
@tevm/voltaire
@tevm/voltaire / evm

evm

EVM (Ethereum Virtual Machine) module Provides execution frame, host interface, and complete opcode handler implementations. Based on guillotine-mini architecture with TypeScript/Zig dual implementation.

Namespaces

Type Aliases

BrandedFrame

BrandedFrame = object
Defined in: src/evm/Frame/FrameType.ts:11 BrandedFrame - EVM execution frame Represents an EVM execution frame with stack, memory, gas accounting, and execution state. Based on guillotine-mini Frame structure.

Properties

[brand]
readonly [brand]: "Frame"
Defined in: src/evm/Frame/FrameType.ts:12
accessedAddresses?
optional accessedAddresses: Set<string>
Defined in: src/evm/Frame/FrameType.ts:47
accessedStorageKeys?
optional accessedStorageKeys: Map<string, boolean>
Defined in: src/evm/Frame/FrameType.ts:48
address
address: AddressType
Defined in: src/evm/Frame/FrameType.ts:28
authorized
authorized: bigint | null
Defined in: src/evm/Frame/FrameType.ts:40
blobBaseFee?
optional blobBaseFee: bigint
Defined in: src/evm/Frame/FrameType.ts:62
blobVersionedHashes?
optional blobVersionedHashes: bigint[]
Defined in: src/evm/Frame/FrameType.ts:65
blockBaseFee?
optional blockBaseFee: bigint
Defined in: src/evm/Frame/FrameType.ts:60
blockDifficulty?
optional blockDifficulty: bigint
Defined in: src/evm/Frame/FrameType.ts:58
blockGasLimit?
optional blockGasLimit: bigint
Defined in: src/evm/Frame/FrameType.ts:57
blockHashes?
optional blockHashes: Map<bigint, bigint>
Defined in: src/evm/Frame/FrameType.ts:64
blockNumber?
optional blockNumber: bigint
Defined in: src/evm/Frame/FrameType.ts:55
blockPrevrandao?
optional blockPrevrandao: bigint
Defined in: src/evm/Frame/FrameType.ts:59
blockTimestamp?
optional blockTimestamp: bigint
Defined in: src/evm/Frame/FrameType.ts:56
bytecode
bytecode: Uint8Array
Defined in: src/evm/Frame/FrameType.ts:24
calldata
calldata: Uint8Array
Defined in: src/evm/Frame/FrameType.ts:30
callDepth
callDepth: number
Defined in: src/evm/Frame/FrameType.ts:41
caller
caller: AddressType
Defined in: src/evm/Frame/FrameType.ts:27
chainId?
optional chainId: bigint
Defined in: src/evm/Frame/FrameType.ts:61
coinbase?
optional coinbase: AddressType
Defined in: src/evm/Frame/FrameType.ts:63
gasRefunds?
optional gasRefunds: bigint
Defined in: src/evm/Frame/FrameType.ts:52
gasRemaining
gasRemaining: bigint
Defined in: src/evm/Frame/FrameType.ts:23
hardfork?
optional hardfork: HardforkType
Defined in: src/evm/Frame/FrameType.ts:44
isStatic
isStatic: boolean
Defined in: src/evm/Frame/FrameType.ts:37
logs?
optional logs: object[]
Defined in: src/evm/Frame/FrameType.ts:69
address
address: AddressType
data
data: Uint8Array
topics
topics: bigint[]
memory
memory: Map<number, number>
Defined in: src/evm/Frame/FrameType.ts:18
memorySize
memorySize: number
Defined in: src/evm/Frame/FrameType.ts:19
output
output: Uint8Array
Defined in: src/evm/Frame/FrameType.ts:31
pc
pc: number
Defined in: src/evm/Frame/FrameType.ts:22
returnData
returnData: Uint8Array
Defined in: src/evm/Frame/FrameType.ts:32
reverted
reverted: boolean
Defined in: src/evm/Frame/FrameType.ts:36
selfBalance?
optional selfBalance: bigint
Defined in: src/evm/Frame/FrameType.ts:66
stack
stack: bigint[]
Defined in: src/evm/Frame/FrameType.ts:15
stopped
stopped: boolean
Defined in: src/evm/Frame/FrameType.ts:35
storageOriginalValues?
optional storageOriginalValues: Map<string, bigint>
Defined in: src/evm/Frame/FrameType.ts:51
value
value: bigint
Defined in: src/evm/Frame/FrameType.ts:29

Methods

add()
add(): EvmError | null
Defined in: src/evm/Frame/FrameType.ts:76
Returns
EvmError | null
addmod()
addmod(): EvmError | null
Defined in: src/evm/Frame/FrameType.ts:83
Returns
EvmError | null
div()
div(): EvmError | null
Defined in: src/evm/Frame/FrameType.ts:79
Returns
EvmError | null
exp()
exp(): EvmError | null
Defined in: src/evm/Frame/FrameType.ts:85
Returns
EvmError | null
mod()
mod(): EvmError | null
Defined in: src/evm/Frame/FrameType.ts:81
Returns
EvmError | null
mul()
mul(): EvmError | null
Defined in: src/evm/Frame/FrameType.ts:77
Returns
EvmError | null
mulmod()
mulmod(): EvmError | null
Defined in: src/evm/Frame/FrameType.ts:84
Returns
EvmError | null
sdiv()
sdiv(): EvmError | null
Defined in: src/evm/Frame/FrameType.ts:80
Returns
EvmError | null
signextend()
signextend(): EvmError | null
Defined in: src/evm/Frame/FrameType.ts:86
Returns
EvmError | null
smod()
smod(): EvmError | null
Defined in: src/evm/Frame/FrameType.ts:82
Returns
EvmError | null
sub()
sub(): EvmError | null
Defined in: src/evm/Frame/FrameType.ts:78
Returns
EvmError | null

BrandedHost

BrandedHost = object
Defined in: src/evm/Host/HostType.ts:30 BrandedHost - EVM host interface for external state access Provides access to account state (balances, storage, code, nonces) and nested execution capabilities.

Architecture Note

This module provides low-level EVM primitives (opcode handlers, frame management). For full EVM execution with nested calls, use:
  • guillotine: Production EVM with async state access, tracing, and full EIP support
  • guillotine-mini: Lightweight synchronous EVM for testing and simple use cases
The call and create methods on this interface are optional - when not provided, system opcodes (CALL, CREATE, etc.) will return a NotImplemented error. This is intentional: these low-level utils don’t include a full execution engine. Based on guillotine-mini HostInterface vtable pattern.

Properties

[brand]
readonly [brand]: "Host"
Defined in: src/evm/Host/HostType.ts:31
call()?
optional call: (params) => CallResult
Defined in: src/evm/Host/HostType.ts:91 Execute a nested CALL operation (CALL, STATICCALL, DELEGATECALL, CALLCODE) Optional - when not provided, CALL-family opcodes return NotImplemented error. Full implementations provided by guillotine/guillotine-mini EVM engines.
Parameters
params
CallParams
Returns
CallResult
create()?
optional create: (params) => CreateResult
Defined in: src/evm/Host/HostType.ts:99 Execute a nested CREATE operation (CREATE, CREATE2) Optional - when not provided, CREATE-family opcodes return NotImplemented error. Full implementations provided by guillotine/guillotine-mini EVM engines.
Parameters
params
CreateParams
Returns
CreateResult
getBalance()
getBalance: (address) => bigint
Defined in: src/evm/Host/HostType.ts:36 Get account balance
Parameters
address
AddressType
Returns
bigint
getCode()
getCode: (address) => Uint8Array
Defined in: src/evm/Host/HostType.ts:46 Get account code
Parameters
address
AddressType
Returns
Uint8Array
getNonce()
getNonce: (address) => bigint
Defined in: src/evm/Host/HostType.ts:66 Get account nonce
Parameters
address
AddressType
Returns
bigint
getStorage()
getStorage: (address, slot) => bigint
Defined in: src/evm/Host/HostType.ts:56 Get storage slot value
Parameters
address
AddressType
slot
bigint
Returns
bigint
getTransientStorage()
getTransientStorage: (address, slot) => bigint
Defined in: src/evm/Host/HostType.ts:77 Get transient storage slot value (EIP-1153) Transaction-scoped, cleared at end of transaction
Parameters
address
AddressType
slot
bigint
Returns
bigint
setBalance()
setBalance: (address, balance) => void
Defined in: src/evm/Host/HostType.ts:41 Set account balance
Parameters
address
AddressType
balance
bigint
Returns
void
setCode()
setCode: (address, code) => void
Defined in: src/evm/Host/HostType.ts:51 Set account code
Parameters
address
AddressType
code
Uint8Array
Returns
void
setNonce()
setNonce: (address, nonce) => void
Defined in: src/evm/Host/HostType.ts:71 Set account nonce
Parameters
address
AddressType
nonce
bigint
Returns
void
setStorage()
setStorage: (address, slot, value) => void
Defined in: src/evm/Host/HostType.ts:61 Set storage slot value
Parameters
address
AddressType
slot
bigint
value
bigint
Returns
void
setTransientStorage()
setTransientStorage: (address, slot, value) => void
Defined in: src/evm/Host/HostType.ts:83 Set transient storage slot value (EIP-1153) Transaction-scoped, cleared at end of transaction
Parameters
address
AddressType
slot
bigint
value
bigint
Returns
void

CallParams

CallParams = object
Defined in: src/evm/InstructionHandlerType.ts:60 CallParams - Parameters for EVM call operations Used by CALL, STATICCALL, DELEGATECALL, CALLCODE opcodes.

Example

const params: CallParams = {
  callType: "CALL",
  target: targetAddress,
  value: 1000000000000000000n, // 1 ether in wei
  gasLimit: 100000n,
  input: calldata,
  caller: frame.address,
  isStatic: false,
};

Properties

caller
caller: AddressType
Defined in: src/evm/InstructionHandlerType.ts:77 Caller address
callType
callType: CallType
Defined in: src/evm/InstructionHandlerType.ts:62 Type of call operation
depth
depth: number
Defined in: src/evm/InstructionHandlerType.ts:83 Call depth
gasLimit
gasLimit: bigint
Defined in: src/evm/InstructionHandlerType.ts:71 Gas limit for call
input
input: Uint8Array
Defined in: src/evm/InstructionHandlerType.ts:74 Input data (calldata)
isStatic
isStatic: boolean
Defined in: src/evm/InstructionHandlerType.ts:80 Static call flag (write protection)
target
target: AddressType
Defined in: src/evm/InstructionHandlerType.ts:65 Target contract address
value
value: bigint
Defined in: src/evm/InstructionHandlerType.ts:68 Value to transfer (wei)

CallResult

CallResult = object
Defined in: src/evm/InstructionHandlerType.ts:112 CallResult - Result of EVM call operation Returned by call operations (CALL, STATICCALL, DELEGATECALL, etc.)

Example

// Successful call
const result: CallResult = {
  success: true,
  gasUsed: 21000n,
  output: returnData,
  logs: [{ address, topics, data }],
  gasRefund: 0n,
};

// Failed call (reverted)
const revertResult: CallResult = {
  success: false,
  gasUsed: 50000n,
  output: revertReason,
  logs: [],
  gasRefund: 0n,
};

Properties

gasRefund
gasRefund: bigint
Defined in: src/evm/InstructionHandlerType.ts:130 Gas refund from storage deletions
gasUsed
gasUsed: bigint
Defined in: src/evm/InstructionHandlerType.ts:117 Gas consumed by call
logs
logs: object[]
Defined in: src/evm/InstructionHandlerType.ts:123 Logs emitted during call
address
address: AddressType
data
data: Uint8Array
topics
topics: bigint[]
output
output: Uint8Array
Defined in: src/evm/InstructionHandlerType.ts:120 Return data or revert reason
success
success: boolean
Defined in: src/evm/InstructionHandlerType.ts:114 Whether call succeeded (false if reverted)

CallType

CallType = "CALL" | "STATICCALL" | "DELEGATECALL" | "CALLCODE"
Defined in: src/evm/InstructionHandlerType.ts:36 CallType - EVM call operation types Determines context preservation for cross-contract calls.

CreateParams

CreateParams = object
Defined in: src/evm/InstructionHandlerType.ts:150 CreateParams - Parameters for contract creation Used by CREATE and CREATE2 opcodes.

Example

// CREATE2 with deterministic address
const params: CreateParams = {
  caller: deployerAddress,
  value: 0n,
  initCode: contractBytecode,
  gasLimit: 1000000n,
  salt: 0x123n, // For CREATE2
};

Properties

caller
caller: AddressType
Defined in: src/evm/InstructionHandlerType.ts:152 Deployer address
depth
depth: number
Defined in: src/evm/InstructionHandlerType.ts:167 Call depth
gasLimit
gasLimit: bigint
Defined in: src/evm/InstructionHandlerType.ts:161 Gas limit for deployment
initCode
initCode: Uint8Array
Defined in: src/evm/InstructionHandlerType.ts:158 Initialization code
salt?
optional salt: bigint
Defined in: src/evm/InstructionHandlerType.ts:164 Salt for CREATE2 (optional)
value
value: bigint
Defined in: src/evm/InstructionHandlerType.ts:155 Value to transfer (wei)

CreateResult

CreateResult = object
Defined in: src/evm/InstructionHandlerType.ts:194 CreateResult - Result of contract creation Returned by CREATE and CREATE2 operations.

Example

// Successful deployment
const result: CreateResult = {
  success: true,
  address: newContractAddress,
  gasUsed: 200000n,
  output: runtimeCode,
};

// Failed deployment
const failResult: CreateResult = {
  success: false,
  address: null,
  gasUsed: 100000n,
  output: revertReason,
};

Properties

address
address: AddressType | null
Defined in: src/evm/InstructionHandlerType.ts:199 Address of deployed contract (null if failed)
gasRefund
gasRefund: bigint
Defined in: src/evm/InstructionHandlerType.ts:208 Gas refund
gasUsed
gasUsed: bigint
Defined in: src/evm/InstructionHandlerType.ts:202 Gas consumed by deployment
output
output: Uint8Array
Defined in: src/evm/InstructionHandlerType.ts:205 Runtime code or revert reason
success
success: boolean
Defined in: src/evm/InstructionHandlerType.ts:196 Whether deployment succeeded

EvmError

EvmError = { type: "StackOverflow"; } | { type: "StackUnderflow"; } | { type: "OutOfGas"; } | { type: "OutOfBounds"; } | { type: "InvalidJump"; } | { type: "InvalidOpcode"; } | { type: "RevertExecuted"; } | { type: "CallDepthExceeded"; } | { type: "WriteProtection"; } | { type: "InsufficientBalance"; } | { message: string; type: "NotImplemented"; }
Defined in: src/evm/Frame/FrameType.ts:92 EvmError - Frame execution errors

InstructionHandler()

InstructionHandler = (frame, host) => EvmError | { type: "Success"; }
Defined in: src/evm/InstructionHandlerType.ts:26 InstructionHandler - Function signature for EVM opcode handlers Each opcode is implemented as a function that mutates the frame state and returns success or an error. Based on guillotine-mini instruction handler pattern.

Parameters

frame
BrandedFrame
host
BrandedHost

Returns

EvmError | { type: "Success"; }

Example

// ADD opcode handler (0x01)
const addHandler: InstructionHandler = (frame: BrandedFrame, host: BrandedHost) => {
  if (frame.stack.length < 2) {
    return { type: "StackUnderflow" };
  }
  const b = frame.stack.pop()!;
  const a = frame.stack.pop()!;
  frame.stack.push((a + b) % 2n**256n); // Mod 2^256
  return { type: "Success" };
};

Functions

Frame()

Frame(params): BrandedFrame
Defined in: src/evm/Frame/index.ts:59 Create a new EVM execution frame

Parameters

params
FrameParams = {} Frame initialization parameters

Returns

BrandedFrame New Frame instance

Example

import { Frame } from 'voltaire/evm/Frame';

const frame = Frame({
  bytecode: new Uint8Array([0x60, 0x01]),
  gas: 100000n,
});

Host()

Host(impl): BrandedHost
Defined in: src/evm/Host/index.ts:65 Create a Host interface implementation

Parameters

impl
HostImpl Host implementation with state access methods

Returns

BrandedHost Host instance

Example

import { Host } from 'voltaire/evm/Host';

const host = Host({
  getBalance: (addr) => balances.get(addr) ?? 0n,
  setBalance: (addr, bal) => balances.set(addr, bal),
  // ... other methods
});

References

Precompiles

Renames and re-exports precompiles