UNPKG

blocktrail-sdk

Version:

BlockTrail's Developer Friendly API binding for NodeJS

66 lines (56 loc) 1.98 kB
var _ = require('lodash'); var q = require('q'); var async = require('async'); /** * @param bitcoinDataClient * @param options * @constructor */ var UnspentOutputFinder = function(bitcoinDataClient, options) { this.defaultSettings = { logging: false, batchChunkSize: 200 }; this.settings = _.merge({}, this.defaultSettings, options); this.dataClient = bitcoinDataClient; }; /** * get unspent outputs for an array of addresses * * @param addresses an array of addresses to find unspent output for * @returns {q.Promise} resolves with an object (associative array) of unspent outputs for each address with a spendable balance */ UnspentOutputFinder.prototype.getUTXOs = function(addresses) { var self = this; var results = {}; var deferred = q.defer(); //do batch if the bitcoin service supports it... async.eachSeries(_.chunk(addresses, self.settings.batchChunkSize), function(addressBatch, done) { if (self.settings.logging) { console.log("checking batch of " + addressBatch.length + " addresses for UTXOs", addressBatch.join(",")); } //get the utxos for this address self.dataClient.getBatchUnspentOutputs(addressBatch).done(function(batchResults) { _.each(batchResults, function(utxos, address) { //add the found utxos to the final result if (utxos.length > 0) { results[address] = utxos; } }); //this iteration is complete done(); }, function(err) { done(err); }); }, function(err) { //callback if (err) { //perhaps we should also reject the promise, and stop everything? console.log("error encountered", err); } //resolve the promise deferred.resolve(results); }); return deferred.promise; }; module.exports = UnspentOutputFinder;