find transactions which spend from the address
This commit is contained in:
parent
d5801c9172
commit
ac774ba9e8
|
@ -5,6 +5,7 @@ var inherits = require('util').inherits;
|
|||
var async = require('async');
|
||||
var chainlib = require('chainlib');
|
||||
var log = chainlib.log;
|
||||
var levelup = chainlib.deps.levelup;
|
||||
var errors = chainlib.errors;
|
||||
var bitcore = require('bitcore');
|
||||
var $ = bitcore.util.preconditions;
|
||||
|
@ -23,7 +24,8 @@ var AddressModule = function(options) {
|
|||
inherits(AddressModule, BaseModule);
|
||||
|
||||
AddressModule.PREFIXES = {
|
||||
OUTPUTS: 'outs'
|
||||
OUTPUTS: 'outs',
|
||||
SPENTS: 'sp'
|
||||
};
|
||||
|
||||
AddressModule.prototype.getAPIMethods = function() {
|
||||
|
@ -117,6 +119,13 @@ AddressModule.prototype.blockHandler = function(block, addOutput, callback) {
|
|||
continue;
|
||||
}
|
||||
|
||||
for(var j = 0; j < inputs.length; j++) {
|
||||
operations.push({
|
||||
type: action,
|
||||
key: [AddressModule.PREFIXES.SPENTS, inputs[j].prevTxId, inputs[j].outputIndex].join('-'),
|
||||
value: txid
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
setImmediate(function() {
|
||||
|
@ -282,55 +291,55 @@ AddressModule.prototype.isSpent = function(output, queryMempool, callback) {
|
|||
});
|
||||
};
|
||||
|
||||
AddressModule.prototype.getSpendTxForOutput = function(txid, outputIndex, queryMempool, callback) {
|
||||
var self = this;
|
||||
|
||||
var key = [AddressModule.PREFIXES.SPENTS, txid, outputIndex].join('-');
|
||||
this.db.store.get(key, function(err, spentTxId) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
self.db.getTransaction(spentTxId, queryMempool, callback);
|
||||
});
|
||||
};
|
||||
|
||||
AddressModule.prototype.getTransactionsForAddress = function(address, queryMempool, callback) {
|
||||
var self = this;
|
||||
|
||||
var txids = [];
|
||||
var key = [AddressModule.PREFIXES.OUTPUTS, address].join('-');
|
||||
|
||||
var stream = this.db.store.createReadStream({
|
||||
start: key,
|
||||
end: key + '~'
|
||||
});
|
||||
|
||||
stream.on('data', function(data) {
|
||||
var key = data.key.split('-');
|
||||
txids.push(key[3]);
|
||||
});
|
||||
|
||||
var error;
|
||||
|
||||
stream.on('error', function(streamError) {
|
||||
if (streamError) {
|
||||
error = streamError;
|
||||
}
|
||||
});
|
||||
|
||||
stream.on('close', function() {
|
||||
if (error) {
|
||||
return callback(error);
|
||||
this.getOutputs(address, queryMempool, function(err, outputs) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
async.map(
|
||||
txids,
|
||||
function(txid, next) {
|
||||
self.db.getTransaction(txid, next);
|
||||
var transactions = [];
|
||||
|
||||
async.eachSeries(
|
||||
outputs,
|
||||
function(output, next) {
|
||||
self.db.getTransaction(output.txid, queryMempool, function(err, tx) {
|
||||
if(err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
transactions.push(tx);
|
||||
|
||||
self.db.getSpendTxForOutput(output.txid, output.outputIndex, queryMempool, function(err, tx) {
|
||||
if(err instanceof levelup.errors.NotFoundError) {
|
||||
return next();
|
||||
} else if(err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
transactions.push(tx);
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
function(err, transactions) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if(queryMempool) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
callback(null, transactions);
|
||||
});
|
||||
function(err) {
|
||||
callback(err, transactions);
|
||||
});
|
||||
});
|
||||
|
||||
return stream;
|
||||
|
||||
};
|
||||
|
||||
module.exports = AddressModule;
|
Loading…
Reference in New Issue