Skip to content
Snippets Groups Projects
Commit 7f6198dd authored by Baltasar Aroso's avatar Baltasar Aroso
Browse files

Update

- feat: add promise on finalized blocks subscription
- docs: add JSDocs
parent 9f649a0a
No related branches found
No related tags found
1 merge request!1chain: get transfer receipt
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,14 +70,18 @@ function getTransfers(blockEvents) {
return transfers;
}
async function main() {
const api = await getAPI();
const address = '1qnJN7FViy3HZaxZK9tGAA71zxHSBeUweirKqCaox4t8GT7';
/**
* 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...');
// Subscribe to new blocks
console.log('Starting block listener...');
const unsub = await api.rpc.chain.subscribeNewHeads(async (header) => {
return new Promise((reject, resolve) => {
api.rpc.chain.subscribeFinalizedHeads(async (header) => {
// Get block number
const blockNumber = header.number.toNumber();
console.log(blockNumber);
......@@ -68,19 +92,36 @@ async function main() {
// Get block events
const blockEvents = await api.query.system.events.at(blockHash);
const transfers = getTransfers(blockEvents);
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);
let transfer;
if (sender) {
transfer = transfers.filter((tx) => (tx.from === address));
} else {
transfer = transfers.filter((tx) => (tx.to === address));
}
if (toAddr) {
unsub();
console.log('Found Transfer To Address: ', address);
if (transfer.length) {
console.log(`Found Transfer in block #${blockNumber} ${sender ? 'from' : 'to'} Address: `, transfer);
resolve();
}
});
});
}
/**
* 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();
// Insert address of which you want to get a receipt
const Alice = '6a6XHUGV5mu33rX1vn3iivxxUR4hwoUapsuECGyHpPzfaNtt';
// const Bob = '6YXN1Q6Lx3u8tr2WVr5myb3zNa3pVG5FL3ku8uqckR5RoA21';
// Define if that address is the sender or recipient of the transfer
const sender = true;
// Subscribe to new finalized blocks
await getReceipt(api, Alice, sender);
}
main().catch((err) => console.error(err)).finally(() => process.exit());
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment