diff --git a/lib/hdprivatekey.js b/lib/hdprivatekey.js index dbf842d90..08052efd3 100644 --- a/lib/hdprivatekey.js +++ b/lib/hdprivatekey.js @@ -365,6 +365,15 @@ HDPrivateKey.fromSeed = function(hexa, network) { }); }; + + +HDPrivateKey.prototype._calcHDPublicKey = function() { + if (!this._hdPublicKey) { + var HDPublicKey = require('./hdpublickey'); + this._hdPublicKey = new HDPublicKey(this); + } +}; + /** * Receives a object with buffers in all the properties and populates the * internal structure @@ -423,14 +432,24 @@ HDPrivateKey.prototype._buildFromBuffers = function(arg) { fingerPrint: fingerPrint }); - var HDPublicKey = require('./hdpublickey'); - var hdPublicKey = new HDPublicKey(this); + this._hdPublicKey = null; - JSUtil.defineImmutable(this, { - hdPublicKey: hdPublicKey, - xpubkey: hdPublicKey.xpubkey + Object.defineProperty(this, 'hdPublicKey', { + configurable: false, + enumerable: true, + get: function() { + this._calcHDPublicKey(); + return this._hdPublicKey; + } + }); + Object.defineProperty(this, 'xpubkey', { + configurable: false, + enumerable: true, + get: function() { + this._calcHDPublicKey(); + return this._hdPublicKey.xpubkey; + } }); - return this; }; diff --git a/test/hdprivatekey.js b/test/hdprivatekey.js index bd54bbc81..55782f455 100644 --- a/test/hdprivatekey.js +++ b/test/hdprivatekey.js @@ -100,6 +100,14 @@ describe('HDPrivate key interface', function() { testnetKey.publicKey.network.should.equal(Networks.testnet); livenetKey.publicKey.network.should.equal(Networks.livenet); }); + + it('cache for xpubkey works', function() { + var privateKey = new HDPrivateKey(xprivkey); + should.not.exist(privateKey._hdPublicKey); + privateKey.xpubkey.should.equal(privateKey.xpubkey); + should.exist(privateKey._hdPublicKey); + }); + }); it('inspect() displays correctly', function() {