refactor(bitcoin_client_js): bump bitcoinjs-lib to v7 and keep Buffer/number API via internal adapters
What changed, and why it matters
This is a routine JavaScript library upgrade. The project moved its bitcoinjs-lib dependency from version 6 to version 7, which changed some internal return types from Buffer to Uint8Array and from number to bigint. The commit adds small adapter functions (like Buffer.from(...) and a bigint-to-number helper) so the rest of the code keeps working without wider rewrites. There is no direct evidence in the commit that this fixes an active security vulnerability; it reads as a compatibility/refactoring change.
Treat as a maintenance/refactor commit. Review the adapter functions (asBuffer, asSatoshiNumber, sha256AsBuffer) for correct handling of Uint8Array views and large satoshi values. Run the existing test suite and PSBT signing tests against a Ledger device or simulator to confirm no regressions in transaction serialization or Merkle hashing. Monitor bitcoinjs-lib v7 release notes for any security advisories, but do not assume this commit itself resolves a known vulnerability.
Security signals we found
Dependency upgrade of a core cryptographic library (bitcoinjs-lib v6 → v7)
API-adapter pattern wrapping Uint8Array/bigint returns back to Buffer/number
No explicit security fix, CVE reference, or vulnerability description in commit message or diff
Potential for subtle type-conversion bugs if adapters mishandle endianness, length, or large bigint values
Evidence from the diff
The commit bumps bitcoinjs-lib 6.1.7 → 7.0.1 and @bitcoinerlab/descriptors 3.0.5 → 3.0.6. bitcoinjs-lib v7 changed crypto.sha256 to return Uint8Array and transaction values to bigint. The patch introduces local adapters (asBuffer, asSatoshiNumber, sha256AsBuffer) in clientCommands.ts, merkle.ts, policy.ts, and psbtv2.ts to preserve the existing Buffer/number API. package-lock.json reflects the transitive dependency updates. No security advisory language, CVE, or researcher attribution is present in the commit materials.
Changed components
bitcoin_client_js/src/lib/clientCommands.tsbitcoin_client_js/src/lib/merkle.tsbitcoin_client_js/src/lib/policy.tsbitcoin_client_js/src/lib/psbtv2.tsbitcoin_client_js/package.jsonbitcoin_client_js/package-lock.jsonInspect captured patch +390 / −137
diff --git a/bitcoin_client_js/package-lock.json b/bitcoin_client_js/package-lock.json
index 522ef81..002e95f 100644
--- a/bitcoin_client_js/package-lock.json
+++ b/bitcoin_client_js/package-lock.json
@@ -9,11 +9,11 @@
"version": "0.3.0",
"license": "Apache-2.0",
"dependencies": {
- "@bitcoinerlab/descriptors": "^3.0.5",
+ "@bitcoinerlab/descriptors": "^3.0.6",
"@bitcoinerlab/secp256k1": "^1.2.0",
"@ledgerhq/hw-transport": "^6.31.13",
"bip32-path": "^0.4.2",
- "bitcoinjs-lib": "^6.1.7"
+ "bitcoinjs-lib": "^7.0.1"
},
"devDependencies": {
"@babel/preset-env": "^7.26.0",
@@ -1784,9 +1784,9 @@
"license": "MIT"
},
"node_modules/@bitcoinerlab/descriptors": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@bitcoinerlab/descriptors/-/descriptors-3.0.5.tgz",
- "integrity": "sha512-iXr899QcugDExx3Q/7AfsuCfGGiw1ILIVbe5axMbOYOcEvijKLCD7R/nVLaW8e0jiQ6BzT1K2WbPWRN4Ekc/+A==",
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@bitcoinerlab/descriptors/-/descriptors-3.0.6.tgz",
+ "integrity": "sha512-ofnRRCw5O+7elj8CzRtiLmCg+0j6uCxwJ7z4J5SFK1FSmVWjfmgyol3TxvNTQXzu80BYeUqL+qUW/UdKRZyjWA==",
"license": "MIT",
"dependencies": {
"@bitcoinerlab/miniscript": "^2.0.0",
@@ -1808,49 +1808,6 @@
}
}
},
- "node_modules/@bitcoinerlab/descriptors/node_modules/base-x": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz",
- "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==",
- "license": "MIT"
- },
- "node_modules/@bitcoinerlab/descriptors/node_modules/bitcoinjs-lib": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-7.0.1.tgz",
- "integrity": "sha512-vwEmpL5Tpj0I0RBdNkcDMXePoaYSTeKY6mL6/l5esbnTs+jGdPDuLp4NY1hSh6Zk5wSgePygZ4Wx5JJao30Pww==",
- "license": "MIT",
- "dependencies": {
- "@noble/hashes": "^1.2.0",
- "bech32": "^2.0.0",
- "bip174": "^3.0.0",
- "bs58check": "^4.0.0",
- "uint8array-tools": "^0.0.9",
- "valibot": "^1.2.0",
- "varuint-bitcoin": "^2.0.0"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@bitcoinerlab/descriptors/node_modules/bs58": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz",
- "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==",
- "license": "MIT",
- "dependencies": {
- "base-x": "^5.0.0"
- }
- },
- "node_modules/@bitcoinerlab/descriptors/node_modules/bs58check": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-4.0.0.tgz",
- "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==",
- "license": "MIT",
- "dependencies": {
- "@noble/hashes": "^1.2.0",
- "bs58": "^6.0.0"
- }
- },
"node_modules/@bitcoinerlab/miniscript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@bitcoinerlab/miniscript/-/miniscript-2.0.0.tgz",
@@ -2124,6 +2081,40 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
+ "node_modules/@emnapi/core": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz",
+ "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz",
+ "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@eslint-community/eslint-utils": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
@@ -2921,6 +2912,19 @@
"integrity": "sha512-kJFu1+asWQmU9XlfR1RM3lYR76wuEoPyZvkI/CNjpft78BQr3+MMf3Nu77ABzcKFnhIcmAkOLlDQ6B8L6hDXHA==",
"license": "Apache-2.0"
},
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+ "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@tybys/wasm-util": "^0.10.0"
+ }
+ },
"node_modules/@noble/curves": {
"version": "1.9.7",
"resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz",
@@ -3130,6 +3134,17 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
"node_modules/@types/babel__core": {
"version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -3534,6 +3549,34 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/@unrs/resolver-binding-android-arm-eabi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz",
+ "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-android-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz",
+ "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
"node_modules/@unrs/resolver-binding-darwin-arm64": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz",
@@ -3548,6 +3591,233 @@
"darwin"
]
},
+ "node_modules/@unrs/resolver-binding-darwin-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz",
+ "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-freebsd-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz",
+ "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz",
+ "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz",
+ "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz",
+ "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz",
+ "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz",
+ "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz",
+ "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz",
+ "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz",
+ "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz",
+ "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz",
+ "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-wasm32-wasi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz",
+ "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^0.2.11"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz",
+ "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz",
+ "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz",
+ "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
"node_modules/abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
@@ -3986,9 +4256,9 @@
"license": "MIT"
},
"node_modules/base-x": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz",
- "integrity": "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz",
+ "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==",
"license": "MIT"
},
"node_modules/base64-js": {
@@ -4095,38 +4365,21 @@
}
},
"node_modules/bitcoinjs-lib": {
- "version": "6.1.7",
- "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.7.tgz",
- "integrity": "sha512-tlf/r2DGMbF7ky1MgUqXHzypYHakkEnm0SZP23CJKIqNY/5uNAnMbFhMJdhjrL/7anfb/U8+AlpdjPWjPnAalg==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-7.0.1.tgz",
+ "integrity": "sha512-vwEmpL5Tpj0I0RBdNkcDMXePoaYSTeKY6mL6/l5esbnTs+jGdPDuLp4NY1hSh6Zk5wSgePygZ4Wx5JJao30Pww==",
"license": "MIT",
"dependencies": {
"@noble/hashes": "^1.2.0",
"bech32": "^2.0.0",
- "bip174": "^2.1.1",
- "bs58check": "^3.0.1",
- "typeforce": "^1.11.3",
- "varuint-bitcoin": "^1.1.2"
+ "bip174": "^3.0.0",
+ "bs58check": "^4.0.0",
+ "uint8array-tools": "^0.0.9",
+ "valibot": "^1.2.0",
+ "varuint-bitcoin": "^2.0.0"
},
"engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/bitcoinjs-lib/node_modules/bip174": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.1.1.tgz",
- "integrity": "sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/bitcoinjs-lib/node_modules/varuint-bitcoin": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz",
- "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==",
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "^5.1.1"
+ "node": ">=18.0.0"
}
},
"node_modules/bplist-parser": {
@@ -4214,22 +4467,22 @@
}
},
"node_modules/bs58": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz",
- "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz",
+ "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==",
"license": "MIT",
"dependencies": {
- "base-x": "^4.0.0"
+ "base-x": "^5.0.0"
}
},
"node_modules/bs58check": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz",
- "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-4.0.0.tgz",
+ "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==",
"license": "MIT",
"dependencies": {
"@noble/hashes": "^1.2.0",
- "bs58": "^5.0.0"
+ "bs58": "^6.0.0"
}
},
"node_modules/bser": {
@@ -7508,6 +7761,21 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -12360,6 +12628,7 @@
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
"funding": [
{
"type": "github",
@@ -13806,12 +14075,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/typeforce": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz",
- "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==",
- "license": "MIT"
- },
"node_modules/typescript": {
"version": "5.9.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
@@ -14239,31 +14502,6 @@
"bs58check": "^4.0.0"
}
},
- "node_modules/wif/node_modules/base-x": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz",
- "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==",
- "license": "MIT"
- },
- "node_modules/wif/node_modules/bs58": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz",
- "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==",
- "license": "MIT",
- "dependencies": {
- "base-x": "^5.0.0"
- }
- },
- "node_modules/wif/node_modules/bs58check": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-4.0.0.tgz",
- "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==",
- "license": "MIT",
- "dependencies": {
- "@noble/hashes": "^1.2.0",
- "bs58": "^6.0.0"
- }
- },
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
diff --git a/bitcoin_client_js/package.json b/bitcoin_client_js/package.json
index 4f499fa..9bc27c2 100644
--- a/bitcoin_client_js/package.json
+++ b/bitcoin_client_js/package.json
@@ -34,11 +34,11 @@
"node": ">=18.14"
},
"dependencies": {
- "@bitcoinerlab/descriptors": "^3.0.5",
+ "@bitcoinerlab/descriptors": "^3.0.6",
"@bitcoinerlab/secp256k1": "^1.2.0",
"@ledgerhq/hw-transport": "^6.31.13",
"bip32-path": "^0.4.2",
- "bitcoinjs-lib": "^6.1.7"
+ "bitcoinjs-lib": "^7.0.1"
},
"devDependencies": {
"@babel/preset-env": "^7.26.0",
diff --git a/bitcoin_client_js/src/lib/clientCommands.ts b/bitcoin_client_js/src/lib/clientCommands.ts
index 0267754..c67b15b 100644
--- a/bitcoin_client_js/src/lib/clientCommands.ts
+++ b/bitcoin_client_js/src/lib/clientCommands.ts
@@ -308,7 +308,10 @@ export class ClientCommandInterpreter {
}
addKnownPreimage(preimage: Buffer): void {
- this.preimages.set(crypto.sha256(preimage).toString('hex'), preimage);
+ this.preimages.set(
+ Buffer.from(crypto.sha256(preimage)).toString('hex'),
+ preimage
+ );
}
addKnownList(elements: readonly Buffer[]): void {
diff --git a/bitcoin_client_js/src/lib/merkle.ts b/bitcoin_client_js/src/lib/merkle.ts
index 7b5eb49..386289e 100644
--- a/bitcoin_client_js/src/lib/merkle.ts
+++ b/bitcoin_client_js/src/lib/merkle.ts
@@ -1,5 +1,9 @@
import { crypto } from 'bitcoinjs-lib';
+function sha256AsBuffer(buf: Buffer): Buffer {
+ return Buffer.from(crypto.sha256(buf));
+}
+
/**
* This class implements the merkle tree used by Ledger Bitcoin app v2+,
* which is documented at
@@ -12,7 +16,7 @@ export class Merkle {
private h: (buf: Buffer) => Buffer;
constructor(
leaves: Buffer[],
- hasher: (buf: Buffer) => Buffer = crypto.sha256
+ hasher: (buf: Buffer) => Buffer = sha256AsBuffer
) {
this.leaves = leaves;
this.h = hasher;
@@ -71,7 +75,7 @@ export class Merkle {
export function hashLeaf(
buf: Buffer,
- hashFunction: (buf: Buffer) => Buffer = crypto.sha256
+ hashFunction: (buf: Buffer) => Buffer = sha256AsBuffer
): Buffer {
return hashConcat(Buffer.from([0]), buf, hashFunction);
}
diff --git a/bitcoin_client_js/src/lib/policy.ts b/bitcoin_client_js/src/lib/policy.ts
index 9e2c67c..42f1655 100644
--- a/bitcoin_client_js/src/lib/policy.ts
+++ b/bitcoin_client_js/src/lib/policy.ts
@@ -37,7 +37,7 @@ export class WalletPolicy {
* Returns the unique 32-bytes id of this wallet policy.
*/
getId(): Buffer {
- return crypto.sha256(this.serialize());
+ return Buffer.from(crypto.sha256(this.serialize()));
}
/**
@@ -59,7 +59,9 @@ export class WalletPolicy {
// length of descriptor template
buf.writeVarInt(this.descriptorTemplate.length);
// sha256 hash of descriptor template
- buf.writeSlice(crypto.sha256(Buffer.from(this.descriptorTemplate)));
+ buf.writeSlice(
+ Buffer.from(crypto.sha256(Buffer.from(this.descriptorTemplate)))
+ );
// number of keys
buf.writeVarInt(this.keys.length);
diff --git a/bitcoin_client_js/src/lib/psbtv2.ts b/bitcoin_client_js/src/lib/psbtv2.ts
index c4bf84b..1c0af7c 100644
--- a/bitcoin_client_js/src/lib/psbtv2.ts
+++ b/bitcoin_client_js/src/lib/psbtv2.ts
@@ -426,14 +426,14 @@ export class PsbtV2 {
this.setGlobalOutputCount(tx.outs.length);
for (let i = 0; i < tx.ins.length; i++) {
- this.setInputPreviousTxId(i, tx.ins[i].hash);
+ this.setInputPreviousTxId(i, asBuffer(tx.ins[i].hash));
this.setInputOutputIndex(i, tx.ins[i].index);
this.setInputSequence(i, tx.ins[i].sequence);
}
for (let i = 0; i < tx.outs.length; i++) {
- this.setOutputAmount(i, tx.outs[i].value);
- this.setOutputScript(i, tx.outs[i].script);
+ this.setOutputAmount(i, asSatoshiNumber(tx.outs[i].value));
+ this.setOutputScript(i, asBuffer(tx.outs[i].script));
}
// PSBT_GLOBAL_UNSIGNED_TX must be removed in a valid PSBTv2
@@ -444,7 +444,7 @@ export class PsbtV2 {
* https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/ts_src/psbt.ts
*
* Prepares the fields required for signing a Psbt on a Ledger
- * device. It should be used exclusively before calling
+ * device. It should be used exclusively before calling
* `appClient.signPsbt()` and not as a general Psbt conversion method.
*
* Note: This method supports all the policies that the Ledger is able to
@@ -479,25 +479,25 @@ export class PsbtV2 {
psbtBJS.data.inputs.forEach((input, index) => {
if (isTaprootInput(input))
throw new Error(`Taproot inputs not supported`);
- this.setInputPreviousTxId(index, psbtBJS.txInputs[index].hash);
+ this.setInputPreviousTxId(index, asBuffer(psbtBJS.txInputs[index].hash));
if (psbtBJS.txInputs[index].sequence !== undefined)
this.setInputSequence(index, psbtBJS.txInputs[index].sequence);
this.setInputOutputIndex(index, psbtBJS.txInputs[index].index);
if (input.sighashType !== undefined)
this.setInputSighashType(index, input.sighashType);
if (input.nonWitnessUtxo)
- this.setInputNonWitnessUtxo(index, input.nonWitnessUtxo);
+ this.setInputNonWitnessUtxo(index, asBuffer(input.nonWitnessUtxo));
if (input.witnessUtxo) {
this.setInputWitnessUtxo(
index,
- input.witnessUtxo.value,
- input.witnessUtxo.script
+ asSatoshiNumber(input.witnessUtxo.value),
+ asBuffer(input.witnessUtxo.script)
);
}
if (input.witnessScript)
- this.setInputWitnessScript(index, input.witnessScript);
+ this.setInputWitnessScript(index, asBuffer(input.witnessScript));
if (input.redeemScript)
- this.setInputRedeemScript(index, input.redeemScript);
+ this.setInputRedeemScript(index, asBuffer(input.redeemScript));
psbtBJS.data.inputs[index].bip32Derivation.forEach(derivation => {
if (!/^m\//i.test(derivation.path))
throw new Error(`Invalid input bip32 derivation`);
@@ -509,15 +509,15 @@ export class PsbtV2 {
);
this.setInputBip32Derivation(
index,
- derivation.pubkey,
- derivation.masterFingerprint,
+ asBuffer(derivation.pubkey),
+ asBuffer(derivation.masterFingerprint),
pathArray
);
});
});
psbtBJS.txOutputs.forEach((output, index) => {
- this.setOutputAmount(index, output.value);
- this.setOutputScript(index, output.script);
+ this.setOutputAmount(index, asSatoshiNumber(output.value));
+ this.setOutputScript(index, asBuffer(output.script));
});
return this;
}
@@ -738,6 +738,12 @@ function set(
const key = new Key(keyType, keyData);
map.set(key.toString(), value);
}
+function asBuffer(buf: Buffer | Uint8Array): Buffer {
+ return Buffer.from(buf);
+}
+function asSatoshiNumber(value: number | bigint): number {
+ return sanitizeBigintToNumber(value);
+}
function uint32LE(n: number): Buffer {
const buf = Buffer.alloc(4);
buf.writeUInt32LE(n, 0);
Why this scored 20/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.