본문 바로가기
블록체인교육/솔리디티

브릿지 토큰(이더<->베이스)

by Danny_Kim 2026. 10. 9.

브릿지 토큰 컨트랙트 소스입니다.

이더 <-> 베이스 예시이고

코드는 기본적인 구성만 되어 있기 때문에 학습용도로만 활용하시기 바랍니다.

 

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);
    }
}

🔑🔑🔑 추천 링크 🔑🔑🔑

  1. 쉽게 이해하고 따라하는 블록체인 마스터 과정
  2. 알트코인 투자 정석 및 2026 암호화폐 시장 주목할 섹터

댓글