diff --git a/lib/postgresql_interface.js b/lib/postgresql_interface.js index bcae7cbd..0d514e60 100644 --- a/lib/postgresql_interface.js +++ b/lib/postgresql_interface.js @@ -3,6 +3,7 @@ // TODO: Consider using serializable transactions for true ACID +var BigNumber = require('bignumber.js') var pg = require('pg'); var async = require('async'); var _ = require('lodash'); @@ -173,27 +174,30 @@ function billsAndTxs(client, session, cb) { // we need to parse, since we know these won't be huge numbers. cb(null, { billsFiat: parseInt(results[0].rows[0].fiat), - billsSatoshis: parseInt(results[0].rows[0].satoshis), + billsSatoshis: new BigNumber(results[0].rows[0].satoshis), txFiat: parseInt(results[1].rows[0].fiat), - txSatoshis: parseInt(results[1].rows[0].satoshis) + txSatoshis: new BigNumber(results[1].rows[0].satoshis) }); }); } function computeSendAmount(tx, totals) { var fiatRemaining = (tx.fiat || totals.billsFiat) - totals.txFiat; - var satoshisRemaining = (tx.satoshis || totals.billsSatoshis) - - totals.txSatoshis; + + var satoshisRemaining = tx.satoshis.eq(0) + ? totals.billsSatoshis.minus(totals.txSatoshis) + : tx.satoshis.minus(totals.txSatoshis) + var result = { fiat: fiatRemaining, satoshis: satoshisRemaining }; - if (result.fiat < 0 || result.satoshis < 0) { + if (result.fiat < 0 || result.satoshis.lt(0)) { logger.warn({tx: tx, totals: totals, result: result}, 'computeSendAmount result < 0, this shouldn\'t happen. ' + 'Maybe timeout arrived after machineSend.'); result.fiat = 0; - result.satoshis = 0; + result.satoshis = new BigNumber(0); } return result; } @@ -240,7 +244,7 @@ function insertOutgoingTx(client, session, tx, totals, cb) { var authority = tx.fiat ? 'machine' : 'timeout'; var satoshis = sendAmount.satoshis; var fiat = sendAmount.fiat; - if (satoshis === 0) return cb(null, {satoshis: 0, fiat: 0}); + if (satoshis.eq(0)) return cb(null, {satoshis: new BigNumber(0), fiat: 0}); insertOutgoing(client, session, tx, satoshis, fiat, stage, authority, function(err) { @@ -264,7 +268,7 @@ function insertOutgoingCompleteTx(client, session, tx, cb) { function insertIncoming(client, session, tx, satoshis, fiat, stage, authority, cb) { - var realSatoshis = satoshis || 0; + var realSatoshis = satoshis || new BigNumber(0); insertTx(client, session, true, tx, realSatoshis, fiat, stage, authority, cb); }