From abc50231079ba83d5f9d6480b8a06006dad6a523 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Sun, 2 Nov 2014 23:53:53 -0300 Subject: [PATCH] add limits to TXs --- js/models/Wallet.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/js/models/Wallet.js b/js/models/Wallet.js index d52dc8bc5..4bf9e5272 100644 --- a/js/models/Wallet.js +++ b/js/models/Wallet.js @@ -30,6 +30,8 @@ var Async = require('./Async'); var Insight = module.exports.Insight = require('./Insight'); var copayConfig = require('../../config'); +var TX_MAX_SIZE_KB = 60; +var TX_MAX_INS = 100; /** * @desc * Wallet manages a private key for Copay, network, storage of the wallet for @@ -2317,7 +2319,13 @@ Wallet.prototype.createTx = function(toAddress, amountSatStr, comment, opts, cb) this.getUnspent(function(err, safeUnspent) { if (err) return cb(new Error('Could not get list of UTXOs')); - var ntxid = self.createTxSync(toAddress, amountSatStr, comment, safeUnspent, opts); + var ntxid; + try { + ntxid = self.createTxSync(toAddress, amountSatStr, comment, safeUnspent, opts); + } catch (e) { + return cb(e); + } + if (!ntxid) { return cb(new Error('Error creating the transaction')); } @@ -2369,7 +2377,13 @@ Wallet.prototype.createTxSync = function(toAddress, amountSatStr, comment, utxos amountSatStr: amountSatStr, }]); + var selectedUtxos = b.getSelectedUnspent(); + + if (selectedUtxos.size > TX_MAX_INS) + throw new Error('Resulting TX is TOO big:' + selectedUtxos.size + ' inputs. Aborting'); + + var inputChainPaths = selectedUtxos.map(function(utxo) { return pkr.pathForAddress(utxo.address); }); @@ -2386,6 +2400,12 @@ Wallet.prototype.createTxSync = function(toAddress, amountSatStr, comment, utxos if (!tx.countInputSignatures(0)) throw new Error('Could not sign generated tx'); + var txSize = tx.getSize(); + + if (txSize/1024 > TX_MAX_SIZE_KB) + throw new Error('Resulting TX is TOO big ' + txSize + ' bytes. Aborting'); + + var me = {}; me[myId] = now;