From 64530b91f9298bcbb07a6db87fd41e338ec432e8 Mon Sep 17 00:00:00 2001 From: Gregory Hill Date: Thu, 1 May 2025 11:07:20 +0100 Subject: [PATCH] feat: add script to deploy standard erc20 Signed-off-by: Gregory Hill --- contracts/foundry.toml | 5 +-- contracts/script/BridgeERC20.sol | 40 ++++++++++++++++++++++++ contracts/script/DeployERC20.sol | 52 ++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 contracts/script/BridgeERC20.sol create mode 100644 contracts/script/DeployERC20.sol diff --git a/contracts/foundry.toml b/contracts/foundry.toml index 0a24a1be8..8b15e13e6 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -26,5 +26,6 @@ test = "src" # `viaIR` flag needs to enabled since `Lightrelay.t.sol` requires it via_ir = true -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options - +[rpc_endpoints] +bob = "https://rpc.gobob.xyz" +eth = "https://eth.llamarpc.com" diff --git a/contracts/script/BridgeERC20.sol b/contracts/script/BridgeERC20.sol new file mode 100644 index 000000000..c3488f14a --- /dev/null +++ b/contracts/script/BridgeERC20.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Script, console2} from "forge-std/Script.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +// https://github.com/ethereum-optimism/optimism/blob/4465688458251351b048c6f0d5cf9e2dd14bd515/packages/contracts-bedrock/interfaces/universal/IStandardBridge.sol#L31 +interface IStandardBridge { + function bridgeERC20( + address _localToken, + address _remoteToken, + uint256 _amount, + uint32 _minGasLimit, + bytes memory _extraData + ) external; +} + +contract BridgeERC20 is Script { + address constant L1_STANDARD_BRIDGE = + 0x3F6cE1b36e5120BBc59D0cFe8A5aC8b6464ac1f7; + + function run() public { + vm.startBroadcast(); + + address l1_token = vm.envAddress("L1_TOKEN"); + address l2_token = vm.envAddress("L2_TOKEN"); + uint amount = 100; + IERC20(l1_token).approve(L1_STANDARD_BRIDGE, amount); + IStandardBridge(L1_STANDARD_BRIDGE).bridgeERC20( + l1_token, + l2_token, + amount, + 200000, + "" + ); + + vm.stopBroadcast(); + } +} diff --git a/contracts/script/DeployERC20.sol b/contracts/script/DeployERC20.sol new file mode 100644 index 000000000..429a56c8f --- /dev/null +++ b/contracts/script/DeployERC20.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Script, console2} from "forge-std/Script.sol"; +import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +// https://github.com/ethereum-optimism/optimism/blob/327f972191d858181e9cbfc03a15fcd2f4604be4/packages/contracts-bedrock/src/universal/OptimismMintableERC20Factory.sol#L19 +interface IOptimismERC20Factory { + function createOptimismMintableERC20WithDecimals( + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) external returns (address); +} + +contract DeployERC20 is Script { + function run() public { + IERC20Metadata l1_token = IERC20Metadata(vm.envAddress("L1_TOKEN")); + console2.log("L1 Token:", address(l1_token)); + + vm.createSelectFork(vm.rpcUrl("eth")); + + string memory name = l1_token.name(); + string memory symbol = l1_token.symbol(); + uint8 decimals = l1_token.decimals(); + + IOptimismERC20Factory factory = IOptimismERC20Factory( + 0x4200000000000000000000000000000000000012 + ); + + console2.log("Name:", name); + console2.log("Symbol:", symbol); + console2.log("Decimals:", decimals); + + vm.createSelectFork(vm.rpcUrl("bob")); + + vm.startBroadcast(); + + address l2_token = factory.createOptimismMintableERC20WithDecimals( + address(l1_token), + name, + symbol, + decimals + ); + + vm.stopBroadcast(); + + console2.log("L2 Token:", address(l2_token)); + } +}