UNPKG

balanceofsatoshis

Version:
114 lines (95 loc) 3.12 kB
const asyncAuto = require('async/auto'); const asyncRetry = require('async/retry'); const {returnResult} = require('asyncjs-util'); const {endpoints} = require('./blockstream'); const getRawTransaction = require('./get_raw_transaction'); const defaultInterval = n => 50 * Math.pow(2, n); const {isArray} = Array; const isHash = n => !!n && /^[0-9A-F]{64}$/i.test(n); const isHex = n => !!n && !(n.length % 2) && /^[0-9A-F]*$/i.test(n); /** Get raw transaction hex { address: <Address String> [interval]: <Retry Interval Milliseconds Number> network: <Network Name String> request: <Request Function> [retries]: <Retries Count Number> tokens: <Tokens Number> } @returns via cbk or Promise { [transaction]: <Transaction Hex String> } */ module.exports = (args, cbk) => { return new Promise((resolve, reject) => { return asyncAuto({ // Check arguments validate: cbk => { if (!args.address) { return cbk([400, 'ExpectedAddressToGetUtxoFor']); } if (!args.network) { return cbk([400, 'ExpectedNetworkNameToGetUtxoForAddress']); } if (!endpoints[args.network]) { return cbk([400, 'UnsupportedNetworkToGetUtxoForAddress']); } if (!args.request) { return cbk([400, 'ExpectedRequestMethodToGetUtxoForAddress']); } if (!args.tokens) { return cbk([400, 'ExpectedTokensToGetUtxoForAddress']); } return cbk(); }, // Get the UTXO transaction id getTransactionId: ['validate', ({}, cbk) => { return asyncRetry({ interval: args.interval || defaultInterval, times: args.retries, }, cbk => { return args.request({ json: true, url: `${endpoints[args.network]}address/${args.address}/utxo`, }, (err, r, utxos) => { if (!!err) { return cbk([503, 'FailedToGetAddressUtxos', {err}]); } if (!isArray(utxos)) { return cbk([503, 'ExpectedArrayOfUtxosInAddressUtxosResponse']); } const [utxo] = utxos.filter(n => n.value === args.tokens); // Exit early when there is no UTXO for the address if (!utxo) { return cbk(); } if (!isHash(utxo.txid)) { return cbk([503, 'ExpectedTransactionIdInUtxoForAddress']); } return cbk(null, utxo.txid); }); }, cbk); }], // Get the raw transaction getTransaction: ['getTransactionId', ({getTransactionId}, cbk) => { // Exit early when there is no UTXO if (!getTransactionId) { return cbk(null, {}); } return getRawTransaction({ id: getTransactionId, interval: args.interval, network: args.network, request: args.request, retries: args.retries, }, cbk); }], }, returnResult({reject, resolve, of: 'getTransaction'}, cbk)); }); };