diff --git a/archive/evm/2026-10-21-replace-balance-tracker/FACILITATOR.md b/archive/evm/2026-10-21-replace-balance-tracker/FACILITATOR.md new file mode 100644 index 00000000..27176ca9 --- /dev/null +++ b/archive/evm/2026-10-21-replace-balance-tracker/FACILITATOR.md @@ -0,0 +1,78 @@ +# 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. 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 +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. 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 + +```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. 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 + +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/archive/evm/2026-10-21-replace-balance-tracker/Makefile b/archive/evm/2026-10-21-replace-balance-tracker/Makefile new file mode 100644 index 00000000..05591ecb --- /dev/null +++ b/archive/evm/2026-10-21-replace-balance-tracker/Makefile @@ -0,0 +1,111 @@ +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) +## +# 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. + +# 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 + @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 --skip-simulation $(if $(RESUME),--resume) -vvvv || { echo "$(PARTIAL_DEPLOY)"; exit 1; } + +.PHONY: deploy-l2 +deploy-l2: + $(call require_deployed,.balanceTracker,Run deploy-l1 before deploy-l2) +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 $(if $(RESUME),--resume) -vvvv || { echo "$(PARTIAL_DEPLOY)"; exit 1; } + +.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/archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/.env b/archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/.env new file mode 100644 index 00000000..4d786bbc --- /dev/null +++ b/archive/evm/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/archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/README.md b/archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/README.md new file mode 100644 index 00000000..d47b5f94 --- /dev/null +++ b/archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/README.md @@ -0,0 +1,23 @@ +# 2026-10-21-replace-balance-tracker + +Status: EXECUTED +https://sepolia.etherscan.io/tx/0x1d9e7be871ea17c1fc215940e01c19dfabbb67ace76d83275ac72f0609096789 + +## Description + +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` the new implementation `0xdC3e4dB1947F57fB18b093924Ca95B96ddc1ef2e`, whose `L1_WALLET` is the new `BalanceTracker`. +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/archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/addresses.json b/archive/evm/2026-10-21-replace-balance-tracker/config/sepolia/addresses.json new file mode 100644 index 00000000..f356a6fc --- /dev/null +++ b/archive/evm/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/archive/evm/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 new file mode 100644 index 00000000..b6201545 --- /dev/null +++ b/archive/evm/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/archive/evm/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 new file mode 100644 index 00000000..0d2d8586 --- /dev/null +++ b/archive/evm/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/archive/evm/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 new file mode 100644 index 00000000..747eb6a6 --- /dev/null +++ b/archive/evm/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/archive/evm/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 new file mode 100644 index 00000000..54a2756f --- /dev/null +++ b/archive/evm/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/archive/evm/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 new file mode 100644 index 00000000..b815fd31 --- /dev/null +++ b/archive/evm/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/archive/evm/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol b/archive/evm/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol new file mode 100644 index 00000000..3d54982a --- /dev/null +++ b/archive/evm/2026-10-21-replace-balance-tracker/script/DeployBalanceTracker.s.sol @@ -0,0 +1,107 @@ +// 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 { + vm.startBroadcast(); + (, address deployer,) = vm.readCallers(); + + balanceTrackerImpl = address(new BalanceTracker(PROFIT_WALLET)); + Proxy proxy = new Proxy(deployer); + proxy.upgradeToAndCall(balanceTrackerImpl, _initializeCall()); + 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"); + (bool hasThird,) = balanceTracker.staticcall(abi.encodeWithSelector(tracker.systemAddresses.selector, 2)); + require(!hasThird, "unexpected system address count"); + + _assertInitializerLocked(balanceTracker, "proxy can be reinitialized"); + _assertInitializerLocked(balanceTrackerImpl, "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); + } + + /// @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/archive/evm/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol b/archive/evm/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol new file mode 100644 index 00000000..7c4f0216 --- /dev/null +++ b/archive/evm/2026-10-21-replace-balance-tracker/script/DeployFeeDisburser.s.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +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 { + 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. 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(); + + 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); + } +} diff --git a/archive/evm/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol b/archive/evm/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol new file mode 100644 index 00000000..880efbc4 --- /dev/null +++ b/archive/evm/2026-10-21-replace-balance-tracker/script/UpgradeFeeDisburser.s.sol @@ -0,0 +1,143 @@ +// 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 NEW_ADMIN_L2_ALIAS; + 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"); + 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"); + BALANCE_TRACKER = vm.envAddress("NEW_BALANCE_TRACKER"); + L2_FORK = vm.createFork(vm.envString("L2_RPC_URL")); + + require( + 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, (NEW_ADMIN_L2_ALIAS)); + } + + 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/archive/evm/2026-10-21-replace-balance-tracker/status.json b/archive/evm/2026-10-21-replace-balance-tracker/status.json new file mode 100644 index 00000000..0750777c --- /dev/null +++ b/archive/evm/2026-10-21-replace-balance-tracker/status.json @@ -0,0 +1,20 @@ +{ + "schema_version": 1, + "task": "2026-10-21-replace-balance-tracker", + "kind": "active", + "networks": { + "sepolia": { + "step": "executed", + "pr": "https://github.com/base/contract-deployments/pull/807", + "blocksec_ticket": null, + "signatures": { + "base": { + "collected": 3, + "required": 3 + } + }, + "executed_tx": "0x1d9e7be871ea17c1fc215940e01c19dfabbb67ace76d83275ac72f0609096789" + } + }, + "last_updated": "2026-10-28T17:34:35Z" +} diff --git a/config/sepolia.env b/config/sepolia.env index e7c97c50..6e518e39 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