@swapkit/wallet-hardware 5.0.0 → 6.0.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.
Files changed (167) hide show
  1. package/dist/THIRD_PARTY_LICENSES.md +2344 -0
  2. package/dist/chunk-09e51wma.js +4 -0
  3. package/dist/chunk-09e51wma.js.map +167 -0
  4. package/dist/chunk-0arpsm5f.js +4 -0
  5. package/dist/chunk-0arpsm5f.js.map +10 -0
  6. package/dist/chunk-1amf58aq.js +4 -0
  7. package/dist/{chunk-vwv6z2mk.js.map → chunk-1amf58aq.js.map} +2 -2
  8. package/dist/chunk-3t17wpjg.js +17 -0
  9. package/dist/chunk-3t17wpjg.js.map +29 -0
  10. package/dist/chunk-5c7b7z2d.js +4 -0
  11. package/dist/{chunk-9gy0xve4.js.map → chunk-5c7b7z2d.js.map} +2 -2
  12. package/dist/chunk-5p3ttw6y.js +4 -0
  13. package/dist/{chunk-n05bv2n5.js.map → chunk-5p3ttw6y.js.map} +1 -1
  14. package/dist/chunk-dptbnkzm.js +64 -0
  15. package/dist/chunk-dptbnkzm.js.map +260 -0
  16. package/dist/chunk-ds2m83jp.js +5 -0
  17. package/dist/chunk-ds2m83jp.js.map +11 -0
  18. package/dist/chunk-eenx3cv6.js +4 -0
  19. package/dist/chunk-eenx3cv6.js.map +33 -0
  20. package/dist/chunk-gr3eswf1.js +4 -0
  21. package/dist/chunk-gr3eswf1.js.map +73 -0
  22. package/dist/{chunk-7fsaymh4.js → chunk-hg71hp4m.js} +3 -3
  23. package/dist/{chunk-7fsaymh4.js.map → chunk-hg71hp4m.js.map} +1 -1
  24. package/dist/chunk-jewm2ag3.js +5 -0
  25. package/dist/chunk-jewm2ag3.js.map +10 -0
  26. package/dist/chunk-jzrytcrf.js +4 -0
  27. package/dist/chunk-jzrytcrf.js.map +12 -0
  28. package/dist/chunk-k3thje6a.js +4 -0
  29. package/dist/chunk-k3thje6a.js.map +9 -0
  30. package/dist/chunk-nhva847d.js +5 -0
  31. package/dist/chunk-nhva847d.js.map +9 -0
  32. package/dist/chunk-tm47brht.js +4 -0
  33. package/dist/chunk-tm47brht.js.map +140 -0
  34. package/dist/chunk-xmvg4cds.js +4 -0
  35. package/dist/chunk-xmvg4cds.js.map +127 -0
  36. package/dist/chunk-xx7cwpzq.js +4 -0
  37. package/dist/chunk-xx7cwpzq.js.map +9 -0
  38. package/dist/chunk-yrxe491r.js +20 -0
  39. package/dist/chunk-yrxe491r.js.map +17 -0
  40. package/dist/index.cjs +2 -2
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/keepkey/index.cjs +2 -2
  43. package/dist/keepkey/index.cjs.map +2 -2
  44. package/dist/keepkey/index.js +2 -2
  45. package/dist/keepkey/index.js.map +2 -2
  46. package/dist/ledger/index.cjs +90 -2
  47. package/dist/ledger/index.cjs.map +830 -23
  48. package/dist/ledger/index.js +2 -2
  49. package/dist/ledger/index.js.map +21 -19
  50. package/dist/trezor/index.cjs +2 -2
  51. package/dist/trezor/index.cjs.map +5 -4
  52. package/dist/trezor/index.js +2 -2
  53. package/dist/trezor/index.js.map +3 -3
  54. package/dist/types/helpers/psbt.d.ts +9 -0
  55. package/dist/types/helpers/psbt.d.ts.map +1 -0
  56. package/dist/types/ledger/clients/bitcoin.d.ts +36 -0
  57. package/dist/types/ledger/clients/bitcoin.d.ts.map +1 -0
  58. package/dist/types/ledger/clients/cosmos.d.ts +38 -10
  59. package/dist/types/ledger/clients/cosmos.d.ts.map +1 -1
  60. package/dist/types/ledger/clients/evm.d.ts +37 -46
  61. package/dist/types/ledger/clients/evm.d.ts.map +1 -1
  62. package/dist/types/ledger/clients/near.d.ts +5 -2
  63. package/dist/types/ledger/clients/near.d.ts.map +1 -1
  64. package/dist/types/ledger/clients/sui.d.ts +8 -12
  65. package/dist/types/ledger/clients/sui.d.ts.map +1 -1
  66. package/dist/types/ledger/clients/thorchain/index.d.ts +34 -8
  67. package/dist/types/ledger/clients/thorchain/index.d.ts.map +1 -1
  68. package/dist/types/ledger/clients/thorchain/protocol.d.ts +58 -0
  69. package/dist/types/ledger/clients/thorchain/protocol.d.ts.map +1 -0
  70. package/dist/types/ledger/clients/tron.d.ts +11 -8
  71. package/dist/types/ledger/clients/tron.d.ts.map +1 -1
  72. package/dist/types/ledger/clients/utxo-legacy-adapter.d.ts +3 -2
  73. package/dist/types/ledger/clients/utxo-legacy-adapter.d.ts.map +1 -1
  74. package/dist/types/ledger/clients/utxo-legacy-outputs.d.ts +18 -0
  75. package/dist/types/ledger/clients/utxo-legacy-outputs.d.ts.map +1 -0
  76. package/dist/types/ledger/clients/utxo.d.ts +10 -13
  77. package/dist/types/ledger/clients/utxo.d.ts.map +1 -1
  78. package/dist/types/ledger/clients/xrp.d.ts +4 -1
  79. package/dist/types/ledger/clients/xrp.d.ts.map +1 -1
  80. package/dist/types/ledger/clients/zcash.d.ts +53 -0
  81. package/dist/types/ledger/clients/zcash.d.ts.map +1 -0
  82. package/dist/types/ledger/helpers/dmk.d.ts +24 -0
  83. package/dist/types/ledger/helpers/dmk.d.ts.map +1 -0
  84. package/dist/types/ledger/helpers/executeDeviceAction.d.ts +34 -0
  85. package/dist/types/ledger/helpers/executeDeviceAction.d.ts.map +1 -0
  86. package/dist/types/ledger/helpers/getLedgerAddress.d.ts +1 -1
  87. package/dist/types/ledger/helpers/getLedgerAddress.d.ts.map +1 -1
  88. package/dist/types/ledger/helpers/getLedgerClient.d.ts +10 -3
  89. package/dist/types/ledger/helpers/getLedgerClient.d.ts.map +1 -1
  90. package/dist/types/ledger/helpers/index.d.ts +2 -1
  91. package/dist/types/ledger/helpers/index.d.ts.map +1 -1
  92. package/dist/types/ledger/helpers/ledgerJsDmkBridge.d.ts +26 -0
  93. package/dist/types/ledger/helpers/ledgerJsDmkBridge.d.ts.map +1 -0
  94. package/dist/types/ledger/helpers/ledgerJsDmkTransport.d.ts +13 -0
  95. package/dist/types/ledger/helpers/ledgerJsDmkTransport.d.ts.map +1 -0
  96. package/dist/types/ledger/helpers/lowS.d.ts +6 -0
  97. package/dist/types/ledger/helpers/lowS.d.ts.map +1 -0
  98. package/dist/types/ledger/helpers/rawTx.d.ts +2 -0
  99. package/dist/types/ledger/helpers/rawTx.d.ts.map +1 -0
  100. package/dist/types/ledger/index.d.ts +19 -7
  101. package/dist/types/ledger/index.d.ts.map +1 -1
  102. package/dist/types/ledger/types.d.ts +6 -10
  103. package/dist/types/ledger/types.d.ts.map +1 -1
  104. package/dist/types/trezor/index.d.ts +2 -2
  105. package/dist/types/trezor/index.d.ts.map +1 -1
  106. package/package.json +36 -36
  107. package/src/helpers/psbt.ts +26 -0
  108. package/src/ledger/clients/bitcoin.ts +575 -0
  109. package/src/ledger/clients/cosmos.ts +180 -51
  110. package/src/ledger/clients/evm.ts +238 -195
  111. package/src/ledger/clients/near.ts +43 -13
  112. package/src/ledger/clients/sui.ts +55 -68
  113. package/src/ledger/clients/thorchain/index.ts +210 -86
  114. package/src/ledger/clients/thorchain/protocol.ts +166 -0
  115. package/src/ledger/clients/tron.ts +49 -37
  116. package/src/ledger/clients/utxo-legacy-adapter.ts +35 -32
  117. package/src/ledger/clients/utxo-legacy-outputs.ts +122 -0
  118. package/src/ledger/clients/utxo.ts +108 -206
  119. package/src/ledger/clients/xrp.ts +39 -23
  120. package/src/ledger/clients/zcash.ts +440 -0
  121. package/src/ledger/helpers/dmk.ts +231 -0
  122. package/src/ledger/helpers/executeDeviceAction.ts +201 -0
  123. package/src/ledger/helpers/getLedgerClient.ts +101 -72
  124. package/src/ledger/helpers/index.ts +6 -1
  125. package/src/ledger/helpers/ledgerJsDmkBridge.ts +109 -0
  126. package/src/ledger/helpers/ledgerJsDmkTransport.ts +88 -0
  127. package/src/ledger/helpers/lowS.ts +30 -0
  128. package/src/ledger/helpers/rawTx.ts +12 -0
  129. package/src/ledger/index.ts +564 -369
  130. package/src/ledger/types.ts +15 -10
  131. package/src/trezor/index.ts +117 -25
  132. package/dist/chunk-3yr76n9s.js +0 -5
  133. package/dist/chunk-3yr76n9s.js.map +0 -10
  134. package/dist/chunk-9gy0xve4.js +0 -4
  135. package/dist/chunk-bwf31zxr.js +0 -4
  136. package/dist/chunk-bwf31zxr.js.map +0 -10
  137. package/dist/chunk-egtwbe6q.js +0 -4
  138. package/dist/chunk-egtwbe6q.js.map +0 -10
  139. package/dist/chunk-n05bv2n5.js +0 -5
  140. package/dist/chunk-vwv6z2mk.js +0 -4
  141. package/dist/types/ledger/clients/thorchain/common.d.ts +0 -28
  142. package/dist/types/ledger/clients/thorchain/common.d.ts.map +0 -1
  143. package/dist/types/ledger/clients/thorchain/helpers.d.ts +0 -7
  144. package/dist/types/ledger/clients/thorchain/helpers.d.ts.map +0 -1
  145. package/dist/types/ledger/clients/thorchain/lib.d.ts +0 -22
  146. package/dist/types/ledger/clients/thorchain/lib.d.ts.map +0 -1
  147. package/dist/types/ledger/clients/thorchain/utils.d.ts +0 -2
  148. package/dist/types/ledger/clients/thorchain/utils.d.ts.map +0 -1
  149. package/dist/types/ledger/clients/utxo-psbt.d.ts +0 -18
  150. package/dist/types/ledger/clients/utxo-psbt.d.ts.map +0 -1
  151. package/dist/types/ledger/cosmosTypes.d.ts +0 -40
  152. package/dist/types/ledger/cosmosTypes.d.ts.map +0 -1
  153. package/dist/types/ledger/helpers/getLedgerTransport.d.ts +0 -3
  154. package/dist/types/ledger/helpers/getLedgerTransport.d.ts.map +0 -1
  155. package/dist/types/ledger/helpers/ledgerNetworkInfo.d.ts +0 -14
  156. package/dist/types/ledger/helpers/ledgerNetworkInfo.d.ts.map +0 -1
  157. package/dist/types/ledger/interfaces/CosmosLedgerInterface.d.ts +0 -14
  158. package/dist/types/ledger/interfaces/CosmosLedgerInterface.d.ts.map +0 -1
  159. package/src/ledger/clients/thorchain/common.ts +0 -93
  160. package/src/ledger/clients/thorchain/helpers.ts +0 -120
  161. package/src/ledger/clients/thorchain/lib.ts +0 -258
  162. package/src/ledger/clients/thorchain/utils.ts +0 -69
  163. package/src/ledger/clients/utxo-psbt.ts +0 -172
  164. package/src/ledger/cosmosTypes.ts +0 -98
  165. package/src/ledger/helpers/getLedgerTransport.ts +0 -102
  166. package/src/ledger/helpers/ledgerNetworkInfo.ts +0 -127
  167. package/src/ledger/interfaces/CosmosLedgerInterface.ts +0 -67
