Skip to main content

Channels

Mainnet IBC is live

ICS-20 transfer channels to Noble, Osmosis, and Injective are OPEN on safrochain-1. Noble and Osmosis identifiers were verified on-chain (2026-06-25); Injective (channel-2 ↔ channel-495) was verified (2026-09-23). Independent relayers can relay the same paths: see Join as a relayer.

Mainnet: safrochain-1​

Topology summary​

CounterpartySafrochain clientSafrochain connectionSafrochain channelCounterparty clientCounterparty connectionCounterparty channelState
Noble (noble-1)07-tendermint-0connection-0channel-007-tendermint-224connection-210channel-581OPEN
Osmosis (osmosis-1)07-tendermint-1connection-1channel-107-tendermint-3719connection-11075channel-110497OPEN
Injective (injective-1)07-tendermint-2connection-2channel-207-tendermint-354connection-354channel-495OPEN

All channels use port transfer, ordering ORDER_UNORDERED, and version ics20-1.

USDC: Noble vs Injective

Circle is migrating Cosmos USDC issuance toward Injective. Both paths remain OPEN on Safrochain today:

  • Noble USDC (uusdc via channel-0) — legacy IBC denom ibc/8E27BA2…
  • Injective USDC (native ERC20 0xa00C59fF5a080D2b954d0c75e46E22a0c371235a via channel-2) — denom ibc/1E180C08…

New integrations should prefer Injective USDC on channel-2 / channel-495. Wallets must treat the two IBC denoms as different assets.

ICS-20 transfer is enabled (send_enabled=true, receive_enabled=true). ICS-29 fee channels are not registered yet (ibc-fee channels returns an empty list).

ICS-20 transfer channels​

CounterpartyPortChannel (Safrochain)Channel (counterparty)Escrow (Safrochain)Foundation relayerPrimary use
Noble (noble-1)transferchannel-0channel-581addr_safro1a53udazy8ayufvy0s434pfwjcedzqv34wqrjq7yesNoble USDC in/out, SAF → Noble
Osmosis (osmosis-1)transferchannel-1channel-110497addr_safro1kq2rzz6fq2q7fsu75a9g7cpzjeanmk68sfygsyyesOSMO in/out, SAF → Osmosis DEX
Injective (injective-1)transferchannel-2channel-495addr_safro12k2pyuylm9t7ugdvz67h9pg4gmmvhn5v82y96ycoordinateInjective USDC + INJ in/out, SAF → Injective

Public endpoints for relayers​

Use stable RPC + gRPC on both sides of each path. Examples below are community-operated; any equivalent endpoint works if it supports IBC queries.

ChainChain IDRPCgRPC
Safrochainsafrochain-1https://rpc1.safrochain.network:443https://grpc1.safrochain.network:443
Noblenoble-1https://noble-rpc.polkachu.com:443https://noble-grpc.polkachu.com:443
Osmosisosmosis-1https://rpc.osmosis.zone:443https://grpc.osmosis.zone:443
Injectiveinjective-1https://sentry.tm.injective.network:443https://sentry.chain.grpc.injective.network:443

Full Safrochain endpoint list: Mainnet endpoints.

Verify on-chain (Safrochain)​

NODE="https://rpc1.safrochain.network:443"

# Clients tracking counterparties
safrochaind q ibc client states --node "$NODE" -o json \
| jq '.client_states[] | select(.client_id | startswith("07-tendermint")) | {client_id, chain_id: .client_state.chain_id}'

# Connections
safrochaind q ibc connection end connection-0 --node "$NODE" -o json | jq '.connection.counterparty'
safrochaind q ibc connection end connection-1 --node "$NODE" -o json | jq '.connection.counterparty'
safrochaind q ibc connection end connection-2 --node "$NODE" -o json | jq '.connection.counterparty'

# Client status (expect Active)
safrochaind q ibc client status 07-tendermint-2 --node "$NODE"

