Bridging Your Standard ERC-20 Token Using the Standard Bridge
Standard Bridge 시스템을 사용하여 Ethereum 에서 Thanos 으로 ERC-20 토큰을 브리지하는 방법을 알아봅니다. 이 튜토리얼은 Ethereum 에 기존 ERC-20 토큰이 있고 Thanos 에서 브릿지를 지원하는 토큰을 만들고자 하는 개발자를 대상으로 합니다.
이 튜토리얼을 위해서는 L1 ERC-20 토큰이 필요합니다. 이미 Sepolia에 배포된 L1 ERC-20 토큰이 있는 경우 이 단계를 건너뛸 수 있습니다. 그렇지 않은 경우 0x5589BB8228C07c4e15558875fAf2B859f678d129에 정의된 테스트 토큰을 사용할 수 있습니다. 토큰을 주조하는 데 사용할 수 있는 기능이 포함되어 있습니다.
L2 ERC-20 토큰 생성
L1 ERC-20 토큰이 있으면 OptimismMintableERC20Factory을 사용하여 Thanos에서 ERC-20 토큰을 생성할 수 있습니다. 팩토리 계약에서 생성된 모든 토큰은 IOptimismMintableERC20인터페이스를 구현하며 Standard Bridge 시스템과 호환됩니다.
# Replace this with your L1 ERC-20 token if not using the testing token!export TUTORIAL_L1_ERC20_ADDRESS=0x5589BB8228C07c4e15558875fAf2B859f678d129
L2 ERC-20 토큰 배포
castsend0x4200000000000000000000000000000000000012"createOptimismMintableERC20(address,string,string)" $TUTORIAL_L1_ERC20_ADDRESS "My Standard Demo Token""L2TKN"--private-key $PRIVATE_KEY --rpc-url $TUTORIAL_RPC_URL --json|jq-r'.logs[0].topics[2]'|castparse-bytes32-address
Bridging Your Custom ERC-20 Token Using the Standard Bridge
Standard Bridge 시스템을 사용하여 Ethereum 에서 Thanos 으로 ERC-20 토큰을 브리지하는 방법을 알아봅니다. 이 튜토리얼은 Ethereum 에 기존 ERC-20 토큰이 있고 Thanos 에서 브릿지를 지원하는 토큰을 만들고자 하는 개발자를 대상으로 합니다.
이 튜토리얼을 위해서는 L1 ERC-20 토큰이 필요합니다. 이미 Sepolia에 배포된 L1 ERC-20 토큰이 있는 경우 이 단계를 건너뛸 수 있습니다. 그렇지 않은 경우 0x5589BB8228C07c4e15558875fAf2B859f678d129에 정의된 테스트 토큰을 사용할 수 있습니다. 토큰을 주조하는 데 사용할 수 있는 기능이 포함되어 있습니다.
L2 ERC-20 토큰 생성
L1 ERC-20 토큰이 있으면 Thanos 에서 해당 L2 ERC-20 토큰을 만들 수 있습니다. 이 튜토리얼에서는 Remix를 사용하여 Hardhat과 같은 프레임워크 없이도 쉽게 토큰을 배포하는 방법을 설명합니다. 또는, 선호하는 프레임워크를 사용할 경우 동일한 일반적인 과정을 따를 수 있습니다.
이 섹션에서는 입금은 가능하지만 인출은 불가능한 ERC-20 토큰을 만들 것입니다. 이것은 L2 토큰을 사용자 정의할 수 있는 무한한 방법 중 하나에 불과합니다.
📄("새 파일 만들기") 버튼을 클릭하여 새 빈 Solidity 파일을 만듭니다. 이 파일의 이름은 원하는 대로 지정할 수 있습니다. 다음 예시 계약서를 새 파일에 복사하세요.
// SPDX-License-Identifier: MITpragmasolidity ^0.8.0;import { ERC20 } from"@openzeppelin/contracts/token/ERC20/ERC20.sol";import { IERC165 } from"@openzeppelin/contracts/utils/introspection/IERC165.sol";import { IOptimismMintableERC20 } from"https://github.com/tokamak-network/tokamak-thanos/blob/main/packages/tokamak/contracts-bedrock/src/universal/IOptimismMintableERC20.sol";contractMyCustomL2TokenisIOptimismMintableERC20, ERC20 {/// @notice Address of the corresponding version of this token on the remote chain.addresspublicimmutable REMOTE_TOKEN;/// @notice Address of the StandardBridge on this network.addresspublicimmutable BRIDGE;/// @notice Emitted whenever tokens are minted for an account./// @param account Address of the account tokens are being minted for./// @param amount Amount of tokens minted.eventMint(addressindexed account, uint256 amount);/// @notice Emitted whenever tokens are burned from an account./// @param account Address of the account tokens are being burned from./// @param amount Amount of tokens burned.eventBurn(addressindexed account, uint256 amount);/// @notice A modifier that only allows the bridge to call.modifieronlyBridge() {require(msg.sender == BRIDGE,"MyCustomL2Token: only bridge can mint and burn"); _; }/// @param _bridge Address of the L2 standard bridge./// @param _remoteToken Address of the corresponding L1 token./// @param _name ERC20 name./// @param _symbol ERC20 symbol.constructor(address_bridge,address_remoteToken,stringmemory_name,stringmemory_symbol )ERC20(_name, _symbol) { REMOTE_TOKEN = _remoteToken; BRIDGE = _bridge; }/// @custom:legacy/// @notice Legacy getter for REMOTE_TOKEN.functionremoteToken() publicviewreturns (address) {return REMOTE_TOKEN; }/// @custom:legacy/// @notice Legacy getter for BRIDGE.functionbridge() publicviewreturns (address) {return BRIDGE; }/// @notice ERC165 interface check function./// @param _interfaceId Interface ID to check./// @return Whether or not the interface is supported by this contract.functionsupportsInterface(bytes4_interfaceId) externalpurevirtualreturns (bool) {bytes4 iface1 = type(IERC165).interfaceId;// Interface corresponding to the updated OptimismMintableERC20 (this contract).bytes4 iface2 = type(IOptimismMintableERC20).interfaceId;return _interfaceId == iface1 || _interfaceId == iface2; }/// @notice Allows the StandardBridge on this network to mint tokens./// @param _to Address to mint tokens to./// @param _amount Amount of tokens to mint.functionmint(address_to,uint256_amount )externalvirtualoverride(IOptimismMintableERC20)onlyBridge {_mint(_to, _amount);emitMint(_to, _amount); }/// @notice Prevents tokens from being withdrawn to L1.functionburn(address,uint256 )externalvirtualoverride(IOptimismMintableERC20)onlyBridge {revert("MyCustomL2Token cannot be withdrawn"); }}
계약 저장 및 배포
파일을 저장하여 자동으로 계약을 컴파일합니다. 자동 컴파일을 비활성화한 경우 "Solidity Compiler" 탭을 클릭하고 파란색 "Compile" 버튼을 눌러 수동으로 계약을 컴파일해야 합니다.
배포 탭을 엽니다. 환경이 "Injected Provider"로 설정되어 있고, 지갑이 Thanos 에 연결되어 있으며, Remix가 지갑에 액세스할 수 있는지 확인합니다. 그런 다음 MyCustomL2Token배포 드롭다운에서 계약을 선택하고 다음 매개변수로 배포합니다.