EmitEvent
func EmitEvent(emitter common.Address, stateDB vm.StateDB, contractABI abi.ABI, eventName string, args ...interface{}) error EVM 로그 이벤트를 생성하고 발행합니다. 제공된 ABI 정의에 따라 인덱싱된 인자(토픽)와 인덱싱되지 않은 인자(데이터)를 자동으로 분리하고 로그를 StateDB에 삽입합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
emitter | common.Address | ✓ | 이벤트를 발행하는 컨트랙트(프리컴파일)의 주소입니다. |
stateDB | vm.StateDB | ✓ | 로그를 저장하는 데 사용되는 현재 EVM 상태 데이터베이스 인터페이스입니다. |
contractABI | abi.ABI | ✓ | 이벤트 정의가 포함된 컨트랙트의 파싱된 ABI입니다. |
eventName | string | ✓ | 발행할 이벤트의 이름입니다 (contractABI에 존재해야 함). |
args | ...interface{} | ✓ | 이벤트의 입력 순서와 일치하는 가변 인자입니다. |
반환값
타입:
error 성공 시 nil을 반환합니다. 이벤트를 찾을 수 없거나, 인자 개수가 불일치하거나, 패킹에 실패하면 에러를 반환합니다.
에러
| 코드 | 이름 | 설명 |
|---|---|---|
EventNotFound | Event Not Found | 지정된 `eventName`이 제공된 ABI에 존재하지 않습니다. |
ArgCountMismatch | Argument Count Mismatch | 제공된 `args`의 개수가 이벤트 정의와 일치하지 않습니다. |
TopicLimitExceeded | Topic Limit Exceeded | 이벤트가 EVM 제한인 4개 이상의 토픽(서명 포함)을 요구합니다. |
예제
Transfer 이벤트 발행
표준 ERC20 Transfer 이벤트를 발행합니다. 유틸리티가 인덱싱된 인자에 대한 토픽 해싱을 자동으로 처리합니다.
// Assuming contractABI is loaded and contains "Transfer(address,address,uint256)"
// Transfer has 2 indexed args (from, to) and 1 non-indexed (value)
err := utils.EmitEvent(
contractAddress,
stateDB,
contractABI,
"Transfer",
fromAddress, // indexed
toAddress, // indexed
amount, // non-indexed
)
if err != nil {
return nil, fmt.Errorf("failed to emit Transfer event: %w", err)
}