IBC transfers in apps
For app developers sending ICS-20 transfers from Safrochain. Relayer operators: Hermes setup.
Channels (mainnet)
| Destination | Safrochain channel | Counterparty |
|---|---|---|
Noble (noble-1) | channel-0 | channel-581 |
Osmosis (osmosis-1) | channel-1 | channel-110497 |
Channels (testnet)
Verified 2026-08-13 (clients Active, 0 pending packets). Use only these
channels — older Safro testnet channels (channel-0…channel-14) have
Expired clients.
| Destination | Safrochain channel | Counterparty |
|---|---|---|
Osmosis testnet (osmo-test-5) | channel-15 | channel-11823 |
Noble testnet (grand-1) | channel-16 | channel-962 |
| Noble ↔ Osmosis (no Safro hop) | — | channel-963 ↔ channel-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.
- Web (TypeScript)
- React Native
- Flutter (CosmJS)
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.
Same MsgTransfer message shape as web. Show channel ID in the confirm UI so users can verify the destination path.
const msg = {
typeUrl: '/ibc.applications.transfer.v1.MsgTransfer',
value: {
sourcePort: 'transfer',
sourceChannel: 'channel-1',
token: { denom: 'usaf', amount: '1000000' },
sender,
receiver: 'osmo1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
timeoutTimestamp: BigInt(Date.now() + 10 * 60 * 1000) * 1_000_000n,
memo: 'ibc test',
},
};
const res = await client.signAndBroadcast(sender, [msg], 'auto');
Failure modes
| Error | Fix |
|---|---|
channel not found | Wrong sourceChannel |
insufficient funds | Fund sender with usaf |
| Timeout | Increase timeoutTimestamp to 10–30 minutes |