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 async = require('async');
|
||||||
var chainlib = require('chainlib');
|
var chainlib = require('chainlib');
|
||||||
var log = chainlib.log;
|
var log = chainlib.log;
|
||||||
|
var levelup = chainlib.deps.levelup;
|
||||||
var errors = chainlib.errors;
|
var errors = chainlib.errors;
|
||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
var $ = bitcore.util.preconditions;
|
var $ = bitcore.util.preconditions;
|
||||||
|
@ -23,7 +24,8 @@ var AddressModule = function(options) {
|
||||||
inherits(AddressModule, BaseModule);
|
inherits(AddressModule, BaseModule);
|
||||||
|
|
||||||
AddressModule.PREFIXES = {
|
AddressModule.PREFIXES = {
|
||||||
OUTPUTS: 'outs'
|
OUTPUTS: 'outs',
|
||||||
|
SPENTS: 'sp'
|
||||||
};
|
};
|
||||||
|
|
||||||
AddressModule.prototype.getAPIMethods = function() {
|
AddressModule.prototype.getAPIMethods = function() {
|
||||||
|
@ -117,6 +119,13 @@ AddressModule.prototype.blockHandler = function(block, addOutput, callback) {
|
||||||
continue;
|
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() {
|
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) {
|
AddressModule.prototype.getTransactionsForAddress = function(address, queryMempool, callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var txids = [];
|
this.getOutputs(address, queryMempool, function(err, outputs) {
|
||||||
var key = [AddressModule.PREFIXES.OUTPUTS, address].join('-');
|
if(err) {
|
||||||
|
return callback(err);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async.map(
|
var transactions = [];
|
||||||
txids,
|
|
||||||
function(txid, next) {
|
async.eachSeries(
|
||||||
self.db.getTransaction(txid, next);
|
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) {
|
function(err) {
|
||||||
if(err) {
|
callback(err, transactions);
|
||||||
return callback(err);
|
});
|
||||||
}
|
|
||||||
|
|
||||||
if(queryMempool) {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
callback(null, transactions);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return stream;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = AddressModule;
|
module.exports = AddressModule;
|
Loading…
Reference in New Issue