Skip to content

Latest commit

 

History

History
125 lines (97 loc) · 3.5 KB

File metadata and controls

125 lines (97 loc) · 3.5 KB

← Back to Instruction Set: Quick Reference

CALL

Call external contract

Opcode 0x39

childContext = createChildContext(
    contract: M[addrOffset],
    calldataOffset: argsOffset,
    calldataSize: M[argsSizeOffset],
    l2Gas: M[l2GasOffset],
    daGas: M[daGasOffset]
)
execute childContext

Details

Calls another contract with the specified calldata and gas allocation. Can modify state. The call consumes the allocated gas and refunds unused gas. Updates nestedCallSuccess and nestedReturndata. Child can access caller's M[calldataOffset:calldataOffset+calldataSize] via CALLDATACOPY.

Gas Costs

Component Value Scales with
L2 Base 9936 -
DA Base 0 -
L2 Addressing 3 3 L2 gas per indirect memory offset
3 L2 gas per relative memory offset

* See Gas Metering for details on how gas costs are computed and applied.

Operands

Name Type Description
l2GasOffset Memory offset Memory offset of the L2 gas to allocate to the nested call
daGasOffset Memory offset Memory offset of the DA gas to allocate to the nested call
addrOffset Memory offset Memory offset of the target contract address
argsSizeOffset Memory offset Memory offset of the calldata size
argsOffset Memory offset Memory offset of the start of the calldata

Wire Formats

See Wire Format page for an explanation of wire format variants and opcode naming (e.g., why ADD_8 vs ADD_16).

CALL (Opcode 0x39):

---
title: "CALL"
config:
  packet:
    bitsPerRow: 64
---
packet-beta
0-7: "Opcode (0x39)"
8-23: "Addressing modes"
24-39: "Operand: l2GasOffset"
40-55: "Operand: daGasOffset"
56-71: "Operand: addrOffset"
72-87: "Operand: argsSizeOffset"
88-103: "Operand: argsOffset"
Loading

Addressing Modes

See Addressing page for a detailed explanation.

16-bit bitmask: 2 bits per memory offset operand (indirect flag + relative flag)

Memory offset operands (l2GasOffset, daGasOffset, addrOffset, argsSizeOffset, argsOffset) are encoded as follows:

---
title: "Addressing Mode Bitmask"
config:
  packet:
    bitWidth: 128
    bitsPerRow: 8
---
packet-beta
  0: "l2GasOffset is indirect"
  1: "l2GasOffset is relative"
  2: "daGasOffset is indirect"
  3: "daGasOffset is relative"
  4: "addrOffset is indirect"
  5: "addrOffset is relative"
  6: "argsSizeOffset is indirect"
  7: "argsSizeOffset is relative"
  8: "argsOffset is indirect"
  9: "argsOffset is relative"
  10: "Unused"
  11: "Unused"
  12: "Unused"
  13: "Unused"
  14: "Unused"
  15: "Unused"
Loading

Tag Checks

  • T[l2GasOffset] == UINT32
  • T[daGasOffset] == UINT32
  • T[addrOffset] == FIELD
  • T[argsSizeOffset] == UINT32

Tag Updates

  • T[successOffset] = UINT1

Error Conditions

  • INVALID_TAG: Gas, address, or size operands have incorrect tags
  • OUT_OF_GAS: Insufficient gas for the nested call
  • SIDE_EFFECT_LIMIT_REACHED: Exceeded maximum unique contract class IDs per transaction (MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS)
  • MEMORY_ACCESS_OUT_OF_RANGE: Memory offset operand exceeds addressable memory

Notes


← Back to Instruction Set: Quick Reference