{"_id":"@ledgerhq/ledger-bitcoin","_rev":"3-80a9ddfc474ace6542ad494125ed5a21","name":"@ledgerhq/ledger-bitcoin","dist-tags":{"latest":"0.3.1"},"versions":{"0.3.0":{"name":"@ledgerhq/ledger-bitcoin","version":"0.3.0","keywords":["Ledger","LedgerWallet","btc","Bitcoin","NanoS","NanoX","Hardware Wallet"],"license":"Apache-2.0","_id":"@ledgerhq/ledger-bitcoin@0.3.0","maintainers":[{"name":"phenry-ledger","email":"pascal.henry@ledger.fr"},{"name":"sergii-shkolin","email":"sergii.shkolin-ext@ledger.fr"},{"name":"gbrahm-ledger","email":"gandalf.brahm@ledger.fr"},{"name":"thomas.coudray","email":"thomas.coudray@ledger.fr"},{"name":"ldg-github-ci","email":"infra-purchasing@ledger.fr"},{"name":"vbouzon","email":"vincent.bouzon@live.fr"},{"name":"ledger-releaser","email":"team-secops+ledger-releaser-npmjs@ledger.fr"}],"homepage":"https://github.com/LedgerHQ/app-bitcoin-new#readme","bugs":{"url":"https://github.com/LedgerHQ/app-bitcoin-new/issues"},"dist":{"shasum":"9eb9d12350d8fde650d66b40350dfec84f5473cd","tarball":"https://registry.npmjs.org/@ledgerhq/ledger-bitcoin/-/ledger-bitcoin-0.3.0.tgz","fileCount":26,"integrity":"sha512-T5jV34CD+vDMMkQBONIkwf1p2hbOjDVbCkLCCTEL5BH4Zic/8jAiojvzIPFA6n7ZGlavzH7oaUVI6lWMGYHGZA==","signatures":[{"sig":"MEUCIByOyl80W7QfT6vpj2fmY/KTaBgRFTGFHwtiyQhrufOpAiEAgR/3llJxQ3Nr5cW2ArXhdCIWnPStYZGKUAe9T7jiE64=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ledgerhq%2fledger-bitcoin@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v0.2"}},"unpackedSize":188357},"main":"build/main/index.js","_from":"file:tmp-downloads/jfrog-ledger-green/@ledgerhq/ledger-bitcoin/-/@ledgerhq/ledger-bitcoin-0.3.0.tgz","types":"build/main/index.d.ts","engines":{"node":">=14"},"scripts":{"doc":"run-s doc:html && open-cli build/docs/index.html","fix":"run-s fix:*","test":"jest --detectOpenHandles --verbose","build":"tsc -p tsconfig.json","clean":"rm -rf build .tsbuildinfo","doc:html":"typedoc src/ --exclude **/*.test.ts --out build/docs","doc:json":"typedoc src/ --exclude **/*.test.ts --json build/docs/typedoc.json","fix:lint":"eslint src --ext .ts --fix","fix:prettier":"prettier \"src/**/*.ts\" --write"},"typings":"build/main/index.d.ts","_npmUser":{"name":"ledger-releaser","email":"team-secops+ledger-releaser-npmjs@ledger.fr"},"prettier":{"singleQuote":true},"_resolved":"/app/tmp-downloads/jfrog-ledger-green/@ledgerhq/ledger-bitcoin/-/@ledgerhq/ledger-bitcoin-0.3.0.tgz","_integrity":"sha512-T5jV34CD+vDMMkQBONIkwf1p2hbOjDVbCkLCCTEL5BH4Zic/8jAiojvzIPFA6n7ZGlavzH7oaUVI6lWMGYHGZA==","repository":{"url":"git+https://github.com/LedgerHQ/app-bitcoin-new.git","type":"git"},"_npmVersion":"10.9.4","description":"Ledger Hardware Wallet Bitcoin Application Client","directories":{},"_nodeVersion":"20.15.1","dependencies":{"bip32-path":"^0.4.2","bitcoinjs-lib":"^6.1.7","@ledgerhq/hw-transport":"^6.31.13","@bitcoinerlab/secp256k1":"^1.2.0","@bitcoinerlab/descriptors":"^1.1.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.5.1","cspell":"^4.2.8","ts-jest":"^27.1.5","ts-node":"^10.9.2","typedoc":"^0.24.8","open-cli":"^7.2.0","prettier":"^2.8.8","babel-jest":"^27.5.1","typescript":"^4.9.5","@types/jest":"^27.5.2","@types/node":"^20.17.10","npm-run-all":"^4.1.5","@ledgerhq/logs":"^6.13.0","standard-version":"^9.5.0","@babel/preset-env":"^7.26.0","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0","@ledgerhq/hw-transport-node-speculos-http":"^6.31.0"},"_npmOperationalInternal":{"tmp":"tmp/ledger-bitcoin_0.3.0_1768298449514_0.239619454647507","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@ledgerhq/ledger-bitcoin","version":"0.3.1","keywords":["Ledger","LedgerWallet","btc","Bitcoin","NanoS","NanoX","Hardware Wallet"],"license":"Apache-2.0","_id":"@ledgerhq/ledger-bitcoin@0.3.1","maintainers":[{"name":"phenry-ledger","email":"pascal.henry@ledger.fr"},{"name":"sergii-shkolin","email":"sergii.shkolin-ext@ledger.fr"},{"name":"gbrahm-ledger","email":"gandalf.brahm@ledger.fr"},{"name":"thomas.coudray","email":"thomas.coudray@ledger.fr"},{"name":"ldg-github-ci","email":"infra-purchasing@ledger.fr"},{"name":"vbouzon","email":"vincent.bouzon@live.fr"},{"name":"ledger-releaser","email":"team-secops+ledger-releaser-npmjs@ledger.fr"}],"homepage":"https://github.com/LedgerHQ/app-bitcoin-new#readme","bugs":{"url":"https://github.com/LedgerHQ/app-bitcoin-new/issues"},"dist":{"shasum":"f8c183845930679a355d0db1e83747c90f09ae1d","tarball":"https://registry.npmjs.org/@ledgerhq/ledger-bitcoin/-/ledger-bitcoin-0.3.1.tgz","fileCount":26,"integrity":"sha512-rzgU7+rvSsYVSI3cNAIfk9NUaLF1k4aFl3MuU66zV8Pyvy7rikcrbyPaPIAdNIdqYVrOE7evDB0b6aEwTRqLHg==","signatures":[{"sig":"MEYCIQCK9N43mUF0MLUyQk33AnUJPdmGWCqUYYozR6+nJhbGsQIhAIrQHmQsFq/KngIMwL0SWkzVEkerh7ti+N8+WN1WfPOj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ledgerhq%2fledger-bitcoin@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v0.2"}},"unpackedSize":190645},"main":"build/main/index.js","_from":"file:tmp-downloads/jfrog-ledger-green/@ledgerhq/ledger-bitcoin/-/@ledgerhq/ledger-bitcoin-0.3.1.tgz","types":"build/main/index.d.ts","engines":{"node":">=18.14"},"scripts":{"doc":"run-s doc:html && open-cli build/docs/index.html","fix":"run-s fix:*","test":"jest --detectOpenHandles --verbose","build":"tsc -p tsconfig.json","clean":"rm -rf build .tsbuildinfo","doc:html":"typedoc src/ --exclude **/*.test.ts --out build/docs","doc:json":"typedoc src/ --exclude **/*.test.ts --json build/docs/typedoc.json","fix:lint":"eslint src --ext .ts --fix","fix:prettier":"prettier \"src/**/*.ts\" --write"},"typings":"build/main/index.d.ts","_npmUser":{"name":"ledger-releaser","email":"team-secops+ledger-releaser-npmjs@ledger.fr"},"prettier":{"singleQuote":true},"_resolved":"/app/tmp-downloads/jfrog-ledger-green/@ledgerhq/ledger-bitcoin/-/@ledgerhq/ledger-bitcoin-0.3.1.tgz","_integrity":"sha512-rzgU7+rvSsYVSI3cNAIfk9NUaLF1k4aFl3MuU66zV8Pyvy7rikcrbyPaPIAdNIdqYVrOE7evDB0b6aEwTRqLHg==","repository":{"url":"git+https://github.com/LedgerHQ/app-bitcoin-new.git","type":"git"},"_npmVersion":"10.9.4","description":"Ledger Hardware Wallet Bitcoin Application Client","directories":{},"_nodeVersion":"20.15.1","dependencies":{"bip32-path":"^0.4.2","bitcoinjs-lib":"^7.0.1","@ledgerhq/hw-transport":"^6.31.13","@bitcoinerlab/secp256k1":"^1.2.0","@bitcoinerlab/descriptors":"^3.0.6"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","cspell":"^4.2.8","ts-jest":"^29.4.6","ts-node":"^10.9.2","typedoc":"^0.28.17","open-cli":"^7.2.0","prettier":"^2.8.8","babel-jest":"^30.2.0","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^20.17.10","npm-run-all":"^4.1.5","@ledgerhq/logs":"^6.13.0","standard-version":"^9.5.0","@babel/preset-env":"^7.26.0","@typescript-eslint/parser":"^5.62.0","@typescript-eslint/eslint-plugin":"^5.62.0","@ledgerhq/hw-transport-node-speculos-http":"^6.31.0"},"_npmOperationalInternal":{"tmp":"tmp/ledger-bitcoin_0.3.1_1774450910102_0.029673098083211613","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-01-13T10:00:49.332Z","modified":"2026-08-10T17:13:58.051Z","0.3.0":"2026-01-13T10:00:49.691Z","0.3.1":"2026-03-25T15:01:50.257Z"},"bugs":{"url":"https://github.com/LedgerHQ/app-bitcoin-new/issues"},"license":"Apache-2.0","homepage":"https://github.com/LedgerHQ/app-bitcoin-new#readme","keywords":["Ledger","LedgerWallet","btc","Bitcoin","NanoS","NanoX","Hardware Wallet"],"repository":{"url":"git+https://github.com/LedgerHQ/app-bitcoin-new.git","type":"git"},"description":"Ledger Hardware Wallet Bitcoin Application Client","maintainers":[{"email":"pascal.henry@ledger.fr","name":"phenry-ledger"},{"email":"sergii.shkolin-ext@ledger.fr","name":"sergii-shkolin"},{"email":"gandalf.brahm@ledger.fr","name":"gbrahm-ledger"},{"email":"infra-purchasing@ledger.fr","name":"ldg-github-ci"},{"email":"vincent.bouzon@live.fr","name":"vbouzon"},{"email":"team-secops+ledger-releaser-npmjs@ledger.fr","name":"ledger-releaser"}],"readme":"# Ledger Bitcoin application client\n\n## Overview\n\nTypeScript client for Ledger Bitcoin application. Supports versions 2.1.0 and above of the app.\n\nMain repository and documentation: https://github.com/LedgerHQ/app-bitcoin-new\n\n## Install\n\n```bash\n$ yarn add @ledgerhq/ledger-bitcoin\n```\n\nOr if you prefer using npm:\n\n```bash\n$ npm install @ledgerhq/ledger-bitcoin\n```\n\n## Building\n\n```bash\n$ npm install\n$ npm run build\n```\n\n## Getting started\n\nThe following example showcases all the main methods of the `Client`'s interface.\n\nMore examples can be found in the [test suite](src/__tests__/appClient.test.ts).\n\nTesting the `signPsbt` method requires a valid PSBT, and provide the corresponding wallet policy; it is skipped by default in the following example.\n\n```javascript\nimport { AppClient, DefaultWalletPolicy, WalletPolicy } from '@ledgerhq/ledger-bitcoin';\nimport Transport from '@ledgerhq/hw-transport-node-hid';\n\n// This examples assumes the Bitcoin Testnet app is running.\n// Make sure to use addresses compatible with mainnet otherwise, by using paths where the BIP-44 coin_type\n// is \"0'\" and not \"1'\".\n\nasync function main(transport) {\n    const app = new AppClient(transport);\n\n    // ==> Get the master key fingerprint\n    const fpr = await app.getMasterFingerprint();\n    console.log(\"Master key fingerprint:\", fpr.toString(\"hex\"));\n\n    // ==> Get and display on screen the first taproot address\n    const firstTaprootAccountPubkey = await app.getExtendedPubkey(\"m/86'/1'/0'\");\n    const firstTaprootAccountPolicy = new DefaultWalletPolicy(\n        \"tr(@0/**)\",\n        `[${fpr}/86'/1'/0']${firstTaprootAccountPubkey}`\n    );\n\n    const firstTaprootAccountAddress = await app.getWalletAddress(\n        firstTaprootAccountPolicy,\n        null,\n        0,\n        0,\n        true // show address on the wallet's screen\n    );\n\n    console.log(\"First taproot account receive address:\", firstTaprootAccountAddress);\n\n    // ==> Register a multisig wallet named \"Cold storage\"\n\n    const ourPubkey = await app.getExtendedPubkey(\"m/48'/1'/0'/2'\");\n    const ourKeyInfo = `[${fpr}/48'/1'/0'/2']${ourPubkey}`;\n    const otherKeyInfo = \"[76223a6e/48'/1'/0'/2']tpubDE7NQymr4AFtewpAsWtnreyq9ghkzQBXpCZjWLFVRAvnbf7vya2eMTvT2fPapNqL8SuVvLQdbUbMfWLVDCZKnsEBqp6UK93QEzL8Ck23AwF\";\n\n    const multisigPolicy = new WalletPolicy(\n        \"Cold storage\",\n        \"wsh(sortedmulti(2,@0/**,@1/**))\", // a 2-of-2 multisig policy template\n        [\n            otherKeyInfo, // some other bitcoiner\n            ourKeyInfo,   // that's us\n        ]\n    )\n\n    const [policyId, policyHmac] = await app.registerWallet(multisigPolicy);\n\n    console.log(`Policy hmac: ${policyHmac.toString(\"hex\")}. Store it safely (together with the policy).`);\n\n    console.assert(policyId.compare(multisigPolicy.getId()) == 0)  //  should never fail\n\n    // ==> Derive and show an address for \"Cold storage\" that was just registered\n\n    const multisigAddress = await app.getWalletAddress(multisigPolicy, policyHmac, 0, 0, true);\n    console.log(`Multisig wallet address: ${multisigAddress}`);\n\n    // ==> Sign a psbt\n\n    // TODO: set a wallet policy and a valid psbt file in order to test psbt signing\n    const psbt = null; // a base64-encoded psbt, or a binary psbt in a Buffer\n    const signingPolicy = null; // an instance of WalletPolicy\n    const signingPolicyHmac = null; // if not a default wallet policy, this must also be set\n    if (!psbt || !signingPolicy) {\n        console.log(\"Nothing to sign :(\");\n        await transport.close();\n        return;\n    }\n\n    // result will be a list of triples [i, partialSig], where:\n    // - i is the input index\n    // - partialSig is an instance of PartialSignature; it contains a pubkey and a signature,\n    //   and it might contain a tapleaf_hash.\n    const result = await app.signPsbt(psbt, signingPolicy, signingPolicyHmac);\n\n    console.log(\"Returned signatures:\");\n    console.log(result);\n\n    await transport.close();\n}\n\nTransport.default.create()\n    .then(main)\n    .catch(console.log);\n```\n","readmeFilename":"README.md"}