Fixed tx api call.
This commit is contained in:
parent
e1305c7496
commit
4f46947516
@ -70,7 +70,6 @@ AddressService.prototype.getAddressHistory = function(addresses, options, callba
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
// TODO: these should already be ordered correctly, please check
|
||||
txList = utils.dedupByTxid(txList);
|
||||
txList = utils.orderByConfirmations(txList);
|
||||
|
||||
@ -130,6 +129,48 @@ AddressService.prototype.getAddressSummary = function(address, options, callback
|
||||
|
||||
};
|
||||
|
||||
AddressService.prototype._setOutputResults = function(tx, address, result) {
|
||||
|
||||
for(var j = 0; j < tx.outputs.length; j++) {
|
||||
|
||||
var output = tx.outputs[j];
|
||||
|
||||
if (utils.getAddress(output, this._network) !== address) {
|
||||
continue;
|
||||
}
|
||||
|
||||
result.txApperances++;
|
||||
result.totalReceivedSat += output.value;
|
||||
result.balanceSat += output.value;
|
||||
|
||||
if (tx.confirmations === 0) {
|
||||
result.unconfirmedTxApperances++;
|
||||
result.unconfirmedBalanceSat += output.value;
|
||||
}
|
||||
|
||||
}
|
||||
return result;
|
||||
|
||||
};
|
||||
|
||||
AddressService.prototype._setInputResults = function(tx, address, result) {
|
||||
for(var i = 0; i < tx.inputs.length; i++) {
|
||||
|
||||
var input = tx.inputs[i];
|
||||
if (utils.getAddress(input, this._network) !== address) {
|
||||
continue;
|
||||
}
|
||||
|
||||
result.totalSentSat += tx.__inputValues[i];
|
||||
result.balanceSat -= tx.__inputValues[i];
|
||||
|
||||
if (tx.confirmations === 0) {
|
||||
result.unconfirmedBalanceSat -= tx.__inputValues[i];
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
AddressService.prototype._getAddressSummaryResult = function(txs, address, result, options) {
|
||||
|
||||
var self = this;
|
||||
@ -138,40 +179,8 @@ AddressService.prototype._getAddressSummaryResult = function(txs, address, resul
|
||||
|
||||
var tx = txs[i];
|
||||
|
||||
for(var j = 0; j < tx.outputs.length; j++) {
|
||||
|
||||
var output = tx.outputs[j];
|
||||
|
||||
if (utils.getAddress(output, self._network) !== address) {
|
||||
continue;
|
||||
}
|
||||
|
||||
result.txApperances++;
|
||||
result.totalReceivedSat += output.value;
|
||||
result.balanceSat += output.value;
|
||||
|
||||
if (tx.confirmations === 0) {
|
||||
result.unconfirmedTxApperances++;
|
||||
result.unconfirmedBalanceSat += output.value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for(j = 0; j < tx.inputs.length; j++) {
|
||||
|
||||
var input = tx.inputs[j];
|
||||
if (utils.getAddress(input, self._network) !== address) {
|
||||
continue;
|
||||
}
|
||||
|
||||
result.totalSentSat += tx.__inputValues[j];
|
||||
result.balanceSat -= tx.__inputValues[j];
|
||||
|
||||
if (tx.confirmations === 0) {
|
||||
result.unconfirmedBalanceSat -= tx.__inputValues[j];
|
||||
}
|
||||
|
||||
}
|
||||
self._setOutputResults(tx, address, result);
|
||||
self._setInputResults(tx, address, result);
|
||||
|
||||
if (!options.noTxList) {
|
||||
if (!result.transactions) {
|
||||
@ -690,6 +699,9 @@ AddressService.prototype._processInput = function(tx, input, index, opts) {
|
||||
|
||||
AddressService.prototype._processOutput = function(tx, output, index, opts) {
|
||||
|
||||
// TODO: if the output is pay to public key, we are reporting this as p2pkh
|
||||
// this leads to the spending tx not being properly indexed. Txs that
|
||||
// spend p2pk outputs, will not have the public key as part of their input script sig
|
||||
var address = output.getAddress();
|
||||
|
||||
if(!address) {
|
||||
@ -759,33 +771,4 @@ AddressService.prototype._processTransaction = function(tx, opts) {
|
||||
|
||||
};
|
||||
|
||||
// TODO seems spendy
|
||||
AddressService.prototype._getInputInfoForAddress = function(address) {
|
||||
|
||||
var self = this;
|
||||
var inputs = [];
|
||||
var start = self._encoding.encodeAddressIndexKey(address);
|
||||
|
||||
var criteria = {
|
||||
gte: start,
|
||||
lt: Buffer.concat(start.slice(0, address.length + 4), new Buffer(new Array(address.length + 5).join('f'), 'hex'))
|
||||
};
|
||||
|
||||
// all the info about this address
|
||||
var stream = self._db.createKeyStream(criteria);
|
||||
|
||||
stream.on('data', function(data) {
|
||||
var info = self._encoding.decodeAddressIndexKey(data);
|
||||
//only returning
|
||||
if (info.input) {
|
||||
inputs.push(info);
|
||||
}
|
||||
});
|
||||
|
||||
stream.on('end', function() {
|
||||
return inputs;
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
module.exports = AddressService;
|
||||
|
||||
@ -422,9 +422,6 @@ HeaderService.prototype._onHeaders = function(headers) {
|
||||
|
||||
var self = this;
|
||||
|
||||
// TODO we could be reaching this because either our headers list is a multiple of 2000
|
||||
// or because our peer returned us an empty list because our checkpoint hash is not on
|
||||
// its mainchain.
|
||||
if (headers.length === 0) {
|
||||
self._onHeadersSave(function(err) {
|
||||
if (err) {
|
||||
@ -702,6 +699,7 @@ HeaderService.prototype._removeAllSubscriptions = function() {
|
||||
this._bus.removeAllListeners();
|
||||
};
|
||||
|
||||
// this should fire in edge cases where a new peer is not quite synced
|
||||
HeaderService.prototype._findReorgConditionInNewPeer = function(callback) {
|
||||
|
||||
var self = this;
|
||||
@ -709,7 +707,6 @@ HeaderService.prototype._findReorgConditionInNewPeer = function(callback) {
|
||||
var newPeerHeaders = new utils.SimpleMap();
|
||||
var headerCount = 0;
|
||||
|
||||
// TODO: these 2 list could be incredibly long lists and could cause a memory crash
|
||||
self.getAllHeaders(function(err, allHeaders) {
|
||||
|
||||
if (err) {
|
||||
|
||||
@ -54,7 +54,9 @@ MempoolService.prototype.start = function(callback) {
|
||||
MempoolService.prototype._flushMempool = function(callback) {
|
||||
var self = this;
|
||||
|
||||
log.warn('Mempool Service: flushing mempool, this could take a minute.');
|
||||
// TODO: just handle the txindex for now, later handle both txindex and addressindex
|
||||
// TODO: plan a migration system for upgrades to the indexes
|
||||
var ops = [];
|
||||
|
||||
var criteria = {
|
||||
@ -72,10 +74,11 @@ MempoolService.prototype._flushMempool = function(callback) {
|
||||
});
|
||||
|
||||
stream.on('end', function() {
|
||||
ops.batch(ops, function(err) {
|
||||
self._db.batch(ops, function(err) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
log.info('Mempool Service: completed flushing: ' + ops.length + ' mempool records.');
|
||||
callback();
|
||||
});
|
||||
});
|
||||
|
||||
@ -125,7 +125,6 @@ TransactionService.prototype.getTransaction = function(txid, options, callback)
|
||||
|
||||
async.waterfall([
|
||||
self._getTransaction.bind(self, txid, options),
|
||||
self._getSupplementaryTransactionInfo.bind(self),
|
||||
self._getMempoolTransaction.bind(self),
|
||||
self.setTxMetaInfo.bind(self)
|
||||
], function(err, tx) {
|
||||
@ -140,33 +139,6 @@ TransactionService.prototype.getTransaction = function(txid, options, callback)
|
||||
|
||||
};
|
||||
|
||||
TransactionService.prototype._getSupplementaryTransactionInfo = function(txid, tx, options, callback) {
|
||||
|
||||
if (!tx) {
|
||||
return callback(null, txid, tx, options);
|
||||
}
|
||||
|
||||
var self = this;
|
||||
tx.confirmations = self._block.getTip().height - tx.__height + 1;
|
||||
|
||||
// TODO maybe we should index the block hash along with the height on tx
|
||||
self._header.getBlockHeader(tx.__height, function(err, header) {
|
||||
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if (header) {
|
||||
// Do we need both of these?
|
||||
tx.blockhash = header.hash;
|
||||
tx.__blockhash = header.hash;
|
||||
}
|
||||
|
||||
callback(null, txid, tx, options);
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
TransactionService.prototype.setTxMetaInfo = function(tx, options, callback) {
|
||||
|
||||
var self = this;
|
||||
@ -292,6 +264,9 @@ TransactionService.prototype._getTransaction = function(txid, options, callback)
|
||||
}
|
||||
|
||||
tx = self._encoding.decodeTransactionValue(tx);
|
||||
tx.confirmations = self._block.getTip().height - tx.__height + 1;
|
||||
tx.blockhash = tx.__blockhash;
|
||||
|
||||
callback(null, txid, tx, options);
|
||||
|
||||
});
|
||||
@ -489,10 +464,6 @@ TransactionService.prototype._getSpentTxOperations = function(tx, callback) {
|
||||
|
||||
TransactionService.prototype._processTransaction = function(tx, opts, callback) {
|
||||
|
||||
// this index is very simple txid -> tx, but we also need to find each
|
||||
// input's prev output value, the adjusted timestamp for the block and
|
||||
// the tx's block height
|
||||
|
||||
var self = this;
|
||||
|
||||
self._getInputValues(tx, opts, function(err, inputValues) {
|
||||
@ -517,6 +488,7 @@ TransactionService.prototype._processTransaction = function(tx, opts, callback)
|
||||
|
||||
// block hash
|
||||
tx.__blockhash = opts.block.rhash();
|
||||
|
||||
var operations = [{
|
||||
key: self._encoding.encodeTransactionKey(tx.txid()),
|
||||
value: self._encoding.encodeTransactionValue(tx)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user