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

Package detail

bitcoinjs-lib

bitcoinjs913.7kMIT6.1.7TypeScript support: included

Client-side Bitcoin JavaScript library

bitcoinjs, bitcoin, browserify, javascript, bitcoinjs

readme

BitcoinJS (bitcoinjs-lib)

Github CI NPM code style: prettier

A javascript Bitcoin library for node.js and browsers. Written in TypeScript, but committing the JS files to verify.

Released under the terms of the MIT LICENSE.

Should I use this in production?

If you are thinking of using the master branch of this library in production, stop. Master is not stable; it is our development branch, and only tagged releases may be classified as stable.

Can I trust this code?

Don't trust. Verify.

We recommend every user of this library and the bitcoinjs ecosystem audit and verify any underlying code for its validity and suitability, including reviewing any and all of your project's dependencies.

Mistakes and bugs happen, but with your help in resolving and reporting issues, together we can produce open source software that is:

  • Easy to audit and verify,
  • Tested, with test coverage >95%,
  • Advanced and feature rich,
  • Standardized, using prettier and Node Buffer's throughout, and
  • Friendly, with a strong and helpful community, ready to answer questions.

Documentation

Visit our documentation to explore the available resources. We're continually enhancing our documentation with additional features for an enriched experience. If you need further guidance beyond what our examples offer, don't hesitate to ask for help. We're here to assist you.

You can find a Web UI that covers most of the psbt.ts, transaction.ts and p2*.ts APIs here.

How can I contact the developers outside of Github?

Most of the time, this is not appropriate. Creating issues and pull requests in the open will help others with similar issues, so please try to use public issues and pull requests for communication.

