이 기능은 사용자가 특정 이벤트 유형(eventType)과 해당 이벤트를 발생시킨 계정(eventAccountAddress)을 입력하여 API를 설정하면, 지정된 이벤트 유형이 발생했을 때 해당 이벤트 유형이 포함된 트랜잭션의 모든 세부 내역을 반환하는 API입니다. 이벤트가 발생하면 해당 트랜잭션의 전체 내역, 발신자, 수신자, 금액, 호출된 함수, 관련 데이터 등 모든 세부 정보를 확인할 수 있어 시스템 모니터링에 유용하게 활용될 수 있습니다.
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
값을 Transaction로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
Key | Type | Required | Description | Example Value |
---|---|---|---|---|
payloadFunction | String | conditional true | 모니터링 하고자하는 함수. 이 필드는 "module_address::module_name::function_name" 형식으로 입력합니다. | "0x1::aptos_account::transfer" |
eventType | String | conditional true | 모니터링 하고자하는 이벤트 타입. 이벤트 타입은 모듈에서 정의한 event struct의 이름을 의미합니다. 이 필드는 "module_address::module_name::event_name" 형식으로 입력합니다. | "0x8afb046f44dd0cb9c445458f9c2e424759cd11f4a270fe6739dcffc16a4db8e::slime_revolution_game::RandomEvent" |
eventAccountAddress | String | conditional true | 모니터링 하고자하는 이벤트를 발생시키는 주소. | "0x0" |
eventData | Object | false | 이벤트 데이터 필터링 조건을 지정하는 객체. 이 필드를 활용하면 특정 키와 값을 지정하여 원하는 이벤트만 필터링할 수 있습니다. JSON 객체 형식으로 최대 3단계 중첩된 값까지 입력 가능합니다. 입력한 키와 값이 이벤트 데이터와 정확히 일치하는 경우에만 필터링됩니다. | {"sender": "0xcafe", "receiver": "0xface"} |
eventData Condition은 어떻게 활용할 수 있나요?
eventData
Condition은 Event 객체 내부에 Custom하게 구성할 수 있는 데이터 영역에 대한 필터링 옵션으로 사용할 수 있다는 점에서 더욱 세밀한 비즈니스 로직 구현을 가능하게 합니다.예를 들어, 랜덤 함수를 실행하여 경품 당첨과 같은 기능을 구현하는 경우 실행 과정에서 발생시키는 Event 객체에 대해
eventType
필터링을 적용하여 경품 당첨 이벤트의 실행 여부를 알 수 있지만, 당첨된 사용자에 대한 Event만을 받고 싶은 경우에 별도로 필터링 로직을 구현해야 하기 때문에 불필요한 CU 소모 및 구현의 번거로움이 있을 수 있습로니다. 이런 경우 Event 객체를 정의하고 구현하는 과정에서 data 영역 내부에 당첨 결과를 포함하도록 한 뒤 해당 key에 대해eventData
필터를 추가로 설정하여, 당첨된 사용자에 대한 Webhook 메세지만 수신하는 형태로 효과적인 구현이 가능합니다.
condition 객체 필드 사용법
- payloadFunction 을 입력하는 경우
- eventType과 eventAccountAddress를 동시에 입력하거나, 둘 다 입력하지 않을 수 있습니다.
- eventType과 eventAccountAddress 중 하나만 입력하는 것은 불가능합니다.
- payloadFunction 을 입력하지 않는 경우
- 반드시 eventType과 eventAccountAddress를 모두 입력해야 합니다.
- eventType과 eventAccountAddress 중 하나만 입력하는 것은 불가능합니다.
Request Example
curl --location 'https://web3.nodit.io/v1/aptos/mainnet/webhooks' \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: ••••••' \
--data '{
"eventType": "TRANSACTION",
"description": "{WEBHOOK_DESCRIPTION}",
"notification": {
"webhookUrl": "{WEBHOOK_LISTENER_ENDPOINT}"
},
"condition": {
"eventType": "0x8afb046f44dd0cb9c445458f9c2e424759cd11f4a270fe6739dcffc16a4db8e::slime_revolution_game::RandomEvent",
"eventAccountAddress": "0x0"
}
}'
Response Example
{
"subscriptionId": "5022",
"sequenceNumber": "1",
"description": "{WEBHOOK_DESCRIPTION}",
"protocol": "APTOS",
"network": "MAINNET",
"subscriptionType": "WEBHOOK",
"notification": {
"webhookUrl": "{WEBHOOK_LISTENER_ENDPOINT}"
},
"signingKey": "{signingKey}",
"eventType": "TRANSACTION",
"event": {
"eventType": "0x8afb046f44dd0cb9c445458f9c2e424759cd11f4a270fe6739dcffc16a4db8e::slime_revolution_game::RandomEvent",
"eventAccountAddress": "0x0",
"payloadFunction": null,
"messages": [
{
"version": "2107923123",
"hash": "0x031eb21cc010f612fcb37f5da2b5c1b95dbf9073d7fcae767e1e597105468a61",
"state_change_hash": "0xb6400de9395a8694af27027893336428a0eb78da6f7efe5d56d76e608b4a060e",
"event_root_hash": "0xfe78206fa7fce56cf879843b53003379cef2c4e7b48f0c84a092001d7bcbd04f",
"state_checkpoint_hash": null,
"gas_used": "4",
"success": true,
"vm_status": "Executed successfully",
"accumulator_root_hash": "0x01714c68e180ce6ea95279791a07cee4ce5bc2eecee6e046b01f1f8b7cdbc7f7",
"timestamp": "1735290278305653",
"type": "user_transaction",
"events": [
{
"guid": {
"creation_number": "0",
"account_address": "0x0"
},
"sequence_number": "0",
"type": "0x8afb046f44dd0cb9c445458f9c2e424759cd11f4a270fe6739dcffc16a4db8e::slime_revolution_game::RandomEvent",
"data": {
"random_number": "5653"
}
},
{
"guid": {
"creation_number": "0",
"account_address": "0x0"
},
"sequence_number": "0",
"type": "0x1::transaction_fee::FeeStatement",
"data": {
"execution_gas_units": "3",
"io_gas_units": "1",
"storage_fee_octas": "0",
"storage_fee_refund_octas": "0",
"total_charge_gas_units": "4"
}
}
],
"sender": "0x5f09bb76b55ad9f0c680eb42912565bbea6825d873f1403d1d3eddbbeb1e6ed8",
"sequence_number": "454",
"max_gas_amount": "10",
"gas_unit_price": "100",
"expiration_timestamp_secs": "1735290296",
"payload": {
"type": "entry_function_payload",
"function": "0x8afb046f44dd0cb9c445458f9c2e424759cd11f4a270fe6739dcffc16a4db8e::slime_revolution_game::slime_revolution_spin",
"type_arguments": [],
"arguments": []
},
"signature": {
"public_key": "0x1f2d3845bfd979ce4209a27f7c02a25927417cf9737e4fbff750b9e5888ae4f0",
"signature": "0xd6fcdc6d64f3663e39a44cf316f0269fbf690f8e77a1e2d5c3a94c4961c169bc18a99b7be753e645799420d631c8ff27884a2523fc2344f5005a6a6e0cfbbd0d",
"type": "ed25519_signature"
}
}
]
},
"createdAt": "2024-12-27T09:11:20.200452151Z"
}