WebSocket은 실시간 양방향 통신을 지원하는 프로토콜 입니다. 이러한 프로토콜을 이용하여 Web3 Engine에서 지원하는 네트워크와 실시간 통신을 할 수 있습니다.
WebSocket으로 등록 가능한 이벤트 타입(eventType) 목록
루니버스 Web3 Engine에서는 아래 eventType들에 대해 Websocket을 생성할 수 있습니다.
eventType | description |
|---|---|
| ADDRESS_ACTIVITY | 특정 주소가 from 또는 to에 포함된 트랜잭션에 대한 트랜잭션 발생을 알림으로 받을 수 있습니다. |
| MINED_TRANSACTION | 특정 주소가 from에 포함된 트랜잭션이 최종 채굴 완료되었을 때 트랜잭션 receipt 정보를 알림으로 받을 수 있습니다. |
| SUCCESSFUL_TRANSACTION | 특정 주소가 from에 포함된 트랜잭션의 상태가 성공적으로 처리되었을 때(receipt상 상태 코드가 0x1인 경우)알림을 받을 수 있습니다. |
| FAILED_TRANSACTION | 특정 주소가 from에 포함된 트랜잭션이 정상적으로 처리되지 못한 경우(receipt상 상태 코드가 0x0인 경우)알림을 받을 수 있습니다. |
| TOKEN_TRANSFER | 특정 ERC20, ERC721, 또는 ERC1155 토큰의 Transfer 이벤트가 발생한 경우 알림을 받을 수 있습니다. 컨트랙트 주소를 지정할 수 있으며, ERC721과 ERC1155 특정 토큰 ID로 조건을 설정할 수 있습니다. |
| BELOW_THRESHOLD_BALANCE | 지정한 계정의 잔고가 설정한 수치 이하로 떨어지면 알림을 받을 수 있습니다. |
| BLOCK_PERIOD | 네트워크 블록 생성 주기에 따라 알림을 받을 수 있습니다. 주기 값에 따라 매 블록 또는 N개의 블록 생성시마다 알림을 받도록 설정할 수 있습니다. |
| BLOCK_LIST_CALLER | 대상 주소와 여러 Blocklist 계정 주소를 등록한 뒤, 해당 Blocklist주소들로부터 대상 주소로 Native Token 또는 ERC20 토큰이 전송되었을 때 알림을 받을 수 있습니다. |
| ALLOW_LIST_CALLER | 대상 주소와 여러 Allowlist 계정 주소를 등록한 뒤, 해당 Allowlist주소들로부터 대상 주소로 Native Token 또는 ERC20 토큰이 전송되었을 때 알림을 받을 수 있습니다. |
이벤트를 구독하기 위해서는 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에 등록된 모든 주소들과 관련된 트랜잭션이 발생하는 경우 WebSocket을 통해 이벤트가 전송됩니다.
Key | Type | Required | Description | Example Value |
|---|---|---|---|---|
addresses | Array of String | true | 이벤트를 모니터링 하고자 하는 주소들의 목록입니다. | ["0x6887246668a3b87F54DeB3b94Ba47a6f63F32985", |
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: 598,
eventType: ADDRESS_ACTIVITY,
event: {
"targetAddress": "0x1f9090aae28b8a3dceadf281b0f12828e676c326",
"message": {
"block_hash": "0x2816f6a147da59f7bba72fcd0d838a74976da35bf3f9f1e21a65814b226b47d0",
"block_number": 18719274,
"block_timestamp": 1701768743,
"from_address": "0x1f9090aae28b8a3dceadf281b0f12828e676c326",
"gas": 21000,
"gas_price": 43712795672,
"hash": "0x5a5855e88aadf11655a819d9882a6398afcbdd06829464dfccb26514d03971d2",
"input": "0x",
"max_fee_per_gas": 43712795672,
"max_priority_fee_per_gas": 0,
"nonce": 405225,
"to_address": "0x51a1449b3b6d635eddec781cd47a99221712de97",
"transaction_index": 151,
"transaction_type": 2,
"value": "43562579849099986",
"access_list": [],
"receipt_contract_address": null,
"receipt_cumulative_gas_used": 13946807,
"receipt_effective_gas_price": 43712795672,
"receipt_gas_used": 21000,
"receipt_root": null,
"receipt_status": 1,
"type": "transaction"
}
}subscriptionId: 598,
eventType: ADDRESS_ACTIVITY,
event: {
"targetAddress": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"message": {
"token_address": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"from_address": "0x8571c129f335832f6bbc76d49414ad2b8371a422",
"to_address": "0x51c72848c68a965f66fa7a88855f9f7784502a7f",
"value": "760000000",
"transaction_hash": "0x5996253f3f46caeaeb74eaa8800d9926441c4abcd36286136e84a416f2bc01f4",
"log_index": 22,
"block_number": 18719274,
"block_timestamp": 1701768743,
"type": "erc20"
}
}subscriptionId: 611,
eventType: ADDRESS_ACTIVITY,
event: {
"targetAddress": "0x1e628554124e94d6070744e71e44d8d2f29fea26",
"message": {
"token_address": "0x524cab2ec69124574082676e6f654a18df49a048",
"from_address": "0x1e628554124e94d6070744e71e44d8d2f29fea26",
"to_address": "0x63a65fc3a6e3714e2a210b7fe17a9d743426da22",
"token_id": "21590",
"transaction_hash": "0xc859e0a639968a0d199744ccc6fadb975e2232ecdfc3d24a9442f75abd05da99",
"log_index": 182,
"block_number": 18719377,
"block_timestamp": 1701770003,
"type": "erc721"
}
}subscriptionId: 611,
eventType: ADDRESS_ACTIVITY,
event: {
"targetAddress": "0x25463fc130873403d89ecf8cbed656c81e9f2ca8",
"message": {
"token_address": "0xa4057dada9217a8e64ee7d469a5a7e7c40b7380f",
"from_address": "0x25463fc130873403d89ecf8cbed656c81e9f2ca8",
"to_address": "0x8df782df9cb1fe34259d8a5385025a548ae0a410",
"value": "1",
"token_id": "5242",
"operator": "0x25463fc130873403d89ecf8cbed656c81e9f2ca8",
"transaction_hash": "0x6cf8c58c83460e77a443ac1abd16d0082a3ee8df86e143df6108ef8498dd0805",
"log_index": 341,
"batch_index": 0,
"block_number": 18719376,
"block_timestamp": 1701769991,
"type": "erc1155"
}
}MINED_TRANSACTION, SUCCESSFUL_TRANSACTION, FAILED_TRANSACTION
eventType값을 TRANSACTION 관련 타입으로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
Key | Type | Required | Description | Example Value |
|---|---|---|---|---|
addresses | Array of String | true | 트랜잭션 이벤트를 모니터링 하고자 하는 주소들의 목록입니다. 각 address가 from에 포함된 트랜잭션이 발생하는 경우 알림을 수신할 수 있습니다. | ["0xc90d3Ac75D1D36dF0b0a229E73D8409FB7F3c4ab", |
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: 1330,
eventType: MINED_TRANSACTION,
event: {
"targetAddress": "0x6cc8dcbca746a6e4fdefb98e1d0df903b107fd21",
"message": {
"block_hash": "0xc9e83e78e8fefe563ac05b7dfd519dd5d63303bf2a45ac8090199c6e4d0c59d8",
"block_number": 18719336,
"block_timestamp": 1701769487,
"from_address": "0x6cc8dcbca746a6e4fdefb98e1d0df903b107fd21",
"gas": 21000,
"gas_price": 43087294713,
"hash": "0xfa0641a9f926b1683571ae79792e3fb96f7f1a025a4d32cda1a29d5e9262cf7a",
"input": "0x",
"max_fee_per_gas": 80977007910,
"max_priority_fee_per_gas": 31966350,
"nonce": 440171,
"receipt_contract_address": null,
"receipt_cumulative_gas_used": 5526322,
"receipt_effective_gas_price": 43087294713,
"receipt_gas_used": 21000,
"receipt_root": null,
"receipt_status": 1,
"to_address": "0x897e995089fc2f130bf7524f0f1f91cfd5c0d92b",
"transaction_index": 50,
"transaction_type": 2,
"value": "459000000000000000",
"access_list": [],
"type": "transaction"
}
}subscriptionId: 1331,
eventType: SUCCESSFUL_TRANSACTION,
event: {
"targetAddress": "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5",
"message": {
"block_hash": "0x92a04b832707279b60debe4c172ac90feaaee1214bb64d062eccf5d9ea2014b4",
"block_number": 18719359,
"block_timestamp": 1701769787,
"from_address": "0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5",
"gas": 32000,
"gas_price": 40283393198,
"hash": "0x295ca10c2eec158b89a25d74e9dc343f7022f79686246dfd7799a1ab8c5f79a4",
"input": "0x",
"max_fee_per_gas": 40283393198,
"max_priority_fee_per_gas": 0,
"nonce": 532262,
"receipt_contract_address": null,
"receipt_cumulative_gas_used": 16634651,
"receipt_effective_gas_price": 40283393198,
"receipt_gas_used": 27329,
"receipt_root": null,
"receipt_status": 1,
"to_address": "0x2bf916f8169ed2a77324d3e168284fc252ae4087",
"transaction_index": 236,
"transaction_type": 2,
"value": "83692928875488072",
"access_list": [],
"type": "transaction"
}
}subscriptionId: 1333,
eventType: FAILED_TRANSACTION,
event: {
"targetAddress": "0x35d9eaf84610375018076fbd52b57aa3ff996f3f",
"message": {
"block_hash": "0x460356023e10a83da8f8d8fdb43cdc6f87354c9a1339f8182908a56e9808d702",
"block_number": 18719376,
"block_timestamp": 1701769991,
"from_address": "0x35d9eaf84610375018076fbd52b57aa3ff996f3f",
"gas": 120708,
"gas_price": 41569914284,
"hash": "0xb28c3479a486eeb9118572933bfc3de256661612107cc0e1b61163874606bfec",
"input": "0x878f2e7f159ad1ed45d3c3fc1feba6daeb9bcf8808034edfa3a283100290a307e3366fc100000000000000000000000000000000000000000000000002ea11e32ad50000000000000000000000000000c6b0699b3dcc0ea1fa7164b3d6a14b9bb3bfec6e00000000000000000000000035d9eaf84610375018076fbd52b57aa3ff996f3f00000000000000000000000000000000000000000000000000000000656ef2e3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000410b72bdd76de00c24de611af4e77018084fd6ca91ab3300b5e47cd597f5febe014dc6b8a08b547c6fa5eede7d94b39cba3e8eff88b9ac5a2cfb2e2e9a8794a5b91c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f65726332305f66616365745f3030380000000000000000000000000000000000",
"max_fee_per_gas": 56598459803,
"max_priority_fee_per_gas": 100000000,
"nonce": 768,
"receipt_contract_address": null,
"receipt_cumulative_gas_used": 13384015,
"receipt_effective_gas_price": 41569914284,
"receipt_gas_used": 43410,
"receipt_root": null,
"receipt_status": 0,
"to_address": "0x19e037c1bc535013de1098c122f64987df7ca5c9",
"transaction_index": 165,
"transaction_type": 2,
"value": "210000000000000000",
"access_list": [],
"type": "transaction"
}
}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));const TOKEN_TRANSFER = {
protocol: "ETHEREUM",
network: "MAINNET",
description: "ethereum mainnet token transfer", // optional
condition: {
tokens: [
{
contractAddress: "0xc36cF0cFcb5d905B8B513860dB0CFE63F6Cf9F5c",
tokenId : "2198224090309262473973399964009222646005" // optional
}
]
}
};
socket.emit('nova_subscription', messageId, "TOKEN_TRANSFER", JSON.stringify(TOKEN_TRANSFER));이벤트 발생시 WebSocket Url로 호출되는 requestBody 예제
TOKEN_TRANSFER 타입의 WebSocket을 연결한 후, 지정한 토큰 컨트랙트 또는 특정 토큰의 전송 이벤트가 발생하는 경우 아래와 같은 전송 이벤트 정보가 전송됩니다. ERC-20 이벤트의 경우 event.message.value가 전송 수량을 의미하며, ERC-721 이벤트의 경우 event.message.value가 전송된 토큰의 ID를 의미합니다.
subscriptionId: 1336,
eventType: TOKEN_TRANSFER,
event: {
"targetAddress": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"message": {
"token_address": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"from_address": "0x55ad1ea698a825192818f9cb8265312b74a612b6",
"to_address": "0xef8801eaf234ff82801821ffe2d78d60a0237f97",
"value": "254000000",
"transaction_hash": "0x3181af59e2aba4db7c20a80a2129d01ef36e0446fb591d66e8fff4376def1e6d",
"log_index": 200,
"block_number": 18719407,
"block_timestamp": 1701770363,
"type": "erc20"
}
}subscriptionId: 1338,
eventType: TOKEN_TRANSFER,
event: {
"targetAddress": "0xd5b0f341cb6db2a8022e1e1c13dc4404870a510c",
"message": {
"token_address": "0xd5b0f341cb6db2a8022e1e1c13dc4404870a510c",
"from_address": "0x838cef1a172926e1cd499102c55206e22f1e3c73",
"to_address": "0xbddd3d86daa070c5e7b025ef36f5de42aabfb97e",
"token_id": "77299222084720975036271832319814097322069000024003047660664257529401",
"transaction_hash": "0x1c3df14996658010780f240c2cc5bb6612cf8212109ef68d298901d32d464253",
"log_index": 91,
"block_number": 18719427,
"block_timestamp": 1701770603,
"type": "erc721"
}
}subscriptionId: 1338,
eventType: TOKEN_TRANSFER,
event: {
"targetAddress": "0x6df55525e32a4f1784698f8937adcba645321693",
"message": {
"token_address": "0x6df55525e32a4f1784698f8937adcba645321693",
"from_address": "0x6c588d1ace0ab8fa709bdcf44073dc724c3fa161",
"to_address": "0xe4fdbbb89a3ce8e96b721fd56883926035aa4cee",
"value": "3",
"token_id": "53",
"operator": "0x1e0049783f008a0085193e00003d00cd54003c71",
"transaction_hash": "0xc983ae7df28292faf479711e9d5f7f7b8e78dd8a7aa44b19e7c3c54110c488c7",
"log_index": 148,
"batch_index": 0,
"block_number": 18719452,
"block_timestamp": 1701770903,
"type": "erc1155"
}
}BELOW_THRESHOLD_BALANCE
eventType값을 BELOW_THRESHOLD_BALANCE로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
| Key | Type | Required | Description | Example Value |
|---|---|---|---|---|
| address | String | true | 잔고 알림을 받고자 하는 대상 주소 | "0x1f9090aaE28b8a3dCeaDf281B0F12828e676c326" |
| belowThresholdBalance | String | true | 모니터링 하고자 하는 잔고의 임계값. 해당 임계값 밑으로 잔고가 떨어지는 경우, 알림을 받을 수 있습니다. | "2200000000000000000" |
알림의 주기는 어떻게 되나요?1분 마다 해당 주소의 잔고를 조회하며 입력한 THRESHOLD 보다 잔고가 낮을 경우, 알림을 전송합니다. 만약 조회 시점마다 실제 잔고가 belowThresholdBalance에 입력한 값보다 낮은 경우, 알림을 계속해서 받을 수 있습니다.
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: 618,
eventType: BELOW_THRESHOLD_BALANCE,
event: {
"message": {
"type": "belowThresholdBalance",
"address": "0xcDcaFE530d8D4d38cce8b58D5Fb9155efD3A7f07",
"threshold": "1000000000000000000000000",
"balance": "261369624991710963"
}
}BLOCK_PERIOD
eventType값을 BLOCK_PERIOD 로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.
| Key | Type | Required | Description | Example Value |
|---|---|---|---|---|
| period | Integer | true | 이벤트 알림을 받을 블록 주기 설정의 값. 1로 설정하는 경우 매 블록이 생성될 때마다 알림을 받을 수 있습니다. | 3 |
BLOCK_PERIOD 호출 예제
호출 예시 코드에 이벤트를 호출할 수 있도록 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));이벤트 발생시 WebSocket을 통해 수신되는 이벤트
WebSocket 생성 후 설정한 주기만큼의 블록이 Confirm 또는 전파되면, 아래와 같은 데이터가 전달됩니다.
subscriptionId: 1334,
eventType: BLOCK_PERIOD,
event: {
"period": 1,
"message": {
"parent_hash": "0x268a1bf979f59631934fe9144b2124738bba3eecaeee86d594b6c784450d70c0",
"sha3_uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"miner": "0x4675c7e5baafbffbca748158becba61ef3b0a263",
"state_root": "0x7e974e612cd6efb9a77fbf85293615dc8f217d90bbe1574c4fd27b41234d7098",
"transactions_root": "0x9d85b4fa268e4a1b8b02a468d7164820520c8992fb8f0b3453fee50ad17041b1",
"receipts_root": "0x89a0a4347ae178e3b39b17108f47f3e9b640fec16f9f69fc86ad58f56e2e2c95",
"logs_bloom": "0x52294181c48627e79b80312cbca258202f822827cad3111400bd8d3e006e533d4345a72c2104004462005bb5420195d60b5b3cce8cad6e0d72ac241c032e2420e940841a90a0ca0bb922c2aece78a0f0c9051eebd5e40ad9688114d896729274da225be292126830a65fd480a248fc5b377125f140439e884630855a4a7950592958865276030d60014909c1a562dc7640b65829ed11e5b97aa905d018937578aad08b8c9e88e05a5a1089f95e0a24020d11868893d9f08b442a28a65400336040129867180799db5174148220ec81dc00399637a5a8c0310a0007861ab024092078618a2853a4c604a454ac0da30b6004cc38a9038e1fc21a11880b41295747",
"difficulty": "0",
"gas_limit": 30000000,
"gas_used": 10450027,
"extra_data": "0x546974616e2028746974616e6275696c6465722e78797a29",
"mix_hash": "0x6a41b4f198bb8a91f60922d79003ca5fd2f3065c15fcb5ab69bb5a1bed631084",
"nonce": "0x0000000000000000",
"hash": "0xfa1574c11484c2da05d85ff9645b5e06f6e19b6e2cd5295702d24c257963e2bb",
"size": 101164,
"total_difficulty": "58750003716598352816469",
"transactions": [
"0xafad8fbd9d288086424e62de60be198020cb7331ced13381a237a73f512992a6",
"0x1babcac65b131140530cafc336954250595967901fb97d6c6b43c8a0cc18bde4",
// ...
],
"transaction_count": 142,
"log_count": 284,
"base_fee_per_gas": 41850710965,
"withdrawals_root": "0x266a1c7b8cefb74ed67bdd7fa8927ccb4bec53da098730cd023f53c6935d7ad3",
"withdrawal_count": 16,
"type": "block",
"number": 18719373,
"timestamp": 1701769955
}
}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(ERC-20, ERC-721, ERC-1155), Transaction 중 하나의 형태로 이벤트를 수신 받습니다.
subscriptionId: 89139,
eventType: "BLOCK_LIST_CALLER",
event: {
"targetAddress": "0x7bfdaa1abab52b635ae20c0047938f0d713919f4",
"blockListCaller": "0x75e89d5979e4f6fba9f97c104c2f0afb3f1dcb88",
"message": {
"block_hash": "0x29c8817d72fdf48ee36c10d04a738f2524c08754cf4569eb66528f5c19645b7b",
"block_number": 18719810,
"block_timestamp": 1701775271,
"from_address": "0x75e89d5979e4f6fba9f97c104c2f0afb3f1dcb88",
"gas": 50000,
"gas_price": 51890772206,
"hash": "0xa7b1749578f85abebf32354a70adc3b5992d6145ea6172f47b47dc39e0b5852e",
"input": "0x",
"max_fee_per_gas": null,
"max_priority_fee_per_gas": null,
"nonce": 4695660,
"to_address": "0x7bfdaa1abab52b635ae20c0047938f0d713919f4",
"transaction_index": 38,
"transaction_type": 0,
"value": "7000000000000000",
"access_list": null,
"receipt_contract_address": null,
"receipt_cumulative_gas_used": 3245467,
"receipt_effective_gas_price": 51890772206,
"receipt_gas_used": 21000,
"receipt_root": null,
"receipt_status": 1,
"type": "transaction"
}
}subscriptionId: 619,
eventType: BLOCK_LIST_CALLER,
event: {
"targetAddress": "0x762c6d4521a1f55744296f381cb5c9af117c24d1",
"blockListCaller": "0x8c8d7c46219d9205f056f28fee5950ad564d7465",
"message": {
"token_address": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"from_address": "0x8c8d7c46219d9205f056f28fee5950ad564d7465",
"to_address": "0x762c6d4521a1f55744296f381cb5c9af117c24d1",
"value": "123063143",
"transaction_hash": "0x26c3a13be5a95bb072e87891cd991af881647bf52a12304ede22d7953d15a222",
"log_index": 396,
"block_number": 18719771,
"block_timestamp": 1701774803,
"type": "erc20"
}
}subscriptionId: 621,
eventType: ALLOW_LIST_CALLER,
event: {
"targetAddress": "0xe5985ed2b594558d559f53929fd303fb50e4280b",
"allowListCaller": "0x3280c639fd18b32392b77f35748fa65e311799fa",
"message": {
"token_address": "0xfc8a98c22a9e32948ab028414d67c62c49b16864",
"from_address": "0x3280c639fd18b32392b77f35748fa65e311799fa",
"to_address": "0xe5985ed2b594558d559f53929fd303fb50e4280b",
"token_id": "5170",
"transaction_hash": "0x9b150e866fb7d84313f913d252cec94c1e1635b03fec1761e9609709ca18806f",
"log_index": 137,
"block_number": 18719794,
"block_timestamp": 1701775079,
"type": "erc721"
}
}subscriptionId: 621,
eventType: BLOCK_LIST_CALLER,
event: {
"targetAddress": "0x3bbcd028b9f2d5dc63613d1c03bef0545b2a66f2",
"blockListCaller": "0x9e028e7af4b75b2278a2d3c3edc4968aa5659628",
"message": {
"token_address": "0x7e6027a6a84fc1f6db6782c523efe62c923e46ff",
"from_address": "0x9e028e7af4b75b2278a2d3c3edc4968aa5659628",
"to_address": "0x3bbcd028b9f2d5dc63613d1c03bef0545b2a66f2",
"value": "1",
"token_id": "91682872942444978531341201407920637714267836843486631628720416080597286205713",
"operator": "0x1e0049783f008a0085193e00003d00cd54003c71",
"transaction_hash": "0x926f96d1047d3c4290d3b45631424bfa3538f4638ffd365449e62f303c30676d",
"log_index": 325,
"batch_index": 0,
"block_number": 18719798,
"block_timestamp": 1701775127,
"type": "erc1155"
}
}