v4.0.1 - emergency tx-layer fix
Passage v4.0.1 — emergency fix for the v4.0.0 tx-layer outage
On v4.0.0, no transaction of any kind can be included in a block — not staking, not IBC, not even a bank send. Signer resolution fails at CheckTx for every message, so the chain produces empty blocks (consensus is healthy; the tx layer is dead). Governance cannot fix this — a proposal is itself a transaction and is rejected too — so the remedy is a coordinated binary swap. All validators must switch at the same height or the chain forks.
Fixes (four defects from the SDK 0.47→0.50 port)
- Address codec in InterfaceRegistry (
app/params/proto.go) — the registry was built without an address codec, so signer resolution fails:InterfaceRegistry requires a proper address codec implementation. - Ante handler nil codec (
app/app.go) —HandlerOptions.Codecwas left unset, so the customBlockAccountDecoratorgot a nil codec and nil-pointer panicked on every tx once (1) was fixed. (1) and (2) must ship together, or the chain stays dead — see verification. - ibctm / solomachine light-client registration (
app/app.go) — ibc-go v8 no longer bundles the light clients; withoutibctm,/ibc.lightclients.tendermint.v1.ClientStatefails to decode, breaking IBC client-state queries and relayer client updates. - cosmwasm_1_3 capability (
app/app.go) — restored the wasm capability v3.0.0 had and the port dropped.
Diff: four commits in PR envadiv/Passage3D#210.
Verification — real mainnet state, by broadcast (not generate-only)
On a fork of real mainnet state: v4.0.0 rejects a bank send (code 1); after swapping to v4.0.1 the same send is accepted and included in a block (code 0). The 10-second on-node repro and the harness are in the coordination channel.
Coordinated upgrade
Binary swap at height 19972000 (~Fri Jul 10 17:25 UTC). Build from source only from the v4.0.1 tag (carries the vendored iavl empty-store patch; unpatched trees won't load the DB). SHA256SUMS.txt attached — verify before running.