> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cosmos.network/llms.txt
> Use this file to discover all available pages before exploring further.

# Relaying

> Run an IBC relayer against the Cosmos Hub: relayer choice, Hub-specific Hermes settings, rate limits, and how IBC v2 relaying is permissioned.

Commands on this page were run on gaia v28.3.1 (Cosmos SDK v0.53.4, CometBFT v0.38.23) on 2026-10-15 by agent testing on a local devnet.

This page is for operators who want to relay Inter-Blockchain Communication (IBC) packets to and from the Cosmos Hub. It assumes you have a Hub RPC and gRPC endpoint to point the relayer at, and a funded relayer account. The endpoint can be your own (see [Run public endpoints](https://docs.cosmos.network/hub/latest/infrastructure/endpoints.md)) or a public one from the chain registry. At the end a relayer clears packets on at least one Hub channel. You also know which Hub rules can make a relay transaction fail.

The Hub runs ibc-go v10.7.0. That version includes both classic IBC (clients, connections, and channels) and IBC v2 (client to client, with no connections or channel handshakes). Both are live on cosmoshub-4.

## Choose a relayer

Hermes is the relayer the Hub team tests against. Maintained by Informal Systems. Latest release v1.13.3 (2025-09-03). Repository active. Checked 2026-10-15. Hermes v1.13.1 added support for ibc-go v10 and Cosmos SDK 0.53 chains. The Hub runs both. Documentation is in the [Hermes documentation](https://hermes.informal.systems). Installation steps are in the [Hermes quick start](https://hermes.informal.systems/quick-start/installation.html).

The Go relayer (`cosmos/relayer`) is archived. Maintained by Strangelove until 2025. Latest release v2.6.0 (2025-01-10). Repository archived on 2025-04-16. Checked 2026-10-15. Do not start new deployments on it.

The [IBC relayer](https://docs.cosmos.network/ibc/latest/ibc/relayer.md) guide covers paths, clients, and packet flow for any chain. This page only adds what is specific to the Hub.

## Hub chain entry for Hermes

The chain block in `~/.hermes/config.toml` for cosmoshub-4, with the values that depend on Hub parameters:

```toml theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
[[chains]]
id = "cosmoshub-4"
rpc_addr = "https://rpc.example.com:443"
grpc_addr = "https://grpc.example.com:443"
event_source = { mode = "push", url = "wss://rpc.example.com:443/websocket", batch_delay = "500ms" }
account_prefix = "cosmos"
key_name = "hub-relayer"
store_prefix = "ibc"
gas_price = { price = 0.005, denom = "uatom" }
gas_multiplier = 1.2
max_gas = 3000000
default_gas = 200000
clock_drift = "5s"
max_block_time = "10s"
trusting_period = "14days"
trust_threshold = { numerator = "1", denominator = "3" }
address_type = { derivation = "cosmos" }

[chains.packet_filter]
policy = "allow"
list = [
  ["transfer", "channel-141"],
]
```

Why these values:

* `gas_price`: the Hub's feemarket module sets a floor of 0.005 uatom per gas. The fee market raises it under load. Setting `dynamic_gas_price = { enabled = true, multiplier = 1.1, max = 0.6 }` makes Hermes query the current price instead of using the fixed one. The queries are on [Fee market](https://docs.cosmos.network/hub/latest/modules/feemarket.md).
* `trusting_period`: must be below the unbonding period of 21 days. The usual value is 14 days, which is two thirds of the unbonding period.
* `max_gas`: the Hub's block gas limit is 75,000,000. A single relay transaction that asks for more than that is rejected by the mempool.
* `packet_filter`: relay only the channels you intend to. Clearing every channel on the Hub is expensive.

The full key reference is in the Hermes [configuration docs](https://hermes.informal.systems/documentation/configuration/configure-hermes.html).

## Keys and funding

Hermes needs a Hub account with uatom for fees:

```bash theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
hermes keys add --chain cosmoshub-4 --mnemonic-file ./hub-relayer.mnemonic --key-name hub-relayer
```

The key is a normal secp256k1 wallet key at hierarchical deterministic (HD) path `m/44'/118'/0'/0/0`, the same path `gaiad keys add` uses. A relayer address can therefore be checked with `gaiad keys parse` or funded from any wallet. The protocol does not reimburse relaying on the Hub. Because the ICS-29 (Interchain Standard 29) fee middleware is not wired in gaia v28.3.1, every relay transaction costs the relayer. Budget on the order of 0.01 ATOM per packet at the floor price, and more when the base fee rises.

## Find channels and check the counterparty

Hub channels are documented in the chain registry [\_IBC](https://github.com/cosmos/chain-registry/tree/master/_IBC) directory, one file per chain pair. For Osmosis, `cosmoshub-osmosis.json` gives `channel-141` on the Hub side and `channel-0` on Osmosis. Confirm from the chain before relaying:

```bash theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
gaiad q ibc channel end transfer channel-141 --node https://cosmos-rpc.publicnode.com:443 --output json | jq '{state: .channel.state, counterparty: .channel.counterparty, connection: .channel.connection_hops[0]}'
gaiad q ibc connection end connection-257 --node https://cosmos-rpc.publicnode.com:443 --output json | jq '.connection.client_id'
```

On 2026-10-15 the channel is `STATE_OPEN`, with counterparty `channel-0`, connection `connection-257`, and client `07-tendermint-259`. Pending packets to clear are listed with `hermes query packet pending --chain cosmoshub-4 --port transfer --channel channel-141`.

## Rate limits can reject your packet

The Hub runs the rate limiting middleware. A transfer that would push a channel past its quota is rejected on the Hub side with a rate limit error. The relayer then sees the receive or acknowledgement fail. It is not a relayer bug. The packet goes through once the window moves.

```bash theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
gaiad q ratelimit list-rate-limits --node https://cosmos-rpc.publicnode.com:443
gaiad q ratelimit rate-limit channel-141 --denom uatom --node https://cosmos-rpc.publicnode.com:443
```

On 2026-10-15 there are seven limits: uatom on `channel-141` at 5 percent of supply per 24 hours in each direction, and uatom on channels 190, 220, 235, 343, 391, and 569 at 1 percent per 24 hours. The second query shows how much of the quota is used in the current window. Middleware details are at [Rate limit middleware](https://docs.cosmos.network/ibc/latest/middleware/rate-limit-middleware/overview.md).

## IBC v2 clients are permissioned

The Hub has IBC v2 clients, for example an Ethereum light client as `08-wasm-1369`. Relaying on a v2 client is restricted to an allow list that the client's creator set:

```bash theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
gaiad q ibc client counterparty-info 08-wasm-1369 --node https://cosmos-rpc.publicnode.com:443
gaiad q ibc client config 08-wasm-1369 --node https://cosmos-rpc.publicnode.com:443
gaiad q ibc channelv2 next-sequence-send 08-wasm-1369 --node https://cosmos-rpc.publicnode.com:443
```

The first returns the counterparty client id. The second returns `allowed_relayers`, the addresses that may submit packets on that client (six on 2026-10-15). The third returns the next sequence (11342). An address not on the list gets its relay transaction rejected. Running a v2 relayer against the Hub therefore starts with the team that owns the client, not with a config file. Protocol background: [IBC v2 spec](https://docs.cosmos.network/ibc/latest/spec/IBC_V2/README.md) and the [IBC v2 announcement](https://ibcprotocol.dev/blog/ibc-v2-announcement).

## Verify

Start Hermes with the Hub chain and one counterparty configured. Then check both health and a cleared packet:

```bash theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
hermes health-check
hermes clear packets --chain cosmoshub-4 --port transfer --channel channel-141
```

The health check reports `cosmoshub-4: performed health check` with no warnings about the gRPC or websocket endpoints. A `trusting_period` warning means the value is above two thirds of the unbonding period. The clear command ends with a summary of relayed `RecvPacket` and `AcknowledgePacket` messages, or with `No pending packets` on an idle channel. The transactions appear under the relayer address:

```bash theme={"theme":{"light":"github-light-high-contrast","dark":"github-dark-high-contrast"}}
gaiad q txs --query "message.sender='cosmos1...'" --limit 5 --node https://rpc.example.com:443
```

## Next

* [Fee market](https://docs.cosmos.network/hub/latest/modules/feemarket.md) for how the gas price moves.
* [Packet forward middleware](https://docs.cosmos.network/ibc/latest/middleware/packet-forward-middleware/overview.md) and [Callbacks](https://docs.cosmos.network/ibc/latest/middleware/callbacks/callbacks-IBCv2.md) for the other middleware on the Hub's transfer stack.
* [Hermes troubleshooting](https://hermes.informal.systems/advanced/troubleshooting/index.html) and [telemetry](https://hermes.informal.systems/documentation/telemetry/index.html).