# Channels
safrochaind q ibc channel end transfer channel-0 --node "$NODE" -o json | jq '.channel'
safrochaind q ibc channel end transfer channel-1 --node "$NODE" -o json | jq '.channel'
safrochaind q ibc channel end transfer channel-2 --node "$NODE" -o json | jq '.channel'

# Escrow accounts (SAF locked when bridging out)
safrochaind q ibc-transfer escrow-address transfer channel-0 --node "$NODE"
safrochaind q ibc-transfer escrow-address transfer channel-1 --node "$NODE"
safrochaind q ibc-transfer escrow-address transfer channel-2 --node "$NODE"

# Inbound IBC denoms registered on Safrochain
safrochaind q ibc-transfer denom-traces --node "$NODE" -o json | jq '.denom_traces'

Relayed token registry​

Each row lists the full denom trace (path + base_denom) used to compute the ibc/<hash> voucher on the destination chain.

USDC (Noble → Safrochain)​

FieldValue
SymbolUSDC
Source chainnoble-1
Base denomuusdc (6 decimals)
Safrochain channelchannel-0
Noble channelchannel-581
Trace on Safrochaintransfer/channel-0/uusdc
IBC denom on Safrochainibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5
safrochaind q ibc-transfer denom-trace 8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5 \
--node https://rpc1.safrochain.network:443

echo -n "transfer/channel-0/uusdc" | shasum -a 256
# 8e27ba2d5493af5636760e354e46004562c46ab7ec0cc4c1ca14e9e20e2545b5

USDC (Injective → Safrochain)​

Circle native USDC on Injective (ERC20 representation on injective-1). This is the preferred USDC path for new apps as Noble issuance migrates.

FieldValue
SymbolUSDC
Source chaininjective-1
Base denomerc20:0xa00C59fF5a080D2b954d0c75e46E22a0c371235a (6 decimals)
Safrochain channelchannel-2
Injective channelchannel-495
Trace on Safrochaintransfer/channel-2/erc20:0xa00C59fF5a080D2b954d0c75e46E22a0c371235a
IBC denom on Safrochainibc/1E180C085A3A2688CDF2A781E5990BE8AA92CE69CB62A8CC6BB9F5EE17DD5C38
safrochaind q ibc-transfer denom-trace 1E180C085A3A2688CDF2A781E5990BE8AA92CE69CB62A8CC6BB9F5EE17DD5C38 \
--node https://rpc1.safrochain.network:443

echo -n "transfer/channel-2/erc20:0xa00C59fF5a080D2b954d0c75e46E22a0c371235a" | shasum -a 256
# 1e180c085a3a2688cdf2a781e5990be8aa92ce69cb62a8cc6bb9f5ee17dd5c38

Receive from Injective (counterparty sends on channel-495 with the ERC20 base denom above). Send to Injective using the same Safrochain channel channel-2 with that IBC denom as the token to transfer.

INJ (Injective → Safrochain)​

FieldValue
SymbolINJ
Source chaininjective-1
Base denominj (18 decimals on Safrochain voucher)
Safrochain channelchannel-2
Injective channelchannel-495
Trace on Safrochaintransfer/channel-2/inj
IBC denom on Safrochainibc/8EC25D1E0297C50477D9A2FB586A005D1CC92CB21E685CE3344FF4DC03D787D2
safrochaind q ibc-transfer denom-trace 8EC25D1E0297C50477D9A2FB586A005D1CC92CB21E685CE3344FF4DC03D787D2 \
--node https://rpc1.safrochain.network:443

echo -n "transfer/channel-2/inj" | shasum -a 256
# 8ec25d1e0297c50477d9a2fb586a005d1cc92cb21e685ce3344ff4dc03d787d2

OSMO (Osmosis → Safrochain)​

