WebSocket Types

WebSocket은 실시간 양방향 통신을 지원하는 프로토콜 입니다. 이러한 프로토콜을 이용하여 Web3 Engine에서 지원하는 네트워크와 실시간 통신을 할 수 있습니다.

WebSocket으로 등록 가능한 이벤트 타입(eventType) 목록

루니버스 Web3 Engine에서는 아래 eventType들에 대해 Websocket을 생성할 수 있습니다.

eventTypedescription
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을 통해 이벤트가 전송됩니다.

KeyTypeRequiredDescriptionExample Value
addressesArray of Stringtrue이벤트를 모니터링 하고자 하는 주소들의 목록입니다.["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: 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 객체 필드는 아래와 같습니다.

KeyTypeRequiredDescriptionExample Value
addressesArray of Stringtrue트랜잭션 이벤트를 모니터링 하고자 하는 주소들의 목록입니다. 각 address가 from에 포함된 트랜잭션이 발생하는 경우 알림을 수신할 수 있습니다.["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: 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 객체 필드는 아래와 같습니다.

KeyTypeRequiredDescriptionExample Value
tokensArray of objecttrue전송 이벤트를 모니터링 하고자 하는 토큰 정보 객체
tokens[i].contractAddressStringtrue모니터링 하고자 하는 ERC20 또는 ERC721 토큰의 컨트랙트 주소"0xdac17f958d2ee523a2206206994597c13d831ec7"
tokens[i].tokenIdStringfalse해당 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 객체 필드는 아래와 같습니다.

KeyTypeRequiredDescriptionExample Value
addressStringtrue잔고 알림을 받고자 하는 대상 주소"0x1f9090aaE28b8a3dCeaDf281B0F12828e676c326"
belowThresholdBalanceStringtrue모니터링 하고자 하는 잔고의 임계값. 해당 임계값 밑으로 잔고가 떨어지는 경우, 알림을 받을 수 있습니다."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 객체 필드는 아래와 같습니다.

KeyTypeRequiredDescriptionExample Value
periodIntegertrue이벤트 알림을 받을 블록 주기 설정의 값. 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 객체 필드는 아래와 같습니다.

KeyTypeRequiredDescriptionExample Value
addressStringtrue토큰 전송 이벤트를 모니터링 하고자 하는 대상 주소0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d
blockListCallersArray of Stringtrue대상 주소로 토큰 전송이 발생하는 경우 알림을 받고자 하는 주소의 목록[0xd1eac1d485dac83bce93fe4d3d168d9eb7036cf6]

eventType값을 ALLOW_LIST_CALLER 로 설정하는 경우, 사용 가능한 condition 객체 필드는 아래와 같습니다.

KeyTypeRequiredDescriptionExample Value
addressStringtrue토큰 전송 이벤트를 모니터링 하고자 하는 대상 주소0x05de7185d0a89c40ef6a4b684296debfd2e7bd0d
allowListCallersArray of Stringtrue대상 주소로 토큰 전송이 발생하는 경우 알림을 받고자 하는 주소의 목록[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_CALLERALLOW_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"
  }
}