treat single address in output as change
This commit is contained in:
parent
d4ff5232df
commit
75c8e28e73
|
@ -2660,8 +2660,7 @@ WalletService.prototype.getTxHistory = function(opts, cb) {
|
|||
if (opts.limit > Defaults.HISTORY_LIMIT)
|
||||
return cb(Errors.HISTORY_LIMIT_EXCEEDED);
|
||||
|
||||
function decorate(txs, addresses, proposals, notes) {
|
||||
|
||||
function decorate(wallet, txs, addresses, proposals, notes) {
|
||||
var indexedAddresses = _.indexBy(addresses, 'address');
|
||||
var indexedProposals = _.indexBy(proposals, 'txid');
|
||||
var indexedNotes = _.indexBy(notes, 'txid');
|
||||
|
@ -2680,7 +2679,7 @@ WalletService.prototype.getTxHistory = function(opts, cb) {
|
|||
address: item.address,
|
||||
amount: item.amount,
|
||||
isMine: !!address,
|
||||
isChange: address ? address.isChange : false,
|
||||
isChange: address ? (address.isChange || wallet.singleAddress) : false,
|
||||
}
|
||||
});
|
||||
};
|
||||
|
@ -2858,55 +2857,59 @@ WalletService.prototype.getTxHistory = function(opts, cb) {
|
|||
});
|
||||
};
|
||||
|
||||
// Get addresses for this wallet
|
||||
self.storage.fetchAddresses(self.walletId, function(err, addresses) {
|
||||
self.getWallet({}, function(err, wallet) {
|
||||
if (err) return cb(err);
|
||||
if (addresses.length == 0) return cb(null, []);
|
||||
|
||||
var from = opts.skip || 0;
|
||||
var to = from + opts.limit;
|
||||
|
||||
|
||||
async.waterfall([
|
||||
|
||||
function(next) {
|
||||
getNormalizedTxs(addresses, from, to, next);
|
||||
},
|
||||
function(txs, next) {
|
||||
// Fetch all proposals in [t - 7 days, t + 1 day]
|
||||
var minTs = _.min(txs.items, 'time').time - 7 * 24 * 3600;
|
||||
var maxTs = _.max(txs.items, 'time').time + 1 * 24 * 3600;
|
||||
|
||||
async.parallel([
|
||||
|
||||
function(done) {
|
||||
self.storage.fetchTxs(self.walletId, {
|
||||
minTs: minTs,
|
||||
maxTs: maxTs
|
||||
}, done);
|
||||
},
|
||||
function(done) {
|
||||
self.storage.fetchTxNotes(self.walletId, {
|
||||
minTs: minTs
|
||||
}, done);
|
||||
},
|
||||
], function(err, res) {
|
||||
return next(err, {
|
||||
txs: txs,
|
||||
txps: res[0],
|
||||
notes: res[1]
|
||||
});
|
||||
});
|
||||
},
|
||||
], function(err, res) {
|
||||
// Get addresses for this wallet
|
||||
self.storage.fetchAddresses(self.walletId, function(err, addresses) {
|
||||
if (err) return cb(err);
|
||||
if (addresses.length == 0) return cb(null, []);
|
||||
|
||||
var finalTxs = decorate(res.txs.items, addresses, res.txps, res.notes);
|
||||
var from = opts.skip || 0;
|
||||
var to = from + opts.limit;
|
||||
|
||||
if (res.txs.fromCache)
|
||||
log.debug("History from cache for:", self.walletId, from, to);
|
||||
|
||||
return cb(null, finalTxs, !!res.txs.fromCache);
|
||||
async.waterfall([
|
||||
|
||||
function(next) {
|
||||
getNormalizedTxs(addresses, from, to, next);
|
||||
},
|
||||
function(txs, next) {
|
||||
// Fetch all proposals in [t - 7 days, t + 1 day]
|
||||
var minTs = _.min(txs.items, 'time').time - 7 * 24 * 3600;
|
||||
var maxTs = _.max(txs.items, 'time').time + 1 * 24 * 3600;
|
||||
|
||||
async.parallel([
|
||||
|
||||
function(done) {
|
||||
self.storage.fetchTxs(self.walletId, {
|
||||
minTs: minTs,
|
||||
maxTs: maxTs
|
||||
}, done);
|
||||
},
|
||||
function(done) {
|
||||
self.storage.fetchTxNotes(self.walletId, {
|
||||
minTs: minTs
|
||||
}, done);
|
||||
},
|
||||
], function(err, res) {
|
||||
return next(err, {
|
||||
txs: txs,
|
||||
txps: res[0],
|
||||
notes: res[1]
|
||||
});
|
||||
});
|
||||
},
|
||||
], function(err, res) {
|
||||
if (err) return cb(err);
|
||||
|
||||
var finalTxs = decorate(wallet, res.txs.items, addresses, res.txps, res.notes);
|
||||
|
||||
if (res.txs.fromCache)
|
||||
log.debug("History from cache for:", self.walletId, from, to);
|
||||
|
||||
return cb(null, finalTxs, !!res.txs.fromCache);
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
|
|
@ -4245,41 +4245,42 @@ describe('Wallet service', function() {
|
|||
});
|
||||
});
|
||||
});
|
||||
it.only('should correctly handle change in tx history', function(done) {
|
||||
it('should correctly handle change in tx history', function(done) {
|
||||
server._normalizeTxHistory = sinon.stub().returnsArg(0);
|
||||
var txs = [{
|
||||
txid: '1',
|
||||
confirmations: 1,
|
||||
fees: 150,
|
||||
time: Date.now() / 1000,
|
||||
inputs: [{
|
||||
address: firstAddress,
|
||||
amount: 550,
|
||||
}],
|
||||
outputs: [{
|
||||
address: firstAddress,
|
||||
amount: 100,
|
||||
}, {
|
||||
address: 'external',
|
||||
amount: 300,
|
||||
}],
|
||||
}];
|
||||
helpers.stubHistory(txs);
|
||||
server.getTxHistory({}, function(err, txs) {
|
||||
should.not.exist(err);
|
||||
should.exist(txs);
|
||||
txs.length.should.equal(1);
|
||||
var tx = txs[0];
|
||||
tx.action.should.equal('sent');
|
||||
tx.amount.should.equal(300);
|
||||
tx.fees.should.equal(150);
|
||||
tx.outputs.length.should.equal(1);
|
||||
tx.outputs[0].address.should.equal('external');
|
||||
tx.outputs[0].amount.should.equal(300);
|
||||
done();
|
||||
helpers.stubUtxos(server, wallet, 2, function() {
|
||||
var txs = [{
|
||||
txid: '1',
|
||||
confirmations: 1,
|
||||
fees: 150,
|
||||
time: Date.now() / 1000,
|
||||
inputs: [{
|
||||
address: firstAddress.address,
|
||||
amount: 550,
|
||||
}],
|
||||
outputs: [{
|
||||
address: firstAddress.address,
|
||||
amount: 100,
|
||||
}, {
|
||||
address: 'external',
|
||||
amount: 300,
|
||||
}],
|
||||
}];
|
||||
helpers.stubHistory(txs);
|
||||
server.getTxHistory({}, function(err, txs) {
|
||||
should.not.exist(err);
|
||||
should.exist(txs);
|
||||
txs.length.should.equal(1);
|
||||
var tx = txs[0];
|
||||
tx.action.should.equal('sent');
|
||||
tx.amount.should.equal(300);
|
||||
tx.fees.should.equal(150);
|
||||
tx.outputs.length.should.equal(1);
|
||||
tx.outputs[0].address.should.equal('external');
|
||||
tx.outputs[0].amount.should.equal(300);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue