From bf538a8ea16cdc50ff0e0cd9fd903677626c7a29 Mon Sep 17 00:00:00 2001 From: Leopold Joy Date: Fri, 24 Jul 2026 21:00:06 +0100 Subject: [PATCH 1/3] chore(sepolia): add incident multisig signer replacement task Co-authored-by: OpenCode --- .../2026-07-24-incident-multisig-signers/.env | 10 ++ .../FACILITATOR.md | 43 +++++ .../Makefile | 45 ++++++ .../OwnerDiff.json | 8 + .../README.md | 18 +++ .../foundry.toml | 26 +++ .../script/UpdateSigners.s.sol | 149 ++++++++++++++++++ 7 files changed, 299 insertions(+) create mode 100644 sepolia/2026-07-24-incident-multisig-signers/.env create mode 100644 sepolia/2026-07-24-incident-multisig-signers/FACILITATOR.md create mode 100644 sepolia/2026-07-24-incident-multisig-signers/Makefile create mode 100644 sepolia/2026-07-24-incident-multisig-signers/OwnerDiff.json create mode 100644 sepolia/2026-07-24-incident-multisig-signers/README.md create mode 100644 sepolia/2026-07-24-incident-multisig-signers/foundry.toml create mode 100644 sepolia/2026-07-24-incident-multisig-signers/script/UpdateSigners.s.sol diff --git a/sepolia/2026-07-24-incident-multisig-signers/.env b/sepolia/2026-07-24-incident-multisig-signers/.env new file mode 100644 index 00000000..0713738f --- /dev/null +++ b/sepolia/2026-07-24-incident-multisig-signers/.env @@ -0,0 +1,10 @@ +BASE_CONTRACTS_COMMIT=e225648a7ed538e7e28c041d44f3b7a606ba7743 + +# Sepolia Incident Multisig. +OWNER_SAFE=0x646132A1667ca7aD00d36616AFBA1A28116C770A + +# Sepolia mock Security Council Safe. +SECURITY_COUNCIL_SAFE=0x6AF0674791925f767060Dd52f7fB20984E8639d8 + +# Required for the task signer tool. +RECORD_STATE_DIFF=true diff --git a/sepolia/2026-07-24-incident-multisig-signers/FACILITATOR.md b/sepolia/2026-07-24-incident-multisig-signers/FACILITATOR.md new file mode 100644 index 00000000..dedf2c2b --- /dev/null +++ b/sepolia/2026-07-24-incident-multisig-signers/FACILITATOR.md @@ -0,0 +1,43 @@ +# Facilitator Guide + +The same signer diff is applied to both Safes: + +- Incident Multisig: `OWNER_SAFE` in [.env](./.env) +- Mock Security Council Safe: `SECURITY_COUNCIL_SAFE` in [.env](./.env) + +## Generate validation files + +```bash +cd contract-deployments/sepolia/2026-07-24-incident-multisig-signers +make deps +make gen-validation +``` + +This produces: + +- `validations/base-signer.json` +- `validations/security-council-signer.json` + +Do not generate validation files until `.env` and [OwnerDiff.json](./OwnerDiff.json) are final. + +## Execute the transactions + +### Incident Multisig + +Collect enough Incident Multisig signatures, concatenate them, and run: + +```bash +export SIGNATURES="[SIGNATURE1][SIGNATURE2]..." +SIGNATURES=$SIGNATURES make execute-incident +``` + +### Mock Security Council Safe + +Collect enough mock Security Council Safe signatures, concatenate them, and run: + +```bash +export SIGNATURES="[SIGNATURE1][SIGNATURE2]..." +SIGNATURES=$SIGNATURES make execute-security-council +``` + +After execution, update [README.md](./README.md) status to `EXECUTED` with the transaction links and check in any generated execution records. diff --git a/sepolia/2026-07-24-incident-multisig-signers/Makefile b/sepolia/2026-07-24-incident-multisig-signers/Makefile new file mode 100644 index 00000000..89e5e5b6 --- /dev/null +++ b/sepolia/2026-07-24-incident-multisig-signers/Makefile @@ -0,0 +1,45 @@ +include ../../Makefile +include ../../Multisig.mk +-include ../.env +include .env + +SIGNER_TOOL_PATH = ../../signer-tool +RPC_URL = $(L1_RPC_URL) +SCRIPT_NAME = script/UpdateSigners.s.sol:UpdateSigners + +INCIDENT_SENDER := $(shell $(MISE_EXEC) cast call $(OWNER_SAFE) "getOwners()(address[])" --rpc-url $(RPC_URL) | tr -d '[]' | cut -d',' -f1) +SECURITY_COUNCIL_SENDER := $(shell $(MISE_EXEC) cast call $(SECURITY_COUNCIL_SAFE) "getOwners()(address[])" --rpc-url $(RPC_URL) | tr -d '[]' | cut -d',' -f1) + +.PHONY: validate-config +validate-config: + @test -n "$(BASE_CONTRACTS_COMMIT)" || (echo "BASE_CONTRACTS_COMMIT required" && exit 1) + @test -n "$(OWNER_SAFE)" || (echo "OWNER_SAFE required" && exit 1) + @test -n "$(SECURITY_COUNCIL_SAFE)" || (echo "SECURITY_COUNCIL_SAFE required" && exit 1) + +.PHONY: deps +deps: task-extra-deps + +.PHONY: task-extra-deps +task-extra-deps: + $(MISE_EXEC) forge install --no-git safe-global/safe-smart-account@186a21a74b327f17fc41217a927dea7064f74604 + +.PHONY: gen-validation +gen-validation: gen-validation-incident gen-validation-security-council + +.PHONY: gen-validation-incident +gen-validation-incident: validate-config deps-signer-tool + mkdir -p validations + $(call GEN_VALIDATION,$(SCRIPT_NAME),,$(INCIDENT_SENDER),base-signer.json,) + +.PHONY: gen-validation-security-council +gen-validation-security-council: validate-config deps-signer-tool + mkdir -p validations + $(call GEN_VALIDATION,$(SCRIPT_NAME),,$(SECURITY_COUNCIL_SENDER),security-council-signer.json,OWNER_SAFE=$(SECURITY_COUNCIL_SAFE)) + +.PHONY: execute-incident +execute-incident: validate-config + $(call MULTISIG_EXECUTE,$(SIGNATURES)) + +.PHONY: execute-security-council +execute-security-council: validate-config + OWNER_SAFE=$(SECURITY_COUNCIL_SAFE) $(call MULTISIG_EXECUTE,$(SIGNATURES)) diff --git a/sepolia/2026-07-24-incident-multisig-signers/OwnerDiff.json b/sepolia/2026-07-24-incident-multisig-signers/OwnerDiff.json new file mode 100644 index 00000000..f1edd4b4 --- /dev/null +++ b/sepolia/2026-07-24-incident-multisig-signers/OwnerDiff.json @@ -0,0 +1,8 @@ +{ + "OwnersToAdd": [ + "0x2c1475476B586d66a85bC65A5aB396BBbAa4f3aD" + ], + "OwnersToRemove": [ + "0x72069542Ca378553A3D479c82Adc31f21CA6dE4a" + ] +} diff --git a/sepolia/2026-07-24-incident-multisig-signers/README.md b/sepolia/2026-07-24-incident-multisig-signers/README.md new file mode 100644 index 00000000..04e36096 --- /dev/null +++ b/sepolia/2026-07-24-incident-multisig-signers/README.md @@ -0,0 +1,18 @@ +# Update Sepolia Incident Multisig Signers + +Status: READY TO SIGN + +## Description + +This task updates the owner sets for the Sepolia Incident Multisig and mock Security Council Safe. + +It replaces `0x72069542Ca378553A3D479c82Adc31f21CA6dE4a` with `0x2c1475476B586d66a85bC65A5aB396BBbAa4f3aD` on both Safes. The signer changes are configured in [OwnerDiff.json](./OwnerDiff.json). + +## Procedure + +1. Run `make sign-task` from `contract-deployments`. +2. Open [http://localhost:3000](http://localhost:3000) and select `sepolia/2026-07-24-incident-multisig-signers`. +3. Select `base-signer.json` for the Incident Multisig or `security-council-signer.json` for the mock Security Council Safe, then sign the task. +4. Send the signature to the facilitator. + +See `FACILITATOR.md` for execution instructions. diff --git a/sepolia/2026-07-24-incident-multisig-signers/foundry.toml b/sepolia/2026-07-24-incident-multisig-signers/foundry.toml new file mode 100644 index 00000000..87139de6 --- /dev/null +++ b/sepolia/2026-07-24-incident-multisig-signers/foundry.toml @@ -0,0 +1,26 @@ +[profile.default] +src = 'src' +out = 'out' +libs = ['lib'] +broadcast = 'records' +fs_permissions = [{ access = "read-write", path = "./" }] +optimizer = true +optimizer_runs = 999999 +solc_version = "0.8.15" +via-ir = false +evm_version = "shanghai" +remappings = [ + '@base-contracts/=lib/contracts', + '@lib-keccak/=lib/lib-keccak/contracts/lib/', + '@solady/=lib/solady/src/', + 'forge-std/=lib/forge-std/src/', + 'interfaces/L1/=lib/contracts/interfaces/L1/', + 'interfaces/legacy/=lib/contracts/interfaces/legacy/', + 'interfaces/universal/=lib/contracts/interfaces/universal/', + 'src/libraries/=lib/contracts/src/libraries/', +] + +[lint] +lint_on_build = false + +# See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/sepolia/2026-07-24-incident-multisig-signers/script/UpdateSigners.s.sol b/sepolia/2026-07-24-incident-multisig-signers/script/UpdateSigners.s.sol new file mode 100644 index 00000000..41cc9879 --- /dev/null +++ b/sepolia/2026-07-24-incident-multisig-signers/script/UpdateSigners.s.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import {Vm} from "forge-std/Vm.sol"; +import {stdJson} from "forge-std/StdJson.sol"; + +import {MultisigScript, Enum} from "@base-contracts/scripts/universal/MultisigScript.sol"; +import {Simulation} from "@base-contracts/scripts/universal/Simulation.sol"; +import {GnosisSafe} from "safe-smart-account/GnosisSafe.sol"; +import {OwnerManager} from "safe-smart-account/base/OwnerManager.sol"; + +contract UpdateSigners is MultisigScript { + using stdJson for string; + + address public constant SENTINEL_OWNERS = address(0x1); + uint256 public constant EXPECTED_OWNERS_TO_ADD = 1; + uint256 public constant EXPECTED_OWNERS_TO_REMOVE = 1; + + address public immutable OWNER_SAFE = vm.envAddress("OWNER_SAFE"); + uint256 public immutable THRESHOLD; + address[] public EXISTING_OWNERS; + + address[] public OWNERS_TO_ADD; + address[] public OWNERS_TO_REMOVE; + + mapping(address => address) public ownerToPrevOwner; + mapping(address => address) public ownerToNextOwner; + mapping(address => bool) public expectedOwner; + + constructor() { + GnosisSafe ownerSafe = GnosisSafe(payable(OWNER_SAFE)); + THRESHOLD = ownerSafe.getThreshold(); + EXISTING_OWNERS = ownerSafe.getOwners(); + + string memory path = string.concat(vm.projectRoot(), "/OwnerDiff.json"); + string memory jsonData = vm.readFile(path); + + OWNERS_TO_ADD = abi.decode(jsonData.parseRaw(".OwnersToAdd"), (address[])); + OWNERS_TO_REMOVE = abi.decode(jsonData.parseRaw(".OwnersToRemove"), (address[])); + } + + function setUp() external { + require(OWNERS_TO_ADD.length == EXPECTED_OWNERS_TO_ADD, "Precheck 00"); + require(OWNERS_TO_REMOVE.length == EXPECTED_OWNERS_TO_REMOVE, "Precheck 01"); + require(EXISTING_OWNERS.length + OWNERS_TO_ADD.length >= OWNERS_TO_REMOVE.length, "Precheck 02"); + + uint256 expectedLength = EXISTING_OWNERS.length + OWNERS_TO_ADD.length - OWNERS_TO_REMOVE.length; + require(expectedLength >= THRESHOLD, "Precheck 03"); + + GnosisSafe ownerSafe = GnosisSafe(payable(OWNER_SAFE)); + address prevOwner = SENTINEL_OWNERS; + + for (uint256 i = OWNERS_TO_ADD.length; i > 0; i--) { + uint256 index = i - 1; + address ownerToAdd = OWNERS_TO_ADD[index]; + + _validateOwnerAddress(ownerToAdd); + require(!ownerSafe.isOwner(ownerToAdd), "Precheck 04"); + require(!expectedOwner[ownerToAdd], "Precheck 05"); + + ownerToPrevOwner[ownerToAdd] = prevOwner; + ownerToNextOwner[prevOwner] = ownerToAdd; + prevOwner = ownerToAdd; + expectedOwner[ownerToAdd] = true; + } + + for (uint256 i; i < EXISTING_OWNERS.length; i++) { + _validateOwnerAddress(EXISTING_OWNERS[i]); + + ownerToPrevOwner[EXISTING_OWNERS[i]] = prevOwner; + ownerToNextOwner[prevOwner] = EXISTING_OWNERS[i]; + prevOwner = EXISTING_OWNERS[i]; + expectedOwner[EXISTING_OWNERS[i]] = true; + } + + for (uint256 i; i < OWNERS_TO_REMOVE.length; i++) { + address ownerToRemove = OWNERS_TO_REMOVE[i]; + + _validateOwnerAddress(ownerToRemove); + require(ownerSafe.isOwner(ownerToRemove), "Precheck 06"); + require(expectedOwner[ownerToRemove], "Precheck 07"); + + expectedOwner[ownerToRemove] = false; + + address nextOwner = ownerToNextOwner[ownerToRemove]; + address prevPtr = ownerToPrevOwner[ownerToRemove]; + ownerToPrevOwner[nextOwner] = prevPtr; + ownerToNextOwner[prevPtr] = nextOwner; + } + } + + function _postCheck(Vm.AccountAccess[] memory, Simulation.Payload memory) internal view override { + GnosisSafe ownerSafe = GnosisSafe(payable(OWNER_SAFE)); + address[] memory postCheckOwners = ownerSafe.getOwners(); + uint256 postCheckThreshold = ownerSafe.getThreshold(); + + uint256 expectedLength = EXISTING_OWNERS.length + OWNERS_TO_ADD.length - OWNERS_TO_REMOVE.length; + + require(postCheckThreshold == THRESHOLD, "Postcheck 00"); + require(postCheckOwners.length == expectedLength, "Postcheck 01"); + + for (uint256 i; i < OWNERS_TO_ADD.length; i++) { + require(ownerSafe.isOwner(OWNERS_TO_ADD[i]), "Postcheck 02"); + } + + for (uint256 i; i < OWNERS_TO_REMOVE.length; i++) { + require(!ownerSafe.isOwner(OWNERS_TO_REMOVE[i]), "Postcheck 03"); + } + + for (uint256 i; i < postCheckOwners.length; i++) { + require(expectedOwner[postCheckOwners[i]], "Postcheck 04"); + } + } + + function _buildCalls() internal view override returns (Call[] memory) { + Call[] memory calls = new Call[](OWNERS_TO_ADD.length + OWNERS_TO_REMOVE.length); + + for (uint256 i; i < OWNERS_TO_ADD.length; i++) { + calls[i] = Call({ + operation: Enum.Operation.Call, + target: OWNER_SAFE, + data: abi.encodeCall(OwnerManager.addOwnerWithThreshold, (OWNERS_TO_ADD[i], THRESHOLD)), + value: 0 + }); + } + + for (uint256 i; i < OWNERS_TO_REMOVE.length; i++) { + calls[OWNERS_TO_ADD.length + i] = Call({ + operation: Enum.Operation.Call, + target: OWNER_SAFE, + data: abi.encodeCall( + OwnerManager.removeOwner, (ownerToPrevOwner[OWNERS_TO_REMOVE[i]], OWNERS_TO_REMOVE[i], THRESHOLD) + ), + value: 0 + }); + } + + return calls; + } + + function _ownerSafe() internal view override returns (address) { + return OWNER_SAFE; + } + + function _validateOwnerAddress(address owner) internal pure { + require(owner != address(0), "owner zero"); + require(owner != SENTINEL_OWNERS, "owner sentinel"); + } +} From d54474bd84e3e82b971a0d8e06c605674f3c4bb8 Mon Sep 17 00:00:00 2001 From: Leopold Joy Date: Fri, 24 Jul 2026 21:20:14 +0100 Subject: [PATCH 2/3] chore(sepolia): add signer validation files Co-authored-by: OpenCode --- .../validations/base-signer.json | 75 +++++++++++++++++++ .../validations/security-council-signer.json | 62 +++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 sepolia/2026-07-24-incident-multisig-signers/validations/base-signer.json create mode 100644 sepolia/2026-07-24-incident-multisig-signers/validations/security-council-signer.json diff --git a/sepolia/2026-07-24-incident-multisig-signers/validations/base-signer.json b/sepolia/2026-07-24-incident-multisig-signers/validations/base-signer.json new file mode 100644 index 00000000..15dc65af --- /dev/null +++ b/sepolia/2026-07-24-incident-multisig-signers/validations/base-signer.json @@ -0,0 +1,75 @@ +{ + "cmd": "mise exec -- forge script --rpc-url https://ethereum-full-sepolia-k8s-dev.cbhq.net script/UpdateSigners.s.sol:UpdateSigners --sig sign(address[]) [] --sender 0x72069542Ca378553A3D479c82Adc31f21CA6dE4a", + "ledgerId": 1, + "rpcUrl": "https://ethereum-full-sepolia-k8s-dev.cbhq.net", + "expectedDomainAndMessageHashes": { + "address": "0x646132A1667ca7aD00d36616AFBA1A28116C770A", + "domainHash": "0x1d3f2566fd7b1bf017258b03d4d4d435d326d9cb051d5b7993d7c65e7ec78d0e", + "messageHash": "0x675626096deeedd6a81e059ed08a267ea84419754dd808d0cd68299e0b970e89" + }, + "stateOverrides": [ + { + "name": "CB Coordinator Safe - Sepolia", + "address": "0x646132A1667ca7aD00d36616AFBA1A28116C770A", + "overrides": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000004", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001", + "description": "Override the threshold to 1 so the transaction simulation can occur.", + "allowDifference": false + }, + { + "key": "0x1d247253a281beaef726b3b2dc11b8e164aba71a921dca0f997f6c2087b41755", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001", + "description": "Simulates an approval from msg.sender in order for the task simulation to succeed.", + "allowDifference": false + } + ] + } + ], + "stateChanges": [ + { + "name": "CB Coordinator Safe - Sepolia", + "address": "0x646132A1667ca7aD00d36616AFBA1A28116C770A", + "changes": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000004", + "before": "0x0000000000000000000000000000000000000000000000000000000000000001", + "after": "0x0000000000000000000000000000000000000000000000000000000000000003", + "description": "Restores the execution threshold from the simulation override value 1 to the expected value 3.", + "allowDifference": false + }, + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000005", + "before": "0x000000000000000000000000000000000000000000000000000000000000001d", + "after": "0x000000000000000000000000000000000000000000000000000000000000001e", + "description": "Increments the Safe nonce from 29 to 30.", + "allowDifference": false + }, + { + "key": "0xceb0c5d13f4f619e5f8efdae7187fef9059df56bd34e0650a02c1c72dd716dfa", + "before": "0x000000000000000000000000821ff2a3fb66b008fa668b40eca9d3535b246575", + "after": "0x0000000000000000000000000000000000000000000000000000000000000000", + "description": "Removes `0x72069542Ca378553A3D479c82Adc31f21CA6dE4a` from the owners mapping by clearing its pointer to `0x821Ff2A3fB66B008fA668B40Eca9d3535B246575`.", + "allowDifference": false + }, + { + "key": "0xd7f94929019af9a6efac262a2ba7cd160a70f89d6d1d5457a59e07618487bacb", + "before": "0x0000000000000000000000000000000000000000000000000000000000000000", + "after": "0x000000000000000000000000821ff2a3fb66b008fa668b40eca9d3535b246575", + "description": "Adds `0x2c1475476B586d66a85bC65A5aB396BBbAa4f3aD` to the owners mapping and points it to `0x821Ff2A3fB66B008fA668B40Eca9d3535B246575`, the next retained owner after removed head owner `0x72069542Ca378553A3D479c82Adc31f21CA6dE4a`.", + "allowDifference": false + }, + { + "key": "0xe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0", + "before": "0x00000000000000000000000072069542ca378553a3d479c82adc31f21ca6de4a", + "after": "0x0000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad", + "description": "Sets the head of the owners linked list to newly added owner `0x2c1475476B586d66a85bC65A5aB396BBbAa4f3aD`.", + "allowDifference": false + } + ] + } + ], + "balanceChanges": [], + "skipTaskOriginValidation": true +} diff --git a/sepolia/2026-07-24-incident-multisig-signers/validations/security-council-signer.json b/sepolia/2026-07-24-incident-multisig-signers/validations/security-council-signer.json new file mode 100644 index 00000000..a59bce5c --- /dev/null +++ b/sepolia/2026-07-24-incident-multisig-signers/validations/security-council-signer.json @@ -0,0 +1,62 @@ +{ + "cmd": "OWNER_SAFE=0x6AF0674791925f767060Dd52f7fB20984E8639d8 mise exec -- forge script --rpc-url https://ethereum-full-sepolia-k8s-dev.cbhq.net script/UpdateSigners.s.sol:UpdateSigners --sig sign(address[]) [] --sender 0x72069542Ca378553A3D479c82Adc31f21CA6dE4a", + "ledgerId": 1, + "rpcUrl": "https://ethereum-full-sepolia-k8s-dev.cbhq.net", + "expectedDomainAndMessageHashes": { + "address": "0x6AF0674791925f767060Dd52f7fB20984E8639d8", + "domainHash": "0x6f25427e79742a1eb82c103e2bf43c85fc59509274ec258ad6ed841c4a0048aa", + "messageHash": "0xb6551b651a6c25b6aaeada9bacafe4ffbeabac301018e5a3d4d746edef532b9a" + }, + "stateOverrides": [ + { + "name": "Mock OP Safe / Mock Security Council - Sepolia", + "address": "0x6AF0674791925f767060Dd52f7fB20984E8639d8", + "overrides": [ + { + "key": "0xeb5307f994da1c3998d64533d53111bc3772e3b30f24629c85372a957de5cd09", + "value": "0x0000000000000000000000000000000000000000000000000000000000000001", + "description": "Simulates an approval from msg.sender in order for the task simulation to succeed.", + "allowDifference": false + } + ] + } + ], + "stateChanges": [ + { + "name": "Mock OP Safe / Mock Security Council - Sepolia", + "address": "0x6AF0674791925f767060Dd52f7fB20984E8639d8", + "changes": [ + { + "key": "0x0000000000000000000000000000000000000000000000000000000000000005", + "before": "0x0000000000000000000000000000000000000000000000000000000000000027", + "after": "0x0000000000000000000000000000000000000000000000000000000000000028", + "description": "Increments the Safe nonce from 39 to 40.", + "allowDifference": false + }, + { + "key": "0xceb0c5d13f4f619e5f8efdae7187fef9059df56bd34e0650a02c1c72dd716dfa", + "before": "0x000000000000000000000000821ff2a3fb66b008fa668b40eca9d3535b246575", + "after": "0x0000000000000000000000000000000000000000000000000000000000000000", + "description": "Removes `0x72069542Ca378553A3D479c82Adc31f21CA6dE4a` from the owners mapping by clearing its pointer to `0x821Ff2A3fB66B008fA668B40Eca9d3535B246575`.", + "allowDifference": false + }, + { + "key": "0xd7f94929019af9a6efac262a2ba7cd160a70f89d6d1d5457a59e07618487bacb", + "before": "0x0000000000000000000000000000000000000000000000000000000000000000", + "after": "0x000000000000000000000000821ff2a3fb66b008fa668b40eca9d3535b246575", + "description": "Adds `0x2c1475476B586d66a85bC65A5aB396BBbAa4f3aD` to the owners mapping and points it to `0x821Ff2A3fB66B008fA668B40Eca9d3535B246575`, the next retained owner after removed head owner `0x72069542Ca378553A3D479c82Adc31f21CA6dE4a`.", + "allowDifference": false + }, + { + "key": "0xe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0", + "before": "0x00000000000000000000000072069542ca378553a3d479c82adc31f21ca6de4a", + "after": "0x0000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad", + "description": "Sets the head of the owners linked list to newly added owner `0x2c1475476B586d66a85bC65A5aB396BBbAa4f3aD`.", + "allowDifference": false + } + ] + } + ], + "balanceChanges": [], + "skipTaskOriginValidation": true +} From 302f90b5afeeb78c07fc4c6ef3daf4a667cfeb3e Mon Sep 17 00:00:00 2001 From: Leopold Joy Date: Fri, 24 Jul 2026 23:30:59 +0100 Subject: [PATCH 3/3] chore(sepolia): mark signer update executed Co-authored-by: OpenCode --- .../README.md | 7 +- .../11155111/run-1784930653795.json | 101 ++++++++++++++++++ .../11155111/run-1784930880560.json | 101 ++++++++++++++++++ 3 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 sepolia/2026-07-24-incident-multisig-signers/records/UpdateSigners.s.sol/11155111/run-1784930653795.json create mode 100644 sepolia/2026-07-24-incident-multisig-signers/records/UpdateSigners.s.sol/11155111/run-1784930880560.json diff --git a/sepolia/2026-07-24-incident-multisig-signers/README.md b/sepolia/2026-07-24-incident-multisig-signers/README.md index 04e36096..7caa4378 100644 --- a/sepolia/2026-07-24-incident-multisig-signers/README.md +++ b/sepolia/2026-07-24-incident-multisig-signers/README.md @@ -1,6 +1,11 @@ # Update Sepolia Incident Multisig Signers -Status: READY TO SIGN +Status: EXECUTED ([Incident Multisig](https://sepolia.etherscan.io/tx/0x67f0110015d7854276b90bb8e3915b44d6aba2022b06d1994454d101dc3dd6b3) and [mock Security Council Safe](https://sepolia.etherscan.io/tx/0x0e33d244f0c2ebf1c938eb67e746fc02a91652621ae48b32f41be95b721bd11c)) + +## Transactions + +- Incident Multisig update ([`0x646132A1667ca7aD00d36616AFBA1A28116C770A`](https://sepolia.etherscan.io/address/0x646132A1667ca7aD00d36616AFBA1A28116C770A)): [`0x67f0110015d7854276b90bb8e3915b44d6aba2022b06d1994454d101dc3dd6b3`](https://sepolia.etherscan.io/tx/0x67f0110015d7854276b90bb8e3915b44d6aba2022b06d1994454d101dc3dd6b3) (artefacts: [run-1784930653795.json](./records/UpdateSigners.s.sol/11155111/run-1784930653795.json)) +- Mock Security Council Safe update ([`0x6AF0674791925f767060Dd52f7fB20984E8639d8`](https://sepolia.etherscan.io/address/0x6AF0674791925f767060Dd52f7fB20984E8639d8)): [`0x0e33d244f0c2ebf1c938eb67e746fc02a91652621ae48b32f41be95b721bd11c`](https://sepolia.etherscan.io/tx/0x0e33d244f0c2ebf1c938eb67e746fc02a91652621ae48b32f41be95b721bd11c) (artefacts: [run-1784930880560.json](./records/UpdateSigners.s.sol/11155111/run-1784930880560.json)) ## Description diff --git a/sepolia/2026-07-24-incident-multisig-signers/records/UpdateSigners.s.sol/11155111/run-1784930653795.json b/sepolia/2026-07-24-incident-multisig-signers/records/UpdateSigners.s.sol/11155111/run-1784930653795.json new file mode 100644 index 00000000..fb63fea6 --- /dev/null +++ b/sepolia/2026-07-24-incident-multisig-signers/records/UpdateSigners.s.sol/11155111/run-1784930653795.json @@ -0,0 +1,101 @@ +{ + "transactions": [ + { + "hash": "0x67f0110015d7854276b90bb8e3915b44d6aba2022b06d1994454d101dc3dd6b3", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x646132a1667ca7ad00d36616afba1a28116c770a", + "function": "execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)", + "arguments": [ + "0xA8B8CA1d6F0F5Ce63dCEA9121A01b302c5801303", + "0", + "0x858cc8320000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000340000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c580130300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000026482ad56cb0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000646132a1667ca7ad00d36616afba1a28116c770a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000440d582f130000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000646132a1667ca7ad00d36616afba1a28116c770a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064f8dc5dd90000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad00000000000000000000000072069542ca378553a3d479c82adc31f21ca6de4a000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "1", + "0", + "0", + "0", + "0x0000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000", + "0x66c9af2254b844b0780bd323b09e96c185c8f1112fd04306d750a3d4863d014f2a2969efe6461a00bb7a35e0a6776209569a62869e267e1979b2dad86911ae0e1b7d7679ad50bc1b9eb4396d93f4eb2abe7675e52c0d99f83180945a9c6613212b326a5faee028bda369d3d4ea4464c18b3aaf53b56bd2b6e9315998ab01fd59fd1b76a11db7e765af22dcea58e3b1c458c8fa9a79e7d24a6ea654c8c4e0eaf1f67f42e1e63eef843421b4b590cb108c05f77ac5b698e4c7dd6b755ac2ca72f45e561b" + ], + "transaction": { + "from": "0x6e427c3212c0b63be0c382f97715d49b011bff33", + "to": "0x646132a1667ca7ad00d36616afba1a28116c770a", + "gas": "0x285ed", + "value": "0x0", + "input": "0x6a761202000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c58013030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000404858cc8320000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000340000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c580130300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000026482ad56cb0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000646132a1667ca7ad00d36616afba1a28116c770a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000440d582f130000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000646132a1667ca7ad00d36616afba1a28116c770a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064f8dc5dd90000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad00000000000000000000000072069542ca378553a3d479c82adc31f21ca6de4a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c366c9af2254b844b0780bd323b09e96c185c8f1112fd04306d750a3d4863d014f2a2969efe6461a00bb7a35e0a6776209569a62869e267e1979b2dad86911ae0e1b7d7679ad50bc1b9eb4396d93f4eb2abe7675e52c0d99f83180945a9c6613212b326a5faee028bda369d3d4ea4464c18b3aaf53b56bd2b6e9315998ab01fd59fd1b76a11db7e765af22dcea58e3b1c458c8fa9a79e7d24a6ea654c8c4e0eaf1f67f42e1e63eef843421b4b590cb108c05f77ac5b698e4c7dd6b755ac2ca72f45e561b0000000000000000000000000000000000000000000000000000000000", + "nonce": "0x3f3", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xc79952", + "logs": [ + { + "address": "0x646132a1667ca7ad00d36616afba1a28116c770a", + "topics": [ + "0x9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26" + ], + "data": "0x0000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad", + "blockHash": "0xf76ea0864b4e2d69c1b4d361c2b7f97cb9ea089dc8374db77ce3d2610ed41b1d", + "blockNumber": "0xad1685", + "blockTimestamp": "0x6a63e15c", + "transactionHash": "0x67f0110015d7854276b90bb8e3915b44d6aba2022b06d1994454d101dc3dd6b3", + "transactionIndex": "0x66", + "logIndex": "0x10f", + "removed": false + }, + { + "address": "0x646132a1667ca7ad00d36616afba1a28116c770a", + "topics": [ + "0xf8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf" + ], + "data": "0x00000000000000000000000072069542ca378553a3d479c82adc31f21ca6de4a", + "blockHash": "0xf76ea0864b4e2d69c1b4d361c2b7f97cb9ea089dc8374db77ce3d2610ed41b1d", + "blockNumber": "0xad1685", + "blockTimestamp": "0x6a63e15c", + "transactionHash": "0x67f0110015d7854276b90bb8e3915b44d6aba2022b06d1994454d101dc3dd6b3", + "transactionIndex": "0x66", + "logIndex": "0x110", + "removed": false + }, + { + "address": "0x646132a1667ca7ad00d36616afba1a28116c770a", + "topics": [ + "0x442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e" + ], + "data": "0xda5d73e482f5c89ddf3174f756a761c5b50c9dd7eed8b647959291986840ba480000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xf76ea0864b4e2d69c1b4d361c2b7f97cb9ea089dc8374db77ce3d2610ed41b1d", + "blockNumber": "0xad1685", + "blockTimestamp": "0x6a63e15c", + "transactionHash": "0x67f0110015d7854276b90bb8e3915b44d6aba2022b06d1994454d101dc3dd6b3", + "transactionIndex": "0x66", + "logIndex": "0x111", + "removed": false + } + ], + "logsBloom": "0x00000000400000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000004000000000000010000000000000000000000000000000000000000000000000000000000000000000004000020000040000000000000400000000000000000000000008000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x67f0110015d7854276b90bb8e3915b44d6aba2022b06d1994454d101dc3dd6b3", + "transactionIndex": "0x66", + "blockHash": "0xf76ea0864b4e2d69c1b4d361c2b7f97cb9ea089dc8374db77ce3d2610ed41b1d", + "blockNumber": "0xad1685", + "gasUsed": "0x1d3a4", + "effectiveGasPrice": "0x3f6e46ec", + "from": "0x6e427c3212c0b63be0c382f97715d49b011bff33", + "to": "0x646132a1667ca7ad00d36616afba1a28116c770a", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1784930653795, + "chain": 11155111, + "commit": "d54474b" +} \ No newline at end of file diff --git a/sepolia/2026-07-24-incident-multisig-signers/records/UpdateSigners.s.sol/11155111/run-1784930880560.json b/sepolia/2026-07-24-incident-multisig-signers/records/UpdateSigners.s.sol/11155111/run-1784930880560.json new file mode 100644 index 00000000..92d1eca1 --- /dev/null +++ b/sepolia/2026-07-24-incident-multisig-signers/records/UpdateSigners.s.sol/11155111/run-1784930880560.json @@ -0,0 +1,101 @@ +{ + "transactions": [ + { + "hash": "0x0e33d244f0c2ebf1c938eb67e746fc02a91652621ae48b32f41be95b721bd11c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x6af0674791925f767060dd52f7fb20984e8639d8", + "function": "execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)", + "arguments": [ + "0xA8B8CA1d6F0F5Ce63dCEA9121A01b302c5801303", + "0", + "0x858cc8320000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000340000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c580130300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000026482ad56cb00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001200000000000000000000000006af0674791925f767060dd52f7fb20984e8639d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000440d582f130000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000006af0674791925f767060dd52f7fb20984e8639d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064f8dc5dd90000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad00000000000000000000000072069542ca378553a3d479c82adc31f21ca6de4a000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "1", + "0", + "0", + "0", + "0x0000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000", + "0x13f2e441a89013e4b76b66683ad7a7d119a21ea1fd059e608645894c722a075969ef5e17e0f0f62ea328849c1544596f409ddfbd355f10d71e4c5e78dc2780871c" + ], + "transaction": { + "from": "0x6e427c3212c0b63be0c382f97715d49b011bff33", + "to": "0x6af0674791925f767060dd52f7fb20984e8639d8", + "gas": "0x23b4b", + "value": "0x0", + "input": "0x6a761202000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c58013030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000404858cc8320000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000340000000000000000000000000a8b8ca1d6f0f5ce63dcea9121a01b302c580130300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000026482ad56cb00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001200000000000000000000000006af0674791925f767060dd52f7fb20984e8639d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000440d582f130000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000006af0674791925f767060dd52f7fb20984e8639d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064f8dc5dd90000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad00000000000000000000000072069542ca378553a3d479c82adc31f21ca6de4a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004113f2e441a89013e4b76b66683ad7a7d119a21ea1fd059e608645894c722a075969ef5e17e0f0f62ea328849c1544596f409ddfbd355f10d71e4c5e78dc2780871c00000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x3f4", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xb887e4", + "logs": [ + { + "address": "0x6af0674791925f767060dd52f7fb20984e8639d8", + "topics": [ + "0x9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26" + ], + "data": "0x0000000000000000000000002c1475476b586d66a85bc65a5ab396bbbaa4f3ad", + "blockHash": "0xc2a628b2696069e139aa97b3ade126bee616284f71b00b800b67736e29770654", + "blockNumber": "0xad1698", + "blockTimestamp": "0x6a63e240", + "transactionHash": "0x0e33d244f0c2ebf1c938eb67e746fc02a91652621ae48b32f41be95b721bd11c", + "transactionIndex": "0x6d", + "logIndex": "0x18a", + "removed": false + }, + { + "address": "0x6af0674791925f767060dd52f7fb20984e8639d8", + "topics": [ + "0xf8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf" + ], + "data": "0x00000000000000000000000072069542ca378553a3d479c82adc31f21ca6de4a", + "blockHash": "0xc2a628b2696069e139aa97b3ade126bee616284f71b00b800b67736e29770654", + "blockNumber": "0xad1698", + "blockTimestamp": "0x6a63e240", + "transactionHash": "0x0e33d244f0c2ebf1c938eb67e746fc02a91652621ae48b32f41be95b721bd11c", + "transactionIndex": "0x6d", + "logIndex": "0x18b", + "removed": false + }, + { + "address": "0x6af0674791925f767060dd52f7fb20984e8639d8", + "topics": [ + "0x442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e" + ], + "data": "0x58fd34c705e9fd1f5cceac3559d05ca7e953ff8e98b9a78eba38dff1e50dd4240000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xc2a628b2696069e139aa97b3ade126bee616284f71b00b800b67736e29770654", + "blockNumber": "0xad1698", + "blockTimestamp": "0x6a63e240", + "transactionHash": "0x0e33d244f0c2ebf1c938eb67e746fc02a91652621ae48b32f41be95b721bd11c", + "transactionIndex": "0x6d", + "logIndex": "0x18c", + "removed": false + } + ], + "logsBloom": "0x00000000400000040000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000400000000010000000000000008000000000000000000008000000", + "type": "0x2", + "transactionHash": "0x0e33d244f0c2ebf1c938eb67e746fc02a91652621ae48b32f41be95b721bd11c", + "transactionIndex": "0x6d", + "blockHash": "0xc2a628b2696069e139aa97b3ade126bee616284f71b00b800b67736e29770654", + "blockNumber": "0xad1698", + "gasUsed": "0x19d9c", + "effectiveGasPrice": "0x3d2526ab", + "from": "0x6e427c3212c0b63be0c382f97715d49b011bff33", + "to": "0x6af0674791925f767060dd52f7fb20984e8639d8", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1784930880560, + "chain": 11155111, + "commit": "d54474b" +} \ No newline at end of file