parent
161127d65a
commit
93fe1b4c78
25 changed files with 2092 additions and 2142 deletions
177
test/address.js
177
test/address.js
|
@ -1,4 +1,3 @@
|
|||
/* global describe, it */
|
||||
var assert = require('assert')
|
||||
var Address = require('../src/address.js')
|
||||
var network = require('../src/network.js')
|
||||
|
@ -7,105 +6,105 @@ var mainnet = network.mainnet.addressVersion
|
|||
var testnet = network.testnet.addressVersion
|
||||
|
||||
describe('Address', function() {
|
||||
var testnetAddress, mainnetAddress;
|
||||
var testnetP2shAddress, mainnetP2shAddress
|
||||
var testnetAddress, mainnetAddress
|
||||
var testnetP2shAddress, mainnetP2shAddress
|
||||
|
||||
beforeEach(function(){
|
||||
testnetAddress = 'mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef'
|
||||
mainnetAddress = '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'
|
||||
testnetP2shAddress = '2MxKEf2su6FGAUfCEAHreGFQvEYrfYNHvL7'
|
||||
mainnetP2shAddress = '3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt'
|
||||
beforeEach(function(){
|
||||
testnetAddress = 'mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef'
|
||||
mainnetAddress = '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'
|
||||
testnetP2shAddress = '2MxKEf2su6FGAUfCEAHreGFQvEYrfYNHvL7'
|
||||
mainnetP2shAddress = '3NJZLcZEEYBpxYEUGewU4knsQRn1WM5Fkt'
|
||||
})
|
||||
|
||||
describe('parsing', function() {
|
||||
it('works with Address object', function() {
|
||||
var addr = new Address(new Address('mwrB4fgT1KSBCqELaWv7o7tsExuQzW3NY3', network.testnet.addressVersion))
|
||||
|
||||
assert.equal(addr.toString(), 'mwrB4fgT1KSBCqELaWv7o7tsExuQzW3NY3')
|
||||
assert.equal(addr.version, network.testnet.addressVersion)
|
||||
})
|
||||
|
||||
describe('parsing', function() {
|
||||
it('works with Address object', function() {
|
||||
var addr = new Address(new Address('mwrB4fgT1KSBCqELaWv7o7tsExuQzW3NY3', network.testnet.addressVersion))
|
||||
|
||||
assert.equal(addr.toString(), 'mwrB4fgT1KSBCqELaWv7o7tsExuQzW3NY3')
|
||||
assert.equal(addr.version, network.testnet.addressVersion)
|
||||
})
|
||||
|
||||
it('works with hex', function() {
|
||||
var addr = new Address('13483382d3c3d43fc9d7b52e652b6bbb70e8b667')
|
||||
assert.equal(addr.toString(), '12kxLGqrnnchwN9bHHNV2fWDtJGwxKTcJS')
|
||||
})
|
||||
|
||||
it('throws error for invalid or unrecognized input', function() {
|
||||
assert.throws(function() {
|
||||
new Address('beepboopbeepboopbeepboopbeepboopbeepboopbeep')
|
||||
}, Error)
|
||||
})
|
||||
|
||||
it('works for byte input', function() {
|
||||
var hash = base58.checkDecode('1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa')
|
||||
var addr = new Address(hash)
|
||||
assert.equal(addr.hash, hash)
|
||||
assert.equal(network.mainnet.addressVersion, hash.version)
|
||||
|
||||
var hash = base58.checkDecode('mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef')
|
||||
var addr = new Address(hash)
|
||||
assert.equal(addr.hash, hash)
|
||||
assert.equal(network.testnet.addressVersion, hash.version)
|
||||
})
|
||||
|
||||
it('fails for bad input', function() {
|
||||
assert.throws(function() {
|
||||
new Address('foo')
|
||||
}, Error)
|
||||
})
|
||||
it('works with hex', function() {
|
||||
var addr = new Address('13483382d3c3d43fc9d7b52e652b6bbb70e8b667')
|
||||
assert.equal(addr.toString(), '12kxLGqrnnchwN9bHHNV2fWDtJGwxKTcJS')
|
||||
})
|
||||
|
||||
describe('getVersion', function() {
|
||||
it('returns the proper address version', function() {
|
||||
assert.equal(Address.getVersion('1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'), network.mainnet.addressVersion)
|
||||
assert.equal(Address.getVersion('mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef'), network.testnet.addressVersion)
|
||||
})
|
||||
it('throws error for invalid or unrecognized input', function() {
|
||||
assert.throws(function() {
|
||||
new Address('beepboopbeepboopbeepboopbeepboopbeepboopbeep')
|
||||
}, Error)
|
||||
})
|
||||
|
||||
describe('toString', function() {
|
||||
it('defaults to base58', function() {
|
||||
var addr = '18fN1QTGWmHWCA9r2dyDH6FbMEyc7XHmQQ';
|
||||
assert.equal((new Address(addr)).toString(), addr);
|
||||
})
|
||||
it('works for byte input', function() {
|
||||
var hash = base58.checkDecode('1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa')
|
||||
var addr = new Address(hash)
|
||||
assert.equal(addr.hash, hash)
|
||||
assert.equal(network.mainnet.addressVersion, hash.version)
|
||||
|
||||
var hash = base58.checkDecode('mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef')
|
||||
var addr = new Address(hash)
|
||||
assert.equal(addr.hash, hash)
|
||||
assert.equal(network.testnet.addressVersion, hash.version)
|
||||
})
|
||||
|
||||
describe('Constructor', function(){
|
||||
it('resolves version correctly', function(){
|
||||
assert.equal((new Address(testnetAddress)).version, testnet)
|
||||
assert.equal((new Address(mainnetAddress)).version, mainnet)
|
||||
assert.equal((new Address(testnetP2shAddress)).version, network.testnet.p2shVersion)
|
||||
assert.equal((new Address(mainnetP2shAddress)).version, network.mainnet.p2shVersion)
|
||||
})
|
||||
it('fails for bad input', function() {
|
||||
assert.throws(function() {
|
||||
new Address('foo')
|
||||
}, Error)
|
||||
})
|
||||
})
|
||||
|
||||
describe('getVersion', function() {
|
||||
it('returns the proper address version', function() {
|
||||
assert.equal(Address.getVersion('1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'), network.mainnet.addressVersion)
|
||||
assert.equal(Address.getVersion('mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhef'), network.testnet.addressVersion)
|
||||
})
|
||||
})
|
||||
|
||||
describe('toString', function() {
|
||||
it('defaults to base58', function() {
|
||||
var addr = '18fN1QTGWmHWCA9r2dyDH6FbMEyc7XHmQQ'
|
||||
assert.equal((new Address(addr)).toString(), addr)
|
||||
})
|
||||
})
|
||||
|
||||
describe('Constructor', function(){
|
||||
it('resolves version correctly', function(){
|
||||
assert.equal((new Address(testnetAddress)).version, testnet)
|
||||
assert.equal((new Address(mainnetAddress)).version, mainnet)
|
||||
assert.equal((new Address(testnetP2shAddress)).version, network.testnet.p2shVersion)
|
||||
assert.equal((new Address(mainnetP2shAddress)).version, network.mainnet.p2shVersion)
|
||||
})
|
||||
})
|
||||
|
||||
describe('validate', function() {
|
||||
it('validates known good addresses', function() {
|
||||
function validate(addr, expectedVersion) {
|
||||
assert.ok(Address.validate(addr))
|
||||
}
|
||||
|
||||
validate(testnetAddress)
|
||||
validate(mainnetAddress)
|
||||
validate('12KYrjTdVGjFMtaxERSk3gphreJ5US8aUP')
|
||||
validate('12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y')
|
||||
validate('1oNLrsHnBcR6dpaBpwz3LSwutbUNkNSjs')
|
||||
validate('1SQHtwR5oJRKLfiWQ2APsAd9miUc4k2ez')
|
||||
validate('116CGDLddrZhMrTwhCVJXtXQpxygTT1kHd')
|
||||
|
||||
// p2sh addresses
|
||||
validate(testnetP2shAddress)
|
||||
validate(mainnetP2shAddress)
|
||||
})
|
||||
|
||||
describe('validate', function() {
|
||||
it('validates known good addresses', function() {
|
||||
function validate(addr, expectedVersion) {
|
||||
assert.ok(Address.validate(addr));
|
||||
}
|
||||
it('does not validate illegal examples', function() {
|
||||
function invalid(addr) {
|
||||
assert.ok(!Address.validate(addr))
|
||||
}
|
||||
|
||||
validate(testnetAddress);
|
||||
validate(mainnetAddress);
|
||||
validate('12KYrjTdVGjFMtaxERSk3gphreJ5US8aUP');
|
||||
validate('12QeMLzSrB8XH8FvEzPMVoRxVAzTr5XM2y');
|
||||
validate('1oNLrsHnBcR6dpaBpwz3LSwutbUNkNSjs');
|
||||
validate('1SQHtwR5oJRKLfiWQ2APsAd9miUc4k2ez');
|
||||
validate('116CGDLddrZhMrTwhCVJXtXQpxygTT1kHd');
|
||||
|
||||
// p2sh addresses
|
||||
validate(testnetP2shAddress);
|
||||
validate(mainnetP2shAddress);
|
||||
})
|
||||
|
||||
it('does not validate illegal examples', function() {
|
||||
function invalid(addr) {
|
||||
assert.ok(!Address.validate(addr));
|
||||
}
|
||||
|
||||
invalid(''); //empty should be invalid
|
||||
invalid('%%@'); // invalid base58 string
|
||||
invalid('1A1zP1eP5QGefi2DzPTf2L5SLmv7DivfNz'); // bad address (doesn't checksum)
|
||||
invalid('mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhe'); // bad address (doesn't checksum)
|
||||
})
|
||||
invalid(''); //empty should be invalid
|
||||
invalid('%%@'); // invalid base58 string
|
||||
invalid('1A1zP1eP5QGefi2DzPTf2L5SLmv7DivfNz'); // bad address (doesn't checksum)
|
||||
invalid('mzBc4XEFSdzCDcTxAgf6EZXgsZWpztRhe'); // bad address (doesn't checksum)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
|
@ -1,49 +1,48 @@
|
|||
/* global describe, it */
|
||||
var assert = require('assert');
|
||||
var base58 = require('../').base58;
|
||||
var convert = require('../').convert;
|
||||
var assert = require('assert')
|
||||
var base58 = require('../').base58
|
||||
var convert = require('../').convert
|
||||
|
||||
describe('base58', function() {
|
||||
describe('decode', function() {
|
||||
it('validates known examples', function() {
|
||||
var enc = '5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ';
|
||||
var hex = '800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d507a5b8d';
|
||||
assert.deepEqual(base58.decode(enc), convert.hexToBytes(hex));
|
||||
})
|
||||
describe('decode', function() {
|
||||
it('validates known examples', function() {
|
||||
var enc = '5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ'
|
||||
var hex = '800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d507a5b8d'
|
||||
assert.deepEqual(base58.decode(enc), convert.hexToBytes(hex))
|
||||
})
|
||||
})
|
||||
|
||||
describe('encode', function() {
|
||||
it('handles known examples', function() {
|
||||
var enc = '5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ';
|
||||
var hex = '800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d507a5b8d';
|
||||
assert.equal(base58.encode(convert.hexToBytes(hex)), enc);
|
||||
})
|
||||
describe('encode', function() {
|
||||
it('handles known examples', function() {
|
||||
var enc = '5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ'
|
||||
var hex = '800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d507a5b8d'
|
||||
assert.equal(base58.encode(convert.hexToBytes(hex)), enc)
|
||||
})
|
||||
})
|
||||
|
||||
describe('checkEncode', function() {
|
||||
it('handles known examples', function() {
|
||||
var input = [
|
||||
171, 210, 178, 125, 2, 16, 86, 184, 248, 88, 235,
|
||||
163, 244, 160, 83, 156, 184, 186, 45, 167, 169, 164,
|
||||
67, 125, 163, 89, 106, 243, 207, 193, 149, 206
|
||||
]
|
||||
var vbyte = 239
|
||||
describe('checkEncode', function() {
|
||||
it('handles known examples', function() {
|
||||
var input = [
|
||||
171, 210, 178, 125, 2, 16, 86, 184, 248, 88, 235,
|
||||
163, 244, 160, 83, 156, 184, 186, 45, 167, 169, 164,
|
||||
67, 125, 163, 89, 106, 243, 207, 193, 149, 206
|
||||
]
|
||||
var vbyte = 239
|
||||
|
||||
assert.equal(base58.checkEncode(input, vbyte),
|
||||
'92tb9mjz6q9eKZjYvLsgk87kPrMoh7BGRumSzPeUGhmigtsfrbP');
|
||||
})
|
||||
assert.equal(base58.checkEncode(input, vbyte),
|
||||
'92tb9mjz6q9eKZjYvLsgk87kPrMoh7BGRumSzPeUGhmigtsfrbP')
|
||||
})
|
||||
})
|
||||
|
||||
describe('checkDecode', function() {
|
||||
it('handles known examples', function() {
|
||||
var input = '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'
|
||||
var expected = [
|
||||
98, 233, 7, 177, 92, 191, 39, 213, 66, 83,
|
||||
153, 235, 246, 240, 251, 80, 235, 184, 143, 24
|
||||
];
|
||||
expected.version = 0
|
||||
describe('checkDecode', function() {
|
||||
it('handles known examples', function() {
|
||||
var input = '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'
|
||||
var expected = [
|
||||
98, 233, 7, 177, 92, 191, 39, 213, 66, 83,
|
||||
153, 235, 246, 240, 251, 80, 235, 184, 143, 24
|
||||
]
|
||||
expected.version = 0
|
||||
|
||||
assert.deepEqual(base58.checkDecode(input), expected);
|
||||
})
|
||||
assert.deepEqual(base58.checkDecode(input), expected)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
263
test/convert.js
263
test/convert.js
|
@ -1,144 +1,143 @@
|
|||
/* global describe, it */
|
||||
var assert = require('assert');
|
||||
var convert = require('../src/convert.js');
|
||||
var assert = require('assert')
|
||||
var convert = require('../src/convert.js')
|
||||
|
||||
describe('convert', function() {
|
||||
describe('bytesToHex', function() {
|
||||
it('handles example 1', function() {
|
||||
assert.equal(convert.bytesToHex([0, 1, 2, 255]), '000102ff');
|
||||
})
|
||||
describe('bytesToHex', function() {
|
||||
it('handles example 1', function() {
|
||||
assert.equal(convert.bytesToHex([0, 1, 2, 255]), '000102ff')
|
||||
})
|
||||
})
|
||||
|
||||
describe('hexToBytes', function() {
|
||||
it('handles example 1', function() {
|
||||
assert.deepEqual(convert.hexToBytes('000102ff'), [0, 1, 2, 255])
|
||||
})
|
||||
})
|
||||
|
||||
it('converts from bytes to hex and back', function() {
|
||||
var bytes = []
|
||||
for (var i=0 ; i<256 ; ++i) {
|
||||
bytes.push(i)
|
||||
}
|
||||
|
||||
var hex = convert.bytesToHex(bytes)
|
||||
assert.equal(hex.length, 512)
|
||||
assert.deepEqual(convert.hexToBytes(hex), bytes)
|
||||
})
|
||||
|
||||
describe('bytesToBase64', function() {
|
||||
it('passes RFC4648 test vectors', function() {
|
||||
// Test vectors from:
|
||||
// http://tools.ietf.org/html/rfc4648#page-12
|
||||
|
||||
var b64 = function(s) {
|
||||
return convert.bytesToBase64(convert.stringToBytes(s))
|
||||
}
|
||||
|
||||
assert.equal(b64(''), '')
|
||||
assert.equal(b64('f'), 'Zg==')
|
||||
assert.equal(b64('fo'), 'Zm8=')
|
||||
assert.equal(b64('foo'), 'Zm9v')
|
||||
assert.equal(b64('foob'), 'Zm9vYg==')
|
||||
assert.equal(b64('fooba'), 'Zm9vYmE=')
|
||||
assert.equal(b64('foobar'), 'Zm9vYmFy')
|
||||
})
|
||||
})
|
||||
|
||||
describe('byte array and word array conversions', function(){
|
||||
var bytes, wordArray
|
||||
|
||||
beforeEach(function(){
|
||||
bytes = [
|
||||
98, 233, 7, 177, 92, 191, 39, 213, 66, 83,
|
||||
153, 235, 246, 240, 251, 80, 235, 184, 143, 24
|
||||
]
|
||||
wordArray = {
|
||||
words: [1659439025, 1556031445, 1112775147, -151979184, -340226280],
|
||||
sigBytes: 20
|
||||
}
|
||||
})
|
||||
|
||||
describe('hexToBytes', function() {
|
||||
it('handles example 1', function() {
|
||||
assert.deepEqual(convert.hexToBytes('000102ff'), [0, 1, 2, 255]);
|
||||
})
|
||||
})
|
||||
|
||||
it('converts from bytes to hex and back', function() {
|
||||
var bytes = [];
|
||||
for (var i=0 ; i<256 ; ++i) {
|
||||
bytes.push(i);
|
||||
}
|
||||
|
||||
var hex = convert.bytesToHex(bytes);
|
||||
assert.equal(hex.length, 512);
|
||||
assert.deepEqual(convert.hexToBytes(hex), bytes);
|
||||
})
|
||||
|
||||
describe('bytesToBase64', function() {
|
||||
it('passes RFC4648 test vectors', function() {
|
||||
// Test vectors from:
|
||||
// http://tools.ietf.org/html/rfc4648#page-12
|
||||
|
||||
var b64 = function(s) {
|
||||
return convert.bytesToBase64(convert.stringToBytes(s))
|
||||
}
|
||||
|
||||
assert.equal(b64(''), '')
|
||||
assert.equal(b64('f'), 'Zg==')
|
||||
assert.equal(b64('fo'), 'Zm8=')
|
||||
assert.equal(b64('foo'), 'Zm9v')
|
||||
assert.equal(b64('foob'), 'Zm9vYg==')
|
||||
assert.equal(b64('fooba'), 'Zm9vYmE=')
|
||||
assert.equal(b64('foobar'), 'Zm9vYmFy')
|
||||
})
|
||||
})
|
||||
|
||||
describe('byte array and word array conversions', function(){
|
||||
var bytes, wordArray;
|
||||
|
||||
beforeEach(function(){
|
||||
bytes = [
|
||||
98, 233, 7, 177, 92, 191, 39, 213, 66, 83,
|
||||
153, 235, 246, 240, 251, 80, 235, 184, 143, 24
|
||||
]
|
||||
wordArray = {
|
||||
words: [1659439025, 1556031445, 1112775147, -151979184, -340226280],
|
||||
sigBytes: 20
|
||||
}
|
||||
})
|
||||
|
||||
describe('bytesToWords', function() {
|
||||
it('works', function() {
|
||||
assert.deepEqual(convert.bytesToWordArray(bytes), wordArray)
|
||||
})
|
||||
})
|
||||
|
||||
describe('bytesToWords', function() {
|
||||
it('works', function() {
|
||||
assert.deepEqual(convert.wordArrayToBytes(wordArray), bytes)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('numToVarInt', function() {
|
||||
describe('works', function() {
|
||||
var data = [
|
||||
0, 128, 252, // 8-bit
|
||||
256, 512, 1024, // 16-bit
|
||||
65541, // 32-bit
|
||||
4294967299, // 64-bit
|
||||
]
|
||||
var expected = [
|
||||
[0], [128], [252], // 8-bit
|
||||
[253, 0, 1], [253, 0, 2], [253, 0, 4], // 16-bit
|
||||
[254, 5, 0, 1, 0], // 32-bit
|
||||
[255, 3, 0, 0, 0, 1, 0, 0, 0] // 64-bit
|
||||
]
|
||||
|
||||
for (var i = 0; i < data.length; ++i) {
|
||||
var actual = convert.numToVarInt(data[i])
|
||||
assert.deepEqual(actual, expected[i])
|
||||
}
|
||||
describe('bytesToWords', function() {
|
||||
it('works', function() {
|
||||
assert.deepEqual(convert.bytesToWordArray(bytes), wordArray)
|
||||
})
|
||||
})
|
||||
|
||||
describe('varIntToNum', function() {
|
||||
it('works on valid input', function() {
|
||||
var data = [
|
||||
[0], [128], [252], // 8-bit
|
||||
[253, 0, 1], [253, 0, 2], [253, 0, 4], // 16-bit
|
||||
[254, 5, 0, 1, 0], // 32-bit
|
||||
[255, 3, 0, 0, 0, 1, 0, 0, 0] // 64-bit
|
||||
]
|
||||
var expected = [
|
||||
0, 128, 252, // 8-bit
|
||||
256, 512, 1024, // 16-bit
|
||||
65541, // 32-bit
|
||||
4294967299, // 64-bit
|
||||
]
|
||||
|
||||
for (var i = 0; i < data.length; ++i) {
|
||||
var actual = convert.varIntToNum(data[i])
|
||||
assert.equal(actual.number, expected[i])
|
||||
assert.deepEqual(actual.bytes, data[i])
|
||||
}
|
||||
})
|
||||
|
||||
it('uses only what is necessary', function() {
|
||||
var data = [
|
||||
[0, 99],
|
||||
[253, 0, 1, 99],
|
||||
[254, 5, 0, 1, 0, 99],
|
||||
[255, 3, 0, 0, 0, 1, 0, 0, 0, 99]
|
||||
]
|
||||
var expected = [0, 256, 65541, 4294967299]
|
||||
|
||||
for (var i = 0; i < data.length; ++i) {
|
||||
var actual = convert.varIntToNum(data[i])
|
||||
assert.equal(actual.number, expected[i])
|
||||
assert.deepEqual(actual.bytes, data[i].slice(0, -1))
|
||||
}
|
||||
describe('bytesToWords', function() {
|
||||
it('works', function() {
|
||||
assert.deepEqual(convert.wordArrayToBytes(wordArray), bytes)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('reverseEndian', function() {
|
||||
it('works', function() {
|
||||
var bigEndian = "6a4062273ac4f9ea4ffca52d9fd102b08f6c32faa0a4d1318e3a7b2e437bb9c7"
|
||||
var littleEdian = "c7b97b432e7b3a8e31d1a4a0fa326c8fb002d19f2da5fc4feaf9c43a2762406a"
|
||||
assert.deepEqual(convert.reverseEndian(bigEndian), littleEdian)
|
||||
assert.deepEqual(convert.reverseEndian(littleEdian), bigEndian)
|
||||
})
|
||||
describe('numToVarInt', function() {
|
||||
describe('works', function() {
|
||||
var data = [
|
||||
0, 128, 252, // 8-bit
|
||||
256, 512, 1024, // 16-bit
|
||||
65541, // 32-bit
|
||||
4294967299, // 64-bit
|
||||
]
|
||||
var expected = [
|
||||
[0], [128], [252], // 8-bit
|
||||
[253, 0, 1], [253, 0, 2], [253, 0, 4], // 16-bit
|
||||
[254, 5, 0, 1, 0], // 32-bit
|
||||
[255, 3, 0, 0, 0, 1, 0, 0, 0] // 64-bit
|
||||
]
|
||||
|
||||
for (var i = 0; i < data.length; ++i) {
|
||||
var actual = convert.numToVarInt(data[i])
|
||||
assert.deepEqual(actual, expected[i])
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
describe('varIntToNum', function() {
|
||||
it('works on valid input', function() {
|
||||
var data = [
|
||||
[0], [128], [252], // 8-bit
|
||||
[253, 0, 1], [253, 0, 2], [253, 0, 4], // 16-bit
|
||||
[254, 5, 0, 1, 0], // 32-bit
|
||||
[255, 3, 0, 0, 0, 1, 0, 0, 0] // 64-bit
|
||||
]
|
||||
var expected = [
|
||||
0, 128, 252, // 8-bit
|
||||
256, 512, 1024, // 16-bit
|
||||
65541, // 32-bit
|
||||
4294967299, // 64-bit
|
||||
]
|
||||
|
||||
for (var i = 0; i < data.length; ++i) {
|
||||
var actual = convert.varIntToNum(data[i])
|
||||
assert.equal(actual.number, expected[i])
|
||||
assert.deepEqual(actual.bytes, data[i])
|
||||
}
|
||||
})
|
||||
|
||||
it('uses only what is necessary', function() {
|
||||
var data = [
|
||||
[0, 99],
|
||||
[253, 0, 1, 99],
|
||||
[254, 5, 0, 1, 0, 99],
|
||||
[255, 3, 0, 0, 0, 1, 0, 0, 0, 99]
|
||||
]
|
||||
var expected = [0, 256, 65541, 4294967299]
|
||||
|
||||
for (var i = 0; i < data.length; ++i) {
|
||||
var actual = convert.varIntToNum(data[i])
|
||||
assert.equal(actual.number, expected[i])
|
||||
assert.deepEqual(actual.bytes, data[i].slice(0, -1))
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
describe('reverseEndian', function() {
|
||||
it('works', function() {
|
||||
var bigEndian = "6a4062273ac4f9ea4ffca52d9fd102b08f6c32faa0a4d1318e3a7b2e437bb9c7"
|
||||
var littleEdian = "c7b97b432e7b3a8e31d1a4a0fa326c8fb002d19f2da5fc4feaf9c43a2762406a"
|
||||
assert.deepEqual(convert.reverseEndian(bigEndian), littleEdian)
|
||||
assert.deepEqual(convert.reverseEndian(littleEdian), bigEndian)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
31
test/ec.js
31
test/ec.js
|
@ -1,23 +1,22 @@
|
|||
/* global describe, it */
|
||||
var assert = require('assert');
|
||||
var sec = require('../src/jsbn/sec');
|
||||
var ecdsa = require('../').ecdsa;
|
||||
var assert = require('assert')
|
||||
var sec = require('../src/jsbn/sec')
|
||||
var ecdsa = require('../').ecdsa
|
||||
|
||||
var ecparams = sec('secp256k1');
|
||||
var ecparams = sec('secp256k1')
|
||||
|
||||
describe('ecdsa', function() {
|
||||
it('handles point multiplication', function() {
|
||||
var G = ecparams.getG();
|
||||
var n = ecparams.getN();
|
||||
it('handles point multiplication', function() {
|
||||
var G = ecparams.getG()
|
||||
var n = ecparams.getN()
|
||||
|
||||
assert.ok(G.multiply(n).isInfinity(), "Gn is infinite");
|
||||
assert.ok(G.multiply(n).isInfinity(), "Gn is infinite")
|
||||
|
||||
var k = ecdsa.getBigRandom(n);
|
||||
var P = G.multiply(k);
|
||||
assert.ok(!P.isInfinity(), "kG is not infinite");
|
||||
assert.ok(P.isOnCurve(), "kG on curve");
|
||||
assert.ok(P.multiply(n).isInfinity(), "kGn is infinite");
|
||||
var k = ecdsa.getBigRandom(n)
|
||||
var P = G.multiply(k)
|
||||
assert.ok(!P.isInfinity(), "kG is not infinite")
|
||||
assert.ok(P.isOnCurve(), "kG on curve")
|
||||
assert.ok(P.multiply(n).isInfinity(), "kGn is infinite")
|
||||
|
||||
assert.ok(P.validate(), "kG validates as a public key");
|
||||
})
|
||||
assert.ok(P.validate(), "kG validates as a public key")
|
||||
})
|
||||
})
|
||||
|
|
351
test/eckey.js
351
test/eckey.js
|
@ -1,190 +1,187 @@
|
|||
/* global describe, it */
|
||||
var assert = require('assert');
|
||||
|
||||
var ECKey = require('../src/eckey.js').ECKey;
|
||||
var ECPubKey = require('../src/eckey.js').ECPubKey;
|
||||
|
||||
var convert = require('../src/convert.js');
|
||||
var bytesToHex = convert.bytesToHex;
|
||||
var hexToBytes = convert.hexToBytes;
|
||||
var Address = require('../src/address');
|
||||
var assert = require('assert')
|
||||
var ECKey = require('../src/eckey.js').ECKey
|
||||
var ECPubKey = require('../src/eckey.js').ECPubKey
|
||||
var convert = require('../src/convert.js')
|
||||
var bytesToHex = convert.bytesToHex
|
||||
var hexToBytes = convert.hexToBytes
|
||||
var Address = require('../src/address')
|
||||
var Network = require('../src/network')
|
||||
var testnet = Network.testnet.addressVersion
|
||||
|
||||
describe('ECKey', function() {
|
||||
describe('constructor', function() {
|
||||
it('parses hex', function() {
|
||||
var priv = '18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725';
|
||||
var pub = '0450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b235' +
|
||||
'22cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6';
|
||||
var key = new ECKey(priv);
|
||||
describe('constructor', function() {
|
||||
it('parses hex', function() {
|
||||
var priv = '18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725'
|
||||
var pub = '0450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b235' +
|
||||
'22cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6'
|
||||
var key = new ECKey(priv)
|
||||
|
||||
assert.equal(key.getPub().toHex(), pub);
|
||||
assert.equal(key.compressed, false);
|
||||
})
|
||||
|
||||
it('parses base64', function() {
|
||||
var priv = 'VYdB+iv47y5FaUVIPdQInkgATrABeuD1lACUoM4x7tU=';
|
||||
var pub = '042f43c16c08849fed20a35bb7b1947bbf0923c52d613ee13b5c665a1e10d24b2' +
|
||||
'8be909a70f5f87c1adb79fbcd1b3f17d20aa91c04fc355112dba2ce9b1cbf013b';
|
||||
var key = new ECKey(priv);
|
||||
|
||||
assert.equal(key.getPub().toHex(), pub);
|
||||
assert.equal(key.compressed, false);
|
||||
})
|
||||
|
||||
it('parses WIF', function() {
|
||||
var priv = '5HwoXVkHoRM8sL2KmNRS217n1g8mPPBomrY7yehCuXC1115WWsh';
|
||||
var pub = '044f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0' +
|
||||
'f0b704075871aa385b6b1b8ead809ca67454d9683fcf2ba03456d6fe2c4abe2b07f0fbdbb2f1c1';
|
||||
var addr = '1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a';
|
||||
var key = new ECKey(priv);
|
||||
|
||||
assert.equal(key.compressed, false);
|
||||
assert.equal(key.getPub().toHex(), pub);
|
||||
assert.equal(key.getAddress().toString(), addr);
|
||||
})
|
||||
|
||||
it('parses compressed WIF', function() {
|
||||
var priv = 'KwntMbt59tTsj8xqpqYqRRWufyjGunvhSyeMo3NTYpFYzZbXJ5Hp';
|
||||
var pub = '034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa'
|
||||
var addr = '1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9';
|
||||
var key = new ECKey(priv);
|
||||
|
||||
assert.equal(key.compressed, true);
|
||||
assert.equal(key.getPub().toHex(), pub);
|
||||
assert.equal(key.getAddress().toString(), addr);
|
||||
})
|
||||
|
||||
it('alternative constructor syntax', function() {
|
||||
var priv = 'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458';
|
||||
var pub = '044b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea81199' +
|
||||
'283fbec990dad6fb98f93f712d50cb874dd717de6a184158d63886dda3090f566';
|
||||
var key = ECKey(priv, false);
|
||||
|
||||
assert.equal(key.getPub().toHex(), pub);
|
||||
assert.equal(key.compressed, false);
|
||||
assert.equal(key.toHex(), priv);
|
||||
})
|
||||
assert.equal(key.getPub().toHex(), pub)
|
||||
assert.equal(key.compressed, false)
|
||||
})
|
||||
|
||||
describe('toAddress', function() {
|
||||
var privkeys = [
|
||||
'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458',
|
||||
'1111111111111111111111111111111111111111111111111111111111111111',
|
||||
'18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725'
|
||||
];
|
||||
it('parses base64', function() {
|
||||
var priv = 'VYdB+iv47y5FaUVIPdQInkgATrABeuD1lACUoM4x7tU='
|
||||
var pub = '042f43c16c08849fed20a35bb7b1947bbf0923c52d613ee13b5c665a1e10d24b2' +
|
||||
'8be909a70f5f87c1adb79fbcd1b3f17d20aa91c04fc355112dba2ce9b1cbf013b'
|
||||
var key = new ECKey(priv)
|
||||
|
||||
// compressed pubkeys
|
||||
var cpubkeys = [
|
||||
'024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992',
|
||||
'034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa',
|
||||
'0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352'
|
||||
];
|
||||
|
||||
var pubkeys = cpubkeys.map(function(x) {
|
||||
return ECPubKey(x).toHex(false)
|
||||
});
|
||||
|
||||
it('mainnet', function() {
|
||||
var addresses = [
|
||||
'19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui',
|
||||
'1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a',
|
||||
'16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM'
|
||||
];
|
||||
var compressedAddresses = [
|
||||
'1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q',
|
||||
'1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9',
|
||||
'1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs',
|
||||
];
|
||||
|
||||
for (var i = 0; i < addresses.length; ++i) {
|
||||
var priv = new ECKey(privkeys[i], false);
|
||||
var pub = new ECPubKey(pubkeys[i], false);
|
||||
var cpub = new ECPubKey(cpubkeys[i], true);
|
||||
|
||||
var addr = addresses[i];
|
||||
var caddr = compressedAddresses[i];
|
||||
|
||||
assert.equal(priv.getAddress().toString(), addr);
|
||||
assert.equal(pub.getAddress().toString(), addr);
|
||||
assert.equal(cpub.getAddress().toString(), caddr);
|
||||
}
|
||||
})
|
||||
|
||||
it('testnet', function() {
|
||||
var addresses = [
|
||||
'19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui',
|
||||
'1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a',
|
||||
'16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM'
|
||||
];
|
||||
var compressedAddresses = [
|
||||
'1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q',
|
||||
'1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9',
|
||||
'1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs',
|
||||
];
|
||||
|
||||
for (var i = 0; i < addresses.length; ++i) {
|
||||
var priv = new ECKey(privkeys[i], false);
|
||||
var pub = new ECPubKey(pubkeys[i], false);
|
||||
var cpub = new ECPubKey(cpubkeys[i], true);
|
||||
|
||||
var addr = addresses[i];
|
||||
var caddr = compressedAddresses[i];
|
||||
|
||||
assert.equal(priv.getAddress().toString(), addr);
|
||||
assert.equal(pub.getAddress().toString(), addr);
|
||||
assert.equal(cpub.getAddress().toString(), caddr);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
describe('signing', function() {
|
||||
var hpriv = 'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458'
|
||||
var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992'
|
||||
var message = 'Vires in numeris'
|
||||
|
||||
it('should verify against the private key', function() {
|
||||
var priv = new ECKey(hpriv)
|
||||
var signature = priv.sign(message)
|
||||
|
||||
assert(priv.verify(message, signature))
|
||||
})
|
||||
|
||||
it('should verify against the public key', function() {
|
||||
var priv = new ECKey(hpriv)
|
||||
var pub = new ECPubKey(hcpub, true)
|
||||
var signature = priv.sign(message)
|
||||
|
||||
assert(pub.verify(message, signature))
|
||||
})
|
||||
|
||||
it('should not verify against the wrong private key', function() {
|
||||
var priv1 = new ECKey(hpriv)
|
||||
var priv2 = new ECKey('1111111111111111111111111111111111111111111111111111111111111111')
|
||||
|
||||
var signature = priv1.sign(message)
|
||||
|
||||
assert(!priv2.verify(message, signature))
|
||||
})
|
||||
assert.equal(key.getPub().toHex(), pub)
|
||||
assert.equal(key.compressed, false)
|
||||
})
|
||||
|
||||
describe('output of ECPubKey', function() {
|
||||
var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992'
|
||||
var hpub = '044b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea81199283fbec990dad6fb98f93f712d50cb874dd717de6a184158d63886dda3090f566'
|
||||
it('parses WIF', function() {
|
||||
var priv = '5HwoXVkHoRM8sL2KmNRS217n1g8mPPBomrY7yehCuXC1115WWsh'
|
||||
var pub = '044f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0' +
|
||||
'f0b704075871aa385b6b1b8ead809ca67454d9683fcf2ba03456d6fe2c4abe2b07f0fbdbb2f1c1'
|
||||
var addr = '1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a'
|
||||
var key = new ECKey(priv)
|
||||
|
||||
it('using toHex should support compression', function() {
|
||||
var pub = new ECPubKey(hpub)
|
||||
|
||||
assert.equal(pub.toHex(true), hcpub)
|
||||
assert.equal(pub.toHex(false), hpub)
|
||||
})
|
||||
|
||||
it('using toBytes should support compression', function() {
|
||||
var pub = new ECPubKey(hpub)
|
||||
|
||||
assert.equal(bytesToHex(pub.toBytes(true)), hcpub)
|
||||
assert.equal(bytesToHex(pub.toBytes(false)), hpub)
|
||||
})
|
||||
assert.equal(key.compressed, false)
|
||||
assert.equal(key.getPub().toHex(), pub)
|
||||
assert.equal(key.getAddress().toString(), addr)
|
||||
})
|
||||
|
||||
it('parses compressed WIF', function() {
|
||||
var priv = 'KwntMbt59tTsj8xqpqYqRRWufyjGunvhSyeMo3NTYpFYzZbXJ5Hp'
|
||||
var pub = '034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa'
|
||||
var addr = '1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9'
|
||||
var key = new ECKey(priv)
|
||||
|
||||
assert.equal(key.compressed, true)
|
||||
assert.equal(key.getPub().toHex(), pub)
|
||||
assert.equal(key.getAddress().toString(), addr)
|
||||
})
|
||||
|
||||
it('alternative constructor syntax', function() {
|
||||
var priv = 'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458'
|
||||
var pub = '044b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea81199' +
|
||||
'283fbec990dad6fb98f93f712d50cb874dd717de6a184158d63886dda3090f566'
|
||||
var key = ECKey(priv, false)
|
||||
|
||||
assert.equal(key.getPub().toHex(), pub)
|
||||
assert.equal(key.compressed, false)
|
||||
assert.equal(key.toHex(), priv)
|
||||
})
|
||||
})
|
||||
|
||||
describe('toAddress', function() {
|
||||
var privkeys = [
|
||||
'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458',
|
||||
'1111111111111111111111111111111111111111111111111111111111111111',
|
||||
'18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725'
|
||||
]
|
||||
|
||||
// compressed pubkeys
|
||||
var cpubkeys = [
|
||||
'024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992',
|
||||
'034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa',
|
||||
'0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352'
|
||||
]
|
||||
|
||||
var pubkeys = cpubkeys.map(function(x) {
|
||||
return ECPubKey(x).toHex(false)
|
||||
})
|
||||
|
||||
it('mainnet', function() {
|
||||
var addresses = [
|
||||
'19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui',
|
||||
'1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a',
|
||||
'16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM'
|
||||
]
|
||||
var compressedAddresses = [
|
||||
'1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q',
|
||||
'1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9',
|
||||
'1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs',
|
||||
]
|
||||
|
||||
for (var i = 0; i < addresses.length; ++i) {
|
||||
var priv = new ECKey(privkeys[i], false)
|
||||
var pub = new ECPubKey(pubkeys[i], false)
|
||||
var cpub = new ECPubKey(cpubkeys[i], true)
|
||||
|
||||
var addr = addresses[i]
|
||||
var caddr = compressedAddresses[i]
|
||||
|
||||
assert.equal(priv.getAddress().toString(), addr)
|
||||
assert.equal(pub.getAddress().toString(), addr)
|
||||
assert.equal(cpub.getAddress().toString(), caddr)
|
||||
}
|
||||
})
|
||||
|
||||
it('testnet', function() {
|
||||
var addresses = [
|
||||
'19SgmoUj4xowEjwtXvNAtYTAgbvR9iBCui',
|
||||
'1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a',
|
||||
'16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM'
|
||||
]
|
||||
var compressedAddresses = [
|
||||
'1AA4sjKW2aUmbtN3MtegdvhYtDBbDEke1q',
|
||||
'1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9',
|
||||
'1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs',
|
||||
]
|
||||
|
||||
for (var i = 0; i < addresses.length; ++i) {
|
||||
var priv = new ECKey(privkeys[i], false)
|
||||
var pub = new ECPubKey(pubkeys[i], false)
|
||||
var cpub = new ECPubKey(cpubkeys[i], true)
|
||||
|
||||
var addr = addresses[i]
|
||||
var caddr = compressedAddresses[i]
|
||||
|
||||
assert.equal(priv.getAddress().toString(), addr)
|
||||
assert.equal(pub.getAddress().toString(), addr)
|
||||
assert.equal(cpub.getAddress().toString(), caddr)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
describe('signing', function() {
|
||||
var hpriv = 'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458'
|
||||
var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992'
|
||||
var message = 'Vires in numeris'
|
||||
|
||||
it('should verify against the private key', function() {
|
||||
var priv = new ECKey(hpriv)
|
||||
var signature = priv.sign(message)
|
||||
|
||||
assert(priv.verify(message, signature))
|
||||
})
|
||||
|
||||
it('should verify against the public key', function() {
|
||||
var priv = new ECKey(hpriv)
|
||||
var pub = new ECPubKey(hcpub, true)
|
||||
var signature = priv.sign(message)
|
||||
|
||||
assert(pub.verify(message, signature))
|
||||
})
|
||||
|
||||
it('should not verify against the wrong private key', function() {
|
||||
var priv1 = new ECKey(hpriv)
|
||||
var priv2 = new ECKey('1111111111111111111111111111111111111111111111111111111111111111')
|
||||
|
||||
var signature = priv1.sign(message)
|
||||
|
||||
assert(!priv2.verify(message, signature))
|
||||
})
|
||||
})
|
||||
|
||||
describe('output of ECPubKey', function() {
|
||||
var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992'
|
||||
var hpub = '044b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea81199283fbec990dad6fb98f93f712d50cb874dd717de6a184158d63886dda3090f566'
|
||||
|
||||
it('using toHex should support compression', function() {
|
||||
var pub = new ECPubKey(hpub)
|
||||
|
||||
assert.equal(pub.toHex(true), hcpub)
|
||||
assert.equal(pub.toHex(false), hpub)
|
||||
})
|
||||
|
||||
it('using toBytes should support compression', function() {
|
||||
var pub = new ECPubKey(hpub)
|
||||
|
||||
assert.equal(bytesToHex(pub.toBytes(true)), hcpub)
|
||||
assert.equal(bytesToHex(pub.toBytes(false)), hpub)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
469
test/hdwallet.js
469
test/hdwallet.js
|
@ -1,4 +1,3 @@
|
|||
/* global describe, it */
|
||||
var HDWallet = require('../src/hdwallet.js')
|
||||
var assert = require('assert')
|
||||
var convert = require('../src/convert.js')
|
||||
|
@ -9,251 +8,251 @@ var testnet = Network.testnet.addressVersion
|
|||
var b2h = convert.bytesToHex
|
||||
|
||||
describe('HDWallet', function() {
|
||||
describe('toBase58', function() {
|
||||
it('reproduces input', function() {
|
||||
var input = 'xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5'
|
||||
, output = HDWallet.fromBase58(input).toBase58(false)
|
||||
assert.equal(output, input)
|
||||
describe('toBase58', function() {
|
||||
it('reproduces input', function() {
|
||||
var input = 'xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5'
|
||||
var output = HDWallet.fromBase58(input).toBase58(false)
|
||||
assert.equal(output, input)
|
||||
|
||||
input = 'xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334'
|
||||
output = HDWallet.fromBase58(input).toBase58(true)
|
||||
assert.equal(output, input)
|
||||
})
|
||||
|
||||
it('fails with priv=true when theres no private key', function() {
|
||||
var hd = HDWallet.fromBase58('xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon')
|
||||
try {
|
||||
hd.toBase58(true)
|
||||
} catch(e) {
|
||||
assert(e.message.match(/private key/i))
|
||||
return
|
||||
}
|
||||
assert.fail()
|
||||
})
|
||||
input = 'xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334'
|
||||
output = HDWallet.fromBase58(input).toBase58(true)
|
||||
assert.equal(output, input)
|
||||
})
|
||||
|
||||
describe('constructor & seed deserialization', function() {
|
||||
var expectedPrivateKey = '0fd71c652e847ba7ea7956e3cf3fc0a0985871846b1b2c23b9c6a29a38cee86001';
|
||||
var seed = [
|
||||
99, 114, 97, 122, 121, 32, 104, 111, 114, 115, 101, 32, 98,
|
||||
97, 116, 116, 101, 114, 121, 32, 115, 116, 97, 112, 108, 101
|
||||
];
|
||||
it('fails with priv=true when theres no private key', function() {
|
||||
var hd = HDWallet.fromBase58('xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon')
|
||||
try {
|
||||
hd.toBase58(true)
|
||||
} catch(e) {
|
||||
assert(e.message.match(/private key/i))
|
||||
return
|
||||
}
|
||||
assert.fail()
|
||||
})
|
||||
})
|
||||
|
||||
it('creates from binary seed', function() {
|
||||
var hd = new HDWallet(seed)
|
||||
describe('constructor & seed deserialization', function() {
|
||||
var expectedPrivateKey = '0fd71c652e847ba7ea7956e3cf3fc0a0985871846b1b2c23b9c6a29a38cee86001'
|
||||
var seed = [
|
||||
99, 114, 97, 122, 121, 32, 104, 111, 114, 115, 101, 32, 98,
|
||||
97, 116, 116, 101, 114, 121, 32, 115, 116, 97, 112, 108, 101
|
||||
]
|
||||
|
||||
assert.equal(hd.priv.toHex(), expectedPrivateKey)
|
||||
assert(hd.pub)
|
||||
})
|
||||
it('creates from binary seed', function() {
|
||||
var hd = new HDWallet(seed)
|
||||
|
||||
describe('fromSeedHex', function() {
|
||||
it('creates from hex seed', function() {
|
||||
var hd = HDWallet.fromSeedHex(b2h(seed))
|
||||
|
||||
assert.equal(hd.priv.toHex(), expectedPrivateKey)
|
||||
assert(hd.pub)
|
||||
})
|
||||
})
|
||||
|
||||
describe('fromSeedString', function() {
|
||||
it('creates from string seed', function() {
|
||||
var hd = HDWallet.fromSeedString(convert.bytesToString(seed))
|
||||
|
||||
assert.equal(hd.priv.toHex(), expectedPrivateKey)
|
||||
assert(hd.pub)
|
||||
})
|
||||
})
|
||||
assert.equal(hd.priv.toHex(), expectedPrivateKey)
|
||||
assert(hd.pub)
|
||||
})
|
||||
|
||||
describe('Test vectors', function() {
|
||||
it('Test vector 1', function() {
|
||||
var hd = HDWallet.fromSeedHex('000102030405060708090a0b0c0d0e0f')
|
||||
describe('fromSeedHex', function() {
|
||||
it('creates from hex seed', function() {
|
||||
var hd = HDWallet.fromSeedHex(b2h(seed))
|
||||
|
||||
// m
|
||||
assert.equal(b2h(hd.getIdentifier()), '3442193e1bb70916e914552172cd4e2dbc9df811')
|
||||
assert.equal(b2h(hd.getFingerprint()), '3442193e')
|
||||
assert.equal(hd.getAddress().toString(), '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma')
|
||||
assert.equal(hd.priv.toHex(), 'e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b3501')
|
||||
assert.equal(hd.priv.toWif(), 'L52XzL2cMkHxqxBXRyEpnPQZGUs3uKiL3R11XbAdHigRzDozKZeW')
|
||||
assert.equal(hd.pub.toHex(), '0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2')
|
||||
assert.equal(b2h(hd.chaincode), '873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508')
|
||||
assert.equal(hd.toHex(false), '0488b21e000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d5080339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2')
|
||||
assert.equal(hd.toHex(true), '0488ade4000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d50800e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35')
|
||||
assert.equal(hd.toBase58(false), 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8')
|
||||
assert.equal(hd.toBase58(true), 'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi')
|
||||
|
||||
// m/0'
|
||||
hd = hd.derivePrivate(0)
|
||||
assert.equal(b2h(hd.getIdentifier()), '5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7')
|
||||
assert.equal(b2h(hd.getFingerprint()), '5c1bd648')
|
||||
assert.equal(hd.getAddress().toString(), '19Q2WoS5hSS6T8GjhK8KZLMgmWaq4neXrh')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), 'edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea')
|
||||
assert.equal(hd.priv.toWif(), 'L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT')
|
||||
assert.equal(hd.pub.toHex(), '035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56')
|
||||
assert.equal(b2h(hd.chaincode), '47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141')
|
||||
assert.equal(hd.toHex(false), '0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56')
|
||||
assert.equal(hd.toHex(true), '0488ade4013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae623614100edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea')
|
||||
assert.equal(hd.toBase58(false), 'xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw')
|
||||
assert.equal(hd.toBase58(true), 'xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7')
|
||||
|
||||
// m/0'/1
|
||||
hd = hd.derive(1)
|
||||
assert.equal(b2h(hd.getIdentifier()), 'bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'bef5a2f9')
|
||||
assert.equal(hd.getAddress().toString(), '1JQheacLPdM5ySCkrZkV66G2ApAXe1mqLj')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368')
|
||||
assert.equal(hd.priv.toWif(), 'KyFAjQ5rgrKvhXvNMtFB5PCSKUYD1yyPEe3xr3T34TZSUHycXtMM')
|
||||
assert.equal(hd.pub.toHex(), '03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c')
|
||||
assert.equal(b2h(hd.chaincode), '2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19')
|
||||
assert.equal(hd.toHex(false), '0488b21e025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c1903501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c')
|
||||
assert.equal(hd.toHex(true), '0488ade4025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19003c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368')
|
||||
assert.equal(hd.toBase58(false), 'xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ')
|
||||
assert.equal(hd.toBase58(true), 'xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs')
|
||||
|
||||
// m/0'/1/2'
|
||||
hd = hd.derivePrivate(2)
|
||||
assert.equal(b2h(hd.getIdentifier()), 'ee7ab90cde56a8c0e2bb086ac49748b8db9dce72')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'ee7ab90c')
|
||||
assert.equal(hd.getAddress().toString(), '1NjxqbA9aZWnh17q1UW3rB4EPu79wDXj7x')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), 'cbce0d719ecf7431d88e6a89fa1483e02e35092af60c042b1df2ff59fa424dca')
|
||||
assert.equal(hd.priv.toWif(), 'L43t3od1Gh7Lj55Bzjj1xDAgJDcL7YFo2nEcNaMGiyRZS1CidBVU')
|
||||
assert.equal(hd.pub.toHex(), '0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2')
|
||||
assert.equal(b2h(hd.chaincode), '04466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f')
|
||||
assert.equal(hd.toHex(false), '0488b21e03bef5a2f98000000204466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2')
|
||||
assert.equal(hd.toHex(true), '0488ade403bef5a2f98000000204466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f00cbce0d719ecf7431d88e6a89fa1483e02e35092af60c042b1df2ff59fa424dca')
|
||||
assert.equal(hd.toBase58(false), 'xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5')
|
||||
assert.equal(hd.toBase58(true), 'xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM')
|
||||
|
||||
// m/0'/1/2'/2
|
||||
hd = hd.derive(2)
|
||||
assert.equal(b2h(hd.getIdentifier()), 'd880d7d893848509a62d8fb74e32148dac68412f')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'd880d7d8')
|
||||
assert.equal(hd.getAddress().toString(), '1LjmJcdPnDHhNTUgrWyhLGnRDKxQjoxAgt')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '0f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4')
|
||||
assert.equal(hd.priv.toWif(), 'KwjQsVuMjbCP2Zmr3VaFaStav7NvevwjvvkqrWd5Qmh1XVnCteBR')
|
||||
assert.equal(hd.pub.toHex(), '02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29')
|
||||
assert.equal(b2h(hd.chaincode), 'cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd')
|
||||
assert.equal(hd.toHex(false), '0488b21e04ee7ab90c00000002cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29')
|
||||
assert.equal(hd.toHex(true), '0488ade404ee7ab90c00000002cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd000f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4')
|
||||
assert.equal(hd.toBase58(false), 'xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV')
|
||||
assert.equal(hd.toBase58(true), 'xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334')
|
||||
|
||||
// m/0'/1/2'/2/1000000000
|
||||
hd = hd.derive(1000000000)
|
||||
assert.equal(b2h(hd.getIdentifier()), 'd69aa102255fed74378278c7812701ea641fdf32')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'd69aa102')
|
||||
assert.equal(hd.getAddress().toString(), '1LZiqrop2HGR4qrH1ULZPyBpU6AUP49Uam')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8')
|
||||
assert.equal(hd.priv.toWif(), 'Kybw8izYevo5xMh1TK7aUr7jHFCxXS1zv8p3oqFz3o2zFbhRXHYs')
|
||||
assert.equal(hd.pub.toHex(), '022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011')
|
||||
assert.equal(b2h(hd.chaincode), 'c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e')
|
||||
assert.equal(hd.toHex(false), '0488b21e05d880d7d83b9aca00c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011')
|
||||
assert.equal(hd.toHex(true), '0488ade405d880d7d83b9aca00c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e00471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8')
|
||||
assert.equal(hd.toBase58(false), 'xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy')
|
||||
assert.equal(hd.toBase58(true), 'xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76')
|
||||
})
|
||||
|
||||
it('Test vector 2', function() {
|
||||
var hd = HDWallet.fromSeedHex('fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542')
|
||||
|
||||
// m
|
||||
assert.equal(b2h(hd.getIdentifier()), 'bd16bee53961a47d6ad888e29545434a89bdfe95')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'bd16bee5')
|
||||
assert.equal(hd.getAddress().toString(), '1JEoxevbLLG8cVqeoGKQiAwoWbNYSUyYjg')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '4b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e')
|
||||
assert.equal(hd.priv.toWif(), 'KyjXhyHF9wTphBkfpxjL8hkDXDUSbE3tKANT94kXSyh6vn6nKaoy')
|
||||
assert.equal(hd.pub.toHex(), '03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7')
|
||||
assert.equal(b2h(hd.chaincode), '60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689')
|
||||
assert.equal(hd.toHex(false), '0488b21e00000000000000000060499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd968903cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7')
|
||||
assert.equal(hd.toHex(true), '0488ade400000000000000000060499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689004b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e')
|
||||
assert.equal(hd.toBase58(false), 'xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB')
|
||||
assert.equal(hd.toBase58(true), 'xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U')
|
||||
|
||||
// m/0
|
||||
hd = hd.derive(0)
|
||||
assert.equal(b2h(hd.getIdentifier()), '5a61ff8eb7aaca3010db97ebda76121610b78096')
|
||||
assert.equal(b2h(hd.getFingerprint()), '5a61ff8e')
|
||||
assert.equal(hd.getAddress().toString(), '19EuDJdgfRkwCmRzbzVBHZWQG9QNWhftbZ')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), 'abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e')
|
||||
assert.equal(hd.priv.toWif(), 'L2ysLrR6KMSAtx7uPqmYpoTeiRzydXBattRXjXz5GDFPrdfPzKbj')
|
||||
assert.equal(hd.pub.toHex(), '02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea')
|
||||
assert.equal(b2h(hd.chaincode), 'f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c')
|
||||
assert.equal(hd.toHex(false), '0488b21e01bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea')
|
||||
assert.equal(hd.toHex(true), '0488ade401bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c00abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e')
|
||||
assert.equal(hd.toBase58(false), 'xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH')
|
||||
assert.equal(hd.toBase58(true), 'xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt')
|
||||
|
||||
// m/0/2147483647'
|
||||
hd = hd.derivePrivate(2147483647)
|
||||
assert.equal(b2h(hd.getIdentifier()), 'd8ab493736da02f11ed682f88339e720fb0379d1')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'd8ab4937')
|
||||
assert.equal(hd.getAddress().toString(), '1Lke9bXGhn5VPrBuXgN12uGUphrttUErmk')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93')
|
||||
assert.equal(hd.priv.toWif(), 'L1m5VpbXmMp57P3knskwhoMTLdhAAaXiHvnGLMribbfwzVRpz2Sr')
|
||||
assert.equal(hd.pub.toHex(), '03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b')
|
||||
assert.equal(b2h(hd.chaincode), 'be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9')
|
||||
assert.equal(hd.toHex(false), '0488b21e025a61ff8effffffffbe17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d903c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b')
|
||||
assert.equal(hd.toHex(true), '0488ade4025a61ff8effffffffbe17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d900877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93')
|
||||
assert.equal(hd.toBase58(false), 'xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a')
|
||||
assert.equal(hd.toBase58(true), 'xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9')
|
||||
|
||||
// m/0/2147483647'/1
|
||||
hd = hd.derive(1)
|
||||
assert.equal(b2h(hd.getIdentifier()), '78412e3a2296a40de124307b6485bd19833e2e34')
|
||||
assert.equal(b2h(hd.getFingerprint()), '78412e3a')
|
||||
assert.equal(hd.getAddress().toString(), '1BxrAr2pHpeBheusmd6fHDP2tSLAUa3qsW')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7')
|
||||
assert.equal(hd.priv.toWif(), 'KzyzXnznxSv249b4KuNkBwowaN3akiNeEHy5FWoPCJpStZbEKXN2')
|
||||
assert.equal(hd.pub.toHex(), '03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9')
|
||||
assert.equal(b2h(hd.chaincode), 'f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb')
|
||||
assert.equal(hd.toHex(false), '0488b21e03d8ab493700000001f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9')
|
||||
assert.equal(hd.toHex(true), '0488ade403d8ab493700000001f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb00704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7')
|
||||
assert.equal(hd.toBase58(false), 'xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon')
|
||||
assert.equal(hd.toBase58(true), 'xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef')
|
||||
|
||||
// m/0/2147483647'/1/2147483646'
|
||||
hd = hd.derivePrivate(2147483646)
|
||||
assert.equal(b2h(hd.getIdentifier()), '31a507b815593dfc51ffc7245ae7e5aee304246e')
|
||||
assert.equal(b2h(hd.getFingerprint()), '31a507b8')
|
||||
assert.equal(hd.getAddress().toString(), '15XVotxCAV7sRx1PSCkQNsGw3W9jT9A94R')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), 'f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d')
|
||||
assert.equal(hd.priv.toWif(), 'L5KhaMvPYRW1ZoFmRjUtxxPypQ94m6BcDrPhqArhggdaTbbAFJEF')
|
||||
assert.equal(hd.pub.toHex(), '02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0')
|
||||
assert.equal(b2h(hd.chaincode), '637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29')
|
||||
assert.equal(hd.toHex(false), '0488b21e0478412e3afffffffe637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e2902d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0')
|
||||
assert.equal(hd.toHex(true), '0488ade40478412e3afffffffe637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e2900f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d')
|
||||
assert.equal(hd.toBase58(false), 'xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL')
|
||||
assert.equal(hd.toBase58(true), 'xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc')
|
||||
|
||||
// Chain m/0/2147483647'/1/2147483646'/2
|
||||
hd = hd.derive(2)
|
||||
assert.equal(b2h(hd.getIdentifier()), '26132fdbe7bf89cbc64cf8dafa3f9f88b8666220')
|
||||
assert.equal(b2h(hd.getFingerprint()), '26132fdb')
|
||||
assert.equal(hd.getAddress().toString(), '14UKfRV9ZPUp6ZC9PLhqbRtxdihW9em3xt')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), 'bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23')
|
||||
assert.equal(hd.priv.toWif(), 'L3WAYNAZPxx1fr7KCz7GN9nD5qMBnNiqEJNJMU1z9MMaannAt4aK')
|
||||
assert.equal(hd.pub.toHex(), '024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c')
|
||||
assert.equal(b2h(hd.chaincode), '9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271')
|
||||
assert.equal(hd.toHex(false), '0488b21e0531a507b8000000029452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c')
|
||||
assert.equal(hd.toHex(true), '0488ade40531a507b8000000029452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed27100bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23')
|
||||
assert.equal(hd.toBase58(false), 'xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt')
|
||||
assert.equal(hd.toBase58(true), 'xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j')
|
||||
})
|
||||
assert.equal(hd.priv.toHex(), expectedPrivateKey)
|
||||
assert(hd.pub)
|
||||
})
|
||||
})
|
||||
|
||||
describe('network types', function() {
|
||||
it('ensures that a mainnet Wallet generates mainnet addresses', function() {
|
||||
var wallet = new HDWallet('foobar', 'mainnet')
|
||||
assert.equal(wallet.getAddress().toString(), '1JNymexJHEr5u1BndiChMStFkCgPm4EQ6o');
|
||||
})
|
||||
describe('fromSeedString', function() {
|
||||
it('creates from string seed', function() {
|
||||
var hd = HDWallet.fromSeedString(convert.bytesToString(seed))
|
||||
|
||||
it('ensures that a testnet Wallet generates testnet addresses', function() {
|
||||
var wallet = new HDWallet('foobar', 'testnet')
|
||||
assert.equal(wallet.getAddress().toString(), 'mxtw4i3H6GHLg7fQMHB5BN6acCH6kQ7aoY');
|
||||
})
|
||||
|
||||
it('throws an excption when unknown network type is passed in', function() {
|
||||
assert.throws(function() { new HDWallet("foobar", "doge") })
|
||||
})
|
||||
assert.equal(hd.priv.toHex(), expectedPrivateKey)
|
||||
assert(hd.pub)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('Test vectors', function() {
|
||||
it('Test vector 1', function() {
|
||||
var hd = HDWallet.fromSeedHex('000102030405060708090a0b0c0d0e0f')
|
||||
|
||||
// m
|
||||
assert.equal(b2h(hd.getIdentifier()), '3442193e1bb70916e914552172cd4e2dbc9df811')
|
||||
assert.equal(b2h(hd.getFingerprint()), '3442193e')
|
||||
assert.equal(hd.getAddress().toString(), '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma')
|
||||
assert.equal(hd.priv.toHex(), 'e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b3501')
|
||||
assert.equal(hd.priv.toWif(), 'L52XzL2cMkHxqxBXRyEpnPQZGUs3uKiL3R11XbAdHigRzDozKZeW')
|
||||
assert.equal(hd.pub.toHex(), '0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2')
|
||||
assert.equal(b2h(hd.chaincode), '873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508')
|
||||
assert.equal(hd.toHex(false), '0488b21e000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d5080339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2')
|
||||
assert.equal(hd.toHex(true), '0488ade4000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d50800e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35')
|
||||
assert.equal(hd.toBase58(false), 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8')
|
||||
assert.equal(hd.toBase58(true), 'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi')
|
||||
|
||||
// m/0'
|
||||
hd = hd.derivePrivate(0)
|
||||
assert.equal(b2h(hd.getIdentifier()), '5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7')
|
||||
assert.equal(b2h(hd.getFingerprint()), '5c1bd648')
|
||||
assert.equal(hd.getAddress().toString(), '19Q2WoS5hSS6T8GjhK8KZLMgmWaq4neXrh')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), 'edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea')
|
||||
assert.equal(hd.priv.toWif(), 'L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT')
|
||||
assert.equal(hd.pub.toHex(), '035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56')
|
||||
assert.equal(b2h(hd.chaincode), '47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141')
|
||||
assert.equal(hd.toHex(false), '0488b21e013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56')
|
||||
assert.equal(hd.toHex(true), '0488ade4013442193e8000000047fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae623614100edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea')
|
||||
assert.equal(hd.toBase58(false), 'xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw')
|
||||
assert.equal(hd.toBase58(true), 'xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7')
|
||||
|
||||
// m/0'/1
|
||||
hd = hd.derive(1)
|
||||
assert.equal(b2h(hd.getIdentifier()), 'bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'bef5a2f9')
|
||||
assert.equal(hd.getAddress().toString(), '1JQheacLPdM5ySCkrZkV66G2ApAXe1mqLj')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368')
|
||||
assert.equal(hd.priv.toWif(), 'KyFAjQ5rgrKvhXvNMtFB5PCSKUYD1yyPEe3xr3T34TZSUHycXtMM')
|
||||
assert.equal(hd.pub.toHex(), '03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c')
|
||||
assert.equal(b2h(hd.chaincode), '2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19')
|
||||
assert.equal(hd.toHex(false), '0488b21e025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c1903501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c')
|
||||
assert.equal(hd.toHex(true), '0488ade4025c1bd648000000012a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19003c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368')
|
||||
assert.equal(hd.toBase58(false), 'xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ')
|
||||
assert.equal(hd.toBase58(true), 'xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs')
|
||||
|
||||
// m/0'/1/2'
|
||||
hd = hd.derivePrivate(2)
|
||||
assert.equal(b2h(hd.getIdentifier()), 'ee7ab90cde56a8c0e2bb086ac49748b8db9dce72')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'ee7ab90c')
|
||||
assert.equal(hd.getAddress().toString(), '1NjxqbA9aZWnh17q1UW3rB4EPu79wDXj7x')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), 'cbce0d719ecf7431d88e6a89fa1483e02e35092af60c042b1df2ff59fa424dca')
|
||||
assert.equal(hd.priv.toWif(), 'L43t3od1Gh7Lj55Bzjj1xDAgJDcL7YFo2nEcNaMGiyRZS1CidBVU')
|
||||
assert.equal(hd.pub.toHex(), '0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2')
|
||||
assert.equal(b2h(hd.chaincode), '04466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f')
|
||||
assert.equal(hd.toHex(false), '0488b21e03bef5a2f98000000204466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2')
|
||||
assert.equal(hd.toHex(true), '0488ade403bef5a2f98000000204466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f00cbce0d719ecf7431d88e6a89fa1483e02e35092af60c042b1df2ff59fa424dca')
|
||||
assert.equal(hd.toBase58(false), 'xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5')
|
||||
assert.equal(hd.toBase58(true), 'xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM')
|
||||
|
||||
// m/0'/1/2'/2
|
||||
hd = hd.derive(2)
|
||||
assert.equal(b2h(hd.getIdentifier()), 'd880d7d893848509a62d8fb74e32148dac68412f')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'd880d7d8')
|
||||
assert.equal(hd.getAddress().toString(), '1LjmJcdPnDHhNTUgrWyhLGnRDKxQjoxAgt')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '0f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4')
|
||||
assert.equal(hd.priv.toWif(), 'KwjQsVuMjbCP2Zmr3VaFaStav7NvevwjvvkqrWd5Qmh1XVnCteBR')
|
||||
assert.equal(hd.pub.toHex(), '02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29')
|
||||
assert.equal(b2h(hd.chaincode), 'cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd')
|
||||
assert.equal(hd.toHex(false), '0488b21e04ee7ab90c00000002cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29')
|
||||
assert.equal(hd.toHex(true), '0488ade404ee7ab90c00000002cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd000f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4')
|
||||
assert.equal(hd.toBase58(false), 'xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV')
|
||||
assert.equal(hd.toBase58(true), 'xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334')
|
||||
|
||||
// m/0'/1/2'/2/1000000000
|
||||
hd = hd.derive(1000000000)
|
||||
assert.equal(b2h(hd.getIdentifier()), 'd69aa102255fed74378278c7812701ea641fdf32')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'd69aa102')
|
||||
assert.equal(hd.getAddress().toString(), '1LZiqrop2HGR4qrH1ULZPyBpU6AUP49Uam')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8')
|
||||
assert.equal(hd.priv.toWif(), 'Kybw8izYevo5xMh1TK7aUr7jHFCxXS1zv8p3oqFz3o2zFbhRXHYs')
|
||||
assert.equal(hd.pub.toHex(), '022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011')
|
||||
assert.equal(b2h(hd.chaincode), 'c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e')
|
||||
assert.equal(hd.toHex(false), '0488b21e05d880d7d83b9aca00c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011')
|
||||
assert.equal(hd.toHex(true), '0488ade405d880d7d83b9aca00c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e00471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8')
|
||||
assert.equal(hd.toBase58(false), 'xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy')
|
||||
assert.equal(hd.toBase58(true), 'xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76')
|
||||
})
|
||||
|
||||
it('Test vector 2', function() {
|
||||
var hd = HDWallet.fromSeedHex('fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542')
|
||||
|
||||
// m
|
||||
assert.equal(b2h(hd.getIdentifier()), 'bd16bee53961a47d6ad888e29545434a89bdfe95')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'bd16bee5')
|
||||
assert.equal(hd.getAddress().toString(), '1JEoxevbLLG8cVqeoGKQiAwoWbNYSUyYjg')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '4b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e')
|
||||
assert.equal(hd.priv.toWif(), 'KyjXhyHF9wTphBkfpxjL8hkDXDUSbE3tKANT94kXSyh6vn6nKaoy')
|
||||
assert.equal(hd.pub.toHex(), '03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7')
|
||||
assert.equal(b2h(hd.chaincode), '60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689')
|
||||
assert.equal(hd.toHex(false), '0488b21e00000000000000000060499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd968903cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7')
|
||||
assert.equal(hd.toHex(true), '0488ade400000000000000000060499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689004b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e')
|
||||
assert.equal(hd.toBase58(false), 'xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB')
|
||||
assert.equal(hd.toBase58(true), 'xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U')
|
||||
|
||||
// m/0
|
||||
hd = hd.derive(0)
|
||||
assert.equal(b2h(hd.getIdentifier()), '5a61ff8eb7aaca3010db97ebda76121610b78096')
|
||||
assert.equal(b2h(hd.getFingerprint()), '5a61ff8e')
|
||||
assert.equal(hd.getAddress().toString(), '19EuDJdgfRkwCmRzbzVBHZWQG9QNWhftbZ')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), 'abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e')
|
||||
assert.equal(hd.priv.toWif(), 'L2ysLrR6KMSAtx7uPqmYpoTeiRzydXBattRXjXz5GDFPrdfPzKbj')
|
||||
assert.equal(hd.pub.toHex(), '02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea')
|
||||
assert.equal(b2h(hd.chaincode), 'f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c')
|
||||
assert.equal(hd.toHex(false), '0488b21e01bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea')
|
||||
assert.equal(hd.toHex(true), '0488ade401bd16bee500000000f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c00abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e')
|
||||
assert.equal(hd.toBase58(false), 'xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH')
|
||||
assert.equal(hd.toBase58(true), 'xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt')
|
||||
|
||||
// m/0/2147483647'
|
||||
hd = hd.derivePrivate(2147483647)
|
||||
assert.equal(b2h(hd.getIdentifier()), 'd8ab493736da02f11ed682f88339e720fb0379d1')
|
||||
assert.equal(b2h(hd.getFingerprint()), 'd8ab4937')
|
||||
assert.equal(hd.getAddress().toString(), '1Lke9bXGhn5VPrBuXgN12uGUphrttUErmk')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93')
|
||||
assert.equal(hd.priv.toWif(), 'L1m5VpbXmMp57P3knskwhoMTLdhAAaXiHvnGLMribbfwzVRpz2Sr')
|
||||
assert.equal(hd.pub.toHex(), '03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b')
|
||||
assert.equal(b2h(hd.chaincode), 'be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9')
|
||||
assert.equal(hd.toHex(false), '0488b21e025a61ff8effffffffbe17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d903c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b')
|
||||
assert.equal(hd.toHex(true), '0488ade4025a61ff8effffffffbe17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d900877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93')
|
||||
assert.equal(hd.toBase58(false), 'xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a')
|
||||
assert.equal(hd.toBase58(true), 'xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9')
|
||||
|
||||
// m/0/2147483647'/1
|
||||
hd = hd.derive(1)
|
||||
assert.equal(b2h(hd.getIdentifier()), '78412e3a2296a40de124307b6485bd19833e2e34')
|
||||
assert.equal(b2h(hd.getFingerprint()), '78412e3a')
|
||||
assert.equal(hd.getAddress().toString(), '1BxrAr2pHpeBheusmd6fHDP2tSLAUa3qsW')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), '704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7')
|
||||
assert.equal(hd.priv.toWif(), 'KzyzXnznxSv249b4KuNkBwowaN3akiNeEHy5FWoPCJpStZbEKXN2')
|
||||
assert.equal(hd.pub.toHex(), '03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9')
|
||||
assert.equal(b2h(hd.chaincode), 'f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb')
|
||||
assert.equal(hd.toHex(false), '0488b21e03d8ab493700000001f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9')
|
||||
assert.equal(hd.toHex(true), '0488ade403d8ab493700000001f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb00704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7')
|
||||
assert.equal(hd.toBase58(false), 'xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon')
|
||||
assert.equal(hd.toBase58(true), 'xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef')
|
||||
|
||||
// m/0/2147483647'/1/2147483646'
|
||||
hd = hd.derivePrivate(2147483646)
|
||||
assert.equal(b2h(hd.getIdentifier()), '31a507b815593dfc51ffc7245ae7e5aee304246e')
|
||||
assert.equal(b2h(hd.getFingerprint()), '31a507b8')
|
||||
assert.equal(hd.getAddress().toString(), '15XVotxCAV7sRx1PSCkQNsGw3W9jT9A94R')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), 'f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d')
|
||||
assert.equal(hd.priv.toWif(), 'L5KhaMvPYRW1ZoFmRjUtxxPypQ94m6BcDrPhqArhggdaTbbAFJEF')
|
||||
assert.equal(hd.pub.toHex(), '02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0')
|
||||
assert.equal(b2h(hd.chaincode), '637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29')
|
||||
assert.equal(hd.toHex(false), '0488b21e0478412e3afffffffe637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e2902d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0')
|
||||
assert.equal(hd.toHex(true), '0488ade40478412e3afffffffe637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e2900f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d')
|
||||
assert.equal(hd.toBase58(false), 'xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL')
|
||||
assert.equal(hd.toBase58(true), 'xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc')
|
||||
|
||||
// Chain m/0/2147483647'/1/2147483646'/2
|
||||
hd = hd.derive(2)
|
||||
assert.equal(b2h(hd.getIdentifier()), '26132fdbe7bf89cbc64cf8dafa3f9f88b8666220')
|
||||
assert.equal(b2h(hd.getFingerprint()), '26132fdb')
|
||||
assert.equal(hd.getAddress().toString(), '14UKfRV9ZPUp6ZC9PLhqbRtxdihW9em3xt')
|
||||
assert.equal(hd.priv.toHex().slice(0, 64), 'bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23')
|
||||
assert.equal(hd.priv.toWif(), 'L3WAYNAZPxx1fr7KCz7GN9nD5qMBnNiqEJNJMU1z9MMaannAt4aK')
|
||||
assert.equal(hd.pub.toHex(), '024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c')
|
||||
assert.equal(b2h(hd.chaincode), '9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271')
|
||||
assert.equal(hd.toHex(false), '0488b21e0531a507b8000000029452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c')
|
||||
assert.equal(hd.toHex(true), '0488ade40531a507b8000000029452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed27100bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23')
|
||||
assert.equal(hd.toBase58(false), 'xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt')
|
||||
assert.equal(hd.toBase58(true), 'xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j')
|
||||
})
|
||||
})
|
||||
|
||||
describe('network types', function() {
|
||||
it('ensures that a mainnet Wallet generates mainnet addresses', function() {
|
||||
var wallet = new HDWallet('foobar', 'mainnet')
|
||||
assert.equal(wallet.getAddress().toString(), '1JNymexJHEr5u1BndiChMStFkCgPm4EQ6o')
|
||||
})
|
||||
|
||||
it('ensures that a testnet Wallet generates testnet addresses', function() {
|
||||
var wallet = new HDWallet('foobar', 'testnet')
|
||||
assert.equal(wallet.getAddress().toString(), 'mxtw4i3H6GHLg7fQMHB5BN6acCH6kQ7aoY')
|
||||
})
|
||||
|
||||
it('throws an excption when unknown network type is passed in', function() {
|
||||
assert.throws(function() { new HDWallet("foobar", "doge") })
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
57
test/jsbn.js
57
test/jsbn.js
|
@ -1,37 +1,36 @@
|
|||
/* global describe, it */
|
||||
var assert = require('assert');
|
||||
var assert = require('assert')
|
||||
var BigInteger = require('../src/jsbn/jsbn.js')
|
||||
var bytesToHex = require('../src/convert.js').bytesToHex;
|
||||
var secureRandom = require('secure-random');
|
||||
var bytesToHex = require('../src/convert.js').bytesToHex
|
||||
var secureRandom = require('secure-random')
|
||||
|
||||
describe('BigInteger', function() {
|
||||
describe('toByteArraySigned', function() {
|
||||
it('handles examples', function() {
|
||||
function hex(num) {
|
||||
var bytes = BigInteger.valueOf(num).toByteArraySigned();
|
||||
var h = bytesToHex(bytes);
|
||||
return '0x' + h;
|
||||
}
|
||||
describe('toByteArraySigned', function() {
|
||||
it('handles examples', function() {
|
||||
function hex(num) {
|
||||
var bytes = BigInteger.valueOf(num).toByteArraySigned()
|
||||
var h = bytesToHex(bytes)
|
||||
return '0x' + h
|
||||
}
|
||||
|
||||
assert.equal(hex( 0), '0x');
|
||||
assert.equal(hex( 1), '0x01');
|
||||
assert.equal(hex(-1), '0x81');
|
||||
assert.equal(hex( 127), '0x7f');
|
||||
assert.equal(hex(-127), '0xff');
|
||||
assert.equal(hex( 255), '0x00ff');
|
||||
assert.equal(hex(-255), '0x80ff');
|
||||
assert.equal(hex( 16300), '0x3fac');
|
||||
assert.equal(hex(-16300), '0xbfac');
|
||||
assert.equal(hex( 62300), '0x00f35c');
|
||||
assert.equal(hex(-62300), '0x80f35c');
|
||||
})
|
||||
assert.equal(hex( 0), '0x')
|
||||
assert.equal(hex( 1), '0x01')
|
||||
assert.equal(hex(-1), '0x81')
|
||||
assert.equal(hex( 127), '0x7f')
|
||||
assert.equal(hex(-127), '0xff')
|
||||
assert.equal(hex( 255), '0x00ff')
|
||||
assert.equal(hex(-255), '0x80ff')
|
||||
assert.equal(hex( 16300), '0x3fac')
|
||||
assert.equal(hex(-16300), '0xbfac')
|
||||
assert.equal(hex( 62300), '0x00f35c')
|
||||
assert.equal(hex(-62300), '0x80f35c')
|
||||
})
|
||||
})
|
||||
|
||||
describe('with RNG passed into constructor as the 2nd argument', function(){
|
||||
it('returns a BigInteger with the limit of the specified length', function(){
|
||||
var bitLength = 256
|
||||
var i = new BigInteger(bitLength, secureRandom)
|
||||
assert(i.bitLength() <= 256)
|
||||
})
|
||||
describe('with RNG passed into constructor as the 2nd argument', function(){
|
||||
it('returns a BigInteger with the limit of the specified length', function(){
|
||||
var bitLength = 256
|
||||
var i = new BigInteger(bitLength, secureRandom)
|
||||
assert(i.bitLength() <= 256)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
94
test/misc.js
94
test/misc.js
|
@ -1,65 +1,65 @@
|
|||
var assert = require('assert');
|
||||
var bitcoinjs = require('../');
|
||||
var sec = require('../src/jsbn/sec');
|
||||
var BigInteger = require('../src/jsbn/jsbn.js');
|
||||
var SHA256 = require('crypto-js/sha256');
|
||||
var rng = require('secure-random');
|
||||
var ecparams = sec('secp256k1');
|
||||
var ECPointFp = bitcoinjs.ECPointFp;
|
||||
var convert = require('../src/convert');
|
||||
var assert = require('assert')
|
||||
var bitcoinjs = require('../')
|
||||
var sec = require('../src/jsbn/sec')
|
||||
var BigInteger = require('../src/jsbn/jsbn.js')
|
||||
var SHA256 = require('crypto-js/sha256')
|
||||
var rng = require('secure-random')
|
||||
var ecparams = sec('secp256k1')
|
||||
var ECPointFp = bitcoinjs.ECPointFp
|
||||
var convert = require('../src/convert')
|
||||
|
||||
function sha256FromBytesToBytes(message){
|
||||
return convert.wordArrayToBytes(SHA256(convert.bytesToWordArray(message)))
|
||||
}
|
||||
|
||||
it('Keys & Key Management', function () {
|
||||
var p1 = bitcoinjs.Key().getPub().toBytes()
|
||||
assert.equal(p1.length, 65)
|
||||
var p1 = bitcoinjs.Key().getPub().toBytes()
|
||||
assert.equal(p1.length, 65)
|
||||
|
||||
var p1_q = ECPointFp.decodeFrom(ecparams.getCurve(), p1);
|
||||
assert.ok(p1_q);
|
||||
assert.ok(p1_q.validate());
|
||||
var p1_q = ECPointFp.decodeFrom(ecparams.getCurve(), p1)
|
||||
assert.ok(p1_q)
|
||||
assert.ok(p1_q.validate())
|
||||
|
||||
var p2 = bitcoinjs.convert.hexToBytes(
|
||||
'0486f356006a38b847bedec1bf47013776925d939d5a35a97a4d1263e550c7f1a' +
|
||||
'b5aba44ab74d22892097a0e851addf07ba97e33416df5affaceeb35d5607cd23c');
|
||||
var p2 = bitcoinjs.convert.hexToBytes(
|
||||
'0486f356006a38b847bedec1bf47013776925d939d5a35a97a4d1263e550c7f1a' +
|
||||
'b5aba44ab74d22892097a0e851addf07ba97e33416df5affaceeb35d5607cd23c')
|
||||
|
||||
var p2_q = ECPointFp.decodeFrom(ecparams.getCurve(), p2);
|
||||
assert.ok(p2_q);
|
||||
assert.ok(p2_q.validate());
|
||||
});
|
||||
var p2_q = ECPointFp.decodeFrom(ecparams.getCurve(), p2)
|
||||
assert.ok(p2_q)
|
||||
assert.ok(p2_q.validate())
|
||||
})
|
||||
|
||||
it('Signing and Verifying', function () {
|
||||
var s1 = bitcoinjs.Key();
|
||||
var sig_a = s1.sign(BigInteger.ZERO);
|
||||
assert.ok(sig_a, 'Sign null');
|
||||
var s1 = bitcoinjs.Key()
|
||||
var sig_a = s1.sign(BigInteger.ZERO)
|
||||
assert.ok(sig_a, 'Sign null')
|
||||
|
||||
assert.ok(s1.verify(BigInteger.ZERO, sig_a));
|
||||
assert.ok(s1.verify(BigInteger.ZERO, sig_a))
|
||||
|
||||
var message = new BigInteger(1024, rng).toByteArrayUnsigned();
|
||||
var hash = sha256FromBytesToBytes(message);
|
||||
var sig_b = s1.sign(hash);
|
||||
assert.ok(sig_b, 'Sign random string');
|
||||
assert.ok(s1.verify(hash, sig_b));
|
||||
var message = new BigInteger(1024, rng).toByteArrayUnsigned()
|
||||
var hash = sha256FromBytesToBytes(message)
|
||||
var sig_b = s1.sign(hash)
|
||||
assert.ok(sig_b, 'Sign random string')
|
||||
assert.ok(s1.verify(hash, sig_b))
|
||||
|
||||
var message2 = bitcoinjs.convert.hexToBytes(
|
||||
'12dce2c169986b3346827ffb2305cf393984627f5f9722a1b1368e933c8d' +
|
||||
'd296653fbe5d7ac031c4962ad0eb1c4298c3b91d244e1116b4a76a130c13' +
|
||||
'1e7aec7fa70184a71a2e66797052831511b93c6e8d72ae58a1980eaacb66' +
|
||||
'8a33f50d7cefb96a5dab897b5efcb99cbafb0d777cb83fc9b2115b69c0fa' +
|
||||
'3d82507b932b84e4');
|
||||
var message2 = bitcoinjs.convert.hexToBytes(
|
||||
'12dce2c169986b3346827ffb2305cf393984627f5f9722a1b1368e933c8d' +
|
||||
'd296653fbe5d7ac031c4962ad0eb1c4298c3b91d244e1116b4a76a130c13' +
|
||||
'1e7aec7fa70184a71a2e66797052831511b93c6e8d72ae58a1980eaacb66' +
|
||||
'8a33f50d7cefb96a5dab897b5efcb99cbafb0d777cb83fc9b2115b69c0fa' +
|
||||
'3d82507b932b84e4')
|
||||
|
||||
var hash2 = sha256FromBytesToBytes(message2);
|
||||
var hash2 = sha256FromBytesToBytes(message2)
|
||||
|
||||
var sig_c = bitcoinjs.convert.hexToBytes(
|
||||
'3044022038d9b8dd5c9fbf330565c1f51d72a59ba869aeb2c2001be959d3' +
|
||||
'79e861ec71960220a73945f32cf90d03127d2c3410d16cee120fa1a4b4c3' +
|
||||
'f273ab082801a95506c4');
|
||||
var sig_c = bitcoinjs.convert.hexToBytes(
|
||||
'3044022038d9b8dd5c9fbf330565c1f51d72a59ba869aeb2c2001be959d3' +
|
||||
'79e861ec71960220a73945f32cf90d03127d2c3410d16cee120fa1a4b4c3' +
|
||||
'f273ab082801a95506c4')
|
||||
|
||||
var s2 = bitcoinjs.convert.hexToBytes(
|
||||
'045a1594316e433fb91f35ef4874610d22177c3f1a1060f6c1e70a609d51' +
|
||||
'b20be5795cd2a5eae0d6b872ba42db95e9afaeea3fbb89e98099575b6828' +
|
||||
'609a978528');
|
||||
var s2 = bitcoinjs.convert.hexToBytes(
|
||||
'045a1594316e433fb91f35ef4874610d22177c3f1a1060f6c1e70a609d51' +
|
||||
'b20be5795cd2a5eae0d6b872ba42db95e9afaeea3fbb89e98099575b6828' +
|
||||
'609a978528')
|
||||
|
||||
assert.ok(bitcoinjs.ecdsa.verify(hash2, sig_c, s2), 'Verify constant signature');
|
||||
});
|
||||
assert.ok(bitcoinjs.ecdsa.verify(hash2, sig_c, s2), 'Verify constant signature')
|
||||
})
|
||||
|
|
|
@ -2,13 +2,11 @@ var Script = require('../src/script.js')
|
|||
var assert = require('assert')
|
||||
var Address = require('../src/address.js')
|
||||
var Network = require('../src/network.js')
|
||||
|
||||
var Util = require('../src/util.js')
|
||||
var sha256ripe160 = Util.sha256ripe160;
|
||||
|
||||
var sha256ripe160 = Util.sha256ripe160
|
||||
var Convert = require('../src/convert.js')
|
||||
var bytesToHex = Convert.bytesToHex;
|
||||
var hexToBytes = Convert.hexToBytes;
|
||||
var bytesToHex = Convert.bytesToHex
|
||||
var hexToBytes = Convert.hexToBytes
|
||||
|
||||
describe('Script', function() {
|
||||
var p2shScriptPubKey, pubkeyScriptPubkey, addressScriptSig
|
||||
|
@ -72,15 +70,15 @@ describe('Script', function() {
|
|||
})
|
||||
|
||||
describe('2-of-3 Multi-Signature', function() {
|
||||
var compressedPubKeys = [];
|
||||
var compressedPubKeys = []
|
||||
var numSigs, script, multisig, network
|
||||
|
||||
beforeEach(function() {
|
||||
compressedPubKeys = ['02ea1297665dd733d444f31ec2581020004892cdaaf3dd6c0107c615afb839785f',
|
||||
'02fab2dea1458990793f56f42e4a47dbf35a12a351f26fa5d7e0cc7447eaafa21f',
|
||||
'036c6802ce7e8113723dd92cdb852e492ebb157a871ca532c3cb9ed08248ff0e19']
|
||||
numSigs = 2
|
||||
network = Network.mainnet.p2shVersion
|
||||
'02fab2dea1458990793f56f42e4a47dbf35a12a351f26fa5d7e0cc7447eaafa21f',
|
||||
'036c6802ce7e8113723dd92cdb852e492ebb157a871ca532c3cb9ed08248ff0e19']
|
||||
numSigs = 2
|
||||
network = Network.mainnet.p2shVersion
|
||||
})
|
||||
|
||||
it('should create valid multi-sig address', function() {
|
||||
|
@ -98,8 +96,11 @@ describe('Script', function() {
|
|||
var deserialized = new Script(redeemScript)
|
||||
var numOfSignatures = deserialized.chunks[deserialized.chunks.length - 2] - 80
|
||||
var signaturesRequired = deserialized.chunks[0] - 80
|
||||
var sigs = [bytesToHex(deserialized.chunks[1]), bytesToHex(deserialized.chunks[2]),
|
||||
bytesToHex(deserialized.chunks[3])]
|
||||
var sigs = [
|
||||
bytesToHex(deserialized.chunks[1]),
|
||||
bytesToHex(deserialized.chunks[2]),
|
||||
bytesToHex(deserialized.chunks[3])
|
||||
]
|
||||
|
||||
assert.equal(numOfSignatures, 3)
|
||||
assert.equal(signaturesRequired, 2)
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
var T = require('../src/transaction')
|
||||
var Transaction = T.Transaction
|
||||
var TransactionOut = T.TransactionOut
|
||||
|
||||
var convert = require('../src/convert')
|
||||
var ECKey = require('../src/eckey').ECKey
|
||||
var Script = require('../src/script')
|
||||
|
@ -84,7 +83,7 @@ describe('Transaction', function() {
|
|||
// the deserialized-serialized transaction should return to its original state (== tx)
|
||||
var bytes2 = Transaction.deserialize(mutated).serialize()
|
||||
assert.deepEqual(bytes, bytes2)
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
describe('creating a transaction', function() {
|
||||
|
|
|
@ -6,6 +6,7 @@ var TransactionOut = T.TransactionOut
|
|||
var Script = require('../src/script.js')
|
||||
var convert = require('../src/convert.js')
|
||||
var assert = require('assert')
|
||||
var sinon = require('sinon')
|
||||
var SHA256 = require('crypto-js/sha256')
|
||||
var Crypto = require('crypto-js')
|
||||
|
||||
|
@ -13,10 +14,8 @@ var fixtureTxes = require('./fixtures/mainnet_tx')
|
|||
var fixtureTx1Hex = fixtureTxes.prevTx
|
||||
var fixtureTx2Hex = fixtureTxes.tx
|
||||
|
||||
var sinon = require('sinon')
|
||||
|
||||
describe('Wallet', function() {
|
||||
var seed, wallet;
|
||||
var seed, wallet
|
||||
beforeEach(function(){
|
||||
seed = convert.wordArrayToBytes(SHA256("don't use a string seed like this in real life"))
|
||||
wallet = new Wallet(seed)
|
||||
|
@ -141,9 +140,9 @@ describe('Wallet', function() {
|
|||
wallet.generateAddress()
|
||||
|
||||
assertEqual(wallet.getPrivateKeyForAddress("n2fiWrHqD6GM5GiEqkbWAc6aaZQp3ba93X"),
|
||||
wallet.getExternalAccount().derive(1).priv)
|
||||
assertEqual(wallet.getPrivateKeyForAddress("mnXiDR4MKsFxcKJEZjx4353oXvo55iuptn"),
|
||||
wallet.getInternalAccount().derive(0).priv)
|
||||
wallet.getExternalAccount().derive(1).priv)
|
||||
assertEqual(wallet.getPrivateKeyForAddress("mnXiDR4MKsFxcKJEZjx4353oXvo55iuptn"),
|
||||
wallet.getInternalAccount().derive(0).priv)
|
||||
})
|
||||
|
||||
it('raises an error when address is not found', function(){
|
||||
|
@ -155,7 +154,7 @@ describe('Wallet', function() {
|
|||
})
|
||||
|
||||
describe('Unspent Outputs', function(){
|
||||
var expectedUtxo, expectedOutputKey;
|
||||
var expectedUtxo, expectedOutputKey
|
||||
beforeEach(function(){
|
||||
expectedUtxo = {
|
||||
"hash":"6a4062273ac4f9ea4ffca52d9fd102b08f6c32faa0a4d1318e3a7b2e437bb9c7",
|
||||
|
@ -216,7 +215,7 @@ describe('Wallet', function() {
|
|||
})
|
||||
|
||||
describe('setUnspentOutputs', function(){
|
||||
var utxo;
|
||||
var utxo
|
||||
beforeEach(function(){
|
||||
utxo = cloneObject([expectedUtxo])
|
||||
})
|
||||
|
@ -275,7 +274,7 @@ describe('Wallet', function() {
|
|||
})
|
||||
|
||||
describe('setUnspentOutputsAsync', function(){
|
||||
var utxo;
|
||||
var utxo
|
||||
beforeEach(function(){
|
||||
utxo = cloneObject([expectedUtxo])
|
||||
})
|
||||
|
@ -308,7 +307,7 @@ describe('Wallet', function() {
|
|||
})
|
||||
|
||||
describe('processTx', function(){
|
||||
var tx;
|
||||
var tx
|
||||
|
||||
beforeEach(function(){
|
||||
tx = Transaction.deserialize(fixtureTx1Hex)
|
||||
|
@ -382,8 +381,8 @@ describe('Wallet', function() {
|
|||
})
|
||||
|
||||
describe('createTx', function(){
|
||||
var to, value;
|
||||
var address1, address2;
|
||||
var to, value
|
||||
var address1, address2
|
||||
|
||||
beforeEach(function(){
|
||||
to = '15mMHKL96tWAUtqF3tbVf99Z8arcmnJrr3'
|
||||
|
@ -396,23 +395,23 @@ describe('Wallet', function() {
|
|||
// set up 3 utxo
|
||||
utxo = [
|
||||
{
|
||||
"hash": fakeTxHash(1),
|
||||
"outputIndex": 0,
|
||||
"address" : address1,
|
||||
"value": 400000 // not enough for value
|
||||
},
|
||||
{
|
||||
"hash": fakeTxHash(2),
|
||||
"outputIndex": 1,
|
||||
"address" : address1,
|
||||
"value": 500000 // enough for only value
|
||||
},
|
||||
{
|
||||
"hash": fakeTxHash(3),
|
||||
"outputIndex": 0,
|
||||
"address" : address2,
|
||||
"value": 520000 // enough for value and fee
|
||||
}
|
||||
"hash": fakeTxHash(1),
|
||||
"outputIndex": 0,
|
||||
"address" : address1,
|
||||
"value": 400000 // not enough for value
|
||||
},
|
||||
{
|
||||
"hash": fakeTxHash(2),
|
||||
"outputIndex": 1,
|
||||
"address" : address1,
|
||||
"value": 500000 // enough for only value
|
||||
},
|
||||
{
|
||||
"hash": fakeTxHash(3),
|
||||
"outputIndex": 0,
|
||||
"address" : address2,
|
||||
"value": 520000 // enough for value and fee
|
||||
}
|
||||
]
|
||||
wallet.setUnspentOutputs(utxo)
|
||||
})
|
||||
|
@ -446,11 +445,11 @@ describe('Wallet', function() {
|
|||
it('ignores spent outputs', function(){
|
||||
utxo.push(
|
||||
{
|
||||
"hash": fakeTxHash(4),
|
||||
"outputIndex": 0,
|
||||
"address" : address2,
|
||||
"value": 530000 // enough but spent before createTx
|
||||
}
|
||||
"hash": fakeTxHash(4),
|
||||
"outputIndex": 0,
|
||||
"address" : address2,
|
||||
"value": 530000 // enough but spent before createTx
|
||||
}
|
||||
)
|
||||
wallet.setUnspentOutputs(utxo)
|
||||
wallet.outputs[fakeTxHash(4) + ":" + 0].spend = fakeTxHash(5) + ":" + 0
|
||||
|
@ -547,7 +546,7 @@ describe('Wallet', function() {
|
|||
})
|
||||
|
||||
describe('createTxAsync', function(){
|
||||
var to, value, fee;
|
||||
var to, value, fee
|
||||
|
||||
beforeEach(function(){
|
||||
to = '15mMHKL96tWAUtqF3tbVf99Z8arcmnJrr3'
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue