v0.1.35
Pre-release
⚠️ Consensus-breaking release. Requires a coordinated network upgrade via thev0.1.35upgrade handler — all validators and full nodes must run this binary at the upgrade height.
⚠️ Read before upgrading
- Do not swap the binary early. Nodes halt at the upgrade height and switch there; running it early risks corrupting your state.
cosmovisorhandles the swap automatically — manual operators swap after the halt. - Suppliers: run the
v0.1.35RelayMiner from the upgrade height. An older miner keeps pricing claims under the old rules and can skip a proof the chain requires →PROOF_MISSING→ slashing. - Upgrade the full node before, or together with, the RelayMiner.
ComputeUnitsPerRelayAtHeightis new inv0.1.35. Av0.1.35miner pointed at av0.1.34node falls back to live pricing and logs a warning — it keeps mining, but the session-start pin is inactive until the node catches up. - FREEZE all
compute_units_per_relaychanges (MsgAddServiceupdates that change cupr) from before the upgrade height until the RelayMiner fleet is upgraded. Unfreeze only afterwards.
Highlights
🧾 Service config changes are session-scoped. Claim pricing is now pinned to the height a session started, so a compute_units_per_relay change applies only to sessions that start after it. Same for the global pricing multipliers.
⚡ RelayMiner reliability. Claim/proof transactions are re-broadcast if evicted from the mempool — the main cause of PROOF_MISSING slashing. Additional timing and validation hardening so that valid work is not rejected. Also fixed: a WebSocket goroutine leak, a concurrent-logging crash, and two session-cache bugs.
🪪 Cards: onchain identity for gateways and services. Gateways can now publish a card — a small, self-describing JSON document — via the new MsgUpdateGatewayMetadata. Services already had one, and a routine service edit (e.g. changing compute_units_per_relay) no longer wipes it. Validate either offline before paying gas:
pocketd tx service validate-card ./card.json
pocketd tx gateway validate-card ./gateway-card.jsonThe canonical schemas live in pkg/cards/ and are compiled into pocketd — nothing is fetched over the network.
🔑 Supplier owners protected. An operator can no longer re-stake repeatedly to cancel an owner-initiated unstake.
💸 Settlement budget redistribution (ships OFF). Makes the split between work done-and-paid and work done-but-unpaid (overservicing) far more visible, plus the machinery to pay for part of it. No economic change at this upgrade — an exact no-op until governance raises overservicing_bonus_multiplier.
🛑 Governance param guard. Shared-params combinations that settlement cannot process are now rejected at validation time.
Behavior Changes
The supplier owner's unstake-cancel is a TWO-step operation. MsgUnstakeSupplier stamps a deactivation height on every service config, and the owner's cancel must be services-less — so it leaves the supplier staked, no longer unbonding, and serving nothing, with a transaction that succeeded silently. The operator must then send a second stake-supplier carrying the services. Automated top-ups signed with the operator key can no longer rescue a supplier force-unbonded by slashing.
Integrators: the service metadata field is renamed. Service.metadata's only field is now card, not experimental_api_specs. The field number is unchanged, so the wire format, the stored state and every hash are byte-identical — this is not a consensus change. But any client that reads the field by name must be updated.
Genesis is incompatible in both directions. A v0.1.34 export containing service metadata fails to load on v0.1.35 (experimental_api_specs → card), and a v0.1.35 export fails to load on v0.1.34 (new compute_units_per_relay_history). This does not affect the in-place upgrade — only re-genesis, hard-fork restarts, genesis validate, and devnets seeded from an export.
Consensus-Breaking Changes
- Settlement budget redistribution + new
overservicing_bonus_multiplierparam (ships as an exact no-op atm = 1) compute_units_per_relayresolved at session-start height for claim validation AND settlement; new cupr history statecompute_units_to_tokens_multiplier/compute_unit_cost_granularityresolved at session-start height for settlement pricing, matchingx/proof- Only the supplier owner may cancel an in-progress unstake
- Dead
GetBlockHashreads removed from the claim/proof commit-height calculation (changes gas onMsgCreateClaim/MsgSubmitProof) x/sharedparams validation rejects an all-zero claim/proof window offset set that settlement cannot processMsgAddServicepreserves stored service metadata when the message omits itGatewaygains ametadatacard + newMsgUpdateGatewayMetadata; gateway lifecycle events no longer embed the card- A claim is no longer settled before its own proof window closes
Dependencies
Go 1.25.8 → 1.26.5. google.golang.org/grpc → v1.82.1, closing GHSA-hrxh-6v49-42gf (HIGH). ring-go → v0.2.0 — behaviourally neutral onchain (Verify byte-identical; all functional changes confined to the signing path the chain never executes).
📖 Full release notes: docs/release_notes_v0.1.35.md
What's Changed
- docs: close supplier onboarding gaps from dogfooding report by @oten91 in #1958
- Update shared_params.json by @Traciecmyers in #1959
- Update shared_params.json by @Traciecmyers in #1961
- Update shared_params.json by @Traciecmyers in #1964
- Update staking_params.json by @Traciecmyers in #1965
- Update shared_params.json by @Traciecmyers in #1969
- Update shared_params.json by @Traciecmyers in #1972
- Update shared_params.json by @Traciecmyers in #1979
- fix(proof): remove dead on-chain block-hash reads from claim/proof commit-height calc by @oten91 in #1976
- Update shared_params.json by @Traciecmyers in #1983
- Update shared_params.json by @Traciecmyers in #1985
- Update shared_params.json by @Traciecmyers in #1997
- Update shared_params.json by @Traciecmyers in #2000
- Update shared_params.json by @Traciecmyers in #2005
- release: v0.1.35 — settlement budget redistribution, session-start param pins, gateway cards by @oten91 in #2008
Full Changelog: v0.1.34...v0.1.35