From 96a0984b171d4ac4d50beae24daabb9127d5f1b0 Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Wed, 4 Jun 2025 16:01:46 -0700 Subject: [PATCH 01/13] feat: add more trezor paths, export path type, add ledger bluetooth --- packages/hw-wallets/package.json | 1 + packages/hw-wallets/src/configs.ts | 141 ++++++++++++++++++ packages/hw-wallets/src/index.ts | 10 ++ .../hw-wallets/src/ledger/ethereum/index.ts | 37 +++-- .../hw-wallets/src/trezor/ethereum/configs.ts | 39 ++++- .../hw-wallets/src/trezor/ethereum/index.ts | 12 +- 6 files changed, 223 insertions(+), 17 deletions(-) diff --git a/packages/hw-wallets/package.json b/packages/hw-wallets/package.json index 4259292f1..9fb7ad278 100644 --- a/packages/hw-wallets/package.json +++ b/packages/hw-wallets/package.json @@ -56,6 +56,7 @@ "@ledgerhq/hw-app-eth": "^6.45.5", "@ledgerhq/hw-app-solana": "^7.4.1", "@ledgerhq/hw-transport": "^6.31.5", + "@ledgerhq/hw-transport-web-ble": "^6.29.5", "@ledgerhq/hw-transport-webusb": "^6.29.5", "@ledgerhq/live-common": "^34.20.0", "@polkadot/types": "^16.1.1", diff --git a/packages/hw-wallets/src/configs.ts b/packages/hw-wallets/src/configs.ts index e875ba868..4a72fc973 100644 --- a/packages/hw-wallets/src/configs.ts +++ b/packages/hw-wallets/src/configs.ts @@ -61,6 +61,11 @@ const bip44Paths = { basePath: "m/44'/137'/0'/0", label: "Rootstock", }, + rootstockTestnet: { + path: "m/44'/37310'/0'/0/{index}", + basePath: "m/44'/37310'/0'/0", + label: 'Rootstock Testnet' + }, ethereumClassic: { path: "m/44'/61'/0'/0/{index}", basePath: "m/44'/61'/0'/0", @@ -116,5 +121,141 @@ const bip44Paths = { basePath: "m/44'/3'/0'/0", label: "Dogecoin", }, + // Additional paths from MyEtherWallet + poaNetwork: { + path: "m/44'/60'/0'/0/{index}", + basePath: "m/44'/60'/0'/0", + label: 'POA network' + }, + expanse: { + path: "m/44'/40'/0'/0/{index}", + basePath: "m/44'/40'/0'/0", + label: 'Expanse' + }, + ubiq: { + path: "m/44'/108'/0'/0/{index}", + basePath: "m/44'/108'/0'/0", + label: 'Ubiq' + }, + ellaism: { + path: "m/44'/163'/0'/0/{index}", + basePath: "m/44'/163'/0'/0", + label: 'Ellaism' + }, + etherGem: { + path: "m/44'/1987'/0'/0/{index}", + basePath: "m/44'/1987'/0'/0", + label: 'EtherGem' + }, + callisto: { + path: "m/44'/820'/0'/0/{index}", + basePath: "m/44'/820'/0'/0", + label: 'Callisto' + }, + ethereumSocial: { + path: "m/44'/1128'/0'/0/{index}", + basePath: "m/44'/1128'/0'/0", + label: 'Ethereum Social' + }, + musicoin: { + path: "m/44'/184'/0'/0/{index}", + basePath: "m/44'/184'/0'/0", + label: 'Musicoin' + }, + goChain: { + path: "m/44'/6060'/0'/0/{index}", + basePath: "m/44'/6060'/0'/0", + label: 'GoChain' + }, + eosClassic: { + path: "m/44'/2018'/0'/0/{index}", + basePath: "m/44'/2018'/0'/0", + label: 'EOS Classic' + }, + akroma: { + path: "m/44'/200625'/0'/0/{index}", + basePath: "m/44'/200625'/0'/0", + label: 'Akroma' + }, + etherSocialNetwork: { + path: "m/44'/31102'/0'/0/{index}", + basePath: "m/44'/31102'/0'/0", + label: 'EtherSocial Network' + }, + pirl: { + path: "m/44'/164'/0'/0/{index}", + basePath: "m/44'/164'/0'/0", + label: 'PIRL' + }, + ether1: { + path: "m/44'/1313114'/0'/0/{index}", + basePath: "m/44'/1313114'/0'/0", + label: 'Ether-1' + }, + atheios: { + path: "m/44'/1620'/0'/0/{index}", + basePath: "m/44'/1620'/0'/0", + label: 'Atheios' + }, + tomoChain: { + path: "m/44'/889'/0'/0/{index}", + basePath: "m/44'/889'/0'/0", + label: 'TomoChain' + }, + mixBlockchain: { + path: "m/44'/76'/0'/0/{index}", + basePath: "m/44'/76'/0'/0", + label: 'Mix Blockchain' + }, + iolite: { + path: "m/44'/1171337'/0'/0/{index}", + basePath: "m/44'/1171337'/0'/0", + label: 'Iolite' + }, + thundercore: { + path: "m/44'/1001'/0'/0/{index}", + basePath: "m/44'/1001'/0'/0", + label: 'ThunderCore' + }, + solidum: { + path: "m/44'/997'/0'/0/{index}", + basePath: "m/44'/997'/0'/0", + label: 'Solidum' + }, + metadium: { + path: "m/44'/916'/0'/0/{index}", + basePath: "m/44'/916'/0'/0", + label: 'Metadium' + }, + reoscChain: { + path: "m/44'/2894'/0'/0/{index}", + basePath: "m/44'/2894'/0'/0", + label: 'REOSC' + }, + dexon: { + path: "m/44'/237'/0'/0/{index}", + basePath: "m/44'/237'/0'/0", + label: 'DEXON Network' + }, + lightstreamsNetwork: { + path: "m/44'/60'/0'/{index}", + basePath: "m/44'/60'/0'", + label: 'Lightstreams Network' + }, + mintmeComCoin: { + path: "m/44'/227'/0'/0/{index}", + basePath: "m/44'/227'/0'/0", + label: 'MintMe.com Coin' + }, + ethercore: { + path: "m/44'/466'/0'/0/{index}", + basePath: "m/44'/466'/0'/0", + label: 'EtherCore' + }, + binanceChain: { + path: "m/44'/714'/{index}", + basePath: "m/44'/714'", + label: 'Binance Chain' + }, }; export { walletConfigs, MessengerName, ledgerAppNames, bip44Paths }; diff --git a/packages/hw-wallets/src/index.ts b/packages/hw-wallets/src/index.ts index e293f0d0a..ed750c19a 100644 --- a/packages/hw-wallets/src/index.ts +++ b/packages/hw-wallets/src/index.ts @@ -114,3 +114,13 @@ class HWwalletManager { export default HWwalletManager; export { ledgerAppNames }; + +export type { + AddressResponse, + getAddressRequest, + HWWalletProvider, + isConnectedRequest, + PathType, + SignMessageRequest, + SignTransactionRequest, +} diff --git a/packages/hw-wallets/src/ledger/ethereum/index.ts b/packages/hw-wallets/src/ledger/ethereum/index.ts index 588c692a4..78251ba1a 100644 --- a/packages/hw-wallets/src/ledger/ethereum/index.ts +++ b/packages/hw-wallets/src/ledger/ethereum/index.ts @@ -1,5 +1,6 @@ import type Transport from "@ledgerhq/hw-transport"; import webUsbTransport from "@ledgerhq/hw-transport-webusb"; +import bleTransport from '@ledgerhq/hw-transport-web-ble'; import ledgerService from "@ledgerhq/hw-app-eth/lib/services/ledger"; import { HWwalletCapabilities, NetworkNames } from "@enkryptcom/types"; import EthApp from "@ledgerhq/hw-app-eth"; @@ -34,17 +35,31 @@ class LedgerEthereum implements HWWalletProvider { async init(): Promise { if (!this.transport) { - const support = await webUsbTransport.isSupported(); - if (support) { - this.transport = await webUsbTransport.openConnected().then((res) => { - if (!res) return webUsbTransport.create(); - return res; - }); - } else { - return Promise.reject( - new Error("ledger-ethereum: webusb is not supported"), - ); + try { + const BLEsupport = await bleTransport.isSupported(); + if (BLEsupport) { + const transport = await bleTransport.create(); + transport.on("disconnect", () => { // connection wasnt succesful + this.transport = null; + }) + this.transport = transport; + } + + } catch { + const support = await webUsbTransport.isSupported(); + if (support) { + this.transport = await webUsbTransport.openConnected().then((res) => { + if (!res) return webUsbTransport.create(); + return res; + }); + + } else { + return Promise.reject( + new Error("ledger-ethereum: webusb is not supported"), + ); + } } + } return true; } @@ -142,7 +157,7 @@ class LedgerEthereum implements HWWalletProvider { close(): Promise { // eslint-disable-next-line @typescript-eslint/no-empty-function - return this.transport.close().catch(() => {}); + return this.transport.close().catch(() => { }); } isConnected(networkName: NetworkNames): Promise { diff --git a/packages/hw-wallets/src/trezor/ethereum/configs.ts b/packages/hw-wallets/src/trezor/ethereum/configs.ts index 7062394ed..6dc736d7f 100644 --- a/packages/hw-wallets/src/trezor/ethereum/configs.ts +++ b/packages/hw-wallets/src/trezor/ethereum/configs.ts @@ -2,7 +2,7 @@ import { NetworkNames } from "@enkryptcom/types"; import { bip44Paths } from "../../configs"; const DEFAULT_PATHS = [bip44Paths.ethereum]; -const supportedPaths = { +const networkBasedSupportedPaths = { [NetworkNames.Ethereum]: DEFAULT_PATHS, [NetworkNames.Matic]: DEFAULT_PATHS, [NetworkNames.Avalanche]: DEFAULT_PATHS, @@ -28,4 +28,39 @@ const supportedPaths = { [NetworkNames.Telos]: DEFAULT_PATHS, [NetworkNames.Blast]: DEFAULT_PATHS, }; -export { supportedPaths }; +const ALL_SUPPORTED_PATHS = [ + bip44Paths.ethereum, + bip44Paths.ethereumTestnet, + bip44Paths.ethereumClassic, + bip44Paths.rootstock, + Object.assign({}, bip44Paths.ethereumLedger, { label: "Ethereum - Ledger" }), // specify ledger + bip44Paths.ethereumLedgerLive, + bip44Paths.poaNetwork, + bip44Paths.expanse, + bip44Paths.ubiq, + bip44Paths.ellaism, + bip44Paths.etherGem, + bip44Paths.callisto, + bip44Paths.ethereumSocial, + bip44Paths.musicoin, + bip44Paths.goChain, + bip44Paths.eosClassic, + bip44Paths.akroma, + bip44Paths.etherSocialNetwork, + bip44Paths.pirl, + bip44Paths.ether1, + bip44Paths.atheios, + bip44Paths.tomoChain, + bip44Paths.mixBlockchain, + bip44Paths.iolite, + bip44Paths.thundercore, + bip44Paths.solidum, + bip44Paths.metadium, + bip44Paths.reoscChain, + bip44Paths.dexon, + bip44Paths.lightstreamsNetwork, + bip44Paths.mintmeComCoin, + bip44Paths.ethercore, + bip44Paths.binanceChain, +]; +export { networkBasedSupportedPaths, ALL_SUPPORTED_PATHS }; diff --git a/packages/hw-wallets/src/trezor/ethereum/index.ts b/packages/hw-wallets/src/trezor/ethereum/index.ts index dc4ee79fe..5d648d870 100644 --- a/packages/hw-wallets/src/trezor/ethereum/index.ts +++ b/packages/hw-wallets/src/trezor/ethereum/index.ts @@ -12,17 +12,21 @@ import { SignMessageRequest, SignTransactionRequest, } from "../../types"; -import { supportedPaths } from "./configs"; +import { networkBasedSupportedPaths } from "./configs"; import getTrezorConnect from "../trezorConnect"; class TrezorEthereum implements HWWalletProvider { network: NetworkNames; TrezorConnect: TrezorConnect; HDNodes: Record; + isExtension: boolean; constructor(network: NetworkNames) { this.network = network; this.HDNodes = {}; + this.isExtension = !!( + chrome && chrome.runtime && chrome.runtime.getPlatformInfo + ); } async init(): Promise { @@ -31,7 +35,7 @@ class TrezorEthereum implements HWWalletProvider { } async getAddress(options: getAddressRequest): Promise { - if (!supportedPaths[this.network]) + if (this.isExtension && !networkBasedSupportedPaths[this.network]) return Promise.reject(new Error("trezor-ethereum: Invalid network name")); if (!this.HDNodes[options.pathType.basePath]) { @@ -59,7 +63,7 @@ class TrezorEthereum implements HWWalletProvider { } getSupportedPaths(): PathType[] { - return supportedPaths[this.network]; + return this.isExtension ? networkBasedSupportedPaths[this.network] : []; } close(): Promise { @@ -130,7 +134,7 @@ class TrezorEthereum implements HWWalletProvider { } static getSupportedNetworks(): NetworkNames[] { - return Object.keys(supportedPaths) as NetworkNames[]; + return Object.keys(networkBasedSupportedPaths) as NetworkNames[]; } static getCapabilities(): string[] { From dd5709cc97df06c6438e3c6bbfc9c2779a4a1dde Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Wed, 4 Jun 2025 16:04:24 -0700 Subject: [PATCH 02/13] fix: conflicts --- packages/hw-wallets/README.md | 69 ++++++++++++++++++++++++++++++++ packages/hw-wallets/package.json | 2 +- 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/packages/hw-wallets/README.md b/packages/hw-wallets/README.md index 01c785442..ba4b3b0d9 100644 --- a/packages/hw-wallets/README.md +++ b/packages/hw-wallets/README.md @@ -1,3 +1,72 @@ # @enkryptcom/hw-wallets +## v0.0.5 + ## Hardware wallet manager for enkrypt + +### Getting started + +#### Minimum Node version + +`node v20` + +#### Installation + +NPM: `npm install @enkryptcom/hw-wallets @enkryptcom/types` +Yarn: `yarn add @enkryptcom/hw-wallets @enkryptcom/types` +PNPM `pnpm add @enkryptcom/hw-wallets @enkryptcom/types` + +### How to use + +1. Create an instance of `HWwalletManager` + +``` +import HWwalletManager from @enkryptcom/hw-wallets + +const hwManager = new HWwalletManager() +``` + +2. Call methods within class, passing network names and providers. Class automatically handles which wallet to use. + +### API + +#### `getAddress(options: getAddressRequest): Promise` + +Returns wallet address based off of the path provided in the `getAddressRequest`. + +#### `signPersonalMessage(options: SignMessageRequest): Promise` + +Signs personal message. + +#### `signTransaction(options: SignTransactionRequest): Promise` + +Signs transaction. + +#### `getSupportedPaths(options: isConnectedRequest): Promise` + +Returns supported paths based on options provided. + +#### `isNetworkSupported(networkName: NetworkNames): boolean` + +Checks network name support. + +#### `isConnected(options: isConnectedRequest): Promise` + +Checks connection status. + +#### `close(): Promise` + +Closes all HW wallet connections + +### Types + +`NetworkNames`: https://github.com/enkryptcom/enKrypt/blob/main/packages/types/src/networks.ts#L1 +`getAddressRequest`: https://github.com/enkryptcom/enKrypt/blob/main/packages/hw-wallets/src/types.ts#L74 +`AddressResponse`: https://github.com/enkryptcom/enKrypt/blob/main/packages/hw-wallets/src/types.ts#L31 +`SignMessageRequest`: https://github.com/enkryptcom/enKrypt/blob/main/packages/hw-wallets/src/types.ts#L54 +`SignTransactionRequest`: https://github.com/enkryptcom/enKrypt/blob/main/packages/hw-wallets/src/types.ts#L65 +`isConnectedRequest`: https://github.com/enkryptcom/enKrypt/blob/main/packages/hw-wallets/src/types.ts#L78 + +### Examples + +TO BE ADDED diff --git a/packages/hw-wallets/package.json b/packages/hw-wallets/package.json index 9fb7ad278..f5b65973a 100644 --- a/packages/hw-wallets/package.json +++ b/packages/hw-wallets/package.json @@ -19,7 +19,7 @@ "test": "vitest run" }, "engines": { - "node": ">=14.15.0" + "node": ">=20" }, "devDependencies": { "@types/node": "^22.15.24", From cca3fcd54b14f04b0f747924fe987af0008f23e9 Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Wed, 4 Jun 2025 16:05:20 -0700 Subject: [PATCH 03/13] devop: add minor note on readme --- packages/hw-wallets/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hw-wallets/README.md b/packages/hw-wallets/README.md index ba4b3b0d9..f35a3cc5c 100644 --- a/packages/hw-wallets/README.md +++ b/packages/hw-wallets/README.md @@ -67,6 +67,6 @@ Closes all HW wallet connections `SignTransactionRequest`: https://github.com/enkryptcom/enKrypt/blob/main/packages/hw-wallets/src/types.ts#L65 `isConnectedRequest`: https://github.com/enkryptcom/enKrypt/blob/main/packages/hw-wallets/src/types.ts#L78 -### Examples +### Notes -TO BE ADDED +Connection request to hardware wallet actually happens on `getAddress()` request. From 4d029f1f134c3d251f1896668c7d8c639af5757b Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Wed, 4 Jun 2025 16:11:48 -0700 Subject: [PATCH 04/13] devop: add path --- packages/hw-wallets/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/hw-wallets/README.md b/packages/hw-wallets/README.md index f35a3cc5c..5bcc889b8 100644 --- a/packages/hw-wallets/README.md +++ b/packages/hw-wallets/README.md @@ -70,3 +70,12 @@ Closes all HW wallet connections ### Notes Connection request to hardware wallet actually happens on `getAddress()` request. + +### Adding more paths + +Navigate to `src/configs.ts` and add your new derivation path at the bottom. +Make sure to follow the configuration in that file. +Import path in the corresponding `Trezor` provider `config.ts`. +See `src/trezor/ethereum/configs.ts` for example. + +NOTE: `Ledger` can't have any paths as each paths are defined by the corresponding app. From 47ff858fb83d1892a828649620bcf304b231c508 Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Wed, 4 Jun 2025 16:16:08 -0700 Subject: [PATCH 05/13] devop: define sign transaction return value better --- packages/hw-wallets/README.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/hw-wallets/README.md b/packages/hw-wallets/README.md index 5bcc889b8..0ab9fe8a2 100644 --- a/packages/hw-wallets/README.md +++ b/packages/hw-wallets/README.md @@ -40,7 +40,7 @@ Signs personal message. #### `signTransaction(options: SignTransactionRequest): Promise` -Signs transaction. +Returns an RPC sign you can then add to a transaction object. #### `getSupportedPaths(options: isConnectedRequest): Promise` @@ -67,10 +67,6 @@ Closes all HW wallet connections `SignTransactionRequest`: https://github.com/enkryptcom/enKrypt/blob/main/packages/hw-wallets/src/types.ts#L65 `isConnectedRequest`: https://github.com/enkryptcom/enKrypt/blob/main/packages/hw-wallets/src/types.ts#L78 -### Notes - -Connection request to hardware wallet actually happens on `getAddress()` request. - ### Adding more paths Navigate to `src/configs.ts` and add your new derivation path at the bottom. @@ -79,3 +75,11 @@ Import path in the corresponding `Trezor` provider `config.ts`. See `src/trezor/ethereum/configs.ts` for example. NOTE: `Ledger` can't have any paths as each paths are defined by the corresponding app. + +### Notes + +Connection request to hardware wallet actually happens on `getAddress()` request. + +#### For Vue devs + +`ref/reactive` will mess with how Vue compiles these classes because of how Vue utilizes proxies. If you want to store an instance into a ref or reactive, use [`makeRaw`](https://vuejs.org/api/reactivity-advanced#markraw). From 1cabb24af417d2850f5ba4b584ad6716372f524a Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Wed, 4 Jun 2025 16:18:07 -0700 Subject: [PATCH 06/13] fix: correct version --- packages/hw-wallets/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hw-wallets/README.md b/packages/hw-wallets/README.md index 0ab9fe8a2..2a9ccab3b 100644 --- a/packages/hw-wallets/README.md +++ b/packages/hw-wallets/README.md @@ -1,6 +1,6 @@ # @enkryptcom/hw-wallets -## v0.0.5 +## v0.0.12 ## Hardware wallet manager for enkrypt From 59dc54537a849acd28cdca60b704f71f53c32ddf Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Fri, 6 Jun 2025 10:49:49 -0700 Subject: [PATCH 07/13] devop: update live common --- packages/hw-wallets/package.json | 2 +- yarn.lock | 49 ++++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/packages/hw-wallets/package.json b/packages/hw-wallets/package.json index f5b65973a..5df82a1f7 100644 --- a/packages/hw-wallets/package.json +++ b/packages/hw-wallets/package.json @@ -58,7 +58,7 @@ "@ledgerhq/hw-transport": "^6.31.5", "@ledgerhq/hw-transport-web-ble": "^6.29.5", "@ledgerhq/hw-transport-webusb": "^6.29.5", - "@ledgerhq/live-common": "^34.20.0", + "@ledgerhq/live-common": "34.20.0", "@polkadot/types": "^16.1.1", "@polkadot/util": "^13.5.1", "@trezor/connect": "^9.5.5", diff --git a/yarn.lock b/yarn.lock index c0d6a64a7..17f47bceb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1700,8 +1700,9 @@ __metadata: "@ledgerhq/hw-app-eth": "npm:^6.45.5" "@ledgerhq/hw-app-solana": "npm:^7.4.1" "@ledgerhq/hw-transport": "npm:^6.31.5" + "@ledgerhq/hw-transport-web-ble": "npm:^6.29.5" "@ledgerhq/hw-transport-webusb": "npm:^6.29.5" - "@ledgerhq/live-common": "npm:^34.20.0" + "@ledgerhq/live-common": "npm:34.20.0" "@polkadot/types": "npm:^16.1.1" "@polkadot/util": "npm:^13.5.1" "@trezor/connect": "npm:^9.5.5" @@ -4636,6 +4637,18 @@ __metadata: languageName: node linkType: hard +"@ledgerhq/devices@npm:8.4.6": + version: 8.4.6 + resolution: "@ledgerhq/devices@npm:8.4.6" + dependencies: + "@ledgerhq/errors": "npm:^6.21.0" + "@ledgerhq/logs": "npm:^6.13.0" + rxjs: "npm:^7.8.1" + semver: "npm:^7.3.5" + checksum: 10/8645c556f53160246d0601af4d077fb99d09deabeed778b5ee332958cdfab6505cbe41375eb788f3e8c3255a2c0c8c7e9a65797830cb957d6eccdf11fa257c75 + languageName: node + linkType: hard + "@ledgerhq/devices@npm:^5.51.1": version: 5.51.1 resolution: "@ledgerhq/devices@npm:5.51.1" @@ -4982,6 +4995,19 @@ __metadata: languageName: node linkType: hard +"@ledgerhq/hw-transport-web-ble@npm:^6.29.5": + version: 6.29.6 + resolution: "@ledgerhq/hw-transport-web-ble@npm:6.29.6" + dependencies: + "@ledgerhq/devices": "npm:8.4.6" + "@ledgerhq/errors": "npm:^6.21.0" + "@ledgerhq/hw-transport": "npm:^6.31.6" + "@ledgerhq/logs": "npm:^6.13.0" + rxjs: "npm:^7.8.1" + checksum: 10/ef50ca64f47971f624956bc3e3ba2dd51719900188965128286aeb9fb14bb1d1ce211541b9276a91b713e4dc104bd8ba84e90c032ae27cdbcb1c8ca45848a80f + languageName: node + linkType: hard + "@ledgerhq/hw-transport-webusb@npm:^6.29.5": version: 6.29.5 resolution: "@ledgerhq/hw-transport-webusb@npm:6.29.5" @@ -5087,6 +5113,18 @@ __metadata: languageName: node linkType: hard +"@ledgerhq/hw-transport@npm:^6.31.6": + version: 6.31.6 + resolution: "@ledgerhq/hw-transport@npm:6.31.6" + dependencies: + "@ledgerhq/devices": "npm:8.4.6" + "@ledgerhq/errors": "npm:^6.21.0" + "@ledgerhq/logs": "npm:^6.13.0" + events: "npm:^3.3.0" + checksum: 10/e05514de4de8933e90a1494c0b5e5ae1de523df21ab6fe78558122f41ee67817489b776c8c38ff31ec676991a8cdfb1800f8bb1de59c100e349b599c05dfe6eb + languageName: node + linkType: hard + "@ledgerhq/ledger-cal-service@npm:^0.2.0": version: 0.2.0 resolution: "@ledgerhq/ledger-cal-service@npm:0.2.0" @@ -5124,7 +5162,7 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/live-common@npm:^34.20.0": +"@ledgerhq/live-common@npm:34.20.0": version: 34.20.0 resolution: "@ledgerhq/live-common@npm:34.20.0" dependencies: @@ -5431,6 +5469,13 @@ __metadata: languageName: node linkType: hard +"@ledgerhq/logs@npm:^6.13.0": + version: 6.13.0 + resolution: "@ledgerhq/logs@npm:6.13.0" + checksum: 10/3ac984bdc533505359cd1d8bc74175547fcfa51fef6294a9fd832e8ea88d462a385be5cfe68ccfa1b77cd68b840243e6f79c2be66fe28f123ae57c58625edf5f + languageName: node + linkType: hard + "@ledgerhq/speculos-transport@https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.2.1.tgz": version: 1.2.1 resolution: "@ledgerhq/speculos-transport@https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.2.1.tgz" From 39569a62e1963605fea60f69247610b363640039 Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Tue, 10 Jun 2025 16:05:51 -0700 Subject: [PATCH 08/13] devop: clean up --- packages/hw-wallets/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/hw-wallets/README.md b/packages/hw-wallets/README.md index 2a9ccab3b..2772dba51 100644 --- a/packages/hw-wallets/README.md +++ b/packages/hw-wallets/README.md @@ -74,11 +74,10 @@ Make sure to follow the configuration in that file. Import path in the corresponding `Trezor` provider `config.ts`. See `src/trezor/ethereum/configs.ts` for example. -NOTE: `Ledger` can't have any paths as each paths are defined by the corresponding app. - ### Notes -Connection request to hardware wallet actually happens on `getAddress()` request. +Connection request to hardware wallet actually happens on `getAddress()` request. +`Ledger` can't have any paths as each paths are defined by the corresponding app. #### For Vue devs From 80bbc5c10512ea02f7d6d4f0ab232de752d89e39 Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Thu, 9 Oct 2025 19:23:47 -0700 Subject: [PATCH 09/13] devop: cleanup --- packages/hw-wallets/src/configs.ts | 5 +++++ packages/hw-wallets/src/index.ts | 1 - packages/hw-wallets/src/trezor/bitcoin/configs.ts | 5 +++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/hw-wallets/src/configs.ts b/packages/hw-wallets/src/configs.ts index 78092410a..ce2f343be 100644 --- a/packages/hw-wallets/src/configs.ts +++ b/packages/hw-wallets/src/configs.ts @@ -117,6 +117,11 @@ const bip44Paths = { basePath: "m/84'/0'/0'/0", label: "Bitcoin", }, + bitcoinTestSegwitTrezor: { + path: "m/84'/1'/0'/0/{index}", + basePath: "m/84'/1'/0'/0", + label: "Bitcoin Test", + }, litecoinSegwitTrezor: { path: "m/84'/2'/0'/0/{index}", basePath: "m/84'/2'/0'/0", diff --git a/packages/hw-wallets/src/index.ts b/packages/hw-wallets/src/index.ts index fcc82bb76..7cb7ec336 100644 --- a/packages/hw-wallets/src/index.ts +++ b/packages/hw-wallets/src/index.ts @@ -115,7 +115,6 @@ class HWwalletManager { for (const P of this.providerTypes[wallet]) { if (P.getSupportedNetworks().includes(network)) return new P(network); } - console.log(network, 'AAAAAA') throw new Error(`hw-wallets: no suitable wallets found:${network}`); } } diff --git a/packages/hw-wallets/src/trezor/bitcoin/configs.ts b/packages/hw-wallets/src/trezor/bitcoin/configs.ts index 0e534fe94..eb11d7720 100644 --- a/packages/hw-wallets/src/trezor/bitcoin/configs.ts +++ b/packages/hw-wallets/src/trezor/bitcoin/configs.ts @@ -3,6 +3,7 @@ import { bip44Paths } from "../../configs"; const supportedPaths = { [NetworkNames.Bitcoin]: [bip44Paths.bitcoinSegwitTrezor], + [NetworkNames.BitcoinTest]: [bip44Paths.bitcoinTestSegwitTrezor], [NetworkNames.Litecoin]: [bip44Paths.litecoinSegwitTrezor], [NetworkNames.Dogecoin]: [bip44Paths.dogecoinTrezor], }; @@ -12,6 +13,10 @@ const TrezorNetworkConfigs = { symbol: "btc", isSegwit: true, }, + [NetworkNames.BitcoinTest]: { + symbol: "test", + isSegwit: true, + }, [NetworkNames.Litecoin]: { symbol: "ltc", isSegwit: true, From a888bf25e201770a1afc6b8fbb8e672d7c856293 Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Thu, 9 Oct 2025 21:34:54 -0700 Subject: [PATCH 10/13] devop: revert the default change --- packages/hw-wallets/src/trezor/ethereum/index.ts | 2 +- packages/hw-wallets/src/trezor/trezorConnect.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/hw-wallets/src/trezor/ethereum/index.ts b/packages/hw-wallets/src/trezor/ethereum/index.ts index 830326732..1d8c9800e 100644 --- a/packages/hw-wallets/src/trezor/ethereum/index.ts +++ b/packages/hw-wallets/src/trezor/ethereum/index.ts @@ -65,7 +65,7 @@ class TrezorEthereum implements HWWalletProvider { } getSupportedPaths(): PathType[] { - return this.isExtension ? networkBasedSupportedPaths[this.network] : []; + return networkBasedSupportedPaths[this.network]; } close(): Promise { diff --git a/packages/hw-wallets/src/trezor/trezorConnect.ts b/packages/hw-wallets/src/trezor/trezorConnect.ts index d51610503..ddfddfdef 100644 --- a/packages/hw-wallets/src/trezor/trezorConnect.ts +++ b/packages/hw-wallets/src/trezor/trezorConnect.ts @@ -16,14 +16,14 @@ const getTrezorConnect = async () => { } else { const TrezorConnect = ((await import("@trezor/connect-web")) as any) .default; - await TrezorConnect.default.init({ + await TrezorConnect.init({ lazyLoad: true, manifest: { email: "info@enkrypt.com", appUrl: "http://www.myetherwallet.com", }, }); - return TrezorConnect.default as TrezorConnectType; + return TrezorConnect as TrezorConnectType; } }; From 4bd0a691b020b6a85a72da3ddf3025feb2bfb75a Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Thu, 9 Oct 2025 21:37:20 -0700 Subject: [PATCH 11/13] devop: remove changelog --- packages/hw-wallets/src/ledger/bitcoin/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/hw-wallets/src/ledger/bitcoin/index.ts b/packages/hw-wallets/src/ledger/bitcoin/index.ts index d135b7ffd..85cc73266 100644 --- a/packages/hw-wallets/src/ledger/bitcoin/index.ts +++ b/packages/hw-wallets/src/ledger/bitcoin/index.ts @@ -182,7 +182,6 @@ class LedgerBitcoin implements HWWalletProvider { }); const txArg: CreateTransactionArg = { inputs: transactionOptions.rawTxs.map((rTx, idx) => { - console.log(rTx, transactionOptions) return [ connection.splitTransaction(rTx.replace("0x", ""), true), transactionOptions.psbtTx.txInputs[idx].index, From 2c076814f80772105284b742ea50d7d7a91784b8 Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Thu, 9 Oct 2025 23:23:51 -0700 Subject: [PATCH 12/13] devop: merge class to one init function, attempt to fix ble transport issue when first time connecting --- .../hw-wallets/src/ledger/bitcoin/index.ts | 25 ++--------- .../hw-wallets/src/ledger/ethereum/index.ts | 43 +++---------------- .../src/ledger/ledgerInitializer.ts | 42 ++++++++++++++++++ .../hw-wallets/src/ledger/solana/index.ts | 26 ++--------- .../hw-wallets/src/ledger/substrate/index.ts | 23 ++-------- yarn.lock | 36 ++++++++-------- 6 files changed, 77 insertions(+), 118 deletions(-) create mode 100644 packages/hw-wallets/src/ledger/ledgerInitializer.ts diff --git a/packages/hw-wallets/src/ledger/bitcoin/index.ts b/packages/hw-wallets/src/ledger/bitcoin/index.ts index 85cc73266..4c7a5883a 100644 --- a/packages/hw-wallets/src/ledger/bitcoin/index.ts +++ b/packages/hw-wallets/src/ledger/bitcoin/index.ts @@ -1,5 +1,3 @@ -import type Transport from "@ledgerhq/hw-transport"; -import webUsbTransport from "@ledgerhq/hw-transport-webusb"; import bs58 from "bs58"; import { AppClient, DefaultWalletPolicy } from "ledger-bitcoin"; import { HWwalletCapabilities, NetworkNames } from "@enkryptcom/types"; @@ -25,9 +23,9 @@ import { } from "../../types"; import { supportedPaths } from "./configs"; import ConnectToLedger from "../ledgerConnect"; +import LedgerInit from "../ledgerInitializer"; -class LedgerBitcoin implements HWWalletProvider { - transport: Transport | null; +class LedgerBitcoin extends LedgerInit implements HWWalletProvider { network: NetworkNames; @@ -36,7 +34,7 @@ class LedgerBitcoin implements HWWalletProvider { isSegwit: boolean; constructor(network: NetworkNames) { - this.transport = null; + super() this.network = network; this.HDNodes = {}; this.isSegwit = !!( @@ -45,23 +43,6 @@ class LedgerBitcoin implements HWWalletProvider { ); } - async init(): Promise { - if (!this.transport) { - const support = await webUsbTransport.isSupported(); - if (support) { - this.transport = await webUsbTransport.openConnected().then((res) => { - if (!res) return webUsbTransport.create(); - return res; - }); - } else { - return Promise.reject( - new Error("ledger-bitcoin: webusb is not supported"), - ); - } - } - return true; - } - async getAddress(options: getAddressRequest): Promise { if (!supportedPaths[this.network]) return Promise.reject(new Error("ledger-bitcoin: Invalid network name")); diff --git a/packages/hw-wallets/src/ledger/ethereum/index.ts b/packages/hw-wallets/src/ledger/ethereum/index.ts index 21d182142..51e309eaf 100644 --- a/packages/hw-wallets/src/ledger/ethereum/index.ts +++ b/packages/hw-wallets/src/ledger/ethereum/index.ts @@ -1,6 +1,6 @@ -import type Transport from "@ledgerhq/hw-transport"; -import webUsbTransport from "@ledgerhq/hw-transport-webusb"; -import bleTransport from '@ledgerhq/hw-transport-web-ble'; +// import type Transport from "@ledgerhq/hw-transport"; +// import webUsbTransport from "@ledgerhq/hw-transport-webusb"; +// import bleTransport from '@ledgerhq/hw-transport-web-ble'; import ledgerService from "@ledgerhq/hw-app-eth/lib/services/ledger"; import { HWwalletCapabilities, NetworkNames } from "@enkryptcom/types"; import EthApp from "@ledgerhq/hw-app-eth"; @@ -21,51 +21,20 @@ import { } from "../../types"; import { supportedPaths } from "./configs"; import ConnectToLedger from "../ledgerConnect"; +import LedgerInit from "../ledgerInitializer"; -class LedgerEthereum implements HWWalletProvider { - transport: Transport | null; - +class LedgerEthereum extends LedgerInit implements HWWalletProvider { network: NetworkNames; HDNodes: Record; constructor(network: NetworkNames) { + super() this.transport = null; this.network = network; this.HDNodes = {}; } - async init(): Promise { - if (!this.transport) { - try { - const BLEsupport = await bleTransport.isSupported(); - if (BLEsupport) { - const transport = await bleTransport.create(); - transport.on("disconnect", () => { // connection wasnt succesful - this.transport = null; - }) - this.transport = transport; - } - - } catch { - const support = await webUsbTransport.isSupported(); - if (support) { - this.transport = await webUsbTransport.openConnected().then((res) => { - if (!res) return webUsbTransport.create(); - return res; - }); - - } else { - return Promise.reject( - new Error("ledger-ethereum: webusb is not supported"), - ); - } - } - - } - return true; - } - async getAddress(options: getAddressRequest): Promise { if (!supportedPaths[this.network]) return Promise.reject(new Error("ledger-ethereum: Invalid network name")); diff --git a/packages/hw-wallets/src/ledger/ledgerInitializer.ts b/packages/hw-wallets/src/ledger/ledgerInitializer.ts new file mode 100644 index 000000000..ce971e0ab --- /dev/null +++ b/packages/hw-wallets/src/ledger/ledgerInitializer.ts @@ -0,0 +1,42 @@ +import type Transport from "@ledgerhq/hw-transport"; +import webUsbTransport from "@ledgerhq/hw-transport-webusb"; +import bleTransport from '@ledgerhq/hw-transport-web-ble'; + +export default class LedgerInit { + transport: Transport | null; + + constructor() { + this.transport = null; + } + async init(): Promise { + + if (!this.transport) { + try { + const BLEsupport = await bleTransport.isSupported(); + if (BLEsupport) { + const transport = await bleTransport.create(); + transport.on("disconnect", () => { // connection wasnt succesful + this.transport = null; + }) + this.transport = transport; + } + + } catch { + const support = await webUsbTransport.isSupported(); + if (support) { + this.transport = await webUsbTransport.openConnected().then((res) => { + if (!res) return webUsbTransport.create(); + return res; + }); + + } else { + return Promise.reject( + new Error("ledger-ethereum: webusb is not supported"), + ); + } + } + + } + return true; + } +} \ No newline at end of file diff --git a/packages/hw-wallets/src/ledger/solana/index.ts b/packages/hw-wallets/src/ledger/solana/index.ts index 59a1f1943..4dafcaf73 100644 --- a/packages/hw-wallets/src/ledger/solana/index.ts +++ b/packages/hw-wallets/src/ledger/solana/index.ts @@ -1,5 +1,3 @@ -import type Transport from "@ledgerhq/hw-transport"; -import webUsbTransport from "@ledgerhq/hw-transport-webusb"; import { HWwalletCapabilities, NetworkNames } from "@enkryptcom/types"; import SolApp from "@ledgerhq/hw-app-solana"; import HDKey from "hdkey"; @@ -16,37 +14,21 @@ import { } from "../../types"; import { supportedPaths } from "./configs"; import ConnectToLedger from "../ledgerConnect"; +import LedgerInit from "../ledgerInitializer"; -class LedgerSolana implements HWWalletProvider { - transport: Transport | null; +class LedgerSolana extends LedgerInit implements HWWalletProvider { network: NetworkNames; HDNodes: Record; constructor(network: NetworkNames) { + super() this.transport = null; this.network = network; this.HDNodes = {}; } - async init(): Promise { - if (!this.transport) { - const support = await webUsbTransport.isSupported(); - if (support) { - this.transport = await webUsbTransport.openConnected().then((res) => { - if (!res) return webUsbTransport.create(); - return res; - }); - } else { - return Promise.reject( - new Error("ledger-solana: webusb is not supported"), - ); - } - } - return true; - } - async getAddress(options: getAddressRequest): Promise { if (!supportedPaths[this.network]) return Promise.reject(new Error("ledger-solana: Invalid network name")); @@ -94,7 +76,7 @@ class LedgerSolana implements HWWalletProvider { close(): Promise { // eslint-disable-next-line @typescript-eslint/no-empty-function - return this.transport.close().catch(() => {}); + return this.transport.close().catch(() => { }); } isConnected(networkName: NetworkNames): Promise { diff --git a/packages/hw-wallets/src/ledger/substrate/index.ts b/packages/hw-wallets/src/ledger/substrate/index.ts index e320c2579..a1de03512 100644 --- a/packages/hw-wallets/src/ledger/substrate/index.ts +++ b/packages/hw-wallets/src/ledger/substrate/index.ts @@ -1,5 +1,3 @@ -import type Transport from "@ledgerhq/hw-transport"; -import webUsbTransport from "@ledgerhq/hw-transport-webusb"; import { HWwalletCapabilities, NetworkNames } from "@enkryptcom/types"; import { ExtrinsicPayload } from "@polkadot/types/interfaces"; import { u8aToBuffer } from "@polkadot/util"; @@ -15,13 +13,14 @@ import { import { bip32ToAddressNList } from "./utils"; import { supportedPaths } from "./configs"; import ConnectToLedger from "../ledgerConnect"; +import LedgerInit from "../ledgerInitializer"; -class LedgerSubstrate implements HWWalletProvider { - transport: Transport | null; +class LedgerSubstrate extends LedgerInit implements HWWalletProvider { network: NetworkNames; constructor(network: NetworkNames) { + super(); this.transport = null; this.network = network; } @@ -36,20 +35,6 @@ class LedgerSubstrate implements HWWalletProvider { throw new Error("ledger-substrate: Invalid path"); } - async init(): Promise { - if (!this.transport) { - const support = await webUsbTransport.isSupported(); - if (support) { - this.transport = await webUsbTransport.create(); - } else { - return Promise.reject( - new Error("ledger-substrate: webusb is not supported"), - ); - } - } - return true; - } - async getAddress(options: getAddressRequest): Promise { this.validatePathAndNetwork(options); const app = LedgerApps[this.network]; @@ -80,7 +65,7 @@ class LedgerSubstrate implements HWWalletProvider { close(): Promise { // eslint-disable-next-line @typescript-eslint/no-empty-function - return this.transport.close().catch(() => {}); + return this.transport.close().catch(() => { }); } isConnected(networkName: NetworkNames): Promise { diff --git a/yarn.lock b/yarn.lock index 496189d34..77ef3ed02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1814,7 +1814,7 @@ __metadata: "@ethereumjs/rlp": "npm:^5.0.2" "@ethereumjs/tx": "npm:^5.4.0" "@ethereumjs/util": "npm:^9.1.0" - "@ledgerhq/hw-app-btc": "npm:^10.8.0" + "@ledgerhq/hw-app-btc": "npm:^10.11.2" "@ledgerhq/hw-app-eth": "npm:^6.45.19" "@ledgerhq/hw-app-solana": "npm:^7.5.4" "@ledgerhq/hw-transport": "npm:^6.31.11" @@ -5029,42 +5029,42 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/hw-app-btc@npm:^10.5.0": - version: 10.9.1 - resolution: "@ledgerhq/hw-app-btc@npm:10.9.1" +"@ledgerhq/hw-app-btc@npm:^10.11.2": + version: 10.11.2 + resolution: "@ledgerhq/hw-app-btc@npm:10.11.2" dependencies: - "@ledgerhq/hw-transport": "npm:^6.31.5" - "@ledgerhq/logs": "npm:^6.12.0" + "@ledgerhq/hw-transport": "npm:^6.31.12" + "@ledgerhq/logs": "npm:^6.13.0" + "@noble/curves": "npm:1.9.7" + "@noble/hashes": "npm:1.8.0" bip32-path: "npm:^0.4.2" bitcoinjs-lib: "npm:^5.2.0" bs58: "npm:^4.0.1" bs58check: "npm:^2.1.2" invariant: "npm:^2.2.4" - ripemd160: "npm:2" semver: "npm:^7.3.5" - sha.js: "npm:2" - tiny-secp256k1: "npm:1.1.6" varuint-bitcoin: "npm:1.1.2" - checksum: 10/33c3af0381bfae597c0e6051fe28be931840d4167e0434cb1e698452ab6409704f288bd7de2363d75edec3e97252cbbeedc8de83f07988c493ce9c60b9636250 + checksum: 10/912409878ce92789198800bed2c292a5d917be971f4cfb26d77b652405c4b1f6971ed365df0d54036f3cb3901be8f89feff1e8f48df555684bede514ab7b4d8f languageName: node linkType: hard -"@ledgerhq/hw-app-btc@npm:^10.8.0": - version: 10.11.2 - resolution: "@ledgerhq/hw-app-btc@npm:10.11.2" +"@ledgerhq/hw-app-btc@npm:^10.5.0": + version: 10.9.1 + resolution: "@ledgerhq/hw-app-btc@npm:10.9.1" dependencies: - "@ledgerhq/hw-transport": "npm:^6.31.12" - "@ledgerhq/logs": "npm:^6.13.0" - "@noble/curves": "npm:1.9.7" - "@noble/hashes": "npm:1.8.0" + "@ledgerhq/hw-transport": "npm:^6.31.5" + "@ledgerhq/logs": "npm:^6.12.0" bip32-path: "npm:^0.4.2" bitcoinjs-lib: "npm:^5.2.0" bs58: "npm:^4.0.1" bs58check: "npm:^2.1.2" invariant: "npm:^2.2.4" + ripemd160: "npm:2" semver: "npm:^7.3.5" + sha.js: "npm:2" + tiny-secp256k1: "npm:1.1.6" varuint-bitcoin: "npm:1.1.2" - checksum: 10/912409878ce92789198800bed2c292a5d917be971f4cfb26d77b652405c4b1f6971ed365df0d54036f3cb3901be8f89feff1e8f48df555684bede514ab7b4d8f + checksum: 10/33c3af0381bfae597c0e6051fe28be931840d4167e0434cb1e698452ab6409704f288bd7de2363d75edec3e97252cbbeedc8de83f07988c493ce9c60b9636250 languageName: node linkType: hard From 78320926d7860e95e88019211e68ebcde3022a8a Mon Sep 17 00:00:00 2001 From: Gamaliel Padillo Date: Thu, 30 Oct 2025 20:07:01 -0700 Subject: [PATCH 13/13] devop: fake address --- .../extension/src/libs/keyring/public-keyring.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index e5cbb58b6..612db5b46 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -83,6 +83,20 @@ class PublicKeyRing { isHardware: false, isTestWallet: true, }; + allKeys[ + 'bc1qwgpekhhfekclmp58kyzmlsdzey948d4395nvs8' + ] = { + address: + 'bc1qwgpekhhfekclmp58kyzmlsdzey948d4395nvs8', + basePath: "m/49'/2'/0'/1", + name: 'fake btc account #1', + pathIndex: 0, + publicKey: '0x0', + signerType: SignerType.secp256k1btc, + walletType: WalletType.mnemonic, + isHardware: false, + isTestWallet: true, + }; allKeys['77hREDDaAiimedtD9bR1JDMgYLW3AA5yPvD91pvrueRp'] = { address: '77hREDDaAiimedtD9bR1JDMgYLW3AA5yPvD91pvrueRp', basePath: "m/44'/501'/0'/1",