Skip to content

L2 Agents

The Agent contract act as some sort of proxy for the agents on Ethereum mainnet. Relayed votes are directly executed from the Relayer contract itself.

There are three different agent contracts:

  • Ownership Agent, which manages the ownership of contracts.
  • Parameter Agent, which manages contract parameters
  • Emergency Agent, which handles emergency actions.


The source code of the Agent.vy contract can be found on GitHub .


Agent.RELAYER() -> address: view

Getter for the relayer contract, which relays the messages to the according agent.

Returns: relayer contract (address).

Source code
RELAYER: public(immutable(address))

def __init__():
    RELAYER = msg.sender
>>> Agent.RELAYER()     # arbitrum
>>> '0xb7b0FF38E0A01D798B5cd395BbA6Ddb56A323830'

>>> Agent.RELAYER()     # optimism
>>> '0x8e1e5001C7B8920196c7E3EdF2BCf47B2B6153ff'


Agent.execute(_messages: DynArray[Message, MAX_MESSAGES]):

Guarded Methods

This function can only be called by the RELAYER of the contract.

Function to execute a relayed message. Calling this function directly from the Agent contract will result in a reverted transaction, as it can only be called directly from the Relayer contract. Everyone can relay messages from there

Input Type Description
_messages DynArray[Message, MAX_MESSAGES] Message to execute.
Source code
struct Message:
    target: address
    data: Bytes[MAX_BYTES]

MAX_BYTES: constant(uint256) = 1024
MAX_MESSAGES: constant(uint256) = 8

RELAYER: public(immutable(address))

def execute(_messages: DynArray[Message, MAX_MESSAGES]):
    @notice Execute a sequence of messages.
    @param _messages An array of messages to be executed.
    assert msg.sender == RELAYER

    for message in _messages:
>>> soon