copay/js/services/balanceService.js

100 lines
3.5 KiB
JavaScript
Raw Normal View History

2014-11-29 13:35:48 -08:00
'use strict';
var bitcore = require('bitcore');
angular.module('copayApp.services')
2014-12-11 13:31:48 -08:00
.factory('balanceService', function($rootScope, $filter, $timeout, rateService) {
2014-11-29 13:35:48 -08:00
var root = {};
var _balanceCache = {};
root.clearBalanceCache = function(w) {
2014-12-11 13:31:48 -08:00
w.clearUnspentCache();
2014-11-29 13:35:48 -08:00
delete _balanceCache[w.getId()];
};
root._fetchBalance = function(w, cb) {
cb = cb || function() {};
var satToUnit = 1 / w.settings.unitToSatoshi;
var COIN = bitcore.util.COIN;
w.getBalance(function(err, balanceSat, balanceByAddrSat, safeBalanceSat, safeUnspentCount) {
if (err) return cb(err);
var r = {};
r.totalBalance = $filter('noFractionNumber')(balanceSat * satToUnit);
2014-11-29 13:35:48 -08:00
r.totalBalanceBTC = (balanceSat / COIN);
2014-11-30 18:08:16 -08:00
var availableBalanceNr = safeBalanceSat * satToUnit;
r.availableBalance = $filter('noFractionNumber')(safeBalanceSat * satToUnit);
2014-11-29 13:35:48 -08:00
r.availableBalanceBTC = (safeBalanceSat / COIN);
r.safeUnspentCount = safeUnspentCount;
2014-12-04 15:42:45 -08:00
var lockedBalance = (balanceSat - safeBalanceSat) * satToUnit;
r.lockedBalance = lockedBalance ? $filter('noFractionNumber')(lockedBalance) : null;
2014-11-29 13:35:48 -08:00
r.lockedBalanceBTC = (balanceSat - safeBalanceSat) / COIN;
if (r.safeUnspentCount) {
var estimatedFee = copay.Wallet.estimatedFee(r.safeUnspentCount);
2014-11-30 18:08:16 -08:00
r.topAmount = (((availableBalanceNr * w.settings.unitToSatoshi).toFixed(0) - estimatedFee) / w.settings.unitToSatoshi);
2014-11-29 13:35:48 -08:00
}
var balanceByAddr = {};
for (var ii in balanceByAddrSat) {
balanceByAddr[ii] = balanceByAddrSat[ii] * satToUnit;
}
r.balanceByAddr = balanceByAddr;
if (rateService.isAvailable()) {
var totalBalanceAlternative = rateService.toFiat(balanceSat, w.settings.alternativeIsoCode);
var lockedBalanceAlternative = rateService.toFiat(balanceSat - safeBalanceSat, w.settings.alternativeIsoCode);
var alternativeConversionRate = rateService.toFiat(100000000, w.settings.alternativeIsoCode);
r.totalBalanceAlternative = $filter('noFractionNumber')(totalBalanceAlternative, 2);
r.lockedBalanceAlternative = $filter('noFractionNumber')(lockedBalanceAlternative, 2);
r.alternativeConversionRate = $filter('noFractionNumber')(alternativeConversionRate, 2);
2014-12-11 13:31:48 -08:00
2014-11-29 13:35:48 -08:00
r.alternativeBalanceAvailable = true;
r.alternativeIsoCode = w.settings.alternativeIsoCode;
2014-11-29 13:35:48 -08:00
};
r.updatingBalance = false;
return cb(null, r)
});
};
root.update = function(w, cb, isFocused) {
w = w || $rootScope.wallet;
2014-11-29 19:31:17 -08:00
if (!w || !w.isComplete()) return;
2014-11-29 13:35:48 -08:00
2014-12-11 13:31:48 -08:00
copay.logger.debug('Updating balance of:', w.getName(), isFocused);
2014-11-29 13:35:48 -08:00
var wid = w.getId();
2014-11-29 19:31:17 -08:00
// cache available? Set the cached values until we updated them
2014-11-29 13:35:48 -08:00
if (_balanceCache[wid]) {
w.balanceInfo = _balanceCache[wid];
} else {
2014-11-29 19:31:17 -08:00
if (isFocused)
$rootScope.updatingBalance = true;
2014-11-29 13:35:48 -08:00
}
2014-11-29 19:31:17 -08:00
w.balanceInfo = w.balanceInfo || {};
w.balanceInfo.updating = true;
2014-11-29 13:35:48 -08:00
root._fetchBalance(w, function(err, res) {
if (err) throw err;
2014-12-11 13:31:48 -08:00
w.balanceInfo = _balanceCache[wid] = res;
2014-11-29 19:31:17 -08:00
w.balanceInfo.updating = false;
2014-11-29 13:35:48 -08:00
if (isFocused) {
2014-11-29 19:31:17 -08:00
$rootScope.updatingBalance = false;
2014-11-29 13:35:48 -08:00
}
2014-12-11 13:31:48 -08:00
// we alwalys calltimeout because if balance is cached, we are still on the same
// execution path
if (cb) $timeout(function() {
return cb();
}, 1);
2014-11-29 13:35:48 -08:00
});
};
return root;
});