Contract ABI

Contract ABI is a representation of a Starknet contract’s interface. It is formatted as JSON and describes the functions, structs and events which are defined in the contract.

You can get the contract’s ABI by compiling:

  • Cairo 0

  • Cairo 1.0

starknet-compile contract.cairo \
    --output contract_compiled.json \
    --abi contract_abi.json
cargo run --bin starknet-compile -- /path/to/input.cairo /path/to/output.json

The following is an example contract ABI:

  • Cairo 0

  • Cairo 1.0

[
  {
    "members": [
      {
        "name": "x",
        "offset": 0,
        "type": "felt"
      },
      {
        "name": "y",
        "offset": 1,
        "type": "felt"
      }
    ],
    "name": "Point",
    "size": 2,
    "type": "struct"
  },
  {
    "members": [
      {
        "name": "x",
        "offset": 0,
        "type": "felt"
      },
      {
        "name": "p",
        "offset": 1,
        "type": "Point"
      }
    ],
    "name": "Test",
    "size": 3,
    "type": "struct"
  },
  {
    "data": [
      {
        "name": "a",
        "type": "felt"
      },
      {
        "name": "b",
        "type": "felt"
      }
    ],
    "keys": [],
    "name": "status_update",
    "type": "event"
  },
  {
    "inputs": [
      {
        "name": "a_len",
        "type": "felt"
      },
      {
        "name": "a",
        "type": "felt*"
      }
    ],
    "name": "constructor",
    "outputs": [],
    "type": "constructor"
  },
  {
    "inputs": [
      {
        "name": "user",
        "type": "felt"
      }
    ],
    "name": "extend_range",
    "outputs": [],
    "type": "function"
  },
  {
    "inputs": [
      {
        "name": "points_len",
        "type": "felt"
      },
      {
        "name": "points",
        "type": "(felt, Point, Point)*"
      }
    ],
    "name": "input_arrays",
    "outputs": [],
    "type": "function"
  },
  {
    "inputs": [
      {
        "name": "nested_len",
        "type": "felt"
      },
      {
        "name": "nested",
        "type": "Test*"
      }
    ],
    "name": "input_nested_arrays",
    "outputs": [
      {
        "name": "res",
        "type": "felt"
      }
    ],
    "type": "function"
  },
  {
    "inputs": [
      {
        "name": "array_len",
        "type": "felt"
      },
      {
        "name": "array",
        "type": "felt*"
      }
    ],
    "name": "output_arrays",
    "outputs": [
      {
        "name": "array_len",
        "type": "felt"
      },
      {
        "name": "array",
        "type": "felt*"
      }
    ],
    "type": "function"
  },
  {
    "inputs": [
      {
        "name": "points",
        "type": "(Point, Point)"
      }
    ],
    "name": "input_output_struct",
    "outputs": [
      {
        "name": "res",
        "type": "Point"
      }
    ],
    "type": "function"
  }
]
[
  {
    "type": "function",
    "name": "constructor",
    "inputs": [
      {
        "name": "name_",
        "type": "core::felt252"
      },
      {
        "name": "symbol_",
        "type": "core::felt252"
      },
      {
        "name": "decimals_",
        "type": "core::integer::u8"
      },
      {
        "name": "initial_supply",
        "type": "core::integer::u256"
      },
      {
        "name": "recipient",
        "type": "core::starknet::contract_address::ContractAddress"
      }
    ],
    "outputs": [],
    "state_mutability": "external"
  },
  {
    "type": "function",
    "name": "get_name",
    "inputs": [],
    "outputs": [
      {
        "type": "core::felt252"
      }
    ],
    "state_mutability": "view"
  },
  {
    "type": "function",
    "name": "get_symbol",
    "inputs": [],
    "outputs": [
      {
        "type": "core::felt252"
      }
    ],
    "state_mutability": "view"
  },
  {
    "type": "function",
    "name": "get_decimals",
    "inputs": [],
    "outputs": [
      {
        "type": "core::integer::u8"
      }
    ],
    "state_mutability": "view"
  },
  {
    "type": "function",
    "name": "get_total_supply",
    "inputs": [],
    "outputs": [
      {
        "type": "core::integer::u256"
      }
    ],
    "state_mutability": "view"
  },
  {
    "type": "function",
    "name": "balance_of",
    "inputs": [
      {
        "name": "account",
        "type": "core::starknet::contract_address::ContractAddress"
      }
    ],
    "outputs": [
      {
        "type": "core::integer::u256"
      }
    ],
    "state_mutability": "view"
  },
  {
    "type": "function",
    "name": "allowance",
    "inputs": [
      {
        "name": "owner",
        "type": "core::starknet::contract_address::ContractAddress"
      },
      {
        "name": "spender",
        "type": "core::starknet::contract_address::ContractAddress"
      }
    ],
    "outputs": [
      {
        "type": "core::integer::u256"
      }
    ],
    "state_mutability": "view"
  },
  {
    "type": "function",
    "name": "transfer",
    "inputs": [
      {
        "name": "recipient",
        "type": "core::starknet::contract_address::ContractAddress"
      },
      {
        "name": "amount",
        "type": "core::integer::u256"
      }
    ],
    "outputs": [],
    "state_mutability": "external"
  },
  {
    "type": "function",
    "name": "transfer_from",
    "inputs": [
      {
        "name": "sender",
        "type": "core::starknet::contract_address::ContractAddress"
      },
      {
        "name": "recipient",
        "type": "core::starknet::contract_address::ContractAddress"
      },
      {
        "name": "amount",
        "type": "core::integer::u256"
      }
    ],
    "outputs": [],
    "state_mutability": "external"
  },
  {
    "type": "function",
    "name": "approve",
    "inputs": [
      {
        "name": "spender",
        "type": "core::starknet::contract_address::ContractAddress"
      },
      {
        "name": "amount",
        "type": "core::integer::u256"
      }
    ],
    "outputs": [],
    "state_mutability": "external"
  },
  {
    "type": "function",
    "name": "increase_allowance",
    "inputs": [
      {
        "name": "spender",
        "type": "core::starknet::contract_address::ContractAddress"
      },
      {
        "name": "added_value",
        "type": "core::integer::u256"
      }
    ],
    "outputs": [],
    "state_mutability": "external"
  },
  {
    "type": "function",
    "name": "decrease_allowance",
    "inputs": [
      {
        "name": "spender",
        "type": "core::starknet::contract_address::ContractAddress"
      },
      {
        "name": "subtracted_value",
        "type": "core::integer::u256"
      }
    ],
    "outputs": [],
    "state_mutability": "external"
  },
  {
    "type": "event",
    "name": "Transfer",
    "inputs": [
      {
        "name": "from",
        "type": "core::starknet::contract_address::ContractAddress"
      },
      {
        "name": "to",
        "type": "core::starknet::contract_address::ContractAddress"
      },
      {
        "name": "value",
        "type": "core::integer::u256"
      }
    ]
  },
  {
    "type": "event",
    "name": "Approval",
    "inputs": [
      {
        "name": "owner",
        "type": "core::starknet::contract_address::ContractAddress"
      },
      {
        "name": "spender",
        "type": "core::starknet::contract_address::ContractAddress"
      },
      {
        "name": "value",
        "type": "core::integer::u256"
      }
    ]
  }
]

The Cairo 0 compiler is no longer maintained, see here for more details on Cairo 1 contracts compilation.