txdb: balance object.

This commit is contained in:
Christopher Jeffrey 2016-08-12 17:22:22 -07:00
parent c4f16f8d72
commit 4b9753d3c3
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
2 changed files with 76 additions and 26 deletions

View File

@ -993,13 +993,9 @@ HTTPServer.prototype._initIO = function _initIO() {
}); });
this.walletdb.on('balance', function(id, balance) { this.walletdb.on('balance', function(id, balance) {
balance = { var json = balance.toJSON();
confirmed: utils.btc(balance.confirmed), self.server.io.to(id).emit('wallet balance', json);
unconfirmed: utils.btc(balance.unconfirmed), self.server.io.to('!all').emit('wallet balance', id, json);
total: utils.btc(balance.total)
};
self.server.io.to(id).emit('wallet balance', balance);
self.server.io.to('!all').emit('wallet balance', id, balance);
}); });
this.walletdb.on('address', function(id, receive) { this.walletdb.on('address', function(id, receive) {

View File

@ -51,6 +51,7 @@ function TXDB(wallet) {
this.locker = new bcoin.locker(this); this.locker = new bcoin.locker(this);
this.current = null; this.current = null;
this.coinCache = new bcoin.lru(10000, 1); this.coinCache = new bcoin.lru(10000, 1);
this.balance = new Balance();
} }
/** /**
@ -426,6 +427,9 @@ TXDB.prototype._resolveOrphans = function _resolveOrphans(tx, index, callback) {
if (err) if (err)
return callback(err); return callback(err);
// Just going to be added again outside.
self.balance.sub(coin);
return callback(null, false); return callback(null, false);
}); });
}); });
@ -519,6 +523,7 @@ TXDB.prototype.add = function add(tx, info, callback) {
self.del('c/' + key); self.del('c/' + key);
self.del('C/' + path.account + '/' + key); self.del('C/' + path.account + '/' + key);
self.put('d/' + hash + '/' + i, input.coin.toRaw()); self.put('d/' + hash + '/' + i, input.coin.toRaw());
self.balance.sub(input.coin);
self.coinCache.remove(key); self.coinCache.remove(key);
@ -548,7 +553,9 @@ TXDB.prototype.add = function add(tx, info, callback) {
if (orphans) if (orphans)
return next(); return next();
coin = bcoin.coin.fromTX(tx, i).toRaw(); coin = bcoin.coin.fromTX(tx, i);
self.balance.add(coin);
coin = coin.toRaw();
self.put('c/' + key, coin); self.put('c/' + key, coin);
self.put('C/' + path.account + '/' + key, DUMMY); self.put('C/' + path.account + '/' + key, DUMMY);
@ -792,6 +799,8 @@ TXDB.prototype._confirm = function _confirm(tx, info, callback) {
return next(); return next();
} }
self.balance.confirm(coin.value);
coin.height = tx.height; coin.height = tx.height;
coin = coin.toRaw(); coin = coin.toRaw();
@ -915,6 +924,8 @@ TXDB.prototype._remove = function remove(tx, info, callback) {
if (!path) if (!path)
continue; continue;
self.balance.add(input.coin);
coin = input.coin.toRaw(); coin = input.coin.toRaw();
self.put('c/' + key, coin); self.put('c/' + key, coin);
@ -936,6 +947,10 @@ TXDB.prototype._remove = function remove(tx, info, callback) {
if (!path) if (!path)
continue; continue;
coin = bcoin.coin.fromTX(tx, i);
self.balance.sub(coin);
self.del('c/' + key); self.del('c/' + key);
self.del('C/' + path.account + '/' + key); self.del('C/' + path.account + '/' + key);
@ -1038,6 +1053,7 @@ TXDB.prototype._unconfirm = function unconfirm(tx, info, callback, force) {
return next(); return next();
} }
self.balance.unconfirm(coin.value);
coin.height = tx.height; coin.height = tx.height;
coin = coin.toRaw(); coin = coin.toRaw();
@ -1679,8 +1695,7 @@ TXDB.prototype.hasCoin = function hasCoin(hash, index, callback) {
TXDB.prototype.getBalance = function getBalance(account, callback) { TXDB.prototype.getBalance = function getBalance(account, callback) {
var self = this; var self = this;
var confirmed = 0; var balance = new Balance();
var unconfirmed = 0;
if (typeof account === 'function') { if (typeof account === 'function') {
callback = account; callback = account;
@ -1706,10 +1721,12 @@ TXDB.prototype.getBalance = function getBalance(account, callback) {
assert(data.length >= 16); assert(data.length >= 16);
balance.total += value;
if (height === 0x7fffffff) if (height === 0x7fffffff)
unconfirmed += value; balance.unconfirmed += value;
else else
confirmed += value; balance.confirmed += value;
key = hash + '/' + index; key = hash + '/' + index;
@ -1719,11 +1736,7 @@ TXDB.prototype.getBalance = function getBalance(account, callback) {
if (err) if (err)
return callback(err); return callback(err);
return callback(null, { return callback(null, balance);
confirmed: confirmed,
unconfirmed: unconfirmed,
total: confirmed + unconfirmed
});
}); });
}; };
@ -1735,8 +1748,7 @@ TXDB.prototype.getBalance = function getBalance(account, callback) {
TXDB.prototype.getAccountBalance = function getBalance(account, callback) { TXDB.prototype.getAccountBalance = function getBalance(account, callback) {
var self = this; var self = this;
var confirmed = 0; var balance = new Balance();
var unconfirmed = 0;
var key, coin; var key, coin;
function parse(data) { function parse(data) {
@ -1745,10 +1757,12 @@ TXDB.prototype.getAccountBalance = function getBalance(account, callback) {
assert(data.length >= 16); assert(data.length >= 16);
balance.total += value;
if (height === 0x7fffffff) if (height === 0x7fffffff)
unconfirmed += value; balance.unconfirmed += value;
else else
confirmed += value; balance.confirmed += value;
} }
this.getCoinHashes(account, function(err, hashes) { this.getCoinHashes(account, function(err, hashes) {
@ -1789,11 +1803,7 @@ TXDB.prototype.getAccountBalance = function getBalance(account, callback) {
if (err) if (err)
return callback(err); return callback(err);
return callback(null, { return callback(null, balance);
confirmed: confirmed,
unconfirmed: unconfirmed,
total: confirmed + unconfirmed
});
}); });
}); });
}; };
@ -1960,6 +1970,50 @@ DetailsMember.prototype.toJSON = function toJSON() {
}; };
}; };
/*
* Balance
*/
function Balance() {
this.unconfirmed = 0;
this.confirmed = 0;
this.total = 0;
}
Balance.prototype.add = function add(coin) {
this.total += coin.value;
if (coin.height === -1)
this.unconfirmed += coin.value;
else
this.confirmed += coin.value;
};
Balance.prototype.sub = function sub(coin) {
this.total -= coin.value;
if (coin.height === -1)
this.unconfirmed -= coin.value;
else
this.confirmed -= coin.value;
};
Balance.prototype.confirm = function confirm(value) {
this.unconfirmed -= value;
this.confirmed += value;
};
Balance.prototype.unconfirm = function unconfirm(value) {
this.unconfirmed += value;
this.confirmed -= value;
};
Balance.prototype.toJSON = function toJSON() {
return {
unconfirmed: utils.btc(this.unconfirmed),
confirmed: utils.btc(this.confirmed),
total: utils.btc(this.total)
};
};
/* /*
* Helpers * Helpers
*/ */