Skip to main content
IBC-solidity is the Solidity implementation of the IBC protocol. It consists of a core set of contracts that run on each chain: a router that holds the registries and the commitment store, light clients for each counterparty, and the applications that send and receive packets. The pages in this section document the main contracts and how they work. Visit the tutorial to learn how to deploy this whole contract set.

How the contracts fit together

Each chain in a pair holds a core set of IBC contracts. At its center is the core ICS26Router, which owns the application registry, the light client registry, and the commitment store. Around it sit light clients counterparty and the applications that use them. The router records the counterparty client identifier for each client it registers. The router is the only contract that talks to both the applications and the light clients. An application joins by registering an IIBCApp implementation under a port identifier. Light clients are interchangeable behind ILightClient, which declares updateClient, verifyMembership, verifyNonMembership, misbehaviour, and getClientState. To start, an application calls sendPacket. The router accepts that call only from the application registered on the packet’s source port. Inbound, a relayer calls recvPacket. The router has the destination client verify a membership proof of the packet commitment, then dispatches onRecvPacket to the application. The same pattern closes the loop: ackPacket verifies the counterparty’s acknowledgement, and timeoutPacket verifies that no receipt was written. The Solidity contracts: IBCMulticall and ICS26Router, the ICS27GMP application and accounts, and the light clients

IBC-solidity contracts

Every contract in the tables below is one of five things: a contract with its own address, an abstract base compiled into another contract, a child instance a parent creates, an encoder registered per counterparty client, or a library. The Kind column says which one each is.

ICS26Router: the IBC core

Documented in core.

Light clients

AttestationLightClient is documented in attestation light client, and BesuLightClient in Besu light client.

ICS27GMP: the GMP application

Documented in GMP.

IFT: Interchain Fungible Tokens

Documented in IFT.

Access control

Documented in access control.

Who deploys what

Deployment splits three ways:
  • An operator stands up the core: an AccessManager, then ICS26Router, IBCMulticall, and the applications, then one light client per counterparty, each registered on the router with addClient.
  • A token issuer deploys its own IFT, initialized with an already-deployed ICS27GMP address plus the token’s name and symbol, and one send-call constructor registered per counterparty client it bridges to.
  • The contracts themselves create the rest. ICS27GMP makes an account proxy for each (clientId, sender, salt) on first use, behind the beacon it creates over the account logic it was handed. The ICS02 precompile is chain-native at 0x...0807, so only its wrapper is deployed.
The IBC CLI deploys the contract set. ibc deploy core stands up the access manager, the router, and IBCMulticall on one chain. ibc deploy client deploys a light client tracking one counterparty and registers it. A connection between two chains takes four of those invocations, two per chain. Permissions and upgrades has what each deployment fixes for good and who can change it later.

Audits

The contracts are covered by two Zellic reviews, in March 2025 and March 2026. Both are listed with every other IBC audit on the security audits page; the PDFs live in docs/audits in the contracts repository.