From b8907e3a89d677e4f16e384f8c70eaed1c6d5892 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Wed, 8 Jul 2026 17:34:10 -0400 Subject: [PATCH 01/56] initial commit for bitcore-hardware including basic interaction for the Burner wallet --- packages/bitcore-hardware/.gitignore | 1 + packages/bitcore-hardware/README.md | 14 + packages/bitcore-hardware/package-lock.json | 2794 +++++++++++++++++ packages/bitcore-hardware/package.json | 36 + packages/bitcore-hardware/src/burner/index.ts | 34 + packages/bitcore-hardware/src/index.ts | 3 + packages/bitcore-hardware/test/test.test.ts | 8 + packages/bitcore-hardware/tsconfig.json | 17 + 8 files changed, 2907 insertions(+) create mode 100644 packages/bitcore-hardware/.gitignore create mode 100644 packages/bitcore-hardware/README.md create mode 100644 packages/bitcore-hardware/package-lock.json create mode 100644 packages/bitcore-hardware/package.json create mode 100644 packages/bitcore-hardware/src/burner/index.ts create mode 100644 packages/bitcore-hardware/src/index.ts create mode 100644 packages/bitcore-hardware/test/test.test.ts create mode 100644 packages/bitcore-hardware/tsconfig.json diff --git a/packages/bitcore-hardware/.gitignore b/packages/bitcore-hardware/.gitignore new file mode 100644 index 0000000000..567609b123 --- /dev/null +++ b/packages/bitcore-hardware/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/packages/bitcore-hardware/README.md b/packages/bitcore-hardware/README.md new file mode 100644 index 0000000000..1f5e10e9b1 --- /dev/null +++ b/packages/bitcore-hardware/README.md @@ -0,0 +1,14 @@ +# Bitcore Hardware +**A library for using different hardware wallets + +In progress, working on the Burner wallet + +## Contributing + +See [CONTRIBUTING.md](https://github.com/bitpay/bitcore/blob/master/CONTRIBUTING.md) on the main bitcore repo for information about how to contribute. + +## License + +Code released under [the MIT license](https://github.com/bitpay/bitcore/blob/master/LICENSE). + +Copyright 2013-2026 BitPay, Inc. Bitcore is a trademark maintained by BitPay, Inc. diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json new file mode 100644 index 0000000000..70fd801f94 --- /dev/null +++ b/packages/bitcore-hardware/package-lock.json @@ -0,0 +1,2794 @@ +{ + "name": "@bitpay-labs/bitcore-hardware", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@bitpay-labs/bitcore-hardware", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@arx-research/libhalo": "^1.19.0", + "nfc-pcsc": "^0.8.1" + }, + "devDependencies": { + "@types/chai": "^5.2.3", + "@types/mocha": "^10.0.10", + "chai": "^6.2.2", + "mocha": "^11.7.6", + "typescript": "^7.0.2" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "license": "MIT" + }, + "node_modules/@arx-research/libhalo": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@arx-research/libhalo/-/libhalo-1.19.0.tgz", + "integrity": "sha512-ga36GSuOtyqMCWAlsQUg9RU0H0mIL8PRGLRQaiRHSviYq0zAAXhBNjvIxT850Q21BUK40Ti13FxTTkfhAG63BA==", + "license": "MIT", + "dependencies": { + "@noble/curves": "^1.4.0", + "ethers": "^6.13.5", + "jose": "^6.0.13", + "js-sha256": "^0.11.0", + "pbkdf2": "^3.1.3", + "qrcode": "^1.5.4", + "query-string": "^9.1.1", + "strongly-typed-events": "^3.0.11", + "websocket-as-promised": "^3.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pokusew/pcsclite": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@pokusew/pcsclite/-/pcsclite-0.6.0.tgz", + "integrity": "sha512-jX7zRXM2Or5Pms1AFjNtawsXDjLiZOzOUo7Sf0put7Pnq/EKIR9g0KvTx62HtwdPpVP6hWHGydUTHgIi9PxodQ==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.14.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", + "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chnl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/chnl/-/chnl-1.2.0.tgz", + "integrity": "sha512-g5gJb59edwCliFbX2j7G6sBfY4sX9YLy211yctONI2GRaiX0f2zIbKWmBm+sPqFNEpM7Ljzm7IJX/xrjiEbPrw==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decode-uri-component": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", + "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ethers": { + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.17.0.tgz", + "integrity": "sha512-BpyrpIPJ3ydEVow8zGaz1DuPS7YU8DcWxuBnY9a0UA/lvAPwrMr+EPXsfrul628SRaekPNeIM4UFh/91GWZang==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.11.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.21.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/filter-obj": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", + "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jose": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", + "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-sha256": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.11.1.tgz", + "integrity": "sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mocha": { + "version": "11.7.6", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.6.tgz", + "integrity": "sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.28.0.tgz", + "integrity": "sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==", + "license": "MIT" + }, + "node_modules/nfc-pcsc": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/nfc-pcsc/-/nfc-pcsc-0.8.1.tgz", + "integrity": "sha512-wEfacG0dwPVZOG/WY28Mk3P4Q+yz6q7LnjpnZvdFddx3iXavEXiGhftRZXBtudr0NrzH1MrGWSkWq77tef7BMA==", + "license": "MIT", + "dependencies": { + "@pokusew/pcsclite": "^0.6.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.6.tgz", + "integrity": "sha512-BT6eelPB1EyGHo8pC0o9Bl6k6SYVhKO1jEbd3lcTrtr7XHdjP8BW1YpfCV3G9Kwkxgattk+S5q2/RvuttCsS1g==", + "license": "MIT", + "dependencies": { + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "ripemd160": "^2.0.3", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.12", + "to-buffer": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/promise-controller": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/promise-controller/-/promise-controller-1.0.0.tgz", + "integrity": "sha512-goA0zA9L91tuQbUmiMinSYqlyUtEgg4fxJcjYnLYOQnrktb4o4UqciXDNXiRUPiDBPACmsr1k8jDW4r7UDq9Qw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/promised-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/promised-map/-/promised-map-1.0.0.tgz", + "integrity": "sha512-fP9VSMgcml+U2uJ9PBc4/LDQ3ZkJCH4blLNCS6gbH7RHyRZCYs91zxWHqiUy+heFiEMiB2op/qllYoFqmIqdWA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/qrcode/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/qrcode/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/qrcode/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/qrcode/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qrcode/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/qrcode/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/query-string": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.4.1.tgz", + "integrity": "sha512-lSyJeN3RuaG7DZGWThtYRhk96+kEyZ/+doZpERuWbjeFL+Ok3vEat/swU498rAI0NcVt5/RJp8UDuLz7FckxrA==", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, + "node_modules/ripemd160": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", + "license": "MIT", + "dependencies": { + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/split-on-first": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ste-core": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/ste-core/-/ste-core-3.0.11.tgz", + "integrity": "sha512-ivkRENMh0mdGoPlZ4xVcEaC8rXQfTEfvonRw5m8VDKV7kgcbZbaNd1TnKl08wXbcLdT7okSc63HNP8cVhy95zg==", + "license": "MIT", + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-events": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/ste-events/-/ste-events-3.0.11.tgz", + "integrity": "sha512-eahsf3+KARhBOtsdQZvRgzVO/vg8M3wBRbKaQIIFGRIZ2BtAQFr7t0cU94xVW2qh1rA+b4QxrjHc1N9NxKc90w==", + "license": "MIT", + "dependencies": { + "ste-core": "^3.0.11" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-promise-events": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/ste-promise-events/-/ste-promise-events-3.0.11.tgz", + "integrity": "sha512-LTYTsYSpcNlNRFc/vmviHJ38hB8QTjUYoKVcfjhDnGU2vhnnbAqvsjaY0IMRAlHH6kPMysdgNWfr+1I99BWy9Q==", + "license": "MIT", + "dependencies": { + "ste-core": "^3.0.11" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-promise-signals": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/ste-promise-signals/-/ste-promise-signals-3.0.11.tgz", + "integrity": "sha512-idDK24bBAeVILzP3/7EEcIoZC1kSYBZE8uW8HassdmPv28vfoME2PQG5GQFWgVGGx88Ag4Nor8qHk88lVQvWhQ==", + "license": "MIT", + "dependencies": { + "ste-core": "^3.0.11" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-promise-simple-events": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/ste-promise-simple-events/-/ste-promise-simple-events-3.0.11.tgz", + "integrity": "sha512-xrM7scATyrV/cgwdSlegH+fpWGrRqq6hnykgzTye3M85HnFgAIrYINOut2Hg7b0LHP+vhFQ9x2EMCHpZyT3ktQ==", + "license": "MIT", + "dependencies": { + "ste-core": "^3.0.11" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-signals": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/ste-signals/-/ste-signals-3.0.11.tgz", + "integrity": "sha512-Thc4Z/jYH5DWKxrbV+EtMX7mJLjtjgD2K/sxcK355uJKklg+vlVhCO1JSOJoHlwRfp+hxANMSZQv2JCxFLnjnw==", + "license": "MIT", + "dependencies": { + "ste-core": "^3.0.11" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/ste-simple-events": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/ste-simple-events/-/ste-simple-events-3.0.11.tgz", + "integrity": "sha512-PDoQajqiTtJLNDWfJCihzACiTVZyFsXi6hNAVNelNJoNmqj+BaWuhJ/NHaAHxzfSRoMbL+hFgfPqFmxiHhAQSQ==", + "license": "MIT", + "dependencies": { + "ste-core": "^3.0.11" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strongly-typed-events": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/strongly-typed-events/-/strongly-typed-events-3.0.11.tgz", + "integrity": "sha512-k7871A9tGgikRriVCARnb8+tlF/x6kFd8+KidcFcN6EG/3DcOMPnNBfRH712PGXlj2zhmy/VDvOFND1TYp2JdQ==", + "license": "MIT", + "dependencies": { + "ste-core": "^3.0.11", + "ste-events": "^3.0.11", + "ste-promise-events": "^3.0.11", + "ste-promise-signals": "^3.0.11", + "ste-promise-simple-events": "^3.0.11", + "ste-signals": "^3.0.11", + "ste-simple-events": "^3.0.11" + }, + "engines": { + "node": ">=4.2.4" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typescript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc" + }, + "engines": { + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/websocket-as-promised": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/websocket-as-promised/-/websocket-as-promised-3.0.1.tgz", + "integrity": "sha512-YYneUaH6msHVl+Zb29vIU+5tzDy+nYMZVOTisMQmpddY6yQEeu1mQfmz9PFz5mBC1ADCuXQt/Xx6RlkUtAndgA==", + "license": "MIT", + "dependencies": { + "chnl": "^1.2.0", + "promise-controller": "^1.0.0", + "promised-map": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/workerpool": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json new file mode 100644 index 0000000000..afc9aadad1 --- /dev/null +++ b/packages/bitcore-hardware/package.json @@ -0,0 +1,36 @@ +{ + "name": "@bitpay-labs/bitcore-hardware", + "version": "1.0.0", + "description": "\"Interface with multiple hardware wallets using one library\"", + "main": "./build/src/index.js", + "type": "module", + "repository": { + "type": "git", + "url": "https://github.com/bitpay/bitcore.git#master" + }, + "scripts": { + "start": "npm run compile && node ./build/src/burner/index.js", + "compile": "npm run clean && npm run build", + "build": "tsc", + "clean": "rm -rf build", + "test": "npm run compile && mocha build/test" + }, + "keywords": [ + "bitcore", + "nfc", + "blockchain" + ], + "author": "Micah Maphet", + "license": "MIT", + "dependencies": { + "@arx-research/libhalo": "^1.19.0", + "nfc-pcsc": "^0.8.1" + }, + "devDependencies": { + "@types/chai": "5.2.3", + "@types/mocha": "10.0.10", + "chai": "6.2.2", + "mocha": "11.7.6", + "typescript": "7.0.2" + } +} diff --git a/packages/bitcore-hardware/src/burner/index.ts b/packages/bitcore-hardware/src/burner/index.ts new file mode 100644 index 0000000000..78e5f889dd --- /dev/null +++ b/packages/bitcore-hardware/src/burner/index.ts @@ -0,0 +1,34 @@ +import { execHaloCmdPCSC } from '@arx-research/libhalo/api/desktop'; +import { NFC } from 'nfc-pcsc'; + +const nfc = new NFC(); + +nfc.on('reader', (reader) => { + reader.autoProcessing = false; + console.log('Reader triggered'); + + reader.on('card', async () => { + console.log('Card triggered'); + + try { + const res = await execHaloCmdPCSC({ + name: 'sign', + message: '010203', + keyNo: 1, + }, reader); + console.log(res); + } catch (e) { + console.error(e); + } + }); + + reader.on('error', (err) => { + console.log(`${reader.reader.name} an error occurred`, err); + }); +}); + +nfc.on('error', (err) => { + console.log('An error occurred', err); +}); + +console.log('Tap the tag...'); diff --git a/packages/bitcore-hardware/src/index.ts b/packages/bitcore-hardware/src/index.ts new file mode 100644 index 0000000000..9083b2d5b3 --- /dev/null +++ b/packages/bitcore-hardware/src/index.ts @@ -0,0 +1,3 @@ +import * as burner from './burner/index.js'; + +burner; diff --git a/packages/bitcore-hardware/test/test.test.ts b/packages/bitcore-hardware/test/test.test.ts new file mode 100644 index 0000000000..791023bd27 --- /dev/null +++ b/packages/bitcore-hardware/test/test.test.ts @@ -0,0 +1,8 @@ +import { expect } from 'chai'; +import { describe, it } from 'mocha'; + +describe('Placeholder Test', function() { + it('should have a test that runs', function() { + expect(true).to.be.true; + }); +}); diff --git a/packages/bitcore-hardware/tsconfig.json b/packages/bitcore-hardware/tsconfig.json new file mode 100644 index 0000000000..415cc0659e --- /dev/null +++ b/packages/bitcore-hardware/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "nodenext", + "target": "ES2022", + "outDir": "./build", + "noImplicitAny": false, + "paths": + {"*": ["./*", "./src/*"] + }, + "sourceMap": true + }, + "include": [ + "./src/**/*.ts", + "./test/**/*.ts" + ], + "exclude": ["node_modules"] +} From 9327ef5b757440b4a29d26e584cd10ab8d034f66 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 9 Jul 2026 12:24:17 -0400 Subject: [PATCH 02/56] created aggregate and base class for hardware wallets with a signing example --- .../bitcore-hardware/examples/burner-sign.ts | 10 ++++ packages/bitcore-hardware/package.json | 1 - packages/bitcore-hardware/src/base.ts | 4 ++ packages/bitcore-hardware/src/burner.ts | 53 +++++++++++++++++++ packages/bitcore-hardware/src/burner/index.ts | 34 ------------ packages/bitcore-hardware/src/index.ts | 25 ++++++++- packages/bitcore-hardware/tsconfig.json | 3 +- 7 files changed, 92 insertions(+), 38 deletions(-) create mode 100644 packages/bitcore-hardware/examples/burner-sign.ts create mode 100644 packages/bitcore-hardware/src/base.ts create mode 100644 packages/bitcore-hardware/src/burner.ts delete mode 100644 packages/bitcore-hardware/src/burner/index.ts diff --git a/packages/bitcore-hardware/examples/burner-sign.ts b/packages/bitcore-hardware/examples/burner-sign.ts new file mode 100644 index 0000000000..545cee96d0 --- /dev/null +++ b/packages/bitcore-hardware/examples/burner-sign.ts @@ -0,0 +1,10 @@ +import BitcoreHardware from '../src/index.js'; + +const wallet = new BitcoreHardware('burner', 'btc'); +wallet.connect(); + +console.log('Tap burner wallet on NFC reader to sign and output transaction'); +console.log(await wallet.sign({ amount: 0.00001 })); + +console.log('Singed transaction with Burner wallet, exiting...'); +process.exit(0); diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index afc9aadad1..0727c884eb 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -9,7 +9,6 @@ "url": "https://github.com/bitpay/bitcore.git#master" }, "scripts": { - "start": "npm run compile && node ./build/src/burner/index.js", "compile": "npm run clean && npm run build", "build": "tsc", "clean": "rm -rf build", diff --git a/packages/bitcore-hardware/src/base.ts b/packages/bitcore-hardware/src/base.ts new file mode 100644 index 0000000000..6f750540ee --- /dev/null +++ b/packages/bitcore-hardware/src/base.ts @@ -0,0 +1,4 @@ +export interface Base { + sign(params: { amount: number }): object; + connect(): void; +}; diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts new file mode 100644 index 0000000000..87eff8ff60 --- /dev/null +++ b/packages/bitcore-hardware/src/burner.ts @@ -0,0 +1,53 @@ +import { execHaloCmdPCSC } from '@arx-research/libhalo/api/desktop'; +import { NFC } from 'nfc-pcsc'; +import { Base } from './base.js'; + +export default class Burner implements Base { + nfc = new NFC(); + command = {}; + currency: string; + responce: object | string | number | undefined; + + constructor(currency: string) { + this.currency = currency; + } + + connect() { + this.nfc.on('reader', (reader) => { + reader.autoProcessing = false; + + reader.on('card', async () => { + try { + this.responce = await execHaloCmdPCSC(this.command, reader); + } catch (e) { + console.error(e); + } + }); + + reader.on('error', (err) => { + console.log(`${reader.reader.name} an error occurred`, err); + }); + }); + + this.nfc.on('error', (err) => { + console.log('An error occurred', err); + }); + } + + async sign(params: { amount: number }) { + const { amount } = params; + this.command = { + name: 'sign', + message: '010203', + keyNo: 1 + }; + amount; + return new Promise(async (resolve) => { + while (this.responce === undefined) { + await new Promise(resolve2 => setTimeout(resolve2, 10)); + } + resolve(this.responce); + this.responce = undefined; + }); + } +} diff --git a/packages/bitcore-hardware/src/burner/index.ts b/packages/bitcore-hardware/src/burner/index.ts deleted file mode 100644 index 78e5f889dd..0000000000 --- a/packages/bitcore-hardware/src/burner/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { execHaloCmdPCSC } from '@arx-research/libhalo/api/desktop'; -import { NFC } from 'nfc-pcsc'; - -const nfc = new NFC(); - -nfc.on('reader', (reader) => { - reader.autoProcessing = false; - console.log('Reader triggered'); - - reader.on('card', async () => { - console.log('Card triggered'); - - try { - const res = await execHaloCmdPCSC({ - name: 'sign', - message: '010203', - keyNo: 1, - }, reader); - console.log(res); - } catch (e) { - console.error(e); - } - }); - - reader.on('error', (err) => { - console.log(`${reader.reader.name} an error occurred`, err); - }); -}); - -nfc.on('error', (err) => { - console.log('An error occurred', err); -}); - -console.log('Tap the tag...'); diff --git a/packages/bitcore-hardware/src/index.ts b/packages/bitcore-hardware/src/index.ts index 9083b2d5b3..ab932d1ef9 100644 --- a/packages/bitcore-hardware/src/index.ts +++ b/packages/bitcore-hardware/src/index.ts @@ -1,3 +1,24 @@ -import * as burner from './burner/index.js'; +import assert from 'assert'; +import { Base } from './base.js'; +import Burner from './burner.js'; -burner; +export default class BitcoreHardware implements Base { + hardwareWallet: Base | undefined; + constructor(wallet: string, currency: string) { + switch (wallet.toLowerCase()) { + case ('burner'): { + assert(['btc', 'eth'].includes(currency.toLowerCase())); + this.hardwareWallet = new Burner(currency); + break; + } + } + } + + connect() { + this.hardwareWallet?.connect(); + } + + async sign(params: { amount: number }) { + return this.hardwareWallet?.sign(params) || {}; + } +} diff --git a/packages/bitcore-hardware/tsconfig.json b/packages/bitcore-hardware/tsconfig.json index 415cc0659e..6d7a7d8c14 100644 --- a/packages/bitcore-hardware/tsconfig.json +++ b/packages/bitcore-hardware/tsconfig.json @@ -11,7 +11,8 @@ }, "include": [ "./src/**/*.ts", - "./test/**/*.ts" + "./test/**/*.ts", + "./examples/**/*.ts", ], "exclude": ["node_modules"] } From 0eae020be471a2695ec0a24e4c2a0870b4639fd3 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 9 Jul 2026 16:01:31 -0400 Subject: [PATCH 03/56] added key generation for hardare wallets --- .../examples/burner-genkey.ts | 10 ++++++ .../bitcore-hardware/examples/burner-sign.ts | 2 +- packages/bitcore-hardware/src/base.ts | 3 +- packages/bitcore-hardware/src/burner.ts | 33 +++++++++++++++---- packages/bitcore-hardware/src/index.ts | 4 +++ 5 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 packages/bitcore-hardware/examples/burner-genkey.ts diff --git a/packages/bitcore-hardware/examples/burner-genkey.ts b/packages/bitcore-hardware/examples/burner-genkey.ts new file mode 100644 index 0000000000..4dcfda474f --- /dev/null +++ b/packages/bitcore-hardware/examples/burner-genkey.ts @@ -0,0 +1,10 @@ +import BitcoreHardware from '../src/index.js'; + +const wallet = new BitcoreHardware('burner', 'btc'); +wallet.connect(); + +console.log('Tap burner wallet on NFC reader to generate a key'); +console.log(await wallet.genKey({ index: 3, entropy: '3c825af7d2e1b02b6a00b257ebe883260b4aa6302c9878d412046d10141b261d' })); + +console.log('Generated a key with Burner wallet, exiting...'); +process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner-sign.ts b/packages/bitcore-hardware/examples/burner-sign.ts index 545cee96d0..d578f14ee9 100644 --- a/packages/bitcore-hardware/examples/burner-sign.ts +++ b/packages/bitcore-hardware/examples/burner-sign.ts @@ -6,5 +6,5 @@ wallet.connect(); console.log('Tap burner wallet on NFC reader to sign and output transaction'); console.log(await wallet.sign({ amount: 0.00001 })); -console.log('Singed transaction with Burner wallet, exiting...'); +console.log('Signed transaction with Burner wallet, exiting...'); process.exit(0); diff --git a/packages/bitcore-hardware/src/base.ts b/packages/bitcore-hardware/src/base.ts index 6f750540ee..c826a699c5 100644 --- a/packages/bitcore-hardware/src/base.ts +++ b/packages/bitcore-hardware/src/base.ts @@ -1,4 +1,5 @@ export interface Base { - sign(params: { amount: number }): object; connect(): void; + sign(params: { amount: number }): object; + genKey(params: { index: number; entropy: string }): object; }; diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 87eff8ff60..646364f4cd 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -2,6 +2,10 @@ import { execHaloCmdPCSC } from '@arx-research/libhalo/api/desktop'; import { NFC } from 'nfc-pcsc'; import { Base } from './base.js'; +/** + * Connect listens on the NFC reader for a card. + * Methods queue a command to run when the card is scanned. + */ export default class Burner implements Base { nfc = new NFC(); command = {}; @@ -12,6 +16,15 @@ export default class Burner implements Base { this.currency = currency; } + async awaitResponse() { + return new Promise(async (resolve1) => { + while (this.responce === undefined) { + await new Promise(resolve2 => setTimeout(resolve2, 10)); + } + resolve1(this.responce); + }); + } + connect() { this.nfc.on('reader', (reader) => { reader.autoProcessing = false; @@ -36,18 +49,24 @@ export default class Burner implements Base { async sign(params: { amount: number }) { const { amount } = params; + this.responce = undefined; this.command = { name: 'sign', message: '010203', keyNo: 1 }; amount; - return new Promise(async (resolve) => { - while (this.responce === undefined) { - await new Promise(resolve2 => setTimeout(resolve2, 10)); - } - resolve(this.responce); - this.responce = undefined; - }); + return this.awaitResponse(); + } + + async genKey(params: { index: number; entropy: string }) { + const { index, entropy } = params; + this.command = { + name: 'gen_key', + keyNo: index, + entropy + }; + + return this.awaitResponse(); } } diff --git a/packages/bitcore-hardware/src/index.ts b/packages/bitcore-hardware/src/index.ts index ab932d1ef9..ec54546238 100644 --- a/packages/bitcore-hardware/src/index.ts +++ b/packages/bitcore-hardware/src/index.ts @@ -21,4 +21,8 @@ export default class BitcoreHardware implements Base { async sign(params: { amount: number }) { return this.hardwareWallet?.sign(params) || {}; } + + async genKey(params: { index: number; entropy: string }) { + return this.hardwareWallet?.genKey(params) || {}; + } } From a6ed1f67213a1ddaad638f1173617a98f8d78334 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 9 Jul 2026 16:57:45 -0400 Subject: [PATCH 04/56] use Node16 module resolution in bitcore hardware --- packages/bitcore-hardware/src/index.ts | 5 +++-- packages/bitcore-hardware/tsconfig.json | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/bitcore-hardware/src/index.ts b/packages/bitcore-hardware/src/index.ts index ec54546238..4c74531344 100644 --- a/packages/bitcore-hardware/src/index.ts +++ b/packages/bitcore-hardware/src/index.ts @@ -1,4 +1,3 @@ -import assert from 'assert'; import { Base } from './base.js'; import Burner from './burner.js'; @@ -7,7 +6,9 @@ export default class BitcoreHardware implements Base { constructor(wallet: string, currency: string) { switch (wallet.toLowerCase()) { case ('burner'): { - assert(['btc', 'eth'].includes(currency.toLowerCase())); + if (!(['btc', 'eth'].includes(currency.toLowerCase()))) { + throw new Error(`Burner can only be run with btc or eth, not ${currency}`); + }; this.hardwareWallet = new Burner(currency); break; } diff --git a/packages/bitcore-hardware/tsconfig.json b/packages/bitcore-hardware/tsconfig.json index 6d7a7d8c14..c538b7302a 100644 --- a/packages/bitcore-hardware/tsconfig.json +++ b/packages/bitcore-hardware/tsconfig.json @@ -1,8 +1,9 @@ { "compilerOptions": { - "module": "nodenext", + "module": "Node16", "target": "ES2022", "outDir": "./build", + "moduleResolution": "Node16", "noImplicitAny": false, "paths": {"*": ["./*", "./src/*"] From 6392d15dbfc8d495e2c53c8e49fc92b229d7f2db Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Fri, 10 Jul 2026 17:08:57 -0400 Subject: [PATCH 05/56] added public key retreival for bitcore-hardware --- .../examples/burner-genkey.ts | 10 ------ .../bitcore-hardware/examples/burner-sign.ts | 10 ------ .../examples/burner/getPublicKey.ts | 10 ++++++ .../bitcore-hardware/examples/burner/sign.ts | 10 ++++++ packages/bitcore-hardware/package-lock.json | 10 +++--- packages/bitcore-hardware/package.json | 4 ++- packages/bitcore-hardware/src/base.ts | 6 ++-- packages/bitcore-hardware/src/burner.ts | 32 +++++++++---------- packages/bitcore-hardware/src/index.ts | 7 ++-- .../bitcore-hardware/src/types/methods.ts | 8 +++++ 10 files changed, 60 insertions(+), 47 deletions(-) delete mode 100644 packages/bitcore-hardware/examples/burner-genkey.ts delete mode 100644 packages/bitcore-hardware/examples/burner-sign.ts create mode 100644 packages/bitcore-hardware/examples/burner/getPublicKey.ts create mode 100644 packages/bitcore-hardware/examples/burner/sign.ts create mode 100644 packages/bitcore-hardware/src/types/methods.ts diff --git a/packages/bitcore-hardware/examples/burner-genkey.ts b/packages/bitcore-hardware/examples/burner-genkey.ts deleted file mode 100644 index 4dcfda474f..0000000000 --- a/packages/bitcore-hardware/examples/burner-genkey.ts +++ /dev/null @@ -1,10 +0,0 @@ -import BitcoreHardware from '../src/index.js'; - -const wallet = new BitcoreHardware('burner', 'btc'); -wallet.connect(); - -console.log('Tap burner wallet on NFC reader to generate a key'); -console.log(await wallet.genKey({ index: 3, entropy: '3c825af7d2e1b02b6a00b257ebe883260b4aa6302c9878d412046d10141b261d' })); - -console.log('Generated a key with Burner wallet, exiting...'); -process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner-sign.ts b/packages/bitcore-hardware/examples/burner-sign.ts deleted file mode 100644 index d578f14ee9..0000000000 --- a/packages/bitcore-hardware/examples/burner-sign.ts +++ /dev/null @@ -1,10 +0,0 @@ -import BitcoreHardware from '../src/index.js'; - -const wallet = new BitcoreHardware('burner', 'btc'); -wallet.connect(); - -console.log('Tap burner wallet on NFC reader to sign and output transaction'); -console.log(await wallet.sign({ amount: 0.00001 })); - -console.log('Signed transaction with Burner wallet, exiting...'); -process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner/getPublicKey.ts b/packages/bitcore-hardware/examples/burner/getPublicKey.ts new file mode 100644 index 0000000000..fed6d40d19 --- /dev/null +++ b/packages/bitcore-hardware/examples/burner/getPublicKey.ts @@ -0,0 +1,10 @@ +import BitcoreHardware from '../../src/index.js'; + +const wallet = new BitcoreHardware('burner', 'btc'); +wallet.connect(); + +console.log('Tap burner wallet on an NFC reader to output the public key'); +console.log(await wallet.getPublicKey({ index: 1 })); + +console.log('Signed transaction with Burner wallet, exiting...'); +process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts new file mode 100644 index 0000000000..a226204042 --- /dev/null +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -0,0 +1,10 @@ +import BitcoreHardware from '../../src/index.js'; + +const wallet = new BitcoreHardware('burner', 'btc'); +wallet.connect(); + +console.log('Tap burner wallet on ahn NFC reader to sign and output a message'); +console.log(await wallet.sign({ index: 1, message: '010503' })); + +console.log('Signed message with Burner wallet, exiting...'); +process.exit(0); diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index 70fd801f94..4b13b7678d 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -13,11 +13,11 @@ "nfc-pcsc": "^0.8.1" }, "devDependencies": { - "@types/chai": "^5.2.3", - "@types/mocha": "^10.0.10", - "chai": "^6.2.2", - "mocha": "^11.7.6", - "typescript": "^7.0.2" + "@types/chai": "5.2.3", + "@types/mocha": "10.0.10", + "chai": "6.2.2", + "mocha": "11.7.6", + "typescript": "7.0.2" } }, "node_modules/@adraffy/ens-normalize": { diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 0727c884eb..503eb7bfb2 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -12,7 +12,9 @@ "compile": "npm run clean && npm run build", "build": "tsc", "clean": "rm -rf build", - "test": "npm run compile && mocha build/test" + "test": "npm run compile && mocha build/test", + "burner:get-public-key": "npm run compile && node build/examples/burner/getPublicKey.js", + "burner:sign": "npm run compile && node build/examples/burner/sign.js" }, "keywords": [ "bitcore", diff --git a/packages/bitcore-hardware/src/base.ts b/packages/bitcore-hardware/src/base.ts index c826a699c5..b6850765d3 100644 --- a/packages/bitcore-hardware/src/base.ts +++ b/packages/bitcore-hardware/src/base.ts @@ -1,5 +1,7 @@ +import { GetPublicKey, Sign } from './types/methods.js'; + export interface Base { connect(): void; - sign(params: { amount: number }): object; - genKey(params: { index: number; entropy: string }): object; + sign(params: Sign): Promise; + getPublicKey(params: GetPublicKey): Promise; }; diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 646364f4cd..89a8695bba 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -1,6 +1,7 @@ import { execHaloCmdPCSC } from '@arx-research/libhalo/api/desktop'; import { NFC } from 'nfc-pcsc'; import { Base } from './base.js'; +import { GetPublicKey, Sign } from './types/methods.js'; /** * Connect listens on the NFC reader for a card. @@ -10,7 +11,7 @@ export default class Burner implements Base { nfc = new NFC(); command = {}; currency: string; - responce: object | string | number | undefined; + response: object | string | number | undefined; constructor(currency: string) { this.currency = currency; @@ -18,10 +19,10 @@ export default class Burner implements Base { async awaitResponse() { return new Promise(async (resolve1) => { - while (this.responce === undefined) { + while (this.response === undefined) { await new Promise(resolve2 => setTimeout(resolve2, 10)); } - resolve1(this.responce); + resolve1(this.response); }); } @@ -31,7 +32,7 @@ export default class Burner implements Base { reader.on('card', async () => { try { - this.responce = await execHaloCmdPCSC(this.command, reader); + this.response = await execHaloCmdPCSC(this.command, reader); } catch (e) { console.error(e); } @@ -47,26 +48,25 @@ export default class Burner implements Base { }); } - async sign(params: { amount: number }) { - const { amount } = params; - this.responce = undefined; + async sign(params: Sign) { + const { index, message } = params; + this.response = undefined; this.command = { name: 'sign', - message: '010203', - keyNo: 1 + message, + keyNo: index }; - amount; return this.awaitResponse(); } - async genKey(params: { index: number; entropy: string }) { - const { index, entropy } = params; + async getPublicKey(params: GetPublicKey) { + const { index } = params; + this.response = undefined; this.command = { - name: 'gen_key', - keyNo: index, - entropy + name: 'get_data_struct_v2', + spec: [{ type: 'publicKey', index }] }; - return this.awaitResponse(); + return (await this.awaitResponse() as any).publicKey[index].value; } } diff --git a/packages/bitcore-hardware/src/index.ts b/packages/bitcore-hardware/src/index.ts index 4c74531344..2a2a3df785 100644 --- a/packages/bitcore-hardware/src/index.ts +++ b/packages/bitcore-hardware/src/index.ts @@ -1,5 +1,6 @@ import { Base } from './base.js'; import Burner from './burner.js'; +import { GetPublicKey, Sign } from './types/methods.js'; export default class BitcoreHardware implements Base { hardwareWallet: Base | undefined; @@ -19,11 +20,11 @@ export default class BitcoreHardware implements Base { this.hardwareWallet?.connect(); } - async sign(params: { amount: number }) { + async sign(params: Sign): Promise { return this.hardwareWallet?.sign(params) || {}; } - async genKey(params: { index: number; entropy: string }) { - return this.hardwareWallet?.genKey(params) || {}; + async getPublicKey(params: GetPublicKey): Promise { + return this.hardwareWallet?.getPublicKey(params); } } diff --git a/packages/bitcore-hardware/src/types/methods.ts b/packages/bitcore-hardware/src/types/methods.ts new file mode 100644 index 0000000000..5185de67fb --- /dev/null +++ b/packages/bitcore-hardware/src/types/methods.ts @@ -0,0 +1,8 @@ +export interface Sign { + index: number; + message: string; +} + +export interface GetPublicKey { + index: number; +} From fdc7f064a04a656cf072f3312188d252efd445d1 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Fri, 10 Jul 2026 22:45:19 -0400 Subject: [PATCH 06/56] added address retrieval to bitcore-hardware --- .../examples/burner/getAddress.ts | 10 ++ .../examples/burner/getPublicKey.ts | 2 +- packages/bitcore-hardware/package-lock.json | 123 ++++++++++++++++++ packages/bitcore-hardware/package.json | 1 + packages/bitcore-hardware/src/base.ts | 5 +- packages/bitcore-hardware/src/burner.ts | 24 +++- packages/bitcore-hardware/src/index.ts | 8 +- .../bitcore-hardware/src/types/methods.ts | 9 +- packages/bitcore-hardware/tsconfig.json | 1 + 9 files changed, 169 insertions(+), 14 deletions(-) create mode 100644 packages/bitcore-hardware/examples/burner/getAddress.ts diff --git a/packages/bitcore-hardware/examples/burner/getAddress.ts b/packages/bitcore-hardware/examples/burner/getAddress.ts new file mode 100644 index 0000000000..1a827ea9b4 --- /dev/null +++ b/packages/bitcore-hardware/examples/burner/getAddress.ts @@ -0,0 +1,10 @@ +import BitcoreHardware from '../../src/index.js'; + +const wallet = new BitcoreHardware('burner', 'btc'); +wallet.connect(); + +console.log('Tap burner wallet on an NFC reader to output the public key'); +console.log(await wallet.getAddress({ index: 9 })); + +console.log('Signed transaction with Burner wallet, exiting...'); +process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner/getPublicKey.ts b/packages/bitcore-hardware/examples/burner/getPublicKey.ts index fed6d40d19..8adb9e2fc6 100644 --- a/packages/bitcore-hardware/examples/burner/getPublicKey.ts +++ b/packages/bitcore-hardware/examples/burner/getPublicKey.ts @@ -4,7 +4,7 @@ const wallet = new BitcoreHardware('burner', 'btc'); wallet.connect(); console.log('Tap burner wallet on an NFC reader to output the public key'); -console.log(await wallet.getPublicKey({ index: 1 })); +console.log(await wallet.getPublicKey({ index: 9 })); console.log('Signed transaction with Burner wallet, exiting...'); process.exit(0); diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index 4b13b7678d..0db337af6f 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "@arx-research/libhalo": "^1.19.0", + "@bitpay-labs/bitcore-lib": "^11.5.1", "nfc-pcsc": "^0.8.1" }, "devDependencies": { @@ -43,6 +44,27 @@ "websocket-as-promised": "^3.0.0" } }, + "node_modules/@bitpay-labs/bitcore-lib": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib/-/bitcore-lib-11.5.1.tgz", + "integrity": "sha512-bjYMYo5RWwvCnwWXLwXUJCUVw0aEMDEYx+yC3X26Lzo70pOZFPRgyuiDxdMJfihatdB9u87f0z5U+ja8KSPMsw==", + "license": "MIT", + "dependencies": { + "bech32": "=2.0.0", + "bn.js": "=4.11.8", + "bs58": "^4.0.1", + "buffer-compare": "=1.1.1", + "elliptic": "^6.5.3", + "inherits": "=2.0.1", + "lodash": "^4.17.20" + } + }, + "node_modules/@bitpay-labs/bitcore-lib/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "license": "ISC" + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -548,6 +570,21 @@ "dev": true, "license": "MIT" }, + "node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", + "license": "MIT" + }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -557,6 +594,12 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", @@ -567,6 +610,12 @@ "balanced-match": "^1.0.0" } }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -574,6 +623,20 @@ "dev": true, "license": "ISC" }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/buffer-compare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz", + "integrity": "sha512-O6NvNiHZMd3mlIeMDjP6t/gPG75OqGPeiRZXoMQZJ6iy9GofCls4Ijs5YkPZZwoysizLiedhticmdyx/GyHghA==" + }, "node_modules/call-bind": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", @@ -948,6 +1011,27 @@ "dev": true, "license": "MIT" }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "license": "MIT" + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -1305,6 +1389,16 @@ "node": ">= 0.8" } }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", @@ -1327,6 +1421,17 @@ "he": "bin/he" } }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1485,6 +1590,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -1529,6 +1640,18 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" + }, "node_modules/minimatch": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 503eb7bfb2..9b2dabc60c 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -25,6 +25,7 @@ "license": "MIT", "dependencies": { "@arx-research/libhalo": "^1.19.0", + "@bitpay-labs/bitcore-lib": "^11.5.1", "nfc-pcsc": "^0.8.1" }, "devDependencies": { diff --git a/packages/bitcore-hardware/src/base.ts b/packages/bitcore-hardware/src/base.ts index b6850765d3..117e7318fb 100644 --- a/packages/bitcore-hardware/src/base.ts +++ b/packages/bitcore-hardware/src/base.ts @@ -1,7 +1,8 @@ -import { GetPublicKey, Sign } from './types/methods.js'; +import { BaseMethod, Sign } from './types/methods.js'; export interface Base { connect(): void; sign(params: Sign): Promise; - getPublicKey(params: GetPublicKey): Promise; + getPublicKey(params: BaseMethod): Promise; + getAddress(params: BaseMethod): Promise; }; diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 89a8695bba..61deb19643 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -1,7 +1,10 @@ import { execHaloCmdPCSC } from '@arx-research/libhalo/api/desktop'; +import Bitcore from '@bitpay-labs/bitcore-lib'; import { NFC } from 'nfc-pcsc'; import { Base } from './base.js'; -import { GetPublicKey, Sign } from './types/methods.js'; +import { BaseMethod, Sign } from './types/methods.js'; + +const { Address, PublicKey } = Bitcore; /** * Connect listens on the NFC reader for a card. @@ -59,7 +62,7 @@ export default class Burner implements Base { return this.awaitResponse(); } - async getPublicKey(params: GetPublicKey) { + async getPublicKey(params: BaseMethod) { const { index } = params; this.response = undefined; this.command = { @@ -69,4 +72,21 @@ export default class Burner implements Base { return (await this.awaitResponse() as any).publicKey[index].value; } + + async getAddress(params: BaseMethod) { + const { index } = params; + this.response = undefined; + this.command = { + name: 'get_data_struct_v2', + spec: [{ type: 'compressedPublicKey', index }] + }; + + try { + const pubKey = PublicKey.fromString((await this.awaitResponse() as any).compressedPublicKey[index].value); + const address = Address.fromPublicKey(pubKey, 'livenet', 'witnesspubkeyhash'); + return address.toString(); + } catch { + return undefined; + } + } } diff --git a/packages/bitcore-hardware/src/index.ts b/packages/bitcore-hardware/src/index.ts index 2a2a3df785..80d88e02c6 100644 --- a/packages/bitcore-hardware/src/index.ts +++ b/packages/bitcore-hardware/src/index.ts @@ -1,6 +1,6 @@ import { Base } from './base.js'; import Burner from './burner.js'; -import { GetPublicKey, Sign } from './types/methods.js'; +import { BaseMethod, Sign } from './types/methods.js'; export default class BitcoreHardware implements Base { hardwareWallet: Base | undefined; @@ -24,7 +24,11 @@ export default class BitcoreHardware implements Base { return this.hardwareWallet?.sign(params) || {}; } - async getPublicKey(params: GetPublicKey): Promise { + async getPublicKey(params: BaseMethod): Promise { return this.hardwareWallet?.getPublicKey(params); } + + async getAddress(params: BaseMethod) { + return this.hardwareWallet?.getAddress(params); + } } diff --git a/packages/bitcore-hardware/src/types/methods.ts b/packages/bitcore-hardware/src/types/methods.ts index 5185de67fb..fcf5485907 100644 --- a/packages/bitcore-hardware/src/types/methods.ts +++ b/packages/bitcore-hardware/src/types/methods.ts @@ -1,8 +1,3 @@ -export interface Sign { - index: number; - message: string; -} +export interface BaseMethod { index: number }; -export interface GetPublicKey { - index: number; -} +export type Sign = BaseMethod & { message: string }; diff --git a/packages/bitcore-hardware/tsconfig.json b/packages/bitcore-hardware/tsconfig.json index c538b7302a..6c4e30ea4b 100644 --- a/packages/bitcore-hardware/tsconfig.json +++ b/packages/bitcore-hardware/tsconfig.json @@ -5,6 +5,7 @@ "outDir": "./build", "moduleResolution": "Node16", "noImplicitAny": false, + "skipLibCheck": true, "paths": {"*": ["./*", "./src/*"] }, From bd508676363acafcc4cb2a70349179a7ff32d048 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Sat, 11 Jul 2026 09:43:42 -0400 Subject: [PATCH 07/56] bitcore-hardware: sign with password --- .../bitcore-hardware/examples/burner/sign.ts | 20 ++- packages/bitcore-hardware/package-lock.json | 123 ------------------ packages/bitcore-hardware/package.json | 1 + packages/bitcore-hardware/src/burner.ts | 7 +- .../bitcore-hardware/src/types/methods.ts | 2 +- 5 files changed, 23 insertions(+), 130 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index a226204042..c86ffb92cb 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -1,10 +1,24 @@ +import bitcore from '@bitpay-labs/bitcore-lib'; import BitcoreHardware from '../../src/index.js'; const wallet = new BitcoreHardware('burner', 'btc'); wallet.connect(); -console.log('Tap burner wallet on ahn NFC reader to sign and output a message'); -console.log(await wallet.sign({ index: 1, message: '010503' })); +const utxo = { + txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', + outputIndex: 0, + address: '17XBj6iFEsf8kzDMGQk5ghZipxX49VXuaV', + script: '76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac', + satoshis: 500 +}; -console.log('Signed message with Burner wallet, exiting...'); +const transaction = new bitcore.Transaction() + .from(utxo) + .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 150) + .toString(); + +console.log('Tap burner wallet on an NFC reader to sign a transaction'); +console.log(await wallet.sign({ index: 9, message: transaction, password: '123456' })); + +console.log('Signed transaction with Burner wallet, exiting...'); process.exit(0); diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index 0db337af6f..4b13b7678d 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -10,7 +10,6 @@ "license": "MIT", "dependencies": { "@arx-research/libhalo": "^1.19.0", - "@bitpay-labs/bitcore-lib": "^11.5.1", "nfc-pcsc": "^0.8.1" }, "devDependencies": { @@ -44,27 +43,6 @@ "websocket-as-promised": "^3.0.0" } }, - "node_modules/@bitpay-labs/bitcore-lib": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib/-/bitcore-lib-11.5.1.tgz", - "integrity": "sha512-bjYMYo5RWwvCnwWXLwXUJCUVw0aEMDEYx+yC3X26Lzo70pOZFPRgyuiDxdMJfihatdB9u87f0z5U+ja8KSPMsw==", - "license": "MIT", - "dependencies": { - "bech32": "=2.0.0", - "bn.js": "=4.11.8", - "bs58": "^4.0.1", - "buffer-compare": "=1.1.1", - "elliptic": "^6.5.3", - "inherits": "=2.0.1", - "lodash": "^4.17.20" - } - }, - "node_modules/@bitpay-labs/bitcore-lib/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", - "license": "ISC" - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -570,21 +548,6 @@ "dev": true, "license": "MIT" }, - "node_modules/base-x": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", - "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", - "license": "MIT" - }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -594,12 +557,6 @@ "file-uri-to-path": "1.0.0" } }, - "node_modules/bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "license": "MIT" - }, "node_modules/brace-expansion": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", @@ -610,12 +567,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -623,20 +574,6 @@ "dev": true, "license": "ISC" }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/buffer-compare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz", - "integrity": "sha512-O6NvNiHZMd3mlIeMDjP6t/gPG75OqGPeiRZXoMQZJ6iy9GofCls4Ijs5YkPZZwoysizLiedhticmdyx/GyHghA==" - }, "node_modules/call-bind": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", @@ -1011,27 +948,6 @@ "dev": true, "license": "MIT" }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", - "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", - "license": "MIT" - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -1389,16 +1305,6 @@ "node": ">= 0.8" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", @@ -1421,17 +1327,6 @@ "he": "bin/he" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1590,12 +1485,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -1640,18 +1529,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT" - }, "node_modules/minimatch": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 9b2dabc60c..a6db1643f2 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -14,6 +14,7 @@ "clean": "rm -rf build", "test": "npm run compile && mocha build/test", "burner:get-public-key": "npm run compile && node build/examples/burner/getPublicKey.js", + "burner:get-address": "npm run compile && node build/examples/burner/getAddress.js", "burner:sign": "npm run compile && node build/examples/burner/sign.js" }, "keywords": [ diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 61deb19643..0a8f28ec6d 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -1,10 +1,10 @@ import { execHaloCmdPCSC } from '@arx-research/libhalo/api/desktop'; -import Bitcore from '@bitpay-labs/bitcore-lib'; +import bitcore from '@bitpay-labs/bitcore-lib'; import { NFC } from 'nfc-pcsc'; import { Base } from './base.js'; import { BaseMethod, Sign } from './types/methods.js'; -const { Address, PublicKey } = Bitcore; +const { Address, PublicKey } = bitcore; /** * Connect listens on the NFC reader for a card. @@ -52,11 +52,12 @@ export default class Burner implements Base { } async sign(params: Sign) { - const { index, message } = params; + const { index, message, password } = params; this.response = undefined; this.command = { name: 'sign', message, + password, keyNo: index }; return this.awaitResponse(); diff --git a/packages/bitcore-hardware/src/types/methods.ts b/packages/bitcore-hardware/src/types/methods.ts index fcf5485907..eb10a325a9 100644 --- a/packages/bitcore-hardware/src/types/methods.ts +++ b/packages/bitcore-hardware/src/types/methods.ts @@ -1,3 +1,3 @@ export interface BaseMethod { index: number }; -export type Sign = BaseMethod & { message: string }; +export type Sign = BaseMethod & { message: string; password?: string }; From 1c724faca5c6dc8ff0b036f754e93d93e0bc0d75 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Sat, 11 Jul 2026 12:57:04 -0400 Subject: [PATCH 08/56] connect to Ledger Nano S --- .../examples/ledger/connect.ts | 4 + packages/bitcore-hardware/package-lock.json | 445 ++++++++++++++++++ packages/bitcore-hardware/package.json | 5 +- packages/bitcore-hardware/src/dmk.ts | 14 + packages/bitcore-hardware/src/ledger.ts | 23 + 5 files changed, 490 insertions(+), 1 deletion(-) create mode 100644 packages/bitcore-hardware/examples/ledger/connect.ts create mode 100644 packages/bitcore-hardware/src/dmk.ts create mode 100644 packages/bitcore-hardware/src/ledger.ts diff --git a/packages/bitcore-hardware/examples/ledger/connect.ts b/packages/bitcore-hardware/examples/ledger/connect.ts new file mode 100644 index 0000000000..a8f3bb99d2 --- /dev/null +++ b/packages/bitcore-hardware/examples/ledger/connect.ts @@ -0,0 +1,4 @@ +import Ledger from '../../src/ledger.js'; + +const ledger = new Ledger(); +ledger.connect(); diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index 4b13b7678d..9912522a16 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -10,6 +10,9 @@ "license": "MIT", "dependencies": { "@arx-research/libhalo": "^1.19.0", + "@bitpay-labs/bitcore-lib": "^11.5.1", + "@ledgerhq/device-management-kit": "^1.7.1", + "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", "nfc-pcsc": "^0.8.1" }, "devDependencies": { @@ -43,6 +46,76 @@ "websocket-as-promised": "^3.0.0" } }, + "node_modules/@bitpay-labs/bitcore-lib": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib/-/bitcore-lib-11.5.1.tgz", + "integrity": "sha512-bjYMYo5RWwvCnwWXLwXUJCUVw0aEMDEYx+yC3X26Lzo70pOZFPRgyuiDxdMJfihatdB9u87f0z5U+ja8KSPMsw==", + "license": "MIT", + "dependencies": { + "bech32": "=2.0.0", + "bn.js": "=4.11.8", + "bs58": "^4.0.1", + "buffer-compare": "=1.1.1", + "elliptic": "^6.5.3", + "inherits": "=2.0.1", + "lodash": "^4.17.20" + } + }, + "node_modules/@bitpay-labs/bitcore-lib/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "license": "ISC" + }, + "node_modules/@inversifyjs/common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/common/-/common-1.5.0.tgz", + "integrity": "sha512-Qj5BELk11AfI2rgZEAaLPmOftmQRLLmoCXgAjmaF0IngQN5vHomVT5ML7DZ3+CA5fgGcEVMcGbUDAun+Rz+oNg==", + "license": "MIT" + }, + "node_modules/@inversifyjs/container": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@inversifyjs/container/-/container-1.9.1.tgz", + "integrity": "sha512-8EhjFoAx1LoD7TpCuP9ptitwc+7kVXEpZB0IeoEsCQb9sWaNYYaBi+7Lommu3/1nYxdMbX2t7AJhQnryT1EEsg==", + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.0", + "@inversifyjs/core": "5.2.0", + "@inversifyjs/reflect-metadata-utils": "1.1.0" + }, + "peerDependencies": { + "reflect-metadata": "~0.2.2" + } + }, + "node_modules/@inversifyjs/core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/core/-/core-5.2.0.tgz", + "integrity": "sha512-MMaHGGRjQWT9uAof63sbZyEhRl4XptEAE17DJwrgUcN9LsdIEvecKP3r53pE9VF88PFR41knUKKzagUBvWLHmw==", + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.0", + "@inversifyjs/prototype-utils": "0.1.0", + "@inversifyjs/reflect-metadata-utils": "1.1.0" + } + }, + "node_modules/@inversifyjs/prototype-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/prototype-utils/-/prototype-utils-0.1.0.tgz", + "integrity": "sha512-lNz1yyajMRDXBHLvJsYYX81FcmeD15e5Qz1zAZ/3zeYTl+u7ZF/GxNRKJzNOloeMPMtuR8BnvzHA1SZxjR+J9w==", + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.0" + } + }, + "node_modules/@inversifyjs/reflect-metadata-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/reflect-metadata-utils/-/reflect-metadata-utils-1.1.0.tgz", + "integrity": "sha512-jmuAuC3eL1GnFAYfJGJOMKRDL9q1mgzOyrban6zxfM8Yg1FUHsj25h27bW2G7p8X1Amvhg3MLkaOuogszkrofA==", + "license": "MIT", + "peerDependencies": { + "reflect-metadata": "0.2.2" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -61,6 +134,84 @@ "node": ">=12" } }, + "node_modules/@ledgerhq/device-management-kit": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/device-management-kit/-/device-management-kit-1.7.1.tgz", + "integrity": "sha512-O1/H1BWPjrZre+/czkuDcP7fpbjq+PaTwquUtFxEXdVMM+6buvYAtlRUyGR6kjBy/tOsiSKQmHCnOabi/KBozw==", + "license": "Apache-2.0", + "dependencies": { + "@noble/hashes": "^1.8.0", + "@sentry/minimal": "6.19.7", + "inversify": "7.5.1", + "isomorphic-ws": "^5.0.0", + "purify-ts": "2.1.0", + "reflect-metadata": "0.2.2", + "semver": "7.7.2", + "uuid": "11.0.3", + "ws": "^8.18.0", + "xstate": "5.19.2" + }, + "peerDependencies": { + "rxjs": "7.8.2" + } + }, + "node_modules/@ledgerhq/device-transport-kit-node-hid": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/device-transport-kit-node-hid/-/device-transport-kit-node-hid-1.0.1.tgz", + "integrity": "sha512-OALVGVP9eOBaHMqUDlGOrbpsygYawF4Eh/qq8zSEhfeECsxWpmYmKjgm0nJzhiTSIEa/U2inQVbGk2oY5HSHdQ==", + "license": "Apache-2.0", + "dependencies": { + "node-hid": "^3.2.0", + "purify-ts": "2.1.0", + "usb": "^2.16.0", + "uuid": "11.0.3" + }, + "peerDependencies": { + "@ledgerhq/device-management-kit": "^1.2.0", + "rxjs": "7.8.2" + } + }, + "node_modules/@ledgerhq/device-transport-kit-node-hid/node_modules/node-hid": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-hid/-/node-hid-3.3.0.tgz", + "integrity": "sha512-j+dFgJLRAE0nufQKXk3IfS6T6YuHhCgMvz4TrG0sgtb6DSCdYpfJ1etcdmeCmPQjUgO+yo32ktVrRliNs/+fmg==", + "hasInstallScript": true, + "license": "(MIT OR X11)", + "dependencies": { + "node-addon-api": "^3.2.1", + "pkg-prebuilds": "^1.0.0" + }, + "bin": { + "hid-showdevices": "src/show-devices.js" + }, + "engines": { + "node": ">=10.16" + } + }, + "node_modules/@ledgerhq/device-transport-kit-node-hid/node_modules/usb": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/usb/-/usb-2.18.0.tgz", + "integrity": "sha512-klAJPUTaSxRvTgrIh7om6UTrgRxdzioD+rJc/MaoiN8+OGdqRzai39tR00asnoCesPNikItWB9zBZoo0pJsWaA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@types/w3c-web-usb": "^1.0.6", + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.5.0" + }, + "engines": { + "node": ">=12.22.0 <13.0 || >=14.17.0" + } + }, + "node_modules/@ledgerhq/device-transport-kit-node-hid/node_modules/usb/node_modules/node-addon-api": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.0.tgz", + "integrity": "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/@noble/curves": { "version": "1.9.7", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", @@ -110,6 +261,74 @@ "nan": "^2.14.0" } }, + "node_modules/@sentry/hub": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", + "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@sentry/minimal": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", + "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@sentry/types": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", + "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", + "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -128,6 +347,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, "node_modules/@types/mocha": { "version": "10.0.10", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", @@ -135,6 +360,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/w3c-web-usb": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.14.tgz", + "integrity": "sha512-Qu3Nn6JFuF4+sHKYl+IcX9vYiI40ogleXzFFSxoE1W94rG98o/kXs8uJ0QSfFzuwBCZWlGfUGpPkgwuuX4PchA==", + "license": "MIT" + }, "node_modules/@typescript/typescript-aix-ppc64": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", @@ -548,6 +779,21 @@ "dev": true, "license": "MIT" }, + "node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", + "license": "MIT" + }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -557,6 +803,12 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", @@ -567,6 +819,12 @@ "balanced-match": "^1.0.0" } }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -574,6 +832,20 @@ "dev": true, "license": "ISC" }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/buffer-compare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz", + "integrity": "sha512-O6NvNiHZMd3mlIeMDjP6t/gPG75OqGPeiRZXoMQZJ6iy9GofCls4Ijs5YkPZZwoysizLiedhticmdyx/GyHghA==" + }, "node_modules/call-bind": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", @@ -948,6 +1220,27 @@ "dev": true, "license": "MIT" }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "license": "MIT" + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -1305,6 +1598,16 @@ "node": ">= 0.8" } }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", @@ -1327,12 +1630,37 @@ "he": "bin/he" } }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/inversify": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-7.5.1.tgz", + "integrity": "sha512-oWWFDU2BXiuqZynGcLDDD4tqiWAeaEUCALlCj0vk/QwHGgZY/tzDFPuTmWMY3jwRmDIHxVDkcj9SL3MFTlCEDw==", + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.0", + "@inversifyjs/container": "1.9.1", + "@inversifyjs/core": "5.2.0" + }, + "peerDependencies": { + "reflect-metadata": "~0.2.2" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -1415,6 +1743,15 @@ "dev": true, "license": "ISC" }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -1485,6 +1822,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -1529,6 +1872,18 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" + }, "node_modules/minimatch": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", @@ -1614,6 +1969,23 @@ "@pokusew/pcsclite": "^0.6.0" } }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "license": "MIT" + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -1722,6 +2094,19 @@ "dev": true, "license": "ISC" }, + "node_modules/pkg-prebuilds": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pkg-prebuilds/-/pkg-prebuilds-1.1.0.tgz", + "integrity": "sha512-jyai+KTQ2OwbN6iRYw88XbYOMgtpoSYJpjYebx7d9ihqz3txNi3ucsBt3va0iVWe6svSlaqpijMHFF/eJCMZzg==", + "license": "MIT", + "bin": { + "pkg-prebuilds-copy": "bin/copy.mjs", + "pkg-prebuilds-verify": "bin/verify.mjs" + }, + "engines": { + "node": ">= 14.15.0" + } + }, "node_modules/pngjs": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", @@ -1764,6 +2149,15 @@ "node": ">=10" } }, + "node_modules/purify-ts": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/purify-ts/-/purify-ts-2.1.0.tgz", + "integrity": "sha512-+KNUHV9FxB9BbjadFdvxa+LNJIaqZmSF7CQH5Rv6+f0rBzsxm9FEqrvkALQbWYJobAja2ZCbBDUY7O4fH2znMA==", + "license": "ISC", + "dependencies": { + "@types/json-schema": "7.0.15" + } + }, "node_modules/qrcode": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", @@ -2020,6 +2414,12 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2048,6 +2448,16 @@ "node": ">= 0.8" } }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2068,6 +2478,18 @@ ], "license": "MIT" }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -2497,6 +2919,19 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/uuid": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", + "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/websocket-as-promised": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/websocket-as-promised/-/websocket-as-promised-3.0.1.tgz", @@ -2677,6 +3112,16 @@ } } }, + "node_modules/xstate": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.19.2.tgz", + "integrity": "sha512-B8fL2aP0ogn5aviAXFzI5oZseAMqN00fg/TeDa3ZtatyDcViYLIfuQl4y8qmHCiKZgGEzmnTyNtNQL9oeJE2gw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/xstate" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index a6db1643f2..7f58592d11 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -15,7 +15,8 @@ "test": "npm run compile && mocha build/test", "burner:get-public-key": "npm run compile && node build/examples/burner/getPublicKey.js", "burner:get-address": "npm run compile && node build/examples/burner/getAddress.js", - "burner:sign": "npm run compile && node build/examples/burner/sign.js" + "burner:sign": "npm run compile && node build/examples/burner/sign.js", + "ledger:connect": "npm run compile && node build/examples/ledger/connect.js" }, "keywords": [ "bitcore", @@ -27,6 +28,8 @@ "dependencies": { "@arx-research/libhalo": "^1.19.0", "@bitpay-labs/bitcore-lib": "^11.5.1", + "@ledgerhq/device-management-kit": "^1.7.1", + "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", "nfc-pcsc": "^0.8.1" }, "devDependencies": { diff --git a/packages/bitcore-hardware/src/dmk.ts b/packages/bitcore-hardware/src/dmk.ts new file mode 100644 index 0000000000..cc7a0d7392 --- /dev/null +++ b/packages/bitcore-hardware/src/dmk.ts @@ -0,0 +1,14 @@ +import { createRequire } from 'module'; +// @eslint disable import/newline-after-import +const require = createRequire(import.meta.url); +const { + ConsoleLogger, + DeviceManagementKitBuilder +} = require('@ledgerhq/device-management-kit'); +const { nodeHidTransportFactory } = require('@ledgerhq/device-transport-kit-node-hid'); + + +export const dmk = new DeviceManagementKitBuilder() + .addLogger(new ConsoleLogger()) + .addTransport(nodeHidTransportFactory) + .build(); diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts new file mode 100644 index 0000000000..cf36b48d29 --- /dev/null +++ b/packages/bitcore-hardware/src/ledger.ts @@ -0,0 +1,23 @@ +import { dmk } from './dmk.js'; + + +export default class Ledger { + + connect() { + const subscription = dmk.listenToAvailableDevices().subscribe({ + next: (devices) => { + // Handle the available devices here + console.log(devices); + }, + error: (error) => { + console.error(error); + }, + complete: () => { + console.log('Completed'); + }, + }); + + // Stop listening to available devices + subscription.unsubscribe(); + } +} From da1b8b3671bd190869aca28801ef3a77acd59a02 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Sat, 11 Jul 2026 14:58:15 -0400 Subject: [PATCH 09/56] refactored ledger hardware wallet connection --- .../examples/ledger/connect.ts | 2 +- packages/bitcore-hardware/src/dmk.ts | 2 - packages/bitcore-hardware/src/ledger.ts | 47 ++++++++++++------- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/packages/bitcore-hardware/examples/ledger/connect.ts b/packages/bitcore-hardware/examples/ledger/connect.ts index a8f3bb99d2..6f3b50f738 100644 --- a/packages/bitcore-hardware/examples/ledger/connect.ts +++ b/packages/bitcore-hardware/examples/ledger/connect.ts @@ -1,4 +1,4 @@ import Ledger from '../../src/ledger.js'; const ledger = new Ledger(); -ledger.connect(); +await ledger.connect(); diff --git a/packages/bitcore-hardware/src/dmk.ts b/packages/bitcore-hardware/src/dmk.ts index cc7a0d7392..ff969f9e4c 100644 --- a/packages/bitcore-hardware/src/dmk.ts +++ b/packages/bitcore-hardware/src/dmk.ts @@ -2,13 +2,11 @@ import { createRequire } from 'module'; // @eslint disable import/newline-after-import const require = createRequire(import.meta.url); const { - ConsoleLogger, DeviceManagementKitBuilder } = require('@ledgerhq/device-management-kit'); const { nodeHidTransportFactory } = require('@ledgerhq/device-transport-kit-node-hid'); export const dmk = new DeviceManagementKitBuilder() - .addLogger(new ConsoleLogger()) .addTransport(nodeHidTransportFactory) .build(); diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index cf36b48d29..37cc051acc 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -1,23 +1,38 @@ import { dmk } from './dmk.js'; - export default class Ledger { + device: any; + sessionId: any; + discoverySubscryption: any; - connect() { - const subscription = dmk.listenToAvailableDevices().subscribe({ - next: (devices) => { - // Handle the available devices here - console.log(devices); - }, - error: (error) => { - console.error(error); - }, - complete: () => { - console.log('Completed'); - }, - }); + async connect() { + return new Promise(async (resolve) => { + console.log('Discovering Ledger device...'); + if (this.discoverySubscryption) { + this.discoverySubscryption.unsubscribe(); + } - // Stop listening to available devices - subscription.unsubscribe(); + this.discoverySubscryption = dmk.startDiscovering({}).subscribe({ + next: async (device) => { + console.log(`Found ${device.id}, model: ${device.deviceModel.model}`); + try { + this.sessionId = await dmk.connect({ device }); + this.discoverySubscryption.unsubscribe(); + + this.device = dmk.getConnectedDevice({ + sessionId: this.sessionId + }); + resolve(0); + } catch (error) { + console.error(error); + resolve(1); + } + }, + error: (error) => { + console.error(error); + resolve(1); + } + }); + }); } } From ed77af2f1dac68aa3d137bf7b19a43be4ae7bc13 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Sat, 11 Jul 2026 15:14:42 -0400 Subject: [PATCH 10/56] get ledger version --- .../ledger/{connect.ts => version.ts} | 2 ++ packages/bitcore-hardware/package.json | 2 +- packages/bitcore-hardware/src/ledger.ts | 26 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) rename packages/bitcore-hardware/examples/ledger/{connect.ts => version.ts} (60%) diff --git a/packages/bitcore-hardware/examples/ledger/connect.ts b/packages/bitcore-hardware/examples/ledger/version.ts similarity index 60% rename from packages/bitcore-hardware/examples/ledger/connect.ts rename to packages/bitcore-hardware/examples/ledger/version.ts index 6f3b50f738..f0a901ad14 100644 --- a/packages/bitcore-hardware/examples/ledger/connect.ts +++ b/packages/bitcore-hardware/examples/ledger/version.ts @@ -2,3 +2,5 @@ import Ledger from '../../src/ledger.js'; const ledger = new Ledger(); await ledger.connect(); +console.log(await ledger.version()); +await ledger.disconnect(); diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 7f58592d11..99db464a9d 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -16,7 +16,7 @@ "burner:get-public-key": "npm run compile && node build/examples/burner/getPublicKey.js", "burner:get-address": "npm run compile && node build/examples/burner/getAddress.js", "burner:sign": "npm run compile && node build/examples/burner/sign.js", - "ledger:connect": "npm run compile && node build/examples/ledger/connect.js" + "ledger:version": "npm run compile && node build/examples/ledger/version.js" }, "keywords": [ "bitcore", diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index 37cc051acc..faa15ccf8c 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -1,4 +1,8 @@ +import { createRequire } from 'module'; import { dmk } from './dmk.js'; +// @eslint disable import/newline-after-import +const require = createRequire(import.meta.url); +const { GetOsVersionCommand } = require('@ledgerhq/device-management-kit'); export default class Ledger { device: any; @@ -35,4 +39,26 @@ export default class Ledger { }); }); } + + async disconnect() { + if (this.discoverySubscryption) { + this.discoverySubscryption.unsubscribe(); + } + + if (this.sessionId) { + try { + await dmk.disconnect({ sessionId: this.sessionId }); + this.sessionId = null; + console.log(`Disconnected ${this.device.name}`); + } catch (error) { + console.error(error); + } + } + } + + async version() { + console.log(this.sessionId); + const { seVersion } = (await dmk.sendCommand({ sessionId: this.sessionId, command: new GetOsVersionCommand() })).data; + return seVersion; + } } From 81df5ee9e4c788fec9dbc03d02fe3bf76ff2d68e Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Sat, 11 Jul 2026 16:08:13 -0400 Subject: [PATCH 11/56] added version retrieval for ledger and burner --- .../burner/{getAddress.ts => address.ts} | 4 +-- .../burner/{getPublicKey.ts => publicKey.ts} | 4 +-- .../bitcore-hardware/examples/burner/sign.ts | 2 +- .../examples/burner/version.ts | 10 +++++++ .../examples/ledger/version.ts | 2 +- packages/bitcore-hardware/package.json | 7 +++-- packages/bitcore-hardware/src/base.ts | 1 + packages/bitcore-hardware/src/burner.ts | 30 +++++++++++++++++-- packages/bitcore-hardware/src/index.ts | 4 +++ packages/bitcore-hardware/src/ledger.ts | 2 +- .../bitcore-hardware/src/types/burnerTypes.ts | 6 ++++ 11 files changed, 60 insertions(+), 12 deletions(-) rename packages/bitcore-hardware/examples/burner/{getAddress.ts => address.ts} (57%) rename packages/bitcore-hardware/examples/burner/{getPublicKey.ts => publicKey.ts} (76%) create mode 100644 packages/bitcore-hardware/examples/burner/version.ts create mode 100644 packages/bitcore-hardware/src/types/burnerTypes.ts diff --git a/packages/bitcore-hardware/examples/burner/getAddress.ts b/packages/bitcore-hardware/examples/burner/address.ts similarity index 57% rename from packages/bitcore-hardware/examples/burner/getAddress.ts rename to packages/bitcore-hardware/examples/burner/address.ts index 1a827ea9b4..305acdeae1 100644 --- a/packages/bitcore-hardware/examples/burner/getAddress.ts +++ b/packages/bitcore-hardware/examples/burner/address.ts @@ -3,8 +3,8 @@ import BitcoreHardware from '../../src/index.js'; const wallet = new BitcoreHardware('burner', 'btc'); wallet.connect(); -console.log('Tap burner wallet on an NFC reader to output the public key'); +console.log('Tap burner wallet on an NFC reader to get the address...'); console.log(await wallet.getAddress({ index: 9 })); -console.log('Signed transaction with Burner wallet, exiting...'); +console.log('Recieved address'); process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner/getPublicKey.ts b/packages/bitcore-hardware/examples/burner/publicKey.ts similarity index 76% rename from packages/bitcore-hardware/examples/burner/getPublicKey.ts rename to packages/bitcore-hardware/examples/burner/publicKey.ts index 8adb9e2fc6..b55d4a065b 100644 --- a/packages/bitcore-hardware/examples/burner/getPublicKey.ts +++ b/packages/bitcore-hardware/examples/burner/publicKey.ts @@ -3,8 +3,8 @@ import BitcoreHardware from '../../src/index.js'; const wallet = new BitcoreHardware('burner', 'btc'); wallet.connect(); -console.log('Tap burner wallet on an NFC reader to output the public key'); +console.log('Tap burner wallet on an NFC reader to output the public key...'); console.log(await wallet.getPublicKey({ index: 9 })); -console.log('Signed transaction with Burner wallet, exiting...'); +console.log('Recieved public key'); process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index c86ffb92cb..8675653e0b 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -20,5 +20,5 @@ const transaction = new bitcore.Transaction() console.log('Tap burner wallet on an NFC reader to sign a transaction'); console.log(await wallet.sign({ index: 9, message: transaction, password: '123456' })); -console.log('Signed transaction with Burner wallet, exiting...'); +console.log('Signed transaction with burner wallet, exiting...'); process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner/version.ts b/packages/bitcore-hardware/examples/burner/version.ts new file mode 100644 index 0000000000..07ef74f20c --- /dev/null +++ b/packages/bitcore-hardware/examples/burner/version.ts @@ -0,0 +1,10 @@ +import BitcoreHardware from '../../src/index.js'; + +const wallet = new BitcoreHardware('burner', 'btc'); +wallet.connect(); + +console.log('Tap burner wallet on an NFC reader to get the firmware version...'); +console.log(await wallet.getVersion({ index: 1 })); + +console.log('Recieved version'); +process.exit(0); diff --git a/packages/bitcore-hardware/examples/ledger/version.ts b/packages/bitcore-hardware/examples/ledger/version.ts index f0a901ad14..e039c0f5e3 100644 --- a/packages/bitcore-hardware/examples/ledger/version.ts +++ b/packages/bitcore-hardware/examples/ledger/version.ts @@ -2,5 +2,5 @@ import Ledger from '../../src/ledger.js'; const ledger = new Ledger(); await ledger.connect(); -console.log(await ledger.version()); +console.log(await ledger.getVersion()); await ledger.disconnect(); diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 99db464a9d..3aac0ee961 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -12,10 +12,11 @@ "compile": "npm run clean && npm run build", "build": "tsc", "clean": "rm -rf build", - "test": "npm run compile && mocha build/test", - "burner:get-public-key": "npm run compile && node build/examples/burner/getPublicKey.js", - "burner:get-address": "npm run compile && node build/examples/burner/getAddress.js", + "test": "npm run compile && mocha build/test && node build/examples/burner/publicKey.js && node build/examples/burner/address.js && node build/examples/burner/sign.js && node build/examples/burner/version", + "burner:public-key": "npm run compile && node build/examples/burner/publicKey.js", + "burner:address": "npm run compile && node build/examples/burner/address.js", "burner:sign": "npm run compile && node build/examples/burner/sign.js", + "burner:version": "npm run compile && node build/examples/burner/version.js", "ledger:version": "npm run compile && node build/examples/ledger/version.js" }, "keywords": [ diff --git a/packages/bitcore-hardware/src/base.ts b/packages/bitcore-hardware/src/base.ts index 117e7318fb..274564a5f8 100644 --- a/packages/bitcore-hardware/src/base.ts +++ b/packages/bitcore-hardware/src/base.ts @@ -5,4 +5,5 @@ export interface Base { sign(params: Sign): Promise; getPublicKey(params: BaseMethod): Promise; getAddress(params: BaseMethod): Promise; + getVersion(params?: BaseMethod): Promise; }; diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 0a8f28ec6d..27f4d5bafc 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -2,6 +2,7 @@ import { execHaloCmdPCSC } from '@arx-research/libhalo/api/desktop'; import bitcore from '@bitpay-labs/bitcore-lib'; import { NFC } from 'nfc-pcsc'; import { Base } from './base.js'; +import { DataType } from './types/burnerTypes.js'; import { BaseMethod, Sign } from './types/methods.js'; const { Address, PublicKey } = bitcore; @@ -60,6 +61,7 @@ export default class Burner implements Base { password, keyNo: index }; + return this.awaitResponse(); } @@ -74,6 +76,21 @@ export default class Burner implements Base { return (await this.awaitResponse() as any).publicKey[index].value; } + /** + * + * @param req + * @returns + */ + async getData(req: Array<{ type: DataType; index: number }>) { + this.response = undefined; + this.command = { + name: 'get_data_struct_v2', + spec: req + }; + + return this.awaitResponse(); + } + async getAddress(params: BaseMethod) { const { index } = params; this.response = undefined; @@ -82,12 +99,21 @@ export default class Burner implements Base { spec: [{ type: 'compressedPublicKey', index }] }; + const data: any = await this.getData([{ type: 'compressedPublicKey', index }]); + try { - const pubKey = PublicKey.fromString((await this.awaitResponse() as any).compressedPublicKey[index].value); + const pubKey = PublicKey.fromString(data.compressedPublicKey[index].value); const address = Address.fromPublicKey(pubKey, 'livenet', 'witnesspubkeyhash'); return address.toString(); - } catch { + } catch (error) { + console.error(error); return undefined; } } + + async getVersion(params?: BaseMethod) { + const { index } = params || { index: 1 }; + const data: any = await this.getData([{ type: 'firmwareVersion', index }]); + return data.firmwareVersion[index].value; + } } diff --git a/packages/bitcore-hardware/src/index.ts b/packages/bitcore-hardware/src/index.ts index 80d88e02c6..574820ce59 100644 --- a/packages/bitcore-hardware/src/index.ts +++ b/packages/bitcore-hardware/src/index.ts @@ -31,4 +31,8 @@ export default class BitcoreHardware implements Base { async getAddress(params: BaseMethod) { return this.hardwareWallet?.getAddress(params); } + + async getVersion(params?: BaseMethod) { + return this.hardwareWallet?.getVersion(params); + } } diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index faa15ccf8c..fff3e09419 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -56,7 +56,7 @@ export default class Ledger { } } - async version() { + async getVersion() { console.log(this.sessionId); const { seVersion } = (await dmk.sendCommand({ sessionId: this.sessionId, command: new GetOsVersionCommand() })).data; return seVersion; diff --git a/packages/bitcore-hardware/src/types/burnerTypes.ts b/packages/bitcore-hardware/src/types/burnerTypes.ts new file mode 100644 index 0000000000..1f538e0ebb --- /dev/null +++ b/packages/bitcore-hardware/src/types/burnerTypes.ts @@ -0,0 +1,6 @@ +// Types from https://github.com/arx-research/libhalo/blob/master/docs/halo-command-set.md#command-sign +export type DataType = + 'publicKey' | 'compressedPublicKey' | 'publicKeyAttest' | + 'keySlotFlag' | 'keySlotFlag' | 'keySlotFailedAuthCtr' | + 'keySlotFailState' | 'keySlotAuthUnlockChallenge' | 'latchValue' | + 'latchAttest' | 'graffiti' | 'firmwareVersion'; From b1ba1ecc059b302149fac4ba46498c516ae174a1 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Sat, 11 Jul 2026 23:23:39 -0400 Subject: [PATCH 12/56] added address fetching for ledger --- .../examples/ledger/address.ts | 7 + .../examples/ledger/version.ts | 1 + packages/bitcore-hardware/package-lock.json | 151 ++++++++++++++++-- packages/bitcore-hardware/package.json | 8 +- packages/bitcore-hardware/src/ledger.ts | 19 ++- 5 files changed, 165 insertions(+), 21 deletions(-) create mode 100644 packages/bitcore-hardware/examples/ledger/address.ts diff --git a/packages/bitcore-hardware/examples/ledger/address.ts b/packages/bitcore-hardware/examples/ledger/address.ts new file mode 100644 index 0000000000..fb2631b2f7 --- /dev/null +++ b/packages/bitcore-hardware/examples/ledger/address.ts @@ -0,0 +1,7 @@ +import Ledger from '../../src/ledger.js'; + +const ledger = new Ledger(); +await ledger.connect(); +console.log(await ledger.getAddress()); +await ledger.disconnect(); +process.exit(0); diff --git a/packages/bitcore-hardware/examples/ledger/version.ts b/packages/bitcore-hardware/examples/ledger/version.ts index e039c0f5e3..a4fd7f516f 100644 --- a/packages/bitcore-hardware/examples/ledger/version.ts +++ b/packages/bitcore-hardware/examples/ledger/version.ts @@ -4,3 +4,4 @@ const ledger = new Ledger(); await ledger.connect(); console.log(await ledger.getVersion()); await ledger.disconnect(); +process.exit(0); diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index 9912522a16..81878cc959 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -12,8 +12,11 @@ "@arx-research/libhalo": "^1.19.0", "@bitpay-labs/bitcore-lib": "^11.5.1", "@ledgerhq/device-management-kit": "^1.7.1", + "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", - "nfc-pcsc": "^0.8.1" + "@ledgerhq/signer-utils": "^1.3.0", + "nfc-pcsc": "^0.8.1", + "rxjs": "^7.8.2" }, "devDependencies": { "@types/chai": "5.2.3", @@ -155,6 +158,24 @@ "rxjs": "7.8.2" } }, + "node_modules/@ledgerhq/device-signer-kit-bitcoin": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ledgerhq/device-signer-kit-bitcoin/-/device-signer-kit-bitcoin-1.3.2.tgz", + "integrity": "sha512-LLkKGDiHRUwBHdotIQ6sB378gHEV79HMEXPCtcrvYeiuD3PyKInaVAsi3wYhlrWgFqvkf1Tq9REtmSR/Lw5s4g==", + "license": "Apache-2.0", + "dependencies": { + "@types/crypto-js": "^4.2.0", + "crypto-js": "^4.2.0", + "inversify": "7.5.1", + "purify-ts": "2.1.0", + "reflect-metadata": "0.2.2", + "xstate": "5.19.2" + }, + "peerDependencies": { + "@ledgerhq/device-management-kit": "^1.7.0", + "bitcoinjs-lib": "^6.1.6" + } + }, "node_modules/@ledgerhq/device-transport-kit-node-hid": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@ledgerhq/device-transport-kit-node-hid/-/device-transport-kit-node-hid-1.0.1.tgz", @@ -212,6 +233,18 @@ "node": "^18 || ^20 || >= 21" } }, + "node_modules/@ledgerhq/signer-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/signer-utils/-/signer-utils-1.3.0.tgz", + "integrity": "sha512-qe+HQMgZxq6SPv8ghvlq4c33RchUwlf1qE/qp7MtUGPbKGAqD/0PKNyzx05sKLpmA8m6YZdtndHH4CEkikzqSQ==", + "license": "Apache-2.0", + "dependencies": { + "semver": "7.7.2" + }, + "peerDependencies": { + "@ledgerhq/device-management-kit": "^1.7.1" + } + }, "node_modules/@noble/curves": { "version": "1.9.7", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", @@ -340,6 +373,12 @@ "assertion-error": "^2.0.1" } }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "license": "MIT" + }, "node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", @@ -360,6 +399,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, "node_modules/@types/w3c-web-usb": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.14.tgz", @@ -803,6 +851,34 @@ "file-uri-to-path": "1.0.0" } }, + "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", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "license": "MIT", + "peer": true, + "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" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -841,6 +917,34 @@ "base-x": "^3.0.2" } }, + "node_modules/bs58check": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^5.0.0" + } + }, + "node_modules/bs58check/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==", + "license": "MIT", + "peer": true + }, + "node_modules/bs58check/node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "base-x": "^4.0.0" + } + }, "node_modules/buffer-compare": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz", @@ -1126,6 +1230,12 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1353,21 +1463,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/ethers/node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/ethers/node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "license": "MIT" - }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -2453,7 +2548,6 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -2878,6 +2972,13 @@ "node": ">= 0.4" } }, + "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", + "peer": true + }, "node_modules/typescript": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", @@ -2913,6 +3014,12 @@ "@typescript/typescript-win32-x64": "7.0.2" } }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2932,6 +3039,16 @@ "uuid": "dist/esm/bin/uuid" } }, + "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", + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, "node_modules/websocket-as-promised": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/websocket-as-promised/-/websocket-as-promised-3.0.1.tgz", diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 3aac0ee961..ef7fabf689 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -12,11 +12,12 @@ "compile": "npm run clean && npm run build", "build": "tsc", "clean": "rm -rf build", - "test": "npm run compile && mocha build/test && node build/examples/burner/publicKey.js && node build/examples/burner/address.js && node build/examples/burner/sign.js && node build/examples/burner/version", + "test": "npm run compile && mocha build/test && for f in build/examples/*/*.js; do node \"$f\"; done", "burner:public-key": "npm run compile && node build/examples/burner/publicKey.js", "burner:address": "npm run compile && node build/examples/burner/address.js", "burner:sign": "npm run compile && node build/examples/burner/sign.js", "burner:version": "npm run compile && node build/examples/burner/version.js", + "ledger:address": "npm run compile && node build/examples/ledger/address.js", "ledger:version": "npm run compile && node build/examples/ledger/version.js" }, "keywords": [ @@ -30,8 +31,11 @@ "@arx-research/libhalo": "^1.19.0", "@bitpay-labs/bitcore-lib": "^11.5.1", "@ledgerhq/device-management-kit": "^1.7.1", + "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", - "nfc-pcsc": "^0.8.1" + "@ledgerhq/signer-utils": "^1.3.0", + "nfc-pcsc": "^0.8.1", + "rxjs": "^7.8.2" }, "devDependencies": { "@types/chai": "5.2.3", diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index fff3e09419..cac392f3ad 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -1,13 +1,21 @@ import { createRequire } from 'module'; +import { + Observable, + lastValueFrom +} from 'rxjs'; import { dmk } from './dmk.js'; // @eslint disable import/newline-after-import const require = createRequire(import.meta.url); -const { GetOsVersionCommand } = require('@ledgerhq/device-management-kit'); +const { + GetOsVersionCommand +} = require('@ledgerhq/device-management-kit'); +const { SignerBtcBuilder } = require('@ledgerhq/device-signer-kit-bitcoin'); export default class Ledger { device: any; sessionId: any; discoverySubscryption: any; + signer: any; async connect() { return new Promise(async (resolve) => { @@ -26,6 +34,8 @@ export default class Ledger { this.device = dmk.getConnectedDevice({ sessionId: this.sessionId }); + + this.signer = new SignerBtcBuilder({ dmk, sessionId: this.sessionId }).build(); resolve(0); } catch (error) { console.error(error); @@ -57,8 +67,13 @@ export default class Ledger { } async getVersion() { - console.log(this.sessionId); const { seVersion } = (await dmk.sendCommand({ sessionId: this.sessionId, command: new GetOsVersionCommand() })).data; return seVersion; } + + async getAddress() { + const ob: Observable = this.signer.getWalletAddress({ derivationPath: "84'/0'/0'", template: 'wpkh(@0/**)' }, 0).observable; + const result = await lastValueFrom(ob); + return result.output.address; + } } From 9a1a05f3fbe788f8bb117efa56cdee3d845fb3db Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Sat, 11 Jul 2026 23:32:52 -0400 Subject: [PATCH 13/56] fix bug by closing ledger app when getting version --- packages/bitcore-hardware/src/ledger.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index cac392f3ad..5a9b110f89 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -7,6 +7,7 @@ import { dmk } from './dmk.js'; // @eslint disable import/newline-after-import const require = createRequire(import.meta.url); const { + CloseAppCommand, GetOsVersionCommand } = require('@ledgerhq/device-management-kit'); const { SignerBtcBuilder } = require('@ledgerhq/device-signer-kit-bitcoin'); @@ -67,6 +68,7 @@ export default class Ledger { } async getVersion() { + await dmk.sendCommand({ sessionId: this.sessionId, command: new CloseAppCommand() }); const { seVersion } = (await dmk.sendCommand({ sessionId: this.sessionId, command: new GetOsVersionCommand() })).data; return seVersion; } From 74709f1d77eb5fb85812bbdc6a58de5813b68384 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Sat, 11 Jul 2026 23:37:39 -0400 Subject: [PATCH 14/56] removed hardware wallet aggregator for now --- .../examples/burner/address.ts | 8 ++-- .../examples/burner/publicKey.ts | 8 ++-- .../bitcore-hardware/examples/burner/sign.ts | 8 ++-- .../examples/burner/version.ts | 8 ++-- packages/bitcore-hardware/src/index.ts | 38 ------------------- 5 files changed, 16 insertions(+), 54 deletions(-) delete mode 100644 packages/bitcore-hardware/src/index.ts diff --git a/packages/bitcore-hardware/examples/burner/address.ts b/packages/bitcore-hardware/examples/burner/address.ts index 305acdeae1..30884d59fb 100644 --- a/packages/bitcore-hardware/examples/burner/address.ts +++ b/packages/bitcore-hardware/examples/burner/address.ts @@ -1,10 +1,10 @@ -import BitcoreHardware from '../../src/index.js'; +import Burner from '../../src/burner.js'; -const wallet = new BitcoreHardware('burner', 'btc'); -wallet.connect(); +const burner = new Burner('btc'); +burner.connect(); console.log('Tap burner wallet on an NFC reader to get the address...'); -console.log(await wallet.getAddress({ index: 9 })); +console.log(await burner.getAddress({ index: 9 })); console.log('Recieved address'); process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner/publicKey.ts b/packages/bitcore-hardware/examples/burner/publicKey.ts index b55d4a065b..1a630fd9fa 100644 --- a/packages/bitcore-hardware/examples/burner/publicKey.ts +++ b/packages/bitcore-hardware/examples/burner/publicKey.ts @@ -1,10 +1,10 @@ -import BitcoreHardware from '../../src/index.js'; +import Burner from '../../src/burner.js'; -const wallet = new BitcoreHardware('burner', 'btc'); -wallet.connect(); +const burner = new Burner('btc'); +burner.connect(); console.log('Tap burner wallet on an NFC reader to output the public key...'); -console.log(await wallet.getPublicKey({ index: 9 })); +console.log(await burner.getPublicKey({ index: 9 })); console.log('Recieved public key'); process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index 8675653e0b..f71b23128d 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -1,8 +1,8 @@ import bitcore from '@bitpay-labs/bitcore-lib'; -import BitcoreHardware from '../../src/index.js'; +import Burner from '../../src/burner.js'; -const wallet = new BitcoreHardware('burner', 'btc'); -wallet.connect(); +const burner = new Burner('btc'); +burner.connect(); const utxo = { txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', @@ -18,7 +18,7 @@ const transaction = new bitcore.Transaction() .toString(); console.log('Tap burner wallet on an NFC reader to sign a transaction'); -console.log(await wallet.sign({ index: 9, message: transaction, password: '123456' })); +console.log(await burner.sign({ index: 9, message: transaction, password: '123456' })); console.log('Signed transaction with burner wallet, exiting...'); process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner/version.ts b/packages/bitcore-hardware/examples/burner/version.ts index 07ef74f20c..29c31ff0d3 100644 --- a/packages/bitcore-hardware/examples/burner/version.ts +++ b/packages/bitcore-hardware/examples/burner/version.ts @@ -1,10 +1,10 @@ -import BitcoreHardware from '../../src/index.js'; +import Burner from '../../src/burner.js'; -const wallet = new BitcoreHardware('burner', 'btc'); -wallet.connect(); +const burner = new Burner('btc'); +burner.connect(); console.log('Tap burner wallet on an NFC reader to get the firmware version...'); -console.log(await wallet.getVersion({ index: 1 })); +console.log(await burner.getVersion({ index: 1 })); console.log('Recieved version'); process.exit(0); diff --git a/packages/bitcore-hardware/src/index.ts b/packages/bitcore-hardware/src/index.ts deleted file mode 100644 index 574820ce59..0000000000 --- a/packages/bitcore-hardware/src/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Base } from './base.js'; -import Burner from './burner.js'; -import { BaseMethod, Sign } from './types/methods.js'; - -export default class BitcoreHardware implements Base { - hardwareWallet: Base | undefined; - constructor(wallet: string, currency: string) { - switch (wallet.toLowerCase()) { - case ('burner'): { - if (!(['btc', 'eth'].includes(currency.toLowerCase()))) { - throw new Error(`Burner can only be run with btc or eth, not ${currency}`); - }; - this.hardwareWallet = new Burner(currency); - break; - } - } - } - - connect() { - this.hardwareWallet?.connect(); - } - - async sign(params: Sign): Promise { - return this.hardwareWallet?.sign(params) || {}; - } - - async getPublicKey(params: BaseMethod): Promise { - return this.hardwareWallet?.getPublicKey(params); - } - - async getAddress(params: BaseMethod) { - return this.hardwareWallet?.getAddress(params); - } - - async getVersion(params?: BaseMethod) { - return this.hardwareWallet?.getVersion(params); - } -} From 16a18dec3229e0344642d55a24a680d289206747 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Sat, 11 Jul 2026 23:45:42 -0400 Subject: [PATCH 15/56] added public key fetching to ledger --- packages/bitcore-hardware/examples/ledger/publicKey.ts | 7 +++++++ packages/bitcore-hardware/package.json | 1 + packages/bitcore-hardware/src/ledger.ts | 6 ++++++ 3 files changed, 14 insertions(+) create mode 100644 packages/bitcore-hardware/examples/ledger/publicKey.ts diff --git a/packages/bitcore-hardware/examples/ledger/publicKey.ts b/packages/bitcore-hardware/examples/ledger/publicKey.ts new file mode 100644 index 0000000000..0d8aae32b3 --- /dev/null +++ b/packages/bitcore-hardware/examples/ledger/publicKey.ts @@ -0,0 +1,7 @@ +import Ledger from '../../src/ledger.js'; + +const ledger = new Ledger(); +await ledger.connect(); +console.log(await ledger.getPublicKey()); +await ledger.disconnect(); +process.exit(0); diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index ef7fabf689..701376d650 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -17,6 +17,7 @@ "burner:address": "npm run compile && node build/examples/burner/address.js", "burner:sign": "npm run compile && node build/examples/burner/sign.js", "burner:version": "npm run compile && node build/examples/burner/version.js", + "ledger:public-key": "npm run compile && node build/examples/ledger/publicKey.js", "ledger:address": "npm run compile && node build/examples/ledger/address.js", "ledger:version": "npm run compile && node build/examples/ledger/version.js" }, diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index 5a9b110f89..d3b3a9443f 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -78,4 +78,10 @@ export default class Ledger { const result = await lastValueFrom(ob); return result.output.address; } + + async getPublicKey() { + const ob: Observable = this.signer.getExtendedPublicKey("84'/0'/0'", 0).observable; + const result = await lastValueFrom(ob); + return result.output.extendedPublicKey; + } } From d1f2aef55327a3c999b7114b0099504c1ddb6cb4 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Sat, 11 Jul 2026 23:52:53 -0400 Subject: [PATCH 16/56] implement same interface for burner and ledger --- .../examples/ledger/address.ts | 2 +- .../examples/ledger/publicKey.ts | 2 +- packages/bitcore-hardware/src/base.ts | 10 +++++----- packages/bitcore-hardware/src/burner.ts | 10 +++++----- packages/bitcore-hardware/src/ledger.ts | 18 +++++++++++++----- packages/bitcore-hardware/src/types/methods.ts | 3 --- .../bitcore-hardware/src/types/paramTypes.ts | 3 +++ 7 files changed, 28 insertions(+), 20 deletions(-) delete mode 100644 packages/bitcore-hardware/src/types/methods.ts create mode 100644 packages/bitcore-hardware/src/types/paramTypes.ts diff --git a/packages/bitcore-hardware/examples/ledger/address.ts b/packages/bitcore-hardware/examples/ledger/address.ts index fb2631b2f7..45a630a632 100644 --- a/packages/bitcore-hardware/examples/ledger/address.ts +++ b/packages/bitcore-hardware/examples/ledger/address.ts @@ -2,6 +2,6 @@ import Ledger from '../../src/ledger.js'; const ledger = new Ledger(); await ledger.connect(); -console.log(await ledger.getAddress()); +console.log(await ledger.getAddress({ index: 0 })); await ledger.disconnect(); process.exit(0); diff --git a/packages/bitcore-hardware/examples/ledger/publicKey.ts b/packages/bitcore-hardware/examples/ledger/publicKey.ts index 0d8aae32b3..56b22dcadb 100644 --- a/packages/bitcore-hardware/examples/ledger/publicKey.ts +++ b/packages/bitcore-hardware/examples/ledger/publicKey.ts @@ -2,6 +2,6 @@ import Ledger from '../../src/ledger.js'; const ledger = new Ledger(); await ledger.connect(); -console.log(await ledger.getPublicKey()); +console.log(await ledger.getPublicKey({ index: 0 })); await ledger.disconnect(); process.exit(0); diff --git a/packages/bitcore-hardware/src/base.ts b/packages/bitcore-hardware/src/base.ts index 274564a5f8..f2e05053a0 100644 --- a/packages/bitcore-hardware/src/base.ts +++ b/packages/bitcore-hardware/src/base.ts @@ -1,9 +1,9 @@ -import { BaseMethod, Sign } from './types/methods.js'; +import { BaseParams, SignParams } from './types/paramTypes.js'; export interface Base { connect(): void; - sign(params: Sign): Promise; - getPublicKey(params: BaseMethod): Promise; - getAddress(params: BaseMethod): Promise; - getVersion(params?: BaseMethod): Promise; + sign(params: SignParams): Promise; + getPublicKey(params: BaseParams): Promise; + getAddress(params: BaseParams): Promise; + getVersion(params?: BaseParams): Promise; }; diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 27f4d5bafc..4964654246 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -3,7 +3,7 @@ import bitcore from '@bitpay-labs/bitcore-lib'; import { NFC } from 'nfc-pcsc'; import { Base } from './base.js'; import { DataType } from './types/burnerTypes.js'; -import { BaseMethod, Sign } from './types/methods.js'; +import { BaseParams, SignParams } from './types/paramTypes.js'; const { Address, PublicKey } = bitcore; @@ -52,7 +52,7 @@ export default class Burner implements Base { }); } - async sign(params: Sign) { + async sign(params: SignParams) { const { index, message, password } = params; this.response = undefined; this.command = { @@ -65,7 +65,7 @@ export default class Burner implements Base { return this.awaitResponse(); } - async getPublicKey(params: BaseMethod) { + async getPublicKey(params: BaseParams) { const { index } = params; this.response = undefined; this.command = { @@ -91,7 +91,7 @@ export default class Burner implements Base { return this.awaitResponse(); } - async getAddress(params: BaseMethod) { + async getAddress(params: BaseParams) { const { index } = params; this.response = undefined; this.command = { @@ -111,7 +111,7 @@ export default class Burner implements Base { } } - async getVersion(params?: BaseMethod) { + async getVersion(params?: BaseParams) { const { index } = params || { index: 1 }; const data: any = await this.getData([{ type: 'firmwareVersion', index }]); return data.firmwareVersion[index].value; diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index d3b3a9443f..3fb8b07053 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -3,7 +3,9 @@ import { Observable, lastValueFrom } from 'rxjs'; +import { Base } from './base.js'; import { dmk } from './dmk.js'; +import { BaseParams } from './types/paramTypes.js'; // @eslint disable import/newline-after-import const require = createRequire(import.meta.url); const { @@ -12,7 +14,7 @@ const { } = require('@ledgerhq/device-management-kit'); const { SignerBtcBuilder } = require('@ledgerhq/device-signer-kit-bitcoin'); -export default class Ledger { +export default class Ledger implements Base { device: any; sessionId: any; discoverySubscryption: any; @@ -73,15 +75,21 @@ export default class Ledger { return seVersion; } - async getAddress() { - const ob: Observable = this.signer.getWalletAddress({ derivationPath: "84'/0'/0'", template: 'wpkh(@0/**)' }, 0).observable; + async getAddress(params: BaseParams) { + const { index } = params; + const ob: Observable = this.signer.getWalletAddress({ derivationPath: "84'/0'/0'", template: 'wpkh(@0/**)' }, index).observable; const result = await lastValueFrom(ob); return result.output.address; } - async getPublicKey() { - const ob: Observable = this.signer.getExtendedPublicKey("84'/0'/0'", 0).observable; + async getPublicKey(params: BaseParams) { + const { index } = params; + const ob: Observable = this.signer.getExtendedPublicKey("84'/0'/0'", index).observable; const result = await lastValueFrom(ob); return result.output.extendedPublicKey; } + + async sign() { + return 'not implemented'; + } } diff --git a/packages/bitcore-hardware/src/types/methods.ts b/packages/bitcore-hardware/src/types/methods.ts deleted file mode 100644 index eb10a325a9..0000000000 --- a/packages/bitcore-hardware/src/types/methods.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface BaseMethod { index: number }; - -export type Sign = BaseMethod & { message: string; password?: string }; diff --git a/packages/bitcore-hardware/src/types/paramTypes.ts b/packages/bitcore-hardware/src/types/paramTypes.ts new file mode 100644 index 0000000000..c1f23d03dd --- /dev/null +++ b/packages/bitcore-hardware/src/types/paramTypes.ts @@ -0,0 +1,3 @@ +export interface BaseParams { index: number }; + +export type SignParams = BaseParams & { message: string; password?: string }; From b6632e32296421d313da8fbcbdd335e104ab7ca5 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 13 Jul 2026 11:59:05 -0400 Subject: [PATCH 17/56] signing demo for ledger sign method --- .../bitcore-hardware/examples/ledger/sign.ts | 7 ++ .../examples/ledger/version.ts | 2 +- packages/bitcore-hardware/package-lock.json | 109 +++++++++++++++++- packages/bitcore-hardware/package.json | 5 +- packages/bitcore-hardware/src/ledger.ts | 51 +++++++- 5 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 packages/bitcore-hardware/examples/ledger/sign.ts diff --git a/packages/bitcore-hardware/examples/ledger/sign.ts b/packages/bitcore-hardware/examples/ledger/sign.ts new file mode 100644 index 0000000000..b4247be5a6 --- /dev/null +++ b/packages/bitcore-hardware/examples/ledger/sign.ts @@ -0,0 +1,7 @@ +import Ledger from '../../src/ledger.js'; + +const ledger = new Ledger(); +await ledger.connect(); +console.log(await ledger.sign()); +await ledger.disconnect(); +process.exit(0); diff --git a/packages/bitcore-hardware/examples/ledger/version.ts b/packages/bitcore-hardware/examples/ledger/version.ts index a4fd7f516f..36dde87a53 100644 --- a/packages/bitcore-hardware/examples/ledger/version.ts +++ b/packages/bitcore-hardware/examples/ledger/version.ts @@ -2,6 +2,6 @@ import Ledger from '../../src/ledger.js'; const ledger = new Ledger(); await ledger.connect(); -console.log(await ledger.getVersion()); +console.log(await ledger.getMasterKeyFingerprint()); await ledger.disconnect(); process.exit(0); diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index 81878cc959..e83ee7d2cf 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -15,8 +15,10 @@ "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", "@ledgerhq/signer-utils": "^1.3.0", + "bip32": "^5.0.1", "nfc-pcsc": "^0.8.1", - "rxjs": "^7.8.2" + "rxjs": "^7.8.2", + "tiny-secp256k1": "^2.2.4" }, "devDependencies": { "@types/chai": "5.2.3", @@ -294,6 +296,15 @@ "nan": "^2.14.0" } }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@sentry/hub": { "version": "6.19.7", "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", @@ -861,6 +872,22 @@ "node": ">=8.0.0" } }, + "node_modules/bip32": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-5.0.1.tgz", + "integrity": "sha512-PWlHIAgYCfVhwqNpZyeakHXuLAGyN6rEQZnhxHxKI3BoFJRVWLl26455fhRlHsmbYcV986HqtPnt33Edu5sTCw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.2.0", + "@scure/base": "^1.1.1", + "uint8array-tools": "^0.0.8", + "valibot": "^1.2.0", + "wif": "^5.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/bitcoinjs-lib": { "version": "6.1.7", "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.7.tgz", @@ -2932,6 +2959,27 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/tiny-secp256k1": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-2.2.4.tgz", + "integrity": "sha512-FoDTcToPqZE454Q04hH9o2EhxWsm7pOSpicyHkgTwKhdKWdsTUuqfP5MLq3g+VjAtl2vSx6JpXGdwA2qpYkI0Q==", + "license": "MIT", + "dependencies": { + "uint8array-tools": "0.0.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tiny-secp256k1/node_modules/uint8array-tools": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/uint8array-tools/-/uint8array-tools-0.0.7.tgz", + "integrity": "sha512-vrrNZJiusLWoFWBqz5Y5KMCgP9W9hnjZHzZiZRT8oNAkq3d5Z5Oe76jAvVVSRh4U8GGR90N2X1dWtrhvx6L8UQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/to-buffer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", @@ -2983,7 +3031,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc" @@ -3014,6 +3062,15 @@ "@typescript/typescript-win32-x64": "7.0.2" } }, + "node_modules/uint8array-tools": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/uint8array-tools/-/uint8array-tools-0.0.8.tgz", + "integrity": "sha512-xS6+s8e0Xbx++5/0L+yyexukU7pz//Yg6IHg3BKhXotg1JcYtgxVcUctQ0HxLByiJzpAkNFawz1Nz5Xadzo82g==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -3039,6 +3096,20 @@ "uuid": "dist/esm/bin/uuid" } }, + "node_modules/valibot": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.2.tgz", + "integrity": "sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/varuint-bitcoin": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", @@ -3106,6 +3177,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wif": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/wif/-/wif-5.0.0.tgz", + "integrity": "sha512-iFzrC/9ne740qFbNjTZ2FciSRJlHIXoxqk/Y5EnE08QOXu1WjJyCCswwDTYbohAOEnlCtLaAAQBhyaLRFh2hMA==", + "license": "MIT", + "dependencies": { + "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/workerpool": { "version": "9.3.4", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 701376d650..1935b5d9d3 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -19,6 +19,7 @@ "burner:version": "npm run compile && node build/examples/burner/version.js", "ledger:public-key": "npm run compile && node build/examples/ledger/publicKey.js", "ledger:address": "npm run compile && node build/examples/ledger/address.js", + "ledger:sign": "npm run compile && node build/examples/ledger/sign.js", "ledger:version": "npm run compile && node build/examples/ledger/version.js" }, "keywords": [ @@ -35,8 +36,10 @@ "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", "@ledgerhq/signer-utils": "^1.3.0", + "bip32": "^5.0.1", "nfc-pcsc": "^0.8.1", - "rxjs": "^7.8.2" + "rxjs": "^7.8.2", + "tiny-secp256k1": "^2.2.4" }, "devDependencies": { "@types/chai": "5.2.3", diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index 3fb8b07053..19fe66f79e 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -1,8 +1,11 @@ import { createRequire } from 'module'; +import BIP32Factory from 'bip32'; +import { Psbt, payments } from 'bitcoinjs-lib'; import { Observable, lastValueFrom } from 'rxjs'; +import * as ecc from 'tiny-secp256k1'; import { Base } from './base.js'; import { dmk } from './dmk.js'; import { BaseParams } from './types/paramTypes.js'; @@ -12,7 +15,12 @@ const { CloseAppCommand, GetOsVersionCommand } = require('@ledgerhq/device-management-kit'); -const { SignerBtcBuilder } = require('@ledgerhq/device-signer-kit-bitcoin'); +const { + DefaultWallet, + SignerBtcBuilder +} = require('@ledgerhq/device-signer-kit-bitcoin'); + +const bip32 = BIP32Factory(ecc); export default class Ledger implements Base { device: any; @@ -90,6 +98,45 @@ export default class Ledger implements Base { } async sign() { - return 'not implemented'; + const psbt = new Psbt(); + + // Derive the specific child key for external chain (0), address index (0) + const childNode = bip32.fromBase58(await this.getPublicKey({ index: 0 })).derive(0).derive(0); + const pubkey = Buffer.from(childNode.publicKey); + + // Compute the P2WPKH scriptPubKey from the derived child key + const p2wpkh = payments.p2wpkh({ pubkey: pubkey }); + const script = p2wpkh.output!; + + const masterFingerprint = await this.getMasterKeyFingerprint(); + psbt.addInput({ + hash: '78519a191327dfdc0c2ea64a04d09d87c3909ce8365d0e0c0dbd0bc80d0405b4', + index: 0, + witnessUtxo: { + script, + value: 1000, + }, + bip32Derivation: [{ + masterFingerprint: Buffer.from(masterFingerprint.buffer, masterFingerprint.byteOffset, masterFingerprint.byteLength), + pubkey, + path: "m/84'/0'/0'/0/0", + }], + }); + psbt.addOutput({ address: 'bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq', value: 1000 }); + + const ob: Observable = this.signer.signTransaction( + new DefaultWallet("84'/0'/0'", 'wpkh(@0/**)'), + psbt + ).observable; + + const result = await lastValueFrom(ob); + return result.output; + } + + async getMasterKeyFingerprint(): Promise { + const ob: Observable = this.signer.getMasterFingerprint().observable; + const result = await lastValueFrom(ob); + + return result.output.masterFingerprint; } } From e49c094c158f995e53fc99bd1ae13f013721a691 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Wed, 15 Jul 2026 14:15:06 -0400 Subject: [PATCH 18/56] sign any psbt form ledger wallet --- .../bitcore-hardware/examples/ledger/sign.ts | 34 ++++++++++++++++++- packages/bitcore-hardware/src/base.ts | 4 +-- packages/bitcore-hardware/src/ledger.ts | 33 ++---------------- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/packages/bitcore-hardware/examples/ledger/sign.ts b/packages/bitcore-hardware/examples/ledger/sign.ts index b4247be5a6..0effe89ef4 100644 --- a/packages/bitcore-hardware/examples/ledger/sign.ts +++ b/packages/bitcore-hardware/examples/ledger/sign.ts @@ -1,7 +1,39 @@ +import BIP32Factory from 'bip32'; +import { Psbt, payments } from 'bitcoinjs-lib'; +import * as ecc from 'tiny-secp256k1'; import Ledger from '../../src/ledger.js'; const ledger = new Ledger(); await ledger.connect(); -console.log(await ledger.sign()); + +const bip32 = BIP32Factory(ecc); +const psbt = new Psbt(); + +// Derive the specific child key for external chain (0), address index (0) +const childNode = bip32.fromBase58(await ledger.getPublicKey({ index: 0 })).derive(0).derive(0); +const pubkey = Buffer.from(childNode.publicKey); + +// Compute the P2WPKH scriptPubKey from the derived child key +const p2wpkh = payments.p2wpkh({ pubkey: pubkey }); +const script = p2wpkh.output!; + +const masterFingerprint = await ledger.getMasterKeyFingerprint(); +psbt.addInput({ + hash: '78519a191327dfdc0c2ea64a04d09d87c3909ce8365d0e0c0dbd0bc80d0405b4', + index: 0, + witnessUtxo: { + script, + value: 1000, + }, + bip32Derivation: [{ + masterFingerprint: Buffer.from(masterFingerprint.buffer, masterFingerprint.byteOffset, masterFingerprint.byteLength), + pubkey, + path: "m/84'/0'/0'/0/0", + }], +}); + +psbt.addOutputs([{ address: 'bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq', value: 900 }]); + +console.log(await ledger.sign(psbt)); await ledger.disconnect(); process.exit(0); diff --git a/packages/bitcore-hardware/src/base.ts b/packages/bitcore-hardware/src/base.ts index f2e05053a0..125863d02d 100644 --- a/packages/bitcore-hardware/src/base.ts +++ b/packages/bitcore-hardware/src/base.ts @@ -1,8 +1,8 @@ -import { BaseParams, SignParams } from './types/paramTypes.js'; +import { BaseParams } from './types/paramTypes.js'; export interface Base { connect(): void; - sign(params: SignParams): Promise; + sign(params: any): Promise; getPublicKey(params: BaseParams): Promise; getAddress(params: BaseParams): Promise; getVersion(params?: BaseParams): Promise; diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index 19fe66f79e..324d4f59b5 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -1,11 +1,9 @@ import { createRequire } from 'module'; -import BIP32Factory from 'bip32'; -import { Psbt, payments } from 'bitcoinjs-lib'; +import { Psbt } from 'bitcoinjs-lib'; import { Observable, lastValueFrom } from 'rxjs'; -import * as ecc from 'tiny-secp256k1'; import { Base } from './base.js'; import { dmk } from './dmk.js'; import { BaseParams } from './types/paramTypes.js'; @@ -20,7 +18,6 @@ const { SignerBtcBuilder } = require('@ledgerhq/device-signer-kit-bitcoin'); -const bip32 = BIP32Factory(ecc); export default class Ledger implements Base { device: any; @@ -97,33 +94,7 @@ export default class Ledger implements Base { return result.output.extendedPublicKey; } - async sign() { - const psbt = new Psbt(); - - // Derive the specific child key for external chain (0), address index (0) - const childNode = bip32.fromBase58(await this.getPublicKey({ index: 0 })).derive(0).derive(0); - const pubkey = Buffer.from(childNode.publicKey); - - // Compute the P2WPKH scriptPubKey from the derived child key - const p2wpkh = payments.p2wpkh({ pubkey: pubkey }); - const script = p2wpkh.output!; - - const masterFingerprint = await this.getMasterKeyFingerprint(); - psbt.addInput({ - hash: '78519a191327dfdc0c2ea64a04d09d87c3909ce8365d0e0c0dbd0bc80d0405b4', - index: 0, - witnessUtxo: { - script, - value: 1000, - }, - bip32Derivation: [{ - masterFingerprint: Buffer.from(masterFingerprint.buffer, masterFingerprint.byteOffset, masterFingerprint.byteLength), - pubkey, - path: "m/84'/0'/0'/0/0", - }], - }); - psbt.addOutput({ address: 'bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq', value: 1000 }); - + async sign(psbt: Psbt) { const ob: Observable = this.signer.signTransaction( new DefaultWallet("84'/0'/0'", 'wpkh(@0/**)'), psbt From 5fde95cbe6d3675066cfddf0cd5416d900b1e314 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Sun, 19 Jul 2026 00:07:35 -0400 Subject: [PATCH 19/56] basic conversion from bitcore transaction to bitcoinjs-lib psbt --- .../bitcore-hardware/examples/ledger/sign.ts | 44 ++++++------------- packages/bitcore-hardware/src/ledger.ts | 28 +++++++++++- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/packages/bitcore-hardware/examples/ledger/sign.ts b/packages/bitcore-hardware/examples/ledger/sign.ts index 0effe89ef4..04b3bac2e9 100644 --- a/packages/bitcore-hardware/examples/ledger/sign.ts +++ b/packages/bitcore-hardware/examples/ledger/sign.ts @@ -1,39 +1,23 @@ -import BIP32Factory from 'bip32'; -import { Psbt, payments } from 'bitcoinjs-lib'; -import * as ecc from 'tiny-secp256k1'; +import { createRequire } from 'module'; import Ledger from '../../src/ledger.js'; +// @eslint disable import/newline-after-import +const require = createRequire(import.meta.url); +const { Script, Transaction, HDPublicKey } = require('@bitpay-labs/bitcore-lib'); const ledger = new Ledger(); await ledger.connect(); -const bip32 = BIP32Factory(ecc); -const psbt = new Psbt(); +const publickey = new HDPublicKey(await ledger.getPublicKey({ index: 0 })).derive('m/0/0').publicKey; -// Derive the specific child key for external chain (0), address index (0) -const childNode = bip32.fromBase58(await ledger.getPublicKey({ index: 0 })).derive(0).derive(0); -const pubkey = Buffer.from(childNode.publicKey); +const tx = new Transaction() + .from({ + address: 'bc1q0wsc0l2pzfn55ra67kr0vm40rjlllyh3a5kf88', + txId: 'a78dbd15bde4d8678c7e01451d6e54e92629395c9b76de7d37bf464514c8bc04', + outputIndex: 0, + script: new Script(publickey.toAddress()), + satoshis: 9290 + }); -// Compute the P2WPKH scriptPubKey from the derived child key -const p2wpkh = payments.p2wpkh({ pubkey: pubkey }); -const script = p2wpkh.output!; - -const masterFingerprint = await ledger.getMasterKeyFingerprint(); -psbt.addInput({ - hash: '78519a191327dfdc0c2ea64a04d09d87c3909ce8365d0e0c0dbd0bc80d0405b4', - index: 0, - witnessUtxo: { - script, - value: 1000, - }, - bip32Derivation: [{ - masterFingerprint: Buffer.from(masterFingerprint.buffer, masterFingerprint.byteOffset, masterFingerprint.byteLength), - pubkey, - path: "m/84'/0'/0'/0/0", - }], -}); - -psbt.addOutputs([{ address: 'bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq', value: 900 }]); - -console.log(await ledger.sign(psbt)); +console.log(await ledger.sign(tx)); await ledger.disconnect(); process.exit(0); diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index 324d4f59b5..9a3e311ff6 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -1,5 +1,6 @@ import { createRequire } from 'module'; -import { Psbt } from 'bitcoinjs-lib'; +import Bitcore from '@bitpay-labs/bitcore-lib'; +import { Psbt, payments } from 'bitcoinjs-lib'; import { Observable, lastValueFrom @@ -18,6 +19,8 @@ const { SignerBtcBuilder } = require('@ledgerhq/device-signer-kit-bitcoin'); +const { HDPublicKey } = Bitcore; +type Transaction = Bitcore.Transaction; export default class Ledger implements Base { device: any; @@ -94,7 +97,28 @@ export default class Ledger implements Base { return result.output.extendedPublicKey; } - async sign(psbt: Psbt) { + async sign(tx: Transaction) { + const psbt = new Psbt(); + + const pubkey = new HDPublicKey(await this.getPublicKey({ index: 0 })).derive('m/0/0').publicKey.toBuffer(); + const masterFingerprint = await this.getMasterKeyFingerprint(); + + psbt.addInputs(tx.inputs.map(input => ({ + hash: input.prevTxId, + index: input.outputIndex, + witnessUtxo: { + script: payments.p2wpkh({ pubkey }).output, + value: input.output._satoshis + }, + bip32Derivation: [{ + masterFingerprint: Buffer.from(masterFingerprint.buffer, masterFingerprint.byteOffset, masterFingerprint.byteLength), + pubkey, + path: "m/84'/0'/0'/0/0", + }] + }))); + + psbt.addOutputs([{ address: 'bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq', value: 900 }]); + const ob: Observable = this.signer.signTransaction( new DefaultWallet("84'/0'/0'", 'wpkh(@0/**)'), psbt From 7d667dbcd9ec0535aba312434db49afd1ed62c02 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 20 Jul 2026 14:16:12 -0400 Subject: [PATCH 20/56] send digest to burner wallet to sign instead of message --- .../bitcore-hardware/examples/burner/sign.ts | 17 ++++++++++++++--- packages/bitcore-hardware/src/burner.ts | 5 ++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index f71b23128d..afc22c9b03 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -1,6 +1,8 @@ import bitcore from '@bitpay-labs/bitcore-lib'; import Burner from '../../src/burner.js'; +const { Transaction, PublicKey, crypto } = bitcore; + const burner = new Burner('btc'); burner.connect(); @@ -12,13 +14,22 @@ const utxo = { satoshis: 500 }; -const transaction = new bitcore.Transaction() +const transaction = new Transaction() .from(utxo) .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 150) .toString(); console.log('Tap burner wallet on an NFC reader to sign a transaction'); -console.log(await burner.sign({ index: 9, message: transaction, password: '123456' })); +const result: any = await burner.sign({ index: 9, message: transaction.toString(), password: '123456' }); + +console.log(result); +console.log('Signed transaction'); + +const sig = crypto.Signature.fromString(result.signature.der); +const digest = Buffer.from(result.input.digest, 'hex'); +const publicKey = new PublicKey(result.publicKey); + +const verify = crypto.ECDSA.verify(digest, sig, publicKey); +console.log(verify ? 'Verified signature' : 'Invalid signature'); -console.log('Signed transaction with burner wallet, exiting...'); process.exit(0); diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 4964654246..de3367efce 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -54,10 +54,13 @@ export default class Burner implements Base { async sign(params: SignParams) { const { index, message, password } = params; + this.response = undefined; + const digest = bitcore.crypto.Hash.sha256sha256(Buffer.from(message, 'hex')).toString('hex'); + this.command = { name: 'sign', - message, + digest, password, keyNo: index }; From 63fb4869b92dfd8dc768a253ae22dca2e11f81f4 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 20 Jul 2026 21:48:01 -0400 Subject: [PATCH 21/56] verify signature for burner --- .../bitcore-hardware/examples/burner/sign.ts | 31 ++++++++++++++----- packages/bitcore-hardware/src/burner.ts | 3 +- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index afc22c9b03..405ed4309d 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -1,35 +1,52 @@ import bitcore from '@bitpay-labs/bitcore-lib'; import Burner from '../../src/burner.js'; -const { Transaction, PublicKey, crypto } = bitcore; +const { Transaction, PublicKey, Script, crypto } = bitcore; const burner = new Burner('btc'); burner.connect(); +console.log('Tap burner for public key (used for the address and verifying the signature)'); +const publicKey = new PublicKey(await burner.getPublicKey({ index: 9 })); +const address = publicKey.toAddress(); + const utxo = { txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', outputIndex: 0, - address: '17XBj6iFEsf8kzDMGQk5ghZipxX49VXuaV', - script: '76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac', + address: address.toString(), + script: Script.buildWitnessV0Out(address), satoshis: 500 }; const transaction = new Transaction() .from(utxo) - .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 150) - .toString(); + .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 150); + +const scriptCode = transaction.inputs[0].getScriptCode(); +const satoshisBuffer = transaction.inputs[0].getSatoshisBuffer(); + +const hashbuf = Transaction.SighashWitness.sighash(transaction, crypto.Signature.SIGHASH_ALL, 0, scriptCode, satoshisBuffer); console.log('Tap burner wallet on an NFC reader to sign a transaction'); -const result: any = await burner.sign({ index: 9, message: transaction.toString(), password: '123456' }); +const result: any = await burner.sign({ index: 9, message: hashbuf.toString('hex'), password: '123456' }); console.log(result); console.log('Signed transaction'); const sig = crypto.Signature.fromString(result.signature.der); const digest = Buffer.from(result.input.digest, 'hex'); -const publicKey = new PublicKey(result.publicKey); const verify = crypto.ECDSA.verify(digest, sig, publicKey); console.log(verify ? 'Verified signature' : 'Invalid signature'); +const signature = { + signature: sig, + publicKey, + sigtype: crypto.Signature.SIGHASH_ALL, + inputIndex: 0 +}; + +transaction.applySignature(signature); + +console.log(transaction.toString()); process.exit(0); diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index de3367efce..82d4a1e9e5 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -53,10 +53,9 @@ export default class Burner implements Base { } async sign(params: SignParams) { - const { index, message, password } = params; + const { index, message: digest, password } = params; this.response = undefined; - const digest = bitcore.crypto.Hash.sha256sha256(Buffer.from(message, 'hex')).toString('hex'); this.command = { name: 'sign', From 250c1e2fc8fc4d0752c01975be87d6d9c6044e9b Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 20 Jul 2026 22:28:22 -0400 Subject: [PATCH 22/56] serialize burner transaction to check for errors --- packages/bitcore-hardware/examples/burner/sign.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index 405ed4309d..1fa2aedc3b 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -15,12 +15,12 @@ const utxo = { outputIndex: 0, address: address.toString(), script: Script.buildWitnessV0Out(address), - satoshis: 500 + satoshis: 1100 }; const transaction = new Transaction() .from(utxo) - .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 150); + .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 1000); const scriptCode = transaction.inputs[0].getScriptCode(); const satoshisBuffer = transaction.inputs[0].getSatoshisBuffer(); @@ -48,5 +48,5 @@ const signature = { transaction.applySignature(signature); -console.log(transaction.toString()); +console.log(transaction.serialize()); process.exit(0); From c8f4108ab827628f79791f39ad51c12390644905 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 23 Jul 2026 11:02:24 -0400 Subject: [PATCH 23/56] removed unused libraries from bitcore-hardware --- packages/bitcore-hardware/package-lock.json | 109 +------------------- packages/bitcore-hardware/package.json | 4 +- 2 files changed, 3 insertions(+), 110 deletions(-) diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index e83ee7d2cf..81878cc959 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -15,10 +15,8 @@ "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", "@ledgerhq/signer-utils": "^1.3.0", - "bip32": "^5.0.1", "nfc-pcsc": "^0.8.1", - "rxjs": "^7.8.2", - "tiny-secp256k1": "^2.2.4" + "rxjs": "^7.8.2" }, "devDependencies": { "@types/chai": "5.2.3", @@ -296,15 +294,6 @@ "nan": "^2.14.0" } }, - "node_modules/@scure/base": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", - "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@sentry/hub": { "version": "6.19.7", "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", @@ -872,22 +861,6 @@ "node": ">=8.0.0" } }, - "node_modules/bip32": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-5.0.1.tgz", - "integrity": "sha512-PWlHIAgYCfVhwqNpZyeakHXuLAGyN6rEQZnhxHxKI3BoFJRVWLl26455fhRlHsmbYcV986HqtPnt33Edu5sTCw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.2.0", - "@scure/base": "^1.1.1", - "uint8array-tools": "^0.0.8", - "valibot": "^1.2.0", - "wif": "^5.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/bitcoinjs-lib": { "version": "6.1.7", "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.7.tgz", @@ -2959,27 +2932,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/tiny-secp256k1": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-2.2.4.tgz", - "integrity": "sha512-FoDTcToPqZE454Q04hH9o2EhxWsm7pOSpicyHkgTwKhdKWdsTUuqfP5MLq3g+VjAtl2vSx6JpXGdwA2qpYkI0Q==", - "license": "MIT", - "dependencies": { - "uint8array-tools": "0.0.7" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tiny-secp256k1/node_modules/uint8array-tools": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/uint8array-tools/-/uint8array-tools-0.0.7.tgz", - "integrity": "sha512-vrrNZJiusLWoFWBqz5Y5KMCgP9W9hnjZHzZiZRT8oNAkq3d5Z5Oe76jAvVVSRh4U8GGR90N2X1dWtrhvx6L8UQ==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/to-buffer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", @@ -3031,7 +2983,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc" @@ -3062,15 +3014,6 @@ "@typescript/typescript-win32-x64": "7.0.2" } }, - "node_modules/uint8array-tools": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/uint8array-tools/-/uint8array-tools-0.0.8.tgz", - "integrity": "sha512-xS6+s8e0Xbx++5/0L+yyexukU7pz//Yg6IHg3BKhXotg1JcYtgxVcUctQ0HxLByiJzpAkNFawz1Nz5Xadzo82g==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -3096,20 +3039,6 @@ "uuid": "dist/esm/bin/uuid" } }, - "node_modules/valibot": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.2.tgz", - "integrity": "sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==", - "license": "MIT", - "peerDependencies": { - "typescript": ">=5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/varuint-bitcoin": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", @@ -3177,40 +3106,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wif": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/wif/-/wif-5.0.0.tgz", - "integrity": "sha512-iFzrC/9ne740qFbNjTZ2FciSRJlHIXoxqk/Y5EnE08QOXu1WjJyCCswwDTYbohAOEnlCtLaAAQBhyaLRFh2hMA==", - "license": "MIT", - "dependencies": { - "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/workerpool": { "version": "9.3.4", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 1935b5d9d3..23abc2ed25 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -36,10 +36,8 @@ "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", "@ledgerhq/signer-utils": "^1.3.0", - "bip32": "^5.0.1", "nfc-pcsc": "^0.8.1", - "rxjs": "^7.8.2", - "tiny-secp256k1": "^2.2.4" + "rxjs": "^7.8.2" }, "devDependencies": { "@types/chai": "5.2.3", From 8a11c79db30eba3015be2966317ac8ae0b84b0b8 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 23 Jul 2026 11:18:51 -0400 Subject: [PATCH 24/56] import bitcore-lib properly in bitcore-hardware --- packages/bitcore-hardware/examples/ledger/sign.ts | 7 +++---- packages/bitcore-hardware/src/burner.ts | 1 + packages/bitcore-hardware/src/ledger.ts | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/bitcore-hardware/examples/ledger/sign.ts b/packages/bitcore-hardware/examples/ledger/sign.ts index 04b3bac2e9..951ac30ec3 100644 --- a/packages/bitcore-hardware/examples/ledger/sign.ts +++ b/packages/bitcore-hardware/examples/ledger/sign.ts @@ -1,8 +1,7 @@ -import { createRequire } from 'module'; +import bitcore from '@bitpay-labs/bitcore-lib'; import Ledger from '../../src/ledger.js'; -// @eslint disable import/newline-after-import -const require = createRequire(import.meta.url); -const { Script, Transaction, HDPublicKey } = require('@bitpay-labs/bitcore-lib'); + +const { HDPublicKey, Script, Transaction } = bitcore; const ledger = new Ledger(); await ledger.connect(); diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 82d4a1e9e5..fabcee0435 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -5,6 +5,7 @@ import { Base } from './base.js'; import { DataType } from './types/burnerTypes.js'; import { BaseParams, SignParams } from './types/paramTypes.js'; + const { Address, PublicKey } = bitcore; /** diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index 9a3e311ff6..8d29b8e943 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -1,5 +1,5 @@ import { createRequire } from 'module'; -import Bitcore from '@bitpay-labs/bitcore-lib'; +import bitcore from '@bitpay-labs/bitcore-lib'; import { Psbt, payments } from 'bitcoinjs-lib'; import { Observable, @@ -19,8 +19,7 @@ const { SignerBtcBuilder } = require('@ledgerhq/device-signer-kit-bitcoin'); -const { HDPublicKey } = Bitcore; -type Transaction = Bitcore.Transaction; +const { HDPublicKey } = bitcore; export default class Ledger implements Base { device: any; @@ -97,7 +96,7 @@ export default class Ledger implements Base { return result.output.extendedPublicKey; } - async sign(tx: Transaction) { + async sign(tx: bitcore.Transaction) { const psbt = new Psbt(); const pubkey = new HDPublicKey(await this.getPublicKey({ index: 0 })).derive('m/0/0').publicKey.toBuffer(); From 9de1168181aa34d84dc9de9c6cf745f90f457c9e Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 23 Jul 2026 11:43:59 -0400 Subject: [PATCH 25/56] use crypto-wallet-core and take in transaction instead of hash for burner sign --- .../bitcore-hardware/examples/burner/sign.ts | 12 +- packages/bitcore-hardware/package-lock.json | 2436 +++++++++++++++-- packages/bitcore-hardware/package.json | 2 +- packages/bitcore-hardware/src/burner.ts | 14 +- packages/bitcore-hardware/src/ledger.ts | 6 +- .../bitcore-hardware/src/types/paramTypes.ts | 2 +- 6 files changed, 2290 insertions(+), 182 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index 1fa2aedc3b..2f2e3bd9c3 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -18,17 +18,13 @@ const utxo = { satoshis: 1100 }; -const transaction = new Transaction() +const tx = new Transaction() .from(utxo) .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 1000); -const scriptCode = transaction.inputs[0].getScriptCode(); -const satoshisBuffer = transaction.inputs[0].getSatoshisBuffer(); - -const hashbuf = Transaction.SighashWitness.sighash(transaction, crypto.Signature.SIGHASH_ALL, 0, scriptCode, satoshisBuffer); console.log('Tap burner wallet on an NFC reader to sign a transaction'); -const result: any = await burner.sign({ index: 9, message: hashbuf.toString('hex'), password: '123456' }); +const result: any = await burner.sign({ index: 9, tx, password: '123456' }); console.log(result); console.log('Signed transaction'); @@ -46,7 +42,7 @@ const signature = { inputIndex: 0 }; -transaction.applySignature(signature); +tx.applySignature(signature); -console.log(transaction.serialize()); +console.log(tx.serialize()); process.exit(0); diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index 81878cc959..c4435c1fc7 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@arx-research/libhalo": "^1.19.0", - "@bitpay-labs/bitcore-lib": "^11.5.1", + "@bitpay-labs/crypto-wallet-core": "^11.5.1", "@ledgerhq/device-management-kit": "^1.7.1", "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", @@ -64,12 +64,189 @@ "lodash": "^4.17.20" } }, + "node_modules/@bitpay-labs/bitcore-lib-cash": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-cash/-/bitcore-lib-cash-11.5.1.tgz", + "integrity": "sha512-iGmWYEPkUl/4kW2A0Vz1TWXnpCF1nODZD4pDUYWy4nIBx3i00h96Aose5kYIgbO7fkqd8sm/IqqxM0HaSuE3HA==", + "license": "MIT", + "dependencies": { + "bn.js": "=4.11.8", + "bs58": "^4.0.1", + "buffer-compare": "=1.1.1", + "elliptic": "^6.5.3", + "inherits": "=2.0.1", + "lodash": "^4.17.20" + } + }, + "node_modules/@bitpay-labs/bitcore-lib-cash/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "license": "ISC" + }, + "node_modules/@bitpay-labs/bitcore-lib-doge": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-doge/-/bitcore-lib-doge-11.5.1.tgz", + "integrity": "sha512-nletyOA0ztjjRrMduRhQ9oL7Ltl5HrnRt+jt4px0de/U//lAFqCx99L5Pkdt7/lQnx9GhkdWd3BmY+YaoVGyVw==", + "license": "MIT", + "dependencies": { + "bn.js": "=4.11.8", + "bs58": "^4.0.1", + "buffer-compare": "=1.1.1", + "elliptic": "^6.5.3", + "inherits": "=2.0.1", + "lodash": "^4.17.20", + "scryptsy": "2.1.0" + } + }, + "node_modules/@bitpay-labs/bitcore-lib-doge/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "license": "ISC" + }, + "node_modules/@bitpay-labs/bitcore-lib-ltc": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-ltc/-/bitcore-lib-ltc-11.5.1.tgz", + "integrity": "sha512-BHaAKFsJ+qIXOnbaQGYMxICdeOwJtwIla+h2JrzPT7xU0N0cPA5o3aRRdzdVJYeWD0zyp8sv/V+b3CzT2zsN3Q==", + "license": "MIT", + "dependencies": { + "bech32": "=2.0.0", + "bn.js": "=4.11.8", + "bs58": "^4.0.1", + "buffer-compare": "=1.1.1", + "elliptic": "^6.5.3", + "inherits": "=2.0.1", + "lodash": "^4.17.20", + "scryptsy": "2.1.0" + } + }, + "node_modules/@bitpay-labs/bitcore-lib-ltc/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "license": "ISC" + }, "node_modules/@bitpay-labs/bitcore-lib/node_modules/inherits": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", "license": "ISC" }, + "node_modules/@bitpay-labs/crypto-wallet-core": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/@bitpay-labs/crypto-wallet-core/-/crypto-wallet-core-11.5.1.tgz", + "integrity": "sha512-5VzX6xAR2O7k/Crf7Kf5wEOqTaGPzl6eU7K1nepSE+wT28O2VMWxjrckP8XoO8sbH0iXpApoi4nkFuSsQFFcqg==", + "license": "MIT", + "dependencies": { + "@bitpay-labs/bitcore-lib": "^11.5.1", + "@bitpay-labs/bitcore-lib-cash": "^11.5.1", + "@bitpay-labs/bitcore-lib-doge": "^11.5.1", + "@bitpay-labs/bitcore-lib-ltc": "^11.5.1", + "@solana-program/compute-budget": "0.7.0", + "@solana-program/memo": "0.7.0", + "@solana-program/system": "0.7.0", + "@solana-program/token": "0.5.1", + "@solana/kit": "2.1.0", + "ed25519-hd-key": "^1.3.0", + "ethers": "6.13.5", + "info": "0.0.6-beta.0", + "ripple-binary-codec": "^1.10.0", + "web3": "4.16.0", + "xrpl": "2.13.0" + } + }, + "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, + "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/ethers": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.5.tgz", + "integrity": "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@inversifyjs/common": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@inversifyjs/common/-/common-1.5.0.tgz", @@ -158,209 +335,989 @@ "rxjs": "7.8.2" } }, - "node_modules/@ledgerhq/device-signer-kit-bitcoin": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@ledgerhq/device-signer-kit-bitcoin/-/device-signer-kit-bitcoin-1.3.2.tgz", - "integrity": "sha512-LLkKGDiHRUwBHdotIQ6sB378gHEV79HMEXPCtcrvYeiuD3PyKInaVAsi3wYhlrWgFqvkf1Tq9REtmSR/Lw5s4g==", - "license": "Apache-2.0", - "dependencies": { - "@types/crypto-js": "^4.2.0", - "crypto-js": "^4.2.0", - "inversify": "7.5.1", - "purify-ts": "2.1.0", - "reflect-metadata": "0.2.2", - "xstate": "5.19.2" + "node_modules/@ledgerhq/device-signer-kit-bitcoin": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ledgerhq/device-signer-kit-bitcoin/-/device-signer-kit-bitcoin-1.3.2.tgz", + "integrity": "sha512-LLkKGDiHRUwBHdotIQ6sB378gHEV79HMEXPCtcrvYeiuD3PyKInaVAsi3wYhlrWgFqvkf1Tq9REtmSR/Lw5s4g==", + "license": "Apache-2.0", + "dependencies": { + "@types/crypto-js": "^4.2.0", + "crypto-js": "^4.2.0", + "inversify": "7.5.1", + "purify-ts": "2.1.0", + "reflect-metadata": "0.2.2", + "xstate": "5.19.2" + }, + "peerDependencies": { + "@ledgerhq/device-management-kit": "^1.7.0", + "bitcoinjs-lib": "^6.1.6" + } + }, + "node_modules/@ledgerhq/device-transport-kit-node-hid": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/device-transport-kit-node-hid/-/device-transport-kit-node-hid-1.0.1.tgz", + "integrity": "sha512-OALVGVP9eOBaHMqUDlGOrbpsygYawF4Eh/qq8zSEhfeECsxWpmYmKjgm0nJzhiTSIEa/U2inQVbGk2oY5HSHdQ==", + "license": "Apache-2.0", + "dependencies": { + "node-hid": "^3.2.0", + "purify-ts": "2.1.0", + "usb": "^2.16.0", + "uuid": "11.0.3" + }, + "peerDependencies": { + "@ledgerhq/device-management-kit": "^1.2.0", + "rxjs": "7.8.2" + } + }, + "node_modules/@ledgerhq/device-transport-kit-node-hid/node_modules/node-hid": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-hid/-/node-hid-3.3.0.tgz", + "integrity": "sha512-j+dFgJLRAE0nufQKXk3IfS6T6YuHhCgMvz4TrG0sgtb6DSCdYpfJ1etcdmeCmPQjUgO+yo32ktVrRliNs/+fmg==", + "hasInstallScript": true, + "license": "(MIT OR X11)", + "dependencies": { + "node-addon-api": "^3.2.1", + "pkg-prebuilds": "^1.0.0" + }, + "bin": { + "hid-showdevices": "src/show-devices.js" + }, + "engines": { + "node": ">=10.16" + } + }, + "node_modules/@ledgerhq/device-transport-kit-node-hid/node_modules/usb": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/usb/-/usb-2.18.0.tgz", + "integrity": "sha512-klAJPUTaSxRvTgrIh7om6UTrgRxdzioD+rJc/MaoiN8+OGdqRzai39tR00asnoCesPNikItWB9zBZoo0pJsWaA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@types/w3c-web-usb": "^1.0.6", + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.5.0" + }, + "engines": { + "node": ">=12.22.0 <13.0 || >=14.17.0" + } + }, + "node_modules/@ledgerhq/device-transport-kit-node-hid/node_modules/usb/node_modules/node-addon-api": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.0.tgz", + "integrity": "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/@ledgerhq/signer-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/signer-utils/-/signer-utils-1.3.0.tgz", + "integrity": "sha512-qe+HQMgZxq6SPv8ghvlq4c33RchUwlf1qE/qp7MtUGPbKGAqD/0PKNyzx05sKLpmA8m6YZdtndHH4CEkikzqSQ==", + "license": "Apache-2.0", + "dependencies": { + "semver": "7.7.2" + }, + "peerDependencies": { + "@ledgerhq/device-management-kit": "^1.7.1" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pokusew/pcsclite": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@pokusew/pcsclite/-/pcsclite-0.6.0.tgz", + "integrity": "sha512-jX7zRXM2Or5Pms1AFjNtawsXDjLiZOzOUo7Sf0put7Pnq/EKIR9g0KvTx62HtwdPpVP6hWHGydUTHgIi9PxodQ==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.14.0" + } + }, + "node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sentry/hub": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", + "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@sentry/minimal": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", + "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@sentry/types": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", + "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", + "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@solana-program/compute-budget": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@solana-program/compute-budget/-/compute-budget-0.7.0.tgz", + "integrity": "sha512-/JJSE1fKO5zx7Z55Z2tLGWBDDi7tUE+xMlK8qqkHlY51KpqksMsIBzQMkG9Dqhoe2Cnn5/t3QK1nJKqW6eHzpg==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0" + } + }, + "node_modules/@solana-program/memo": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@solana-program/memo/-/memo-0.7.0.tgz", + "integrity": "sha512-3T9iUjWSYtN/5S5jzJuasD2yQfVfFAQ9yTwIE25+P9peWqz4oarn6ZQvRj/FLcBqaMLtSqLhU1hN2cyVBS6hyg==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0" + } + }, + "node_modules/@solana-program/system": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@solana-program/system/-/system-0.7.0.tgz", + "integrity": "sha512-FKTBsKHpvHHNc1ATRm7SlC5nF/VdJtOSjldhcyfMN9R7xo712Mo2jHIzvBgn8zQO5Kg0DcWuKB7268Kv1ocicw==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0" + } + }, + "node_modules/@solana-program/token": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@solana-program/token/-/token-0.5.1.tgz", + "integrity": "sha512-bJvynW5q9SFuVOZ5vqGVkmaPGA0MCC+m9jgJj1nk5m20I389/ms69ASnhWGoOPNcie7S9OwBX0gTj2fiyWpfag==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0" + } + }, + "node_modules/@solana/accounts": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-2.1.0.tgz", + "integrity": "sha512-1JOBiLFeIeHmGx7k1b23UWF9vM1HAh9GBMCzr5rBPrGSBs+QUgxBJ3+yrRg+UPEOSELubqo7qoOVFUKYsb1nXw==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/rpc-spec": "2.1.0", + "@solana/rpc-types": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/addresses": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-2.1.0.tgz", + "integrity": "sha512-IgiRuju2yLz14GnrysOPSNZbZQ8F+7jhx7FYZLrbKogf6NX4wy4ijLHxRsLFqP8o8aY69BZULkM9MwrSjsZi7A==", + "license": "MIT", + "dependencies": { + "@solana/assertions": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/assertions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-2.1.0.tgz", + "integrity": "sha512-KCYmxFRsg897Ec7yGdpc0rniOlqGD3NpicmIjWIV87uiXX5uFco4t+01sKyFlhsv4T4OgHxngMsxkfQ3AUkFVg==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.1.0.tgz", + "integrity": "sha512-C0TnfrpbTg7zoIFYfM65ofeL2AWEz80OsD6mjVdcTKpb1Uj7XuBuNLss3dMnatPQaL7RagD9VLA5/WfYayyteQ==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/codecs-data-structures": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/options": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.1.0.tgz", + "integrity": "sha512-SR7pKtmJBg2mhmkel2NeHA1pz06QeQXdMv8WJoIR9m8F/hw80K/612uaYbwTt2nkK0jg/Qn/rNSd7EcJ4SBGjw==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-data-structures": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.1.0.tgz", + "integrity": "sha512-oDF5ek54kirqJ09q8k/qEpobBiWOhd3CkkGOTyfjsmTF/IGIigNbdYIakxV3+vudBeaNBw08y0XdBYI4JL/nqA==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-numbers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.1.0.tgz", + "integrity": "sha512-XMu4yw5iCgQnMKsxSWPPOrGgtaohmupN3eyAtYv3K3C/MJEc5V90h74k5B1GUCiHvcrdUDO9RclNjD9lgbjFag==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-strings": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.1.0.tgz", + "integrity": "sha512-O/eJFLzFrHomcCR1Y5QbIqoPo7iaJaWNnIeskB4mVhVjLyjlJS4WtBP2NBRzM9uJXaXyOxxKroqqO9zFsHOpvQ==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5" + } + }, + "node_modules/@solana/errors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.1.0.tgz", + "integrity": "sha512-l+GxAv0Ar4d3c3PlZdA9G++wFYZREEbbRyAFP8+n8HSg0vudCuzogh/13io6hYuUhG/9Ve8ARZNamhV7UScKNw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "commander": "^13.1.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/errors/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@solana/fast-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-2.1.0.tgz", + "integrity": "sha512-a8vR92qbe/VsvQ1BpN3PIEwnoHD2fTHEwCJh9GG58z3R15RIjk73gc0khjcdg4U1tZwTJqWkvk8SbDIgGdOgMA==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/functional": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-2.1.0.tgz", + "integrity": "sha512-RVij8Av4F2uUOFcEC8n9lgD72e9gQMritmGHhMh+G91Xops4I6Few+oQ++XgSTiL2t3g3Cs0QZ13onZ0FL45FQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/instructions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-2.1.0.tgz", + "integrity": "sha512-wfn6e7Rgm0Sw/Th1v/pXsKTvloZvAAQI7j1yc9WcIk9ngqH5p6LhqMMkrwYPB2oTk8+MMr7SZ4E+2eK2gL6ODA==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-2.1.0.tgz", + "integrity": "sha512-esY1+dlZjB18hZML5p+YPec29wi3HH0SzKx7RiqF//dI2cJ6vHfq3F+7ArbNnF6R2YCLFtl7DzS/tkqR2Xkxeg==", + "license": "MIT", + "dependencies": { + "@solana/assertions": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/kit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-2.1.0.tgz", + "integrity": "sha512-vqaHROLKp89xdIbaKVG6BQ44uMN9E6/rSTeltkvquD2qdTObssafGDbAKVFjwZhlNO+sdzHDCLekGabn5VAL6A==", + "license": "MIT", + "dependencies": { + "@solana/accounts": "2.1.0", + "@solana/addresses": "2.1.0", + "@solana/codecs": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/instructions": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/programs": "2.1.0", + "@solana/rpc": "2.1.0", + "@solana/rpc-parsed-types": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "@solana/rpc-subscriptions": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/signers": "2.1.0", + "@solana/sysvars": "2.1.0", + "@solana/transaction-confirmation": "2.1.0", + "@solana/transaction-messages": "2.1.0", + "@solana/transactions": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/options": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.1.0.tgz", + "integrity": "sha512-T/vJCr8qnwK6HxriOPXCrx31IpA9ZYecxuOzQ3G74kIayED4spmpXp6PLtRYR/fo2LZ6UcgHN0qSgONnvwEweg==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/codecs-data-structures": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/programs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-2.1.0.tgz", + "integrity": "sha512-9Y30/yUbTR99+QRN2ukNXQQTGY68oKmVrXnh/et6StM1JF5WHvAJqBigsHG5bt6KxTISoRuncBnH/IRnDqPxKg==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/promises": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-2.1.0.tgz", + "integrity": "sha512-eQJaQXA2kD4dVyifzhslV3wOvq27fwOJ4az89BQ4Cz83zPbR94xOeDShwcXrKBYqaUf6XqH5MzdEo14t4tKAFQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-2.1.0.tgz", + "integrity": "sha512-myg9qAo6b2WKyHSMXURQykb+ZRnNEXBPLEcwRwkos8STzPPyRFg6ady2s0FCQQTtL/pVjanIU2bObZIzbMGugA==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0", + "@solana/fast-stable-stringify": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/rpc-api": "2.1.0", + "@solana/rpc-spec": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "@solana/rpc-transformers": "2.1.0", + "@solana/rpc-transport-http": "2.1.0", + "@solana/rpc-types": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-api": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-2.1.0.tgz", + "integrity": "sha512-4yCnHYHFlz9VffivoY5q/HVeBjT59byB2gmg7UyC3ktxD28AlF9jjsE5tJKiapAKr2J3KWm0D/rH/QwW14cGeA==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/rpc-parsed-types": "2.1.0", + "@solana/rpc-spec": "2.1.0", + "@solana/rpc-transformers": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/transaction-messages": "2.1.0", + "@solana/transactions": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-parsed-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-2.1.0.tgz", + "integrity": "sha512-mRzHemxlWDS9p1fPQNKwL+1vEOUMG8peSUJb0X/NbM12yjowDNdzM++fkOgIyCKDPddfkcoNmNrQmr2jwjdN1Q==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-2.1.0.tgz", + "integrity": "sha512-NPAIM5EY7Jke0mHnmoMpgCEb/nZKIo+bgVFK/u+z74gY0JnCNt0DfocStUUQtlhqSmTyoHamt3lfxp4GT2zXbA==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0", + "@solana/rpc-spec-types": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-spec-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-2.1.0.tgz", + "integrity": "sha512-NxcZ8piXMyCdbNUL6d36QJfL2UAQEN33StlGku0ltTVe1nrokZ5WRNjSPohU1fODlNaZzTvUFzvUkM1yGCkyzw==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "@ledgerhq/device-management-kit": "^1.7.0", - "bitcoinjs-lib": "^6.1.6" + "typescript": ">=5" } }, - "node_modules/@ledgerhq/device-transport-kit-node-hid": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@ledgerhq/device-transport-kit-node-hid/-/device-transport-kit-node-hid-1.0.1.tgz", - "integrity": "sha512-OALVGVP9eOBaHMqUDlGOrbpsygYawF4Eh/qq8zSEhfeECsxWpmYmKjgm0nJzhiTSIEa/U2inQVbGk2oY5HSHdQ==", - "license": "Apache-2.0", + "node_modules/@solana/rpc-subscriptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-2.1.0.tgz", + "integrity": "sha512-dTyI03VlueE3s7mA/OBlA5l6yKUUKHMJd31tpzxV3AFnqE/QPS5NVrF/WY6pPBobLJiCP0UFOe7eR/MKP9SUCA==", + "license": "MIT", "dependencies": { - "node-hid": "^3.2.0", - "purify-ts": "2.1.0", - "usb": "^2.16.0", - "uuid": "11.0.3" + "@solana/errors": "2.1.0", + "@solana/fast-stable-stringify": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/promises": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "@solana/rpc-subscriptions-api": "2.1.0", + "@solana/rpc-subscriptions-channel-websocket": "2.1.0", + "@solana/rpc-subscriptions-spec": "2.1.0", + "@solana/rpc-transformers": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/subscribable": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "@ledgerhq/device-management-kit": "^1.2.0", - "rxjs": "7.8.2" + "typescript": ">=5" } }, - "node_modules/@ledgerhq/device-transport-kit-node-hid/node_modules/node-hid": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-hid/-/node-hid-3.3.0.tgz", - "integrity": "sha512-j+dFgJLRAE0nufQKXk3IfS6T6YuHhCgMvz4TrG0sgtb6DSCdYpfJ1etcdmeCmPQjUgO+yo32ktVrRliNs/+fmg==", - "hasInstallScript": true, - "license": "(MIT OR X11)", + "node_modules/@solana/rpc-subscriptions-api": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-2.1.0.tgz", + "integrity": "sha512-de1dBRSE2CUwoZHMXQ/0v7iC+/pG0+iYY8jLHGGNxtKrYbTnV08mXQbaAMrmv2Rk8ZFmfJWbqbYZ9dRWdO3P5g==", + "license": "MIT", "dependencies": { - "node-addon-api": "^3.2.1", - "pkg-prebuilds": "^1.0.0" - }, - "bin": { - "hid-showdevices": "src/show-devices.js" + "@solana/addresses": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/rpc-subscriptions-spec": "2.1.0", + "@solana/rpc-transformers": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/transaction-messages": "2.1.0", + "@solana/transactions": "2.1.0" }, "engines": { - "node": ">=10.16" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@ledgerhq/device-transport-kit-node-hid/node_modules/usb": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/usb/-/usb-2.18.0.tgz", - "integrity": "sha512-klAJPUTaSxRvTgrIh7om6UTrgRxdzioD+rJc/MaoiN8+OGdqRzai39tR00asnoCesPNikItWB9zBZoo0pJsWaA==", - "hasInstallScript": true, + "node_modules/@solana/rpc-subscriptions-channel-websocket": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-2.1.0.tgz", + "integrity": "sha512-goJe9dv0cs967HJ382vSX8yapXgQzRHCmH323LsXrrpj/s3Eb3yUwJq7AcHgoh4gKIqyAfGybq/bE5Aa8Pcm9g==", "license": "MIT", "dependencies": { - "@types/w3c-web-usb": "^1.0.6", - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.5.0" + "@solana/errors": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/rpc-subscriptions-spec": "2.1.0", + "@solana/subscribable": "2.1.0" }, "engines": { - "node": ">=12.22.0 <13.0 || >=14.17.0" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5", + "ws": "^8.18.0" } }, - "node_modules/@ledgerhq/device-transport-kit-node-hid/node_modules/usb/node_modules/node-addon-api": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.0.tgz", - "integrity": "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==", + "node_modules/@solana/rpc-subscriptions-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-2.1.0.tgz", + "integrity": "sha512-Uqasfd3Tlr22lC/Vy5dToF0e68dMKPdnt4ks7FwXuPdEbNRM/TDGb0GqG+bt/d3IIrNOCA5Y8vsE0nQHGrWG/w==", "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0", + "@solana/promises": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "@solana/subscribable": "2.1.0" + }, "engines": { - "node": "^18 || ^20 || >= 21" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@ledgerhq/signer-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/signer-utils/-/signer-utils-1.3.0.tgz", - "integrity": "sha512-qe+HQMgZxq6SPv8ghvlq4c33RchUwlf1qE/qp7MtUGPbKGAqD/0PKNyzx05sKLpmA8m6YZdtndHH4CEkikzqSQ==", - "license": "Apache-2.0", + "node_modules/@solana/rpc-transformers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-2.1.0.tgz", + "integrity": "sha512-E2xPlaCu6tNO00v4HIJxJCYkoNwgVJYad5sxbIUZOQBWwXnWIcll2jUT4bWKpBGq5vFDYfkzRBr8Rco3DhfXqg==", + "license": "MIT", "dependencies": { - "semver": "7.7.2" + "@solana/errors": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "@solana/rpc-types": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "@ledgerhq/device-management-kit": "^1.7.1" + "typescript": ">=5" } }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "node_modules/@solana/rpc-transport-http": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-2.1.0.tgz", + "integrity": "sha512-E3UovTBid4/S8QDd9FkADVKfyG+v7CW5IqI4c27ZDKfazCsnDLLkqh98C6BvNCqi278HKBui4lI2GoFpCq89Pw==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.8.0" + "@solana/errors": "2.1.0", + "@solana/rpc-spec": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "undici-types": "^7.3.0" }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=20.18.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "node_modules/@solana/rpc-transport-http/node_modules/undici-types": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.28.0.tgz", + "integrity": "sha512-LJAfY+2w6HGeT8d8J1wNQsUGUEGio6NWWpwdwurQe4f6oojzCFuGLizl1KSve4irsTxyLly1QhEeE6iapdaIvQ==", + "license": "MIT" + }, + "node_modules/@solana/rpc-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-2.1.0.tgz", + "integrity": "sha512-1ODnhmpR1X/GjB7hs4gVR3mcCagfPQV0dzq/2DNuCiMjx2snn64KP5WoAHfBEyoC9/Rb36+JpNj/hLAOikipKA==", "license": "MIT", + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0" + }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=20.18.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, + "node_modules/@solana/signers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-2.1.0.tgz", + "integrity": "sha512-Yq0JdJnCecRsSBshNWy+OIRmAGeVfjwIh9Z+H1jv8u8p+dJCOreKakTWuxMt5tnj3q5K1mPcak9O2PqVPZ0teA==", "license": "MIT", - "optional": true, + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/instructions": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/transaction-messages": "2.1.0", + "@solana/transactions": "2.1.0" + }, "engines": { - "node": ">=14" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@pokusew/pcsclite": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@pokusew/pcsclite/-/pcsclite-0.6.0.tgz", - "integrity": "sha512-jX7zRXM2Or5Pms1AFjNtawsXDjLiZOzOUo7Sf0put7Pnq/EKIR9g0KvTx62HtwdPpVP6hWHGydUTHgIi9PxodQ==", - "hasInstallScript": true, - "license": "ISC", + "node_modules/@solana/subscribable": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-2.1.0.tgz", + "integrity": "sha512-xi12Cm889+uT5sRKnIzr7nLnHAp3hiR3dqIzrT1P7z7iEGp8OnqUQIQCHlgozFHM2cPW+6685NQXk1l1ImuJIw==", + "license": "MIT", "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.14.0" + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@sentry/hub": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", - "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", - "license": "BSD-3-Clause", + "node_modules/@solana/sysvars": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-2.1.0.tgz", + "integrity": "sha512-GXu9yS0zIebmM1Unqw/XFpYuvug03m42w98ioOPV/yiHzECggGRGpHGD9RLVYnkyz0eL4NRbnJ5dAEu/fvGe0A==", + "license": "MIT", "dependencies": { - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" + "@solana/accounts": "2.1.0", + "@solana/codecs": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/rpc-types": "2.1.0" }, "engines": { - "node": ">=6" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@sentry/hub/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@sentry/minimal": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", - "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", - "license": "BSD-3-Clause", + "node_modules/@solana/transaction-confirmation": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-2.1.0.tgz", + "integrity": "sha512-VxOvtvs2e9h5u73PHyE2TptLAMO5x6dOXlOgvq1Nk6l3rKM2HAsd+KDpN7gjOo8/EgItMMmyEilXygWWRgpSIA==", + "license": "MIT", "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" + "@solana/addresses": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/promises": "2.1.0", + "@solana/rpc": "2.1.0", + "@solana/rpc-subscriptions": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/transaction-messages": "2.1.0", + "@solana/transactions": "2.1.0" }, "engines": { - "node": ">=6" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@sentry/types": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", - "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", - "license": "BSD-3-Clause", + "node_modules/@solana/transaction-messages": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-2.1.0.tgz", + "integrity": "sha512-+GPzZHLYNFbqHKoiL8mYALp7eAXtAbI6zLViZpIM3zUbVNU3q5+FCKGv6jCBnxs+3QCbeapu+W1OyfDa6BUtTQ==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-data-structures": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/instructions": "2.1.0", + "@solana/rpc-types": "2.1.0" + }, "engines": { - "node": ">=6" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@sentry/utils": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", - "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", - "license": "BSD-3-Clause", + "node_modules/@solana/transactions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-2.1.0.tgz", + "integrity": "sha512-QeM4sCItReeIy5LU7LhGkz7RPfMPTg/Qo8h0LSfhiJiPTOHOhElmh42vkLJmwPl83+MsKtisyPQNK6penM2nAw==", + "license": "MIT", "dependencies": { - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-data-structures": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/instructions": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/transaction-messages": "2.1.0" }, "engines": { - "node": ">=6" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "node_modules/@types/brorand": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/@types/brorand/-/brorand-1.0.33.tgz", + "integrity": "sha512-KmNsWYtzKXpmxjecvYWUEGK5biJB/1kpHRObHZD8eme1tz/TvbESbZeNAHPRNd5qyCJiHk2ztbNzKbPC6TuPFg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/chai": { "version": "5.2.3", @@ -414,6 +1371,15 @@ "integrity": "sha512-Qu3Nn6JFuF4+sHKYl+IcX9vYiI40ogleXzFFSxoE1W94rG98o/kXs8uJ0QSfFzuwBCZWlGfUGpPkgwuuX4PchA==", "license": "MIT" }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript/typescript-aix-ppc64": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", @@ -421,7 +1387,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -438,7 +1403,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -455,7 +1419,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -472,7 +1435,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -489,7 +1451,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -506,7 +1467,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -523,7 +1483,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -540,7 +1499,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -557,7 +1515,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -574,7 +1531,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -591,7 +1547,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -608,7 +1563,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -625,7 +1579,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -642,7 +1595,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -659,7 +1611,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -676,7 +1627,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -693,7 +1643,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -710,7 +1659,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -727,7 +1675,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -744,7 +1691,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -754,12 +1700,71 @@ "node": ">=16.20.0" } }, + "node_modules/@xrplf/isomorphic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.2.tgz", + "integrity": "sha512-ncZUdMXr6VlSXtdoiDi0jTH+gBrgGxwVeEidhoegII3PmyErbQsyj6e+j7acmR4LW/lvBkPkzb9QzRfJH0n3rA==", + "license": "ISC", + "dependencies": { + "@noble/hashes": "^2.0.1", + "eventemitter3": "5.0.1", + "ws": "^8.20.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@xrplf/isomorphic/node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@xrplf/isomorphic/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/abitype": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.7.1.tgz", + "integrity": "sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=4.9.4", + "zod": "^3 >=3.19.1" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, "node_modules/aes-js": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "license": "MIT" }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -795,6 +1800,19 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -836,12 +1854,50 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/bech32": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", "license": "MIT" }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -861,6 +1917,50 @@ "node": ">=8.0.0" } }, + "node_modules/bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "license": "MIT", + "dependencies": { + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.3", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bip32/node_modules/@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", + "license": "MIT" + }, + "node_modules/bip32/node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "license": "MIT", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "license": "ISC", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, "node_modules/bitcoinjs-lib": { "version": "6.1.7", "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.7.tgz", @@ -945,6 +2045,30 @@ "base-x": "^4.0.0" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-compare": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz", @@ -1182,12 +2306,33 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -1215,6 +2360,15 @@ "sha.js": "^2.4.8" } }, + "node_modules/cross-fetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1240,7 +2394,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1267,6 +2420,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, "node_modules/decode-uri-component": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", @@ -1293,6 +2452,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -1330,6 +2506,16 @@ "dev": true, "license": "MIT" }, + "node_modules/ed25519-hd-key": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ed25519-hd-key/-/ed25519-hd-key-1.3.0.tgz", + "integrity": "sha512-IWwAyiiuJQhgu3L8NaHb68eJxTu2pgCwxIBdgpLJdKpYZM46+AXePSVTr7fkNKaUOfOL4IrjEUaQvyVRIDP7fg==", + "license": "MIT", + "dependencies": { + "create-hmac": "1.1.7", + "tweetnacl": "1.0.3" + } + }, "node_modules/elliptic": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", @@ -1411,6 +2597,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ethers": { "version": "6.17.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.17.0.tgz", @@ -1463,6 +2685,19 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/fastestsmallesttextencoderdecoder": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", + "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", + "license": "CC0-1.0", + "peer": true + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -1549,6 +2784,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1736,6 +2980,53 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/info": { + "version": "0.0.6-beta.0", + "resolved": "https://registry.npmjs.org/info/-/info-0.0.6-beta.0.tgz", + "integrity": "sha512-pm7sdQ6y6iP6ATfDUA7xGJtSvKDFlD1STRBu+3E2qbsRKRQpvkqf7UIfcVm0LpQsG1lrzJuBBkGD8TeoTjLPuQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "ISC", + "dependencies": { + "zen-observable": "^0.8.14" + }, + "peerDependencies": { + "react": "16.8", + "react-dom": "16.8" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1756,6 +3047,22 @@ "reflect-metadata": "~0.2.2" } }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -1777,6 +3084,41 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -1797,6 +3139,24 @@ "node": ">=8" } }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", @@ -1878,6 +3238,13 @@ "integrity": "sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg==", "license": "MIT" }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT", + "peer": true + }, "node_modules/js-yaml": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", @@ -1940,6 +3307,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -2046,7 +3426,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nan": { @@ -2070,6 +3449,26 @@ "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "license": "MIT" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-gyp-build": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", @@ -2081,6 +3480,61 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -2244,6 +3698,18 @@ "node": ">=10" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/purify-ts": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/purify-ts/-/purify-ts-2.1.0.tgz", @@ -2474,6 +3940,45 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", + "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", + "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.6" + }, + "peerDependencies": { + "react": "^16.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT", + "peer": true + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -2543,6 +4048,58 @@ "node": ">= 0.8" } }, + "node_modules/ripple-address-codec": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.1.tgz", + "integrity": "sha512-Qa3+9wKVvpL/xYtT6+wANsn0A1QcC5CT6IMZbRJZ/1lGt7gmwIfsrCuz1X0+LCEO7zgb+3UT1I1dc0k/5dwKQQ==", + "license": "ISC", + "dependencies": { + "base-x": "^3.0.9", + "create-hash": "^1.1.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-binary-codec": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-1.11.0.tgz", + "integrity": "sha512-g7+gs3T+NfoeW6vIq5dcN0CkIT4t/zwRzFxz8X2RzfbrWRnewPUKqQbmBgs05tXLX5NuWPaneiaAVpFpYBcdfw==", + "license": "ISC", + "dependencies": { + "assert": "^2.0.0", + "big-integer": "^1.6.48", + "buffer": "6.0.3", + "create-hash": "^1.2.0", + "decimal.js": "^10.2.0", + "ripple-address-codec": "^4.3.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-keypairs": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.1.tgz", + "integrity": "sha512-dmPlraWKJciFJxHcoubDahGnoIalG5e/BtV6HNDUs7wLXmtnLMHt6w4ed9R8MTL2zNrVPiIdI/HCtMMo0Tm7JQ==", + "license": "ISC", + "dependencies": { + "bn.js": "^5.1.1", + "brorand": "^1.0.5", + "elliptic": "^6.5.4", + "hash.js": "^1.0.3", + "ripple-address-codec": "^4.3.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-keypairs/node_modules/bn.js": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", + "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", + "license": "MIT" + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -2572,6 +4129,40 @@ ], "license": "MIT" }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", + "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/scryptsy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", + "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==", + "license": "MIT" + }, "node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -2617,6 +4208,12 @@ "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, "node_modules/sha.js": { "version": "2.4.12", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", @@ -2932,6 +4529,23 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/tiny-secp256k1": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.7.tgz", + "integrity": "sha512-eb+F6NabSnjbLwNoC+2o5ItbmP1kg7HliWue71JgLegQt6A5mTN8YbvTLCazdlg6e5SV6A+r8OGvZYskdlmhqQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/to-buffer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", @@ -2952,12 +4566,24 @@ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "license": "Unlicense" + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -2976,14 +4602,12 @@ "version": "1.18.0", "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/typescript": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc" @@ -3020,6 +4644,19 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3049,6 +4686,366 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/web3": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-4.16.0.tgz", + "integrity": "sha512-SgoMSBo6EsJ5GFCGar2E/pR2lcR/xmUSuQ61iK6yDqzxmm42aPPxSqZfJz2z/UCR6pk03u77pU8TGV6lgMDdIQ==", + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "^4.7.1", + "web3-errors": "^1.3.1", + "web3-eth": "^4.11.1", + "web3-eth-abi": "^4.4.1", + "web3-eth-accounts": "^4.3.1", + "web3-eth-contract": "^4.7.2", + "web3-eth-ens": "^4.4.0", + "web3-eth-iban": "^4.0.7", + "web3-eth-personal": "^4.1.0", + "web3-net": "^4.1.0", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-rpc-methods": "^1.3.0", + "web3-rpc-providers": "^1.0.0-rc.4", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-4.7.1.tgz", + "integrity": "sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==", + "license": "LGPL-3.0", + "dependencies": { + "web3-errors": "^1.3.1", + "web3-eth-accounts": "^4.3.1", + "web3-eth-iban": "^4.0.7", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "optionalDependencies": { + "web3-providers-ipc": "^4.0.7" + } + }, + "node_modules/web3-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.3.1.tgz", + "integrity": "sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==", + "license": "LGPL-3.0", + "dependencies": { + "web3-types": "^1.10.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-4.11.1.tgz", + "integrity": "sha512-q9zOkzHnbLv44mwgLjLXuyqszHuUgZWsQayD2i/rus2uk0G7hMn11bE2Q3hOVnJS4ws4VCtUznlMxwKQ+38V2w==", + "license": "LGPL-3.0", + "dependencies": { + "setimmediate": "^1.0.5", + "web3-core": "^4.7.1", + "web3-errors": "^1.3.1", + "web3-eth-abi": "^4.4.1", + "web3-eth-accounts": "^4.3.1", + "web3-net": "^4.1.0", + "web3-providers-ws": "^4.0.8", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-abi": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-4.4.1.tgz", + "integrity": "sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==", + "license": "LGPL-3.0", + "dependencies": { + "abitype": "0.7.1", + "web3-errors": "^1.3.1", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-accounts": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-4.3.1.tgz", + "integrity": "sha512-rTXf+H9OKze6lxi7WMMOF1/2cZvJb2AOnbNQxPhBDssKOllAMzLhg1FbZ4Mf3lWecWfN6luWgRhaeSqO1l+IBQ==", + "license": "LGPL-3.0", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "crc-32": "^1.2.2", + "ethereum-cryptography": "^2.0.0", + "web3-errors": "^1.3.1", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-contract": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-4.7.2.tgz", + "integrity": "sha512-3ETqs2pMNPEAc7BVY/C3voOhTUeJdkf2aM3X1v+edbngJLHAxbvxKpOqrcO0cjXzC4uc2Q8Zpf8n8zT5r0eLnA==", + "license": "LGPL-3.0", + "dependencies": { + "@ethereumjs/rlp": "^5.0.2", + "web3-core": "^4.7.1", + "web3-errors": "^1.3.1", + "web3-eth": "^4.11.1", + "web3-eth-abi": "^4.4.1", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-contract/node_modules/@ethereumjs/rlp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", + "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/web3-eth-ens": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-4.4.0.tgz", + "integrity": "sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==", + "license": "LGPL-3.0", + "dependencies": { + "@adraffy/ens-normalize": "^1.8.8", + "web3-core": "^4.5.0", + "web3-errors": "^1.2.0", + "web3-eth": "^4.8.0", + "web3-eth-contract": "^4.5.0", + "web3-net": "^4.1.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-iban": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-4.0.7.tgz", + "integrity": "sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==", + "license": "LGPL-3.0", + "dependencies": { + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7", + "web3-validator": "^2.0.3" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-personal": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-4.1.0.tgz", + "integrity": "sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==", + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "^4.6.0", + "web3-eth": "^4.9.0", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.8.0", + "web3-utils": "^4.3.1", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-net": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-4.1.0.tgz", + "integrity": "sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==", + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "^4.4.0", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.6.0", + "web3-utils": "^4.3.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-http": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-4.2.0.tgz", + "integrity": "sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==", + "license": "LGPL-3.0", + "dependencies": { + "cross-fetch": "^4.0.0", + "web3-errors": "^1.3.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.1" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-ipc": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-4.0.7.tgz", + "integrity": "sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==", + "license": "LGPL-3.0", + "optional": true, + "dependencies": { + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-ws": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-4.0.8.tgz", + "integrity": "sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==", + "license": "LGPL-3.0", + "dependencies": { + "@types/ws": "8.5.3", + "isomorphic-ws": "^5.0.0", + "web3-errors": "^1.2.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.1", + "ws": "^8.17.1" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-rpc-methods": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.3.0.tgz", + "integrity": "sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==", + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "^4.4.0", + "web3-types": "^1.6.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-rpc-providers": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/web3-rpc-providers/-/web3-rpc-providers-1.0.0-rc.4.tgz", + "integrity": "sha512-PXosCqHW0EADrYzgmueNHP3Y5jcSmSwH+Dkqvn7EYD0T2jcsdDAIHqk6szBiwIdhumM7gv9Raprsu/s/f7h1fw==", + "license": "LGPL-3.0", + "dependencies": { + "web3-errors": "^1.3.1", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-types": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.10.0.tgz", + "integrity": "sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.3.3.tgz", + "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", + "license": "LGPL-3.0", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "eventemitter3": "^5.0.1", + "web3-errors": "^1.3.1", + "web3-types": "^1.10.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-2.0.6.tgz", + "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", + "license": "LGPL-3.0", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "util": "^0.12.5", + "web3-errors": "^1.2.0", + "web3-types": "^1.6.0", + "zod": "^3.21.4" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, "node_modules/websocket-as-promised": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/websocket-as-promised/-/websocket-as-promised-3.0.1.tgz", @@ -3063,6 +5060,16 @@ "node": ">=10" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3106,6 +5113,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", + "license": "MIT", + "dependencies": { + "bs58check": "<3.0.0" + } + }, + "node_modules/wif/node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "license": "MIT", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, "node_modules/workerpool": { "version": "9.3.4", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", @@ -3229,6 +5256,74 @@ } } }, + "node_modules/xrpl": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-2.13.0.tgz", + "integrity": "sha512-jIu9PuG3g+2NZQT8oGmOL3LFkH6Pp+OHS1FNbozEJkajuHAuoCEe2vVddjD8ME81kgV+xRFnXJ+EUbmQDdh/Xg==", + "license": "ISC", + "dependencies": { + "bignumber.js": "^9.0.0", + "bip32": "^2.0.6", + "bip39": "^3.0.4", + "https-proxy-agent": "^5.0.0", + "lodash": "^4.17.4", + "ripple-address-codec": "^4.3.1", + "ripple-binary-codec": "^1.10.0", + "ripple-keypairs": "^1.3.1", + "ws": "^8.2.2", + "xrpl-secret-numbers": "^0.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/xrpl-secret-numbers": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/xrpl-secret-numbers/-/xrpl-secret-numbers-0.3.5.tgz", + "integrity": "sha512-5W2Ijp4nFpplEJ4IEK8JNAnRN9+3/+8BdBQ0hOZ3bZfa/+K9c9GNdN5fHDkKoECJN3nzXNcj6/Ejg7wUQDtRnQ==", + "license": "MIT", + "dependencies": { + "@types/brorand": "^1.0.30", + "brorand": "^1.1.0", + "ripple-keypairs": "^2.0.0" + } + }, + "node_modules/xrpl-secret-numbers/node_modules/@scure/base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.2.0.tgz", + "integrity": "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/xrpl-secret-numbers/node_modules/ripple-address-codec": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-5.0.1.tgz", + "integrity": "sha512-JQHLKuVJV8lv9Qobmn4aUM2Dpv9WRRLKnNWfM8tN02fAbUtG8mUPsu9q9UYX8P76G4qzytEc5ZKMp/3JggNYmw==", + "license": "ISC", + "dependencies": { + "@scure/base": "^2.0.0", + "@xrplf/isomorphic": "^1.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/xrpl-secret-numbers/node_modules/ripple-keypairs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz", + "integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==", + "license": "ISC", + "dependencies": { + "@noble/curves": "^1.0.0", + "@xrplf/isomorphic": "^1.0.0", + "ripple-address-codec": "^5.0.0" + }, + "engines": { + "node": ">= 16" + } + }, "node_modules/xstate": { "version": "5.19.2", "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.19.2.tgz", @@ -3351,6 +5446,21 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", + "license": "MIT" + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 23abc2ed25..8a566efc33 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -31,7 +31,7 @@ "license": "MIT", "dependencies": { "@arx-research/libhalo": "^1.19.0", - "@bitpay-labs/bitcore-lib": "^11.5.1", + "@bitpay-labs/crypto-wallet-core": "^11.5.1", "@ledgerhq/device-management-kit": "^1.7.1", "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index fabcee0435..4e9801ab4a 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -1,12 +1,13 @@ import { execHaloCmdPCSC } from '@arx-research/libhalo/api/desktop'; -import bitcore from '@bitpay-labs/bitcore-lib'; +import CWC from '@bitpay-labs/crypto-wallet-core'; import { NFC } from 'nfc-pcsc'; import { Base } from './base.js'; import { DataType } from './types/burnerTypes.js'; import { BaseParams, SignParams } from './types/paramTypes.js'; -const { Address, PublicKey } = bitcore; + +const { Address, PublicKey } = CWC.BitcoreLib; /** * Connect listens on the NFC reader for a card. @@ -15,11 +16,11 @@ const { Address, PublicKey } = bitcore; export default class Burner implements Base { nfc = new NFC(); command = {}; - currency: string; + chain: string; response: object | string | number | undefined; - constructor(currency: string) { - this.currency = currency; + constructor(chain: string) { + this.chain = chain; } async awaitResponse() { @@ -54,7 +55,8 @@ export default class Burner implements Base { } async sign(params: SignParams) { - const { index, message: digest, password } = params; + const { index, tx, password } = params; + const digest = CWC.Transactions.getSighash({ chain: this.chain, tx, index: 0 }); this.response = undefined; diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index 8d29b8e943..f9c54b3f30 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -1,5 +1,5 @@ import { createRequire } from 'module'; -import bitcore from '@bitpay-labs/bitcore-lib'; +import { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; import { Psbt, payments } from 'bitcoinjs-lib'; import { Observable, @@ -19,7 +19,7 @@ const { SignerBtcBuilder } = require('@ledgerhq/device-signer-kit-bitcoin'); -const { HDPublicKey } = bitcore; +const { HDPublicKey } = BitcoreLib; export default class Ledger implements Base { device: any; @@ -96,7 +96,7 @@ export default class Ledger implements Base { return result.output.extendedPublicKey; } - async sign(tx: bitcore.Transaction) { + async sign(tx: BitcoreLib.Transaction) { const psbt = new Psbt(); const pubkey = new HDPublicKey(await this.getPublicKey({ index: 0 })).derive('m/0/0').publicKey.toBuffer(); diff --git a/packages/bitcore-hardware/src/types/paramTypes.ts b/packages/bitcore-hardware/src/types/paramTypes.ts index c1f23d03dd..15df4514ba 100644 --- a/packages/bitcore-hardware/src/types/paramTypes.ts +++ b/packages/bitcore-hardware/src/types/paramTypes.ts @@ -1,3 +1,3 @@ export interface BaseParams { index: number }; -export type SignParams = BaseParams & { message: string; password?: string }; +export type SignParams = BaseParams & { tx: object; password?: string }; From 33d1d7af1a2f1417e44ccdaedc167251b8d4e378 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 23 Jul 2026 12:00:05 -0400 Subject: [PATCH 26/56] burner sign handles all --- .../bitcore-hardware/examples/burner/sign.ts | 25 ++++--------------- packages/bitcore-hardware/src/burner.ts | 16 +++++++++--- .../bitcore-hardware/src/types/paramTypes.ts | 2 +- 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index 2f2e3bd9c3..4c58d29122 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -1,7 +1,7 @@ -import bitcore from '@bitpay-labs/bitcore-lib'; +import CWC from '@bitpay-labs/crypto-wallet-core'; import Burner from '../../src/burner.js'; -const { Transaction, PublicKey, Script, crypto } = bitcore; +const { Transaction, PublicKey, Script } = CWC.BitcoreLib; const burner = new Burner('btc'); burner.connect(); @@ -24,25 +24,10 @@ const tx = new Transaction() console.log('Tap burner wallet on an NFC reader to sign a transaction'); -const result: any = await burner.sign({ index: 9, tx, password: '123456' }); +const signedTransaction: any = await burner.sign({ index: 9, tx, password: '123456' }); -console.log(result); +console.log(signedTransaction); console.log('Signed transaction'); -const sig = crypto.Signature.fromString(result.signature.der); -const digest = Buffer.from(result.input.digest, 'hex'); - -const verify = crypto.ECDSA.verify(digest, sig, publicKey); -console.log(verify ? 'Verified signature' : 'Invalid signature'); - -const signature = { - signature: sig, - publicKey, - sigtype: crypto.Signature.SIGHASH_ALL, - inputIndex: 0 -}; - -tx.applySignature(signature); - -console.log(tx.serialize()); +console.log(signedTransaction.serialize()); process.exit(0); diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 4e9801ab4a..78809bfbdf 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -6,8 +6,7 @@ import { DataType } from './types/burnerTypes.js'; import { BaseParams, SignParams } from './types/paramTypes.js'; - -const { Address, PublicKey } = CWC.BitcoreLib; +const { Address, PublicKey, crypto } = CWC.BitcoreLib; /** * Connect listens on the NFC reader for a card. @@ -67,7 +66,18 @@ export default class Burner implements Base { keyNo: index }; - return this.awaitResponse(); + const response: any = await this.awaitResponse(); + + const signature = crypto.Signature.fromString(response.signature.der); + + tx.applySignature({ + signature, + publicKey: new PublicKey(response.publicKey), + sigtype: crypto.Signature.SIGHASH_ALL, + inputIndex: 0 + }); + + return tx; } async getPublicKey(params: BaseParams) { diff --git a/packages/bitcore-hardware/src/types/paramTypes.ts b/packages/bitcore-hardware/src/types/paramTypes.ts index 15df4514ba..059f4749c2 100644 --- a/packages/bitcore-hardware/src/types/paramTypes.ts +++ b/packages/bitcore-hardware/src/types/paramTypes.ts @@ -1,3 +1,3 @@ export interface BaseParams { index: number }; -export type SignParams = BaseParams & { tx: object; password?: string }; +export type SignParams = BaseParams & { tx: any; password?: string }; From 15b64a715388e37f6ec9bf042c94fa3c4ff99331 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 23 Jul 2026 13:18:20 -0400 Subject: [PATCH 27/56] handle all transaction signing ledger --- packages/bitcore-hardware/examples/ledger/sign.ts | 8 ++++++-- packages/bitcore-hardware/src/ledger.ts | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/bitcore-hardware/examples/ledger/sign.ts b/packages/bitcore-hardware/examples/ledger/sign.ts index 951ac30ec3..7d09fb0fea 100644 --- a/packages/bitcore-hardware/examples/ledger/sign.ts +++ b/packages/bitcore-hardware/examples/ledger/sign.ts @@ -13,10 +13,14 @@ const tx = new Transaction() address: 'bc1q0wsc0l2pzfn55ra67kr0vm40rjlllyh3a5kf88', txId: 'a78dbd15bde4d8678c7e01451d6e54e92629395c9b76de7d37bf464514c8bc04', outputIndex: 0, - script: new Script(publickey.toAddress()), + script: Script.buildWitnessV0Out(publickey.toAddress()), satoshis: 9290 }); -console.log(await ledger.sign(tx)); +const signedTransaction = await ledger.sign(tx); +console.log(signedTransaction); +console.log(signedTransaction.toBuffer().toString('hex')); await ledger.disconnect(); + +console.log('Signed transaction'); process.exit(0); diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index f9c54b3f30..3da20c27ba 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -1,6 +1,6 @@ import { createRequire } from 'module'; import { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; -import { Psbt, payments } from 'bitcoinjs-lib'; +import { Psbt } from 'bitcoinjs-lib'; import { Observable, lastValueFrom @@ -19,7 +19,7 @@ const { SignerBtcBuilder } = require('@ledgerhq/device-signer-kit-bitcoin'); -const { HDPublicKey } = BitcoreLib; +const { HDPublicKey, Transaction } = BitcoreLib; export default class Ledger implements Base { device: any; @@ -106,7 +106,7 @@ export default class Ledger implements Base { hash: input.prevTxId, index: input.outputIndex, witnessUtxo: { - script: payments.p2wpkh({ pubkey }).output, + script: input.output._script.toBuffer(), value: input.output._satoshis }, bip32Derivation: [{ @@ -124,7 +124,7 @@ export default class Ledger implements Base { ).observable; const result = await lastValueFrom(ob); - return result.output; + return new Transaction(result.output.slice(2)); } async getMasterKeyFingerprint(): Promise { From 2b27a32ea209a0e5f40d074585a3699885e1a122 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 6 Aug 2026 12:29:14 -0400 Subject: [PATCH 28/56] added TypeScript source mapping --- .../examples/burner/address.ts | 2 ++ .../examples/burner/publicKey.ts | 1 + .../bitcore-hardware/examples/burner/sign.ts | 1 + .../examples/burner/version.ts | 1 + .../examples/ledger/address.ts | 1 + .../examples/ledger/publicKey.ts | 1 + .../bitcore-hardware/examples/ledger/sign.ts | 1 + .../examples/ledger/version.ts | 1 + packages/bitcore-hardware/package-lock.json | 29 +++++++++++++++++++ packages/bitcore-hardware/package.json | 1 + 10 files changed, 39 insertions(+) diff --git a/packages/bitcore-hardware/examples/burner/address.ts b/packages/bitcore-hardware/examples/burner/address.ts index 30884d59fb..827a61e3ee 100644 --- a/packages/bitcore-hardware/examples/burner/address.ts +++ b/packages/bitcore-hardware/examples/burner/address.ts @@ -1,8 +1,10 @@ +import 'source-map-support/register.js'; import Burner from '../../src/burner.js'; const burner = new Burner('btc'); burner.connect(); +throw new Error('htest'); console.log('Tap burner wallet on an NFC reader to get the address...'); console.log(await burner.getAddress({ index: 9 })); diff --git a/packages/bitcore-hardware/examples/burner/publicKey.ts b/packages/bitcore-hardware/examples/burner/publicKey.ts index 1a630fd9fa..a302731ab2 100644 --- a/packages/bitcore-hardware/examples/burner/publicKey.ts +++ b/packages/bitcore-hardware/examples/burner/publicKey.ts @@ -1,3 +1,4 @@ +import 'source-map-support/register.js'; import Burner from '../../src/burner.js'; const burner = new Burner('btc'); diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index 4c58d29122..0801f72744 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -1,3 +1,4 @@ +import 'source-map-support/register.js'; import CWC from '@bitpay-labs/crypto-wallet-core'; import Burner from '../../src/burner.js'; diff --git a/packages/bitcore-hardware/examples/burner/version.ts b/packages/bitcore-hardware/examples/burner/version.ts index 29c31ff0d3..74ea08833b 100644 --- a/packages/bitcore-hardware/examples/burner/version.ts +++ b/packages/bitcore-hardware/examples/burner/version.ts @@ -1,3 +1,4 @@ +import 'source-map-support/register.js'; import Burner from '../../src/burner.js'; const burner = new Burner('btc'); diff --git a/packages/bitcore-hardware/examples/ledger/address.ts b/packages/bitcore-hardware/examples/ledger/address.ts index 45a630a632..fa4e970bec 100644 --- a/packages/bitcore-hardware/examples/ledger/address.ts +++ b/packages/bitcore-hardware/examples/ledger/address.ts @@ -1,3 +1,4 @@ +import 'source-map-support/register.js'; import Ledger from '../../src/ledger.js'; const ledger = new Ledger(); diff --git a/packages/bitcore-hardware/examples/ledger/publicKey.ts b/packages/bitcore-hardware/examples/ledger/publicKey.ts index 56b22dcadb..c895331284 100644 --- a/packages/bitcore-hardware/examples/ledger/publicKey.ts +++ b/packages/bitcore-hardware/examples/ledger/publicKey.ts @@ -1,3 +1,4 @@ +import 'source-map-support/register.js'; import Ledger from '../../src/ledger.js'; const ledger = new Ledger(); diff --git a/packages/bitcore-hardware/examples/ledger/sign.ts b/packages/bitcore-hardware/examples/ledger/sign.ts index 7d09fb0fea..0510df0bbb 100644 --- a/packages/bitcore-hardware/examples/ledger/sign.ts +++ b/packages/bitcore-hardware/examples/ledger/sign.ts @@ -1,3 +1,4 @@ +import 'source-map-support/register.js'; import bitcore from '@bitpay-labs/bitcore-lib'; import Ledger from '../../src/ledger.js'; diff --git a/packages/bitcore-hardware/examples/ledger/version.ts b/packages/bitcore-hardware/examples/ledger/version.ts index 36dde87a53..3b85f131c4 100644 --- a/packages/bitcore-hardware/examples/ledger/version.ts +++ b/packages/bitcore-hardware/examples/ledger/version.ts @@ -1,3 +1,4 @@ +import 'source-map-support/register.js'; import Ledger from '../../src/ledger.js'; const ledger = new Ledger(); diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index c4435c1fc7..184d8ca6db 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -23,6 +23,7 @@ "@types/mocha": "10.0.10", "chai": "6.2.2", "mocha": "11.7.6", + "source-map-support": "^0.5.21", "typescript": "7.0.2" } }, @@ -2074,6 +2075,13 @@ "resolved": "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz", "integrity": "sha512-O6NvNiHZMd3mlIeMDjP6t/gPG75OqGPeiRZXoMQZJ6iy9GofCls4Ijs5YkPZZwoysizLiedhticmdyx/GyHghA==" }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, "node_modules/call-bind": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", @@ -4270,6 +4278,27 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/split-on-first": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 8a566efc33..b518094dc1 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -44,6 +44,7 @@ "@types/mocha": "10.0.10", "chai": "6.2.2", "mocha": "11.7.6", + "source-map-support": "^0.5.21", "typescript": "7.0.2" } } From 841ca21eb8dad1b44bb509e4bb1dfbade8e0c19f Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 6 Aug 2026 12:51:47 -0400 Subject: [PATCH 29/56] use local packages - proper bitcore-hardware installation --- packages/bitcore-hardware/package-lock.json | 2478 +------------------ 1 file changed, 126 insertions(+), 2352 deletions(-) diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index 184d8ca6db..85b72625dd 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -10,7 +10,6 @@ "license": "MIT", "dependencies": { "@arx-research/libhalo": "^1.19.0", - "@bitpay-labs/crypto-wallet-core": "^11.5.1", "@ledgerhq/device-management-kit": "^1.7.1", "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", @@ -50,204 +49,6 @@ "websocket-as-promised": "^3.0.0" } }, - "node_modules/@bitpay-labs/bitcore-lib": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib/-/bitcore-lib-11.5.1.tgz", - "integrity": "sha512-bjYMYo5RWwvCnwWXLwXUJCUVw0aEMDEYx+yC3X26Lzo70pOZFPRgyuiDxdMJfihatdB9u87f0z5U+ja8KSPMsw==", - "license": "MIT", - "dependencies": { - "bech32": "=2.0.0", - "bn.js": "=4.11.8", - "bs58": "^4.0.1", - "buffer-compare": "=1.1.1", - "elliptic": "^6.5.3", - "inherits": "=2.0.1", - "lodash": "^4.17.20" - } - }, - "node_modules/@bitpay-labs/bitcore-lib-cash": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-cash/-/bitcore-lib-cash-11.5.1.tgz", - "integrity": "sha512-iGmWYEPkUl/4kW2A0Vz1TWXnpCF1nODZD4pDUYWy4nIBx3i00h96Aose5kYIgbO7fkqd8sm/IqqxM0HaSuE3HA==", - "license": "MIT", - "dependencies": { - "bn.js": "=4.11.8", - "bs58": "^4.0.1", - "buffer-compare": "=1.1.1", - "elliptic": "^6.5.3", - "inherits": "=2.0.1", - "lodash": "^4.17.20" - } - }, - "node_modules/@bitpay-labs/bitcore-lib-cash/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", - "license": "ISC" - }, - "node_modules/@bitpay-labs/bitcore-lib-doge": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-doge/-/bitcore-lib-doge-11.5.1.tgz", - "integrity": "sha512-nletyOA0ztjjRrMduRhQ9oL7Ltl5HrnRt+jt4px0de/U//lAFqCx99L5Pkdt7/lQnx9GhkdWd3BmY+YaoVGyVw==", - "license": "MIT", - "dependencies": { - "bn.js": "=4.11.8", - "bs58": "^4.0.1", - "buffer-compare": "=1.1.1", - "elliptic": "^6.5.3", - "inherits": "=2.0.1", - "lodash": "^4.17.20", - "scryptsy": "2.1.0" - } - }, - "node_modules/@bitpay-labs/bitcore-lib-doge/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", - "license": "ISC" - }, - "node_modules/@bitpay-labs/bitcore-lib-ltc": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-ltc/-/bitcore-lib-ltc-11.5.1.tgz", - "integrity": "sha512-BHaAKFsJ+qIXOnbaQGYMxICdeOwJtwIla+h2JrzPT7xU0N0cPA5o3aRRdzdVJYeWD0zyp8sv/V+b3CzT2zsN3Q==", - "license": "MIT", - "dependencies": { - "bech32": "=2.0.0", - "bn.js": "=4.11.8", - "bs58": "^4.0.1", - "buffer-compare": "=1.1.1", - "elliptic": "^6.5.3", - "inherits": "=2.0.1", - "lodash": "^4.17.20", - "scryptsy": "2.1.0" - } - }, - "node_modules/@bitpay-labs/bitcore-lib-ltc/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", - "license": "ISC" - }, - "node_modules/@bitpay-labs/bitcore-lib/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", - "license": "ISC" - }, - "node_modules/@bitpay-labs/crypto-wallet-core": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@bitpay-labs/crypto-wallet-core/-/crypto-wallet-core-11.5.1.tgz", - "integrity": "sha512-5VzX6xAR2O7k/Crf7Kf5wEOqTaGPzl6eU7K1nepSE+wT28O2VMWxjrckP8XoO8sbH0iXpApoi4nkFuSsQFFcqg==", - "license": "MIT", - "dependencies": { - "@bitpay-labs/bitcore-lib": "^11.5.1", - "@bitpay-labs/bitcore-lib-cash": "^11.5.1", - "@bitpay-labs/bitcore-lib-doge": "^11.5.1", - "@bitpay-labs/bitcore-lib-ltc": "^11.5.1", - "@solana-program/compute-budget": "0.7.0", - "@solana-program/memo": "0.7.0", - "@solana-program/system": "0.7.0", - "@solana-program/token": "0.5.1", - "@solana/kit": "2.1.0", - "ed25519-hd-key": "^1.3.0", - "ethers": "6.13.5", - "info": "0.0.6-beta.0", - "ripple-binary-codec": "^1.10.0", - "web3": "4.16.0", - "xrpl": "2.13.0" - } - }, - "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", - "license": "MIT" - }, - "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/ethers": { - "version": "6.13.5", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.5.tgz", - "integrity": "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "22.7.5", - "aes-js": "4.0.0-beta.5", - "tslib": "2.7.0", - "ws": "8.17.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "license": "MPL-2.0", - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/@inversifyjs/common": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@inversifyjs/common/-/common-1.5.0.tgz", @@ -405,920 +206,140 @@ "node_modules/@ledgerhq/device-transport-kit-node-hid/node_modules/usb/node_modules/node-addon-api": { "version": "8.9.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.0.tgz", - "integrity": "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/@ledgerhq/signer-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/signer-utils/-/signer-utils-1.3.0.tgz", - "integrity": "sha512-qe+HQMgZxq6SPv8ghvlq4c33RchUwlf1qE/qp7MtUGPbKGAqD/0PKNyzx05sKLpmA8m6YZdtndHH4CEkikzqSQ==", - "license": "Apache-2.0", - "dependencies": { - "semver": "7.7.2" - }, - "peerDependencies": { - "@ledgerhq/device-management-kit": "^1.7.1" - } - }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pokusew/pcsclite": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@pokusew/pcsclite/-/pcsclite-0.6.0.tgz", - "integrity": "sha512-jX7zRXM2Or5Pms1AFjNtawsXDjLiZOzOUo7Sf0put7Pnq/EKIR9g0KvTx62HtwdPpVP6hWHGydUTHgIi9PxodQ==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.14.0" - } - }, - "node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@sentry/hub": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", - "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", - "license": "BSD-3-Clause", - "dependencies": { - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/hub/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@sentry/minimal": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", - "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@sentry/types": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", - "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", - "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", - "license": "BSD-3-Clause", - "dependencies": { - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@solana-program/compute-budget": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@solana-program/compute-budget/-/compute-budget-0.7.0.tgz", - "integrity": "sha512-/JJSE1fKO5zx7Z55Z2tLGWBDDi7tUE+xMlK8qqkHlY51KpqksMsIBzQMkG9Dqhoe2Cnn5/t3QK1nJKqW6eHzpg==", - "license": "Apache-2.0", - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@solana-program/memo": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@solana-program/memo/-/memo-0.7.0.tgz", - "integrity": "sha512-3T9iUjWSYtN/5S5jzJuasD2yQfVfFAQ9yTwIE25+P9peWqz4oarn6ZQvRj/FLcBqaMLtSqLhU1hN2cyVBS6hyg==", - "license": "Apache-2.0", - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@solana-program/system": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@solana-program/system/-/system-0.7.0.tgz", - "integrity": "sha512-FKTBsKHpvHHNc1ATRm7SlC5nF/VdJtOSjldhcyfMN9R7xo712Mo2jHIzvBgn8zQO5Kg0DcWuKB7268Kv1ocicw==", - "license": "Apache-2.0", - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@solana-program/token": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@solana-program/token/-/token-0.5.1.tgz", - "integrity": "sha512-bJvynW5q9SFuVOZ5vqGVkmaPGA0MCC+m9jgJj1nk5m20I389/ms69ASnhWGoOPNcie7S9OwBX0gTj2fiyWpfag==", - "license": "Apache-2.0", - "peerDependencies": { - "@solana/kit": "^2.1.0" - } - }, - "node_modules/@solana/accounts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-2.1.0.tgz", - "integrity": "sha512-1JOBiLFeIeHmGx7k1b23UWF9vM1HAh9GBMCzr5rBPrGSBs+QUgxBJ3+yrRg+UPEOSELubqo7qoOVFUKYsb1nXw==", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.1.0", - "@solana/codecs-core": "2.1.0", - "@solana/codecs-strings": "2.1.0", - "@solana/errors": "2.1.0", - "@solana/rpc-spec": "2.1.0", - "@solana/rpc-types": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/addresses": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-2.1.0.tgz", - "integrity": "sha512-IgiRuju2yLz14GnrysOPSNZbZQ8F+7jhx7FYZLrbKogf6NX4wy4ijLHxRsLFqP8o8aY69BZULkM9MwrSjsZi7A==", - "license": "MIT", - "dependencies": { - "@solana/assertions": "2.1.0", - "@solana/codecs-core": "2.1.0", - "@solana/codecs-strings": "2.1.0", - "@solana/errors": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/assertions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-2.1.0.tgz", - "integrity": "sha512-KCYmxFRsg897Ec7yGdpc0rniOlqGD3NpicmIjWIV87uiXX5uFco4t+01sKyFlhsv4T4OgHxngMsxkfQ3AUkFVg==", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.1.0.tgz", - "integrity": "sha512-C0TnfrpbTg7zoIFYfM65ofeL2AWEz80OsD6mjVdcTKpb1Uj7XuBuNLss3dMnatPQaL7RagD9VLA5/WfYayyteQ==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.1.0", - "@solana/codecs-data-structures": "2.1.0", - "@solana/codecs-numbers": "2.1.0", - "@solana/codecs-strings": "2.1.0", - "@solana/options": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.1.0.tgz", - "integrity": "sha512-SR7pKtmJBg2mhmkel2NeHA1pz06QeQXdMv8WJoIR9m8F/hw80K/612uaYbwTt2nkK0jg/Qn/rNSd7EcJ4SBGjw==", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-data-structures": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.1.0.tgz", - "integrity": "sha512-oDF5ek54kirqJ09q8k/qEpobBiWOhd3CkkGOTyfjsmTF/IGIigNbdYIakxV3+vudBeaNBw08y0XdBYI4JL/nqA==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.1.0", - "@solana/codecs-numbers": "2.1.0", - "@solana/errors": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-numbers": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.1.0.tgz", - "integrity": "sha512-XMu4yw5iCgQnMKsxSWPPOrGgtaohmupN3eyAtYv3K3C/MJEc5V90h74k5B1GUCiHvcrdUDO9RclNjD9lgbjFag==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.1.0", - "@solana/errors": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/codecs-strings": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.1.0.tgz", - "integrity": "sha512-O/eJFLzFrHomcCR1Y5QbIqoPo7iaJaWNnIeskB4mVhVjLyjlJS4WtBP2NBRzM9uJXaXyOxxKroqqO9zFsHOpvQ==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.1.0", - "@solana/codecs-numbers": "2.1.0", - "@solana/errors": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22", - "typescript": ">=5" - } - }, - "node_modules/@solana/errors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.1.0.tgz", - "integrity": "sha512-l+GxAv0Ar4d3c3PlZdA9G++wFYZREEbbRyAFP8+n8HSg0vudCuzogh/13io6hYuUhG/9Ve8ARZNamhV7UScKNw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "commander": "^13.1.0" - }, - "bin": { - "errors": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/errors/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@solana/fast-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-2.1.0.tgz", - "integrity": "sha512-a8vR92qbe/VsvQ1BpN3PIEwnoHD2fTHEwCJh9GG58z3R15RIjk73gc0khjcdg4U1tZwTJqWkvk8SbDIgGdOgMA==", - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/functional": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-2.1.0.tgz", - "integrity": "sha512-RVij8Av4F2uUOFcEC8n9lgD72e9gQMritmGHhMh+G91Xops4I6Few+oQ++XgSTiL2t3g3Cs0QZ13onZ0FL45FQ==", - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/instructions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-2.1.0.tgz", - "integrity": "sha512-wfn6e7Rgm0Sw/Th1v/pXsKTvloZvAAQI7j1yc9WcIk9ngqH5p6LhqMMkrwYPB2oTk8+MMr7SZ4E+2eK2gL6ODA==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.1.0", - "@solana/errors": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-2.1.0.tgz", - "integrity": "sha512-esY1+dlZjB18hZML5p+YPec29wi3HH0SzKx7RiqF//dI2cJ6vHfq3F+7ArbNnF6R2YCLFtl7DzS/tkqR2Xkxeg==", - "license": "MIT", - "dependencies": { - "@solana/assertions": "2.1.0", - "@solana/codecs-core": "2.1.0", - "@solana/codecs-strings": "2.1.0", - "@solana/errors": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/kit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-2.1.0.tgz", - "integrity": "sha512-vqaHROLKp89xdIbaKVG6BQ44uMN9E6/rSTeltkvquD2qdTObssafGDbAKVFjwZhlNO+sdzHDCLekGabn5VAL6A==", - "license": "MIT", - "dependencies": { - "@solana/accounts": "2.1.0", - "@solana/addresses": "2.1.0", - "@solana/codecs": "2.1.0", - "@solana/errors": "2.1.0", - "@solana/functional": "2.1.0", - "@solana/instructions": "2.1.0", - "@solana/keys": "2.1.0", - "@solana/programs": "2.1.0", - "@solana/rpc": "2.1.0", - "@solana/rpc-parsed-types": "2.1.0", - "@solana/rpc-spec-types": "2.1.0", - "@solana/rpc-subscriptions": "2.1.0", - "@solana/rpc-types": "2.1.0", - "@solana/signers": "2.1.0", - "@solana/sysvars": "2.1.0", - "@solana/transaction-confirmation": "2.1.0", - "@solana/transaction-messages": "2.1.0", - "@solana/transactions": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/options": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.1.0.tgz", - "integrity": "sha512-T/vJCr8qnwK6HxriOPXCrx31IpA9ZYecxuOzQ3G74kIayED4spmpXp6PLtRYR/fo2LZ6UcgHN0qSgONnvwEweg==", - "license": "MIT", - "dependencies": { - "@solana/codecs-core": "2.1.0", - "@solana/codecs-data-structures": "2.1.0", - "@solana/codecs-numbers": "2.1.0", - "@solana/codecs-strings": "2.1.0", - "@solana/errors": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/programs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-2.1.0.tgz", - "integrity": "sha512-9Y30/yUbTR99+QRN2ukNXQQTGY68oKmVrXnh/et6StM1JF5WHvAJqBigsHG5bt6KxTISoRuncBnH/IRnDqPxKg==", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.1.0", - "@solana/errors": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/promises": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-2.1.0.tgz", - "integrity": "sha512-eQJaQXA2kD4dVyifzhslV3wOvq27fwOJ4az89BQ4Cz83zPbR94xOeDShwcXrKBYqaUf6XqH5MzdEo14t4tKAFQ==", - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-2.1.0.tgz", - "integrity": "sha512-myg9qAo6b2WKyHSMXURQykb+ZRnNEXBPLEcwRwkos8STzPPyRFg6ady2s0FCQQTtL/pVjanIU2bObZIzbMGugA==", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.1.0", - "@solana/fast-stable-stringify": "2.1.0", - "@solana/functional": "2.1.0", - "@solana/rpc-api": "2.1.0", - "@solana/rpc-spec": "2.1.0", - "@solana/rpc-spec-types": "2.1.0", - "@solana/rpc-transformers": "2.1.0", - "@solana/rpc-transport-http": "2.1.0", - "@solana/rpc-types": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-api": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-2.1.0.tgz", - "integrity": "sha512-4yCnHYHFlz9VffivoY5q/HVeBjT59byB2gmg7UyC3ktxD28AlF9jjsE5tJKiapAKr2J3KWm0D/rH/QwW14cGeA==", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.1.0", - "@solana/codecs-core": "2.1.0", - "@solana/codecs-strings": "2.1.0", - "@solana/errors": "2.1.0", - "@solana/keys": "2.1.0", - "@solana/rpc-parsed-types": "2.1.0", - "@solana/rpc-spec": "2.1.0", - "@solana/rpc-transformers": "2.1.0", - "@solana/rpc-types": "2.1.0", - "@solana/transaction-messages": "2.1.0", - "@solana/transactions": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-parsed-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-2.1.0.tgz", - "integrity": "sha512-mRzHemxlWDS9p1fPQNKwL+1vEOUMG8peSUJb0X/NbM12yjowDNdzM++fkOgIyCKDPddfkcoNmNrQmr2jwjdN1Q==", - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-spec": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-2.1.0.tgz", - "integrity": "sha512-NPAIM5EY7Jke0mHnmoMpgCEb/nZKIo+bgVFK/u+z74gY0JnCNt0DfocStUUQtlhqSmTyoHamt3lfxp4GT2zXbA==", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.1.0", - "@solana/rpc-spec-types": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-spec-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-2.1.0.tgz", - "integrity": "sha512-NxcZ8piXMyCdbNUL6d36QJfL2UAQEN33StlGku0ltTVe1nrokZ5WRNjSPohU1fODlNaZzTvUFzvUkM1yGCkyzw==", - "license": "MIT", - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-subscriptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-2.1.0.tgz", - "integrity": "sha512-dTyI03VlueE3s7mA/OBlA5l6yKUUKHMJd31tpzxV3AFnqE/QPS5NVrF/WY6pPBobLJiCP0UFOe7eR/MKP9SUCA==", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.1.0", - "@solana/fast-stable-stringify": "2.1.0", - "@solana/functional": "2.1.0", - "@solana/promises": "2.1.0", - "@solana/rpc-spec-types": "2.1.0", - "@solana/rpc-subscriptions-api": "2.1.0", - "@solana/rpc-subscriptions-channel-websocket": "2.1.0", - "@solana/rpc-subscriptions-spec": "2.1.0", - "@solana/rpc-transformers": "2.1.0", - "@solana/rpc-types": "2.1.0", - "@solana/subscribable": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-subscriptions-api": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-2.1.0.tgz", - "integrity": "sha512-de1dBRSE2CUwoZHMXQ/0v7iC+/pG0+iYY8jLHGGNxtKrYbTnV08mXQbaAMrmv2Rk8ZFmfJWbqbYZ9dRWdO3P5g==", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.1.0", - "@solana/keys": "2.1.0", - "@solana/rpc-subscriptions-spec": "2.1.0", - "@solana/rpc-transformers": "2.1.0", - "@solana/rpc-types": "2.1.0", - "@solana/transaction-messages": "2.1.0", - "@solana/transactions": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "node_modules/@solana/rpc-subscriptions-channel-websocket": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-2.1.0.tgz", - "integrity": "sha512-goJe9dv0cs967HJ382vSX8yapXgQzRHCmH323LsXrrpj/s3Eb3yUwJq7AcHgoh4gKIqyAfGybq/bE5Aa8Pcm9g==", - "license": "MIT", - "dependencies": { - "@solana/errors": "2.1.0", - "@solana/functional": "2.1.0", - "@solana/rpc-subscriptions-spec": "2.1.0", - "@solana/subscribable": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5", - "ws": "^8.18.0" - } - }, - "node_modules/@solana/rpc-subscriptions-spec": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-2.1.0.tgz", - "integrity": "sha512-Uqasfd3Tlr22lC/Vy5dToF0e68dMKPdnt4ks7FwXuPdEbNRM/TDGb0GqG+bt/d3IIrNOCA5Y8vsE0nQHGrWG/w==", + "integrity": "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==", "license": "MIT", - "dependencies": { - "@solana/errors": "2.1.0", - "@solana/promises": "2.1.0", - "@solana/rpc-spec-types": "2.1.0", - "@solana/subscribable": "2.1.0" - }, "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" + "node": "^18 || ^20 || >= 21" } }, - "node_modules/@solana/rpc-transformers": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-2.1.0.tgz", - "integrity": "sha512-E2xPlaCu6tNO00v4HIJxJCYkoNwgVJYad5sxbIUZOQBWwXnWIcll2jUT4bWKpBGq5vFDYfkzRBr8Rco3DhfXqg==", - "license": "MIT", + "node_modules/@ledgerhq/signer-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/signer-utils/-/signer-utils-1.3.0.tgz", + "integrity": "sha512-qe+HQMgZxq6SPv8ghvlq4c33RchUwlf1qE/qp7MtUGPbKGAqD/0PKNyzx05sKLpmA8m6YZdtndHH4CEkikzqSQ==", + "license": "Apache-2.0", "dependencies": { - "@solana/errors": "2.1.0", - "@solana/functional": "2.1.0", - "@solana/rpc-spec-types": "2.1.0", - "@solana/rpc-types": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" + "semver": "7.7.2" }, "peerDependencies": { - "typescript": ">=5" + "@ledgerhq/device-management-kit": "^1.7.1" } }, - "node_modules/@solana/rpc-transport-http": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-2.1.0.tgz", - "integrity": "sha512-E3UovTBid4/S8QDd9FkADVKfyG+v7CW5IqI4c27ZDKfazCsnDLLkqh98C6BvNCqi278HKBui4lI2GoFpCq89Pw==", + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { - "@solana/errors": "2.1.0", - "@solana/rpc-spec": "2.1.0", - "@solana/rpc-spec-types": "2.1.0", - "undici-types": "^7.3.0" + "@noble/hashes": "1.8.0" }, "engines": { - "node": ">=20.18.0" + "node": "^14.21.3 || >=16" }, - "peerDependencies": { - "typescript": ">=5" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@solana/rpc-transport-http/node_modules/undici-types": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.28.0.tgz", - "integrity": "sha512-LJAfY+2w6HGeT8d8J1wNQsUGUEGio6NWWpwdwurQe4f6oojzCFuGLizl1KSve4irsTxyLly1QhEeE6iapdaIvQ==", - "license": "MIT" - }, - "node_modules/@solana/rpc-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-2.1.0.tgz", - "integrity": "sha512-1ODnhmpR1X/GjB7hs4gVR3mcCagfPQV0dzq/2DNuCiMjx2snn64KP5WoAHfBEyoC9/Rb36+JpNj/hLAOikipKA==", + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", - "dependencies": { - "@solana/addresses": "2.1.0", - "@solana/codecs-core": "2.1.0", - "@solana/codecs-numbers": "2.1.0", - "@solana/codecs-strings": "2.1.0", - "@solana/errors": "2.1.0" - }, "engines": { - "node": ">=20.18.0" + "node": "^14.21.3 || >=16" }, - "peerDependencies": { - "typescript": ">=5" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@solana/signers": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-2.1.0.tgz", - "integrity": "sha512-Yq0JdJnCecRsSBshNWy+OIRmAGeVfjwIh9Z+H1jv8u8p+dJCOreKakTWuxMt5tnj3q5K1mPcak9O2PqVPZ0teA==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "license": "MIT", - "dependencies": { - "@solana/addresses": "2.1.0", - "@solana/codecs-core": "2.1.0", - "@solana/errors": "2.1.0", - "@solana/instructions": "2.1.0", - "@solana/keys": "2.1.0", - "@solana/transaction-messages": "2.1.0", - "@solana/transactions": "2.1.0" - }, + "optional": true, "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" + "node": ">=14" } }, - "node_modules/@solana/subscribable": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-2.1.0.tgz", - "integrity": "sha512-xi12Cm889+uT5sRKnIzr7nLnHAp3hiR3dqIzrT1P7z7iEGp8OnqUQIQCHlgozFHM2cPW+6685NQXk1l1ImuJIw==", - "license": "MIT", + "node_modules/@pokusew/pcsclite": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@pokusew/pcsclite/-/pcsclite-0.6.0.tgz", + "integrity": "sha512-jX7zRXM2Or5Pms1AFjNtawsXDjLiZOzOUo7Sf0put7Pnq/EKIR9g0KvTx62HtwdPpVP6hWHGydUTHgIi9PxodQ==", + "hasInstallScript": true, + "license": "ISC", "dependencies": { - "@solana/errors": "2.1.0" - }, - "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" + "bindings": "^1.5.0", + "nan": "^2.14.0" } }, - "node_modules/@solana/sysvars": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-2.1.0.tgz", - "integrity": "sha512-GXu9yS0zIebmM1Unqw/XFpYuvug03m42w98ioOPV/yiHzECggGRGpHGD9RLVYnkyz0eL4NRbnJ5dAEu/fvGe0A==", - "license": "MIT", + "node_modules/@sentry/hub": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", + "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "license": "BSD-3-Clause", "dependencies": { - "@solana/accounts": "2.1.0", - "@solana/codecs": "2.1.0", - "@solana/errors": "2.1.0", - "@solana/rpc-types": "2.1.0" + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" }, "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" + "node": ">=6" } }, - "node_modules/@solana/transaction-confirmation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-2.1.0.tgz", - "integrity": "sha512-VxOvtvs2e9h5u73PHyE2TptLAMO5x6dOXlOgvq1Nk6l3rKM2HAsd+KDpN7gjOo8/EgItMMmyEilXygWWRgpSIA==", - "license": "MIT", + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@sentry/minimal": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", + "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "license": "BSD-3-Clause", "dependencies": { - "@solana/addresses": "2.1.0", - "@solana/codecs-strings": "2.1.0", - "@solana/errors": "2.1.0", - "@solana/keys": "2.1.0", - "@solana/promises": "2.1.0", - "@solana/rpc": "2.1.0", - "@solana/rpc-subscriptions": "2.1.0", - "@solana/rpc-types": "2.1.0", - "@solana/transaction-messages": "2.1.0", - "@solana/transactions": "2.1.0" + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" }, "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" + "node": ">=6" } }, - "node_modules/@solana/transaction-messages": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-2.1.0.tgz", - "integrity": "sha512-+GPzZHLYNFbqHKoiL8mYALp7eAXtAbI6zLViZpIM3zUbVNU3q5+FCKGv6jCBnxs+3QCbeapu+W1OyfDa6BUtTQ==", - "license": "MIT", - "dependencies": { - "@solana/addresses": "2.1.0", - "@solana/codecs-core": "2.1.0", - "@solana/codecs-data-structures": "2.1.0", - "@solana/codecs-numbers": "2.1.0", - "@solana/errors": "2.1.0", - "@solana/functional": "2.1.0", - "@solana/instructions": "2.1.0", - "@solana/rpc-types": "2.1.0" - }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@sentry/types": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", + "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", + "license": "BSD-3-Clause", "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" + "node": ">=6" } }, - "node_modules/@solana/transactions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-2.1.0.tgz", - "integrity": "sha512-QeM4sCItReeIy5LU7LhGkz7RPfMPTg/Qo8h0LSfhiJiPTOHOhElmh42vkLJmwPl83+MsKtisyPQNK6penM2nAw==", - "license": "MIT", + "node_modules/@sentry/utils": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", + "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "license": "BSD-3-Clause", "dependencies": { - "@solana/addresses": "2.1.0", - "@solana/codecs-core": "2.1.0", - "@solana/codecs-data-structures": "2.1.0", - "@solana/codecs-numbers": "2.1.0", - "@solana/codecs-strings": "2.1.0", - "@solana/errors": "2.1.0", - "@solana/functional": "2.1.0", - "@solana/instructions": "2.1.0", - "@solana/keys": "2.1.0", - "@solana/rpc-types": "2.1.0", - "@solana/transaction-messages": "2.1.0" + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" }, "engines": { - "node": ">=20.18.0" - }, - "peerDependencies": { - "typescript": ">=5" + "node": ">=6" } }, - "node_modules/@types/brorand": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/@types/brorand/-/brorand-1.0.33.tgz", - "integrity": "sha512-KmNsWYtzKXpmxjecvYWUEGK5biJB/1kpHRObHZD8eme1tz/TvbESbZeNAHPRNd5qyCJiHk2ztbNzKbPC6TuPFg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@types/chai": { "version": "5.2.3", @@ -1372,15 +393,6 @@ "integrity": "sha512-Qu3Nn6JFuF4+sHKYl+IcX9vYiI40ogleXzFFSxoE1W94rG98o/kXs8uJ0QSfFzuwBCZWlGfUGpPkgwuuX4PchA==", "license": "MIT" }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@typescript/typescript-aix-ppc64": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", @@ -1388,6 +400,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1404,6 +417,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1420,6 +434,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1436,6 +451,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1452,6 +468,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1468,6 +485,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1484,6 +502,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1500,6 +519,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1516,6 +536,7 @@ "cpu": [ "mips64el" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1532,6 +553,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1548,6 +570,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1564,6 +587,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1580,6 +604,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1596,6 +621,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1612,6 +638,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1628,6 +655,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1644,6 +672,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1660,6 +689,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1676,6 +706,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1692,6 +723,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1701,71 +733,12 @@ "node": ">=16.20.0" } }, - "node_modules/@xrplf/isomorphic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.2.tgz", - "integrity": "sha512-ncZUdMXr6VlSXtdoiDi0jTH+gBrgGxwVeEidhoegII3PmyErbQsyj6e+j7acmR4LW/lvBkPkzb9QzRfJH0n3rA==", - "license": "ISC", - "dependencies": { - "@noble/hashes": "^2.0.1", - "eventemitter3": "5.0.1", - "ws": "^8.20.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@xrplf/isomorphic/node_modules/@noble/hashes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", - "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@xrplf/isomorphic/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "node_modules/abitype": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.7.1.tgz", - "integrity": "sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==", - "license": "MIT", - "peerDependencies": { - "typescript": ">=4.9.4", - "zod": "^3 >=3.19.1" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, "node_modules/aes-js": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "license": "MIT" }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -1801,19 +774,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -1846,58 +806,12 @@ "dev": true, "license": "MIT" }, - "node_modules/base-x": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", - "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/bech32": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", - "license": "MIT" - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", "license": "MIT", - "engines": { - "node": "*" - } + "peer": true }, "node_modules/bindings": { "version": "1.5.0", @@ -1909,57 +823,13 @@ } }, "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", - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/bip32": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", - "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", - "license": "MIT", - "dependencies": { - "@types/node": "10.12.18", - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.1.3", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/bip32/node_modules/@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", - "license": "MIT" - }, - "node_modules/bip32/node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "license": "MIT", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/bip39": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", - "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", - "license": "ISC", - "dependencies": { - "@noble/hashes": "^1.2.0" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.1.1.tgz", + "integrity": "sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.0.0" } }, "node_modules/bitcoinjs-lib": { @@ -1980,12 +850,6 @@ "node": ">=8.0.0" } }, - "node_modules/bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "license": "MIT" - }, "node_modules/brace-expansion": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", @@ -1996,12 +860,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -2009,15 +867,6 @@ "dev": true, "license": "ISC" }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", - "dependencies": { - "base-x": "^3.0.2" - } - }, "node_modules/bs58check": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", @@ -2046,35 +895,6 @@ "base-x": "^4.0.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-compare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz", - "integrity": "sha512-O6NvNiHZMd3mlIeMDjP6t/gPG75OqGPeiRZXoMQZJ6iy9GofCls4Ijs5YkPZZwoysizLiedhticmdyx/GyHghA==" - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2314,33 +1134,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -2368,15 +1167,6 @@ "sha.js": "^2.4.8" } }, - "node_modules/cross-fetch": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2402,6 +1192,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2428,12 +1219,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "license": "MIT" - }, "node_modules/decode-uri-component": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", @@ -2460,23 +1245,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -2514,37 +1282,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ed25519-hd-key": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ed25519-hd-key/-/ed25519-hd-key-1.3.0.tgz", - "integrity": "sha512-IWwAyiiuJQhgu3L8NaHb68eJxTu2pgCwxIBdgpLJdKpYZM46+AXePSVTr7fkNKaUOfOL4IrjEUaQvyVRIDP7fg==", - "license": "MIT", - "dependencies": { - "create-hmac": "1.1.7", - "tweetnacl": "1.0.3" - } - }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", - "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", - "license": "MIT" - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -2605,42 +1342,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ethereum-cryptography": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", - "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", - "license": "MIT", - "dependencies": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" - } - }, - "node_modules/ethereum-cryptography/node_modules/@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/ethers": { "version": "6.17.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.17.0.tgz", @@ -2693,19 +1394,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT" - }, - "node_modules/fastestsmallesttextencoderdecoder": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", - "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", - "license": "CC0-1.0", - "peer": true - }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -2792,15 +1480,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2945,16 +1624,6 @@ "node": ">= 0.8" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", @@ -2977,64 +1646,6 @@ "he": "bin/he" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/info": { - "version": "0.0.6-beta.0", - "resolved": "https://registry.npmjs.org/info/-/info-0.0.6-beta.0.tgz", - "integrity": "sha512-pm7sdQ6y6iP6ATfDUA7xGJtSvKDFlD1STRBu+3E2qbsRKRQpvkqf7UIfcVm0LpQsG1lrzJuBBkGD8TeoTjLPuQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "ISC", - "dependencies": { - "zen-observable": "^0.8.14" - }, - "peerDependencies": { - "react": "16.8", - "react-dom": "16.8" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -3055,22 +1666,6 @@ "reflect-metadata": "~0.2.2" } }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -3092,41 +1687,6 @@ "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -3147,24 +1707,6 @@ "node": ">=8" } }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", @@ -3246,13 +1788,6 @@ "integrity": "sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg==", "license": "MIT" }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true - }, "node_modules/js-yaml": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", @@ -3292,12 +1827,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -3315,19 +1844,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -3355,18 +1871,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT" - }, "node_modules/minimatch": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", @@ -3434,6 +1938,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, "node_modules/nan": { @@ -3457,90 +1962,15 @@ "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "license": "MIT" }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-gyp-build": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, "node_modules/p-limit": { @@ -3706,18 +2136,6 @@ "node": ">=10" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, "node_modules/purify-ts": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/purify-ts/-/purify-ts-2.1.0.tgz", @@ -3948,45 +2366,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", - "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" - }, - "peerDependencies": { - "react": "^16.0.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT", - "peer": true - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -4056,58 +2435,6 @@ "node": ">= 0.8" } }, - "node_modules/ripple-address-codec": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.1.tgz", - "integrity": "sha512-Qa3+9wKVvpL/xYtT6+wANsn0A1QcC5CT6IMZbRJZ/1lGt7gmwIfsrCuz1X0+LCEO7zgb+3UT1I1dc0k/5dwKQQ==", - "license": "ISC", - "dependencies": { - "base-x": "^3.0.9", - "create-hash": "^1.1.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/ripple-binary-codec": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-1.11.0.tgz", - "integrity": "sha512-g7+gs3T+NfoeW6vIq5dcN0CkIT4t/zwRzFxz8X2RzfbrWRnewPUKqQbmBgs05tXLX5NuWPaneiaAVpFpYBcdfw==", - "license": "ISC", - "dependencies": { - "assert": "^2.0.0", - "big-integer": "^1.6.48", - "buffer": "6.0.3", - "create-hash": "^1.2.0", - "decimal.js": "^10.2.0", - "ripple-address-codec": "^4.3.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/ripple-keypairs": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.1.tgz", - "integrity": "sha512-dmPlraWKJciFJxHcoubDahGnoIalG5e/BtV6HNDUs7wLXmtnLMHt6w4ed9R8MTL2zNrVPiIdI/HCtMMo0Tm7JQ==", - "license": "ISC", - "dependencies": { - "bn.js": "^5.1.1", - "brorand": "^1.0.5", - "elliptic": "^6.5.4", - "hash.js": "^1.0.3", - "ripple-address-codec": "^4.3.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/ripple-keypairs/node_modules/bn.js": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", - "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", - "license": "MIT" - }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -4137,40 +2464,6 @@ ], "license": "MIT" }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/scryptsy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", - "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==", - "license": "MIT" - }, "node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -4216,12 +2509,6 @@ "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, "node_modules/sha.js": { "version": "2.4.12", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", @@ -4558,23 +2845,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/tiny-secp256k1": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.7.tgz", - "integrity": "sha512-eb+F6NabSnjbLwNoC+2o5ItbmP1kg7HliWue71JgLegQt6A5mTN8YbvTLCazdlg6e5SV6A+r8OGvZYskdlmhqQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "bindings": "^1.3.0", - "bn.js": "^4.11.8", - "create-hmac": "^1.1.7", - "elliptic": "^6.4.0", - "nan": "^2.13.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/to-buffer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", @@ -4595,24 +2865,12 @@ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "license": "Unlicense" - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -4631,12 +2889,14 @@ "version": "1.18.0", "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/typescript": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc" @@ -4673,19 +2933,6 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4715,366 +2962,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/web3": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-4.16.0.tgz", - "integrity": "sha512-SgoMSBo6EsJ5GFCGar2E/pR2lcR/xmUSuQ61iK6yDqzxmm42aPPxSqZfJz2z/UCR6pk03u77pU8TGV6lgMDdIQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.7.1", - "web3-errors": "^1.3.1", - "web3-eth": "^4.11.1", - "web3-eth-abi": "^4.4.1", - "web3-eth-accounts": "^4.3.1", - "web3-eth-contract": "^4.7.2", - "web3-eth-ens": "^4.4.0", - "web3-eth-iban": "^4.0.7", - "web3-eth-personal": "^4.1.0", - "web3-net": "^4.1.0", - "web3-providers-http": "^4.2.0", - "web3-providers-ws": "^4.0.8", - "web3-rpc-methods": "^1.3.0", - "web3-rpc-providers": "^1.0.0-rc.4", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14.0.0", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-4.7.1.tgz", - "integrity": "sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-errors": "^1.3.1", - "web3-eth-accounts": "^4.3.1", - "web3-eth-iban": "^4.0.7", - "web3-providers-http": "^4.2.0", - "web3-providers-ws": "^4.0.8", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - }, - "optionalDependencies": { - "web3-providers-ipc": "^4.0.7" - } - }, - "node_modules/web3-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.3.1.tgz", - "integrity": "sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-types": "^1.10.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-4.11.1.tgz", - "integrity": "sha512-q9zOkzHnbLv44mwgLjLXuyqszHuUgZWsQayD2i/rus2uk0G7hMn11bE2Q3hOVnJS4ws4VCtUznlMxwKQ+38V2w==", - "license": "LGPL-3.0", - "dependencies": { - "setimmediate": "^1.0.5", - "web3-core": "^4.7.1", - "web3-errors": "^1.3.1", - "web3-eth-abi": "^4.4.1", - "web3-eth-accounts": "^4.3.1", - "web3-net": "^4.1.0", - "web3-providers-ws": "^4.0.8", - "web3-rpc-methods": "^1.3.0", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-abi": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-4.4.1.tgz", - "integrity": "sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==", - "license": "LGPL-3.0", - "dependencies": { - "abitype": "0.7.1", - "web3-errors": "^1.3.1", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-accounts": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-4.3.1.tgz", - "integrity": "sha512-rTXf+H9OKze6lxi7WMMOF1/2cZvJb2AOnbNQxPhBDssKOllAMzLhg1FbZ4Mf3lWecWfN6luWgRhaeSqO1l+IBQ==", - "license": "LGPL-3.0", - "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "crc-32": "^1.2.2", - "ethereum-cryptography": "^2.0.0", - "web3-errors": "^1.3.1", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-contract": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-4.7.2.tgz", - "integrity": "sha512-3ETqs2pMNPEAc7BVY/C3voOhTUeJdkf2aM3X1v+edbngJLHAxbvxKpOqrcO0cjXzC4uc2Q8Zpf8n8zT5r0eLnA==", - "license": "LGPL-3.0", - "dependencies": { - "@ethereumjs/rlp": "^5.0.2", - "web3-core": "^4.7.1", - "web3-errors": "^1.3.1", - "web3-eth": "^4.11.1", - "web3-eth-abi": "^4.4.1", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-contract/node_modules/@ethereumjs/rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", - "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", - "license": "MPL-2.0", - "bin": { - "rlp": "bin/rlp.cjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/web3-eth-ens": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-4.4.0.tgz", - "integrity": "sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==", - "license": "LGPL-3.0", - "dependencies": { - "@adraffy/ens-normalize": "^1.8.8", - "web3-core": "^4.5.0", - "web3-errors": "^1.2.0", - "web3-eth": "^4.8.0", - "web3-eth-contract": "^4.5.0", - "web3-net": "^4.1.0", - "web3-types": "^1.7.0", - "web3-utils": "^4.3.0", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-iban": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-4.0.7.tgz", - "integrity": "sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-errors": "^1.1.3", - "web3-types": "^1.3.0", - "web3-utils": "^4.0.7", - "web3-validator": "^2.0.3" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-eth-personal": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-4.1.0.tgz", - "integrity": "sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.6.0", - "web3-eth": "^4.9.0", - "web3-rpc-methods": "^1.3.0", - "web3-types": "^1.8.0", - "web3-utils": "^4.3.1", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-net": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-4.1.0.tgz", - "integrity": "sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.4.0", - "web3-rpc-methods": "^1.3.0", - "web3-types": "^1.6.0", - "web3-utils": "^4.3.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-providers-http": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-4.2.0.tgz", - "integrity": "sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==", - "license": "LGPL-3.0", - "dependencies": { - "cross-fetch": "^4.0.0", - "web3-errors": "^1.3.0", - "web3-types": "^1.7.0", - "web3-utils": "^4.3.1" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-providers-ipc": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-4.0.7.tgz", - "integrity": "sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-errors": "^1.1.3", - "web3-types": "^1.3.0", - "web3-utils": "^4.0.7" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-providers-ws": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-4.0.8.tgz", - "integrity": "sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==", - "license": "LGPL-3.0", - "dependencies": { - "@types/ws": "8.5.3", - "isomorphic-ws": "^5.0.0", - "web3-errors": "^1.2.0", - "web3-types": "^1.7.0", - "web3-utils": "^4.3.1", - "ws": "^8.17.1" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-rpc-methods": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.3.0.tgz", - "integrity": "sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "^4.4.0", - "web3-types": "^1.6.0", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-rpc-providers": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/web3-rpc-providers/-/web3-rpc-providers-1.0.0-rc.4.tgz", - "integrity": "sha512-PXosCqHW0EADrYzgmueNHP3Y5jcSmSwH+Dkqvn7EYD0T2jcsdDAIHqk6szBiwIdhumM7gv9Raprsu/s/f7h1fw==", - "license": "LGPL-3.0", - "dependencies": { - "web3-errors": "^1.3.1", - "web3-providers-http": "^4.2.0", - "web3-providers-ws": "^4.0.8", - "web3-types": "^1.10.0", - "web3-utils": "^4.3.3", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-types": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.10.0.tgz", - "integrity": "sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==", - "license": "LGPL-3.0", - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.3.3.tgz", - "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", - "license": "LGPL-3.0", - "dependencies": { - "ethereum-cryptography": "^2.0.0", - "eventemitter3": "^5.0.1", - "web3-errors": "^1.3.1", - "web3-types": "^1.10.0", - "web3-validator": "^2.0.6" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/web3-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-2.0.6.tgz", - "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", - "license": "LGPL-3.0", - "dependencies": { - "ethereum-cryptography": "^2.0.0", - "util": "^0.12.5", - "web3-errors": "^1.2.0", - "web3-types": "^1.6.0", - "zod": "^3.21.4" - }, - "engines": { - "node": ">=14", - "npm": ">=6.12.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, "node_modules/websocket-as-promised": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/websocket-as-promised/-/websocket-as-promised-3.0.1.tgz", @@ -5089,16 +2976,6 @@ "node": ">=10" } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5142,26 +3019,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wif": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", - "license": "MIT", - "dependencies": { - "bs58check": "<3.0.0" - } - }, - "node_modules/wif/node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "license": "MIT", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, "node_modules/workerpool": { "version": "9.3.4", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", @@ -5285,74 +3142,6 @@ } } }, - "node_modules/xrpl": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-2.13.0.tgz", - "integrity": "sha512-jIu9PuG3g+2NZQT8oGmOL3LFkH6Pp+OHS1FNbozEJkajuHAuoCEe2vVddjD8ME81kgV+xRFnXJ+EUbmQDdh/Xg==", - "license": "ISC", - "dependencies": { - "bignumber.js": "^9.0.0", - "bip32": "^2.0.6", - "bip39": "^3.0.4", - "https-proxy-agent": "^5.0.0", - "lodash": "^4.17.4", - "ripple-address-codec": "^4.3.1", - "ripple-binary-codec": "^1.10.0", - "ripple-keypairs": "^1.3.1", - "ws": "^8.2.2", - "xrpl-secret-numbers": "^0.3.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/xrpl-secret-numbers": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/xrpl-secret-numbers/-/xrpl-secret-numbers-0.3.5.tgz", - "integrity": "sha512-5W2Ijp4nFpplEJ4IEK8JNAnRN9+3/+8BdBQ0hOZ3bZfa/+K9c9GNdN5fHDkKoECJN3nzXNcj6/Ejg7wUQDtRnQ==", - "license": "MIT", - "dependencies": { - "@types/brorand": "^1.0.30", - "brorand": "^1.1.0", - "ripple-keypairs": "^2.0.0" - } - }, - "node_modules/xrpl-secret-numbers/node_modules/@scure/base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.2.0.tgz", - "integrity": "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/xrpl-secret-numbers/node_modules/ripple-address-codec": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-5.0.1.tgz", - "integrity": "sha512-JQHLKuVJV8lv9Qobmn4aUM2Dpv9WRRLKnNWfM8tN02fAbUtG8mUPsu9q9UYX8P76G4qzytEc5ZKMp/3JggNYmw==", - "license": "ISC", - "dependencies": { - "@scure/base": "^2.0.0", - "@xrplf/isomorphic": "^1.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/xrpl-secret-numbers/node_modules/ripple-keypairs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz", - "integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==", - "license": "ISC", - "dependencies": { - "@noble/curves": "^1.0.0", - "@xrplf/isomorphic": "^1.0.0", - "ripple-address-codec": "^5.0.0" - }, - "engines": { - "node": ">= 16" - } - }, "node_modules/xstate": { "version": "5.19.2", "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.19.2.tgz", @@ -5475,21 +3264,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zen-observable": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", - "license": "MIT" - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } From 9a8a6b58b5486cf07a27b19ffa54a70dcb8db541 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 6 Aug 2026 23:33:46 -0400 Subject: [PATCH 30/56] make CWC.Transactions create, sign, and getSighash all accept both bitcore-node and bitcore-lib style transactions --- .../src/transactions/btc/index.ts | 102 ++++++++++++------ 1 file changed, 67 insertions(+), 35 deletions(-) diff --git a/packages/crypto-wallet-core/src/transactions/btc/index.ts b/packages/crypto-wallet-core/src/transactions/btc/index.ts index e172e8ad8a..2543221442 100644 --- a/packages/crypto-wallet-core/src/transactions/btc/index.ts +++ b/packages/crypto-wallet-core/src/transactions/btc/index.ts @@ -16,42 +16,44 @@ export class BTCTxProvider { selectCoins( recipients: Array<{ amount: number }>, - utxos: Array<{ - value: number; - mintHeight: number; - txid?: string; - mintTxid?: string; - mintIndex?: number; - }>, + utxos: UtxoType[], fee: number ) { - utxos = utxos.sort(function(a, b) { - return a.mintHeight - b.mintHeight; - }); + // Only sort by block height if utxos are bitcore-node style + if (utxos[0].mintHeight != undefined) { + utxos = utxos.sort(function(a, b) { + return a.mintHeight - b.mintHeight; + }); + } let index = 0; let utxoSum = 0; const recepientSum = recipients.reduce((sum, cur) => sum + Number(cur.amount), fee || 0); while (utxoSum < recepientSum) { const utxo = utxos[index]; - utxoSum += Number(utxo.value); + utxoSum += Number(utxo.value ?? utxo.satoshis); index += 1; } const filteredUtxos = utxos.slice(0, index); return filteredUtxos; } - create({ recipients, utxos = [], change, feeRate, fee, isSweep, replaceByFee, lockUntilDate, lockUntilBlock }) { + create(params: { + recipients: Array<{ address: string; amount: number }>; + utxos: UtxoType[]; + change: string; + feeRate: number; + fee: number; + isSweep: boolean; + replaceByFee: boolean; + lockUntilDate: number; + lockUntilBlock: number; + }) { + const { recipients, utxos = [], change, feeRate, fee, isSweep, replaceByFee, lockUntilDate, lockUntilBlock } = params; const filteredUtxos = isSweep ? utxos : this.selectCoins(recipients, utxos, fee); - const btcUtxos = filteredUtxos.map(utxo => { - const btcUtxo = Object.assign({}, utxo, { - amount: utxo.value / 1e8, - txid: utxo.mintTxid, - outputIndex: utxo.mintIndex - }); - return new this.lib.Transaction.UnspentOutput(btcUtxo); - }); + const btcUtxos = utxos[0].mintTxid ? this.nodeToLibUtxos(filteredUtxos) : filteredUtxos; const tx = new this.lib.Transaction().from(btcUtxos); + if (fee) { tx.fee(fee); } @@ -62,7 +64,7 @@ export class BTCTxProvider { tx.change(change); } for (const recipient of recipients) { - tx.to(recipient.address, parseInt(recipient.amount)); + tx.to(recipient.address, parseInt(recipient.amount as any)); } if (replaceByFee && typeof tx.enableRBF === 'function') { tx.enableRBF(); @@ -133,7 +135,7 @@ export class BTCTxProvider { return bitcoreTx.hash; } - sign(params: { tx: string; keys: Array; utxos: any[]; pubkeys?: any[]; threshold?: number; opts: any }) { + sign(params: { tx: string; keys: Array; utxos: UtxoType[]; pubkeys?: any[]; threshold?: number; opts: any }) { const { tx, keys, pubkeys, threshold, opts } = params; const utxos = params.utxos || []; const bitcoreTx = new this.lib.Transaction(tx); @@ -152,17 +154,28 @@ export class BTCTxProvider { return signedTx; } - getRelatedUtxos({ outputs, utxos }) { + /** + * Converts the utxos in a bitcore-nodes database to bitcore lib utxos + * + * @param utxos bitcore-node style utxos + * @returns lib style utxos + */ + nodeToLibUtxos(utxos: NodeUtxoType[]): BitcoreLib.Transaction.UnspentOutput[] { + return utxos.map(utxo => new this.lib.Transaction.UnspentOutput({ + satoshis: utxo.value, + // bitcore-node utxos have both mintTxid and spentTxid + txid: utxo.mintTxid, + outputIndex: utxo.mintIndex, + script: utxo.script, + address: utxo.address + })); + } + + getRelatedUtxos(params: { outputs: any[]; utxos: UtxoType[] }) { + const { outputs, utxos } = params; const txids = outputs.map(output => output.toObject().prevTxId); const applicableUtxos = utxos.filter(utxo => txids.includes(utxo.txid || utxo.mintTxid)); - return applicableUtxos.map(utxo => { - const btcUtxo = Object.assign({}, utxo, { - amount: utxo.value / Math.pow(10, 8), - txid: utxo.mintTxid, - outputIndex: utxo.mintIndex - }); - return new this.lib.Transaction.UnspentOutput(btcUtxo); - }); + return utxos[0].mintTxid == undefined ? applicableUtxos : this.nodeToLibUtxos(applicableUtxos); } getOutputsFromTx({ tx }) { @@ -172,7 +185,8 @@ export class BTCTxProvider { }); } - getSigningAddresses({ tx, utxos }): string[] { + getSigningAddresses(params: { tx: string | BitcoreLib.Transaction; utxos: UtxoType[] }): string[] { + const { tx, utxos } = params; const bitcoreTx = new this.lib.Transaction(tx); const applicableUtxos = this.getRelatedUtxos({ outputs: bitcoreTx.inputs, @@ -184,7 +198,7 @@ export class BTCTxProvider { getSighash(params: { tx: string | BitcoreLib.Transaction; index: number; - utxos?: BitcoreLib.Transaction.UnspentOutput[]; + utxos?: UtxoType[]; pubKey?: string | BitcoreLib.PublicKey | BitcoreLib.HDPublicKey; path?: string; sigtype?: number; @@ -204,7 +218,7 @@ export class BTCTxProvider { tx = new this.lib.Transaction(tx); } if (utxos) { - tx.associateInputs(utxos.map(this.lib.Transaction.UnspentOutput), pubKeys, threshold, opts); + tx.associateInputs(utxos[0].mintTxid ? this.nodeToLibUtxos(utxos) : utxos, pubKeys, threshold, opts); } $.checkState(tx.inputs[index].output instanceof this.lib.Transaction.Output, 'Input must have all utxo info'); @@ -224,4 +238,22 @@ export class BTCTxProvider { } } -type SignatureType = BitcoreLib.Transaction.Signature | BitcoreLib.crypto.Signature | TssSig; \ No newline at end of file +type SignatureType = BitcoreLib.Transaction.Signature | BitcoreLib.crypto.Signature | TssSig; +// bitcore-node style utxo minus values that are not used +type NodeUtxoType = { + // network: string; + // chain: string; + mintTxid: string; + mintIndex: number; + mintHeight: number; + // coinbase: boolean; + value: number; + address: string; + script: string; + // spentTxid: string; + // spentHeight?: number; + // confirmations?: number; + // sequenceNumber?: number; +} +// utxo type recieved externaly from this class that could either be from bitcore-node or already a lib utxo +type UtxoType = NodeUtxoType | BitcoreLib.Transaction.UnspentOutput; From 1cb66172cb2627703b1c3e2067ca4f913115ede6 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Fri, 7 Aug 2026 10:29:00 -0400 Subject: [PATCH 31/56] apply node lib utxo conversion to bch, ltc, and doge --- .../crypto-wallet-core/src/transactions/bch/index.ts | 9 +-------- .../crypto-wallet-core/src/transactions/doge/index.ts | 9 +-------- .../crypto-wallet-core/src/transactions/ltc/index.ts | 9 +-------- 3 files changed, 3 insertions(+), 24 deletions(-) diff --git a/packages/crypto-wallet-core/src/transactions/bch/index.ts b/packages/crypto-wallet-core/src/transactions/bch/index.ts index fdb3314ab3..f83ebb968f 100644 --- a/packages/crypto-wallet-core/src/transactions/bch/index.ts +++ b/packages/crypto-wallet-core/src/transactions/bch/index.ts @@ -5,14 +5,7 @@ export class BCHTxProvider extends BTCTxProvider { lib = BitcoreLibCash; create({ recipients, utxos = [], change, fee = 20000, isSweep }) { const filteredUtxos = isSweep ? utxos : this.selectCoins(recipients, utxos, fee); - const btcUtxos = filteredUtxos.map(utxo => { - const btcUtxo = Object.assign({}, utxo, { - amount: utxo.value / 1e8, - txid: utxo.mintTxid, - outputIndex: utxo.mintIndex - }); - return new this.lib.Transaction.UnspentOutput(btcUtxo); - }); + const btcUtxos = filteredUtxos[0].mintTxid == undefined ? filteredUtxos : this.nodeToLibUtxos(filteredUtxos); const tx = new this.lib.Transaction().from(btcUtxos).feePerByte(Number(fee) + 2); if (change) { tx.change(change); diff --git a/packages/crypto-wallet-core/src/transactions/doge/index.ts b/packages/crypto-wallet-core/src/transactions/doge/index.ts index b4e9728005..d6510ea399 100644 --- a/packages/crypto-wallet-core/src/transactions/doge/index.ts +++ b/packages/crypto-wallet-core/src/transactions/doge/index.ts @@ -5,14 +5,7 @@ export class DOGETxProvider extends BTCTxProvider { lib = BitcoreLibDoge; create({ recipients, utxos = [], change, feeRate, fee = 20000 }) { const filteredUtxos = this.selectCoins(recipients, utxos, fee); - const btcUtxos = filteredUtxos.map(utxo => { - const btcUtxo = Object.assign({}, utxo, { - amount: utxo.value / 1e8, - txid: utxo.mintTxid, - outputIndex: utxo.mintIndex - }); - return new this.lib.Transaction.UnspentOutput(btcUtxo); - }); + const btcUtxos = filteredUtxos[0].mintTxid == undefined ? filteredUtxos : this.nodeToLibUtxos(filteredUtxos); const tx = new this.lib.Transaction().from(btcUtxos); if (fee) { tx.fee(fee); diff --git a/packages/crypto-wallet-core/src/transactions/ltc/index.ts b/packages/crypto-wallet-core/src/transactions/ltc/index.ts index 41cd1a5ef8..653a037937 100644 --- a/packages/crypto-wallet-core/src/transactions/ltc/index.ts +++ b/packages/crypto-wallet-core/src/transactions/ltc/index.ts @@ -5,14 +5,7 @@ export class LTCTxProvider extends BTCTxProvider { lib = BitcoreLibLtc; create({ recipients, utxos = [], change, feeRate, fee = 20000 }) { const filteredUtxos = this.selectCoins(recipients, utxos, fee); - const btcUtxos = filteredUtxos.map(utxo => { - const btcUtxo = Object.assign({}, utxo, { - amount: utxo.value / 1e8, - txid: utxo.mintTxid, - outputIndex: utxo.mintIndex - }); - return new this.lib.Transaction.UnspentOutput(btcUtxo); - }); + const btcUtxos = filteredUtxos[0].mintTxid == undefined ? filteredUtxos : this.nodeToLibUtxos(filteredUtxos); const tx = new this.lib.Transaction().from(btcUtxos); if (fee) { tx.fee(fee); From 01c55ff006abdd5cf665bd613f8a6eb170590e18 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Fri, 7 Aug 2026 12:32:57 -0400 Subject: [PATCH 32/56] standardize utxo type differentiation with isNodeUtxo --- .../src/transactions/bch/index.ts | 2 +- .../src/transactions/btc/index.ts | 19 ++++++++++++++----- .../src/transactions/doge/index.ts | 2 +- .../src/transactions/ltc/index.ts | 2 +- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/crypto-wallet-core/src/transactions/bch/index.ts b/packages/crypto-wallet-core/src/transactions/bch/index.ts index f83ebb968f..42cae047c5 100644 --- a/packages/crypto-wallet-core/src/transactions/bch/index.ts +++ b/packages/crypto-wallet-core/src/transactions/bch/index.ts @@ -5,7 +5,7 @@ export class BCHTxProvider extends BTCTxProvider { lib = BitcoreLibCash; create({ recipients, utxos = [], change, fee = 20000, isSweep }) { const filteredUtxos = isSweep ? utxos : this.selectCoins(recipients, utxos, fee); - const btcUtxos = filteredUtxos[0].mintTxid == undefined ? filteredUtxos : this.nodeToLibUtxos(filteredUtxos); + const btcUtxos = this.isNodeUtxo(filteredUtxos[0]) ? this.nodeToLibUtxos(filteredUtxos) : filteredUtxos; const tx = new this.lib.Transaction().from(btcUtxos).feePerByte(Number(fee) + 2); if (change) { tx.change(change); diff --git a/packages/crypto-wallet-core/src/transactions/btc/index.ts b/packages/crypto-wallet-core/src/transactions/btc/index.ts index 2543221442..641caaea12 100644 --- a/packages/crypto-wallet-core/src/transactions/btc/index.ts +++ b/packages/crypto-wallet-core/src/transactions/btc/index.ts @@ -20,7 +20,7 @@ export class BTCTxProvider { fee: number ) { // Only sort by block height if utxos are bitcore-node style - if (utxos[0].mintHeight != undefined) { + if (this.isNodeUtxo(utxos[0])) { utxos = utxos.sort(function(a, b) { return a.mintHeight - b.mintHeight; }); @@ -51,9 +51,8 @@ export class BTCTxProvider { }) { const { recipients, utxos = [], change, feeRate, fee, isSweep, replaceByFee, lockUntilDate, lockUntilBlock } = params; const filteredUtxos = isSweep ? utxos : this.selectCoins(recipients, utxos, fee); - const btcUtxos = utxos[0].mintTxid ? this.nodeToLibUtxos(filteredUtxos) : filteredUtxos; + const btcUtxos = this.isNodeUtxo(utxos[0]) ? this.nodeToLibUtxos(filteredUtxos) : filteredUtxos; const tx = new this.lib.Transaction().from(btcUtxos); - if (fee) { tx.fee(fee); } @@ -171,11 +170,21 @@ export class BTCTxProvider { })); } + /** + * Return true if utxo is a bitcore-node utxo + * + * @param utxo either a bitcore-lib or bitcore-node utxo + * @returns true if node utxo + */ + isNodeUtxo(utxo: UtxoType): boolean { + return utxo.mintTxid != undefined; + } + getRelatedUtxos(params: { outputs: any[]; utxos: UtxoType[] }) { const { outputs, utxos } = params; const txids = outputs.map(output => output.toObject().prevTxId); const applicableUtxos = utxos.filter(utxo => txids.includes(utxo.txid || utxo.mintTxid)); - return utxos[0].mintTxid == undefined ? applicableUtxos : this.nodeToLibUtxos(applicableUtxos); + return this.isNodeUtxo(utxos[0]) ? this.nodeToLibUtxos(applicableUtxos) : applicableUtxos; } getOutputsFromTx({ tx }) { @@ -218,7 +227,7 @@ export class BTCTxProvider { tx = new this.lib.Transaction(tx); } if (utxos) { - tx.associateInputs(utxos[0].mintTxid ? this.nodeToLibUtxos(utxos) : utxos, pubKeys, threshold, opts); + tx.associateInputs(this.isNodeUtxo(utxos[0]) ? this.nodeToLibUtxos(utxos) : utxos, pubKeys, threshold, opts); } $.checkState(tx.inputs[index].output instanceof this.lib.Transaction.Output, 'Input must have all utxo info'); diff --git a/packages/crypto-wallet-core/src/transactions/doge/index.ts b/packages/crypto-wallet-core/src/transactions/doge/index.ts index d6510ea399..a53c4043cf 100644 --- a/packages/crypto-wallet-core/src/transactions/doge/index.ts +++ b/packages/crypto-wallet-core/src/transactions/doge/index.ts @@ -5,7 +5,7 @@ export class DOGETxProvider extends BTCTxProvider { lib = BitcoreLibDoge; create({ recipients, utxos = [], change, feeRate, fee = 20000 }) { const filteredUtxos = this.selectCoins(recipients, utxos, fee); - const btcUtxos = filteredUtxos[0].mintTxid == undefined ? filteredUtxos : this.nodeToLibUtxos(filteredUtxos); + const btcUtxos = this.isNodeUtxo(filteredUtxos[0]) ? this.nodeToLibUtxos(filteredUtxos) : filteredUtxos; const tx = new this.lib.Transaction().from(btcUtxos); if (fee) { tx.fee(fee); diff --git a/packages/crypto-wallet-core/src/transactions/ltc/index.ts b/packages/crypto-wallet-core/src/transactions/ltc/index.ts index 653a037937..1c28dd3fdb 100644 --- a/packages/crypto-wallet-core/src/transactions/ltc/index.ts +++ b/packages/crypto-wallet-core/src/transactions/ltc/index.ts @@ -5,7 +5,7 @@ export class LTCTxProvider extends BTCTxProvider { lib = BitcoreLibLtc; create({ recipients, utxos = [], change, feeRate, fee = 20000 }) { const filteredUtxos = this.selectCoins(recipients, utxos, fee); - const btcUtxos = filteredUtxos[0].mintTxid == undefined ? filteredUtxos : this.nodeToLibUtxos(filteredUtxos); + const btcUtxos = this.isNodeUtxo(filteredUtxos[0]) ? this.nodeToLibUtxos(filteredUtxos) : filteredUtxos; const tx = new this.lib.Transaction().from(btcUtxos); if (fee) { tx.fee(fee); From b72064e92a14c0234b4993ff8e625bcfece5cf63 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Fri, 7 Aug 2026 15:17:07 -0400 Subject: [PATCH 33/56] refactored CWC.Transactions utxo handling with standard and external utxo types --- .../src/transactions/bch/index.ts | 2 +- .../src/transactions/btc/index.ts | 120 ++++++++++-------- .../src/transactions/doge/index.ts | 2 +- .../src/transactions/ltc/index.ts | 2 +- 4 files changed, 68 insertions(+), 58 deletions(-) diff --git a/packages/crypto-wallet-core/src/transactions/bch/index.ts b/packages/crypto-wallet-core/src/transactions/bch/index.ts index 42cae047c5..d89fca223b 100644 --- a/packages/crypto-wallet-core/src/transactions/bch/index.ts +++ b/packages/crypto-wallet-core/src/transactions/bch/index.ts @@ -5,7 +5,7 @@ export class BCHTxProvider extends BTCTxProvider { lib = BitcoreLibCash; create({ recipients, utxos = [], change, fee = 20000, isSweep }) { const filteredUtxos = isSweep ? utxos : this.selectCoins(recipients, utxos, fee); - const btcUtxos = this.isNodeUtxo(filteredUtxos[0]) ? this.nodeToLibUtxos(filteredUtxos) : filteredUtxos; + const btcUtxos = filteredUtxos.map(this.standardizeUtxo); const tx = new this.lib.Transaction().from(btcUtxos).feePerByte(Number(fee) + 2); if (change) { tx.change(change); diff --git a/packages/crypto-wallet-core/src/transactions/btc/index.ts b/packages/crypto-wallet-core/src/transactions/btc/index.ts index 641caaea12..802e367589 100644 --- a/packages/crypto-wallet-core/src/transactions/btc/index.ts +++ b/packages/crypto-wallet-core/src/transactions/btc/index.ts @@ -16,11 +16,11 @@ export class BTCTxProvider { selectCoins( recipients: Array<{ amount: number }>, - utxos: UtxoType[], + utxos: UtxoTypeE[], fee: number - ) { + ): UtxoTypeE[] { // Only sort by block height if utxos are bitcore-node style - if (this.isNodeUtxo(utxos[0])) { + if (utxos[0].mintHeight != undefined) { utxos = utxos.sort(function(a, b) { return a.mintHeight - b.mintHeight; }); @@ -38,9 +38,28 @@ export class BTCTxProvider { return filteredUtxos; } + + /** + * Standardize utxo for internal funcionality. + * Accepts either bitcore-node or lib (bitcore-lib, bitcore-lib-cash, etc.). + * Handles both lib style utxos: UnspentOutput properties and UnspentOutput.toObject properties. + * + * @param utxos either a bitcore-node or lib utxo + * @returns utxo in the standard, internaly used format + */ + standardizeUtxo(utxo: UtxoTypeE): UtxoTypeS { + return { + satoshis: utxo.satoshis ?? utxo.value ?? (utxo.amount != undefined ? this.lib.Unit.fromSatoshis(utxo.amount) : undefined), + txId: utxo.txId ?? utxo.mintTxid ?? utxo.txid, + outputIndex: utxo.outputIndex ?? utxo.mintIndex ?? utxo.vout, + script: typeof utxo.script === 'string' ? utxo.script : utxo.script.toString() ?? utxo.scriptPubkey, + address: typeof utxo.address === 'string' ? utxo.address : utxo.address.toString() + }; + } + create(params: { recipients: Array<{ address: string; amount: number }>; - utxos: UtxoType[]; + utxos: UtxoTypeE[]; change: string; feeRate: number; fee: number; @@ -51,7 +70,7 @@ export class BTCTxProvider { }) { const { recipients, utxos = [], change, feeRate, fee, isSweep, replaceByFee, lockUntilDate, lockUntilBlock } = params; const filteredUtxos = isSweep ? utxos : this.selectCoins(recipients, utxos, fee); - const btcUtxos = this.isNodeUtxo(utxos[0]) ? this.nodeToLibUtxos(filteredUtxos) : filteredUtxos; + const btcUtxos = filteredUtxos.map(this.standardizeUtxo); const tx = new this.lib.Transaction().from(btcUtxos); if (fee) { tx.fee(fee); @@ -134,15 +153,23 @@ export class BTCTxProvider { return bitcoreTx.hash; } - sign(params: { tx: string; keys: Array; utxos: UtxoType[]; pubkeys?: any[]; threshold?: number; opts: any }) { + sign(params: { + tx: string; + keys: Array; + utxos: UtxoTypeE[]; + pubkeys?: any[]; + threshold?: number; + opts: any; + }) { const { tx, keys, pubkeys, threshold, opts } = params; const utxos = params.utxos || []; const bitcoreTx = new this.lib.Transaction(tx); + const btcUtxos = utxos.map(this.standardizeUtxo); const applicableUtxos = this.getRelatedUtxos({ outputs: bitcoreTx.inputs, - utxos + utxos: btcUtxos }); - bitcoreTx.associateInputs(applicableUtxos, pubkeys, threshold, opts); + bitcoreTx.associateInputs(applicableUtxos.map(this.lib.Transaction.UnspentOutput), pubkeys, threshold, opts); const uniqePrivKeys = Object.values(keys.reduce((map, key) => { // Need to preserve (un)compressed property, so don't use key.privKey.toString(); const pk = new this.lib.PrivateKey(key.privKey); @@ -153,38 +180,13 @@ export class BTCTxProvider { return signedTx; } - /** - * Converts the utxos in a bitcore-nodes database to bitcore lib utxos - * - * @param utxos bitcore-node style utxos - * @returns lib style utxos - */ - nodeToLibUtxos(utxos: NodeUtxoType[]): BitcoreLib.Transaction.UnspentOutput[] { - return utxos.map(utxo => new this.lib.Transaction.UnspentOutput({ - satoshis: utxo.value, - // bitcore-node utxos have both mintTxid and spentTxid - txid: utxo.mintTxid, - outputIndex: utxo.mintIndex, - script: utxo.script, - address: utxo.address - })); - } - - /** - * Return true if utxo is a bitcore-node utxo - * - * @param utxo either a bitcore-lib or bitcore-node utxo - * @returns true if node utxo - */ - isNodeUtxo(utxo: UtxoType): boolean { - return utxo.mintTxid != undefined; - } - - getRelatedUtxos(params: { outputs: any[]; utxos: UtxoType[] }) { + getRelatedUtxos(params: { + outputs: BitcoreLib.Transaction.Input[]; + utxos: UtxoTypeS[]; + }): UtxoTypeS[] { const { outputs, utxos } = params; const txids = outputs.map(output => output.toObject().prevTxId); - const applicableUtxos = utxos.filter(utxo => txids.includes(utxo.txid || utxo.mintTxid)); - return this.isNodeUtxo(utxos[0]) ? this.nodeToLibUtxos(applicableUtxos) : applicableUtxos; + return utxos.filter(utxo => txids.includes(utxo.txId)); } getOutputsFromTx({ tx }) { @@ -194,12 +196,13 @@ export class BTCTxProvider { }); } - getSigningAddresses(params: { tx: string | BitcoreLib.Transaction; utxos: UtxoType[] }): string[] { + getSigningAddresses(params: { tx: string | BitcoreLib.Transaction; utxos: UtxoTypeE[] }): string[] { const { tx, utxos } = params; const bitcoreTx = new this.lib.Transaction(tx); + const btcUtxos = utxos.map(this.standardizeUtxo); const applicableUtxos = this.getRelatedUtxos({ outputs: bitcoreTx.inputs, - utxos + utxos: btcUtxos }); return applicableUtxos.map(utxo => utxo.address); } @@ -207,7 +210,7 @@ export class BTCTxProvider { getSighash(params: { tx: string | BitcoreLib.Transaction; index: number; - utxos?: UtxoType[]; + utxos?: UtxoTypeE[]; pubKey?: string | BitcoreLib.PublicKey | BitcoreLib.HDPublicKey; path?: string; sigtype?: number; @@ -227,7 +230,8 @@ export class BTCTxProvider { tx = new this.lib.Transaction(tx); } if (utxos) { - tx.associateInputs(this.isNodeUtxo(utxos[0]) ? this.nodeToLibUtxos(utxos) : utxos, pubKeys, threshold, opts); + const btcUtxos = utxos.map(this.standardizeUtxo); + tx.associateInputs(btcUtxos.map(this.lib.Transaction.UnspentOutput), pubKeys, threshold, opts); } $.checkState(tx.inputs[index].output instanceof this.lib.Transaction.Output, 'Input must have all utxo info'); @@ -248,21 +252,27 @@ export class BTCTxProvider { } type SignatureType = BitcoreLib.Transaction.Signature | BitcoreLib.crypto.Signature | TssSig; -// bitcore-node style utxo minus values that are not used -type NodeUtxoType = { - // network: string; - // chain: string; + +// Standard utxo. Used internaly. +type UtxoTypeS = { + txId: string; + outputIndex: number; + satoshis: number; + address: string; + script: string; +} +// Externaly recieved utxo. Could either be node (bitcore-node) or lib (bitcore-lib, bitcore-lib-cash etc.) type. +type UtxoTypeE = UtxoTypeS & { + // node specific properties mintTxid: string; mintIndex: number; mintHeight: number; - // coinbase: boolean; value: number; - address: string; - script: string; - // spentTxid: string; - // spentHeight?: number; - // confirmations?: number; - // sequenceNumber?: number; + script: string | BitcoreLib.Address; + address: string | BitcoreLib.Script; + // UnspentOutput.toObject specific properties + txid: string; + amount: number; + vout: number; + scriptPubkey: string; } -// utxo type recieved externaly from this class that could either be from bitcore-node or already a lib utxo -type UtxoType = NodeUtxoType | BitcoreLib.Transaction.UnspentOutput; diff --git a/packages/crypto-wallet-core/src/transactions/doge/index.ts b/packages/crypto-wallet-core/src/transactions/doge/index.ts index a53c4043cf..4b5635f3cf 100644 --- a/packages/crypto-wallet-core/src/transactions/doge/index.ts +++ b/packages/crypto-wallet-core/src/transactions/doge/index.ts @@ -5,7 +5,7 @@ export class DOGETxProvider extends BTCTxProvider { lib = BitcoreLibDoge; create({ recipients, utxos = [], change, feeRate, fee = 20000 }) { const filteredUtxos = this.selectCoins(recipients, utxos, fee); - const btcUtxos = this.isNodeUtxo(filteredUtxos[0]) ? this.nodeToLibUtxos(filteredUtxos) : filteredUtxos; + const btcUtxos = filteredUtxos.map(this.standardizeUtxo); const tx = new this.lib.Transaction().from(btcUtxos); if (fee) { tx.fee(fee); diff --git a/packages/crypto-wallet-core/src/transactions/ltc/index.ts b/packages/crypto-wallet-core/src/transactions/ltc/index.ts index 1c28dd3fdb..9bf5595740 100644 --- a/packages/crypto-wallet-core/src/transactions/ltc/index.ts +++ b/packages/crypto-wallet-core/src/transactions/ltc/index.ts @@ -5,7 +5,7 @@ export class LTCTxProvider extends BTCTxProvider { lib = BitcoreLibLtc; create({ recipients, utxos = [], change, feeRate, fee = 20000 }) { const filteredUtxos = this.selectCoins(recipients, utxos, fee); - const btcUtxos = this.isNodeUtxo(filteredUtxos[0]) ? this.nodeToLibUtxos(filteredUtxos) : filteredUtxos; + const btcUtxos = filteredUtxos.map(this.standardizeUtxo); const tx = new this.lib.Transaction().from(btcUtxos); if (fee) { tx.fee(fee); From c4348d79cd909fc2d8093ed4f2d4e7ba615567e0 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 10 Aug 2026 15:20:50 -0400 Subject: [PATCH 34/56] utxo CWC.Transactions: improved utxo types, multiple bug fixes, and consistent typing --- .../src/transactions/bch/index.ts | 17 ++- .../src/transactions/btc/index.ts | 137 ++++++++++-------- .../src/transactions/doge/index.ts | 17 ++- .../src/transactions/ltc/index.ts | 17 ++- 4 files changed, 116 insertions(+), 72 deletions(-) diff --git a/packages/crypto-wallet-core/src/transactions/bch/index.ts b/packages/crypto-wallet-core/src/transactions/bch/index.ts index d89fca223b..b1d7740035 100644 --- a/packages/crypto-wallet-core/src/transactions/bch/index.ts +++ b/packages/crypto-wallet-core/src/transactions/bch/index.ts @@ -1,17 +1,24 @@ import BitcoreLibCash from '@bitpay-labs/bitcore-lib-cash'; -import { BTCTxProvider } from '../btc'; +import { BTCTxProvider, EveryUtxoType } from '../btc'; export class BCHTxProvider extends BTCTxProvider { lib = BitcoreLibCash; - create({ recipients, utxos = [], change, fee = 20000, isSweep }) { - const filteredUtxos = isSweep ? utxos : this.selectCoins(recipients, utxos, fee); - const btcUtxos = filteredUtxos.map(this.standardizeUtxo); + create(params: { + recipients: Array<{ address: string; amount: number }>; + utxos?: EveryUtxoType[]; + change?: string; + fee?: number | string; + isSweep?: boolean; + }): string { + const { recipients, utxos = [], change, fee = 20000, isSweep } = params; + const filteredUtxos = isSweep ? utxos : this.selectCoins(recipients, utxos, Number(fee)); + const btcUtxos = filteredUtxos.map(utxo => this.standardizeUtxo(utxo)); const tx = new this.lib.Transaction().from(btcUtxos).feePerByte(Number(fee) + 2); if (change) { tx.change(change); } for (const recipient of recipients) { - tx.to(recipient.address, parseInt(recipient.amount)); + tx.to(recipient.address, Number(recipient.amount)); } return tx.uncheckedSerialize(); } diff --git a/packages/crypto-wallet-core/src/transactions/btc/index.ts b/packages/crypto-wallet-core/src/transactions/btc/index.ts index 802e367589..f279a200ea 100644 --- a/packages/crypto-wallet-core/src/transactions/btc/index.ts +++ b/packages/crypto-wallet-core/src/transactions/btc/index.ts @@ -15,12 +15,12 @@ export class BTCTxProvider { lib = BitcoreLib; selectCoins( - recipients: Array<{ amount: number }>, - utxos: UtxoTypeE[], - fee: number - ): UtxoTypeE[] { + recipients: Array<{ amount: number | string }>, + utxos: EveryUtxoType[], + fee?: number + ): EveryUtxoType[] { // Only sort by block height if utxos are bitcore-node style - if (utxos[0].mintHeight != undefined) { + if (utxos.length > 0 && utxos[0].mintHeight != undefined) { utxos = utxos.sort(function(a, b) { return a.mintHeight - b.mintHeight; }); @@ -30,47 +30,47 @@ export class BTCTxProvider { let utxoSum = 0; const recepientSum = recipients.reduce((sum, cur) => sum + Number(cur.amount), fee || 0); while (utxoSum < recepientSum) { + assert(index < utxos.length, 'insufficient funds'); const utxo = utxos[index]; - utxoSum += Number(utxo.value ?? utxo.satoshis); + utxoSum += Number(utxo.value ?? utxo.satoshis ?? this.lib.Unit.fromBTC(utxo.amount).toSatoshis()); index += 1; } const filteredUtxos = utxos.slice(0, index); return filteredUtxos; } - /** * Standardize utxo for internal funcionality. - * Accepts either bitcore-node or lib (bitcore-lib, bitcore-lib-cash, etc.). + * Accepts either a bitcore-node or a lib (bitcore-lib, bitcore-lib-cash, etc.) utxo. * Handles both lib style utxos: UnspentOutput properties and UnspentOutput.toObject properties. - * + * * @param utxos either a bitcore-node or lib utxo * @returns utxo in the standard, internaly used format */ - standardizeUtxo(utxo: UtxoTypeE): UtxoTypeS { + standardizeUtxo(utxo: EveryUtxoType): UtxoType { return { - satoshis: utxo.satoshis ?? utxo.value ?? (utxo.amount != undefined ? this.lib.Unit.fromSatoshis(utxo.amount) : undefined), + satoshis: Number(utxo.satoshis ?? utxo.value ?? this.lib.Unit.fromBTC(utxo.amount ?? 0).toSatoshis()), txId: utxo.txId ?? utxo.mintTxid ?? utxo.txid, - outputIndex: utxo.outputIndex ?? utxo.mintIndex ?? utxo.vout, - script: typeof utxo.script === 'string' ? utxo.script : utxo.script.toString() ?? utxo.scriptPubkey, - address: typeof utxo.address === 'string' ? utxo.address : utxo.address.toString() + outputIndex: Number(utxo.outputIndex ?? utxo.mintIndex ?? utxo.vout ?? 0), + script: utxo.scriptPubKey ?? new this.lib.Script(utxo.script).toHex(), + address: utxo.address != undefined ? new this.lib.Address(utxo.address).toString() : undefined }; } create(params: { - recipients: Array<{ address: string; amount: number }>; - utxos: UtxoTypeE[]; - change: string; - feeRate: number; - fee: number; - isSweep: boolean; - replaceByFee: boolean; - lockUntilDate: number; - lockUntilBlock: number; - }) { + recipients: Array<{ address: string; amount: number | string }>; + utxos?: EveryUtxoType[]; + change?: string; + feeRate?: number | string; + fee?: number | string; + isSweep?: boolean; + replaceByFee?: boolean; + lockUntilDate?: number; + lockUntilBlock?: number; + }): string { const { recipients, utxos = [], change, feeRate, fee, isSweep, replaceByFee, lockUntilDate, lockUntilBlock } = params; - const filteredUtxos = isSweep ? utxos : this.selectCoins(recipients, utxos, fee); - const btcUtxos = filteredUtxos.map(this.standardizeUtxo); + const filteredUtxos = isSweep ? utxos : this.selectCoins(recipients, utxos, Number(fee)); + const btcUtxos = filteredUtxos.map(utxo => this.standardizeUtxo(utxo)); const tx = new this.lib.Transaction().from(btcUtxos); if (fee) { tx.fee(fee); @@ -82,7 +82,7 @@ export class BTCTxProvider { tx.change(change); } for (const recipient of recipients) { - tx.to(recipient.address, parseInt(recipient.amount as any)); + tx.to(recipient.address, Number(recipient.amount)); } if (replaceByFee && typeof tx.enableRBF === 'function') { tx.enableRBF(); @@ -99,7 +99,7 @@ export class BTCTxProvider { throw new Error('function getSignature not implemented for UTXO coins'); } - transformSignatureObject(params: { obj: any; sigtype?: number }) { + transformSignatureObject(params: { obj: any; sigtype?: number }): string { const { obj, sigtype } = params; const { v } = obj; let { r, s, i, nhashtype } = obj; @@ -127,7 +127,12 @@ export class BTCTxProvider { return new this.lib.crypto.Signature({ r, s, i, nhashtype }).toString(); } - applySignature(params: { tx: BitcoreLib.Transaction; signature: SignatureType; index: number; sigtype?: number }) { + applySignature(params: { + tx: BitcoreLib.Transaction; + signature: SignatureType; + index: number; + sigtype?: number; + }): BitcoreLib.Transaction { const { index, sigtype, tx } = params; let { signature } = params; assert(tx instanceof this.lib.Transaction, 'tx must be an instance of Transaction'); @@ -148,28 +153,28 @@ export class BTCTxProvider { return tx; } - getHash(params: { tx: string }) { + getHash(params: { tx: TransactionType }): string { const bitcoreTx = new this.lib.Transaction(params.tx); return bitcoreTx.hash; } sign(params: { - tx: string; - keys: Array; - utxos: UtxoTypeE[]; + tx: TransactionType; + keys: Key[]; + utxos: EveryUtxoType[]; pubkeys?: any[]; threshold?: number; opts: any; - }) { + }): string { const { tx, keys, pubkeys, threshold, opts } = params; const utxos = params.utxos || []; const bitcoreTx = new this.lib.Transaction(tx); - const btcUtxos = utxos.map(this.standardizeUtxo); + const btcUtxos = utxos.map(utxo => this.standardizeUtxo(utxo)); const applicableUtxos = this.getRelatedUtxos({ outputs: bitcoreTx.inputs, utxos: btcUtxos }); - bitcoreTx.associateInputs(applicableUtxos.map(this.lib.Transaction.UnspentOutput), pubkeys, threshold, opts); + bitcoreTx.associateInputs(applicableUtxos.map(utxo => new this.lib.Transaction.UnspentOutput(utxo)), pubkeys, threshold, opts); const uniqePrivKeys = Object.values(keys.reduce((map, key) => { // Need to preserve (un)compressed property, so don't use key.privKey.toString(); const pk = new this.lib.PrivateKey(key.privKey); @@ -182,24 +187,29 @@ export class BTCTxProvider { getRelatedUtxos(params: { outputs: BitcoreLib.Transaction.Input[]; - utxos: UtxoTypeS[]; - }): UtxoTypeS[] { + utxos: UtxoType[]; + }): UtxoType[] { const { outputs, utxos } = params; const txids = outputs.map(output => output.toObject().prevTxId); return utxos.filter(utxo => txids.includes(utxo.txId)); } - getOutputsFromTx({ tx }) { - return tx.outputs.map(({ script, satoshis }) => { + getOutputsFromTx(params: { + tx: BitcoreLib.Transaction; + }): Array<{ address: string | BitcoreLib.Script; satoshis: number }> { + return params.tx.outputs.map(({ script, satoshis }) => { const address = script; return { address, satoshis }; }); } - getSigningAddresses(params: { tx: string | BitcoreLib.Transaction; utxos: UtxoTypeE[] }): string[] { + getSigningAddresses(params: { + tx: TransactionType; + utxos: EveryUtxoType[]; + }): (string | undefined)[] { const { tx, utxos } = params; const bitcoreTx = new this.lib.Transaction(tx); - const btcUtxos = utxos.map(this.standardizeUtxo); + const btcUtxos = utxos.map(utxo => this.standardizeUtxo(utxo)); const applicableUtxos = this.getRelatedUtxos({ outputs: bitcoreTx.inputs, utxos: btcUtxos @@ -208,9 +218,9 @@ export class BTCTxProvider { } getSighash(params: { - tx: string | BitcoreLib.Transaction; + tx: TransactionType; index: number; - utxos?: UtxoTypeE[]; + utxos?: EveryUtxoType[]; pubKey?: string | BitcoreLib.PublicKey | BitcoreLib.HDPublicKey; path?: string; sigtype?: number; @@ -230,8 +240,8 @@ export class BTCTxProvider { tx = new this.lib.Transaction(tx); } if (utxos) { - const btcUtxos = utxos.map(this.standardizeUtxo); - tx.associateInputs(btcUtxos.map(this.lib.Transaction.UnspentOutput), pubKeys, threshold, opts); + const btcUtxos = utxos.map(utxo => this.standardizeUtxo(utxo)); + tx.associateInputs(btcUtxos.map(utxo => new this.lib.Transaction.UnspentOutput(utxo)), pubKeys, threshold, opts); } $.checkState(tx.inputs[index].output instanceof this.lib.Transaction.Output, 'Input must have all utxo info'); @@ -253,26 +263,39 @@ export class BTCTxProvider { type SignatureType = BitcoreLib.Transaction.Signature | BitcoreLib.crypto.Signature | TssSig; -// Standard utxo. Used internaly. -type UtxoTypeS = { +/** Transaction data that can be converted into a Transaction via Transaction(tx) */ +type TransactionType = BitcoreLib.Transaction | string | Buffer | object; + +/** + * Standard utxo type use for internal processing. + * Property names are from bitcore-lib's UnspentOutput. + * Note, UnspentOutput addresses and scripts are Address and Script classes respectively, + * here they are both strings. + */ +export type UtxoType = { txId: string; outputIndex: number; satoshis: number; - address: string; script: string; -} -// Externaly recieved utxo. Could either be node (bitcore-node) or lib (bitcore-lib, bitcore-lib-cash etc.) type. -type UtxoTypeE = UtxoTypeS & { - // node specific properties + address?: string; +}; + +/** + * Utxo type for functions were the received utxo type is unknown. + * Could either be in the format of UnspentOutput, UnspentOutput.toObject, or from bitcore-node. + */ +export type EveryUtxoType = Partial; diff --git a/packages/crypto-wallet-core/src/transactions/doge/index.ts b/packages/crypto-wallet-core/src/transactions/doge/index.ts index 4b5635f3cf..b8e38d9de8 100644 --- a/packages/crypto-wallet-core/src/transactions/doge/index.ts +++ b/packages/crypto-wallet-core/src/transactions/doge/index.ts @@ -1,11 +1,18 @@ import BitcoreLibDoge from '@bitpay-labs/bitcore-lib-doge'; -import { BTCTxProvider } from '../btc'; +import { BTCTxProvider, EveryUtxoType } from '../btc'; export class DOGETxProvider extends BTCTxProvider { lib = BitcoreLibDoge; - create({ recipients, utxos = [], change, feeRate, fee = 20000 }) { - const filteredUtxos = this.selectCoins(recipients, utxos, fee); - const btcUtxos = filteredUtxos.map(this.standardizeUtxo); + create(params: { + recipients: Array<{ address: string; amount: number }>; + utxos?: EveryUtxoType[]; + change?: string; + feeRate?: number | string; + fee?: number | string; + }): string { + const { recipients, utxos = [], change, feeRate, fee = 20000 } = params; + const filteredUtxos = this.selectCoins(recipients, utxos, Number(fee)); + const btcUtxos = filteredUtxos.map(utxo => this.standardizeUtxo(utxo)); const tx = new this.lib.Transaction().from(btcUtxos); if (fee) { tx.fee(fee); @@ -17,7 +24,7 @@ export class DOGETxProvider extends BTCTxProvider { tx.change(change); } for (const recipient of recipients) { - tx.to(recipient.address, parseInt(recipient.amount)); + tx.to(recipient.address, Number(recipient.amount)); } return tx.uncheckedSerialize(); } diff --git a/packages/crypto-wallet-core/src/transactions/ltc/index.ts b/packages/crypto-wallet-core/src/transactions/ltc/index.ts index 9bf5595740..2fdc484059 100644 --- a/packages/crypto-wallet-core/src/transactions/ltc/index.ts +++ b/packages/crypto-wallet-core/src/transactions/ltc/index.ts @@ -1,11 +1,18 @@ import BitcoreLibLtc from '@bitpay-labs/bitcore-lib-ltc'; -import { BTCTxProvider } from '../btc'; +import { BTCTxProvider, EveryUtxoType } from '../btc'; export class LTCTxProvider extends BTCTxProvider { lib = BitcoreLibLtc; - create({ recipients, utxos = [], change, feeRate, fee = 20000 }) { - const filteredUtxos = this.selectCoins(recipients, utxos, fee); - const btcUtxos = filteredUtxos.map(this.standardizeUtxo); + create(params: { + recipients: Array<{ address: string; amount: number }>; + utxos?: EveryUtxoType[]; + change?: string; + feeRate?: number | string; + fee?: number | string; + }): string { + const { recipients, utxos = [], change, feeRate, fee = 20000 } = params; + const filteredUtxos = this.selectCoins(recipients, utxos, Number(fee)); + const btcUtxos = filteredUtxos.map(utxo => this.standardizeUtxo(utxo)); const tx = new this.lib.Transaction().from(btcUtxos); if (fee) { tx.fee(fee); @@ -17,7 +24,7 @@ export class LTCTxProvider extends BTCTxProvider { tx.change(change); } for (const recipient of recipients) { - tx.to(recipient.address, parseInt(recipient.amount)); + tx.to(recipient.address, Number(recipient.amount)); } return tx.uncheckedSerialize(); } From c3ff523f3a6b1b5eb799518bd5570e6aaf844f56 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 10 Aug 2026 17:41:29 -0400 Subject: [PATCH 35/56] fix bitcore-lib import --- packages/bitcore-hardware/examples/ledger/sign.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/bitcore-hardware/examples/ledger/sign.ts b/packages/bitcore-hardware/examples/ledger/sign.ts index 0510df0bbb..608c5d6f0f 100644 --- a/packages/bitcore-hardware/examples/ledger/sign.ts +++ b/packages/bitcore-hardware/examples/ledger/sign.ts @@ -1,8 +1,8 @@ import 'source-map-support/register.js'; -import bitcore from '@bitpay-labs/bitcore-lib'; +import { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; import Ledger from '../../src/ledger.js'; -const { HDPublicKey, Script, Transaction } = bitcore; +const { HDPublicKey, Script, Transaction } = BitcoreLib; const ledger = new Ledger(); await ledger.connect(); From 80c23096858774cc1f553ae25cdba32fb6e3be01 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Wed, 12 Aug 2026 20:18:26 -0400 Subject: [PATCH 36/56] use CWC to apply signature to transaction for burner --- .../bitcore-hardware/examples/burner/sign.ts | 8 ++++---- packages/bitcore-hardware/src/burner.ts | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index 0801f72744..2addc4554e 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -7,8 +7,9 @@ const { Transaction, PublicKey, Script } = CWC.BitcoreLib; const burner = new Burner('btc'); burner.connect(); -console.log('Tap burner for public key (used for the address and verifying the signature)'); -const publicKey = new PublicKey(await burner.getPublicKey({ index: 9 })); +// Predefined for now. For other wallets: +// const publicKey = new PublicKey(await burner.getPublicKey({ index: 9 })) +const publicKey = new PublicKey('04161f62f9778a44bd3d07009b1f2e9df7ab1dc57e74665db7ed8baa95780452ab39f4975099f3ae36f7b6a874b46edd79d1d88573a325b9976fd8f120bed704aa'); const address = publicKey.toAddress(); const utxo = { @@ -27,8 +28,7 @@ const tx = new Transaction() console.log('Tap burner wallet on an NFC reader to sign a transaction'); const signedTransaction: any = await burner.sign({ index: 9, tx, password: '123456' }); -console.log(signedTransaction); console.log('Signed transaction'); +console.log(signedTransaction); -console.log(signedTransaction.serialize()); process.exit(0); diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 78809bfbdf..80cdd265db 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -1,12 +1,12 @@ import { execHaloCmdPCSC } from '@arx-research/libhalo/api/desktop'; -import CWC from '@bitpay-labs/crypto-wallet-core'; +import CWC, { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; import { NFC } from 'nfc-pcsc'; import { Base } from './base.js'; import { DataType } from './types/burnerTypes.js'; import { BaseParams, SignParams } from './types/paramTypes.js'; -const { Address, PublicKey, crypto } = CWC.BitcoreLib; +const { Address, PublicKey, crypto } = BitcoreLib; /** * Connect listens on the NFC reader for a card. @@ -68,13 +68,19 @@ export default class Burner implements Base { const response: any = await this.awaitResponse(); + const publicKey = new PublicKey('04161f62f9778a44bd3d07009b1f2e9df7ab1dc57e74665db7ed8baa95780452ab39f4975099f3ae36f7b6a874b46edd79d1d88573a325b9976fd8f120bed704aa'); const signature = crypto.Signature.fromString(response.signature.der); + signature.pubKey = publicKey; - tx.applySignature({ + const verify = crypto.ECDSA.verify(Buffer.from(digest, 'hex'), signature, publicKey); + if (!verify) + throw new Error('Invalid signature'); + + CWC.Transactions.applySignature({ + chain: this.chain, + tx, signature, - publicKey: new PublicKey(response.publicKey), - sigtype: crypto.Signature.SIGHASH_ALL, - inputIndex: 0 + index: 0 }); return tx; From 30834985d4390ed2e6de5c9f47e386d7c7fe72f3 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Wed, 12 Aug 2026 20:57:16 -0400 Subject: [PATCH 37/56] make burner.sign compatible with hex encoded transactions + utxos --- .../bitcore-hardware/examples/burner/sign.ts | 17 ++-- packages/bitcore-hardware/src/burner.ts | 91 +++++++++++++++++-- 2 files changed, 93 insertions(+), 15 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index 2addc4554e..08e2deaed3 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -2,7 +2,7 @@ import 'source-map-support/register.js'; import CWC from '@bitpay-labs/crypto-wallet-core'; import Burner from '../../src/burner.js'; -const { Transaction, PublicKey, Script } = CWC.BitcoreLib; +const { PublicKey, Script } = CWC.BitcoreLib; const burner = new Burner('btc'); burner.connect(); @@ -12,21 +12,22 @@ burner.connect(); const publicKey = new PublicKey('04161f62f9778a44bd3d07009b1f2e9df7ab1dc57e74665db7ed8baa95780452ab39f4975099f3ae36f7b6a874b46edd79d1d88573a325b9976fd8f120bed704aa'); const address = publicKey.toAddress(); -const utxo = { +const utxos = [{ txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', outputIndex: 0, address: address.toString(), script: Script.buildWitnessV0Out(address), satoshis: 1100 -}; - -const tx = new Transaction() - .from(utxo) - .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 1000); +}]; +const tx = CWC.Transactions.create({ + chain: 'BTC', + recipients: [{ address: '1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', amount: 1000 }], + utxos +}); console.log('Tap burner wallet on an NFC reader to sign a transaction'); -const signedTransaction: any = await burner.sign({ index: 9, tx, password: '123456' }); +const signedTransaction: any = await burner.sign({ tx, utxos, index: 9, password: '123456' }); console.log('Signed transaction'); console.log(signedTransaction); diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 80cdd265db..abda4333cb 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -3,8 +3,7 @@ import CWC, { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; import { NFC } from 'nfc-pcsc'; import { Base } from './base.js'; import { DataType } from './types/burnerTypes.js'; -import { BaseParams, SignParams } from './types/paramTypes.js'; - +import { BaseParams } from './types/paramTypes.js'; const { Address, PublicKey, crypto } = BitcoreLib; @@ -53,10 +52,51 @@ export default class Burner implements Base { }); } - async sign(params: SignParams) { - const { index, tx, password } = params; - const digest = CWC.Transactions.getSighash({ chain: this.chain, tx, index: 0 }); + /** + * Standardize utxo for internal funcionality. + * Accepts either a bitcore-node or a lib (bitcore-lib, bitcore-lib-cash, etc.) utxo. + * Handles both lib style utxos: UnspentOutput properties and UnspentOutput.toObject properties. + * + * @param utxos either a bitcore-node or lib utxo + * @returns utxo in the standard, internaly used format + */ + standardizeUtxo(utxo: EveryUtxoType): UtxoType { + return { + satoshis: Number(utxo.satoshis ?? utxo.value ?? BitcoreLib.Unit.fromBTC(utxo.amount ?? 0).toSatoshis()), + txId: utxo.txId ?? utxo.mintTxid ?? utxo.txid ?? '', + outputIndex: Number(utxo.outputIndex ?? utxo.mintIndex ?? utxo.vout ?? 0), + script: utxo.scriptPubKey ?? new BitcoreLib.Script(utxo.script).toHex(), + address: utxo.address != undefined ? new BitcoreLib.Address(utxo.address).toString() : undefined + }; + } + + getRelatedUtxos(params: { + outputs: BitcoreLib.Transaction.Input[]; + utxos: UtxoType[]; + }): UtxoType[] { + const { outputs, utxos } = params; + const txids = outputs.map(output => output.toObject().prevTxId); + return utxos.filter(utxo => txids.includes(utxo.txId)); + } + + async sign(params: { + tx: TransactionType; + utxos?: EveryUtxoType[]; + index: number; + password: string; + }) { + const { tx, utxos, index, password } = params; + const bitcoreTx = tx instanceof BitcoreLib.Transaction ? tx : new BitcoreLib.Transaction(tx); + if (utxos) { + const btcUtxos = utxos.map(utxo => this.standardizeUtxo(utxo)); + const applicableUtxos = this.getRelatedUtxos({ + outputs: bitcoreTx.inputs, + utxos: btcUtxos + }); + bitcoreTx.associateInputs(applicableUtxos.map(utxo => new BitcoreLib.Transaction.UnspentOutput(utxo))); + } + const digest = CWC.Transactions.getSighash({ chain: this.chain, tx: bitcoreTx, index: 0 }); this.response = undefined; this.command = { @@ -78,12 +118,12 @@ export default class Burner implements Base { CWC.Transactions.applySignature({ chain: this.chain, - tx, + tx: bitcoreTx, signature, index: 0 }); - return tx; + return bitcoreTx.serialize(); } async getPublicKey(params: BaseParams) { @@ -138,3 +178,40 @@ export default class Burner implements Base { return data.firmwareVersion[index].value; } } + +/** Transaction data that can be converted into a Transaction via Transaction(tx) */ +type TransactionType = BitcoreLib.Transaction | string | Buffer | object; + +/** + * Standard utxo type use for internal processing. + * Property names are from bitcore-lib's UnspentOutput. + * Note, UnspentOutput addresses and scripts are Address and Script classes respectively, + * here they are both strings. + */ +export type UtxoType = { + txId: string; + outputIndex: number; + satoshis: number; + script: string; + address?: string; +}; + +/** + * Utxo type for functions were the received utxo type is unknown. + * Could either be in the format of UnspentOutput, UnspentOutput.toObject, or from bitcore-node. + */ +export type EveryUtxoType = Partial; From fe720719b0ee29f0931a97e49a2501ed2d0d106a Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Wed, 12 Aug 2026 23:06:33 -0400 Subject: [PATCH 38/56] created a signing test for burner --- packages/bitcore-hardware/.mocharc.yml | 2 + packages/bitcore-hardware/package-lock.json | 2549 ++++++++++++++++- packages/bitcore-hardware/package.json | 5 +- packages/bitcore-hardware/src/burner.ts | 2 +- .../bitcore-hardware/test/burner/sign.test.ts | 69 + 5 files changed, 2512 insertions(+), 115 deletions(-) create mode 100644 packages/bitcore-hardware/.mocharc.yml create mode 100644 packages/bitcore-hardware/test/burner/sign.test.ts diff --git a/packages/bitcore-hardware/.mocharc.yml b/packages/bitcore-hardware/.mocharc.yml new file mode 100644 index 0000000000..9120acd265 --- /dev/null +++ b/packages/bitcore-hardware/.mocharc.yml @@ -0,0 +1,2 @@ +enable-source-maps: true +exit: true diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index 85b72625dd..b4a9456535 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "@arx-research/libhalo": "^1.19.0", + "@bitpay-labs/crypto-wallet-core": "^11.5.1", "@ledgerhq/device-management-kit": "^1.7.1", "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", @@ -20,8 +21,10 @@ "devDependencies": { "@types/chai": "5.2.3", "@types/mocha": "10.0.10", + "@types/sinon": "^22.0.0", "chai": "6.2.2", "mocha": "11.7.6", + "sinon": "^22.1.0", "source-map-support": "^0.5.21", "typescript": "7.0.2" } @@ -49,6 +52,204 @@ "websocket-as-promised": "^3.0.0" } }, + "node_modules/@bitpay-labs/bitcore-lib": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib/-/bitcore-lib-11.5.1.tgz", + "integrity": "sha512-bjYMYo5RWwvCnwWXLwXUJCUVw0aEMDEYx+yC3X26Lzo70pOZFPRgyuiDxdMJfihatdB9u87f0z5U+ja8KSPMsw==", + "license": "MIT", + "dependencies": { + "bech32": "=2.0.0", + "bn.js": "=4.11.8", + "bs58": "^4.0.1", + "buffer-compare": "=1.1.1", + "elliptic": "^6.5.3", + "inherits": "=2.0.1", + "lodash": "^4.17.20" + } + }, + "node_modules/@bitpay-labs/bitcore-lib-cash": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-cash/-/bitcore-lib-cash-11.5.1.tgz", + "integrity": "sha512-iGmWYEPkUl/4kW2A0Vz1TWXnpCF1nODZD4pDUYWy4nIBx3i00h96Aose5kYIgbO7fkqd8sm/IqqxM0HaSuE3HA==", + "license": "MIT", + "dependencies": { + "bn.js": "=4.11.8", + "bs58": "^4.0.1", + "buffer-compare": "=1.1.1", + "elliptic": "^6.5.3", + "inherits": "=2.0.1", + "lodash": "^4.17.20" + } + }, + "node_modules/@bitpay-labs/bitcore-lib-cash/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "license": "ISC" + }, + "node_modules/@bitpay-labs/bitcore-lib-doge": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-doge/-/bitcore-lib-doge-11.5.1.tgz", + "integrity": "sha512-nletyOA0ztjjRrMduRhQ9oL7Ltl5HrnRt+jt4px0de/U//lAFqCx99L5Pkdt7/lQnx9GhkdWd3BmY+YaoVGyVw==", + "license": "MIT", + "dependencies": { + "bn.js": "=4.11.8", + "bs58": "^4.0.1", + "buffer-compare": "=1.1.1", + "elliptic": "^6.5.3", + "inherits": "=2.0.1", + "lodash": "^4.17.20", + "scryptsy": "2.1.0" + } + }, + "node_modules/@bitpay-labs/bitcore-lib-doge/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "license": "ISC" + }, + "node_modules/@bitpay-labs/bitcore-lib-ltc": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-ltc/-/bitcore-lib-ltc-11.5.1.tgz", + "integrity": "sha512-BHaAKFsJ+qIXOnbaQGYMxICdeOwJtwIla+h2JrzPT7xU0N0cPA5o3aRRdzdVJYeWD0zyp8sv/V+b3CzT2zsN3Q==", + "license": "MIT", + "dependencies": { + "bech32": "=2.0.0", + "bn.js": "=4.11.8", + "bs58": "^4.0.1", + "buffer-compare": "=1.1.1", + "elliptic": "^6.5.3", + "inherits": "=2.0.1", + "lodash": "^4.17.20", + "scryptsy": "2.1.0" + } + }, + "node_modules/@bitpay-labs/bitcore-lib-ltc/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "license": "ISC" + }, + "node_modules/@bitpay-labs/bitcore-lib/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "license": "ISC" + }, + "node_modules/@bitpay-labs/crypto-wallet-core": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/@bitpay-labs/crypto-wallet-core/-/crypto-wallet-core-11.5.1.tgz", + "integrity": "sha512-5VzX6xAR2O7k/Crf7Kf5wEOqTaGPzl6eU7K1nepSE+wT28O2VMWxjrckP8XoO8sbH0iXpApoi4nkFuSsQFFcqg==", + "license": "MIT", + "dependencies": { + "@bitpay-labs/bitcore-lib": "^11.5.1", + "@bitpay-labs/bitcore-lib-cash": "^11.5.1", + "@bitpay-labs/bitcore-lib-doge": "^11.5.1", + "@bitpay-labs/bitcore-lib-ltc": "^11.5.1", + "@solana-program/compute-budget": "0.7.0", + "@solana-program/memo": "0.7.0", + "@solana-program/system": "0.7.0", + "@solana-program/token": "0.5.1", + "@solana/kit": "2.1.0", + "ed25519-hd-key": "^1.3.0", + "ethers": "6.13.5", + "info": "0.0.6-beta.0", + "ripple-binary-codec": "^1.10.0", + "web3": "4.16.0", + "xrpl": "2.13.0" + } + }, + "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, + "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/ethers": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.5.tgz", + "integrity": "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@bitpay-labs/crypto-wallet-core/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@inversifyjs/common": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@inversifyjs/common/-/common-1.5.0.tgz", @@ -209,137 +410,958 @@ "integrity": "sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==", "license": "MIT", "engines": { - "node": "^18 || ^20 || >= 21" + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/@ledgerhq/signer-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/signer-utils/-/signer-utils-1.3.0.tgz", + "integrity": "sha512-qe+HQMgZxq6SPv8ghvlq4c33RchUwlf1qE/qp7MtUGPbKGAqD/0PKNyzx05sKLpmA8m6YZdtndHH4CEkikzqSQ==", + "license": "Apache-2.0", + "dependencies": { + "semver": "7.7.2" + }, + "peerDependencies": { + "@ledgerhq/device-management-kit": "^1.7.1" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pokusew/pcsclite": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@pokusew/pcsclite/-/pcsclite-0.6.0.tgz", + "integrity": "sha512-jX7zRXM2Or5Pms1AFjNtawsXDjLiZOzOUo7Sf0put7Pnq/EKIR9g0KvTx62HtwdPpVP6hWHGydUTHgIi9PxodQ==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.14.0" + } + }, + "node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sentry/hub": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", + "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@sentry/minimal": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", + "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@sentry/types": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", + "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", + "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-10.0.2.tgz", + "integrity": "sha512-8lVwD1Df1BmzoaOLhMcGGcz/Jyr5QY2KSB75/YK1QgKzoabTeLdIVyhXNZK9ojfSKSdirbXqdbsXXqP9/Ve8+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "type-detect": "^4.1.0" + } + }, + "node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@solana-program/compute-budget": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@solana-program/compute-budget/-/compute-budget-0.7.0.tgz", + "integrity": "sha512-/JJSE1fKO5zx7Z55Z2tLGWBDDi7tUE+xMlK8qqkHlY51KpqksMsIBzQMkG9Dqhoe2Cnn5/t3QK1nJKqW6eHzpg==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0" + } + }, + "node_modules/@solana-program/memo": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@solana-program/memo/-/memo-0.7.0.tgz", + "integrity": "sha512-3T9iUjWSYtN/5S5jzJuasD2yQfVfFAQ9yTwIE25+P9peWqz4oarn6ZQvRj/FLcBqaMLtSqLhU1hN2cyVBS6hyg==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0" + } + }, + "node_modules/@solana-program/system": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@solana-program/system/-/system-0.7.0.tgz", + "integrity": "sha512-FKTBsKHpvHHNc1ATRm7SlC5nF/VdJtOSjldhcyfMN9R7xo712Mo2jHIzvBgn8zQO5Kg0DcWuKB7268Kv1ocicw==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0" + } + }, + "node_modules/@solana-program/token": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@solana-program/token/-/token-0.5.1.tgz", + "integrity": "sha512-bJvynW5q9SFuVOZ5vqGVkmaPGA0MCC+m9jgJj1nk5m20I389/ms69ASnhWGoOPNcie7S9OwBX0gTj2fiyWpfag==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^2.1.0" + } + }, + "node_modules/@solana/accounts": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-2.1.0.tgz", + "integrity": "sha512-1JOBiLFeIeHmGx7k1b23UWF9vM1HAh9GBMCzr5rBPrGSBs+QUgxBJ3+yrRg+UPEOSELubqo7qoOVFUKYsb1nXw==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/rpc-spec": "2.1.0", + "@solana/rpc-types": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/addresses": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-2.1.0.tgz", + "integrity": "sha512-IgiRuju2yLz14GnrysOPSNZbZQ8F+7jhx7FYZLrbKogf6NX4wy4ijLHxRsLFqP8o8aY69BZULkM9MwrSjsZi7A==", + "license": "MIT", + "dependencies": { + "@solana/assertions": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/assertions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-2.1.0.tgz", + "integrity": "sha512-KCYmxFRsg897Ec7yGdpc0rniOlqGD3NpicmIjWIV87uiXX5uFco4t+01sKyFlhsv4T4OgHxngMsxkfQ3AUkFVg==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.1.0.tgz", + "integrity": "sha512-C0TnfrpbTg7zoIFYfM65ofeL2AWEz80OsD6mjVdcTKpb1Uj7XuBuNLss3dMnatPQaL7RagD9VLA5/WfYayyteQ==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/codecs-data-structures": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/options": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.1.0.tgz", + "integrity": "sha512-SR7pKtmJBg2mhmkel2NeHA1pz06QeQXdMv8WJoIR9m8F/hw80K/612uaYbwTt2nkK0jg/Qn/rNSd7EcJ4SBGjw==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-data-structures": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.1.0.tgz", + "integrity": "sha512-oDF5ek54kirqJ09q8k/qEpobBiWOhd3CkkGOTyfjsmTF/IGIigNbdYIakxV3+vudBeaNBw08y0XdBYI4JL/nqA==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-numbers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.1.0.tgz", + "integrity": "sha512-XMu4yw5iCgQnMKsxSWPPOrGgtaohmupN3eyAtYv3K3C/MJEc5V90h74k5B1GUCiHvcrdUDO9RclNjD9lgbjFag==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/codecs-strings": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.1.0.tgz", + "integrity": "sha512-O/eJFLzFrHomcCR1Y5QbIqoPo7iaJaWNnIeskB4mVhVjLyjlJS4WtBP2NBRzM9uJXaXyOxxKroqqO9zFsHOpvQ==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5" + } + }, + "node_modules/@solana/errors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.1.0.tgz", + "integrity": "sha512-l+GxAv0Ar4d3c3PlZdA9G++wFYZREEbbRyAFP8+n8HSg0vudCuzogh/13io6hYuUhG/9Ve8ARZNamhV7UScKNw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "commander": "^13.1.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/errors/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@solana/fast-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-2.1.0.tgz", + "integrity": "sha512-a8vR92qbe/VsvQ1BpN3PIEwnoHD2fTHEwCJh9GG58z3R15RIjk73gc0khjcdg4U1tZwTJqWkvk8SbDIgGdOgMA==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/functional": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-2.1.0.tgz", + "integrity": "sha512-RVij8Av4F2uUOFcEC8n9lgD72e9gQMritmGHhMh+G91Xops4I6Few+oQ++XgSTiL2t3g3Cs0QZ13onZ0FL45FQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/instructions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-2.1.0.tgz", + "integrity": "sha512-wfn6e7Rgm0Sw/Th1v/pXsKTvloZvAAQI7j1yc9WcIk9ngqH5p6LhqMMkrwYPB2oTk8+MMr7SZ4E+2eK2gL6ODA==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-2.1.0.tgz", + "integrity": "sha512-esY1+dlZjB18hZML5p+YPec29wi3HH0SzKx7RiqF//dI2cJ6vHfq3F+7ArbNnF6R2YCLFtl7DzS/tkqR2Xkxeg==", + "license": "MIT", + "dependencies": { + "@solana/assertions": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/kit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-2.1.0.tgz", + "integrity": "sha512-vqaHROLKp89xdIbaKVG6BQ44uMN9E6/rSTeltkvquD2qdTObssafGDbAKVFjwZhlNO+sdzHDCLekGabn5VAL6A==", + "license": "MIT", + "dependencies": { + "@solana/accounts": "2.1.0", + "@solana/addresses": "2.1.0", + "@solana/codecs": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/instructions": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/programs": "2.1.0", + "@solana/rpc": "2.1.0", + "@solana/rpc-parsed-types": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "@solana/rpc-subscriptions": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/signers": "2.1.0", + "@solana/sysvars": "2.1.0", + "@solana/transaction-confirmation": "2.1.0", + "@solana/transaction-messages": "2.1.0", + "@solana/transactions": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/options": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.1.0.tgz", + "integrity": "sha512-T/vJCr8qnwK6HxriOPXCrx31IpA9ZYecxuOzQ3G74kIayED4spmpXp6PLtRYR/fo2LZ6UcgHN0qSgONnvwEweg==", + "license": "MIT", + "dependencies": { + "@solana/codecs-core": "2.1.0", + "@solana/codecs-data-structures": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/programs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-2.1.0.tgz", + "integrity": "sha512-9Y30/yUbTR99+QRN2ukNXQQTGY68oKmVrXnh/et6StM1JF5WHvAJqBigsHG5bt6KxTISoRuncBnH/IRnDqPxKg==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/promises": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-2.1.0.tgz", + "integrity": "sha512-eQJaQXA2kD4dVyifzhslV3wOvq27fwOJ4az89BQ4Cz83zPbR94xOeDShwcXrKBYqaUf6XqH5MzdEo14t4tKAFQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-2.1.0.tgz", + "integrity": "sha512-myg9qAo6b2WKyHSMXURQykb+ZRnNEXBPLEcwRwkos8STzPPyRFg6ady2s0FCQQTtL/pVjanIU2bObZIzbMGugA==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0", + "@solana/fast-stable-stringify": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/rpc-api": "2.1.0", + "@solana/rpc-spec": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "@solana/rpc-transformers": "2.1.0", + "@solana/rpc-transport-http": "2.1.0", + "@solana/rpc-types": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-api": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-2.1.0.tgz", + "integrity": "sha512-4yCnHYHFlz9VffivoY5q/HVeBjT59byB2gmg7UyC3ktxD28AlF9jjsE5tJKiapAKr2J3KWm0D/rH/QwW14cGeA==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/rpc-parsed-types": "2.1.0", + "@solana/rpc-spec": "2.1.0", + "@solana/rpc-transformers": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/transaction-messages": "2.1.0", + "@solana/transactions": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-parsed-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-2.1.0.tgz", + "integrity": "sha512-mRzHemxlWDS9p1fPQNKwL+1vEOUMG8peSUJb0X/NbM12yjowDNdzM++fkOgIyCKDPddfkcoNmNrQmr2jwjdN1Q==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-2.1.0.tgz", + "integrity": "sha512-NPAIM5EY7Jke0mHnmoMpgCEb/nZKIo+bgVFK/u+z74gY0JnCNt0DfocStUUQtlhqSmTyoHamt3lfxp4GT2zXbA==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0", + "@solana/rpc-spec-types": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-spec-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-2.1.0.tgz", + "integrity": "sha512-NxcZ8piXMyCdbNUL6d36QJfL2UAQEN33StlGku0ltTVe1nrokZ5WRNjSPohU1fODlNaZzTvUFzvUkM1yGCkyzw==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-subscriptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-2.1.0.tgz", + "integrity": "sha512-dTyI03VlueE3s7mA/OBlA5l6yKUUKHMJd31tpzxV3AFnqE/QPS5NVrF/WY6pPBobLJiCP0UFOe7eR/MKP9SUCA==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0", + "@solana/fast-stable-stringify": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/promises": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "@solana/rpc-subscriptions-api": "2.1.0", + "@solana/rpc-subscriptions-channel-websocket": "2.1.0", + "@solana/rpc-subscriptions-spec": "2.1.0", + "@solana/rpc-transformers": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/subscribable": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-subscriptions-api": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-2.1.0.tgz", + "integrity": "sha512-de1dBRSE2CUwoZHMXQ/0v7iC+/pG0+iYY8jLHGGNxtKrYbTnV08mXQbaAMrmv2Rk8ZFmfJWbqbYZ9dRWdO3P5g==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/rpc-subscriptions-spec": "2.1.0", + "@solana/rpc-transformers": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/transaction-messages": "2.1.0", + "@solana/transactions": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/rpc-subscriptions-channel-websocket": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-2.1.0.tgz", + "integrity": "sha512-goJe9dv0cs967HJ382vSX8yapXgQzRHCmH323LsXrrpj/s3Eb3yUwJq7AcHgoh4gKIqyAfGybq/bE5Aa8Pcm9g==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/rpc-subscriptions-spec": "2.1.0", + "@solana/subscribable": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5", + "ws": "^8.18.0" + } + }, + "node_modules/@solana/rpc-subscriptions-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-2.1.0.tgz", + "integrity": "sha512-Uqasfd3Tlr22lC/Vy5dToF0e68dMKPdnt4ks7FwXuPdEbNRM/TDGb0GqG+bt/d3IIrNOCA5Y8vsE0nQHGrWG/w==", + "license": "MIT", + "dependencies": { + "@solana/errors": "2.1.0", + "@solana/promises": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "@solana/subscribable": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@ledgerhq/signer-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/signer-utils/-/signer-utils-1.3.0.tgz", - "integrity": "sha512-qe+HQMgZxq6SPv8ghvlq4c33RchUwlf1qE/qp7MtUGPbKGAqD/0PKNyzx05sKLpmA8m6YZdtndHH4CEkikzqSQ==", - "license": "Apache-2.0", + "node_modules/@solana/rpc-transformers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-2.1.0.tgz", + "integrity": "sha512-E2xPlaCu6tNO00v4HIJxJCYkoNwgVJYad5sxbIUZOQBWwXnWIcll2jUT4bWKpBGq5vFDYfkzRBr8Rco3DhfXqg==", + "license": "MIT", "dependencies": { - "semver": "7.7.2" + "@solana/errors": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "@solana/rpc-types": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" }, "peerDependencies": { - "@ledgerhq/device-management-kit": "^1.7.1" + "typescript": ">=5" } }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "node_modules/@solana/rpc-transport-http": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-2.1.0.tgz", + "integrity": "sha512-E3UovTBid4/S8QDd9FkADVKfyG+v7CW5IqI4c27ZDKfazCsnDLLkqh98C6BvNCqi278HKBui4lI2GoFpCq89Pw==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.8.0" + "@solana/errors": "2.1.0", + "@solana/rpc-spec": "2.1.0", + "@solana/rpc-spec-types": "2.1.0", + "undici-types": "^7.3.0" }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=20.18.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "node_modules/@solana/rpc-transport-http/node_modules/undici-types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.29.0.tgz", + "integrity": "sha512-vamA8dGlzMwhpyYpQp9d8vka3o4D/yn5I7ez7Or+msDA4bZ8Uh+Zy91WvWf3I73gDAkFha9JcYRqm2li0Npfgg==", + "license": "MIT" + }, + "node_modules/@solana/rpc-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-2.1.0.tgz", + "integrity": "sha512-1ODnhmpR1X/GjB7hs4gVR3mcCagfPQV0dzq/2DNuCiMjx2snn64KP5WoAHfBEyoC9/Rb36+JpNj/hLAOikipKA==", "license": "MIT", + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0" + }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=20.18.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, + "node_modules/@solana/signers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-2.1.0.tgz", + "integrity": "sha512-Yq0JdJnCecRsSBshNWy+OIRmAGeVfjwIh9Z+H1jv8u8p+dJCOreKakTWuxMt5tnj3q5K1mPcak9O2PqVPZ0teA==", "license": "MIT", - "optional": true, + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/instructions": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/transaction-messages": "2.1.0", + "@solana/transactions": "2.1.0" + }, "engines": { - "node": ">=14" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@pokusew/pcsclite": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@pokusew/pcsclite/-/pcsclite-0.6.0.tgz", - "integrity": "sha512-jX7zRXM2Or5Pms1AFjNtawsXDjLiZOzOUo7Sf0put7Pnq/EKIR9g0KvTx62HtwdPpVP6hWHGydUTHgIi9PxodQ==", - "hasInstallScript": true, - "license": "ISC", + "node_modules/@solana/subscribable": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-2.1.0.tgz", + "integrity": "sha512-xi12Cm889+uT5sRKnIzr7nLnHAp3hiR3dqIzrT1P7z7iEGp8OnqUQIQCHlgozFHM2cPW+6685NQXk1l1ImuJIw==", + "license": "MIT", "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.14.0" + "@solana/errors": "2.1.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@sentry/hub": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", - "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", - "license": "BSD-3-Clause", + "node_modules/@solana/sysvars": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-2.1.0.tgz", + "integrity": "sha512-GXu9yS0zIebmM1Unqw/XFpYuvug03m42w98ioOPV/yiHzECggGRGpHGD9RLVYnkyz0eL4NRbnJ5dAEu/fvGe0A==", + "license": "MIT", "dependencies": { - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" + "@solana/accounts": "2.1.0", + "@solana/codecs": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/rpc-types": "2.1.0" }, "engines": { - "node": ">=6" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@sentry/hub/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@sentry/minimal": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", - "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", - "license": "BSD-3-Clause", + "node_modules/@solana/transaction-confirmation": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-2.1.0.tgz", + "integrity": "sha512-VxOvtvs2e9h5u73PHyE2TptLAMO5x6dOXlOgvq1Nk6l3rKM2HAsd+KDpN7gjOo8/EgItMMmyEilXygWWRgpSIA==", + "license": "MIT", "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" + "@solana/addresses": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/promises": "2.1.0", + "@solana/rpc": "2.1.0", + "@solana/rpc-subscriptions": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/transaction-messages": "2.1.0", + "@solana/transactions": "2.1.0" }, "engines": { - "node": ">=6" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@sentry/types": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", - "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", - "license": "BSD-3-Clause", + "node_modules/@solana/transaction-messages": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-2.1.0.tgz", + "integrity": "sha512-+GPzZHLYNFbqHKoiL8mYALp7eAXtAbI6zLViZpIM3zUbVNU3q5+FCKGv6jCBnxs+3QCbeapu+W1OyfDa6BUtTQ==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-data-structures": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/instructions": "2.1.0", + "@solana/rpc-types": "2.1.0" + }, "engines": { - "node": ">=6" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@sentry/utils": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", - "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", - "license": "BSD-3-Clause", + "node_modules/@solana/transactions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-2.1.0.tgz", + "integrity": "sha512-QeM4sCItReeIy5LU7LhGkz7RPfMPTg/Qo8h0LSfhiJiPTOHOhElmh42vkLJmwPl83+MsKtisyPQNK6penM2nAw==", + "license": "MIT", "dependencies": { - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" + "@solana/addresses": "2.1.0", + "@solana/codecs-core": "2.1.0", + "@solana/codecs-data-structures": "2.1.0", + "@solana/codecs-numbers": "2.1.0", + "@solana/codecs-strings": "2.1.0", + "@solana/errors": "2.1.0", + "@solana/functional": "2.1.0", + "@solana/instructions": "2.1.0", + "@solana/keys": "2.1.0", + "@solana/rpc-types": "2.1.0", + "@solana/transaction-messages": "2.1.0" }, "engines": { - "node": ">=6" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "node_modules/@types/brorand": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/@types/brorand/-/brorand-1.0.33.tgz", + "integrity": "sha512-KmNsWYtzKXpmxjecvYWUEGK5biJB/1kpHRObHZD8eme1tz/TvbESbZeNAHPRNd5qyCJiHk2ztbNzKbPC6TuPFg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/chai": { "version": "5.2.3", @@ -387,12 +1409,38 @@ "undici-types": "~6.19.2" } }, + "node_modules/@types/sinon": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-22.0.0.tgz", + "integrity": "sha512-TDbVpbccc2HfiqHR09Argj3mHV1KMW7sCCKj52fsl8lbRLkEn7fB1966EWhOKWUBcqfBueZuPoA7/OK1CKiy3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-15.0.1.tgz", + "integrity": "sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/w3c-web-usb": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.14.tgz", "integrity": "sha512-Qu3Nn6JFuF4+sHKYl+IcX9vYiI40ogleXzFFSxoE1W94rG98o/kXs8uJ0QSfFzuwBCZWlGfUGpPkgwuuX4PchA==", "license": "MIT" }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript/typescript-aix-ppc64": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", @@ -400,7 +1448,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -417,7 +1464,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -434,7 +1480,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -451,7 +1496,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -468,7 +1512,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -485,7 +1528,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -502,7 +1544,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -519,7 +1560,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -536,7 +1576,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -553,7 +1592,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -570,7 +1608,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -587,7 +1624,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -604,7 +1640,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -621,7 +1656,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -638,7 +1672,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -655,7 +1688,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -672,7 +1704,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -689,7 +1720,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -706,7 +1736,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -723,7 +1752,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -733,12 +1761,71 @@ "node": ">=16.20.0" } }, + "node_modules/@xrplf/isomorphic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@xrplf/isomorphic/-/isomorphic-1.0.2.tgz", + "integrity": "sha512-ncZUdMXr6VlSXtdoiDi0jTH+gBrgGxwVeEidhoegII3PmyErbQsyj6e+j7acmR4LW/lvBkPkzb9QzRfJH0n3rA==", + "license": "ISC", + "dependencies": { + "@noble/hashes": "^2.0.1", + "eventemitter3": "5.0.1", + "ws": "^8.20.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@xrplf/isomorphic/node_modules/@noble/hashes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.3.0.tgz", + "integrity": "sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@xrplf/isomorphic/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/abitype": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.7.1.tgz", + "integrity": "sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=4.9.4", + "zod": "^3 >=3.19.1" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, "node_modules/aes-js": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "license": "MIT" }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -774,6 +1861,19 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -806,12 +1906,58 @@ "dev": true, "license": "MIT" }, + "node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/bech32": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", "license": "MIT", - "peer": true + "engines": { + "node": "*" + } }, "node_modules/bindings": { "version": "1.5.0", @@ -832,6 +1978,50 @@ "node": ">=8.0.0" } }, + "node_modules/bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "license": "MIT", + "dependencies": { + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.3", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bip32/node_modules/@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", + "license": "MIT" + }, + "node_modules/bip32/node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "license": "MIT", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "license": "ISC", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, "node_modules/bitcoinjs-lib": { "version": "6.1.7", "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.1.7.tgz", @@ -850,6 +2040,12 @@ "node": ">=8.0.0" } }, + "node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", @@ -860,6 +2056,12 @@ "balanced-match": "^1.0.0" } }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -867,6 +2069,15 @@ "dev": true, "license": "ISC" }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, "node_modules/bs58check": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", @@ -895,6 +2106,35 @@ "base-x": "^4.0.0" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-compare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz", + "integrity": "sha512-O6NvNiHZMd3mlIeMDjP6t/gPG75OqGPeiRZXoMQZJ6iy9GofCls4Ijs5YkPZZwoysizLiedhticmdyx/GyHghA==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1134,12 +2374,33 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -1167,6 +2428,15 @@ "sha.js": "^2.4.8" } }, + "node_modules/cross-fetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1192,7 +2462,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1219,6 +2488,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, "node_modules/decode-uri-component": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", @@ -1245,6 +2520,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -1282,6 +2574,37 @@ "dev": true, "license": "MIT" }, + "node_modules/ed25519-hd-key": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ed25519-hd-key/-/ed25519-hd-key-1.3.0.tgz", + "integrity": "sha512-IWwAyiiuJQhgu3L8NaHb68eJxTu2pgCwxIBdgpLJdKpYZM46+AXePSVTr7fkNKaUOfOL4IrjEUaQvyVRIDP7fg==", + "license": "MIT", + "dependencies": { + "create-hmac": "1.1.7", + "tweetnacl": "1.0.3" + } + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "license": "MIT" + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -1342,6 +2665,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ethers": { "version": "6.17.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.17.0.tgz", @@ -1394,6 +2753,19 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/fastestsmallesttextencoderdecoder": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", + "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", + "license": "CC0-1.0", + "peer": true + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -1480,6 +2852,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1624,6 +3005,16 @@ "node": ">= 0.8" } }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", @@ -1646,6 +3037,64 @@ "he": "bin/he" } }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/info": { + "version": "0.0.6-beta.0", + "resolved": "https://registry.npmjs.org/info/-/info-0.0.6-beta.0.tgz", + "integrity": "sha512-pm7sdQ6y6iP6ATfDUA7xGJtSvKDFlD1STRBu+3E2qbsRKRQpvkqf7UIfcVm0LpQsG1lrzJuBBkGD8TeoTjLPuQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "ISC", + "dependencies": { + "zen-observable": "^0.8.14" + }, + "peerDependencies": { + "react": "16.8", + "react-dom": "16.8" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1666,6 +3115,22 @@ "reflect-metadata": "~0.2.2" } }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -1687,6 +3152,41 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -1707,6 +3207,24 @@ "node": ">=8" } }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", @@ -1788,6 +3306,13 @@ "integrity": "sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg==", "license": "MIT" }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT", + "peer": true + }, "node_modules/js-yaml": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", @@ -1827,6 +3352,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -1844,6 +3375,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -1871,6 +3415,18 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" + }, "node_modules/minimatch": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", @@ -1938,7 +3494,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nan": { @@ -1962,6 +3517,26 @@ "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "license": "MIT" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-gyp-build": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", @@ -1973,6 +3548,61 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -2136,6 +3766,18 @@ "node": ">=10" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/purify-ts": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/purify-ts/-/purify-ts-2.1.0.tgz", @@ -2366,6 +4008,45 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", + "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", + "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.6" + }, + "peerDependencies": { + "react": "^16.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT", + "peer": true + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -2435,6 +4116,58 @@ "node": ">= 0.8" } }, + "node_modules/ripple-address-codec": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.3.1.tgz", + "integrity": "sha512-Qa3+9wKVvpL/xYtT6+wANsn0A1QcC5CT6IMZbRJZ/1lGt7gmwIfsrCuz1X0+LCEO7zgb+3UT1I1dc0k/5dwKQQ==", + "license": "ISC", + "dependencies": { + "base-x": "^3.0.9", + "create-hash": "^1.1.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-binary-codec": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-1.11.0.tgz", + "integrity": "sha512-g7+gs3T+NfoeW6vIq5dcN0CkIT4t/zwRzFxz8X2RzfbrWRnewPUKqQbmBgs05tXLX5NuWPaneiaAVpFpYBcdfw==", + "license": "ISC", + "dependencies": { + "assert": "^2.0.0", + "big-integer": "^1.6.48", + "buffer": "6.0.3", + "create-hash": "^1.2.0", + "decimal.js": "^10.2.0", + "ripple-address-codec": "^4.3.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-keypairs": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.3.1.tgz", + "integrity": "sha512-dmPlraWKJciFJxHcoubDahGnoIalG5e/BtV6HNDUs7wLXmtnLMHt6w4ed9R8MTL2zNrVPiIdI/HCtMMo0Tm7JQ==", + "license": "ISC", + "dependencies": { + "bn.js": "^5.1.1", + "brorand": "^1.0.5", + "elliptic": "^6.5.4", + "hash.js": "^1.0.3", + "ripple-address-codec": "^4.3.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ripple-keypairs/node_modules/bn.js": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", + "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", + "license": "MIT" + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -2464,6 +4197,40 @@ ], "license": "MIT" }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", + "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/scryptsy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", + "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==", + "license": "MIT" + }, "node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -2509,6 +4276,12 @@ "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, "node_modules/sha.js": { "version": "2.4.12", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", @@ -2565,6 +4338,33 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/sinon": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-22.1.0.tgz", + "integrity": "sha512-n1ajF2rBWMTtEwbKcw4UdFg4nCnDdq/U6RDoxtOd7oapOlRoJ5ynwFx60owROyhDpA9QhMZi0pCO/xtmwFjG7w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^15.4.0", + "@sinonjs/samsam": "^10.0.2", + "diff": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz", + "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2845,6 +4645,23 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/tiny-secp256k1": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.7.tgz", + "integrity": "sha512-eb+F6NabSnjbLwNoC+2o5ItbmP1kg7HliWue71JgLegQt6A5mTN8YbvTLCazdlg6e5SV6A+r8OGvZYskdlmhqQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.3.0", + "bn.js": "^4.11.8", + "create-hmac": "^1.1.7", + "elliptic": "^6.4.0", + "nan": "^2.13.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/to-buffer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", @@ -2865,12 +4682,34 @@ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "license": "Unlicense" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -2889,14 +4728,12 @@ "version": "1.18.0", "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/typescript": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc" @@ -2933,6 +4770,19 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2962,6 +4812,366 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/web3": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-4.16.0.tgz", + "integrity": "sha512-SgoMSBo6EsJ5GFCGar2E/pR2lcR/xmUSuQ61iK6yDqzxmm42aPPxSqZfJz2z/UCR6pk03u77pU8TGV6lgMDdIQ==", + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "^4.7.1", + "web3-errors": "^1.3.1", + "web3-eth": "^4.11.1", + "web3-eth-abi": "^4.4.1", + "web3-eth-accounts": "^4.3.1", + "web3-eth-contract": "^4.7.2", + "web3-eth-ens": "^4.4.0", + "web3-eth-iban": "^4.0.7", + "web3-eth-personal": "^4.1.0", + "web3-net": "^4.1.0", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-rpc-methods": "^1.3.0", + "web3-rpc-providers": "^1.0.0-rc.4", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-4.7.1.tgz", + "integrity": "sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==", + "license": "LGPL-3.0", + "dependencies": { + "web3-errors": "^1.3.1", + "web3-eth-accounts": "^4.3.1", + "web3-eth-iban": "^4.0.7", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "optionalDependencies": { + "web3-providers-ipc": "^4.0.7" + } + }, + "node_modules/web3-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.3.1.tgz", + "integrity": "sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==", + "license": "LGPL-3.0", + "dependencies": { + "web3-types": "^1.10.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-4.11.1.tgz", + "integrity": "sha512-q9zOkzHnbLv44mwgLjLXuyqszHuUgZWsQayD2i/rus2uk0G7hMn11bE2Q3hOVnJS4ws4VCtUznlMxwKQ+38V2w==", + "license": "LGPL-3.0", + "dependencies": { + "setimmediate": "^1.0.5", + "web3-core": "^4.7.1", + "web3-errors": "^1.3.1", + "web3-eth-abi": "^4.4.1", + "web3-eth-accounts": "^4.3.1", + "web3-net": "^4.1.0", + "web3-providers-ws": "^4.0.8", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-abi": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-4.4.1.tgz", + "integrity": "sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==", + "license": "LGPL-3.0", + "dependencies": { + "abitype": "0.7.1", + "web3-errors": "^1.3.1", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-accounts": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-4.3.1.tgz", + "integrity": "sha512-rTXf+H9OKze6lxi7WMMOF1/2cZvJb2AOnbNQxPhBDssKOllAMzLhg1FbZ4Mf3lWecWfN6luWgRhaeSqO1l+IBQ==", + "license": "LGPL-3.0", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "crc-32": "^1.2.2", + "ethereum-cryptography": "^2.0.0", + "web3-errors": "^1.3.1", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-contract": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-4.7.2.tgz", + "integrity": "sha512-3ETqs2pMNPEAc7BVY/C3voOhTUeJdkf2aM3X1v+edbngJLHAxbvxKpOqrcO0cjXzC4uc2Q8Zpf8n8zT5r0eLnA==", + "license": "LGPL-3.0", + "dependencies": { + "@ethereumjs/rlp": "^5.0.2", + "web3-core": "^4.7.1", + "web3-errors": "^1.3.1", + "web3-eth": "^4.11.1", + "web3-eth-abi": "^4.4.1", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-contract/node_modules/@ethereumjs/rlp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", + "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/web3-eth-ens": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-4.4.0.tgz", + "integrity": "sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==", + "license": "LGPL-3.0", + "dependencies": { + "@adraffy/ens-normalize": "^1.8.8", + "web3-core": "^4.5.0", + "web3-errors": "^1.2.0", + "web3-eth": "^4.8.0", + "web3-eth-contract": "^4.5.0", + "web3-net": "^4.1.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-iban": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-4.0.7.tgz", + "integrity": "sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==", + "license": "LGPL-3.0", + "dependencies": { + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7", + "web3-validator": "^2.0.3" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-personal": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-4.1.0.tgz", + "integrity": "sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==", + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "^4.6.0", + "web3-eth": "^4.9.0", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.8.0", + "web3-utils": "^4.3.1", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-net": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-4.1.0.tgz", + "integrity": "sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==", + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "^4.4.0", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.6.0", + "web3-utils": "^4.3.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-http": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-4.2.0.tgz", + "integrity": "sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==", + "license": "LGPL-3.0", + "dependencies": { + "cross-fetch": "^4.0.0", + "web3-errors": "^1.3.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.1" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-ipc": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-4.0.7.tgz", + "integrity": "sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==", + "license": "LGPL-3.0", + "optional": true, + "dependencies": { + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-ws": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-4.0.8.tgz", + "integrity": "sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==", + "license": "LGPL-3.0", + "dependencies": { + "@types/ws": "8.5.3", + "isomorphic-ws": "^5.0.0", + "web3-errors": "^1.2.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.1", + "ws": "^8.17.1" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-rpc-methods": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.3.0.tgz", + "integrity": "sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==", + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "^4.4.0", + "web3-types": "^1.6.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-rpc-providers": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/web3-rpc-providers/-/web3-rpc-providers-1.0.0-rc.4.tgz", + "integrity": "sha512-PXosCqHW0EADrYzgmueNHP3Y5jcSmSwH+Dkqvn7EYD0T2jcsdDAIHqk6szBiwIdhumM7gv9Raprsu/s/f7h1fw==", + "license": "LGPL-3.0", + "dependencies": { + "web3-errors": "^1.3.1", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-types": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.10.0.tgz", + "integrity": "sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==", + "license": "LGPL-3.0", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.3.3.tgz", + "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", + "license": "LGPL-3.0", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "eventemitter3": "^5.0.1", + "web3-errors": "^1.3.1", + "web3-types": "^1.10.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-2.0.6.tgz", + "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", + "license": "LGPL-3.0", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "util": "^0.12.5", + "web3-errors": "^1.2.0", + "web3-types": "^1.6.0", + "zod": "^3.21.4" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, "node_modules/websocket-as-promised": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/websocket-as-promised/-/websocket-as-promised-3.0.1.tgz", @@ -2976,6 +5186,16 @@ "node": ">=10" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3019,6 +5239,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", + "license": "MIT", + "dependencies": { + "bs58check": "<3.0.0" + } + }, + "node_modules/wif/node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "license": "MIT", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, "node_modules/workerpool": { "version": "9.3.4", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", @@ -3142,6 +5382,74 @@ } } }, + "node_modules/xrpl": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-2.13.0.tgz", + "integrity": "sha512-jIu9PuG3g+2NZQT8oGmOL3LFkH6Pp+OHS1FNbozEJkajuHAuoCEe2vVddjD8ME81kgV+xRFnXJ+EUbmQDdh/Xg==", + "license": "ISC", + "dependencies": { + "bignumber.js": "^9.0.0", + "bip32": "^2.0.6", + "bip39": "^3.0.4", + "https-proxy-agent": "^5.0.0", + "lodash": "^4.17.4", + "ripple-address-codec": "^4.3.1", + "ripple-binary-codec": "^1.10.0", + "ripple-keypairs": "^1.3.1", + "ws": "^8.2.2", + "xrpl-secret-numbers": "^0.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/xrpl-secret-numbers": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/xrpl-secret-numbers/-/xrpl-secret-numbers-0.3.5.tgz", + "integrity": "sha512-5W2Ijp4nFpplEJ4IEK8JNAnRN9+3/+8BdBQ0hOZ3bZfa/+K9c9GNdN5fHDkKoECJN3nzXNcj6/Ejg7wUQDtRnQ==", + "license": "MIT", + "dependencies": { + "@types/brorand": "^1.0.30", + "brorand": "^1.1.0", + "ripple-keypairs": "^2.0.0" + } + }, + "node_modules/xrpl-secret-numbers/node_modules/@scure/base": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.3.0.tgz", + "integrity": "sha512-NsG6Y03tY6R5BUis4FdVtHVkur0U6FOzskgs9ZXNl78CUc9fkZ78HmENUle1nSOkCasDmbubmWD9qwB7mm4PZA==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/xrpl-secret-numbers/node_modules/ripple-address-codec": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-5.0.1.tgz", + "integrity": "sha512-JQHLKuVJV8lv9Qobmn4aUM2Dpv9WRRLKnNWfM8tN02fAbUtG8mUPsu9q9UYX8P76G4qzytEc5ZKMp/3JggNYmw==", + "license": "ISC", + "dependencies": { + "@scure/base": "^2.0.0", + "@xrplf/isomorphic": "^1.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/xrpl-secret-numbers/node_modules/ripple-keypairs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz", + "integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==", + "license": "ISC", + "dependencies": { + "@noble/curves": "^1.0.0", + "@xrplf/isomorphic": "^1.0.0", + "ripple-address-codec": "^5.0.0" + }, + "engines": { + "node": ">= 16" + } + }, "node_modules/xstate": { "version": "5.19.2", "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.19.2.tgz", @@ -3264,6 +5572,21 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", + "license": "MIT" + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index b518094dc1..b49e5b9b71 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -12,7 +12,8 @@ "compile": "npm run clean && npm run build", "build": "tsc", "clean": "rm -rf build", - "test": "npm run compile && mocha build/test && for f in build/examples/*/*.js; do node \"$f\"; done", + "test:mocha": "npm run compile && mocha --recursive build/test", + "test": "npm run compile && mocha --recursive build/test && for f in build/examples/*/*.js; do node \"$f\"; done", "burner:public-key": "npm run compile && node build/examples/burner/publicKey.js", "burner:address": "npm run compile && node build/examples/burner/address.js", "burner:sign": "npm run compile && node build/examples/burner/sign.js", @@ -42,8 +43,10 @@ "devDependencies": { "@types/chai": "5.2.3", "@types/mocha": "10.0.10", + "@types/sinon": "^22.0.0", "chai": "6.2.2", "mocha": "11.7.6", + "sinon": "^22.1.0", "source-map-support": "^0.5.21", "typescript": "7.0.2" } diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index abda4333cb..ad44170cf9 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -108,7 +108,7 @@ export default class Burner implements Base { const response: any = await this.awaitResponse(); - const publicKey = new PublicKey('04161f62f9778a44bd3d07009b1f2e9df7ab1dc57e74665db7ed8baa95780452ab39f4975099f3ae36f7b6a874b46edd79d1d88573a325b9976fd8f120bed704aa'); + const publicKey = new PublicKey(response.publicKey); const signature = crypto.Signature.fromString(response.signature.der); signature.pubKey = publicKey; diff --git a/packages/bitcore-hardware/test/burner/sign.test.ts b/packages/bitcore-hardware/test/burner/sign.test.ts new file mode 100644 index 0000000000..a1307a0bca --- /dev/null +++ b/packages/bitcore-hardware/test/burner/sign.test.ts @@ -0,0 +1,69 @@ +import sinon from 'sinon'; +import { expect } from 'chai'; +import CWC, { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; +import Burner from '../../src/burner.js'; + +const { PrivateKey, crypto, Transaction, Script } = BitcoreLib; + +describe('Burner Signing', function () { + const sandbox = sinon.createSandbox(); + const burner = new Burner('BTC'); + const privateKey = new PrivateKey(); + const publicKey = privateKey.toPublicKey(); + + before(function () { + this.timeout(5_000); + }); + + afterEach(function () { + sandbox.restore(); + }); + + it('should sign transactions', async function () { + const address = publicKey.toAddress(); + + const utxos = [{ + txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', + outputIndex: 0, + address: address.toString(), + script: Script.buildWitnessV0Out(address), + satoshis: 1100 + }]; + + const tx = CWC.Transactions.create({ + chain: 'BTC', + recipients: [{ address: '1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', amount: 1000 }], + utxos + }); + + const signRequest: Promise = burner.sign({ + tx, + utxos, + password: 'password not relevant to test', + index: 0 + }); + + const hash = CWC.Transactions.getSighash({ + chain: 'BTC', + tx, + utxos, + index: 0 + }); + + const signature = crypto.ECDSA.sign(Buffer.from(hash, 'hex'), privateKey); + + burner.response = { + input: (burner.command as any).keyNo, + digest: (burner.command as any).digest, + signature: { + raw: {}, + der: signature.toString(), + }, + publicKey: publicKey.toString() + }; + + const signedTransaction = new Transaction(await signRequest); + expect(signedTransaction.inputs[0].witnesses[0].length).to.be.greaterThan(70).and.lessThan(73); + expect(signedTransaction.inputs[0].witnesses[1].length).to.equal(33); + }); +}); From 5e219d1ea0c13a3b6e1b0b8e9f9689616815f733 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 13 Aug 2026 00:14:17 -0400 Subject: [PATCH 39/56] sign full transaction on burner and added command queue to sign all the inputs at once --- .../examples/burner/address.ts | 1 - .../bitcore-hardware/examples/burner/sign.ts | 41 +++++- packages/bitcore-hardware/src/burner.ts | 124 +++++++++++------- .../bitcore-hardware/test/burner/sign.test.ts | 10 +- 4 files changed, 117 insertions(+), 59 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/address.ts b/packages/bitcore-hardware/examples/burner/address.ts index 827a61e3ee..2f2e90f028 100644 --- a/packages/bitcore-hardware/examples/burner/address.ts +++ b/packages/bitcore-hardware/examples/burner/address.ts @@ -4,7 +4,6 @@ import Burner from '../../src/burner.js'; const burner = new Burner('btc'); burner.connect(); -throw new Error('htest'); console.log('Tap burner wallet on an NFC reader to get the address...'); console.log(await burner.getAddress({ index: 9 })); diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index 08e2deaed3..6f1b36c952 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -12,13 +12,40 @@ burner.connect(); const publicKey = new PublicKey('04161f62f9778a44bd3d07009b1f2e9df7ab1dc57e74665db7ed8baa95780452ab39f4975099f3ae36f7b6a874b46edd79d1d88573a325b9976fd8f120bed704aa'); const address = publicKey.toAddress(); -const utxos = [{ - txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', - outputIndex: 0, - address: address.toString(), - script: Script.buildWitnessV0Out(address), - satoshis: 1100 -}]; +const utxos = [ + { + chain: 'BTC', + network: 'regtest', + coinbase: true, + mintIndex: 0, + spentTxid: '517dc566fb3a82121840eecdcce4636fb776b6b64ccc4f29f74b870e6bcc44b0', + mintTxid: 'd3667993af738c3db4033dc462ab95f9916da455c628bbf71488484e2b6803c3', + mintHeight: 5, + spentHeight: 111, + address: address.toString(), + script: Script.buildWitnessV0Out(address), + value: 600, + confirmations: 1, + sequenceNumber: 4294967293, + wallets: [] + }, + { + chain: 'BTC', + network: 'regtest', + coinbase: false, + mintIndex: 1, + spentTxid: '', + mintTxid: '517dc566fb3a82121840eecdcce4636fb776b6b64ccc4f29f74b870e6bcc44b0', + mintHeight: 111, + spentHeight: -2, + address: address.toString(), + script: Script.buildWitnessV0Out(address), + value: 600, + confirmations: 1, + sequenceNumber: 4294967295, + wallets: [] + } +]; const tx = CWC.Transactions.create({ chain: 'BTC', diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index ad44170cf9..426b5e8da2 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -13,30 +13,71 @@ const { Address, PublicKey, crypto } = BitcoreLib; */ export default class Burner implements Base { nfc = new NFC(); - command = {}; + // list of commands waiting to be sent to the wallet + commandQueue: Record[] = []; + // responses to all the commands from commandQueue + responses: Record[] = []; chain: string; - response: object | string | number | undefined; constructor(chain: string) { this.chain = chain; } - async awaitResponse() { + /** + * Queues a command to be sent off to the wallet when it is scanned with an NFC reader. + * + * Logic for getting the response is not in this function, but in connect. + * This function simply waits for the card listener to add the responses. + * + * @param command command to queue + * @returns response from the wallet + */ + async sendCommand(command: CommandType): Promise> { + const index = this.commandQueue.length; + this.commandQueue.push(command); + return new Promise(async (resolve1) => { + while (this.responses[index] === undefined) { + await new Promise(resolve2 => setTimeout(resolve2, 10)); + } + resolve1(this.responses[index]); + }); + } + + /** + * Queues a commands to be sent off to the wallet when it is scanned with an NFC reader. + * + * Logic for getting the response is not in this function, but in connect. + * This function simply waits for the card listener to add the responses. + * + * @param command commands to queue + * @returns responses from the wallet + */ + async sendManyCommands(commands: CommandType[]): Promise[]> { + const index = this.commandQueue.length; + for (const command of commands) { + this.commandQueue.push(command); + } return new Promise(async (resolve1) => { - while (this.response === undefined) { + while (this.responses.length < index + commands.length) { await new Promise(resolve2 => setTimeout(resolve2, 10)); } - resolve1(this.response); + resolve1(this.responses.slice(index, index + commands.length)); }); } + /** + * Sends all commands to the wallet and recieves all responses + */ connect() { this.nfc.on('reader', (reader) => { reader.autoProcessing = false; reader.on('card', async () => { try { - this.response = await execHaloCmdPCSC(this.command, reader); + this.responses = []; + for (const command of this.commandQueue) { + this.responses.push(await execHaloCmdPCSC(command, reader)); + } } catch (e) { console.error(e); } @@ -96,45 +137,42 @@ export default class Burner implements Base { bitcoreTx.associateInputs(applicableUtxos.map(utxo => new BitcoreLib.Transaction.UnspentOutput(utxo))); } - const digest = CWC.Transactions.getSighash({ chain: this.chain, tx: bitcoreTx, index: 0 }); - this.response = undefined; - - this.command = { - name: 'sign', - digest, - password, - keyNo: index + const commands: CommandType[] = []; + for (let i = 0; i < bitcoreTx.inputs.length; i++) { + const digest = CWC.Transactions.getSighash({ chain: this.chain, tx: bitcoreTx, index: i }); + commands.push({ + name: 'sign', + digest, + password, + keyNo: index + }); }; - - const response: any = await this.awaitResponse(); - - const publicKey = new PublicKey(response.publicKey); - const signature = crypto.Signature.fromString(response.signature.der); - signature.pubKey = publicKey; - - const verify = crypto.ECDSA.verify(Buffer.from(digest, 'hex'), signature, publicKey); - if (!verify) - throw new Error('Invalid signature'); - - CWC.Transactions.applySignature({ - chain: this.chain, - tx: bitcoreTx, - signature, - index: 0 - }); + const responses = await this.sendManyCommands(commands); + + for (let i = 0; i < bitcoreTx.inputs.length; i++) { + const response = responses[i]; + const publicKey = new PublicKey(response.publicKey); + const signature = crypto.Signature.fromString(response.signature.der); + signature.pubKey = publicKey; + + CWC.Transactions.applySignature({ + chain: this.chain, + tx: bitcoreTx, + signature, + index: i + }); + } return bitcoreTx.serialize(); } async getPublicKey(params: BaseParams) { const { index } = params; - this.response = undefined; - this.command = { + + return (await this.sendCommand({ name: 'get_data_struct_v2', spec: [{ type: 'publicKey', index }] - }; - - return (await this.awaitResponse() as any).publicKey[index].value; + }) as any).publicKey[index].value; } /** @@ -143,22 +181,14 @@ export default class Burner implements Base { * @returns */ async getData(req: Array<{ type: DataType; index: number }>) { - this.response = undefined; - this.command = { + return this.sendCommand({ name: 'get_data_struct_v2', spec: req - }; - - return this.awaitResponse(); + }); } async getAddress(params: BaseParams) { const { index } = params; - this.response = undefined; - this.command = { - name: 'get_data_struct_v2', - spec: [{ type: 'compressedPublicKey', index }] - }; const data: any = await this.getData([{ type: 'compressedPublicKey', index }]); @@ -215,3 +245,5 @@ export type EveryUtxoType = Partial; + +type CommandType = Record & { name: string }; diff --git a/packages/bitcore-hardware/test/burner/sign.test.ts b/packages/bitcore-hardware/test/burner/sign.test.ts index a1307a0bca..003dcc6e2f 100644 --- a/packages/bitcore-hardware/test/burner/sign.test.ts +++ b/packages/bitcore-hardware/test/burner/sign.test.ts @@ -19,7 +19,7 @@ describe('Burner Signing', function () { sandbox.restore(); }); - it('should sign transactions', async function () { + it('should sign a transaction', async function () { const address = publicKey.toAddress(); const utxos = [{ @@ -52,15 +52,15 @@ describe('Burner Signing', function () { const signature = crypto.ECDSA.sign(Buffer.from(hash, 'hex'), privateKey); - burner.response = { - input: (burner.command as any).keyNo, - digest: (burner.command as any).digest, + burner.responses = [{ + input: (burner.commandQueue[0] as any).keyNo, + digest: (burner.commandQueue[0] as any).digest, signature: { raw: {}, der: signature.toString(), }, publicKey: publicKey.toString() - }; + }]; const signedTransaction = new Transaction(await signRequest); expect(signedTransaction.inputs[0].witnesses[0].length).to.be.greaterThan(70).and.lessThan(73); From eb9c14221ee1da3da0dbf4982bb3eb16d8cbb936 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 13 Aug 2026 00:52:42 -0400 Subject: [PATCH 40/56] added signature verification test and refactored test suite for bitcore-hardware --- packages/bitcore-hardware/.mocharc.yml | 1 + packages/bitcore-hardware/package.json | 3 +- .../bitcore-hardware/test/burner/sign.test.ts | 59 +++++++++++++++++++ packages/bitcore-hardware/test/test.test.ts | 8 --- 4 files changed, 61 insertions(+), 10 deletions(-) delete mode 100644 packages/bitcore-hardware/test/test.test.ts diff --git a/packages/bitcore-hardware/.mocharc.yml b/packages/bitcore-hardware/.mocharc.yml index 9120acd265..bac4f764bc 100644 --- a/packages/bitcore-hardware/.mocharc.yml +++ b/packages/bitcore-hardware/.mocharc.yml @@ -1,2 +1,3 @@ enable-source-maps: true exit: true +recursive: true diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index b49e5b9b71..31fc8d39ec 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -12,8 +12,7 @@ "compile": "npm run clean && npm run build", "build": "tsc", "clean": "rm -rf build", - "test:mocha": "npm run compile && mocha --recursive build/test", - "test": "npm run compile && mocha --recursive build/test && for f in build/examples/*/*.js; do node \"$f\"; done", + "test": "npm run compile && mocha build/test", "burner:public-key": "npm run compile && node build/examples/burner/publicKey.js", "burner:address": "npm run compile && node build/examples/burner/address.js", "burner:sign": "npm run compile && node build/examples/burner/sign.js", diff --git a/packages/bitcore-hardware/test/burner/sign.test.ts b/packages/bitcore-hardware/test/burner/sign.test.ts index 003dcc6e2f..92d3cb0824 100644 --- a/packages/bitcore-hardware/test/burner/sign.test.ts +++ b/packages/bitcore-hardware/test/burner/sign.test.ts @@ -1,5 +1,6 @@ import sinon from 'sinon'; import { expect } from 'chai'; +import { describe } from 'mocha'; import CWC, { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; import Burner from '../../src/burner.js'; @@ -15,6 +16,11 @@ describe('Burner Signing', function () { this.timeout(5_000); }); + this.beforeEach(function () { + burner.responses = []; + burner.commandQueue = []; + }); + afterEach(function () { sandbox.restore(); }); @@ -66,4 +72,57 @@ describe('Burner Signing', function () { expect(signedTransaction.inputs[0].witnesses[0].length).to.be.greaterThan(70).and.lessThan(73); expect(signedTransaction.inputs[0].witnesses[1].length).to.equal(33); }); + + it('should throw error if signature does not match public key', async function () { + const address = publicKey.toAddress(); + + const utxos = [{ + txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', + outputIndex: 0, + address: address.toString(), + script: Script.buildWitnessV0Out(address), + satoshis: 1100 + }]; + + const tx = CWC.Transactions.create({ + chain: 'BTC', + recipients: [{ address: '1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', amount: 1000 }], + utxos + }); + + const hash = CWC.Transactions.getSighash({ + chain: 'BTC', + tx, + utxos, + index: 0 + }); + + const signature = crypto.ECDSA.sign(Buffer.from(hash, 'hex'), privateKey); + + const signRequest: Promise = burner.sign({ + tx, + utxos, + password: 'password not relevant to test', + index: 0 + }); + + burner.responses = [{ + input: (burner.commandQueue[0] as any).keyNo, + digest: (burner.commandQueue[0] as any).digest, + signature: { + raw: {}, + der: signature.toString(), + }, + // random, incorrect public key + publicKey: new PrivateKey().toPublicKey().toString() + }]; + + let error = false; + try { + await signRequest; + } catch { + error = true; + } + expect(error, 'did not throw error with incorrect public key').to.be.true; + }); }); diff --git a/packages/bitcore-hardware/test/test.test.ts b/packages/bitcore-hardware/test/test.test.ts deleted file mode 100644 index 791023bd27..0000000000 --- a/packages/bitcore-hardware/test/test.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { expect } from 'chai'; -import { describe, it } from 'mocha'; - -describe('Placeholder Test', function() { - it('should have a test that runs', function() { - expect(true).to.be.true; - }); -}); From 81b6e2d1cc7dca4e85a5f7248aa15b05394969fd Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Thu, 13 Aug 2026 01:14:11 -0400 Subject: [PATCH 41/56] added bitcore-lib transaction to test and bitcore-node utxo test for burner --- packages/bitcore-hardware/.mocharc.yml | 1 + .../bitcore-hardware/test/burner/sign.test.ts | 122 +++++++++++++++++- 2 files changed, 119 insertions(+), 4 deletions(-) diff --git a/packages/bitcore-hardware/.mocharc.yml b/packages/bitcore-hardware/.mocharc.yml index bac4f764bc..5735d85401 100644 --- a/packages/bitcore-hardware/.mocharc.yml +++ b/packages/bitcore-hardware/.mocharc.yml @@ -1,3 +1,4 @@ enable-source-maps: true exit: true recursive: true +timeout: 5000 diff --git a/packages/bitcore-hardware/test/burner/sign.test.ts b/packages/bitcore-hardware/test/burner/sign.test.ts index 92d3cb0824..28a0c743aa 100644 --- a/packages/bitcore-hardware/test/burner/sign.test.ts +++ b/packages/bitcore-hardware/test/burner/sign.test.ts @@ -11,6 +11,7 @@ describe('Burner Signing', function () { const burner = new Burner('BTC'); const privateKey = new PrivateKey(); const publicKey = privateKey.toPublicKey(); + const address = publicKey.toAddress(); before(function () { this.timeout(5_000); @@ -26,8 +27,6 @@ describe('Burner Signing', function () { }); it('should sign a transaction', async function () { - const address = publicKey.toAddress(); - const utxos = [{ txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', outputIndex: 0, @@ -74,8 +73,6 @@ describe('Burner Signing', function () { }); it('should throw error if signature does not match public key', async function () { - const address = publicKey.toAddress(); - const utxos = [{ txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', outputIndex: 0, @@ -125,4 +122,121 @@ describe('Burner Signing', function () { } expect(error, 'did not throw error with incorrect public key').to.be.true; }); + + it('should sign a bitcore-lib transaction without separate utxos', async function () { + const utxos = [{ + txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', + outputIndex: 0, + address: address.toString(), + script: Script.buildWitnessV0Out(address), + satoshis: 1100 + }]; + + const tx = new Transaction() + .from(utxos) + .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 1000); + + const signRequest: Promise = burner.sign({ + tx, + password: 'password not relevant to test', + index: 0 + }); + + const hash = CWC.Transactions.getSighash({ + chain: 'BTC', + tx, + utxos, + index: 0 + }); + + const signature = crypto.ECDSA.sign(Buffer.from(hash, 'hex'), privateKey); + + burner.responses = [{ + input: (burner.commandQueue[0] as any).keyNo, + digest: (burner.commandQueue[0] as any).digest, + signature: { + raw: {}, + der: signature.toString(), + }, + publicKey: publicKey.toString() + }]; + + const signedTransaction = new Transaction(await signRequest); + expect(signedTransaction.inputs[0].witnesses[0].length).to.be.greaterThan(70).and.lessThan(73); + expect(signedTransaction.inputs[0].witnesses[1].length).to.equal(33); + }); + + it('should sign a transaction with bitcore-node style utxos', async function () { + const utxos = [ + { + chain: 'BTC', + network: 'regtest', + coinbase: true, + mintIndex: 0, + spentTxid: '517dc566fb3a82121840eecdcce4636fb776b6b64ccc4f29f74b870e6bcc44b0', + mintTxid: 'd3667993af738c3db4033dc462ab95f9916da455c628bbf71488484e2b6803c3', + mintHeight: 5, + spentHeight: 111, + address: address.toString(), + script: Script.buildWitnessV0Out(address), + value: 600, + confirmations: 1, + sequenceNumber: 4294967293, + wallets: [] + }, + { + chain: 'BTC', + network: 'regtest', + coinbase: false, + mintIndex: 1, + spentTxid: '', + mintTxid: '517dc566fb3a82121840eecdcce4636fb776b6b64ccc4f29f74b870e6bcc44b0', + mintHeight: 111, + spentHeight: -2, + address: address.toString(), + script: Script.buildWitnessV0Out(address), + value: 520, + confirmations: 1, + sequenceNumber: 4294967295, + wallets: [] + } + ]; + + const tx = CWC.Transactions.create({ + chain: 'BTC', + recipients: [{ address: '1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', amount: 1000 }], + utxos + }); + + const signRequest: Promise = burner.sign({ + tx, + utxos, + password: 'password not relevant to test', + index: 0 + }); + + for (let i = 0; i < utxos.length; i++) { + const hash = CWC.Transactions.getSighash({ + chain: 'BTC', + tx, + utxos, + index: i + }); + const signature = crypto.ECDSA.sign(Buffer.from(hash, 'hex'), privateKey); + + burner.responses.push({ + input: (burner.commandQueue[0] as any).keyNo, + digest: (burner.commandQueue[0] as any).digest, + signature: { + raw: {}, + der: signature.toString(), + }, + publicKey: publicKey.toString() + }); + } + + const signedTransaction = new Transaction(await signRequest); + expect(signedTransaction.inputs[0].witnesses[0].length).to.be.greaterThan(70).and.lessThan(73); + expect(signedTransaction.inputs[0].witnesses[1].length).to.equal(33); + }); }); From 4a3840e01aaabb1ba3d129a15d96ab39d0318b14 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 13:24:13 -0400 Subject: [PATCH 42/56] added ethereum transaction signing to burner wallet --- .../examples/burner/address.ts | 2 +- .../examples/burner/publicKey.ts | 2 +- .../examples/burner/sign-eth.ts | 27 +++++++++ .../bitcore-hardware/examples/burner/sign.ts | 10 +++- .../examples/burner/version.ts | 2 +- packages/bitcore-hardware/package.json | 1 + packages/bitcore-hardware/src/burner.ts | 58 ++++++++++++++++--- .../bitcore-hardware/test/burner/sign.test.ts | 55 +++++++++++++++++- 8 files changed, 140 insertions(+), 17 deletions(-) create mode 100644 packages/bitcore-hardware/examples/burner/sign-eth.ts diff --git a/packages/bitcore-hardware/examples/burner/address.ts b/packages/bitcore-hardware/examples/burner/address.ts index 2f2e90f028..b6adf4f28f 100644 --- a/packages/bitcore-hardware/examples/burner/address.ts +++ b/packages/bitcore-hardware/examples/burner/address.ts @@ -1,7 +1,7 @@ import 'source-map-support/register.js'; import Burner from '../../src/burner.js'; -const burner = new Burner('btc'); +const burner = new Burner(); burner.connect(); console.log('Tap burner wallet on an NFC reader to get the address...'); diff --git a/packages/bitcore-hardware/examples/burner/publicKey.ts b/packages/bitcore-hardware/examples/burner/publicKey.ts index a302731ab2..cbb58e8119 100644 --- a/packages/bitcore-hardware/examples/burner/publicKey.ts +++ b/packages/bitcore-hardware/examples/burner/publicKey.ts @@ -1,7 +1,7 @@ import 'source-map-support/register.js'; import Burner from '../../src/burner.js'; -const burner = new Burner('btc'); +const burner = new Burner(); burner.connect(); console.log('Tap burner wallet on an NFC reader to output the public key...'); diff --git a/packages/bitcore-hardware/examples/burner/sign-eth.ts b/packages/bitcore-hardware/examples/burner/sign-eth.ts new file mode 100644 index 0000000000..7f027eda3a --- /dev/null +++ b/packages/bitcore-hardware/examples/burner/sign-eth.ts @@ -0,0 +1,27 @@ +import 'source-map-support/register.js'; +import CWC from '@bitpay-labs/crypto-wallet-core'; +import Burner from '../../src/burner.js'; + +const burner = new Burner(); +burner.connect(); + +const tx = CWC.Transactions.create({ + chain: 'ETH', + recipients: [{ address: '0x37d7B3bBD88EFdE6a93cF74D2F5b0385D3E3B08A', amount: 3896000000000000 }], + nonce: 0, + gasPrice: 20000000000, + data: '0xb6b4af05000000000000000000000000000000000000000000000000000dd764300b800000000000000000000000000000000000000000000000000000000004a817c8000000000000000000000000000000000000000000000000000000016ada606a26050bb49a5a8228599e0dd48c1368abd36f4f14d2b74a015b2d168dbcab0773ce399393220df874bb22ca961f351e038acd2ba5cc8c764385c9f23707622cc435000000000000000000000000000000000000000000000000000000000000001c7e247d684a635813267b10a63f7f3ba88b28ca2790c909110b28236cf1b9bba03451e83d5834189f28d4c77802fc76b7c760a42bc8bebf8dd15e6ead146805630000000000000000000000000000000000000000000000000000000000000000' +}); + +console.log('Tap burner wallet on an NFC reader to sign a transaction'); +const signedTransaction = await burner.sign({ + chain: 'ETH', + tx, + password: '123456', + index: 9 +}); + +console.log('Signed transaction'); +console.log(signedTransaction); + +process.exit(0); diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index 6f1b36c952..e0c2b95d32 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -4,7 +4,7 @@ import Burner from '../../src/burner.js'; const { PublicKey, Script } = CWC.BitcoreLib; -const burner = new Burner('btc'); +const burner = new Burner(); burner.connect(); // Predefined for now. For other wallets: @@ -54,7 +54,13 @@ const tx = CWC.Transactions.create({ }); console.log('Tap burner wallet on an NFC reader to sign a transaction'); -const signedTransaction: any = await burner.sign({ tx, utxos, index: 9, password: '123456' }); +const signedTransaction: any = await burner.sign({ + chain: 'BTC', + tx, + utxos, + index: 9, + password: '123456' +}); console.log('Signed transaction'); console.log(signedTransaction); diff --git a/packages/bitcore-hardware/examples/burner/version.ts b/packages/bitcore-hardware/examples/burner/version.ts index 74ea08833b..a02ca0fb48 100644 --- a/packages/bitcore-hardware/examples/burner/version.ts +++ b/packages/bitcore-hardware/examples/burner/version.ts @@ -1,7 +1,7 @@ import 'source-map-support/register.js'; import Burner from '../../src/burner.js'; -const burner = new Burner('btc'); +const burner = new Burner(); burner.connect(); console.log('Tap burner wallet on an NFC reader to get the firmware version...'); diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 31fc8d39ec..c7e7c0f7f6 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -16,6 +16,7 @@ "burner:public-key": "npm run compile && node build/examples/burner/publicKey.js", "burner:address": "npm run compile && node build/examples/burner/address.js", "burner:sign": "npm run compile && node build/examples/burner/sign.js", + "burner:sign-eth": "npm run compile && node build/examples/burner/sign-eth.js", "burner:version": "npm run compile && node build/examples/burner/version.js", "ledger:public-key": "npm run compile && node build/examples/ledger/publicKey.js", "ledger:address": "npm run compile && node build/examples/ledger/address.js", diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 426b5e8da2..9c8e0f163c 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -17,11 +17,6 @@ export default class Burner implements Base { commandQueue: Record[] = []; // responses to all the commands from commandQueue responses: Record[] = []; - chain: string; - - constructor(chain: string) { - this.chain = chain; - } /** * Queues a command to be sent off to the wallet when it is scanned with an NFC reader. @@ -121,6 +116,22 @@ export default class Burner implements Base { } async sign(params: { + chain: 'BTC' | 'ETH'; + tx: TransactionType; + utxos?: EveryUtxoType[]; + index: number; + password: string; + }) { + switch (params.chain) { + case 'ETH': + return this.signEth(params); + case 'BTC': + default: + return this.signBtc(params); + } + } + + async signBtc(params: { tx: TransactionType; utxos?: EveryUtxoType[]; index: number; @@ -139,10 +150,10 @@ export default class Burner implements Base { const commands: CommandType[] = []; for (let i = 0; i < bitcoreTx.inputs.length; i++) { - const digest = CWC.Transactions.getSighash({ chain: this.chain, tx: bitcoreTx, index: i }); + const sighash = CWC.Transactions.getSighash({ chain: 'BTC', tx: bitcoreTx, index: i }); commands.push({ name: 'sign', - digest, + digest: sighash, password, keyNo: index }); @@ -156,7 +167,7 @@ export default class Burner implements Base { signature.pubKey = publicKey; CWC.Transactions.applySignature({ - chain: this.chain, + chain: 'BTC', tx: bitcoreTx, signature, index: i @@ -166,6 +177,31 @@ export default class Burner implements Base { return bitcoreTx.serialize(); } + async signEth(params: { tx: string; index: number; password: string }) { + const { tx, index, password } = params; + + const sighash = CWC.Transactions.getSighash({ + chain: 'ETH', + tx + }); + + const response = await this.sendCommand({ + name: 'sign', + digest: sighash, + password, + keyNo: index + }); + const signature = response.signature.ether; + + const signedTx = CWC.Transactions.applySignature({ + chain: 'ETH', + tx, + signature + }); + + return signedTx; + } + async getPublicKey(params: BaseParams) { const { index } = params; @@ -246,4 +282,8 @@ export type EveryUtxoType = Partial; -type CommandType = Record & { name: string }; +type CommandType = Record & { + name: string; + password?: string; + keyNo?: number; +}; diff --git a/packages/bitcore-hardware/test/burner/sign.test.ts b/packages/bitcore-hardware/test/burner/sign.test.ts index 28a0c743aa..d92f163306 100644 --- a/packages/bitcore-hardware/test/burner/sign.test.ts +++ b/packages/bitcore-hardware/test/burner/sign.test.ts @@ -8,7 +8,7 @@ const { PrivateKey, crypto, Transaction, Script } = BitcoreLib; describe('Burner Signing', function () { const sandbox = sinon.createSandbox(); - const burner = new Burner('BTC'); + const burner = new Burner(); const privateKey = new PrivateKey(); const publicKey = privateKey.toPublicKey(); const address = publicKey.toAddress(); @@ -17,7 +17,7 @@ describe('Burner Signing', function () { this.timeout(5_000); }); - this.beforeEach(function () { + beforeEach(function () { burner.responses = []; burner.commandQueue = []; }); @@ -26,7 +26,7 @@ describe('Burner Signing', function () { sandbox.restore(); }); - it('should sign a transaction', async function () { + it('should sign a BTC transaction', async function () { const utxos = [{ txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', outputIndex: 0, @@ -42,6 +42,7 @@ describe('Burner Signing', function () { }); const signRequest: Promise = burner.sign({ + chain: 'BTC', tx, utxos, password: 'password not relevant to test', @@ -72,6 +73,51 @@ describe('Burner Signing', function () { expect(signedTransaction.inputs[0].witnesses[1].length).to.equal(33); }); + it('should sign an ETH transaction', async function () { + const key = { + address: '0xb4b9be3062b6dB6eDa78fa4b5EA80595Cfa7E655', + privKey: '0x733d4cddb30d33f324def2bb80c6a844f7ba342a60bed06d838afb6b37ab1972', + }; + + const tx = CWC.Transactions.create({ + chain: 'ETH', + recipients: [{ address: '0x37d7B3bBD88EFdE6a93cF74D2F5b0385D3E3B08A', amount: 3896000000000000 }], + nonce: 0, + gasPrice: 20000000000, + data: '0xb6b4af05000000000000000000000000000000000000000000000000000dd764300b800000000000000000000000000000000000000000000000000000000004a817c8000000000000000000000000000000000000000000000000000000016ada606a26050bb49a5a8228599e0dd48c1368abd36f4f14d2b74a015b2d168dbcab0773ce399393220df874bb22ca961f351e038acd2ba5cc8c764385c9f23707622cc435000000000000000000000000000000000000000000000000000000000000001c7e247d684a635813267b10a63f7f3ba88b28ca2790c909110b28236cf1b9bba03451e83d5834189f28d4c77802fc76b7c760a42bc8bebf8dd15e6ead146805630000000000000000000000000000000000000000000000000000000000000000' + }); + + const signRequest = burner.sign({ + chain: 'ETH', + tx, + password: 'password not relevant to test', + index: 0 + }); + + const signature = CWC.Transactions.getSignature({ + chain: 'ETH', + tx, + key + }); + + burner.responses = [{ + input: (burner.commandQueue[0] as any).keyNo, + digest: (burner.commandQueue[0] as any).digest, + signature: { + raw: {}, + ether: signature, + } + }]; + const signedTx = await signRequest; + + const expectedSignedTx = CWC.Transactions.sign({ + chain: 'ETH', + tx, + key + }); + expect(signedTx).to.equal(expectedSignedTx); + }); + it('should throw error if signature does not match public key', async function () { const utxos = [{ txId: '115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986', @@ -97,6 +143,7 @@ describe('Burner Signing', function () { const signature = crypto.ECDSA.sign(Buffer.from(hash, 'hex'), privateKey); const signRequest: Promise = burner.sign({ + chain: 'BTC', tx, utxos, password: 'password not relevant to test', @@ -137,6 +184,7 @@ describe('Burner Signing', function () { .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 1000); const signRequest: Promise = burner.sign({ + chain: 'BTC', tx, password: 'password not relevant to test', index: 0 @@ -209,6 +257,7 @@ describe('Burner Signing', function () { }); const signRequest: Promise = burner.sign({ + chain: 'BTC', tx, utxos, password: 'password not relevant to test', From 50ee1a452e15ff0cfa75976ed428a024614eeb5c Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 14:32:36 -0400 Subject: [PATCH 43/56] added ethereum signing to ledger --- .../examples/ledger/sign-eth.ts | 23 ++ packages/bitcore-hardware/package-lock.json | 218 ++++++++++++++++++ packages/bitcore-hardware/package.json | 2 + packages/bitcore-hardware/src/ledger.ts | 42 +++- 4 files changed, 278 insertions(+), 7 deletions(-) create mode 100644 packages/bitcore-hardware/examples/ledger/sign-eth.ts diff --git a/packages/bitcore-hardware/examples/ledger/sign-eth.ts b/packages/bitcore-hardware/examples/ledger/sign-eth.ts new file mode 100644 index 0000000000..43be1eb198 --- /dev/null +++ b/packages/bitcore-hardware/examples/ledger/sign-eth.ts @@ -0,0 +1,23 @@ +import 'source-map-support/register.js'; +import CWC from '@bitpay-labs/crypto-wallet-core'; +import Ledger from '../../src/ledger.js'; + +const ledger = new Ledger(); +await ledger.connect(); + +const tx = CWC.Transactions.create({ + chain: 'ETH', + recipients: [{ address: '0x37d7B3bBD88EFdE6a93cF74D2F5b0385D3E3B08A', amount: 3896000000000000 }], + nonce: 0, + gasPrice: 21000, + data: '0x' +}); + +console.log(`Sign ${tx}`); +const signedTransaction = await ledger.signEth(tx); + +console.log('Signed transaction'); +console.log(signedTransaction); + +await ledger.disconnect(); +process.exit(0); diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index b4a9456535..ad3a3d3b55 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -13,6 +13,7 @@ "@bitpay-labs/crypto-wallet-core": "^11.5.1", "@ledgerhq/device-management-kit": "^1.7.1", "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", + "@ledgerhq/device-signer-kit-ethereum": "^1.16.0", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", "@ledgerhq/signer-utils": "^1.3.0", "nfc-pcsc": "^0.8.1", @@ -317,6 +318,125 @@ "node": ">=12" } }, + "node_modules/@ledgerhq/context-module": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/context-module/-/context-module-2.3.1.tgz", + "integrity": "sha512-OfpvgNlI1tz+2B6UPOeHR5FuDmmW9LVfDBOXbK5u1fOnr6r//tArJvhhHc3mLePozbXpBfHl0dhr7UZb347+aw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "bs58": "^6.0.0", + "crypto-js": "^4.2.0", + "ethers": "6.14.1", + "inversify": "7.5.1", + "purify-ts": "2.1.0", + "reflect-metadata": "0.2.2" + }, + "peerDependencies": { + "@ledgerhq/device-management-kit": "^1.7.1" + } + }, + "node_modules/@ledgerhq/context-module/node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT", + "peer": true + }, + "node_modules/@ledgerhq/context-module/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ledgerhq/context-module/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ledgerhq/context-module/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", + "peer": true + }, + "node_modules/@ledgerhq/context-module/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", + "peer": true, + "dependencies": { + "base-x": "^5.0.0" + } + }, + "node_modules/@ledgerhq/context-module/node_modules/ethers": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.14.1.tgz", + "integrity": "sha512-JnFiPFi3sK2Z6y7jZ3qrafDMwiXmU+6cNZ0M+kPq+mTy9skqEzwqAdFW3nb/em2xjlIVXX6Lz8ID6i3LmS4+fQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@ledgerhq/context-module/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@ledgerhq/device-management-kit": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@ledgerhq/device-management-kit/-/device-management-kit-1.7.1.tgz", @@ -356,6 +476,104 @@ "bitcoinjs-lib": "^6.1.6" } }, + "node_modules/@ledgerhq/device-signer-kit-ethereum": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/device-signer-kit-ethereum/-/device-signer-kit-ethereum-1.16.0.tgz", + "integrity": "sha512-lRXCAHlNcZObazX4sQrD2fiVssolzJYjcyzH+9b2AKnV1bfxN5JCY4coIge/L+23LjDVhqibVK6jg8ioUJ4znQ==", + "license": "Apache-2.0", + "dependencies": { + "@ledgerhq/signer-utils": "^1.2.0", + "ethers": "6.14.1", + "inversify": "7.5.1", + "purify-ts": "2.1.0", + "reflect-metadata": "0.2.2", + "semver": "7.7.2", + "xstate": "5.19.2" + }, + "peerDependencies": { + "@ledgerhq/context-module": "^2.0.0", + "@ledgerhq/device-management-kit": "^1.5.0" + } + }, + "node_modules/@ledgerhq/device-signer-kit-ethereum/node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, + "node_modules/@ledgerhq/device-signer-kit-ethereum/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ledgerhq/device-signer-kit-ethereum/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ledgerhq/device-signer-kit-ethereum/node_modules/ethers": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.14.1.tgz", + "integrity": "sha512-JnFiPFi3sK2Z6y7jZ3qrafDMwiXmU+6cNZ0M+kPq+mTy9skqEzwqAdFW3nb/em2xjlIVXX6Lz8ID6i3LmS4+fQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@ledgerhq/device-signer-kit-ethereum/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@ledgerhq/device-transport-kit-node-hid": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@ledgerhq/device-transport-kit-node-hid/-/device-transport-kit-node-hid-1.0.1.tgz", diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index c7e7c0f7f6..e65a7e747f 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -21,6 +21,7 @@ "ledger:public-key": "npm run compile && node build/examples/ledger/publicKey.js", "ledger:address": "npm run compile && node build/examples/ledger/address.js", "ledger:sign": "npm run compile && node build/examples/ledger/sign.js", + "ledger:sign-eth": "npm run compile && node build/examples/ledger/sign-eth.js", "ledger:version": "npm run compile && node build/examples/ledger/version.js" }, "keywords": [ @@ -35,6 +36,7 @@ "@bitpay-labs/crypto-wallet-core": "^11.5.1", "@ledgerhq/device-management-kit": "^1.7.1", "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", + "@ledgerhq/device-signer-kit-ethereum": "^1.16.0", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", "@ledgerhq/signer-utils": "^1.3.0", "nfc-pcsc": "^0.8.1", diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts index 3da20c27ba..8a1409185c 100644 --- a/packages/bitcore-hardware/src/ledger.ts +++ b/packages/bitcore-hardware/src/ledger.ts @@ -1,5 +1,5 @@ import { createRequire } from 'module'; -import { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; +import CWC, { BitcoreLib, ethers } from '@bitpay-labs/crypto-wallet-core'; import { Psbt } from 'bitcoinjs-lib'; import { Observable, @@ -18,6 +18,9 @@ const { DefaultWallet, SignerBtcBuilder } = require('@ledgerhq/device-signer-kit-bitcoin'); +const { + SignerEthBuilder +} = require('@ledgerhq/device-signer-kit-ethereum'); const { HDPublicKey, Transaction } = BitcoreLib; @@ -25,7 +28,8 @@ export default class Ledger implements Base { device: any; sessionId: any; discoverySubscryption: any; - signer: any; + signerBtc: any; + signerEth: any; async connect() { return new Promise(async (resolve) => { @@ -45,7 +49,8 @@ export default class Ledger implements Base { sessionId: this.sessionId }); - this.signer = new SignerBtcBuilder({ dmk, sessionId: this.sessionId }).build(); + this.signerBtc = new SignerBtcBuilder({ dmk, sessionId: this.sessionId }).build(); + this.signerEth = new SignerEthBuilder({ dmk, sessionId: this.sessionId }).build(); resolve(0); } catch (error) { console.error(error); @@ -84,14 +89,20 @@ export default class Ledger implements Base { async getAddress(params: BaseParams) { const { index } = params; - const ob: Observable = this.signer.getWalletAddress({ derivationPath: "84'/0'/0'", template: 'wpkh(@0/**)' }, index).observable; + const ob: Observable = this.signerBtc.getWalletAddress({ derivationPath: "84'/0'/0'", template: 'wpkh(@0/**)' }, index).observable; const result = await lastValueFrom(ob); return result.output.address; } async getPublicKey(params: BaseParams) { const { index } = params; - const ob: Observable = this.signer.getExtendedPublicKey("84'/0'/0'", index).observable; + const ob: Observable = this.signerBtc.getExtendedPublicKey("84'/0'/0'", index).observable; + const result = await lastValueFrom(ob); + return result.output.extendedPublicKey; + } + async getPublicKeyEth(params: BaseParams) { + const { index } = params; + const ob: Observable = this.signerEth.getExtendedPublicKey("84'/0'/0'", index).observable; const result = await lastValueFrom(ob); return result.output.extendedPublicKey; } @@ -118,7 +129,7 @@ export default class Ledger implements Base { psbt.addOutputs([{ address: 'bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq', value: 900 }]); - const ob: Observable = this.signer.signTransaction( + const ob: Observable = this.signerBtc.signTransaction( new DefaultWallet("84'/0'/0'", 'wpkh(@0/**)'), psbt ).observable; @@ -127,8 +138,25 @@ export default class Ledger implements Base { return new Transaction(result.output.slice(2)); } + async signEth(tx: string) { + const bytes = ethers.getBytes(tx); + const ob: Observable = this.signerEth.signTransaction( + "44'/60'/0'/0/0", + bytes + ).observable; + + const result = await lastValueFrom(ob); + const signature = result.output; + const signedTx = CWC.Transactions.applySignature({ + chain: 'ETH', + tx, + signature + }); + return signedTx; + } + async getMasterKeyFingerprint(): Promise { - const ob: Observable = this.signer.getMasterFingerprint().observable; + const ob: Observable = this.signerBtc.getMasterFingerprint().observable; const result = await lastValueFrom(ob); return result.output.masterFingerprint; From 84998b00c60b7ea6a571a74701e42318e338be96 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 15:36:58 -0400 Subject: [PATCH 44/56] full ethereum functionality with ledger using module separation --- .../examples/ledger/address.ts | 7 +- .../examples/ledger/publicKey.ts | 7 +- .../examples/ledger/sign-eth.ts | 7 +- .../bitcore-hardware/examples/ledger/sign.ts | 10 +- .../examples/ledger/version.ts | 4 +- packages/bitcore-hardware/src/base.ts | 15 +- packages/bitcore-hardware/src/burner.ts | 38 +--- packages/bitcore-hardware/src/ledger.ts | 164 ------------------ .../bitcore-hardware/src/{ => ledger}/dmk.ts | 0 .../src/ledger/modules/btc.ts | 74 ++++++++ .../src/ledger/modules/eth.ts | 46 +++++ .../src/ledger/modules/index.ts | 7 + .../bitcore-hardware/src/ledger/wallet.ts | 102 +++++++++++ .../bitcore-hardware/src/types/txTypes.ts | 38 ++++ 14 files changed, 300 insertions(+), 219 deletions(-) delete mode 100644 packages/bitcore-hardware/src/ledger.ts rename packages/bitcore-hardware/src/{ => ledger}/dmk.ts (100%) create mode 100644 packages/bitcore-hardware/src/ledger/modules/btc.ts create mode 100644 packages/bitcore-hardware/src/ledger/modules/eth.ts create mode 100644 packages/bitcore-hardware/src/ledger/modules/index.ts create mode 100644 packages/bitcore-hardware/src/ledger/wallet.ts create mode 100644 packages/bitcore-hardware/src/types/txTypes.ts diff --git a/packages/bitcore-hardware/examples/ledger/address.ts b/packages/bitcore-hardware/examples/ledger/address.ts index fa4e970bec..f0849bdd4e 100644 --- a/packages/bitcore-hardware/examples/ledger/address.ts +++ b/packages/bitcore-hardware/examples/ledger/address.ts @@ -1,8 +1,11 @@ import 'source-map-support/register.js'; -import Ledger from '../../src/ledger.js'; +import Ledger from '../../src/ledger/wallet.js'; + +const args = process.argv.slice(2); +const chain = args[0] || 'BTC'; const ledger = new Ledger(); await ledger.connect(); -console.log(await ledger.getAddress({ index: 0 })); +console.log(await ledger.getAddress({ chain })); await ledger.disconnect(); process.exit(0); diff --git a/packages/bitcore-hardware/examples/ledger/publicKey.ts b/packages/bitcore-hardware/examples/ledger/publicKey.ts index c895331284..7f43d8bcd9 100644 --- a/packages/bitcore-hardware/examples/ledger/publicKey.ts +++ b/packages/bitcore-hardware/examples/ledger/publicKey.ts @@ -1,8 +1,11 @@ import 'source-map-support/register.js'; -import Ledger from '../../src/ledger.js'; +import Ledger from '../../src/ledger/wallet.js'; + +const args = process.argv.slice(2); +const chain = args[0] || 'BTC'; const ledger = new Ledger(); await ledger.connect(); -console.log(await ledger.getPublicKey({ index: 0 })); +console.log(await ledger.getPublicKey({ chain })); await ledger.disconnect(); process.exit(0); diff --git a/packages/bitcore-hardware/examples/ledger/sign-eth.ts b/packages/bitcore-hardware/examples/ledger/sign-eth.ts index 43be1eb198..6a031c1015 100644 --- a/packages/bitcore-hardware/examples/ledger/sign-eth.ts +++ b/packages/bitcore-hardware/examples/ledger/sign-eth.ts @@ -1,6 +1,6 @@ import 'source-map-support/register.js'; import CWC from '@bitpay-labs/crypto-wallet-core'; -import Ledger from '../../src/ledger.js'; +import Ledger from '../../src/ledger/wallet.js'; const ledger = new Ledger(); await ledger.connect(); @@ -14,7 +14,10 @@ const tx = CWC.Transactions.create({ }); console.log(`Sign ${tx}`); -const signedTransaction = await ledger.signEth(tx); +const signedTransaction = await ledger.sign({ + chain: 'ETH', + tx +}); console.log('Signed transaction'); console.log(signedTransaction); diff --git a/packages/bitcore-hardware/examples/ledger/sign.ts b/packages/bitcore-hardware/examples/ledger/sign.ts index 608c5d6f0f..7da5679858 100644 --- a/packages/bitcore-hardware/examples/ledger/sign.ts +++ b/packages/bitcore-hardware/examples/ledger/sign.ts @@ -1,13 +1,13 @@ import 'source-map-support/register.js'; import { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; -import Ledger from '../../src/ledger.js'; +import Ledger from '../../src/ledger/wallet.js'; const { HDPublicKey, Script, Transaction } = BitcoreLib; const ledger = new Ledger(); await ledger.connect(); -const publickey = new HDPublicKey(await ledger.getPublicKey({ index: 0 })).derive('m/0/0').publicKey; +const publickey = new HDPublicKey(await ledger.getPublicKey({ chain: 'BTC', index: 0 })).derive('m/0/0').publicKey; const tx = new Transaction() .from({ @@ -18,9 +18,11 @@ const tx = new Transaction() satoshis: 9290 }); -const signedTransaction = await ledger.sign(tx); +const signedTransaction = await ledger.sign({ + chain: 'BTC', + tx +}); console.log(signedTransaction); -console.log(signedTransaction.toBuffer().toString('hex')); await ledger.disconnect(); console.log('Signed transaction'); diff --git a/packages/bitcore-hardware/examples/ledger/version.ts b/packages/bitcore-hardware/examples/ledger/version.ts index 3b85f131c4..55cc3a8a0d 100644 --- a/packages/bitcore-hardware/examples/ledger/version.ts +++ b/packages/bitcore-hardware/examples/ledger/version.ts @@ -1,8 +1,8 @@ import 'source-map-support/register.js'; -import Ledger from '../../src/ledger.js'; +import Ledger from '../../src/ledger/wallet.js'; const ledger = new Ledger(); await ledger.connect(); -console.log(await ledger.getMasterKeyFingerprint()); +console.log(await ledger.getVersion()); await ledger.disconnect(); process.exit(0); diff --git a/packages/bitcore-hardware/src/base.ts b/packages/bitcore-hardware/src/base.ts index 125863d02d..44f77dc9bc 100644 --- a/packages/bitcore-hardware/src/base.ts +++ b/packages/bitcore-hardware/src/base.ts @@ -1,9 +1,12 @@ -import { BaseParams } from './types/paramTypes.js'; - +export interface BaseModule { + sign(params: any): Promise; + getPublicKey(params: any): Promise; + getAddress(params: any): Promise; +}; export interface Base { connect(): void; - sign(params: any): Promise; - getPublicKey(params: BaseParams): Promise; - getAddress(params: BaseParams): Promise; - getVersion(params?: BaseParams): Promise; + sign(params: any): Promise; + getPublicKey(params: any): Promise; + getAddress(params: any): Promise; + getVersion(params: any): Promise; }; diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 9c8e0f163c..4bc38f4670 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -4,6 +4,7 @@ import { NFC } from 'nfc-pcsc'; import { Base } from './base.js'; import { DataType } from './types/burnerTypes.js'; import { BaseParams } from './types/paramTypes.js'; +import { EveryUtxoType, TransactionType, UtxoType } from './types/txTypes.js'; const { Address, PublicKey, crypto } = BitcoreLib; @@ -245,43 +246,6 @@ export default class Burner implements Base { } } -/** Transaction data that can be converted into a Transaction via Transaction(tx) */ -type TransactionType = BitcoreLib.Transaction | string | Buffer | object; - -/** - * Standard utxo type use for internal processing. - * Property names are from bitcore-lib's UnspentOutput. - * Note, UnspentOutput addresses and scripts are Address and Script classes respectively, - * here they are both strings. - */ -export type UtxoType = { - txId: string; - outputIndex: number; - satoshis: number; - script: string; - address?: string; -}; - -/** - * Utxo type for functions were the received utxo type is unknown. - * Could either be in the format of UnspentOutput, UnspentOutput.toObject, or from bitcore-node. - */ -export type EveryUtxoType = Partial; - type CommandType = Record & { name: string; password?: string; diff --git a/packages/bitcore-hardware/src/ledger.ts b/packages/bitcore-hardware/src/ledger.ts deleted file mode 100644 index 8a1409185c..0000000000 --- a/packages/bitcore-hardware/src/ledger.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { createRequire } from 'module'; -import CWC, { BitcoreLib, ethers } from '@bitpay-labs/crypto-wallet-core'; -import { Psbt } from 'bitcoinjs-lib'; -import { - Observable, - lastValueFrom -} from 'rxjs'; -import { Base } from './base.js'; -import { dmk } from './dmk.js'; -import { BaseParams } from './types/paramTypes.js'; -// @eslint disable import/newline-after-import -const require = createRequire(import.meta.url); -const { - CloseAppCommand, - GetOsVersionCommand -} = require('@ledgerhq/device-management-kit'); -const { - DefaultWallet, - SignerBtcBuilder -} = require('@ledgerhq/device-signer-kit-bitcoin'); -const { - SignerEthBuilder -} = require('@ledgerhq/device-signer-kit-ethereum'); - -const { HDPublicKey, Transaction } = BitcoreLib; - -export default class Ledger implements Base { - device: any; - sessionId: any; - discoverySubscryption: any; - signerBtc: any; - signerEth: any; - - async connect() { - return new Promise(async (resolve) => { - console.log('Discovering Ledger device...'); - if (this.discoverySubscryption) { - this.discoverySubscryption.unsubscribe(); - } - - this.discoverySubscryption = dmk.startDiscovering({}).subscribe({ - next: async (device) => { - console.log(`Found ${device.id}, model: ${device.deviceModel.model}`); - try { - this.sessionId = await dmk.connect({ device }); - this.discoverySubscryption.unsubscribe(); - - this.device = dmk.getConnectedDevice({ - sessionId: this.sessionId - }); - - this.signerBtc = new SignerBtcBuilder({ dmk, sessionId: this.sessionId }).build(); - this.signerEth = new SignerEthBuilder({ dmk, sessionId: this.sessionId }).build(); - resolve(0); - } catch (error) { - console.error(error); - resolve(1); - } - }, - error: (error) => { - console.error(error); - resolve(1); - } - }); - }); - } - - async disconnect() { - if (this.discoverySubscryption) { - this.discoverySubscryption.unsubscribe(); - } - - if (this.sessionId) { - try { - await dmk.disconnect({ sessionId: this.sessionId }); - this.sessionId = null; - console.log(`Disconnected ${this.device.name}`); - } catch (error) { - console.error(error); - } - } - } - - async getVersion() { - await dmk.sendCommand({ sessionId: this.sessionId, command: new CloseAppCommand() }); - const { seVersion } = (await dmk.sendCommand({ sessionId: this.sessionId, command: new GetOsVersionCommand() })).data; - return seVersion; - } - - async getAddress(params: BaseParams) { - const { index } = params; - const ob: Observable = this.signerBtc.getWalletAddress({ derivationPath: "84'/0'/0'", template: 'wpkh(@0/**)' }, index).observable; - const result = await lastValueFrom(ob); - return result.output.address; - } - - async getPublicKey(params: BaseParams) { - const { index } = params; - const ob: Observable = this.signerBtc.getExtendedPublicKey("84'/0'/0'", index).observable; - const result = await lastValueFrom(ob); - return result.output.extendedPublicKey; - } - async getPublicKeyEth(params: BaseParams) { - const { index } = params; - const ob: Observable = this.signerEth.getExtendedPublicKey("84'/0'/0'", index).observable; - const result = await lastValueFrom(ob); - return result.output.extendedPublicKey; - } - - async sign(tx: BitcoreLib.Transaction) { - const psbt = new Psbt(); - - const pubkey = new HDPublicKey(await this.getPublicKey({ index: 0 })).derive('m/0/0').publicKey.toBuffer(); - const masterFingerprint = await this.getMasterKeyFingerprint(); - - psbt.addInputs(tx.inputs.map(input => ({ - hash: input.prevTxId, - index: input.outputIndex, - witnessUtxo: { - script: input.output._script.toBuffer(), - value: input.output._satoshis - }, - bip32Derivation: [{ - masterFingerprint: Buffer.from(masterFingerprint.buffer, masterFingerprint.byteOffset, masterFingerprint.byteLength), - pubkey, - path: "m/84'/0'/0'/0/0", - }] - }))); - - psbt.addOutputs([{ address: 'bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq', value: 900 }]); - - const ob: Observable = this.signerBtc.signTransaction( - new DefaultWallet("84'/0'/0'", 'wpkh(@0/**)'), - psbt - ).observable; - - const result = await lastValueFrom(ob); - return new Transaction(result.output.slice(2)); - } - - async signEth(tx: string) { - const bytes = ethers.getBytes(tx); - const ob: Observable = this.signerEth.signTransaction( - "44'/60'/0'/0/0", - bytes - ).observable; - - const result = await lastValueFrom(ob); - const signature = result.output; - const signedTx = CWC.Transactions.applySignature({ - chain: 'ETH', - tx, - signature - }); - return signedTx; - } - - async getMasterKeyFingerprint(): Promise { - const ob: Observable = this.signerBtc.getMasterFingerprint().observable; - const result = await lastValueFrom(ob); - - return result.output.masterFingerprint; - } -} diff --git a/packages/bitcore-hardware/src/dmk.ts b/packages/bitcore-hardware/src/ledger/dmk.ts similarity index 100% rename from packages/bitcore-hardware/src/dmk.ts rename to packages/bitcore-hardware/src/ledger/dmk.ts diff --git a/packages/bitcore-hardware/src/ledger/modules/btc.ts b/packages/bitcore-hardware/src/ledger/modules/btc.ts new file mode 100644 index 0000000000..791af2a1b7 --- /dev/null +++ b/packages/bitcore-hardware/src/ledger/modules/btc.ts @@ -0,0 +1,74 @@ +import { createRequire } from 'module'; +import { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; +import { Psbt } from 'bitcoinjs-lib'; +import { + Observable, + lastValueFrom +} from 'rxjs'; +import { BaseModule } from 'src/base.js'; +// @eslint disable import/newline-after-import +const require = createRequire(import.meta.url); +const { + DefaultWallet +} = require('@ledgerhq/device-signer-kit-bitcoin'); + +const { HDPublicKey } = BitcoreLib; + +export default class BitcoinModule implements BaseModule { + signer: any; + derivationPath = "84'/0'/0'"; + + constructor(signer: any) { + this.signer = signer; + } + + async sign(params: { tx: BitcoreLib.Transaction }) { + const { tx } = params; + const psbt = new Psbt(); + + const pubkey = new HDPublicKey(await this.getPublicKey()).derive('m/0/0').publicKey.toBuffer(); + const masterFingerprint = await this.getMasterKeyFingerprint(); + + psbt.addInputs(tx.inputs.map(input => ({ + hash: input.prevTxId, + index: input.outputIndex, + witnessUtxo: { + script: input.output._script.toBuffer(), + value: input.output._satoshis + }, + bip32Derivation: [{ + masterFingerprint: Buffer.from(masterFingerprint.buffer, masterFingerprint.byteOffset, masterFingerprint.byteLength), + pubkey, + path: "m/84'/0'/0'/0/0", + }] + }))); + + psbt.addOutputs([{ address: 'bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq', value: 900 }]); + + const ob: Observable = this.signer.signTransaction( + new DefaultWallet(this.derivationPath, 'wpkh(@0/**)'), + psbt + ).observable; + + const result = await lastValueFrom(ob); + return result.output.slice(2); + } + + async getAddress() { + const ob: Observable = this.signer.getWalletAddress({ derivationPath: this.derivationPath, template: 'wpkh(@0/**)' }, 0).observable; + const result = await lastValueFrom(ob); + return result.output.address; + } + + async getPublicKey() { + const ob: Observable = this.signer.getExtendedPublicKey(this.derivationPath, 0).observable; + const result = await lastValueFrom(ob); + return result.output.extendedPublicKey; + } + + async getMasterKeyFingerprint(): Promise { + const ob: Observable = this.signer.getMasterFingerprint().observable; + const result = await lastValueFrom(ob); + return result.output.masterFingerprint; + } +} diff --git a/packages/bitcore-hardware/src/ledger/modules/eth.ts b/packages/bitcore-hardware/src/ledger/modules/eth.ts new file mode 100644 index 0000000000..9fdf0ea64d --- /dev/null +++ b/packages/bitcore-hardware/src/ledger/modules/eth.ts @@ -0,0 +1,46 @@ +import CWC, { ethers } from '@bitpay-labs/crypto-wallet-core'; +import { + Observable, + lastValueFrom +} from 'rxjs'; +import { BaseModule } from 'src/base.js'; + +export default class EthereumModule implements BaseModule { + signer: any; + derivationPath = "44'/60'/0'/0/0"; + + constructor(signer: any) { + this.signer = signer; + } + + async sign(params: { tx: string }) { + const { tx } = params; + const bytes = ethers.getBytes(tx); + const ob: Observable = this.signer.signTransaction( + this.derivationPath, + bytes + ).observable; + + const result = await lastValueFrom(ob); + const signature = result.output; + const signedTx = CWC.Transactions.applySignature({ + chain: 'ETH', + tx, + signature + }); + return signedTx; + } + + async getAddress() { + const ob: Observable = this.signer.getAddress(this.derivationPath).observable; + const result = await lastValueFrom(ob); + console.log(result); + return result.output.address; + } + + async getPublicKey() { + const ob: Observable = this.signer.getAddress(this.derivationPath).observable; + const result = await lastValueFrom(ob); + return result.output.publicKey; + } +} diff --git a/packages/bitcore-hardware/src/ledger/modules/index.ts b/packages/bitcore-hardware/src/ledger/modules/index.ts new file mode 100644 index 0000000000..0c1b08fbd4 --- /dev/null +++ b/packages/bitcore-hardware/src/ledger/modules/index.ts @@ -0,0 +1,7 @@ +import BitcoinModule from './btc.js'; +import EthereumModule from './eth.js'; + +export { + BitcoinModule, + EthereumModule +}; diff --git a/packages/bitcore-hardware/src/ledger/wallet.ts b/packages/bitcore-hardware/src/ledger/wallet.ts new file mode 100644 index 0000000000..c913d5488d --- /dev/null +++ b/packages/bitcore-hardware/src/ledger/wallet.ts @@ -0,0 +1,102 @@ +import { createRequire } from 'module'; +import { EveryUtxoType, TransactionType } from 'src/types/txTypes.js'; +import { Base, BaseModule } from '../base.js'; +import { dmk } from './dmk.js'; +import { BitcoinModule, EthereumModule } from './modules/index.js'; +// @eslint disable import/newline-after-import +const require = createRequire(import.meta.url); +const { + CloseAppCommand, + GetOsVersionCommand +} = require('@ledgerhq/device-management-kit'); +const { + SignerBtcBuilder +} = require('@ledgerhq/device-signer-kit-bitcoin'); +const { + SignerEthBuilder +} = require('@ledgerhq/device-signer-kit-ethereum'); + + +export default class Ledger implements Base { + device: any; + sessionId: any; + discoverySubscryption: any; + modules: Record = {}; + + async connect() { + return new Promise(async (resolve) => { + console.log('Discovering Ledger device...'); + if (this.discoverySubscryption) { + this.discoverySubscryption.unsubscribe(); + } + + this.discoverySubscryption = dmk.startDiscovering({}).subscribe({ + next: async (device) => { + console.log(`Found ${device.id}, model: ${device.deviceModel.model}`); + try { + this.sessionId = await dmk.connect({ device }); + this.discoverySubscryption.unsubscribe(); + + this.device = dmk.getConnectedDevice({ + sessionId: this.sessionId + }); + + this.modules.BTC = new BitcoinModule(new SignerBtcBuilder({ dmk, sessionId: this.sessionId }).build()); + this.modules.ETH = new EthereumModule(new SignerEthBuilder({ dmk, sessionId: this.sessionId }).build()); + + resolve(0); + } catch (error) { + console.error(error); + resolve(1); + } + }, + error: (error) => { + console.error(error); + resolve(1); + } + }); + }); + } + + async disconnect() { + if (this.discoverySubscryption) { + this.discoverySubscryption.unsubscribe(); + } + + if (this.sessionId) { + try { + await dmk.disconnect({ sessionId: this.sessionId }); + this.sessionId = null; + console.log(`Disconnected ${this.device.name}`); + } catch (error) { + console.error(error); + } + } + } + + async getVersion() { + await dmk.sendCommand({ sessionId: this.sessionId, command: new CloseAppCommand() }); + const { seVersion } = (await dmk.sendCommand({ sessionId: this.sessionId, command: new GetOsVersionCommand() })).data; + return seVersion; + } + + async sign(params: { + chain: string; + tx: TransactionType; + utxos?: EveryUtxoType[]; + }) { + const { chain, tx, utxos } = params; + return this.modules[chain].sign({ + tx, + utxos + }); + } + + async getAddress(params: any) { + return this.modules[params.chain].getAddress(params); + } + + async getPublicKey(params: any) { + return this.modules[params.chain].getPublicKey(params); + } +} diff --git a/packages/bitcore-hardware/src/types/txTypes.ts b/packages/bitcore-hardware/src/types/txTypes.ts new file mode 100644 index 0000000000..f0fa5cd39f --- /dev/null +++ b/packages/bitcore-hardware/src/types/txTypes.ts @@ -0,0 +1,38 @@ +import { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; + +/** Transaction data that can be converted into a Transaction via Transaction(tx) */ +export type TransactionType = BitcoreLib.Transaction | string | Buffer | object; + +/** + * Standard utxo type use for internal processing. + * Property names are from bitcore-lib's UnspentOutput. + * Note, UnspentOutput addresses and scripts are Address and Script classes respectively, + * here they are both strings. + */ +export type UtxoType = { + txId: string; + outputIndex: number; + satoshis: number; + script: string; + address?: string; +}; + +/** + * Utxo type for functions were the received utxo type is unknown. + * Could either be in the format of UnspentOutput, UnspentOutput.toObject, or from bitcore-node. + */ +export type EveryUtxoType = Partial; From 03482960ad2f8cb8a1bf0994d5c29b67618e9658 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 15:59:39 -0400 Subject: [PATCH 45/56] type overloading for burner signing method --- .../examples/burner/sign-eth.ts | 2 +- .../bitcore-hardware/examples/burner/sign.ts | 2 +- packages/bitcore-hardware/src/burner.ts | 20 +++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/sign-eth.ts b/packages/bitcore-hardware/examples/burner/sign-eth.ts index 7f027eda3a..2d8a8e3ab6 100644 --- a/packages/bitcore-hardware/examples/burner/sign-eth.ts +++ b/packages/bitcore-hardware/examples/burner/sign-eth.ts @@ -5,7 +5,7 @@ import Burner from '../../src/burner.js'; const burner = new Burner(); burner.connect(); -const tx = CWC.Transactions.create({ +const tx: string = CWC.Transactions.create({ chain: 'ETH', recipients: [{ address: '0x37d7B3bBD88EFdE6a93cF74D2F5b0385D3E3B08A', amount: 3896000000000000 }], nonce: 0, diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign.ts index e0c2b95d32..abd4331a31 100644 --- a/packages/bitcore-hardware/examples/burner/sign.ts +++ b/packages/bitcore-hardware/examples/burner/sign.ts @@ -47,7 +47,7 @@ const utxos = [ } ]; -const tx = CWC.Transactions.create({ +const tx: string = CWC.Transactions.create({ chain: 'BTC', recipients: [{ address: '1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', amount: 1000 }], utxos diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index 4bc38f4670..f574bab99a 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -116,6 +116,26 @@ export default class Burner implements Base { return utxos.filter(utxo => txids.includes(utxo.txId)); } + async sign(params: { + chain: 'ETH'; + tx: string; + index: number; + password: string; + }) + async sign(params: { + chain: 'BTC'; + tx: string; + utxos: EveryUtxoType[]; + index: number; + password: string; + }) + async sign(params: { + chain: 'BTC'; + tx: object; + utxos?: EveryUtxoType[]; + index: number; + password: string; + }) async sign(params: { chain: 'BTC' | 'ETH'; tx: TransactionType; From 2881b23e09776b4d1a61e8463d22f9b85d18c7c4 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 16:41:50 -0400 Subject: [PATCH 46/56] bitcore-hardware utility class --- packages/bitcore-hardware/src/burner.ts | 42 ++------------- .../src/ledger/modules/btc.ts | 15 ++++-- .../src/ledger/modules/eth.ts | 2 +- .../bitcore-hardware/src/ledger/wallet.ts | 2 +- .../bitcore-hardware/src/{ => types}/base.ts | 0 packages/bitcore-hardware/src/util.ts | 54 +++++++++++++++++++ 6 files changed, 70 insertions(+), 45 deletions(-) rename packages/bitcore-hardware/src/{ => types}/base.ts (100%) create mode 100644 packages/bitcore-hardware/src/util.ts diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index f574bab99a..ccff17e7f8 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -1,10 +1,11 @@ import { execHaloCmdPCSC } from '@arx-research/libhalo/api/desktop'; import CWC, { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; import { NFC } from 'nfc-pcsc'; -import { Base } from './base.js'; +import { Base } from 'src/types/base.js'; import { DataType } from './types/burnerTypes.js'; import { BaseParams } from './types/paramTypes.js'; -import { EveryUtxoType, TransactionType, UtxoType } from './types/txTypes.js'; +import { EveryUtxoType, TransactionType } from './types/txTypes.js'; +import Util from './util.js'; const { Address, PublicKey, crypto } = BitcoreLib; @@ -89,33 +90,6 @@ export default class Burner implements Base { }); } - /** - * Standardize utxo for internal funcionality. - * Accepts either a bitcore-node or a lib (bitcore-lib, bitcore-lib-cash, etc.) utxo. - * Handles both lib style utxos: UnspentOutput properties and UnspentOutput.toObject properties. - * - * @param utxos either a bitcore-node or lib utxo - * @returns utxo in the standard, internaly used format - */ - standardizeUtxo(utxo: EveryUtxoType): UtxoType { - return { - satoshis: Number(utxo.satoshis ?? utxo.value ?? BitcoreLib.Unit.fromBTC(utxo.amount ?? 0).toSatoshis()), - txId: utxo.txId ?? utxo.mintTxid ?? utxo.txid ?? '', - outputIndex: Number(utxo.outputIndex ?? utxo.mintIndex ?? utxo.vout ?? 0), - script: utxo.scriptPubKey ?? new BitcoreLib.Script(utxo.script).toHex(), - address: utxo.address != undefined ? new BitcoreLib.Address(utxo.address).toString() : undefined - }; - } - - getRelatedUtxos(params: { - outputs: BitcoreLib.Transaction.Input[]; - utxos: UtxoType[]; - }): UtxoType[] { - const { outputs, utxos } = params; - const txids = outputs.map(output => output.toObject().prevTxId); - return utxos.filter(utxo => txids.includes(utxo.txId)); - } - async sign(params: { chain: 'ETH'; tx: string; @@ -159,15 +133,7 @@ export default class Burner implements Base { password: string; }) { const { tx, utxos, index, password } = params; - const bitcoreTx = tx instanceof BitcoreLib.Transaction ? tx : new BitcoreLib.Transaction(tx); - if (utxos) { - const btcUtxos = utxos.map(utxo => this.standardizeUtxo(utxo)); - const applicableUtxos = this.getRelatedUtxos({ - outputs: bitcoreTx.inputs, - utxos: btcUtxos - }); - bitcoreTx.associateInputs(applicableUtxos.map(utxo => new BitcoreLib.Transaction.UnspentOutput(utxo))); - } + const bitcoreTx = Util.buildTransaction(tx, utxos); const commands: CommandType[] = []; for (let i = 0; i < bitcoreTx.inputs.length; i++) { diff --git a/packages/bitcore-hardware/src/ledger/modules/btc.ts b/packages/bitcore-hardware/src/ledger/modules/btc.ts index 791af2a1b7..0908e7717b 100644 --- a/packages/bitcore-hardware/src/ledger/modules/btc.ts +++ b/packages/bitcore-hardware/src/ledger/modules/btc.ts @@ -5,7 +5,9 @@ import { Observable, lastValueFrom } from 'rxjs'; -import { BaseModule } from 'src/base.js'; +import { BaseModule } from 'src/types/base.js'; +import { EveryUtxoType, TransactionType } from 'src/types/txTypes.js'; +import Util from '../../util.js'; // @eslint disable import/newline-after-import const require = createRequire(import.meta.url); const { @@ -21,15 +23,18 @@ export default class BitcoinModule implements BaseModule { constructor(signer: any) { this.signer = signer; } - - async sign(params: { tx: BitcoreLib.Transaction }) { - const { tx } = params; + + async sign(params: { tx: string; utxos: EveryUtxoType[] }) + async sign(params: { tx: TransactionType; utxos?: EveryUtxoType[] }) { + const { tx, utxos } = params; + const bitcoreTx = Util.buildTransaction(tx, utxos); + const psbt = new Psbt(); const pubkey = new HDPublicKey(await this.getPublicKey()).derive('m/0/0').publicKey.toBuffer(); const masterFingerprint = await this.getMasterKeyFingerprint(); - psbt.addInputs(tx.inputs.map(input => ({ + psbt.addInputs(bitcoreTx.inputs.map(input => ({ hash: input.prevTxId, index: input.outputIndex, witnessUtxo: { diff --git a/packages/bitcore-hardware/src/ledger/modules/eth.ts b/packages/bitcore-hardware/src/ledger/modules/eth.ts index 9fdf0ea64d..13f745fdce 100644 --- a/packages/bitcore-hardware/src/ledger/modules/eth.ts +++ b/packages/bitcore-hardware/src/ledger/modules/eth.ts @@ -3,7 +3,7 @@ import { Observable, lastValueFrom } from 'rxjs'; -import { BaseModule } from 'src/base.js'; +import { BaseModule } from 'src/types/base.js'; export default class EthereumModule implements BaseModule { signer: any; diff --git a/packages/bitcore-hardware/src/ledger/wallet.ts b/packages/bitcore-hardware/src/ledger/wallet.ts index c913d5488d..93909819c8 100644 --- a/packages/bitcore-hardware/src/ledger/wallet.ts +++ b/packages/bitcore-hardware/src/ledger/wallet.ts @@ -1,6 +1,6 @@ import { createRequire } from 'module'; +import { Base, BaseModule } from 'src/types/base.js'; import { EveryUtxoType, TransactionType } from 'src/types/txTypes.js'; -import { Base, BaseModule } from '../base.js'; import { dmk } from './dmk.js'; import { BitcoinModule, EthereumModule } from './modules/index.js'; // @eslint disable import/newline-after-import diff --git a/packages/bitcore-hardware/src/base.ts b/packages/bitcore-hardware/src/types/base.ts similarity index 100% rename from packages/bitcore-hardware/src/base.ts rename to packages/bitcore-hardware/src/types/base.ts diff --git a/packages/bitcore-hardware/src/util.ts b/packages/bitcore-hardware/src/util.ts new file mode 100644 index 0000000000..08cfc319e4 --- /dev/null +++ b/packages/bitcore-hardware/src/util.ts @@ -0,0 +1,54 @@ +import { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; +import { EveryUtxoType, TransactionType, UtxoType } from 'src/types/txTypes.js'; + +class UtilClass { + /** + * Standardize utxo for internal funcionality. + * Accepts either a bitcore-node or a lib (bitcore-lib, bitcore-lib-cash, etc.) utxo. + * Handles both lib style utxos: UnspentOutput properties and UnspentOutput.toObject properties. + * + * @param utxos either a bitcore-node or lib utxo + * @returns utxo in the standard, internaly used format + */ + standardizeUtxo(utxo: EveryUtxoType): UtxoType { + return { + satoshis: Number(utxo.satoshis ?? utxo.value ?? BitcoreLib.Unit.fromBTC(utxo.amount ?? 0).toSatoshis()), + txId: utxo.txId ?? utxo.mintTxid ?? utxo.txid ?? '', + outputIndex: Number(utxo.outputIndex ?? utxo.mintIndex ?? utxo.vout ?? 0), + script: utxo.scriptPubKey ?? new BitcoreLib.Script(utxo.script).toHex(), + address: utxo.address != undefined ? new BitcoreLib.Address(utxo.address).toString() : undefined + }; + } + + getRelatedUtxos(params: { + outputs: BitcoreLib.Transaction.Input[]; + utxos: UtxoType[]; + }): UtxoType[] { + const { outputs, utxos } = params; + const txids = outputs.map(output => output.toObject().prevTxId); + return utxos.filter(utxo => txids.includes(utxo.txId)); + } + + /** + * Convert some kind of transaction and utxo data into a bitcore-lib transaction + * + * @param tx transaction data, string or some object + * @param utxos utxo data + * @returns bitcore-lib transaction + */ + buildTransaction(tx: TransactionType, utxos?: EveryUtxoType[]): BitcoreLib.Transaction { + const bitcoreTx = tx instanceof BitcoreLib.Transaction ? tx : new BitcoreLib.Transaction(tx); + if (utxos) { + const btcUtxos = utxos.map(utxo => Util.standardizeUtxo(utxo)); + const applicableUtxos = Util.getRelatedUtxos({ + outputs: bitcoreTx.inputs, + utxos: btcUtxos + }); + bitcoreTx.associateInputs(applicableUtxos.map(utxo => new BitcoreLib.Transaction.UnspentOutput(utxo))); + } + return bitcoreTx; + } +} + +const Util = new UtilClass(); +export default Util; From 0199063a0a783ee863fad44f79e2df5ee9e9383f Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 18:15:21 -0400 Subject: [PATCH 47/56] added support to ledger --- .../examples/burner/{sign.ts => sign-btc.ts} | 0 .../examples/ledger/sign-btc.ts | 30 ++ .../examples/ledger/sign-sol.ts | 28 ++ packages/bitcore-hardware/package-lock.json | 409 +++++++++++++++++- packages/bitcore-hardware/package.json | 6 +- .../src/ledger/modules/eth.ts | 1 - .../src/ledger/modules/sol.ts | 47 ++ .../{examples => src}/ledger/sign.ts | 0 .../bitcore-hardware/src/ledger/wallet.ts | 9 + 9 files changed, 517 insertions(+), 13 deletions(-) rename packages/bitcore-hardware/examples/burner/{sign.ts => sign-btc.ts} (100%) create mode 100644 packages/bitcore-hardware/examples/ledger/sign-btc.ts create mode 100644 packages/bitcore-hardware/examples/ledger/sign-sol.ts create mode 100644 packages/bitcore-hardware/src/ledger/modules/sol.ts rename packages/bitcore-hardware/{examples => src}/ledger/sign.ts (100%) diff --git a/packages/bitcore-hardware/examples/burner/sign.ts b/packages/bitcore-hardware/examples/burner/sign-btc.ts similarity index 100% rename from packages/bitcore-hardware/examples/burner/sign.ts rename to packages/bitcore-hardware/examples/burner/sign-btc.ts diff --git a/packages/bitcore-hardware/examples/ledger/sign-btc.ts b/packages/bitcore-hardware/examples/ledger/sign-btc.ts new file mode 100644 index 0000000000..b8fb2217a2 --- /dev/null +++ b/packages/bitcore-hardware/examples/ledger/sign-btc.ts @@ -0,0 +1,30 @@ +import 'source-map-support/register.js'; +import { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; +import Ledger from '../../src/ledger/wallet.js'; + +const { HDPublicKey, Script, Transaction } = BitcoreLib; + +const ledger = new Ledger(); +await ledger.connect(); + +const publickey = new HDPublicKey(await ledger.getPublicKey({ chain: 'BTC', index: 0 })).derive('m/0/0').publicKey; + +const tx = new Transaction() + .from({ + address: 'bc1q0wsc0l2pzfn55ra67kr0vm40rjlllyh3a5kf88', + txId: 'a78dbd15bde4d8678c7e01451d6e54e92629395c9b76de7d37bf464514c8bc04', + outputIndex: 0, + script: Script.buildWitnessV0Out(publickey.toAddress()), + satoshis: 9290 + }); + +console.log(`Sign ${tx}`); +const signedTransaction = await ledger.sign({ + chain: 'BTC', + tx +}); +console.log(signedTransaction); +await ledger.disconnect(); + +console.log('Signed transaction'); +process.exit(0); diff --git a/packages/bitcore-hardware/examples/ledger/sign-sol.ts b/packages/bitcore-hardware/examples/ledger/sign-sol.ts new file mode 100644 index 0000000000..563874dde8 --- /dev/null +++ b/packages/bitcore-hardware/examples/ledger/sign-sol.ts @@ -0,0 +1,28 @@ +import 'source-map-support/register.js'; +import CWC from '@bitpay-labs/crypto-wallet-core'; +import Ledger from '../../src/ledger/wallet.js'; + +const ledger = new Ledger(); +await ledger.connect(); + +const address = await ledger.getAddress({ chain: 'SOL' }); + +const tx = CWC.Transactions.create({ + network: 'livenet', + chain: 'SOL', + recipients: [{ address: 'F7FknkRckx4yvA3Gexnx1H3nwPxndMxVt58BwAzEQhcY', amount: 3896000000000000 }], + from: address, + blockHeight: 531_575, + blockHash: 'GtV1Hb3FvP3HURHAsj8mGwEqCumvP3pv3i6CVCzYNj3d', + category: 'transfer' +}); + +console.log(`Sign ${tx}`); +const signedTransaction = await ledger.sign({ + chain: 'SOL', + tx +}); + +console.log('Signed transaction'); +console.log(signedTransaction); +process.exit(0); diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index ad3a3d3b55..9bce538dfb 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -14,6 +14,7 @@ "@ledgerhq/device-management-kit": "^1.7.1", "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-signer-kit-ethereum": "^1.16.0", + "@ledgerhq/device-signer-kit-solana": "^1.11.0", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", "@ledgerhq/signer-utils": "^1.3.0", "nfc-pcsc": "^0.8.1", @@ -53,6 +54,15 @@ "websocket-as-promised": "^3.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@bitpay-labs/bitcore-lib": { "version": "11.5.1", "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib/-/bitcore-lib-11.5.1.tgz", @@ -323,7 +333,6 @@ "resolved": "https://registry.npmjs.org/@ledgerhq/context-module/-/context-module-2.3.1.tgz", "integrity": "sha512-OfpvgNlI1tz+2B6UPOeHR5FuDmmW9LVfDBOXbK5u1fOnr6r//tArJvhhHc3mLePozbXpBfHl0dhr7UZb347+aw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bs58": "^6.0.0", "crypto-js": "^4.2.0", @@ -340,15 +349,13 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@ledgerhq/context-module/node_modules/@noble/curves": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", "license": "MIT", - "peer": true, "dependencies": { "@noble/hashes": "1.3.2" }, @@ -361,7 +368,6 @@ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 16" }, @@ -373,15 +379,13 @@ "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", - "peer": true + "license": "MIT" }, "node_modules/@ledgerhq/context-module/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", - "peer": true, "dependencies": { "base-x": "^5.0.0" } @@ -401,7 +405,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", @@ -420,7 +423,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -574,6 +576,42 @@ } } }, + "node_modules/@ledgerhq/device-signer-kit-solana": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/device-signer-kit-solana/-/device-signer-kit-solana-1.11.0.tgz", + "integrity": "sha512-rMYdhERYAcwLFRgNEsDToBvyut55nFxxmviL0kgP8Q535XiKgXdKERTEASm3OB83deAhvjOAeZUM0x+OoatF6Q==", + "license": "Apache-2.0", + "dependencies": { + "@ledgerhq/context-module": "^2.3.1", + "@ledgerhq/signer-utils": "^1.3.0", + "@solana/web3.js": "^1.98.2", + "bs58": "^6.0.0", + "buffer": "^6.0.3", + "inversify": "7.5.1", + "purify-ts": "2.1.0", + "reflect-metadata": "0.2.2", + "semver": "7.7.2", + "xstate": "5.19.2" + }, + "peerDependencies": { + "@ledgerhq/device-management-kit": "^1.7.1" + } + }, + "node_modules/@ledgerhq/device-signer-kit-solana/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/@ledgerhq/device-signer-kit-solana/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/@ledgerhq/device-transport-kit-node-hid": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@ledgerhq/device-transport-kit-node-hid/-/device-transport-kit-node-hid-1.0.1.tgz", @@ -962,6 +1000,18 @@ "typescript": ">=5" } }, + "node_modules/@solana/buffer-layout": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", + "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", + "license": "MIT", + "dependencies": { + "buffer": "~6.0.3" + }, + "engines": { + "node": ">=5.10" + } + }, "node_modules/@solana/codecs": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.1.0.tgz", @@ -1572,6 +1622,50 @@ "typescript": ">=5" } }, + "node_modules/@solana/web3.js": { + "version": "1.98.4", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz", + "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "@solana/codecs-numbers": "^2.1.0", + "agentkeepalive": "^4.5.0", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.1", + "node-fetch": "^2.7.0", + "rpc-websockets": "^9.0.2", + "superstruct": "^2.0.2" + } + }, + "node_modules/@solana/web3.js/node_modules/bn.js": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", + "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@swc/helpers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@types/brorand": { "version": "1.0.33", "resolved": "https://registry.npmjs.org/@types/brorand/-/brorand-1.0.33.tgz", @@ -1592,6 +1686,15 @@ "assertion-error": "^2.0.1" } }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/crypto-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", @@ -1644,6 +1747,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, "node_modules/@types/w3c-web-usb": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.14.tgz", @@ -2044,6 +2153,18 @@ "node": ">= 6.0.0" } }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -2264,6 +2385,23 @@ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "license": "MIT" }, + "node_modules/borsh": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", + "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" + } + }, + "node_modules/borsh/node_modules/bn.js": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", + "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", @@ -2360,6 +2498,20 @@ "dev": true, "license": "MIT" }, + "node_modules/bufferutil": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", + "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/call-bind": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", @@ -2755,6 +2907,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -2860,6 +3024,21 @@ "node": ">= 0.4" } }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "license": "MIT", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2977,6 +3156,20 @@ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fast-stable-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", + "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", + "license": "MIT" + }, "node_modules/fastestsmallesttextencoderdecoder": { "version": "1.0.22", "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", @@ -3279,6 +3472,15 @@ "node": ">= 6" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -3509,6 +3711,108 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jayson": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.3.0.tgz", + "integrity": "sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==", + "license": "MIT", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "stream-json": "^1.9.1", + "uuid": "^8.3.2", + "ws": "^7.5.10" + }, + "bin": { + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jayson/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "license": "MIT" + }, + "node_modules/jayson/node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/jayson/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/jayson/node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/jayson/node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/jayson/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/jayson/node_modules/ws": { + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz", + "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jose": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", @@ -3554,6 +3858,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4386,6 +4696,42 @@ "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", "license": "MIT" }, + "node_modules/rpc-websockets": { + "version": "9.3.9", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.3.9.tgz", + "integrity": "sha512-2iQDaTB4g5fDB2ihrTFSJSibCEuxaRi1q7qTW7ZO9/M5/TC+ToHA4D9/ffNLEbAoHNNrcdeP05oATNk44SKZXA==", + "license": "LGPL-3.0-only", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/uuid": "^10.0.0", + "@types/ws": "^8.2.2", + "buffer": "^6.0.3", + "eventemitter3": "^5.0.1", + "uuid": "^14.0.0", + "ws": "^8.5.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^6.0.0" + } + }, + "node_modules/rpc-websockets/node_modules/uuid": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -4697,6 +5043,21 @@ "node": ">=4.2.4" } }, + "node_modules/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "license": "BSD-3-Clause" + }, + "node_modules/stream-json": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", + "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -4847,6 +5208,15 @@ "node": ">=4.2.4" } }, + "node_modules/superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -4863,6 +5233,11 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/text-encoding-utf-8": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", + "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" + }, "node_modules/tiny-secp256k1": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.7.tgz", @@ -4988,6 +5363,20 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, + "node_modules/utf-8-validate": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.6.tgz", + "integrity": "sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index e65a7e747f..18830714b4 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -15,13 +15,14 @@ "test": "npm run compile && mocha build/test", "burner:public-key": "npm run compile && node build/examples/burner/publicKey.js", "burner:address": "npm run compile && node build/examples/burner/address.js", - "burner:sign": "npm run compile && node build/examples/burner/sign.js", + "burner:sign-btc": "npm run compile && node build/examples/burner/sign-btc.js", "burner:sign-eth": "npm run compile && node build/examples/burner/sign-eth.js", "burner:version": "npm run compile && node build/examples/burner/version.js", "ledger:public-key": "npm run compile && node build/examples/ledger/publicKey.js", "ledger:address": "npm run compile && node build/examples/ledger/address.js", - "ledger:sign": "npm run compile && node build/examples/ledger/sign.js", + "ledger:sign-btc": "npm run compile && node build/examples/ledger/sign-btc.js", "ledger:sign-eth": "npm run compile && node build/examples/ledger/sign-eth.js", + "ledger:sign-sol": "npm run compile && node build/examples/ledger/sign-sol.js", "ledger:version": "npm run compile && node build/examples/ledger/version.js" }, "keywords": [ @@ -37,6 +38,7 @@ "@ledgerhq/device-management-kit": "^1.7.1", "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", "@ledgerhq/device-signer-kit-ethereum": "^1.16.0", + "@ledgerhq/device-signer-kit-solana": "^1.11.0", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", "@ledgerhq/signer-utils": "^1.3.0", "nfc-pcsc": "^0.8.1", diff --git a/packages/bitcore-hardware/src/ledger/modules/eth.ts b/packages/bitcore-hardware/src/ledger/modules/eth.ts index 13f745fdce..5ade37244f 100644 --- a/packages/bitcore-hardware/src/ledger/modules/eth.ts +++ b/packages/bitcore-hardware/src/ledger/modules/eth.ts @@ -34,7 +34,6 @@ export default class EthereumModule implements BaseModule { async getAddress() { const ob: Observable = this.signer.getAddress(this.derivationPath).observable; const result = await lastValueFrom(ob); - console.log(result); return result.output.address; } diff --git a/packages/bitcore-hardware/src/ledger/modules/sol.ts b/packages/bitcore-hardware/src/ledger/modules/sol.ts new file mode 100644 index 0000000000..c7c58db81a --- /dev/null +++ b/packages/bitcore-hardware/src/ledger/modules/sol.ts @@ -0,0 +1,47 @@ +import { SolKit } from '@bitpay-labs/crypto-wallet-core'; +import { + Observable, + lastValueFrom +} from 'rxjs'; +import { BaseModule } from 'src/types/base.js'; + + +export default class SolanaModule implements BaseModule { + signer: any; + derivationPath = "44'/501'/0'"; + constructor(signer) { + this.signer = signer; + } + + async sign(params: { tx: string }) { + const { tx } = params; + const wireBytes = SolKit.getBase64Encoder().encode(tx); + const transaction = SolKit.getTransactionDecoder().decode(wireBytes); + + const ob: Observable = this.signer.signTransaction( + this.derivationPath, + transaction.messageBytes + ).observable; + + const result = await lastValueFrom(ob); + const signature = result.output; + + return SolKit.getBase64EncodedWireTransaction({ + ...transaction, + signatures: { + ...transaction.signatures, + [await this.getAddress()]: signature + } + }); + } + + async getAddress() { + const ob: Observable = this.signer.getAddress(this.derivationPath).observable; + const result = await lastValueFrom(ob); + return result.output; + } + + async getPublicKey() { + return this.getAddress(); + } +} diff --git a/packages/bitcore-hardware/examples/ledger/sign.ts b/packages/bitcore-hardware/src/ledger/sign.ts similarity index 100% rename from packages/bitcore-hardware/examples/ledger/sign.ts rename to packages/bitcore-hardware/src/ledger/sign.ts diff --git a/packages/bitcore-hardware/src/ledger/wallet.ts b/packages/bitcore-hardware/src/ledger/wallet.ts index 93909819c8..c1786222ae 100644 --- a/packages/bitcore-hardware/src/ledger/wallet.ts +++ b/packages/bitcore-hardware/src/ledger/wallet.ts @@ -3,6 +3,7 @@ import { Base, BaseModule } from 'src/types/base.js'; import { EveryUtxoType, TransactionType } from 'src/types/txTypes.js'; import { dmk } from './dmk.js'; import { BitcoinModule, EthereumModule } from './modules/index.js'; +import SolanaModule from './modules/sol.js'; // @eslint disable import/newline-after-import const require = createRequire(import.meta.url); const { @@ -15,6 +16,9 @@ const { const { SignerEthBuilder } = require('@ledgerhq/device-signer-kit-ethereum'); +const { + SignerSolanaBuilder +} = require('@ledgerhq/device-signer-kit-solana'); export default class Ledger implements Base { @@ -43,6 +47,11 @@ export default class Ledger implements Base { this.modules.BTC = new BitcoinModule(new SignerBtcBuilder({ dmk, sessionId: this.sessionId }).build()); this.modules.ETH = new EthereumModule(new SignerEthBuilder({ dmk, sessionId: this.sessionId }).build()); + this.modules.SOL = new SolanaModule(new SignerSolanaBuilder({ + dmk, + sessionId: this.sessionId, + solanaRPCURL: 'https://api.mainnet-beta.solana.com/', + }).build()); resolve(0); } catch (error) { From 84c3d5e7a4df8656630c3898ab0caef8fdc3b284 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 18:21:15 -0400 Subject: [PATCH 48/56] typing for ledger signing --- .../bitcore-hardware/src/ledger/wallet.ts | 22 +++++++++++++++---- packages/bitcore-hardware/src/types/base.ts | 4 ++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/bitcore-hardware/src/ledger/wallet.ts b/packages/bitcore-hardware/src/ledger/wallet.ts index c1786222ae..ec6268f50d 100644 --- a/packages/bitcore-hardware/src/ledger/wallet.ts +++ b/packages/bitcore-hardware/src/ledger/wallet.ts @@ -89,6 +89,20 @@ export default class Ledger implements Base { return seVersion; } + async sign(params: { + chain: 'BTC'; + tx: string; + utxos: EveryUtxoType[]; + }) + async sign(params: { + chain: 'BTC'; + tx: object; + utxos?: EveryUtxoType[]; + }) + async sign(params: { + chain: 'ETH' | 'SOL'; + tx: string; + }) async sign(params: { chain: string; tx: TransactionType; @@ -101,11 +115,11 @@ export default class Ledger implements Base { }); } - async getAddress(params: any) { - return this.modules[params.chain].getAddress(params); + async getAddress(params: { chain: string }) { + return this.modules[params.chain].getAddress(); } - async getPublicKey(params: any) { - return this.modules[params.chain].getPublicKey(params); + async getPublicKey(params: { chain: string }) { + return this.modules[params.chain].getPublicKey(); } } diff --git a/packages/bitcore-hardware/src/types/base.ts b/packages/bitcore-hardware/src/types/base.ts index 44f77dc9bc..3e5d18c76e 100644 --- a/packages/bitcore-hardware/src/types/base.ts +++ b/packages/bitcore-hardware/src/types/base.ts @@ -1,7 +1,7 @@ export interface BaseModule { sign(params: any): Promise; - getPublicKey(params: any): Promise; - getAddress(params: any): Promise; + getPublicKey(): Promise; + getAddress(): Promise; }; export interface Base { connect(): void; From 3d4c6e89b0f13dd3a03f016a8c8cb3ac9d2aaf81 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 18:26:39 -0400 Subject: [PATCH 49/56] cleaned up mysterious file and import consistency for ledger --- .../examples/ledger/sign-btc.ts | 2 +- .../src/ledger/modules/index.ts | 4 ++- packages/bitcore-hardware/src/ledger/sign.ts | 29 ------------------- .../bitcore-hardware/src/ledger/wallet.ts | 3 +- 4 files changed, 5 insertions(+), 33 deletions(-) delete mode 100644 packages/bitcore-hardware/src/ledger/sign.ts diff --git a/packages/bitcore-hardware/examples/ledger/sign-btc.ts b/packages/bitcore-hardware/examples/ledger/sign-btc.ts index b8fb2217a2..2ef838f9fb 100644 --- a/packages/bitcore-hardware/examples/ledger/sign-btc.ts +++ b/packages/bitcore-hardware/examples/ledger/sign-btc.ts @@ -7,7 +7,7 @@ const { HDPublicKey, Script, Transaction } = BitcoreLib; const ledger = new Ledger(); await ledger.connect(); -const publickey = new HDPublicKey(await ledger.getPublicKey({ chain: 'BTC', index: 0 })).derive('m/0/0').publicKey; +const publickey = new HDPublicKey(await ledger.getPublicKey({ chain: 'BTC' })).derive('m/0/0').publicKey; const tx = new Transaction() .from({ diff --git a/packages/bitcore-hardware/src/ledger/modules/index.ts b/packages/bitcore-hardware/src/ledger/modules/index.ts index 0c1b08fbd4..da881d1b1b 100644 --- a/packages/bitcore-hardware/src/ledger/modules/index.ts +++ b/packages/bitcore-hardware/src/ledger/modules/index.ts @@ -1,7 +1,9 @@ import BitcoinModule from './btc.js'; import EthereumModule from './eth.js'; +import SolanaModule from './sol.js'; export { BitcoinModule, - EthereumModule + EthereumModule, + SolanaModule }; diff --git a/packages/bitcore-hardware/src/ledger/sign.ts b/packages/bitcore-hardware/src/ledger/sign.ts deleted file mode 100644 index 7da5679858..0000000000 --- a/packages/bitcore-hardware/src/ledger/sign.ts +++ /dev/null @@ -1,29 +0,0 @@ -import 'source-map-support/register.js'; -import { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; -import Ledger from '../../src/ledger/wallet.js'; - -const { HDPublicKey, Script, Transaction } = BitcoreLib; - -const ledger = new Ledger(); -await ledger.connect(); - -const publickey = new HDPublicKey(await ledger.getPublicKey({ chain: 'BTC', index: 0 })).derive('m/0/0').publicKey; - -const tx = new Transaction() - .from({ - address: 'bc1q0wsc0l2pzfn55ra67kr0vm40rjlllyh3a5kf88', - txId: 'a78dbd15bde4d8678c7e01451d6e54e92629395c9b76de7d37bf464514c8bc04', - outputIndex: 0, - script: Script.buildWitnessV0Out(publickey.toAddress()), - satoshis: 9290 - }); - -const signedTransaction = await ledger.sign({ - chain: 'BTC', - tx -}); -console.log(signedTransaction); -await ledger.disconnect(); - -console.log('Signed transaction'); -process.exit(0); diff --git a/packages/bitcore-hardware/src/ledger/wallet.ts b/packages/bitcore-hardware/src/ledger/wallet.ts index ec6268f50d..32a8e3159c 100644 --- a/packages/bitcore-hardware/src/ledger/wallet.ts +++ b/packages/bitcore-hardware/src/ledger/wallet.ts @@ -2,8 +2,7 @@ import { createRequire } from 'module'; import { Base, BaseModule } from 'src/types/base.js'; import { EveryUtxoType, TransactionType } from 'src/types/txTypes.js'; import { dmk } from './dmk.js'; -import { BitcoinModule, EthereumModule } from './modules/index.js'; -import SolanaModule from './modules/sol.js'; +import { BitcoinModule, EthereumModule, SolanaModule } from './modules/index.js'; // @eslint disable import/newline-after-import const require = createRequire(import.meta.url); const { From 3f340dc3b023dc65995f7245b549ccadc77969dd Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 18:33:59 -0400 Subject: [PATCH 50/56] added hardware dependencies to circle ci --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4eafdd6ce2..b227b95b3d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -86,6 +86,9 @@ jobs: - checkout - use_python2 - use_node + - run: + name: Install PC/SC Lite dev headers + command: sudo apt-get update && sudo apt-get install -y libpcsclite-dev # - run: # name: Install Chrome # command: | From d4a7bb7872e206726f8829248ff48542c56ffaf6 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 19:36:19 -0400 Subject: [PATCH 51/56] added bitcore-hardware to circle-ci tests --- .circleci/config.yml | 10 +++++++++- package.json | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b227b95b3d..710f3387f4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -112,6 +112,7 @@ jobs: - node_modules - packages/bitcore-build/node_modules - packages/bitcore-client/node_modules + - packages/bitcore-hardware/node_modules - packages/bitcore-lib/node_modules - packages/bitcore-lib-cash/node_modules - packages/bitcore-lib-doge/node_modules @@ -222,7 +223,11 @@ jobs: steps: - run_test: package: crypto-rpc - + bitcore-hardware: + executor: main + steps: + - run_test: + package: bitcore-hardware workflows: version: 2 build_and_test: @@ -274,3 +279,6 @@ workflows: - crypto-rpc: requires: - build + - bitcore-hardware: + requires: + - build diff --git a/package.json b/package.json index f648009def..e17f80a93f 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "precommit": "eslint --pass-on-no-patterns --no-warn-ignored $(git diff --name-only --cached --diff-filter=AM)", "test:bitcore-cli": "cd ./packages/bitcore-cli && npm run test", "test:bitcore-client": "cd ./packages/bitcore-client && npm run test", + "test:bitcore-hardware": "cd ./packages/bitcore-hardware && npm run test", "test:bitcore-lib": "cd ./packages/bitcore-lib && npm run test", "test:bitcore-lib-cash": "cd ./packages/bitcore-lib-cash && npm run test", "test:bitcore-lib-doge": "cd ./packages/bitcore-lib-doge && npm run test", From 459d7d059f900f38dc10c9478f3d856de47f4d7a Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 20:12:03 -0400 Subject: [PATCH 52/56] install pcsc for bitcore-hardware test individualy --- .circleci/config.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 710f3387f4..5e1c9c7faa 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -56,6 +56,12 @@ commands: nvm install 22.13.1 nvm alias default 22.13.1 nvm use default + pcsc: + description: Install PC/SC Lite for bitcore-hardware NFC library + steps: + - run: + name: Install PC/SC Lite + command: sudo apt-get update && sudo apt-get install -y libpcsclite-dev restore_dependency_cache: steps: - create_concatenated_package_lock: @@ -86,9 +92,7 @@ jobs: - checkout - use_python2 - use_node - - run: - name: Install PC/SC Lite dev headers - command: sudo apt-get update && sudo apt-get install -y libpcsclite-dev + - pcsc # - run: # name: Install Chrome # command: | @@ -226,6 +230,7 @@ jobs: bitcore-hardware: executor: main steps: + - pcsc - run_test: package: bitcore-hardware workflows: From 8b468e533d7c38adad30089f13e4a8b71e996dd1 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 20:44:02 -0400 Subject: [PATCH 53/56] added types to ledger packages --- packages/bitcore-hardware/package-lock.json | 11 +++--- packages/bitcore-hardware/package.json | 2 +- packages/bitcore-hardware/src/ledger/dmk.ts | 5 ++- .../src/ledger/modules/btc.ts | 14 ++++--- .../src/ledger/modules/eth.ts | 5 ++- .../src/ledger/modules/sol.ts | 7 ++-- .../bitcore-hardware/src/ledger/wallet.ts | 39 ++++++++++++------- 7 files changed, 51 insertions(+), 32 deletions(-) diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index 9bce538dfb..ca70af7230 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -12,7 +12,7 @@ "@arx-research/libhalo": "^1.19.0", "@bitpay-labs/crypto-wallet-core": "^11.5.1", "@ledgerhq/device-management-kit": "^1.7.1", - "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", + "@ledgerhq/device-signer-kit-bitcoin": "^1.3.3", "@ledgerhq/device-signer-kit-ethereum": "^1.16.0", "@ledgerhq/device-signer-kit-solana": "^1.11.0", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", @@ -461,11 +461,12 @@ } }, "node_modules/@ledgerhq/device-signer-kit-bitcoin": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@ledgerhq/device-signer-kit-bitcoin/-/device-signer-kit-bitcoin-1.3.2.tgz", - "integrity": "sha512-LLkKGDiHRUwBHdotIQ6sB378gHEV79HMEXPCtcrvYeiuD3PyKInaVAsi3wYhlrWgFqvkf1Tq9REtmSR/Lw5s4g==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ledgerhq/device-signer-kit-bitcoin/-/device-signer-kit-bitcoin-1.3.3.tgz", + "integrity": "sha512-jLdZsq3eQKli7zOYsP4NxETY40FzA3WlMP7aMWsrajOShVNJmj/p8RLoURA77zM8Fxhr88qMz8ziJm3XuzIjkA==", "license": "Apache-2.0", "dependencies": { + "@ledgerhq/signer-utils": "^1.3.0", "@types/crypto-js": "^4.2.0", "crypto-js": "^4.2.0", "inversify": "7.5.1", @@ -474,7 +475,7 @@ "xstate": "5.19.2" }, "peerDependencies": { - "@ledgerhq/device-management-kit": "^1.7.0", + "@ledgerhq/device-management-kit": "^1.7.1", "bitcoinjs-lib": "^6.1.6" } }, diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index 18830714b4..e57675fd44 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -36,7 +36,7 @@ "@arx-research/libhalo": "^1.19.0", "@bitpay-labs/crypto-wallet-core": "^11.5.1", "@ledgerhq/device-management-kit": "^1.7.1", - "@ledgerhq/device-signer-kit-bitcoin": "^1.3.2", + "@ledgerhq/device-signer-kit-bitcoin": "^1.3.3", "@ledgerhq/device-signer-kit-ethereum": "^1.16.0", "@ledgerhq/device-signer-kit-solana": "^1.11.0", "@ledgerhq/device-transport-kit-node-hid": "^1.0.1", diff --git a/packages/bitcore-hardware/src/ledger/dmk.ts b/packages/bitcore-hardware/src/ledger/dmk.ts index ff969f9e4c..edaaab73d7 100644 --- a/packages/bitcore-hardware/src/ledger/dmk.ts +++ b/packages/bitcore-hardware/src/ledger/dmk.ts @@ -1,10 +1,11 @@ import { createRequire } from 'module'; +import { nodeHidTransportFactory } from '@ledgerhq/device-transport-kit-node-hid'; +import type * as DMK from '@ledgerhq/device-management-kit'; // @eslint disable import/newline-after-import const require = createRequire(import.meta.url); const { DeviceManagementKitBuilder -} = require('@ledgerhq/device-management-kit'); -const { nodeHidTransportFactory } = require('@ledgerhq/device-transport-kit-node-hid'); +}: typeof DMK = require('@ledgerhq/device-management-kit'); export const dmk = new DeviceManagementKitBuilder() diff --git a/packages/bitcore-hardware/src/ledger/modules/btc.ts b/packages/bitcore-hardware/src/ledger/modules/btc.ts index 0908e7717b..85a7d16601 100644 --- a/packages/bitcore-hardware/src/ledger/modules/btc.ts +++ b/packages/bitcore-hardware/src/ledger/modules/btc.ts @@ -8,19 +8,21 @@ import { import { BaseModule } from 'src/types/base.js'; import { EveryUtxoType, TransactionType } from 'src/types/txTypes.js'; import Util from '../../util.js'; +import type * as SignerKitBtc from '@ledgerhq/device-signer-kit-bitcoin'; // @eslint disable import/newline-after-import const require = createRequire(import.meta.url); const { + DefaultDescriptorTemplate, DefaultWallet -} = require('@ledgerhq/device-signer-kit-bitcoin'); +}: typeof SignerKitBtc = require('@ledgerhq/device-signer-kit-bitcoin'); const { HDPublicKey } = BitcoreLib; export default class BitcoinModule implements BaseModule { - signer: any; + signer: SignerKitBtc.SignerBtc; derivationPath = "84'/0'/0'"; - constructor(signer: any) { + constructor(signer: SignerKitBtc.SignerBtc) { this.signer = signer; } @@ -51,7 +53,7 @@ export default class BitcoinModule implements BaseModule { psbt.addOutputs([{ address: 'bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq', value: 900 }]); const ob: Observable = this.signer.signTransaction( - new DefaultWallet(this.derivationPath, 'wpkh(@0/**)'), + new DefaultWallet(this.derivationPath, DefaultDescriptorTemplate.NATIVE_SEGWIT), psbt ).observable; @@ -60,13 +62,13 @@ export default class BitcoinModule implements BaseModule { } async getAddress() { - const ob: Observable = this.signer.getWalletAddress({ derivationPath: this.derivationPath, template: 'wpkh(@0/**)' }, 0).observable; + const ob: Observable = this.signer.getWalletAddress({ derivationPath: this.derivationPath, template: DefaultDescriptorTemplate.NATIVE_SEGWIT }, 0).observable; const result = await lastValueFrom(ob); return result.output.address; } async getPublicKey() { - const ob: Observable = this.signer.getExtendedPublicKey(this.derivationPath, 0).observable; + const ob: Observable = this.signer.getExtendedPublicKey(this.derivationPath).observable; const result = await lastValueFrom(ob); return result.output.extendedPublicKey; } diff --git a/packages/bitcore-hardware/src/ledger/modules/eth.ts b/packages/bitcore-hardware/src/ledger/modules/eth.ts index 5ade37244f..306b83b410 100644 --- a/packages/bitcore-hardware/src/ledger/modules/eth.ts +++ b/packages/bitcore-hardware/src/ledger/modules/eth.ts @@ -4,12 +4,13 @@ import { lastValueFrom } from 'rxjs'; import { BaseModule } from 'src/types/base.js'; +import type * as SignerKitEth from '@ledgerhq/device-signer-kit-ethereum'; export default class EthereumModule implements BaseModule { - signer: any; + signer: SignerKitEth.SignerEth; derivationPath = "44'/60'/0'/0/0"; - constructor(signer: any) { + constructor(signer: SignerKitEth.SignerEth) { this.signer = signer; } diff --git a/packages/bitcore-hardware/src/ledger/modules/sol.ts b/packages/bitcore-hardware/src/ledger/modules/sol.ts index c7c58db81a..3b47565669 100644 --- a/packages/bitcore-hardware/src/ledger/modules/sol.ts +++ b/packages/bitcore-hardware/src/ledger/modules/sol.ts @@ -4,12 +4,13 @@ import { lastValueFrom } from 'rxjs'; import { BaseModule } from 'src/types/base.js'; +import type * as SignerKitSolana from '@ledgerhq/device-signer-kit-solana'; export default class SolanaModule implements BaseModule { - signer: any; + signer: SignerKitSolana.SignerSolana; derivationPath = "44'/501'/0'"; - constructor(signer) { + constructor(signer: SignerKitSolana.SignerSolana) { this.signer = signer; } @@ -20,7 +21,7 @@ export default class SolanaModule implements BaseModule { const ob: Observable = this.signer.signTransaction( this.derivationPath, - transaction.messageBytes + Uint8Array.from(transaction.messageBytes) ).observable; const result = await lastValueFrom(ob); diff --git a/packages/bitcore-hardware/src/ledger/wallet.ts b/packages/bitcore-hardware/src/ledger/wallet.ts index 32a8e3159c..fd487a4e8b 100644 --- a/packages/bitcore-hardware/src/ledger/wallet.ts +++ b/packages/bitcore-hardware/src/ledger/wallet.ts @@ -1,29 +1,35 @@ import { createRequire } from 'module'; +import { Subscription } from 'rxjs'; import { Base, BaseModule } from 'src/types/base.js'; import { EveryUtxoType, TransactionType } from 'src/types/txTypes.js'; import { dmk } from './dmk.js'; import { BitcoinModule, EthereumModule, SolanaModule } from './modules/index.js'; +import type * as DMK from '@ledgerhq/device-management-kit'; +import type * as SignerKitBtc from '@ledgerhq/device-signer-kit-bitcoin'; +import type * as SignerKitEth from '@ledgerhq/device-signer-kit-ethereum'; +import type * as SignerKitSolana from '@ledgerhq/device-signer-kit-solana'; // @eslint disable import/newline-after-import const require = createRequire(import.meta.url); const { CloseAppCommand, - GetOsVersionCommand -} = require('@ledgerhq/device-management-kit'); + GetOsVersionCommand, + isSuccessCommandResult +}: typeof DMK = require('@ledgerhq/device-management-kit'); const { SignerBtcBuilder -} = require('@ledgerhq/device-signer-kit-bitcoin'); +}: typeof SignerKitBtc = require('@ledgerhq/device-signer-kit-bitcoin'); const { SignerEthBuilder -} = require('@ledgerhq/device-signer-kit-ethereum'); +}: typeof SignerKitEth = require('@ledgerhq/device-signer-kit-ethereum'); const { SignerSolanaBuilder -} = require('@ledgerhq/device-signer-kit-solana'); +}: typeof SignerKitSolana = require('@ledgerhq/device-signer-kit-solana'); export default class Ledger implements Base { - device: any; - sessionId: any; - discoverySubscryption: any; + device: DMK.ConnectedDevice | null = null; + sessionId: DMK.DeviceSessionId | null = null; + discoverySubscryption: Subscription | null = null; modules: Record = {}; async connect() { @@ -38,7 +44,7 @@ export default class Ledger implements Base { console.log(`Found ${device.id}, model: ${device.deviceModel.model}`); try { this.sessionId = await dmk.connect({ device }); - this.discoverySubscryption.unsubscribe(); + this.discoverySubscryption?.unsubscribe(); this.device = dmk.getConnectedDevice({ sessionId: this.sessionId @@ -75,7 +81,7 @@ export default class Ledger implements Base { try { await dmk.disconnect({ sessionId: this.sessionId }); this.sessionId = null; - console.log(`Disconnected ${this.device.name}`); + console.log(`Disconnected ${this.device?.name}`); } catch (error) { console.error(error); } @@ -83,9 +89,16 @@ export default class Ledger implements Base { } async getVersion() { - await dmk.sendCommand({ sessionId: this.sessionId, command: new CloseAppCommand() }); - const { seVersion } = (await dmk.sendCommand({ sessionId: this.sessionId, command: new GetOsVersionCommand() })).data; - return seVersion; + const sessionId = this.sessionId; + if (!sessionId) { + throw new Error('Not connected to a Ledger device'); + } + await dmk.sendCommand({ sessionId, command: new CloseAppCommand() }); + const result = await dmk.sendCommand({ sessionId, command: new GetOsVersionCommand() }); + if (!isSuccessCommandResult(result)) { + throw result.error; + } + return result.data.seVersion; } async sign(params: { From 6fdf9dff58a95588be0be116b1a3801b3b0b5d0c Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 20:52:13 -0400 Subject: [PATCH 54/56] bump CWC version for bitcore-hardware to match monorepo and instantiate NFC on connect --- packages/bitcore-hardware/package-lock.json | 40 ++++++++++----------- packages/bitcore-hardware/package.json | 2 +- packages/bitcore-hardware/src/burner.ts | 4 ++- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/packages/bitcore-hardware/package-lock.json b/packages/bitcore-hardware/package-lock.json index ca70af7230..15c7e4c5f5 100644 --- a/packages/bitcore-hardware/package-lock.json +++ b/packages/bitcore-hardware/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@arx-research/libhalo": "^1.19.0", - "@bitpay-labs/crypto-wallet-core": "^11.5.1", + "@bitpay-labs/crypto-wallet-core": "^11.10.3", "@ledgerhq/device-management-kit": "^1.7.1", "@ledgerhq/device-signer-kit-bitcoin": "^1.3.3", "@ledgerhq/device-signer-kit-ethereum": "^1.16.0", @@ -64,9 +64,9 @@ } }, "node_modules/@bitpay-labs/bitcore-lib": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib/-/bitcore-lib-11.5.1.tgz", - "integrity": "sha512-bjYMYo5RWwvCnwWXLwXUJCUVw0aEMDEYx+yC3X26Lzo70pOZFPRgyuiDxdMJfihatdB9u87f0z5U+ja8KSPMsw==", + "version": "11.10.4", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib/-/bitcore-lib-11.10.4.tgz", + "integrity": "sha512-B912D87ervkPym9w87HDKQkVHlZZpg76cCoZWMnKMXWbIKzh5dvlRxUjRNm/TFfwSe/q82LQzWVbnfGQq8NhZg==", "license": "MIT", "dependencies": { "bech32": "=2.0.0", @@ -79,9 +79,9 @@ } }, "node_modules/@bitpay-labs/bitcore-lib-cash": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-cash/-/bitcore-lib-cash-11.5.1.tgz", - "integrity": "sha512-iGmWYEPkUl/4kW2A0Vz1TWXnpCF1nODZD4pDUYWy4nIBx3i00h96Aose5kYIgbO7fkqd8sm/IqqxM0HaSuE3HA==", + "version": "11.10.4", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-cash/-/bitcore-lib-cash-11.10.4.tgz", + "integrity": "sha512-UVFQFu/JMtUmpTENzQ+kfaYTjx3Qg+XxhzqLRkHp8CI+IxX7WwmbbeJ1n3kKyIWnrpqMnbZrTcbh00eSjwIB4w==", "license": "MIT", "dependencies": { "bn.js": "=4.11.8", @@ -99,9 +99,9 @@ "license": "ISC" }, "node_modules/@bitpay-labs/bitcore-lib-doge": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-doge/-/bitcore-lib-doge-11.5.1.tgz", - "integrity": "sha512-nletyOA0ztjjRrMduRhQ9oL7Ltl5HrnRt+jt4px0de/U//lAFqCx99L5Pkdt7/lQnx9GhkdWd3BmY+YaoVGyVw==", + "version": "11.10.4", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-doge/-/bitcore-lib-doge-11.10.4.tgz", + "integrity": "sha512-1J5aR9VSmDl6hCnq8d6M77vcMFiCb0uAF0ujJk3Wf/n13ObJQtzzAgahh/sOJ/rhtjT8wJhxQIjlQ1ZkajOxkg==", "license": "MIT", "dependencies": { "bn.js": "=4.11.8", @@ -120,9 +120,9 @@ "license": "ISC" }, "node_modules/@bitpay-labs/bitcore-lib-ltc": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-ltc/-/bitcore-lib-ltc-11.5.1.tgz", - "integrity": "sha512-BHaAKFsJ+qIXOnbaQGYMxICdeOwJtwIla+h2JrzPT7xU0N0cPA5o3aRRdzdVJYeWD0zyp8sv/V+b3CzT2zsN3Q==", + "version": "11.10.4", + "resolved": "https://registry.npmjs.org/@bitpay-labs/bitcore-lib-ltc/-/bitcore-lib-ltc-11.10.4.tgz", + "integrity": "sha512-XSk6iG9bqTU/n/ywFiFo335FH5zgBUX4YI9EZuAL59qLrqRiIDQiK02lL/jdDQLpJJr59PjCBnkUAKJVvHzhxg==", "license": "MIT", "dependencies": { "bech32": "=2.0.0", @@ -148,15 +148,15 @@ "license": "ISC" }, "node_modules/@bitpay-labs/crypto-wallet-core": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/@bitpay-labs/crypto-wallet-core/-/crypto-wallet-core-11.5.1.tgz", - "integrity": "sha512-5VzX6xAR2O7k/Crf7Kf5wEOqTaGPzl6eU7K1nepSE+wT28O2VMWxjrckP8XoO8sbH0iXpApoi4nkFuSsQFFcqg==", + "version": "11.10.4", + "resolved": "https://registry.npmjs.org/@bitpay-labs/crypto-wallet-core/-/crypto-wallet-core-11.10.4.tgz", + "integrity": "sha512-yqsvLdoml0LK9EqluUoH8HKFktZfmsF9p77kFwoVEG628tNs6tZHmAGjEwQ+XPnJis4JUuSOk79pGhBrO0bsYQ==", "license": "MIT", "dependencies": { - "@bitpay-labs/bitcore-lib": "^11.5.1", - "@bitpay-labs/bitcore-lib-cash": "^11.5.1", - "@bitpay-labs/bitcore-lib-doge": "^11.5.1", - "@bitpay-labs/bitcore-lib-ltc": "^11.5.1", + "@bitpay-labs/bitcore-lib": "^11.10.4", + "@bitpay-labs/bitcore-lib-cash": "^11.10.4", + "@bitpay-labs/bitcore-lib-doge": "^11.10.4", + "@bitpay-labs/bitcore-lib-ltc": "^11.10.4", "@solana-program/compute-budget": "0.7.0", "@solana-program/memo": "0.7.0", "@solana-program/system": "0.7.0", diff --git a/packages/bitcore-hardware/package.json b/packages/bitcore-hardware/package.json index e57675fd44..5f0a257bc2 100644 --- a/packages/bitcore-hardware/package.json +++ b/packages/bitcore-hardware/package.json @@ -34,7 +34,7 @@ "license": "MIT", "dependencies": { "@arx-research/libhalo": "^1.19.0", - "@bitpay-labs/crypto-wallet-core": "^11.5.1", + "@bitpay-labs/crypto-wallet-core": "^11.10.3", "@ledgerhq/device-management-kit": "^1.7.1", "@ledgerhq/device-signer-kit-bitcoin": "^1.3.3", "@ledgerhq/device-signer-kit-ethereum": "^1.16.0", diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index ccff17e7f8..b002c3e786 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -14,7 +14,7 @@ const { Address, PublicKey, crypto } = BitcoreLib; * Methods queue a command to run when the card is scanned. */ export default class Burner implements Base { - nfc = new NFC(); + nfc?: NFC; // list of commands waiting to be sent to the wallet commandQueue: Record[] = []; // responses to all the commands from commandQueue @@ -66,6 +66,8 @@ export default class Burner implements Base { * Sends all commands to the wallet and recieves all responses */ connect() { + this.nfc = this.nfc ?? new NFC(); + this.nfc.on('reader', (reader) => { reader.autoProcessing = false; From 81762749d329cbc2c713ebcc2d807ea9ce7d95a0 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 22:12:13 -0400 Subject: [PATCH 55/56] compress public in burner wallet witness --- .../examples/burner/sign-btc.ts | 45 +++++-------------- packages/bitcore-hardware/src/burner.ts | 2 +- 2 files changed, 12 insertions(+), 35 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/sign-btc.ts b/packages/bitcore-hardware/examples/burner/sign-btc.ts index abd4331a31..45c9d07dee 100644 --- a/packages/bitcore-hardware/examples/burner/sign-btc.ts +++ b/packages/bitcore-hardware/examples/burner/sign-btc.ts @@ -2,54 +2,30 @@ import 'source-map-support/register.js'; import CWC from '@bitpay-labs/crypto-wallet-core'; import Burner from '../../src/burner.js'; -const { PublicKey, Script } = CWC.BitcoreLib; - const burner = new Burner(); burner.connect(); -// Predefined for now. For other wallets: -// const publicKey = new PublicKey(await burner.getPublicKey({ index: 9 })) -const publicKey = new PublicKey('04161f62f9778a44bd3d07009b1f2e9df7ab1dc57e74665db7ed8baa95780452ab39f4975099f3ae36f7b6a874b46edd79d1d88573a325b9976fd8f120bed704aa'); -const address = publicKey.toAddress(); - +// utxo from https://api.bitcore.io/api/BTC/mainnet/address/bc1q2mz4276pxzt2488xtmml9esn8hmnhj5t3rd8gk/coins const utxos = [ { chain: 'BTC', - network: 'regtest', - coinbase: true, - mintIndex: 0, - spentTxid: '517dc566fb3a82121840eecdcce4636fb776b6b64ccc4f29f74b870e6bcc44b0', - mintTxid: 'd3667993af738c3db4033dc462ab95f9916da455c628bbf71488484e2b6803c3', - mintHeight: 5, - spentHeight: 111, - address: address.toString(), - script: Script.buildWitnessV0Out(address), - value: 600, - confirmations: 1, - sequenceNumber: 4294967293, - wallets: [] - }, - { - chain: 'BTC', - network: 'regtest', + network: 'mainnet', coinbase: false, - mintIndex: 1, + mintIndex: 0, spentTxid: '', - mintTxid: '517dc566fb3a82121840eecdcce4636fb776b6b64ccc4f29f74b870e6bcc44b0', - mintHeight: 111, + mintTxid: '3f91933d95a2025e10f6a3c4d332c693921550036b1c2e9c2625189b4f49d6e4', + mintHeight: 956531, spentHeight: -2, - address: address.toString(), - script: Script.buildWitnessV0Out(address), - value: 600, - confirmations: 1, - sequenceNumber: 4294967295, - wallets: [] + address: 'bc1q2mz4276pxzt2488xtmml9esn8hmnhj5t3rd8gk', + script: '001456c5557b413096aa9ce65ef7f2e6133df73bca8b', + value: 8050, + confirmations: -1 } ]; const tx: string = CWC.Transactions.create({ chain: 'BTC', - recipients: [{ address: '1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', amount: 1000 }], + recipients: [{ address: 'bc1qm5anagcsad5kx2kuq3lv0j5zaxkxr7teuk9wfa', amount: 7800 }], utxos }); @@ -64,5 +40,6 @@ const signedTransaction: any = await burner.sign({ console.log('Signed transaction'); console.log(signedTransaction); +// view transaction on https://bitpay.com/insight/BTC/mainnet/tx/13468b95f83bd346ddd96fafa145d078da9265529829c7fa43324cfba557b243 process.exit(0); diff --git a/packages/bitcore-hardware/src/burner.ts b/packages/bitcore-hardware/src/burner.ts index b002c3e786..1a44084e44 100644 --- a/packages/bitcore-hardware/src/burner.ts +++ b/packages/bitcore-hardware/src/burner.ts @@ -153,7 +153,7 @@ export default class Burner implements Base { const response = responses[i]; const publicKey = new PublicKey(response.publicKey); const signature = crypto.Signature.fromString(response.signature.der); - signature.pubKey = publicKey; + signature.pubKey = BitcoreLib.crypto.Point.pointToCompressed(publicKey.point).toString('hex'); CWC.Transactions.applySignature({ chain: 'BTC', From bfb0aa5fb500b47150423f7d63938356bdba4fc2 Mon Sep 17 00:00:00 2001 From: Micah Maphet Date: Mon, 17 Aug 2026 22:54:40 -0400 Subject: [PATCH 56/56] fixes in ledger bitcoin signing verified with documented transaction broadcast --- .../examples/burner/sign-btc.ts | 7 ++- .../examples/ledger/sign-btc.ts | 49 +++++++++++++------ .../examples/ledger/sign-sol.ts | 2 + .../src/ledger/modules/btc.ts | 6 +-- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/packages/bitcore-hardware/examples/burner/sign-btc.ts b/packages/bitcore-hardware/examples/burner/sign-btc.ts index 45c9d07dee..5fb17ead30 100644 --- a/packages/bitcore-hardware/examples/burner/sign-btc.ts +++ b/packages/bitcore-hardware/examples/burner/sign-btc.ts @@ -40,6 +40,11 @@ const signedTransaction: any = await burner.sign({ console.log('Signed transaction'); console.log(signedTransaction); -// view transaction on https://bitpay.com/insight/BTC/mainnet/tx/13468b95f83bd346ddd96fafa145d078da9265529829c7fa43324cfba557b243 +/* +Broadcasted using bitcore-node: +$ curl --header "Content-Type: application/json" --request POST -d '{"rawTx":"02000000000101e4d6494f9b1825269c2e1c6b0350159293c632d3c4a3f6105e02a2953d93913f0000000000ffffffff01781e000000000000160014dd3b3ea310eb69632adc047ec7ca82e9ac61f97902483045022100ea2a45801e44f57dfc55f40f38d13122fb14d654ac54ac45ff8619420a15803a0220724ffad2f689561961a1d3e5d6b87998f461d8f891a66f5043bfe7b99ce6c2db012102161f62f9778a44bd3d07009b1f2e9df7ab1dc57e74665db7ed8baa95780452ab00000000"}' https://api.bitcore.io/api/BTC/mainnet/tx/send +{"txid":"13468b95f83bd346ddd96fafa145d078da9265529829c7fa43324cfba557b243"} +View on Insight: https://bitpay.com/insight/BTC/mainnet/tx/13468b95f83bd346ddd96fafa145d078da9265529829c7fa43324cfba557b243 +*/ process.exit(0); diff --git a/packages/bitcore-hardware/examples/ledger/sign-btc.ts b/packages/bitcore-hardware/examples/ledger/sign-btc.ts index 2ef838f9fb..6106b695b0 100644 --- a/packages/bitcore-hardware/examples/ledger/sign-btc.ts +++ b/packages/bitcore-hardware/examples/ledger/sign-btc.ts @@ -1,30 +1,49 @@ import 'source-map-support/register.js'; -import { BitcoreLib } from '@bitpay-labs/crypto-wallet-core'; +import CWC from '@bitpay-labs/crypto-wallet-core'; import Ledger from '../../src/ledger/wallet.js'; -const { HDPublicKey, Script, Transaction } = BitcoreLib; - const ledger = new Ledger(); await ledger.connect(); -const publickey = new HDPublicKey(await ledger.getPublicKey({ chain: 'BTC' })).derive('m/0/0').publicKey; +// utxos from https://api.bitcore.io/api/BTC/mainnet/address/bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq/coins +const utxos = [ + { + chain: 'BTC', + network: 'mainnet', + coinbase: false, + mintIndex: 0, + spentTxid: '', + mintTxid: '78519a191327dfdc0c2ea64a04d09d87c3909ce8365d0e0c0dbd0bc80d0405b4', + mintHeight: 957071, + spentHeight: -2, + address: 'bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq', + script: '001491f570a0236f1b6b40f52514c6e6623eacd56a0b', + value: 1562, + confirmations: -1 + } +]; -const tx = new Transaction() - .from({ - address: 'bc1q0wsc0l2pzfn55ra67kr0vm40rjlllyh3a5kf88', - txId: 'a78dbd15bde4d8678c7e01451d6e54e92629395c9b76de7d37bf464514c8bc04', - outputIndex: 0, - script: Script.buildWitnessV0Out(publickey.toAddress()), - satoshis: 9290 - }); +const tx: string = CWC.Transactions.create({ + chain: 'BTC', + recipients: [{ address: 'bc1qm5anagcsad5kx2kuq3lv0j5zaxkxr7teuk9wfa', amount: 1200 }], + utxos +}); console.log(`Sign ${tx}`); const signedTransaction = await ledger.sign({ chain: 'BTC', - tx + tx, + utxos }); -console.log(signedTransaction); -await ledger.disconnect(); console.log('Signed transaction'); +console.log(signedTransaction); +/* +Broadcasted using bitcore-node +$ curl --header "Content-Type: application/json" --request POST -d '{"rawTx": "02000000000101b405040dc80bbd0d0c0e5d36e89c90c3879dd0044aa62e0cdcdf2713199a51780000000000ffffffff01b004000000000000160014dd3b3ea310eb69632adc047ec7ca82e9ac61f9790247304402205e0bc606e3e76e8c623b4de8fd1c1ac098aaf32b161310f7dbaa14d8d29dcd2602203fd47d3d1fb0b223b203a5d01fd28804296666d1a15d1040d4140ba4bfee6125012103a7c7057355969fb52b23744aae7275f10440620654a912a78684a8a697d92e2b00000000"}' https://api.bitcore.io/api/BTC/mainnet/tx/send +{"txid":"3049a6c75390696260366672693ebccf1a5a9892e3aa728b1f51c59e8f137a26"} + +View on Insight: https://bitpay.com/insight/BTC/mainnet/tx/3049a6c75390696260366672693ebccf1a5a9892e3aa728b1f51c59e8f137a26 +*/ +await ledger.disconnect(); process.exit(0); diff --git a/packages/bitcore-hardware/examples/ledger/sign-sol.ts b/packages/bitcore-hardware/examples/ledger/sign-sol.ts index 563874dde8..2d3ac9dcd1 100644 --- a/packages/bitcore-hardware/examples/ledger/sign-sol.ts +++ b/packages/bitcore-hardware/examples/ledger/sign-sol.ts @@ -25,4 +25,6 @@ const signedTransaction = await ledger.sign({ console.log('Signed transaction'); console.log(signedTransaction); + +await ledger.disconnect(); process.exit(0); diff --git a/packages/bitcore-hardware/src/ledger/modules/btc.ts b/packages/bitcore-hardware/src/ledger/modules/btc.ts index 85a7d16601..cca9535202 100644 --- a/packages/bitcore-hardware/src/ledger/modules/btc.ts +++ b/packages/bitcore-hardware/src/ledger/modules/btc.ts @@ -36,8 +36,9 @@ export default class BitcoinModule implements BaseModule { const pubkey = new HDPublicKey(await this.getPublicKey()).derive('m/0/0').publicKey.toBuffer(); const masterFingerprint = await this.getMasterKeyFingerprint(); + psbt.addInputs(bitcoreTx.inputs.map(input => ({ - hash: input.prevTxId, + hash: input.prevTxId.toString('hex'), index: input.outputIndex, witnessUtxo: { script: input.output._script.toBuffer(), @@ -49,8 +50,7 @@ export default class BitcoinModule implements BaseModule { path: "m/84'/0'/0'/0/0", }] }))); - - psbt.addOutputs([{ address: 'bc1qj86hpgprdudkks84y52vdenz86kd26stkssrcq', value: 900 }]); + psbt.addOutputs(bitcoreTx.outputs.map(utxo => ({ script: utxo.script.toBuffer(), value: utxo.satoshis }))); const ob: Observable = this.signer.signTransaction( new DefaultWallet(this.derivationPath, DefaultDescriptorTemplate.NATIVE_SEGWIT),