FieldValue
SymbolOSMO
Source chainosmosis-1
Base denomuosmo (6 decimals)
Safrochain channelchannel-1
Osmosis channelchannel-110497
Trace on Safrochaintransfer/channel-1/uosmo
IBC denom on Safrochainibc/0471F1C4E7AFD3F07702BEF6DC365268D64570F7C1FDC98EA6098DD6DE59817B
safrochaind q ibc-transfer denom-trace 0471F1C4E7AFD3F07702BEF6DC365268D64570F7C1FDC98EA6098DD6DE59817B \
--node https://rpc1.safrochain.network:443

echo -n "transfer/channel-1/uosmo" | shasum -a 256
# 0471f1c4e7afd3f07702bef6dc365268d64570f7c1fdc98ea6098dd6de59817b

SAF (Safrochain → Noble)​

FieldValue
SymbolSAF
Source chainsafrochain-1
Base denomusaf (6 decimals)
Safrochain channelchannel-0
Noble channelchannel-581
Trace on Nobletransfer/channel-581/usaf
IBC denom on Nobleibc/416D906365215CB6641B38CCDAA01385AA4B20E5E8EF2D65702A1B3F383FBBA2
nobled q ibc-transfer denom-trace 416D906365215CB6641B38CCDAA01385AA4B20E5E8EF2D65702A1B3F383FBBA2 \
--node https://noble-rpc.polkachu.com:443

echo -n "transfer/channel-581/usaf" | shasum -a 256
# 416d906365215cb6641b38ccdaa01385aa4b20e5e8ef2d65702a1b3f383fbba2

Send from Safrochain:

safrochaind tx ibc-transfer transfer transfer channel-0 \
<noble-bech32-recipient> 1000000usaf \
--from <sender> --chain-id safrochain-1 \
--node https://rpc1.safrochain.network:443 \
--gas auto --gas-adjustment 1.3 --gas-prices 0.05usaf -y

SAF (Safrochain → Osmosis)​

FieldValue
SymbolSAF
Source chainsafrochain-1
Base denomusaf (6 decimals)
Safrochain channelchannel-1
Osmosis channelchannel-110497
Trace on Osmosistransfer/channel-110497/usaf
IBC denom on Osmosisibc/DBAA4846F611A7603EFCE6F9F46F4F561D48B1F492A576022F000614A17089CE
osmosisd q ibc-transfer denom-trace DBAA4846F611A7603EFCE6F9F46F4F561D48B1F492A576022F000614A17089CE \
--node https://rpc.osmosis.zone:443

echo -n "transfer/channel-110497/usaf" | shasum -a 256
# dbaa4846f611a7603efce6f9f46f4f561d48b1f492a576022f000614a17089ce

Send from Safrochain:

safrochaind tx ibc-transfer transfer transfer channel-1 \
<osmosis-bech32-recipient> 1000000usaf \
--from <sender> --chain-id safrochain-1 \
--node https://rpc1.safrochain.network:443 \
--gas auto --gas-adjustment 1.3 --gas-prices 0.05usaf -y

SAF (Safrochain → Injective)​

FieldValue
SymbolSAF
Source chainsafrochain-1
Base denomusaf (6 decimals)
Safrochain channelchannel-2
Injective channelchannel-495
Trace on Injectivetransfer/channel-495/usaf
IBC denom on Injectiveibc/13E53BB4CF6DE586FF4CACFEEA67A05863CA8387996BD2B674DADE8BFDE1D1C9
echo -n "transfer/channel-495/usaf" | shasum -a 256
# 13e53bb4cf6de586ff4cacfeea67a05863ca8387996bd2b674dade8bfde1d1c9

Send from Safrochain:

safrochaind tx ibc-transfer transfer transfer channel-2 \
<inj-bech32-recipient> 1000000usaf \
--from <sender> --chain-id safrochain-1 \
--node https://rpc1.safrochain.network:443 \
--gas auto --gas-adjustment 1.3 --gas-prices 0.05usaf -y

