diff --git a/js/models/blockchain/Insight.js b/js/models/blockchain/Insight.js index d5692ac51..92f31bc47 100644 --- a/js/models/blockchain/Insight.js +++ b/js/models/blockchain/Insight.js @@ -182,7 +182,6 @@ Insight.prototype._request = function(options, callback) { request.open(options.method, url, true); request.timeout = 5000; request.ontimeout = function() { - console.log('Insight timeout...retrying'); setTimeout(function() { return self._request(options,callback); }, self.retryDelay); @@ -206,9 +205,7 @@ Insight.prototype._request = function(options, callback) { else { var err= 'Error code: ' + request.status + ' - Status: ' + request.statusText + ' - Description: ' + request.responseText; - console.log('Insight Temporary error (will retry):', err); setTimeout(function() { - console.log('### Retrying Insight Request....'); //TODO return self._request(options,callback); }, self.retryDelay); return callback(new Error(err)); diff --git a/js/models/core/PrivateKey.js b/js/models/core/PrivateKey.js index 7475f9146..1efe93694 100644 --- a/js/models/core/PrivateKey.js +++ b/js/models/core/PrivateKey.js @@ -58,7 +58,8 @@ PrivateKey.prototype._getHK = function(path) { if (typeof path === 'undefined') { return this.bip; } - return this.bip.derive(path); + var ret = this.bip.derive(path); + return ret; }; PrivateKey.prototype.getForPaths = function(paths) { diff --git a/js/models/core/PublicKeyRing.js b/js/models/core/PublicKeyRing.js index f449158cc..bc3148606 100644 --- a/js/models/core/PublicKeyRing.js +++ b/js/models/core/PublicKeyRing.js @@ -151,6 +151,7 @@ PublicKeyRing.prototype.getPubKeys = function(index, isChange) { pubKeys = pubKeys.map(function(s){return new Buffer(s,'hex');}); } + return pubKeys; }; diff --git a/js/models/core/Wallet.js b/js/models/core/Wallet.js index e6d45201c..9f20ea35e 100644 --- a/js/models/core/Wallet.js +++ b/js/models/core/Wallet.js @@ -92,7 +92,7 @@ Wallet.prototype._handlePublicKeyRing = function(senderId, data, isInbound) { try{ hasChanged = this.publicKeyRing.merge(inPKR, true); } catch (e){ - console.log('## WALLET ERROR', e); //TODO + this.log('## WALLET ERROR', e); //TODO this.emit('connectionError', e.message); return; } diff --git a/test/test.TxProposals.js b/test/test.TxProposals.js index 78bd50196..b2aae9f3b 100644 --- a/test/test.TxProposals.js +++ b/test/test.TxProposals.js @@ -1,64 +1,63 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var bitcore = bitcore || require('bitcore'); -var Transaction = bitcore.Transaction; -var buffertools = bitcore.buffertools; -var WalletKey = bitcore.WalletKey; -var Key = bitcore.Key; -var bignum = bitcore.bignum; -var Script = bitcore.Script; -var Builder = bitcore.TransactionBuilder; -var util = bitcore.util; -var networks = bitcore.networks; -var copay = copay || require('../copay'); -var fakeStorage = copay.FakeStorage; -var PrivateKey = copay.PrivateKey || require('../js/models/PrivateKey'); -var TxProposals = copay.TxProposals || require('../js/models/TxProposal'); -var PublicKeyRing = is_browser ? copay.PublicKeyRing : - require('soop').load('../js/models/core/PublicKeyRing', {Storage: fakeStorage}); -var is_browser = (typeof process.versions === 'undefined') +var chai = chai || require('chai'); +var should = chai.should(); +var bitcore = bitcore || require('bitcore'); +var Transaction = bitcore.Transaction; +var buffertools = bitcore.buffertools; +var WalletKey = bitcore.WalletKey; +var Key = bitcore.Key; +var bignum = bitcore.bignum; +var Script = bitcore.Script; +var Builder = bitcore.TransactionBuilder; +var util = bitcore.util; +var networks = bitcore.networks; +var copay = copay || require('../copay'); +var fakeStorage = copay.FakeStorage; +var PrivateKey = copay.PrivateKey || require('../js/models/PrivateKey'); +var TxProposals = copay.TxProposals || require('../js/models/TxProposal'); +var PublicKeyRing = is_browser ? copay.PublicKeyRing : + require('soop').load('../js/models/core/PublicKeyRing', { + Storage: fakeStorage + }); +var is_browser = (typeof process.versions === 'undefined') var config = { - networkName:'livenet', + networkName: 'testnet', }; -var unspentTest = [ - { - "address": "dummy", - "scriptPubKey": "dummy", - "txid": "2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc1", - "vout": 1, - "amount": 10, - "confirmations":7 - } -]; +var unspentTest = [{ + "address": "dummy", + "scriptPubKey": "dummy", + "txid": "2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc1", + "vout": 1, + "amount": 10, + "confirmations": 7 +}]; -var createPKR = function (bip32s) { +var createPKR = function(bip32s) { var w = new PublicKeyRing(config); should.exist(w); - for(var i=0; i<5; i++) { - if (bip32s) { - var b=bip32s[i]; - w.addCopayer(b?b.deriveBIP45Branch().extendedPublicKeyString():null); - } - else + for (var i = 0; i < 5; i++) { + if (bip32s && i < bip32s.length) { + var b = bip32s[i]; + w.addCopayer(b.deriveBIP45Branch().extendedPublicKeyString()); + } else { w.addCopayer(); + } } - w.generateAddress(true); - w.generateAddress(true); - w.generateAddress(true); - w.generateAddress(false); - w.generateAddress(false); - w.generateAddress(false); - //3x3 indexes - + w.generateAddress(false); + w.generateAddress(false); + w.generateAddress(false); + w.generateAddress(true); + w.generateAddress(true); + w.generateAddress(true); + return w; }; -var vopts = { +var vopts = { verifyP2SH: true, dontVerifyStrictEnc: true }; @@ -66,25 +65,29 @@ var vopts = { describe('TxProposals model', function() { - it('verify TXs', function (done) { + it('verify TXs', function(done) { var priv = new PrivateKey(config); var priv2 = new PrivateKey(config); var priv3 = new PrivateKey(config); var ts = Date.now(); - var isChange=0; - var index=0; - var pkr = createPKR([priv, priv2, priv3]); - var opts = {remainderOut: { address: pkr.generateAddress(true).toString() }}; + var isChange = 0; + var index = 0; + var pkr = createPKR([priv, priv2, priv3]); + var opts = { + remainderOut: { + address: pkr.generateAddress(true).toString() + } + }; var w = new TxProposals({ networkName: config.networkName, }); - unspentTest[0].address = pkr.getAddress(index, isChange).toString(); - unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); + unspentTest[0].address = pkr.getAddress(index, isChange).toString(); + unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); w.add(createTx( - '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', - '123456789', + '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', + '123456789', unspentTest, opts, priv, @@ -94,83 +97,87 @@ describe('TxProposals model', function() { var b = w.txps[k].builder; var tx = b.build(); tx.isComplete().should.equal(false); - b.sign(priv2.getAll(pkr.indexes.getReceiveIndex(), pkr.indexes.getChangeIndex()) ); - b.sign(priv3.getAll(pkr.indexes.getReceiveIndex(), pkr.indexes.getChangeIndex()) ); + b.sign(priv2.getAll(pkr.indexes.getReceiveIndex(), pkr.indexes.getChangeIndex())); + b.sign(priv3.getAll(pkr.indexes.getReceiveIndex(), pkr.indexes.getChangeIndex())); tx = b.build(); tx.isComplete().should.equal(true); - var s = new Script(new Buffer(unspentTest[0].scriptPubKey,'hex')); + var s = new Script(new Buffer(unspentTest[0].scriptPubKey, 'hex')); - tx.verifyInput(0,s, { + tx.verifyInput(0, s, { verifyP2SH: true, dontVerifyStrictEnc: true - }, function(err, results){ - should.not.exist(err); - results.should.equal(true); + }, function(err, results) { + should.not.exist(err); + results.should.equal(true); done(); }); }); - - it('should create an instance', function () { + + it('should create an instance', function() { var w = new TxProposals({ networkName: config.networkName }); should.exist(w); - w.network.name.should.equal('livenet'); + w.network.name.should.equal(config.networkName); }); - function createTx(toAddress, amountSatStr, utxos, opts, priv, pkr) { + var createTx = function(toAddress, amountSatStr, utxos, opts, priv, pkr) { opts = opts || {}; var amountSat = bitcore.bignum(amountSatStr); - if(! pkr.isComplete() ) { + if (!pkr.isComplete()) { throw new Error('publicKeyRing is not complete'); } if (!opts.remainderOut) { - opts.remainderOut ={ address: pkr.generateAddress(true).toString() }; + opts.remainderOut = { + address: pkr.generateAddress(true).toString() + }; }; var b = new Builder(opts) - .setUnspent(utxos) - .setHashToScriptMap(pkr.getRedeemScriptMap()) - .setOutputs([{address: toAddress, amountSat: amountSat}]) - ; + .setUnspent(utxos) + .setHashToScriptMap(pkr.getRedeemScriptMap()) + .setOutputs([{ + address: toAddress, + amountSat: amountSat + }]); - var signRet; + var signRet; if (priv) { - b.sign( priv.getAll(pkr.indexes.getReceiveIndex(), pkr.indexes.getChangeIndex()) ); + var pkeys = priv.getAll(pkr.indexes.getReceiveIndex(), pkr.indexes.getChangeIndex()); + b.sign(pkeys); } var me = {}; if (priv) me[priv.id] = Date.now(); return { signedBy: priv && b.signaturesAdded ? me : {}, - seenBy: priv ? me : {}, + seenBy: priv ? me : {}, builder: b, }; }; - it('#getUsedUnspend', function () { + it('#getUsedUnspend', function() { var priv = new PrivateKey(config); var w = new TxProposals({ networkName: config.networkName, }); var start = new Date().getTime(); - var pkr=createPKR([priv]); + var pkr = createPKR([priv]); var ts = Date.now(); - var isChange=0; - var index=0; - unspentTest[0].address = pkr.getAddress(index, isChange).toString(); - unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); + var isChange = 0; + var index = 0; + unspentTest[0].address = pkr.getAddress(index, isChange).toString(); + unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); w.add(createTx( - '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', - '123456789', - unspentTest, - {}, + '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', + '123456789', + unspentTest, {}, priv, pkr )); @@ -180,24 +187,23 @@ describe('TxProposals model', function() { uuk[0].split(',')[0].should.equal(unspentTest[0].txid); }); - it('#merge with self', function () { + it('#merge with self', function() { var priv = new PrivateKey(config); var w = new TxProposals({ networkName: config.networkName, }); var start = new Date().getTime(); - var pkr=createPKR([priv]); + var pkr = createPKR([priv]); var ts = Date.now(); - var isChange=0; - var index=0; + var isChange = 0; + var index = 0; - unspentTest[0].address = pkr.getAddress(index, isChange).toString(); - unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); + unspentTest[0].address = pkr.getAddress(index, isChange).toString(); + unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); w.add(createTx( - '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', - '123456789', - unspentTest, - {}, + '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', + '123456789', + unspentTest, {}, priv, pkr )); @@ -221,24 +227,28 @@ describe('TxProposals model', function() { - it('#merge, merge signatures case 1', function () { + it('#merge, merge signatures case 1', function() { var priv2 = new PrivateKey(config); var priv = new PrivateKey(config); var ts = Date.now(); - var isChange=0; - var index=0; + var isChange = 0; + var index = 0; var pkr = createPKR([priv]); - var opts = {remainderOut: { address: pkr.generateAddress(true).toString() }}; + var opts = { + remainderOut: { + address: pkr.generateAddress(true).toString() + } + }; var w = new TxProposals({ networkName: config.networkName, }); - unspentTest[0].address = pkr.getAddress(index, isChange).toString(); - unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); + unspentTest[0].address = pkr.getAddress(index, isChange).toString(); + unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); w.add(createTx( - '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', - '123456789', + '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', + '123456789', unspentTest, opts, priv2, @@ -258,11 +268,11 @@ describe('TxProposals model', function() { networkName: config.networkName, publicKeyRing: w.publicKeyRing, }); - unspentTest[0].address = pkr.getAddress(index, isChange).toString(); - unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); + unspentTest[0].address = pkr.getAddress(index, isChange).toString(); + unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); w2.add(createTx( - '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', - '123456789', + '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', + '123456789', unspentTest, opts, priv, @@ -285,139 +295,163 @@ describe('TxProposals model', function() { tx.countInputMissingSignatures(0).should.equal(2); (w.txps[k].signedBy[priv.id] - ts > 0).should.equal(true); (w.txps[k].seenBy[priv.id] - ts > 0).should.equal(true); - + }); -var _dumpChunks = function (scriptSig, label) { - console.log('## DUMP: ' + label + ' ##'); - for(var i=0; i 0).should.equal(true); - (w2.txps[k].seenBy[priv.id] - ts > 0).should.equal(true); + (w2.txps[ntxid].signedBy[priv.id] - ts > 0).should.equal(true); + (w2.txps[ntxid].seenBy[priv.id] - ts > 0).should.equal(true); w.merge(w2); Object.keys(w.txps).length.should.equal(1); - tx = w.txps[k].builder.build(); + tx = w.txps[ntxid].builder.build(); tx.isComplete().should.equal(false); tx.countInputMissingSignatures(0).should.equal(2); - (w.txps[k].signedBy[priv.id] - ts > 0).should.equal(true); - (w.txps[k].seenBy[priv.id] - ts > 0).should.equal(true); + (w.txps[ntxid].signedBy[priv.id] - ts > 0).should.equal(true); + (w.txps[ntxid].seenBy[priv.id] - ts > 0).should.equal(true); var w3 = new TxProposals({ networkName: config.networkName, publicKeyRing: pkr, }); - unspentTest[0].address = pkr.getAddress(index, isChange).toString(); - unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); w3.add(createTx( - '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', - '123456789', + '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', + '123456789', unspentTest, opts, priv2, pkr )); - tx = w3.txps[k].builder.build(); + tx = w3.txps[ntxid].builder.build(); tx.isComplete().should.equal(false); tx.countInputMissingSignatures(0).should.equal(2); - (w3.txps[k].signedBy[priv2.id] - ts > 0).should.equal(true); - (w3.txps[k].seenBy[priv2.id] - ts > 0).should.equal(true); + (w3.txps[ntxid].signedBy[priv2.id] - ts > 0).should.equal(true); + (w3.txps[ntxid].seenBy[priv2.id] - ts > 0).should.equal(true); w.merge(w3); Object.keys(w.txps).length.should.equal(1); - (w.txps[k].signedBy[priv.id] - ts > 0).should.equal(true); - (w.txps[k].seenBy[priv.id] - ts > 0).should.equal(true); - (w.txps[k].signedBy[priv2.id] - ts > 0).should.equal(true); - (w.txps[k].seenBy[priv2.id] - ts > 0).should.equal(true); + (w.txps[ntxid].signedBy[priv.id] - ts > 0).should.equal(true); + (w.txps[ntxid].seenBy[priv.id] - ts > 0).should.equal(true); + (w.txps[ntxid].signedBy[priv2.id] - ts > 0).should.equal(true); + (w.txps[ntxid].seenBy[priv2.id] - ts > 0).should.equal(true); - tx = w.txps[k].builder.build(); + tx = w.txps[ntxid].builder.build(); tx.isComplete().should.equal(false); tx.countInputMissingSignatures(0).should.equal(1); - }); - it('#merge, merge signatures case 3', function () { + it('#merge, merge signatures case 3', function() { var priv = new PrivateKey(config); var priv2 = new PrivateKey(config); var priv3 = new PrivateKey(config); - var ts = Date.now(); - var isChange=0; - var index=0; - var pkr = createPKR([priv, priv2, priv3]); - var opts = {remainderOut: { address: pkr.generateAddress(true).toString() }}; + var ts = Date.now(); + var isChange = 0; + var index = 0; + var pkr = createPKR([priv, priv2, priv3]); + var opts = { + remainderOut: { + address: pkr.generateAddress(true).toString() + } + }; var w = new TxProposals({ networkName: config.networkName, }); - unspentTest[0].address = pkr.getAddress(index, isChange).toString(); - unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); + unspentTest[0].address = pkr.getAddress(index, isChange).toString(); + unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); w.add(createTx( - '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', - '123456789', + '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', + '123456789', unspentTest, opts, priv, @@ -434,11 +468,11 @@ var _dumpChunks = function (scriptSig, label) { var w2 = new TxProposals({ networkName: config.networkName, }); - unspentTest[0].address = pkr.getAddress(index, isChange).toString(); - unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); + unspentTest[0].address = pkr.getAddress(index, isChange).toString(); + unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); w2.add(createTx( - '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', - '123456789', + '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', + '123456789', unspentTest, opts, priv2, @@ -454,11 +488,11 @@ var _dumpChunks = function (scriptSig, label) { var w3 = new TxProposals({ networkName: config.networkName, }); - unspentTest[0].address = pkr.getAddress(index, isChange).toString(); - unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); + unspentTest[0].address = pkr.getAddress(index, isChange).toString(); + unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); w3.add(createTx( - '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', - '123456789', + '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', + '123456789', unspentTest, opts, priv3, @@ -496,7 +530,7 @@ var _dumpChunks = function (scriptSig, label) { - it('#toObj #fromObj roundtrip', function () { + it('#toObj #fromObj roundtrip', function() { var priv = new PrivateKey(config); var pkr = createPKR([priv]); @@ -505,16 +539,15 @@ var _dumpChunks = function (scriptSig, label) { networkName: config.networkName, }); var ts = Date.now(); - var isChange=0; - var index=0; + var isChange = 0; + var index = 0; - unspentTest[0].address = pkr.getAddress(index, isChange).toString(); - unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); + unspentTest[0].address = pkr.getAddress(index, isChange).toString(); + unspentTest[0].scriptPubKey = pkr.getScriptPubKeyHex(index, isChange); w.add(createTx( - '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', - '123456789', - unspentTest, - {}, + '15q6HKjWHAksHcH91JW23BJEuzZgFwydBt', + '123456789', + unspentTest, {}, priv, pkr )); @@ -545,7 +578,7 @@ var _dumpChunks = function (scriptSig, label) { (w2.txps[k].seenBy[priv.id] - ts > 0).should.equal(true); should.exist(w2.txps[k].builder); should.exist(w2.txps[k].builder.valueInSat); - + w2.merge(w); Object.keys(w2.txps).length.should.equal(1); });