2014-04-04 11:57:28 -07:00
|
|
|
'use strict';
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
var Address = bitcore.Address;
|
2014-07-01 05:41:28 -07:00
|
|
|
|
2014-09-24 21:58:27 -07:00
|
|
|
var HDPath = copay.HDPath;
|
2014-08-04 05:43:46 -07:00
|
|
|
var PrivateKey = copay.PrivateKey;
|
2014-06-24 08:36:32 -07:00
|
|
|
var PublicKeyRing = copay.PublicKeyRing;
|
2014-04-04 11:57:28 -07:00
|
|
|
|
|
|
|
var aMasterPubKey = 'tprv8ZgxMBicQKsPdSVTiWXEqCCzqRaRr9EAQdn5UVMpT9UHX67Dh1FmzEMbavPumpAicsUm2XvC6NTdcWB89yN5DUWx5HQ7z3KByUg7Ht74VRZ';
|
|
|
|
|
|
|
|
|
2014-08-04 05:43:46 -07:00
|
|
|
var getNewEpk = function() {
|
|
|
|
return new PrivateKey({
|
2014-09-23 11:24:57 -07:00
|
|
|
networkName: 'livenet',
|
|
|
|
})
|
|
|
|
.deriveBIP45Branch()
|
|
|
|
.extendedPublicKeyString();
|
2014-08-04 05:43:46 -07:00
|
|
|
}
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
var createW = function(networkName) {
|
2014-04-04 11:57:28 -07:00
|
|
|
var config = {
|
2014-04-07 20:54:38 -07:00
|
|
|
networkName: networkName || 'livenet',
|
2014-04-04 11:57:28 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
var w = new PublicKeyRing(config);
|
|
|
|
should.exist(w);
|
|
|
|
|
|
|
|
var copayers = [];
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 5; i++) {
|
2014-04-09 10:30:12 -07:00
|
|
|
w.isComplete().should.equal(false);
|
2014-08-04 05:43:46 -07:00
|
|
|
w.remainingCopayers().should.equal(5 - i);
|
|
|
|
var newEpk = w.addCopayer(getNewEpk());
|
2014-04-04 13:16:10 -07:00
|
|
|
copayers.push(newEpk);
|
2014-04-04 11:57:28 -07:00
|
|
|
}
|
2014-07-08 07:52:24 -07:00
|
|
|
w.isComplete().should.equal(true);
|
2014-04-15 08:17:28 -07:00
|
|
|
w.walletId = '1234567';
|
2014-06-24 08:36:32 -07:00
|
|
|
|
|
|
|
return {
|
|
|
|
w: w,
|
2014-07-03 07:18:01 -07:00
|
|
|
copayers: copayers,
|
|
|
|
pub: w.copayersHK[0].eckey.public.toString('hex')
|
2014-06-24 08:36:32 -07:00
|
|
|
};
|
2014-04-04 11:57:28 -07:00
|
|
|
};
|
|
|
|
|
2014-08-04 05:43:46 -07:00
|
|
|
var cachedW;
|
2014-09-23 11:24:57 -07:00
|
|
|
var getCachedW = function() {
|
2014-08-04 05:43:46 -07:00
|
|
|
if (!cachedW) {
|
|
|
|
cachedW = createW();
|
|
|
|
}
|
|
|
|
return cachedW;
|
|
|
|
};
|
|
|
|
|
2014-04-04 11:57:28 -07:00
|
|
|
describe('PublicKeyRing model', function() {
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('should create an instance (livenet)', function() {
|
2014-06-17 09:39:41 -07:00
|
|
|
var config = {
|
2014-06-24 08:36:32 -07:00
|
|
|
networkName: 'livenet',
|
2014-06-17 09:39:41 -07:00
|
|
|
};
|
|
|
|
|
2014-04-04 11:57:28 -07:00
|
|
|
var w = new PublicKeyRing({
|
2014-04-07 20:54:38 -07:00
|
|
|
networkName: config.networkName
|
2014-04-04 11:57:28 -07:00
|
|
|
});
|
|
|
|
should.exist(w);
|
|
|
|
w.network.name.should.equal('livenet');
|
|
|
|
});
|
2014-06-24 08:36:32 -07:00
|
|
|
it('should create an instance (testnet)', function() {
|
2014-04-04 11:57:28 -07:00
|
|
|
var w2 = new PublicKeyRing();
|
|
|
|
should.exist(w2);
|
|
|
|
w2.network.name.should.equal('testnet');
|
|
|
|
});
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('should fail to generate shared pub keys wo extended key', function() {
|
2014-06-17 09:39:41 -07:00
|
|
|
var config = {
|
2014-06-24 08:36:32 -07:00
|
|
|
networkName: 'livenet',
|
2014-06-17 09:39:41 -07:00
|
|
|
};
|
2014-04-04 11:57:28 -07:00
|
|
|
var w2 = new PublicKeyRing(config);
|
|
|
|
should.exist(w2);
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
w2.registeredCopayers().should.equal(0);
|
2014-04-09 10:30:12 -07:00
|
|
|
w2.isComplete().should.equal(false);
|
2014-04-04 11:57:28 -07:00
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
(function() {
|
|
|
|
w2.getAddress(0, false);
|
|
|
|
}).should.throw();
|
2014-04-04 11:57:28 -07:00
|
|
|
});
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('should add and check when adding shared pub keys', function() {
|
2014-08-04 05:43:46 -07:00
|
|
|
var k = getCachedW();
|
2014-04-04 11:57:28 -07:00
|
|
|
var w = k.w;
|
|
|
|
var copayers = k.copayers;
|
|
|
|
|
2014-04-09 10:30:12 -07:00
|
|
|
w.isComplete().should.equal(true);
|
2014-04-16 08:41:13 -07:00
|
|
|
w.addCopayer.should.throw();
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 5; i++) {
|
|
|
|
(function() {
|
|
|
|
w.addCopayer(copayers[i])
|
|
|
|
}).should.throw();
|
2014-04-16 08:41:13 -07:00
|
|
|
}
|
2014-04-04 11:57:28 -07:00
|
|
|
});
|
|
|
|
|
2014-07-03 07:18:01 -07:00
|
|
|
it('should be able to to store and read', function() {
|
2014-08-04 05:43:46 -07:00
|
|
|
var k = getCachedW();
|
2014-04-04 11:57:28 -07:00
|
|
|
var w = k.w;
|
|
|
|
var copayers = k.copayers;
|
2014-04-17 11:04:39 -07:00
|
|
|
var changeN = 2;
|
|
|
|
var addressN = 2;
|
|
|
|
var start = new Date().getTime();
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < changeN; i++) {
|
2014-07-03 07:18:01 -07:00
|
|
|
w.generateAddress(true, k.pub);
|
2014-04-17 11:04:39 -07:00
|
|
|
}
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < addressN; i++) {
|
2014-07-03 07:18:01 -07:00
|
|
|
w.generateAddress(false, k.pub);
|
2014-04-17 11:04:39 -07:00
|
|
|
}
|
2014-04-04 11:57:28 -07:00
|
|
|
|
2014-04-15 08:17:28 -07:00
|
|
|
var data = w.toObj();
|
2014-04-09 19:04:22 -07:00
|
|
|
should.exist(data);
|
|
|
|
|
2014-04-15 08:17:28 -07:00
|
|
|
var w2 = PublicKeyRing.fromObj(data);
|
|
|
|
w2.walletId.should.equal(w.walletId);
|
2014-04-09 10:30:12 -07:00
|
|
|
w2.isComplete().should.equal(true);
|
2014-04-16 08:41:13 -07:00
|
|
|
w2.addCopayer.should.throw();
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 5; i++) {
|
|
|
|
(function() {
|
|
|
|
w.addCopayer(copayers[i])
|
|
|
|
}).should.throw();
|
2014-04-16 08:41:13 -07:00
|
|
|
}
|
2014-04-04 16:16:15 -07:00
|
|
|
|
2014-07-29 09:09:47 -07:00
|
|
|
w2.getHDParams(k.pub).getChangeIndex().should.equal(changeN);
|
|
|
|
w2.getHDParams(k.pub).getReceiveIndex().should.equal(addressN);
|
2014-04-04 11:57:28 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('should generate some p2sh addresses', function() {
|
2014-08-04 05:43:46 -07:00
|
|
|
var k = getCachedW();
|
2014-04-04 11:57:28 -07:00
|
|
|
var w = k.w;
|
|
|
|
|
2014-08-04 05:43:46 -07:00
|
|
|
[true, false].forEach(function(isChange) {
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 2; i++) {
|
2014-11-28 13:43:22 -08:00
|
|
|
var aStr = w.generateAddress(isChange, k.pub);
|
2015-01-07 11:47:22 -08:00
|
|
|
var a = new bitcore.Address(aStr);
|
2014-04-04 11:57:28 -07:00
|
|
|
a.isValid().should.equal(true);
|
|
|
|
a.isScript().should.equal(true);
|
|
|
|
a.network().name.should.equal('livenet');
|
2014-06-24 08:36:32 -07:00
|
|
|
if (i > 1) {
|
|
|
|
w.getAddress(i - 1, isChange).toString().should
|
2014-09-23 11:24:57 -07:00
|
|
|
.not.equal(w.getAddress(i - 2, isChange).toString());
|
2014-04-04 15:59:00 -07:00
|
|
|
}
|
2014-04-04 11:57:28 -07:00
|
|
|
}
|
2014-06-24 10:40:03 -07:00
|
|
|
});
|
2014-04-04 11:57:28 -07:00
|
|
|
});
|
|
|
|
|
2014-11-11 14:10:42 -08:00
|
|
|
it('caches calls to getAddress', function() {
|
|
|
|
var setup = getCachedW();
|
|
|
|
var pubkeyring = setup.w;
|
|
|
|
|
2014-11-28 13:43:22 -08:00
|
|
|
var address = pubkeyring._getAddress(3, false, 4);
|
|
|
|
pubkeyring.cache.addressToPath[address].should.equal("m/45'/4/0/3");
|
2014-11-30 13:55:15 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
it('cach4es calls to getAddress (2)', function() {
|
|
|
|
var setup = getCachedW();
|
|
|
|
var pubkeyring = setup.w;
|
|
|
|
var address = pubkeyring.generateAddress(false, setup.pub);
|
2015-01-07 11:47:22 -08:00
|
|
|
_.indexOf(pubkeyring.getReceiveAddresses(), address).should.be.above(-1);
|
|
|
|
_.indexOf(pubkeyring.getAddresses(), address).should.be.above(-1);
|
2014-11-30 13:55:15 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('cach4es calls to getAddress (3)', function() {
|
|
|
|
var setup = getCachedW();
|
|
|
|
var pubkeyring = setup.w;
|
|
|
|
var address = pubkeyring.generateAddress(true, setup.pub);
|
2015-01-07 11:47:22 -08:00
|
|
|
_.indexOf(pubkeyring.getReceiveAddresses(), address).should.be.equal(-1);
|
|
|
|
_.indexOf(pubkeyring.getAddresses(), address).should.be.above(-1);
|
2014-11-11 14:10:42 -08:00
|
|
|
});
|
|
|
|
|
2014-11-28 13:43:22 -08:00
|
|
|
it('should generate one address by default', function() {
|
|
|
|
var k = createW();
|
|
|
|
var w = k.w;
|
|
|
|
var a = w.getAddresses();
|
|
|
|
a.length.should.equal(1);
|
2015-01-07 11:47:22 -08:00
|
|
|
var b = w.getAddressesOrdered();
|
|
|
|
b.length.should.equal(1);
|
2014-11-28 13:43:22 -08:00
|
|
|
});
|
2014-11-11 14:10:42 -08:00
|
|
|
|
2014-11-28 13:43:22 -08:00
|
|
|
it('should generate one address by default', function() {
|
|
|
|
var k = createW();
|
|
|
|
var w = k.w;
|
2014-11-11 14:10:42 -08:00
|
|
|
|
2014-11-28 13:43:22 -08:00
|
|
|
var a = w.getAddresses();
|
|
|
|
a.length.should.equal(1);
|
|
|
|
a = w.getAddresses();
|
|
|
|
a.length.should.equal(1);
|
2014-11-11 14:10:42 -08:00
|
|
|
});
|
2015-01-07 11:47:22 -08:00
|
|
|
|
2014-11-11 14:10:42 -08:00
|
|
|
|
2014-11-28 13:43:22 -08:00
|
|
|
it('should generate 4+1 addresses', function() {
|
2014-04-04 11:57:28 -07:00
|
|
|
var k = createW();
|
|
|
|
var w = k.w;
|
|
|
|
|
|
|
|
var a = w.getAddresses();
|
2014-07-31 12:13:27 -07:00
|
|
|
a.length.should.equal(1);
|
2014-04-04 11:57:28 -07:00
|
|
|
|
2014-08-04 05:43:46 -07:00
|
|
|
[true, false].forEach(function(isChange) {
|
2014-06-24 10:40:03 -07:00
|
|
|
for (var i = 0; i < 2; i++) {
|
2014-07-03 07:18:01 -07:00
|
|
|
w.generateAddress(isChange, k.pub);
|
2014-06-24 10:40:03 -07:00
|
|
|
}
|
|
|
|
});
|
2014-11-28 13:43:22 -08:00
|
|
|
});
|
2014-06-24 08:36:32 -07:00
|
|
|
|
2014-11-28 13:43:22 -08:00
|
|
|
it('should check isChange 4+1 addresses', function() {
|
|
|
|
var k = createW();
|
|
|
|
var w = k.w;
|
|
|
|
var a = w.getAddresses();
|
|
|
|
_.each(a, function(a, j) {
|
|
|
|
var addr = new bitcore.Address(a);
|
|
|
|
w.addressIsChange(a).should.equal([false, true, true, false, false][j]);
|
|
|
|
});
|
2014-04-04 11:57:28 -07:00
|
|
|
});
|
|
|
|
|
2014-07-31 12:13:27 -07:00
|
|
|
|
|
|
|
it('should start with one shared address', function() {
|
|
|
|
var k = createW();
|
|
|
|
var a = k.w.getAddresses();
|
|
|
|
a.length.should.equal(1);
|
|
|
|
});
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('should count generation indexes', function() {
|
2014-04-04 16:16:15 -07:00
|
|
|
var k = createW();
|
|
|
|
var w = k.w;
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 3; i++)
|
2014-09-23 11:24:57 -07:00
|
|
|
w.generateAddress(true, k.pub);
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 2; i++)
|
2014-09-23 11:24:57 -07:00
|
|
|
w.generateAddress(false, k.pub);
|
2014-04-04 16:16:15 -07:00
|
|
|
|
2014-07-29 09:09:47 -07:00
|
|
|
w.getHDParams(k.pub).getChangeIndex().should.equal(3);
|
|
|
|
w.getHDParams(k.pub).getReceiveIndex().should.equal(2);
|
2014-04-04 16:16:15 -07:00
|
|
|
});
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('#merge index tests', function() {
|
2014-04-07 07:46:45 -07:00
|
|
|
var k = createW();
|
|
|
|
var w = k.w;
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 2; i++)
|
2014-09-23 11:24:57 -07:00
|
|
|
w.generateAddress(true, k.pub);
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 3; i++)
|
2014-09-23 11:24:57 -07:00
|
|
|
w.generateAddress(false, k.pub);
|
2014-04-07 07:46:45 -07:00
|
|
|
|
|
|
|
var w2 = new PublicKeyRing({
|
2014-04-07 20:54:38 -07:00
|
|
|
networkName: 'livenet',
|
2014-04-15 08:17:28 -07:00
|
|
|
walletId: w.walletId,
|
2014-04-07 07:46:45 -07:00
|
|
|
});
|
2014-04-11 09:26:36 -07:00
|
|
|
w2.merge(w).should.equal(true);
|
2014-06-24 08:36:32 -07:00
|
|
|
w2.requiredCopayers.should.equal(3);
|
|
|
|
w2.totalCopayers.should.equal(5);
|
2014-07-29 09:09:47 -07:00
|
|
|
w2.getHDParams(k.pub).getChangeIndex().should.equal(2);
|
|
|
|
w2.getHDParams(k.pub).getReceiveIndex().should.equal(3);
|
2014-04-07 07:46:45 -07:00
|
|
|
|
2014-04-11 09:26:36 -07:00
|
|
|
w2.merge(w).should.equal(false);
|
2014-04-07 07:46:45 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('#merge check tests', function() {
|
2014-04-11 09:26:36 -07:00
|
|
|
var config = {
|
|
|
|
networkName: 'livenet',
|
|
|
|
};
|
2014-04-07 20:54:38 -07:00
|
|
|
|
2014-04-11 09:26:36 -07:00
|
|
|
var w = new PublicKeyRing(config);
|
2014-04-15 08:17:28 -07:00
|
|
|
w.walletId = 'lwjd5qra8257b9';
|
2014-04-07 20:54:38 -07:00
|
|
|
var w2 = new PublicKeyRing({
|
2014-06-24 08:36:32 -07:00
|
|
|
networkName: 'testnet', //wrong
|
2014-04-15 08:17:28 -07:00
|
|
|
walletId: w.walletId,
|
2014-04-07 20:54:38 -07:00
|
|
|
});
|
2014-06-24 08:36:32 -07:00
|
|
|
(function() {
|
|
|
|
w2.merge(w);
|
|
|
|
}).should.throw();
|
2014-04-07 20:54:38 -07:00
|
|
|
|
2014-04-07 07:46:45 -07:00
|
|
|
var w3 = new PublicKeyRing({
|
2014-04-07 20:54:38 -07:00
|
|
|
networkName: 'livenet',
|
2014-04-15 08:17:28 -07:00
|
|
|
walletId: w.walletId,
|
2014-06-24 08:36:32 -07:00
|
|
|
requiredCopayers: 2, // wrong
|
2014-04-07 07:46:45 -07:00
|
|
|
});
|
2014-06-24 08:36:32 -07:00
|
|
|
(function() {
|
|
|
|
w3.merge(w);
|
|
|
|
}).should.throw();
|
2014-04-07 07:46:45 -07:00
|
|
|
|
|
|
|
var w4 = new PublicKeyRing({
|
2014-04-07 20:54:38 -07:00
|
|
|
networkName: 'livenet',
|
2014-04-15 08:17:28 -07:00
|
|
|
walletId: w.walletId,
|
2014-06-24 08:36:32 -07:00
|
|
|
totalCopayers: 3, // wrong
|
2014-04-07 07:46:45 -07:00
|
|
|
});
|
2014-06-24 08:36:32 -07:00
|
|
|
(function() {
|
|
|
|
w4.merge(w);
|
|
|
|
}).should.throw();
|
2014-04-11 09:26:36 -07:00
|
|
|
|
2014-04-07 07:46:45 -07:00
|
|
|
|
|
|
|
var w6 = new PublicKeyRing({
|
2014-04-07 20:54:38 -07:00
|
|
|
networkName: 'livenet',
|
2014-04-07 07:46:45 -07:00
|
|
|
});
|
2014-06-24 08:36:32 -07:00
|
|
|
(function() {
|
|
|
|
w6.merge(w);
|
|
|
|
}).should.throw();
|
|
|
|
w.networkName = 'livenet';
|
|
|
|
(function() {
|
|
|
|
w6.merge(w);
|
|
|
|
}).should.throw();
|
2014-04-07 20:54:38 -07:00
|
|
|
|
|
|
|
|
2014-04-11 09:26:36 -07:00
|
|
|
var w0 = new PublicKeyRing({
|
|
|
|
networkName: 'livenet',
|
|
|
|
});
|
2014-08-04 05:43:46 -07:00
|
|
|
|
|
|
|
for (var i = 0; i < 5; i++)
|
2014-09-23 11:24:57 -07:00
|
|
|
w0.addCopayer(getNewEpk());
|
2014-08-04 05:43:46 -07:00
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
(function() {
|
|
|
|
w0.merge(w);
|
|
|
|
}).should.throw();
|
|
|
|
w.merge(w0, true).should.equal(true);
|
2014-04-11 09:26:36 -07:00
|
|
|
w.isComplete().should.equal(true);
|
|
|
|
|
|
|
|
var wx = new PublicKeyRing({
|
|
|
|
networkName: 'livenet',
|
|
|
|
});
|
2014-08-04 05:43:46 -07:00
|
|
|
wx.addCopayer(getNewEpk());
|
2014-06-24 08:36:32 -07:00
|
|
|
(function() {
|
|
|
|
w.merge(wx);
|
|
|
|
}).should.throw();
|
2014-04-07 07:46:45 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('#merge pubkey tests', function() {
|
2014-06-17 09:39:41 -07:00
|
|
|
var config = {
|
2014-06-24 08:36:32 -07:00
|
|
|
networkName: 'livenet',
|
2014-06-17 09:39:41 -07:00
|
|
|
};
|
2014-08-06 14:07:01 -07:00
|
|
|
var copayers;
|
2014-04-07 07:46:45 -07:00
|
|
|
var w = new PublicKeyRing(config);
|
|
|
|
should.exist(w);
|
2014-08-06 14:07:01 -07:00
|
|
|
copayers = [];
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 2; i++) {
|
2014-04-09 10:30:12 -07:00
|
|
|
w.isComplete().should.equal(false);
|
2014-08-04 05:43:46 -07:00
|
|
|
w.addCopayer(getNewEpk());
|
2014-04-07 07:46:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
var w2 = new PublicKeyRing({
|
2014-04-07 20:54:38 -07:00
|
|
|
networkName: 'livenet',
|
2014-04-07 07:46:45 -07:00
|
|
|
id: w.id,
|
|
|
|
});
|
|
|
|
should.exist(w);
|
2014-08-06 14:07:01 -07:00
|
|
|
copayers = [];
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 3; i++) {
|
2014-04-09 10:30:12 -07:00
|
|
|
w2.isComplete().should.equal(false);
|
2014-08-04 05:43:46 -07:00
|
|
|
w2.addCopayer(getNewEpk());
|
2014-04-07 07:46:45 -07:00
|
|
|
}
|
2014-04-11 09:26:36 -07:00
|
|
|
w2.merge(w).should.equal(true);
|
2014-04-09 10:30:12 -07:00
|
|
|
w2.isComplete().should.equal(true);
|
2014-04-11 09:26:36 -07:00
|
|
|
w2.merge(w).should.equal(false);
|
2014-04-07 07:46:45 -07:00
|
|
|
|
2014-04-09 10:30:12 -07:00
|
|
|
w.isComplete().should.equal(false);
|
2014-04-11 09:26:36 -07:00
|
|
|
w.merge(w2).should.equal(true);
|
2014-04-09 10:30:12 -07:00
|
|
|
w.isComplete().should.equal(true);
|
2014-04-11 09:26:36 -07:00
|
|
|
w.merge(w2).should.equal(false);
|
2014-04-07 07:46:45 -07:00
|
|
|
});
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('#merge pubkey tests (case 2)', function() {
|
2014-06-17 09:39:41 -07:00
|
|
|
var config = {
|
2014-06-24 08:36:32 -07:00
|
|
|
networkName: 'livenet',
|
2014-06-17 09:39:41 -07:00
|
|
|
};
|
2014-04-07 07:46:45 -07:00
|
|
|
var w = new PublicKeyRing(config);
|
|
|
|
should.exist(w);
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 5; i++) {
|
2014-04-09 10:30:12 -07:00
|
|
|
w.isComplete().should.equal(false);
|
2014-04-07 07:46:45 -07:00
|
|
|
var w2 = new PublicKeyRing({
|
2014-04-07 20:54:38 -07:00
|
|
|
networkName: 'livenet',
|
2014-04-07 07:46:45 -07:00
|
|
|
id: w.id,
|
|
|
|
});
|
2014-08-04 05:43:46 -07:00
|
|
|
w2.addCopayer(getNewEpk());
|
2014-04-11 09:26:36 -07:00
|
|
|
w.merge(w2).should.equal(true);
|
2014-04-07 07:46:45 -07:00
|
|
|
}
|
2014-04-09 10:30:12 -07:00
|
|
|
w.isComplete().should.equal(true);
|
2014-04-07 07:46:45 -07:00
|
|
|
});
|
2014-04-09 13:28:35 -07:00
|
|
|
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('#merge with nickname', function() {
|
2014-06-17 09:39:41 -07:00
|
|
|
var config = {
|
2014-06-24 08:36:32 -07:00
|
|
|
networkName: 'livenet',
|
2014-06-17 09:39:41 -07:00
|
|
|
};
|
2014-05-01 05:41:18 -07:00
|
|
|
var w = new PublicKeyRing(config);
|
|
|
|
should.exist(w);
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 3; i++) {
|
2014-08-04 05:43:46 -07:00
|
|
|
w.addCopayer(getNewEpk());
|
2014-05-01 05:41:18 -07:00
|
|
|
};
|
2014-06-24 08:36:32 -07:00
|
|
|
w._setNicknameForIndex(0, 'pepe0');
|
|
|
|
w._setNicknameForIndex(1, 'pepe1');
|
2014-05-01 05:41:18 -07:00
|
|
|
|
|
|
|
w.nicknameForIndex(0).should.equal('pepe0');
|
|
|
|
w.nicknameForIndex(1).should.equal('pepe1');
|
|
|
|
should.not.exist(w.nicknameForIndex(2));
|
|
|
|
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 2; i++) {
|
2014-05-01 05:41:18 -07:00
|
|
|
w.isComplete().should.equal(false);
|
|
|
|
var w2 = new PublicKeyRing({
|
|
|
|
networkName: 'livenet',
|
|
|
|
id: w.id,
|
|
|
|
});
|
2014-08-04 05:43:46 -07:00
|
|
|
w2.addCopayer(getNewEpk());
|
2014-06-24 08:36:32 -07:00
|
|
|
w2._setNicknameForIndex(0, 'juan' + i);
|
2014-05-01 05:41:18 -07:00
|
|
|
w.merge(w2).should.equal(true);
|
|
|
|
}
|
|
|
|
w.isComplete().should.equal(true);
|
|
|
|
|
|
|
|
w.nicknameForIndex(0).should.equal('pepe0');
|
|
|
|
w.nicknameForIndex(1).should.equal('pepe1');
|
|
|
|
should.not.exist(w.nicknameForIndex(2));
|
|
|
|
w.nicknameForIndex(3).should.equal('juan0');
|
|
|
|
w.nicknameForIndex(4).should.equal('juan1');
|
|
|
|
});
|
|
|
|
|
2014-08-26 13:01:41 -07:00
|
|
|
it('#fromObj with error', function() {
|
|
|
|
|
|
|
|
var config = {
|
|
|
|
networkName: 'livenet',
|
|
|
|
};
|
|
|
|
var pkr = new PublicKeyRing(config);
|
|
|
|
|
2014-09-23 11:24:57 -07:00
|
|
|
(function() {
|
2014-08-26 13:01:41 -07:00
|
|
|
PublicKeyRing.fromObj(pkr);
|
2014-11-28 13:43:22 -08:00
|
|
|
}).should.throw('format');
|
2014-08-26 13:01:41 -07:00
|
|
|
});
|
|
|
|
|
2014-05-01 05:41:18 -07:00
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('#toObj #fromObj with nickname', function() {
|
2014-06-17 09:39:41 -07:00
|
|
|
var config = {
|
2014-06-24 08:36:32 -07:00
|
|
|
networkName: 'livenet',
|
2014-06-17 09:39:41 -07:00
|
|
|
};
|
2014-05-01 05:41:18 -07:00
|
|
|
var w = new PublicKeyRing(config);
|
|
|
|
should.exist(w);
|
2014-06-24 08:36:32 -07:00
|
|
|
for (var i = 0; i < 3; i++) {
|
2014-08-04 05:43:46 -07:00
|
|
|
w.addCopayer(getNewEpk(), 'tito' + i);
|
2014-05-01 05:41:18 -07:00
|
|
|
};
|
|
|
|
w.nicknameForIndex(0).should.equal('tito0');
|
|
|
|
w.nicknameForIndex(1).should.equal('tito1');
|
|
|
|
w.nicknameForIndex(2).should.equal('tito2');
|
|
|
|
should.not.exist(w.nicknameForIndex(3));
|
|
|
|
|
|
|
|
var o = JSON.parse(JSON.stringify(w.toObj()));
|
2014-06-24 08:36:32 -07:00
|
|
|
var w2 = PublicKeyRing.fromObj(o);
|
2014-05-01 05:41:18 -07:00
|
|
|
w2.nicknameForIndex(0).should.equal('tito0');
|
|
|
|
w2.nicknameForIndex(1).should.equal('tito1');
|
|
|
|
w2.nicknameForIndex(2).should.equal('tito2');
|
|
|
|
should.not.exist(w2.nicknameForIndex(3));
|
|
|
|
});
|
|
|
|
|
|
|
|
|
2014-11-29 13:35:48 -08:00
|
|
|
it('#fromObj old backup ', function() {
|
|
|
|
var pkr = PublicKeyRing.fromObj(JSON.parse(obj));
|
|
|
|
should.exist(pkr);
|
|
|
|
pkr.isComplete().should.equal(true);
|
|
|
|
pkr.requiredCopayers.should.equal(2);
|
|
|
|
pkr.totalCopayers.should.equal(2);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('#fromObj #toObj rountrip', function() {
|
|
|
|
var obj2 = PublicKeyRing.fromObj(JSON.parse(obj)).toObj();
|
|
|
|
var pkr = PublicKeyRing.fromObj(obj2);
|
|
|
|
pkr.isComplete().should.equal(true);
|
|
|
|
pkr.requiredCopayers.should.equal(2);
|
|
|
|
pkr.totalCopayers.should.equal(2);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('#fromUntrustedObj #toObj rountrip', function() {
|
|
|
|
var obj2 = PublicKeyRing.fromUntrustedObj(JSON.parse(obj)).toObj();
|
|
|
|
var pkr = PublicKeyRing.fromUntrustedObj(obj2);
|
|
|
|
pkr.isComplete().should.equal(true);
|
|
|
|
pkr.requiredCopayers.should.equal(2);
|
|
|
|
pkr.totalCopayers.should.equal(2);
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-07-29 09:09:47 -07:00
|
|
|
it('#getHDParams should return the right one', function() {
|
2014-07-01 08:49:50 -07:00
|
|
|
var config = {
|
|
|
|
networkName: 'livenet',
|
|
|
|
};
|
|
|
|
var p = new PublicKeyRing(config);
|
2014-07-29 09:09:47 -07:00
|
|
|
var i = p.getHDParams(HDPath.SHARED_INDEX);
|
2014-07-01 08:49:50 -07:00
|
|
|
should.exist(i);
|
2014-07-29 07:23:58 -07:00
|
|
|
i.copayerIndex.should.equal(HDPath.SHARED_INDEX);
|
2014-07-01 08:49:50 -07:00
|
|
|
});
|
|
|
|
|
2014-07-29 09:09:47 -07:00
|
|
|
it('#getHDParams should throw error', function() {
|
2014-07-01 08:49:50 -07:00
|
|
|
var config = {
|
|
|
|
networkName: 'livenet',
|
|
|
|
};
|
|
|
|
var p = new PublicKeyRing(config);
|
|
|
|
|
|
|
|
(function badCosigner() {
|
2014-07-29 09:09:47 -07:00
|
|
|
return p.getHDParams(54);
|
2014-07-01 08:49:50 -07:00
|
|
|
}).should.throw();
|
|
|
|
});
|
|
|
|
|
2014-06-24 08:36:32 -07:00
|
|
|
it('#getRedeemScriptMap check tests', function() {
|
2014-08-04 05:43:46 -07:00
|
|
|
var k = getCachedW();
|
2014-04-09 13:28:35 -07:00
|
|
|
var w = k.w;
|
2014-06-24 09:17:22 -07:00
|
|
|
var amount = 2;
|
2014-04-09 13:28:35 -07:00
|
|
|
|
2014-06-24 09:17:22 -07:00
|
|
|
for (var i = 0; i < amount; i++)
|
2014-09-23 11:24:57 -07:00
|
|
|
w.generateAddress(true, k.pub);
|
2014-06-24 09:17:22 -07:00
|
|
|
for (var i = 0; i < amount; i++)
|
2014-09-23 11:24:57 -07:00
|
|
|
w.generateAddress(false, k.pub);
|
2014-04-09 13:28:35 -07:00
|
|
|
|
2014-06-24 09:17:22 -07:00
|
|
|
var m = w.getRedeemScriptMap([
|
|
|
|
'm/45\'/2147483647/1/0',
|
|
|
|
'm/45\'/2147483647/1/1',
|
|
|
|
'm/45\'/2147483647/0/0',
|
|
|
|
'm/45\'/2147483647/0/1'
|
|
|
|
]);
|
2014-04-17 11:04:39 -07:00
|
|
|
Object.keys(m).length.should.equal(4);
|
2014-06-24 08:36:32 -07:00
|
|
|
Object.keys(m).forEach(function(k) {
|
2014-04-09 13:28:35 -07:00
|
|
|
should.exist(m[k]);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2014-11-29 13:35:48 -08:00
|
|
|
it('#_getForPath should return 5 pubkeys', function() {
|
2014-07-30 07:59:07 -07:00
|
|
|
var w = getCachedW().w;
|
2014-11-29 13:35:48 -08:00
|
|
|
var pubkeys = w._getForPath('m/45\'/2147483647/1/0');
|
2014-07-30 07:59:07 -07:00
|
|
|
pubkeys.length.should.equal(5);
|
|
|
|
});
|
|
|
|
|
2014-11-29 13:35:48 -08:00
|
|
|
it('#_getForPaths should return 2 arrays of 5 pubkey ', function() {
|
2014-07-30 07:59:07 -07:00
|
|
|
var w = getCachedW().w;
|
2014-11-29 13:35:48 -08:00
|
|
|
var pubkeys = w._getForPaths(['m/45\'/2147483647/1/0', 'm/45\'/2147483647/1/1']);
|
2014-07-30 07:59:07 -07:00
|
|
|
pubkeys.length.should.equal(2);
|
|
|
|
pubkeys[0].length.should.equal(5);
|
|
|
|
pubkeys[1].length.should.equal(5);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('#forPaths should return copayers and pubkeys ', function() {
|
|
|
|
var w = getCachedW().w;
|
2014-08-04 05:43:46 -07:00
|
|
|
var ret = w.forPaths(['m/45\'/2147483647/1/0', 'm/45\'/2147483647/1/1']);
|
2014-07-30 07:59:07 -07:00
|
|
|
ret.copayerIds.length.should.equal(5);
|
|
|
|
ret.pubKeys.length.should.equal(2);
|
|
|
|
ret.pubKeys[0].length.should.equal(5);
|
|
|
|
ret.pubKeys[1].length.should.equal(5);
|
|
|
|
});
|
|
|
|
|
2015-01-07 13:25:36 -08:00
|
|
|
it('#myCopayerId should return first copayerId ', function() {
|
|
|
|
var w = getCachedW().w;
|
|
|
|
w.myCopayerId().should.be.equal(w.getCopayerId(0));
|
|
|
|
});
|
2014-11-29 13:35:48 -08:00
|
|
|
|
2015-01-27 13:04:46 -08:00
|
|
|
it('#_checkKeys should throw error is not complete', function() {
|
|
|
|
var config = {
|
|
|
|
networkName: 'livenet',
|
|
|
|
};
|
|
|
|
var w2 = new PublicKeyRing(config);
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
return w2._checkKeys();
|
|
|
|
}).should.throw('dont have required keys');
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2015-01-29 11:58:32 -08:00
|
|
|
it.skip('#pathForAddress', function() {
|
2015-01-27 13:04:46 -08:00
|
|
|
var k = getCachedW();
|
|
|
|
var w = k.w;
|
|
|
|
var addr = w.generateAddress(true, k.pub);
|
|
|
|
|
|
|
|
var path = w.pathForAddress(addr);
|
|
|
|
|
|
|
|
path.should.not.be.undefined;
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
return w.pathForAddress('abcd');
|
|
|
|
}).should.throw('find path for address');
|
|
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it('#copayersForPubkeys', function() {
|
|
|
|
var k = getCachedW();
|
|
|
|
var w = k.w;
|
|
|
|
var addr = w.generateAddress(true, k.pub);
|
|
|
|
var path = w.pathForAddress(addr);
|
|
|
|
var paths = [];
|
|
|
|
paths.push(path);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
return w.copayersForPubkeys(k.pub, paths);
|
|
|
|
}).should.throw('Pubkeys not identified');
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-11-29 13:35:48 -08:00
|
|
|
|
2014-04-04 11:57:28 -07:00
|
|
|
});
|
2014-11-29 13:35:48 -08:00
|
|
|
|
|
|
|
var obj = '{"walletId":"0a903a2eb33793d1","networkName":"testnet","requiredCopayers":2,"totalCopayers":2,"indexes":[{"copayerIndex":2147483647,"changeIndex":0,"receiveIndex":1},{"copayerIndex":0,"changeIndex":39,"receiveIndex":0},{"copayerIndex":1,"changeIndex":102,"receiveIndex":39}],"copayersExtPubKeys":["tpubD9peJo88ArhgmJNqRkQmhHt4zAGTYVowsHrDj385xyXyMy4RhWZpV5Qx2mMDUVzpbAD5V9jci5D7cZaHhjLYP8gEkngmTKtSF4Y7V3qkAsy","tpubD8udwzKWwNUgoE2WG7LYsXKf5m1eRtJ1Etp43vnoxViFmrmZ1ND2CkdqGyQtuidcN1CiqdBUvbKegbdsMQaj5VLY2hbA4LEnLDrqkgSzikz"],"nicknameFor":{"03338b105850c7126f1f5b0439b357765b17ead8eed15bcdfdbd28d0e3915b696f":"5@queparece","0286b376d65cc4af0de5932fb8299cbef2ca9ed37ec9fdb0edfd4e9cb74eac45da":"4@queparece"}}';
|