USDC (Noble → Osmosis, transit: not a direct Safrochain hop)​

The Foundation relayer also clears Noble↔Osmosis USDC for users who route liquidity through Osmosis. This path does not use Safrochain channels.

FieldValue
SymbolUSDC
Base denomuusdc on noble-1
Noble channelchannel-1
Osmosis channelchannel-750
Trace on Osmosistransfer/channel-750/uusdc
IBC denom on Osmosisibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4

Foundation relayer​

The Safrochain Foundation runs Hermes on safro-relayer-1 for:

PathStatus
safrochain-1 ↔ noble-1 (channel-0 ↔ channel-581)live
safrochain-1 ↔ osmosis-1 (channel-1 ↔ channel-110497)live
safrochain-1 ↔ injective-1 (channel-2 ↔ channel-495)channel open · add Hermes path
noble-1 ↔ osmosis-1 (USDC transit)live

Telemetry and wallet provisioning live in the private operator repo. Relay keys are never committed to source control.

Join as a relayer​

Channels are already open: do not run hermes create channel unless you are opening a new counterparty. To relay an existing path:

  1. Install Hermes: see Hermes setup.
  2. Configure safrochain-1 plus the counterparty (noble-1, osmosis-1, or injective-1).
  3. Import a funded key on each chain (fee token: usaf, uusdc/ustake on Noble, uosmo on Osmosis, inj on Injective).
  4. Run hermes config validate and hermes health-check.
  5. Start Hermes: it discovers open channels and clears packets automatically.

Minimal Hermes path filter (optional, in config.toml):

[[chains]]
id = 'safrochain-1'
# ... rpc_addr, grpc_addr, key_name, gas_price ...

[[chains]]
id = 'noble-1'
# ... rpc_addr, grpc_addr, key_name, gas_price ...

# After both chains are configured:
# hermes start --chains safrochain-1,noble-1

Coordinate in Discord #ibc-relayers before duplicating foundation paths so we can share monitoring and upgrade windows.

ICS-27 (interchain accounts)​

Controller chainHost portStatus
Cosmos Hubicahostenabled at genesis
Osmosisicahostenabled at genesis
Neutronicahostenabled at genesis

ICS-721 (NFT transfers)​

ICS-721 will be enabled in a post-launch upgrade once a counterparty wires in the matching nft-transfer module. Track progress in Governance.

Testnet: safro-testnet-1​

Testnet IBC is live

ICS-20 transfer channels from safro-testnet-1 to Osmosis testnet (osmo-test-5) and Noble testnet (grand-1) are OPEN, plus a foundation Noble ↔ Osmosis testnet path. Re-verified on-chain (2026-08-13): clients Active, packet commitments 0 on all three canonical paths. Use only the channels in the tables below for app / relayer dry-runs.

Topology summary​

PathA chainA clientA connectionA channelB chainB clientB connectionB channelState
Safro ↔ Osmosissafro-testnet-107-tendermint-25connection-17channel-15osmo-test-507-tendermint-5260connection-4588channel-11823OPEN
Safro ↔ Noblesafro-testnet-107-tendermint-26connection-18channel-16grand-107-tendermint-701connection-652channel-962OPEN
Noble ↔ Osmosisosmo-test-507-tendermint-5261connection-4589channel-11824grand-107-tendermint-702connection-654channel-963OPEN

All three use port transfer, ordering ORDER_UNORDERED, version ics20-1. Safro clients 07-tendermint-25 / 07-tendermint-26 are Active (as of 2026-08-13).

ICS-20 transfer channels​

