otx-btc-wallet-connectors 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +554 -0
- package/dist/base-IAFq7sd8.d.mts +53 -0
- package/dist/base-IAFq7sd8.d.ts +53 -0
- package/dist/binance/index.d.mts +81 -0
- package/dist/binance/index.d.ts +81 -0
- package/dist/binance/index.js +13 -0
- package/dist/binance/index.js.map +1 -0
- package/dist/binance/index.mjs +4 -0
- package/dist/binance/index.mjs.map +1 -0
- package/dist/bitget/index.d.mts +84 -0
- package/dist/bitget/index.d.ts +84 -0
- package/dist/bitget/index.js +13 -0
- package/dist/bitget/index.js.map +1 -0
- package/dist/bitget/index.mjs +4 -0
- package/dist/bitget/index.mjs.map +1 -0
- package/dist/chunk-5Z5Q2Y75.mjs +91 -0
- package/dist/chunk-5Z5Q2Y75.mjs.map +1 -0
- package/dist/chunk-7KK2LZLZ.mjs +208 -0
- package/dist/chunk-7KK2LZLZ.mjs.map +1 -0
- package/dist/chunk-AW2JZIHR.mjs +753 -0
- package/dist/chunk-AW2JZIHR.mjs.map +1 -0
- package/dist/chunk-EIJOSZXZ.js +331 -0
- package/dist/chunk-EIJOSZXZ.js.map +1 -0
- package/dist/chunk-EQHR7P7G.js +541 -0
- package/dist/chunk-EQHR7P7G.js.map +1 -0
- package/dist/chunk-EWRXLZO4.mjs +539 -0
- package/dist/chunk-EWRXLZO4.mjs.map +1 -0
- package/dist/chunk-FISNQZZ7.js +802 -0
- package/dist/chunk-FISNQZZ7.js.map +1 -0
- package/dist/chunk-HL4WDMGS.js +200 -0
- package/dist/chunk-HL4WDMGS.js.map +1 -0
- package/dist/chunk-IPYWR76I.js +314 -0
- package/dist/chunk-IPYWR76I.js.map +1 -0
- package/dist/chunk-JYYNWR5G.js +142 -0
- package/dist/chunk-JYYNWR5G.js.map +1 -0
- package/dist/chunk-LNKTYZJM.js +701 -0
- package/dist/chunk-LNKTYZJM.js.map +1 -0
- package/dist/chunk-LVZMONQL.mjs +699 -0
- package/dist/chunk-LVZMONQL.mjs.map +1 -0
- package/dist/chunk-MFXLQWOE.js +93 -0
- package/dist/chunk-MFXLQWOE.js.map +1 -0
- package/dist/chunk-NBIA4TTE.mjs +204 -0
- package/dist/chunk-NBIA4TTE.mjs.map +1 -0
- package/dist/chunk-O4DD2XJ2.js +206 -0
- package/dist/chunk-O4DD2XJ2.js.map +1 -0
- package/dist/chunk-P7HVBU2B.mjs +140 -0
- package/dist/chunk-P7HVBU2B.mjs.map +1 -0
- package/dist/chunk-Q7QVQYEB.js +210 -0
- package/dist/chunk-Q7QVQYEB.js.map +1 -0
- package/dist/chunk-RLZEG6KL.mjs +329 -0
- package/dist/chunk-RLZEG6KL.mjs.map +1 -0
- package/dist/chunk-SYLDBJ75.mjs +246 -0
- package/dist/chunk-SYLDBJ75.mjs.map +1 -0
- package/dist/chunk-TTEUU3CI.mjs +198 -0
- package/dist/chunk-TTEUU3CI.mjs.map +1 -0
- package/dist/chunk-V66BXDTR.mjs +292 -0
- package/dist/chunk-V66BXDTR.mjs.map +1 -0
- package/dist/chunk-X77ZT4OI.js +268 -0
- package/dist/chunk-X77ZT4OI.js.map +1 -0
- package/dist/imtoken/index.d.mts +116 -0
- package/dist/imtoken/index.d.ts +116 -0
- package/dist/imtoken/index.js +14 -0
- package/dist/imtoken/index.js.map +1 -0
- package/dist/imtoken/index.mjs +5 -0
- package/dist/imtoken/index.mjs.map +1 -0
- package/dist/index.d.mts +14 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +170 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +13 -0
- package/dist/index.mjs.map +1 -0
- package/dist/ledger/index.d.mts +290 -0
- package/dist/ledger/index.d.ts +290 -0
- package/dist/ledger/index.js +14 -0
- package/dist/ledger/index.js.map +1 -0
- package/dist/ledger/index.mjs +5 -0
- package/dist/ledger/index.mjs.map +1 -0
- package/dist/okx/index.d.mts +88 -0
- package/dist/okx/index.d.ts +88 -0
- package/dist/okx/index.js +13 -0
- package/dist/okx/index.js.map +1 -0
- package/dist/okx/index.mjs +4 -0
- package/dist/okx/index.mjs.map +1 -0
- package/dist/phantom/index.d.mts +96 -0
- package/dist/phantom/index.d.ts +96 -0
- package/dist/phantom/index.js +14 -0
- package/dist/phantom/index.js.map +1 -0
- package/dist/phantom/index.mjs +5 -0
- package/dist/phantom/index.mjs.map +1 -0
- package/dist/psbt-builder-CFOs69Z5.d.mts +131 -0
- package/dist/psbt-builder-CFOs69Z5.d.ts +131 -0
- package/dist/trezor/index.d.mts +155 -0
- package/dist/trezor/index.d.ts +155 -0
- package/dist/trezor/index.js +14 -0
- package/dist/trezor/index.js.map +1 -0
- package/dist/trezor/index.mjs +5 -0
- package/dist/trezor/index.mjs.map +1 -0
- package/dist/unisat/index.d.mts +75 -0
- package/dist/unisat/index.d.ts +75 -0
- package/dist/unisat/index.js +13 -0
- package/dist/unisat/index.js.map +1 -0
- package/dist/unisat/index.mjs +4 -0
- package/dist/unisat/index.mjs.map +1 -0
- package/dist/utils/index.d.mts +398 -0
- package/dist/utils/index.d.ts +398 -0
- package/dist/utils/index.js +120 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +3 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/xverse/index.d.mts +79 -0
- package/dist/xverse/index.d.ts +79 -0
- package/dist/xverse/index.js +13 -0
- package/dist/xverse/index.js.map +1 -0
- package/dist/xverse/index.mjs +4 -0
- package/dist/xverse/index.mjs.map +1 -0
- package/package.json +108 -0
- package/src/base.ts +132 -0
- package/src/binance/BinanceConnector.ts +307 -0
- package/src/binance/index.ts +1 -0
- package/src/bitget/BitgetConnector.ts +301 -0
- package/src/bitget/index.ts +1 -0
- package/src/imtoken/ImTokenConnector.ts +420 -0
- package/src/imtoken/index.ts +2 -0
- package/src/index.ts +78 -0
- package/src/ledger/LedgerConnector.ts +1019 -0
- package/src/ledger/index.ts +8 -0
- package/src/okx/OKXConnector.ts +230 -0
- package/src/okx/index.ts +1 -0
- package/src/phantom/PhantomConnector.ts +381 -0
- package/src/phantom/index.ts +2 -0
- package/src/trezor/TrezorConnector.ts +824 -0
- package/src/trezor/index.ts +6 -0
- package/src/unisat/UnisatConnector.ts +312 -0
- package/src/unisat/index.ts +1 -0
- package/src/utils/blockstream.ts +230 -0
- package/src/utils/btc-service.ts +364 -0
- package/src/utils/index.ts +56 -0
- package/src/utils/mempool.ts +232 -0
- package/src/utils/psbt-builder.ts +492 -0
- package/src/utils/types.ts +183 -0
- package/src/xverse/XverseConnector.ts +479 -0
- package/src/xverse/index.ts +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ledger/LedgerConnector.ts"],"names":["estimatedVBytes","estimatedFee"],"mappings":"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","sourcesContent":["import type {\n WalletAccount,\n BitcoinNetwork,\n SignPsbtOptions,\n AddressType,\n} from 'otx-btc-wallet-core';\nimport { BaseConnector } from '../base';\nimport {\n BtcService,\n getAddressType,\n getDustThreshold,\n getInputVBytes,\n getOutputVBytes,\n} from '../utils';\n\n// Ledger wallet icon\nconst LEDGER_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF83MDM1XzUxMTApIj4KPHJlY3Qgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHJ4PSIzMiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTE0Mi4yMzkgMzcuNUg4NS4wOTY0VjExNC41ODJIMTYyLjIzOVY1Ny40MzkzQzE2Mi4yMzggNTQuODE2IDE2MS43MiA1Mi4yMTg2IDE2MC43MTQgNDkuNzk1OUMxNTkuNzA4IDQ3LjM3MzIgMTU4LjIzMyA0NS4xNzI4IDE1Ni4zNzYgNDMuMzIwN0MxNTQuNTE4IDQxLjQ2ODUgMTUyLjMxMyA0MC4wMDExIDE0OS44ODcgMzkuMDAyM0MxNDcuNDYyIDM4LjAwMzUgMTQ0Ljg2MyAzNy40OTMgMTQyLjIzOSAzNy41WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTY3LjI5MjkgMzcuNUg1Ny40NDY0QzUyLjE1NjMgMzcuNSA0Ny4wODI5IDM5LjYwMTUgNDMuMzQyMiA0My4zNDIyQzM5LjYwMTUgNDcuMDgyOSAzNy41IDUyLjE1NjMgMzcuNSA1Ny40NDY0TDM3LjUgNjcuMjkyOUg2Ny4yOTI5VjM3LjVaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMzcuNSA4NS4xMDM2SDY3LjI5MjlWMTE0Ljg5NkgzNy41Vjg1LjEwMzZaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTMyLjcwNyAxNjIuMjQ2SDE0Mi41NTNDMTQ1LjE3NyAxNjIuMjQ2IDE0Ny43NzYgMTYxLjcyOSAxNTAuMTk5IDE2MC43MjNDMTUyLjYyMyAxNTkuNzE3IDE1NC44MjQgMTU4LjI0MyAxNTYuNjc3IDE1Ni4zODVDMTU4LjUzIDE1NC41MjcgMTU5Ljk5OCAxNTIuMzIyIDE2MC45OTcgMTQ5Ljg5NkMxNjEuOTk2IDE0Ny40NyAxNjIuNTA3IDE0NC44NyAxNjIuNSAxNDIuMjQ2VjEzMi43MDdIMTMyLjcwN1YxNjIuMjQ2WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTg1LjEwMzUgMTMyLjcwN0gxMTQuODk2VjE2Mi41SDg1LjEwMzVWMTMyLjcwN1oiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGQ9Ik0zNy41IDEzMi43MDdWMTQyLjU1NEMzNy41IDE0NS4xNzMgMzguMDE1OSAxNDcuNzY3IDM5LjAxODMgMTUwLjE4N0M0MC4wMjA3IDE1Mi42MDcgNDEuNDkgMTU0LjgwNiA0My4zNDIyIDE1Ni42NThDNDUuMTk0NCAxNTguNTEgNDcuMzkzMiAxNTkuOTc5IDQ5LjgxMzMgMTYwLjk4MkM1Mi4yMzMzIDE2MS45ODQgNTQuODI3IDE2Mi41IDU3LjQ0NjQgMTYyLjVINjcuMjkyOVYxMzIuNzA3SDM3LjVaIiBmaWxsPSJibGFjayIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzcwMzVfNTExMCI+CjxyZWN0IHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=';\n\n/**\n * Ledger address type configuration\n */\nexport type LedgerAddressType = 'legacy' | 'nested-segwit' | 'segwit' | 'taproot';\n\n/**\n * Ledger connector options\n */\nexport interface LedgerConnectorOptions {\n /** Address type for derivation (default: 'segwit') */\n addressType?: LedgerAddressType;\n /** Account index (default: 0) */\n accountIndex?: number;\n /** Address index (default: 0) */\n addressIndex?: number;\n}\n\n/**\n * Address type to BIP path mapping\n */\nconst ADDRESS_TYPE_TO_PATH: Record<LedgerAddressType, number> = {\n 'legacy': 44,\n 'nested-segwit': 49,\n 'segwit': 84,\n 'taproot': 86,\n};\n\n/**\n * Address type to Ledger format mapping\n */\nconst ADDRESS_TYPE_TO_FORMAT: Record<LedgerAddressType, 'legacy' | 'p2sh' | 'bech32' | 'bech32m'> = {\n 'legacy': 'legacy',\n 'nested-segwit': 'p2sh',\n 'segwit': 'bech32',\n 'taproot': 'bech32m',\n};\n\n// Define minimal types for Ledger libraries to avoid type issues\ninterface LedgerTransport {\n close(): Promise<void>;\n on(event: 'disconnect', callback: () => void): void;\n send(cla: number, ins: number, p1: number, p2: number, data?: Buffer): Promise<Buffer>;\n}\n\ninterface LedgerBtcApp {\n getWalletPublicKey(\n path: string,\n opts?: { verify?: boolean; format?: 'legacy' | 'p2sh' | 'bech32' | 'bech32m' }\n ): Promise<{ publicKey: string; bitcoinAddress: string; chainCode: string }>;\n getWalletXpub(arg: { path: string; xpubVersion: number }): Promise<string>;\n signMessage(path: string, messageHex: string): Promise<{ v: number; r: string; s: string }>;\n splitTransaction(\n transactionHex: string,\n isSegwitSupported?: boolean | null,\n hasExtraData?: boolean,\n additionals?: string[]\n ): LedgerTransaction;\n createPaymentTransaction(arg: {\n inputs: Array<[LedgerTransaction, number, string | null | undefined, number?]>;\n associatedKeysets: string[];\n changePath?: string;\n outputScriptHex: string;\n lockTime?: number;\n sigHashType?: number;\n segwit?: boolean;\n additionals?: string[];\n expiryHeight?: Buffer;\n useTrustedInputForSegwit?: boolean;\n }): Promise<string>;\n serializeTransactionOutputs(tx: LedgerTransaction): Buffer;\n}\n\n/**\n * Ledger Transaction type (returned by splitTransaction)\n */\ninterface LedgerTransaction {\n version: Buffer;\n inputs: Array<{\n prevout: Buffer;\n script: Buffer;\n sequence: Buffer;\n }>;\n outputs?: Array<{\n amount: Buffer;\n script: Buffer;\n }>;\n locktime?: Buffer;\n witness?: Buffer;\n}\n\n/**\n * UTXO input for createPaymentTransaction\n */\nexport interface LedgerUtxoInput {\n /** Raw transaction hex that created this UTXO */\n txHex: string;\n /** Output index in the transaction */\n outputIndex: number;\n /** BIP32 derivation path for signing (e.g., \"84'/0'/0'/0/0\") */\n derivationPath: string;\n /** Optional redeem script for P2SH inputs */\n redeemScript?: string;\n /** Optional sequence number (default: 0xffffffff) */\n sequence?: number;\n}\n\n/**\n * Output for createPaymentTransaction\n */\nexport interface LedgerTxOutput {\n /** Recipient address */\n address: string;\n /** Amount in satoshis */\n satoshis: number;\n}\n\n/**\n * Options for sendBitcoin method\n */\nexport interface SendBitcoinOptions {\n /** Fee rate in sat/vB (optional, defaults to \"hour\" priority) */\n feeRate?: number;\n}\n\n/**\n * Ledger Hardware Wallet Connector\n *\n * @see https://developers.ledger.com/docs/transport/overview\n * @see https://github.com/LedgerHQ/ledger-live/tree/develop/libs/ledgerjs/packages/hw-app-btc\n */\nexport class LedgerConnector extends BaseConnector {\n readonly id = 'ledger';\n readonly name = 'Ledger';\n readonly icon = LEDGER_ICON;\n\n private _transport: LedgerTransport | null = null;\n private _btcApp: LedgerBtcApp | null = null;\n private _account: WalletAccount | null = null;\n private _network: BitcoinNetwork = 'mainnet';\n private _options: Required<LedgerConnectorOptions>;\n private _derivationPath: string = '';\n\n // Connection timeout in milliseconds\n private static readonly CONNECTION_TIMEOUT = 30000;\n\n constructor(options: LedgerConnectorOptions = {}) {\n super();\n this._options = {\n addressType: options.addressType ?? 'segwit',\n accountIndex: options.accountIndex ?? 0,\n addressIndex: options.addressIndex ?? 0,\n };\n }\n\n /**\n * Override checkReady - Ledger is always \"ready\" since it doesn't require browser extension\n * The actual device connection happens when connect() is called\n */\n protected checkReady(): void {\n this.ready = true;\n }\n\n /**\n * Get the provider - for Ledger this is the Bitcoin app instance\n */\n protected getProvider(): LedgerBtcApp | null {\n return this._btcApp;\n }\n\n /**\n * Get current address type\n */\n getAddressType(): LedgerAddressType {\n return this._options.addressType;\n }\n\n /**\n * Set address type options before connecting\n * Call this before connect() to change the address derivation path\n */\n setOptions(options: LedgerConnectorOptions): void {\n this._options = {\n addressType: options.addressType ?? this._options.addressType,\n accountIndex: options.accountIndex ?? this._options.accountIndex,\n addressIndex: options.addressIndex ?? this._options.addressIndex,\n };\n }\n\n /**\n * Get available address types for UI selection\n */\n static getAvailableAddressTypes(): Array<{ type: LedgerAddressType; label: string; description: string }> {\n return [\n { type: 'legacy', label: 'Legacy (P2PKH)', description: \"Starts with '1' or 'm/n'\" },\n { type: 'nested-segwit', label: 'Nested SegWit (P2SH-P2WPKH)', description: \"Starts with '3' or '2'\" },\n { type: 'segwit', label: 'Native SegWit (P2WPKH)', description: \"Starts with 'bc1q' or 'tb1q'\" },\n { type: 'taproot', label: 'Taproot (P2TR)', description: \"Starts with 'bc1p' or 'tb1p'\" },\n ];\n }\n\n /**\n * Check if WebUSB is supported in the current browser\n */\n async isSupported(): Promise<boolean> {\n if (typeof window === 'undefined') return false;\n try {\n const TransportWebUSB = (await import('@ledgerhq/hw-transport-webusb')).default;\n return await TransportWebUSB.isSupported();\n } catch {\n return false;\n }\n }\n\n /**\n * Initialize transport with timeout\n * Uses request() instead of create() to always show device selection popup\n */\n private async initTransport(): Promise<LedgerTransport> {\n console.log('[LedgerConnector] initTransport() called');\n\n // Close existing transport if any\n await this.closeTransport();\n\n // Import WebUSB transport\n console.log('[LedgerConnector] Importing TransportWebUSB...');\n const TransportWebUSB = (await import('@ledgerhq/hw-transport-webusb')).default;\n console.log('[LedgerConnector] TransportWebUSB imported');\n\n // Use request() to always show device selection popup\n // create() would auto-connect to previously paired device without showing popup\n console.log('[LedgerConnector] Requesting device selection...');\n const transportPromise = TransportWebUSB.request();\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error('Connection timeout. Please make sure your Ledger is connected and unlocked.'));\n }, LedgerConnector.CONNECTION_TIMEOUT);\n });\n\n const transport = await Promise.race([transportPromise, timeoutPromise]);\n console.log('[LedgerConnector] Transport created successfully');\n return transport as unknown as LedgerTransport;\n }\n\n /**\n * Get BTC app instance, initializing if needed\n */\n private async getBtcAppInstance(): Promise<LedgerBtcApp> {\n console.log('[LedgerConnector] getBtcAppInstance() called');\n\n if (this._btcApp) {\n console.log('[LedgerConnector] Returning existing BTC app instance');\n return this._btcApp;\n }\n\n const transport = await this.initTransport();\n this._transport = transport;\n\n // Check if Bitcoin app is open by sending a test command\n console.log('[LedgerConnector] Checking if Bitcoin app is open...');\n try {\n // CLA=0xB0 INS=0x01 is get app version - works as a ping\n await transport.send(0xb0, 0x01, 0x00, 0x00);\n console.log('[LedgerConnector] Bitcoin app is open');\n } catch (error) {\n console.error('[LedgerConnector] Bitcoin app check failed:', error);\n await this.closeTransport();\n throw new Error('Please open the Bitcoin app on your Ledger device');\n }\n\n // Import and initialize BTC app\n console.log('[LedgerConnector] Importing AppBtc...');\n const AppBtc = (await import('@ledgerhq/hw-app-btc')).default;\n console.log('[LedgerConnector] AppBtc imported');\n\n const currency = this._network === 'mainnet' ? 'bitcoin' : 'bitcoin_testnet';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this._btcApp = new AppBtc({ transport: transport as any, currency }) as unknown as LedgerBtcApp;\n console.log('[LedgerConnector] BTC app instance created');\n\n return this._btcApp;\n }\n\n /**\n * Connect to Ledger device\n * IMPORTANT: This must be called within a user gesture (click event)\n */\n async connect(network: BitcoinNetwork = 'mainnet'): Promise<WalletAccount> {\n console.log('[LedgerConnector] connect() called with network:', network);\n\n try {\n // Check WebUSB support\n console.log('[LedgerConnector] Checking WebUSB support...');\n const supported = await this.isSupported();\n console.log('[LedgerConnector] WebUSB supported:', supported);\n\n if (!supported) {\n throw new Error('WebUSB is not supported in this browser. Please use Chrome or a Chromium-based browser.');\n }\n\n // Set network before initializing app\n this._network = network;\n\n // Initialize BTC app (this also creates transport)\n console.log('[LedgerConnector] Initializing BTC app...');\n const btcApp = await this.getBtcAppInstance();\n console.log('[LedgerConnector] BTC app initialized');\n\n // Build derivation path\n const coinType = network === 'mainnet' ? 0 : 1;\n const purpose = ADDRESS_TYPE_TO_PATH[this._options.addressType];\n this._derivationPath = `${purpose}'/${coinType}'/${this._options.accountIndex}'/0/${this._options.addressIndex}`;\n console.log('[LedgerConnector] Derivation path:', this._derivationPath);\n\n // Get address and public key from device\n const format = ADDRESS_TYPE_TO_FORMAT[this._options.addressType];\n console.log('[LedgerConnector] Getting wallet public key...');\n const result = await btcApp.getWalletPublicKey(this._derivationPath, {\n verify: false,\n format,\n });\n console.log('[LedgerConnector] Got wallet public key:', result.bitcoinAddress);\n\n this._account = {\n address: result.bitcoinAddress,\n publicKey: result.publicKey,\n type: this.mapLedgerAddressType(this._options.addressType),\n };\n\n // Setup disconnect listener\n this.setupDisconnectListener();\n\n console.log('[LedgerConnector] Connection successful!');\n return this._account;\n } catch (error) {\n console.error('[LedgerConnector] Connection error:', error);\n await this.closeTransport();\n this.handleLedgerError(error);\n }\n }\n\n /**\n * Get address with verification on device\n */\n async getAddressWithVerification(): Promise<WalletAccount> {\n if (!this._btcApp) {\n throw new Error('Not connected to Ledger device');\n }\n\n try {\n const format = ADDRESS_TYPE_TO_FORMAT[this._options.addressType];\n const result = await this._btcApp.getWalletPublicKey(this._derivationPath, {\n verify: true, // Show address on device for verification\n format,\n });\n\n return {\n address: result.bitcoinAddress,\n publicKey: result.publicKey,\n type: this.mapLedgerAddressType(this._options.addressType),\n };\n } catch (error) {\n this.handleLedgerError(error);\n }\n }\n\n private setupDisconnectListener(): void {\n if (!this._transport) return;\n\n this._transport.on('disconnect', () => {\n this._transport = null;\n this._btcApp = null;\n this._account = null;\n this.emitAccountsChanged([]);\n });\n }\n\n private async closeTransport(): Promise<void> {\n if (this._transport) {\n try {\n await this._transport.close();\n } catch {\n // Ignore close errors\n }\n this._transport = null;\n this._btcApp = null;\n }\n }\n\n async disconnect(): Promise<void> {\n await this.closeTransport();\n this._account = null;\n this.cleanup();\n }\n\n async getAccounts(): Promise<WalletAccount[]> {\n if (!this._account) {\n return [];\n }\n return [this._account];\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this._btcApp) {\n throw new Error('Not connected to Ledger device');\n }\n\n try {\n // Convert message to hex\n const messageHex = Buffer.from(message, 'utf8').toString('hex');\n\n // Sign message on device\n const result = await this._btcApp.signMessage(this._derivationPath, messageHex);\n\n // Construct signature (v || r || s) and encode as base64\n const v = result.v;\n const r = result.r;\n const s = result.s;\n\n // Format: 1 byte v + 32 bytes r + 32 bytes s\n const vHex = v.toString(16).padStart(2, '0');\n const signature = Buffer.from(vHex + r + s, 'hex');\n\n return signature.toString('base64');\n } catch (error) {\n this.handleLedgerError(error);\n }\n }\n\n /**\n * Sign a PSBT with Ledger\n *\n * Note: Ledger hardware wallets don't support direct PSBT signing through the standard API.\n * Use the createTransaction method or sendTransaction instead.\n */\n async signPsbt(_psbtHex: string, _options?: SignPsbtOptions): Promise<string> {\n void _psbtHex;\n void _options;\n\n throw new Error('SignPsbt is not supported for Ledger Wallet. Use createTransaction or sendTransaction instead.');\n }\n\n /**\n * Sign multiple PSBTs\n */\n async signPsbts(psbtHexs: string[], options?: SignPsbtOptions): Promise<string[]> {\n const results: string[] = [];\n for (const psbtHex of psbtHexs) {\n const signed = await this.signPsbt(psbtHex, options);\n results.push(signed);\n }\n return results;\n }\n\n /**\n * Send a Bitcoin transaction\n *\n * @param to - Recipient address\n * @param satoshis - Amount to send in satoshis\n * @param options - Send options (feeRate, etc.)\n * @returns Transaction ID after broadcast\n *\n * @example\n * ```typescript\n * const txid = await ledger.sendTransaction('bc1q...', 50000);\n * // With custom fee rate\n * const txid = await ledger.sendTransaction('bc1q...', 50000, { feeRate: 10 });\n * ```\n */\n async sendTransaction(to: string, satoshis: number, options?: SendBitcoinOptions): Promise<string> {\n if (!this._btcApp || !this._account) {\n throw new Error('Not connected to Ledger device');\n }\n\n const btcService = new BtcService(this._network);\n\n // 1. Get UTXOs with tx hex (Ledger requires raw tx hex for each UTXO)\n const utxos = await btcService.getUtxosWithTxHex(this._account.address);\n if (utxos.length === 0) {\n throw new Error('No UTXOs available for spending');\n }\n\n // 2. Get fee rate if not provided\n let feeRate = options?.feeRate;\n if (!feeRate) {\n const feeRates = await btcService.getFeeRates();\n feeRate = feeRates.hour;\n }\n\n // 3. Get address types using utility functions\n const fromAddressType = getAddressType(this._account.address);\n const toAddressType = getAddressType(to);\n\n // 4. Get vBytes estimates using utility functions\n const inputVBytes = getInputVBytes(fromAddressType);\n const outputVBytes = getOutputVBytes(toAddressType);\n const changeOutputVBytes = getOutputVBytes(fromAddressType);\n const baseVBytes = 10.5; // Base transaction overhead\n\n // 5. Select UTXOs using greedy algorithm (sorted by value descending)\n const sortedUtxos = [...utxos].sort((a, b) => b.value - a.value);\n const selectedUtxos: typeof utxos = [];\n let totalInputValue = 0;\n\n for (const utxo of sortedUtxos) {\n selectedUtxos.push(utxo);\n totalInputValue += utxo.value;\n\n // Calculate fee with 2 outputs (recipient + change)\n const estimatedVBytes = baseVBytes + selectedUtxos.length * inputVBytes + outputVBytes + changeOutputVBytes;\n const estimatedFee = Math.ceil(estimatedVBytes * feeRate);\n\n if (totalInputValue >= satoshis + estimatedFee) {\n break;\n }\n }\n\n // 6. Calculate final fee\n let estimatedVBytes = baseVBytes + selectedUtxos.length * inputVBytes + outputVBytes + changeOutputVBytes;\n let estimatedFee = Math.ceil(estimatedVBytes * feeRate);\n\n // Check if we have enough funds\n if (totalInputValue < satoshis + estimatedFee) {\n throw new Error(\n `Insufficient funds. Available: ${totalInputValue} sats, Required: ${satoshis + estimatedFee} sats (including fee)`\n );\n }\n\n // 7. Calculate change\n let changeAmount = totalInputValue - satoshis - estimatedFee;\n\n // 8. Build outputs\n const outputs: LedgerTxOutput[] = [{ address: to, satoshis }];\n\n // Add change output if above dust threshold\n const dustThreshold = getDustThreshold(fromAddressType);\n\n if (changeAmount > dustThreshold) {\n outputs.push({ address: this._account.address, satoshis: changeAmount });\n } else {\n // No change output - recalculate fee without change output\n estimatedVBytes = baseVBytes + selectedUtxos.length * inputVBytes + outputVBytes;\n estimatedFee = Math.ceil(estimatedVBytes * feeRate);\n changeAmount = 0;\n\n // Verify we still have enough\n if (totalInputValue < satoshis + estimatedFee) {\n throw new Error(\n `Insufficient funds after fee adjustment. Available: ${totalInputValue} sats, Required: ${satoshis + estimatedFee} sats`\n );\n }\n }\n\n // 9. Build inputs for createTransaction\n const inputs: LedgerUtxoInput[] = selectedUtxos.map((utxo) => ({\n txHex: utxo.txHex,\n outputIndex: utxo.vout,\n derivationPath: this._derivationPath,\n }));\n\n // 10. Create and sign transaction using Ledger's native API\n const signedTxHex = await this.createTransaction(inputs, outputs);\n\n // 11. Broadcast transaction\n const txid = await btcService.broadcastTransaction(signedTxHex);\n\n return txid;\n }\n\n /**\n * Create and sign a Bitcoin transaction using Ledger\n *\n * This method requires you to provide UTXOs (unspent transaction outputs) which\n * must be fetched from a blockchain API (e.g., Blockstream, Mempool.space, etc.)\n *\n * @param inputs - Array of UTXO inputs to spend\n * @param outputs - Array of outputs (recipients)\n * @param changePath - Optional BIP32 path for change output\n * @returns Signed transaction hex ready for broadcast\n *\n * @example\n * ```typescript\n * const signedTx = await ledger.createTransaction(\n * [{\n * txHex: '0100000001...', // Raw tx hex that created the UTXO\n * outputIndex: 0,\n * derivationPath: \"84'/0'/0'/0/0\",\n * }],\n * [{\n * address: 'bc1q...',\n * satoshis: 50000,\n * }],\n * \"84'/0'/0'/1/0\" // Change address path\n * );\n * ```\n */\n async createTransaction(\n inputs: LedgerUtxoInput[],\n outputs: LedgerTxOutput[],\n changePath?: string\n ): Promise<string> {\n if (!this._btcApp) {\n throw new Error('Not connected to Ledger device');\n }\n\n if (inputs.length === 0) {\n throw new Error('At least one input is required');\n }\n\n if (outputs.length === 0) {\n throw new Error('At least one output is required');\n }\n\n try {\n // Determine if we're using segwit based on address type\n const isSegwit = this._options.addressType !== 'legacy';\n const additionals = this.getAdditionals();\n\n // Parse input transactions\n const parsedInputs: Array<[LedgerTransaction, number, string | null | undefined, number?]> = [];\n const associatedKeysets: string[] = [];\n\n for (const input of inputs) {\n const tx = this._btcApp.splitTransaction(input.txHex, isSegwit, false, additionals);\n parsedInputs.push([\n tx,\n input.outputIndex,\n input.redeemScript ?? null,\n input.sequence ?? 0xffffffff,\n ]);\n associatedKeysets.push(input.derivationPath);\n }\n\n // Build output script\n const outputScriptHex = this.buildOutputScript(outputs);\n\n // Create and sign the transaction\n const txArgs: Parameters<LedgerBtcApp['createPaymentTransaction']>[0] = {\n inputs: parsedInputs,\n associatedKeysets,\n outputScriptHex,\n segwit: isSegwit,\n additionals,\n useTrustedInputForSegwit: isSegwit,\n };\n\n if (changePath) {\n txArgs.changePath = changePath;\n }\n\n const signedTx = await this._btcApp.createPaymentTransaction(txArgs);\n\n return signedTx;\n } catch (error) {\n this.handleLedgerError(error);\n }\n }\n\n /**\n * Build output script hex from outputs array\n * Format: varint(output_count) + [amount(8 bytes LE) + varint(script_len) + script]...\n */\n private buildOutputScript(outputs: LedgerTxOutput[]): string {\n let script = '';\n\n // Output count as varint\n script += this.encodeVarint(outputs.length);\n\n for (const output of outputs) {\n // Amount as 8-byte little-endian\n const amountHex = this.uint64ToLittleEndian(output.satoshis);\n script += amountHex;\n\n // Script pubkey\n const scriptPubKey = this.addressToScriptPubKey(output.address);\n script += this.encodeVarint(scriptPubKey.length / 2);\n script += scriptPubKey;\n }\n\n return script;\n }\n\n /**\n * Convert address to scriptPubKey hex\n */\n private addressToScriptPubKey(address: string): string {\n console.log('[LedgerConnector] addressToScriptPubKey called with:', address);\n\n // Detect address type and convert to scriptPubKey\n if (address.startsWith('bc1q') || address.startsWith('tb1q')) {\n // Native SegWit (P2WPKH) - bech32\n const decoded = this.decodeBech32(address);\n console.log('[LedgerConnector] P2WPKH decoded length:', decoded.length, 'hex:', decoded);\n // decoded is hex string, so 20 bytes = 40 hex chars\n if (decoded.length !== 40) {\n throw new Error(`Invalid P2WPKH address: expected 40 hex chars, got ${decoded.length}`);\n }\n // OP_0 <20-byte-hash>\n return '0014' + decoded;\n } else if (address.startsWith('bc1p') || address.startsWith('tb1p')) {\n // Taproot (P2TR) - bech32m\n const decoded = this.decodeBech32(address);\n console.log('[LedgerConnector] P2TR decoded length:', decoded.length, 'hex:', decoded);\n // decoded is hex string, so 32 bytes = 64 hex chars\n if (decoded.length !== 64) {\n throw new Error(`Invalid P2TR address: expected 64 hex chars, got ${decoded.length}`);\n }\n // OP_1 <32-byte-pubkey>\n return '5120' + decoded;\n } else if (address.startsWith('3') || address.startsWith('2')) {\n // P2SH\n const decoded = this.decodeBase58Check(address);\n // OP_HASH160 <20-byte-hash> OP_EQUAL\n return 'a914' + decoded + '87';\n } else if (address.startsWith('1') || address.startsWith('m') || address.startsWith('n')) {\n // P2PKH (Legacy)\n const decoded = this.decodeBase58Check(address);\n // OP_DUP OP_HASH160 <20-byte-hash> OP_EQUALVERIFY OP_CHECKSIG\n return '76a914' + decoded + '88ac';\n } else {\n throw new Error(`Unsupported address format: ${address}`);\n }\n }\n\n /**\n * Decode bech32/bech32m address to hex\n */\n private decodeBech32(address: string): string {\n const CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';\n\n // Find separator\n const pos = address.lastIndexOf('1');\n if (pos < 1) throw new Error('Invalid bech32 address');\n\n const data = address.slice(pos + 1);\n\n // Decode data characters\n const values: number[] = [];\n for (const char of data) {\n const idx = CHARSET.indexOf(char.toLowerCase());\n if (idx === -1) throw new Error('Invalid bech32 character');\n values.push(idx);\n }\n\n // Remove checksum (last 6 characters)\n const dataValues = values.slice(0, -6);\n\n // Skip witness version (first value)\n const witnessData = dataValues.slice(1);\n\n // Convert from 5-bit to 8-bit\n let acc = 0;\n let bits = 0;\n const result: number[] = [];\n\n for (const value of witnessData) {\n acc = (acc << 5) | value;\n bits += 5;\n while (bits >= 8) {\n bits -= 8;\n result.push((acc >> bits) & 0xff);\n }\n }\n\n return Buffer.from(result).toString('hex');\n }\n\n /**\n * Decode base58check address to hex (without version byte)\n */\n private decodeBase58Check(address: string): string {\n const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n let num = BigInt(0);\n for (const char of address) {\n const idx = ALPHABET.indexOf(char);\n if (idx === -1) throw new Error('Invalid base58 character');\n num = num * BigInt(58) + BigInt(idx);\n }\n\n // Convert to hex and pad\n let hex = num.toString(16);\n if (hex.length % 2 !== 0) hex = '0' + hex;\n\n // Handle leading zeros\n let leadingZeros = 0;\n for (const char of address) {\n if (char === '1') leadingZeros++;\n else break;\n }\n\n hex = '00'.repeat(leadingZeros) + hex;\n\n // Remove version byte (1 byte) and checksum (4 bytes)\n // Result is the 20-byte hash\n return hex.slice(2, -8);\n }\n\n /**\n * Encode number as varint hex\n */\n private encodeVarint(n: number): string {\n if (n < 0xfd) {\n return n.toString(16).padStart(2, '0');\n } else if (n <= 0xffff) {\n return 'fd' + this.uint16ToLittleEndian(n);\n } else if (n <= 0xffffffff) {\n return 'fe' + this.uint32ToLittleEndian(n);\n } else {\n return 'ff' + this.uint64ToLittleEndian(n);\n }\n }\n\n /**\n * Convert uint16 to little-endian hex\n */\n private uint16ToLittleEndian(n: number): string {\n const buf = Buffer.alloc(2);\n buf.writeUInt16LE(n);\n return buf.toString('hex');\n }\n\n /**\n * Convert uint32 to little-endian hex\n */\n private uint32ToLittleEndian(n: number): string {\n const buf = Buffer.alloc(4);\n buf.writeUInt32LE(n);\n return buf.toString('hex');\n }\n\n /**\n * Convert uint64 to little-endian hex\n */\n private uint64ToLittleEndian(n: number): string {\n const buf = Buffer.alloc(8);\n buf.writeBigUInt64LE(BigInt(n));\n return buf.toString('hex');\n }\n\n /**\n * Get additionals array based on address type\n */\n private getAdditionals(): string[] {\n switch (this._options.addressType) {\n case 'segwit':\n return ['bech32'];\n case 'taproot':\n return ['bech32m'];\n case 'nested-segwit':\n return [];\n case 'legacy':\n default:\n return [];\n }\n }\n\n async getNetwork(): Promise<BitcoinNetwork> {\n return this._network;\n }\n\n /**\n * Get extended public key (xpub/ypub/zpub) for account\n */\n async getExtendedPublicKey(): Promise<string> {\n if (!this._btcApp) {\n throw new Error('Not connected to Ledger device');\n }\n\n try {\n const coinType = this._network === 'mainnet' ? 0 : 1;\n const purpose = ADDRESS_TYPE_TO_PATH[this._options.addressType];\n const accountPath = `${purpose}'/${coinType}'/${this._options.accountIndex}'`;\n\n // Get appropriate xpub version bytes based on address type and network\n const xpubVersion = this.getXpubVersion();\n\n const xpub = await this._btcApp.getWalletXpub({\n path: accountPath,\n xpubVersion,\n });\n\n return xpub;\n } catch (error) {\n this.handleLedgerError(error);\n }\n }\n\n /**\n * Get multiple addresses for the account\n */\n async getAddresses(startIndex: number, count: number): Promise<WalletAccount[]> {\n if (!this._btcApp) {\n throw new Error('Not connected to Ledger device');\n }\n\n const accounts: WalletAccount[] = [];\n const coinType = this._network === 'mainnet' ? 0 : 1;\n const purpose = ADDRESS_TYPE_TO_PATH[this._options.addressType];\n const format = ADDRESS_TYPE_TO_FORMAT[this._options.addressType];\n\n for (let i = startIndex; i < startIndex + count; i++) {\n const path = `${purpose}'/${coinType}'/${this._options.accountIndex}'/0/${i}`;\n const result = await this._btcApp.getWalletPublicKey(path, {\n verify: false,\n format,\n });\n\n accounts.push({\n address: result.bitcoinAddress,\n publicKey: result.publicKey,\n type: this.mapLedgerAddressType(this._options.addressType),\n });\n }\n\n return accounts;\n }\n\n /**\n * Get current derivation path\n */\n getDerivationPath(): string {\n return this._derivationPath;\n }\n\n /**\n * Check if device is connected\n */\n isConnected(): boolean {\n return this._transport !== null && this._btcApp !== null;\n }\n\n /**\n * Get the Ledger Bitcoin app instance for advanced operations\n * This allows users to call createPaymentTransaction directly\n */\n getBtcApp(): LedgerBtcApp | null {\n return this._btcApp;\n }\n\n private mapLedgerAddressType(addressType: LedgerAddressType): AddressType {\n switch (addressType) {\n case 'legacy':\n return 'legacy';\n case 'nested-segwit':\n return 'nested-segwit';\n case 'segwit':\n return 'segwit';\n case 'taproot':\n return 'taproot';\n default:\n return 'segwit';\n }\n }\n\n private getXpubVersion(): number {\n const isMainnet = this._network === 'mainnet';\n\n switch (this._options.addressType) {\n case 'legacy':\n return isMainnet ? 0x0488b21e : 0x043587cf; // xpub / tpub\n case 'nested-segwit':\n return isMainnet ? 0x049d7cb2 : 0x044a5262; // ypub / upub\n case 'segwit':\n return isMainnet ? 0x04b24746 : 0x045f1cf6; // zpub / vpub\n case 'taproot':\n return isMainnet ? 0x0488b21e : 0x043587cf; // xpub / tpub (taproot uses standard)\n default:\n return isMainnet ? 0x04b24746 : 0x045f1cf6;\n }\n }\n\n private handleLedgerError(error: unknown): never {\n // Handle specific Ledger errors\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n\n if (message.includes('locked') || message.includes('0x6982')) {\n throw new Error('Ledger device is locked. Please unlock it and try again.');\n }\n\n if (message.includes('denied') || message.includes('rejected') || message.includes('0x6985')) {\n throw new Error('User rejected the request on Ledger device.');\n }\n\n if (message.includes('app') && message.includes('open')) {\n throw new Error('Please open the Bitcoin app on your Ledger device.');\n }\n\n if (message.includes('transportopenusercancelled')) {\n throw new Error('Connection cancelled. Please try again.');\n }\n\n if (message.includes('no device selected')) {\n throw new Error('No Ledger device selected. Please connect your device and try again.');\n }\n }\n\n this.handleError(error);\n }\n}\n"]}
|