블록체인 학습
0 XP

Transfer 이벤트 패턴

ERC-20 토큰을 비롯한 수많은 표준이 공통으로 쓰는 가장 유명한 이벤트가 Transfer 입니다. 토큰이 한 주소에서 다른 주소로 옮겨갈 때마다 발행되고, 지갑과 익스플로러는 바로 이 로그 를 읽어 거래 내역을 보여줍니다.

표준 시그니처

ERC-20의 Transfer 는 시그니처가 정해져 있습니다. from 과 to 는 indexed 로 선언되어 주소 기준 필터링이 가능하고, value 는 데이터 영역에 담깁니다.

event Transfer(address indexed from, address indexed to, uint256 value);

from 과 to 가 topic 이므로 "내가 받은 모든 전송", "이 주소가 보낸 모든 전송"을 빠르게 조회할 수 있습니다. 지갑과 익스플로러(Etherscan 등)가 이 시그니처를 그대로 기대하므로, 토큰을 만들 때는 이름과 매개변수를 표준에 정확히 맞춰야 합니다.

컨트랙트에 적용하기

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract MiniToken {
    mapping(address => uint256) public balanceOf;
 
    // 표준 Transfer 이벤트: from, to 는 indexed
    event Transfer(address indexed from, address indexed to, uint256 value);
 
    constructor() {
        balanceOf[msg.sender] = 1000;
    }
 
    function transfer(address to, uint256 value) public {
        require(balanceOf[msg.sender] >= value, unicode"잔액 부족");
        balanceOf[msg.sender] -= value; // 1) 보내는 쪽 감소
        balanceOf[to] += value;         // 2) 받는 쪽 증가
        emit Transfer(msg.sender, to, value); // 3) 사건 기록
    }
}

잔액을 require 로 확인하고, 상태 변수 인 잔액을 갱신한 뒤, 마지막에 emit Transfer(...) 로 사건을 기록하는 순서입니다.

민팅(발행)은 from 을 영주소(address(0))로, 소각(burn)은 to 를 영주소로 해서 Transfer 를 발행하는 것이 ERC-20 관례입니다. 익스플로러는 이 규칙으로 발행·소각을 구분합니다.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.