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", diff --git a/packages/hw-wallets/README.md b/packages/hw-wallets/README.md index 01c785442..2772dba51 100644 --- a/packages/hw-wallets/README.md +++ b/packages/hw-wallets/README.md @@ -1,3 +1,84 @@ # @enkryptcom/hw-wallets +## v0.0.12 + ## 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` + +Returns an RPC sign you can then add to a transaction object. + +#### `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 + +### 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. + +### Notes + +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 + +`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). diff --git a/packages/hw-wallets/package.json b/packages/hw-wallets/package.json index 316b70a1b..f880a5fe9 100644 --- a/packages/hw-wallets/package.json +++ b/packages/hw-wallets/package.json @@ -1,10 +1,17 @@ { "name": "@enkryptcom/hw-wallets", - "version": "0.0.13", + "version": "0.0.14", "description": "Hardware wallet manager for enkrypt", "type": "module", "main": "src/index.ts", "module": "src/index.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, "publishConfig": { "main": "dist/index.cjs", "module": "dist/index.js", @@ -19,7 +26,7 @@ "test": "vitest run" }, "engines": { - "node": ">=14.15.0" + "node": ">=20" }, "devDependencies": { "@types/node": "^24.10.1", @@ -56,6 +63,7 @@ "@ledgerhq/hw-app-eth": "^6.47.0", "@ledgerhq/hw-app-solana": "^7.6.0", "@ledgerhq/hw-transport": "^6.31.13", + "@ledgerhq/hw-transport-web-ble": "^6.29.13", "@ledgerhq/hw-transport-webusb": "^6.29.13", "@ledgerhq/live-common": "^34.20.0", "@metamask/eth-sig-util": "^8.2.0", diff --git a/packages/hw-wallets/src/configs.ts b/packages/hw-wallets/src/configs.ts index e875ba868..ce2f343be 100644 --- a/packages/hw-wallets/src/configs.ts +++ b/packages/hw-wallets/src/configs.ts @@ -19,6 +19,7 @@ const ledgerAppNames = { [NetworkNames.Karura]: "Karura", [NetworkNames.Edgeware]: "Edgeware", [NetworkNames.Bitcoin]: "Bitcoin", + [NetworkNames.BitcoinTest]: "Bitcoin Test", [NetworkNames.Litecoin]: "Litecoin", [NetworkNames.Dogecoin]: "Dogecoin", [NetworkNames.Solana]: "Solana", @@ -61,6 +62,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", @@ -81,6 +87,11 @@ const bip44Paths = { basePath: "m/84'/0'", label: "Bitcoin", }, + bitcoinTestSegwitLedger: { + path: "m/84'/1'/{index}'/0/0", + basePath: "m/84'/1'", + label: "Bitcoin Test", + }, litecoinSegwitLedger: { path: "m/84'/2'/{index}'/0/0", basePath: "m/84'/2'", @@ -106,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", @@ -116,5 +132,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 95af11a82..7cb7ec336 100644 --- a/packages/hw-wallets/src/index.ts +++ b/packages/hw-wallets/src/index.ts @@ -37,7 +37,7 @@ class HWwalletManager { LedgerEthereum, LedgerSubstrate, LedgerBitcoin, - LedgerSolana, + LedgerSolana ], [HWwalletType.trezor]: [TrezorEthereum, TrezorBitcoin, TrezorSolana], }; @@ -122,3 +122,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/bitcoin/configs.ts b/packages/hw-wallets/src/ledger/bitcoin/configs.ts index 015b0e323..ed8c0b9c2 100644 --- a/packages/hw-wallets/src/ledger/bitcoin/configs.ts +++ b/packages/hw-wallets/src/ledger/bitcoin/configs.ts @@ -3,6 +3,7 @@ import { bip44Paths } from "../../configs"; const supportedPaths = { [NetworkNames.Bitcoin]: [bip44Paths.bitcoinSegwitLedger], + [NetworkNames.BitcoinTest]: [bip44Paths.bitcoinTestSegwitLedger], [NetworkNames.Litecoin]: [bip44Paths.litecoinSegwitLedger], [NetworkNames.Dogecoin]: [bip44Paths.dogecoinLedger], }; diff --git a/packages/hw-wallets/src/ledger/bitcoin/index.ts b/packages/hw-wallets/src/ledger/bitcoin/index.ts index 3109a9604..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,32 +34,15 @@ class LedgerBitcoin implements HWWalletProvider { isSegwit: boolean; constructor(network: NetworkNames) { - this.transport = null; + super() this.network = network; this.HDNodes = {}; this.isSegwit = !!( this.network === NetworkNames.Bitcoin || - this.network === NetworkNames.Litecoin + this.network === NetworkNames.Litecoin || this.network === NetworkNames.BitcoinTest ); } - 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")); @@ -181,16 +162,18 @@ class LedgerBitcoin implements HWWalletProvider { }; }); const txArg: CreateTransactionArg = { - inputs: transactionOptions.rawTxs.map((rTx, idx) => [ - connection.splitTransaction(rTx.replace("0x", ""), true), - transactionOptions.psbtTx.txInputs[idx].index, - transactionOptions.psbtTx.data.inputs[idx].witnessScript - ? transactionOptions.psbtTx.data.inputs[idx].witnessScript.toString( + inputs: transactionOptions.rawTxs.map((rTx, idx) => { + return [ + connection.splitTransaction(rTx.replace("0x", ""), true), + transactionOptions.psbtTx.txInputs[idx].index, + transactionOptions.psbtTx.data.inputs[idx].witnessScript + ? transactionOptions.psbtTx.data.inputs[idx].witnessScript.toString( "hex", ) - : undefined, - undefined, - ]), + : undefined, + undefined, + ] + }), associatedKeysets: transactionOptions.rawTxs.map(() => options.pathType.path.replace(`{index}`, options.pathIndex), ), @@ -218,7 +201,7 @@ class LedgerBitcoin 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/ethereum/index.ts b/packages/hw-wallets/src/ledger/ethereum/index.ts index a9cf39523..51e309eaf 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 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"; @@ -20,37 +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) { - 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")); @@ -170,7 +154,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/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/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, 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 376bf44b4..1d8c9800e 100644 --- a/packages/hw-wallets/src/trezor/ethereum/index.ts +++ b/packages/hw-wallets/src/trezor/ethereum/index.ts @@ -14,17 +14,21 @@ import { SignTransactionRequest, SignTypedMessageRequest, } 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 { @@ -33,7 +37,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]) { @@ -61,7 +65,7 @@ class TrezorEthereum implements HWWalletProvider { } getSupportedPaths(): PathType[] { - return supportedPaths[this.network]; + return networkBasedSupportedPaths[this.network]; } close(): Promise { @@ -151,7 +155,7 @@ class TrezorEthereum implements HWWalletProvider { } static getSupportedNetworks(): NetworkNames[] { - return Object.keys(supportedPaths) as NetworkNames[]; + return Object.keys(networkBasedSupportedPaths) as NetworkNames[]; } static getCapabilities(): string[] { 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; } }; diff --git a/yarn.lock b/yarn.lock index a250be4c5..1b213201e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -452,6 +452,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/parser@npm:7.28.0" + dependencies: + "@babel/types": "npm:^7.28.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10/2c14a0d2600bae9ab81924df0a85bbd34e427caa099c260743f7c6c12b2042e743e776043a0d1a2573229ae648f7e66a80cfb26fc27e2a9eb59b55932d44c817 + languageName: node + linkType: hard + "@babel/parser@npm:^7.28.5": version: 7.28.5 resolution: "@babel/parser@npm:7.28.5" @@ -518,6 +529,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.28.0": + version: 7.28.1 + resolution: "@babel/types@npm:7.28.1" + dependencies: + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + checksum: 10/b35b0c030326e45efd4ebd87f30a7e5463f0c78617661ff12e8deb3fe983c53c48696374434ffd3664681cbc5b1495ebc69043753b232193e8dc02d1ae7d0ff5 + languageName: node + linkType: hard + "@babel/types@npm:^7.28.5": version: 7.28.5 resolution: "@babel/types@npm:7.28.5" @@ -1785,6 +1806,7 @@ __metadata: "@ledgerhq/hw-app-eth": "npm:^6.47.0" "@ledgerhq/hw-app-solana": "npm:^7.6.0" "@ledgerhq/hw-transport": "npm:^6.31.13" + "@ledgerhq/hw-transport-web-ble": "npm:^6.29.13" "@ledgerhq/hw-transport-webusb": "npm:^6.29.13" "@ledgerhq/live-common": "npm:^34.20.0" "@metamask/eth-sig-util": "npm:^8.2.0" @@ -5539,6 +5561,19 @@ __metadata: languageName: node linkType: hard +"@ledgerhq/hw-transport-web-ble@npm:^6.29.13": + version: 6.29.13 + resolution: "@ledgerhq/hw-transport-web-ble@npm:6.29.13" + dependencies: + "@ledgerhq/devices": "npm:8.7.0" + "@ledgerhq/errors": "npm:^6.27.0" + "@ledgerhq/hw-transport": "npm:6.31.13" + "@ledgerhq/logs": "npm:^6.13.0" + rxjs: "npm:^7.8.1" + checksum: 10/12dad74d2024564aee48c25671b22002ddb643622a419feeb583a0741f204e8debb155e0fc580f231f98bbea674f632ac94138fc28290318cfd6c6d50a31bb58 + languageName: node + linkType: hard + "@ledgerhq/hw-transport-webusb@npm:^6.29.13": version: 6.29.13 resolution: "@ledgerhq/hw-transport-webusb@npm:6.29.13" @@ -12715,6 +12750,19 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-core@npm:3.5.18": + version: 3.5.18 + resolution: "@vue/compiler-core@npm:3.5.18" + dependencies: + "@babel/parser": "npm:^7.28.0" + "@vue/shared": "npm:3.5.18" + entities: "npm:^4.5.0" + estree-walker: "npm:^2.0.2" + source-map-js: "npm:^1.2.1" + checksum: 10/b94dd25722b8cf4cf4adc89b3a49bb61f2eaea8f09a6e7076dc7d9178614560e0655dbe020ed7c9659d04147a60f6a50c38633f3e0742131918badb5d188f01e + languageName: node + linkType: hard + "@vue/compiler-core@npm:3.5.22": version: 3.5.22 resolution: "@vue/compiler-core@npm:3.5.22" @@ -12741,7 +12789,7 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-dom@npm:3.5.22, @vue/compiler-dom@npm:^3.5.0": +"@vue/compiler-dom@npm:3.5.22": version: 3.5.22 resolution: "@vue/compiler-dom@npm:3.5.22" dependencies: @@ -12761,6 +12809,16 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-dom@npm:^3.5.0": + version: 3.5.18 + resolution: "@vue/compiler-dom@npm:3.5.18" + dependencies: + "@vue/compiler-core": "npm:3.5.18" + "@vue/shared": "npm:3.5.18" + checksum: 10/5156bf632ffb6cd952323eede896852b4223f2263980d7a4a6cb740e94c6b621d4a0944f163f0f7aee48ab03d0264995c83ecbc53151f1c654261f54188bc68a + languageName: node + linkType: hard + "@vue/compiler-sfc@npm:3.5.22": version: 3.5.22 resolution: "@vue/compiler-sfc@npm:3.5.22" @@ -13013,6 +13071,13 @@ __metadata: languageName: node linkType: hard +"@vue/shared@npm:3.5.18": + version: 3.5.18 + resolution: "@vue/shared@npm:3.5.18" + checksum: 10/62b83867ff3c3a9dfe775068aea692c29011ba82b9b702f24ad21d977bb5440bd82d8245fd7ad767753b5224428dba1ef6466fd71f645b2d9bd3b409c61de31a + languageName: node + linkType: hard + "@vue/shared@npm:3.5.22, @vue/shared@npm:^3.5.0": version: 3.5.22 resolution: "@vue/shared@npm:3.5.22"