@@ -1,26 +1,28 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/ledger/index.ts", "../src/ledger/helpers/getLedgerAddress.ts", "../src/ledger/helpers/getLedgerClient.ts", "../src/ledger/clients/cosmos.ts", "../src/ledger/interfaces/CosmosLedgerInterface.ts", "../src/ledger/clients/thorchain/lib.ts", "../src/ledger/clients/thorchain/common.ts", "../src/ledger/clients/thorchain/helpers.ts", "../src/ledger/clients/evm.ts", "../src/ledger/helpers/ledgerNetworkInfo.ts", "../src/ledger/clients/near.ts", "../src/ledger/clients/sui.ts", "../src/ledger/clients/thorchain/index.ts", "../src/ledger/clients/thorchain/utils.ts", "../src/ledger/clients/tron.ts", "../src/ledger/clients/utxo.ts", "../src/ledger/clients/xrp.ts"],
3
+ "sources": ["../src/ledger/index.ts", "../src/ledger/helpers/dmk.ts", "../src/ledger/helpers/executeDeviceAction.ts", "../src/ledger/helpers/getLedgerAddress.ts", "../src/ledger/helpers/getLedgerClient.ts", "../src/ledger/clients/bitcoin.ts", "../src/ledger/clients/utxo.ts", "../src/ledger/helpers/ledgerJsDmkBridge.ts", "../src/ledger/clients/utxo-legacy-outputs.ts", "../src/ledger/clients/cosmos.ts", "../src/ledger/helpers/lowS.ts", "../src/ledger/clients/evm.ts", "../src/ledger/clients/near.ts", "../src/ledger/clients/sui.ts", "../src/ledger/clients/thorchain/index.ts", "../src/ledger/clients/thorchain/protocol.ts", "../src/ledger/clients/tron.ts", "../src/ledger/clients/xrp.ts", "../src/ledger/clients/zcash.ts"],
4
4
  "sourcesContent": [
5
- "import type Transport from \"@ledgerhq/hw-transport\";\nimport {\n type AssetValue,\n Chain,\n type DerivationPathArray,\n derivationPathToString,\n FeeOption,\n filterSupportedChains,\n type GenericTransferParams,\n getRPCUrl,\n NetworkDerivationPath,\n SwapKitError,\n type UTXOChain,\n UTXOScriptType,\n WalletOption,\n} from \"@swapkit/helpers\";\nimport {\n addInputsAndOutputs,\n assertDerivationIndex,\n compileMemo,\n createHDWalletHelpers,\n getNetworkForChain,\n getScriptTypeForAddress,\n getUTXOAccountIndexFromPath,\n getUTXOAccountPath,\n getUTXOAddressPath,\n getUtxoApi,\n type UTXOBuildTxParams,\n type UTXOForMultiAddressTransfer,\n} from \"@swapkit/toolboxes/utxo\";\nimport type { Transaction } from \"@swapkit/utxo-signer\";\nimport { createWallet, getWalletSupportedChains, type HardwareExtendedPublicKeyInfo } from \"@swapkit/wallet-core\";\nimport { getLedgerAddress, getLedgerClient } from \"./helpers\";\n\n/**\n * Options passed to `connectLedger` at call time.\n *\n * When `transport` is supplied, the consumer opens and owns its lifecycle —\n * wallet-hardware will use that exact instance for every per-chain Ledger\n * client and will NOT recreate it on `forceReconnect`. When omitted, the\n * default browser flow (WebHID / WebUSB via `navigator.usb`) is used.\n */\nexport type ConnectLedgerOptions = { address?: string; transport?: Transport };\n\nexport const ledgerWallet = createWallet({\n connect: ({ addChain, supportedChains, walletType }) =>\n async function connectLedger(\n chains: Chain[],\n derivationPath?: DerivationPathArray,\n { address, transport }: ConnectLedgerOptions = {},\n ) {\n const [chain] = filterSupportedChains({ chains, supportedChains, walletType });\n\n if (!chain) return false;\n\n const resolvedPath = derivationPath ?? (NetworkDerivationPath[chain] as DerivationPathArray | undefined);\n const walletMethods = await getWalletMethods({ address, chain, derivationPath: resolvedPath, transport });\n\n addChain({ ...walletMethods, chain, walletType: WalletOption.LEDGER });\n\n return true;\n },\n directSigningSupport: {\n [Chain.Arbitrum]: true,\n [Chain.Arc]: true,\n [Chain.Aurora]: true,\n [Chain.Avalanche]: true,\n [Chain.Base]: true,\n [Chain.Berachain]: true,\n [Chain.BinanceSmartChain]: true,\n [Chain.Ethereum]: true,\n [Chain.Gnosis]: true,\n [Chain.Monad]: true,\n [Chain.Bitcoin]: true,\n [Chain.BitcoinCash]: true,\n [Chain.Cosmos]: true,\n [Chain.Dash]: true,\n [Chain.Dogecoin]: true,\n [Chain.Litecoin]: true,\n [Chain.Near]: true,\n [Chain.Optimism]: true,\n [Chain.Polygon]: true,\n [Chain.Ripple]: true,\n [Chain.Sui]: true,\n [Chain.THORChain]: true,\n [Chain.Tron]: true,\n [Chain.XLayer]: true,\n // ZEC: still on bespoke signPCZT path\n },\n getExtendedPublicKey: getLedgerExtendedPublicKey,\n name: \"connectLedger\",\n supportedChains: [\n Chain.Arbitrum,\n Chain.Arc,\n Chain.Aurora,\n Chain.Avalanche,\n Chain.Base,\n Chain.Berachain,\n Chain.BinanceSmartChain,\n Chain.Bitcoin,\n Chain.BitcoinCash,\n Chain.Cosmos,\n Chain.Dash,\n Chain.Dogecoin,\n Chain.Ethereum,\n Chain.Gnosis,\n Chain.Litecoin,\n Chain.Monad,\n Chain.Near,\n Chain.Optimism,\n Chain.Polygon,\n Chain.Ripple,\n Chain.Sui,\n Chain.THORChain,\n Chain.XLayer,\n Chain.Tron,\n Chain.Zcash,\n ],\n walletType: WalletOption.LEDGER,\n});\n\nexport const LEDGER_SUPPORTED_CHAINS = getWalletSupportedChains(ledgerWallet);\n\n// reduce memo length by removing trade limit\nfunction reduceMemo(memo?: string, affiliateAddress = \"t\") {\n if (!memo?.includes(\"=:\")) return memo;\n\n const removedAffiliate = memo.includes(`:${affiliateAddress}:`) ? memo.split(`:${affiliateAddress}:`)[0] : memo;\n\n return removedAffiliate?.substring(0, removedAffiliate.lastIndexOf(\":\"));\n}\n\nexport async function getLedgerExtendedPublicKey(\n chain: Chain,\n derivationPath?: DerivationPathArray,\n { accountIndex }: { accountIndex?: number } = {},\n): Promise<HardwareExtendedPublicKeyInfo | undefined> {\n if (![Chain.BitcoinCash, Chain.Bitcoin, Chain.Dash, Chain.Dogecoin, Chain.Litecoin, Chain.Zcash].includes(chain)) {\n throw new SwapKitError(\"wallet_chain_not_supported\", { chain, wallet: WalletOption.LEDGER });\n }\n\n const utxoChain = chain as UTXOChain;\n const signer = await getLedgerClient({ chain: utxoChain, derivationPath });\n if (!signer.getExtendedPublicKey) return undefined;\n\n const accountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const path = derivationPathToString(accountPath);\n const ledgerPath = chain === Chain.Bitcoin || chain === Chain.Litecoin ? path : path.replace(/^m\\//, \"\");\n const xpubVersion = getNetworkForChain(utxoChain).bip32.public;\n try {\n const xpub = await signer.getExtendedPublicKey(ledgerPath, xpubVersion);\n return { accountIndex: getUTXOAccountIndexFromPath(accountPath), path, xpub };\n } finally {\n await (signer as { disconnect?: () => Promise<void> }).disconnect?.();\n }\n}\n\nasync function getWalletMethods({\n address: providedAddress,\n chain,\n derivationPath,\n transport,\n}: ConnectLedgerOptions & { chain: Chain; derivationPath?: DerivationPathArray }) {\n switch (chain) {\n case Chain.BitcoinCash:\n case Chain.Bitcoin:\n case Chain.Dash:\n case Chain.Dogecoin:\n case Chain.Litecoin:\n case Chain.Zcash: {\n const { getUtxoToolbox } = await import(\"@swapkit/toolboxes/utxo\");\n const utxoChain = chain as UTXOChain;\n\n const signer = await getLedgerClient({ chain, derivationPath, transport });\n\n const address = providedAddress ?? (await getLedgerAddress({ chain, ledgerClient: signer }));\n const scriptType = getScriptTypeForAddress(address, utxoChain);\n\n // V3 toolbox signer:\n // - BTC uses the modern `ledger-bitcoin` AppClient with native PSBT signing.\n // - LTC/BCH/DOGE/DASH use the legacy `hw-app-btc` adapter that pulls\n // `nonWitnessUtxo` (full prev-tx hex) out of the API PSBT.\n // The Litecoin Ledger app does not support the `ledger-bitcoin`\n // policy APDUs and returns CLA_NOT_SUPPORTED.\n // - ZEC stays on the bespoke `signPCZT` flow for now.\n let toolboxSigner:\n | {\n getAddress: () => Promise<string>;\n publicKey?: Uint8Array;\n signTransaction: (tx: Transaction) => Promise<Transaction>;\n }\n | undefined;\n let publicKey: Uint8Array | undefined;\n let signAndBroadcastLegacyPsbtTransaction: ((tx: Transaction) => Promise<string>) | undefined;\n if (chain === Chain.Bitcoin) {\n const { BitcoinPsbtLedger } = await import(\"./clients/utxo-psbt\");\n const psbtClient = BitcoinPsbtLedger(derivationPath, transport);\n publicKey = scriptType === UTXOScriptType.P2SH_P2WPKH ? await psbtClient.getPublicKey() : undefined;\n toolboxSigner = { getAddress: psbtClient.getAddress, publicKey, signTransaction: psbtClient.signTransaction };\n } else if (\n chain === Chain.BitcoinCash ||\n chain === Chain.Dogecoin ||\n chain === Chain.Dash ||\n chain === Chain.Litecoin\n ) {\n const { createLegacyPsbtSigner, signLegacyPsbtTransaction } = await import(\"./clients/utxo-legacy-adapter\");\n toolboxSigner = createLegacyPsbtSigner({ address, chain: utxoChain, legacyClient: signer });\n signAndBroadcastLegacyPsbtTransaction = async (tx) => {\n const signedTxHex = await signLegacyPsbtTransaction({ chain: utxoChain, legacyClient: signer, tx });\n return toolbox.broadcastTx(signedTxHex);\n };\n }\n\n const toolbox = toolboxSigner\n ? await getUtxoToolbox(utxoChain, { scriptType, signer: toolboxSigner })\n : getUtxoToolbox(utxoChain, { scriptType });\n const signAndBroadcastTransaction = signAndBroadcastLegacyPsbtTransaction ?? toolbox.signAndBroadcastTransaction;\n\n const transfer = async (params: UTXOBuildTxParams) => {\n const feeRate = params.feeRate || (await toolbox.getFeeRates())[FeeOption.Average];\n const memo = [Chain.Bitcoin].includes(chain as typeof Chain.Bitcoin) ? params.memo : reduceMemo(params.memo);\n\n const { tx, inputs } = await toolbox.createTransaction({\n ...params,\n feeRate,\n fetchTxHex: true,\n memo,\n publicKey: params.publicKey ?? publicKey,\n sender: address,\n });\n\n // Legacy Ledger UTXO signing returns finalized raw tx hex, so transfer\n // broadcasts directly instead of routing through toolbox finalization.\n const txHex = await signer.signTransaction(tx as Transaction, inputs);\n const txHash = await toolbox.broadcastTx(txHex);\n\n return txHash;\n };\n\n async function getExtendedPublicKeyInfo({ accountIndex }: { accountIndex?: number } = {}) {\n if (!signer.getExtendedPublicKey) return undefined;\n\n const accountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const path = derivationPathToString(accountPath);\n const ledgerPath = chain === Chain.Bitcoin || chain === Chain.Litecoin ? path : path.replace(/^m\\//, \"\");\n const xpubVersion = getNetworkForChain(utxoChain).bip32.public;\n const xpub = await signer.getExtendedPublicKey(ledgerPath, xpubVersion);\n\n return { accountIndex: getUTXOAccountIndexFromPath(accountPath), path, xpub };\n }\n\n function getExtendedPublicKey(params: { accountIndex?: number } = {}) {\n return getExtendedPublicKeyInfo(params);\n }\n\n async function deriveAddressAtIndex({\n accountIndex,\n index,\n change = false,\n }: {\n accountIndex?: number;\n index: number;\n change?: boolean;\n }) {\n try {\n const fullPath = getUTXOAddressPath({ accountIndex, chain: utxoChain, change, derivationPath, index });\n\n const indexedSigner = await getLedgerClient({ chain: utxoChain, derivationPath: fullPath, transport });\n const derivedAddress = await getLedgerAddress({ chain: utxoChain, ledgerClient: indexedSigner });\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(fullPath),\n address: derivedAddress,\n change,\n index,\n path: derivationPathToString(fullPath),\n pubkey: \"\",\n };\n } catch {\n return undefined;\n }\n }\n\n async function deriveAddresses({\n accountIndex,\n count,\n startIndex = 0,\n change = false,\n }: {\n accountIndex?: number;\n count: number;\n startIndex?: number;\n change?: boolean;\n }) {\n assertDerivationIndex(\"count\", count);\n assertDerivationIndex(\"startIndex\", startIndex);\n\n const addresses = await Promise.all(\n Array.from({ length: count }, (_, i) =>\n deriveAddressAtIndex({ accountIndex, change, index: startIndex + i }),\n ),\n );\n\n return addresses.filter((address) => !!address);\n }\n\n const hdHelpers = createHDWalletHelpers({\n chain: utxoChain,\n deriveAddress: deriveAddressAtIndex,\n getBalance: toolbox.getBalance,\n getUtxos: (addr: string) => getUtxoApi(utxoChain).getUtxos({ address: addr, fetchTxHex: true }),\n });\n\n async function transferFromMultipleAddresses({\n utxos,\n recipient,\n assetValue,\n memo,\n feeRate,\n feeOptionKey,\n changeAddress,\n }: {\n utxos: UTXOForMultiAddressTransfer[];\n recipient: string;\n assetValue: AssetValue;\n memo?: string;\n feeRate?: number;\n feeOptionKey?: FeeOption;\n changeAddress?: string;\n }) {\n if (!utxos.length) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n message: \"No UTXOs provided for multi-address transfer\",\n });\n }\n\n const txFeeRate = feeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n const memoScript = memo ? compileMemo(memo) : null;\n\n const targetOutputs: Array<{ address: string; value: number } | { script: Uint8Array; value: number }> = [\n { address: recipient, value: assetValue.getBaseValue(\"number\") },\n ];\n if (memoScript) {\n targetOutputs.push({ script: memoScript, value: 0 });\n }\n\n const basicUtxos = utxos.map(({ hash, index, value, txHex, witnessUtxo }) => ({\n hash,\n index,\n txHex,\n value,\n witnessUtxo,\n }));\n\n const { inputs: selectedInputs, outputs } = toolbox.accumulative({\n chain: utxoChain,\n feeRate: txFeeRate,\n inputs: basicUtxos,\n outputs: targetOutputs,\n });\n\n if (!(selectedInputs && outputs)) {\n throw new SwapKitError(\"wallet_ledger_connection_error\", {\n message: \"Insufficient balance for multi-address transfer\",\n });\n }\n\n const { Transaction } = await import(\"@swapkit/utxo-signer\");\n const tx = new Transaction({ allowLegacyWitnessUtxo: true, version: 1 });\n const senderAddress = changeAddress || utxos[0]?.address || recipient;\n\n addInputsAndOutputs({\n chain: utxoChain,\n compiledMemo: memoScript,\n inputs: selectedInputs,\n outputs,\n sender: senderAddress,\n tx,\n });\n\n const basePath = getUTXOAccountPath({ chain: utxoChain, derivationPath });\n const inputDerivationPaths = selectedInputs.map((input: { hash: string; index: number }) => {\n const utxoInfo = utxos.find((u) => u.hash === input.hash && u.index === input.index);\n const derivationIndex = utxoInfo?.derivationIndex ?? 0;\n const isChange = utxoInfo?.isChange ?? false;\n const fullPath = [...basePath, Number(isChange), derivationIndex] as unknown as DerivationPathArray;\n return derivationPathToString(fullPath);\n });\n\n if (!signer.signTransactionWithMultiplePaths) {\n throw new SwapKitError(\"wallet_ledger_method_not_supported\", { method: \"signTransactionWithMultiplePaths\" });\n }\n\n const txHex = await signer.signTransactionWithMultiplePaths(tx, selectedInputs, inputDerivationPaths);\n return toolbox.broadcastTx(txHex);\n }\n\n return {\n ...toolbox,\n ...hdHelpers,\n address,\n deriveAddressAtIndex,\n deriveAddresses,\n getExtendedPublicKey,\n getExtendedPublicKeyInfo,\n signAndBroadcastTransaction,\n transfer,\n transferFromMultipleAddresses,\n };\n }\n\n case Chain.Ethereum:\n case Chain.Avalanche:\n case Chain.Arbitrum:\n case Chain.Arc:\n case Chain.Berachain:\n case Chain.Optimism:\n case Chain.Polygon:\n case Chain.BinanceSmartChain:\n case Chain.Base:\n case Chain.Aurora:\n case Chain.Gnosis:\n case Chain.Monad:\n case Chain.XLayer: {\n const { getEvmToolboxAsync } = await import(\"@swapkit/toolboxes/evm\");\n const signer = await getLedgerClient({ chain, derivationPath, transport });\n const address = await getLedgerAddress({ chain, ledgerClient: signer });\n const toolbox = await getEvmToolboxAsync(chain, { signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Cosmos: {\n const { createSigningStargateClient, getDefaultChainFee, getMsgSendDenom, getCosmosToolbox } = await import(\n \"@swapkit/toolboxes/cosmos\"\n );\n const signer = await getLedgerClient({ chain, derivationPath, transport });\n const address = await getLedgerAddress({ chain, ledgerClient: signer });\n const toolbox = await getCosmosToolbox(Chain.Cosmos, { signer });\n\n const transfer = async ({ assetValue, recipient, memo }: GenericTransferParams) => {\n if (!assetValue) throw new SwapKitError(\"wallet_ledger_invalid_asset\");\n\n const sendCoinsMessage = {\n amount: [\n {\n amount: assetValue.getBaseValue(\"string\"),\n denom: getMsgSendDenom(`u${assetValue.symbol}`).toLowerCase(),\n },\n ],\n fromAddress: address,\n toAddress: recipient,\n };\n\n const rpcUrl = await getRPCUrl(chain);\n const signingClient = await createSigningStargateClient(rpcUrl, signer, \"0.007uatom\");\n\n const { transactionHash } = await signingClient.signAndBroadcast(\n address,\n [{ typeUrl: \"/cosmos.bank.v1beta1.MsgSend\", value: sendCoinsMessage }],\n getDefaultChainFee(Chain.Cosmos),\n memo,\n );\n\n return transactionHash;\n };\n\n return { ...toolbox, address, transfer };\n }\n\n case Chain.THORChain: {\n const signer = await getLedgerClient({ chain, derivationPath, transport });\n const { getCosmosToolbox } = await import(\"@swapkit/toolboxes/cosmos\");\n const toolbox = getCosmosToolbox(chain, { signer });\n const address = await getLedgerAddress({ chain, ledgerClient: signer });\n const { sign: signMessage } = signer;\n\n return { ...toolbox, address, signMessage };\n }\n\n case Chain.Near: {\n const { getNearToolbox } = await import(\"@swapkit/toolboxes/near\");\n const signer = await getLedgerClient({ chain, derivationPath, transport });\n const accountId = await signer.getAddress();\n const toolbox = getNearToolbox({ signer });\n\n return { ...toolbox, address: accountId };\n }\n\n case Chain.Ripple: {\n const { getRippleToolbox } = await import(\"@swapkit/toolboxes/ripple\");\n const signer = await getLedgerClient({ chain, derivationPath, transport });\n const address = signer.getAddress();\n const toolbox = getRippleToolbox({ signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Tron: {\n const { getTronToolbox } = await import(\"@swapkit/toolboxes/tron\");\n const signer = await getLedgerClient({ chain, derivationPath, transport });\n const address = await getLedgerAddress({ chain, ledgerClient: signer });\n const toolbox = getTronToolbox({ signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Sui: {\n const { getSuiToolbox } = await import(\"@swapkit/toolboxes/sui\");\n const signer = await getLedgerClient({ chain, derivationPath, transport });\n const address = await getLedgerAddress({ chain, ledgerClient: signer });\n const toolbox = getSuiToolbox({ signer });\n\n return { ...toolbox, address };\n }\n\n default:\n throw new SwapKitError(\"wallet_ledger_chain_not_supported\", { chain });\n }\n}\n",
5
+ "import type Transport from \"@ledgerhq/hw-transport\";\nimport { hex } from \"@scure/base\";\nimport {\n type AssetValue,\n Chain,\n type DerivationPathArray,\n derivationPathToString,\n FeeOption,\n filterSupportedChains,\n getUTXOScriptTypeForPath,\n NetworkDerivationPath,\n SwapKitError,\n type UTXOChain,\n UTXOScriptType,\n WalletOption,\n} from \"@swapkit/helpers\";\nimport {\n addInputsAndOutputs,\n assertDerivationIndex,\n compileMemo,\n createHDWalletHelpers,\n getNetworkForChain,\n getScriptTypeForAddress,\n getUTXOAccountIndexFromPath,\n getUTXOAccountPath,\n getUTXOAddressPath,\n getUtxoApi,\n type UTXOBuildTxParams,\n type UTXOForMultiAddressTransfer,\n type UTXOTransferParams,\n type UTXOType,\n} from \"@swapkit/toolboxes/utxo\";\nimport type { Transaction, ZcashTransaction } from \"@swapkit/utxo-signer\";\nimport { createWallet, getWalletSupportedChains, type HardwareExtendedPublicKeyInfo } from \"@swapkit/wallet-core\";\nimport { match, P } from \"ts-pattern\";\nimport {\n getLedgerAddress,\n getLedgerClient,\n type LedgerDeviceActionStateHandler,\n type LedgerDMKSession,\n} from \"./helpers\";\nimport { createCachedRawTxResolver } from \"./helpers/rawTx\";\n\ntype BitcoinLedgerClient = ReturnType<typeof import(\"./clients/bitcoin\")[\"BitcoinLedger\"]>;\ntype LegacyUTXOLedgerClient = ReturnType<typeof import(\"./clients/utxo\")[\"BitcoinCashLedger\"]>;\ntype ZcashLedgerClient = ReturnType<typeof import(\"./clients/zcash\")[\"ZcashLedger\"]>;\ntype UTXOLedgerClient = BitcoinLedgerClient | LegacyUTXOLedgerClient | ZcashLedgerClient;\n\n/**\n * Options passed to `connectLedger` at call time.\n *\n * When `dmkSession` is omitted, the default browser WebHID flow discovers a\n * device and reuses one session across chains. Lazy-loaded apps can call\n * `preloadLedgerDMK` before the user gesture that starts connection.\n */\nexport interface ConnectLedgerOptions {\n address?: string;\n /** Caller-owned DMK session used by every supported chain. */\n dmkSession?: LedgerDMKSession;\n /** Receives DMK progress and device-interaction states. */\n onDeviceActionState?: LedgerDeviceActionStateHandler;\n /** Ledger-provided token required for Transaction Checks. */\n originToken?: string;\n /** @deprecated Temporary non-EVM fallback. Cannot be combined with `dmkSession`. */\n transport?: Transport;\n}\n\ninterface WalletMethodsParams<C extends Chain = Chain> extends ConnectLedgerOptions {\n chain: C;\n derivationPath?: DerivationPathArray;\n}\n\ninterface LedgerAccountXpubParams {\n chain: UTXOChain;\n path: string;\n signer: UTXOLedgerClient;\n xpubVersion: number;\n}\n\ninterface SignLedgerTransactionParams {\n inputUtxos?: UTXOType[];\n transaction: Transaction | ZcashTransaction;\n}\n\nconst LEDGER_SUPPORTED_CHAINS_CONFIG = [\n Chain.Arbitrum,\n Chain.Arc,\n Chain.Aurora,\n Chain.Avalanche,\n Chain.Base,\n Chain.Berachain,\n Chain.BinanceSmartChain,\n Chain.Bitcoin,\n Chain.BitcoinCash,\n Chain.Cosmos,\n Chain.Dash,\n Chain.Dogecoin,\n Chain.Ethereum,\n Chain.Gnosis,\n Chain.Litecoin,\n Chain.Monad,\n Chain.Near,\n Chain.Optimism,\n Chain.Polygon,\n Chain.Ripple,\n Chain.Sui,\n Chain.THORChain,\n Chain.XLayer,\n Chain.Tron,\n Chain.Zcash,\n] as const;\n\ntype LedgerSupportedChain = (typeof LEDGER_SUPPORTED_CHAINS_CONFIG)[number];\n\nconst LEDGER_UTXO_CHAINS = [\n Chain.BitcoinCash,\n Chain.Bitcoin,\n Chain.Dash,\n Chain.Dogecoin,\n Chain.Litecoin,\n Chain.Zcash,\n] as const satisfies readonly UTXOChain[];\n\nconst LEDGER_EVM_CHAINS = [\n Chain.Ethereum,\n Chain.Avalanche,\n Chain.Arbitrum,\n Chain.Arc,\n Chain.Berachain,\n Chain.Optimism,\n Chain.Polygon,\n Chain.BinanceSmartChain,\n Chain.Base,\n Chain.Aurora,\n Chain.Gnosis,\n Chain.Monad,\n Chain.XLayer,\n] as const satisfies readonly LedgerSupportedChain[];\n\ntype LedgerEVMChain = (typeof LEDGER_EVM_CHAINS)[number];\n\nfunction isLedgerSupportedChain(chain: Chain): chain is LedgerSupportedChain {\n return LEDGER_SUPPORTED_CHAINS_CONFIG.includes(chain as LedgerSupportedChain);\n}\n\nexport const ledgerWallet = createWallet({\n connect: ({ addChain, supportedChains, walletType }) =>\n async function connectLedger(\n chains: Chain[],\n derivationPath?: DerivationPathArray,\n { address, dmkSession, onDeviceActionState, originToken, transport }: ConnectLedgerOptions = {},\n ) {\n const [chain] = filterSupportedChains({ chains, supportedChains, walletType });\n\n if (!chain) return false;\n\n const resolvedPath = derivationPath ?? (NetworkDerivationPath[chain] as DerivationPathArray | undefined);\n const walletMethods = await getWalletMethods({\n address,\n chain,\n derivationPath: resolvedPath,\n dmkSession,\n onDeviceActionState,\n originToken,\n transport,\n });\n\n addChain({ ...walletMethods, chain, walletType: WalletOption.LEDGER });\n\n return true;\n },\n directSigningSupport: {\n [Chain.Arbitrum]: true,\n [Chain.Arc]: true,\n [Chain.Aurora]: true,\n [Chain.Avalanche]: true,\n [Chain.Base]: true,\n [Chain.Berachain]: true,\n [Chain.BinanceSmartChain]: true,\n [Chain.Ethereum]: true,\n [Chain.Gnosis]: true,\n [Chain.Monad]: true,\n [Chain.Bitcoin]: true,\n [Chain.BitcoinCash]: true,\n [Chain.Cosmos]: true,\n [Chain.Dash]: true,\n [Chain.Dogecoin]: true,\n [Chain.Litecoin]: true,\n [Chain.Near]: true,\n [Chain.Optimism]: true,\n [Chain.Polygon]: true,\n [Chain.Ripple]: true,\n [Chain.Sui]: true,\n [Chain.THORChain]: true,\n [Chain.Tron]: true,\n [Chain.XLayer]: true,\n // ZEC transparent transfers use DSK, but route-level PCZT signing remains unsupported.\n },\n getExtendedPublicKey: getLedgerExtendedPublicKey,\n name: \"connectLedger\",\n supportedChains: [...LEDGER_SUPPORTED_CHAINS_CONFIG],\n walletType: WalletOption.LEDGER,\n});\n\nexport const LEDGER_SUPPORTED_CHAINS = getWalletSupportedChains(ledgerWallet);\n\nfunction getLedgerAccountXpub({ chain, path, signer, xpubVersion }: LedgerAccountXpubParams) {\n const ledgerPath = match(chain)\n .with(Chain.Bitcoin, Chain.Litecoin, () => path)\n .with(Chain.BitcoinCash, Chain.Dash, Chain.Dogecoin, Chain.Zcash, () => path.replace(/^m\\//, \"\"))\n .exhaustive();\n\n return match(chain)\n .with(Chain.Bitcoin, () => (signer as BitcoinLedgerClient).getExtendedPublicKey({ path: ledgerPath }))\n .with(Chain.Zcash, () => (signer as ZcashLedgerClient).getExtendedPublicKey({ path: ledgerPath, xpubVersion }))\n .with(Chain.BitcoinCash, Chain.Dash, Chain.Dogecoin, Chain.Litecoin, () =>\n (signer as LegacyUTXOLedgerClient).getExtendedPublicKey(ledgerPath, xpubVersion),\n )\n .exhaustive();\n}\n\n// Toolbox-built transactions keep input txids in display order, the order the UTXO API looks transactions up by,\n// while ZcashTransaction.fromBytes (raw API route transactions) keeps them in wire order, so try both. A txid and its\n// byte reversal cannot both name real transactions, so the fallback cannot fetch an unrelated one.\nfunction resolveZcashInputUtxos(transaction: ZcashTransaction): Promise<UTXOType[]> {\n const zcashApi = getUtxoApi(Chain.Zcash);\n const getRawTx = createCachedRawTxResolver((txid) => zcashApi.getRawTx(txid));\n\n return Promise.all(\n Array.from({ length: transaction.inputsLength }, async (_, inputIndex) => {\n const input = transaction.getInput(inputIndex);\n const txid = hex.encode(input.txid);\n const reversedTxid = hex.encode(input.txid.slice().reverse());\n const directTxHex = await getRawTx(txid);\n const [hash, txHex] = directTxHex ? [txid, directTxHex] : [reversedTxid, await getRawTx(reversedTxid)];\n if (!txHex) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n inputIndex,\n outputIndex: input.index,\n reason: \"Unable to resolve previous transaction hex for Ledger signing in either txid byte order\",\n reversedTxid,\n txid,\n });\n }\n\n // The Zcash client takes amounts from the device's trusted inputs; fromBytes leaves input values at zero.\n return { hash, index: input.index, txHex, value: Number(input.value) };\n }),\n );\n}\n\nexport async function getLedgerExtendedPublicKey(\n chain: Chain,\n derivationPath?: DerivationPathArray,\n {\n accountIndex,\n dmkSession,\n onDeviceActionState,\n transport,\n }: {\n accountIndex?: number;\n dmkSession?: LedgerDMKSession;\n onDeviceActionState?: LedgerDeviceActionStateHandler;\n transport?: Transport;\n } = {},\n): Promise<HardwareExtendedPublicKeyInfo | undefined> {\n if (![Chain.BitcoinCash, Chain.Bitcoin, Chain.Dash, Chain.Dogecoin, Chain.Litecoin, Chain.Zcash].includes(chain)) {\n throw new SwapKitError(\"wallet_chain_not_supported\", { chain, wallet: WalletOption.LEDGER });\n }\n\n const utxoChain = chain as UTXOChain;\n const signer = await getLedgerClient({\n chain: utxoChain,\n derivationPath,\n dmkSession,\n onDeviceActionState,\n transport,\n });\n if (!signer.getExtendedPublicKey) return undefined;\n\n const accountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const path = derivationPathToString(accountPath);\n const xpubVersion = getNetworkForChain(utxoChain).bip32.public;\n try {\n const xpub = await getLedgerAccountXpub({ chain: utxoChain, path, signer, xpubVersion });\n return { accountIndex: getUTXOAccountIndexFromPath(accountPath), path, xpub };\n } finally {\n await (signer as { disconnect?: () => Promise<void> }).disconnect?.();\n }\n}\n\nasync function getUTXOWalletMethods({\n address: providedAddress,\n chain,\n dmkSession,\n derivationPath,\n onDeviceActionState,\n transport,\n}: WalletMethodsParams<UTXOChain>) {\n const { getUtxoToolbox } = await import(\"@swapkit/toolboxes/utxo\");\n const utxoChain = chain;\n\n const signer = await getLedgerClient({ chain, derivationPath, dmkSession, onDeviceActionState, transport });\n\n const address = providedAddress ?? (await getLedgerAddress({ chain, ledgerClient: signer }));\n // On Bitcoin the account's path states its encoding (BIP44/49/84/86). The other apps sign for the address format\n // the client derives (an 86' Litecoin account is ltc1q), so they, like a custom purpose, follow the address form.\n const scriptType =\n (chain === Chain.Bitcoin ? getUTXOScriptTypeForPath(derivationPath) : undefined) ??\n getScriptTypeForAddress(address, utxoChain);\n\n const { publicKey, signLedgerTransaction, toolboxSigner } = await match(chain)\n .with(Chain.Bitcoin, async () => {\n const bitcoinSigner = signer as BitcoinLedgerClient;\n // Nested SegWit and taproot inputs need the key behind them (redeemScript, tapInternalKey).\n const needsPublicKey = scriptType === UTXOScriptType.P2SH_P2WPKH || scriptType === UTXOScriptType.P2TR;\n const publicKey = needsPublicKey ? await bitcoinSigner.getPublicKey() : undefined;\n return {\n publicKey,\n signLedgerTransaction: ({ inputUtxos, transaction }: SignLedgerTransactionParams) =>\n bitcoinSigner.signTransactionHex({ inputUtxos, tx: transaction as Transaction }),\n toolboxSigner: {\n getAddress: bitcoinSigner.getAddress,\n publicKey,\n signTransaction: bitcoinSigner.signTransaction,\n },\n };\n })\n .with(Chain.BitcoinCash, Chain.Dogecoin, Chain.Dash, Chain.Litecoin, async () => {\n const { createLegacyPsbtSigner, signLegacyPsbtTransaction } = await import(\"./clients/utxo-legacy-adapter\");\n const legacySigner = signer as LegacyUTXOLedgerClient;\n return {\n publicKey: undefined,\n signLedgerTransaction: ({ inputUtxos, transaction }: SignLedgerTransactionParams) =>\n signLegacyPsbtTransaction({\n chain: utxoChain,\n inputUtxos,\n legacyClient: legacySigner,\n tx: transaction as Transaction,\n }),\n toolboxSigner: createLegacyPsbtSigner({ address, chain: utxoChain, legacyClient: legacySigner }),\n };\n })\n .with(Chain.Zcash, () => {\n const zcashSigner = signer as ZcashLedgerClient;\n return {\n publicKey: undefined,\n signLedgerTransaction: async ({ inputUtxos, transaction }: SignLedgerTransactionParams) => {\n if (!(\"consensusBranchId\" in transaction)) {\n throw new SwapKitError(\"wallet_ledger_method_not_supported\", {\n method: \"signPCZT\",\n wallet: WalletOption.LEDGER,\n });\n }\n\n const resolvedInputUtxos = inputUtxos ?? (await resolveZcashInputUtxos(transaction));\n return zcashSigner.signTransaction({ inputUtxos: resolvedInputUtxos, tx: transaction });\n },\n toolboxSigner: undefined,\n };\n })\n .exhaustive();\n\n const toolbox = toolboxSigner\n ? await getUtxoToolbox(utxoChain, { scriptType, signer: toolboxSigner })\n : getUtxoToolbox(utxoChain, { scriptType });\n const signAndBroadcastTransaction = async (transaction: Transaction | ZcashTransaction) =>\n toolbox.broadcastTx(await signLedgerTransaction({ transaction }));\n\n // The toolbox's transfer parameters plus a public key override; the sender is always the Ledger account.\n const transfer = async (params: UTXOTransferParams & Pick<UTXOBuildTxParams, \"enableRBF\" | \"publicKey\">) => {\n const feeRate = params.feeRate || (await toolbox.getFeeRates())[params.feeOptionKey || FeeOption.Fast];\n\n const { tx, inputs } = await toolbox.createTransaction({\n ...params,\n feeRate,\n fetchTxHex: true,\n publicKey: params.publicKey ?? publicKey,\n sender: address,\n });\n\n const txHex = await signLedgerTransaction({ inputUtxos: inputs, transaction: tx });\n const txHash = await toolbox.broadcastTx(txHex);\n\n return txHash;\n };\n\n async function getExtendedPublicKeyInfo({ accountIndex }: { accountIndex?: number } = {}) {\n if (!signer.getExtendedPublicKey) return undefined;\n\n const accountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const path = derivationPathToString(accountPath);\n const xpubVersion = getNetworkForChain(utxoChain).bip32.public;\n const xpub = await getLedgerAccountXpub({ chain, path, signer, xpubVersion });\n\n return { accountIndex: getUTXOAccountIndexFromPath(accountPath), path, xpub };\n }\n\n function getExtendedPublicKey(params: { accountIndex?: number } = {}) {\n return getExtendedPublicKeyInfo(params);\n }\n\n async function deriveAddressAtIndex({\n accountIndex,\n index,\n change = false,\n }: {\n accountIndex?: number;\n index: number;\n change?: boolean;\n }) {\n try {\n const fullPath = getUTXOAddressPath({ accountIndex, chain: utxoChain, change, derivationPath, index });\n\n const indexedSigner = await getLedgerClient({\n chain: utxoChain,\n derivationPath: fullPath,\n dmkSession,\n onDeviceActionState,\n transport,\n });\n const derivedAddress = await getLedgerAddress({ chain: utxoChain, ledgerClient: indexedSigner });\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(fullPath),\n address: derivedAddress,\n change,\n index,\n path: derivationPathToString(fullPath),\n pubkey: \"\",\n };\n } catch {\n return undefined;\n }\n }\n\n async function deriveAddresses({\n accountIndex,\n count,\n startIndex = 0,\n change = false,\n }: {\n accountIndex?: number;\n count: number;\n startIndex?: number;\n change?: boolean;\n }) {\n assertDerivationIndex(\"count\", count);\n assertDerivationIndex(\"startIndex\", startIndex);\n\n const addresses = await Promise.all(\n Array.from({ length: count }, (_, i) => deriveAddressAtIndex({ accountIndex, change, index: startIndex + i })),\n );\n\n return addresses.filter((address) => !!address);\n }\n\n const hdHelpers = createHDWalletHelpers({\n chain: utxoChain,\n deriveAddress: deriveAddressAtIndex,\n getBalance: toolbox.getBalance,\n getUtxos: (addr: string) => getUtxoApi(utxoChain).getUtxos({ address: addr, fetchTxHex: true }),\n });\n\n async function transferFromMultipleAddresses({\n utxos,\n recipient,\n assetValue,\n memo,\n feeRate,\n feeOptionKey,\n changeAddress,\n }: {\n utxos: UTXOForMultiAddressTransfer[];\n recipient: string;\n assetValue: AssetValue;\n memo?: string;\n feeRate?: number;\n feeOptionKey?: FeeOption;\n changeAddress?: string;\n }) {\n if (chain === Chain.Zcash) {\n throw new SwapKitError(\"wallet_ledger_method_not_supported\", {\n method: \"transferFromMultipleAddresses\",\n wallet: WalletOption.LEDGER,\n });\n }\n\n if (!utxos.length) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n message: \"No UTXOs provided for multi-address transfer\",\n });\n }\n\n const txFeeRate = feeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n const memoScript = memo ? compileMemo(memo) : null;\n\n const targetOutputs: Array<{ address: string; value: number } | { script: Uint8Array; value: number }> = [\n { address: recipient, value: assetValue.getBaseValue(\"number\") },\n ];\n if (memoScript) {\n targetOutputs.push({ script: memoScript, value: 0 });\n }\n\n const basicUtxos = utxos.map(({ hash, index, value, txHex, witnessUtxo }) => ({\n hash,\n index,\n txHex,\n value,\n witnessUtxo,\n }));\n\n const { inputs: selectedInputs, outputs } = toolbox.accumulative({\n chain: utxoChain,\n feeRate: txFeeRate,\n inputs: basicUtxos,\n outputs: targetOutputs,\n });\n\n if (!(selectedInputs && outputs)) {\n throw new SwapKitError(\"wallet_ledger_connection_error\", {\n message: \"Insufficient balance for multi-address transfer\",\n });\n }\n\n const { Transaction } = await import(\"@swapkit/utxo-signer\");\n const tx = new Transaction({ allowLegacyWitnessUtxo: true, allowUnknownOutputs: !!memoScript, version: 1 });\n const senderAddress = changeAddress || utxos[0]?.address || recipient;\n\n addInputsAndOutputs({\n chain: utxoChain,\n compiledMemo: memoScript,\n inputs: selectedInputs,\n outputs,\n sender: senderAddress,\n tx,\n });\n\n const inputDerivationPaths = selectedInputs.map((input: { hash: string; index: number }) => {\n const utxoInfo = utxos.find((u) => u.hash === input.hash && u.index === input.index);\n const fullPath = getUTXOAddressPath({\n chain: utxoChain,\n change: utxoInfo?.isChange ?? false,\n derivationPath,\n index: utxoInfo?.derivationIndex ?? 0,\n });\n return derivationPathToString(fullPath);\n });\n\n if (!signer.signTransactionWithMultiplePaths) {\n throw new SwapKitError(\"wallet_ledger_method_not_supported\", { method: \"signTransactionWithMultiplePaths\" });\n }\n\n const txHex = await match(chain)\n .with(Chain.Bitcoin, () =>\n (signer as BitcoinLedgerClient).signTransactionWithMultiplePaths({\n derivationPaths: inputDerivationPaths,\n inputUtxos: selectedInputs,\n tx,\n }),\n )\n .with(Chain.BitcoinCash, Chain.Dash, Chain.Dogecoin, Chain.Litecoin, () =>\n (signer as LegacyUTXOLedgerClient).signTransactionWithMultiplePaths(tx, selectedInputs, inputDerivationPaths),\n )\n .exhaustive();\n return toolbox.broadcastTx(txHex);\n }\n\n return {\n ...toolbox,\n ...hdHelpers,\n address,\n deriveAddressAtIndex,\n deriveAddresses,\n getExtendedPublicKey,\n getExtendedPublicKeyInfo,\n signAndBroadcastTransaction,\n transfer,\n transferFromMultipleAddresses,\n };\n}\n\nasync function getEVMWalletMethods({\n chain,\n derivationPath,\n dmkSession,\n onDeviceActionState,\n originToken,\n transport,\n}: WalletMethodsParams<LedgerEVMChain>) {\n const signer = await getLedgerClient({\n chain,\n derivationPath,\n dmkSession,\n onDeviceActionState,\n originToken,\n transport,\n });\n const { getEvmToolboxAsync } = await import(\"@swapkit/toolboxes/evm\");\n const address = await getLedgerAddress({ chain, ledgerClient: signer });\n const toolbox = await getEvmToolboxAsync(chain, { signer });\n\n return { ...toolbox, address };\n}\n\nasync function getCosmosWalletMethods({\n chain,\n derivationPath,\n dmkSession,\n onDeviceActionState,\n transport,\n}: WalletMethodsParams<Chain.Cosmos>) {\n const signer = await getLedgerClient({ chain, derivationPath, dmkSession, onDeviceActionState, transport });\n const { getCosmosToolbox } = await import(\"@swapkit/toolboxes/cosmos\");\n const toolbox = getCosmosToolbox(chain, { signer });\n const address = await getLedgerAddress({ chain, ledgerClient: signer });\n\n return { ...toolbox, address };\n}\n\nasync function getTHORChainWalletMethods({\n chain,\n derivationPath,\n dmkSession,\n onDeviceActionState,\n transport,\n}: WalletMethodsParams<Chain.THORChain>) {\n const signer = await getLedgerClient({ chain, derivationPath, dmkSession, onDeviceActionState, transport });\n const { getCosmosToolbox } = await import(\"@swapkit/toolboxes/cosmos\");\n const toolbox = getCosmosToolbox(chain, { signer });\n const address = await getLedgerAddress({ chain, ledgerClient: signer });\n const { sign: signMessage } = signer;\n\n return { ...toolbox, address, signMessage };\n}\n\nasync function getNearWalletMethods({\n chain,\n derivationPath,\n dmkSession,\n onDeviceActionState,\n transport,\n}: WalletMethodsParams<Chain.Near>) {\n const { getNearToolbox } = await import(\"@swapkit/toolboxes/near\");\n const signer = await getLedgerClient({ chain, derivationPath, dmkSession, onDeviceActionState, transport });\n const accountId = await signer.getAddress();\n const toolbox = getNearToolbox({ signer });\n\n return { ...toolbox, address: accountId };\n}\n\nasync function getRippleWalletMethods({\n chain,\n derivationPath,\n dmkSession,\n onDeviceActionState,\n transport,\n}: WalletMethodsParams<Chain.Ripple>) {\n const { getRippleToolbox } = await import(\"@swapkit/toolboxes/ripple\");\n const signer = await getLedgerClient({ chain, derivationPath, dmkSession, onDeviceActionState, transport });\n const address = signer.getAddress();\n const toolbox = getRippleToolbox({ signer });\n\n return { ...toolbox, address };\n}\n\nasync function getTronWalletMethods({\n chain,\n derivationPath,\n dmkSession,\n onDeviceActionState,\n transport,\n}: WalletMethodsParams<Chain.Tron>) {\n const { getTronToolbox } = await import(\"@swapkit/toolboxes/tron\");\n const signer = await getLedgerClient({ chain, derivationPath, dmkSession, onDeviceActionState, transport });\n const address = await getLedgerAddress({ chain, ledgerClient: signer });\n const toolbox = getTronToolbox({ signer });\n\n return { ...toolbox, address };\n}\n\nasync function getSuiWalletMethods({\n chain,\n derivationPath,\n dmkSession,\n onDeviceActionState,\n transport,\n}: WalletMethodsParams<Chain.Sui>) {\n const { getSuiToolbox } = await import(\"@swapkit/toolboxes/sui\");\n const signer = await getLedgerClient({ chain, derivationPath, dmkSession, onDeviceActionState, transport });\n const address = await getLedgerAddress({ chain, ledgerClient: signer });\n const toolbox = getSuiToolbox({ signer });\n\n return { ...toolbox, address };\n}\n\nfunction getWalletMethods(params: WalletMethodsParams) {\n if (!isLedgerSupportedChain(params.chain)) {\n throw new SwapKitError(\"wallet_ledger_chain_not_supported\", { chain: params.chain });\n }\n\n return match(params.chain)\n .with(P.union(...LEDGER_UTXO_CHAINS), (chain) => getUTXOWalletMethods({ ...params, chain }))\n .with(P.union(...LEDGER_EVM_CHAINS), (chain) => getEVMWalletMethods({ ...params, chain }))\n .with(Chain.Cosmos, (chain) => getCosmosWalletMethods({ ...params, chain }))\n .with(Chain.THORChain, (chain) => getTHORChainWalletMethods({ ...params, chain }))\n .with(Chain.Near, (chain) => getNearWalletMethods({ ...params, chain }))\n .with(Chain.Ripple, (chain) => getRippleWalletMethods({ ...params, chain }))\n .with(Chain.Tron, (chain) => getTronWalletMethods({ ...params, chain }))\n .with(Chain.Sui, (chain) => getSuiWalletMethods({ ...params, chain }))\n .exhaustive();\n}\n\nexport type { LedgerDeviceActionState, LedgerDeviceActionStateHandler, LedgerDMKSession } from \"./helpers\";\nexport { disconnectLedgerDMKSession, getLedgerDMKSession, preloadLedgerDMK } from \"./helpers\";\n",
6
+ "import type { DeviceManagementKit, DeviceSessionId, DiscoveredDevice } from \"@ledgerhq/device-management-kit\";\nimport { SwapKitError } from \"@swapkit/helpers\";\nimport { filter, firstValueFrom, map, timeout } from \"rxjs\";\n\nimport { toLedgerDeviceError } from \"./executeDeviceAction\";\n\n// Bounds the wait for a granted device that DMK never lists (an unrecognised model); the picker opens instead.\nconst AUTHORISED_DEVICE_TIMEOUT_MS = 1_000;\n\ntype WebHidNavigator = Navigator & { hid?: { getDevices?: () => Promise<Array<{ vendorId: number }>> } };\n\nexport interface LedgerDMKSession {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n}\n\nlet defaultDMKPromise: Promise<DeviceManagementKit> | undefined;\nlet defaultSessionPromise: Promise<LedgerDMKSession> | undefined;\n\nfunction createDefaultDMKPromise() {\n if (typeof navigator === \"undefined\" || !(\"hid\" in navigator)) {\n return Promise.reject(new SwapKitError(\"wallet_ledger_webhid_not_supported\"));\n }\n\n return Promise.all([import(\"@ledgerhq/device-management-kit\"), import(\"@ledgerhq/device-transport-kit-web-hid\")])\n .then(([{ DeviceManagementKitBuilder }, { webHidTransportFactory }]) =>\n new DeviceManagementKitBuilder().addTransport(webHidTransportFactory).build(),\n )\n .catch((error) => {\n defaultDMKPromise = undefined;\n if (error instanceof SwapKitError) throw error;\n throw new SwapKitError(\"wallet_ledger_connection_error\", error);\n });\n}\n\nfunction getDefaultDMK() {\n defaultDMKPromise ??= createDefaultDMKPromise();\n return defaultDMKPromise;\n}\n\nfunction createDefaultSessionPromise() {\n return getDefaultDMK().then((dmk) => connectLedgerDMK({ dmk }));\n}\n\nfunction isSessionNotFound(error: unknown) {\n return typeof error === \"object\" && error !== null && \"_tag\" in error && error._tag === \"DeviceSessionNotFound\";\n}\n\nfunction isSessionConnected({ dmk, sessionId }: LedgerDMKSession) {\n try {\n dmk.getConnectedDevice({ sessionId });\n return true;\n } catch (error) {\n void error;\n return false;\n }\n}\n\nasync function getValidDefaultSession({ sessionPromise }: { sessionPromise: Promise<LedgerDMKSession> }) {\n let activeSessionPromise = sessionPromise;\n\n try {\n const session = await activeSessionPromise;\n if (isSessionConnected(session)) return session;\n\n if (defaultSessionPromise === activeSessionPromise) {\n defaultSessionPromise = createDefaultSessionPromise();\n }\n\n defaultSessionPromise ??= createDefaultSessionPromise();\n activeSessionPromise = defaultSessionPromise;\n\n return await activeSessionPromise;\n } catch (error) {\n if (defaultSessionPromise === activeSessionPromise) defaultSessionPromise = undefined;\n if (error instanceof SwapKitError) throw error;\n throw new SwapKitError(\"wallet_ledger_connection_error\", error);\n }\n}\n\nasync function hasAuthorisedLedger() {\n const hid = typeof navigator === \"undefined\" ? undefined : (navigator as WebHidNavigator).hid;\n if (typeof hid?.getDevices !== \"function\") return false;\n\n try {\n const [devices, { LEDGER_VENDOR_ID }] = await Promise.all([\n hid.getDevices(),\n import(\"@ledgerhq/device-management-kit\"),\n ]);\n return devices.some(({ vendorId }) => vendorId === LEDGER_VENDOR_ID);\n } catch (error) {\n void error;\n return false;\n }\n}\n\n/**\n * `startDiscovering` always opens the WebHID picker, which needs a fresh user gesture. A plugged-in Ledger the user\n * already granted (page reload, replug after DMK's reconnect window) is listed without one.\n */\nasync function findAuthorisedDevice({ dmk }: { dmk: DeviceManagementKit }) {\n // Nothing granted: go straight to the picker while the caller's user gesture is still fresh.\n if (!(await hasAuthorisedLedger())) return undefined;\n\n try {\n return await firstValueFrom(\n dmk.listenToAvailableDevices({}).pipe(\n // The WebHID list replays its last value (initially empty) before it re-reads the granted devices.\n map(([device]) => device),\n filter((device): device is DiscoveredDevice => device !== undefined),\n timeout({ first: AUTHORISED_DEVICE_TIMEOUT_MS }),\n ),\n );\n } catch (error) {\n void error;\n return undefined;\n }\n}\n\nasync function connectLedgerDMK({ dmk }: { dmk: DeviceManagementKit }) {\n let discoveryStarted = false;\n\n try {\n const authorisedDevice = await findAuthorisedDevice({ dmk });\n if (authorisedDevice) return { dmk, sessionId: await dmk.connect({ device: authorisedDevice }) };\n\n const discoveredDevices = dmk.startDiscovering({});\n discoveryStarted = true;\n const device = await firstValueFrom(discoveredDevices);\n const sessionId = await dmk.connect({ device });\n\n return { dmk, sessionId };\n } catch (error) {\n if (error instanceof SwapKitError) throw error;\n throw new SwapKitError(\"wallet_ledger_connection_error\", error);\n } finally {\n if (discoveryStarted) {\n try {\n await dmk.stopDiscovering();\n } catch (error) {\n void error;\n }\n }\n }\n}\n\nexport function getLedgerDMKSession({ dmk }: { dmk?: DeviceManagementKit } = {}) {\n if (dmk) return connectLedgerDMK({ dmk });\n\n defaultSessionPromise ??= createDefaultSessionPromise();\n const cachedSessionPromise = defaultSessionPromise;\n\n return getValidDefaultSession({ sessionPromise: cachedSessionPromise });\n}\n\n/**\n * Builds a signer kit instance for the session an operation runs on. A caller-owned session is used\n * as given; the default session is re-validated on every call and the signer is rebuilt when it was\n * replaced. DMK keeps a session through a brief unplug; once it drops one, the next operation connects\n * again, silently to a Ledger the user already granted, otherwise through the WebHID picker, which\n * needs a user gesture.\n */\nexport function createLedgerSessionSigner<Signer>({\n build,\n dmkSession,\n}: {\n build: (session: LedgerDMKSession) => Signer | Promise<Signer>;\n dmkSession?: LedgerDMKSession;\n}) {\n let cached: { session: LedgerDMKSession; signer: Promise<Signer> } | undefined;\n\n return async function getSessionSigner() {\n const session = dmkSession ?? (await getLedgerDMKSession());\n if (cached?.session.dmk !== session.dmk || cached.session.sessionId !== session.sessionId) {\n const signer = Promise.resolve().then(() => build(session));\n cached = { session, signer };\n const pending = cached;\n void signer.catch(() => {\n if (cached === pending) cached = undefined;\n });\n }\n return cached.signer;\n };\n}\n\nexport function preloadLedgerDMK() {\n const dmkPromise = getDefaultDMK();\n // Preloading is usually fire-and-forget; the connection that follows reports the same failure.\n void dmkPromise.catch(() => undefined);\n return dmkPromise;\n}\n\nexport async function disconnectLedgerDMKSession({ dmkSession }: { dmkSession?: LedgerDMKSession } = {}) {\n const cachedSessionPromise = defaultSessionPromise;\n let sessionToDisconnect = dmkSession;\n\n if (!sessionToDisconnect) {\n if (!cachedSessionPromise) return;\n if (defaultSessionPromise === cachedSessionPromise) defaultSessionPromise = undefined;\n\n try {\n sessionToDisconnect = await cachedSessionPromise;\n } catch {\n return;\n }\n }\n\n if (cachedSessionPromise) {\n try {\n const cachedSession = await cachedSessionPromise;\n if (\n defaultSessionPromise === cachedSessionPromise &&\n cachedSession.dmk === sessionToDisconnect.dmk &&\n cachedSession.sessionId === sessionToDisconnect.sessionId\n ) {\n defaultSessionPromise = undefined;\n }\n } catch (error) {\n void error;\n if (defaultSessionPromise === cachedSessionPromise) defaultSessionPromise = undefined;\n }\n }\n\n try {\n await sessionToDisconnect.dmk.disconnect({ sessionId: sessionToDisconnect.sessionId });\n } catch (error) {\n // DMK already dropped the session (device unplugged past its reconnect window): nothing left to release.\n if (isSessionNotFound(error)) return;\n throw toLedgerDeviceError(error);\n }\n}\n",
7
+ "import type {\n DeviceActionIntermediateValue,\n DeviceActionState,\n DeviceActionStatus,\n ExecuteDeviceActionReturnType,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { SwapKitError } from \"@swapkit/helpers\";\nimport { match } from \"ts-pattern\";\n\nconst DEVICE_ACTION_STATUS = {\n Completed: \"completed\" as DeviceActionStatus.Completed,\n Error: \"error\" as DeviceActionStatus.Error,\n Stopped: \"stopped\" as DeviceActionStatus.Stopped,\n} as const;\n\nexport const LEDGER_USER_INTERACTION_REQUIRED = {\n None: \"none\" as UserInteractionRequired.None,\n SignTransaction: \"sign-transaction\" as UserInteractionRequired.SignTransaction,\n VerifyAddress: \"verify-address\" as UserInteractionRequired.VerifyAddress,\n} as const;\n\nexport type LedgerDeviceActionState = DeviceActionState<unknown, unknown, DeviceActionIntermediateValue>;\nexport type LedgerDeviceActionStateHandler = (state: LedgerDeviceActionState) => void;\n\nconst USER_REFUSED_STATUS_WORDS = new Set([\"6985\", \"5501\"]);\n/**\n * Zondax-built apps (Cosmos, THORChain) reject a request on the device with COMMAND_NOT_ALLOWED. The Zcash app uses\n * the same word to refuse a request, so only the clients for the Zondax apps treat it as a user rejection.\n */\nexport const ZONDAX_USER_REFUSED_STATUS_WORDS: readonly string[] = [\"6986\"];\nconst LOCKED_STATUS_WORDS = new Set([\"5515\"]);\nconst WRONG_APP_STATUS_WORDS = new Set([\"6511\", \"6807\", \"6d00\", \"6e00\"]);\nconst DISCONNECTED_ERROR_TAGS = new Set([\n \"DeviceDisconnectedBeforeSendingApdu\",\n \"DeviceDisconnectedWhileSendingError\",\n \"DeviceNotRecognizedError\",\n \"DeviceSessionNotFound\",\n \"NoAccessibleDeviceError\",\n \"ReconnectionFailedError\",\n]);\n// LedgerJS transports (hw-transport-webhid, -webusb) reject an exchange cut off by an unplug with these errors. The\n// @ledgerhq packages advise matching on `name`, which also holds across duplicate copies of @ledgerhq/errors.\nconst DISCONNECTED_ERROR_NAMES = new Set([\"DisconnectedDevice\", \"DisconnectedDeviceDuringOperation\"]);\n// hw-app-cosmos turns the app's final 0x6986 on a signature into this @ledgerhq/errors class, which carries no word.\nconst USER_REFUSED_ERROR_NAMES = new Set([\"UserRefusedOnDevice\"]);\n// DMK nests causes in `originalError` and the LedgerJS bridge wraps once more, so real chains are two or three\n// levels deep; the bound stops a malformed or cyclic chain.\nconst MAX_NESTED_ERROR_DEPTH = 4;\nconst STATUS_WORD_PATTERN = /^(?:0x)?([0-9a-f]{4})$/i;\n\ntype DeviceErrorLike = {\n _tag?: unknown;\n errorCode?: unknown;\n message?: unknown;\n name?: unknown;\n originalError?: unknown;\n statusCode?: unknown;\n};\n\nexport interface LedgerDeviceErrorOptions {\n /** App-specific status words that also mean the user rejected the request on the device. */\n userRefusedStatusWords?: readonly string[];\n}\n\nfunction errorChainOf(error: unknown) {\n const errors: DeviceErrorLike[] = [];\n let current = error;\n\n while (errors.length < MAX_NESTED_ERROR_DEPTH && typeof current === \"object\" && current !== null) {\n const deviceError: DeviceErrorLike = current;\n errors.push(deviceError);\n current = deviceError.originalError;\n }\n\n return errors;\n}\n\n// DMK command errors carry the word as an `errorCode` string (the Cosmos signer kit keys its own table \"0x6986\");\n// hw-transport status errors carry it as a numeric `statusCode`.\nfunction statusWordOf({ errorCode, statusCode }: DeviceErrorLike) {\n const fromErrorCode = typeof errorCode === \"string\" ? STATUS_WORD_PATTERN.exec(errorCode)?.[1] : undefined;\n if (fromErrorCode) return fromErrorCode.toLowerCase();\n return typeof statusCode === \"number\" ? statusCode.toString(16).padStart(4, \"0\") : undefined;\n}\n\n/**\n * DMK rejects with plain tagged objects (and the LedgerJS bridge nests hw-app status errors inside\n * them), so callers could not tell a user rejection from a wrong app or a disconnected device.\n */\nexport function toLedgerDeviceError(error: unknown, { userRefusedStatusWords = [] }: LedgerDeviceErrorOptions = {}) {\n const errorChain = errorChainOf(error);\n // A SwapKitError thrown inside a bridged LedgerJS operation (input validation) already says what failed.\n const swapKitError = errorChain.find((nested): nested is SwapKitError => nested instanceof SwapKitError);\n if (swapKitError) return swapKitError;\n\n const errorTags = errorChain.flatMap(({ _tag }) => (typeof _tag === \"string\" ? [_tag] : []));\n const errorNames = errorChain.flatMap(({ name }) => (typeof name === \"string\" ? [name] : []));\n const statusWord = errorChain.map(statusWordOf).find((word) => word !== undefined);\n // The innermost cause says what failed; DMK and the bridge wrap it in generic \"device exchange\" messages.\n const message = errorChain\n .map((nested) => nested.message)\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .at(-1);\n const refusedStatusWords = new Set([...USER_REFUSED_STATUS_WORDS, ...userRefusedStatusWords]);\n\n const errorKey = match({ errorNames, errorTags, statusWord })\n .when(\n ({ errorNames, errorTags, statusWord }) =>\n errorTags.includes(\"RefusedByUserDAError\") ||\n errorNames.some((name) => USER_REFUSED_ERROR_NAMES.has(name)) ||\n (!!statusWord && refusedStatusWords.has(statusWord)),\n () => \"wallet_connection_rejected_by_user\" as const,\n )\n .when(\n ({ errorTags, statusWord }) =>\n errorTags.includes(\"DeviceLockedError\") || (!!statusWord && LOCKED_STATUS_WORDS.has(statusWord)),\n () => \"wallet_ledger_device_locked\" as const,\n )\n .when(\n ({ errorTags, statusWord }) =>\n errorTags.includes(\"UnsupportedApplicationDAError\") || (!!statusWord && WRONG_APP_STATUS_WORDS.has(statusWord)),\n () => \"wallet_ledger_app_not_open\" as const,\n )\n .when(\n ({ errorNames, errorTags }) =>\n errorTags.some((errorTag) => DISCONNECTED_ERROR_TAGS.has(errorTag)) ||\n errorNames.some((name) => DISCONNECTED_ERROR_NAMES.has(name)),\n () => \"wallet_ledger_connection_error\" as const,\n )\n .otherwise(() => \"wallet_ledger_transport_error\" as const);\n\n return new SwapKitError({ errorKey, info: { errorTag: errorTags[0], message, statusWord } }, error);\n}\n\n/**\n * `action` is a thunk because DMK throws, instead of returning an action, when it cannot start one (e.g.\n * DeviceSessionNotFound for a session it has dropped), and the signer kits call DMK synchronously. Calling it here\n * maps that throw like any other device error. Put only the device call inside it, or a plain error from building\n * the request is reported as a transport error.\n */\nexport function executeLedgerDeviceAction<\n Output,\n ActionError,\n IntermediateValue extends DeviceActionIntermediateValue,\n>({\n action,\n onDeviceActionState,\n userRefusedStatusWords,\n}: {\n action: () => ExecuteDeviceActionReturnType<Output, ActionError, IntermediateValue>;\n onDeviceActionState?: LedgerDeviceActionStateHandler;\n} & LedgerDeviceErrorOptions) {\n return new Promise<Output>((resolve, reject) => {\n let observable: ExecuteDeviceActionReturnType<Output, ActionError, IntermediateValue>[\"observable\"];\n try {\n observable = action().observable;\n } catch (error) {\n reject(toLedgerDeviceError(error, { userRefusedStatusWords }));\n return;\n }\n\n let settled = false;\n let subscription: { unsubscribe: () => void } | undefined;\n\n function settle(callback: () => void) {\n if (settled) return;\n settled = true;\n subscription?.unsubscribe();\n callback();\n }\n\n subscription = observable.subscribe({\n complete: () => {\n settle(() => reject(new SwapKitError(\"wallet_ledger_invalid_response\")));\n },\n error: (error) => {\n settle(() => reject(toLedgerDeviceError(error, { userRefusedStatusWords })));\n },\n next: (state) => {\n try {\n onDeviceActionState?.(state);\n } catch (error) {\n void error;\n }\n\n match(state)\n .with({ status: DEVICE_ACTION_STATUS.Completed }, ({ output }) => settle(() => resolve(output)))\n .with({ status: DEVICE_ACTION_STATUS.Error }, ({ error }) =>\n settle(() => reject(toLedgerDeviceError(error, { userRefusedStatusWords }))),\n )\n .with({ status: DEVICE_ACTION_STATUS.Stopped }, () =>\n settle(() => reject(new SwapKitError(\"wallet_ledger_connection_error\"))),\n )\n .otherwise(() => undefined);\n },\n });\n\n if (settled) subscription.unsubscribe();\n });\n}\n",
6
8
  "import { Chain, SwapKitError, WalletOption } from \"@swapkit/helpers\";\n\nimport type { getNearLedgerClient } from \"../clients/near\";\nimport type { SuiLedger } from \"../clients/sui\";\nimport type { TronLedger } from \"../clients/tron\";\nimport type { XRPLedger } from \"../clients/xrp\";\nimport type { LEDGER_SUPPORTED_CHAINS } from \"../index\";\nimport type { CosmosLedgerClients, EVMLedgerClients, UTXOLedgerClients } from \"../types\";\nimport type { getLedgerClient } from \"./getLedgerClient\";\n\nexport const getLedgerAddress = async <\n T extends (typeof LEDGER_SUPPORTED_CHAINS)[number],\n L extends Awaited<ReturnType<typeof getLedgerClient<T>>>,\n>({\n chain,\n ledgerClient,\n}: {\n chain: T;\n ledgerClient: L;\n}) => {\n if (!ledgerClient) return \"\";\n\n switch (chain) {\n case Chain.Cosmos:\n case Chain.THORChain: {\n return (ledgerClient as CosmosLedgerClients).connect();\n }\n\n case Chain.Ethereum:\n case Chain.BinanceSmartChain:\n case Chain.Avalanche:\n case Chain.Polygon:\n case Chain.Arbitrum:\n case Chain.Arc:\n case Chain.Berachain:\n case Chain.Optimism:\n case Chain.Base:\n case Chain.Aurora:\n case Chain.Gnosis:\n case Chain.Monad:\n case Chain.XLayer: {\n return (ledgerClient as EVMLedgerClients).getAddress();\n }\n\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n case Chain.Dash:\n case Chain.Dogecoin:\n case Chain.Litecoin:\n case Chain.Zcash: {\n const ledger = ledgerClient as UTXOLedgerClients;\n await ledger.connect();\n const address = await ledger.getAddress();\n\n return chain === Chain.BitcoinCash ? address.replace(\"bitcoincash:\", \"\") : address;\n }\n\n case Chain.Near: {\n return await (ledgerClient as Awaited<ReturnType<typeof getNearLedgerClient>>).getAddress();\n }\n\n case Chain.Ripple: {\n return (ledgerClient as Awaited<ReturnType<typeof XRPLedger>>).getAddress();\n }\n\n case Chain.Tron: {\n return (ledgerClient as Awaited<ReturnType<typeof TronLedger>>).getAddress();\n }\n\n case Chain.Sui: {\n return (ledgerClient as Awaited<ReturnType<typeof SuiLedger>>).connect();\n }\n\n default:\n throw new SwapKitError(\"wallet_chain_not_supported\", { chain, wallet: WalletOption.LEDGER });\n }\n};\n",
7
- "import type Transport from \"@ledgerhq/hw-transport\";\nimport { Chain, type DerivationPathArray, type EVMChain, SwapKitError, WalletOption } from \"@swapkit/helpers\";\n\nimport { CosmosLedger } from \"../clients/cosmos\";\nimport {\n ArbitrumLedger,\n ArcLedger,\n AuroraLedger,\n AvalancheLedger,\n BaseLedger,\n BerachainLedger,\n BinanceSmartChainLedger,\n EthereumLedger,\n GnosisLedger,\n MonadLedger,\n OptimismLedger,\n PolygonLedger,\n XLayerLedger,\n} from \"../clients/evm\";\nimport { getNearLedgerClient } from \"../clients/near\";\nimport { SuiLedger } from \"../clients/sui\";\nimport { THORChainLedger } from \"../clients/thorchain\";\nimport { TronLedger } from \"../clients/tron\";\nimport {\n BitcoinCashLedger,\n BitcoinLedger,\n DashLedger,\n DogecoinLedger,\n LitecoinLedger,\n ZcashLedger,\n} from \"../clients/utxo\";\nimport { XRPLedger } from \"../clients/xrp\";\n\ntype LedgerSignerMap = {\n [Chain.Arbitrum]: ReturnType<typeof ArbitrumLedger>;\n [Chain.Arc]: ReturnType<typeof ArcLedger>;\n [Chain.Aurora]: ReturnType<typeof AuroraLedger>;\n [Chain.Avalanche]: ReturnType<typeof AvalancheLedger>;\n [Chain.Base]: ReturnType<typeof BaseLedger>;\n [Chain.Berachain]: ReturnType<typeof BerachainLedger>;\n [Chain.BinanceSmartChain]: ReturnType<typeof BinanceSmartChainLedger>;\n [Chain.BitcoinCash]: ReturnType<typeof BitcoinCashLedger>;\n [Chain.Bitcoin]: ReturnType<typeof BitcoinLedger>;\n [Chain.Cosmos]: CosmosLedger;\n [Chain.Dash]: ReturnType<typeof DashLedger>;\n [Chain.Dogecoin]: ReturnType<typeof DogecoinLedger>;\n [Chain.Ethereum]: ReturnType<typeof EthereumLedger>;\n [Chain.Gnosis]: ReturnType<typeof GnosisLedger>;\n [Chain.Litecoin]: ReturnType<typeof LitecoinLedger>;\n [Chain.Monad]: ReturnType<typeof MonadLedger>;\n [Chain.Near]: ReturnType<typeof getNearLedgerClient>;\n [Chain.Optimism]: ReturnType<typeof OptimismLedger>;\n [Chain.Polygon]: ReturnType<typeof PolygonLedger>;\n [Chain.Ripple]: ReturnType<typeof XRPLedger>;\n [Chain.Sui]: ReturnType<typeof SuiLedger>;\n [Chain.THORChain]: THORChainLedger;\n [Chain.Tron]: ReturnType<typeof TronLedger>;\n [Chain.XLayer]: ReturnType<typeof XLayerLedger>;\n [Chain.Zcash]: ReturnType<typeof ZcashLedger>;\n};\n\ntype LedgerSupportedChain = keyof LedgerSignerMap;\n\nexport const getLedgerClient = async <T extends LedgerSupportedChain>({\n chain,\n derivationPath,\n transport,\n}: {\n chain: T;\n derivationPath?: DerivationPathArray;\n transport?: Transport;\n}): Promise<LedgerSignerMap[T]> => {\n const { match } = await import(\"ts-pattern\");\n\n return (\n match(chain as LedgerSupportedChain)\n .returnType<Promise<LedgerSignerMap[T]>>()\n .with(Chain.THORChain, () =>\n Promise.resolve(new THORChainLedger(derivationPath, transport) as LedgerSignerMap[T]),\n )\n .with(Chain.Cosmos, () => Promise.resolve(new CosmosLedger(derivationPath, transport) as LedgerSignerMap[T]))\n .with(Chain.Bitcoin, () => Promise.resolve(BitcoinLedger(derivationPath, transport) as LedgerSignerMap[T]))\n .with(Chain.BitcoinCash, () =>\n Promise.resolve(BitcoinCashLedger(derivationPath, transport) as LedgerSignerMap[T]),\n )\n .with(Chain.Dash, () => Promise.resolve(DashLedger(derivationPath, transport) as LedgerSignerMap[T]))\n .with(Chain.Dogecoin, () => Promise.resolve(DogecoinLedger(derivationPath, transport) as LedgerSignerMap[T]))\n .with(Chain.Litecoin, () => Promise.resolve(LitecoinLedger(derivationPath, transport) as LedgerSignerMap[T]))\n .with(Chain.Zcash, () => Promise.resolve(ZcashLedger(derivationPath, transport) as LedgerSignerMap[T]))\n .with(Chain.Ripple, () => Promise.resolve(XRPLedger(derivationPath, transport) as LedgerSignerMap[T]))\n .with(Chain.Tron, () => Promise.resolve(TronLedger(derivationPath, transport) as LedgerSignerMap[T]))\n .with(Chain.Sui, () => Promise.resolve(SuiLedger(derivationPath, transport) as LedgerSignerMap[T]))\n // @ts-expect-error\n .with(Chain.Near, () => {\n return Promise.resolve(getNearLedgerClient(derivationPath, transport));\n })\n .with(\n Chain.Arbitrum,\n Chain.Arc,\n Chain.Aurora,\n Chain.Avalanche,\n Chain.Berachain,\n Chain.BinanceSmartChain,\n Chain.Ethereum,\n Chain.Gnosis,\n Chain.Monad,\n Chain.Optimism,\n Chain.Polygon,\n Chain.Base,\n Chain.XLayer,\n async () => {\n const { getProvider } = await import(\"@swapkit/toolboxes/evm\");\n const params = { derivationPath, provider: await getProvider(chain as EVMChain), transport };\n\n return match(chain as Chain)\n .with(Chain.BinanceSmartChain, () => BinanceSmartChainLedger(params) as LedgerSignerMap[T])\n .with(Chain.Avalanche, () => AvalancheLedger(params) as LedgerSignerMap[T])\n .with(Chain.Arbitrum, () => ArbitrumLedger(params) as LedgerSignerMap[T])\n .with(Chain.Arc, () => ArcLedger(params) as LedgerSignerMap[T])\n .with(Chain.Berachain, () => BerachainLedger(params) as LedgerSignerMap[T])\n .with(Chain.Optimism, () => OptimismLedger(params) as LedgerSignerMap[T])\n .with(Chain.Polygon, () => PolygonLedger(params) as LedgerSignerMap[T])\n .with(Chain.Base, () => BaseLedger(params) as LedgerSignerMap[T])\n .with(Chain.Aurora, () => AuroraLedger(params) as LedgerSignerMap[T])\n .with(Chain.Gnosis, () => GnosisLedger(params) as LedgerSignerMap[T])\n .with(Chain.Monad, () => MonadLedger(params) as LedgerSignerMap[T])\n .with(Chain.XLayer, () => XLayerLedger(params) as LedgerSignerMap[T])\n .otherwise(() => EthereumLedger(params) as LedgerSignerMap[T]);\n },\n )\n .otherwise(() => {\n throw new SwapKitError(\"wallet_chain_not_supported\", { chain, wallet: WalletOption.LEDGER });\n })\n );\n};\n",
8
- "import type Transport from \"@ledgerhq/hw-transport\";\nimport {\n type DerivationPathArray,\n derivationPathToString,\n NetworkDerivationPath,\n SwapKitError,\n} from \"@swapkit/helpers\";\nimport { CosmosLedgerInterface } from \"../interfaces/CosmosLedgerInterface\";\n\nexport class CosmosLedger extends CosmosLedgerInterface {\n private pubKey: string | null = null;\n\n derivationPath: string;\n\n constructor(derivationPath: DerivationPathArray = NetworkDerivationPath.GAIA, transport?: Transport) {\n super(transport);\n this.chain = \"cosmos\";\n this.derivationPath = derivationPathToString(derivationPath);\n }\n\n connect = async () => {\n await this.checkOrCreateTransportAndLedger(true);\n const { publicKey, address } = await this.getAddressAndPubKey();\n\n this.pubKey = Buffer.from(publicKey, \"hex\").toString(\"base64\");\n\n return address;\n };\n\n getAddressAndPubKey = async () => {\n await this.checkOrCreateTransportAndLedger(true);\n\n const response = await this.ledgerApp.getAddress(this.derivationPath, this.chain);\n\n return response;\n };\n\n signTransaction = async (rawTx: string, sequence = \"0\") => {\n await this.checkOrCreateTransportAndLedger(true);\n\n const { return_code, error_message, signature } = await this.ledgerApp.sign(this.derivationPath, rawTx);\n\n if (!this.pubKey) throw new SwapKitError(\"wallet_ledger_pubkey_not_found\");\n\n this.validateResponse(return_code, error_message);\n\n return [{ pub_key: { type: \"tendermint/PubKeySecp256k1\", value: this.pubKey }, sequence, signature }];\n };\n\n signAmino = async (signerAddress: string, signDoc: any): Promise<any> => {\n await this.checkOrCreateTransportAndLedger(true);\n\n const accounts = await this.getAccounts();\n const accountIndex = accounts.findIndex((account) => account.address === signerAddress);\n\n if (accountIndex === -1) {\n throw new SwapKitError(\"wallet_ledger_address_not_found\", { address: signerAddress });\n }\n\n const importedAmino = await import(\"@cosmjs/amino\");\n const encodeSecp256k1Signature =\n importedAmino.encodeSecp256k1Signature ?? importedAmino.default?.encodeSecp256k1Signature;\n const serializeSignDoc = importedAmino.serializeSignDoc ?? importedAmino.default?.serializeSignDoc;\n const importedCrypto = await import(\"@cosmjs/crypto\");\n const Secp256k1Signature = importedCrypto.Secp256k1Signature ?? importedCrypto.default?.Secp256k1Signature;\n\n const message = serializeSignDoc(signDoc);\n const signature = await this.ledgerApp.sign(this.derivationPath, message);\n\n this.validateResponse(signature.return_code, signature.error_message);\n\n const secpSignature = Secp256k1Signature.fromDer(signature.signature).toFixedLength();\n\n return { signature: encodeSecp256k1Signature(accounts[0].pubkey, secpSignature), signed: signDoc };\n };\n\n getAccounts = async () => {\n await this.checkOrCreateTransportAndLedger(true);\n\n const addressAndPubKey = await this.getAddressAndPubKey();\n return [\n { address: addressAndPubKey.address, algo: \"secp256k1\", pubkey: Buffer.from(addressAndPubKey.publicKey, \"hex\") },\n ] as any[];\n };\n}\n",
9
- "import type Transport from \"@ledgerhq/hw-transport\";\nimport { type DerivationPathArray, LedgerErrorCode, NetworkDerivationPath, SwapKitError } from \"@swapkit/helpers\";\n\nimport { THORChainApp } from \"../clients/thorchain/lib\";\nimport { getLedgerTransport } from \"../helpers/getLedgerTransport\";\n\nexport abstract class CosmosLedgerInterface {\n ledgerTimeout = 50000;\n derivationPath: DerivationPathArray | string = NetworkDerivationPath.GAIA;\n transport: any;\n ledgerApp: any;\n chain: \"thor\" | \"cosmos\" = \"thor\";\n\n private readonly injectedTransport?: Transport;\n\n constructor(transport?: Transport) {\n this.injectedTransport = transport;\n if (transport) this.transport = transport;\n }\n\n checkOrCreateTransportAndLedger = async (forceReconnect = false) => {\n if (!forceReconnect && this.transport && this.ledgerApp) return;\n\n try {\n // Consumer owns the lifecycle of an injected transport, so forceReconnect\n // only refreshes ledgerApp — the transport itself stays as passed in.\n const needsNewTransport = !this.transport || (forceReconnect && !this.injectedTransport);\n if (needsNewTransport) {\n this.transport = this.injectedTransport ?? (await getLedgerTransport());\n }\n\n switch (this.chain) {\n case \"thor\": {\n this.ledgerApp = forceReconnect || !this.ledgerApp ? new THORChainApp(this.transport) : this.ledgerApp;\n\n break;\n }\n\n case \"cosmos\": {\n const CosmosApp = (await import(\"@ledgerhq/hw-app-cosmos\")).default;\n this.ledgerApp = forceReconnect || !this.ledgerApp ? new CosmosApp(this.transport) : this.ledgerApp;\n }\n }\n\n return this.ledgerApp;\n } catch (error: unknown) {\n throw new SwapKitError(\"wallet_ledger_connection_error\", error);\n }\n };\n\n validateResponse = (errorCode: LedgerErrorCode, message?: string) => {\n switch (errorCode) {\n case LedgerErrorCode.NoError:\n return;\n\n case LedgerErrorCode.LockedDevice:\n throw new SwapKitError(\"wallet_ledger_device_locked\", { message: `Ledger is locked: ${message}` });\n\n case LedgerErrorCode.TC_NotFound:\n throw new SwapKitError(\"wallet_ledger_device_not_found\");\n\n default: {\n break;\n }\n }\n };\n}\n",
10
- "import type Transport from \"@ledgerhq/hw-transport\";\nimport { SwapKitError } from \"@swapkit/helpers\";\n\nimport {\n CHUNK_SIZE,\n CLA,\n ERROR_CODE,\n errorCodeToString,\n getVersion,\n INS,\n P1_VALUES,\n P2_VALUES,\n processErrorResponse,\n} from \"./common\";\nimport {\n publicKeyv1,\n publicKeyv2,\n serializePathv1,\n serializePathv2,\n signSendChunkv1,\n signSendChunkv2,\n} from \"./helpers\";\n\nexport class THORChainApp {\n transport: Transport;\n versionResponse: any;\n\n constructor(transport: any) {\n if (!transport) {\n throw new SwapKitError(\"wallet_ledger_transport_not_defined\");\n }\n\n this.transport = transport;\n }\n\n static serializeHRP(hrp: string) {\n if (hrp == null || hrp.length < 3 || hrp.length > 83) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", { reason: \"Invalid HRP\" });\n }\n const buf = Buffer.alloc(1 + hrp.length);\n buf.writeUInt8(hrp.length, 0);\n buf.write(hrp, 1);\n return buf;\n }\n\n async serializePath(path: number[]) {\n this.versionResponse = await getVersion(this.transport);\n\n if (this.versionResponse.return_code !== ERROR_CODE.NoError) {\n throw this.versionResponse;\n }\n\n switch (this.versionResponse.major) {\n case 1:\n return serializePathv1(path);\n case 2:\n return serializePathv2(path);\n default:\n return Buffer.alloc(0);\n }\n }\n\n async signGetChunks(path: number[], buffer: Buffer) {\n const serializedPath = await this.serializePath(path);\n\n const chunks = [];\n chunks.push(serializedPath);\n\n for (let i = 0; i < buffer.length; i += CHUNK_SIZE) {\n let end = i + CHUNK_SIZE;\n if (i > buffer.length) {\n end = buffer.length;\n }\n chunks.push(buffer.slice(i, end));\n }\n\n return chunks;\n }\n\n async getVersion() {\n try {\n this.versionResponse = await getVersion(this.transport);\n return this.versionResponse;\n } catch (e) {\n return processErrorResponse(e);\n }\n }\n\n appInfo() {\n return this.transport.send(0xb0, 0x01, 0, 0).then((response: any) => {\n const returnCode = response.readUInt16BE(response.length - 2);\n\n let appName = \"\";\n let appVersion = \"\";\n let flagLen = 0;\n let flagsValue = 0;\n\n if (response[0] !== 1) {\n // Ledger responds with format ID 1. There is no spec for any format != 1\n return { error_message: \"response format ID not recognized\", return_code: 0x9001 };\n }\n\n const appNameLen = response[1];\n appName = response.slice(2, 2 + appNameLen).toString(\"ascii\");\n let idx = 2 + appNameLen;\n const appVersionLen = response[idx];\n idx += 1;\n appVersion = response.slice(idx, idx + appVersionLen).toString(\"ascii\");\n idx += appVersionLen;\n const appFlagsLen = response[idx];\n idx += 1;\n flagLen = appFlagsLen;\n flagsValue = response[idx];\n\n return {\n appName,\n appVersion,\n error_message: errorCodeToString(returnCode),\n flag_onboarded: (flagsValue & 4) !== 0,\n flag_pin_validated: (flagsValue & 128) !== 0,\n flag_recovery: (flagsValue & 1) !== 0,\n flag_signed_mcu_code: (flagsValue & 2) !== 0,\n flagLen,\n flagsValue,\n return_code: returnCode,\n };\n }, processErrorResponse);\n }\n\n deviceInfo() {\n return this.transport\n .send(0xe0, 0x01, 0, 0, Buffer.from([]), [ERROR_CODE.NoError, 0x6e00])\n .then((response: any) => {\n const errorCodeData = response.slice(-2);\n const returnCode = errorCodeData[0] * 256 + errorCodeData[1];\n\n if (returnCode === 0x6e00) {\n return { error_message: \"This command is only available in the Dashboard\", return_code: returnCode };\n }\n\n const targetId = response.slice(0, 4).toString(\"hex\");\n\n let pos = 4;\n const secureElementVersionLen = response[pos];\n pos += 1;\n const seVersion = response.slice(pos, pos + secureElementVersionLen).toString();\n pos += secureElementVersionLen;\n\n const flagsLen = response[pos];\n pos += 1;\n const flag = response.slice(pos, pos + flagsLen).toString(\"hex\");\n pos += flagsLen;\n\n const mcuVersionLen = response[pos];\n pos += 1;\n // Patch issue in mcu version\n let tmp = response.slice(pos, pos + mcuVersionLen);\n if (tmp[mcuVersionLen - 1] === 0) {\n tmp = response.slice(pos, pos + mcuVersionLen - 1);\n }\n const mcuVersion = tmp.toString();\n\n return {\n error_message: errorCodeToString(returnCode),\n flag,\n mcuVersion,\n return_code: returnCode,\n seVersion,\n // //\n targetId,\n };\n }, processErrorResponse);\n }\n\n async publicKey(path: number[]) {\n try {\n const serializedPath = await this.serializePath(path);\n\n switch (this.versionResponse.major) {\n case 1:\n return publicKeyv1(this, serializedPath);\n case 2: {\n const data = Buffer.concat([THORChainApp.serializeHRP(\"thor\"), serializedPath]);\n return publicKeyv2(this, data);\n }\n default:\n return { error_message: \"App Version is not supported\", return_code: 0x6400 };\n }\n } catch (e) {\n return processErrorResponse(e);\n }\n }\n\n async getAddressAndPubKey(path: number[], hrp: string, showInDevice = false) {\n try {\n const serializedPath = await this.serializePath(path);\n const data = Buffer.concat([THORChainApp.serializeHRP(hrp), serializedPath]);\n const response = await this.transport.send(\n CLA,\n INS.GET_ADDR_SECP256K1,\n showInDevice ? P1_VALUES.SHOW_ADDRESS_IN_DEVICE : P1_VALUES.ONLY_RETRIEVE,\n 0,\n data,\n [ERROR_CODE.NoError],\n );\n\n const compressedPk = Buffer.from(response.slice(0, 33));\n const bech32Address = Buffer.from(response.slice(33, -2)).toString();\n const returnCode = response.readUInt16BE(response.length - 2);\n\n return {\n bech32_address: bech32Address,\n compressed_pk: compressedPk,\n error_message: errorCodeToString(returnCode),\n return_code: returnCode,\n };\n } catch (err) {\n return processErrorResponse(err);\n }\n }\n\n showAddressAndPubKey(path: number[], hrp: string) {\n return this.getAddressAndPubKey(path, hrp, true);\n }\n\n signSendChunk(chunkIdx: number, chunkNum: number, chunk: Buffer, txType = P2_VALUES.JSON) {\n switch (this.versionResponse.major) {\n case 1:\n return signSendChunkv1(this, chunkIdx, chunkNum, chunk, txType);\n case 2:\n return signSendChunkv2(this, chunkIdx, chunkNum, chunk, txType);\n default:\n return { error_message: \"App Version is not supported\", return_code: 0x6400 };\n }\n }\n\n async sign(path: number[], message: string, txType = P2_VALUES.JSON) {\n const buffer = Buffer.from(message);\n let chunks: Buffer[] = [];\n let response: any;\n try {\n chunks = await this.signGetChunks(path, buffer);\n response = await this.signSendChunk(1, chunks.length, chunks[0] as Buffer, txType);\n } catch (error) {\n processErrorResponse(error);\n }\n let result = { error_message: response.error_message, return_code: response.return_code, signature: null };\n\n for (let i = 1; i < chunks.length; i += 1) {\n result = await this.signSendChunk(1 + i, chunks.length, chunks[i] as Buffer, txType);\n if (result.return_code !== ERROR_CODE.NoError) {\n break;\n }\n }\n\n return { error_message: result.error_message, return_code: result.return_code, signature: result.signature };\n }\n}\n",
11
- "export const CLA = 0x55;\nexport const CHUNK_SIZE = 250;\nexport const APP_KEY = \"CSM\";\n\nexport const INS = {\n GET_ADDR_SECP256K1: 0x04,\n GET_VERSION: 0x00,\n INS_PUBLIC_KEY_SECP256K1: 0x01, // Obsolete\n SIGN_SECP256K1: 0x02,\n};\n\nexport const PAYLOAD_TYPE = { ADD: 0x01, INIT: 0x00, LAST: 0x02 };\n\nexport const P1_VALUES = { ONLY_RETRIEVE: 0x00, SHOW_ADDRESS_IN_DEVICE: 0x01 };\n\nexport const P2_VALUES = { JSON: 0x0 };\n\nexport const ERROR_CODE = { NoError: 0x9000 };\n\nconst ERROR_DESCRIPTION: any = {\n 1: \"U2F: Unknown\",\n 2: \"U2F: Bad request\",\n 3: \"U2F: Configuration unsupported\",\n 4: \"U2F: Device Ineligible\",\n 5: \"U2F: Timeout\",\n 14: \"Timeout\",\n 25600: \"Execution Error\",\n 26368: \"Wrong Length\",\n 26626: \"Error deriving keys\",\n 27010: \"Empty Buffer\",\n 27011: \"Output buffer too small\",\n 27012: \"Data is invalid\",\n 27013: \"Conditions not satisfied\",\n 27014: \"Transaction rejected\",\n 27264: \"Bad key handle\",\n 27392: \"Invalid P1/P2\",\n 27904: \"Instruction not supported\",\n 28160: \"App does not seem to be open\",\n 28416: \"Unknown error\",\n 28417: \"Sign/verify error\",\n 36864: \"No errors\",\n 36865: \"Device is busy\",\n};\n\nexport function errorCodeToString(statusCode: number) {\n if (statusCode in ERROR_DESCRIPTION) return ERROR_DESCRIPTION[statusCode];\n return `Unknown Status Code: ${statusCode}`;\n}\n\nfunction isDict(v: any) {\n return typeof v === \"object\" && v !== null && !Array.isArray(v) && !(v instanceof Date);\n}\n\nexport function processErrorResponse(response: any) {\n if (response) {\n if (isDict(response)) {\n if (Object.hasOwn(response, \"statusCode\")) {\n return { error_message: errorCodeToString(response.statusCode), return_code: response.statusCode };\n }\n\n if (Object.hasOwn(response, \"return_code\") && Object.hasOwn(response, \"error_message\")) {\n return response;\n }\n }\n return { error_message: response.toString(), return_code: 0xffff };\n }\n\n return { error_message: response.toString(), return_code: 0xffff };\n}\n\nexport function getVersion(transport: any) {\n return transport.send(CLA, INS.GET_VERSION, 0, 0).then((response: any) => {\n const errorCodeData = response.slice(-2);\n const returnCode = errorCodeData[0] * 256 + errorCodeData[1];\n\n let targetId = 0;\n if (response.length >= 9) {\n targetId = (response[5] << 24) + (response[6] << 16) + (response[7] << 8) + (response[8] << 0);\n }\n\n return {\n device_locked: response[4] === 1,\n error_message: errorCodeToString(returnCode),\n major: response[1],\n minor: response[2],\n patch: response[3],\n return_code: returnCode,\n target_id: targetId.toString(16),\n // ///\n test_mode: response[0] !== 0,\n };\n }, processErrorResponse);\n}\n",
12
- "import { SwapKitError } from \"@swapkit/helpers\";\nimport { CLA, ERROR_CODE, errorCodeToString, INS, P2_VALUES, PAYLOAD_TYPE, processErrorResponse } from \"./common\";\n\nexport function serializePathv1(path: number[]) {\n if (path == null || path.length < 3) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", { reason: \"Path too short\" });\n }\n if (path.length > 10) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", { reason: \"Path too long\" });\n }\n const buf = Buffer.alloc(1 + 4 * path.length);\n buf.writeUInt8(path.length, 0);\n for (let i = 0; i < path.length; i += 1) {\n let v = path[i] || 0;\n if (i < 3) {\n // eslint-disable-next-line no-bitwise\n v |= 0x80000000; // Harden\n }\n buf.writeInt32LE(v, 1 + i * 4);\n }\n return buf;\n}\n\nexport function signSendChunkv1(app: any, chunkIdx: number, _chunkNum: number, chunk: Buffer, txType = P2_VALUES.JSON) {\n return app.transport\n .send(CLA, INS.SIGN_SECP256K1, chunkIdx, txType, chunk, [ERROR_CODE.NoError, 0x6984, 0x6a80])\n .then((response: any) => {\n const errorCodeData = response.slice(-2);\n const returnCode = errorCodeData[0] * 256 + errorCodeData[1];\n let errorMessage = errorCodeToString(returnCode);\n\n if (returnCode === 0x6a80 || returnCode === 0x6984) {\n errorMessage = `${errorMessage} : ${response.slice(0, response.length - 2).toString(\"ascii\")}`;\n }\n\n let signature: any = null;\n if (response.length > 2) {\n signature = response.slice(0, response.length - 2);\n }\n\n return { error_message: errorMessage, return_code: returnCode, signature };\n }, processErrorResponse);\n}\n\nfunction compressPublicKey(publicKey: Buffer) {\n if (publicKey.length !== 65) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n reason: \"decompressed public key length should be 65 bytes\",\n });\n }\n const y = publicKey.slice(33, 65);\n\n // @ts-expect-error\n const z = Buffer.from([2 + (y[y.length - 1] & 1)]);\n return Buffer.concat([z, publicKey.slice(1, 33)]);\n}\n\nexport function publicKeyv1(app: any, data: Buffer) {\n return app.transport\n .send(CLA, INS.INS_PUBLIC_KEY_SECP256K1, 0, 0, data, [ERROR_CODE.NoError])\n .then((response: any) => {\n const errorCodeData = response.slice(-2);\n const returnCode = errorCodeData[0] * 256 + errorCodeData[1];\n const pk = Buffer.from(response.slice(0, 65));\n\n return {\n compressed_pk: compressPublicKey(pk),\n error_message: errorCodeToString(returnCode),\n pk,\n return_code: returnCode,\n };\n }, processErrorResponse);\n}\n\nexport function serializePathv2(path: number[]) {\n if (!path || path.length !== 5) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", { reason: \"Path must be exactly 5 elements\" });\n }\n\n const buf = Buffer.alloc(20);\n // @ts-expect-error\n buf.writeUInt32LE(0x80000000 + path[0], 0);\n // @ts-expect-error\n buf.writeUInt32LE(0x80000000 + path[1], 4);\n // @ts-expect-error\n buf.writeUInt32LE(0x80000000 + path[2], 8);\n // @ts-expect-error\n buf.writeUInt32LE(path[3], 12);\n // @ts-expect-error\n buf.writeUInt32LE(path[4], 16);\n\n return buf;\n}\n\nexport function signSendChunkv2(app: any, chunkIdx: number, chunkNum: number, chunk: Buffer, txType = P2_VALUES.JSON) {\n let payloadType = PAYLOAD_TYPE.ADD;\n if (chunkIdx === 1) {\n payloadType = PAYLOAD_TYPE.INIT;\n }\n if (chunkIdx === chunkNum) {\n payloadType = PAYLOAD_TYPE.LAST;\n }\n\n return signSendChunkv1(app, payloadType, 0, chunk, txType);\n}\n\nexport function publicKeyv2(app: any, data: Buffer) {\n return app.transport.send(CLA, INS.GET_ADDR_SECP256K1, 0, 0, data, [ERROR_CODE.NoError]).then((response: any) => {\n const errorCodeData = response.slice(-2);\n const returnCode = errorCodeData[0] * 256 + errorCodeData[1];\n const compressedPk = Buffer.from(response.slice(0, 33));\n\n return {\n compressed_pk: compressedPk,\n error_message: errorCodeToString(returnCode),\n pk: \"OBSOLETE PROPERTY\",\n return_code: returnCode,\n };\n }, processErrorResponse);\n}\n",
13
- "import type EthereumApp from \"@ledgerhq/hw-app-eth\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport {\n ChainId,\n type DerivationPathArray,\n derivationPathToString,\n NetworkDerivationPath,\n SwapKitError,\n} from \"@swapkit/helpers\";\nimport {\n AbstractSigner,\n type Provider,\n type TransactionRequest,\n type TypedDataDomain,\n type TypedDataField,\n} from \"ethers\";\n\nimport { getLedgerTransport } from \"../helpers/getLedgerTransport\";\nimport {\n fetchLedgerNetworkCertificate,\n fetchLedgerNetworkDescriptor,\n provideLedgerCertificate,\n provideLedgerNetworkInformation,\n} from \"../helpers/ledgerNetworkInfo\";\n\nconst LEDGER_INCORRECT_DATA = 0x6a80;\n\nconst ARC_CHAIN_ID = Number(ChainId.Arc);\n\ntype LedgerTransactionResolution = Awaited<\n ReturnType<typeof import(\"@ledgerhq/hw-app-eth\")[\"ledgerService\"][\"resolveTransaction\"]>\n>;\n\nfunction isLedgerIncorrectDataError(error: unknown) {\n return (\n error instanceof Error &&\n \"statusCode\" in error &&\n (error as { statusCode: number }).statusCode === LEDGER_INCORRECT_DATA\n );\n}\n\nfunction hasClearSigningPayload(resolution: LedgerTransactionResolution | null) {\n return Object.values(resolution ?? {}).some((entries) => Array.isArray(entries) && entries.length);\n}\n\nfunction parseLedgerSignatureV(v: number | string) {\n if (typeof v === \"number\") return v;\n\n const hex = v.startsWith(\"0x\") ? v.slice(2) : v;\n return Number.parseInt(hex || \"0\", 16);\n}\n\nclass EVMLedgerInterface extends AbstractSigner {\n chainId: ChainId = ChainId.Ethereum;\n derivationPath = \"\";\n ledgerApp: InstanceType<typeof EthereumApp> | null = null;\n ledgerTimeout = 50000;\n private transport?: Transport;\n private readonly injectedTransport?: Transport;\n private arcNetworkRegistered = false;\n\n constructor({\n provider,\n derivationPath = NetworkDerivationPath.OP,\n chainId = ChainId.Optimism,\n transport,\n }: { provider: Provider; derivationPath?: DerivationPathArray | string; chainId?: ChainId; transport?: Transport }) {\n super(provider);\n\n this.chainId = chainId || ChainId.Ethereum;\n this.derivationPath = typeof derivationPath === \"string\" ? derivationPath : derivationPathToString(derivationPath);\n this.injectedTransport = transport;\n\n Object.defineProperty(this, \"provider\", { enumerable: true, value: provider || null, writable: false });\n }\n\n connect = (provider: Provider) =>\n new EVMLedgerInterface({\n chainId: this.chainId,\n derivationPath: this.derivationPath,\n provider,\n transport: this.transport ?? this.injectedTransport,\n });\n\n checkOrCreateTransportAndLedger = async () => {\n await this.createTransportAndLedger();\n };\n\n createTransportAndLedger = async () => {\n if (this.ledgerApp) return;\n\n this.transport ||= this.injectedTransport ?? (await getLedgerTransport());\n const EthereumApp = (await import(\"@ledgerhq/hw-app-eth\")).default;\n\n this.ledgerApp = new EthereumApp(this.transport);\n };\n\n getAddress = async () => {\n const response = await this.getAddressAndPubKey();\n if (!response) throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n return response.address;\n };\n\n getAddressAndPubKey = async () => {\n await this.createTransportAndLedger();\n return this.ledgerApp?.getAddress(this.derivationPath);\n };\n\n showAddressAndPubKey = async () => {\n await this.createTransportAndLedger();\n return this.ledgerApp?.getAddress(this.derivationPath, true);\n };\n\n signMessage = async (messageHex: string) => {\n const { Signature } = await import(\"ethers\");\n await this.createTransportAndLedger();\n\n const sig = await this.ledgerApp?.signPersonalMessage(this.derivationPath, messageHex);\n\n if (!sig) throw new SwapKitError(\"wallet_ledger_signing_error\");\n\n sig.r = `0x${sig.r}`;\n sig.s = `0x${sig.s}`;\n return Signature.from(sig).serialized;\n };\n\n sendTransaction = async (tx: TransactionRequest): Promise<any> => {\n if (!this.provider) throw new SwapKitError(\"wallet_ledger_no_provider\");\n\n const signedTxHex = await this.signTransaction(tx);\n\n return await this.provider.broadcastTransaction(signedTxHex);\n };\n\n signTypedData = async (\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>,\n explicitPrimaryType?: string,\n ) => {\n const { buildEIP712DomainType } = await import(\"@swapkit/toolboxes/evm\");\n const { Signature, TypedDataEncoder } = await import(\"ethers\");\n await this.createTransportAndLedger();\n\n const { EIP712Domain: _, ...filteredTypes } = types;\n const primaryType = explicitPrimaryType ?? TypedDataEncoder.from(filteredTypes).primaryType;\n\n let sig: { v: number; s: string; r: string } | undefined;\n\n try {\n sig = await this.ledgerApp?.signEIP712Message(this.derivationPath, {\n domain: domain as Record<string, unknown>,\n message: value,\n primaryType,\n types: { EIP712Domain: buildEIP712DomainType(domain), ...filteredTypes },\n });\n } catch (error) {\n const isLedgerDeviceError = error instanceof Error && \"statusCode\" in error;\n if (!isLedgerDeviceError || (isLedgerDeviceError && (error as { statusCode: number }).statusCode === 0x6985)) {\n throw error;\n }\n\n const domainSeparator = TypedDataEncoder.hashDomain(domain).slice(2);\n const messageHash = TypedDataEncoder.from(filteredTypes).hash(value).slice(2);\n\n sig = await this.ledgerApp?.signEIP712HashedMessage(this.derivationPath, domainSeparator, messageHash);\n }\n\n if (!sig) throw new SwapKitError(\"wallet_ledger_signing_error\");\n\n sig.r = `0x${sig.r}`;\n sig.s = `0x${sig.s}`;\n return Signature.from(sig).serialized;\n };\n\n signTransaction = async (tx: TransactionRequest) => {\n const { Transaction } = await import(\"ethers\");\n await this.createTransportAndLedger();\n\n const nonce = tx.nonce ?? undefined;\n const transactionCount =\n nonce === undefined ? await this.provider?.getTransactionCount(tx.from || (await this.getAddress())) : undefined;\n\n const baseTx = {\n chainId: tx.chainId || this.chainId,\n data: tx.data,\n gasLimit: tx.gasLimit,\n ...(tx.gasPrice && { gasPrice: tx.gasPrice }),\n ...(!tx.gasPrice &&\n tx.maxFeePerGas && { maxFeePerGas: tx.maxFeePerGas, maxPriorityFeePerGas: tx.maxPriorityFeePerGas }),\n nonce: nonce !== undefined ? Number(nonce.toString()) : transactionCount,\n to: tx.to?.toString(),\n type: tx.type && !Number.isNaN(tx.type) ? tx.type : tx.maxFeePerGas ? 2 : 0,\n value: tx.value,\n };\n\n // ledger expects the tx to be serialized without the 0x prefix\n const unsignedTx = Transaction.from(baseTx).unsignedSerialized.slice(2);\n\n const { ledgerService } = await import(\"@ledgerhq/hw-app-eth\");\n\n const chainId = Number(baseTx.chainId);\n const isArc = chainId === ARC_CHAIN_ID;\n\n const resolution = await ledgerService\n .resolveTransaction(unsignedTx, {}, { erc20: true, externalPlugins: true })\n .catch((error) => {\n if (!isArc) throw error;\n\n console.warn(\"Ledger: could not fetch clear-signing metadata for Arc, signing blind\");\n\n return null;\n });\n\n if (isArc && !this.arcNetworkRegistered) await this.registerNetworkOnDevice(chainId);\n\n const signature = await this.signWithLedgerApp(unsignedTx, resolution, chainId);\n\n if (!signature) throw new SwapKitError(\"wallet_ledger_signing_error\");\n\n const { r, s, v } = signature;\n\n return Transaction.from({ ...baseTx, signature: { r: `0x${r}`, s: `0x${s}`, v: parseLedgerSignatureV(v) } })\n .serialized;\n };\n\n private signWithLedgerApp = async (\n unsignedTx: string,\n resolution: LedgerTransactionResolution | null,\n chainId: number,\n ) => {\n try {\n return await this.ledgerApp?.signTransaction(this.derivationPath, unsignedTx, resolution);\n } catch (error) {\n const canSignBlind =\n chainId === ARC_CHAIN_ID && isLedgerIncorrectDataError(error) && hasClearSigningPayload(resolution);\n\n if (!canSignBlind) throw error;\n\n console.warn(\"Ledger: the app rejected the Arc metadata, signing blind\");\n\n return await this.ledgerApp?.signTransaction(this.derivationPath, unsignedTx, null);\n }\n };\n\n private registerNetworkOnDevice = async (chainId: number) => {\n const deviceModelId = this.transport?.deviceModel?.id;\n\n if (!(this.transport && deviceModelId)) return;\n\n try {\n const [descriptor, certificate] = await Promise.all([\n fetchLedgerNetworkDescriptor(chainId, deviceModelId),\n fetchLedgerNetworkCertificate(deviceModelId),\n ]);\n\n if (!descriptor) return;\n\n if (certificate) await provideLedgerCertificate(this.transport, certificate);\n\n await provideLedgerNetworkInformation(this.transport, descriptor);\n\n this.arcNetworkRegistered = true;\n } catch {\n // the app will reject the metadata and signWithLedgerApp falls back to blind signing\n }\n };\n}\n\ntype LedgerParams = { provider: Provider; derivationPath?: DerivationPathArray; transport?: Transport };\n\nexport const ArbitrumLedger = (params: LedgerParams) =>\n new EVMLedgerInterface({ ...params, chainId: ChainId.Arbitrum });\nexport const ArcLedger = (params: LedgerParams) => new EVMLedgerInterface({ ...params, chainId: ChainId.Arc });\nexport const AuroraLedger = (params: LedgerParams) => new EVMLedgerInterface({ ...params, chainId: ChainId.Aurora });\nexport const AvalancheLedger = (params: LedgerParams) =>\n new EVMLedgerInterface({ ...params, chainId: ChainId.Avalanche });\nexport const BaseLedger = (params: LedgerParams) => new EVMLedgerInterface({ ...params, chainId: ChainId.Base });\nexport const EthereumLedger = (params: LedgerParams) =>\n new EVMLedgerInterface({ ...params, chainId: ChainId.Ethereum });\nexport const GnosisLedger = (params: LedgerParams) => new EVMLedgerInterface({ ...params, chainId: ChainId.Gnosis });\nexport const OptimismLedger = (params: LedgerParams) =>\n new EVMLedgerInterface({ ...params, chainId: ChainId.Optimism });\nexport const PolygonLedger = (params: LedgerParams) => new EVMLedgerInterface({ ...params, chainId: ChainId.Polygon });\nexport const BinanceSmartChainLedger = (params: LedgerParams) =>\n new EVMLedgerInterface({ ...params, chainId: ChainId.BinanceSmartChain });\nexport const MonadLedger = (params: LedgerParams) => new EVMLedgerInterface({ ...params, chainId: ChainId.Monad });\nexport const XLayerLedger = (params: LedgerParams) => new EVMLedgerInterface({ ...params, chainId: ChainId.XLayer });\nexport const BerachainLedger = (params: LedgerParams) =>\n new EVMLedgerInterface({ ...params, chainId: ChainId.Berachain });\n",
14
- "import type Transport from \"@ledgerhq/hw-transport\";\n\nconst LEDGER_CAL_SERVICE_URL = \"https://crypto-assets-service.api.ledger.com/v1\";\n\nconst LEDGER_DEVICE_TO_CAL_MODEL: Record<string, string> = {\n apex: \"apexp\",\n europa: \"flex\",\n nanoS: \"nanos\",\n nanoSP: \"nanosp\",\n nanoX: \"nanox\",\n stax: \"stax\",\n};\n\nconst APDU_CLA = 0xe0;\nconst APDU_CLA_PKI = 0xb0;\nconst APDU_INS_LOAD_CERTIFICATE = 0x06;\nconst LEDGER_KEY_USAGE_NETWORK = 0x0c;\nconst APDU_INS_PROVIDE_NETWORK_INFORMATION = 0x30;\nconst APDU_P1_FIRST_CHUNK = 0x01;\nconst APDU_P1_FOLLOWING_CHUNK = 0x00;\nconst APDU_P2_NETWORK_CONFIG = 0x00;\nconst APDU_P2_NETWORK_ICON = 0x01;\nconst APDU_MAX_CHUNK_SIZE = 0xff;\nconst TLV_TAG_DER_SIGNATURE = 0x15;\n\nexport type LedgerNetworkDescriptor = { data: string; icon?: string; signature: string };\n\ntype CalNetwork = {\n chain_id: number;\n descriptors?: Record<string, { data?: string; signatures?: { prod?: string } }>;\n icons?: Record<string, string>;\n};\n\nexport async function fetchLedgerNetworkCertificate(\n deviceModelId: string,\n fetchFn: typeof fetch = fetch,\n): Promise<string | null> {\n const calModel = LEDGER_DEVICE_TO_CAL_MODEL[deviceModelId];\n if (!calModel) return null;\n\n const url = `${LEDGER_CAL_SERVICE_URL}/certificates?output=descriptor&public_key_usage=network&target_device=${calModel}`;\n const response = await fetchFn(url);\n if (!response.ok) return null;\n\n const certificates = (await response.json()) as Array<{\n descriptor?: { data?: string; signatures?: { prod?: string } };\n }>;\n const descriptor = certificates[0]?.descriptor;\n const signature = descriptor?.signatures?.prod;\n\n if (!(descriptor?.data && signature)) return null;\n\n return `${descriptor.data}${appendSignatureTlv(signature)}`;\n}\n\nexport async function provideLedgerCertificate(transport: Transport, payloadHex: string) {\n await transport.send(\n APDU_CLA_PKI,\n APDU_INS_LOAD_CERTIFICATE,\n LEDGER_KEY_USAGE_NETWORK,\n 0x00,\n Buffer.from(payloadHex, \"hex\"),\n );\n}\n\nexport async function fetchLedgerNetworkDescriptor(\n chainId: number,\n deviceModelId: string,\n fetchFn: typeof fetch = fetch,\n): Promise<LedgerNetworkDescriptor | null> {\n const calModel = LEDGER_DEVICE_TO_CAL_MODEL[deviceModelId];\n if (!calModel) return null;\n\n const url = `${LEDGER_CAL_SERVICE_URL}/networks?chain_id=${chainId}&output=chain_id,descriptors,icons`;\n const response = await fetchFn(url);\n if (!response.ok) return null;\n\n const networks = (await response.json()) as CalNetwork[];\n const network = networks.find((entry) => entry.chain_id === chainId);\n const descriptor = network?.descriptors?.[calModel];\n const signature = descriptor?.signatures?.prod;\n\n if (!(descriptor?.data && signature)) return null;\n\n return { data: descriptor.data, icon: network?.icons?.[calModel], signature };\n}\n\nfunction appendSignatureTlv(signature: string) {\n return encodeTlv(TLV_TAG_DER_SIGNATURE, Buffer.from(signature, \"hex\")).toString(\"hex\");\n}\n\nfunction encodeTlv(tag: number, value: Buffer) {\n return Buffer.concat([Buffer.from([tag, value.length]), value]);\n}\n\nexport function encodeNetworkInfoPayload({ data, signature }: LedgerNetworkDescriptor) {\n const tlv = Buffer.concat([\n Buffer.from(data, \"hex\"),\n encodeTlv(TLV_TAG_DER_SIGNATURE, Buffer.from(signature, \"hex\")),\n ]);\n const length = Buffer.alloc(2);\n length.writeUInt16BE(tlv.length, 0);\n return Buffer.concat([length, tlv]);\n}\n\nasync function sendChunked(transport: Transport, p2: number, payload: Buffer) {\n for (let offset = 0; offset < payload.length; offset += APDU_MAX_CHUNK_SIZE) {\n const p1 = offset === 0 ? APDU_P1_FIRST_CHUNK : APDU_P1_FOLLOWING_CHUNK;\n const chunk = payload.subarray(offset, offset + APDU_MAX_CHUNK_SIZE);\n await transport.send(APDU_CLA, APDU_INS_PROVIDE_NETWORK_INFORMATION, p1, p2, chunk);\n }\n}\n\nexport async function provideLedgerNetworkInformation(transport: Transport, descriptor: LedgerNetworkDescriptor) {\n const payload = encodeNetworkInfoPayload(descriptor);\n await sendChunked(transport, APDU_P2_NETWORK_CONFIG, payload);\n\n if (!descriptor.icon) return { iconAccepted: false };\n\n try {\n await sendChunked(transport, APDU_P2_NETWORK_ICON, Buffer.from(descriptor.icon, \"hex\"));\n return { iconAccepted: true };\n } catch {\n await sendChunked(transport, APDU_P2_NETWORK_CONFIG, payload);\n return { iconAccepted: false };\n }\n}\n",
15
- "import type Transport from \"@ledgerhq/hw-transport\";\nimport type { SignedTransaction, Transaction } from \"@near-js/transactions\";\nimport type { DerivationPathArray } from \"@swapkit/helpers\";\nimport type { NearSigner } from \"@swapkit/toolboxes/near\";\nimport { getLedgerTransport } from \"../helpers/getLedgerTransport\";\n\nexport async function getNearLedgerClient(derivationPath?: DerivationPathArray, injectedTransport?: Transport) {\n const Near = (await import(\"@ledgerhq/hw-app-near\")).default;\n const { Chain, NetworkDerivationPath, SwapKitError } = await import(\"@swapkit/helpers\");\n const transport = injectedTransport ?? (await getLedgerTransport());\n const nearApp = new Near(transport);\n\n const path = (derivationPath || NetworkDerivationPath[Chain.Near]).join(\"'/\").concat(\"'\");\n\n const { address, publicKey: pubKeyHex } = await nearApp.getAddress(path);\n\n const signer = {\n getAddress() {\n return Promise.resolve(address);\n },\n async getPublicKey() {\n const { PublicKey } = await import(\"@near-js/crypto\");\n return PublicKey.fromString(`ed25519:${pubKeyHex}`);\n },\n\n signDelegateAction(_delegateAction: any) {\n return Promise.reject(\n new SwapKitError(\"wallet_ledger_method_not_supported\", { method: \"signDelegateAction\", wallet: \"Ledger\" }),\n );\n },\n\n signNep413Message(\n _message: string,\n _accountId: string,\n _recipient: string,\n _nonce: Uint8Array,\n _callbackUrl?: string,\n ) {\n return Promise.reject(\n new SwapKitError(\"wallet_ledger_method_not_supported\", { method: \"signNep413Message\", wallet: \"Ledger\" }),\n );\n },\n\n async signTransaction(transaction: Transaction) {\n const { Signature, SignedTransaction } = await import(\"@near-js/transactions\");\n try {\n const signatureArray = await nearApp.signTransaction(transaction.encode(), path);\n if (!signatureArray) {\n throw new Error(\"Signature undefined\");\n }\n\n const signature = new Signature({ data: signatureArray, keyType: 0 });\n\n const signedTransaction = new SignedTransaction({ signature, transaction });\n\n return [signatureArray, signedTransaction] as [Uint8Array<ArrayBufferLike>, SignedTransaction];\n } catch (error) {\n throw new SwapKitError(\"wallet_ledger_signing_error\", { error });\n }\n },\n };\n\n return signer as NearSigner;\n}\n",
16
- "import type Sui from \"@ledgerhq/hw-app-sui\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport {\n Chain,\n type DerivationPathArray,\n derivationPathToString,\n NetworkDerivationPath,\n SwapKitError,\n} from \"@swapkit/helpers\";\n\nimport { getLedgerTransport } from \"../helpers/getLedgerTransport\";\n\nexport class SuiLedgerInterface {\n derivationPath: string;\n ledgerApp: InstanceType<typeof Sui> | null = null;\n address: string | null = null;\n publicKey: Uint8Array | null = null;\n private readonly injectedTransport?: Transport;\n\n constructor(derivationPath?: DerivationPathArray | string, transport?: Transport) {\n this.derivationPath =\n typeof derivationPath === \"string\"\n ? derivationPath\n : derivationPathToString(derivationPath || NetworkDerivationPath[Chain.Sui]);\n this.injectedTransport = transport;\n }\n\n /**\n * Transform derivation path for SUI Ledger format.\n * SUI Ledger expects: 44'/784'/0'/0'/0' (all hardened, no 'm/' prefix)\n * Standard format is: m/44'/784'/0'/0/0 (only first 3 hardened, has 'm/' prefix)\n */\n private getLedgerPath(): string {\n return this.derivationPath\n .replace(/^m\\//, \"\") // Remove 'm/' prefix\n .replace(/\\/(\\d+)\\/(\\d+)$/, \"/$1'/$2'\"); // Make last two components hardened\n }\n\n private async createTransportAndLedger() {\n if (this.ledgerApp) return;\n\n const transport = this.injectedTransport ?? (await getLedgerTransport());\n const SuiApp = (await import(\"@ledgerhq/hw-app-sui\")).default;\n this.ledgerApp = new SuiApp(transport);\n }\n\n async connect(): Promise<string> {\n await this.createTransportAndLedger();\n\n if (!this.ledgerApp) {\n throw new SwapKitError(\"wallet_ledger_transport_error\");\n }\n\n const ledgerPath = this.getLedgerPath();\n const result = await this.ledgerApp.getPublicKey(ledgerPath);\n\n if (!result?.publicKey) {\n throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n }\n\n this.publicKey = result.publicKey;\n this.address = `0x${Buffer.from(result.address).toString(\"hex\")}`;\n\n return this.address;\n }\n\n toSuiAddress(): string {\n if (!this.address) {\n throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n }\n return this.address;\n }\n\n async getAddress(): Promise<string> {\n if (this.address) return this.address;\n return await this.connect();\n }\n\n async signTransaction(\n input: Uint8Array | { transaction: Uint8Array },\n ): Promise<{ bytes: string; signature: string }> {\n const txBytes = input instanceof Uint8Array ? input : input.transaction;\n await this.createTransportAndLedger();\n\n if (!this.ledgerApp) {\n throw new SwapKitError(\"wallet_ledger_transport_error\");\n }\n\n if (!this.publicKey) {\n throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n }\n\n try {\n const ledgerPath = this.getLedgerPath();\n\n // SUI intent message format for TransactionData:\n // [intent_scope=0 (TransactionData), intent_version=0, app_id=0] + transaction_bytes\n // The Ledger SUI app expects the INTENT MESSAGE, not raw transaction bytes\n const intentMessage = new Uint8Array(3 + txBytes.length);\n intentMessage[0] = 0; // IntentScope: TransactionData\n intentMessage[1] = 0; // IntentVersion: V0\n intentMessage[2] = 0; // AppId: Sui\n intentMessage.set(txBytes, 3);\n\n const result = await this.ledgerApp.signTransaction(ledgerPath, intentMessage);\n\n if (!result?.signature) {\n throw new SwapKitError(\"wallet_ledger_signing_error\");\n }\n\n // SUI signature format: [scheme_flag (1 byte)] + [signature (64 bytes)] + [public_key (32 bytes)]\n // Scheme flag 0x00 = Ed25519\n const pubKey = this.publicKey.length === 33 ? this.publicKey.slice(1) : this.publicKey;\n if (pubKey.length !== 32) {\n throw new SwapKitError(\"wallet_ledger_signing_error\", { error: \"Invalid public key length\" });\n }\n\n const serializedSignature = new Uint8Array(1 + 64 + 32);\n serializedSignature[0] = 0x00; // Ed25519 scheme flag\n serializedSignature.set(result.signature, 1);\n serializedSignature.set(pubKey, 65);\n\n const signatureBase64 = Buffer.from(serializedSignature).toString(\"base64\");\n const bytesBase64 = Buffer.from(txBytes).toString(\"base64\");\n\n return { bytes: bytesBase64, signature: signatureBase64 };\n } catch (error) {\n throw new SwapKitError(\"wallet_ledger_signing_error\", { error });\n }\n }\n}\n\nexport const SuiLedger = (derivationPath?: DerivationPathArray, transport?: Transport) =>\n new SuiLedgerInterface(derivationPath, transport);\n",
17
- "import type { AccountData, AminoSignResponse, StdSignDoc } from \"@cosmjs/amino\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { base64 } from \"@scure/base\";\nimport { type DerivationPathArray, NetworkDerivationPath, SwapKitError } from \"@swapkit/helpers\";\n\nimport { CosmosLedgerInterface } from \"../../interfaces/CosmosLedgerInterface\";\nimport type { GetAddressAndPubKeyResponse } from \"../../types\";\nimport { getSignature } from \"./utils\";\n\ntype ThorchainAssetObject = { chain?: string; symbol?: string; synth?: boolean; ticker?: string };\n\ntype ThorchainDepositCoin = { amount: string; asset: string | ThorchainAssetObject };\n\nfunction getAminoAssetDenom(asset: string | ThorchainAssetObject) {\n if (typeof asset === \"string\") return asset;\n\n const chain = asset.chain?.toUpperCase();\n const symbol = (asset.symbol || asset.ticker || \"\").toUpperCase();\n\n if (!(chain && symbol)) return symbol || chain || \"\";\n if (asset.synth) return `${chain}/${symbol}`;\n\n return `${chain}.${symbol}`;\n}\n\nexport function normalizeThorchainLedgerSignDoc(signDoc: StdSignDoc): StdSignDoc {\n return {\n ...signDoc,\n msgs: signDoc.msgs.map((msg) => {\n if (!msg.type.includes(\"MsgDeposit\")) return msg;\n\n const coins = msg.value.coins;\n if (!Array.isArray(coins)) return msg;\n\n return {\n ...msg,\n value: {\n ...msg.value,\n coins: coins.map((coin: ThorchainDepositCoin) => ({ ...coin, asset: getAminoAssetDenom(coin.asset) })),\n },\n };\n }),\n };\n}\n\nexport class THORChainLedger extends CosmosLedgerInterface {\n private pubKey: string | null = null;\n\n derivationPath: DerivationPathArray;\n\n constructor(derivationPath: DerivationPathArray = NetworkDerivationPath.THOR, transport?: Transport) {\n super(transport);\n this.chain = \"thor\";\n this.derivationPath = derivationPath;\n }\n\n get pubkey() {\n return this.pubKey;\n }\n\n connect = async () => {\n await this.checkOrCreateTransportAndLedger();\n const { compressed_pk, bech32_address }: GetAddressAndPubKeyResponse = await this.getAddressAndPubKey();\n\n this.pubKey = base64.encode(compressed_pk);\n\n return bech32_address;\n };\n\n getAddressAndPubKey = async () => {\n await this.checkOrCreateTransportAndLedger(true);\n\n const response: GetAddressAndPubKeyResponse = await this.ledgerApp.getAddressAndPubKey(\n this.derivationPath,\n this.chain,\n );\n\n this.validateResponse(response.return_code, response.error_message);\n\n return response;\n };\n\n showAddressAndPubKey = async () => {\n await this.checkOrCreateTransportAndLedger(true);\n\n const response: GetAddressAndPubKeyResponse = await this.ledgerApp.showAddressAndPubKey(\n this.derivationPath,\n this.chain,\n );\n\n this.validateResponse(response.return_code, response.error_message);\n\n return response;\n };\n\n signTransaction = async (rawTx: string, sequence = \"0\") => {\n await this.checkOrCreateTransportAndLedger(true);\n\n const { return_code, error_message, signature } = await this.ledgerApp.sign(this.derivationPath, rawTx);\n\n if (!this.pubKey) throw new SwapKitError(\"wallet_ledger_pubkey_not_found\");\n\n this.validateResponse(return_code, error_message);\n\n return [\n {\n pub_key: { type: \"tendermint/PubKeySecp256k1\", value: this.pubKey },\n sequence,\n signature: getSignature(signature),\n },\n ];\n };\n\n signAmino = async (signerAddress: string, signDoc: StdSignDoc): Promise<AminoSignResponse> => {\n await this.checkOrCreateTransportAndLedger(true);\n\n const account = (await this.getAccounts()).find((item) => item.address === signerAddress);\n if (!account) {\n throw new SwapKitError(\"wallet_ledger_address_not_found\", { address: signerAddress });\n }\n\n const importedAmino = await import(\"@cosmjs/amino\");\n const encodeSecp256k1Signature =\n importedAmino.encodeSecp256k1Signature ?? importedAmino.default?.encodeSecp256k1Signature;\n const serializeSignDoc = importedAmino.serializeSignDoc ?? importedAmino.default?.serializeSignDoc;\n const normalizedSignDoc = normalizeThorchainLedgerSignDoc(signDoc);\n\n const { return_code, error_message, signature } = await this.ledgerApp.sign(\n this.derivationPath,\n serializeSignDoc(normalizedSignDoc),\n );\n\n this.validateResponse(return_code, error_message);\n\n return {\n signature: encodeSecp256k1Signature(account.pubkey, base64.decode(getSignature(signature))),\n // CosmJS rebuilds bodyBytes from the returned `signed` doc. Keep the\n // original direct-shaped doc there so MsgDeposit protobuf assets do not\n // get round-tripped through the incomplete Amino converter.\n signed: signDoc,\n };\n };\n\n getAccounts = async (): Promise<readonly AccountData[]> => {\n await this.checkOrCreateTransportAndLedger(true);\n\n const { bech32_address, compressed_pk }: GetAddressAndPubKeyResponse = await this.getAddressAndPubKey();\n\n this.pubKey = base64.encode(compressed_pk);\n\n return [{ address: bech32_address, algo: \"secp256k1\", pubkey: compressed_pk }];\n };\n\n sign = async (message: string) => {\n await this.checkOrCreateTransportAndLedger(true);\n\n const { return_code, error_message, signature } = await this.ledgerApp.sign(this.derivationPath, message);\n\n if (!this.pubKey) throw new SwapKitError(\"wallet_ledger_pubkey_not_found\");\n\n this.validateResponse(return_code, error_message);\n\n return getSignature(signature);\n };\n}\n",
18
- "import { base64 } from \"@scure/base\";\nimport { SwapKitError } from \"@swapkit/helpers\";\n\nexport const getSignature = (signatureArray: any) => {\n // Check Type Length Value encoding\n if (signatureArray.length < 64) {\n throw new SwapKitError(\"wallet_ledger_invalid_signature\", { reason: \"Too short\" });\n }\n if (signatureArray[0] !== 0x30) {\n throw new SwapKitError(\"wallet_ledger_invalid_signature\", { reason: \"TLV encoding: expected first byte 0x30\" });\n }\n if (signatureArray[1] + 2 !== signatureArray.length) {\n throw new SwapKitError(\"wallet_ledger_invalid_signature\", { reason: \"signature length does not match TLV\" });\n }\n if (signatureArray[2] !== 0x02) {\n throw new SwapKitError(\"wallet_ledger_invalid_signature\", { reason: \"TLV encoding: expected length type 0x02\" });\n }\n\n // r signature\n const rLength = signatureArray[3];\n let rSignature = signatureArray.slice(4, rLength + 4);\n\n // Drop leading zero on some 'r' signatures that are 33 bytes.\n if (rSignature.length === 33 && rSignature[0] === 0) {\n rSignature = rSignature.slice(1, 33);\n } else if (rSignature.length === 33) {\n throw new SwapKitError(\"wallet_ledger_invalid_signature\", { reason: \"r too long\" });\n }\n\n // add leading zero's to pad to 32 bytes\n while (rSignature.length < 32) {\n rSignature.unshift(0);\n }\n\n // s signature\n if (signatureArray[rLength + 4] !== 0x02) {\n throw new SwapKitError(\"wallet_ledger_invalid_signature\", {\n reason: \"TLV encoding: expected length type 0x02 for s\",\n });\n }\n\n const sLength = signatureArray[rLength + 5];\n\n if (4 + rLength + 2 + sLength !== signatureArray.length) {\n throw new SwapKitError(\"wallet_ledger_invalid_signature\", {\n reason: \"TLV byte lengths do not match message length\",\n });\n }\n\n let sSignature = signatureArray.slice(rLength + 6, signatureArray.length);\n\n // Drop leading zero on 's' signatures that are 33 bytes. This shouldn't occur since ledger signs using \"Small s\" math. But just to be sure...\n if (sSignature.length === 33 && sSignature[0] === 0) {\n sSignature = sSignature.slice(1, 33);\n } else if (sSignature.length === 33) {\n throw new SwapKitError(\"wallet_ledger_invalid_signature\", { reason: \"s too long\" });\n }\n\n // add leading zero's to pad to 32 bytes\n while (sSignature.length < 32) {\n sSignature.unshift(0);\n }\n\n if (rSignature.length !== 32 || sSignature.length !== 32) {\n throw new SwapKitError(\"wallet_ledger_invalid_signature\", { reason: \"must be 32 bytes each\" });\n }\n\n return base64.encode(Buffer.concat([rSignature, sSignature]));\n};\n",
19
- "import type TronApp from \"@ledgerhq/hw-app-trx\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport {\n type DerivationPathArray,\n derivationPathToString,\n NetworkDerivationPath,\n SwapKitError,\n} from \"@swapkit/helpers\";\nimport type { TronSignedTransaction, TronSigner, TronTransaction } from \"@swapkit/toolboxes/tron\";\n\nimport { getLedgerTransport } from \"../helpers/getLedgerTransport\";\n\nexport class TronLedgerInterface implements TronSigner {\n derivationPath: string;\n ledgerApp: InstanceType<typeof TronApp> | null = null;\n ledgerTimeout = 50000;\n private readonly injectedTransport?: Transport;\n\n constructor(derivationPath?: DerivationPathArray | string, transport?: Transport) {\n this.derivationPath =\n typeof derivationPath === \"string\"\n ? derivationPath\n : derivationPathToString(derivationPath || NetworkDerivationPath.TRON);\n this.injectedTransport = transport;\n }\n\n checkOrCreateTransportAndLedger = async () => {\n if (this.ledgerApp) return;\n await this.createTransportAndLedger();\n };\n\n createTransportAndLedger = async () => {\n const transport = this.injectedTransport ?? (await getLedgerTransport());\n const TronApp = (await import(\"@ledgerhq/hw-app-trx\")).default;\n\n this.ledgerApp = new TronApp(transport);\n };\n\n getAddress = async (): Promise<string> => {\n const response = await this.getAddressAndPubKey();\n if (!response) throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n return response.address;\n };\n\n getAddressAndPubKey = async () => {\n await this.createTransportAndLedger();\n const result = await this.ledgerApp?.getAddress(this.derivationPath);\n\n if (!result) throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n\n return { address: result.address, publicKey: result.publicKey };\n };\n\n showAddressAndPubKey = async () => {\n await this.createTransportAndLedger();\n return this.ledgerApp?.getAddress(this.derivationPath, true);\n };\n\n signTransaction = async (transaction: TronTransaction): Promise<TronSignedTransaction> => {\n await this.createTransportAndLedger();\n\n if (!this.ledgerApp) {\n throw new SwapKitError(\"wallet_ledger_transport_error\");\n }\n\n try {\n const signature = await this.ledgerApp.signTransaction(\n this.derivationPath,\n transaction.raw_data_hex,\n [], // Token signatures array - empty for native TRX transfers\n );\n\n if (!signature) {\n throw new SwapKitError(\"wallet_ledger_signing_error\");\n }\n\n // Return the signed transaction in Tron's expected format\n return { ...transaction, signature: [signature] };\n } catch (error) {\n throw new SwapKitError(\"wallet_ledger_signing_error\", { error });\n }\n };\n}\n\nexport const TronLedger = (derivationPath?: DerivationPathArray, transport?: Transport) =>\n new TronLedgerInterface(derivationPath, transport);\n",
20
- "import type BitcoinApp from \"@ledgerhq/hw-app-btc\";\nimport type { CreateTransactionArg } from \"@ledgerhq/hw-app-btc/lib-es/createTransaction\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { hex } from \"@scure/base\";\nimport { type DerivationPathArray, derivationPathToString, getWalletFormatFor, SwapKitError } from \"@swapkit/helpers\";\nimport type { UTXOType } from \"@swapkit/toolboxes/utxo\";\nimport type { PCZT, Transaction } from \"@swapkit/utxo-signer\";\n\nimport { getLedgerTransport } from \"../helpers/getLedgerTransport\";\n\nconst nonSegwitLedgerChains = [\"bitcoin-cash\", \"dash\", \"dogecoin\", \"zcash\"];\n\ntype Params = {\n tx: Transaction;\n inputUtxos: UTXOType[];\n btcApp: BitcoinApp;\n derivationPath: string;\n chain: \"bitcoin-cash\" | \"bitcoin\" | \"litecoin\" | \"dogecoin\" | \"dash\" | \"zcash\";\n};\n\ntype MultiPathParams = Omit<Params, \"derivationPath\"> & {\n /** Derivation paths for each input - one per input */\n derivationPaths: string[];\n};\n\nconst signUTXOTransaction = (\n { tx, inputUtxos, btcApp, derivationPath, chain }: Params,\n options?: Partial<CreateTransactionArg>,\n) => {\n const inputs = inputUtxos.map((item) => {\n const splitTx = btcApp.splitTransaction(\n item.txHex || \"\",\n !nonSegwitLedgerChains.includes(chain),\n chain === \"zcash\",\n );\n\n return [splitTx, item.index, undefined as string | null | undefined, undefined as number | null | undefined] as any;\n });\n\n const newTxHex = hex.encode(tx.unsignedTx);\n\n const splitNewTx = btcApp.splitTransaction(newTxHex, true);\n const outputScriptHex = btcApp.serializeTransactionOutputs(splitNewTx).toString(\"hex\");\n\n // hw-app-btc derives the signing policy from these flags:\n // additionals [\"bech32\"] + segwit → wpkh (native segwit, m/84')\n // no additionals + segwit → sh(wpkh) (P2SH-P2WPKH, m/49')\n // no additionals + !segwit → pkh (legacy, m/44')\n // They must match the derivation path or the BTC app rejects with 0x6a80.\n const format = getWalletFormatFor(derivationPath);\n const segwit = format !== \"legacy\";\n const params: CreateTransactionArg = {\n additionals: format === \"bech32\" ? [\"bech32\"] : [],\n associatedKeysets: inputs.map(() => derivationPath),\n inputs,\n outputScriptHex,\n segwit,\n useTrustedInputForSegwit: segwit,\n };\n\n return btcApp.createPaymentTransaction({ ...params, ...options });\n};\n\n/**\n * Sign a UTXO transaction with multiple derivation paths.\n * Each input can have its own derivation path for HD wallet multi-address support.\n */\nconst signUTXOTransactionWithMultiplePaths = (\n { tx, inputUtxos, btcApp, derivationPaths, chain }: MultiPathParams,\n options?: Partial<CreateTransactionArg>,\n) => {\n if (derivationPaths.length !== inputUtxos.length) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n message: `Derivation paths count (${derivationPaths.length}) must match inputs count (${inputUtxos.length})`,\n });\n }\n\n const inputs = inputUtxos.map((item) => {\n const splitTx = btcApp.splitTransaction(\n item.txHex || \"\",\n !nonSegwitLedgerChains.includes(chain),\n chain === \"zcash\",\n );\n\n return [splitTx, item.index, undefined as string | null | undefined, undefined as number | null | undefined] as any;\n });\n\n const newTxHex = hex.encode(tx.unsignedTx);\n\n const splitNewTx = btcApp.splitTransaction(newTxHex, true);\n const outputScriptHex = btcApp.serializeTransactionOutputs(splitNewTx).toString(\"hex\");\n\n // Same policy/path matching rules as signUTXOTransaction; all paths share\n // one account so the first path determines the format.\n const format = getWalletFormatFor(derivationPaths[0] ?? \"\");\n const segwit = format !== \"legacy\";\n const params: CreateTransactionArg = {\n additionals: format === \"bech32\" ? [\"bech32\"] : [],\n associatedKeysets: derivationPaths,\n inputs,\n outputScriptHex,\n segwit,\n useTrustedInputForSegwit: segwit,\n };\n\n return btcApp.createPaymentTransaction({ ...params, ...options });\n};\n\nconst BaseLedgerUTXO = ({\n chain,\n additionalSignParams,\n}: {\n chain: \"bitcoin-cash\" | \"bitcoin\" | \"litecoin\" | \"dogecoin\" | \"dash\" | \"zcash\";\n additionalSignParams?: Partial<CreateTransactionArg>;\n}) => {\n return (derivationPathArray?: DerivationPathArray | string, injectedTransport?: Transport) => {\n // Per-call state — each BitcoinLedger/LitecoinLedger/... invocation has its own\n // transport + btcApp so different consumers (e.g. concurrent MCP sessions) cannot\n // cross-contaminate each other's Ledger device handle.\n let btcApp: InstanceType<typeof BitcoinApp> | undefined;\n let transport: any = null;\n\n async function createTransportWebUSB() {\n transport ||= injectedTransport ?? (await getLedgerTransport());\n const BitcoinApp = (await import(\"@ledgerhq/hw-app-btc\")).default;\n\n btcApp ||= new BitcoinApp({ currency: chain, transport });\n return btcApp;\n }\n\n async function getBtcApp() {\n return btcApp || (await createTransportWebUSB());\n }\n\n async function disconnect() {\n if (!injectedTransport) await transport?.close?.();\n btcApp = undefined;\n transport = null;\n }\n\n const derivationPath =\n typeof derivationPathArray === \"string\"\n ? derivationPathArray\n : derivationPathToString(derivationPathArray as DerivationPathArray);\n\n const format = getWalletFormatFor(derivationPath);\n\n return {\n connect: async () => {\n await getBtcApp();\n },\n disconnect,\n getAddress: async () => {\n const { toCashAddress } = await import(\"@swapkit/toolboxes/utxo\");\n\n const app = await getBtcApp();\n\n const { bitcoinAddress: address } = await app.getWalletPublicKey(derivationPath, { format });\n\n if (!address) {\n throw new SwapKitError(\"wallet_ledger_get_address_error\", {\n message: `Cannot get ${chain} address from ledger derivation path: ${derivationPath}`,\n });\n }\n\n return chain === \"bitcoin-cash\" && format === \"legacy\"\n ? toCashAddress(address).replace(/(bchtest:|bitcoincash:)/, \"\")\n : address;\n },\n getExtendedPublicKey: async (path = \"84'/0'/0'\", xpubVersion = 76067358) => {\n const app = await getBtcApp();\n\n return app.getWalletXpub({ path, xpubVersion });\n },\n\n signPCZT: async (pczt: PCZT): Promise<PCZT> => {\n if (chain !== \"zcash\") {\n throw new SwapKitError(\"wallet_ledger_chain_not_supported\", {\n message: \"PCZT signing is only supported for Zcash\",\n });\n }\n\n const app = await getBtcApp();\n\n const { ZcashTransaction, Script } = await import(\"@swapkit/utxo-signer\");\n\n const global = pczt.getGlobal();\n\n const unsignedTx = new ZcashTransaction({\n consensusBranchId: global.consensusBranchId,\n expiryHeight: global.expiryHeight,\n lockTime: global.lockTime,\n version: global.txVersion,\n versionGroupId: global.versionGroupId,\n });\n\n const inputUtxos: UTXOType[] = [];\n\n for (let i = 0; i < pczt.inputsLength; i++) {\n const input = pczt.getInput(i);\n\n unsignedTx.addInput({\n index: input.index,\n script: new Uint8Array(),\n sequence: input.sequence ?? 0xffffffff,\n txid: input.txid,\n value: input.value,\n });\n\n inputUtxos.push({\n hash: hex.encode(new Uint8Array([...input.txid].reverse())),\n index: input.index,\n txHex: buildMinimalPrevTxHex(input, global),\n value: Number(input.value),\n witnessUtxo: { script: input.scriptPubkey, value: Number(input.value) },\n } as UTXOType);\n }\n\n for (let i = 0; i < pczt.outputsLength; i++) {\n const output = pczt.getOutput(i);\n unsignedTx.addOutput({ amount: output.value, script: output.scriptPubkey });\n }\n\n const signedTxHex = await signUTXOTransaction(\n { btcApp: app, chain, derivationPath, inputUtxos, tx: unsignedTx as unknown as Transaction },\n {\n ...additionalSignParams,\n expiryHeight: (() => {\n const buf = Buffer.alloc(4);\n buf.writeUInt32LE(global.expiryHeight);\n return buf;\n })(),\n lockTime: global.lockTime,\n },\n );\n\n const signedTx = ZcashTransaction.fromHex(signedTxHex, { allowUnknownOutputs: true });\n const signedPczt = pczt.clone();\n\n for (let i = 0; i < signedTx.inputsLength; i++) {\n const signedInput = signedTx.getInput(i);\n if (signedInput.script && signedInput.script.length > 0) {\n const scriptParts = Script.decode(signedInput.script);\n if (scriptParts.length >= 2) {\n signedPczt.addSignature(i, scriptParts[1] as Uint8Array, scriptParts[0] as Uint8Array);\n }\n }\n }\n\n return signedPczt;\n },\n signTransaction: async (tx: Transaction, inputUtxos: UTXOType[]) => {\n const app = await getBtcApp();\n\n return signUTXOTransaction({ btcApp: app, chain, derivationPath, inputUtxos, tx }, additionalSignParams);\n },\n\n /**\n * Sign a transaction with multiple derivation paths for HD wallet multi-address support.\n * Each input can be signed with its own derivation path.\n */\n signTransactionWithMultiplePaths: async (tx: Transaction, inputUtxos: UTXOType[], derivationPaths: string[]) => {\n const app = await getBtcApp();\n\n return signUTXOTransactionWithMultiplePaths(\n { btcApp: app, chain, derivationPaths, inputUtxos, tx },\n additionalSignParams,\n );\n },\n };\n };\n};\n\nfunction buildMinimalPrevTxHex(\n input: { txid: Uint8Array; index: number; scriptPubkey: Uint8Array; value: bigint },\n global: { txVersion: number; versionGroupId: number; expiryHeight: number; lockTime: number },\n): string {\n const parts: number[] = [];\n\n const version = (global.txVersion | 0x80000000) >>> 0;\n parts.push(version & 0xff, (version >> 8) & 0xff, (version >> 16) & 0xff, (version >> 24) & 0xff);\n\n const vgid = global.versionGroupId;\n parts.push(vgid & 0xff, (vgid >> 8) & 0xff, (vgid >> 16) & 0xff, (vgid >> 24) & 0xff);\n\n parts.push(0);\n\n const outputCount = input.index + 1;\n if (outputCount < 0xfd) {\n parts.push(outputCount);\n } else {\n parts.push(0xfd, outputCount & 0xff, (outputCount >> 8) & 0xff);\n }\n\n for (let i = 0; i < input.index; i++) {\n parts.push(0, 0, 0, 0, 0, 0, 0, 0);\n parts.push(0);\n }\n\n const value = input.value;\n parts.push(\n Number(value & 0xffn),\n Number((value >> 8n) & 0xffn),\n Number((value >> 16n) & 0xffn),\n Number((value >> 24n) & 0xffn),\n Number((value >> 32n) & 0xffn),\n Number((value >> 40n) & 0xffn),\n Number((value >> 48n) & 0xffn),\n Number((value >> 56n) & 0xffn),\n );\n\n const script = input.scriptPubkey;\n if (script.length < 0xfd) {\n parts.push(script.length);\n } else {\n parts.push(0xfd, script.length & 0xff, (script.length >> 8) & 0xff);\n }\n for (const byte of script) {\n parts.push(byte);\n }\n\n parts.push(\n global.lockTime & 0xff,\n (global.lockTime >> 8) & 0xff,\n (global.lockTime >> 16) & 0xff,\n (global.lockTime >> 24) & 0xff,\n );\n parts.push(\n global.expiryHeight & 0xff,\n (global.expiryHeight >> 8) & 0xff,\n (global.expiryHeight >> 16) & 0xff,\n (global.expiryHeight >> 24) & 0xff,\n );\n parts.push(0, 0, 0, 0, 0, 0, 0, 0); // value balance\n parts.push(0); // empty sapling spends\n parts.push(0); // empty sapling outputs\n parts.push(0); // empty joinsplits\n\n return hex.encode(new Uint8Array(parts));\n}\n\nexport const BitcoinLedger = BaseLedgerUTXO({ chain: \"bitcoin\" });\nexport const LitecoinLedger = BaseLedgerUTXO({ chain: \"litecoin\" });\n\nexport const BitcoinCashLedger = BaseLedgerUTXO({\n additionalSignParams: { additionals: [\"abc\"], segwit: false, sigHashType: 0x41 },\n chain: \"bitcoin-cash\",\n});\n\nexport const DogecoinLedger = BaseLedgerUTXO({\n additionalSignParams: { additionals: [], segwit: false, useTrustedInputForSegwit: false },\n chain: \"dogecoin\",\n});\n\nexport const DashLedger = BaseLedgerUTXO({\n additionalSignParams: { additionals: [], segwit: false, useTrustedInputForSegwit: false },\n chain: \"dash\",\n});\n\nexport const ZcashLedger = BaseLedgerUTXO({\n additionalSignParams: {\n additionals: [\"zcash\", \"sapling\"],\n expiryHeight: (() => {\n const buf = Buffer.alloc(4);\n buf.writeUInt32LE(0);\n return buf;\n })(),\n lockTime: 0,\n segwit: false,\n useTrustedInputForSegwit: false,\n },\n chain: \"zcash\",\n});\n",
21
- "import Xrp from \"@ledgerhq/hw-app-xrp\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { Chain, type DerivationPathArray, derivationPathToString, NetworkDerivationPath } from \"@swapkit/helpers\";\nimport type { RippleTransaction } from \"@swapkit/toolboxes/ripple\";\nimport { encode } from \"ripple-binary-codec\";\nimport type { Payment } from \"xrpl\";\nimport { getLedgerTransport } from \"../helpers/getLedgerTransport\";\n\nconst TF_FULLY_CANONICAL_SIG = 2147483648;\n\nfunction cleanTransactionObject(obj: Record<string, any>) {\n const cleaned: Record<string, any> = {};\n for (const key in obj) {\n if (obj[key] !== null && obj[key] !== undefined) {\n cleaned[key] = obj[key];\n }\n }\n return cleaned;\n}\n\nfunction establishConnection(transport: Transport) {\n return new Xrp(transport);\n}\n\nexport const XRPLedger = async (derivationPath?: DerivationPathArray, injectedTransport?: Transport) => {\n const path = derivationPathToString(derivationPath || NetworkDerivationPath[Chain.Ripple]);\n const transport = injectedTransport ?? (await getLedgerTransport());\n const xrpInstance = establishConnection(transport);\n\n const { address, publicKey } = await xrpInstance.getAddress(path);\n\n async function signTransaction(transaction: Payment | RippleTransaction) {\n const { hashes } = await import(\"xrpl\");\n const cleanedTxWithPubKey = cleanTransactionObject(transaction);\n const transactionJSON = {\n ...cleanedTxWithPubKey,\n Flags: transaction.Flags || TF_FULLY_CANONICAL_SIG,\n SigningPubKey: publicKey.toUpperCase(),\n };\n\n const transactionToSignOnLedger = encode(transactionJSON);\n const txnSignature = await xrpInstance.signTransaction(path, transactionToSignOnLedger);\n const tx_blob = encode({ ...transactionJSON, TxnSignature: txnSignature });\n const hash = hashes.hashSignedTx(tx_blob);\n\n return { hash, tx_blob };\n }\n\n return { getAddress: () => address, signTransaction };\n};\n"
9
+ "import type Transport from \"@ledgerhq/hw-transport\";\nimport {\n Chain,\n type DerivationPathArray,\n type EVMChain,\n EVMChains,\n NetworkDerivationPath,\n SwapKitError,\n WalletOption,\n} from \"@swapkit/helpers\";\nimport { BitcoinLedger } from \"../clients/bitcoin\";\nimport { CosmosLedger } from \"../clients/cosmos\";\nimport {\n ArbitrumLedger,\n ArcLedger,\n AuroraLedger,\n AvalancheLedger,\n BaseLedger,\n BerachainLedger,\n BinanceSmartChainLedger,\n EthereumLedger,\n GnosisLedger,\n MonadLedger,\n OptimismLedger,\n PolygonLedger,\n XLayerLedger,\n} from \"../clients/evm\";\nimport { getNearLedgerClient } from \"../clients/near\";\nimport { SuiLedger } from \"../clients/sui\";\nimport { THORChainLedger } from \"../clients/thorchain\";\nimport { TronLedger } from \"../clients/tron\";\nimport { BitcoinCashLedger, DashLedger, DogecoinLedger, LitecoinLedger } from \"../clients/utxo\";\nimport { XRPLedger } from \"../clients/xrp\";\nimport { ZcashLedger } from \"../clients/zcash\";\nimport type { LedgerDMKSession } from \"./dmk\";\nimport type { LedgerDeviceActionStateHandler } from \"./executeDeviceAction\";\n\ntype LedgerSignerMap = {\n [Chain.Arbitrum]: ReturnType<typeof ArbitrumLedger>;\n [Chain.Arc]: ReturnType<typeof ArcLedger>;\n [Chain.Aurora]: ReturnType<typeof AuroraLedger>;\n [Chain.Avalanche]: ReturnType<typeof AvalancheLedger>;\n [Chain.Base]: ReturnType<typeof BaseLedger>;\n [Chain.Berachain]: ReturnType<typeof BerachainLedger>;\n [Chain.BinanceSmartChain]: ReturnType<typeof BinanceSmartChainLedger>;\n [Chain.BitcoinCash]: ReturnType<typeof BitcoinCashLedger>;\n [Chain.Bitcoin]: ReturnType<typeof BitcoinLedger>;\n [Chain.Cosmos]: CosmosLedger;\n [Chain.Dash]: ReturnType<typeof DashLedger>;\n [Chain.Dogecoin]: ReturnType<typeof DogecoinLedger>;\n [Chain.Ethereum]: ReturnType<typeof EthereumLedger>;\n [Chain.Gnosis]: ReturnType<typeof GnosisLedger>;\n [Chain.Litecoin]: ReturnType<typeof LitecoinLedger>;\n [Chain.Monad]: ReturnType<typeof MonadLedger>;\n [Chain.Near]: ReturnType<typeof getNearLedgerClient>;\n [Chain.Optimism]: ReturnType<typeof OptimismLedger>;\n [Chain.Polygon]: ReturnType<typeof PolygonLedger>;\n [Chain.Ripple]: ReturnType<typeof XRPLedger>;\n [Chain.Sui]: ReturnType<typeof SuiLedger>;\n [Chain.THORChain]: THORChainLedger;\n [Chain.Tron]: ReturnType<typeof TronLedger>;\n [Chain.XLayer]: ReturnType<typeof XLayerLedger>;\n [Chain.Zcash]: ReturnType<typeof ZcashLedger>;\n};\n\ntype LedgerSupportedChain = keyof LedgerSignerMap;\n\nexport async function getLedgerClient<T extends LedgerSupportedChain>({\n chain,\n dmkSession,\n derivationPath,\n onDeviceActionState,\n originToken,\n transport,\n}: {\n chain: T;\n dmkSession?: LedgerDMKSession;\n derivationPath?: DerivationPathArray;\n onDeviceActionState?: LedgerDeviceActionStateHandler;\n originToken?: string;\n transport?: Transport;\n}): Promise<LedgerSignerMap[T]> {\n const isEVMChain = EVMChains.includes(chain as EVMChain);\n\n if (dmkSession && transport) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n message: \"Provide either a Ledger DMK session or a LedgerJS transport, not both\",\n });\n }\n\n if (isEVMChain && transport) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n message: \"Ledger EVM clients require a DMK session instead of a LedgerJS transport\",\n });\n }\n\n // The default session is resolved per operation by each client, so a reconnected device is picked up.\n const clientParams = {\n derivationPath: derivationPath ?? NetworkDerivationPath[chain],\n dmkSession,\n onDeviceActionState,\n transport,\n };\n const { match } = await import(\"ts-pattern\");\n\n return match(chain as LedgerSupportedChain)\n .returnType<Promise<LedgerSignerMap[T]>>()\n .with(Chain.THORChain, () => Promise.resolve(new THORChainLedger(clientParams) as LedgerSignerMap[T]))\n .with(Chain.Cosmos, () => Promise.resolve(new CosmosLedger(clientParams) as LedgerSignerMap[T]))\n .with(Chain.Bitcoin, () => Promise.resolve(BitcoinLedger(clientParams) as LedgerSignerMap[T]))\n .with(Chain.BitcoinCash, () => Promise.resolve(BitcoinCashLedger(clientParams) as LedgerSignerMap[T]))\n .with(Chain.Dash, () => Promise.resolve(DashLedger(clientParams) as LedgerSignerMap[T]))\n .with(Chain.Dogecoin, () => Promise.resolve(DogecoinLedger(clientParams) as LedgerSignerMap[T]))\n .with(Chain.Litecoin, () => Promise.resolve(LitecoinLedger(clientParams) as LedgerSignerMap[T]))\n .with(Chain.Zcash, () => Promise.resolve(ZcashLedger(clientParams) as LedgerSignerMap[T]))\n .with(Chain.Ripple, () => Promise.resolve(XRPLedger(clientParams) as LedgerSignerMap[T]))\n .with(Chain.Tron, () => Promise.resolve(TronLedger(clientParams) as LedgerSignerMap[T]))\n .with(Chain.Sui, () => Promise.resolve(SuiLedger(clientParams) as LedgerSignerMap[T]))\n .with(Chain.Near, () => Promise.resolve(getNearLedgerClient(clientParams) as LedgerSignerMap[T]))\n .with(\n Chain.Arbitrum,\n Chain.Arc,\n Chain.Aurora,\n Chain.Avalanche,\n Chain.Berachain,\n Chain.BinanceSmartChain,\n Chain.Ethereum,\n Chain.Gnosis,\n Chain.Monad,\n Chain.Optimism,\n Chain.Polygon,\n Chain.Base,\n Chain.XLayer,\n async () => {\n const { getProvider } = await import(\"@swapkit/toolboxes/evm\");\n\n const params = {\n derivationPath,\n dmkSession,\n onDeviceActionState,\n originToken,\n provider: await getProvider(chain as EVMChain),\n };\n\n return match(chain as Chain)\n .with(Chain.BinanceSmartChain, () => BinanceSmartChainLedger(params) as LedgerSignerMap[T])\n .with(Chain.Avalanche, () => AvalancheLedger(params) as LedgerSignerMap[T])\n .with(Chain.Arbitrum, () => ArbitrumLedger(params) as LedgerSignerMap[T])\n .with(Chain.Arc, () => ArcLedger(params) as LedgerSignerMap[T])\n .with(Chain.Berachain, () => BerachainLedger(params) as LedgerSignerMap[T])\n .with(Chain.Optimism, () => OptimismLedger(params) as LedgerSignerMap[T])\n .with(Chain.Polygon, () => PolygonLedger(params) as LedgerSignerMap[T])\n .with(Chain.Base, () => BaseLedger(params) as LedgerSignerMap[T])\n .with(Chain.Aurora, () => AuroraLedger(params) as LedgerSignerMap[T])\n .with(Chain.Gnosis, () => GnosisLedger(params) as LedgerSignerMap[T])\n .with(Chain.Monad, () => MonadLedger(params) as LedgerSignerMap[T])\n .with(Chain.XLayer, () => XLayerLedger(params) as LedgerSignerMap[T])\n .otherwise(() => EthereumLedger(params) as LedgerSignerMap[T]);\n },\n )\n .otherwise(() => {\n throw new SwapKitError(\"wallet_chain_not_supported\", { chain, wallet: WalletOption.LEDGER });\n });\n}\n",
10
+ "import type { SignerBtc } from \"@ledgerhq/device-signer-kit-bitcoin\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { hex } from \"@scure/base\";\nimport { HARDENED_OFFSET, HDKey } from \"@scure/bip32\";\nimport {\n Chain,\n type DerivationPathArray,\n derivationPathToString,\n NetworkDerivationPath,\n SwapKitError,\n} from \"@swapkit/helpers\";\nimport type { UTXOType } from \"@swapkit/toolboxes/utxo\";\nimport type { Transaction } from \"@swapkit/utxo-signer\";\nimport { match } from \"ts-pattern\";\n\nimport { applyMissingSpendingMetadata } from \"../../helpers/psbt\";\nimport type { LedgerDMKSession } from \"../helpers/dmk\";\nimport { createLedgerSessionSigner } from \"../helpers/dmk\";\nimport { executeLedgerDeviceAction, type LedgerDeviceActionStateHandler } from \"../helpers/executeDeviceAction\";\nimport { createCachedRawTxResolver } from \"../helpers/rawTx\";\nimport { BitcoinLedger as LegacyBitcoinLedger } from \"./utxo\";\nimport { extractInputsFromPsbt, signLegacyPsbtTransaction } from \"./utxo-legacy-adapter\";\n\ninterface BitcoinLedgerParams {\n derivationPath?: DerivationPathArray | string;\n dmkSession?: LedgerDMKSession;\n onDeviceActionState?: LedgerDeviceActionStateHandler;\n transport?: Transport;\n}\n\ninterface GetExtendedPublicKeyParams {\n checkOnDevice?: boolean;\n path?: string;\n}\n\ninterface SignBitcoinTransactionParams {\n inputUtxos?: UTXOType[];\n tx: Transaction;\n}\n\ninterface SignBitcoinTransactionWithMultiplePathsParams extends SignBitcoinTransactionParams {\n derivationPaths: string[];\n}\n\ninterface ParsedBitcoinPath {\n accountPath: string;\n addressIndex: number;\n change: number;\n fullPath: string;\n purpose: 44 | 49 | 84 | 86;\n}\n\nfunction normalizePath(path: DerivationPathArray | string) {\n return (typeof path === \"string\" ? path : derivationPathToString(path)).replace(/^m\\//, \"\").replace(/^\\/+/, \"\");\n}\n\nfunction invalidPath({ path, reason }: { path: string; reason: string }) {\n return new SwapKitError(\"wallet_ledger_invalid_params\", { path, reason });\n}\n\nfunction parseBitcoinPath(path: DerivationPathArray | string): ParsedBitcoinPath {\n const normalized = normalizePath(path);\n const segments = /^(44|49|84|86)'\\/0'\\/(\\d+)'(?:\\/(0|1)\\/(\\d+))?$/.exec(normalized);\n\n if (!segments) {\n throw invalidPath({\n path: normalized,\n reason: \"Expected a Bitcoin path with purpose 44, 49, 84, or 86 and coin type 0\",\n });\n }\n\n const purpose = Number(segments[1]) as ParsedBitcoinPath[\"purpose\"];\n const account = Number(segments[2]);\n const change = Number(segments[3] ?? 0);\n const addressIndex = Number(segments[4] ?? 0);\n\n // A larger index would collide with the hardened range and name another key.\n if (account >= HARDENED_OFFSET || addressIndex >= HARDENED_OFFSET) {\n throw invalidPath({ path: normalized, reason: \"Account and address index must be below 2^31\" });\n }\n\n const accountPath = `${purpose}'/0'/${account}'`;\n return { accountPath, addressIndex, change, fullPath: `${accountPath}/${change}/${addressIndex}`, purpose };\n}\n\nfunction fingerprintToNumber(fingerprint: Uint8Array) {\n if (fingerprint.length !== 4) {\n throw new SwapKitError(\"wallet_ledger_invalid_response\", {\n reason: `Expected a 4-byte master fingerprint, received ${fingerprint.length}`,\n });\n }\n\n return new DataView(fingerprint.buffer, fingerprint.byteOffset, fingerprint.byteLength).getUint32(0, false);\n}\n\nfunction validateInputCount({ count, tx }: { count: number; tx: Transaction }) {\n if (count !== tx.inputsLength) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n reason: `Input metadata count (${count}) must match transaction inputs count (${tx.inputsLength})`,\n });\n }\n}\n\nfunction validateAccountPaths({\n accountPath,\n derivationPaths,\n tx,\n}: {\n accountPath: string;\n derivationPaths: string[];\n tx: Transaction;\n}) {\n validateInputCount({ count: derivationPaths.length, tx });\n const parsedPaths = derivationPaths.map(parseBitcoinPath);\n const mismatchedPath = parsedPaths.find((path) => path.accountPath !== accountPath);\n\n if (mismatchedPath) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n accountPath,\n path: mismatchedPath.fullPath,\n reason: \"All input derivation paths must belong to the configured Bitcoin account\",\n });\n }\n\n return parsedPaths;\n}\n\nfunction descriptorTemplate(purpose: ParsedBitcoinPath[\"purpose\"]) {\n return import(\"@ledgerhq/device-signer-kit-bitcoin\").then(({ DefaultDescriptorTemplate }) =>\n match(purpose)\n .with(44, () => DefaultDescriptorTemplate.LEGACY)\n .with(49, () => DefaultDescriptorTemplate.NESTED_SEGWIT)\n .with(84, () => DefaultDescriptorTemplate.NATIVE_SEGWIT)\n .with(86, () => DefaultDescriptorTemplate.TAPROOT)\n .exhaustive(),\n );\n}\n\n// Mirrors the signer kit's `PartialSignature`, which its package entry point does not export.\ninterface PartialSignature {\n inputIndex: number;\n pubkey: Uint8Array;\n signature: Uint8Array;\n tapleafHash?: Uint8Array;\n}\n\nfunction isPartialSignature(signature: object): signature is PartialSignature {\n return \"signature\" in signature && \"pubkey\" in signature;\n}\n\nfunction signatureError({ inputIndex, reason }: { inputIndex?: number; reason: string }) {\n return new SwapKitError(\"wallet_ledger_invalid_response\", { inputIndex, reason });\n}\n\ntype PreviousTransaction = NonNullable<ReturnType<Transaction[\"getInput\"]>[\"nonWitnessUtxo\"]>;\ntype SpentOutput = PreviousTransaction[\"outputs\"][number];\n\n// Returns the output an input spends, after checking the previous transaction hashes to the input's\n// txid and that a witnessUtxo the input carries agrees with it: amounts shown on the device come from\n// them, so neither may be substitutable.\nasync function verifiedSpentOutput({\n input,\n inputIndex,\n previousTransaction,\n}: {\n input: ReturnType<Transaction[\"getInput\"]>;\n inputIndex: number;\n previousTransaction?: PreviousTransaction;\n}) {\n if (!(previousTransaction && input.txid && input.index !== undefined)) {\n throw signatureError({ inputIndex, reason: \"PSBT input is missing its previous output\" });\n }\n\n const { RawTx, utils } = await import(\"@swapkit/utxo-signer\");\n // The txid commits to the legacy serialisation; raw SegWit transactions also carry the marker, flag and witnesses.\n const legacySerialisation = RawTx.encode({ ...previousTransaction, segwitFlag: false, witnesses: undefined });\n const previousTxid = utils.sha256x2(legacySerialisation).reverse();\n if (hex.encode(previousTxid) !== hex.encode(input.txid)) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n inputIndex,\n reason: \"Previous transaction does not match the input txid\",\n });\n }\n\n const spentOutput = previousTransaction.outputs[input.index];\n if (!spentOutput) throw signatureError({ inputIndex, reason: \"Previous transaction has no spent output\" });\n\n const { witnessUtxo } = input;\n if (\n witnessUtxo &&\n (witnessUtxo.amount !== spentOutput.amount || hex.encode(witnessUtxo.script) !== hex.encode(spentOutput.script))\n ) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n inputIndex,\n reason: \"Input witnessUtxo does not match the previous transaction output\",\n });\n }\n\n return spentOutput;\n}\n\n// Fails closed unless the input spends the script its key path derives, so the key origin the device signs\n// with and the spending metadata derived from that key describe the output actually being spent.\nasync function assertSpendsPathScript({\n inputIndex,\n path,\n publicKey,\n spentOutput,\n}: {\n inputIndex: number;\n path: ParsedBitcoinPath;\n publicKey: Uint8Array;\n spentOutput: SpentOutput;\n}) {\n const { p2pkh, p2sh, p2tr, p2wpkh } = await import(\"@swapkit/utxo-signer\");\n const pathScript = match(path.purpose)\n .with(44, () => p2pkh(publicKey).script)\n .with(49, () => p2sh(p2wpkh(publicKey)).script)\n .with(84, () => p2wpkh(publicKey).script)\n .with(86, () => p2tr(publicKey.slice(1)).script)\n .exhaustive();\n\n if (hex.encode(pathScript) === hex.encode(spentOutput.script)) return;\n\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n inputIndex,\n path: path.fullPath,\n reason: \"Input does not spend the script derived from its derivation path\",\n });\n}\n\nexport function BitcoinLedger({\n derivationPath = NetworkDerivationPath.BTC,\n dmkSession,\n onDeviceActionState,\n transport,\n}: BitcoinLedgerParams = {}) {\n const configuredPath = parseBitcoinPath(derivationPath);\n const legacyClient = transport ? LegacyBitcoinLedger(derivationPath, transport) : undefined;\n const getSessionSigner = createLedgerSessionSigner<SignerBtc>({\n build: async (session) => {\n const { SignerBtcBuilder } = await import(\"@ledgerhq/device-signer-kit-bitcoin\");\n return new SignerBtcBuilder(session).build();\n },\n dmkSession,\n });\n let accountXpubPromise: Promise<string> | undefined;\n let fingerprintPromise: Promise<number> | undefined;\n\n function getSigner() {\n if (legacyClient) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n reason: \"A Device Signer Kit operation is unavailable when a legacy transport is supplied\",\n });\n }\n\n return getSessionSigner();\n }\n\n function getAccountXpub() {\n if (!accountXpubPromise) {\n accountXpubPromise = getSigner().then(async (signer) => {\n const { extendedPublicKey } = await executeLedgerDeviceAction({\n action: () => signer.getExtendedPublicKey(configuredPath.accountPath),\n onDeviceActionState,\n });\n return extendedPublicKey;\n });\n const pendingXpub = accountXpubPromise;\n void pendingXpub.catch(() => {\n if (accountXpubPromise === pendingXpub) accountXpubPromise = undefined;\n });\n }\n return accountXpubPromise;\n }\n\n function getMasterFingerprint() {\n if (!fingerprintPromise) {\n fingerprintPromise = getSigner().then(async (signer) => {\n const { masterFingerprint } = await executeLedgerDeviceAction({\n action: () => signer.getMasterFingerprint(),\n onDeviceActionState,\n });\n return fingerprintToNumber(masterFingerprint);\n });\n const pendingFingerprint = fingerprintPromise;\n void pendingFingerprint.catch(() => {\n if (fingerprintPromise === pendingFingerprint) fingerprintPromise = undefined;\n });\n }\n return fingerprintPromise;\n }\n\n /**\n * The configured address's compressed public key, derived from the account xpub. The toolbox needs it to\n * attach a nested SegWit input's redeemScript and a taproot input's internal key when it builds a transaction.\n */\n async function getPublicKey() {\n const accountXpub = legacyClient\n ? await legacyClient.getExtendedPublicKey(configuredPath.accountPath)\n : await getAccountXpub();\n const { publicKey } = HDKey.fromExtendedKey(accountXpub).derive(\n `m/${configuredPath.change}/${configuredPath.addressIndex}`,\n );\n if (!publicKey) {\n throw new SwapKitError(\"wallet_ledger_invalid_response\", {\n path: configuredPath.fullPath,\n reason: \"Could not derive a public key from the Ledger account xpub\",\n });\n }\n return publicKey;\n }\n\n async function getWallet() {\n const [{ DefaultWallet }, template] = await Promise.all([\n import(\"@ledgerhq/device-signer-kit-bitcoin\"),\n descriptorTemplate(configuredPath.purpose),\n ]);\n return new DefaultWallet(configuredPath.accountPath, template);\n }\n\n async function resolvePreviousTransactions({ inputUtxos, tx }: { inputUtxos?: UTXOType[]; tx: Transaction }) {\n const { RawTx } = await import(\"@swapkit/utxo-signer\");\n const needsLookup = Array.from({ length: tx.inputsLength }, (_, index) => index).some(\n (index) => !(tx.getInput(index).nonWitnessUtxo || inputUtxos?.[index]?.txHex),\n );\n const getRawTx = needsLookup\n ? await import(\"@swapkit/toolboxes/utxo\").then(({ getUtxoApi }) => {\n const utxoApi = getUtxoApi(Chain.Bitcoin);\n return createCachedRawTxResolver((txid) => utxoApi.getRawTx(txid));\n })\n : undefined;\n\n return Promise.all(\n Array.from({ length: tx.inputsLength }, async (_, inputIndex) => {\n const input = tx.getInput(inputIndex);\n if (input.nonWitnessUtxo) return input.nonWitnessUtxo;\n if (!input.txid) throw signatureError({ inputIndex, reason: \"PSBT input is missing its previous txid\" });\n\n const txHex = inputUtxos?.[inputIndex]?.txHex ?? (await getRawTx?.(hex.encode(input.txid)));\n if (!txHex) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n inputIndex,\n reason: \"Unable to resolve the previous transaction for Ledger signing\",\n });\n }\n return RawTx.decode(hex.decode(txHex));\n }),\n );\n }\n\n /**\n * Attach what the Bitcoin app needs to verify and sign each input: key origins, for pre-taproot inputs the\n * full previous transaction (their amounts are only verifiable from it), for SegWit the spent output and, for\n * nested SegWit and taproot, the redeemScript or internal key. The previous transaction is checked against the\n * input's txid so it cannot misstate the amount, and the spent script against the input's key path.\n */\n async function addInputDerivations({\n inputUtxos,\n paths,\n tx,\n }: {\n inputUtxos?: UTXOType[];\n paths: ParsedBitcoinPath[];\n tx: Transaction;\n }) {\n const [accountXpub, fingerprint, previousTransactions] = await Promise.all([\n getAccountXpub(),\n getMasterFingerprint(),\n resolvePreviousTransactions({ inputUtxos, tx }),\n ]);\n const { bip32Path } = await import(\"@swapkit/utxo-signer\");\n const accountKey = HDKey.fromExtendedKey(accountXpub);\n const psbt = tx.clone();\n const publicKeys: Uint8Array[] = [];\n\n for (const [inputIndex, path] of paths.entries()) {\n const publicKey = accountKey.derive(`m/${path.change}/${path.addressIndex}`).publicKey;\n if (!publicKey) {\n throw new SwapKitError(\"wallet_ledger_invalid_response\", {\n inputIndex,\n reason: \"Could not derive a public key from the Ledger account xpub\",\n });\n }\n\n publicKeys[inputIndex] = publicKey;\n\n const input = psbt.getInput(inputIndex);\n const previousTransaction = previousTransactions[inputIndex];\n const spentOutput = await verifiedSpentOutput({ input, inputIndex, previousTransaction });\n await assertSpendsPathScript({ inputIndex, path, publicKey, spentOutput });\n\n const derivation = { fingerprint, path: bip32Path(`m/${path.fullPath}`) };\n if (path.purpose === 86) {\n const xOnlyPublicKey = publicKey.slice(1);\n // Set rather than filled in: the metadata helper keeps an existing internal key, which nothing checks\n // against the spent script, while the key path has just been checked to derive that script.\n psbt.updateInput(inputIndex, {\n tapBip32Derivation: [[xOnlyPublicKey, { der: derivation, hashes: [] }]],\n tapInternalKey: xOnlyPublicKey,\n witnessUtxo: spentOutput,\n });\n } else {\n psbt.updateInput(inputIndex, {\n bip32Derivation: [[publicKey, derivation]],\n nonWitnessUtxo: previousTransaction,\n // The app reads witnessUtxo as a SegWit claim, so a legacy input sent with one (the API attaches it\n // to every input) contradicts the pkh policy and fails with 0x6a80.\n witnessUtxo: path.purpose === 44 ? undefined : spentOutput,\n });\n }\n\n // Adds a nested SegWit input's redeemScript; an existing one already hashes to the checked script.\n await applyMissingSpendingMetadata({ chain: Chain.Bitcoin, indexes: [inputIndex], publicKey, tx: psbt });\n }\n\n return { psbt, publicKeys };\n }\n\n /**\n * Ask the device for signatures only and apply them to our own PSBT. The signer kit's own\n * transaction extraction writes the PSBT format version as the transaction version and drops\n * the witness of nested SegWit inputs, which invalidates the signatures.\n */\n async function signWithPaths({\n inputUtxos,\n paths,\n tx,\n }: {\n inputUtxos?: UTXOType[];\n paths: ParsedBitcoinPath[];\n tx: Transaction;\n }) {\n const [signer, wallet, { psbt, publicKeys }] = await Promise.all([\n getSigner(),\n getWallet(),\n addInputDerivations({ inputUtxos, paths, tx }),\n ]);\n const psbtV0 = psbt.toPSBT(0);\n const signatures = await executeLedgerDeviceAction({\n action: () => signer.signPsbt(wallet, psbtV0),\n onDeviceActionState,\n });\n\n const signedInputs = new Set<number>();\n for (const signature of signatures) {\n if (!isPartialSignature(signature)) throw signatureError({ reason: \"Unexpected MuSig2 signature\" });\n\n const { inputIndex, pubkey } = signature;\n const path = paths[inputIndex];\n const publicKey = publicKeys[inputIndex];\n if (!(path && publicKey) || signedInputs.has(inputIndex)) {\n throw signatureError({ inputIndex, reason: \"Unexpected or duplicate input signature\" });\n }\n signedInputs.add(inputIndex);\n\n if (path.purpose === 86) {\n if (signature.tapleafHash) throw signatureError({ inputIndex, reason: \"Unexpected taproot script signature\" });\n psbt.updateInput(inputIndex, { tapKeySig: signature.signature });\n continue;\n }\n\n if (hex.encode(pubkey) !== hex.encode(publicKey)) {\n throw signatureError({ inputIndex, reason: \"Signature public key does not match the input derivation\" });\n }\n psbt.updateInput(inputIndex, { partialSig: [[publicKey, signature.signature]] });\n }\n\n if (signedInputs.size !== psbt.inputsLength) {\n throw signatureError({ reason: `Ledger signed ${signedInputs.size} of ${psbt.inputsLength} inputs` });\n }\n\n return psbt;\n }\n\n function finalizeToHex(psbt: Transaction) {\n psbt.finalize();\n return psbt.hex;\n }\n\n function signTransactionHex({ tx, inputUtxos }: SignBitcoinTransactionParams) {\n if (inputUtxos) validateInputCount({ count: inputUtxos.length, tx });\n\n if (legacyClient) {\n return inputUtxos\n ? legacyClient.signTransaction(tx, inputUtxos)\n : signLegacyPsbtTransaction({ chain: Chain.Bitcoin, legacyClient, tx });\n }\n\n const paths = Array.from({ length: tx.inputsLength }, () => configuredPath);\n return signWithPaths({ inputUtxos, paths, tx }).then(finalizeToHex);\n }\n\n return {\n connect: async () => {\n if (legacyClient) return legacyClient.connect();\n await getSigner();\n },\n disconnect: async () => legacyClient?.disconnect(),\n getAddress: async () => {\n if (legacyClient) return legacyClient.getAddress();\n const signer = await getSigner();\n const wallet = await getWallet();\n const { address } = await executeLedgerDeviceAction({\n action: () =>\n signer.getWalletAddress(wallet, configuredPath.addressIndex, { change: configuredPath.change === 1 }),\n onDeviceActionState,\n });\n if (!address) {\n throw new SwapKitError(\"wallet_ledger_get_address_error\", { path: configuredPath.fullPath });\n }\n return address;\n },\n getExtendedPublicKey: async ({\n checkOnDevice = false,\n path = configuredPath.accountPath,\n }: GetExtendedPublicKeyParams = {}) => {\n if (legacyClient) return legacyClient.getExtendedPublicKey(path);\n const signer = await getSigner();\n const normalizedPath = normalizePath(path);\n const { extendedPublicKey } = await executeLedgerDeviceAction({\n action: () => signer.getExtendedPublicKey(normalizedPath, { checkOnDevice }),\n onDeviceActionState,\n });\n return extendedPublicKey;\n },\n getPublicKey,\n showAddressAndPubKey: async () => {\n if (legacyClient) {\n const address = await legacyClient.getAddress();\n return { address };\n }\n const signer = await getSigner();\n const wallet = await getWallet();\n return executeLedgerDeviceAction({\n action: () =>\n signer.getWalletAddress(wallet, configuredPath.addressIndex, {\n change: configuredPath.change === 1,\n checkOnDevice: true,\n }),\n onDeviceActionState,\n });\n },\n signTransaction: async (tx: Transaction) => {\n if (legacyClient) {\n // The legacy app returns a finalised transaction, as the other legacy UTXO chains do.\n const signedTxHex = await signLegacyPsbtTransaction({ chain: Chain.Bitcoin, legacyClient, tx });\n const { Transaction: TransactionClass } = await import(\"@swapkit/utxo-signer\");\n return TransactionClass.fromRaw(hex.decode(signedTxHex), { allowUnknownOutputs: true });\n }\n const paths = Array.from({ length: tx.inputsLength }, () => configuredPath);\n return await signWithPaths({ paths, tx });\n },\n signTransactionHex,\n signTransactionWithMultiplePaths: async ({\n derivationPaths,\n inputUtxos,\n tx,\n }: SignBitcoinTransactionWithMultiplePathsParams) => {\n if (inputUtxos) validateInputCount({ count: inputUtxos.length, tx });\n const paths = validateAccountPaths({ accountPath: configuredPath.accountPath, derivationPaths, tx });\n\n if (legacyClient) {\n const inputs = inputUtxos ?? (await extractInputsFromPsbt(tx, Chain.Bitcoin));\n return legacyClient.signTransactionWithMultiplePaths(\n tx,\n inputs,\n paths.map((path) => `m/${path.fullPath}`),\n );\n }\n\n return signWithPaths({ inputUtxos, paths, tx }).then(finalizeToHex);\n },\n };\n}\n",
11
+ "import type { UserInteractionRequired } from \"@ledgerhq/device-management-kit\";\nimport type BitcoinApp from \"@ledgerhq/hw-app-btc\";\nimport type { CreateTransactionArg } from \"@ledgerhq/hw-app-btc/lib-es/createTransaction\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { hex } from \"@scure/base\";\nimport { type DerivationPathArray, derivationPathToString, getWalletFormatFor, SwapKitError } from \"@swapkit/helpers\";\nimport type { UTXOType } from \"@swapkit/toolboxes/utxo\";\nimport type { Transaction } from \"@swapkit/utxo-signer\";\n\nimport {\n LEDGER_USER_INTERACTION_REQUIRED,\n type LedgerJsClientParams,\n normalizeLedgerJsClientParams,\n runLedgerJsOperation,\n} from \"../helpers/ledgerJsDmkBridge\";\nimport { splitOutputsForLegacyApp, withOutputAlignedFinalize } from \"./utxo-legacy-outputs\";\n\nconst nonSegwitLedgerChains = [\"bitcoin-cash\", \"dash\", \"dogecoin\", \"zcash\"];\n\ntype LedgerUTXOChain = \"bitcoin-cash\" | \"bitcoin\" | \"litecoin\" | \"dogecoin\" | \"dash\" | \"zcash\";\ntype UTXOLedgerParams = LedgerJsClientParams<DerivationPathArray | string>;\n\n// The Bitcoin Cash, Dash, Dogecoin and Litecoin apps are built on lib-app-bitcoin, which checks every output in a\n// 100-byte buffer (see utxo-legacy-outputs). Bitcoin signs through app-bitcoin-new, and clients/zcash.ts refuses to sign\n// over the legacy Zcash client.\nconst libAppBitcoinChains: LedgerUTXOChain[] = [\"bitcoin-cash\", \"dash\", \"dogecoin\", \"litecoin\"];\n\nconst ledgerAppNames: Record<LedgerUTXOChain, string> = {\n bitcoin: \"Bitcoin\",\n \"bitcoin-cash\": \"Bitcoin Cash\",\n dash: \"Dash\",\n dogecoin: \"Dogecoin\",\n litecoin: \"Litecoin\",\n zcash: \"Zcash\",\n};\n\ntype Params = {\n outputScriptHex: string;\n inputUtxos: UTXOType[];\n btcApp: BitcoinApp;\n derivationPath: string;\n chain: LedgerUTXOChain;\n};\n\ntype MultiPathParams = Omit<Params, \"derivationPath\"> & {\n /** Derivation paths for each input - one per input */\n derivationPaths: string[];\n};\n\nconst signUTXOTransaction = (\n { outputScriptHex, inputUtxos, btcApp, derivationPath, chain }: Params,\n options?: Partial<CreateTransactionArg>,\n) => {\n const inputs = inputUtxos.map((item) => {\n const splitTx = btcApp.splitTransaction(\n item.txHex || \"\",\n !nonSegwitLedgerChains.includes(chain),\n chain === \"zcash\",\n );\n\n return [splitTx, item.index, undefined as string | null | undefined, undefined as number | null | undefined] as any;\n });\n\n // hw-app-btc derives the signing policy from these flags:\n // additionals [\"bech32\"] + segwit → wpkh (native segwit, m/84')\n // no additionals + segwit → sh(wpkh) (P2SH-P2WPKH, m/49')\n // no additionals + !segwit → pkh (legacy, m/44')\n // They must match the derivation path or the BTC app rejects with 0x6a80.\n const format = getWalletFormatFor(derivationPath);\n const segwit = format !== \"legacy\";\n const params: CreateTransactionArg = {\n additionals: format === \"bech32\" ? [\"bech32\"] : [],\n associatedKeysets: inputs.map(() => derivationPath),\n inputs,\n outputScriptHex,\n segwit,\n useTrustedInputForSegwit: segwit,\n };\n\n return btcApp.createPaymentTransaction({ ...params, ...options });\n};\n\n/**\n * Sign a UTXO transaction with multiple derivation paths.\n * Each input can have its own derivation path for HD wallet multi-address support.\n */\nconst signUTXOTransactionWithMultiplePaths = (\n { outputScriptHex, inputUtxos, btcApp, derivationPaths, chain }: MultiPathParams,\n options?: Partial<CreateTransactionArg>,\n) => {\n if (derivationPaths.length !== inputUtxos.length) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n message: `Derivation paths count (${derivationPaths.length}) must match inputs count (${inputUtxos.length})`,\n });\n }\n\n const inputs = inputUtxos.map((item) => {\n const splitTx = btcApp.splitTransaction(\n item.txHex || \"\",\n !nonSegwitLedgerChains.includes(chain),\n chain === \"zcash\",\n );\n\n return [splitTx, item.index, undefined as string | null | undefined, undefined as number | null | undefined] as any;\n });\n\n // Same policy/path matching rules as signUTXOTransaction; all paths share\n // one account so the first path determines the format.\n const format = getWalletFormatFor(derivationPaths[0] ?? \"\");\n const segwit = format !== \"legacy\";\n const params: CreateTransactionArg = {\n additionals: format === \"bech32\" ? [\"bech32\"] : [],\n associatedKeysets: derivationPaths,\n inputs,\n outputScriptHex,\n segwit,\n useTrustedInputForSegwit: segwit,\n };\n\n return btcApp.createPaymentTransaction({ ...params, ...options });\n};\n\nconst BaseLedgerUTXO = ({\n chain,\n additionalSignParams,\n}: {\n chain: LedgerUTXOChain;\n additionalSignParams?: Partial<CreateTransactionArg>;\n}) => {\n const usesLibAppBitcoin = libAppBitcoinChains.includes(chain);\n\n return (paramsOrPath?: UTXOLedgerParams | DerivationPathArray | string, transport?: Transport) => {\n const { derivationPath: derivationPathParam, ...connection } = normalizeLedgerJsClientParams({\n paramsOrPath,\n transport,\n });\n const derivationPath =\n typeof derivationPathParam === \"string\"\n ? derivationPathParam\n : derivationPathToString(derivationPathParam as DerivationPathArray);\n const format = getWalletFormatFor(derivationPath);\n\n async function runBtcOperation<Output>({\n operation,\n requiredUserInteraction,\n }: {\n operation: (app: InstanceType<typeof BitcoinApp>) => Promise<Output> | Output;\n requiredUserInteraction?: UserInteractionRequired;\n }) {\n const BitcoinApp = (await import(\"@ledgerhq/hw-app-btc\")).default;\n return runLedgerJsOperation({\n appName: ledgerAppNames[chain],\n connection,\n // A wrapper per operation, so no collected output chunk outlives the operation that sent it.\n createApp: (ledgerTransport) =>\n new BitcoinApp({\n currency: chain,\n transport: usesLibAppBitcoin ? withOutputAlignedFinalize(ledgerTransport, chain) : ledgerTransport,\n }),\n operation,\n requiredUserInteraction,\n });\n }\n\n // The outputs hw-app-btc streams to the app, checked before any device call so that an output the app cannot\n // buffer fails with a typed error rather than a 0x6a80 from the device.\n async function getOutputScriptHex(tx: Transaction): Promise<string> {\n const [{ splitTransaction }, { serializeTransactionOutputs }] = await Promise.all([\n import(\"@ledgerhq/hw-app-btc/splitTransaction\"),\n import(\"@ledgerhq/hw-app-btc/serializeTransaction\"),\n ]);\n const outputs = serializeTransactionOutputs(splitTransaction(hex.encode(tx.unsignedTx), true));\n if (usesLibAppBitcoin) splitOutputsForLegacyApp(outputs, chain);\n\n return outputs.toString(\"hex\");\n }\n\n return {\n connect: async () => {\n await runBtcOperation({ operation: async () => true });\n },\n disconnect: async () => {},\n getAddress: async () => {\n const { toCashAddress } = await import(\"@swapkit/toolboxes/utxo\");\n const { bitcoinAddress: address } = await runBtcOperation({\n operation: (app) => app.getWalletPublicKey(derivationPath, { format }),\n });\n\n if (!address) {\n throw new SwapKitError(\"wallet_ledger_get_address_error\", {\n message: `Cannot get ${chain} address from ledger derivation path: ${derivationPath}`,\n });\n }\n\n return chain === \"bitcoin-cash\" && format === \"legacy\"\n ? toCashAddress(address).replace(/(bchtest:|bitcoincash:)/, \"\")\n : address;\n },\n getExtendedPublicKey: async (path = \"84'/0'/0'\", xpubVersion = 76067358) => {\n return await runBtcOperation({ operation: (app) => app.getWalletXpub({ path, xpubVersion }) });\n },\n\n signTransaction: async (tx: Transaction, inputUtxos: UTXOType[]) => {\n const outputScriptHex = await getOutputScriptHex(tx);\n return await runBtcOperation({\n operation: (app) =>\n signUTXOTransaction(\n { btcApp: app, chain, derivationPath, inputUtxos, outputScriptHex },\n additionalSignParams,\n ),\n requiredUserInteraction: LEDGER_USER_INTERACTION_REQUIRED.SignTransaction,\n });\n },\n\n /**\n * Sign a transaction with multiple derivation paths for HD wallet multi-address support.\n * Each input can be signed with its own derivation path.\n */\n signTransactionWithMultiplePaths: async (tx: Transaction, inputUtxos: UTXOType[], derivationPaths: string[]) => {\n const outputScriptHex = await getOutputScriptHex(tx);\n return await runBtcOperation({\n operation: (app) =>\n signUTXOTransactionWithMultiplePaths(\n { btcApp: app, chain, derivationPaths, inputUtxos, outputScriptHex },\n additionalSignParams,\n ),\n requiredUserInteraction: LEDGER_USER_INTERACTION_REQUIRED.SignTransaction,\n });\n },\n };\n };\n};\n\nexport const BitcoinLedger = BaseLedgerUTXO({ chain: \"bitcoin\" });\nexport const LitecoinLedger = BaseLedgerUTXO({ chain: \"litecoin\" });\n\n// \"abc\" makes hw-app-btc sign with BIP143, which SIGHASH_ALL | SIGHASH_FORKID (0x41) requires, and \"cashaddr\" opens\n// the transaction with HASH_INPUT_START P2 0x03 so the app shows the outputs as CashAddr, as the dApp does. Trusted\n// inputs (useTrustedInputForSegwit covers every BIP143 transaction) let the app take each amount from a previous\n// transaction it hashed itself; without them it warns about unverified inputs once per transaction. Ledger Live signs\n// CashAddr recipients the same way, with trusted inputs from app 1.4.0.\nexport const BitcoinCashLedger = BaseLedgerUTXO({\n additionalSignParams: {\n additionals: [\"abc\", \"cashaddr\"],\n segwit: false,\n sigHashType: 0x41,\n useTrustedInputForSegwit: true,\n },\n chain: \"bitcoin-cash\",\n});\n\nexport const DogecoinLedger = BaseLedgerUTXO({\n additionalSignParams: { additionals: [], segwit: false, useTrustedInputForSegwit: false },\n chain: \"dogecoin\",\n});\n\nexport const DashLedger = BaseLedgerUTXO({\n additionalSignParams: { additionals: [], segwit: false, useTrustedInputForSegwit: false },\n chain: \"dash\",\n});\n\nexport const ZcashLedger = BaseLedgerUTXO({\n additionalSignParams: {\n additionals: [\"zcash\", \"sapling\"],\n expiryHeight: (() => {\n const buf = Buffer.alloc(4);\n buf.writeUInt32LE(0);\n return buf;\n })(),\n lockTime: 0,\n segwit: false,\n useTrustedInputForSegwit: false,\n },\n chain: \"zcash\",\n});\n",
12
+ "import type { UnknownDeviceExchangeError, UserInteractionRequired } from \"@ledgerhq/device-management-kit\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { type DerivationPathArray, SwapKitError } from \"@swapkit/helpers\";\n\nimport { getLedgerDMKSession, type LedgerDMKSession } from \"./dmk\";\nimport {\n executeLedgerDeviceAction,\n LEDGER_USER_INTERACTION_REQUIRED,\n type LedgerDeviceActionStateHandler,\n toLedgerDeviceError,\n} from \"./executeDeviceAction\";\n\nexport { LEDGER_USER_INTERACTION_REQUIRED };\n\nexport interface LedgerJsClientConnection {\n dmkSession?: LedgerDMKSession;\n onDeviceActionState?: LedgerDeviceActionStateHandler;\n transport?: Transport;\n}\n\nexport interface LedgerJsClientParams<Path extends DerivationPathArray | string = DerivationPathArray | string>\n extends LedgerJsClientConnection {\n derivationPath?: Path;\n}\n\n// `Array.isArray` does not narrow the readonly `DerivationPathArray` tuples out of the union.\nfunction isLedgerJsClientParams<Path extends DerivationPathArray | string>(\n value: LedgerJsClientParams<Path> | Path | undefined,\n): value is LedgerJsClientParams<Path> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function normalizeLedgerJsClientParams<Path extends DerivationPathArray | string>({\n paramsOrPath,\n transport,\n}: {\n paramsOrPath?: LedgerJsClientParams<Path> | Path;\n transport?: Transport;\n}): LedgerJsClientParams<Path> {\n if (isLedgerJsClientParams(paramsOrPath)) return paramsOrPath;\n return { derivationPath: paramsOrPath as Path | undefined, transport };\n}\n\nexport async function runLedgerJsOperation<App, Output>({\n appName,\n connection,\n createApp,\n operation,\n requiredUserInteraction = LEDGER_USER_INTERACTION_REQUIRED.None,\n}: {\n appName: string;\n connection: LedgerJsClientConnection;\n createApp: (transport: Transport) => App;\n operation: (app: App) => Promise<Output> | Output;\n requiredUserInteraction?: UserInteractionRequired;\n}) {\n const { dmkSession, onDeviceActionState, transport } = connection;\n\n if (dmkSession && transport) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n message: \"Provide either a Ledger DMK session or a LedgerJS transport, not both\",\n });\n }\n\n if (transport) {\n try {\n return await operation(createApp(transport));\n } catch (error) {\n // hw-transport rejects with status errors; map them as the DMK path below does.\n throw toLedgerDeviceError(error);\n }\n }\n\n const session = dmkSession ?? (await getLedgerDMKSession());\n\n // Loaded before the action is built, so a chunk that fails to load rejects before the app opens. The bridge\n // transport stays lazy because its hw-transport base class does not load under Node ESM (see its module).\n const [{ CallTaskInAppDeviceAction, DmkResultFactory, UnknownDeviceExchangeError }, { LedgerJsDmkTransport }] =\n await Promise.all([import(\"@ledgerhq/device-management-kit\"), import(\"./ledgerJsDmkTransport\")]);\n\n const deviceAction = new CallTaskInAppDeviceAction<\n { output: Output },\n UnknownDeviceExchangeError,\n UserInteractionRequired\n >({\n input: {\n appName,\n requiredUserInteraction,\n skipOpenApp: false,\n task: async (internalApi) => {\n try {\n const output = await operation(createApp(new LedgerJsDmkTransport(internalApi)));\n return DmkResultFactory<{ output: Output }, UnknownDeviceExchangeError>({ data: { output } });\n } catch (error) {\n return DmkResultFactory<{ output: Output }, UnknownDeviceExchangeError>({\n error: new UnknownDeviceExchangeError(error),\n });\n }\n },\n },\n });\n\n const result = await executeLedgerDeviceAction({\n action: () => session.dmk.executeDeviceAction({ deviceAction, sessionId: session.sessionId }),\n onDeviceActionState,\n });\n\n return result.output;\n}\n",
13
+ "import type Transport from \"@ledgerhq/hw-transport\";\nimport { SwapKitError } from \"@swapkit/helpers\";\n\n/**\n * lib-app-bitcoin, behind the Bitcoin Cash, Dash, Dogecoin and Litecoin apps, collects the output it is checking in a\n * 100-byte buffer (MAX_OUTPUT_TO_CHECK) while signing the first input. It tests every HASH_INPUT_FINALIZE_FULL payload\n * against the room left in that buffer before appending it, and rejects one that does not fit with 0x6a80 (\"Output is\n * too long to be checked\"); a complete output leaves the buffer once the user has approved it.\n */\nconst LEGACY_APP_MAX_OUTPUT_LENGTH = 100;\n\nconst HASH_INPUT_FINALIZE_FULL = { cla: 0xe0, ins: 0x4a } as const;\nconst FINALIZE_P1_MORE = 0x00;\nconst FINALIZE_P1_LAST = 0x80;\n// The app's own reply to a FINALIZE_P1_MORE APDU: a zero byte and 0x9000.\nconst FINALIZE_MORE_RESPONSE = [0x00, 0x90, 0x00];\n\n// Bitcoin CompactSize. The 8-byte form describes nothing the app accepts, so it reads as malformed.\nfunction readCompactSize(bytes: Uint8Array, offset: number): { size: number; value: number } | undefined {\n const marker = bytes[offset];\n if (marker === undefined || marker === 0xff) return undefined;\n if (marker < 0xfd) return { size: 1, value: marker };\n\n const width = marker === 0xfd ? 2 : 4;\n if (offset + 1 + width > bytes.length) return undefined;\n const view = new DataView(bytes.buffer, bytes.byteOffset + offset + 1, width);\n return { size: 1 + width, value: width === 2 ? view.getUint16(0, true) : view.getUint32(0, true) };\n}\n\n/**\n * Splits serialised transaction outputs (the output count, then each output) into one piece per output, the first\n * carrying the count, so that every piece the legacy app receives ends on an output boundary. Rejects a malformed\n * stream and any piece the app cannot buffer.\n */\nexport function splitOutputsForLegacyApp(outputs: Uint8Array, chain: string): Uint8Array[] {\n const invalidOutputs = (reason: string, info: Record<string, number> = {}) =>\n new SwapKitError({\n errorKey: \"wallet_ledger_invalid_params\",\n info: {\n chain,\n maxLength: LEGACY_APP_MAX_OUTPUT_LENGTH,\n operation: \"splitOutputsForLegacyApp\",\n outputsLength: outputs.length,\n reason,\n ...info,\n },\n });\n\n const count = readCompactSize(outputs, 0);\n if (!count?.value) throw invalidOutputs(\"Transaction outputs do not start with a readable non-zero output count\");\n\n const pieces: Uint8Array[] = [];\n let offset = count.size;\n for (let outputIndex = 0; outputIndex < count.value; outputIndex += 1) {\n // An output is an 8-byte amount, the script length and the script; the first piece also carries the count.\n const pieceStart = outputIndex === 0 ? 0 : offset;\n const scriptLength = readCompactSize(outputs, offset + 8);\n const outputEnd = scriptLength ? offset + 8 + scriptLength.size + scriptLength.value : undefined;\n if (!outputEnd || outputEnd > outputs.length) {\n throw invalidOutputs(\"Transaction output is truncated\", { outputIndex });\n }\n\n const pieceLength = outputEnd - pieceStart;\n if (pieceLength > LEGACY_APP_MAX_OUTPUT_LENGTH) {\n throw invalidOutputs(\"Output is longer than the Ledger app can check; shorten the memo\", {\n outputIndex,\n pieceLength,\n });\n }\n\n pieces.push(outputs.subarray(pieceStart, outputEnd));\n offset = outputEnd;\n }\n\n if (offset !== outputs.length) {\n throw invalidOutputs(\"Transaction outputs are followed by trailing bytes\", {\n trailingBytes: outputs.length - offset,\n });\n }\n\n return pieces;\n}\n\n/**\n * hw-app-btc streams the outputs in fixed 50-byte HASH_INPUT_FINALIZE_FULL chunks. Each chunk has to fit the app's\n * buffer beside whatever unfinished output earlier chunks left there, which fails for longer memo outputs (in the\n * SDK's [vault, memo, change] order, from a 56-byte memo with P2PKH outputs and a 59-byte memo on Litecoin). Collect\n * the chunks of each stream and resend it one output per APDU: each APDU then meets an empty buffer, so any output of\n * up to 100 bytes (the first together with the output count) fits, and the bytes, and so the hashes, stay the same.\n * hw-app-btc ignores every response to these APDUs, so a collected chunk gets the app's own reply and the last one\n * returns the device's. The change-path APDU (P1 0xff) and every other APDU pass straight through.\n */\nexport function withOutputAlignedFinalize(transport: Transport, chain: string): Transport {\n let chunks: Buffer[] = [];\n\n const send: Transport[\"send\"] = async (cla, ins, p1, p2, data = Buffer.alloc(0), ...rest) => {\n const isOutputChunk =\n cla === HASH_INPUT_FINALIZE_FULL.cla &&\n ins === HASH_INPUT_FINALIZE_FULL.ins &&\n (p1 === FINALIZE_P1_MORE || p1 === FINALIZE_P1_LAST);\n if (!isOutputChunk) return transport.send(cla, ins, p1, p2, data, ...rest);\n\n chunks.push(data);\n if (p1 === FINALIZE_P1_MORE) return Buffer.from(FINALIZE_MORE_RESPONSE);\n\n const outputs = Buffer.concat(chunks);\n chunks = [];\n const pieces = splitOutputsForLegacyApp(outputs, chain);\n\n let response: Buffer = Buffer.alloc(0);\n for (const [index, piece] of pieces.entries()) {\n const pieceP1 = index === pieces.length - 1 ? FINALIZE_P1_LAST : FINALIZE_P1_MORE;\n response = await transport.send(cla, ins, pieceP1, p2, Buffer.from(piece), ...rest);\n }\n return response;\n };\n\n // A Proxy rather than a copy, so the app-API lock and every other field stay on the caller's transport.\n return new Proxy(transport, {\n get: (target, property, receiver) => (property === \"send\" ? send : Reflect.get(target, property, receiver)),\n });\n}\n",
14
+ "import type { StdSignDoc } from \"@cosmjs/amino\";\nimport type { SignerCosmos } from \"@ledgerhq/device-signer-kit-cosmos\";\nimport type LegacyCosmosApp from \"@ledgerhq/hw-app-cosmos\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { hex } from \"@scure/base\";\nimport {\n type DerivationPathArray,\n derivationPathToString,\n NetworkDerivationPath,\n SwapKitError,\n} from \"@swapkit/helpers\";\nimport type { OfflineAminoSigner } from \"@swapkit/toolboxes/cosmos\";\n\nimport type { LedgerDMKSession } from \"../helpers/dmk\";\nimport { createLedgerSessionSigner } from \"../helpers/dmk\";\nimport {\n executeLedgerDeviceAction,\n type LedgerDeviceActionStateHandler,\n toLedgerDeviceError,\n ZONDAX_USER_REFUSED_STATUS_WORDS,\n} from \"../helpers/executeDeviceAction\";\nimport { toLowSSignature } from \"../helpers/lowS\";\n\ninterface CosmosLedgerParams {\n derivationPath?: DerivationPathArray | string;\n dmkSession?: LedgerDMKSession;\n onDeviceActionState?: LedgerDeviceActionStateHandler;\n transport?: Transport;\n}\n\ninterface CosmosAddressAndPublicKey {\n address: string;\n publicKey: string;\n}\n\nfunction normalizeCosmosPath(path: DerivationPathArray | string) {\n const normalized = (typeof path === \"string\" ? path : derivationPathToString(path))\n .replace(/^m\\//, \"\")\n .replace(/^\\/+/, \"\");\n\n if (!/^44'\\/118'\\/\\d+'\\/(0|1)\\/\\d+$/.test(normalized)) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n path: normalized,\n reason: \"Expected a five-level Cosmos derivation path with coin type 118\",\n });\n }\n\n return normalized;\n}\n\n// cosmjs is CJS and `require`s ESM-only `@scure/base`; loading it lazily keeps Bun from rejecting that\n// require when the module graph also contains the ESM-only `@swapkit/*` packages.\nasync function normalizeCosmosSignature(signature: Uint8Array) {\n const { Secp256k1Signature } = await import(\"@cosmjs/crypto\");\n try {\n return toLowSSignature(\n signature.length === 64\n ? Secp256k1Signature.fromFixedLength(signature).toFixedLength()\n : Secp256k1Signature.fromDer(signature).toFixedLength(),\n );\n } catch (error) {\n throw new SwapKitError(\"wallet_ledger_invalid_response\", error);\n }\n}\n\nexport class CosmosLedger {\n readonly chain = \"cosmos\";\n readonly derivationPath: string;\n private readonly onDeviceActionState?: LedgerDeviceActionStateHandler;\n private readonly transport?: Transport;\n private legacyAppPromise?: Promise<LegacyCosmosApp>;\n private pubKey: string | null = null;\n private readonly getSessionSigner: () => Promise<SignerCosmos>;\n\n constructor({\n derivationPath = NetworkDerivationPath.GAIA,\n dmkSession,\n onDeviceActionState,\n transport,\n }: CosmosLedgerParams = {}) {\n this.derivationPath = normalizeCosmosPath(derivationPath);\n this.getSessionSigner = createLedgerSessionSigner({\n build: async (session) => {\n const { SignerCosmosBuilder } = await import(\"@ledgerhq/device-signer-kit-cosmos\");\n return new SignerCosmosBuilder(session).build();\n },\n dmkSession,\n });\n this.onDeviceActionState = onDeviceActionState;\n this.transport = transport;\n }\n\n private getSigner() {\n if (this.transport) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n reason: \"A Device Signer Kit operation is unavailable when a legacy transport is supplied\",\n });\n }\n\n return this.getSessionSigner();\n }\n\n private getLegacyApp() {\n if (!this.transport) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", { reason: \"Legacy Cosmos transport is unavailable\" });\n }\n\n this.legacyAppPromise ??= import(\"@ledgerhq/hw-app-cosmos\").then(\n ({ default: CosmosApp }) => new CosmosApp(this.transport as Transport),\n );\n return this.legacyAppPromise;\n }\n\n // An injected LedgerJS transport rejects with hw-transport and hw-app-cosmos errors; map them as the signer kit\n // path below does.\n private async runLegacyOperation<Output>(operation: (app: LegacyCosmosApp) => Promise<Output>) {\n const app = await this.getLegacyApp();\n try {\n return await operation(app);\n } catch (error) {\n throw toLedgerDeviceError(error, { userRefusedStatusWords: ZONDAX_USER_REFUSED_STATUS_WORDS });\n }\n }\n\n private async signBytes(message: Uint8Array) {\n if (this.transport) {\n const response = await this.runLegacyOperation((app) =>\n app.sign(this.derivationPath, new TextDecoder().decode(message)),\n );\n if (response.return_code !== 0x9000 || !response.signature) {\n throw new SwapKitError(\"wallet_ledger_invalid_response\", { returnCode: response.return_code });\n }\n return normalizeCosmosSignature(response.signature);\n }\n\n const signer = await this.getSigner();\n const signature = await executeLedgerDeviceAction({\n action: () => signer.signTransaction(this.derivationPath, this.chain, message),\n onDeviceActionState: this.onDeviceActionState,\n userRefusedStatusWords: ZONDAX_USER_REFUSED_STATUS_WORDS,\n });\n return normalizeCosmosSignature(signature);\n }\n\n async connect() {\n if (this.transport) await this.getLegacyApp();\n else await this.getSigner();\n\n const { address, publicKey } = await this.getAddressAndPubKey();\n this.pubKey = Buffer.from(publicKey, \"hex\").toString(\"base64\");\n return address;\n }\n\n async disconnect() {}\n\n async getAddressAndPubKey(): Promise<CosmosAddressAndPublicKey> {\n if (this.transport) {\n return this.runLegacyOperation((app) => app.getAddress(this.derivationPath, this.chain));\n }\n\n const signer = await this.getSigner();\n const { address, publicKey } = await executeLedgerDeviceAction({\n action: () => signer.getAddress(this.derivationPath, this.chain),\n onDeviceActionState: this.onDeviceActionState,\n userRefusedStatusWords: ZONDAX_USER_REFUSED_STATUS_WORDS,\n });\n return { address, publicKey: hex.encode(publicKey) };\n }\n\n async showAddressAndPubKey(): Promise<CosmosAddressAndPublicKey> {\n if (this.transport) {\n return this.runLegacyOperation((app) => app.getAddress(this.derivationPath, this.chain, true));\n }\n\n const signer = await this.getSigner();\n const { address, publicKey } = await executeLedgerDeviceAction({\n action: () => signer.getAddress(this.derivationPath, this.chain, { checkOnDevice: true }),\n onDeviceActionState: this.onDeviceActionState,\n userRefusedStatusWords: ZONDAX_USER_REFUSED_STATUS_WORDS,\n });\n return { address, publicKey: hex.encode(publicKey) };\n }\n\n async signTransaction(rawTx: string | Uint8Array, sequence = \"0\") {\n const signature = await this.signBytes(typeof rawTx === \"string\" ? new TextEncoder().encode(rawTx) : rawTx);\n if (!this.pubKey) {\n const { publicKey } = await this.getAddressAndPubKey();\n this.pubKey = Buffer.from(publicKey, \"hex\").toString(\"base64\");\n }\n\n return [{ pub_key: { type: \"tendermint/PubKeySecp256k1\", value: this.pubKey }, sequence, signature }];\n }\n\n // Typed against the toolbox signer contract so CosmosLedger satisfies `createSigningStargateClient`.\n async signAmino(\n signerAddress: string,\n signDoc: Parameters<OfflineAminoSigner[\"signAmino\"]>[1],\n ): ReturnType<OfflineAminoSigner[\"signAmino\"]> {\n const accounts = await this.getAccounts();\n const account = accounts.find(({ address }) => address === signerAddress);\n if (!account) {\n throw new SwapKitError(\"wallet_ledger_address_not_found\", { address: signerAddress });\n }\n\n const { encodeSecp256k1Signature, serializeSignDoc } = await import(\"@cosmjs/amino\");\n const signature = await this.signBytes(serializeSignDoc(signDoc as StdSignDoc));\n return { signature: encodeSecp256k1Signature(account.pubkey, signature), signed: signDoc };\n }\n\n async getAccounts() {\n const { address, publicKey } = await this.getAddressAndPubKey();\n return [{ address, algo: \"secp256k1\" as const, pubkey: hex.decode(publicKey) }];\n }\n}\n",
15
+ "const SECP256K1_ORDER = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n;\nconst HALF_ORDER = SECP256K1_ORDER >> 1n;\n\nfunction bytesToBigInt(bytes: Uint8Array) {\n return bytes.reduce((value, byte) => (value << 8n) | BigInt(byte), 0n);\n}\n\nfunction bigIntTo32Bytes(value: bigint) {\n const bytes = new Uint8Array(32);\n let remaining = value;\n for (let index = 31; index >= 0; index -= 1) {\n bytes[index] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n return bytes;\n}\n\n/**\n * Cosmos SDK rejects high-S secp256k1 signatures. Ledger firmware should already return low-S, but\n * normalising a fixed-length `r || s` signature here removes the dependency on it.\n */\nexport function toLowSSignature(signature: Uint8Array) {\n const s = bytesToBigInt(signature.subarray(32, 64));\n if (s <= HALF_ORDER) return signature;\n\n const normalized = new Uint8Array(64);\n normalized.set(signature.subarray(0, 32), 0);\n normalized.set(bigIntTo32Bytes(SECP256K1_ORDER - s), 32);\n return normalized;\n}\n",
16
+ "import type { BlindSigningReporter } from \"@ledgerhq/context-module\";\nimport type { TypedDataDomain as LedgerTypedDataDomain, SignerEth } from \"@ledgerhq/device-signer-kit-ethereum\";\nimport {\n ChainId,\n type DerivationPathArray,\n derivationPathToString,\n NetworkDerivationPath,\n SwapKitError,\n} from \"@swapkit/helpers\";\nimport {\n AbstractSigner,\n type Provider,\n type TransactionLike,\n type TransactionRequest,\n type TypedDataDomain,\n type TypedDataField,\n} from \"ethers\";\n\nimport { createLedgerSessionSigner, type LedgerDMKSession } from \"../helpers/dmk\";\nimport { executeLedgerDeviceAction, type LedgerDeviceActionStateHandler } from \"../helpers/executeDeviceAction\";\n\ninterface EVMLedgerParams {\n dmkSession?: LedgerDMKSession;\n provider: Provider;\n derivationPath?: DerivationPathArray | string;\n chainId?: ChainId;\n onDeviceActionState?: LedgerDeviceActionStateHandler;\n originToken?: string;\n}\n\nfunction selectTypedDataTypes({\n primaryType,\n types,\n}: {\n primaryType: string;\n types: Record<string, TypedDataField[]>;\n}) {\n const selectedTypes: Record<string, TypedDataField[]> = {};\n\n function addType(typeName: string) {\n if (Object.hasOwn(selectedTypes, typeName) || !Object.hasOwn(types, typeName)) return;\n const fields = types[typeName];\n if (!fields) return;\n\n selectedTypes[typeName] = fields;\n for (const field of fields) addType(field.type.replace(/\\[[0-9]*\\]/g, \"\"));\n }\n\n addType(primaryType);\n\n if (!Object.hasOwn(selectedTypes, primaryType)) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n primaryType,\n reason: \"The EIP-712 primary type is not defined\",\n });\n }\n\n return selectedTypes;\n}\n\nconst disabledBlindSigningReporter: BlindSigningReporter = {\n // The context module ignores the result; the cast avoids depending on purify-ts for an unused Either.\n report: () => Promise.resolve(undefined as unknown as Awaited<ReturnType<BlindSigningReporter[\"report\"]>>),\n};\n\nclass EVMLedgerInterface extends AbstractSigner {\n chainId: ChainId = ChainId.Ethereum;\n derivationPath = \"\";\n private readonly dmkSession?: LedgerDMKSession;\n private readonly getLedgerSigner: () => Promise<SignerEth>;\n private readonly onDeviceActionState?: LedgerDeviceActionStateHandler;\n private readonly originToken?: string;\n\n constructor({\n provider,\n dmkSession,\n derivationPath = NetworkDerivationPath.OP,\n chainId = ChainId.Optimism,\n onDeviceActionState,\n originToken,\n }: EVMLedgerParams) {\n super(provider);\n\n this.chainId = chainId || ChainId.Ethereum;\n this.derivationPath = (\n typeof derivationPath === \"string\" ? derivationPath : derivationPathToString(derivationPath)\n ).replace(/^m\\//, \"\");\n this.dmkSession = dmkSession;\n this.onDeviceActionState = onDeviceActionState;\n this.originToken = originToken;\n this.getLedgerSigner = createLedgerSessionSigner({\n build: async (session) => {\n const [{ ContextModuleBuilder, ContextModuleChainID }, { SignerEthBuilder }] = await Promise.all([\n import(\"@ledgerhq/context-module\"),\n import(\"@ledgerhq/device-signer-kit-ethereum\"),\n ]);\n // Same context module the signer kit builds by default, minus the blind-signing reporter that\n // would post chain, target address and device model to Ledger on every signature.\n const contextModule = new ContextModuleBuilder({\n loggerFactory: (tag) => session.dmk.getLoggerFactory()([\"ContextModule\", tag]),\n originToken,\n })\n .setChain(ContextModuleChainID.Ethereum)\n .setBlindSigningReporter(disabledBlindSigningReporter)\n .build();\n // The signer kit also calls the optional sign reporter after every signature. 2.6.0 leaves it unset\n // and offers no builder setter, so keep it inert in case a later 2.x release wires it up.\n contextModule.signReport = () => Promise.resolve();\n\n return new SignerEthBuilder({ ...session, originToken }).withContextModule(contextModule).build();\n },\n dmkSession,\n });\n\n Object.defineProperty(this, \"provider\", { enumerable: true, value: provider || null, writable: false });\n }\n\n connect = (provider: Provider) =>\n new EVMLedgerInterface({\n chainId: this.chainId,\n derivationPath: this.derivationPath,\n dmkSession: this.dmkSession,\n onDeviceActionState: this.onDeviceActionState,\n originToken: this.originToken,\n provider,\n });\n\n getAddress = async () => {\n const { address } = await this.getAddressAndPubKey();\n if (!address) throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n return address;\n };\n\n getAddressAndPubKey = async () => {\n const ledgerSigner = await this.getLedgerSigner();\n\n return executeLedgerDeviceAction({\n action: () => ledgerSigner.getAddress(this.derivationPath, { chainId: Number(this.chainId) }),\n onDeviceActionState: this.onDeviceActionState,\n });\n };\n\n showAddressAndPubKey = async () => {\n const ledgerSigner = await this.getLedgerSigner();\n\n return executeLedgerDeviceAction({\n action: () =>\n ledgerSigner.getAddress(this.derivationPath, { chainId: Number(this.chainId), checkOnDevice: true }),\n onDeviceActionState: this.onDeviceActionState,\n });\n };\n\n signMessage = async (message: string | Uint8Array) => {\n const { Signature, toUtf8Bytes } = await import(\"ethers\");\n const messageBytes = typeof message === \"string\" ? toUtf8Bytes(message) : message;\n const ledgerSigner = await this.getLedgerSigner();\n const signature = await executeLedgerDeviceAction({\n action: () => ledgerSigner.signMessage(this.derivationPath, messageBytes),\n onDeviceActionState: this.onDeviceActionState,\n });\n\n return Signature.from(signature).serialized;\n };\n\n signTypedData = async (\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>,\n explicitPrimaryType?: string,\n ) => {\n const { buildEIP712DomainType } = await import(\"@swapkit/toolboxes/evm\");\n const { hexlify, Signature, TypedDataEncoder } = await import(\"ethers\");\n const { EIP712Domain: _, ...filteredTypes } = types;\n const primaryType = explicitPrimaryType ?? TypedDataEncoder.from(filteredTypes).primaryType;\n const resolutionTypes = selectTypedDataTypes({ primaryType, types: filteredTypes });\n const populated = await TypedDataEncoder.resolveNames(domain, resolutionTypes, value, async (name) => {\n const resolvedAddress = await this.resolveName(name);\n if (!resolvedAddress) throw new SwapKitError(\"wallet_ledger_invalid_params\", { name });\n return resolvedAddress;\n });\n const chainId = populated.domain.chainId == null ? undefined : Number(populated.domain.chainId);\n\n if (chainId !== undefined && !Number.isSafeInteger(chainId)) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", { chainId: populated.domain.chainId });\n }\n\n const ledgerDomain = {\n ...(populated.domain.chainId != null && { chainId }),\n ...(populated.domain.name != null && { name: populated.domain.name }),\n ...(populated.domain.salt != null && { salt: hexlify(populated.domain.salt) }),\n ...(populated.domain.verifyingContract != null && { verifyingContract: populated.domain.verifyingContract }),\n ...(populated.domain.version != null && { version: populated.domain.version }),\n } satisfies LedgerTypedDataDomain;\n\n const typedData = {\n domain: ledgerDomain,\n message: populated.value,\n primaryType,\n // Only the primary type and its dependencies: the signer kit's legacy fallback hashes with ethers,\n // which rejects unused types.\n types: { EIP712Domain: buildEIP712DomainType(populated.domain), ...resolutionTypes },\n };\n\n const ledgerSigner = await this.getLedgerSigner();\n const signature = await executeLedgerDeviceAction({\n action: () => ledgerSigner.signTypedData(this.derivationPath, typedData),\n onDeviceActionState: this.onDeviceActionState,\n });\n\n return Signature.from(signature).serialized;\n };\n\n signTransaction = async (tx: TransactionRequest) => {\n const { copyRequest, getAddress, getBytes, resolveAddress, resolveProperties, Transaction } = await import(\n \"ethers\"\n );\n const request = copyRequest(tx);\n\n if (request.type === 4 || request.authorizationList?.length) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n message: \"Ledger Ethereum DSK does not support EIP-7702 transactions\",\n });\n }\n\n const expectedChainId = BigInt(this.chainId);\n\n if (request.chainId != null && request.chainId !== expectedChainId) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n chainId: request.chainId,\n expectedChainId,\n message: \"Transaction chainId does not match the Ledger client chain\",\n });\n }\n\n const { from, to } = await resolveProperties({\n from: request.from ? resolveAddress(request.from, this) : undefined,\n to: request.to ? resolveAddress(request.to, this) : undefined,\n });\n const signerAddress = from || request.nonce == null ? await this.getAddress() : undefined;\n\n if (from && signerAddress && getAddress(from) !== getAddress(signerAddress)) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n message: \"Transaction from address does not match the Ledger account\",\n });\n }\n\n if (to) request.to = to;\n delete request.from;\n delete request.authorizationList;\n request.chainId = expectedChainId;\n // ethers infers EIP-2930 for an untyped gasPrice-only request; sign it as legacy, as before the signer kit.\n const isUntypedLegacyRequest =\n request.type == null &&\n request.gasPrice != null &&\n request.accessList == null &&\n request.maxFeePerGas == null &&\n request.maxPriorityFeePerGas == null;\n if (isUntypedLegacyRequest) request.type = 0;\n request.nonce ??= await this.provider?.getTransactionCount(signerAddress ?? (await this.getAddress()));\n\n const baseTx = Transaction.from(request as TransactionLike<string>);\n const unsignedTransaction = getBytes(baseTx.unsignedSerialized);\n const ledgerSigner = await this.getLedgerSigner();\n const signature = await executeLedgerDeviceAction({\n action: () => ledgerSigner.signTransaction(this.derivationPath, unsignedTransaction),\n onDeviceActionState: this.onDeviceActionState,\n });\n\n baseTx.signature = signature;\n\n return baseTx.serialized;\n };\n}\n\ninterface LedgerParams {\n dmkSession?: LedgerDMKSession;\n provider: Provider;\n derivationPath?: DerivationPathArray;\n onDeviceActionState?: LedgerDeviceActionStateHandler;\n originToken?: string;\n}\n\nexport function ArbitrumLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.Arbitrum });\n}\n\nexport function ArcLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.Arc });\n}\n\nexport function AuroraLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.Aurora });\n}\n\nexport function AvalancheLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.Avalanche });\n}\n\nexport function BaseLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.Base });\n}\n\nexport function EthereumLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.Ethereum });\n}\n\nexport function GnosisLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.Gnosis });\n}\n\nexport function OptimismLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.Optimism });\n}\n\nexport function PolygonLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.Polygon });\n}\n\nexport function BinanceSmartChainLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.BinanceSmartChain });\n}\n\nexport function MonadLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.Monad });\n}\n\nexport function XLayerLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.XLayer });\n}\n\nexport function BerachainLedger(params: LedgerParams) {\n return new EVMLedgerInterface({ ...params, chainId: ChainId.Berachain });\n}\n",
17
+ "import type { UserInteractionRequired } from \"@ledgerhq/device-management-kit\";\nimport type Near from \"@ledgerhq/hw-app-near\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport type { SignedTransaction, Transaction } from \"@near-js/transactions\";\nimport { Chain, type DerivationPathArray, NetworkDerivationPath, SwapKitError } from \"@swapkit/helpers\";\nimport type { NearSigner } from \"@swapkit/toolboxes/near\";\n\nimport {\n LEDGER_USER_INTERACTION_REQUIRED,\n type LedgerJsClientParams,\n normalizeLedgerJsClientParams,\n runLedgerJsOperation,\n} from \"../helpers/ledgerJsDmkBridge\";\n\ntype NearLedgerParams = LedgerJsClientParams<DerivationPathArray>;\n\nexport async function getNearLedgerClient(\n paramsOrPath?: NearLedgerParams | DerivationPathArray,\n transport?: Transport,\n) {\n const { derivationPath, ...connection } = normalizeLedgerJsClientParams({ paramsOrPath, transport });\n const path = (derivationPath || NetworkDerivationPath[Chain.Near]).join(\"'/\").concat(\"'\");\n\n async function runNearOperation<Output>({\n operation,\n requiredUserInteraction,\n }: {\n operation: (app: Near) => Promise<Output>;\n requiredUserInteraction?: UserInteractionRequired;\n }) {\n const NearApp = (await import(\"@ledgerhq/hw-app-near\")).default;\n return runLedgerJsOperation({\n appName: \"NEAR\",\n connection,\n createApp: (ledgerTransport) => new NearApp(ledgerTransport),\n operation,\n requiredUserInteraction,\n });\n }\n\n const { address, publicKey } = await runNearOperation({ operation: (app) => app.getAddress(path) });\n\n const signer = {\n getAddress() {\n return Promise.resolve(address);\n },\n async getPublicKey() {\n const { PublicKey } = await import(\"@near-js/crypto\");\n const encodedPublicKey = publicKey.startsWith(\"ed25519:\") ? publicKey : `ed25519:${publicKey}`;\n return PublicKey.fromString(encodedPublicKey);\n },\n\n signDelegateAction(_delegateAction: unknown) {\n return Promise.reject(\n new SwapKitError(\"wallet_ledger_method_not_supported\", { method: \"signDelegateAction\", wallet: \"Ledger\" }),\n );\n },\n\n signNep413Message(\n _message: string,\n _accountId: string,\n _recipient: string,\n _nonce: Uint8Array,\n _callbackUrl?: string,\n ) {\n return Promise.reject(\n new SwapKitError(\"wallet_ledger_method_not_supported\", { method: \"signNep413Message\", wallet: \"Ledger\" }),\n );\n },\n\n async signTransaction(transaction: Transaction) {\n const { Signature, SignedTransaction } = await import(\"@near-js/transactions\");\n try {\n const signatureArray = await runNearOperation({\n operation: (app) => app.signTransaction(transaction.encode(), path),\n requiredUserInteraction: LEDGER_USER_INTERACTION_REQUIRED.SignTransaction,\n });\n if (!signatureArray) {\n throw new SwapKitError(\"wallet_ledger_signing_error\", { reason: \"Ledger returned no NEAR signature\" });\n }\n\n const signature = new Signature({ data: signatureArray, keyType: 0 });\n const signedTransaction = new SignedTransaction({ signature, transaction });\n\n return [signatureArray, signedTransaction] as [Uint8Array<ArrayBufferLike>, SignedTransaction];\n } catch (error) {\n if (error instanceof SwapKitError) throw error;\n throw new SwapKitError(\"wallet_ledger_signing_error\", { error });\n }\n },\n };\n\n return signer as NearSigner;\n}\n",
18
+ "import type { UserInteractionRequired } from \"@ledgerhq/device-management-kit\";\nimport type Sui from \"@ledgerhq/hw-app-sui\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport {\n Chain,\n type DerivationPathArray,\n derivationPathToString,\n NetworkDerivationPath,\n SwapKitError,\n} from \"@swapkit/helpers\";\n\nimport {\n LEDGER_USER_INTERACTION_REQUIRED,\n type LedgerJsClientParams,\n normalizeLedgerJsClientParams,\n runLedgerJsOperation,\n} from \"../helpers/ledgerJsDmkBridge\";\n\ntype SuiLedgerParams = LedgerJsClientParams<DerivationPathArray | string>;\n\nexport class SuiLedgerInterface {\n readonly derivationPath: string;\n address: string | null = null;\n publicKey: Uint8Array | null = null;\n private readonly connection: Omit<SuiLedgerParams, \"derivationPath\">;\n\n constructor(paramsOrPath?: SuiLedgerParams | DerivationPathArray | string, transport?: Transport) {\n const { derivationPath, ...connection } = normalizeLedgerJsClientParams({ paramsOrPath, transport });\n this.derivationPath =\n typeof derivationPath === \"string\"\n ? derivationPath\n : derivationPathToString(derivationPath || NetworkDerivationPath[Chain.Sui]);\n this.connection = connection;\n }\n\n // The Sui app wants every level hardened and no `m/`: m/44'/784'/0'/0/0 becomes 44'/784'/0'/0'/0'.\n private getLedgerPath() {\n return this.derivationPath.replace(/^m\\//, \"\").replace(/\\/(\\d+)\\/(\\d+)$/, \"/$1'/$2'\");\n }\n\n private async runSuiOperation<Output>({\n operation,\n requiredUserInteraction,\n }: {\n operation: (app: InstanceType<typeof Sui>) => Promise<Output>;\n requiredUserInteraction?: UserInteractionRequired;\n }) {\n const SuiApp = (await import(\"@ledgerhq/hw-app-sui\")).default;\n return runLedgerJsOperation({\n appName: \"Sui\",\n connection: this.connection,\n createApp: (ledgerTransport) => new SuiApp(ledgerTransport),\n operation,\n requiredUserInteraction,\n });\n }\n\n async connect() {\n const ledgerPath = this.getLedgerPath();\n const result = await this.runSuiOperation({ operation: (app) => app.getPublicKey(ledgerPath) });\n\n if (!result?.publicKey) throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n\n this.publicKey = result.publicKey;\n this.address = `0x${Buffer.from(result.address).toString(\"hex\")}`;\n\n return this.address;\n }\n\n toSuiAddress() {\n if (!this.address) throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n return this.address;\n }\n\n async getAddress() {\n if (this.address) return this.address;\n return await this.connect();\n }\n\n async signTransaction(input: Uint8Array | { transaction: Uint8Array }) {\n const txBytes = input instanceof Uint8Array ? input : input.transaction;\n if (!this.publicKey) throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n\n try {\n const ledgerPath = this.getLedgerPath();\n // The app signs the intent message, not the raw bytes. Its three-byte prefix (scope TransactionData,\n // version V0, app Sui) is all zeros, which the fresh buffer already holds.\n const intentMessage = new Uint8Array(3 + txBytes.length);\n intentMessage.set(txBytes, 3);\n\n const result = await this.runSuiOperation({\n operation: (app) => app.signTransaction(ledgerPath, intentMessage),\n requiredUserInteraction: LEDGER_USER_INTERACTION_REQUIRED.SignTransaction,\n });\n\n if (!result?.signature) throw new SwapKitError(\"wallet_ledger_signing_error\");\n\n const pubKey = this.publicKey.length === 33 ? this.publicKey.slice(1) : this.publicKey;\n if (pubKey.length !== 32) {\n throw new SwapKitError(\"wallet_ledger_signing_error\", { error: \"Invalid public key length\" });\n }\n\n // Sui serialised signature: Ed25519 flag (0x00), 64-byte signature, 32-byte public key.\n const serializedSignature = new Uint8Array(1 + 64 + 32);\n serializedSignature.set(result.signature, 1);\n serializedSignature.set(pubKey, 65);\n\n return {\n bytes: Buffer.from(txBytes).toString(\"base64\"),\n signature: Buffer.from(serializedSignature).toString(\"base64\"),\n };\n } catch (error) {\n if (error instanceof SwapKitError) throw error;\n throw new SwapKitError(\"wallet_ledger_signing_error\", { error });\n }\n }\n}\n\nexport function SuiLedger(paramsOrPath?: SuiLedgerParams | DerivationPathArray, transport?: Transport) {\n return new SuiLedgerInterface(paramsOrPath, transport);\n}\n",
19
+ "import type { AccountData, AminoSignResponse, StdSignDoc } from \"@cosmjs/amino\";\nimport type { Command, DmkError, UserInteractionRequired } from \"@ledgerhq/device-management-kit\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { base64, hex } from \"@scure/base\";\nimport { type DerivationPathArray, NetworkDerivationPath, SwapKitError } from \"@swapkit/helpers\";\n\nimport { getLedgerDMKSession, type LedgerDMKSession } from \"../../helpers/dmk\";\nimport {\n executeLedgerDeviceAction,\n LEDGER_USER_INTERACTION_REQUIRED,\n type LedgerDeviceActionStateHandler,\n toLedgerDeviceError,\n ZONDAX_USER_REFUSED_STATUS_WORDS,\n} from \"../../helpers/executeDeviceAction\";\nimport { toLowSSignature } from \"../../helpers/lowS\";\nimport {\n getThorAddressCommand,\n getThorLegacyVersion,\n getThorSignCommands,\n invalidThorAppVersionMessage,\n parseThorAddressResponse,\n sendThorLegacyCommand,\n type ThorCommand,\n} from \"./protocol\";\n\nconst THOR_APP_NAME = \"THORChain\";\n\ninterface THORChainLedgerParams {\n derivationPath?: DerivationPathArray;\n dmkSession?: LedgerDMKSession;\n onDeviceActionState?: LedgerDeviceActionStateHandler;\n transport?: Transport;\n}\n\ntype ThorchainAssetObject = { chain?: string; symbol?: string; synth?: boolean; ticker?: string };\n\ntype ThorchainDepositCoin = { amount: string; asset: string | ThorchainAssetObject };\n\nfunction getAminoAssetDenom(asset: string | ThorchainAssetObject) {\n if (typeof asset === \"string\") return asset;\n\n const chain = asset.chain?.toUpperCase();\n const symbol = (asset.symbol || asset.ticker || \"\").toUpperCase();\n\n if (!(chain && symbol)) return symbol || chain || \"\";\n return `${chain}${asset.synth ? \"/\" : \".\"}${symbol}`;\n}\n\nexport function normalizeThorchainLedgerSignDoc(signDoc: StdSignDoc): StdSignDoc {\n return {\n ...signDoc,\n msgs: signDoc.msgs.map((msg) => {\n if (!msg.type.includes(\"MsgDeposit\")) return msg;\n\n const coins = msg.value.coins;\n if (!Array.isArray(coins)) return msg;\n\n return {\n ...msg,\n value: {\n ...msg.value,\n coins: coins.map((coin: ThorchainDepositCoin) => ({ ...coin, asset: getAminoAssetDenom(coin.asset) })),\n },\n };\n }),\n };\n}\n\n// cosmjs is loaded lazily: Bun rejects its CJS `require(\"@scure/base\")` next to the ESM-only `@swapkit/*` graph.\nasync function getFixedSignature({ signature }: { signature: Uint8Array }) {\n const { Secp256k1Signature } = await import(\"@cosmjs/crypto\");\n try {\n return toLowSSignature(Secp256k1Signature.fromDer(signature).toFixedLength());\n } catch (error) {\n throw new SwapKitError(\"wallet_ledger_invalid_signature\", error);\n }\n}\n\nasync function executeThorLegacyCommands({ commands, transport }: { commands: ThorCommand[]; transport: Transport }) {\n const version = await getThorLegacyVersion({ transport });\n if (!version.startsWith(\"2.\")) {\n const { InvalidResponseFormatError } = await import(\"@ledgerhq/device-management-kit\");\n throw new InvalidResponseFormatError(invalidThorAppVersionMessage({ version }));\n }\n\n let response = new Uint8Array();\n for (const command of commands) {\n response = await sendThorLegacyCommand({ command, transport });\n }\n return response;\n}\n\nexport class THORChainLedger {\n readonly derivationPath: DerivationPathArray;\n private readonly dmkSession?: LedgerDMKSession;\n private readonly onDeviceActionState?: LedgerDeviceActionStateHandler;\n private pubKey: Uint8Array | undefined;\n private readonly transport?: Transport;\n\n constructor({\n derivationPath = NetworkDerivationPath.THOR,\n dmkSession,\n onDeviceActionState,\n transport,\n }: THORChainLedgerParams = {}) {\n if (dmkSession && transport) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n message: \"Provide either a Ledger DMK session or a LedgerJS transport, not both\",\n });\n }\n\n this.derivationPath = derivationPath;\n this.dmkSession = dmkSession;\n this.onDeviceActionState = onDeviceActionState;\n this.transport = transport;\n }\n\n get pubkey() {\n return this.pubKey ? base64.encode(this.pubKey) : null;\n }\n\n private executeCommands = async ({\n commands,\n requiredUserInteraction,\n }: {\n commands: ThorCommand[];\n requiredUserInteraction: UserInteractionRequired;\n }) => {\n if (this.transport) {\n try {\n return await executeThorLegacyCommands({ commands, transport: this.transport });\n } catch (error) {\n // hw-transport rejects with status errors; map them as the DMK action below does.\n throw toLedgerDeviceError(error, { userRefusedStatusWords: ZONDAX_USER_REFUSED_STATUS_WORDS });\n }\n }\n\n const dmkSession = this.dmkSession ?? (await getLedgerDMKSession());\n\n const {\n Apdu,\n CallTaskInAppDeviceAction,\n CommandResultFactory,\n DmkResultFactory,\n InvalidResponseFormatError,\n InvalidStatusWordError,\n isSuccessCommandResult,\n UnknownDeviceExchangeError,\n } = await import(\"@ledgerhq/device-management-kit\");\n const toDmkCommand = (command: ThorCommand): Command<Uint8Array> => {\n const apdu = command.getApdu();\n\n return {\n getApdu: () => new Apdu(apdu.cla, apdu.ins, apdu.p1, apdu.p2, apdu.data),\n name: command.name,\n parseResponse: (response) => {\n try {\n return CommandResultFactory<Uint8Array>({ data: command.parseResponse(response) });\n } catch (error) {\n // Keep the status word so rejections and wrong-app errors map to typed SwapKit errors.\n const errorCode = hex.encode(response.statusCode);\n return CommandResultFactory<Uint8Array>({\n error: Object.assign(new InvalidStatusWordError(error instanceof Error ? error.message : String(error)), {\n errorCode,\n }),\n });\n }\n },\n };\n };\n\n const deviceAction = new CallTaskInAppDeviceAction<{ response: Uint8Array }, DmkError, UserInteractionRequired>({\n input: {\n appName: THOR_APP_NAME,\n requiredUserInteraction,\n skipOpenApp: false,\n task: async (internalApi) => {\n try {\n const sessionState = internalApi.getDeviceSessionState();\n const version = \"currentApp\" in sessionState ? sessionState.currentApp.version : undefined;\n if (!version?.startsWith(\"2.\")) {\n return DmkResultFactory<{ response: Uint8Array }, DmkError>({\n error: new InvalidResponseFormatError(invalidThorAppVersionMessage({ version })),\n });\n }\n\n let response: Uint8Array<ArrayBufferLike> = new Uint8Array();\n for (const command of commands) {\n const result = await internalApi.sendCommand(toDmkCommand(command));\n if (!isSuccessCommandResult(result)) {\n return DmkResultFactory<{ response: Uint8Array }, DmkError>({ error: result.error });\n }\n response = result.data;\n }\n\n return DmkResultFactory<{ response: Uint8Array }, DmkError>({ data: { response } });\n } catch (error) {\n return DmkResultFactory<{ response: Uint8Array }, DmkError>({\n error: new UnknownDeviceExchangeError(error),\n });\n }\n },\n },\n });\n\n const result = await executeLedgerDeviceAction({\n action: () => dmkSession.dmk.executeDeviceAction({ deviceAction, sessionId: dmkSession.sessionId }),\n onDeviceActionState: this.onDeviceActionState,\n userRefusedStatusWords: ZONDAX_USER_REFUSED_STATUS_WORDS,\n });\n\n return result.response;\n };\n\n private getAddressData = async ({ checkOnDevice }: { checkOnDevice: boolean }) => {\n const response = await this.executeCommands({\n commands: [getThorAddressCommand({ checkOnDevice, hrp: \"thor\", path: this.derivationPath })],\n requiredUserInteraction: checkOnDevice\n ? LEDGER_USER_INTERACTION_REQUIRED.VerifyAddress\n : LEDGER_USER_INTERACTION_REQUIRED.None,\n });\n\n return parseThorAddressResponse({ response });\n };\n\n private signBytes = async ({ message }: { message: Uint8Array }) => {\n const response = await this.executeCommands({\n commands: getThorSignCommands({ message, path: this.derivationPath }),\n requiredUserInteraction: LEDGER_USER_INTERACTION_REQUIRED.SignTransaction,\n });\n\n return getFixedSignature({ signature: response });\n };\n\n connect = async () => {\n const { address, publicKey } = await this.getAddressData({ checkOnDevice: false });\n this.pubKey = publicKey;\n return address;\n };\n\n getAddressAndPubKey = async () => {\n const { address, publicKey } = await this.getAddressData({ checkOnDevice: false });\n this.pubKey = publicKey;\n\n return { bech32_address: address, compressed_pk: publicKey, error_message: \"No errors\", return_code: 0x9000 };\n };\n\n showAddressAndPubKey = async () => {\n const { address, publicKey } = await this.getAddressData({ checkOnDevice: true });\n this.pubKey = publicKey;\n\n return { bech32_address: address, compressed_pk: publicKey, error_message: \"No errors\", return_code: 0x9000 };\n };\n\n signTransaction = async ({ rawTx, sequence = \"0\" }: { rawTx: string; sequence?: string }) => {\n if (!this.pubKey) await this.connect();\n const pubKey = this.pubKey;\n if (!pubKey) throw new SwapKitError(\"wallet_ledger_pubkey_not_found\");\n\n const signature = await this.signBytes({ message: new TextEncoder().encode(rawTx) });\n\n return [\n {\n pub_key: { type: \"tendermint/PubKeySecp256k1\", value: base64.encode(pubKey) },\n sequence,\n signature: base64.encode(signature),\n },\n ];\n };\n\n signAmino = async (signerAddress: string, signDoc: StdSignDoc): Promise<AminoSignResponse> => {\n const account = (await this.getAccounts()).find(({ address }) => address === signerAddress);\n if (!account) throw new SwapKitError(\"wallet_ledger_address_not_found\", { address: signerAddress });\n\n const { encodeSecp256k1Signature, serializeSignDoc } = await import(\"@cosmjs/amino\");\n\n const signature = await this.signBytes({ message: serializeSignDoc(normalizeThorchainLedgerSignDoc(signDoc)) });\n\n return { signature: encodeSecp256k1Signature(account.pubkey, signature), signed: signDoc };\n };\n\n getAccounts = async (): Promise<readonly AccountData[]> => {\n const { address, publicKey } = await this.getAddressData({ checkOnDevice: false });\n this.pubKey = publicKey;\n return [{ address, algo: \"secp256k1\", pubkey: publicKey }];\n };\n\n sign = async (message: string) => base64.encode(await this.signBytes({ message: new TextEncoder().encode(message) }));\n}\n",
20
+ "import type Transport from \"@ledgerhq/hw-transport\";\nimport { SwapKitError } from \"@swapkit/helpers\";\n\nconst CLA = 0x55;\nconst INS_GET_ADDRESS = 0x04;\nconst INS_GET_VERSION = 0x00;\nconst INS_SIGN = 0x02;\nconst P1_INIT = 0x00;\nconst P1_ADD = 0x01;\nconst P1_LAST = 0x02;\nconst STATUS_OK = 0x9000;\nconst SIGN_CHUNK_SIZE = 250;\n\ninterface ThorCommandParams {\n data?: Uint8Array;\n ins: number;\n p1?: number;\n p2?: number;\n}\n\ninterface ThorApduResponse {\n data: Uint8Array;\n statusCode: Uint8Array;\n}\n\nexport class ThorCommand {\n readonly name = \"THORChainCommand\";\n private readonly params: ThorCommandParams;\n\n constructor(params: ThorCommandParams) {\n this.params = params;\n }\n\n getApdu() {\n const { data = new Uint8Array(), ins, p1 = 0, p2 = 0 } = this.params;\n return { cla: CLA, data, ins, p1, p2 };\n }\n\n parseResponse(response: ThorApduResponse) {\n const status = (response.statusCode[0] ?? 0) * 0x100 + (response.statusCode[1] ?? 0);\n if (status !== STATUS_OK) {\n throw new Error(`THORChain app returned status 0x${status.toString(16).padStart(4, \"0\")}`);\n }\n\n return response.data;\n }\n}\n\nexport function serializeThorPath({ path }: { path: readonly (number | undefined)[] }) {\n if (path.length !== 5) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", { reason: \"THORChain path must contain five elements\" });\n }\n\n const serialized = new Uint8Array(20);\n const view = new DataView(serialized.buffer);\n\n path.forEach((segment, index) => {\n if (typeof segment !== \"number\" || !Number.isInteger(segment) || segment < 0 || segment > 0xffffffff) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", { reason: `Invalid THORChain path segment ${index}` });\n }\n\n // The app hardens purpose, coin type and account; a hardened change or index would silently derive\n // a different key if its bit were cleared, so reject it instead.\n if (index >= 3 && segment >= 0x80000000) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n reason: `THORChain path segment ${index} must not be hardened`,\n });\n }\n\n const normalized = segment & 0x7fffffff;\n const value = index < 3 ? (normalized | 0x80000000) >>> 0 : normalized;\n view.setUint32(index * 4, value, true);\n });\n\n return serialized;\n}\n\nexport function serializeThorAddressPayload({ hrp, path }: { hrp: string; path: readonly (number | undefined)[] }) {\n const encodedHrp = new TextEncoder().encode(hrp);\n if (encodedHrp.length < 1 || encodedHrp.length > 83) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", { reason: \"Invalid THORChain address prefix\" });\n }\n\n const serializedPath = serializeThorPath({ path });\n return Uint8Array.from([encodedHrp.length, ...encodedHrp, ...serializedPath]);\n}\n\nexport function getThorAddressCommand({\n checkOnDevice,\n hrp,\n path,\n}: {\n checkOnDevice: boolean;\n hrp: string;\n path: readonly (number | undefined)[];\n}) {\n return new ThorCommand({\n data: serializeThorAddressPayload({ hrp, path }),\n ins: INS_GET_ADDRESS,\n p1: checkOnDevice ? 1 : 0,\n });\n}\n\nexport function getThorSignCommands({ message, path }: { message: Uint8Array; path: readonly (number | undefined)[] }) {\n const commands = [new ThorCommand({ data: serializeThorPath({ path }), ins: INS_SIGN, p1: P1_INIT })];\n\n if (message.length === 0) {\n commands.push(new ThorCommand({ data: new Uint8Array(), ins: INS_SIGN, p1: P1_LAST }));\n return commands;\n }\n\n for (let offset = 0; offset < message.length; offset += SIGN_CHUNK_SIZE) {\n const end = Math.min(offset + SIGN_CHUNK_SIZE, message.length);\n commands.push(\n new ThorCommand({\n data: message.slice(offset, end),\n ins: INS_SIGN,\n p1: end === message.length ? P1_LAST : P1_ADD,\n }),\n );\n }\n\n return commands;\n}\n\nfunction parseTransportResponse({ response }: { response: Uint8Array }) {\n if (response.length < 2) {\n throw new SwapKitError(\"wallet_ledger_invalid_response\", { reason: \"THORChain response is missing status bytes\" });\n }\n\n return response.slice(0, -2);\n}\n\nexport async function getThorLegacyVersion({ transport }: { transport: Transport }) {\n const response = await transport.send(CLA, INS_GET_VERSION, 0, 0, Buffer.alloc(0), [STATUS_OK]);\n const data = parseTransportResponse({ response });\n if (data.length < 4) {\n throw new SwapKitError(\"wallet_ledger_invalid_response\", { reason: \"Invalid THORChain version response\" });\n }\n\n return `${data[1]}.${data[2]}.${data[3]}`;\n}\n\nexport async function sendThorLegacyCommand({ command, transport }: { command: ThorCommand; transport: Transport }) {\n const apdu = command.getApdu();\n const response = await transport.send(apdu.cla, apdu.ins, apdu.p1, apdu.p2, Buffer.from(apdu.data), [STATUS_OK]);\n return parseTransportResponse({ response });\n}\n\nexport function parseThorAddressResponse({ response }: { response: Uint8Array }) {\n if (response.length < 34) {\n throw new SwapKitError(\"wallet_ledger_invalid_response\", { reason: \"Invalid THORChain address response\" });\n }\n\n const publicKey = response.slice(0, 33);\n const address = new TextDecoder().decode(response.slice(33));\n if (!address) {\n throw new SwapKitError(\"wallet_ledger_invalid_response\", { reason: \"THORChain address is empty\" });\n }\n\n return { address, publicKey };\n}\n\nexport function invalidThorAppVersionMessage({ version }: { version?: string }) {\n return `THORChain Ledger app major 2 is required, received ${version || \"unknown\"}`;\n}\n",
21
+ "import type { UserInteractionRequired } from \"@ledgerhq/device-management-kit\";\nimport type TronApp from \"@ledgerhq/hw-app-trx\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport {\n type DerivationPathArray,\n derivationPathToString,\n NetworkDerivationPath,\n SwapKitError,\n} from \"@swapkit/helpers\";\nimport type { TronSignedTransaction, TronSigner, TronTransaction } from \"@swapkit/toolboxes/tron\";\n\nimport {\n LEDGER_USER_INTERACTION_REQUIRED,\n type LedgerJsClientParams,\n normalizeLedgerJsClientParams,\n runLedgerJsOperation,\n} from \"../helpers/ledgerJsDmkBridge\";\n\ntype TronLedgerParams = LedgerJsClientParams<DerivationPathArray | string>;\n\nexport class TronLedgerInterface implements TronSigner {\n readonly derivationPath: string;\n readonly ledgerTimeout = 50000;\n private readonly connection: Omit<TronLedgerParams, \"derivationPath\">;\n\n constructor(paramsOrPath?: TronLedgerParams | DerivationPathArray | string, transport?: Transport) {\n const { derivationPath, ...connection } = normalizeLedgerJsClientParams({ paramsOrPath, transport });\n this.derivationPath =\n typeof derivationPath === \"string\"\n ? derivationPath\n : derivationPathToString(derivationPath || NetworkDerivationPath.TRON);\n this.connection = connection;\n }\n\n private async runTronOperation<Output>({\n operation,\n requiredUserInteraction,\n }: {\n operation: (app: InstanceType<typeof TronApp>) => Promise<Output>;\n requiredUserInteraction?: UserInteractionRequired;\n }) {\n const TronApp = (await import(\"@ledgerhq/hw-app-trx\")).default;\n return runLedgerJsOperation({\n appName: \"Tron\",\n connection: this.connection,\n createApp: (ledgerTransport) => new TronApp(ledgerTransport),\n operation,\n requiredUserInteraction,\n });\n }\n\n checkOrCreateTransportAndLedger = async () => {\n await this.runTronOperation({ operation: async () => true });\n };\n\n createTransportAndLedger = async () => {\n await this.runTronOperation({ operation: async () => true });\n };\n\n getAddress = async () => {\n const response = await this.getAddressAndPubKey();\n if (!response) throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n return response.address;\n };\n\n getAddressAndPubKey = async () => {\n const result = await this.runTronOperation({ operation: (app) => app.getAddress(this.derivationPath) });\n if (!result) throw new SwapKitError(\"wallet_ledger_failed_to_get_address\");\n\n return { address: result.address, publicKey: result.publicKey };\n };\n\n showAddressAndPubKey = async () => {\n return await this.runTronOperation({\n operation: (app) => app.getAddress(this.derivationPath, true),\n requiredUserInteraction: LEDGER_USER_INTERACTION_REQUIRED.VerifyAddress,\n });\n };\n\n signTransaction = async (transaction: TronTransaction): Promise<TronSignedTransaction> => {\n try {\n const signature = await this.runTronOperation({\n operation: (app) => app.signTransaction(this.derivationPath, transaction.raw_data_hex, []),\n requiredUserInteraction: LEDGER_USER_INTERACTION_REQUIRED.SignTransaction,\n });\n\n if (!signature) throw new SwapKitError(\"wallet_ledger_signing_error\");\n return { ...transaction, signature: [signature] };\n } catch (error) {\n if (error instanceof SwapKitError) throw error;\n throw new SwapKitError(\"wallet_ledger_signing_error\", { error });\n }\n };\n}\n\nexport function TronLedger(paramsOrPath?: TronLedgerParams | DerivationPathArray, transport?: Transport) {\n return new TronLedgerInterface(paramsOrPath, transport);\n}\n",
22
+ "import type { UserInteractionRequired } from \"@ledgerhq/device-management-kit\";\nimport type Xrp from \"@ledgerhq/hw-app-xrp\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { Chain, type DerivationPathArray, derivationPathToString, NetworkDerivationPath } from \"@swapkit/helpers\";\nimport type { RippleTransaction } from \"@swapkit/toolboxes/ripple\";\nimport type { Payment } from \"xrpl\";\n\nimport {\n LEDGER_USER_INTERACTION_REQUIRED,\n type LedgerJsClientParams,\n normalizeLedgerJsClientParams,\n runLedgerJsOperation,\n} from \"../helpers/ledgerJsDmkBridge\";\n\nconst TF_FULLY_CANONICAL_SIG = 2147483648;\n\ntype XRPLedgerParams = LedgerJsClientParams<DerivationPathArray>;\n\nfunction cleanTransactionObject(transaction: object): Record<string, unknown> {\n return Object.fromEntries(Object.entries(transaction).filter(([, value]) => value !== null && value !== undefined));\n}\n\nexport async function XRPLedger(paramsOrPath?: XRPLedgerParams | DerivationPathArray, transport?: Transport) {\n const { derivationPath, ...connection } = normalizeLedgerJsClientParams({ paramsOrPath, transport });\n const path = derivationPathToString(derivationPath || NetworkDerivationPath[Chain.Ripple]);\n\n async function runXrpOperation<Output>({\n operation,\n requiredUserInteraction,\n }: {\n operation: (app: Xrp) => Promise<Output>;\n requiredUserInteraction?: UserInteractionRequired;\n }) {\n const XrpApp = (await import(\"@ledgerhq/hw-app-xrp\")).default;\n return runLedgerJsOperation({\n appName: \"XRP\",\n connection,\n createApp: (ledgerTransport) => new XrpApp(ledgerTransport),\n operation,\n requiredUserInteraction,\n });\n }\n\n const { address, publicKey } = await runXrpOperation({ operation: (app) => app.getAddress(path) });\n\n async function signTransaction(transaction: Payment | RippleTransaction) {\n const [{ encode }, { hashes }] = await Promise.all([import(\"ripple-binary-codec\"), import(\"xrpl\")]);\n const transactionJSON = {\n ...cleanTransactionObject(transaction),\n Flags: transaction.Flags || TF_FULLY_CANONICAL_SIG,\n SigningPubKey: publicKey.toUpperCase(),\n };\n\n const transactionToSignOnLedger = encode(transactionJSON);\n const txnSignature = await runXrpOperation({\n operation: (app) => app.signTransaction(path, transactionToSignOnLedger),\n requiredUserInteraction: LEDGER_USER_INTERACTION_REQUIRED.SignTransaction,\n });\n const tx_blob = encode({ ...transactionJSON, TxnSignature: txnSignature });\n const hash = hashes.hashSignedTx(tx_blob);\n\n return { hash, tx_blob };\n }\n\n return { getAddress: () => address, signTransaction };\n}\n",
23
+ "import type {\n LegacyCreateTransactionArg,\n LegacyTransaction,\n LegacyTransactionInput,\n LegacyTransactionOutput,\n SignerZcash,\n} from \"@ledgerhq/device-signer-kit-zcash\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { hex } from \"@scure/base\";\nimport {\n type DerivationPathArray,\n derivationPathToString,\n NetworkDerivationPath,\n SwapKitError,\n} from \"@swapkit/helpers\";\nimport type { UTXOType } from \"@swapkit/toolboxes/utxo\";\nimport type { ZcashTransaction } from \"@swapkit/utxo-signer\";\n\nimport type { LedgerDMKSession } from \"../helpers/dmk\";\nimport { createLedgerSessionSigner, getLedgerDMKSession } from \"../helpers/dmk\";\nimport { executeLedgerDeviceAction, type LedgerDeviceActionStateHandler } from \"../helpers/executeDeviceAction\";\nimport { runLedgerJsOperation } from \"../helpers/ledgerJsDmkBridge\";\nimport { ZcashLedger as LegacyZcashLedger } from \"./utxo\";\n\n// @swapkit/utxo-signer 3.1.0 exports only the Ironwood activation height.\nconst NU6_2_ACTIVATION_HEIGHT = 3_364_600;\n\ninterface ZcashLedgerParams {\n derivationPath?: DerivationPathArray | string;\n dmkSession?: LedgerDMKSession;\n onDeviceActionState?: LedgerDeviceActionStateHandler;\n transport?: Transport;\n}\n\ninterface GetExtendedPublicKeyParams {\n path?: string;\n xpubVersion?: number;\n}\n\ninterface SignZcashTransactionParams {\n changePath?: string;\n derivationPaths?: string[];\n inputUtxos: UTXOType[];\n tx: ZcashTransaction;\n}\n\ninterface SignZcashTransactionWithMultiplePathsParams extends Omit<SignZcashTransactionParams, \"derivationPaths\"> {\n derivationPaths: string[];\n}\n\ninterface ParsedZcashPath {\n account: number;\n accountPath: string;\n fullPath: string;\n}\n\nfunction normalizePath(path: DerivationPathArray | string) {\n return (typeof path === \"string\" ? path : derivationPathToString(path)).replace(/^m\\//, \"\").replace(/^\\/+/, \"\");\n}\n\nfunction parseZcashPath(path: DerivationPathArray | string): ParsedZcashPath {\n const normalized = normalizePath(path);\n const match = /^44'\\/133'\\/(\\d+)'(?:\\/(0|1)\\/(\\d+))?$/.exec(normalized);\n\n if (!match) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n path: normalized,\n reason: \"Expected a Zcash BIP44 path with coin type 133\",\n });\n }\n\n const account = Number(match[1]);\n const accountPath = `44'/133'/${account}'`;\n return { account, accountPath, fullPath: `${accountPath}/${match[2] ?? 0}/${match[3] ?? 0}` };\n}\n\nfunction uint32LE(value: number) {\n const bytes = new Uint8Array(4);\n new DataView(bytes.buffer).setUint32(0, value >>> 0, true);\n return bytes;\n}\n\nfunction uint64LE(value: bigint) {\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigUint64(0, value, true);\n return bytes;\n}\n\n// Keeps the failure context in the error info, and so in its message, rather than only in its cause.\nfunction invalidParams(info: Record<string, unknown>, cause?: unknown) {\n return new SwapKitError({ errorKey: \"wallet_ledger_invalid_params\", info }, cause);\n}\n\nfunction readUint32LE({ bytes, offset }: { bytes: Uint8Array; offset: number }) {\n if (offset + 4 > bytes.length) throw new Error(\"Unexpected end of previous transaction\");\n return new DataView(bytes.buffer, bytes.byteOffset + offset, 4).getUint32(0, true);\n}\n\n// @swapkit/utxo-signer 3.1.0 has no bounds-checked, v5-aware decoder (ZcashTransaction.fromBytes reads only the\n// v4 layout and its Reader is not exported), so previous transactions are read here.\nfunction createPreviousTransactionReader(bytes: Uint8Array) {\n let offset = 0;\n\n function take(length: number) {\n if (offset + length > bytes.length) throw new Error(`Previous transaction ends before byte ${offset + length}`);\n offset += length;\n return bytes.slice(offset - length, offset);\n }\n\n function compactSize() {\n const prefix = take(1)[0] ?? 0;\n if (prefix < 0xfd) return prefix;\n\n const view = new DataView(take(prefix === 0xfd ? 2 : prefix === 0xfe ? 4 : 8).buffer);\n const value =\n view.byteLength === 2\n ? view.getUint16(0, true)\n : view.byteLength === 4\n ? view.getUint32(0, true)\n : Number(view.getBigUint64(0, true));\n if (!Number.isSafeInteger(value)) throw new Error(\"Previous transaction compact-size value exceeds safe range\");\n return value;\n }\n\n return { compactSize, rest: () => take(bytes.length - offset), take, varBytes: () => take(compactSize()) };\n}\n\n// Fields are read into locals in wire order: object keys are kept sorted, which is not the order on the wire.\nfunction parsePreviousTransaction({ bytes, version }: { bytes: Uint8Array; version: number }) {\n const reader = createPreviousTransactionReader(bytes);\n const header = reader.take(version === 4 ? 8 : 20);\n\n const inputs: LegacyTransactionInput[] = [];\n for (let count = reader.compactSize(); inputs.length < count; ) {\n const prevout = reader.take(36);\n const script = reader.varBytes();\n const sequence = reader.take(4);\n inputs.push({ prevout, script, sequence });\n }\n\n const outputs: LegacyTransactionOutput[] = [];\n for (let count = reader.compactSize(); outputs.length < count; ) {\n const amount = reader.take(8);\n const script = reader.varBytes();\n outputs.push({ amount, script });\n }\n\n const transparentFields = { inputs, nVersionGroupId: header.slice(4, 8), outputs, version: header.slice(0, 4) };\n if (version >= 5) {\n return {\n ...transparentFields,\n consensusBranchId: header.slice(8, 12),\n locktime: header.slice(12, 16),\n nExpiryHeight: header.slice(16, 20),\n };\n }\n\n const locktime = reader.take(4);\n const nExpiryHeight = reader.take(4);\n // Value balance, Sapling spends and outputs, JoinSplits and the binding signature follow nExpiryHeight.\n return { ...transparentFields, extraData: reader.rest(), locktime, nExpiryHeight };\n}\n\n// Either byte order binds a txid equally: toolbox-built transactions keep display-order txids, while\n// ZcashTransaction.fromBytes keeps them in wire order.\nfunction matchesTxid({ hash, txid }: { hash: string; txid: Uint8Array }) {\n const normalized = hash.toLowerCase();\n return normalized === hex.encode(txid) || normalized === hex.encode(txid.slice().reverse());\n}\n\nasync function serializeOutputs(tx: ZcashTransaction) {\n const { CompactSize, utils } = await import(\"@swapkit/utxo-signer\");\n const outputs = Array.from({ length: tx.outputsLength }, (_, index) => tx.getOutput(index));\n return utils.concatBytes(\n CompactSize.encode(BigInt(outputs.length)),\n ...outputs.flatMap(({ amount, script }) => [uint64LE(amount), CompactSize.encode(BigInt(script.length)), script]),\n );\n}\n\nasync function activationHeight(consensusBranchId: number) {\n const { ZCASH_IRONWOOD_ACTIVATION_HEIGHT, ZcashConsensusBranchId } = await import(\"@swapkit/utxo-signer\");\n\n switch (consensusBranchId) {\n case ZcashConsensusBranchId.NU6_2:\n return NU6_2_ACTIVATION_HEIGHT;\n case ZcashConsensusBranchId.IRONWOOD:\n return ZCASH_IRONWOOD_ACTIVATION_HEIGHT;\n default:\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n consensusBranchId,\n reason: \"Ledger Zcash DSK signing supports NU6.2 and Ironwood target branches\",\n });\n }\n}\n\nasync function previousTransaction({\n inputIndex,\n utxo,\n}: {\n inputIndex: number;\n utxo: UTXOType;\n}): Promise<LegacyTransaction> {\n const { hash: txid, index: outputIndex, txHex } = utxo;\n const context = { inputIndex, outputIndex, txid };\n if (!txHex) {\n throw invalidParams({\n ...context,\n reason: \"Zcash Ledger signing requires the full previous transaction txHex for every input\",\n });\n }\n\n function readPrevious<T>(read: () => T) {\n try {\n return read();\n } catch (error) {\n throw invalidParams({ ...context, reason: error instanceof Error ? error.message : String(error) }, error);\n }\n }\n\n const raw = readPrevious(() => hex.decode(txHex.replace(/^0x/i, \"\")));\n const header = readPrevious(() => readUint32LE({ bytes: raw, offset: 0 }));\n const version = header & 0x7fffffff;\n // The Zcash DSK can stream only v4 (Sapling) and v5/v6 previous transactions into a trusted input.\n if ((header & 0x80000000) === 0 || version < 4 || version > 6) {\n throw invalidParams({\n ...context,\n reason: \"Ledger Zcash signing supports only overwintered v4, v5 and v6 previous transactions\",\n version,\n });\n }\n\n const parsed = readPrevious(() => parsePreviousTransaction({ bytes: raw, version }));\n if (outputIndex < 0 || outputIndex >= parsed.outputs.length) {\n throw invalidParams({\n ...context,\n outputCount: parsed.outputs.length,\n reason: \"Zcash input references an output outside its previous transaction\",\n });\n }\n\n // The DSK streams a v5/v6 previous transaction from its wire bytes and the device computes its ZIP-244 txid.\n // Override bytes must use that layout, so the DSK frames a v4 itself from the parsed fields instead.\n if (version >= 5) return { ...parsed, serializedPreviousTransactionOverride: raw };\n\n // A v4 txid is the double SHA-256 of its bytes, so bind the transaction to the planned input before the\n // device trusts its amounts.\n const { utils } = await import(\"@swapkit/utxo-signer\");\n const previousTxid = utils.sha256x2(raw);\n if (!matchesTxid({ hash: txid, txid: previousTxid })) {\n throw invalidParams({\n ...context,\n previousTxid: hex.encode(previousTxid.reverse()),\n reason: \"Previous transaction does not hash to the input txid\",\n });\n }\n\n return parsed;\n}\n\nfunction validateSigningParams({\n accountPath,\n derivationPaths,\n inputUtxos,\n tx,\n}: {\n accountPath: string;\n derivationPaths: string[];\n inputUtxos: UTXOType[];\n tx: ZcashTransaction;\n}) {\n if (inputUtxos.length !== tx.inputsLength || derivationPaths.length !== tx.inputsLength) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n derivationPathCount: derivationPaths.length,\n inputCount: tx.inputsLength,\n inputUtxoCount: inputUtxos.length,\n reason: \"Zcash input UTXOs and derivation paths must match the transaction input count\",\n });\n }\n\n inputUtxos.forEach((utxo, inputIndex) => {\n const input = tx.getInput(inputIndex);\n if (!matchesTxid({ hash: utxo.hash, txid: input.txid }) || utxo.index !== input.index) {\n throw invalidParams({\n inputIndex,\n reason: \"Zcash input UTXO does not match the transaction input\",\n transactionInput: { index: input.index, txid: hex.encode(input.txid) },\n utxo: { hash: utxo.hash, index: utxo.index },\n });\n }\n });\n\n return derivationPaths.map((path) => {\n const parsedPath = parseZcashPath(path);\n if (parsedPath.accountPath !== accountPath) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n accountPath,\n path: parsedPath.fullPath,\n reason: \"All Zcash input derivation paths must belong to the configured account\",\n });\n }\n return parsedPath.fullPath;\n });\n}\n\nfunction assertRawV5(rawTransaction: string) {\n const normalized = rawTransaction.replace(/^0x/i, \"\");\n const bytes = hex.decode(normalized);\n if (bytes.length < 4 || (new DataView(bytes.buffer, bytes.byteOffset, 4).getUint32(0, true) & 0x7fffffff) !== 5) {\n throw new SwapKitError(\"wallet_ledger_invalid_response\", {\n reason: \"Ledger Zcash signer did not return a version 5 transaction\",\n });\n }\n return normalized;\n}\n\nexport function ZcashLedger({\n derivationPath = NetworkDerivationPath.ZEC,\n dmkSession,\n onDeviceActionState,\n transport,\n}: ZcashLedgerParams = {}) {\n const configuredPath = parseZcashPath(derivationPath);\n const legacyClient = transport ? LegacyZcashLedger(derivationPath, transport) : undefined;\n const getSessionSigner = createLedgerSessionSigner<SignerZcash>({\n build: async (session) => {\n const { SignerZcashBuilder } = await import(\"@ledgerhq/device-signer-kit-zcash\");\n return new SignerZcashBuilder(session).build();\n },\n dmkSession,\n });\n\n function getSigner() {\n if (legacyClient) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n reason: \"A Device Signer Kit operation is unavailable when a legacy transport is supplied\",\n });\n }\n\n return getSessionSigner();\n }\n\n async function getDskAddress({ checkOnDevice = false, path = configuredPath.fullPath } = {}) {\n const signer = await getSigner();\n return executeLedgerDeviceAction({ action: () => signer.getAddress(path, { checkOnDevice }), onDeviceActionState });\n }\n\n async function getExtendedPublicKey({\n path = configuredPath.accountPath,\n xpubVersion = 0x0488b21e,\n }: GetExtendedPublicKeyParams = {}) {\n const parsedAccount = parseZcashPath(path);\n if (parsedAccount.fullPath !== `${parsedAccount.accountPath}/0/0` || normalizePath(path).split(\"/\").length !== 3) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n path,\n reason: \"Zcash extended public keys are exported at account level\",\n });\n }\n\n const connection = {\n dmkSession: transport ? undefined : (dmkSession ?? (await getLedgerDMKSession())),\n onDeviceActionState,\n transport,\n };\n const { default: BitcoinApp } = await import(\"@ledgerhq/hw-app-btc\");\n return runLedgerJsOperation({\n appName: \"Zcash\",\n connection,\n createApp: (operationTransport) => new BitcoinApp({ currency: \"zcash\", transport: operationTransport }),\n operation: (app) => app.getWalletXpub({ path: parsedAccount.accountPath, xpubVersion }),\n });\n }\n\n async function signTransaction({ changePath, derivationPaths, inputUtxos, tx }: SignZcashTransactionParams) {\n const paths = validateSigningParams({\n accountPath: configuredPath.accountPath,\n derivationPaths: derivationPaths ?? Array.from({ length: tx.inputsLength }, () => configuredPath.fullPath),\n inputUtxos,\n tx,\n });\n\n // hw-app-btc picks a pre-Ironwood branch id without a block height and misparses v5 previous\n // transactions, so the legacy transport cannot produce a transaction the network accepts.\n if (legacyClient) {\n throw new SwapKitError(\"wallet_ledger_invalid_params\", {\n reason: \"Zcash signing requires a Ledger DMK session instead of a legacy transport\",\n });\n }\n\n const blockHeight = await activationHeight(tx.consensusBranchId);\n const inputs = await Promise.all(\n inputUtxos.map(\n async (utxo, inputIndex): Promise<LegacyCreateTransactionArg[\"inputs\"][number]> => [\n await previousTransaction({ inputIndex, utxo }),\n utxo.index,\n null,\n tx.getInput(inputIndex).sequence ?? 0xffffffff,\n ],\n ),\n );\n const args: LegacyCreateTransactionArg = {\n additionals: [\"zcash\", \"sapling\"],\n associatedKeysets: paths,\n blockHeight,\n changePath: changePath ? parseZcashPath(changePath).fullPath : configuredPath.fullPath,\n expiryHeight: uint32LE(tx.expiryHeight),\n inputs,\n lockTime: tx.lockTime,\n outputScriptHex: hex.encode(await serializeOutputs(tx)),\n };\n const signer = await getSigner();\n const signed = await executeLedgerDeviceAction({ action: () => signer.signTransaction(args), onDeviceActionState });\n return assertRawV5(signed);\n }\n\n return {\n connect: async () => {\n if (legacyClient) return legacyClient.connect();\n await getSigner();\n },\n disconnect: async () => legacyClient?.disconnect(),\n getAddress: async () => {\n if (legacyClient) return legacyClient.getAddress();\n return (await getDskAddress()).address;\n },\n getAddressAndPubKey: async () => {\n if (legacyClient) return { address: await legacyClient.getAddress() };\n const { address, chainCode, publicKey } = await getDskAddress();\n return { address, chainCode: hex.encode(chainCode), publicKey: hex.encode(publicKey) };\n },\n getExtendedPublicKey,\n showAddressAndPubKey: async () => {\n if (legacyClient) return { address: await legacyClient.getAddress() };\n const { address, chainCode, publicKey } = await getDskAddress({ checkOnDevice: true });\n return { address, chainCode: hex.encode(chainCode), publicKey: hex.encode(publicKey) };\n },\n signTransaction,\n signTransactionWithMultiplePaths: async (params: SignZcashTransactionWithMultiplePathsParams) =>\n signTransaction(params),\n };\n}\n"
22
24
  ],
23
- "mappings": "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",
24
- "debugId": "4FBDCA7A0E5C984C64756E2164756E21",
25
+ "mappings": "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",
26
+ "debugId": "42A8EA57BF63933D64756E2164756E21",
25
27
  "names": []
26
28
  }