PathPortChannel (Safro / A)Channel (counterparty / B)Escrow (Safrochain)Primary use
Safro ↔ Osmosistransferchannel-15channel-11823addr_safro186mpcj53q3hgfnzdu9wkteczs236vdclk579xgOSMO in/out, SAF → Osmosis testnet
Safro ↔ Nobletransferchannel-16channel-962addr_safro1v0zuhlzznmz8r5csel3dtrm0pst0dmet4j39njUSDC in/out, SAF → Noble testnet
Noble ↔ Osmosistransfer— (not on Safro)channel-11824 ↔ channel-963—OSMO ↔ USDC transit on testnets
Legacy / expired Safro channels — do not use

safro-testnet-1 still lists older OPEN transfer channels (channel-0…channel-14, plus channel-1 → ICS provider). Their light clients are Expired. Tokens bridged on those paths (example: USDC as ibc/2180E84E… = transfer/channel-12/uusdc) will not relay on the canonical Hermes path. Always send/receive via channel-15 (Osmosis) or channel-16 (Noble). Do not run hermes create channel again unless deliberately replacing a dead path.

Public endpoints for testnet relayers​

ChainChain IDRPCgRPC / LCD
Safrochain testnetsafro-testnet-1https://rpc.testnet.safrochain.comgRPC https://grpc.testnet.safrochain.com:443 · REST https://rest.testnet.safrochain.com
Osmosis testnetosmo-test-5Prefer https://rpc.testnet.osmosis.zone (alt: https://rpc.osmotest5.osmosis.zone)gRPC https://grpc.testnet.osmosis.zone:443 · LCD https://lcd.osmotest5.osmosis.zone
Noble testnetgrand-1https://noble-testnet-rpc.polkachu.comgRPC http://noble-testnet-grpc.polkachu.com:21590 · API https://noble-testnet-api.polkachu.com

Safrochain faucet / wallet JSON: Testnet endpoints.

Osmosis RPC geo / IP blocks

Osmosis public RPCs often return HTTP 403 from some datacenter IPs (notably some Hetzner ranges). From Contabo, try rpc.testnet.osmosis.zone first; if that fails, flip to rpc.osmotest5.osmosis.zone. Always curl /status from the Hermes host before starting the relayer.

Verify on-chain (testnet)​

NODE="https://rpc.testnet.safrochain.com:443"
REST="https://rest.testnet.safrochain.com"

safrochaind q ibc channel end transfer channel-15 --node "$NODE" -o json | jq '.channel'
safrochaind q ibc channel end transfer channel-16 --node "$NODE" -o json | jq '.channel'
safrochaind q ibc client status 07-tendermint-25 --node "$NODE"
safrochaind q ibc client status 07-tendermint-26 --node "$NODE"

safrochaind q ibc-transfer escrow-address transfer channel-15 --node "$NODE"
safrochaind q ibc-transfer escrow-address transfer channel-16 --node "$NODE"

# Pending packet commitments (should be 0 on healthy paths)
curl -s "$REST/ibc/core/channel/v1/channels/channel-15/ports/transfer/packet_commitments?pagination.count_total=true" \
| jq '.pagination.total'
curl -s "$REST/ibc/core/channel/v1/channels/channel-16/ports/transfer/packet_commitments?pagination.count_total=true" \
| jq '.pagination.total'

# Counterparty ends
curl -s "https://lcd.osmotest5.osmosis.zone/ibc/core/channel/v1/channels/channel-11823/ports/transfer" | jq '.channel.state,.channel.counterparty'
curl -s "https://noble-testnet-api.polkachu.com/ibc/core/channel/v1/channels/channel-962/ports/transfer" | jq '.channel.state,.channel.counterparty'
curl -s "https://lcd.osmotest5.osmosis.zone/ibc/core/channel/v1/channels/channel-11824/ports/transfer" | jq '.channel.state,.channel.counterparty'
curl -s "https://noble-testnet-api.polkachu.com/ibc/core/channel/v1/channels/channel-963/ports/transfer" | jq '.channel.state,.channel.counterparty'

Relayed token registry (testnet)​

OSMO (Osmosis testnet → Safro testnet)​

