diff --git a/mainnet/2024-03-05-pause-unpause-test/.env b/mainnet/2024-03-05-pause-unpause-test/.env new file mode 100644 index 00000000..cbd03961 --- /dev/null +++ b/mainnet/2024-03-05-pause-unpause-test/.env @@ -0,0 +1,5 @@ +OP_COMMIT=10b06fb49861053999a89533d846ee5c2ccb33e1 +BASE_CONTRACTS_COMMIT=fe492be3478134b2305c207a12b153eca04148c0 + +OPTIMISM_PORTAL_PROXY=0x49048044D57e1C92A77f79988d21Fa8fAF74E97e +GUARDIAN=0x14536667Cd30e52C0b458BaACcB9faDA7046E056 diff --git a/mainnet/2024-03-05-pause-unpause-test/Makefile b/mainnet/2024-03-05-pause-unpause-test/Makefile new file mode 100644 index 00000000..b415c9c4 --- /dev/null +++ b/mainnet/2024-03-05-pause-unpause-test/Makefile @@ -0,0 +1,41 @@ +include ../../Makefile +include ../.env +include .env + +ifndef LEDGER_ACCOUNT +override LEDGER_ACCOUNT = 0 +endif + +## +# Incident response commands +# Note that --ledger --hd-paths can be replaced with --private-key $(PRIVATE_KEY) +# in any command when using a local key. +## + +# Pause OptimismPortal Commands + +.PHONY: pause-portal-sign +pause-portal-sign: deps + $(GOPATH)/bin/eip712sign --ledger --hd-paths "m/44'/60'/$(LEDGER_ACCOUNT)'/0/0" -- \ + forge script --rpc-url $(L1_RPC_URL) PausePortal --sig "sign()" + +.PHONY: pause-portal-run +pause-portal-run: deps + forge script --rpc-url $(L1_RPC_URL) \ + PausePortal --sig "run(bytes)" $(SIGNATURES) \ + --ledger --hd-paths "m/44'/60'/$(LEDGER_ACCOUNT)'/0/0" \ + --broadcast + +# Unpause OptimismPortal Commands + +.PHONY: unpause-portal-sign +unpause-portal-sign: deps + $(GOPATH)/bin/eip712sign --ledger --hd-paths "m/44'/60'/$(LEDGER_ACCOUNT)'/0/0" -- \ + forge script --rpc-url $(L1_RPC_URL) UnpausePortal --sig "sign()" + +.PHONY: unpause-portal-run +unpause-portal-run: deps + forge script --rpc-url $(L1_RPC_URL) \ + UnpausePortal --sig "run(bytes)" $(SIGNATURES) \ + --ledger --hd-paths "m/44'/60'/$(LEDGER_ACCOUNT)'/0/0" \ + --broadcast diff --git a/mainnet/2024-03-05-pause-unpause-test/foundry.toml b/mainnet/2024-03-05-pause-unpause-test/foundry.toml new file mode 100644 index 00000000..70c0f39f --- /dev/null +++ b/mainnet/2024-03-05-pause-unpause-test/foundry.toml @@ -0,0 +1,20 @@ +[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 = true +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/' +] + +# See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/mainnet/2024-03-05-pause-unpause-test/script/PausePortal.s.sol b/mainnet/2024-03-05-pause-unpause-test/script/PausePortal.s.sol new file mode 100644 index 00000000..7b7bcdd6 --- /dev/null +++ b/mainnet/2024-03-05-pause-unpause-test/script/PausePortal.s.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import "@base-contracts/script/universal/MultisigBuilder.sol"; +import "@eth-optimism-bedrock/src/L1/OptimismPortal.sol"; + +contract PausePortal is MultisigBuilder { + address internal OPTIMISM_PORTAL_PROXY = vm.envAddress("OPTIMISM_PORTAL_PROXY"); + address internal GUARDIAN = vm.envAddress("GUARDIAN"); + + function _postCheck() internal override view { + OptimismPortal optimismPortal = OptimismPortal(payable(OPTIMISM_PORTAL_PROXY)); + require(optimismPortal.paused() == true, "PausePortal: Portal did not get paused"); + } + + function _buildCalls() internal override view returns (IMulticall3.Call3[] memory) { + IMulticall3.Call3[] memory calls = new IMulticall3.Call3[](1); + + calls[0] = IMulticall3.Call3({ + target: OPTIMISM_PORTAL_PROXY, + allowFailure: false, + callData: abi.encodeCall( + OptimismPortal.pause, () + ) + }); + + return calls; + } + + function _ownerSafe() internal override view returns (address) { + return GUARDIAN; + } +} diff --git a/mainnet/2024-03-05-pause-unpause-test/script/UnpausePortal.s.sol b/mainnet/2024-03-05-pause-unpause-test/script/UnpausePortal.s.sol new file mode 100644 index 00000000..0acf2e77 --- /dev/null +++ b/mainnet/2024-03-05-pause-unpause-test/script/UnpausePortal.s.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import "@base-contracts/script/universal/MultisigBuilder.sol"; +import "@eth-optimism-bedrock/src/L1/OptimismPortal.sol"; + +contract UnpausePortal is MultisigBuilder { + address internal OPTIMISM_PORTAL_PROXY = vm.envAddress("OPTIMISM_PORTAL_PROXY"); + address internal GUARDIAN = vm.envAddress("GUARDIAN"); + + function _postCheck() internal override view { + OptimismPortal optimismPortal = OptimismPortal(payable(OPTIMISM_PORTAL_PROXY)); + require(optimismPortal.paused() == false, "UnpausePortal: Portal did not get unpaused"); + } + + function _buildCalls() internal override view returns (IMulticall3.Call3[] memory) { + IMulticall3.Call3[] memory calls = new IMulticall3.Call3[](1); + + calls[0] = IMulticall3.Call3({ + target: OPTIMISM_PORTAL_PROXY, + allowFailure: false, + callData: abi.encodeCall( + OptimismPortal.unpause, () + ) + }); + + return calls; + } + + function _ownerSafe() internal override view returns (address) { + return GUARDIAN; + } +}