-
Notifications
You must be signed in to change notification settings - Fork 319
feat: Add Task Template for Switching Base to a Permissioned Game and Retiring Existing Dispute Games #434
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
a786588
f761424
28bf2bd
eda82fa
9fb2d57
6a57626
4013a7e
fc54b97
88d35c9
56dd64d
7384d6a
e483c92
c5308c9
f8f9c3f
95e5edb
f701ab8
2ae4922
504edab
a2a5d8c
43ceec2
90641dd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
jjtny1 marked this conversation as resolved.
Show resolved
Hide resolved
|
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -43,6 +43,7 @@ To execute a new task, run one of the following commands (depending on the type | |||||
| - For funding tasks: `make setup-funding network=<network>` | ||||||
| - For updating the partner threshold in Base Bridge: `make setup-bridge-partner-threshold network=<network>` | ||||||
| - For pausing / un-pausing Base Bridge: `make setup-bridge-pause network=<network>` | ||||||
| - For switching to a permissioned game and retiring dispute games: `make setup-switch-to-permissioned-game network=<network>` | ||||||
|
|
||||||
| Next, `cd` into the directory that was created for you and follow the steps listed below for the relevant template. | ||||||
|
|
||||||
|
|
@@ -172,3 +173,17 @@ This template is used to pause or un-pause [Base Bridge](https://github.com/base | |||||
| 1. Generate the validation file for signers with `make gen-validation`. | ||||||
| 1. Check in the task when it's ready to sign and request the facilitators to collect signatures from signers. | ||||||
| 1. Once executed, check in the records files and mark the task `EXECUTED` in the README. | ||||||
|
|
||||||
| ## Using the Switch to Permissioned Game template | ||||||
|
|
||||||
| This template is used to switch Base to a Permissioned Game. | ||||||
|
|
||||||
| 1. Ensure you have followed the instructions above in `setup`. | ||||||
| 1. Run `mmake setup-switch-to-permissioned-game network=<network>` and go to the folder that was created by this command. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| 1. Specify the commit of [Optimism code](https://github.com/ethereum-optimism/optimism) and [Base contracts code](https://github.com/base/contracts) you intend to use in the `.env` file. | ||||||
| 1. Run `make deps`. | ||||||
| 1. Ensure only the Sepolia or Mainnet variables are in the `.env` file depending on what network this task is for. | ||||||
| 1. Build the contracts with `forge build`. | ||||||
| 1. Generate the validation file for signers with `make gen-validation`. | ||||||
| 1. Check in the task when it's ready to sign and request the facilitators to collect signatures from signers. | ||||||
| 1. Once executed, check in the records files and mark the task `EXECUTED` in the README. | ||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| OP_COMMIT= | ||
| BASE_CONTRACTS_COMMIT= | ||
|
|
||
| RECORD_STATE_DIFF=true | ||
|
|
||
| # Mainnet Config | ||
| SYSTEM_CONFIG=0x73a79Fab69143498Ed3712e519A88a918e1f4072 | ||
|
|
||
| # Optimism Guardian Multisig (controls Anchor State Registry) | ||
| OWNER_SAFE=0x09f7150D8c019BeF34450d6920f6B3608ceFdAf2 | ||
| # Owner of Optimism Guardian Multisig | ||
| OP_SECURITY_COUNCIL_SAFE=0xc2819DC788505Aac350142A7A707BF9D03E3Bd03 | ||
|
|
||
| SENDER=0x1822b35B09f5ce1C78ecbC06AC0A4e17885b925e # used to simulate | ||
|
|
||
| # #Sepolia Config | ||
| #SYSTEM_CONFIG=0xf272670eb55e895584501d564AfEB048bEd26194 | ||
|
|
||
| # #Optimism Guardian Multisig (controls Anchor State Registry) | ||
| #OWNER_SAFE=0x7a50f00e8D05b95F98fE38d8BeE366a7324dCf7E | ||
| # #Owner of Optimism Guardian Multisig | ||
| #OP_SECURITY_COUNCIL_SAFE=0xf64bc17485f0B4Ea5F06A96514182FC4cB561977 | ||
|
|
||
| # # used to simulate | ||
| #SENDER=0x1084092Ac2f04c866806CF3d4a385Afa4F6A6C97 |
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,33 @@ | ||||||||||
| include ../../Makefile | ||||||||||
| include ../../Multisig.mk | ||||||||||
|
|
||||||||||
| include ../.env | ||||||||||
| include .env | ||||||||||
|
|
||||||||||
| ifndef LEDGER_ACCOUNT | ||||||||||
| override LEDGER_ACCOUNT = 0 | ||||||||||
| endif | ||||||||||
|
|
||||||||||
| RPC_URL = $(L1_RPC_URL) | ||||||||||
| SCRIPT_NAME = SwitchToPermissionedGame | ||||||||||
|
|
||||||||||
| .PHONY: gen-validation | ||||||||||
| gen-validation: checkout-signer-tool run-script | ||||||||||
|
|
||||||||||
| .PHONY: run-script | ||||||||||
| run-script: | ||||||||||
| cd $(SIGNER_TOOL_PATH); \ | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There must be an empty
Suggested change
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Lines 19 and 20 need to switch order (as in my example above), since the |
||||||||||
| mkdir validations; \ | ||||||||||
| npm ci; \ | ||||||||||
| bun run scripts/genValidationFile.ts --rpc-url $(L1_RPC_URL) \ | ||||||||||
| --workdir .. --forge-cmd 'forge script --rpc-url $(L1_RPC_URL) \ | ||||||||||
|
Comment on lines
+22
to
+23
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since we already created the
Suggested change
|
||||||||||
| $(SCRIPT_NAME) --sig "sign(address[])" ["$(OP_SECURITY_COUNCIL_SAFE)"] --sender $(SENDER)' --out ../validations/op-signer.json; | ||||||||||
|
|
||||||||||
| .PHONY: approve-op | ||||||||||
| approve-op: | ||||||||||
| $(call MULTISIG_APPROVE,$(OP_SECURITY_COUNCIL_SAFE),$(SIGNATURES)) | ||||||||||
|
|
||||||||||
| # Execute | ||||||||||
| .PHONY: execute | ||||||||||
| execute: | ||||||||||
| $(call MULTISIG_EXECUTE,0x) | ||||||||||
jjtny1 marked this conversation as resolved.
Show resolved
Hide resolved
|
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,48 @@ | ||||||||||
| # Switch to Permissioned Games | ||||||||||
|
|
||||||||||
| Status: READY TO SIGN | ||||||||||
|
|
||||||||||
| ## Description | ||||||||||
|
|
||||||||||
| Switches Base to Permissioned Fault Dispute Games and retires existing games. | ||||||||||
|
|
||||||||||
| ## Install dependencies | ||||||||||
|
|
||||||||||
| ### 1. Update foundry | ||||||||||
|
|
||||||||||
| ```bash | ||||||||||
| foundryup | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| ### 2. Install Node.js if needed | ||||||||||
|
|
||||||||||
| First, check if you have node installed | ||||||||||
|
|
||||||||||
| ```bash | ||||||||||
| node --version | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| If you see a version output from the above command, you can move on. Otherwise, install node | ||||||||||
|
|
||||||||||
| ```bash | ||||||||||
| brew install node | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| ## Sign Task | ||||||||||
|
|
||||||||||
| ### 1. Update repo: | ||||||||||
|
|
||||||||||
| ```bash | ||||||||||
| cd contract-deployments | ||||||||||
| git pull | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| ### 2. Run the signing tool (NOTE: do not enter the task directory. Run this command from the project's root). | ||||||||||
|
|
||||||||||
| ```bash | ||||||||||
| make sign-task | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| ### 3. Open the UI at [http://localhost:3000](http://localhost:3000) | ||||||||||
|
|
||||||||||
| ### 4. Send signature to facilitator | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| [profile.default] | ||
| src = 'src' | ||
| out = 'out' | ||
| libs = ['lib'] | ||
| broadcast = 'records' | ||
| fs_permissions = [{ access = "read-write", path = "./" }] | ||
| optimizer = true | ||
| optimizer_runs = 200 | ||
| via-ir = false | ||
| remappings = [ | ||
| '@eth-optimism-bedrock/=lib/optimism/packages/contracts-bedrock/', | ||
| '@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts', | ||
| '@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts', | ||
| '@rari-capital/solmate/=lib/solmate/', | ||
| '@base-contracts/=lib/base-contracts', | ||
| 'solady/=lib/solady/src/', | ||
| '@lib-keccak/=lib/lib-keccak/contracts/lib', | ||
| ] | ||
|
|
||
| # See more config options https://github.com/foundry-rs/foundry/tree/master/config |
jjtny1 marked this conversation as resolved.
Show resolved
Hide resolved
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,68 @@ | ||
| // SPDX-License-Identifier: MIT | ||
| pragma solidity 0.8.15; | ||
|
|
||
| import {Vm} from "forge-std/Vm.sol"; | ||
| import {IMulticall3} from "forge-std/interfaces/IMulticall3.sol"; | ||
| import {IAnchorStateRegistry} from "@eth-optimism-bedrock/src/dispute/FaultDisputeGame.sol"; | ||
| import {SystemConfig} from "@eth-optimism-bedrock/src/L1/SystemConfig.sol"; | ||
| import {DisputeGameFactory} from "@eth-optimism-bedrock/src/dispute/DisputeGameFactory.sol"; | ||
| import {FaultDisputeGame} from "@eth-optimism-bedrock/src/dispute/PermissionedDisputeGame.sol"; | ||
| import {GameTypes, GameType} from "@eth-optimism-bedrock/src/dispute/lib/Types.sol"; | ||
| import {MultisigScript} from "@base-contracts/script/universal/MultisigScript.sol"; | ||
| import {Simulation} from "@base-contracts/script/universal/Simulation.sol"; | ||
|
|
||
| /// @notice This script updates the respectedGameType and retires existing games in the AnchorStateRegistry. | ||
| contract SwitchToPermissionedGame is MultisigScript { | ||
| // TODO: Confirm expected version | ||
| string public constant EXPECTED_VERSION = "1.4.1"; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Where is this |
||
|
|
||
| address public immutable OWNER_SAFE; | ||
|
|
||
| SystemConfig internal immutable _SYSTEM_CONFIG = SystemConfig(vm.envAddress("SYSTEM_CONFIG")); | ||
|
|
||
| IAnchorStateRegistry anchorStateRegistry; | ||
|
|
||
| constructor() { | ||
| OWNER_SAFE = vm.envAddress("OWNER_SAFE"); | ||
| } | ||
|
|
||
| function setUp() public { | ||
| DisputeGameFactory dgfProxy = DisputeGameFactory(_SYSTEM_CONFIG.disputeGameFactory()); | ||
| FaultDisputeGame currentFdg = FaultDisputeGame(address(dgfProxy.gameImpls(GameTypes.CANNON))); | ||
| anchorStateRegistry = currentFdg.anchorStateRegistry(); | ||
| } | ||
|
|
||
| // Confirm the retirementTimestamp is updated to the block time and the | ||
| // respectedGameType is updated to PERMISSIONED_CANNON. | ||
| function _postCheck(Vm.AccountAccess[] memory, Simulation.Payload memory) internal view override { | ||
| require(anchorStateRegistry.retirementTimestamp() == block.timestamp, "post-110"); | ||
| require( | ||
| GameType.unwrap(anchorStateRegistry.respectedGameType()) == GameType.unwrap(GameTypes.PERMISSIONED_CANNON), | ||
| "post-111" | ||
| ); | ||
| } | ||
|
|
||
| function _buildCalls() internal view override returns (IMulticall3.Call3Value[] memory) { | ||
| IMulticall3.Call3Value[] memory calls = new IMulticall3.Call3Value[](2); | ||
|
|
||
| calls[0] = IMulticall3.Call3Value({ | ||
| target: address(anchorStateRegistry), | ||
| allowFailure: false, | ||
| callData: abi.encodeCall(IAnchorStateRegistry.setRespectedGameType, (GameTypes.PERMISSIONED_CANNON)), | ||
| value: 0 | ||
| }); | ||
|
|
||
| calls[1] = IMulticall3.Call3Value({ | ||
| target: address(anchorStateRegistry), | ||
| allowFailure: false, | ||
| callData: abi.encodeCall(IAnchorStateRegistry.updateRetirementTimestamp, ()), | ||
| value: 0 | ||
| }); | ||
|
|
||
| return calls; | ||
| } | ||
|
|
||
| function _ownerSafe() internal view override returns (address) { | ||
| return OWNER_SAFE; | ||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.