지정한 스마트 컨트랙트 이벤트 로그가 포함된 트랜잭션이 생성될 때 알림을 제공합니다. 사용자는 모니터링하려는 계정 주소(address)와 이벤트의 식별자 정보(topics)를 필터 조건으로 지정할 수 있습니다. 예를 들어, ERC20 표준의 토큰 전송 이벤트인 Transfer(address,address,uint256)를 모니터링하도록 설정하면, 해당 Event signature(0xddf252ad...)와 일치하는 모든 트랜잭션 로그가 캡처됩니다. LOG EventType을 활용하여 표준 토큰 전송 또는 특정 스마트 계약 이벤트와 같은 중요한 활동을 효율적으로 추적할 수 있습니다.
Supported Network
Network | Supporting |
---|---|
Ethereum Mainnet | ✅ |
Ethereum Testnet (sepolia) | ✅ |
Ethereum Testnet (holesky) | ✅ |
Polygon Mainnet | ✅ |
Polygon Testnet (amoy) | ✅ |
Arbitrum Mainnet | ✅ |
Arbitrum Testnet (sepolia) | ✅ |
Optimism Mainnet | ✅ |
Optimism Testnet (sepolia) | ✅ |
Kaia Mainnet | ✅ |
Kaia Testnet (kairos) | ✅ |
Aptos Mainnet | ❌ |
Aptos Testnet | ❌ |
Webhook 생성 요청 예제
eventType
값을 LOG로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
Key | Type | Description | Required | Example Value |
---|---|---|---|---|
address | String | 모니터링 하고자 하는 Event가 정의된 컨트랙트 주소 | true | 0xdAC17F958D2ee523a2206206994597C13D831ec7 |
topics[4] | Array of String | 모니터링 하고자 하는 Event Log의 Topic 배열 객체. 최대 4개의 문자열을 포함할 수 있습니다. | true | ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x000000000000000000000000b7aa2d3c833a6827c4f39bef9622d7cddf66b7e7", "0x0000000000000000000000003264039cfaa37a70a0e8ccfbf4b7e60bedce5c9f"] |
Topics 필드 사용시 유의사항
Event Signature 중 Address 타입에 해당하는 데이터를 입력하는 경우 Decoded Format이 아닌 Hex Format으로 입력해야 합니다.
모니터링 하고 싶은 이벤트 로그가 있습니다. Topic필드에 어떤 값을 넣어야 하나요?
모니터링하려는 이벤트의 Topic 필드는 스마트 컨트랙트 이벤트와 연결된 데이터를 필터링하는 데 사용됩니다. 각 Topic에는 이벤트의 Event signature 및 인덱싱된 파라미터 정보가 포함됩니다.
topics[0]: Event Signature
- topics[0]은 항상 이벤트의 Event signature를 Keccak256 해시로 변환한 값입니다.
예를 들어,Transfer(address indexed from, address indexed to, uint256 value)
이벤트의 경우 Event signature는 다음과 같은 코드를 실행하여 확인할 수 있습니다.
Keccak256("Transfer(address,address,uint256)")
= 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3eftopics[1], topics[2], topics[3]: Indexed Parameters
- topics[1]부터는 해당 이벤트의 indexed 파라미터 값에 해당합니다. 스마트 컨트랙트에서 indexed 키워드로 선언된 이벤트 파라미터만 Topic에 포함됩니다. 위 예제의 Transfer 이벤트의 경우, from address가 topics[1], to address가 topics[2]에 해당합니다. 즉, from address에 특정 주소가 포함된 이벤트만 필터링 하고 싶다면, topics[1]에 해당 주소값을 입력할 수 있습니다. indexed 파라미터를 제외한 나머지 파라미터들에 대한 입력값은 조회한 로그의 data 필드에서 확인할 수 있습니다.
Topic 값을 확인하는 방법
- 스마트 컨트랙트 코드에서 확인하는 방법: Solidity 코드에서 이벤트 정의를 확인하고, indexed 파라미터와 Event signature를 식별한 뒤, Keccak256 해싱을 통해 Topic에 들어갈 값을 확인할 수 있습니다.
- 블록 Explorer를 활용한 방법: 추적하고자 하는 트랜잭션 예제를 선택하여 트랜잭션 상세로 이동한 뒤, "Logs" 섹션 등 관련 섹션을 통해 Topic값을 확인할 수 있습니다. 아래는 이더스캔(https://etherscan.io) 에서 USDC(ERC20) Transfer 이벤트에 대한 로그를 확인하는 예시 화면입니다.
Request Example
curl --location 'https://web3.nodit.io/v1/ethereum/mainnet/webhooks' \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: ••••••' \
--data '{
"eventType": "LOG",
"description": "{WEBHOOK_DESCRIPTION}",
"notification": {
"webhookUrl": "{WEBHOOK_LISTENER_ENDPOINT}"
},
"condition": {
"address": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
"topics":[
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x000000000000000000000000b7aa2d3c833a6827c4f39bef9622d7cddf66b7e7",
"0x0000000000000000000000003264039cfaa37a70a0e8ccfbf4b7e60bedce5c9f"
]
}
}'
Response Example
{
"subscriptionId": "4975",
"description": "{WEBHOOK_DESCRIPTION}",
"protocol": "ethereum",
"network": "mainnet",
"subscriptionType": "WEBHOOK",
"notification": {
"webhookUrl": "{WEBHOOK_LISTENER_ENDPOINT}"
},
"signingKey": "{signingKey}",
"eventType": "LOG",
"event": {
"targetAddress": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x000000000000000000000000b7aa2d3c833a6827c4f39bef9622d7cddf66b7e7",
"0x0000000000000000000000003264039cfaa37a70a0e8ccfbf4b7e60bedce5c9f"
],
"messages": [
{
"address": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x000000000000000000000000b7aa2d3c833a6827c4f39bef9622d7cddf66b7e7",
"0x0000000000000000000000003264039cfaa37a70a0e8ccfbf4b7e60bedce5c9f"
],
"data": "0x000000000000000000000000000000000000000000000000000000001dceeba0",
"block_number": 21492732,
"transaction_hash": "0x6a7be5762c3e6e7a0d40199612133c9b967dcee1c02c51c2c82db4bc6f47b652",
"transaction_index": 180,
"log_index": 390,
"block_hash": "0xee749b0f3ec7b1bfb44ea2424af1f45cadc05110dc7f7acc3b91dd60c9b77ece",
"block_timestamp": 1735289687,
"removed": false,
"type": "log"
}
]
},
"createdAt": "2024-12-27T08:56:48.396Z"
}