x/ibcbreaker provides an operator-controlled IBC breaker with one global ibc_available flag, a whitelist of operator accounts that can toggle the flag, and governance-controlled whitelist updates.
The practical goal is to stop selected outbound IBC initiation paths, including ICS20 transfer initiation (MsgTransfer), when the breaker is disabled.
Non-scope
x/ibcbreaker is not a full transfer freeze. Internal non-IBC transfers, for example bank MsgSend, remain available.
State and params
state.ibc_availableis stored as a single byte and defaults totrueif missing.params.whitelistis a list of bech32 addresses allowed to submitMsgUpdateIbcBreaker.- Whitelist entries are validated for address format and duplicates.
Authorization model
MsgUpdateIbcBreakersigner must be bech32 and present inparams.whitelist.- Repeated requests for the current
ibc_availablevalue succeed as a no-op. MsgUpdateParamsis authority-only and is the only path to update the whitelist.MsgUpdateParams.ValidateBasic()rejects nil params before handler execution.
Enforcement logic
Enforcement is implemented in the Cosmos ante decoratorIbcAvailableDecorator and in transfer keeper execution for MsgTransfer.
When ibc_available=false:
- Cosmos ante scans transaction messages and rejects restricted IBC message types with
ErrUnauthorized. - Ante errors include the offending restricted message type URL.
authz.MsgExeccontents are recursively scanned.- Recursion depth
>= 7is rejected as unauthorized. - Transfer keeper rejects
MsgTransferwithErrUnauthorizedandibc unavailable.
/ibc.core.client.v1.MsgCreateClient/ibc.core.connection.v1.MsgConnectionOpenInit/ibc.core.channel.v1.MsgChannelOpenInit/ibc.applications.transfer.v1.MsgTransfer/ibc.applications.interchain_accounts.controller.v1.MsgRegisterInterchainAccount/ibc.applications.interchain_accounts.controller.v1.MsgSendTx/ibc.core.client.v2.MsgRegisterCounterparty/ibc.core.client.v2.MsgUpdateClientConfig/ibc.core.channel.v2.MsgSendPacket
EVM and ICS20 scope
Cosmos IBC ante decoration is not applied to the EVM extension transaction route. However, ICS20 precompile transfer still routes into the transfer keeper, soMsgTransfer is blocked when ibc_available=false.
Non-restricted IBC messages can still pass this decorator.
Exposed methods
MsgUpdateIbcBreaker(signer, ibc_available)MsgUpdateParams(authority, params)
Query/IbcAvailableQuery/Whitelist