diff --git a/transfers/index.js b/transfers/index.js index 84291936f829200740a3b78965da63a7e1d74446..661651ab3b5b5ffa987974d1a045f3b7284c842c 100644 --- a/transfers/index.js +++ b/transfers/index.js @@ -1,6 +1,11 @@ const { ApiPromise, WsProvider } = require('@polkadot/api'); require('dotenv').config(); +/** + * + * @param {number} ms miliseconds + * @returns + */ async function wait(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); @@ -9,7 +14,7 @@ async function wait(ms) { /** * Connect to xxNetwork Public Node thorugh a websocket - * @return {api} chain api + * @return {Promise} chain api */ async function connect() { const provider = new WsProvider(process.env.WS_CHAIN); @@ -20,11 +25,20 @@ async function connect() { return api; } +/** + * Check if node is in sync + * @param {Promise} api + * @returns {boolean} + */ async function checkSynching(api) { const health = await api.rpc.system.health(); return health.isSyncing.toHuman(); } +/** + * Get api of synchronized xxNetwork Public Node + * @returns {Promise} chain api + */ async function getAPI() { // Connect to the node const api = await connect(); @@ -39,6 +53,12 @@ async function getAPI() { } return api; } + +/** + * Get all transfers in the latest finalized block + * @param {Object} blockEvents list of events + * @returns {Object} list of transfers + */ function getTransfers(blockEvents) { const transfers = blockEvents .filter((record) => (record.event.section === 'balances' && record.event.method === 'Transfer')) @@ -50,37 +70,58 @@ function getTransfers(blockEvents) { return transfers; } -async function main() { - const api = await getAPI(); +/** + * Get receipt of successful transfer sent/received by a specified address + * @param {Promise} api chain api + * @param {string} address xx network address + * @param {boolean} sender true if address is the sender + * @returns {Promise} + */ +async function getReceipt(api, address, sender) { + console.log('Starting finalized blocks listener...'); + + return new Promise((reject, resolve) => { + api.rpc.chain.subscribeFinalizedHeads(async (header) => { + // Get block number + const blockNumber = header.number.toNumber(); + console.log(blockNumber); - const address = '1qnJN7FViy3HZaxZK9tGAA71zxHSBeUweirKqCaox4t8GT7'; + // Get block hash + const blockHash = await api.rpc.chain.getBlockHash(blockNumber); - // Subscribe to new blocks - console.log('Starting block listener...'); - const unsub = await api.rpc.chain.subscribeNewHeads(async (header) => { - // Get block number - const blockNumber = header.number.toNumber(); - console.log(blockNumber); + // Get block events + const blockEvents = await api.query.system.events.at(blockHash); + const transfers = getTransfers(blockEvents); + let transfer; + if (sender) { + transfer = transfers.filter((tx) => (tx.from === address)); + } else { + transfer = transfers.filter((tx) => (tx.to === address)); + } + if (transfer.length) { + console.log(`Found Transfer in block #${blockNumber} ${sender ? 'from' : 'to'} Address: `, transfer); + resolve(); + } + }); + }); +} - // Get block hash - const blockHash = await api.rpc.chain.getBlockHash(blockNumber); +/** + * Listen to all new finalized blocks after making sure node is in sync + * and get receipt of latest committed transfer sent/received by input address + */ +async function main() { + const api = await getAPI(); - // Get block events - const blockEvents = await api.query.system.events.at(blockHash); - const transfers = getTransfers(blockEvents); + // Insert address of which you want to get a receipt + const Alice = '6a6XHUGV5mu33rX1vn3iivxxUR4hwoUapsuECGyHpPzfaNtt'; + // const Bob = '6YXN1Q6Lx3u8tr2WVr5myb3zNa3pVG5FL3ku8uqckR5RoA21'; - const fromAddr = transfers.some((transfer) => (transfer.from === address)); - const toAddr = transfers.some((transfer) => (transfer.to === address)); - if (fromAddr) { - unsub(); - console.log('Found Transfer From Address: ', address); - } + // Define if that address is the sender or recipient of the transfer + const sender = true; - if (toAddr) { - unsub(); - console.log('Found Transfer To Address: ', address); - } - }); + // Subscribe to new finalized blocks + await getReceipt(api, Alice, sender); } main().catch((err) => console.error(err)).finally(() => process.exit());