Deploy workflow for the audited 0.1.30 orchestrator set - #314
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (7)
📒 Files selected for processing (3)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthroughThe PR adds a 0.1.30 deterministic deployment script and manual workflow for six contracts across three networks. It also adds runtime-codehash assertions and frozen redeployment tests for the 0.1.30 dependency closure. Changes0.1.30 Frozen Deployment
Estimated code review effort: 3 (Moderate) | ~20 minutes Merge Risk: ⚪ Minimal · up to This change adds the audited 0.1.30 orchestrator deployment workflow and its frozen artifacts; the listed checks and simulations pass, so no actionable merge-blocking risk remains beyond normal checks and review. Sequence Diagram(s)sequenceDiagram
participant Operator
participant ManualWorkflow
participant Deploy
participant LibRainDeploy
participant TargetNetwork
Operator->>ManualWorkflow: Select suite and network
ManualWorkflow->>Deploy: Run Deploy.run()
Deploy->>LibRainDeploy: Deploy pinned contract and dependencies
LibRainDeploy->>TargetNetwork: Broadcast deployment transaction
TargetNetwork-->>LibRainDeploy: Return deployed code and address
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Full details: Docstring CoverageExplanation No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0 files. (3 skipped: 3 unsupported.) Full details: Title checkExplanation The title clearly and concisely describes the main changes: adding a deployment workflow for the audited 0.1.30 orchestrator set. It matches the version and deployment focus shown in the changed files. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
1c7e986 to
511811c
Compare
## Why Main's test CI (and cron) has been red since **2026-08-22**, and #314's inherits it: the `20260810-revoke-fireblocks-service-signer` Safe bundles **executed on all three chains** (verified live — the retired signer `0x1C66…D1A9` holds no `DEPOSIT`/`WITHDRAW`/`CERTIFY` on Base, Ethereum, or HyperEVM), which flipped its forcing-function tests red by design: they demand this pin PR. ## What (per the script's own retire instructions) - **Canonical grant map**: the retired signer's three rows leave `expectedGrants` (16 → 13 entries). The `GRANTEE_SERVICE_1C66` constant stays as the audit-trail record. - **The revocation is pinned as an absence**: `assertExpectedGrants` gains `assertRetiredSignerAbsent` — any action role landing back on the retired signer red-lines cron with the new `UnexpectedRetiredSignerGrant`. Strictly stronger than the old presence rows. - **Spent fixtures retire**: the script, its `run-script.yaml` registry entry, the `.prod.t.sol` forcing tests, the unit tests, and both harnesses are deleted — the standing absence assertion supersedes their pre-flight per the registry's deletion rule. ## Consumers of the retired rows (second round — surfaced by CI, masked locally by RPC rate limits) - `20260619-deploy-v4-authoriser-clone`: `MIRROR_COUNT` 9 → 6 (the operational slice is now Safe + service signer) plus its replica test. - `20260729-migrate-governance-to-timelock`: the governance-loop proof's sample no-op op re-granted `DEPOSIT` to the retired signer — post-revocation that's a real grant and trips the absence check. Now re-grants to the live signer (`GRANTEE_SERVICE_3D0C`, a genuine no-op again). - `20260723-provision-additional-service-signer` drift test: drift is now created by revoking the Safe's `DEPOSIT` row instead of the departed retired-signer row. ## Verification Against live forks on all three chains: the full previously-red set passes — provisioning prod tests (`AlreadyProvisioned` refusals restored), timelock-migration surface, cross-chain parity, Base prod-state, Ethereum clone pin. `slither .` 0, fmt/reuse clean. ## Merge order This merges **first**; the orchestrator stack (#314 → #316 → #317) restacks on it and its inherited test failures disappear. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01KbsbYN4C4YDa8pu9DdudoX <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Updates** * Retired service signer access has been removed from the expected authorization configuration. * Authorization grants now reflect six operational grants, with Safe grants listed before service grants. * Governance validation now uses the active service signer for `DEPOSIT`. * Added checks to prevent accidental regranting of roles to the retired signer. * **Maintenance** * Removed the retired signer revocation workflow and its associated validation tests. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
The ST0xOrchestrator had no deploy workflow: manual-sol-artifacts-0-1-1 ships only the audited 0.1.1 bootstrap set (which predates the orchestrator) and the current-source deploy path was removed because deploys must be audited versions only. Restore src/generated/0_1_8/ — byte-identical to the same dir at tag sol-v0.1.14 (commit ed767bf), the commit Protofire audited as "st0x.deploy 5.0" (July 2026) and whose source compiles to this snapshot byte-identically. BuildPointers regenerates LibProdDeployV4 with the _0_1_8 alias set (git-clean CI pins the regeneration). script/DeployProdV4_0_1_8.sol + manual-sol-artifacts-0-1-8.yaml ship the orchestrator's on-chain dependency closure from the stored 0.1.8 creation bytecode, one suite per dispatch, to base / ethereum / hyperevm: corporate-actions facet -> receipt -> receipt vault -> OARV beacon-set deployer -> orchestrator -> orchestrator beacon-set deployer. All six are already live on Base at the pinned addresses (dispatches there are idempotent no-ops); Ethereum and HyperEVM carry only the 0.1.1 bootstrap set, so this workflow is the path to ship the audited orchestrator set there. Tests: frozen-redeploy coverage for the seven 0.1.8 contracts distinct from 0.1.1, twin-equality pins for the five byte-identical 0.1.1 twins, and 0.1.8 runtime-hash consistency in testTaggedRuntimeHashesToCodehash. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KbsbYN4C4YDa8pu9DdudoX
511811c to
985cfa0
Compare

