don't insert pending tx if tx is completed

This commit is contained in:
Josh Harvey 2014-12-09 18:44:47 -05:00
parent a7fb79016f
commit 82bb7b8811
3 changed files with 46 additions and 10 deletions

View file

@ -182,6 +182,7 @@ function bitcoinFractionalDigits(amount) {
}
function truncateBitcoins(bitcoins) {
if (bitcoins < 0) logger.error('Negative amount in truncateBitcoins');
var decimalDigits = bitcoinFractionalDigits(bitcoins);
var adjuster = Math.pow(10, decimalDigits);
return (Math.round(bitcoins * adjuster) / adjuster);
@ -339,12 +340,10 @@ function addPendingTx(client, session, incoming, currencyCode, toAddress,
toAddress, satoshis];
query(client, sql, values, function(err) {
// If pending tx already exists, do nothing
if (err && isUniqueViolation(err))
if (err && isUniqueViolation(err)) {
return refreshPendingTx(client, session, cb);
if (err && !isUniqueViolation(err)) return cb(err);
}
if (err) return cb(err);
cb();
});
}
@ -429,15 +428,49 @@ exports.addIncomingTx = function addIncomingTx(session, tx, authority,
});
};
function ensureNotFinal(client, session, cb) {
var sql = 'SELECT id FROM transactions ' +
'WHERE device_fingerprint=$1 AND session_id=$2 AND incoming=$3 ' +
'AND stage=$4' +
'LIMIT 1';
var values = [session.fingerprint, session.id, false, 'final_request'];
client.query(sql, values, function(err, results) {
var error;
if (err) return cb(err);
if (results.rows.length > 0) {
error = new Error('Final request already exists');
error.name = 'staleBill';
return cb(error);
}
cb();
});
}
exports.addOutgoingPending = function addOutgoingPending(session, currencyCode,
toAddress, cb) {
connect(function(cerr, client, done) {
if (cerr) return cb(cerr);
addPendingTx(client, session, false, currencyCode, toAddress, 0,
function(err) {
done();
cb(err);
async.series([
async.apply(silentQuery, client, 'BEGIN', null),
async.apply(ensureNotFinal, client, session),
async.apply(addPendingTx, client, session, false, currencyCode, toAddress,
0)
], function(err) {
if (err) {
rollback(client, done);
if (err.name === 'staleBill') {
logger.info('Received a bill insert after send coins request');
return cb();
}
logger.error(err);
return cb(err);
}
silentQuery(client, 'COMMIT', null, function() {
done();
cb();
});
});
});
};