Skip to content

feat(sepolia): replace BalanceTracker and repoint FeeDisburser (CHAIN-1245) - #807

Merged
mw2000 merged 10 commits into
mainfrom
mihirwadekar/chain-1245-sepolia-balancetracker-ownership-transfer
Oct 29, 2026
Merged

mw2000 merged 10 commits into
mainfrom
mihirwadekar/chain-1245-sepolia-balancetracker-ownership-transfer

Conversation

@mw2000

@mw2000 mw2000 commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

What changed?

Replaces the Sepolia BalanceTracker instead of transferring it. The old proxy 0x8D1b…9A57 is admined by an EOA that nobody can access, so the original changeAdmin task could not be executed.

The task active/evm/tasks/2026-10-21-replace-balance-tracker has three phases:

  1. L1 deploy from the facilitator's Ledger. This deploys a new BalanceTracker proxy at base/contracts v8.4.0 (8c21f6d), initializes it, and hands its admin to 0x6461…770A, which is also the profit wallet. It refills the proposer 0xdb84… to 200 ETH and the batcher 0xfc56… to 1000 ETH.
  2. L2 deploy from the facilitator's Ledger. This deploys a FeeDisburser implementation with L1_WALLET set to the new BalanceTracker and the existing 7-day interval. It uses the stock v8.4.0 source, because the Denim fee vaults (1.6.0) return a value from withdraw() again, so the old compat patch isn't needed.
  3. Multisig transaction from 0x5dfE…f77f (threshold 3, base-signer.json). This sends two OptimismPortal deposits to the Base Sepolia FeeDisburser proxy 0x7635…875d: upgradeTo(new implementation), then changeAdmin(0x7572…881B), the L2 alias of 0x6461….

Validation files are not generated yet; the facilitator generates them after both deploys.

Linear: CHAIN-1245

Why?

Per Jack, we can't use the old EOA, so the replacement route is to deploy a new tracker and repoint the FeeDisburser. Moving the FeeDisburser admin off the pre-separation multisig 0x5dfE… in the same transaction means nothing in this fee path is left on old ownership.

How to test?

I rehearsed the whole flow on local anvil forks of Ethereum Sepolia and Base Sepolia:

  • DeployBalanceTracker: post-checks pass. These cover the admin, implementation, profit wallet, both system addresses and targets, and that neither the proxy nor the implementation can be reinitialized.
  • DeployFeeDisburser: the check runs disburseFees() through the live proxy with the new implementation. All three 1.6.0 vaults withdraw, and about 1,491 ETH is bridged to the new BalanceTracker.
  • UpgradeFeeDisburser: sign([]) passes. Its post-check replays both deposits on the L2 fork as alias(0x5dfE) and asserts the implementation, the admin, L1_WALLET, and an unchanged lastDisbursementTime. Executing the deposits on the fork used about 30k and 28k gas against a 100k limit. A wrong NEW_ADMIN_L2_ALIAS makes the script revert.

forge fmt --check and make check-task-status pass.

Notes for reviewers

  • The old BalanceTracker is left orphaned; it holds 0 ETH. After execution, root config/sepolia.env BALANCE_TRACKER should be updated to the new proxy (this is in FACILITATOR.md).
  • Nobody has called processFees() on Sepolia since Apr 2025, so refills of the batcher and proposer need a keeper or a manual call.

@cb-heimdall

cb-heimdall commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

✅ Heimdall Review Status

Requirement Status More Info
Reviews ✅ 2/2
Denominator calculation
Show calculation
1 if user is bot 0
1 if user is external 0
2 if repo is sensitive 0
From .codeflow.yml 2
Additional review requirements
Show calculation
Max 0
0
From CODEOWNERS 0
Global minimum 0
Max 2
2
1 if commit is unverified 0
Sum 2

@linear

linear Bot commented Oct 7, 2026

Copy link
Copy Markdown

CHAIN-1245

@mw2000
mw2000 force-pushed the mihirwadekar/chain-1245-sepolia-balancetracker-ownership-transfer branch from 2d5cfab to c31e782 Compare October 21, 2026 18:18
@mw2000 mw2000 changed the title feat(sepolia): transfer BalanceTracker admin to Coinbase multisig (CHAIN-1245) feat(sepolia): replace BalanceTracker and repoint FeeDisburser (CHAIN-1245) Oct 21, 2026
@mw2000
mw2000 marked this pull request as ready for review October 21, 2026 19:56
@mw2000
mw2000 requested review from 0xth4nh and jackchuma October 21, 2026 21:03

@0xth4nh 0xth4nh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks Good to Thanh's Toshi

0xth4nh
0xth4nh previously approved these changes Oct 22, 2026
0xth4nh
0xth4nh previously approved these changes Oct 22, 2026
Comment thread active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile Outdated
Comment thread archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/.env