FieldValue
Base denomuosmo
Safro channelchannel-15
Osmosis channelchannel-11823
Trace on Safrotransfer/channel-15/uosmo
IBC denom on Safroibc/26F3C3DF1FD29D045C9D6E8A999473A8C368EF1AAAA6B19711EC0CB65BAFCBD7

USDC (Noble testnet → Safro testnet)​

FieldValue
Base denomuusdc
Safro channelchannel-16
Noble channelchannel-962
Trace on Safrotransfer/channel-16/uusdc
IBC denom on Safroibc/FC6C34533ECF1AAD296E41A70D8F16089E90D436904B56EDE19342D6DE172B82

Legacy (do not use for new transfers): transfer/channel-12/uusdc → ibc/2180E84E20F5679FCC760D8C165B60F42065DEF7F46A72B447CFF1B7DC6C0A65 (Expired client on channel-12).

SAF (Safro testnet → Osmosis testnet)​

FieldValue
Base denomusaf
Safro channelchannel-15
Osmosis channelchannel-11823
Trace on Osmosistransfer/channel-11823/usaf
IBC denom on Osmosisibc/BCB4EB7C12B4337A68B3E6509CE5AB97584EA368E6FAD16EFEFB1D2CCE537352
safrochaind tx ibc-transfer transfer transfer channel-15 \
<osmo-testnet-bech32> 1000000usaf \
--from <sender> --chain-id safro-testnet-1 \
--node https://rpc.testnet.safrochain.com:443 \
--gas auto --gas-adjustment 1.3 --gas-prices 0.05usaf -y

SAF (Safro testnet → Noble testnet)​

FieldValue
Base denomusaf
Safro channelchannel-16
Noble channelchannel-962
Trace on Nobletransfer/channel-962/usaf
IBC denom on Nobleibc/859ACCB4F2734A08BCB90CB68DBF485B6F7CB5AC58B17813DD1218835D5B5BE8
safrochaind tx ibc-transfer transfer transfer channel-16 \
<noble-testnet-bech32> 1000000usaf \
--from <sender> --chain-id safro-testnet-1 \
--node https://rpc.testnet.safrochain.com:443 \
--gas auto --gas-adjustment 1.3 --gas-prices 0.05usaf -y

OSMO (Osmosis testnet → Noble testnet)​

FieldValue
Base denomuosmo
Osmosis channelchannel-11824
Noble channelchannel-963
Trace on Nobletransfer/channel-963/uosmo
IBC denom on Nobleibc/E5E744601DEE32D05B901FE0478E182DC5AAF19B7A45E30AA1D0D6DBE2B26609

Foundation testnet relayer​

Hermes for testnet runs on foundation relayer1 (Contabo, 173.212.247.119), config under ~/hermes-testnet/config.toml (Hermes v1.10.x). It relays:

PathChannelsPacket status (2026-08-13)
safro-testnet-1 ↔ osmo-test-5channel-15 ↔ channel-11823live · 0 pending
safro-testnet-1 ↔ grand-1channel-16 ↔ channel-962live · 0 pending
osmo-test-5 ↔ grand-1channel-11824 ↔ channel-963live · 0 pending

Config mode: packet relay + client refresh only (mode.connections / mode.channels disabled after handshake). Bech32 account prefix on Safro is addr_safro (not safro). Do not recreate these channels unless the path is expired or deliberately replaced.

Full copy-paste Hermes testnet template: Hermes setup → Testnet.

Operator coordination​

If you relay one of the paths above, coordinate via Discord #ibc-relayers. We track:

  • Which operator runs which channel pair (redundancy is healthy)
  • ICS-29 fee escrow funding when fee channels are enabled
  • Trusting period vs unbonding period drift (avoids client expired)
  • Joint upgrade windows so a chain upgrade does not trip your relayer

Updating this page​

This file is canonical. When a channel opens or changes, submit a PR to Docs/docs/ibc/channels.md along with the chain registry update.