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 anIIBCApp 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.
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 at0x...0807, so only its wrapper is deployed.
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 indocs/audits in the contracts repository.