diff --git a/config.js b/config.js index 984e1b2c8..9c0ef9224 100644 --- a/config.js +++ b/config.js @@ -16,7 +16,6 @@ var defaultConfig = { limits: { totalCopayers: 12, mPlusN: 100, - minAmountSatoshi: 5400, }, // network layer config @@ -66,4 +65,4 @@ var defaultConfig = { verbose: 1, }; if (typeof module !== 'undefined') - module.exports = defaultConfig; + module.exports = defaultConfig; \ No newline at end of file diff --git a/js/controllers/send.js b/js/controllers/send.js index 6b89a2392..788217edf 100644 --- a/js/controllers/send.js +++ b/js/controllers/send.js @@ -9,7 +9,6 @@ angular.module('copayApp.controllers').controller('SendController', $scope.defaultFee = bitcore.TransactionBuilder.FEE_PER_1000B_SAT * satToUnit; $scope.unitToBtc = config.unitToSatoshi / bitcore.util.COIN; $scope.unitToSatoshi = config.unitToSatoshi; - $scope.minAmount = config.limits.minAmountSatoshi * satToUnit; $scope.alternativeName = config.alternativeName; $scope.alternativeIsoCode = config.alternativeIsoCode; @@ -30,40 +29,38 @@ angular.module('copayApp.controllers').controller('SendController', */ Object.defineProperty($scope, "alternative", { - get: function () { - return this._alternative; - }, - set: function (newValue) { - this._alternative = newValue; - if (typeof(newValue) === 'number' && $scope.isRateAvailable) { - this._amount = parseFloat( - (rateService.fromFiat(newValue, config.alternativeIsoCode) * satToUnit - ).toFixed(config.unitDecimals), 10); - } else { - this._amount = 0; - } - }, - enumerable: true, - configurable: true - }); + get: function() { + return this._alternative; + }, + set: function(newValue) { + this._alternative = newValue; + if (typeof(newValue) === 'number' && $scope.isRateAvailable) { + this._amount = parseFloat( + (rateService.fromFiat(newValue, config.alternativeIsoCode) * satToUnit).toFixed(config.unitDecimals), 10); + } else { + this._amount = 0; + } + }, + enumerable: true, + configurable: true + }); Object.defineProperty($scope, "amount", { - get: function () { - return this._amount; - }, - set: function (newValue) { - this._amount = newValue; - if (typeof(newValue) === 'number' && $scope.isRateAvailable) { - this._alternative = parseFloat( - (rateService.toFiat(newValue * config.unitToSatoshi, config.alternativeIsoCode) - ).toFixed(2), 10); - } else { - this._alternative = 0; - } - }, - enumerable: true, - configurable: true - }); + get: function() { + return this._amount; + }, + set: function(newValue) { + this._amount = newValue; + if (typeof(newValue) === 'number' && $scope.isRateAvailable) { + this._alternative = parseFloat( + (rateService.toFiat(newValue * config.unitToSatoshi, config.alternativeIsoCode)).toFixed(2), 10); + } else { + this._alternative = 0; + } + }, + enumerable: true, + configurable: true + }); $scope.loadTxs = function() { var opts = { @@ -104,7 +101,7 @@ angular.module('copayApp.controllers').controller('SendController', $scope.isMobile = isMobile.any(); if (!window.cordova && !navigator.getUserMedia) - $scope.disableScanner =1; + $scope.disableScanner = 1; $scope.submitForm = function(form) { if (form.$invalid) { @@ -187,9 +184,7 @@ angular.module('copayApp.controllers').controller('SendController', } // If we're setting the domain, ignore the change. - if ($rootScope.merchant - && $rootScope.merchant.domain - && address === $rootScope.merchant.domain) { + if ($rootScope.merchant && $rootScope.merchant.domain && address === $rootScope.merchant.domain) { uri = { merchant: $rootScope.merchant.request_url }; @@ -480,9 +475,7 @@ angular.module('copayApp.controllers').controller('SendController', var uri; // If we're setting the domain, ignore the change. - if ($rootScope.merchant - && $rootScope.merchant.domain - && value === $rootScope.merchant.domain) { + if ($rootScope.merchant && $rootScope.merchant.domain && value === $rootScope.merchant.domain) { return; } @@ -566,9 +559,7 @@ angular.module('copayApp.controllers').controller('SendController', var val = scope.sendForm.address.$viewValue || ''; var uri; // If we're setting the domain, ignore the change. - if ($rootScope.merchant - && $rootScope.merchant.domain - && val === $rootScope.merchant.domain) { + if ($rootScope.merchant && $rootScope.merchant.domain && val === $rootScope.merchant.domain) { uri = { merchant: $rootScope.merchant.request_url }; @@ -600,4 +591,4 @@ angular.module('copayApp.controllers').controller('SendController', }); }; - }); + }); \ No newline at end of file diff --git a/js/models/core/Wallet.js b/js/models/core/Wallet.js index fcae0c43f..f9af99d39 100644 --- a/js/models/core/Wallet.js +++ b/js/models/core/Wallet.js @@ -463,7 +463,7 @@ Wallet.prototype.updateTimestamp = function(ts) { */ Wallet.prototype._onNoMessages = function() { log.debug('No messages at the server. Requesting peer sync from: ' + this.lastTimestamp + 1); //TODO - this.sendWalletReady(null, parseInt((this.lastTimestamp + 1)/1000) ) ; + this.sendWalletReady(null, parseInt((this.lastTimestamp + 1) / 1000)); }; /** @@ -498,7 +498,7 @@ Wallet.prototype._onData = function(senderId, data, ts) { break; case 'walletReady': if (this.lastMessageFrom[senderId] !== 'walletReady') { - log.debug('peer Sync received. since: ' + (data.sinceTs||0)); + log.debug('peer Sync received. since: ' + (data.sinceTs || 0)); this.sendPublicKeyRing(senderId); this.sendAddressBook(senderId); this.sendAllTxProposals(senderId, data.sinceTs); // send old txps @@ -2114,7 +2114,6 @@ Wallet.prototype.createTxSync = function(toAddress, amountSatStr, comment, utxos preconditions.checkArgument(new Address(toAddress).network().name === this.getNetworkName(), 'networkname mismatch'); preconditions.checkState(pkr.isComplete(), 'pubkey ring incomplete'); preconditions.checkState(priv, 'no private key'); - preconditions.checkArgument(bignum(amountSatStr, 10).cmp(copayConfig.limits.minAmountSatoshi) >= 0, 'invalid amount'); if (comment) preconditions.checkArgument(comment.length <= 100); if (!opts.remainderOut) { @@ -2523,4 +2522,4 @@ Wallet.request = function(options, callback) { return ret; }; -module.exports = Wallet; +module.exports = Wallet; \ No newline at end of file diff --git a/test/test.Wallet.js b/test/test.Wallet.js index 2ed4298a2..d6b765b46 100644 --- a/test/test.Wallet.js +++ b/test/test.Wallet.js @@ -219,7 +219,7 @@ describe('Wallet model', function() { var t = w.txProposals; var opts = JSON.parse(t.txps[ntxid].builder.vanilla.opts); opts.signhash.should.equal(1); - (opts.lockTime===null).should.be.true; + (opts.lockTime === null).should.be.true; should.not.exist(opts.fee); should.not.exist(opts.feeSat); }); @@ -377,7 +377,7 @@ describe('Wallet model', function() { Wallet.decodeSecret('4fp61K187CsYmjoRQC5iAdC5eGmbCRsAAXfwEwetSQgHvZs27eWKaLaNHRoK'); }).should. throw(); - + (function() { Wallet.decodeSecret('12345'); }).should. @@ -765,8 +765,12 @@ describe('Wallet model', function() { var txp = w.txProposals.get(ntxid); // Assign fake builder txp.builder = new Builder(); - sinon.stub(txp.builder, 'build').returns({ isComplete: function () { return false; }}); - (function () { + sinon.stub(txp.builder, 'build').returns({ + isComplete: function() { + return false; + } + }); + (function() { w.sendTx(ntxid); }).should.throw('Tx is not complete. Can not broadcast'); done(); @@ -777,9 +781,11 @@ describe('Wallet model', function() { var utxo = createUTXO(w); w.blockchain.fixUnspent(utxo); w.createTx(toAddress, amountSatStr, null, function(err, ntxid) { - sinon.stub(w.blockchain, 'broadcast').yields({statusCode: 303}); + sinon.stub(w.blockchain, 'broadcast').yields({ + statusCode: 303 + }); var spyCheckSentTx = sinon.spy(w, '_checkSentTx'); - w.sendTx(ntxid, function () {}); + w.sendTx(ntxid, function() {}); chai.expect(spyCheckSentTx.calledOnce).to.be.true; done(); }); @@ -810,37 +816,20 @@ describe('Wallet model', function() { }); }); - describe('#createTx', function () { - it('should fail if insight server is down', function (done) { + describe('#createTx', function() { + it('should fail if insight server is down', function(done) { var w = cachedCreateW2(); var utxo = createUTXO(w); w.blockchain.fixUnspent(utxo); sinon.stub(w, 'getUnspent').yields('error', null); - w.createTx(toAddress, amountSatStr, null, function(err, ntxid) { + w.createTx(toAddress, amountSatStr, null, function(err, ntxid) { chai.expect(err.message).to.equal('Could not get list of UTXOs'); - done(); + done(); }); }); }); - describe('#createTxSync', function() { - it('should fail if amount below min value', function() { - var w = cachedCreateW2(); - var utxo = createUTXO(w); - - var badCreate = function() { - w.createTxSync( - 'mgGJEugdPnvhmRuFdbdQcFfoFLc1XXeB79', - '123', - null, - utxo - ); - } - chai.expect(badCreate).to.throw('invalid amount'); - }); - }); - - describe('removeTxWithSpentInputs', function () { + describe('removeTxWithSpentInputs', function() { it('should remove pending TxProposal with spent inputs', function(done) { var w = cachedCreateW2(); var utxo = createUTXO(w); @@ -849,7 +838,7 @@ describe('Wallet model', function() { w.createTx(toAddress, amountSatStr, null, function(err, ntxid) { w.sendTxProposal(ntxid); chai.expect(w.getTxProposals().length).to.equal(1); - + // Inputs are still available, txp still valid w.removeTxWithSpentInputs(); chai.expect(w.getTxProposals().length).to.equal(1); @@ -874,7 +863,7 @@ describe('Wallet model', function() { w.createTx(toAddress, '100000', null, function(err, ntxid) { w.sendTxProposal(ntxid); chai.expect(w.getTxProposals().length).to.equal(1); - + // Inputs are still available, txp still valid w.removeTxWithSpentInputs(); chai.expect(w.getTxProposals().length).to.equal(1); @@ -896,7 +885,7 @@ describe('Wallet model', function() { w.createTx(toAddress, amountSatStr, null, function(err, ntxid) { w.sendTxProposal(ntxid); chai.expect(w.getTxProposals().length).to.equal(1); - + // Inputs are still available, txp still valid w.removeTxWithSpentInputs(); chai.expect(w.getTxProposals().length).to.equal(1); @@ -904,7 +893,9 @@ describe('Wallet model', function() { // Simulate input spent. txp should be removed from txps list w.blockchain.fixUnspent([]); var txp = w.txProposals.get(ntxid); - sinon.stub(txp, 'isPending', function () { return false; }) + sinon.stub(txp, 'isPending', function() { + return false; + }) w.removeTxWithSpentInputs(); chai.expect(w.getTxProposals().length).to.equal(1); @@ -1402,17 +1393,21 @@ describe('Wallet model', function() { }; var s1 = sinon.stub(w, '_getKeyMap', function() { - return {1:2}; + return { + 1: 2 + }; }); var s2 = sinon.stub(w.txProposals, 'merge', function() { - if (response == 0) + if (response == 0) throw new Error('test error'); return { ntxid: 1, txp: { - setCopayers: function() {return ['oeoe']; } , + setCopayers: function() { + return ['oeoe']; + }, }, new: response == 1 }; @@ -1538,4 +1533,4 @@ describe('Wallet model', function() { should.exist(n.networkNonce); }); -}); +}); \ No newline at end of file diff --git a/views/send.html b/views/send.html index 9ce86aa5c..d5747e276 100644 --- a/views/send.html +++ b/views/send.html @@ -70,9 +70,8 @@ + min="0.00000001" max="10000000000" enough-amount required + autocomplete="off">