diff --git a/src/hdwallet.js b/src/hdwallet.js index 00a02c0..f40582f 100644 --- a/src/hdwallet.js +++ b/src/hdwallet.js @@ -13,7 +13,8 @@ var HDWallet = module.exports = function(seed, network) { var I = Crypto.HMAC(Crypto.SHA512, seed, 'Bitcoin seed', { asBytes: true }) this.chaincode = I.slice(32) - this.priv = new ECKey(I.slice(0, 32).concat([1]), true) + this.keyVersion = network == 'Bitcoin' ? Address.address_types.prod : Address.address_types.testnet + this.priv = new ECKey(I.slice(0, 32).concat([1]), true, this.keyVersion) this.pub = this.priv.getPub() this.network = network || 'Bitcoin' this.index = 0 @@ -106,10 +107,10 @@ HDWallet.fromBytes = function(input) { // 33 bytes: the public key or private key data (0x02 + X or 0x03 + X for // public keys, 0x00 + k for private keys) if (type == 'private') { - hd.priv = new ECKey(input.slice(46, 78).concat([1]), true) + hd.priv = new ECKey(input.slice(46, 78).concat([1]), true, this.keyVersion) hd.pub = hd.priv.getPub() } else { - hd.pub = new ECPubKey(input.slice(45, 78), true) + hd.pub = new ECPubKey(input.slice(45, 78), true, this.keyVersion) } return hd @@ -213,10 +214,11 @@ HDWallet.prototype.derive = function(i) { // ki = IL + kpar (mod n). hd.priv = this.priv.add(new ECKey(IL.concat([1]))) hd.priv.compressed = true + hd.priv.version = this.keyVersion hd.pub = hd.priv.getPub() } else { // Ki = (IL + kpar)*G = IL*G + Kpar - hd.pub = this.pub.add(new ECKey(IL.concat([1])).getPub()) + hd.pub = this.pub.add(new ECKey(IL.concat([1]), true, this.keyVersion).getPub()) } // ci = IR. diff --git a/test/wallet.js b/test/wallet.js index 0f39d02..44f6164 100644 --- a/test/wallet.js +++ b/test/wallet.js @@ -1,4 +1,5 @@ var Wallet = require('../src/wallet.js') +var Address = require('../src/address.js') var assert = require('assert') describe('Wallet', function() { @@ -33,4 +34,20 @@ describe('Wallet', function() { assert.equal(wallet.derivationMethod, 'public') }) }) + + describe('networkType', function() { + it('ensures that a mainnet Wallet has mainnet child keys (pub and priv)', function() { + var w = Wallet("foobar", {network: "Bitcoin"}) + assert(w.getMasterKey().priv.version == Address.address_types['prod']) + w.generateAddress() + assert(w.getPrivateKey(0).priv.version == Address.address_types['prod']) + }) + + it('ensures that a testnet Wallet has testnet child keys (pub and priv)', function() { + var w = Wallet("foobar", {network: "BitcoinTest"}) + assert(w.getMasterKey().priv.version == Address.address_types['testnet']) + w.generateAddress() + assert(w.getPrivateKey(0).priv.version == Address.address_types['testnet']) + }) + }) })