# @psf/bip32-utils

> A set of utilities for working with BIP32.

Latest version **1.0.4** (published 2021-11-01) · MIT license · 0 weekly downloads

## Install

```sh
npm install @psf/bip32-utils
pnpm add @psf/bip32-utils
yarn add @psf/bip32-utils
bun add @psf/bip32-utils
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.4 |
| Published | 2021-11-01 |
| First published | 2021-01-01 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Node | >=10.15.1 |
| Dependencies | 2 |
| Unpacked size | 53.1 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Daniel Cousens |
| Maintainers | psf-account, chris.troutner |
| Keywords | bip32-utils, bip32, bip44, account, chain, discovery, gap, bitcoinjs, bitcoin |

## Links

- npm: https://www.npmjs.com/package/@psf/bip32-utils
- Repository: https://github.com/Permissionless-Software-Foundation/bip32-utils
- Issues: https://github.com/Permissionless-Software-Foundation/bip32-utils/issues
- npm.io page: https://npm.io/package/@psf/bip32-utils

## Dependencies (2)

- [tape](https://npm.io/package/tape.md) *
- [keccak](https://npm.io/package/keccak.md) ^3.0.1

## Recent versions

- 1.0.4 (latest) — 2021-11-01
- 1.0.3 — 2021-11-01
- 1.0.0 — 2021-02-25
- 0.13.1 — 2021-01-01

## README

# bip32-utils

[![TRAVIS](https://secure.travis-ci.org/bitcoinjs/bip32-utils.png)](http://travis-ci.org/bitcoinjs/bip32-utils)
[![NPM](http://img.shields.io/npm/v/@psf/bip32-utils.svg)](https://www.npmjs.org/package/@psf/bip32-utils)

[![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard)

A set of utilities for working with BIP32.
Compatible with bitcoinjs-lib `^2.0.0` and `^3.0.0`.

## Example

#### BIP32 Account

```javascript
var bitcoin = require('bitcoinjs-lib')
var bip32utils = require('bip32-utils')

// ...

var m = bitcoin.HDNode.fromSeedHex(seedHex)
var i = m.deriveHardened(0)
var external = i.derive(0)
var internal = i.derive(1)
var account = new bip32utils.Account([
  new bip32utils.Chain(external.neutered()),
  new bip32utils.Chain(internal.neutered())
])

console.log(account.getChainAddress(0))
// => 1QEj2WQD9vxTzsGEvnmLpvzeLVrpzyKkGt

account.nextChainAddress(0)

console.log(account.getChainAddress(1))
// => 1DAi282VN7Ack9o5BqWYkiEsS8Vgx1rLn

console.log(account.nextChainAddress(1))
// => 1CXKM323V3kkrHmZQYPUTftGh9VrAWuAYX

console.log(account.derive('1QEj2WQD9vxTzsGEvnmLpvzeLVrpzyKkGt'))
// => xpub6A5Fz4JZg4kd8pLTTaMBKsvVgzRBrvai6ChoxWNTtYQ3UDVG1VyAWQqi6SNqkpsfsx9F8pRqwtKUbU4j4gqpuN2gpgQs4DiJxsJQvTjdzfA

// NOTE: passing in the parent nodes allows for private key escalation (see xprv vs xpub)

console.log(
  account.derive('1QEj2WQD9vxTzsGEvnmLpvzeLVrpzyKkGt', [external, internal])
)
// => xprv9vodQPEygdPGUWeKUVNd6M2N533PvEYP21tYxznauyhrYBBCmdKxRJzmnsTsSNqfTJPrDF98GbLCm6xRnjceZ238Qkf5GQGHk79CrFqtG4d
```

#### BIP32 Chains

```javascript
var bitcoin = require('bitcoinjs-lib')
var bip32utils = require('bip32-utils')

// ...

var hdNode = bitcoin.HDNode.fromSeedHex(seedHex)
var chain = new bip32utils.Chain(hdNode)

for (var k = 0; k < 10; ++k) chain.next()

var address = chain.get()

console.log(chain.find(address))
// => 9

console.log(chain.pop())
// => address
```

#### BIP32 Discovery (manual)

```javascript
var bip32utils = require('bip32-utils')
var bitcoin = require('bitcoinjs-lib')
var Blockchain = require('cb-blockr')

// ...

var blockchain = new Blockchain('testnet')
var hdNode = bitcoin.HDNode.fromSeedHex(seedHex)
var chain = bip32utils.Chain(hdNode)
var GAP_LIMIT = 20

bip32utils.discovery(
  chain,
  GAP_LIMIT,
  function(addresses, callback) {
    blockchain.addresses.summary(addresses, function(err, results) {
      if (err) return callback(err)

      var areUsed = results.map(function(result) {
        return result.totalReceived > 0
      })

      callback(undefined, areUsed)
    })
  },
  function(err, used, checked) {
    if (err) throw err

    console.log('Discovered at most ' + used + ' used addresses')
    console.log('Checked ' + checked + ' addresses')
    console.log('With at least ' + (checked - used) + ' unused addresses')

    // throw away ALL unused addresses AFTER the last unused address
    var unused = checked - used
    for (var i = 1; i < unused; ++i) chain.pop()

    // remember used !== total, chain may have started at a k-index > 0
    console.log(
      'Total number of addresses (after prune): ',
      chain.addresses.length
    )
  }
)
```

## LICENSE [MIT](LICENSE)

---
_Source: https://npm.io/package/@psf/bip32-utils · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
