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 관례입니다. 익스플로러는 이 규칙으로 발행·소각을 구분합니다.