@jackchuma jackchuma left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review

Reviewed e2c7b96 against main. 1 finding(s) posted inline.

Residual risks:

  • UpgradeFeeDisburser could not be simulated end to end because its setUp requires the new BalanceTracker to exist (UpgradeFeeDisburser.s.sol:56), so its post-check is covered only by the anvil rehearsal.
  • The disburseFees() check in DeployFeeDisburser (DeployFeeDisburser.s.sol:47-54) still passes when every vault is below MIN_WITHDRAWAL_AMOUNT, because the NoFeesCollected path leaves the balance at 0. Whether it exercises the bridge path depends on live vault balances at deploy time.
  • The CHAIN-1245 description still asks to transfer the old tracker to 0x5dfE…; it needs updating to match the new scope before merge.

🤖 Reply generated with Toshi

@cb-heimdall
cb-heimdall dismissed stale reviews from 0xth4nh and 0xth4nh October 22, 2026 21:34

Approved review 5609208861 from 0xth4nh is now dismissed due to new commit. Re-request for approval.

Comment thread archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/.env
@cb-heimdall

Copy link
Copy Markdown
Collaborator

Review Error for leopoldjoy @ 2026-10-28 14:03:53 UTC
User failed mfa authentication, see go/mfa-help

leopoldjoy
leopoldjoy previously approved these changes Oct 28, 2026
mw2000 and others added 10 commits October 28, 2026 10:34
…AIN-1245)

Co-authored-by: Cursor <cursoragent@cursor.com>
…r (CHAIN-1245)

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…-1245)

The old BalanceTracker admin is an EOA nobody can access, so deploy a new
BalanceTracker owned by 0x6461 and upgrade the L2 FeeDisburser to bridge
to it. The same 0x5dfE multisig transaction moves the FeeDisburser admin
to the alias of 0x6461. Replaces the unexecutable changeAdmin task.

Co-authored-by: Cursor <cursoragent@cursor.com>
…re cleanup

Co-authored-by: Cursor <cursoragent@cursor.com>
- Prove the initializer lock with the real initialize arguments and the exact
  OpenZeppelin revert reason, on both the proxy and the implementation.
- Keep addresses.json after a failed broadcast and add RESUME=1 to finish
  the recorded broadcast instead of starting a fresh deployment.
- Top fee vaults up to their minimum withdrawal amount so the disburseFees
  check always exercises the withdraw and bridge paths.

Co-authored-by: Cursor <cursoragent@cursor.com>
Foundry 1.5.1 simulates with pre-fork Sepolia gas costs, so the first
deploy-l1 broadcast ran both contract creations out of gas.

Co-authored-by: Cursor <cursoragent@cursor.com>
… to sign (CHAIN-1245)

- addresses.json and Forge records for deploy-l1 and deploy-l2, including
  the first deploy-l1 run whose creations ran out of gas.
- base-signer.json for 0x5dfE, with task-origin validation skipped
  (Sepolia, not a ProxyAdmin-owner operation).
- Signer README lists the deployed addresses; status is ready_to_sign.

Co-authored-by: Cursor <cursoragent@cursor.com>
Executed in https://sepolia.etherscan.io/tx/0x1d9e7be871ea17c1fc215940e01c19dfabbb67ace76d83275ac72f0609096789.
verify-l2 confirms the FeeDisburser implementation and admin on Base Sepolia.
Point the root Sepolia BALANCE_TRACKER at the new proxy.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@mw2000
mw2000 force-pushed the mihirwadekar/chain-1245-sepolia-balancetracker-ownership-transfer branch from bf99881 to d901663 Compare October 28, 2026 17:34
@cb-heimdall
cb-heimdall dismissed stale reviews from roger-bai-coinbase and leopoldjoy October 28, 2026 17:35

Approved review 5629809219 from roger-bai-coinbase is now dismissed due to new commit. Re-request for approval.

@0xth4nh 0xth4nh left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks Good to Thanh's Toshi

@mw2000
mw2000 requested a review from xenoliss October 28, 2026 20:47

@leopoldjoy leopoldjoy left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed the executed deployment and archive move against CHAIN-1245; the prior findings are addressed and no new actionable issues were found. CI execution/security checks are passing; Heimdall is awaiting the review gate. Deployment scripts and signing validation are unchanged from the previously reviewed version. End-to-end fee finalization and the subsequent processFees() refill cycle remain operational follow-ups, not verified by this review.

@mw2000
mw2000 merged commit 7d18d5c into main Oct 29, 2026
8 checks passed
@mw2000
mw2000 deleted the mihirwadekar/chain-1245-sepolia-balancetracker-ownership-transfer branch October 29, 2026 01:32
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.

6 participants