diff --git a/.circleci/config.yml b/.circleci/config.yml index bef6cc43a4..205031b682 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -100,62 +100,80 @@ jobs: echo "L2 RPC URL: $L2_RPC_URL" # Use L1_RPC_URL and L2_RPC_URL here. - just_simulate_005-protocol-versions-ecotone: + just_simulate_006-MCP-L1: docker: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.35.0 steps: - checkout - run: - name: just simulate 005-protocol-versions-ecotone + name: just simulate 006-MCP-L1 command: | just install forge clean forge build - cd tasks/eth/005-protocol-versions-ecotone + cd tasks/eth/006-MCP-L1 export SIMULATE_WITHOUT_LEDGER=1 just \ --dotenv-path .env \ - --justfile ../../../single.just \ - simulate + --justfile ../../../nested.just \ + simulate foundation + just \ + --dotenv-path .env \ + --justfile ../../../nested.just \ + simulate council - just_simulate_005-2-ecotone-set-gas-config: + just_simulate_007-presigned-pause: docker: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.35.0 steps: - checkout - run: - name: just simulate 005-2-ecotone-set-gas-config + name: just simulate 007-presigned-pause command: | just install - forge clean + cd tasks/eth/007-presigned-pause + just \ + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + install forge build - cd tasks/eth/005-2-ecotone-set-gas-config export SIMULATE_WITHOUT_LEDGER=1 just \ --dotenv-path .env \ - --justfile ../../../single.just \ - simulate + --justfile ../../../presigned-pause.just \ + whoami 0 + just \ + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + sign - just_simulate_005-3-ecotone-calldata-gas-config: + just_simulate_sep_005-presigned-pause: docker: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.35.0 steps: - checkout - run: - name: just simulate 005-3-ecotone-calldata-gas-config + name: just simulate sepolia 005-presigned-pause command: | just install - forge clean + cd tasks/sep/005-presigned-pause + just \ + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + install forge build - cd tasks/eth/005-3-ecotone-calldata-gas-config export SIMULATE_WITHOUT_LEDGER=1 just \ --dotenv-path .env \ - --justfile ../../../single.just \ - simulate + --justfile ../../../presigned-pause.just \ + whoami 0 + just \ + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + sign just_simulate_sc_rehearsal_1: docker: @@ -209,22 +227,6 @@ jobs: just simulate-council just prepare-json just simulate-council # simulate again to make sure the json is still valid - just_simulate_sc_rehearsal_2_0122: - docker: - - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.35.0 - steps: - - checkout - - run: - name: just simulate r2-remove-signer - command: | - just install - cd security-council-rehearsals - cd 2024-01-22-r2-remove-signer-0122 - export SIMULATE_WITHOUT_LEDGER=1 - just simulate - just get-owners - just prepare - just simulate # simulate again to make sure the json is still valid forge_test: docker: - image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.35.0 @@ -262,10 +264,9 @@ workflows: # expect the ceremony to work continuously), and remove it once # the ceremony is for historical archive only (e.g. the # ceremony is done). - - just_simulate_005-protocol-versions-ecotone - - just_simulate_005-2-ecotone-set-gas-config - - just_simulate_005-3-ecotone-calldata-gas-config + - just_simulate_006-MCP-L1 + - just_simulate_007-presigned-pause - just_simulate_sc_rehearsal_1 - just_simulate_sc_rehearsal_2 - just_simulate_sc_rehearsal_4 - - just_simulate_sc_rehearsal_2_0122 + - just_simulate_sep_005-presigned-pause diff --git a/.gitmodules b/.gitmodules index 7ba87ee87c..8669b9d1c4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -17,12 +17,6 @@ [submodule "lib/base-contracts"] path = lib/base-contracts url = https://github.com/base-org/contracts -[submodule "lib/presigner"] - path = lib/presigner - url = https://github.com/ethereum-optimism/presigner.git -[submodule "lib/eip712sign"] - path = lib/eip712sign - url = https://github.com/ethereum-optimism/eip712sign.git [submodule "lib/solady"] path = lib/solady url = https://github.com/Vectorized/solady diff --git a/PRESIGNED-PAUSE.md b/PRESIGNED-PAUSE.md new file mode 100644 index 0000000000..63eec21ca4 --- /dev/null +++ b/PRESIGNED-PAUSE.md @@ -0,0 +1,287 @@ +# Superchain Presigned Pause + +Status: DRAFT, not ready to sign + +## Objective + +This task is intended to generate pre-signed transactions to pause +ETH, ERC20, ERC721 withdrawals across the Superchain. Deposits and L2 +state progression will not be impacted by the pause, only withdrawals. + +The call that will be executed by the Safe contract is defined in a +json file. This will be the standard approach for all transactions. + +Note that no onchain actions will be taking place during this +signing. You won’t be submitting a transaction and your address +doesn’t even need to be funded. These are offchain signatures. + +A Facilitator will collect the signatures and execute the contract. + +## Approving the transaction + +### 1. Update repo and move to the appropriate folder for this rehearsal task + +In addition to the general tools installed when you clone/update the +repo and run `just install` at the root of the repo, this ceremony +also requires a `presigner` tool, which can be installed by running +the following command at the ceremony folder: + +``` +cd superchain-ops +git pull +just install +cd tasks// +just \ + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + install +``` + +### 2. Setup Ledger + +Your Ledger needs to be connected and unlocked. The Ethereum +application needs to be opened on Ledger with the message “Application +is ready”. + +Check your address is correct by running the following command + +``` +just \ + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + whoami 0 +``` + +Where `0` is the index of the address you want to use in the derivation path. + +You should see the output similar to the following: + +``` +Signer: 0x8C835568fE7Eea01B6DCD79214aB5BCe5E1759B0 +``` + +If this is not the address you are expecting, +you can change the index of the address you want to use, i.e. + +``` +just \ + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + whoami 1 +``` + +### 3. Sign the transactions + +The transactions to be signed are inside the `tx` folder named `draft-{nonce}.json` + +You can sign them by running the following commands: + +``` +just \ + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + sign +``` + +The first parameter is the index of the address you want to use in the +derivation path. + +For each transaction we will be performing 3 validations +and ensure the domain hash and message hash are the same +between the Tenderly simulation and your +Ledger: + +1. Validate integrity of the simulation. +2. Validate correctness of the state diff. +3. Validate and extract domain hash and message hash to approve. + +#### 3.1. Validate integrity of the simulation. + +Make sure you are on the "Overview" tab of the tenderly simulation, to +validate integrity of the simulation, we need to + +1. "Network": Check the network is the correct one. +2. "Timestamp": Check the simulation is performed on a block with a + recent timestamp (i.e. close to when you run the script). +3. "Sender": Check the address shown is your signer account. If not, + you will need to determine which “number” it is in the list of + addresses on your ledger. + +Here is an example screenshot, note that the Timestamp and Sender +might be different in your simulation: + +![](images/tenderly-overview-network.png) + +#### 3.2. Validate correctness of the state diff. + +Now click on the "State" tab. Verify that: + +1. Under address `SuperchainConfig` contract + address([mainnet](https://github.com/ethereum-optimism/superchain-registry/blob/77a930120ec63dd50c43483c82b1a0a29939ed27/superchain/configs/mainnet/superchain.yaml#L8), + [sepolia](https://github.com/ethereum-optimism/superchain-registry/blob/77a930120ec63dd50c43483c82b1a0a29939ed27/superchain/configs/sepolia/superchain.yaml#L8)), + the storage key + `0x54176ff9944c47845857c4e5ef560a462c483bf534eda43f91bb01a470b1b6`'s + value is changed from `0x00` to `0x01`. This is indicating that the + `paused` variable is successfully changed from `false` to `true`. +2. There are no other significant state changes except for 2 nonce + changes from the Safe and the signer address. +3. You will see a state override (not a state change). This is + expected and its purpose is to generate a successful Safe execution + simulation without collecting any signatures. + +Here is an example screenshot. Note that the addresses may be +different: + +![](images/tenderly-state-changes-presigned-pause.png) + +#### 3.3. Extract the domain hash and the message hash to approve. + +Now that we have verified the transaction performs the right +operation, we need to extract the domain hash and the message hash to +approve. + +Go back to the "Overview" tab, and find the first +`GnosisSafe.domainSeparator` call. This call's return value will be +the domain hash that will show up in your Ledger. + +Here is an example screenshot. Note that the hash value may be +different: + +![](images/tenderly-hashes-1.png) + +Right before the `GnosisSafe.domainSeparator` call, you will see a +call to `GnosisSafe.encodeTransactionData`. Its return value will be a +concatenation of `0x1901`, the domain hash, and the message hash: +`0x1901[domain hash][message hash]`. + +Here is an example screenshot. Note that the hash value may be +different: + +![](images/tenderly-hashes-2.png) + +Note down both the domain hash and the message hash. You will need to +compare them with the ones displayed on the Ledger screen at signing. + +### 4. Approve the signature on your ledger + +Once the validations are done, approve the transaction in your Ledger. + +> [!IMPORTANT] This is the most security critical part of the +> playbook: make sure the domain hash and message hash in the +> following two places match: + +1. on your Ledger screen. +2. in the Tenderly simulation. You should use the same Tenderly + simulation as the one you used to verify the state diffs, instead + of opening the new one printed in the console. + +There is no need to verify anything printed in the console. There is +no need to open the new Tenderly simulation link either. + +After verification, sign the transaction. You will see the `Data`, +`Signer` and `Signature` printed in the console. Format should be +something like this: + +``` +Data: +Signer:
+Signature: +``` + +Double check the signer address is the right one. + +### 5. Send the output to Facilitator(s) + +Nothing has occurred onchain - these are offchain signatures which +will be collected by Facilitators for execution. Execution can occur +by anyone once a threshold of signatures are collected, so a +Facilitator will do the final execution for convenience. + +The signed transactions are in the `tx` folder. They will be named +according to the address used to sign, i.e. +`tx/draft-92.signer-0x8c78B948Cdd64812993398b4B51ed2603b3543A6.json` +was signed by `0x8c78B948Cdd64812993398b4B51ed2603b3543A6`. Share +these 3 files with the Facilitator, and congrats, you are done! + +## [Before Ceremony] Instructions for the facilitator + +### 1. Update input files + +Update `.env` and `input.json` in the ceremony folder with the right +values. + +### 2. Prepare the transactions + +``` +just \ + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + prepare +``` + +## [After Ceremony] Instructions for the facilitator + +The Facilitator will collect the signatures, merge the signatures, +verify, simulate and execute the contract. + +### 1. Collect the signatures + +The signed transactions are in the `tx` folder. +They will be named according to the address used to sign, i.e. +`tx/draft-92.signer-0x8c78B948Cdd64812993398b4B51ed2603b3543A6.json` +was signed by `0x8c78B948Cdd64812993398b4B51ed2603b3543A6`. + +All signatures should be present in the same transaction file before execution, +so next we'll merge them. + +### 2. Merge the signatures + +To merge the signatures, run the following command: + +``` +just \ + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + merge +``` + +This will overwrite the original `draft-*.json` files with the all merged signatures. + +You can check the file contents with the following command: +``` +cat tx/draft-*.json | jq +``` + +### 3. Verify the signatures + +To verify the signatures, run the following command: + +``` +just + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + verify +``` + +### 4. Simulate the transaction with signatures + +WARNING: do not simulate using public tenderly projects, anyone who +can see the simulation will be able to extract the signature and +execute the pasue! + +To simulate the transaction, run the following command: + +``` +just + --dotenv-path .env \ + --justfile ../../../presigned-pause.just \ + simulate-all +``` + +The simulate command will output the Tenderly simulation link and the +oneliner for further execution. + +### 5. Store and execute the transaction + +Please refer to the internal playbook for how to store the presigned +pause and executed it in emergency situations. diff --git a/images/tenderly-hashes-1.png b/images/tenderly-hashes-1.png new file mode 100644 index 0000000000..7c0690509a Binary files /dev/null and b/images/tenderly-hashes-1.png differ diff --git a/images/tenderly-hashes-2.png b/images/tenderly-hashes-2.png new file mode 100644 index 0000000000..eb0643c70d Binary files /dev/null and b/images/tenderly-hashes-2.png differ diff --git a/images/tenderly-overview-network.png b/images/tenderly-overview-network.png new file mode 100644 index 0000000000..4c8c648c28 Binary files /dev/null and b/images/tenderly-overview-network.png differ diff --git a/images/tenderly-state-changes-presigned-pause.png b/images/tenderly-state-changes-presigned-pause.png new file mode 100644 index 0000000000..0d88e8e91a Binary files /dev/null and b/images/tenderly-state-changes-presigned-pause.png differ diff --git a/justfile b/justfile index f0a7a6a10b..b2a41221f7 100644 --- a/justfile +++ b/justfile @@ -6,16 +6,13 @@ install-contracts: #!/usr/bin/env bash forge install -# install-eip712sign depends on install-contracts because the -# lib/eip712sign submodule needs to be installed by forge install. -install-eip712sign: install-contracts +install-eip712sign: #!/usr/bin/env bash REPO_ROOT=`git rev-parse --show-toplevel` + PATH="$REPO_ROOT/bin:$PATH" cd $REPO_ROOT mkdir -p bin || true - cd lib/eip712sign - go build - cp eip712sign ../../bin + GOBIN="$REPO_ROOT/bin" go install github.com/base-org/eip712sign@v0.0.7 # Bundle path should be provided including the .json file extension. add-transaction bundlePath to sig *params: diff --git a/lib/eip712sign b/lib/eip712sign deleted file mode 160000 index 7446475185..0000000000 --- a/lib/eip712sign +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 74464751854981cc815ac2cfd39a3e39cb4b5654 diff --git a/lib/presigner b/lib/presigner deleted file mode 160000 index 22ec468f05..0000000000 --- a/lib/presigner +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 22ec468f050a9a36b97c5ba9bc9fa18a99480d79 diff --git a/nested.just b/nested.just index c3869252f9..e2e5a0bff3 100644 --- a/nested.just +++ b/nested.just @@ -34,7 +34,7 @@ simulate whichSafe hdPath='0': if [ -z "$SIMULATE_WITHOUT_LEDGER" ]; then signer=$(cast wallet address --ledger --mnemonic-derivation-path "m/44'/60'/{{hdPath}}'/0/0") echo "Simulating with ledger account: ${signer}" - else + else echo "Simulating without ledger using the first owner account: ${signer}" fi echo "" diff --git a/presigned-pause.just b/presigned-pause.just new file mode 100644 index 0000000000..ae8062cf73 --- /dev/null +++ b/presigned-pause.just @@ -0,0 +1,132 @@ +set dotenv-load + +export rpcUrl := env_var('ETH_RPC_URL') +export superchainConfigAddr := env_var('SUPERCHAIN_CONFIG_ADDR') +export safeAddr := env_var('SAFE_ADDR') +export taskPath := invocation_directory() + +jsonFile := '' + +###################################### +# During the ceremony ... +###################################### + +install: install-presigner + +install-presigner: + #!/usr/bin/env bash + REPO_ROOT=`git rev-parse --show-toplevel` + PATH="$REPO_ROOT/bin:$PATH" + cd $REPO_ROOT + mkdir -p bin || true + GOBIN="$REPO_ROOT/bin" go install github.com/ethereum-optimism/presigner@v0.0.4 + +whoami hdPath='0': + #!/usr/bin/env bash + REPO_ROOT=`git rev-parse --show-toplevel` + PATH="$REPO_ROOT/bin:$PATH" + if [ -z "$SIMULATE_WITHOUT_LEDGER" ]; then + eip712sign --address --hd-paths "m/44'/60'/{{hdPath}}'/0/0" --ledger + else + eip712sign --address --mnemonic "test test test test test test test test test test test junk" + fi + +sign hdPath='0': + #!/usr/bin/env bash + set -x + REPO_ROOT=`git rev-parse --show-toplevel` + PATH="$REPO_ROOT/bin:$PATH" + export INPUT_JSON_PATH="${taskPath}/input.json" + for nonce in ${PRESIGN_NONCES[@]}; do + JSON_FILE="${taskPath}/tx/draft-${nonce}.json" + if [ -z "$SIMULATE_WITHOUT_LEDGER" ]; then + presigner \ + --workdir . \ + --script-name SignFromInputJson \ + --rpc-url ${rpcUrl} \ + --json-file $JSON_FILE \ + --ledger \ + --hd-paths "m/44'/60'/{{hdPath}}'/0/0" \ + sign + else + presigner \ + --workdir ${taskPath} \ + --script-name SignFromInputJson \ + --rpc-url ${rpcUrl} \ + --json-file $JSON_FILE \ + --mnemonic "test test test test test test test test test test test junk" \ + --sender 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 \ + sign + fi + done + +###################################### +# Before the ceremony ... +###################################### + +prepare: + #!/usr/bin/env bash + set -x + REPO_ROOT=`git rev-parse --show-toplevel` + PATH="$REPO_ROOT/bin:$PATH" + echo creating 3 tx... + echo + + export INPUT_JSON_PATH="${taskPath}/input.json" + mkdir -p ${taskPath}/tmp + for nonce in ${PRESIGN_NONCES[@]}; do + presigner \ + --workdir ${taskPath} \ + --script-name SignFromInputJson \ + --chain `cast chain-id` \ + --rpc-url ${rpcUrl} \ + --target-addr ${superchainConfigAddr} \ + --safe-addr ${safeAddr} \ + --safe-nonce ${nonce} \ + --json-file ${taskPath}/tmp/tmp-${nonce}.json \ + create + cat ${taskPath}/tmp/tmp-${nonce}.json | jq . > ${taskPath}/tx/draft-${nonce}.json + done + +###################################### +# After the ceremony ... +###################################### + +merge: + #!/usr/bin/env bash + REPO_ROOT=`git rev-parse --show-toplevel` + PATH="$REPO_ROOT/bin:$PATH" + for nonce in ${PRESIGN_NONCES[@]}; do + presigner \ + --rpc-url ${rpcUrl} \ + --json-file ${taskPath}/tx/draft-${nonce}.json \ + merge ${taskPath}/tx/draft-${nonce}.signer-*.json + done + +verify: + #!/usr/bin/env bash + REPO_ROOT=`git rev-parse --show-toplevel` + PATH="$REPO_ROOT/bin:$PATH" + export INPUT_JSON_PATH="${taskPath}/input.json" + for nonce in ${PRESIGN_NONCES[@]}; do + presigner \ + --workdir ${taskPath} \ + --script-name SignFromInputJson \ + --rpc-url ${rpcUrl} \ + --json-file ${taskPath}/tx/draft-${nonce}.json \ + verify + done + +simulate-all: + #!/usr/bin/env bash + REPO_ROOT=`git rev-parse --show-toplevel` + PATH="$REPO_ROOT/bin:$PATH" + export INPUT_JSON_PATH="${taskPath}/input.json" + for nonce in ${PRESIGN_NONCES[@]}; do + presigner \ + --workdir ${taskPath} \ + --script-name SignFromInputJson \ + --rpc-url ${rpcUrl} \ + --json-file ${taskPath}/tx/draft-${nonce}.json \ + simulate + done diff --git a/script/SignFromInputJson.s.sol b/script/SignFromInputJson.s.sol new file mode 100644 index 0000000000..6a43692e53 --- /dev/null +++ b/script/SignFromInputJson.s.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.15; + +import {JsonTxBuilderBase} from "src/JsonTxBuilderBase.sol"; +import {MultisigBuilder} from "@base-contracts/script/universal/MultisigBuilder.sol"; +import {IMulticall3} from "forge-std/interfaces/IMulticall3.sol"; +import {stdJson} from "forge-std/StdJson.sol"; +import {console} from "forge-std/console.sol"; + +contract SignFromInputJson is MultisigBuilder, JsonTxBuilderBase { + function _buildCalls() internal view override returns (IMulticall3.Call3[] memory) { + string memory jsonContent = vm.readFile(vm.envOr("INPUT_JSON_PATH", string("input.json"))); + return _buildCallsFromJson(jsonContent); + } + + // todo: allow passing this as a script argument. + function _ownerSafe() internal view override returns (address) { + return vm.envAddress("OWNER_SAFE"); + } + + function _postCheck() internal view override {} +} diff --git a/src/JsonTxBuilderBase.sol b/src/JsonTxBuilderBase.sol index 413fa24866..50b8df8934 100644 --- a/src/JsonTxBuilderBase.sol +++ b/src/JsonTxBuilderBase.sol @@ -15,6 +15,10 @@ abstract contract JsonTxBuilderBase is CommonBase { } function _buildCallsFromJson() internal view returns (IMulticall3.Call3[] memory) { + return _buildCallsFromJson(json); + } + + function _buildCallsFromJson(string memory jsonContent) internal pure returns (IMulticall3.Call3[] memory) { // A hacky way to get the total number of elements in a JSON // object array because Forge does not support this natively. uint256 MAX_LENGTH_SUPPORTED = 999; @@ -25,7 +29,7 @@ abstract contract JsonTxBuilderBase is CommonBase { "Transaction list longer than MAX_LENGTH_SUPPORTED is not " "supported, to support it, simply bump the value of " "MAX_LENGTH_SUPPORTED to a bigger one." ); - try vm.parseJsonAddress(json, string(abi.encodePacked("$.transactions[", vm.toString(i), "].to"))) returns ( + try vm.parseJsonAddress(jsonContent, string(abi.encodePacked("$.transactions[", vm.toString(i), "].to"))) returns ( address ) {} catch { transaction_count = i; @@ -36,9 +40,9 @@ abstract contract JsonTxBuilderBase is CommonBase { for (uint256 i = 0; i < transaction_count; i++) { calls[i] = IMulticall3.Call3({ - target: stdJson.readAddress(json, string(abi.encodePacked("$.transactions[", vm.toString(i), "].to"))), + target: stdJson.readAddress(jsonContent, string(abi.encodePacked("$.transactions[", vm.toString(i), "].to"))), allowFailure: false, - callData: stdJson.readBytes(json, string(abi.encodePacked("$.transactions[", vm.toString(i), "].data"))) + callData: stdJson.readBytes(jsonContent, string(abi.encodePacked("$.transactions[", vm.toString(i), "].data"))) }); } diff --git a/tasks/eth/007-presigned-pause/.env b/tasks/eth/007-presigned-pause/.env new file mode 100644 index 0000000000..96dba28a3b --- /dev/null +++ b/tasks/eth/007-presigned-pause/.env @@ -0,0 +1,5 @@ +ETH_RPC_URL="https://ethereum.publicnode.com" +SUPERCHAIN_CONFIG_ADDR=0x95703e0982140d16f8eba6d158fccede42f04a4c +SAFE_ADDR=0x9BA6e03D8B90dE867373Db8cF1A58d2F7F006b3A +OWNER_SAFE=0x9BA6e03D8B90dE867373Db8cF1A58d2F7F006b3A +PRESIGN_NONCES="92 93 94" diff --git a/tasks/eth/007-presigned-pause/README.md b/tasks/eth/007-presigned-pause/README.md new file mode 100644 index 0000000000..207632265b --- /dev/null +++ b/tasks/eth/007-presigned-pause/README.md @@ -0,0 +1,5 @@ +# Superchain Presigned Pause + +Status: DRAFT, not ready to sign + +See [../../../PRESIGNED-PAUSE.md](../../../PRESIGNED-PAUSE.md) for the playbook. diff --git a/tasks/eth/007-presigned-pause/input.json b/tasks/eth/007-presigned-pause/input.json new file mode 100644 index 0000000000..71511f5379 --- /dev/null +++ b/tasks/eth/007-presigned-pause/input.json @@ -0,0 +1,29 @@ +{ + "version": "1.0", + "chainId": "1", + "meta": { + "name": "Call SuperchainConfig.pause('presigned-20240324')", + "createdFromSafeAddress": "0x9BA6e03D8B90dE867373Db8cF1A58d2F7F006b3A" + }, + "transactions": [ + { + "to": "0x95703e0982140D16f8ebA6d158FccEde42f04a4C", + "value": "0", + "data": "0x6da66355000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000127072657369676e65642d32303234303332340000000000000000000000000000", + "contractMethod": { + "inputs": [ + { + "internalType": "string", + "name": "_identifier", + "type": "string" + } + ], + "name": "pause", + "payable": false + }, + "contractInputsValues": { + "_identifier": "presigned-20240324" + } + } + ] +} diff --git a/tasks/eth/007-presigned-pause/tx/draft-92.json b/tasks/eth/007-presigned-pause/tx/draft-92.json new file mode 100644 index 0000000000..a97539a32e --- /dev/null +++ b/tasks/eth/007-presigned-pause/tx/draft-92.json @@ -0,0 +1,10 @@ +{ + "chain_id": "1", + "rpc_url": "https://ethereum.publicnode.com", + "created_at": "2024-03-28T17:20:44-07:00", + "safe_addr": "0x9BA6e03D8B90dE867373Db8cF1A58d2F7F006b3A", + "safe_nonce": "92", + "target_addr": "0x95703e0982140d16f8eba6d158fccede42f04a4c", + "script_name": "SignFromInputJson", + "data": "" +} diff --git a/tasks/eth/007-presigned-pause/tx/draft-93.json b/tasks/eth/007-presigned-pause/tx/draft-93.json new file mode 100644 index 0000000000..bfe4acab0e --- /dev/null +++ b/tasks/eth/007-presigned-pause/tx/draft-93.json @@ -0,0 +1,10 @@ +{ + "chain_id": "1", + "rpc_url": "https://ethereum.publicnode.com", + "created_at": "2024-03-28T17:20:47-07:00", + "safe_addr": "0x9BA6e03D8B90dE867373Db8cF1A58d2F7F006b3A", + "safe_nonce": "93", + "target_addr": "0x95703e0982140d16f8eba6d158fccede42f04a4c", + "script_name": "SignFromInputJson", + "data": "" +} diff --git a/tasks/eth/007-presigned-pause/tx/draft-94.json b/tasks/eth/007-presigned-pause/tx/draft-94.json new file mode 100644 index 0000000000..0a9c6b357b --- /dev/null +++ b/tasks/eth/007-presigned-pause/tx/draft-94.json @@ -0,0 +1,10 @@ +{ + "chain_id": "1", + "rpc_url": "https://ethereum.publicnode.com", + "created_at": "2024-03-28T17:20:53-07:00", + "safe_addr": "0x9BA6e03D8B90dE867373Db8cF1A58d2F7F006b3A", + "safe_nonce": "94", + "target_addr": "0x95703e0982140d16f8eba6d158fccede42f04a4c", + "script_name": "SignFromInputJson", + "data": "" +} diff --git a/tasks/sep/005-presigned-pause/.env b/tasks/sep/005-presigned-pause/.env new file mode 100644 index 0000000000..63c2d51aa1 --- /dev/null +++ b/tasks/sep/005-presigned-pause/.env @@ -0,0 +1,5 @@ +ETH_RPC_URL="https://ethereum-sepolia.publicnode.com" +SUPERCHAIN_CONFIG_ADDR=0xC2Be75506d5724086DEB7245bd260Cc9753911Be +SAFE_ADDR=0xDEe57160aAfCF04c34C887B5962D0a69676d3C8B +OWNER_SAFE=0xDEe57160aAfCF04c34C887B5962D0a69676d3C8B +PRESIGN_NONCES="10 11 12 13 14" diff --git a/tasks/sep/005-presigned-pause/README.md b/tasks/sep/005-presigned-pause/README.md new file mode 100644 index 0000000000..207632265b --- /dev/null +++ b/tasks/sep/005-presigned-pause/README.md @@ -0,0 +1,5 @@ +# Superchain Presigned Pause + +Status: DRAFT, not ready to sign + +See [../../../PRESIGNED-PAUSE.md](../../../PRESIGNED-PAUSE.md) for the playbook. diff --git a/tasks/sep/005-presigned-pause/input.json b/tasks/sep/005-presigned-pause/input.json new file mode 100644 index 0000000000..a2188f37e1 --- /dev/null +++ b/tasks/sep/005-presigned-pause/input.json @@ -0,0 +1,28 @@ +{ + "version": "1.0", + "chainId": "1", + "meta": { + "name": "Call SuperchainConfig.pause('presigned-20240324')" + }, + "transactions": [ + { + "to": "0xC2Be75506d5724086DEB7245bd260Cc9753911Be", + "value": "0", + "data": "0x6da66355000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000127072657369676e65642d32303234303332340000000000000000000000000000", + "contractMethod": { + "inputs": [ + { + "internalType": "string", + "name": "_identifier", + "type": "string" + } + ], + "name": "pause", + "payable": false + }, + "contractInputsValues": { + "_identifier": "presigned-20240324" + } + } + ] +} diff --git a/tasks/sep/005-presigned-pause/tx/draft-10.json b/tasks/sep/005-presigned-pause/tx/draft-10.json new file mode 100644 index 0000000000..17a37f628c --- /dev/null +++ b/tasks/sep/005-presigned-pause/tx/draft-10.json @@ -0,0 +1,10 @@ +{ + "chain_id": "11155111", + "rpc_url": "https://ethereum-sepolia.publicnode.com", + "created_at": "2024-03-31T12:54:31-04:00", + "safe_addr": "0xDEe57160aAfCF04c34C887B5962D0a69676d3C8B", + "safe_nonce": "10", + "target_addr": "0xC2Be75506d5724086DEB7245bd260Cc9753911Be", + "script_name": "SignFromInputJson", + "data": "" +} diff --git a/tasks/sep/005-presigned-pause/tx/draft-11.json b/tasks/sep/005-presigned-pause/tx/draft-11.json new file mode 100644 index 0000000000..9b9f64c943 --- /dev/null +++ b/tasks/sep/005-presigned-pause/tx/draft-11.json @@ -0,0 +1,10 @@ +{ + "chain_id": "11155111", + "rpc_url": "https://ethereum-sepolia.publicnode.com", + "created_at": "2024-03-31T12:54:33-04:00", + "safe_addr": "0xDEe57160aAfCF04c34C887B5962D0a69676d3C8B", + "safe_nonce": "11", + "target_addr": "0xC2Be75506d5724086DEB7245bd260Cc9753911Be", + "script_name": "SignFromInputJson", + "data": "" +} diff --git a/tasks/sep/005-presigned-pause/tx/draft-12.json b/tasks/sep/005-presigned-pause/tx/draft-12.json new file mode 100644 index 0000000000..0ddf2898e3 --- /dev/null +++ b/tasks/sep/005-presigned-pause/tx/draft-12.json @@ -0,0 +1,10 @@ +{ + "chain_id": "11155111", + "rpc_url": "https://ethereum-sepolia.publicnode.com", + "created_at": "2024-03-31T12:54:35-04:00", + "safe_addr": "0xDEe57160aAfCF04c34C887B5962D0a69676d3C8B", + "safe_nonce": "12", + "target_addr": "0xC2Be75506d5724086DEB7245bd260Cc9753911Be", + "script_name": "SignFromInputJson", + "data": "" +} diff --git a/tasks/sep/005-presigned-pause/tx/draft-13.json b/tasks/sep/005-presigned-pause/tx/draft-13.json new file mode 100644 index 0000000000..57ed42f144 --- /dev/null +++ b/tasks/sep/005-presigned-pause/tx/draft-13.json @@ -0,0 +1,10 @@ +{ + "chain_id": "11155111", + "rpc_url": "https://ethereum-sepolia.publicnode.com", + "created_at": "2024-03-31T12:54:40-04:00", + "safe_addr": "0xDEe57160aAfCF04c34C887B5962D0a69676d3C8B", + "safe_nonce": "13", + "target_addr": "0xC2Be75506d5724086DEB7245bd260Cc9753911Be", + "script_name": "SignFromInputJson", + "data": "" +} diff --git a/tasks/sep/005-presigned-pause/tx/draft-14.json b/tasks/sep/005-presigned-pause/tx/draft-14.json new file mode 100644 index 0000000000..e50ed33336 --- /dev/null +++ b/tasks/sep/005-presigned-pause/tx/draft-14.json @@ -0,0 +1,10 @@ +{ + "chain_id": "11155111", + "rpc_url": "https://ethereum-sepolia.publicnode.com", + "created_at": "2024-03-31T12:54:43-04:00", + "safe_addr": "0xDEe57160aAfCF04c34C887B5962D0a69676d3C8B", + "safe_nonce": "14", + "target_addr": "0xC2Be75506d5724086DEB7245bd260Cc9753911Be", + "script_name": "SignFromInputJson", + "data": "" +}