Repository navigation
Conversation
✅ Heimdall Review Status
|
2d5cfab to
c31e782
Compare
0xth4nh
left a comment
There was a problem hiding this comment.
Looks Good to Thanh's Toshi
jackchuma
left a comment
There was a problem hiding this comment.
Automated review
Reviewed e2c7b96 against main. 1 finding(s) posted inline.
Residual risks:
UpgradeFeeDisbursercould not be simulated end to end because itssetUprequires the new BalanceTracker to exist (UpgradeFeeDisburser.s.sol:56), so its post-check is covered only by the anvil rehearsal.- The
disburseFees()check inDeployFeeDisburser(DeployFeeDisburser.s.sol:47-54) still passes when every vault is belowMIN_WITHDRAWAL_AMOUNT, because theNoFeesCollectedpath 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
Approved review 5609208861 from 0xth4nh is now dismissed due to new commit. Re-request for approval.
|
Review Error for leopoldjoy @ 2026-10-28 14:03:53 UTC |
…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>
bf99881 to
d901663
Compare
Approved review 5629809219 from roger-bai-coinbase is now dismissed due to new commit. Re-request for approval.
0xth4nh
left a comment
There was a problem hiding this comment.
Looks Good to Thanh's Toshi
leopoldjoy
left a comment
There was a problem hiding this comment.
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.
What changed?
Replaces the Sepolia
BalanceTrackerinstead of transferring it. The old proxy0x8D1b…9A57is admined by an EOA that nobody can access, so the originalchangeAdmintask could not be executed.The task
active/evm/tasks/2026-10-21-replace-balance-trackerhas three phases:BalanceTrackerproxy at base/contracts v8.4.0 (8c21f6d), initializes it, and hands its admin to0x6461…770A, which is also the profit wallet. It refills the proposer0xdb84…to 200 ETH and the batcher0xfc56…to 1000 ETH.FeeDisburserimplementation withL1_WALLETset to the newBalanceTrackerand the existing 7-day interval. It uses the stock v8.4.0 source, because the Denim fee vaults (1.6.0) return a value fromwithdraw()again, so the old compat patch isn't needed.0x5dfE…f77f(threshold 3,base-signer.json). This sends twoOptimismPortaldeposits to the Base SepoliaFeeDisburserproxy0x7635…875d:upgradeTo(new implementation), thenchangeAdmin(0x7572…881B), the L2 alias of0x6461….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 theFeeDisburseradmin off the pre-separation multisig0x5dfE…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 runsdisburseFees()through the live proxy with the new implementation. All three 1.6.0 vaults withdraw, and about 1,491 ETH is bridged to the newBalanceTracker.UpgradeFeeDisburser:sign([])passes. Its post-check replays both deposits on the L2 fork asalias(0x5dfE)and asserts the implementation, the admin,L1_WALLET, and an unchangedlastDisbursementTime. Executing the deposits on the fork used about 30k and 28k gas against a 100k limit. A wrongNEW_ADMIN_L2_ALIASmakes the script revert.forge fmt --checkandmake check-task-statuspass.Notes for reviewers
BalanceTrackeris left orphaned; it holds 0 ETH. After execution, rootconfig/sepolia.envBALANCE_TRACKERshould be updated to the new proxy (this is inFACILITATOR.md).processFees()on Sepolia since Apr 2025, so refills of the batcher and proposer need a keeper or a manual call.