That said, sometimes developers might be open to taking things off the record (ie. You want to share code that you don't want public to get help with it). In that case, please negotiate on the public issues as to where you will contact.

We have created public rooms on IRC (#bitcoinjs on libera.chat) and Matrix (#bitcoinjs-dev:matrix.org). These two channels have been joined together in a Matrix "Space" which has the Matrix room AND an IRC bridge room that can converse with the IRC room. The "Space" is #bitcoinjs-space:matrix.org.

Matrix and IRC both have functions for direct messaging, but IRC is not end to end encrypted, so Matrix is recommended for most communication. The official Matrix client maintained by the Matrix core team is called "Element" and can be downloaded here: https://element.io/download (Account creation is free on the matrix.org server, which is the default setting for Element.)

We used to have a Slack. It is dead. If you find it, no one will answer you most likely.

No we will not make a Discord.

Installation

npm install bitcoinjs-lib
# optionally, install a key derivation library as well
npm install ecpair bip32
# ecpair is the ECPair class for single keys
# bip32 is for generating HD keys

Previous versions of the library included classes for key management (ECPair, HDNode(->"bip32")) but now these have been separated into different libraries. This lowers the bundle size significantly if you don't need to perform any crypto functions (converting private to public keys and deriving HD keys).

Typically we support the Node Maintenance LTS version. TypeScript target will be set to the ECMAScript version in which all features are fully supported by current Active Node LTS. However, depending on adoption among other environments (browsers etc.) we may keep the target back a year or two. If in doubt, see the main_ci.yml for what versions are used by our continuous integration tests.

WARNING: We presently don't provide any tooling to verify that the release on npm matches GitHub. As such, you should verify anything downloaded by npm against your own verified copy.

Usage

Crypto is hard.

When working with private keys, the random number generator is fundamentally one of the most important parts of any software you write. For random number generation, we default to the randombytes module, which uses window.crypto.getRandomValues in the browser, or Node js' crypto.randomBytes, depending on your build system. Although this default is ~OK, there is no simple way to detect if the underlying RNG provided is good enough, or if it is catastrophically bad. You should always verify this yourself to your own standards.

This library uses tiny-secp256k1, which uses RFC6979 to help prevent k re-use and exploitation. Unfortunately, this isn't a silver bullet. Often, Javascript itself is working against us by bypassing these counter-measures.

Problems in Buffer (UInt8Array), for example, can trivially result in catastrophic fund loss without any warning. It can do this through undermining your random number generation, accidentally producing a duplicate k value, sending Bitcoin to a malformed output script, or any of a million different ways. Running tests in your target environment is important and a recommended step to verify continuously.

Finally, adhere to best practice. We are not an authoritative source of best practice, but, at the very least:

  • Don't reuse addresses.
  • Don't share BIP32 extended public keys ('xpubs'). They are a liability, and it only takes 1 misplaced private key (or a buggy implementation!) and you are vulnerable to catastrophic fund loss.
  • Don't use Math.random - in any way - don't.
  • Enforce that users always verify (manually) a freshly-decoded human-readable version of their intended transaction before broadcast.
  • Don't ask users to generate mnemonics, or 'brain wallets', humans are terrible random number generators.
  • Lastly, if you can, use Typescript or similar.

Browser

The recommended method of using bitcoinjs-lib in your browser is through browserify.

If you'd like to use a different (more modern) build tool than browserify, you can compile just this library and its dependencies into a single JavaScript file:

$ npm install bitcoinjs-lib browserify
$ npx browserify --standalone bitcoin - -o bitcoinjs-lib.js <<<"module.exports = require('bitcoinjs-lib');"

Which you can then import as an ESM module:

<script type="module">import "/scripts/bitcoinjs-lib.js"</script>
`

NOTE: We use Node Maintenance LTS features, if you need strict ES5, use --transform babelify in conjunction with your browserify step (using an es2015 preset).

WARNING: iOS devices have problems, use at least buffer@5.0.5 or greater, and enforce the test suites (for Buffer, and any other dependency) pass before use.

Typescript or VSCode users

Type declarations for Typescript are included in this library. Normal installation should include all the needed type information.

Examples

The below examples are implemented as integration tests, they should be very easy to understand. Otherwise, pull requests are appreciated. Some examples interact (via HTTPS) with a 3rd Party Blockchain Provider (3PBP).

If you have a use case that you feel could be listed here, please ask for it!

Contributing

See CONTRIBUTING.md.

Running the test suite

npm test
npm run-script coverage

Complementing Libraries

  • BIP21 - A BIP21 compatible URL encoding library
  • BIP38 - Passphrase-protected private keys
  • BIP39 - Mnemonic generation for deterministic keys
  • BIP32-Utils - A set of utilities for working with BIP32
  • BIP66 - Strict DER signature decoding
  • BIP68 - Relative lock-time encoding library
  • BIP69 - Lexicographical Indexing of Transaction Inputs and Outputs
  • Base58 - Base58 encoding/decoding
  • Base58 Check - Base58 check encoding/decoding
  • Bech32 - A BIP173/BIP350 compliant Bech32/Bech32m encoding library
  • coinselect - A fee-optimizing, transaction input selection module for bitcoinjs-lib.
  • merkle-lib - A performance conscious library for merkle root and tree calculations.
  • minimaldata - A module to check bitcoin policy: SCRIPT_VERIFY_MINIMALDATA

Alternatives

LICENSE MIT

changelog

6.1.7

added

  • skip ecc library verification via DANGER_DO_NOT_VERIFY_ECCLIB flag

6.1.6

fixed

  • Fix sighash treatment when signing taproot script sign scripts using Psbt (#2104)
  • Fix error for invalid scripts in toASM (#2097)
  • Fix mutation of input to addOutput method on Psbt (#2091)

6.1.5

fixed

  • Updated bip174 dependency to fix issue with unknownKeyVals. (#1979)

6.1.4

changed

  • Changed internal usage of the Buffer API to match with newer broken bundlers that don't follow spec. The new usage is still compatible with older versions of Buffer, so there shouldn't be any breakage. The public API interface was not changed. (#1975)

6.1.3

fixed

  • validateSignaturesOfInput for taproot inputs returned false for valid signatures in specific cases. (#1934)

6.1.2

fixed

  • validateSignaturesOfInput for taproot inputs returned true for invalid signatures in specific cases. (#1932)

6.1.1

added

  • add example using BIP86 vector to verify the sending to and from a BIP86 generated taproot address

fixed

  • support for 65 byte taproot signature
  • prevent the creation of unspendable scripts in bitcoinjs-lib by implementing checks for resource limitations
  • use Buffer.from() instead of Buffer.of()

changed

  • performance: precompute the taproot hashes
  • performance: switch from create-hash and ripemd160 to noble-hashes

removed

  • types: removed unused methods privateAdd and privateNegate from TinySecp256k1Interface

6.1.0

added

  • taproot support for payments (p2tr) and PSBT. See taproot.spec.ts integration test for examples. (#1742)

6.0.2

fixed

  • p2sh payment now uses empty Buffer for redeem.output when redeemScript is OP_FALSE (#1802)
  • Fix ripemd160 hashing fallback issue (#1812)

6.0.1

  • No changes to public API

6.0.0

removed

  • bip32: Removed the re-export. Please add as dependency to your app instead.
  • ECPair: Please use bip32 moving forward. ecpair package was created for those who need it.
  • TransactionBuilder: Any internal files used only in TB (classify, templates, etc.) were also removed.

added

  • taproot segwit v1 address support (bech32m) via address module (#1676)
  • hashForWitnessV1 method on Transaction class (#1745)

fixed

  • Transaction version read/write differed. (#1717)

5.2.0

changed

  • Updated PSBT to allow for witnessUtxo and nonWitnessUtxo simultaneously (Re: segwit psbt bug) (#1563)

added

  • PSBT methods getInputType, inputHasPubkey, inputHasHDKey, outputHasPubkey, outputHasHDKey (#1563)

5.1.10

fixed

  • Fixed psbt.signInputAsync (and consequentially all Async signing methods) not handling rejection of keypair.sign properly (#1582)

5.1.9

fixed

  • Fixed errors for psbt.txOutputs getter (#1578)

5.1.8

fixed

  • Throw errors when p2wsh or p2wpkh contain uncompressed pubkeys (#1573)

added

  • Add txInputs and txOutputs for Psbt (#1561)

changed

  • (Not exposed) Added BufferWriter to help ease maintenance of certain forks of this library (#1533)

5.1.7

fixed

  • Fixed Transaction class Output interface typing for TypeScript (#1506)
  • Add weight() to Block class, add optional includeWitness arg to Transaction byteLength method (#1515)
  • Match the old TransactionBuilder behavior of allowing for multiple instances of the same pubkey to be in a p2ms script for PSBT (#1519)

added

  • Allow the API consumer to pass in the finalizer functions to allow for any type of transaction to be finalized. It places the most crucial part of transaction construction on the consumer, and should be used with caution. (#1491)

5.1.6

fixed

  • PsbtOutputExtended did not support using the address attribute properly. It is now fixed.

5.1.5

added

  • Psbt now has getFee(): number for use when all inputs are finalized. It returns the satoshi fee of the transaction. Calling getFee, getFeeRate, or extractTransaction will cache these values so if you call one after the other, the second call will return immediately.

5.1.4

changed

  • Psbt inputs using segwit scripts can now work with nonWitnessUtxo as well as the original witnessUtxo. The reasoning for this is that nonWitnessUtxo has all the information contained in the witnessUtxo, so rejecting signing even though we have all the info we need is unnecessary. Trying to sign a non-segwit script with a witnessUtxo will still throw an Error as it should.

5.1.3

changed

  • TypeScript types: Made Signer and SignerAsync use any for network since we only check for equivalence. (#1448)
  • TypeScript types: Made the args for addInput and addOutput for Psbt actually accept updateInput and updateOutput parameters. (#1449)

5.1.2

added

  • ECPair and bip32 objects now have a lowR boolean attribute defaulted to false. You may set it to true to ensure that the sign method uses low R values (#1442) (This is to enable low R usage in Psbt, since we decided not to give the low R flag to the Psbt class, since it makes more sense to be an attribute of the Signer interface)

5.1.1

changed

  • Name inconsistencies for Psbt class. (Quick fix)

5.1.0

added

  • A new Psbt class for creating, distributing, combining, signing, and compiling Transactions (#1425)
  • A name attribute to the Payment interface. P2SH and P2WSH are nested with '-' as separator, and p2ms is in the format of 'p2ms(m of n)'' all others are just hard coded. (#1433)

changed

  • TransactionBuilder: Migrate to stricter type checks during sign by switching to a single object parameter (#1416)
  • tests: Use regtest-client as separate library (#1421)

5.0.5

added

  • Added ECPairInterface Stack and StackElement interfaces to the main index.ts export (TypeScript only affected)

5.0.4

added

  • low R value support for ECPair, bip32, and TransactionBuilder (default off) via txb.setLowR() (#1385)

fixed

  • Fixed Various TypeScript types that have been pushed out since v5.0.0 (#1388)

5.0.0

added

  • TypeScript support (#1319)
  • Block.prototype.checkTxRoots will check the merkleRoot and witnessCommit if it exists against the transactions array. (e52abec) (0426c66)

changed

  • Transaction.prototype.getHash now has forWitness?: boolean which when true returns the hash for wtxid (a652d04)
  • Block.calculateMerkleRoot now has forWitness?: boolean which when true returns the witness commit (a652d04)

removed

  • Block.prototype.checkMerkleRoot was removed, please use checkTxRoots (0426c66)

4.0.5

fixed

  • Fixed bug where Angular apps break due to lack of crypto at build time. Reverted #1373 and added (6bead5d).

4.0.4

fixed

  • Fixed bug where Electron v4 breaks due to lack of 'rmd160' alias for ripemd160 hash. (#1373)

4.0.3

fixed

  • Fixed TransactionBuilder to require that the Transaction has outputs before signing (#1151)
  • Fixed payments.p2sh, which now takes the network from the redeem attribute if one is not given in the object argument (#1232)
  • Fixed Block.calculateTarget to allow for exponents up to 29 (#1285)
  • Fixed some low priority rarely occurring bugs with multisig payments and TransactionBuilder multisig processing (#1307)

added

  • Regtest network object to networks (#1261)

4.0.2

fixed

  • Fixed TransactionBuilder not throwing when payment type validation should fail (#1195)

removed

  • Removed rogue package.json from src/payments (#1216)

4.0.1

fixed

  • Fixed tiny-secp256k1 dependency version (used ecurve) (#1139)
  • Fixed TransactionBuilder throwing when trying to sign P2WSH(P2WPKH) (#1135)

4.0.0

added

  • Added bip32 dependency as a primary export (#1073)
  • Added ECPair.fromPrivateKey (#1070)
  • Added payments export, with support for p2pkh, p2pk, p2ms, p2sh, p2wpkh, p2wsh and embed payment types (#1096, #1119)
  • Added script.signature.encode/decode for script signatures (#459)

changed

  • ECPair.prototype.sign now returns a 64-byte signature Buffer, not an ECSignature object (#1084)
  • ECPair (and all ECDSA code) now uses tiny-secp256k1, which uses the libsecp256k1 library (#1070)
  • TransactionBuilder internal variables are now __ prefixed to discourage public usage (#1038)
  • TransactionBuilder now defaults to version 2 transaction versions (#1036)
  • script.decompile now returns [Buffer] or null, if decompilation failed (#1039)

fixed

  • Fixed TransactionBuilder rejecting uncompressed public keys to comply with BIP143 (#987)

removed

  • Removed Node 4/5 LTS support (#1080)
  • Removed ECPair.fromPublicKeyBuffer, use ECPair.fromPublicKey (#1070)
  • Removed ECPair.prototype.getAddress, use payments.p2pkh instead (#1085)
  • Removed ECPair.prototype.getPrivateKey, use ECPair.prototype.privateKey property (#1070)
  • Removed ECPair.prototype.getPublicKey, use ECPair.prototype.publicKey property (#1070)
  • Removed ECPair.prototype.getNetwork, use ECPair.prototype.network property (#1070)
  • Removed ECSignature, use script.signature.encode/decode instead (#459)
  • Removed HDNode, use bip32 export instead (#1073)
  • Removed bufferutils (#1035)
  • Removed networks.litecoin, BYO non-Bitcoin networks instead (#1095)
  • Removed script.isCanonicalSignature, use script.isCanonicalScriptSignature instead (#1094)
  • Removed script.*.input/output/check functions (templates), use payments.* instead (templates previously added in #681, #682) (#1119)
  • Removed dependency bigi, uses bn.js internally now (via tiny-secp256k1) (#1070, #1112)
  • Removed public access to ECPair constructor, use exported functions ECPair.fromPrivateKey, ECPair.fromWIF, ECPair.makeRandom, or ECPair.fromPublicKey (#1070)

3.3.2

fixed

  • Fixed decodeStack arbitrarily supporting non-Array arguments (#942)

3.3.1

changed

  • Increased the TransactionBuilder maximumFeeRate from 1000 to 2500 satoshis/byte. (#931)

3.3.0

added

  • Added ECSignature.prototype.toRSBuffer/ECSignature.fromRSBuffer (#915)
  • Added support to TransactionBuilder for 64-byte signatures via .sign (#915)
  • Added support to TransactionBuilder for the .publicKey standard as an alternative to .getPublicKey() (#915)

3.2.1

fixed

  • Fixed script.scripthash.input.check recursion (#898)
  • Fixed TransactionBuilder sometimes ignoring witness value (#901)
  • Fixed script.witnessScriptHash.input implementation (previously used the P2SH impl.) (#911)

3.2.0

added

  • Added address.fromBech32/toBech32 (#846)

3.1.0

added

  • Added Transaction.prototype.virtualSize (#811)
  • Added Transaction.prototype.weight (#811)

3.0.0

From this release users can expect out-of-the-box Segregated Witness support. The majority of breaking changes have been in how script encoding/decoding occurs, with the introduction of witness stacks.

added

  • Added script.types enums (#679)
  • Added script.*.*.{check,encode,decode[,encodeStack,decodeStack]} functions (#681, #682)
  • Added minimal TransactionBuilder.prototype.build absurd fee-safety (#696)
  • Added script.(decompile/compile)PushOnly and script.toStack functions (#700)
  • Added Transaction.prototype.toBuffer Segregated Witness serialization support (#684, #701)
  • Added Transaction.prototype.hasWitnesses (#718)
  • Added script.witnessCommitment.* template
  • Added TransactionBuilder.prototype.sign now has two additional parameters, witnessValue, and witnessScript
  • Added Transaction.hashForWitnessV0 and Transaction.setWitness (5c2fdb60436714f18440dc709f0be065928c1e49)

fixed

  • Fixed script must compile minimally (#638)
  • Fixed Transaction and Block versions should be Int32, signed integers (#662)

removed

  • Removed ecdsa.calcPubKeyRecoveryParam, ecdsa.recoverPubKey (#456)
  • Removed buffer-equals/buffer-compare dependencies (#650)
  • Removed HDNode.prototype.toString (#665)
  • Removed dogecoin network (#675)
  • Removed message export, moved to bitcoinjs-message (#456)

renamed

  • Removed script.* functions in favour of bitcoin.script.*.(input/output).(encode/decode/check) style (#682)

2.3.0

added

  • Added HDNode.prototype.isNeutered (#536)
  • Added HDNode.prototype.derivePath (#538)
  • Added typeforce checking for HDNode.prototype.derive* (#539)
  • Added Transaction.prototype.isCoinbase (#578)
  • Added Block.prototype.checkMerkleRoot (#580)
  • Added Block.calculateMerkleRoot (#580)
  • Added TransactionBuilder.prototype.setVersion (#599)
  • Added script.isWitnessPubKeyHashOutput (#602)
  • Added script.isWitnessScriptHashOutput (#602)
  • Added script.witnessPubKeyHashOutput (#602)
  • Added script.witnessScriptHashOutput (#602)
  • Added script.witnessScriptHashInput (#602)

fixed

  • Fixed "BIP32 is undefined" when network list given to HDNode but no compatible version found (#550)
  • Fixed writePushDataInt output to adhere to minimal data push policy (#617)

2.2.0

added

  • Added Block.calculateTarget for difficulty calculations (#509)
  • Added Block.prototype.checkProofOfWork (#509)
  • Added opcodes.OP_CHECKLOCKTIMEVERIFY alias for OP_NOP2 (#511)
  • Added script.number.[encode/decode] for CScriptNum-encoded Buffers (#516)
  • Added TransactionBuilder.prototype.setLockTime (#507)

fixed

  • Bumped typeforce version to fix erroneous error message from types.Hash*bit types (#534)

2.1.4

fixed

  • script.isPubKeyHashOutput and script.isScriptHashOutput no longer allow for non-minimal data pushes (per bitcoin/bitcoin IsStandard policy) (#499)
  • TransactionBuilder.addOutput now allows for SIGHASH_SINGLE, throwing if the contract is violated (#504)
  • remove use of const, use ES5 only (#502)

2.1.3

fixed

  • Bumped typeforce to 1.5.5 (see #493)

2.1.2

fixed

  • Add missing CHANGELOG entry for 2.1.1

2.1.1

changed

  • removed use of buffer-reverse, dependency only kept for bufferutils.reverse, to be deprecated (#478)

fixed

  • isMultisigOutput no longer allows data chunks for m/n (#482)
  • isMultisigOutput's n value must now match the number of public keys (as per bitcoin/bitcoin) (#484)

2.1.0

From this release users should use the HDNode directly (compared to accessing .keyPair) when performing ECDSA operations such as sign or verify. Ideally you shoud not have to directly access HDNode internals for general usage, as it can often be confusing and error prone.

added

  • ECPair.prototype.getNetwork
  • HDNode.prototype.getNetwork, wraps the underlying keyPair's getNetwork method
  • HDNode.prototype.getPublicKeyBuffer, wraps the underlying keyPair's getPublicKeyBuffer method
  • HDNode.prototype.sign, wraps the underlying keyPair's sign method
  • HDNode.prototype.verify, wraps the underlying keyPair's verify method

2.0.0

In this release we have strived to simplify the API, using native types wherevever possible to encourage cross-compatibility with other open source community modules.

The ecdsa module has been removed in lieu of using a new ECDSA module (for performance and safety reasons) during the 2.x.y major release. Several other cumbersome modules have been removed, with their new independent modules recommended for usage instead for greater modularity in your projects.


Backward incompatible changes:

added

  • export address, for address based utility functions, most compatible, just without Address instantiation, see #401, #444
  • export script, for script based utility functions, mostly compatible, just without Script instantiation, see #438, #444
  • export ECPair, a merged replacement for ECKey/ECPubKey, invalid types will throw via typeforce

changed

  • address.toOutputScript, ECPair.prototype.fromWIF and HDNode.prototype.fromBase58 no longer automatically detect the network, networks.bitcoin is always assumed unless given.
  • assert was used for type checking, now replaced by typeforce
  • BIP66 compliant strict DER signature validation was added to ECSignature.fromDER, changing the exact exception messages slightly, see #448.

  • new HDNode(d/Q, chainCode, network) -> new HDNode(keyPair, chainCode), now uses ECPair

  • HDNode.prototype.toBase58(false) -> HDNode.prototype.neutered().toBase58() for exporting an extended public key
  • HDNode.prototype.toBase58(true) -> HDNode.prototype.toBase58() for exporting an extended private key

  • Transaction.prototype.hashForSignature(prevOutScript, inIndex, hashType) -> Transaction.prototype.hashForSignature(inIndex, prevOutScript, hashType)

  • Transaction.prototype.addInput(hash, ...): hash could be a string, Transaction or Buffer -> hash can now only be a Buffer.
  • Transaction.prototype.addOutput(scriptPubKey, ...): scriptPubKey could be a string, Address or a Buffer -> scriptPubKey can now only be a Buffer.
  • TransactionBuilder API unchanged.

removed

  • export Address, strings are now used, benchwith no performance loss for most use cases
  • export base58check, use bs58check instead
  • export ecdsa, use ecurve instead
  • export ECKey, use new export ECPair instead
  • export ECPubKey, use new export ECPair instead
  • export Wallet, see README.md#complementing-libraries instead
  • export Script, use new utility export script instead (#438 for more information)

  • crypto.HmacSHA256, use node crypto instead

  • crypto.HmacSHA512, use node crypto instead

  • Transaction.prototype.sign, use TransactionBuilder.prototype.sign

  • Transaction.prototype.signInput, use TransactionBuilder.prototype.sign
  • Transaction.prototype.validateInput, use Transaction.prototype.hashForSignature and ECPair.verify

  • HDNode.fromBuffer, use HDNode.fromBase58 instead

  • HDNode.fromHex, use HDNode.fromBase58 instead
  • HDNode.toBuffer, use HDNode.prototype.toBase58 instead
  • HDNode.toHex, use HDNode.prototype.toBase58 instead

  • networks.*.magic, see the comment here

  • networks.[viacoin|viacointestnet|gamerscoin|jumbucks|zetacoin], import these yourself (see #383/a0e6ee7)
  • networks.*.estimateFee, out-dated

renamed

  • Message -> message
  • scripts -> script
  • scripts.dataOutput -> script.nullDataOutput (per convention)