From d5e3f7ed721f3cdab6c31f08df012c3944a98dfc Mon Sep 17 00:00:00 2001 From: Mihir Wadekar Date: Wed, 7 Oct 2026 16:43:22 -0700 Subject: [PATCH 01/10] feat(sepolia): transfer BalanceTracker admin to Coinbase multisig (CHAIN-1245) Co-authored-by: Cursor --- .../FACILITATOR.md | 43 +++++++++++++++++++ .../Makefile | 38 ++++++++++++++++ .../config/sepolia/.env | 9 ++++ .../config/sepolia/README.md | 15 +++++++ .../TransferBalanceTrackerOwnership.s.sol | 34 +++++++++++++++ 5 files changed, 139 insertions(+) create mode 100644 active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md create mode 100644 active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/Makefile create mode 100644 active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/.env create mode 100644 active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/README.md create mode 100644 active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/script/TransferBalanceTrackerOwnership.s.sol diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md new file mode 100644 index 000000000..6f1275228 --- /dev/null +++ b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md @@ -0,0 +1,43 @@ +# Facilitator Guide + +Guide for moving the `BalanceTracker` proxy admin from the current EOA to the Coinbase multisig. + +The current admin is an EOA, not a Safe, so this task has no signer validation file, no multisig +approvals and no task-origin signatures. The `CURRENT_ADMIN` Ledger sends the transaction directly. + +## 0. Ordering + +The Sepolia `BalanceTracker` profit-wallet upgrade +([#768](https://github.com/base/contract-deployments/pull/768)) is executed by the same EOA admin. +Execute that upgrade before this task, or confirm it has been abandoned. After this transfer, the +upgrade must go through the multisig instead. + +## 1. Install dependencies and simulate + +```bash +cd active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership +make TASK_NETWORK= deps +make TASK_NETWORK= sim +``` + +The simulation must show a single `changeAdmin(NEW_ADMIN)` call on `BalanceTracker` emitting +`AdminChanged(CURRENT_ADMIN, NEW_ADMIN)`. The script reverts if the current admin is not +`CURRENT_ADMIN`, if `NEW_ADMIN` has no code, or if the admin does not change. + +## 2. Execute + +Connect the Ledger for `CURRENT_ADMIN` (see `config//.env`). If it is not at the default +derivation index, append `LEDGER_ACCOUNT=`. + +```bash +make TASK_NETWORK= execute +``` + +## 3. Verify and archive + +```bash +make TASK_NETWORK= verify +``` + +Set `Status: [EXECUTED]()` in `config//README.md`, commit the record +under `records/`, then run `make archive-task` from the repository root. diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/Makefile b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/Makefile new file mode 100644 index 000000000..4786c91de --- /dev/null +++ b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/Makefile @@ -0,0 +1,38 @@ +include ../../../../Makefile +include $(REPO_ROOT)/Multisig.mk + +ifneq ($(origin TASK_NETWORK),command line) +$(error TASK_NETWORK must be set on the command line, for example: make TASK_NETWORK=sepolia ) +endif +ifneq ($(TASK_NETWORK),sepolia) +$(error unsupported TASK_NETWORK: $(TASK_NETWORK)) +endif + +PROJECT_DIR := $(abspath ../..) + +include $(REPO_ROOT)/config/$(TASK_NETWORK).env +include config/$(TASK_NETWORK)/.env + +export FOUNDRY_BROADCAST := $(CURDIR)/records +SCRIPT := tasks/2026-10-06-transfer-balance-tracker-ownership/script/TransferBalanceTrackerOwnership.s.sol:TransferBalanceTrackerOwnership +TASK_ENV := BALANCE_TRACKER=$(BALANCE_TRACKER) CURRENT_ADMIN=$(CURRENT_ADMIN) NEW_ADMIN=$(NEW_ADMIN) + +.PHONY: validate-ledger-admin +validate-ledger-admin: + @test "$$($(MISE_EXEC) cast wallet address --ledger --mnemonic-derivation-path $(LEDGER_HD_PATH))" = "$(CURRENT_ADMIN)" || \ + (echo "connected Ledger account is not CURRENT_ADMIN; set LEDGER_ACCOUNT=" && exit 1) + +.PHONY: sim +sim: + cd $(PROJECT_DIR) && $(TASK_ENV) $(MISE_EXEC) forge script --rpc-url $(L1_RPC_URL) $(SCRIPT) \ + --sender $(CURRENT_ADMIN) -vvvv + +.PHONY: execute +execute: validate-ledger-admin + cd $(PROJECT_DIR) && $(TASK_ENV) $(MISE_EXEC) forge script --rpc-url $(L1_RPC_URL) $(SCRIPT) \ + --ledger --hd-paths $(LEDGER_HD_PATH) --sender $(CURRENT_ADMIN) --broadcast -vvvv + +.PHONY: verify +verify: + @test "$$($(MISE_EXEC) cast call $(BALANCE_TRACKER) 'admin()(address)' --rpc-url $(L1_RPC_URL))" = "$(NEW_ADMIN)" + @echo "BalanceTracker admin is $(NEW_ADMIN)" diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/.env b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/.env new file mode 100644 index 000000000..65b6a6bfe --- /dev/null +++ b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/.env @@ -0,0 +1,9 @@ +# https://github.com/base/contracts/commits/releases/v8.3.0/ +BASE_CONTRACTS_COMMIT=385f21a41f277d287db92fffe88dca41299162ea + +# Existing BalanceTracker proxy admin (EOA). +CURRENT_ADMIN=0x4672425C27A942bB27e7b9709c1b21ab89a3cA13 + +# CB_MULTISIG / INCIDENT_MULTISIG in config/sepolia.env. CHAIN-1245 named the +# pre-separation multisig 0x5dfEB066334B67355A15dc9b67317fD2a2e1f77f, which has since been replaced. +NEW_ADMIN=0x646132A1667ca7aD00d36616AFBA1A28116C770A diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/README.md b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/README.md new file mode 100644 index 000000000..737360842 --- /dev/null +++ b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/README.md @@ -0,0 +1,15 @@ +# Transfer Sepolia `BalanceTracker` Ownership + +Status: READY TO SIGN + +## Description + +Move the admin of the Ethereum Sepolia +[`BalanceTracker`](https://sepolia.etherscan.io/address/0x8D1b5e5614300F5c7ADA01fFA4ccF8F1752D9A57) +proxy from the EOA `0x4672425C27A942bB27e7b9709c1b21ab89a3cA13` to the Base Sepolia multisig +[`0x646132A1667ca7aD00d36616AFBA1A28116C770A`](https://sepolia.etherscan.io/address/0x646132A1667ca7aD00d36616AFBA1A28116C770A). + +## Execution + +The proxy is administered by an EOA, so no multisig signature is required. The facilitator +executes the transfer with the current admin's Ledger. diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/script/TransferBalanceTrackerOwnership.s.sol b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/script/TransferBalanceTrackerOwnership.s.sol new file mode 100644 index 000000000..bee8d1ad5 --- /dev/null +++ b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/script/TransferBalanceTrackerOwnership.s.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import {Script} from "forge-std/Script.sol"; + +import {Proxy} from "@base-contracts/src/universal/Proxy.sol"; + +/// @notice Moves the BalanceTracker proxy admin from the current EOA to the Base Sepolia multisig. +contract TransferBalanceTrackerOwnership is Script { + address internal immutable CURRENT_ADMIN; + address internal immutable NEW_ADMIN; + address payable internal immutable BALANCE_TRACKER; + + constructor() { + CURRENT_ADMIN = vm.envAddress("CURRENT_ADMIN"); + NEW_ADMIN = vm.envAddress("NEW_ADMIN"); + BALANCE_TRACKER = payable(vm.envAddress("BALANCE_TRACKER")); + + require(NEW_ADMIN.code.length > 0, "NEW_ADMIN has no code"); + require(_admin() == CURRENT_ADMIN, "proxy admin is not CURRENT_ADMIN"); + } + + function run() external { + vm.broadcast(CURRENT_ADMIN); + Proxy(BALANCE_TRACKER).changeAdmin(NEW_ADMIN); + + require(_admin() == NEW_ADMIN, "proxy admin is not NEW_ADMIN"); + } + + function _admin() internal returns (address) { + vm.prank(address(0)); + return Proxy(BALANCE_TRACKER).admin(); + } +} From 23a9a29a1888466aa04e1ccd96ffe06450d4d461 Mon Sep 17 00:00:00 2001 From: Mihir Wadekar Date: Wed, 21 Oct 2026 11:18:27 -0700 Subject: [PATCH 02/10] chore(sepolia): add task status file for BalanceTracker admin transfer (CHAIN-1245) Co-authored-by: Cursor --- .../FACILITATOR.md | 6 ++++-- .../status.json | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/status.json diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md index 6f1275228..33cd951a2 100644 --- a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md +++ b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md @@ -39,5 +39,7 @@ make TASK_NETWORK= execute make TASK_NETWORK= verify ``` -Set `Status: [EXECUTED]()` in `config//README.md`, commit the record -under `records/`, then run `make archive-task` from the repository root. +In the same change, set `Status: [EXECUTED]()` in `config//README.md` +and update the network in the task-root `status.json` (`step: executed`, `executed_tx`, +`last_updated`). Commit the record under `records/`, then run `make check-task-status` and +`make archive-task` from the repository root. diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/status.json b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/status.json new file mode 100644 index 000000000..c292a6b56 --- /dev/null +++ b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/status.json @@ -0,0 +1,15 @@ +{ + "schema_version": 1, + "task": "2026-10-06-transfer-balance-tracker-ownership", + "kind": "active", + "networks": { + "sepolia": { + "step": "review", + "pr": "https://github.com/base/contract-deployments/pull/807", + "blocksec_ticket": null, + "signatures": {}, + "executed_tx": null + } + }, + "last_updated": "2026-10-21T18:16:45Z" +} From 6467915cf3a63e4b509f26310d04c3e729bf373e Mon Sep 17 00:00:00 2001 From: Mihir Wadekar Date: Wed, 21 Oct 2026 12:00:46 -0700 Subject: [PATCH 03/10] docs(sepolia): drop closed PR #768 ordering note from facilitator guide Co-authored-by: Cursor --- .../FACILITATOR.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md index 33cd951a2..9557d4fa1 100644 --- a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md +++ b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md @@ -5,13 +5,6 @@ Guide for moving the `BalanceTracker` proxy admin from the current EOA to the Co The current admin is an EOA, not a Safe, so this task has no signer validation file, no multisig approvals and no task-origin signatures. The `CURRENT_ADMIN` Ledger sends the transaction directly. -## 0. Ordering - -The Sepolia `BalanceTracker` profit-wallet upgrade -([#768](https://github.com/base/contract-deployments/pull/768)) is executed by the same EOA admin. -Execute that upgrade before this task, or confirm it has been abandoned. After this transfer, the -upgrade must go through the multisig instead. - ## 1. Install dependencies and simulate ```bash From cd9fd4ebe541df537e9308947e67d3780ba8576b Mon Sep 17 00:00:00 2001 From: Mihir Wadekar Date: Wed, 21 Oct 2026 12:40:13 -0700 Subject: [PATCH 04/10] feat(sepolia): replace BalanceTracker and repoint FeeDisburser (CHAIN-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 --- .../FACILITATOR.md | 38 ----- .../Makefile | 38 ----- .../config/sepolia/.env | 9 -- .../config/sepolia/README.md | 15 -- .../TransferBalanceTrackerOwnership.s.sol | 34 ----- .../FACILITATOR.md | 61 ++++++++ .../Makefile | 100 +++++++++++++ .../config/sepolia/.env | 16 ++ .../config/sepolia/README.md | 22 +++ .../script/DeployBalanceTracker.s.sol | 84 +++++++++++ .../script/DeployFeeDisburser.s.sol | 54 +++++++ .../script/UpgradeFeeDisburser.s.sol | 141 ++++++++++++++++++ .../status.json | 11 +- 13 files changed, 486 insertions(+), 137 deletions(-) delete mode 100644 active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md delete mode 100644 active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/Makefile delete mode 100644 active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/.env delete mode 100644 active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/README.md delete mode 100644 active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/script/TransferBalanceTrackerOwnership.s.sol create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/.env create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol rename active/evm/tasks/{2026-10-06-transfer-balance-tracker-ownership => 2026-10-21-replace-balance-tracker}/status.json (54%) diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md deleted file mode 100644 index 9557d4fa1..000000000 --- a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/FACILITATOR.md +++ /dev/null @@ -1,38 +0,0 @@ -# Facilitator Guide - -Guide for moving the `BalanceTracker` proxy admin from the current EOA to the Coinbase multisig. - -The current admin is an EOA, not a Safe, so this task has no signer validation file, no multisig -approvals and no task-origin signatures. The `CURRENT_ADMIN` Ledger sends the transaction directly. - -## 1. Install dependencies and simulate - -```bash -cd active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership -make TASK_NETWORK= deps -make TASK_NETWORK= sim -``` - -The simulation must show a single `changeAdmin(NEW_ADMIN)` call on `BalanceTracker` emitting -`AdminChanged(CURRENT_ADMIN, NEW_ADMIN)`. The script reverts if the current admin is not -`CURRENT_ADMIN`, if `NEW_ADMIN` has no code, or if the admin does not change. - -## 2. Execute - -Connect the Ledger for `CURRENT_ADMIN` (see `config//.env`). If it is not at the default -derivation index, append `LEDGER_ACCOUNT=`. - -```bash -make TASK_NETWORK= execute -``` - -## 3. Verify and archive - -```bash -make TASK_NETWORK= verify -``` - -In the same change, set `Status: [EXECUTED]()` in `config//README.md` -and update the network in the task-root `status.json` (`step: executed`, `executed_tx`, -`last_updated`). Commit the record under `records/`, then run `make check-task-status` and -`make archive-task` from the repository root. diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/Makefile b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/Makefile deleted file mode 100644 index 4786c91de..000000000 --- a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -include ../../../../Makefile -include $(REPO_ROOT)/Multisig.mk - -ifneq ($(origin TASK_NETWORK),command line) -$(error TASK_NETWORK must be set on the command line, for example: make TASK_NETWORK=sepolia ) -endif -ifneq ($(TASK_NETWORK),sepolia) -$(error unsupported TASK_NETWORK: $(TASK_NETWORK)) -endif - -PROJECT_DIR := $(abspath ../..) - -include $(REPO_ROOT)/config/$(TASK_NETWORK).env -include config/$(TASK_NETWORK)/.env - -export FOUNDRY_BROADCAST := $(CURDIR)/records -SCRIPT := tasks/2026-10-06-transfer-balance-tracker-ownership/script/TransferBalanceTrackerOwnership.s.sol:TransferBalanceTrackerOwnership -TASK_ENV := BALANCE_TRACKER=$(BALANCE_TRACKER) CURRENT_ADMIN=$(CURRENT_ADMIN) NEW_ADMIN=$(NEW_ADMIN) - -.PHONY: validate-ledger-admin -validate-ledger-admin: - @test "$$($(MISE_EXEC) cast wallet address --ledger --mnemonic-derivation-path $(LEDGER_HD_PATH))" = "$(CURRENT_ADMIN)" || \ - (echo "connected Ledger account is not CURRENT_ADMIN; set LEDGER_ACCOUNT=" && exit 1) - -.PHONY: sim -sim: - cd $(PROJECT_DIR) && $(TASK_ENV) $(MISE_EXEC) forge script --rpc-url $(L1_RPC_URL) $(SCRIPT) \ - --sender $(CURRENT_ADMIN) -vvvv - -.PHONY: execute -execute: validate-ledger-admin - cd $(PROJECT_DIR) && $(TASK_ENV) $(MISE_EXEC) forge script --rpc-url $(L1_RPC_URL) $(SCRIPT) \ - --ledger --hd-paths $(LEDGER_HD_PATH) --sender $(CURRENT_ADMIN) --broadcast -vvvv - -.PHONY: verify -verify: - @test "$$($(MISE_EXEC) cast call $(BALANCE_TRACKER) 'admin()(address)' --rpc-url $(L1_RPC_URL))" = "$(NEW_ADMIN)" - @echo "BalanceTracker admin is $(NEW_ADMIN)" diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/.env b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/.env deleted file mode 100644 index 65b6a6bfe..000000000 --- a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/.env +++ /dev/null @@ -1,9 +0,0 @@ -# https://github.com/base/contracts/commits/releases/v8.3.0/ -BASE_CONTRACTS_COMMIT=385f21a41f277d287db92fffe88dca41299162ea - -# Existing BalanceTracker proxy admin (EOA). -CURRENT_ADMIN=0x4672425C27A942bB27e7b9709c1b21ab89a3cA13 - -# CB_MULTISIG / INCIDENT_MULTISIG in config/sepolia.env. CHAIN-1245 named the -# pre-separation multisig 0x5dfEB066334B67355A15dc9b67317fD2a2e1f77f, which has since been replaced. -NEW_ADMIN=0x646132A1667ca7aD00d36616AFBA1A28116C770A diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/README.md b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/README.md deleted file mode 100644 index 737360842..000000000 --- a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/config/sepolia/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Transfer Sepolia `BalanceTracker` Ownership - -Status: READY TO SIGN - -## Description - -Move the admin of the Ethereum Sepolia -[`BalanceTracker`](https://sepolia.etherscan.io/address/0x8D1b5e5614300F5c7ADA01fFA4ccF8F1752D9A57) -proxy from the EOA `0x4672425C27A942bB27e7b9709c1b21ab89a3cA13` to the Base Sepolia multisig -[`0x646132A1667ca7aD00d36616AFBA1A28116C770A`](https://sepolia.etherscan.io/address/0x646132A1667ca7aD00d36616AFBA1A28116C770A). - -## Execution - -The proxy is administered by an EOA, so no multisig signature is required. The facilitator -executes the transfer with the current admin's Ledger. diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/script/TransferBalanceTrackerOwnership.s.sol b/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/script/TransferBalanceTrackerOwnership.s.sol deleted file mode 100644 index bee8d1ad5..000000000 --- a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/script/TransferBalanceTrackerOwnership.s.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.15; - -import {Script} from "forge-std/Script.sol"; - -import {Proxy} from "@base-contracts/src/universal/Proxy.sol"; - -/// @notice Moves the BalanceTracker proxy admin from the current EOA to the Base Sepolia multisig. -contract TransferBalanceTrackerOwnership is Script { - address internal immutable CURRENT_ADMIN; - address internal immutable NEW_ADMIN; - address payable internal immutable BALANCE_TRACKER; - - constructor() { - CURRENT_ADMIN = vm.envAddress("CURRENT_ADMIN"); - NEW_ADMIN = vm.envAddress("NEW_ADMIN"); - BALANCE_TRACKER = payable(vm.envAddress("BALANCE_TRACKER")); - - require(NEW_ADMIN.code.length > 0, "NEW_ADMIN has no code"); - require(_admin() == CURRENT_ADMIN, "proxy admin is not CURRENT_ADMIN"); - } - - function run() external { - vm.broadcast(CURRENT_ADMIN); - Proxy(BALANCE_TRACKER).changeAdmin(NEW_ADMIN); - - require(_admin() == NEW_ADMIN, "proxy admin is not NEW_ADMIN"); - } - - function _admin() internal returns (address) { - vm.prank(address(0)); - return Proxy(BALANCE_TRACKER).admin(); - } -} diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md b/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md new file mode 100644 index 000000000..1656198af --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md @@ -0,0 +1,61 @@ +# Task facilitator guide + +Replace the L1 `BalanceTracker`, point the L2 `FeeDisburser` at it, and move the `FeeDisburser` admin to the alias of `NEW_ADMIN`. + +Run commands from this task directory and pass `TASK_NETWORK=` on every Make command line. Inputs live in `config//.env`. Deployed addresses are written to `config//addresses.json`. + +The work happens in three phases: + +1. **Deploy on L1 from the facilitator's Ledger.** This deploys and initializes the new `BalanceTracker` proxy, then hands its admin to `NEW_ADMIN`. +2. **Deploy on L2 from the facilitator's Ledger.** This deploys the `FeeDisburser` implementation with `L1_WALLET` set to the new `BalanceTracker`. +3. **Multisig transaction from `OWNER_SAFE`.** This sends two `OptimismPortal` deposits to the `FeeDisburser` proxy: `upgradeTo(new implementation)`, then `changeAdmin(NEW_ADMIN_L2_ALIAS)`. + +## Install dependencies + +```sh +make TASK_NETWORK= deps +``` + +## Deploy + +Use the Ledger account at `LEDGER_ACCOUNT`; it needs gas on both L1 and L2. Each script simulates and checks its output before broadcasting: + +- `deploy-l1` checks the new proxy's admin, implementation, profit wallet, system addresses and targets, and that neither the proxy nor the implementation can be reinitialized. +- `deploy-l2` runs `disburseFees()` through the live `FeeDisburser` proxy with the new implementation against the live fee vaults. + +```sh +make TASK_NETWORK= deploy-l1 +make TASK_NETWORK= deploy-l2 +``` + +Commit `config//addresses.json` and the task-scoped `records/`. Each target refuses to run again once its address is recorded. + +## Generate validation files + +```sh +make TASK_NETWORK= gen-validation +``` + +This writes `config//validations/base-signer.json` for `OWNER_SAFE`. The post-check replays both deposits as the alias of `OWNER_SAFE` on an L2 fork. It then asserts the new implementation, the new admin, the new `L1_WALLET`, and an unchanged `lastDisbursementTime`. + +Check the state diff and replace any summary placeholders. Commit the validation, set the network step to `ready_to_sign`, then `collecting`, and update the `base` signature count in `status.json` as signatures arrive. + +## Execute + +Confirm the live threshold and nonce of `OWNER_SAFE`, then order the signatures by owner address and concatenate them. Set the step to `ready_to_execute`, then run: + +```sh +make TASK_NETWORK= execute SIGNATURES= +``` + +After the deposits are relayed on L2, run: + +```sh +make TASK_NETWORK= verify-l2 +``` + +Commit the final artifacts. Set `Status: EXECUTED` with the L1 transaction link in `config//README.md`, and update the step, `executed_tx`, and `last_updated` in `status.json` in the same change. Then update `BALANCE_TRACKER` in `config/.env` at the repository root to the new proxy. + +## Archive + +Keep the task active until every intended network is executed or canceled. From the repository root, run `make check-task-status`, then `make archive-task` and select this task. diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile b/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile new file mode 100644 index 000000000..506326260 --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile @@ -0,0 +1,100 @@ +include ../../../../Makefile +include $(REPO_ROOT)/Multisig.mk + +ifneq ($(origin TASK_NETWORK),command line) +$(error TASK_NETWORK is required on the command line, e.g. make TASK_NETWORK= $(MAKECMDGOALS)) +endif +ifeq ($(strip $(TASK_NETWORK)),) +$(error TASK_NETWORK must not be empty) +endif + +PROJECT_DIR := $(abspath ../..) + +include $(REPO_ROOT)/config/$(TASK_NETWORK).env +include config/$(TASK_NETWORK)/.env + +SIGNER_TOOL_PATH := $(REPO_ROOT)/signer-tool +VALIDATIONS_DIR := $(CURDIR)/config/$(TASK_NETWORK)/validations +RPC_URL := $(L1_RPC_URL) +ADDRESSES_JSON := $(CURDIR)/config/$(TASK_NETWORK)/addresses.json +TASK_ORIGIN_DIR := $(CURDIR)/config/$(TASK_NETWORK) +SIGNATURE_DIR := $(CURDIR)/signatures/$(TASK_NETWORK) +TASK_DIR := tasks/2026-10-21-replace-balance-tracker + +DEPLOY_L1_SCRIPT := $(TASK_DIR)/script/DeployBalanceTracker.s.sol:DeployBalanceTracker +DEPLOY_L2_SCRIPT := $(TASK_DIR)/script/DeployFeeDisburser.s.sol:DeployFeeDisburser +SCRIPT_NAME := $(TASK_DIR)/script/UpgradeFeeDisburser.s.sol:UpgradeFeeDisburser + +SENDER = $(shell $(MISE_EXEC) cast call $(OWNER_SAFE) "getOwners()(address[])" --rpc-url $(L1_RPC_URL) | tr -d '[]' | cut -d',' -f1) +deployed = $(shell jq -er '.$(1)' $(ADDRESSES_JSON) 2>/dev/null) +require_deployed = @jq -e '[$(1)] | all(.[]; type == "string" and test("^0x[0-9a-fA-F]{40}$$"))' "$(ADDRESSES_JSON)" >/dev/null 2>&1 || \ + { echo '$(2)'; exit 1; } + +DEPLOY_L1_ENV = PROFIT_WALLET=$(PROFIT_WALLET) \ + NEW_ADMIN=$(NEW_ADMIN) \ + SYSTEM_ADDRESS_0=$(SYSTEM_ADDRESS_0) \ + TARGET_BALANCE_0=$(TARGET_BALANCE_0) \ + SYSTEM_ADDRESS_1=$(SYSTEM_ADDRESS_1) \ + TARGET_BALANCE_1=$(TARGET_BALANCE_1) + +UPGRADE_ENV = OWNER_SAFE=$(OWNER_SAFE) \ + NEW_ADMIN=$(NEW_ADMIN) \ + NEW_ADMIN_L2_ALIAS=$(NEW_ADMIN_L2_ALIAS) \ + OPTIMISM_PORTAL=$(OPTIMISM_PORTAL) \ + FEE_DISBURSER=$(FEE_DISBURSER) \ + NEW_FEE_DISBURSER_IMPL=$(call deployed,feeDisburserImplementation) \ + NEW_BALANCE_TRACKER=$(call deployed,balanceTracker) \ + L2_RPC_URL=$(L2_RPC_URL) + +.PHONY: deps +deps: task-extra-deps + +# BalanceTracker imports OpenZeppelin upgradeable contracts through a literal lib/ path. Pin from base/contracts. +.PHONY: task-extra-deps +task-extra-deps: + cd $(PROJECT_DIR) && $(MISE_EXEC) forge install --no-git \ + github.com/OpenZeppelin/openzeppelin-contracts-upgradeable@0a2cb9a445c365870ed7a8ab461b12acf3e27d63 + +## +# Deployment (facilitator Ledger, no multisig signatures) +## +.PHONY: deploy-l1 +deploy-l1: + @test ! -f "$(ADDRESSES_JSON)" || { echo '$(ADDRESSES_JSON) already exists; BalanceTracker is already deployed'; exit 1; } + echo '{}' > "$(ADDRESSES_JSON)" + cd $(PROJECT_DIR) && $(DEPLOY_L1_ENV) ADDRESSES_JSON=$(ADDRESSES_JSON) \ + $(MISE_EXEC) forge script --rpc-url $(L1_RPC_URL) $(DEPLOY_L1_SCRIPT) \ + --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast -vvvv + +.PHONY: deploy-l2 +deploy-l2: + $(call require_deployed,.balanceTracker,Run deploy-l1 before deploy-l2) + @jq -e '.feeDisburserImplementation == null' "$(ADDRESSES_JSON)" >/dev/null || { echo 'FeeDisburser implementation is already deployed'; exit 1; } + cd $(PROJECT_DIR) && FEE_DISBURSER=$(FEE_DISBURSER) FEE_DISBURSEMENT_INTERVAL=$(FEE_DISBURSEMENT_INTERVAL) \ + ADDRESSES_JSON=$(ADDRESSES_JSON) \ + $(MISE_EXEC) forge script --rpc-url $(L2_RPC_URL) $(DEPLOY_L2_SCRIPT) \ + --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast -vvvv + +.PHONY: check-deployments +check-deployments: + $(call require_deployed,.balanceTracker$(comma) .feeDisburserImplementation,Run deploy-l1 and deploy-l2 first) + +## +# Validation and execution (OWNER_SAFE signatures) +## +.PHONY: gen-validation +gen-validation: check-deployments deps-signer-tool + mkdir -p $(VALIDATIONS_DIR) + $(call GEN_VALIDATION,$(SCRIPT_NAME),,$(SENDER),base-signer.json,$(UPGRADE_ENV)) + +.PHONY: execute +execute: check-deployments + export $(UPGRADE_ENV); $(call MULTISIG_EXECUTE,$(SIGNATURES)) + +# Run after the deposits are relayed on L2. +.PHONY: verify-l2 +verify-l2: check-deployments + @test "$$($(MISE_EXEC) cast call $(FEE_DISBURSER) 'implementation()(address)' --from 0x0000000000000000000000000000000000000000 --rpc-url $(L2_RPC_URL))" = "$$($(MISE_EXEC) cast to-check-sum-address $(call deployed,feeDisburserImplementation))" \ + && echo 'FeeDisburser implementation upgraded' || { echo 'FeeDisburser implementation not upgraded'; exit 1; } + @test "$$($(MISE_EXEC) cast call $(FEE_DISBURSER) 'admin()(address)' --from 0x0000000000000000000000000000000000000000 --rpc-url $(L2_RPC_URL))" = "$$($(MISE_EXEC) cast to-check-sum-address $(NEW_ADMIN_L2_ALIAS))" \ + && echo 'FeeDisburser admin moved' || { echo 'FeeDisburser admin not moved'; exit 1; } diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/.env b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/.env new file mode 100644 index 000000000..4d786bbce --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/.env @@ -0,0 +1,16 @@ +BASE_CONTRACTS_COMMIT=8c21f6d08a36b4059ae2bb8938f1e7e758a0e962 + +# New L1 BalanceTracker. NEW_ADMIN becomes its proxy admin; PROFIT_WALLET receives the excess fees. +NEW_ADMIN=0x646132A1667ca7aD00d36616AFBA1A28116C770A +PROFIT_WALLET=0x646132A1667ca7aD00d36616AFBA1A28116C770A +# Proposer (config/sepolia.env PROPOSER), refilled to 200 ETH. +SYSTEM_ADDRESS_0=0xdb84125f2f4229c81c579f41bc129c71b174eb58 +TARGET_BALANCE_0=200000000000000000000 +# Batcher (SystemConfig.batcherHash), refilled to 1000 ETH. +SYSTEM_ADDRESS_1=0xfc56E7272EEBBBA5bC6c544e159483C4a38f8bA3 +TARGET_BALANCE_1=1000000000000000000000 + +# L2 FeeDisburser. OWNER_SAFE's alias is its current proxy admin; the task moves it to NEW_ADMIN's alias. +OWNER_SAFE=0x5dfEB066334B67355A15dc9b67317fD2a2e1f77f +NEW_ADMIN_L2_ALIAS=0x757232a1667ca7ad00D36616aFbA1A28116c881B +FEE_DISBURSEMENT_INTERVAL=604800 diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md new file mode 100644 index 000000000..b998320eb --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md @@ -0,0 +1,22 @@ +# 2026-10-21-replace-balance-tracker + +Status: READY TO SIGN + +## Description + +The Sepolia `BalanceTracker` is admined by an inaccessible EOA, so a new `BalanceTracker` has been deployed on L1 with `0x646132A1667ca7aD00d36616AFBA1A28116C770A` as its proxy admin and profit wallet. It refills the proposer to 200 ETH and the batcher to 1000 ETH. + +This transaction from `0x5dfEB066334B67355A15dc9b67317fD2a2e1f77f` sends two `OptimismPortal` deposits to the Base Sepolia `FeeDisburser` proxy `0x76355A67fCBCDE6F9a69409A8EAd5EaA9D8d875d`: + +1. `upgradeTo` a new implementation whose `L1_WALLET` is the new `BalanceTracker` (see `addresses.json`). +2. `changeAdmin` to `0x757232a1667ca7ad00D36616aFbA1A28116c881B`, the L2 alias of `0x646132A1667ca7aD00d36616AFBA1A28116C770A`. + +## Sign + +From the repository root: + +```sh +make TASK_NETWORK=sepolia sign-task +``` + +Select `2026-10-21-replace-balance-tracker` for sepolia, sign, and send the signature to the facilitator. diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol new file mode 100644 index 000000000..153b465ab --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import {Script, console} from "forge-std/Script.sol"; + +import {BalanceTracker} from "@base-contracts/src/L1/BalanceTracker.sol"; +import {Proxy} from "@base-contracts/src/universal/Proxy.sol"; + +/// @notice Deploys and initializes a new BalanceTracker proxy on L1, then hands its admin to NEW_ADMIN. +/// @dev The deployer is the proxy admin only until `changeAdmin` at the end of the same broadcast. +contract DeployBalanceTracker is Script { + address payable internal immutable PROFIT_WALLET; + address internal immutable NEW_ADMIN; + address payable internal immutable SYSTEM_ADDRESS_0; + uint256 internal immutable TARGET_BALANCE_0; + address payable internal immutable SYSTEM_ADDRESS_1; + uint256 internal immutable TARGET_BALANCE_1; + + // Deployment output written to addresses.json. + address public balanceTrackerImpl; + address payable public balanceTracker; + + constructor() { + PROFIT_WALLET = payable(vm.envAddress("PROFIT_WALLET")); + NEW_ADMIN = vm.envAddress("NEW_ADMIN"); + SYSTEM_ADDRESS_0 = payable(vm.envAddress("SYSTEM_ADDRESS_0")); + TARGET_BALANCE_0 = vm.envUint("TARGET_BALANCE_0"); + SYSTEM_ADDRESS_1 = payable(vm.envAddress("SYSTEM_ADDRESS_1")); + TARGET_BALANCE_1 = vm.envUint("TARGET_BALANCE_1"); + + require(NEW_ADMIN.code.length > 0, "NEW_ADMIN has no code"); + } + + function run() external { + address payable[] memory systemAddresses = new address payable[](2); + systemAddresses[0] = SYSTEM_ADDRESS_0; + systemAddresses[1] = SYSTEM_ADDRESS_1; + uint256[] memory targetBalances = new uint256[](2); + targetBalances[0] = TARGET_BALANCE_0; + targetBalances[1] = TARGET_BALANCE_1; + + vm.startBroadcast(); + (, address deployer,) = vm.readCallers(); + + balanceTrackerImpl = address(new BalanceTracker(PROFIT_WALLET)); + Proxy proxy = new Proxy(deployer); + proxy.upgradeToAndCall( + balanceTrackerImpl, abi.encodeCall(BalanceTracker.initialize, (systemAddresses, targetBalances)) + ); + proxy.changeAdmin(NEW_ADMIN); + + vm.stopBroadcast(); + + balanceTracker = payable(address(proxy)); + _postChecks(proxy); + + console.log("BalanceTracker implementation:", balanceTrackerImpl); + console.log("BalanceTracker proxy:", balanceTracker); + + string memory path = vm.envString("ADDRESSES_JSON"); + vm.writeJson(vm.toString(balanceTrackerImpl), path, ".balanceTrackerImplementation"); + vm.writeJson(vm.toString(balanceTracker), path, ".balanceTracker"); + } + + function _postChecks(Proxy proxy) internal { + vm.startPrank(address(0)); + require(proxy.admin() == NEW_ADMIN, "proxy admin mismatch"); + require(proxy.implementation() == balanceTrackerImpl, "implementation mismatch"); + vm.stopPrank(); + + BalanceTracker tracker = BalanceTracker(balanceTracker); + require(tracker.PROFIT_WALLET() == PROFIT_WALLET, "profit wallet mismatch"); + require(tracker.systemAddresses(0) == SYSTEM_ADDRESS_0, "system address 0 mismatch"); + require(tracker.systemAddresses(1) == SYSTEM_ADDRESS_1, "system address 1 mismatch"); + require(tracker.targetBalances(0) == TARGET_BALANCE_0, "target balance 0 mismatch"); + require(tracker.targetBalances(1) == TARGET_BALANCE_1, "target balance 1 mismatch"); + + address payable[] memory none = new address payable[](0); + (bool ok,) = balanceTracker.call(abi.encodeCall(BalanceTracker.initialize, (none, new uint256[](0)))); + require(!ok, "proxy can be reinitialized"); + (ok,) = balanceTrackerImpl.call(abi.encodeCall(BalanceTracker.initialize, (none, new uint256[](0)))); + require(!ok, "implementation can be initialized"); + } +} diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol new file mode 100644 index 000000000..6cd81c5fe --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +import {Script, console} from "forge-std/Script.sol"; + +import {FeeDisburser} from "@base-contracts/src/L2/FeeDisburser.sol"; + +/// @notice Deploys a FeeDisburser implementation on L2 that bridges fees to the new L1 BalanceTracker. +contract DeployFeeDisburser is Script { + bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + + address payable internal immutable FEE_DISBURSER; + address internal immutable BALANCE_TRACKER; + uint256 internal immutable FEE_DISBURSEMENT_INTERVAL; + + // Deployment output written to addresses.json. + address public feeDisburserImpl; + + constructor() { + FEE_DISBURSER = payable(vm.envAddress("FEE_DISBURSER")); + FEE_DISBURSEMENT_INTERVAL = vm.envUint("FEE_DISBURSEMENT_INTERVAL"); + BALANCE_TRACKER = vm.parseJsonAddress(vm.readFile(vm.envString("ADDRESSES_JSON")), ".balanceTracker"); + + require( + FeeDisburser(FEE_DISBURSER).FEE_DISBURSEMENT_INTERVAL() == FEE_DISBURSEMENT_INTERVAL, + "interval differs from live FeeDisburser" + ); + } + + function run() external { + vm.startBroadcast(); + feeDisburserImpl = address(new FeeDisburser(BALANCE_TRACKER, FEE_DISBURSEMENT_INTERVAL)); + vm.stopBroadcast(); + + FeeDisburser impl = FeeDisburser(payable(feeDisburserImpl)); + require(impl.L1_WALLET() == BALANCE_TRACKER, "L1_WALLET mismatch"); + require(impl.FEE_DISBURSEMENT_INTERVAL() == FEE_DISBURSEMENT_INTERVAL, "interval mismatch"); + _checkDisbursement(); + + console.log("FeeDisburser implementation:", feeDisburserImpl); + vm.writeJson(vm.toString(feeDisburserImpl), vm.envString("ADDRESSES_JSON"), ".feeDisburserImplementation"); + } + + /// @dev Runs disburseFees() through the live proxy with the new implementation against the live fee vaults. + function _checkDisbursement() internal { + uint256 snapshot = vm.snapshotState(); + FeeDisburser proxy = FeeDisburser(FEE_DISBURSER); + vm.store(FEE_DISBURSER, IMPLEMENTATION_SLOT, bytes32(uint256(uint160(feeDisburserImpl)))); + uint256 nextDisbursement = proxy.lastDisbursementTime() + FEE_DISBURSEMENT_INTERVAL; + if (block.timestamp < nextDisbursement) vm.warp(nextDisbursement); + proxy.disburseFees(); + vm.revertToState(snapshot); + } +} diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol new file mode 100644 index 000000000..4c8894f52 --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import {Vm, VmSafe} from "forge-std/Vm.sol"; + +import {IOptimismPortal2} from "interfaces/L1/IOptimismPortal2.sol"; +import {IProxy} from "interfaces/universal/IProxy.sol"; +import {AddressAliasHelper} from "@base-contracts/src/vendor/AddressAliasHelper.sol"; + +import {MultisigScript, Enum} from "@base-contracts/scripts/universal/MultisigScript.sol"; +import {Simulation} from "@base-contracts/scripts/universal/Simulation.sol"; + +/// @dev FeeDisburser is compiled with 0.8.25, so this script reads it through a minimal interface. +interface IFeeDisburser { + function L1_WALLET() external view returns (address); + function FEE_DISBURSEMENT_INTERVAL() external view returns (uint256); + function lastDisbursementTime() external view returns (uint256); +} + +/// @notice Upgrades the L2 FeeDisburser to bridge to the new L1 BalanceTracker and moves its admin to the +/// alias of NEW_ADMIN. The current admin is the alias of OWNER_SAFE, so both calls are L1 deposits. +contract UpgradeFeeDisburser is MultisigScript { + // Each deposit calls the FeeDisburser proxy directly so it sees the aliased owner. The L1 simulation cannot + // execute deposits, so the post-check replays them on an L2 fork in order. + uint64 internal constant L2_GAS_LIMIT = 100_000; + + address internal immutable OWNER_SAFE; + address internal immutable NEW_ADMIN; + address internal immutable OPTIMISM_PORTAL; + address internal immutable FEE_DISBURSER; + address internal immutable FEE_DISBURSER_IMPL; + address internal immutable BALANCE_TRACKER; + uint256 internal immutable L2_FORK; + + constructor() { + OWNER_SAFE = vm.envAddress("OWNER_SAFE"); + NEW_ADMIN = vm.envAddress("NEW_ADMIN"); + OPTIMISM_PORTAL = vm.envAddress("OPTIMISM_PORTAL"); + FEE_DISBURSER = vm.envAddress("FEE_DISBURSER"); + FEE_DISBURSER_IMPL = vm.envAddress("NEW_FEE_DISBURSER_IMPL"); + BALANCE_TRACKER = vm.envAddress("NEW_BALANCE_TRACKER"); + L2_FORK = vm.createFork(vm.envString("L2_RPC_URL")); + + require( + vm.envAddress("NEW_ADMIN_L2_ALIAS") == AddressAliasHelper.applyL1ToL2Alias(NEW_ADMIN), + "NEW_ADMIN_L2_ALIAS is not the alias of NEW_ADMIN" + ); + } + + function setUp() public { + require(!IOptimismPortal2(payable(OPTIMISM_PORTAL)).paused(), "optimism portal paused"); + require(BALANCE_TRACKER.code.length > 0, "BalanceTracker not deployed"); + require(NEW_ADMIN.code.length > 0, "NEW_ADMIN has no code"); + require(_admin(BALANCE_TRACKER) == NEW_ADMIN, "BalanceTracker admin is not NEW_ADMIN"); + + uint256 l1Fork = vm.activeFork(); + vm.selectFork(L2_FORK); + require(_admin(FEE_DISBURSER) == AddressAliasHelper.applyL1ToL2Alias(OWNER_SAFE), "unexpected L2 admin"); + require(FEE_DISBURSER_IMPL.code.length > 0, "FeeDisburser implementation not deployed"); + require(IFeeDisburser(FEE_DISBURSER_IMPL).L1_WALLET() == BALANCE_TRACKER, "implementation L1_WALLET mismatch"); + require( + IFeeDisburser(FEE_DISBURSER_IMPL).FEE_DISBURSEMENT_INTERVAL() + == IFeeDisburser(FEE_DISBURSER).FEE_DISBURSEMENT_INTERVAL(), + "implementation interval mismatch" + ); + vm.selectFork(l1Fork); + } + + function _buildCalls() internal view override returns (Call[] memory calls) { + bytes[] memory l2Calls = _l2Calls(); + calls = new Call[](l2Calls.length); + for (uint256 i; i < l2Calls.length; i++) { + calls[i] = Call({ + operation: Enum.Operation.Call, + target: OPTIMISM_PORTAL, + data: abi.encodeCall( + IOptimismPortal2.depositTransaction, (FEE_DISBURSER, 0, L2_GAS_LIMIT, false, l2Calls[i]) + ), + value: 0 + }); + } + } + + function _postCheck(Vm.AccountAccess[] memory accesses, Simulation.Payload memory) internal override { + _assertDeposits(accesses); + + uint256 l1Fork = vm.activeFork(); + vm.selectFork(L2_FORK); + uint256 lastDisbursementTime = IFeeDisburser(FEE_DISBURSER).lastDisbursementTime(); + + bytes[] memory l2Calls = _l2Calls(); + for (uint256 i; i < l2Calls.length; i++) { + vm.prank(AddressAliasHelper.applyL1ToL2Alias(OWNER_SAFE)); + (bool success,) = FEE_DISBURSER.call{gas: L2_GAS_LIMIT}(l2Calls[i]); + require(success, "L2 call reverted"); + } + + require(_implementation(FEE_DISBURSER) == FEE_DISBURSER_IMPL, "implementation not upgraded"); + require(_admin(FEE_DISBURSER) == AddressAliasHelper.applyL1ToL2Alias(NEW_ADMIN), "admin not moved"); + require(IFeeDisburser(FEE_DISBURSER).L1_WALLET() == BALANCE_TRACKER, "L1_WALLET mismatch"); + require( + IFeeDisburser(FEE_DISBURSER).lastDisbursementTime() == lastDisbursementTime, "disbursement time changed" + ); + vm.selectFork(l1Fork); + } + + function _assertDeposits(Vm.AccountAccess[] memory accesses) internal view { + uint256 deposits; + for (uint256 i; i < accesses.length; i++) { + Vm.AccountAccess memory access = accesses[i]; + if (access.kind != VmSafe.AccountAccessKind.Call || access.account != OPTIMISM_PORTAL) continue; + if (access.data.length < 4 || bytes4(access.data) != IOptimismPortal2.depositTransaction.selector) { + continue; + } + require(access.accessor == OWNER_SAFE, "deposit not sent by OWNER_SAFE"); + require(!access.reverted, "deposit reverted"); + deposits++; + } + require(deposits == 2, "unexpected deposit count"); + } + + function _l2Calls() internal view returns (bytes[] memory calls) { + calls = new bytes[](2); + calls[0] = abi.encodeCall(IProxy.upgradeTo, (FEE_DISBURSER_IMPL)); + calls[1] = abi.encodeCall(IProxy.changeAdmin, (AddressAliasHelper.applyL1ToL2Alias(NEW_ADMIN))); + } + + function _admin(address proxy) internal returns (address) { + vm.prank(address(0)); + return IProxy(payable(proxy)).admin(); + } + + function _implementation(address proxy) internal returns (address) { + vm.prank(address(0)); + return IProxy(payable(proxy)).implementation(); + } + + function _ownerSafe() internal view override returns (address) { + return OWNER_SAFE; + } +} diff --git a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/status.json b/active/evm/tasks/2026-10-21-replace-balance-tracker/status.json similarity index 54% rename from active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/status.json rename to active/evm/tasks/2026-10-21-replace-balance-tracker/status.json index c292a6b56..673e5b6ea 100644 --- a/active/evm/tasks/2026-10-06-transfer-balance-tracker-ownership/status.json +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/status.json @@ -1,15 +1,20 @@ { "schema_version": 1, - "task": "2026-10-06-transfer-balance-tracker-ownership", + "task": "2026-10-21-replace-balance-tracker", "kind": "active", "networks": { "sepolia": { "step": "review", "pr": "https://github.com/base/contract-deployments/pull/807", "blocksec_ticket": null, - "signatures": {}, + "signatures": { + "base": { + "collected": 0, + "required": 3 + } + }, "executed_tx": null } }, - "last_updated": "2026-10-21T18:16:45Z" + "last_updated": "2026-10-21T19:30:41Z" } From 36709f88a10670a3bf76c8fe31495d2ffff0690c Mon Sep 17 00:00:00 2001 From: Mihir Wadekar Date: Wed, 21 Oct 2026 12:53:51 -0700 Subject: [PATCH 05/10] fix(sepolia): tighten BalanceTracker deploy checks and Makefile failure cleanup Co-authored-by: Cursor --- .../2026-10-21-replace-balance-tracker/Makefile | 7 ++++--- .../script/DeployBalanceTracker.s.sol | 12 ++++++++++++ .../script/DeployFeeDisburser.s.sol | 1 + .../script/UpgradeFeeDisburser.s.sol | 6 ++++-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile b/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile index 506326260..ebfb84beb 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile @@ -61,10 +61,10 @@ task-extra-deps: .PHONY: deploy-l1 deploy-l1: @test ! -f "$(ADDRESSES_JSON)" || { echo '$(ADDRESSES_JSON) already exists; BalanceTracker is already deployed'; exit 1; } - echo '{}' > "$(ADDRESSES_JSON)" + @echo '{}' > "$(ADDRESSES_JSON)" cd $(PROJECT_DIR) && $(DEPLOY_L1_ENV) ADDRESSES_JSON=$(ADDRESSES_JSON) \ $(MISE_EXEC) forge script --rpc-url $(L1_RPC_URL) $(DEPLOY_L1_SCRIPT) \ - --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast -vvvv + --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast -vvvv || { rm -f "$(ADDRESSES_JSON)"; exit 1; } .PHONY: deploy-l2 deploy-l2: @@ -73,7 +73,8 @@ deploy-l2: cd $(PROJECT_DIR) && FEE_DISBURSER=$(FEE_DISBURSER) FEE_DISBURSEMENT_INTERVAL=$(FEE_DISBURSEMENT_INTERVAL) \ ADDRESSES_JSON=$(ADDRESSES_JSON) \ $(MISE_EXEC) forge script --rpc-url $(L2_RPC_URL) $(DEPLOY_L2_SCRIPT) \ - --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast -vvvv + --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast -vvvv || \ + { jq 'del(.feeDisburserImplementation)' "$(ADDRESSES_JSON)" > "$(ADDRESSES_JSON).tmp" && mv "$(ADDRESSES_JSON).tmp" "$(ADDRESSES_JSON)"; exit 1; } .PHONY: check-deployments check-deployments: diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol index 153b465ab..8b2f4474f 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol @@ -74,11 +74,23 @@ contract DeployBalanceTracker is Script { require(tracker.systemAddresses(1) == SYSTEM_ADDRESS_1, "system address 1 mismatch"); require(tracker.targetBalances(0) == TARGET_BALANCE_0, "target balance 0 mismatch"); require(tracker.targetBalances(1) == TARGET_BALANCE_1, "target balance 1 mismatch"); + (bool hasThird,) = balanceTracker.staticcall(abi.encodeWithSelector(tracker.systemAddresses.selector, 2)); + require(!hasThird, "unexpected system address count"); address payable[] memory none = new address payable[](0); (bool ok,) = balanceTracker.call(abi.encodeCall(BalanceTracker.initialize, (none, new uint256[](0)))); require(!ok, "proxy can be reinitialized"); (ok,) = balanceTrackerImpl.call(abi.encodeCall(BalanceTracker.initialize, (none, new uint256[](0)))); require(!ok, "implementation can be initialized"); + + uint256 snapshot = vm.snapshotState(); + uint256 profitBefore = PROFIT_WALLET.balance; + vm.deal(balanceTracker, TARGET_BALANCE_0 + TARGET_BALANCE_1 + 1 ether); + tracker.processFees(); + require(balanceTracker.balance == 0, "fees not processed"); + require(SYSTEM_ADDRESS_0.balance >= TARGET_BALANCE_0, "system address 0 not refilled"); + require(SYSTEM_ADDRESS_1.balance >= TARGET_BALANCE_1, "system address 1 not refilled"); + require(PROFIT_WALLET.balance >= profitBefore + 1 ether, "profit not sent"); + vm.revertToState(snapshot); } } diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol index 6cd81c5fe..6c9b658c4 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol @@ -49,6 +49,7 @@ contract DeployFeeDisburser is Script { uint256 nextDisbursement = proxy.lastDisbursementTime() + FEE_DISBURSEMENT_INTERVAL; if (block.timestamp < nextDisbursement) vm.warp(nextDisbursement); proxy.disburseFees(); + require(FEE_DISBURSER.balance == 0, "fees not disbursed"); vm.revertToState(snapshot); } } diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol index 4c8894f52..880efbc4c 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol @@ -26,6 +26,7 @@ contract UpgradeFeeDisburser is MultisigScript { address internal immutable OWNER_SAFE; address internal immutable NEW_ADMIN; + address internal immutable NEW_ADMIN_L2_ALIAS; address internal immutable OPTIMISM_PORTAL; address internal immutable FEE_DISBURSER; address internal immutable FEE_DISBURSER_IMPL; @@ -35,6 +36,7 @@ contract UpgradeFeeDisburser is MultisigScript { constructor() { OWNER_SAFE = vm.envAddress("OWNER_SAFE"); NEW_ADMIN = vm.envAddress("NEW_ADMIN"); + NEW_ADMIN_L2_ALIAS = vm.envAddress("NEW_ADMIN_L2_ALIAS"); OPTIMISM_PORTAL = vm.envAddress("OPTIMISM_PORTAL"); FEE_DISBURSER = vm.envAddress("FEE_DISBURSER"); FEE_DISBURSER_IMPL = vm.envAddress("NEW_FEE_DISBURSER_IMPL"); @@ -42,7 +44,7 @@ contract UpgradeFeeDisburser is MultisigScript { L2_FORK = vm.createFork(vm.envString("L2_RPC_URL")); require( - vm.envAddress("NEW_ADMIN_L2_ALIAS") == AddressAliasHelper.applyL1ToL2Alias(NEW_ADMIN), + NEW_ADMIN_L2_ALIAS == AddressAliasHelper.applyL1ToL2Alias(NEW_ADMIN), "NEW_ADMIN_L2_ALIAS is not the alias of NEW_ADMIN" ); } @@ -122,7 +124,7 @@ contract UpgradeFeeDisburser is MultisigScript { function _l2Calls() internal view returns (bytes[] memory calls) { calls = new bytes[](2); calls[0] = abi.encodeCall(IProxy.upgradeTo, (FEE_DISBURSER_IMPL)); - calls[1] = abi.encodeCall(IProxy.changeAdmin, (AddressAliasHelper.applyL1ToL2Alias(NEW_ADMIN))); + calls[1] = abi.encodeCall(IProxy.changeAdmin, (NEW_ADMIN_L2_ALIAS)); } function _admin(address proxy) internal returns (address) { From a42a2b6dd305a3d142af7308ffc5d6089afab3d8 Mon Sep 17 00:00:00 2001 From: Mihir Wadekar Date: Thu, 22 Oct 2026 14:34:09 -0700 Subject: [PATCH 06/10] fix(sepolia): address review on BalanceTracker replacement (CHAIN-1245) - 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 --- .../FACILITATOR.md | 15 ++++++- .../Makefile | 18 +++++--- .../script/DeployBalanceTracker.s.sol | 41 ++++++++++++------- .../script/DeployFeeDisburser.s.sol | 23 ++++++++++- 4 files changed, 73 insertions(+), 24 deletions(-) diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md b/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md index 1656198af..2f2b87b04 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md @@ -20,8 +20,8 @@ make TASK_NETWORK= deps Use the Ledger account at `LEDGER_ACCOUNT`; it needs gas on both L1 and L2. Each script simulates and checks its output before broadcasting: -- `deploy-l1` checks the new proxy's admin, implementation, profit wallet, system addresses and targets, and that neither the proxy nor the implementation can be reinitialized. -- `deploy-l2` runs `disburseFees()` through the live `FeeDisburser` proxy with the new implementation against the live fee vaults. +- `deploy-l1` checks the new proxy's admin, implementation, profit wallet, system addresses and targets. It also checks that `initialize` with the real arguments reverts with the initializer guard on both the proxy and the implementation, and that `processFees()` refills both system addresses and sends the rest to the profit wallet. +- `deploy-l2` runs `disburseFees()` through the live `FeeDisburser` proxy with the new implementation. Each fee vault is topped up to its minimum withdrawal amount first, so every vault withdrawal and the bridge to the new `BalanceTracker` always run. ```sh make TASK_NETWORK= deploy-l1 @@ -30,6 +30,17 @@ make TASK_NETWORK= deploy-l2 Commit `config//addresses.json` and the task-scoped `records/`. Each target refuses to run again once its address is recorded. +### If a deploy fails partway + +The scripts write `addresses.json` during simulation, before broadcasting. If the broadcast then fails, some transactions may be onchain and others not. For example, `deploy-l1` can stop before `changeAdmin`, leaving the new proxy admined by the facilitator's Ledger. Don't delete `addresses.json` or start a fresh deployment. Finish the recorded broadcast instead: + +```sh +make TASK_NETWORK= deploy-l1 RESUME=1 +make TASK_NETWORK= deploy-l2 RESUME=1 +``` + +`--resume` only re-sends the unconfirmed transactions from `records/` and doesn't re-run the script's checks. Afterwards, confirm onchain that the `BalanceTracker` proxy's `admin()` is `NEW_ADMIN` and that every address in `addresses.json` has code. `gen-validation` also refuses to run until the `BalanceTracker` admin is `NEW_ADMIN`. Delete `addresses.json` only if `records/` shows that no transaction was sent. + ## Generate validation files ```sh diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile b/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile index ebfb84beb..b0099475b 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile @@ -58,23 +58,31 @@ task-extra-deps: ## # Deployment (facilitator Ledger, no multisig signatures) ## +# The scripts write addresses.json during simulation, before broadcasting, so a failed broadcast can leave only +# some transactions onchain. addresses.json is kept as the checkpoint; RESUME=1 re-sends the unconfirmed +# transactions from the task-scoped broadcast record instead of starting a fresh deployment. +PARTIAL_DEPLOY = Deploy failed; $(ADDRESSES_JSON) is kept. Finish the broadcast with RESUME=1, see FACILITATOR.md. + .PHONY: deploy-l1 deploy-l1: - @test ! -f "$(ADDRESSES_JSON)" || { echo '$(ADDRESSES_JSON) already exists; BalanceTracker is already deployed'; exit 1; } +ifndef RESUME + @test ! -f "$(ADDRESSES_JSON)" || { echo '$(ADDRESSES_JSON) already exists; use RESUME=1 to finish a failed deploy-l1'; exit 1; } @echo '{}' > "$(ADDRESSES_JSON)" +endif cd $(PROJECT_DIR) && $(DEPLOY_L1_ENV) ADDRESSES_JSON=$(ADDRESSES_JSON) \ $(MISE_EXEC) forge script --rpc-url $(L1_RPC_URL) $(DEPLOY_L1_SCRIPT) \ - --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast -vvvv || { rm -f "$(ADDRESSES_JSON)"; exit 1; } + --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast $(if $(RESUME),--resume) -vvvv || { echo "$(PARTIAL_DEPLOY)"; exit 1; } .PHONY: deploy-l2 deploy-l2: $(call require_deployed,.balanceTracker,Run deploy-l1 before deploy-l2) - @jq -e '.feeDisburserImplementation == null' "$(ADDRESSES_JSON)" >/dev/null || { echo 'FeeDisburser implementation is already deployed'; exit 1; } +ifndef RESUME + @jq -e '.feeDisburserImplementation == null' "$(ADDRESSES_JSON)" >/dev/null || { echo 'FeeDisburser implementation already recorded; use RESUME=1 to finish a failed deploy-l2'; exit 1; } +endif cd $(PROJECT_DIR) && FEE_DISBURSER=$(FEE_DISBURSER) FEE_DISBURSEMENT_INTERVAL=$(FEE_DISBURSEMENT_INTERVAL) \ ADDRESSES_JSON=$(ADDRESSES_JSON) \ $(MISE_EXEC) forge script --rpc-url $(L2_RPC_URL) $(DEPLOY_L2_SCRIPT) \ - --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast -vvvv || \ - { jq 'del(.feeDisburserImplementation)' "$(ADDRESSES_JSON)" > "$(ADDRESSES_JSON).tmp" && mv "$(ADDRESSES_JSON).tmp" "$(ADDRESSES_JSON)"; exit 1; } + --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast $(if $(RESUME),--resume) -vvvv || { echo "$(PARTIAL_DEPLOY)"; exit 1; } .PHONY: check-deployments check-deployments: diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol index 8b2f4474f..3d54982a9 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol @@ -32,21 +32,12 @@ contract DeployBalanceTracker is Script { } function run() external { - address payable[] memory systemAddresses = new address payable[](2); - systemAddresses[0] = SYSTEM_ADDRESS_0; - systemAddresses[1] = SYSTEM_ADDRESS_1; - uint256[] memory targetBalances = new uint256[](2); - targetBalances[0] = TARGET_BALANCE_0; - targetBalances[1] = TARGET_BALANCE_1; - vm.startBroadcast(); (, address deployer,) = vm.readCallers(); balanceTrackerImpl = address(new BalanceTracker(PROFIT_WALLET)); Proxy proxy = new Proxy(deployer); - proxy.upgradeToAndCall( - balanceTrackerImpl, abi.encodeCall(BalanceTracker.initialize, (systemAddresses, targetBalances)) - ); + proxy.upgradeToAndCall(balanceTrackerImpl, _initializeCall()); proxy.changeAdmin(NEW_ADMIN); vm.stopBroadcast(); @@ -77,11 +68,8 @@ contract DeployBalanceTracker is Script { (bool hasThird,) = balanceTracker.staticcall(abi.encodeWithSelector(tracker.systemAddresses.selector, 2)); require(!hasThird, "unexpected system address count"); - address payable[] memory none = new address payable[](0); - (bool ok,) = balanceTracker.call(abi.encodeCall(BalanceTracker.initialize, (none, new uint256[](0)))); - require(!ok, "proxy can be reinitialized"); - (ok,) = balanceTrackerImpl.call(abi.encodeCall(BalanceTracker.initialize, (none, new uint256[](0)))); - require(!ok, "implementation can be initialized"); + _assertInitializerLocked(balanceTracker, "proxy can be reinitialized"); + _assertInitializerLocked(balanceTrackerImpl, "implementation can be initialized"); uint256 snapshot = vm.snapshotState(); uint256 profitBefore = PROFIT_WALLET.balance; @@ -93,4 +81,27 @@ contract DeployBalanceTracker is Script { require(PROFIT_WALLET.balance >= profitBefore + 1 ether, "profit not sent"); vm.revertToState(snapshot); } + + /// @dev Uses the real initialize arguments, so the only possible revert is the initializer guard. + function _assertInitializerLocked(address target, string memory message) internal { + (bool ok, bytes memory reason) = target.call(_initializeCall()); + require(!ok, message); + require( + keccak256(reason) + == keccak256( + abi.encodeWithSignature("Error(string)", "Initializable: contract is already initialized") + ), + "unexpected initialize revert" + ); + } + + function _initializeCall() internal view returns (bytes memory) { + address payable[] memory systemAddresses = new address payable[](2); + systemAddresses[0] = SYSTEM_ADDRESS_0; + systemAddresses[1] = SYSTEM_ADDRESS_1; + uint256[] memory targetBalances = new uint256[](2); + targetBalances[0] = TARGET_BALANCE_0; + targetBalances[1] = TARGET_BALANCE_1; + return abi.encodeCall(BalanceTracker.initialize, (systemAddresses, targetBalances)); + } } diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol index 6c9b658c4..7c4f02161 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol @@ -3,7 +3,9 @@ pragma solidity 0.8.25; import {Script, console} from "forge-std/Script.sol"; +import {IFeeVault} from "interfaces/L2/IFeeVault.sol"; import {FeeDisburser} from "@base-contracts/src/L2/FeeDisburser.sol"; +import {Predeploys} from "@base-contracts/src/libraries/Predeploys.sol"; /// @notice Deploys a FeeDisburser implementation on L2 that bridges fees to the new L1 BalanceTracker. contract DeployFeeDisburser is Script { @@ -41,15 +43,32 @@ contract DeployFeeDisburser is Script { vm.writeJson(vm.toString(feeDisburserImpl), vm.envString("ADDRESSES_JSON"), ".feeDisburserImplementation"); } - /// @dev Runs disburseFees() through the live proxy with the new implementation against the live fee vaults. + /// @dev Runs disburseFees() through the live proxy with the new implementation. Each vault is topped up to its + /// minimum withdrawal amount so the withdraw and bridge paths run regardless of live vault balances. function _checkDisbursement() internal { uint256 snapshot = vm.snapshotState(); FeeDisburser proxy = FeeDisburser(FEE_DISBURSER); vm.store(FEE_DISBURSER, IMPLEMENTATION_SLOT, bytes32(uint256(uint160(feeDisburserImpl)))); uint256 nextDisbursement = proxy.lastDisbursementTime() + FEE_DISBURSEMENT_INTERVAL; if (block.timestamp < nextDisbursement) vm.warp(nextDisbursement); + + address payable[3] memory vaults = [ + payable(Predeploys.SEQUENCER_FEE_WALLET), + payable(Predeploys.BASE_FEE_VAULT), + payable(Predeploys.L1_FEE_VAULT) + ]; + for (uint256 i; i < vaults.length; i++) { + uint256 minimum = IFeeVault(vaults[i]).MIN_WITHDRAWAL_AMOUNT(); + if (vaults[i].balance < minimum) vm.deal(vaults[i], minimum); + } + proxy.disburseFees(); - require(FEE_DISBURSER.balance == 0, "fees not disbursed"); + + for (uint256 i; i < vaults.length; i++) { + require(vaults[i].balance == 0, "vault not withdrawn"); + } + require(FEE_DISBURSER.balance == 0, "fees not bridged"); + require(proxy.lastDisbursementTime() == block.timestamp, "bridge path not reached"); vm.revertToState(snapshot); } } From 16d0dd630e474f79053ecaf0d5ff1a59f9baee3b Mon Sep 17 00:00:00 2001 From: Mihir Wadekar Date: Thu, 22 Oct 2026 15:11:20 -0700 Subject: [PATCH 07/10] fix(sepolia): use RPC gas estimates for the L1 BalanceTracker deploy 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 --- .../tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md | 2 +- active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md b/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md index 2f2b87b04..ede58caa3 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md @@ -39,7 +39,7 @@ make TASK_NETWORK= deploy-l1 RESUME=1 make TASK_NETWORK= deploy-l2 RESUME=1 ``` -`--resume` only re-sends the unconfirmed transactions from `records/` and doesn't re-run the script's checks. Afterwards, confirm onchain that the `BalanceTracker` proxy's `admin()` is `NEW_ADMIN` and that every address in `addresses.json` has code. `gen-validation` also refuses to run until the `BalanceTracker` admin is `NEW_ADMIN`. Delete `addresses.json` only if `records/` shows that no transaction was sent. +`--resume` only re-sends the unconfirmed transactions from `records/` and doesn't re-run the script's checks. It can't recover transactions that were mined but reverted. If a creation reverted, for example out of gas, check whether each address in `addresses.json` has code. If none does, nothing usable was deployed: delete `addresses.json` and run the target again without `RESUME`. Afterwards, confirm onchain that the `BalanceTracker` proxy's `admin()` is `NEW_ADMIN` and that every address in `addresses.json` has code. `gen-validation` also refuses to run until the `BalanceTracker` admin is `NEW_ADMIN`. Delete `addresses.json` only if `records/` shows that no transaction was sent. ## Generate validation files diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile b/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile index b0099475b..05591ecbc 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile @@ -63,6 +63,8 @@ task-extra-deps: # transactions from the task-scoped broadcast record instead of starting a fresh deployment. PARTIAL_DEPLOY = Deploy failed; $(ADDRESSES_JSON) is kept. Finish the broadcast with RESUME=1, see FACILITATOR.md. +# Foundry 1.5.1 predates Sepolia's Oct 2026 fork and underprices contract creation by about 7x, so its +# simulated gas limits run out of gas onchain. --skip-simulation sends sequentially with eth_estimateGas limits. .PHONY: deploy-l1 deploy-l1: ifndef RESUME @@ -71,7 +73,7 @@ ifndef RESUME endif cd $(PROJECT_DIR) && $(DEPLOY_L1_ENV) ADDRESSES_JSON=$(ADDRESSES_JSON) \ $(MISE_EXEC) forge script --rpc-url $(L1_RPC_URL) $(DEPLOY_L1_SCRIPT) \ - --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast $(if $(RESUME),--resume) -vvvv || { echo "$(PARTIAL_DEPLOY)"; exit 1; } + --ledger --hd-paths $(LEDGER_HD_PATH) --broadcast --skip-simulation $(if $(RESUME),--resume) -vvvv || { echo "$(PARTIAL_DEPLOY)"; exit 1; } .PHONY: deploy-l2 deploy-l2: From ea79d14e51c25f7f3109965bfc14d9888ade32da Mon Sep 17 00:00:00 2001 From: Mihir Wadekar Date: Thu, 22 Oct 2026 15:22:20 -0700 Subject: [PATCH 08/10] chore(sepolia): record BalanceTracker and FeeDisburser deploys, ready 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 --- .../FACILITATOR.md | 8 +- .../config/sepolia/README.md | 4 +- .../config/sepolia/addresses.json | 5 + .../sepolia/validations/base-signer.json | 60 +++++ .../11155111/run-1792706749452.json | 127 ++++++++++ .../11155111/run-1792707384761.json | 230 ++++++++++++++++++ .../84532/run-1792707462106.json | 57 +++++ .../status.json | 4 +- 8 files changed, 490 insertions(+), 5 deletions(-) create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/addresses.json create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/validations/base-signer.json create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792706749452.json create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792707384761.json create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployFeeDisburser.s.sol/84532/run-1792707462106.json diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md b/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md index ede58caa3..27176ca9f 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md @@ -49,7 +49,13 @@ make TASK_NETWORK= gen-validation This writes `config//validations/base-signer.json` for `OWNER_SAFE`. The post-check replays both deposits as the alias of `OWNER_SAFE` on an L2 fork. It then asserts the new implementation, the new admin, the new `L1_WALLET`, and an unchanged `lastDisbursementTime`. -Check the state diff and replace any summary placeholders. Commit the validation, set the network step to `ready_to_sign`, then `collecting`, and update the `base` signature count in `status.json` as signatures arrive. +Check the state diff and replace any summary placeholders. This task is not a mainnet ProxyAdmin-owner operation, so remove the generated `taskOriginConfig` and add this root field instead: + +```json +"skipTaskOriginValidation": true +``` + +Commit the validation, set the network step to `ready_to_sign`, then `collecting`, and update the `base` signature count in `status.json` as signatures arrive. ## Execute diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md index b998320eb..500b188ca 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md @@ -4,11 +4,11 @@ Status: READY TO SIGN ## Description -The Sepolia `BalanceTracker` is admined by an inaccessible EOA, so a new `BalanceTracker` has been deployed on L1 with `0x646132A1667ca7aD00d36616AFBA1A28116C770A` as its proxy admin and profit wallet. It refills the proposer to 200 ETH and the batcher to 1000 ETH. +The Sepolia `BalanceTracker` is admined by an inaccessible EOA, so a new `BalanceTracker` has been deployed on L1 at `0x5D744AeA3e41B525948f000B5588Df291B47C420`, with `0x646132A1667ca7aD00d36616AFBA1A28116C770A` as its proxy admin and profit wallet. It refills the proposer to 200 ETH and the batcher to 1000 ETH. This transaction from `0x5dfEB066334B67355A15dc9b67317fD2a2e1f77f` sends two `OptimismPortal` deposits to the Base Sepolia `FeeDisburser` proxy `0x76355A67fCBCDE6F9a69409A8EAd5EaA9D8d875d`: -1. `upgradeTo` a new implementation whose `L1_WALLET` is the new `BalanceTracker` (see `addresses.json`). +1. `upgradeTo` the new implementation `0xdC3e4dB1947F57fB18b093924Ca95B96ddc1ef2e`, whose `L1_WALLET` is the new `BalanceTracker`. 2. `changeAdmin` to `0x757232a1667ca7ad00D36616aFbA1A28116c881B`, the L2 alias of `0x646132A1667ca7aD00d36616AFBA1A28116C770A`. ## Sign diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/addresses.json b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/addresses.json new file mode 100644 index 000000000..f356a6fca --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/addresses.json @@ -0,0 +1,5 @@ +{ + "balanceTrackerImplementation": "0xA4B11D64d0aEE9D8a24a4EB629B20e4A830cFA5b", + "balanceTracker": "0x5D744AeA3e41B525948f000B5588Df291B47C420", + "feeDisburserImplementation": "0xdC3e4dB1947F57fB18b093924Ca95B96ddc1ef2e" +} \ No newline at end of file diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/validations/base-signer.json b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/validations/base-signer.json new file mode 100644 index 000000000..b62015453 --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/validations/base-signer.json @@ -0,0 +1,60 @@ +{ + "cmd": "OWNER_SAFE=0x5dfEB066334B67355A15dc9b67317fD2a2e1f77f NEW_ADMIN=0x646132A1667ca7aD00d36616AFBA1A28116C770A NEW_ADMIN_L2_ALIAS=0x757232a1667ca7ad00D36616aFbA1A28116c881B OPTIMISM_PORTAL=0x49f53e41452C74589E85cA1677426Ba426459e85 FEE_DISBURSER=0x76355A67fCBCDE6F9a69409A8EAd5EaA9D8d875d NEW_FEE_DISBURSER_IMPL=0xdC3e4dB1947F57fB18b093924Ca95B96ddc1ef2e NEW_BALANCE_TRACKER=0x5D744AeA3e41B525948f000B5588Df291B47C420 L2_RPC_URL=https://base-sepolia.cbhq.net mise exec -- forge script --rpc-url https://ethereum-full-sepolia-k8s-dev.cbhq.net tasks/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol:UpgradeFeeDisburser --sig sign(address[]) [] --sender 0x6e427c3212C0b63BE0C382F97715D49b011bFF33", + "ledgerId": 1, + "rpcUrl": "https://ethereum-full-sepolia-k8s-dev.cbhq.net", + "expectedDomainAndMessageHashes": { + "address": "0x5dfEB066334B67355A15dc9b67317fD2a2e1f77f", + "domainHash": "0x0127bbb910536860a0757a9c0ffcdf9e4452220f566ed83af1f27f9e833f0e23", + "messageHash": "0x9ee89f7222e471bd59061b93dbc439c5ec8fcebc1388d0206c3a5b56c4d43a0d" + }, + "stateOverrides": [ + { + "name": "CB Signer Safe - Sepolia", + "address": "0x5dfEB066334B67355A15dc9b67317fD2a2e1f77f", + "overrides": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000004", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001", + "description": "Override the threshold to 1 so the transaction simulation can occur.", + "allowDifference": false + }, + { + "key": "0x83be7c160f4d0cf29c7dda7e3ebdf5ae00cd56e27cf0988a178d057f2ce7cbdc", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001", + "description": "Simulates an approval from msg.sender in order for the task simulation to succeed.", + "allowDifference": false + } + ] + } + ], + "stateChanges": [ + { + "name": "OptimismPortal - Sepolia", + "address": "0x49f53e41452C74589E85cA1677426Ba426459e85", + "changes": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000001", + "before": "0x0000000000b6af7200000000000186a00000000000000000000000003b9aca00", + "after": "0x0000000000b6af7200000000000493e00000000000000000000000003b9aca00", + "description": "Updates the ResourceMetering parameters (prevBlockNum, prevBoughtGas, prevBaseFee).", + "allowDifference": true + } + ] + }, + { + "name": "CB Signer Safe - Sepolia", + "address": "0x5dfEB066334B67355A15dc9b67317fD2a2e1f77f", + "changes": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000005", + "before": "0x0000000000000000000000000000000000000000000000000000000000000019", + "after": "0x000000000000000000000000000000000000000000000000000000000000001a", + "description": "Increments the nonce", + "allowDifference": false + } + ] + } + ], + "balanceChanges": [], + "skipTaskOriginValidation": true +} diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792706749452.json b/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792706749452.json new file mode 100644 index 000000000..0d2d85868 --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792706749452.json @@ -0,0 +1,127 @@ +{ + "transactions": [ + { + "hash": "0x391c3a0c51fe5064512e43ced67735498e57019f06c3896a31ed50cb47e01adf", + "transactionType": "CREATE", + "contractName": "BalanceTracker", + "contractAddress": "0x7e431ecef2356d0339cec574834401dfc561b504", + "function": null, + "arguments": [ + "0x646132A1667ca7aD00d36616AFBA1A28116C770A" + ], + "transaction": { + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "gas": "0xe47ce", + "value": "0x0", + "input": "0x60a060405234801561001057600080fd5b50604051610d5a380380610d5a83398101604081905261002f9161017c565b6001600160a01b0381166100a55760405162461bcd60e51b815260206004820152603260248201527f42616c616e6365547261636b65723a2050524f4649545f57414c4c45542063616044820152716e6e6f74206265206164647265737328302960701b60648201526084015b60405180910390fd5b6001600160a01b0381166080526100ba6100c0565b506101ac565b600054610100900460ff16156101285760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840161009c565b60005460ff908116101561017a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561018e57600080fd5b81516001600160a01b03811681146101a557600080fd5b9392505050565b608051610b856101d56000396000818161014e015281816105fb01526106280152610b856000f3fe6080604052600436106100595760003560e01c80630a5657201461009a5780636d1eb022146100cd5780637fbbe46f146100e2578063927a1a7714610104578063981949e81461013c578063ba69ebed1461017057600080fd5b366100955760405134815233907f5741979df5f3e491501da74d3b0a83dd2496ab1f34929865b3e190a8ad75859a9060200160405180910390a2005b600080fd5b3480156100a657600080fd5b506100ba6100b53660046108a0565b610185565b6040519081526020015b60405180910390f35b3480156100d957600080fd5b506100ba601481565b3480156100ee57600080fd5b506101026100fd36600461098f565b6101a6565b005b34801561011057600080fd5b5061012461011f3660046108a0565b6104ec565b6040516001600160a01b0390911681526020016100c4565b34801561014857600080fd5b506101247f000000000000000000000000000000000000000000000000000000000000000081565b34801561017c57600080fd5b50610102610516565b6034818154811061019557600080fd5b600091825260209091200154905081565b600054600390610100900460ff161580156101c8575060005460ff8083169116105b6102305760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461ffff191660ff8316176101001790558251806102635760405162461bcd60e51b815260040161022790610a5e565b60148111156102d65760405162461bcd60e51b815260206004820152604460248201819052600080516020610b30833981519152908201527f63616e6e6f7420686176652061206c656e67746820677265617465722074686160648201526306e2032360e41b608482015260a401610227565b8251811461034a5760405162461bcd60e51b81526020600482015260476024820152600080516020610b3083398151915260448201527f616e642074617267657442616c616e636573206c656e677468206d75737420626064820152661948195c5d585b60ca1b608482015260a401610227565b60005b818110156104745760006001600160a01b031685828151811061037257610372610aa9565b60200260200101516001600160a01b0316036103e45760405162461bcd60e51b81526020600482015260396024820152600080516020610b3083398151915260448201527f63616e6e6f7420636f6e7461696e2061646472657373283029000000000000006064820152608401610227565b60008482815181106103f8576103f8610aa9565b60200260200101511161046c5760405162461bcd60e51b815260206004820152603660248201527f42616c616e6365547261636b65723a2074617267657442616c616e6365732063604482015275185b9b9bdd0818dbdb9d185a5b880c081d185c99d95d60521b6064820152608401610227565b60010161034d565b5083516104889060339060208701906107eb565b50825161049c906034906020860190610850565b506104a5610692565b506000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b603381815481106104fc57600080fd5b6000918252602090912001546001600160a01b0316905081565b6002600154036105685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610227565b60026001556033548061058d5760405162461bcd60e51b815260040161022790610a5e565b60005b818110156105f2576105ea603382815481106105ae576105ae610aa9565b600091825260209091200154603480546001600160a01b0390921691849081106105da576105da610aa9565b90600052602060002001546106c3565b600101610590565b504760006106217f00000000000000000000000000000000000000000000000000000000000000005a846107aa565b90508015157f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167fbadd9d7563efca77438dc132e885aa156837e0b784469f68fbd810cbfb6cda778460405161068191815260200190565b60405180910390a350506001805550565b600054610100900460ff166106b95760405162461bcd60e51b815260040161022790610abf565b6106c16107be565b565b6001600160a01b038216318181106107215760408051600080825260208201819052916001600160a01b038616917f74273f98770936abfe9aad12868d2dbe403347b74b7f3a539d0359c123d5d31c910160405180910390a3505050565b600061072d8284610b0a565b905047600081831161073f5782610741565b815b90506000610750875a846107aa565b9050801515876001600160a01b03167f74273f98770936abfe9aad12868d2dbe403347b74b7f3a539d0359c123d5d31c8685604051610799929190918252602082015260400190565b60405180910390a350505050505050565b6000806000806000858888f1949350505050565b600054610100900460ff166107e55760405162461bcd60e51b815260040161022790610abf565b60018055565b828054828255906000526020600020908101928215610840579160200282015b8281111561084057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061080b565b5061084c92915061088b565b5090565b828054828255906000526020600020908101928215610840579160200282015b82811115610840578251825591602001919060010190610870565b5b8082111561084c576000815560010161088c565b6000602082840312156108b257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156108f8576108f86108b9565b604052919050565b600067ffffffffffffffff82111561091a5761091a6108b9565b5060051b60200190565b600082601f83011261093557600080fd5b8135602061094a61094583610900565b6108cf565b82815260059290921b8401810191818101908684111561096957600080fd5b8286015b84811015610984578035835291830191830161096d565b509695505050505050565b600080604083850312156109a257600080fd5b823567ffffffffffffffff808211156109ba57600080fd5b818501915085601f8301126109ce57600080fd5b813560206109de61094583610900565b82815260059290921b840181019181810190898411156109fd57600080fd5b948201945b83861015610a315785356001600160a01b0381168114610a225760008081fd5b82529482019490820190610a02565b96505086013592505080821115610a4757600080fd5b50610a5485828601610924565b9150509250929050565b6020808252603c90820152600080516020610b3083398151915260408201527f63616e6e6f7420686176652061206c656e677468206f66207a65726f00000000606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082821015610b2a57634e487b7160e01b600052601160045260246000fd5b50039056fe42616c616e6365547261636b65723a2073797374656d41646472657373657320a264697066735822122075e29f06615f5f7da1d1c7e950ce79734e9ab8e56bddf8d24e445e1a7856136064736f6c634300080f0033000000000000000000000000646132a1667ca7ad00d36616afba1a28116c770a", + "nonce": "0x19", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x376ac00e268eda0659f8b725a33e4572a2fc9e82ceaa9fcbe47023501eb82eea", + "transactionType": "CREATE", + "contractName": "Proxy", + "contractAddress": "0x1a01ec03f96cf844b09e5e176435b44eea943851", + "function": null, + "arguments": [ + "0x821Ff2A3fB66B008fA668B40Eca9d3535B246575" + ], + "transaction": { + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "gas": "0x8b589", + "value": "0x0", + "input": "0x608060405234801561001057600080fd5b5060405161078e38038061078e83398101604081905261002f916100b5565b6100388161003e565b506100e5565b600061005660008051602061076e8339815191525490565b60008051602061076e833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61067a806100f46000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100ae5780638f283970146100db578063f851a440146100fb5761005d565b3661005d5761005b610110565b005b61005b610110565b34801561007157600080fd5b5061005b610080366004610521565b6101c8565b61009861009336600461053c565b61020e565b6040516100a591906105bf565b60405180910390f35b3480156100ba57600080fd5b506100c361033e565b6040516001600160a01b0390911681526020016100a5565b3480156100e757600080fd5b5061005b6100f6366004610521565b6103a9565b34801561010757600080fd5b506100c36103e4565b600061013a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90506001600160a01b0381166101a55760405162461bcd60e51b815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e697469616044820152641b1a5e995960da1b60648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e806101c2573d6000fd5b503d6000f35b600080516020610625833981519152546001600160a01b0316336001600160a01b031614806101f5575033155b156102065761020381610432565b50565b610203610110565b60606102266000805160206106258339815191525490565b6001600160a01b0316336001600160a01b03161480610243575033155b1561032f5761025184610432565b600080856001600160a01b0316858560405161026e929190610614565b600060405180830381855af49150503d80600081146102a9576040519150601f19603f3d011682016040523d82523d6000602084013e6102ae565b606091505b5091509150816103265760405162461bcd60e51b815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000606482015260840161019c565b91506103379050565b610337610110565b9392505050565b60006103566000805160206106258339815191525490565b6001600160a01b0316336001600160a01b03161480610373575033155b1561039e57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6103a6610110565b90565b600080516020610625833981519152546001600160a01b0316336001600160a01b031614806103d6575033155b15610206576102038161048e565b60006103fc6000805160206106258339815191525490565b6001600160a01b0316336001600160a01b03161480610419575033155b1561039e57506000805160206106258339815191525490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006104a66000805160206106258339815191525490565b600080516020610625833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b80356001600160a01b038116811461051c57600080fd5b919050565b60006020828403121561053357600080fd5b61033782610505565b60008060006040848603121561055157600080fd5b61055a84610505565b9250602084013567ffffffffffffffff8082111561057757600080fd5b818601915086601f83011261058b57600080fd5b81358181111561059a57600080fd5b8760208285010111156105ac57600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156105ec578581018301518582016040015282016105d0565b818111156105fe576000604083870101525b50601f01601f1916929092016040019392505050565b818382376000910190815291905056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a26469706673582212206d68b7910d0407fc9042d14c7d1f09cb6e97878e6580838d1f977316def88eaa64736f6c634300080f0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000821ff2a3fb66b008fa668b40eca9d3535b246575", + "nonce": "0x1a", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x82cbb7c40d601b395bfb4c1f5a6f975a3ce8d15e4a58ca1d96b7fd01c9c643e2", + "transactionType": "CALL", + "contractName": "Proxy", + "contractAddress": "0x1a01ec03f96cf844b09e5e176435b44eea943851", + "function": "upgradeToAndCall(address,bytes)", + "arguments": [ + "0x7E431eCef2356d0339CEC574834401DfC561b504", + "0x7fbbe46f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000db84125f2f4229c81c579f41bc129c71b174eb58000000000000000000000000fc56e7272eebbba5bc6c544e159483c4a38f8ba3000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000000003635c9adc5dea00000" + ], + "transaction": { + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": "0x1a01ec03f96cf844b09e5e176435b44eea943851", + "gas": "0x53b03", + "value": "0x0", + "input": "0x4f1ef2860000000000000000000000007e431ecef2356d0339cec574834401dfc561b504000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001047fbbe46f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000db84125f2f4229c81c579f41bc129c71b174eb58000000000000000000000000fc56e7272eebbba5bc6c544e159483c4a38f8ba3000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000000003635c9adc5dea0000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x1b", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x93e82ad60848f27e25f901f16dd87c7eaac733e4876654b8dcc48f14f2f00db1", + "transactionType": "CALL", + "contractName": "Proxy", + "contractAddress": "0x1a01ec03f96cf844b09e5e176435b44eea943851", + "function": "changeAdmin(address)", + "arguments": [ + "0x646132A1667ca7aD00d36616AFBA1A28116C770A" + ], + "transaction": { + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": "0x1a01ec03f96cf844b09e5e176435b44eea943851", + "gas": "0x99a3", + "value": "0x0", + "input": "0x8f283970000000000000000000000000646132a1667ca7ad00d36616afba1a28116c770a", + "nonce": "0x1c", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x3808ac4", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x82cbb7c40d601b395bfb4c1f5a6f975a3ce8d15e4a58ca1d96b7fd01c9c643e2", + "transactionIndex": "0x46", + "blockHash": "0x0883c410a79a2c1e9c63bf50f121319b30780be3308933cf47e715feb31f881b", + "blockNumber": "0xb6af32", + "gasUsed": "0x9b98", + "effectiveGasPrice": "0xf4250", + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": "0x1a01ec03f96cf844b09e5e176435b44eea943851", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x3034f3e", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x93e82ad60848f27e25f901f16dd87c7eaac733e4876654b8dcc48f14f2f00db1", + "transactionIndex": "0x47", + "blockHash": "0x9a7d8d8a536e85508c39f2f60d3eafb260490c3983a85dfa6b7e78f985927d57", + "blockNumber": "0xb6af33", + "gasUsed": "0x4398", + "effectiveGasPrice": "0xf4250", + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": "0x1a01ec03f96cf844b09e5e176435b44eea943851", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1792706749452, + "chain": 11155111, + "commit": "0633f0e" +} \ No newline at end of file diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792707384761.json b/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792707384761.json new file mode 100644 index 000000000..747eb6a63 --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792707384761.json @@ -0,0 +1,230 @@ +{ + "transactions": [ + { + "hash": "0x62a84f38ba16a3e1fa9b62886ff2f8f0c4bedcd7ae79ffb09edd889351a3adbb", + "transactionType": "CREATE", + "contractName": "BalanceTracker", + "contractAddress": "0xa4b11d64d0aee9d8a24a4eb629b20e4a830cfa5b", + "function": null, + "arguments": [ + "0x646132A1667ca7aD00d36616AFBA1A28116C770A" + ], + "transaction": { + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "value": "0x0", + "input": "0x60a060405234801561001057600080fd5b50604051610d5a380380610d5a83398101604081905261002f9161017c565b6001600160a01b0381166100a55760405162461bcd60e51b815260206004820152603260248201527f42616c616e6365547261636b65723a2050524f4649545f57414c4c45542063616044820152716e6e6f74206265206164647265737328302960701b60648201526084015b60405180910390fd5b6001600160a01b0381166080526100ba6100c0565b506101ac565b600054610100900460ff16156101285760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840161009c565b60005460ff908116101561017a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561018e57600080fd5b81516001600160a01b03811681146101a557600080fd5b9392505050565b608051610b856101d56000396000818161014e015281816105fb01526106280152610b856000f3fe6080604052600436106100595760003560e01c80630a5657201461009a5780636d1eb022146100cd5780637fbbe46f146100e2578063927a1a7714610104578063981949e81461013c578063ba69ebed1461017057600080fd5b366100955760405134815233907f5741979df5f3e491501da74d3b0a83dd2496ab1f34929865b3e190a8ad75859a9060200160405180910390a2005b600080fd5b3480156100a657600080fd5b506100ba6100b53660046108a0565b610185565b6040519081526020015b60405180910390f35b3480156100d957600080fd5b506100ba601481565b3480156100ee57600080fd5b506101026100fd36600461098f565b6101a6565b005b34801561011057600080fd5b5061012461011f3660046108a0565b6104ec565b6040516001600160a01b0390911681526020016100c4565b34801561014857600080fd5b506101247f000000000000000000000000000000000000000000000000000000000000000081565b34801561017c57600080fd5b50610102610516565b6034818154811061019557600080fd5b600091825260209091200154905081565b600054600390610100900460ff161580156101c8575060005460ff8083169116105b6102305760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461ffff191660ff8316176101001790558251806102635760405162461bcd60e51b815260040161022790610a5e565b60148111156102d65760405162461bcd60e51b815260206004820152604460248201819052600080516020610b30833981519152908201527f63616e6e6f7420686176652061206c656e67746820677265617465722074686160648201526306e2032360e41b608482015260a401610227565b8251811461034a5760405162461bcd60e51b81526020600482015260476024820152600080516020610b3083398151915260448201527f616e642074617267657442616c616e636573206c656e677468206d75737420626064820152661948195c5d585b60ca1b608482015260a401610227565b60005b818110156104745760006001600160a01b031685828151811061037257610372610aa9565b60200260200101516001600160a01b0316036103e45760405162461bcd60e51b81526020600482015260396024820152600080516020610b3083398151915260448201527f63616e6e6f7420636f6e7461696e2061646472657373283029000000000000006064820152608401610227565b60008482815181106103f8576103f8610aa9565b60200260200101511161046c5760405162461bcd60e51b815260206004820152603660248201527f42616c616e6365547261636b65723a2074617267657442616c616e6365732063604482015275185b9b9bdd0818dbdb9d185a5b880c081d185c99d95d60521b6064820152608401610227565b60010161034d565b5083516104889060339060208701906107eb565b50825161049c906034906020860190610850565b506104a5610692565b506000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b603381815481106104fc57600080fd5b6000918252602090912001546001600160a01b0316905081565b6002600154036105685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610227565b60026001556033548061058d5760405162461bcd60e51b815260040161022790610a5e565b60005b818110156105f2576105ea603382815481106105ae576105ae610aa9565b600091825260209091200154603480546001600160a01b0390921691849081106105da576105da610aa9565b90600052602060002001546106c3565b600101610590565b504760006106217f00000000000000000000000000000000000000000000000000000000000000005a846107aa565b90508015157f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167fbadd9d7563efca77438dc132e885aa156837e0b784469f68fbd810cbfb6cda778460405161068191815260200190565b60405180910390a350506001805550565b600054610100900460ff166106b95760405162461bcd60e51b815260040161022790610abf565b6106c16107be565b565b6001600160a01b038216318181106107215760408051600080825260208201819052916001600160a01b038616917f74273f98770936abfe9aad12868d2dbe403347b74b7f3a539d0359c123d5d31c910160405180910390a3505050565b600061072d8284610b0a565b905047600081831161073f5782610741565b815b90506000610750875a846107aa565b9050801515876001600160a01b03167f74273f98770936abfe9aad12868d2dbe403347b74b7f3a539d0359c123d5d31c8685604051610799929190918252602082015260400190565b60405180910390a350505050505050565b6000806000806000858888f1949350505050565b600054610100900460ff166107e55760405162461bcd60e51b815260040161022790610abf565b60018055565b828054828255906000526020600020908101928215610840579160200282015b8281111561084057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061080b565b5061084c92915061088b565b5090565b828054828255906000526020600020908101928215610840579160200282015b82811115610840578251825591602001919060010190610870565b5b8082111561084c576000815560010161088c565b6000602082840312156108b257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156108f8576108f86108b9565b604052919050565b600067ffffffffffffffff82111561091a5761091a6108b9565b5060051b60200190565b600082601f83011261093557600080fd5b8135602061094a61094583610900565b6108cf565b82815260059290921b8401810191818101908684111561096957600080fd5b8286015b84811015610984578035835291830191830161096d565b509695505050505050565b600080604083850312156109a257600080fd5b823567ffffffffffffffff808211156109ba57600080fd5b818501915085601f8301126109ce57600080fd5b813560206109de61094583610900565b82815260059290921b840181019181810190898411156109fd57600080fd5b948201945b83861015610a315785356001600160a01b0381168114610a225760008081fd5b82529482019490820190610a02565b96505086013592505080821115610a4757600080fd5b50610a5485828601610924565b9150509250929050565b6020808252603c90820152600080516020610b3083398151915260408201527f63616e6e6f7420686176652061206c656e677468206f66207a65726f00000000606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082821015610b2a57634e487b7160e01b600052601160045260246000fd5b50039056fe42616c616e6365547261636b65723a2073797374656d41646472657373657320a264697066735822122075e29f06615f5f7da1d1c7e950ce79734e9ab8e56bddf8d24e445e1a7856136064736f6c634300080f0033000000000000000000000000646132a1667ca7ad00d36616afba1a28116c770a", + "nonce": "0x1d", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x3c58a972e6d0fb6e829a1c87f8ca74ed771792ed8da8ab3d67ceb536c2ab3b62", + "transactionType": "CREATE", + "contractName": "Proxy", + "contractAddress": "0x5d744aea3e41b525948f000b5588df291b47c420", + "function": null, + "arguments": [ + "0x821Ff2A3fB66B008fA668B40Eca9d3535B246575" + ], + "transaction": { + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "value": "0x0", + "input": "0x608060405234801561001057600080fd5b5060405161078e38038061078e83398101604081905261002f916100b5565b6100388161003e565b506100e5565b600061005660008051602061076e8339815191525490565b60008051602061076e833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61067a806100f46000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100ae5780638f283970146100db578063f851a440146100fb5761005d565b3661005d5761005b610110565b005b61005b610110565b34801561007157600080fd5b5061005b610080366004610521565b6101c8565b61009861009336600461053c565b61020e565b6040516100a591906105bf565b60405180910390f35b3480156100ba57600080fd5b506100c361033e565b6040516001600160a01b0390911681526020016100a5565b3480156100e757600080fd5b5061005b6100f6366004610521565b6103a9565b34801561010757600080fd5b506100c36103e4565b600061013a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90506001600160a01b0381166101a55760405162461bcd60e51b815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e697469616044820152641b1a5e995960da1b60648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e806101c2573d6000fd5b503d6000f35b600080516020610625833981519152546001600160a01b0316336001600160a01b031614806101f5575033155b156102065761020381610432565b50565b610203610110565b60606102266000805160206106258339815191525490565b6001600160a01b0316336001600160a01b03161480610243575033155b1561032f5761025184610432565b600080856001600160a01b0316858560405161026e929190610614565b600060405180830381855af49150503d80600081146102a9576040519150601f19603f3d011682016040523d82523d6000602084013e6102ae565b606091505b5091509150816103265760405162461bcd60e51b815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000606482015260840161019c565b91506103379050565b610337610110565b9392505050565b60006103566000805160206106258339815191525490565b6001600160a01b0316336001600160a01b03161480610373575033155b1561039e57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6103a6610110565b90565b600080516020610625833981519152546001600160a01b0316336001600160a01b031614806103d6575033155b15610206576102038161048e565b60006103fc6000805160206106258339815191525490565b6001600160a01b0316336001600160a01b03161480610419575033155b1561039e57506000805160206106258339815191525490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8181556040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006104a66000805160206106258339815191525490565b600080516020610625833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b80356001600160a01b038116811461051c57600080fd5b919050565b60006020828403121561053357600080fd5b61033782610505565b60008060006040848603121561055157600080fd5b61055a84610505565b9250602084013567ffffffffffffffff8082111561057757600080fd5b818601915086601f83011261058b57600080fd5b81358181111561059a57600080fd5b8760208285010111156105ac57600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156105ec578581018301518582016040015282016105d0565b818111156105fe576000604083870101525b50601f01601f1916929092016040019392505050565b818382376000910190815291905056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a26469706673582212206d68b7910d0407fc9042d14c7d1f09cb6e97878e6580838d1f977316def88eaa64736f6c634300080f0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000821ff2a3fb66b008fa668b40eca9d3535b246575", + "nonce": "0x1e", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xa7cb33bce9d5b57ca6fdb984bbcdfb43e813d66a7246a3f2c8fda98b8d70f746", + "transactionType": "CALL", + "contractName": "Proxy", + "contractAddress": "0x5d744aea3e41b525948f000b5588df291b47c420", + "function": "upgradeToAndCall(address,bytes)", + "arguments": [ + "0xA4B11D64d0aEE9D8a24a4EB629B20e4A830cFA5b", + "0x7fbbe46f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000db84125f2f4229c81c579f41bc129c71b174eb58000000000000000000000000fc56e7272eebbba5bc6c544e159483c4a38f8ba3000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000000003635c9adc5dea00000" + ], + "transaction": { + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": "0x5d744aea3e41b525948f000b5588df291b47c420", + "value": "0x0", + "input": "0x4f1ef286000000000000000000000000a4b11d64d0aee9d8a24a4eb629b20e4a830cfa5b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001047fbbe46f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000db84125f2f4229c81c579f41bc129c71b174eb58000000000000000000000000fc56e7272eebbba5bc6c544e159483c4a38f8ba3000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000000003635c9adc5dea0000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x1f", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf5602f22c6c8e9753ac75e436678c6002ddfeaefac0a6f4047d86bb78a251f39", + "transactionType": "CALL", + "contractName": "Proxy", + "contractAddress": "0x5d744aea3e41b525948f000b5588df291b47c420", + "function": "changeAdmin(address)", + "arguments": [ + "0x646132A1667ca7aD00d36616AFBA1A28116C770A" + ], + "transaction": { + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": "0x5d744aea3e41b525948f000b5588df291b47c420", + "value": "0x0", + "input": "0x8f283970000000000000000000000000646132a1667ca7ad00d36616afba1a28116c770a", + "nonce": "0x20", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x41593df", + "logs": [ + { + "address": "0xa4b11d64d0aee9d8a24a4eb629b20e4a830cfa5b", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0x975eecba70d2782315cdd6e19ad729619e5a57c004b0f296cdd9be22e883921e", + "blockNumber": "0xb6af64", + "blockTimestamp": "0x6ada8b08", + "transactionHash": "0x62a84f38ba16a3e1fa9b62886ff2f8f0c4bedcd7ae79ffb09edd889351a3adbb", + "transactionIndex": "0x49", + "logIndex": "0xe6", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000200100000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x62a84f38ba16a3e1fa9b62886ff2f8f0c4bedcd7ae79ffb09edd889351a3adbb", + "transactionIndex": "0x49", + "blockHash": "0x975eecba70d2782315cdd6e19ad729619e5a57c004b0f296cdd9be22e883921e", + "blockNumber": "0xb6af64", + "gasUsed": "0x4a8b0d", + "effectiveGasPrice": "0xf4250", + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": null, + "contractAddress": "0xa4b11d64d0aee9d8a24a4eb629b20e4a830cfa5b" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4d86f92", + "logs": [ + { + "address": "0x5d744aea3e41b525948f000b5588df291b47c420", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000821ff2a3fb66b008fa668b40eca9d3535b246575", + "blockHash": "0x398c1c5d1ec3d17b43776fd1ec1853b77980112ae7182a5fcdfa025f5f6d914b", + "blockNumber": "0xb6af65", + "blockTimestamp": "0x6ada8b14", + "transactionHash": "0x3c58a972e6d0fb6e829a1c87f8ca74ed771792ed8da8ab3d67ceb536c2ab3b62", + "transactionIndex": "0x6d", + "logIndex": "0xd7", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000008010000800000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3c58a972e6d0fb6e829a1c87f8ca74ed771792ed8da8ab3d67ceb536c2ab3b62", + "transactionIndex": "0x6d", + "blockHash": "0x398c1c5d1ec3d17b43776fd1ec1853b77980112ae7182a5fcdfa025f5f6d914b", + "blockNumber": "0xb6af65", + "gasUsed": "0x2c0dcf", + "effectiveGasPrice": "0xf4250", + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": null, + "contractAddress": "0x5d744aea3e41b525948f000b5588df291b47c420" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x3fb73e7", + "logs": [ + { + "address": "0x5d744aea3e41b525948f000b5588df291b47c420", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x000000000000000000000000a4b11d64d0aee9d8a24a4eb629b20e4a830cfa5b" + ], + "data": "0x", + "blockHash": "0xbae56e05ce4f6d8bef542c8cef4ede9f247b8684069407c39bc310bf03569692", + "blockNumber": "0xb6af67", + "blockTimestamp": "0x6ada8b2c", + "transactionHash": "0xa7cb33bce9d5b57ca6fdb984bbcdfb43e813d66a7246a3f2c8fda98b8d70f746", + "transactionIndex": "0x47", + "logIndex": "0x78", + "removed": false + }, + { + "address": "0x5d744aea3e41b525948f000b5588df291b47c420", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000003", + "blockHash": "0xbae56e05ce4f6d8bef542c8cef4ede9f247b8684069407c39bc310bf03569692", + "blockNumber": "0xb6af67", + "blockTimestamp": "0x6ada8b2c", + "transactionHash": "0xa7cb33bce9d5b57ca6fdb984bbcdfb43e813d66a7246a3f2c8fda98b8d70f746", + "transactionIndex": "0x47", + "logIndex": "0x79", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000004000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000008010000c00000000000000000000000000000000000000000020000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xa7cb33bce9d5b57ca6fdb984bbcdfb43e813d66a7246a3f2c8fda98b8d70f746", + "transactionIndex": "0x47", + "blockHash": "0xbae56e05ce4f6d8bef542c8cef4ede9f247b8684069407c39bc310bf03569692", + "blockNumber": "0xb6af67", + "gasUsed": "0xf9295", + "effectiveGasPrice": "0xf4250", + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": "0x5d744aea3e41b525948f000b5588df291b47c420", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x5bc4f2b", + "logs": [ + { + "address": "0x5d744aea3e41b525948f000b5588df291b47c420", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x000000000000000000000000821ff2a3fb66b008fa668b40eca9d3535b246575000000000000000000000000646132a1667ca7ad00d36616afba1a28116c770a", + "blockHash": "0xa82da8f87c31713ea7b6b6726b4b996d28d055be03cb1f55732104d67fd05b0c", + "blockNumber": "0xb6af68", + "blockTimestamp": "0x6ada8b38", + "transactionHash": "0xf5602f22c6c8e9753ac75e436678c6002ddfeaefac0a6f4047d86bb78a251f39", + "transactionIndex": "0x71", + "logIndex": "0x147", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000008010000800000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf5602f22c6c8e9753ac75e436678c6002ddfeaefac0a6f4047d86bb78a251f39", + "transactionIndex": "0x71", + "blockHash": "0xa82da8f87c31713ea7b6b6726b4b996d28d055be03cb1f55732104d67fd05b0c", + "blockNumber": "0xb6af68", + "gasUsed": "0x73ec", + "effectiveGasPrice": "0xf4250", + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": "0x5d744aea3e41b525948f000b5588df291b47c420", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1792707384761, + "chain": 11155111, + "commit": "66285fd" +} \ No newline at end of file diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployFeeDisburser.s.sol/84532/run-1792707462106.json b/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployFeeDisburser.s.sol/84532/run-1792707462106.json new file mode 100644 index 000000000..54a2756f5 --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployFeeDisburser.s.sol/84532/run-1792707462106.json @@ -0,0 +1,57 @@ +{ + "transactions": [ + { + "hash": "0xe9abe533071f350611e0eada873e523bac085e17c47c00ebdb386e08e774e7d1", + "transactionType": "CREATE", + "contractName": "FeeDisburser", + "contractAddress": "0xdc3e4db1947f57fb18b093924ca95b96ddc1ef2e", + "function": null, + "arguments": [ + "0x5D744AeA3e41B525948f000B5588Df291B47C420", + "604800" + ], + "transaction": { + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "gas": "0x87272", + "value": "0x0", + "input": "0x60c060405234801561000f575f80fd5b506040516107a23803806107a283398101604081905261002e9161008f565b6001600160a01b0382166100555760405163d92e233d60e01b815260040160405180910390fd5b62015180811015610079576040516352063f8560e11b815260040160405180910390fd5b6001600160a01b0390911660805260a0526100c6565b5f80604083850312156100a0575f80fd5b82516001600160a01b03811681146100b6575f80fd5b6020939093015192949293505050565b60805160a0516106ae6100f45f395f818161014901526101e001525f818160c201526102c301526106ae5ff3fe608060405260043610610071575f3560e01c806354664de51161004c57806354664de51461013857806354fd4d501461016b578063ad41d09c1461019e578063b87ea8d4146101c8575f80fd5b806336f1a6e5146100b1578063394d273114610101578063447eb5ac14610123575f80fd5b366100ad5760405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156100bc575f80fd5b506100e47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561010c575f80fd5b506101155f5481565b6040519081526020016100f8565b34801561012e575f80fd5b5061011560015481565b348015610143575f80fd5b506101157f000000000000000000000000000000000000000000000000000000000000000081565b348015610176575f80fd5b5060408051808201825260058152640312e302e360dc1b602082015290516100f89190610593565b3480156101a9575f80fd5b506101b36188b881565b60405163ffffffff90911681526020016100f8565b3480156101d3575f80fd5b506101dc6101de565b005b7f00000000000000000000000000000000000000000000000000000000000000005f5461020b91906105ac565b42101561022b5760405163c7a06d5f60e01b815260040160405180910390fd5b61023b6011602160991b0161036d565b61024b6019602160991b0161036d565b61025b601a602160991b0161036d565b475f81900361028f576040517f8c887b1215d5e6b119c1c1008fe1d0919b4c438301d5a0357362a13fb56f6a40905f90a150565b425f908155604080516020810182529182525163e11013dd60e01b81526010602160991b019163e11013dd9147916102ef917f0000000000000000000000000000000000000000000000000000000000000000916188b8916004016105d1565b5f604051808303818588803b158015610306575f80fd5b505af1158015610318573d5f803e3d5ffd5b50505050507fe155e054cfe69655d6d2f8bbfb856aa8cdf49ecbea6557901533364539caad945f545f83604051610362939291909283526020830191909152604082015260600190565b60405180910390a150565b6001816001600160a01b031663d0e12f906040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103cf919061061d565b60018111156103e0576103e0610609565b146103fe576040516372e01a1960e01b815260040160405180910390fd5b306001600160a01b0316816001600160a01b0316630d9019e16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610444573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610468919061063b565b6001600160a01b03161461048f5760405163c9bb076d60e01b815260040160405180910390fd5b806001600160a01b031663d3e5792b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ef9190610661565b816001600160a01b0316311061056257806001600160a01b0316633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af115801561053c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105609190610661565b505b50565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6105a56020830184610565565b9392505050565b808201808211156105cb57634e487b7160e01b5f52601160045260245ffd5b92915050565b6001600160a01b038416815263ffffffff831660208201526060604082018190525f9061060090830184610565565b95945050505050565b634e487b7160e01b5f52602160045260245ffd5b5f6020828403121561062d575f80fd5b8151600281106105a5575f80fd5b5f6020828403121561064b575f80fd5b81516001600160a01b03811681146105a5575f80fd5b5f60208284031215610671575f80fd5b505191905056fea2646970667358221220a640328950f46d37761c91afc5d1c22c2e4ba299673ced2f9a05374eade8091d64736f6c634300081900330000000000000000000000005d744aea3e41b525948f000b5588df291b47c4200000000000000000000000000000000000000000000000000000000000093a80", + "nonce": "0x0", + "chainId": "0x14a34" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x1014db", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe9abe533071f350611e0eada873e523bac085e17c47c00ebdb386e08e774e7d1", + "transactionIndex": "0x8", + "blockHash": "0x0ebeb42e61cabfa4102e37a790bf50ec570e3ef529d0f109c5dab5eeab8d4547", + "blockNumber": "0x2ea94dd", + "gasUsed": "0x67f6c", + "effectiveGasPrice": "0x5b8d80", + "blobGasUsed": "0x7ff12", + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": null, + "contractAddress": "0xdc3e4db1947f57fb18b093924ca95b96ddc1ef2e", + "daFootprintGasScalar": "0x1be", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x452", + "l1GasPrice": "0x10", + "l1GasUsed": "0x4975" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1792707462106, + "chain": 84532, + "commit": "66285fd" +} \ No newline at end of file diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/status.json b/active/evm/tasks/2026-10-21-replace-balance-tracker/status.json index 673e5b6ea..68aeb9656 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/status.json +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/status.json @@ -4,7 +4,7 @@ "kind": "active", "networks": { "sepolia": { - "step": "review", + "step": "ready_to_sign", "pr": "https://github.com/base/contract-deployments/pull/807", "blocksec_ticket": null, "signatures": { @@ -16,5 +16,5 @@ "executed_tx": null } }, - "last_updated": "2026-10-21T19:30:41Z" + "last_updated": "2026-10-22T22:22:07Z" } From 3cd2a6be3957685b01a480ff6cf1095c21cda3a6 Mon Sep 17 00:00:00 2001 From: Mihir Wadekar Date: Wed, 28 Oct 2026 10:34:40 -0700 Subject: [PATCH 09/10] chore(sepolia): mark BalanceTracker replacement executed (CHAIN-1245) 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 --- .../config/sepolia/README.md | 3 +- .../11155111/run-1793208541889.json | 108 ++++++++++++++++++ .../status.json | 8 +- config/sepolia.env | 2 +- 4 files changed, 115 insertions(+), 6 deletions(-) create mode 100644 active/evm/tasks/2026-10-21-replace-balance-tracker/records/UpgradeFeeDisburser.s.sol/11155111/run-1793208541889.json diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md index 500b188ca..d47b5f94d 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md @@ -1,6 +1,7 @@ # 2026-10-21-replace-balance-tracker -Status: READY TO SIGN +Status: EXECUTED +https://sepolia.etherscan.io/tx/0x1d9e7be871ea17c1fc215940e01c19dfabbb67ace76d83275ac72f0609096789 ## Description diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/records/UpgradeFeeDisburser.s.sol/11155111/run-1793208541889.json b/active/evm/tasks/2026-10-21-replace-balance-tracker/records/UpgradeFeeDisburser.s.sol/11155111/run-1793208541889.json new file mode 100644 index 000000000..b815fd31d --- /dev/null +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/records/UpgradeFeeDisburser.s.sol/11155111/run-1793208541889.json @@ -0,0 +1,108 @@ +{ + "transactions": [ + { + "hash": "0x1d9e7be871ea17c1fc215940e01c19dfabbb67ace76d83275ac72f0609096789", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x5dfeb066334b67355a15dc9b67317fd2a2e1f77f", + "function": "execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)", + "arguments": [ + "0xA8B8CA1d6F0F5Ce63dCEA9121A01b302c5801303", + "0", + "0x858cc83200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c58013030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c482ad56cb00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000049f53e41452c74589e85ca1677426ba426459e85000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104e9e05c4200000000000000000000000076355a67fcbcde6f9a69409a8ead5eaa9d8d875d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000243659cfe6000000000000000000000000dc3e4db1947f57fb18b093924ca95b96ddc1ef2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049f53e41452c74589e85ca1677426ba426459e85000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104e9e05c4200000000000000000000000076355a67fcbcde6f9a69409a8ead5eaa9d8d875d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000248f283970000000000000000000000000757232a1667ca7ad00d36616afba1a28116c881b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "1", + "0", + "0", + "0", + "0x0000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000", + "0xb75a8ba58d4dfcdc0d86361f975bdc2bd4b19abffac6127db5d6fd49e58173247b41c9ffd7d45c64be7bf4f19ebaee82d565e4b9996ba9dfab858f86838efb241b80de5f9b30354a482208c6c8033ea332825a5e118e28bcf8d154179c728119e923b0d2f314c1b2e2b48975c23a58614fc129ac381659088143bbf41a5b9454c01bcd1c4e78388a0d28c23b9169c3ef2baae349a3bfaf785214c74d04c83f2a41b104384e8c3a19a9cc4bcd6db8daf6074faa3220ee6669339b9b7aed25d74b56151c" + ], + "transaction": { + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": "0x5dfeb066334b67355a15dc9b67317fd2a2e1f77f", + "gas": "0x6410f", + "value": "0x0", + "input": "0x6a761202000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c58013030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000564858cc83200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c58013030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c482ad56cb00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000049f53e41452c74589e85ca1677426ba426459e85000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104e9e05c4200000000000000000000000076355a67fcbcde6f9a69409a8ead5eaa9d8d875d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000243659cfe6000000000000000000000000dc3e4db1947f57fb18b093924ca95b96ddc1ef2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049f53e41452c74589e85ca1677426ba426459e85000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000104e9e05c4200000000000000000000000076355a67fcbcde6f9a69409a8ead5eaa9d8d875d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000248f283970000000000000000000000000757232a1667ca7ad00d36616afba1a28116c881b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3b75a8ba58d4dfcdc0d86361f975bdc2bd4b19abffac6127db5d6fd49e58173247b41c9ffd7d45c64be7bf4f19ebaee82d565e4b9996ba9dfab858f86838efb241b80de5f9b30354a482208c6c8033ea332825a5e118e28bcf8d154179c728119e923b0d2f314c1b2e2b48975c23a58614fc129ac381659088143bbf41a5b9454c01bcd1c4e78388a0d28c23b9169c3ef2baae349a3bfaf785214c74d04c83f2a41b104384e8c3a19a9cc4bcd6db8daf6074faa3220ee6669339b9b7aed25d74b56151c0000000000000000000000000000000000000000000000000000000000", + "nonce": "0x21", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x3e577c6", + "logs": [ + { + "address": "0x49f53e41452c74589e85ca1677426ba426459e85", + "topics": [ + "0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32", + "0x0000000000000000000000006f0fb066334b67355a15dc9b67317fd2a2e20890", + "0x00000000000000000000000076355a67fcbcde6f9a69409a8ead5eaa9d8d875d", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000186a0003659cfe6000000000000000000000000dc3e4db1947f57fb18b093924ca95b96ddc1ef2e00000000000000000000000000000000000000", + "blockHash": "0x712ad92ea1307e65af42b0872180ac3ac8d16bf4231230f107ccb738e91d8a2b", + "blockNumber": "0xb750f6", + "blockTimestamp": "0x6ae230dc", + "transactionHash": "0x1d9e7be871ea17c1fc215940e01c19dfabbb67ace76d83275ac72f0609096789", + "transactionIndex": "0x4b", + "logIndex": "0x92", + "removed": false + }, + { + "address": "0x49f53e41452c74589e85ca1677426ba426459e85", + "topics": [ + "0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32", + "0x0000000000000000000000006f0fb066334b67355a15dc9b67317fd2a2e20890", + "0x00000000000000000000000076355a67fcbcde6f9a69409a8ead5eaa9d8d875d", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000186a0008f283970000000000000000000000000757232a1667ca7ad00d36616afba1a28116c881b00000000000000000000000000000000000000", + "blockHash": "0x712ad92ea1307e65af42b0872180ac3ac8d16bf4231230f107ccb738e91d8a2b", + "blockNumber": "0xb750f6", + "blockTimestamp": "0x6ae230dc", + "transactionHash": "0x1d9e7be871ea17c1fc215940e01c19dfabbb67ace76d83275ac72f0609096789", + "transactionIndex": "0x4b", + "logIndex": "0x93", + "removed": false + }, + { + "address": "0x5dfeb066334b67355a15dc9b67317fd2a2e1f77f", + "topics": [ + "0x442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e", + "0x5c4695d59fbc14ccbf29d2e70fd35b593d163f9e5d63c8143cafe6c5d642a235" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x712ad92ea1307e65af42b0872180ac3ac8d16bf4231230f107ccb738e91d8a2b", + "blockNumber": "0xb750f6", + "blockTimestamp": "0x6ae230dc", + "transactionHash": "0x1d9e7be871ea17c1fc215940e01c19dfabbb67ace76d83275ac72f0609096789", + "transactionIndex": "0x4b", + "logIndex": "0x94", + "removed": false + } + ], + "logsBloom": "0x00000000400000000000000000000000000000000000000000000000060000000000000002000000002000000000000000000000020000000000000000000000000001000000000000000002000000000000000000000000000800000000000000040000020000000000400000000800000000000020000000000000000008000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000404080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000040002000000000001000080000000000000000000000", + "type": "0x2", + "transactionHash": "0x1d9e7be871ea17c1fc215940e01c19dfabbb67ace76d83275ac72f0609096789", + "transactionIndex": "0x4b", + "blockHash": "0x712ad92ea1307e65af42b0872180ac3ac8d16bf4231230f107ccb738e91d8a2b", + "blockNumber": "0xb750f6", + "gasUsed": "0x4943a", + "effectiveGasPrice": "0x3fb", + "from": "0x821ff2a3fb66b008fa668b40eca9d3535b246575", + "to": "0x5dfeb066334b67355a15dc9b67317fd2a2e1f77f", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1793208541889, + "chain": 11155111, + "commit": "bf99881" +} \ No newline at end of file diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/status.json b/active/evm/tasks/2026-10-21-replace-balance-tracker/status.json index 68aeb9656..0750777ca 100644 --- a/active/evm/tasks/2026-10-21-replace-balance-tracker/status.json +++ b/active/evm/tasks/2026-10-21-replace-balance-tracker/status.json @@ -4,17 +4,17 @@ "kind": "active", "networks": { "sepolia": { - "step": "ready_to_sign", + "step": "executed", "pr": "https://github.com/base/contract-deployments/pull/807", "blocksec_ticket": null, "signatures": { "base": { - "collected": 0, + "collected": 3, "required": 3 } }, - "executed_tx": null + "executed_tx": "0x1d9e7be871ea17c1fc215940e01c19dfabbb67ace76d83275ac72f0609096789" } }, - "last_updated": "2026-10-22T22:22:07Z" + "last_updated": "2026-10-28T17:34:35Z" } diff --git a/config/sepolia.env b/config/sepolia.env index e7c97c506..6e518e390 100644 --- a/config/sepolia.env +++ b/config/sepolia.env @@ -18,7 +18,7 @@ export PROXY_ADMIN_OWNER=0x0fe884546476dDd290eC46318785046ef68a0BA9 # L1 Addresses export ADDRESS_MANAGER=0x709c2B8ef4A9feFc629A8a2C1AF424Dc5BD6ad1B export ANCHOR_STATE_REGISTRY_PROXY=0x2fF5cC82dBf333Ea30D8ee462178ab1707315355 -export BALANCE_TRACKER=0x8D1b5e5614300F5c7ADA01fFA4ccF8F1752D9A57 +export BALANCE_TRACKER=0x5D744AeA3e41B525948f000B5588Df291B47C420 export DISPUTE_GAME_FACTORY_PROXY=0xd6E6dBf4F7EA0ac412fD8b65ED297e64BB7a06E1 export L1_CROSS_DOMAIN_MESSENGER=0xC34855F4De64F1840e5686e64278da901e261f20 export L1_ERC721_BRIDGE=0x21eFD066e581FA55Ef105170Cc04d74386a09190 From d9016636a76f626c02cf66d85021fdafeab78e4c Mon Sep 17 00:00:00 2001 From: Mihir Wadekar Date: Wed, 28 Oct 2026 10:34:50 -0700 Subject: [PATCH 10/10] chore: archive 2026-10-21-replace-balance-tracker Co-authored-by: Cursor --- .../evm}/2026-10-21-replace-balance-tracker/FACILITATOR.md | 0 .../evm}/2026-10-21-replace-balance-tracker/Makefile | 0 .../evm}/2026-10-21-replace-balance-tracker/config/sepolia/.env | 0 .../2026-10-21-replace-balance-tracker/config/sepolia/README.md | 0 .../config/sepolia/addresses.json | 0 .../config/sepolia/validations/base-signer.json | 0 .../DeployBalanceTracker.s.sol/11155111/run-1792706749452.json | 0 .../DeployBalanceTracker.s.sol/11155111/run-1792707384761.json | 0 .../records/DeployFeeDisburser.s.sol/84532/run-1792707462106.json | 0 .../UpgradeFeeDisburser.s.sol/11155111/run-1793208541889.json | 0 .../script/DeployBalanceTracker.s.sol | 0 .../script/DeployFeeDisburser.s.sol | 0 .../script/UpgradeFeeDisburser.s.sol | 0 .../evm}/2026-10-21-replace-balance-tracker/status.json | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/FACILITATOR.md (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/Makefile (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/config/sepolia/.env (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/config/sepolia/README.md (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/config/sepolia/addresses.json (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/config/sepolia/validations/base-signer.json (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792706749452.json (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792707384761.json (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/records/DeployFeeDisburser.s.sol/84532/run-1792707462106.json (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/records/UpgradeFeeDisburser.s.sol/11155111/run-1793208541889.json (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol (100%) rename {active/evm/tasks => archive/evm}/2026-10-21-replace-balance-tracker/status.json (100%) diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md b/archive/evm/2026-10-21-replace-balance-tracker/FACILITATOR.md similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/FACILITATOR.md rename to archive/evm/2026-10-21-replace-balance-tracker/FACILITATOR.md diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile b/archive/evm/2026-10-21-replace-balance-tracker/Makefile similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/Makefile rename to archive/evm/2026-10-21-replace-balance-tracker/Makefile diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/.env b/archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/.env similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/.env rename to archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/.env diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md b/archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/README.md similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/README.md rename to archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/README.md diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/addresses.json b/archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/addresses.json similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/addresses.json rename to archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/addresses.json diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/validations/base-signer.json b/archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/validations/base-signer.json similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/config/sepolia/validations/base-signer.json rename to archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/validations/base-signer.json diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792706749452.json b/archive/evm/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792706749452.json similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792706749452.json rename to archive/evm/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792706749452.json diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792707384761.json b/archive/evm/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792707384761.json similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792707384761.json rename to archive/evm/2026-10-21-replace-balance-tracker/records/DeployBalanceTracker.s.sol/11155111/run-1792707384761.json diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployFeeDisburser.s.sol/84532/run-1792707462106.json b/archive/evm/2026-10-21-replace-balance-tracker/records/DeployFeeDisburser.s.sol/84532/run-1792707462106.json similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/records/DeployFeeDisburser.s.sol/84532/run-1792707462106.json rename to archive/evm/2026-10-21-replace-balance-tracker/records/DeployFeeDisburser.s.sol/84532/run-1792707462106.json diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/records/UpgradeFeeDisburser.s.sol/11155111/run-1793208541889.json b/archive/evm/2026-10-21-replace-balance-tracker/records/UpgradeFeeDisburser.s.sol/11155111/run-1793208541889.json similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/records/UpgradeFeeDisburser.s.sol/11155111/run-1793208541889.json rename to archive/evm/2026-10-21-replace-balance-tracker/records/UpgradeFeeDisburser.s.sol/11155111/run-1793208541889.json diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol b/archive/evm/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol rename to archive/evm/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol b/archive/evm/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol rename to archive/evm/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol b/archive/evm/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol rename to archive/evm/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol diff --git a/active/evm/tasks/2026-10-21-replace-balance-tracker/status.json b/archive/evm/2026-10-21-replace-balance-tracker/status.json similarity index 100% rename from active/evm/tasks/2026-10-21-replace-balance-tracker/status.json rename to archive/evm/2026-10-21-replace-balance-tracker/status.json