From c0eeace59bb0d81209ad4b0b6ffd7c46d4ce3c51 Mon Sep 17 00:00:00 2001 From: Anna Carroll Date: Fri, 30 Aug 2024 14:21:49 +0100 Subject: [PATCH 1/7] feat: deploy script for rollup contracts --- .gitmodules | 9 +++++ script/DeployGnosisSafe.s.sol | 60 ++++++++++++++++++++++++++++ script/DeployL2.s.sol | 75 +++++++++++++++++++++++++++++++++++ script/Zenith.s.sol | 10 ----- script/ZenithL2.s.sol | 26 ++++++++++++ 5 files changed, 170 insertions(+), 10 deletions(-) create mode 100644 script/DeployGnosisSafe.s.sol create mode 100644 script/DeployL2.s.sol create mode 100644 script/ZenithL2.s.sol diff --git a/.gitmodules b/.gitmodules index 937a6ea..a26ffde 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,12 @@ [submodule "lib/permit2"] path = lib/permit2 url = https://github.com/Uniswap/permit2 +[submodule "lib/simple-erc20"] + path = lib/simple-erc20 + url = https://github.com/init4tech/simple-erc20 +[submodule "lib/safe-smart-account"] + path = lib/safe-smart-account + url = https://github.com/safe-global/safe-smart-account +[submodule "lib/stablecoin-evm"] + path = lib/stablecoin-evm + url = https://github.com/circlefin/stablecoin-evm diff --git a/script/DeployGnosisSafe.s.sol b/script/DeployGnosisSafe.s.sol new file mode 100644 index 0000000..3858567 --- /dev/null +++ b/script/DeployGnosisSafe.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity 0.8.26; + +// deps +import {SafeL2} from "safe-smart-account/contracts/SafeL2.sol"; +import {SafeProxyFactory} from "safe-smart-account/contracts/proxies/SafeProxyFactory.sol"; +import {CompatibilityFallbackHandler} from "safe-smart-account/contracts/handler/CompatibilityFallbackHandler.sol"; +// script deps +import {Script, console2} from "forge-std/Script.sol"; + +struct SafeSetup { + address[] owners; + uint256 threshold; + address to; + bytes data; + address fallbackHandler; + address paymentToken; + uint256 payment; + address payable paymentReceiver; + uint256 saltNonce; +} + +function deployGnosisCore() returns (address factory, address singleton, address fallbackHandler) { + factory = address(new SafeProxyFactory{salt: "zenith.gnosisFactory"}()); + singleton = address(new SafeL2{salt: "zenith.gnosisSingleton"}()); + fallbackHandler = address(new CompatibilityFallbackHandler{salt: "zenith.gnosisFallbackHandlder"}()); +} + +function deploySafeInstance(address factory, address singleton, SafeSetup memory setup) returns (address safe) { + bytes memory init = abi.encodeWithSignature( + "setup(address[],uint256,address,bytes,address,address,uint256,address)", + setup.owners, + setup.threshold, + setup.to, + setup.data, + setup.fallbackHandler, + setup.paymentToken, + setup.payment, + setup.paymentReceiver + ); + safe = address(SafeProxyFactory(factory).createProxyWithNonce(singleton, init, setup.saltNonce)); +} + +contract GnosisScript is Script { + bytes32 constant SENTINEL_VALUE = 0x0000000000000000000000000000000000000000000000000000000000000001; + + // example run: + // forge script GnosisScript --sig "printOwnerSlots" "[0x1111111111111111111111111111111111111111, 0x2222222222222222222222222222222222222222]" + function printOwnerSlots(address[] memory owners) public pure { + for (uint256 i = 0; i <= owners.length; i++) { + bytes32 value = (i == 0) ? SENTINEL_VALUE : addressToBytes32(owners[i - 1]); + bytes32 slot = keccak256(abi.encodePacked(value, uint256(2))); + console2.logBytes32(slot); + } + } + + function addressToBytes32(address addr) internal pure returns (bytes32) { + return bytes32(uint256(uint160(addr))); + } +} diff --git a/script/DeployL2.s.sol b/script/DeployL2.s.sol new file mode 100644 index 0000000..ab055cb --- /dev/null +++ b/script/DeployL2.s.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity 0.8.26; + +// system contracts +import {RollupOrders} from "../src/orders/RollupOrders.sol"; +import {RollupPassage} from "../src/passage/RollupPassage.sol"; +// permit2 +import {deployPermit2} from "./DeployPermit2.s.sol"; +// gnosis safe +import {deployGnosisCore, deploySafeInstance, SafeSetup} from "./DeployGnosisSafe.s.sol"; +// simple erc20 +import {SimpleERC20} from "simple-erc20/SimpleERC20.sol"; +// utils +import {console2} from "forge-std/Script.sol"; + +address constant MINTER = 0x9999999999999999999999999999999999999999; +address constant OWNER_ONE = 0x1111111111111111111111111111111111111111; +address constant OWNER_TWO = 0x2222222222222222222222222222222222222222; + +address constant PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3; + +function deployPartOne() returns (address rollupPassage, address rollupOrders, address wbtc, address usdt) { + // NOTE: must deploy Permit2 via https://github.com/Uniswap/permit2/blob/main/script/DeployPermit2.s.sol + // in order to properly setup _CACHED_CHAIN_ID and _CACHED_DOMAIN_SEPARATOR + + // deploy system contracts + rollupPassage = address(new RollupPassage{salt: "zenith.rollupPassage"}(PERMIT2)); + console2.log("rollupPassage", rollupPassage); + rollupOrders = address(new RollupOrders{salt: "zenith.rollupOrders"}(PERMIT2)); + console2.log("rollupOrders", rollupOrders); + + // deploy simple erc20 tokens + // make minter a recognizable addrs to aid in inspecting storage layout + wbtc = address(new SimpleERC20{salt: "zenith.wbtc"}(MINTER, "Wrapped BTC", "WBTC")); + usdt = address(new SimpleERC20{salt: "zenith.usdt"}(MINTER, "Tether USD", "USDT")); + console2.log("wbtc", wbtc); + console2.log("usdt", usdt); +} + +function deployPartTwo() + returns (address gnosisFactory, address gnosisSingleton, address gnosisFallbackHandler, address usdcAdmin) +{ + // deploy gnosis safe singleton & proxy factory + (gnosisFactory, gnosisSingleton, gnosisFallbackHandler) = deployGnosisCore(); + console2.log("gnosisFactory", gnosisFactory); + console2.log("gnosisSingleton", gnosisSingleton); + console2.log("gnosisFallbackHandler", gnosisFallbackHandler); + + // deploy a gnosis safe proxy as the USDC admin + usdcAdmin = deploySafeInstance(gnosisFactory, gnosisSingleton, getUsdcAdminSetup(gnosisFallbackHandler)); + console2.log("usdcAdmin", usdcAdmin); + + // NOTE: must deploy USDC via https://github.com/circlefin/stablecoin-evm/blob/master/scripts/deploy/deploy-fiat-token.s.sol + // cannot import USDC deploy script because of git submodules - + // it has a different remapping for openzeppelin contracts and can't compile in this repo +} + +// setup the gnosis safe with 2 owners, threshold of 1. +// make the owners recognizable addrs to aid in inspecting storage layout +function getUsdcAdminSetup(address fallbackHandler) pure returns (SafeSetup memory usdcAdminSetup) { + address[] memory owners = new address[](2); + owners[0] = OWNER_ONE; + owners[1] = OWNER_TWO; + usdcAdminSetup = SafeSetup({ + owners: owners, + threshold: 1, + to: address(0), + data: "", + fallbackHandler: fallbackHandler, + paymentToken: address(0), + payment: 0, + paymentReceiver: payable(address(0)), + saltNonce: 17001 + }); +} diff --git a/script/Zenith.s.sol b/script/Zenith.s.sol index 6d76e6c..08166d5 100644 --- a/script/Zenith.s.sol +++ b/script/Zenith.s.sol @@ -5,9 +5,7 @@ pragma solidity 0.8.26; import {Zenith} from "../src/Zenith.sol"; import {Transactor} from "../src/Transactor.sol"; import {HostOrders} from "../src/orders/HostOrders.sol"; -import {RollupOrders} from "../src/orders/RollupOrders.sol"; import {Passage} from "../src/passage/Passage.sol"; -import {RollupPassage} from "../src/passage/RollupPassage.sol"; // utils import {Script} from "forge-std/Script.sol"; @@ -28,14 +26,6 @@ contract ZenithScript is Script { m = new HostOrders(permit2); } - // deploy: - // forge script ZenithScript --sig "deployL2(address)" --rpc-url $L2_RPC_URL --private-key $PRIVATE_KEY --broadcast $PERMIT_2 - function deployL2(address permit2) public returns (RollupPassage p, RollupOrders m) { - vm.startBroadcast(); - p = new RollupPassage(permit2); - m = new RollupOrders(permit2); - } - // NOTE: script must be run using SequencerAdmin key // set sequencer: // forge script ZenithScript --sig "setSequencerRole(address,address)" --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast $ZENITH_ADDRESS $SEQUENCER_ADDRESS diff --git a/script/ZenithL2.s.sol b/script/ZenithL2.s.sol new file mode 100644 index 0000000..d7986d0 --- /dev/null +++ b/script/ZenithL2.s.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity 0.8.26; + +// system contracts +import {deployPartOne, deployPartTwo} from "./DeployL2.s.sol"; +// utils +import {Script, console2} from "forge-std/Script.sol"; + +contract L2Script is Script { + // deploy: + // forge script L2Script --sig "deployOne()" --fork-url $ANVIL_URL --broadcast + function deployOne() public returns (address rollupPassage, address rollupOrders, address wbtc, address usdt) { + vm.startBroadcast(); + (rollupPassage, rollupOrders, wbtc, usdt) = deployPartOne(); + } + + // deploy: + // forge script L2Script --sig "deployTwo()" --fork-url $ANVIL_URL --broadcast + function deployTwo() + public + returns (address gnosisFactory, address gnosisSingleton, address gnosisFallbackHandler, address usdcAdmin) + { + vm.startBroadcast(); + (gnosisFactory, gnosisSingleton, gnosisFallbackHandler, usdcAdmin) = deployPartTwo(); + } +} From e843372c247ba3c202c1d2b98e917c3a8bec4c59 Mon Sep 17 00:00:00 2001 From: Anna Carroll Date: Fri, 30 Aug 2024 14:24:36 +0100 Subject: [PATCH 2/7] add deps --- lib/safe-smart-account | 1 + lib/simple-erc20 | 1 + lib/stablecoin-evm | 1 + 3 files changed, 3 insertions(+) create mode 160000 lib/safe-smart-account create mode 160000 lib/simple-erc20 create mode 160000 lib/stablecoin-evm diff --git a/lib/safe-smart-account b/lib/safe-smart-account new file mode 160000 index 0000000..bf943f8 --- /dev/null +++ b/lib/safe-smart-account @@ -0,0 +1 @@ +Subproject commit bf943f80fec5ac647159d26161446ac5d716a294 diff --git a/lib/simple-erc20 b/lib/simple-erc20 new file mode 160000 index 0000000..36523ad --- /dev/null +++ b/lib/simple-erc20 @@ -0,0 +1 @@ +Subproject commit 36523ad1733fdf17ae06c11b2b273bcd0f577d0d diff --git a/lib/stablecoin-evm b/lib/stablecoin-evm new file mode 160000 index 0000000..405efc1 --- /dev/null +++ b/lib/stablecoin-evm @@ -0,0 +1 @@ +Subproject commit 405efc100c016ed1a437063b6274b4e24ea7b8b1 From b33bd2a1a492a27186116d141ac3b5dcdb5b4ba0 Mon Sep 17 00:00:00 2001 From: Anna Carroll Date: Fri, 30 Aug 2024 14:26:03 +0100 Subject: [PATCH 3/7] fix: rm deprecated script --- script/DeployL2.s.sol | 2 -- 1 file changed, 2 deletions(-) diff --git a/script/DeployL2.s.sol b/script/DeployL2.s.sol index ab055cb..1dd5447 100644 --- a/script/DeployL2.s.sol +++ b/script/DeployL2.s.sol @@ -4,8 +4,6 @@ pragma solidity 0.8.26; // system contracts import {RollupOrders} from "../src/orders/RollupOrders.sol"; import {RollupPassage} from "../src/passage/RollupPassage.sol"; -// permit2 -import {deployPermit2} from "./DeployPermit2.s.sol"; // gnosis safe import {deployGnosisCore, deploySafeInstance, SafeSetup} from "./DeployGnosisSafe.s.sol"; // simple erc20 From 75db01b075875cd6134bceae462ff348ab1985e4 Mon Sep 17 00:00:00 2001 From: Anna Carroll Date: Fri, 30 Aug 2024 14:35:34 +0100 Subject: [PATCH 4/7] refactor, simplify --- script/DeployGnosisSafe.s.sol | 81 ++++++++++++++++++++++++++--------- script/DeployL2.s.sol | 73 ------------------------------- script/ZenithL2.s.sol | 36 ++++++++++------ 3 files changed, 83 insertions(+), 107 deletions(-) delete mode 100644 script/DeployL2.s.sol diff --git a/script/DeployGnosisSafe.s.sol b/script/DeployGnosisSafe.s.sol index 3858567..943766c 100644 --- a/script/DeployGnosisSafe.s.sol +++ b/script/DeployGnosisSafe.s.sol @@ -20,29 +20,68 @@ struct SafeSetup { uint256 saltNonce; } -function deployGnosisCore() returns (address factory, address singleton, address fallbackHandler) { - factory = address(new SafeProxyFactory{salt: "zenith.gnosisFactory"}()); - singleton = address(new SafeL2{salt: "zenith.gnosisSingleton"}()); - fallbackHandler = address(new CompatibilityFallbackHandler{salt: "zenith.gnosisFallbackHandlder"}()); -} - -function deploySafeInstance(address factory, address singleton, SafeSetup memory setup) returns (address safe) { - bytes memory init = abi.encodeWithSignature( - "setup(address[],uint256,address,bytes,address,address,uint256,address)", - setup.owners, - setup.threshold, - setup.to, - setup.data, - setup.fallbackHandler, - setup.paymentToken, - setup.payment, - setup.paymentReceiver - ); - safe = address(SafeProxyFactory(factory).createProxyWithNonce(singleton, init, setup.saltNonce)); -} +address constant OWNER_ONE = 0x1111111111111111111111111111111111111111; +address constant OWNER_TWO = 0x2222222222222222222222222222222222222222; +bytes32 constant SENTINEL_VALUE = 0x0000000000000000000000000000000000000000000000000000000000000001; contract GnosisScript is Script { - bytes32 constant SENTINEL_VALUE = 0x0000000000000000000000000000000000000000000000000000000000000001; + // deploy: + // forge script GnosisScript --sig "deployGnosis()" --rpc-url $RPC_URL --broadcast [signing args] + function deployGnosis() + public + returns (address gnosisFactory, address gnosisSingleton, address gnosisFallbackHandler, address usdcAdmin) + { + vm.startBroadcast(); + + // deploy gnosis safe singleton & proxy factory + (gnosisFactory, gnosisSingleton, gnosisFallbackHandler) = deployGnosisCore(); + + // deploy a gnosis safe proxy as the USDC admin + usdcAdmin = deploySafeInstance(gnosisFactory, gnosisSingleton, getUsdcAdminSetup(gnosisFallbackHandler)); + } + + function deployGnosisCore() public returns (address factory, address singleton, address fallbackHandler) { + factory = address(new SafeProxyFactory{salt: "zenith.gnosisFactory"}()); + singleton = address(new SafeL2{salt: "zenith.gnosisSingleton"}()); + fallbackHandler = address(new CompatibilityFallbackHandler{salt: "zenith.gnosisFallbackHandlder"}()); + } + + function deploySafeInstance(address factory, address singleton, SafeSetup memory setup) + public + returns (address safe) + { + bytes memory init = abi.encodeWithSignature( + "setup(address[],uint256,address,bytes,address,address,uint256,address)", + setup.owners, + setup.threshold, + setup.to, + setup.data, + setup.fallbackHandler, + setup.paymentToken, + setup.payment, + setup.paymentReceiver + ); + safe = address(SafeProxyFactory(factory).createProxyWithNonce(singleton, init, setup.saltNonce)); + } + + // setup the gnosis safe with 2 owners, threshold of 1. + // make the owners recognizable addrs to aid in inspecting storage layout + function getUsdcAdminSetup(address fallbackHandler) public pure returns (SafeSetup memory usdcAdminSetup) { + address[] memory owners = new address[](2); + owners[0] = OWNER_ONE; + owners[1] = OWNER_TWO; + usdcAdminSetup = SafeSetup({ + owners: owners, + threshold: 1, + to: address(0), + data: "", + fallbackHandler: fallbackHandler, + paymentToken: address(0), + payment: 0, + paymentReceiver: payable(address(0)), + saltNonce: 17001 + }); + } // example run: // forge script GnosisScript --sig "printOwnerSlots" "[0x1111111111111111111111111111111111111111, 0x2222222222222222222222222222222222222222]" diff --git a/script/DeployL2.s.sol b/script/DeployL2.s.sol deleted file mode 100644 index 1dd5447..0000000 --- a/script/DeployL2.s.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: MIT OR Apache-2.0 -pragma solidity 0.8.26; - -// system contracts -import {RollupOrders} from "../src/orders/RollupOrders.sol"; -import {RollupPassage} from "../src/passage/RollupPassage.sol"; -// gnosis safe -import {deployGnosisCore, deploySafeInstance, SafeSetup} from "./DeployGnosisSafe.s.sol"; -// simple erc20 -import {SimpleERC20} from "simple-erc20/SimpleERC20.sol"; -// utils -import {console2} from "forge-std/Script.sol"; - -address constant MINTER = 0x9999999999999999999999999999999999999999; -address constant OWNER_ONE = 0x1111111111111111111111111111111111111111; -address constant OWNER_TWO = 0x2222222222222222222222222222222222222222; - -address constant PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3; - -function deployPartOne() returns (address rollupPassage, address rollupOrders, address wbtc, address usdt) { - // NOTE: must deploy Permit2 via https://github.com/Uniswap/permit2/blob/main/script/DeployPermit2.s.sol - // in order to properly setup _CACHED_CHAIN_ID and _CACHED_DOMAIN_SEPARATOR - - // deploy system contracts - rollupPassage = address(new RollupPassage{salt: "zenith.rollupPassage"}(PERMIT2)); - console2.log("rollupPassage", rollupPassage); - rollupOrders = address(new RollupOrders{salt: "zenith.rollupOrders"}(PERMIT2)); - console2.log("rollupOrders", rollupOrders); - - // deploy simple erc20 tokens - // make minter a recognizable addrs to aid in inspecting storage layout - wbtc = address(new SimpleERC20{salt: "zenith.wbtc"}(MINTER, "Wrapped BTC", "WBTC")); - usdt = address(new SimpleERC20{salt: "zenith.usdt"}(MINTER, "Tether USD", "USDT")); - console2.log("wbtc", wbtc); - console2.log("usdt", usdt); -} - -function deployPartTwo() - returns (address gnosisFactory, address gnosisSingleton, address gnosisFallbackHandler, address usdcAdmin) -{ - // deploy gnosis safe singleton & proxy factory - (gnosisFactory, gnosisSingleton, gnosisFallbackHandler) = deployGnosisCore(); - console2.log("gnosisFactory", gnosisFactory); - console2.log("gnosisSingleton", gnosisSingleton); - console2.log("gnosisFallbackHandler", gnosisFallbackHandler); - - // deploy a gnosis safe proxy as the USDC admin - usdcAdmin = deploySafeInstance(gnosisFactory, gnosisSingleton, getUsdcAdminSetup(gnosisFallbackHandler)); - console2.log("usdcAdmin", usdcAdmin); - - // NOTE: must deploy USDC via https://github.com/circlefin/stablecoin-evm/blob/master/scripts/deploy/deploy-fiat-token.s.sol - // cannot import USDC deploy script because of git submodules - - // it has a different remapping for openzeppelin contracts and can't compile in this repo -} - -// setup the gnosis safe with 2 owners, threshold of 1. -// make the owners recognizable addrs to aid in inspecting storage layout -function getUsdcAdminSetup(address fallbackHandler) pure returns (SafeSetup memory usdcAdminSetup) { - address[] memory owners = new address[](2); - owners[0] = OWNER_ONE; - owners[1] = OWNER_TWO; - usdcAdminSetup = SafeSetup({ - owners: owners, - threshold: 1, - to: address(0), - data: "", - fallbackHandler: fallbackHandler, - paymentToken: address(0), - payment: 0, - paymentReceiver: payable(address(0)), - saltNonce: 17001 - }); -} diff --git a/script/ZenithL2.s.sol b/script/ZenithL2.s.sol index d7986d0..a0e013e 100644 --- a/script/ZenithL2.s.sol +++ b/script/ZenithL2.s.sol @@ -2,25 +2,35 @@ pragma solidity 0.8.26; // system contracts -import {deployPartOne, deployPartTwo} from "./DeployL2.s.sol"; +import {RollupOrders} from "../src/orders/RollupOrders.sol"; +import {RollupPassage} from "../src/passage/RollupPassage.sol"; +// simple erc20 +import {SimpleERC20} from "simple-erc20/SimpleERC20.sol"; // utils import {Script, console2} from "forge-std/Script.sol"; +// create2 address for Permit2 +address constant PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3; +// address of Minter with permission to mint ERC20 tokens +address constant MINTER = 0x9999999999999999999999999999999999999999; + contract L2Script is Script { // deploy: - // forge script L2Script --sig "deployOne()" --fork-url $ANVIL_URL --broadcast - function deployOne() public returns (address rollupPassage, address rollupOrders, address wbtc, address usdt) { + // forge script L2Script --sig "deploySystem()" --rpc-url $RPC_URL --broadcast [signing args] + function deploySystem() public returns (address rollupPassage, address rollupOrders, address wbtc, address usdt) { vm.startBroadcast(); - (rollupPassage, rollupOrders, wbtc, usdt) = deployPartOne(); - } - // deploy: - // forge script L2Script --sig "deployTwo()" --fork-url $ANVIL_URL --broadcast - function deployTwo() - public - returns (address gnosisFactory, address gnosisSingleton, address gnosisFallbackHandler, address usdcAdmin) - { - vm.startBroadcast(); - (gnosisFactory, gnosisSingleton, gnosisFallbackHandler, usdcAdmin) = deployPartTwo(); + // deploy system contracts + rollupPassage = address(new RollupPassage{salt: "zenith.rollupPassage"}(PERMIT2)); + rollupOrders = address(new RollupOrders{salt: "zenith.rollupOrders"}(PERMIT2)); + + // deploy simple erc20 tokens + wbtc = address(new SimpleERC20{salt: "zenith.wbtc"}(MINTER, "Wrapped BTC", "WBTC")); + usdt = address(new SimpleERC20{salt: "zenith.usdt"}(MINTER, "Tether USD", "USDT")); } } + +// NOTE: must deploy Permit2 via https://github.com/Uniswap/permit2/blob/main/script/DeployPermit2.s.sol +// in order to properly setup _CACHED_CHAIN_ID and _CACHED_DOMAIN_SEPARATOR + +// NOTE: must deploy USDC via https://github.com/circlefin/stablecoin-evm/blob/master/scripts/deploy/deploy-fiat-token.s.sol From 444ac7d9897f44b5d7ff40d9aafacb7ad648e4d3 Mon Sep 17 00:00:00 2001 From: Anna Carroll Date: Tue, 3 Sep 2024 18:00:04 -0500 Subject: [PATCH 5/7] feat: WETH9 deploy script --- script/DeployWETH9.s.sol | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 script/DeployWETH9.s.sol diff --git a/script/DeployWETH9.s.sol b/script/DeployWETH9.s.sol new file mode 100644 index 0000000..8c665d5 --- /dev/null +++ b/script/DeployWETH9.s.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity 0.8.26; + +// utils +import {Script, console2} from "forge-std/Script.sol"; + +contract WETHScript is Script { + // forge script WETHScript --sig "deployWETH9()" --rpc-url $RPC_URL --broadcast [signing args] + function deployWETH9() public returns (address weth9) { + vm.startBroadcast(); + + bytes memory deployCode = + hex"60606040526040805190810160405280600d81526020017f57726170706564204574686572000000000000000000000000000000000000008152506000908051906020019061004f9291906100c8565b506040805190810160405280600481526020017f57455448000000000000000000000000000000000000000000000000000000008152506001908051906020019061009b9291906100c8565b506012600260006101000a81548160ff021916908360ff16021790555034156100c357600080fd5b61016d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061010957805160ff1916838001178555610137565b82800160010185558215610137579182015b8281111561013657825182559160200191906001019061011b565b5b5090506101449190610148565b5090565b61016a91905b8082111561016657600081600090555060010161014e565b5090565b90565b610c348061017c6000396000f3006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"; + + assembly { + weth9 := create(0, add(deployCode, 0x20), mload(deployCode)) + } + } +} From aced8464d2b1ad0df83ad6594f6df6b855803997 Mon Sep 17 00:00:00 2001 From: Anna Carroll Date: Tue, 3 Sep 2024 18:03:02 -0500 Subject: [PATCH 6/7] fix: fmt --- script/DeployWETH9.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/DeployWETH9.s.sol b/script/DeployWETH9.s.sol index 8c665d5..2424b66 100644 --- a/script/DeployWETH9.s.sol +++ b/script/DeployWETH9.s.sol @@ -8,7 +8,7 @@ contract WETHScript is Script { // forge script WETHScript --sig "deployWETH9()" --rpc-url $RPC_URL --broadcast [signing args] function deployWETH9() public returns (address weth9) { vm.startBroadcast(); - + bytes memory deployCode = hex"60606040526040805190810160405280600d81526020017f57726170706564204574686572000000000000000000000000000000000000008152506000908051906020019061004f9291906100c8565b506040805190810160405280600481526020017f57455448000000000000000000000000000000000000000000000000000000008152506001908051906020019061009b9291906100c8565b506012600260006101000a81548160ff021916908360ff16021790555034156100c357600080fd5b61016d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061010957805160ff1916838001178555610137565b82800160010185558215610137579182015b8281111561013657825182559160200191906001019061011b565b5b5090506101449190610148565b5090565b61016a91905b8082111561016657600081600090555060010161014e565b5090565b90565b610c348061017c6000396000f3006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"; From f5e85bda00ff3667ce0186247bfe228187990acb Mon Sep 17 00:00:00 2001 From: Anna Carroll Date: Wed, 4 Sep 2024 14:37:52 -0500 Subject: [PATCH 7/7] update MINTER address --- script/ZenithL2.s.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/script/ZenithL2.s.sol b/script/ZenithL2.s.sol index a0e013e..a6d8452 100644 --- a/script/ZenithL2.s.sol +++ b/script/ZenithL2.s.sol @@ -11,8 +11,9 @@ import {Script, console2} from "forge-std/Script.sol"; // create2 address for Permit2 address constant PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3; -// address of Minter with permission to mint ERC20 tokens -address constant MINTER = 0x9999999999999999999999999999999999999999; +// address that can mint ERC20 tokens. equal to "tokenadmin" in hex. +// the Signet Node makes evm executions from this address to perform ERC20 bridge-ins. +address constant MINTER = 0x00000000000000000000746f6b656E61646d696E; contract L2Script is Script { // deploy: