Summary
v2.4.1 is a mandatory follow-up patch to v2.4.0 fixing bugs in the candidate exit queue introduced by the Yap hardfork. All changes are scoped to the staking package; no genesis or config schema changes.
The headline fix prevents archive nodes from panicking the first time ScheduleCandidateDeactivation runs after Yap activation. The remaining fixes restore Web3 access to the exit queue and correct dropped event data.
Changes
- Fix: archive nodes panic on the Schedule block (#4827) —
*lastExitEpochnow implementskvListContainerso it can be stored under theCandsMapnamespace via erigon'skvListStorage. Without this, archive-enabled nodes panicked withobject of type *staking.lastExitEpoch does not supportedand entered a restart loop. - Fix: Confirm op callable via Web3 (#4828) — registers the missing
confirmCandidateDeactivationABI method and loosens the zero-arg length guard (len(data) <= 4→< 4). Native gRPC was unaffected, which masked the bug during local testing. - Feat:
candidateDeactivationview method (#4829) —candidateDeactivation(address) → (bool requested, uint64 scheduledAtBlock). Exposes exit-queue state to dApps and unpacks the internalMaxUint64sentinel for "requested-but-not-scheduled". - Fix: clear
DeactivatedAtafter Confirm — prevents frontends like iotex-hub from showing "Confirm Exit" prematurely on a re-staked candidate. - Fix: emit non-indexed event args on candidate deactivation —
CandidateDeactivationScheduled.blockNumberwas being dropped because the handlers used the legacy receipt-log path. Both deactivation handlers now route throughAddEvent. - Refactor: split
newReceiptLoginto legacy + events constructors — no behavior change; prevents the event-args bug above from recurring.
Upgrade Priority
v2.4.1 is a mandatory release for all node types.
| Node type | Action |
|---|---|
| Archive node | Mandatory |
| Delegate | Mandatory |
| Fullnode | Mandatory |
| API node | Mandatory |