Vyper theorytheory 0/50 · 0%
Web3 integration · medium

21. External calls and interfaces

Calling other contracts safely and typed.

To call another contract you declare an `interface` describing its external functions, then wrap the target address in that interface's name to get a typed handle.

interface ERC20:
    def transfer(to: address, amount: uint256) -> bool: nonpayable
    def balanceOf(owner: address) -> uint256: view

@external
def pay(token: address, to: address, amount: uint256):
    assert ERC20(token).transfer(to, amount), "transfer failed"

Declaring the correct state mutability (`view`, `nonpayable`, `payable`) on each interface function matters — it affects both correctness and the gas estimation the caller performs.

Check your understanding

  1. 1. How do you type an external contract address in Vyper?

  2. 2. Where do you declare an external contract's callable functions?

  3. 3. Why does state mutability on interface functions matter?