🚀 [멤버십]
상위 1% 수익률 도전! 코인 텐베거 클럽 가입하기 →
브릿지 토큰 컨트랙트 소스입니다.
이더 <-> 베이스 예시이고
코드는 기본적인 구성만 되어 있기 때문에 학습용도로만 활용하시기 바랍니다.
ETH->Base 체인
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
// [Ethereum L1 Bridge] 자산을 보관하는 금고(Vault) 역할
contract L1BridgeVault is Ownable {
using SafeERC20 for IERC20;
IERC20 public l1Token;
event DepositToBase(address indexed user, uint256 amount);
event WithdrawFromBase(address indexed user, uint256 amount);
constructor(address _l1Token) Ownable(msg.sender) {
l1Token = IERC20(_l1Token);
}
// 1. 이더리움 -> 베이스 (자산 잠금)
// 사용자가 자신의 이더리움 L1 토큰을 이 금고 컨트랙트에 예치(Lock)합니다.
function depositToBase(uint256 amount) external {
l1Token.safeTransferFrom(msg.sender, address(this), amount);
// 오프체인 릴레이어(Relayer)가 이를 감지하고 Base에서 토큰을 발행해줍니다.
emit DepositToBase(msg.sender, amount);
}
// 2. 베이스 -> 이더리움 (자산 잠금 해제)
// Base에서 토큰이 소각되었음을 확인한 릴레이어만 호출하여 사용자에게 L1 토큰을 돌려줍니다.
function unlockFromBase(address to, uint256 amount) external onlyOwner {
l1Token.safeTransfer(to, amount);
emit WithdrawFromBase(to, amount);
}
}
Base->Eth 체인
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
// [Base L2 Token] 브릿지된 자산의 발행 및 소각을 담당
contract L2BridgedToken is ERC20, ERC20Burnable, Ownable {
event MintedFromL1(address indexed user, uint256 amount);
event BurnedForL1(address indexed user, uint256 amount);
constructor() ERC20("Base Bridged Token", "bTOKEN") Ownable(msg.sender) {}
// 1. 이더리움 -> 베이스 (L2 토큰 신규 발행)
// 이더리움에서 자산이 잠긴(Lock) 것을 확인한 릴레이어가 L2에서 사용자에게 토큰을 발행(Mint)해줍니다.
function mintFromL1(address to, uint256 amount) external onlyOwner {
_mint(to, amount);
emit MintedFromL1(to, amount);
}
// 2. 베이스 -> 이더리움 (L2 토큰 소각)
// 사용자가 L1 이더리움으로 자산을 되돌리기 위해 자신의 L2 토큰을 소각(Burn)합니다.
function withdrawToL1(uint256 amount) external {
_burn(msg.sender, amount);
// 오프체인 릴레이어가 이를 감지하고 이더리움 L1 금고에서 자산을 해제(Unlock)해줍니다.
emit BurnedForL1(msg.sender, amount);
}
}
댓글