Cosmos 101 — Initiate · Lesson 4 of 5

Gas, fees, and the IBC denom rabbit hole

5 min · read

Cosmos gas works differently from Ethereum gas in three ways that matter to the wallet UX.

1. Gas is paid in micro-units

The base denom on the Hub is uatom — micro-ATOM. 1 ATOM = 1,000,000 uatom. On Osmosis it's uosmo. Every gas calculation, every balance value, every fee — all stored as integers in micro-units. There's no floating-point in the gas path. The wallet does the conversion in its display layer, never in the math.

The denom on the source chain matters because gas must be paid in a denom the chain accepts. The Hub accepts gas in uatom; some chains accept several denoms (Osmosis takes uosmo and a few large IBC assets). If you somehow ended up with only OSMO in your Hub account, you couldn't pay gas — even though OSMO is a "Cosmos asset". Iter-G's send route checks that you have enough of the gas denom before broadcasting.

2. Gas prices are strings, not numbers

Cosmos chains report gas prices as strings like "0.025uatom". The wallet's client.py parses these on every send. The string format is human-friendly but adds a parse step, and most bugs in Cosmos clients are off-by-six-decimals errors here.

We use a fixed conservative gas price that's slightly above the Hub's chain-wide minimum. Most txs go through with the first try. If a tx fails with "gas price too low" the wallet bumps and retries — but in practice this only happens during the ~3-minute windows around governance vote tallies, when the network briefly congests.

3. Fees are predictable

Unlike Ethereum, Cosmos has no priority gas auction during normal use. Block space is plentiful (~5M gas per block, refilling every 6 seconds), and the chain only fills up during specific events. Day-to-day, sends cost the same in fees down to the cent. The wallet's quote module shows an exact fee, not a range.

For reference (as of 2026):

Operation Hub fee Osmosis fee
Native send €0.001 €0.002
IBC transfer €0.005 €0.005
Osmosis swap n/a €0.05 (incl. AMM swap fee)
Vote on governance €0.001 €0.002

The IBC fee is higher than a native send because it includes a small relayer tip — you're paying the relayer to forward the packet.

The IBC denom rabbit hole

When you receive an asset via IBC, your balance is denominated in ibc/<64-char-hash>. The hash is a SHA256 of the denom trace — the path the token took to get to this chain. For ATOM relayed Hub → Osmosis via channel-0:

denom_trace = "transfer/channel-0/uatom"
ibc_denom   = "ibc/" + sha256(denom_trace).upper()
            = "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2"

The wallet maintains a denom-to-symbol lookup table for the canonical IBC denoms across the registered chains. When the balance API returns ibc/27394…, the UI shows ATOM. If we encounter an unknown denom (someone bridged a long-tail asset we haven't seen), the UI shows ibc/27394… literally — and that's a signal something is unusual.

Why does this matter to you? Because the same underlying asset can have a different IBC denom on each chain depending on the path it took. ATOM on Osmosis via channel-0 ≠ ATOM on Juno via channel-1 ≠ ATOM on Osmosis-via-Juno-via-Hub. These are not fungible at the protocol level, even though they all "represent" ATOM. Osmosis's AMMs only know how to swap the canonical IBC-ATOM (the one bridged direct from the Hub). Bridging via a third chain breaks fungibility.

The wallet always uses the canonical channel for both directions. We do not multi-hop. If you want to swap ATOM-on-Osmosis for OSMO, the wallet routes you through the canonical IBC denom every time.

Memo fields cost money

Every Cosmos transaction has an optional memo. People use memos for invoice references, exchange deposit tags, and the occasional message-in-a-bottle. The wallet's send form exposes a 256-character memo field.

What people often forget: memos are stored on-chain forever. They cost extra gas per byte. They're visible to everyone. Putting your invoice number in a memo is fine. Putting any kind of identifying information about yourself or the recipient is a privacy mistake.

The wallet's send form caps the memo at 256 characters and warns you about this on the send page. Iter-G+1 will add a memo-stripping reminder if we detect anything that looks like an email or phone number.

Next lesson: Osmosis specifically — AMMs, LP shares, and the staking model that makes OSMO different from ATOM.