Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions contracts/foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
40 changes: 40 additions & 0 deletions contracts/script/BridgeERC20.sol
Original file line number Diff line number Diff line change
@@ -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();
}
}
52 changes: 52 additions & 0 deletions contracts/script/DeployERC20.sol
Original file line number Diff line number Diff line change
@@ -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));
}
}
Loading