Skip to content

fix(fork-runner): reconcile feature state idempotently (coordinate with base-anvil #39)#168

Merged
amiecorso merged 1 commit into
mainfrom
corso/fork-runner-idempotent
Jun 12, 2026
Merged

fix(fork-runner): reconcile feature state idempotently (coordinate with base-anvil #39)#168
amiecorso merged 1 commit into
mainfrom
corso/fork-runner-idempotent

Conversation

@amiecorso

Copy link
Copy Markdown
Collaborator

Standalone, code-only change (no dependency on #167).

What

script/fork/__main__.py reconciles each gated feature to the state a run needs instead of unconditionally calling activate(): it checks isActivated() first, ensures non-skipped features active, and deactivates SKIP_ACTIVATE features.

Why

activate() reverts AlreadyActivated once base-anvil seeds the gated features active in a fresh anvil --base node (base-anvil#39 / BOP-375). The current unconditional-activate runner would then fail make fork-tests (and base-std fork CI) with "activation tx reverted." This makes the runner idempotent so it works whether the node boots features inactive (today) or seeded active (after #39).

Order

Merge this before base-anvil#39 so fork testing survives the node auto-seed. Independent of #167 (auto-detect + docs).

Test plan

python -m py_compile clean. Behavior is unchanged against a current (inactive-seed) node: non-skipped features get activated, SKIP_ACTIVATE features stay inactive.

The runner unconditionally called activate(), which reverts AlreadyActivated
once base-anvil seeds features active in a fresh anvil --base node (BOP-375,
base-anvil#39). Check isActivated() first: ensure non-skipped features active
and SKIP_ACTIVATE features inactive (via deactivate). Works whether the node
boots features inactive or seeded active, so base-anvil#39 lands without
breaking make fork-tests.
@github-actions

Copy link
Copy Markdown

Interface Coverage

✅ All interface functions have test coverage.

@github-actions

Copy link
Copy Markdown

📊 Forge Coverage (src/lib/)

🟡 ≥95% across all metrics — some metrics below 99%.

File Lines Stmts Branches Funcs
🟢 B20FactoryLib.sol 100.00% 100.00% 100.00% 100.00%
🔴 test/lib/ForceFeeder.sol 0.00% 0.00% 100.00% 0.00%
🔴 test/lib/PrecompileProbe.sol 0.00% 0.00% 0.00% 0.00%
🟢 MockActivationRegistry.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockActivationRegistryStorage.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockB20.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockB20Asset.sol 100.00% 100.00% 100.00% 100.00%
🟡 MockB20Factory.sol 98.96% 99.10% 100.00% 100.00%
🟢 MockB20Stablecoin.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockB20Storage.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockPolicyRegistry.sol 100.00% 100.00% 100.00% 100.00%
🟢 MockPolicyRegistryStorage.sol 100.00% 100.00% 100.00% 100.00%
Total 96.69% 97.23% 98.39% 96.89%

Full report: download artifact. To browse locally: make coverage (runs forge coverage + genhtml + opens the HTML report).

@github-actions

Copy link
Copy Markdown

✅ Fork tests: all 616 passed

base/base is fully in sync with the base-std spec.

@amiecorso amiecorso merged commit 8c7241c into main Jun 12, 2026
10 checks passed
@amiecorso amiecorso deleted the corso/fork-runner-idempotent branch June 12, 2026 16:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant