testnet
GitHub EN

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)
}
ESC
검색어를 입력하세요