treat single address in output as change

This commit is contained in:
Ivan Socolsky 2017-01-16 14:14:28 -03:00
parent d4ff5232df
commit 75c8e28e73
No known key found for this signature in database
GPG Key ID: FAECE6A05FAA4F56
2 changed files with 82 additions and 78 deletions

View File

@ -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);
});
});
});
};

View File

@ -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();
});
});
});
});