Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

hdkey

cryptocoinjs244.6kMIT2.1.0TypeScript support: definitely-typed

Bitcoin BIP32 hierarchical deterministic keys

bitcoin, bip32, bip, key, hierarchical, deterministic, crypto

readme

hdkey

NPM Package build status js-standard-style

A JavaScript component for BIP32(hierarchical deterministic keys).

Installation

npm i --save hdkey

Usage

example:

var HDKey = require('hdkey')
var seed = 'a0c42a9c3ac6abf2ba6a9946ae83af18f51bf1c9fa7dacc4c92513cc4dd015834341c775dcd4c0fac73547c5662d81a9e9361a0aac604a73a321bd9103bce8af'
var hdkey = HDKey.fromMasterSeed(Buffer.from(seed, 'hex'))
console.log(hdkey.privateExtendedKey)
// => 'xprv9s21ZrQH143K2SKJK9EYRW3Vsg8tWVHRS54hAJasj1eGsQXeWDHLeuu5hpLHRbeKedDJM4Wj9wHHMmuhPF8dQ3bzyup6R7qmMQ1i1FtzNEW'
console.log(hdkey.publicExtendedKey)
// => 'xpub661MyMwAqRbcEvPmRAmYndzERhyNux1GoHzHxgzVHMBFkCro3kbbCiDZZ5XabZDyXPj5mH3hktvkjhhUdCQxie5e1g4t2GuAWNbPmsSfDp2'

HDKey.fromMasterSeed(seedBuffer[, versions])

Creates an hdkey object from a master seed buffer. Accepts an optional versions object.

var seed = 'a0c42a9c3ac6abf2ba6a9946ae83af18f51bf1c9fa7dacc4c92513cc4dd015834341c775dcd4c0fac73547c5662d81a9e9361a0aac604a73a321bd9103bce8af'
var hdkey = HDKey.fromMasterSeed(Buffer.from(seed, 'hex'))

HDKey.fromExtendedKey(extendedKey[, versions, skipVerification])

Creates an hdkey object from a xprv or xpub extended key string. Accepts an optional versions object & an optional skipVerification boolean. If skipVerification is set to true, then the provided public key's x (and y if uncompressed) coordinate will not will be verified to be on the curve.

var key = 'xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j'
var hdkey = HDKey.fromExtendedKey(key)

or

var key = 'xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt'
var hdkey = HDKey.fromExtendedKey(key)

HDKey.fromJSON(obj)

Creates an hdkey object from an object created via hdkey.toJSON().


hdkey.derive(path)

Derives the hdkey at path from the current hdkey.

var seed = 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542'
var hdkey = HDKey.fromMasterSeed(Buffer.from(seed, 'hex'))
var childkey = hdkey.derive("m/0/2147483647'/1")

console.log(childkey.privateExtendedKey)
// -> "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef"
console.log(childkey.publicExtendedKey)
// -> "xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon"

Newer, "hardened" derivation paths look like this:

// as defined by BIP-44
var childkey = hdkey.derive("m/44'/0'/0'/0/0");

hdkey.sign(hash)

Signs the buffer hash with the private key using secp256k1 and returns the signature as a buffer.

hdkey.verify(hash, signature)

Verifies that the signature is valid for hash and the hdkey's public key using secp256k1. Returns true for valid, false for invalid. Throws if the hash or signature is the wrong length.

hdkey.wipePrivateData()

Wipes all record of the private key from the hdkey instance. After calling this method, the instance will behave as if it was created via HDKey.fromExtendedKey(xpub).

hdkey.toJSON()

Serializes the hdkey to an object that can be JSON.stringify()ed.

var seed = 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542'
var hdkey = HDKey.fromMasterSeed(Buffer.from(seed, 'hex'))

console.log(hdkey.toJSON())
// -> {
//      xpriv: 'xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U',
//      xpub: 'xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB'
//    }

hdkey.privateKey

Getter/Setter of the hdkey's private key, stored as a buffer.

hdkey.publicKey

Getter/Setter of the hdkey's public key, stored as a buffer.

hdkey.privateExtendedKey

Getter/Setter of the hdkey's xprv, stored as a string.

hdkey.publicExtendedKey

Getter/Setter of the hdkey's xpub, stored as a string.

References

License

MIT

changelog

2.1.0 / 2023-01-18

  • Add skipVerification option to HDKey.fromExtendedKey() to allow skipping verification logic for performance (#53)
  • Use ripemd160 package; as Node v18+ crypto.createHash() does not support ripemd160 (#51)
  • Fix .sign() method in some environments with polyfilled Buffer implementations (#50)
  • Performance improvements (#52)

2.0.1 / 2020-05-30

  • Bugfix: prevent mutating buffers passed in (#39)

2.0.0 / 2020-05-29

  • BREAKING: Require Node.js v10+ (#38)
  • Upgrade secp256k1 dependency; to use N-API (#32)

1.1.2 / 2020-04-16

  • Fix extremely rare types bug (#33)
  • Use bs58check dependency instead of coinstring (#30)
  • Don't publish test files (#27, #34)

1.1.1 / 2019-02-09

  • Fix Electron v4 support. No changes to external API. (#26)

1.1.0 / 2018-08-14

  • Add wipePrivateData() method (#22)
  • Add missing LICENSE file (#21)

1.0.0 / 2018-05-24

  • drop support for all Node.js versions 4 and earlier
  • fix derive() path validation (#20)

0.8.0 / 2018-02-06

  • add sign() and verify()
  • upgrade to safe-buffer

0.7.1 / 2016-05-26

  • fix bug when privateKey is null, privateExtendedKey should not throw, and return null #7

0.7.0 / 2016-03-22

  • upgrade from ecurve to secp256k1. #5

0.6.0 / 2015-07-02

  • breaking (same day though, haha). Changed publicExtendedKey/privateExtendedKey in JSON methods to xpub/xpriv
  • export HARDENED_OFFSET

0.5.0 / 2015-07-02

  • JavaScript Standard Style
  • fix rare condition for BIP32 consistency: #1
  • added toJSON()/fromJSON()

0.4.0 / 2014-09-24

  • dropped sha512 dependency and upgraded to crypto-browserify that supports sha512

0.3.1 / 2014-07-11

  • removed superfluous code this._privateKeyBigInteger

0.3.0 / 2014-06-29

  • bugfix: if private key was less than 32 bytes, pad out to 32 bytes with leading zeros (this happens in derive)
  • changed behavior of privateExtendedKey() and publicExtendedKey() to return base 58 encoded string instead of Buffer
  • changed behavior of fromExtendedKey() from accepting a type of Buffer bytes to base58 string

0.2.0 / 2014-06-25

  • upgraded "ecurve": "^0.8.0" to "ecurve": "^1.0.0"
  • added functionality to derive public to public child keys

0.1.0 / 2014-06-16

  • removed semicolons per http://cryptocoinjs.com/about/contributing/#semicolons
  • removed ECKey dep
  • added ecurve dep
  • removed terst dev dep for assert
  • added method fromMasterSeed(seedBuffer, [versions])
  • changed constructor from new HDKey(masterSeed, [versions]) to new HDKey([versions])
  • added properties: privateKey and publicKey
  • removed method getIdentifier(), added property identifier
  • removed method getFingerprint(), added property fingerprint
  • renamed private to privateExtendedKey
  • renamed public to publicExtendedKey
  • added method fromExtendedKey()

0.0.1 / 2014-05-29

  • initial release