fix: IBC is closed in both directions, not exit-only - #10
Conversation
Prop 121 ("Disable IBC Outbound") passed 2026-07-31 and set the ibc
module's OutboundEnabled to false. Combined with Props 116/120 for
inbound, IBC is now closed on Sei in both directions.
This skill was written to the premise "inbound is disabled, exiting
legacy ibc/... assets still works". That premise is now false everywhere
it appears. Because this is an agent skill, the stale version did not
just read wrong — ibc-bridging.md handed an agent a runnable
`seid tx ibc-transfer transfer` command as the documented exit path, and
that transaction now fails.
ecosystem/ibc-bridging.md
Rewritten as a closed-state reference rather than deleted, so the four
inbound links keep working. Drops the exit command and the exit-only
framing. Adds the current parameter state with queries an agent can run
to re-verify, an explicit "what is no longer possible" list, and the
point that matters most for users: legacy ibc/... balances are neither
gone nor frozen — they stay in the bank module and still move within
Sei, including through their ERC-20 pointers. Only the route off the
chain is closed.
ecosystem/bridges.md
Inbound-only callout and decision-matrix row now cover both directions.
Removes the "must bridge out before activation" claims, including for
the Wormhole CosmWasm side, whose Portal Bridge exit depended on
outbound IBC.
ecosystem/participation-roles.md
Retires the IBC relayer role — table row, the hermes/rly setup section,
and the description. There are no packets left to relay.
precompiles/cosmwasm-bridge.md, precompiles/overview.md, resources.md
The IBC precompile (0x...1009) is marked do-not-use rather than
"legacy": its transfer reverts. Corrects overview.md's claim that the
legacy precompiles "remain functional", which is still true for Bank
and the pointers but not for IBC.
contracts/common-errors.md
Replaces the IBC packet-timeout recovery flow, which recommended
retrying with `timeout-packet`, with the actual cause and the fact that
retrying cannot succeed.
pointers/token-factory.md
Removes the claim that TokenFactory denoms "can be sent via IBC
immediately" — they cannot leave the chain at all now.
Also swept: SKILL.md, SKILL-ECOSYSTEM.md, SKILL-CONTRACTS.md, README.md,
apps-directory.md, tokens.md.
Deliberately untouched: hermes.pyth.network in oracles.md and
integration-defi.md — that is Pyth's Hermes price service, unrelated to
the IBC relayer of the same name. SKILL.md's frontmatter description is
also unchanged, so trigger selection (including the "How do I use the IBC
precompile on Sei?" case in tests/run.ts) behaves exactly as before — the
skill should still be selected for IBC questions so it can explain that
IBC is closed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PR SummaryLow Risk Overview
Bridging and roles: Contracts / precompiles: Reviewed by Cursor Bugbot for commit 9396ede. Bugbot is set up for automated code reviews on this repo. Configure here. |
…rypoints Two corrections from an adversarial review of the previous commit. bridges.md — the Wormhole CosmWasm bullet claimed the legacy Portal Bridge exit route "depended on outbound IBC and no longer works". That causal claim is wrong. Wormhole-bridged Cosmos-side assets (USDCso, WETH, USDCet) are not IBC vouchers and were not affected by Props 116/120/121 at all — sei-docs states this explicitly. Portal Bridge is unavailable as a route off Sei for its own reasons, not because of the IBC parameters. Reworded to say both facts without inventing a dependency between them, and restored the legacy.portalbridge.com link dropped in the rewrite. cosmwasm-bridge.md — the IBC precompile has two transfer entrypoints, `transfer` and `transferWithDefaultTimeout`. The note named only the first. Both call transferKeeper.Transfer (precompiles/ibc/ibc.go:169,255) and so both revert; says so now. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Closes PLT-898. Part of PLT-894 (removing IBC/Wormhole/airdrop remnants across all repos).
Why this one is urgent
Proposal 121 passed 2026-07-31 and set the
ibcmodule'sOutboundEnabledtofalse. With Props 116/120 for inbound, IBC is now closed on Sei in both directions.This skill was written to the premise "inbound is disabled, but exiting legacy
ibc/…assets still works." Prop 121 made that false everywhere it appears. And because this is an agent skill, the stale version did not just read wrong:An LLM reads that and emits it. The transaction fails. The file also cited only Props 115/116 and testnet #246/#247 — it had no knowledge of 120 or 121.
Approach
I rewrote
ibc-bridging.mdas a closed-state reference rather than deleting it — the option discussed on PLT-898. Deleting would have meant repointing four inbound links (SKILL.md,SKILL-ECOSYSTEM.md,participation-roles.md×2), and keeping the file matches what sei-docs #51 chose with its#ibc-is-disabledsection. It also keeps IBC discoverable, which matters — see the test note below.The file's most important addition is the part users actually need: legacy
ibc/…balances are neither gone nor frozen. They stay in the bank module, still transfer between Sei accounts, still work through their ERC-20 pointers, and can still be swapped on a DEX. Only the route off the chain is closed. It also now gives queries an agent can run to re-verify the parameter state rather than trusting a proposal page.Changes
ecosystem/ibc-bridging.mdecosystem/bridges.mdecosystem/participation-roles.mdhermes/rlysetup section, and the description. No packets left to relay.precompiles/cosmwasm-bridge.mdtransferreverts. Points to Bank + pointers for cross-VM access that still works.precompiles/overview.mdcontracts/common-errors.mdtimeout-packet. Replaced with the real cause and the fact that retrying cannot succeed.pointers/token-factory.mdresources.md❌ retiredstyle used for the Oracle precompile. Drops the IBC-channels link.SKILL.md,SKILL-ECOSYSTEM.md,SKILL-CONTRACTS.md,README.md,apps-directory.md,tokens.mdTwo things I deliberately did not change
hermes.pyth.networkinoracles.mdandintegration-defi.md. That is Pyth's Hermes price service — unrelated to the IBC relayer of the same name. A naivehermessweep would have broken oracle integration examples.SKILL.md's frontmatter description.tests/run.ts:181asserts{ prompt: "How do I use the IBC precompile on Sei?", expected: true }. That is a trigger test — it checks the skill gets selected, using the frontmatter description only, and it is still the correct expectation: the skill should be selected for IBC questions precisely so it can explain IBC is closed. I left the description untouched, so trigger behaviour is unchanged and the case still passes for the same reason it did before. Stripping IBC keywords out of the skill would have been the wrong fix here — silence would send the user elsewhere for an answer that is now a footgun.Verification
grep -riE 'exit-only|bridge out|migrate before|before activation'acrossskill/andREADME.md→ zero hitsseid tx ibc-transfercommand anywhere; the two remaining mentions are prose stating that it fails...argsspread syntax inside code fences — pre-existing, not links)tests/run.tsusesparticipation-roles.mdrole table and section flow verified after the row and section removalI did not run
tests/run.ts— it calls the Anthropic API with a live key and costs tokens per case. Worth running in CI or locally before merge if you want the trigger suite confirmed empirically rather than by the reasoning above.🤖 Generated with Claude Code