Why
The
ST0xOrchestratorhas no deploy workflow.manual-sol-artifacts-0-1-1.yamlships only the audited 0.1.1 bootstrap set — which predates the orchestrator — and the current-source deploy path was deliberately removed (5680253: deploys must be audited versions only). This blocks shipping the orchestrator set to the bootstrap networks for the multichain rollout.What
Follows the documented process for deploying a later audited version: freeze its numbered snapshot and give it its own version-specific deploy script.
src/generated/0_1_30/— the frozen audited snapshot, deliberately PARTIAL: only the orchestrator's six-contract dependency closure (facet, receipt, receipt vault, OARV beacon-set deployer, orchestrator, orchestrator beacon-set deployer). The wrapped-token-vault chain, authorizers and unified deployer stay 0.1.1-only — their production instances come from the audited 0.1.1 bootstrap set. Each file extracted byte-identical from tagsol-v0.1.30(=candidateat that commit). The tag's commit4f126183is the exact commit Protofire's st0x.deploy 6.0 report (Aug 2026) reviews — all issues marked fixed. Because the H01 remediation's optimizer change moved every address, there are no 0.1.1 twins: all six suites deploy fresh on every network, Base included.src/generated/LibProdDeployV4.sol— regenerated byBuildPointersto emit the_0_1_30alias set (+68 lines, no other changes;git-cleanCI pins the regeneration).script/DeployProdV4_0_1_30.sol— mirrorsDeployProdV4_0_1_1.sol: stored_0_1_30creation bytecode,_0_1_30address/codehash pins, one suite per dispatch. Covers exactly the orchestrator's on-chain dependency closure, in deploy order: corporate-actions facet → receipt → receipt vault → OARV beacon-set deployer → orchestrator → orchestrator beacon-set deployer. Dependency pointers enforce the order structurally (including orchestrator → OARV set-deployer, sinceinitializehard-reverts via the vault-logic version lock until the set-deployer it was built against has code)..github/workflows/manual-sol-artifacts-0-1-30.yaml— mirrors the 0.1.1 workflow; networksbase/ethereum/hyperevm,--legacyon HyperEVM,verify: false(stored-bytecode deploys stay verifiable from the tag even after source drifts; verify manually).testTaggedRuntimeHashesToCodehash.Current on-chain state (checked 2026-08-25)
Nothing at the 0.1.30 addresses on any chain — the optimizer change moved every address, so Base's 0.1.8-era closure does not carry over. All six suites are real deploys on base / ethereum / hyperevm.
Verification
LibProdDeployV4.t.sol: 39 pass.slither .: 0 results.forge fmt --check,reuse lint, BuildPointers regeneration all clean/idempotent.forge testlocally: only failures are public-RPC 429s / missing private RPC env vars for fork tests (no logic failures).Out of scope
Creating an orchestrator instance (
ST0xOrchestratorBeaconSetDeployer.deploy(owner)) is a non-deterministic operation with a per-chain owner decision — that stays an ops step (dated script / runbook), not a suite.🤖 Generated with Claude Code
https://claude.ai/code/session_01KbsbYN4C4YDa8pu9DdudoX
Summary by CodeRabbit
New Features
Tests