Skip to main content

IBC transfers in apps

For app developers sending ICS-20 transfers from Safrochain. Relayer operators: Hermes setup.

Channels (mainnet)

DestinationSafrochain channelCounterparty
Noble (noble-1)channel-0channel-581
Osmosis (osmosis-1)channel-1channel-110497

Channels (testnet)

Verified 2026-08-13 (clients Active, 0 pending packets). Use only these channels — older Safro testnet channels (channel-0channel-14) have Expired clients.

DestinationSafrochain channelCounterparty
Osmosis testnet (osmo-test-5)channel-15channel-11823
Noble testnet (grand-1)channel-16channel-962
Noble ↔ Osmosis (no Safro hop)channel-963channel-11824

Canonical USDC on Safro testnet is transfer/channel-16/uusdc (ibc/FC6C3453…), not the legacy channel-12 voucher.

Full list (mainnet + testnet topology, denoms, escrows): IBC channels. Hermes testnet template: Hermes setup → Testnet.

const sourcePort = 'transfer';
const sourceChannel = 'channel-1'; // Osmosis on mainnet
const timeoutTimestampNs = BigInt(Date.now() + 10 * 60 * 1000) * 1_000_000n;

const msg = {
typeUrl: '/ibc.applications.transfer.v1.MsgTransfer',
value: {
sourcePort,
sourceChannel,
token: { denom: 'usaf', amount: '1000000' },
sender,
receiver: 'osmo1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
timeoutTimestamp: timeoutTimestampNs,
memo: 'ibc test',
},
};

const res = await client.signAndBroadcast(sender, [msg], 'auto');

Testnet: confirm channel IDs on channels before shipping.

Failure modes

ErrorFix
channel not foundWrong sourceChannel
insufficient fundsFund sender with usaf
TimeoutIncrease timeoutTimestamp to 10–30 minutes

Next