diff --git a/config.js b/config.js index 5dda94b..c04e868 100644 --- a/config.js +++ b/config.js @@ -46,7 +46,6 @@ var config = { testnet: { provider: 'insight', url: 'https://test-insight.bitpay.com:443', - // url: 'http://localhost:3001', // Multiple servers (in priority order) // url: ['http://a.b.c', 'https://test-insight.bitpay.com:443'], }, @@ -54,7 +53,9 @@ var config = { bch: { livenet: { provider: 'insight', - url: 'https://cashexplorer.bitcoin.com', + //url: 'https://cashexplorer.bitcoin.com', + url: 'http://localhost:2001', + translateAddresses: false, }, }, }, diff --git a/scripts/deleteWallet.mongo b/scripts/deleteWallet.mongo index c6228c3..1bf2ed9 100644 --- a/scripts/deleteWallet.mongo +++ b/scripts/deleteWallet.mongo @@ -1,5 +1,6 @@ -a='bd0e9eed-4712-42e5-bb21-193cde4c9e21'; +// json support +a='f42c8c47-0f7e-4cb0-9056-6c50bb821d7d'; b= {'walletId':a}; db.addresses.remove(b); diff --git a/test/integration/helpers.js b/test/integration/helpers.js index bb27232..912d228 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -185,6 +185,7 @@ helpers.createAndJoinWallet = function(m, n, opts, cb) { pubKey: TestData.keyPair.pub, singleAddress: !!opts.singleAddress, coin: opts.coin || 'btc', + network: opts.network || 'livenet', }; if (_.isBoolean(opts.supportBIP44AndP2PKH)) walletOpts.supportBIP44AndP2PKH = opts.supportBIP44AndP2PKH; @@ -194,11 +195,18 @@ helpers.createAndJoinWallet = function(m, n, opts, cb) { async.each(_.range(n), function(i, cb) { var copayerData = TestData.copayers[i + offset]; + + + var pub = (_.isBoolean(opts.supportBIP44AndP2PKH) && !opts.supportBIP44AndP2PKH) ? copayerData.xPubKey_45H : copayerData.xPubKey_44H_0H_0H; + + if (opts.network == 'testnet') + pub = copayerData.xPubKey_44H_0H_0Ht; + var copayerOpts = helpers.getSignedCopayerOpts({ walletId: walletId, coin: opts.coin, name: 'copayer ' + (i + 1), - xPubKey: (_.isBoolean(opts.supportBIP44AndP2PKH) && !opts.supportBIP44AndP2PKH) ? copayerData.xPubKey_45H : copayerData.xPubKey_44H_0H_0H, + xPubKey: pub, requestPubKey: copayerData.pubKey_1H_0, customData: 'custom data ' + (i + 1), }); @@ -206,6 +214,7 @@ helpers.createAndJoinWallet = function(m, n, opts, cb) { copayerOpts.supportBIP44AndP2PKH = opts.supportBIP44AndP2PKH; server.joinWallet(copayerOpts, function(err, result) { + if (err) console.log(err); should.not.exist(err); copayerIds.push(result.copayerId); return cb(err); diff --git a/test/integration/server.js b/test/integration/server.js index 9059573..13bfcbe 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -458,6 +458,7 @@ describe('Wallet service', function() { }); }); + describe('Address derivation strategy', function() { var server; beforeEach(function() { @@ -1249,7 +1250,7 @@ describe('Wallet service', function() { }); }); - it('should create address', function(done) { + it('should create address ', function(done) { server.createAddress({}, function(err, address) { should.not.exist(err); should.exist(address); @@ -1377,6 +1378,113 @@ describe('Wallet service', function() { }); }); + describe('shared wallets (BIP44/BCH)', function() { + beforeEach(function(done) { + helpers.createAndJoinWallet(2, 2, { + coin: 'bch' + }, function(s, w) { + server = s; + wallet = w; + done(); + }); + }); + + it('should create address', function(done) { + server.createAddress({}, function(err, address) { + should.not.exist(err); + should.exist(address); + address.walletId.should.equal(wallet.id); + address.network.should.equal('livenet'); + address.address.should.equal('HBf8isgS8EXG1r3X6GP89FmooUmiJ42wHS'); + address.isChange.should.be.false; + address.path.should.equal('m/0/0'); + address.type.should.equal('P2SH'); + address.coin.should.equal('bch'); + server.getNotifications({}, function(err, notifications) { + should.not.exist(err); + var notif = _.find(notifications, { + type: 'NewAddress' + }); + should.exist(notif); + notif.data.address.should.equal(address.address); + done(); + }); + }); + }); + + it('should create many addresses on simultaneous requests', function(done) { + var N = 5; + async.mapSeries(_.range(N), function(i, cb) { + server.createAddress({}, cb); + }, function(err, addresses) { + addresses.length.should.equal(N); + _.each(_.range(N), function(i) { + addresses[i].path.should.equal('m/0/' + i); + }); + // No two identical addresses + _.uniq(_.pluck(addresses, 'address')).length.should.equal(N); + done(); + }); + }); + + it('should not create address if unable to store it', function(done) { + sinon.stub(server.storage, 'storeAddressAndWallet').yields('dummy error'); + server.createAddress({}, function(err, address) { + should.exist(err); + should.not.exist(address); + + server.getMainAddresses({}, function(err, addresses) { + addresses.length.should.equal(0); + + server.storage.storeAddressAndWallet.restore(); + server.createAddress({}, function(err, address) { + should.not.exist(err); + should.exist(address); + done(); + }); + }); + }); + }); + }); + + + describe('1-1 wallet (BIP44/BCH/Testnet)', function() { + beforeEach(function(done) { + helpers.createAndJoinWallet(1, 1, { + coin: 'bch', + network: 'testnet', + }, function(s, w) { + server = s; + wallet = w; + done(); + }); + }); + + it('should create address', function(done) { + server.createAddress({}, function(err, address) { + should.not.exist(err); + should.exist(address); + address.walletId.should.equal(wallet.id); + address.network.should.equal('testnet'); + address.address.should.equal('mrM5kMkqZccK5MxZYSsM3SjqdMaNKLJgrJ'); + address.isChange.should.be.false; + address.path.should.equal('m/0/0'); + address.type.should.equal('P2PKH'); + address.coin.should.equal('bch'); + server.getNotifications({}, function(err, notifications) { + should.not.exist(err); + var notif = _.find(notifications, { + type: 'NewAddress' + }); + should.exist(notif); + notif.data.address.should.equal(address.address); + done(); + }); + }); + }); + }); + + describe('1-of-1 (BIP44 & P2PKH)', function() { beforeEach(function(done) { helpers.createAndJoinWallet(1, 1, function(s, w) { diff --git a/test/testdata.js b/test/testdata.js index 2dfbcbd..1ae7808 100644 --- a/test/testdata.js +++ b/test/testdata.js @@ -13,6 +13,11 @@ var copayers = [{ xPubKey_45H: 'xpub68pKcb8jHWqWuTgPz2czjFSJJBJTsTNdd87Mgh5bVz4sNFBJBus5KyptGBWgA4V6LGCi12s4Mw4S1JC2GkqX4NJ4kfQ47XqRZLbyM2DY9Jd', xPrivKey_44H_0H_0H: 'xprv9zWRZ7CXrC4z9xA9RRBFXohmPKbyCajWaCNTHPtwNeJwTnysHG5QK7WMqpNLVtvqGxts7WNcNtqBLfdaFdCGknDPXjLKt2E2BUrPaFDqrLh', xPubKey_44H_0H_0H: 'xpub6DVmxcjRgZdHNSEcXSiFtweVwMSTc3TMwRJ45nJYvyqvLbK1poPerupqh87rSoz27wvckb1CKnGZoLmLXSZyNGZtVd7neqSvdwJL6fceQpe', + + + xPrivKey_44H_0H_0Ht: 'tprv8ZgxMBicQKsPcxUEtgtQ2wKpkmuNKS6R2w3UmFTUHHURv4PKGE2aGkkbQEcQs9gGsoW4zPr7VM98xdbjQuWc3cZ6bkEyKy1sywhV9gLUcUi', + xPubKey_44H_0H_0Ht: 'tpubD6NzVbkrYhZ4WRW2nLYzSLywKoRJUmHKcEeG3mVmhZGpkYe5tcrATFNTaQRAWM3dzL2QyXoctpjkaAXruDXyc6xkF4EDGu3eQdwZXFzoFSW', + xPrivKey_1H: 'xprv9upyD5bqT9HBkWym7TvTH3njEzTnjrtkLB2sg3DD2CxxA5hZKGee1sYJUtD8C4QaeATLXQ33TirRzRhuTGDBA6XRoYDMwfXAj1KSmGyNBio', xPubKey_1H: 'xpub68pKcb8jHWqUy14EDVTTeBjTo2JH9KcbhPxUURcpaYVw2t2hroxtZfrnLBw1bWzBrHbEJA48QmZ8DB9gTvhphKSitC15SiYx9k2ncGh55Hq', privKey_1H_0: 'a710be25950738a7d13637e2e09affd7f579a3479fd7cc024bd9459f8fba6659',