WebSocket은 실시간 양방향 통신을 지원하는 프로토콜 입니다. 이러한 프로토콜을 이용하여 Web3 Engine에서 지원하는 네트워크와 실시간 통신을 할 수 있습니다.
WebSocket으로 등록 가능한 이벤트 타입(eventType) 목록
루니버스 Web3 Engine에서는 아래 eventType
들에 대해 Websocket을 생성할 수 있습니다.
eventType | description |
---|---|
ADDRESS_ACTIVITY | 특정 주소가 from 또는 to에 포함된 트랜잭션에 대한 trace 변경사항 및 트랜잭션 발생을 알림으로 받을 수 있습니다. |
MINED_TRANSACTION | 특정 주소가 from 또는 to에 포함된 트랜잭션이 최종 채굴 완료되었을 때 트랜잭션 receipt 정보를 알림으로 받을 수 있습니다. |
SUCCESSFUL_TRANSACTION | 특정 주소가 from 또는 to에 포함된 트랜잭션의 상태가 성공적으로 처리되었을 때(receipt상 상태 코드가 0x1인 경우)알림을 받을 수 있습니다. |
FAILED_TRANSACTION | 특정 주소가 from 또는 to에 포함된 트랜잭션이 정상적으로 처리되지 못한 경우(receipt상 상태 코드가 0x0인 경우)알림을 받을 수 있습니다. |
TOKEN_TRANSFER | 특정 ERC20 또는 ERC721 토큰의 Transfer 이벤트가 발생한 경우 알림을 받을 수 있습니다. 컨트랙트 주소를 지정할 수 있으며, ERC721 특정 토큰 ID로 조건을 설정할 수 있습니다. |
BELOW_THRESHOLD_BALANCE | 지정한 계정의 잔고가 설정한 수치 이하로 떨어지면 알림을 받을 수 있습니다. |
BLOCK_PERIOD | 네트워크 블록 생성 주기에 따라 알림을 받을 수 있습니다. 주기 값에 따라 매 블록 또는 N개의 블록 생성시마다 알림을 받도록 설정할 수 있습니다. |
NEW_HEADS | 새로운 블록이 Head로 지정될 때마다 알림을 받습니다. BLOCK_PERIOD를 사용하는 경우 Confirmation이 완료된 블록에 대한 이벤트를 받을 수 있는 반면, NEW_HEADS를 사용하는 경우 해당 Head에 대한 Confirmation 상태를 보장하지 않기 때문에 여전히 체인의 재구성 가능성이 있다는 점이 다릅니다. |
BLOCK_LIST_CALLER | 대상 주소와 여러 Blocklist 계정 주소를 등록한 뒤, 해당 Blocklist주소들로부터 대상 주소로 Native Token 또는 ERC20 토큰이 전송되었을 때 알림을 받을 수 있습니다. |
ALLOW_LIST_CALLER | 대상 주소와 여러 Allowlist 계정 주소를 등록한 뒤, 해당 Allowlist주소들로부터 대상 주소로 Native Token 또는 ERC20 토큰이 전송되었을 때 알림을 받을 수 있습니다. |
LOG | 지정한 스마트 컨트랙트에서 특정 Topic에 해당하는 이벤트 LOG가 발생하는 경우 알림을 받을 수 있습니다. |
이벤트를 구독하기 위해서는 Luniverse에서 제공하는 Web3 Multichain Node를 이용하여 블록체인 네트워크와 WebSocket 연결이 선행되어야 하며 이벤트 타입(Event Type)을 이용해 해당 이벤트를 구독을 해야 데이터를 전달 받을 수 있습니다. 블록체인 네트워크와 WebSocket을 연결하는 예시 코드는 다음과 같습니다.
import io from "socket.io-client";
const messageId = "{You can set the messageId}";
const url = "https://web3.luniverse.io/v1/websocket";
const options = {
rejectUnauthorized: false,
transports: ["websocket", "polling"],
path: "/v1/websocket/",
auth: {
token:
"{Your Auth Token}",
},
query: {
nodeId: "{Your Node ID}",
},
};
function connectToServer() {
return new Promise((resolve, reject) => {
const socket = io(url, options);
socket.on("connect", () => {
socket.on("subscription_registered", (message) => {
console.log("registered" ,message);
});
socket.on("subscription_connected", (message) => {
console.log("subscription_connected", message);
socket.emit("subscription", messageId, eventName, JSON.stringify(eventParams));
});
socket.on("subscription_error", (message) => {
console.error(`subscription_error: ${message}`);
});
socket.on("subscription_event", (message) => {
console.log("subscription Event : ",message);
});
socket.on("disconnect", (message) => {
console.warn(`disconnect`, message);
});
resolve(socket);
});
socket.on("connect_error", (error) => {
console.error(`Socket connection error to : `, error);
reject(error);
});
});
}
connectToServer();
ADDRESS_ACTIVITY
eventType
값을 ADDRESS_ACTIVITY로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다. Value에 등록된 모든 주소들과 관련된 Trace 업데이트 항목 또는 트랜잭션이 발생하는 경우 WebSocket을 통해 이벤트가 전송됩니다.
Key | Type | Required | Description | Example Value |
---|---|---|---|---|
addresses | Array of String | true | 이벤트를 모니터링 하고자 하는 주소들의 목록입니다. | ["0x6887246668a3b87F54DeB3b94Ba47a6f63F32985", "0x56Eddb7aa87536c09CCc2793473599fD21A8b17F"] |
ADDRESS_ACTIVITY 호출 예제
호출 예시 코드에 이벤트를 호출할 수 있도록 parameter를 추가하며, socket.emit
메소드 역시 이벤트에 맞게 변경합니다.
const ADDRESS_ACTIVITY = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet address activity", (optional)
condition: {
addresses: ["0x6887246668a3b87F54DeB3b94Ba47a6f63F32985", "0x56Eddb7aa87536c09CCc2793473599fD21A8b17F"]
}
};
socket.emit('subscription', messageId, 'ADDRESS_ACTIVITY', JSON.stringify(ADDRESS_ACTIVITY));
이벤트 발생시 WebSocket을 통해 수신되는 이벤트
subscriptionId: 97142,
eventType: ADDRESS_ACTIVITY,
event: {
"targetAddress":"0x56eddb7aa87536c09ccc2793473599fd21a8b17f",
"message":{
"hash":"0x7822f668fd454a3476cb4d6af2da26c8d202f60952fc1c464a4fc67edbe4ff12",
"nonce":5213883,
"transaction_index":28,
"from_address":"0x56eddb7aa87536c09ccc2793473599fd21a8b17f",
"to_address":"0x429cd3f2e1c5a1434fdcde7908dad6d5740ef2e5",
"value":14664300000000000,
"gas":207128,
"gas_price":27847104261,
"input":"0x",
"block_timestamp":1690272047,
"block_number":17768787,
"block_hash":"0x1f5d44fc4c385f974995523583b75feaf9e439790e33c565effe271ab1452cf9",
"max_fee_per_gas":102000000000,
"max_priority_fee_per_gas":2000000000,
"transaction_type":2,
"receipt_cumulative_gas_used":3800109,
"receipt_gas_used":21000,
"receipt_contract_address":null,
"receipt_root":null,
"receipt_status":1,
"receipt_effective_gas_price":27847104261
}
}
MINED_TRANSACTION, SUCCESSFUL_TRANSACTION, FAILED_TRANSACTION
eventType
값을 TRANSACTION 관련 타입으로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
Key | Type | Required | Description | Example Value |
---|---|---|---|---|
addresses | Array of String | true | 트랜잭션 이벤트를 모니터링 하고자 하는 주소들의 목록입니다. 각 address가 from 또는 to에 포함된 트랜잭션이 발생하는 경우 알림을 수신할 수 있습니다. | ["0xc90d3Ac75D1D36dF0b0a229E73D8409FB7F3c4ab", "0x56Eddb7aa87536c09CCc2793473599fD21A8b17F"] |
MINED_TRANSACTION, SUCCESSFUL_TRANSACTION, FAILED_TRANSACTION 호출 예제
호출 예시 코드에 이벤트를 호출할 수 있도록 parameter를 추가하며, socket.emit
메소드 역시 이벤트에 맞게 변경합니다.
const MINED_TRANSACTION = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet mined transaction",
condition: {
addresses: ["0xc90d3Ac75D1D36dF0b0a229E73D8409FB7F3c4ab", "0x56Eddb7aa87536c09CCc2793473599fD21A8b17F"]
}
};
socket.emit('nova_subscription', messageId, "MINED_TRANSACTION", JSON.stringify(MINED_TRANSACTION));
const SUCCESSFUL_TRANSACTION = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet successful transaction",
condition: {
addresses: ["0xc90d3Ac75D1D36dF0b0a229E73D8409FB7F3c4ab", "0x56Eddb7aa87536c09CCc2793473599fD21A8b17F"]
}
};
socket.emit('nova_subscription', messageId, "SUCCESSFUL_TRANSACTION", JSON.stringify(SUCCESSFUL_TRANSACTION););
const FAILED_TRANSACTION = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet failed transaction",
condition: {
addresses: ["0xc90d3Ac75D1D36dF0b0a229E73D8409FB7F3c4ab", "0x56Eddb7aa87536c09CCc2793473599fD21A8b17F"]
}
};
socket.emit('nova_subscription', messageId, "FAILED_TRANSACTION", JSON.stringify(FAILED_TRANSACTION));
이벤트 발생시 WebSocket을 통해 수신되는 이벤트
TRANSACTION 타입 이벤트 발생시 transaction receipt를 알림의 event.message 필드로 수신할 수 있습니다. 각 eventType에 정의된 조건에 맞는 트랜잭션들만 필터링 되어 전달됩니다.
subscriptionId: 97143,
eventType: SUCCESSFUL_TRANSACTION,
event: {
"targetAddress":"0x56eddb7aa87536c09ccc2793473599fd21a8b17f",
"message":{
"hash":"0x378f31c8096194202b65b600966657529f376788aea36bff47e521ccba16648b",
"nonce":5213999,
"transaction_index":64,
"from_address":"0x56eddb7aa87536c09ccc2793473599fd21a8b17f",
"to_address":"0xf11d95521a71b87e3e7dca739237385427757ae8",
"value":23375700000000000,
"gas":207128,
"gas_price":26693061304,
"input":"0x",
"block_timestamp":1690273823,
"block_number":17768933,
"block_hash":"0x7aaa9c47c7c91277b786920b00e5fec2e4bff41ba64ad1fe29e4159afc68f629",
"max_fee_per_gas":102000000000,
"max_priority_fee_per_gas":2000000000,
"transaction_type":2,
"receipt_cumulative_gas_used":4607183,
"receipt_gas_used":21000,
"receipt_contract_address":null,
"receipt_root":null,
"receipt_status":1,
"receipt_effective_gas_price":26693061304
}
}
TOKEN_TRANSFER
eventType
값을 TOKEN_TRANSFER 로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
Key | Type | Required | Description | Example Value |
---|---|---|---|---|
tokens | Array of object | true | 전송 이벤트를 모니터링 하고자 하는 토큰 정보 객체 | |
tokens[i].contractAddress | String | true | 모니터링 하고자 하는 ERC20 또는 ERC721 토큰의 컨트랙트 주소 | "0xdac17f958d2ee523a2206206994597c13d831ec7" |
tokens[i].tokenId | String | false | 해당 ERC721 컨트랙트의 특정 토큰에 대한 전송 이벤트만 모니터링 하고자 하는 경우 토큰 ID를 지정하기 위한 필드 | "153" |
TOKEN_TRANSFER 호출 예제
호출 예시 코드에 이벤트를 호출할 수 있도록 parameter를 추가하며, socket.emit
메소드 역시 이벤트에 맞게 변경합니다.
const TOKEN_TRANSFER = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet token transfer", (optional)
condition: {
tokens: [
{
contractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7"
}
]
}
};
socket.emit('nova_subscription', messageId, "TOKEN_TRANSFER", JSON.stringify(TOKEN_TRANSFER));
const TOKEN_TRANSFER = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet token transfer", (optional)
condition: {
tokens: [
{
contractAddress: "0xca21d4228cdcc68d4e23807e5e370c07577dd152",
tokenId : 2074 (optional)
}
]
}
};
socket.emit('nova_subscription', messageId, "TOKEN_TRANSFER", JSON.stringify(TOKEN_TRANSFER));
이벤트 발생시 Webhook Url로 호출되는 requestBody 예제
TOKEN_TRANSFER 타입의 WebSocket을 연결한 후, 지정한 토큰 컨트랙트 또는 특정 토큰의 전송 이벤트가 발생하는 경우 아래와 같은 전송 이벤트 정보가 전송됩니다. ERC-20 이벤트의 경우 event.message.value가 전송 수량을 의미하며, ERC-721 이벤트의 경우 event.message.value가 전송된 토큰의 ID를 의미합니다.
subscriptionId: 97145,
eventType: TOKEN_TRANSFER,
event: {
"targetAddress":"0xdac17f958d2ee523a2206206994597c13d831ec7",
"message":{
"token_address":"0xdac17f958d2ee523a2206206994597c13d831ec7",
"from_address":"0xfcb9c208df559e9583407ffec9243ab7f5b0d727",
"to_address":"0x74de5d4fcbf63e00296fd95d33236b9794016631",
"value":3000000000,
"transaction_hash":"0x04a78def033122edab0417a229d9511977122bbf8194a9b11480937459f723cf",
"log_index":9,
"block_number":17768959,
"block_timestamp":1690274135,
"block_hash":"0xfaf3cc49a9fd3e30b26d36ab171ac0fb138f11e2b34d706260ab622a921ce524"
}
}
subscriptionId: 89138,
eventType: TOKEN_TRANSFER,
event: {
targetAddress: "0xca21d4228cdcc68d4e23807e5e370c07577dd152"
message: {
token_address: "0xca21d4228cdcc68d4e23807e5e370c07577dd152",
from_address: "0xd1eac1d485dac83bce93fe4d3d168d9eb7036cf6",
to_address: "0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d",
value: 2074,
transaction_hash: "0xe3ab2f8b362c6884658f5415ac0c1ee9ddfd95ab7ae85abf4a69c1fa11fde1fe",
log_index: 246,
block_number: 17774042,
block_timestamp: 1690335683,
block_hash: "0x264cc33d3a5967d5a251f49a8e0d4c58b133411e30d8d2a5d516575fb5dcfa90"
}
}
BELOW_THRESHOLD_BALANCE
eventType
값을 BELOW_THRESHOLD_BALANCE 로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
Key | Type | Required | Description | Example Value |
---|---|---|---|---|
address | String | true | 잔고 알림을 받고자 하는 대상 주소 | "0x1f9090aaE28b8a3dCeaDf281B0F12828e676c326" |
belowThresholdBalance | String | true | 모니터링 하고자 하는 잔고의 임계값. 해당 임계값 밑으로 잔고가 떨어지는 경우, 알림을 받을 수 있습니다. | "2200000000000000000" |
BELOW_THRESHOLD_BALANCE 호출 예제
호출 예시 코드에 이벤트를 호출할 수 있도록 parameter를 추가하며, socket.emit
메소드 역시 이벤트에 맞게 변경합니다.
const BELOW_THRESHOLD_BALANCE = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet below threshold balance", (optional)
condition: {
address: "0x1f9090aaE28b8a3dCeaDf281B0F12828e676c326",
belowThresholdBalance: "2200000000000000000"
}
};
socket.emit('nova_subscription', messageId, "BELOW_THRESHOLD_BALANCE", JSON.stringify(BELOW_THRESHOLD_BALANCE));
이벤트 발생시 WebSocket을 통해 수신되는 이벤트
BELOW_THRESHOLD_BALANCE 타입의 해당 계정의 잔고가 설정한 Threshold 이하로 내려가면, 아래와 같은 정보가 WebSocket을 통해 전송됩니다.
subscriptionId: 97152,
eventType: BELOW_THRESHOLD_BALANCE,
event: {
"message":{
"type":"belowThresholdBalance",
"address":"0x1f9090aaE28b8a3dCeaDf281B0F12828e676c326",
"threshold":"2200000000000000000",
"balance":"2161702434259183973"
}
}
BLOCK_PERIOD, NEW_HEADS
eventType
값을 BLOCK_PERIOD 또는 NEW_HEADS 로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
Key | Type | Required | Description | Example Value |
---|---|---|---|---|
period | Integer | true | 이벤트 알림을 받을 블록 주기 설정의 값. 1로 설정하는 경우 매 블록이 생성될 때마다 알림을 받을 수 있습니다. | 3 |
BLOCK_PERIOD, NEW_HEADS 호출 예제
호출 예시 코드에 이벤트를 호출할 수 있도록 parameter를 추가하며, socket.emit
메소드 역시 이벤트에 맞게 변경합니다.
const BLOCK_PERIOD = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet block period 2", (optional)
condition: {
period: 2
}
};
socket.emit('nova_subscription', messageId, "BLOCK_PERIOD", JSON.stringify(BLOCK_PERIOD));
const NEW_HEADS = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet new heads", (optional)
};
socket.emit('nova_subscription', messageId, "NEW_HEADS", JSON.stringify(NEW_HEADS));
이벤트 발생시 WebSocket을 통해 수신되는 이벤트
WebSocket 생성 후 설정한 주기만큼의 블록이 Confirm 또는 전파되면, 아래와 같은 데이터가 전달됩니다.
subscriptionId: 97153,
eventType: BLOCK_PERIOD,
event: {
"period":1,
"message":{
"number":17769057,
"hash":"0xb71556dae56d9795decd81b32963a031b0d67c109fe3f7406f93e6555de98093",
"parent_hash":"0x821e24625de9f3c7ff891c9d15ec365698f3708c1478da0ae390f94aac0d92e0",
"nonce":"0x0000000000000000",
"sha3_uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"logs_bloom":"0x67619f09efab5e981788e3faeac43e36547369f8eaecfcff4ec98abe649705c76098b35d67508e9146745f629b351b8dafe33207da7b6ddd97d4d990d37f7e7e6852f40c465fe978ff03f28b5b2c9afcfc1b3020b147cc3b8af4d445892c88d5f44880283f36ccad10455a9a6d311e1f7c1d2a34a8de2d8d325736dbb8aa022618ae83529aee2c11745bb46d86aacc97541f35c1a9a2cbcd5f24086693b3f8359be2c5c2dea0a22caebf98fe1b769d809ef3c977e965f3aab7740f7f38b00975fc182cfb6b10cc8e08abaa663c7ff2cc7df196e89c7c26354559b606e8f77666cd30f75113f438f87e9524daf860bb95b564bb94bd7dcd59e689fd552143f448",
"transactions_root":"0xb2f739a0718509e8269b90aea0ad97d23936c0d64ad2a591c8a75c3ddcc3c56c",
"state_root":"0xf83a1ae9ebf59d1c8e343115cadc5b3141e1867b95e08eb81ec6cb1d119bc23b",
"receipts_root":"0xf36c1617d6e7e7aab433a81af0e043982eaa4b04587686234915505e548045b0",
"miner":"0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5",
"difficulty":0,
"total_difficulty":5.875000371659836e+22,
"size":351785,
"extra_data":"0x6265617665726275696c642e6f7267",
"gas_limit":30000000,
"gas_used":21897045,
"timestamp":1690275335,
"transaction_count":163,
"base_fee_per_gas":22582493679
}
}
subscriptionId: 97154,
eventType: NEW_HEADS,
event: {
"message":{
"number":17769068,
"hash":"0x3cf34f2b6c6ec58e3c75cfb77089d693ed6775a3429aa8c1d1ec5ac3bd5ba450",
"parent_hash":"0xa861b4888160a13067faa6868d147aac2d1ea0248d2d97177a58c29d4307b909",
"nonce":"0x0000000000000000",
"sha3_uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"logs_bloom":"0x1060109821219a009008d6699028ca772031490c68cc453823c94380028410b068321100040100002c151b2169a061d526921911880bbcf0ab81a430022501645910c018c9dc01442943662b52a180261801080b01c42c212020844c882d03401a059024033283292642510001203c072218ae508092074247401f13000828d6ca8a2094b2e88084214594900202082490500483a7022c2c31a8415c01b8080517e9016a32247ac08f8005c1705781c0100300402429431026c0204c1288005b212004920a17415a0801048306c580051dd8297084b8885c2635a80fc945601408b0e9985b202092a6120486b1b1068081671176752400c2100ad6512a019488",
"transactions_root":"0x8386b5b9afc67dcf69e4f8267151fa912cd09a5c9d0a2a248972d9f37cb218d0",
"state_root":"0x4710a61a2fbc2f6cd3961be1b59b3615573c5641215adb73f62670c45e349239",
"receipts_root":"0x5c7089ed9d45d8a498467ddda7480f4f053630ca12cb3a688104e3bb7d5b5c58",
"miner":"0xdafea492d9c6733ae3d56b7ed1adb60692c98bc5",
"difficulty":0,
"total_difficulty":5.875000371659836e+22,
"size":161768,
"extra_data":"0x496c6c756d696e61746520446d6f63726174697a6520447374726962757465",
"gas_limit":30000000,
"gas_used":9853254,
"timestamp":1690275467,
"transaction_count":124,
"base_fee_per_gas":27692772091
}
}
BLOCK_LIST_CALLER, ALLOW_LIST_CALLER
eventType
값을 BLOCK_LIST_CALLER 로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
Key | Type | Required | Description | Example Value |
---|---|---|---|---|
address | String | true | 토큰 전송 이벤트를 모니터링 하고자 하는 대상 주소 | 0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d |
blockListCallers | Array of String | true | 대상 주소로 토큰 전송이 발생하는 경우 알림을 받고자 하는 주소의 목록 | [0xd1eac1d485dac83bce93fe4d3d168d9eb7036cf6] |
eventType
값을 ALLOW_LIST_CALLER 로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
Key | Type | Required | Description | Example Value |
---|---|---|---|---|
address | String | true | 토큰 전송 이벤트를 모니터링 하고자 하는 대상 주소 | 0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d |
allowListCallers | Array of String | true | 대상 주소로 토큰 전송이 발생하는 경우 알림을 받고자 하는 주소의 목록 | [0xd1eac1d485dac83bce93fe4d3d168d9eb7036cf6] |
BLOCK_LIST_CALLER, ALLOW_LIST_CALLER 호출 예제
호출 예시 코드에 이벤트를 호출할 수 있도록 parameter를 추가하며, socket.emit
메소드 역시 이벤트에 맞게 변경합니다.
const BLOCK_LIST_CALLER = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet block list caller", (optional)
condition: {
address: "0x7d03C4d82b562993A4e12c26cBBd32f499c37F9B",
blockListCallers: ["0x7d03C4d82b562993A4e12c26cBBd32f499c37F9B", "0xADa221F5498F573583228B5Ad1e987cFF48Bd4cC"]
}
};
socket.emit('nova_subscription', messageId, "BLOCK_LIST_CALLER", JSON.stringify(BLOCK_LIST_CALLER));
const ALLOW_LIST_CALLER = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet allow list caller", (optional)
condition: {
address: "0x7d03C4d82b562993A4e12c26cBBd32f499c37F9B",
allowListCallers: ["0x7d03C4d82b562993A4e12c26cBBd32f499c37F9B", "0xADa221F5498F573583228B5Ad1e987cFF48Bd4cC"]
}
};
socket.emit('nova_subscription', messageId, "ALLOW_LIST_CALLER", JSON.stringify(ALLOW_LIST_CALLER));
이벤트 발생시 WebSocket을 통해 수신되는 이벤트
BLOCK_LIST_CALLER
와 ALLOW_LIST_CALLER
는 같은 포맷의 이벤트를 수신 받습니다. 또한 트랜잭션의 종류에 따라 Token Transfer, Transaction, Trace 3가지 타입 중 하나의 형태로 이벤트를 수신 받습니다.
subscriptionId: 89139,
eventType: BLOCK_LIST_CALLER,
event: {
targetAddress: "0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d",
blockListCaller: "0xd1eac1d485dac83bce93fe4d3d168d9eb7036cf6",
message: {
token_address: "0xca21d4228cdcc68d4e23807e5e370c07577dd152",
from_address: "0xd1eac1d485dac83bce93fe4d3d168d9eb7036cf6",
to_address: "0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d",
value: 2074,
transaction_hash: "0xe3ab2f8b362c6884658f5415ac0c1ee9ddfd95ab7ae85abf4a69c1fa11fde1fe",
log_index: 246,
block_number: 17774042,
block_timestamp: 1690335683,
block_hash: "0x264cc33d3a5967d5a251f49a8e0d4c58b133411e30d8d2a5d516575fb5dcfa90"
}
subscriptionId: 89139,
eventType: BLOCK_LIST_CALLER,
event: {
targetAddress: "0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d",
blockListCaller: "0xd1eac1d485dac83bce93fe4d3d168d9eb7036cf6",
message: {
"hash": "0xc654b70f4df3dbc913896fe8a383beb85a5f0453aba4dccefcb08cf85165e9e8",
"nonce": 796,
"transaction_index": 34,
"from_address": "0xd1eac1d485dac83bce93fe4d3d168d9eb7036cf6",
"to_address": "0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d",
"value": 0,
"gas": 296876,
"gas_price": 25348846482,
"input": "0x791ac9470000000000000000000000000000000000000033ec999038306bcc3aeff40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000540b77dd0c32c16fa69b30c38f7f9891b06fa6a50000000000000000000000000000000000000000000000000000000064bf23da000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000cee7f1d22dba7844449e5a64373264d218506b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"block_timestamp": 1690248035,
"block_number": 17766797,
"block_hash": "0xdd87b0be0200ba3cfdb6f679932c7a0644faa7f41abb7832a222ae3c20da8f0b",
"max_fee_per_gas": 36523269723,
"max_priority_fee_per_gas": 3000000000,
"transaction_type": 2,
"receipt_cumulative_gas_used": 3548507,
"receipt_gas_used": 173029,
"receipt_contract_address": null,
"receipt_root": null,
"receipt_status": 1,
"receipt_effective_gas_price": 25348846482
}
subscriptionId: 89139,
eventType: BLOCK_LIST_CALLER,
event: {
targetAddress: "0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d",
blockListCaller: "0xd1eac1d485dac83bce93fe4d3d168d9eb7036cf6",
message: {
"transaction_index": 57,
"from_address": "0xd1eac1d485dac83bce93fe4d3d168d9eb7036cf6",
"to_address": "0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d",
"value": 0,
"input": "0x5578ceae00000000000000000000000000000000000000000000000000000000003137a700000000000000000000000000000000000000000000000000000000000000a002410c3a7150acb0e8f3af3e7f64115bc618e3738f78b6eb98ee85235a06f1f405ceb12af6f14ae0adbc4644e96b92c26858479c1e4b1613c5dfe3b2c7886a0b0800000000000011000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000e048f5fd9b1fdb070dc4d26542a2ba23447dcc6dc4d99a66593750a176bbe2df902ead416bfd60f82bc2be5ccd3456a59d5df3a7ea3acc9bee0d0d21fa51a3cec000000000000000000000000000000000000000000000000000000000001e20f0420d5bedae870d7925a4776623d28a8eac0169242ce1dc23ae1894329c27974017c0bc29d31e9a7d14671610a7626264ce9ce8e3ed066a4775adf9b123de9dd0000000000000000000000000000000000000000000000000000000000000007073314940630fd6dcda0d772d4c972c4e0a9946bef9dabf4ef84eda8ef542b82000000000000000000000000ae0ee0a63a2ce6baeeffe56e7714fb4efe48d419000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b7368aa1402fb1d7f5ce9dcee2dab84e86e048c000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"output": "0xe760a54f698baa6ec4e532cfd9991080dab5e12da82964806b471b584e7494ecb7afc768f82234dfbcd50d2e727b834bed083fffeee54d61b94d2fc75678c73e0641e78a93f886382c52996fc562ea5302e7e25ccc776b30a6a94b33121d08d0",
"trace_type": "call",
"call_type": "call",
"reward_type": null,
"gas": 10972992,
"gas_used": 28800,
"subtraces": 0,
"trace_address": [],
"error": null,
"status": 1,
"transaction_hash": "0x619a63947491071df6c1bc2179edfd19f3a7d7cd5843f1a8d25bfb59749f6d43",
"block_number": 17766513,
"trace_id": "call_0x619a63947491071df6c1bc2179edfd19f3a7d7cd5843f1a8d25bfb59749f6d43_",
"trace_index": 412,
"block_timestamp": 1690244591,
"block_hash": "0x754a39266824a1e27c8515ef732b987d7ddfc40cf0bd008206b981426599c42d"
}
}
LOG
eventType
값을 LOG로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
Key | Type | Required | Description | Example Value |
---|---|---|---|---|
address | String | true | 모니터링 대상 컨트랙트의 주소(CA) | "0x7d03C4d82b562993A4e12c26cBBd32f499c37F9B" |
topics | Array of String | true | 모니터링 하고자 하는 LOG의 토픽 목록 | [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x00000000000000000000000056178a0d5f301baf6cf3e1cd53d9863437345bf9", "0x00000000000000000000000060594a405d53811d3bc4766596efd80fd545a270"] |
LOG 호출 예제
호출 예시 코드에 이벤트를 호출할 수 있도록 parameter를 추가하며, socket.emit
메소드 역시 이벤트에 맞게 변경합니다.
const LOG = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet log", (optional)
condition: {
address: "0x7d03C4d82b562993A4e12c26cBBd32f499c37F9B",
topics: [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x00000000000000000000000056178a0d5f301baf6cf3e1cd53d9863437345bf9",
"0x00000000000000000000000060594a405d53811d3bc4766596efd80fd545a270"
]
}
};
socket.emit('nova_subscription', messageId, "LOG", JSON.stringify(LOG));
이벤트 발생시 WebSocket을 통해 수신되는 이벤트
WebSocket 생성 후 대상 스마트 컨트랙트에서 지정한 Event Topic Log가 발생하는 경우, 아래와 같은 이벤 메시지가 전달됩니다.
subscriptionId: 97165,
eventType: LOG,
event: {
"targetAddress":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"topics":[
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x00000000000000000000000010aa134028521cfd99ffb30971f19313ab1941b4",
"0x00000000000000000000000041d3d33156ae7c62c094aae2995003ae63f587b3"
],
"message":{
"log_index":387,
"transaction_hash":"0x9efd4e40a607b6a920f21011c696fba0a83fc392ec49bf339dfc86190653f9b0",
"transaction_index":132,
"address":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"data":"0x000000000000000000000000000000000000000000000000000000000194ccf6",
"topics":[
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x00000000000000000000000010aa134028521cfd99ffb30971f19313ab1941b4",
"0x00000000000000000000000041d3d33156ae7c62c094aae2995003ae63f587b3"
],
"block_number":17769153,
"block_timestamp":1690276499,
"block_hash":"0x971674503aadc8de04144ee6780555876632237c208dbb537adace43874e69b4"
}
}