feat: add zombie permanently-off upgrade gate#3898
Conversation
✅ Heimdall Review Status
|
Enforce the 'Zombie is never stored as active' invariant at the source by dropping Zombie writes in UpgradeActivationOverrides::set_activation, which also covers the RuntimeUpgradeRegistry paths. Previously the raw override map would store a dead Zombie->Timestamp entry that consumers had to keep short-circuiting.
…_fork_name contract_id emits "zombie" but the reverse lookup deliberately drops it so the L1 upgrade signal can never address the permanently-off gate.
Review SummaryThe implementation is well-structured with defense-in-depth at multiple layers. The Zombie gate is correctly excluded from I reviewed all
The Maintenance concernZombie's position as the last enum variant is load-bearing: it ensures No blocking issues found. |
✅ base-std fork tests: all 616 passedbase/base is fully in sync with the base-std spec.
|
Adds a
ZombieBase upgrade that keeps a full gate identity (enum variant,name(), andis_zombie_active*query helpers) but can never be activated by any path (config, genesis, runtime override, contract signal, or chainspec schedule), so it always resolves toForkCondition::Never. Use it like any otheris_xxx_activated_at_timestampgate to guard not-yet-ready features until Zombie is replaced by a real named fork. Zombie tracks the latest precompile set so it evolves with new hard forks.