Intelligent Contracts
Interacting with EVM Contracts

Interacting with EVM Contracts

Interacting with EVM Contracts lets Intelligent Contracts define EVM contract interfaces, read EVM contract data and balances, and emit messages to EVM contracts.

These are external messages — they cross from the GenVM layer back to the GenLayer Chain via ghost contracts. See Messages for the conceptual model.

Contract Interface Definition

Define EVM contract interfaces using decorators:

@gl.evm.contract_interface
class TokenContract:
    class View:
        def balance_of(self, owner: Address) -> u256: ...
        def total_supply(self) -> u256: ...
 
    class Write:
        def transfer(self, to: Address, amount: u256) -> bool: ...
        def approve(self, spender: Address, amount: u256) -> bool: ...

Calling EVM Contracts

Interact with EVM contracts through defined interfaces:

token_address: Address = ...
# Read from EVM contract
token = TokenContract(token_address)
supply = token.view().total_supply()
 
# Write to EVM contract
token.emit().transfer(receiver_address, u256(100))

Balance Access

Access EVM contract balances directly:

evm_contract = TokenContract(address)
balance = evm_contract.balance  # Get contract's ETH balance

Message Emission

Send messages to EVM contracts:

TokenContract(token_address).emit().approve(spender, amount)

Messages to EVM contract can be emitted only on finality