Skip to content

Orchestrator beacon owner is pinned to the hot deploy EOA as permanent expected state, and the timelock migration structurally cannot reach it #333

Description

@thedavidmeister

From the adversarial audit of #316 at pr:316 scope (survived refutation; 9 of 56 findings survived).

assertBeaconSet pins the orchestrator beacon owner to BEACON_INITIAL_OWNER = 0x8E4bdeec... - documented across this repo as "rainlang.eth, the deploy EOA" - and asserts it as the permanent expected state, with no migration window and no deadline. Cron CI therefore never red-lines it.

Every other beacon surface has moved the other way:

  • LibBeaconInvariants.sol:93-101 explicitly warns "do not conflate the two" against PROD_BEACON_OWNER = STOX_TOKEN_OWNER_SAFE.
  • Other surfaces assert through assertProdBeaconsOwnershipMigration(pre, post, deadline).
  • CLAUDE.md states production onlyOwner surfaces are held by a governance timelock.

The timelock migration cannot pick this beacon up, by construction rather than by omission:

  • LibBeaconInvariants.prodBeaconsForChainId returns a fixed address[3].
  • 20260729-migrate-governance-to-timelock.s.sol captures address[3] beaconImplsBefore.
  • The orchestrator beacon is a fourth beacon, outside that array.
  • GovernanceTimelockMigration.t.sol consequently stays green past the 2026-10-01 deadline, because it only checks the enumerated three.

Impact once #324 lands: the orchestrator holds DEPOSIT/WITHDRAW on every production vault, so a single upgradeTo from that one EOA key replaces the implementation holding mint/burn authority across Base, Ethereum and HyperEVM. The pin as written asserts that arrangement is correct forever.

Widening the address[3] to include the orchestrator beacon is the part the migration needs; the pin also needs a deadline so CI fails if the handover has not happened.

Related: #326 (the same audit, the instance address being claimable now).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions