@swapkit/wallet-hardware 6.0.1 → 6.1.1

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 (35) hide show
  1. package/dist/chunk-3h1f3hyp.js +4 -0
  2. package/dist/chunk-3h1f3hyp.js.map +10 -0
  3. package/dist/chunk-8m2sn76p.js +4 -0
  4. package/dist/chunk-8m2sn76p.js.map +10 -0
  5. package/dist/chunk-qjq7gvyx.js +4 -0
  6. package/dist/chunk-qjq7gvyx.js.map +10 -0
  7. package/dist/chunk-wfbg89d3.js +4 -0
  8. package/dist/chunk-wfbg89d3.js.map +10 -0
  9. package/dist/chunk-xn0fnag5.js +4 -0
  10. package/dist/chunk-xn0fnag5.js.map +10 -0
  11. package/dist/trezor/index.cjs +2 -2
  12. package/dist/trezor/index.cjs.map +9 -4
  13. package/dist/trezor/index.js +2 -2
  14. package/dist/trezor/index.js.map +3 -3
  15. package/dist/types/keepkey/index.d.ts +1 -1
  16. package/dist/types/ledger/index.d.ts +1 -1
  17. package/dist/types/trezor/cardanoSigner.d.ts +21 -0
  18. package/dist/types/trezor/cardanoSigner.d.ts.map +1 -0
  19. package/dist/types/trezor/index.d.ts +3 -3
  20. package/dist/types/trezor/index.d.ts.map +1 -1
  21. package/dist/types/trezor/rippleSigner.d.ts +23 -0
  22. package/dist/types/trezor/rippleSigner.d.ts.map +1 -0
  23. package/dist/types/trezor/solanaSigner.d.ts +17 -0
  24. package/dist/types/trezor/solanaSigner.d.ts.map +1 -0
  25. package/dist/types/trezor/stellarSigner.d.ts +99 -0
  26. package/dist/types/trezor/stellarSigner.d.ts.map +1 -0
  27. package/dist/types/trezor/tronSigner.d.ts +30 -0
  28. package/dist/types/trezor/tronSigner.d.ts.map +1 -0
  29. package/package.json +8 -4
  30. package/src/trezor/cardanoSigner.ts +226 -0
  31. package/src/trezor/index.ts +66 -0
  32. package/src/trezor/rippleSigner.ts +100 -0
  33. package/src/trezor/solanaSigner.ts +129 -0
  34. package/src/trezor/stellarSigner.ts +186 -0
  35. package/src/trezor/tronSigner.ts +148 -0
@@ -1,12 +1,17 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/trezor/evmSigner.ts", "../src/trezor/index.ts", "../src/helpers/psbt.ts"],
3
+ "sources": ["../src/trezor/evmSigner.ts", "../src/trezor/cardanoSigner.ts", "../src/trezor/rippleSigner.ts", "../src/trezor/solanaSigner.ts", "../src/trezor/stellarSigner.ts", "../src/trezor/tronSigner.ts", "../src/trezor/index.ts", "../src/helpers/psbt.ts"],
4
4
  "sourcesContent": [
5
5
  "import {\n type Chain,\n ChainToChainId,\n type DerivationPathArray,\n derivationPathToString,\n SwapKitError,\n WalletOption,\n} from \"@swapkit/helpers\";\nimport type { JsonRpcProvider, Provider, TransactionRequest, TypedDataDomain, TypedDataField } from \"ethers\";\n\ntype TrezorEVMSignerParams = {\n chain: Chain;\n derivationPath: DerivationPathArray;\n provider: Provider | JsonRpcProvider;\n};\n\nexport async function getEVMSigner({ chain, derivationPath, provider }: TrezorEVMSignerParams) {\n const { AbstractSigner } = await import(\"ethers\");\n\n class TrezorSigner extends AbstractSigner {\n address: string;\n chain: Chain;\n derivationPath: DerivationPathArray;\n readonly provider: Provider | JsonRpcProvider;\n\n constructor({ chain, derivationPath, provider }: TrezorEVMSignerParams) {\n super(provider);\n\n this.address = \"\";\n this.chain = chain;\n this.derivationPath = derivationPath;\n this.provider = provider;\n }\n\n getAddress = async () => {\n if (!this.address) {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const result = await TrezorConnect.ethereumGetAddress({\n path: derivationPathToString(this.derivationPath),\n showOnTrezor: true,\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { ...result, chain: this.chain, derivationPath: this.derivationPath },\n });\n }\n\n this.address = result.payload.address;\n }\n\n return this.address;\n };\n\n signMessage = async (message: string) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const result = await TrezorConnect.ethereumSignMessage({\n message,\n path: derivationPathToString(this.derivationPath),\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { ...result, chain: this.chain, derivationPath: this.derivationPath, message },\n });\n }\n\n return result.payload.signature;\n };\n\n signTypedData = async (\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>,\n explicitPrimaryType?: string,\n ) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { buildEIP712DomainType } = await import(\"@swapkit/toolboxes/evm\");\n const { TypedDataEncoder } = await import(\"ethers\");\n\n const { EIP712Domain: _, ...filteredTypes } = types;\n const primaryType = explicitPrimaryType ?? TypedDataEncoder.from(filteredTypes).primaryType;\n const domainTypes = buildEIP712DomainType(domain);\n\n const data = {\n domain: domain as Record<string, unknown>,\n message: value,\n primaryType,\n types: { EIP712Domain: domainTypes, ...filteredTypes },\n };\n\n const result = await TrezorConnect.ethereumSignTypedData({\n data: data as Parameters<typeof TrezorConnect.ethereumSignTypedData>[0][\"data\"],\n metamask_v4_compat: true,\n path: derivationPathToString(this.derivationPath),\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: this.chain, error: result.payload.error },\n });\n }\n\n return result.payload.signature.startsWith(\"0x\") ? result.payload.signature : `0x${result.payload.signature}`;\n };\n\n signTransaction = async ({\n to,\n gasLimit,\n value,\n data,\n nonce,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: any: refactor\n }: TransactionRequest) => {\n if (!to) throw new SwapKitError({ errorKey: \"wallet_missing_params\", info: { to } });\n if (!gasLimit) throw new SwapKitError({ errorKey: \"wallet_missing_params\", info: { gasLimit } });\n\n // Check presence, not truthiness: a zero-wei tip is legitimate on chains with a negligible\n // priority fee, such as Arc, where it used to be read as missing fee data.\n const isEIP1559 = maxFeePerGas != null || maxPriorityFeePerGas != null;\n\n if (isEIP1559 && !maxFeePerGas) {\n throw new SwapKitError({ errorKey: \"wallet_missing_params\", info: { maxFeePerGas } });\n }\n if (!(isEIP1559 || gasPrice)) {\n throw new SwapKitError({ errorKey: \"wallet_missing_params\", info: { gasPrice } });\n }\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { toHexString } = await import(\"@swapkit/toolboxes/evm\");\n\n const additionalFields = isEIP1559\n ? {\n maxFeePerGas: toHexString(BigInt(maxFeePerGas?.toString() || 0)),\n maxPriorityFeePerGas: toHexString(BigInt(maxPriorityFeePerGas?.toString() || 0)),\n }\n : (gasPrice && { gasPrice: toHexString(BigInt(gasPrice?.toString() || 0)) }) || { gasPrice: \"0x0\" };\n\n const hexifiedNonce = toHexString(\n BigInt(nonce || (await this.provider.getTransactionCount(await this.getAddress(), \"pending\"))),\n );\n\n const formattedTx = {\n chainId: Number.parseInt(ChainToChainId[this.chain], 10),\n data: data?.toString() || \"0x\",\n gasLimit: toHexString(BigInt(gasLimit?.toString() || 0)),\n nonce: hexifiedNonce,\n to: to.toString(),\n value: toHexString(BigInt(value?.toString() || 0)),\n ...additionalFields,\n };\n\n const { success, payload } = await TrezorConnect.ethereumSignTransaction({\n path: derivationPathToString(this.derivationPath),\n transaction: formattedTx,\n });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { ...payload, chain: this.chain, derivationPath: this.derivationPath },\n });\n }\n\n const serializedTx = payload.serializedTx\n ? payload.serializedTx.startsWith(\"0x\")\n ? payload.serializedTx\n : `0x${payload.serializedTx}`\n : undefined;\n\n if (!serializedTx) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: this.chain, derivationPath: this.derivationPath },\n });\n }\n\n return serializedTx;\n };\n\n connect = (provider: Provider | null) => {\n if (!provider) {\n throw new SwapKitError({\n errorKey: \"wallet_provider_not_found\",\n info: { chain: this.chain, derivationPath: this.derivationPath, wallet: WalletOption.TREZOR },\n });\n }\n\n return new TrezorSigner({ chain: this.chain, derivationPath: this.derivationPath, provider });\n };\n }\n\n return new TrezorSigner({ chain, derivationPath, provider });\n}\n",
6
- "import { hex } from \"@scure/base\";\nimport { HDKey, type Versions } from \"@scure/bip32\";\nimport {\n Chain,\n type DerivationPathArray,\n derivationPathToString,\n FeeOption,\n filterSupportedChains,\n type GenericTransferParams,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n type UTXOChain,\n UTXOScriptType,\n WalletOption,\n} from \"@swapkit/helpers\";\nimport {\n assertDerivationIndex,\n createHDWalletHelpers,\n getNetworkForChain,\n getUTXOAccountIndexFromPath,\n getUTXOAccountPath,\n getUtxoApi,\n type UTXOToolboxes,\n type UTXOType,\n} from \"@swapkit/toolboxes/utxo\";\nimport type { BTCNetwork, PCZT, Transaction, ZcashPSBT, ZcashTransaction } from \"@swapkit/utxo-signer\";\nimport { createWallet, getWalletSupportedChains, type HardwareExtendedPublicKeyInfo } from \"@swapkit/wallet-core\";\n\nimport { applyMissingSpendingMetadata } from \"../helpers/psbt\";\n\ntype TrezorBip32Derivation = [Uint8Array, { fingerprint: number; path: number[] }];\ntype TrezorTapBip32Derivation = [Uint8Array, { der: { fingerprint: number; path: number[] }; hashes: Uint8Array[] }];\ntype TrezorCoreMode = \"auto\" | \"iframe\" | \"popup\" | \"suite-desktop\" | \"suite-web\";\ntype TrezorTransport = \"BridgeTransport\" | \"WebUsbTransport\" | \"NodeUsbTransport\";\ntype ConnectTrezorOptions = { address?: string };\ntype TrezorAccountRefTransaction = { details: Record<string, never>; hex: string; txid: string };\ntype ZcashSignableTransaction = PCZT | ZcashPSBT | ZcashTransaction;\ntype TrezorExtendedPublicKeyInfo = {\n accountIndex: number;\n chainCode?: string;\n depth?: number;\n fingerprint?: number;\n path: string;\n publicKey?: string;\n xpub: string;\n xpubSegwit?: string;\n};\n\nconst TREZOR_CORE_MODES = new Set<TrezorCoreMode>([\"auto\", \"iframe\", \"popup\", \"suite-desktop\", \"suite-web\"]);\nconst TREZOR_TRANSPORTS = new Set<TrezorTransport>([\"BridgeTransport\", \"WebUsbTransport\", \"NodeUsbTransport\"]);\nconst DEFAULT_TREZOR_CORE_MODE: TrezorCoreMode = \"auto\";\nconst DEFAULT_TREZOR_MANIFEST = { appName: \"SwapKit\", appUrl: \"https://swapkit.dev\", email: \"support@swapkit.dev\" };\nconst DEFAULT_TREZOR_TRANSPORTS = [\"WebUsbTransport\" as const];\nconst TREZOR_KEEP_SESSION_PARAMS = { keepSession: true } as const;\nconst BITCOIN_CASH_SIGHASH_ALL = 0x41;\nconst trezorXpubCache = new Map<string, TrezorExtendedPublicKeyInfo>();\nlet trezorSessionDispose: Promise<void> | undefined;\nconst EXTENDED_KEY_VERSION_CANDIDATES = (\n [Chain.Bitcoin, Chain.BitcoinCash, Chain.Dash, Chain.Dogecoin, Chain.Litecoin] as const satisfies readonly UTXOChain[]\n).map((chain) => getNetworkForChain(chain).bip32);\n\nasync function disconnectTrezorSession() {\n trezorXpubCache.clear();\n\n const dispose = (async () => {\n try {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n await TrezorConnect.dispose();\n } catch {\n // Ignore stale or already-disposed sessions.\n }\n })();\n\n trezorSessionDispose = dispose;\n await dispose;\n\n if (trezorSessionDispose === dispose) {\n trezorSessionDispose = undefined;\n }\n}\n\nfunction normalizeTrezorCoreMode(coreMode: unknown): TrezorCoreMode | undefined {\n return typeof coreMode === \"string\" && TREZOR_CORE_MODES.has(coreMode as TrezorCoreMode)\n ? (coreMode as TrezorCoreMode)\n : undefined;\n}\n\nfunction normalizeTrezorTransports(transports: unknown): TrezorTransport[] | undefined {\n if (!Array.isArray(transports)) return undefined;\n\n const normalized = transports.filter(\n (transport): transport is TrezorTransport =>\n typeof transport === \"string\" && TREZOR_TRANSPORTS.has(transport as TrezorTransport),\n );\n\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction getTrezorManifestValue(value: unknown, fallback: string) {\n return typeof value === \"string\" && value.trim() ? value : fallback;\n}\n\nfunction getDefaultTrezorAppUrl() {\n return typeof globalThis.location !== \"undefined\" && globalThis.location.origin\n ? globalThis.location.origin\n : DEFAULT_TREZOR_MANIFEST.appUrl;\n}\n\nasync function initTrezorConnect() {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const trezorConfig = SKConfig.get(\"integrations\").trezor as Record<string, unknown> | undefined;\n const {\n connectSrc,\n coreMode,\n debug,\n interactionTimeout,\n lazyLoad,\n pendingTransportEvent,\n popup,\n transportReconnect,\n transports,\n ...manifestConfig\n } = trezorConfig ?? {};\n const manifest = {\n ...manifestConfig,\n appName: getTrezorManifestValue(trezorConfig?.appName, DEFAULT_TREZOR_MANIFEST.appName),\n appUrl: getTrezorManifestValue(trezorConfig?.appUrl, getDefaultTrezorAppUrl()),\n email: getTrezorManifestValue(trezorConfig?.email, DEFAULT_TREZOR_MANIFEST.email),\n };\n const isLocalhost =\n typeof globalThis.location !== \"undefined\" && [\"localhost\", \"127.0.0.1\"].includes(globalThis.location.hostname);\n const resolvedCoreMode = normalizeTrezorCoreMode(coreMode) ?? DEFAULT_TREZOR_CORE_MODE;\n const resolvedTransports = normalizeTrezorTransports(transports) ?? DEFAULT_TREZOR_TRANSPORTS;\n\n if (trezorSessionDispose) {\n await trezorSessionDispose;\n }\n\n if (isLocalhost) {\n await TrezorConnect.dispose();\n }\n\n await TrezorConnect.init({\n connectSrc: connectSrc as string | undefined,\n coreMode: resolvedCoreMode,\n debug: debug as boolean | undefined,\n interactionTimeout: interactionTimeout as number | undefined,\n lazyLoad: (lazyLoad as boolean | undefined) ?? false,\n manifest,\n pendingTransportEvent: pendingTransportEvent as boolean | undefined,\n popup: (popup as boolean | undefined) ?? true,\n transportReconnect: transportReconnect as boolean | undefined,\n transports: resolvedTransports,\n });\n\n return { coreMode: resolvedCoreMode, isLocalhost, popup: (popup as boolean | undefined) ?? true, TrezorConnect };\n}\n\nexport function normalizeTrezorExtendedPublicKey(xpub: string, chain: UTXOChain) {\n const targetVersions = getNetworkForChain(chain).bip32;\n const candidates = [\n targetVersions,\n ...EXTENDED_KEY_VERSION_CANDIDATES.filter(\n (versions) => versions.public !== targetVersions.public || versions.private !== targetVersions.private,\n ),\n ];\n let lastError: unknown;\n\n for (const versions of candidates) {\n try {\n const key = HDKey.fromExtendedKey(xpub, versions as Versions);\n if (!(key.publicKey && key.chainCode)) throw new Error(\"Extended key is missing public key data\");\n\n return new HDKey({\n chainCode: key.chainCode,\n depth: key.depth,\n index: key.index,\n parentFingerprint: key.parentFingerprint,\n publicKey: key.publicKey,\n versions: targetVersions,\n }).publicExtendedKey;\n } catch (error) {\n lastError = error;\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(\"Unable to parse Trezor extended public key\");\n}\n\nfunction tryNormalizeTrezorExtendedPublicKey(xpub: string | undefined, chain: UTXOChain) {\n if (!xpub) return undefined;\n\n try {\n return normalizeTrezorExtendedPublicKey(xpub, chain);\n } catch {\n return xpub;\n }\n}\n\nasync function decodeOpReturnData(script: Uint8Array) {\n const { Script } = await import(\"@swapkit/utxo-signer\");\n\n try {\n const [opcode, data] = Script.decode(script);\n const bytes = data === 0 ? new Uint8Array() : data;\n if (opcode !== \"RETURN\" || !(bytes instanceof Uint8Array)) return null;\n\n // Trezor rebuilds the script from the data, so only accept scripts it reproduces byte for byte\n return hex.encode(Script.encode([\"RETURN\", bytes])) === hex.encode(script) ? hex.encode(bytes) : null;\n } catch {\n return null;\n }\n}\n\nasync function toTrezorOpReturnOutput(script: Uint8Array, amount: bigint | undefined, chain: Chain) {\n if (amount !== 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"OP_RETURN output carrying value cannot be signed\" },\n });\n }\n\n const opReturnData = await decodeOpReturnData(script);\n\n if (opReturnData === null) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Malformed OP_RETURN output cannot be signed\" },\n });\n }\n\n return { amount: \"0\", op_return_data: opReturnData, script_type: \"PAYTOOPRETURN\" as const };\n}\n\nasync function assertTransactionCarriesMemo(tx: Transaction, memo: string, chain: Chain) {\n if (!memo) return;\n\n const expected = hex.encode(new TextEncoder().encode(memo));\n\n for (let i = 0; i < tx.outputsLength; i++) {\n const script = tx.getOutput(i).script;\n if (script?.[0] === 0x6a && (await decodeOpReturnData(script)) === expected) return;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Transaction does not carry the provided memo\" },\n });\n}\n\nfunction getScriptType(chain: Chain, derivationPath: DerivationPathArray) {\n switch (derivationPath[0]) {\n case 86:\n return chain === Chain.Bitcoin\n ? ({ input: \"SPENDTAPROOT\", output: \"PAYTOTAPROOT\", utxo: UTXOScriptType.P2TR } as const)\n : null;\n case 84:\n return { input: \"SPENDWITNESS\", output: \"PAYTOWITNESS\", utxo: UTXOScriptType.P2WPKH } as const;\n case 49:\n return { input: \"SPENDP2SHWITNESS\", output: \"PAYTOP2SHWITNESS\", utxo: UTXOScriptType.P2SH_P2WPKH } as const;\n case 44:\n return { input: \"SPENDADDRESS\", output: \"PAYTOADDRESS\", utxo: UTXOScriptType.P2PKH } as const;\n default:\n return null;\n }\n}\n\nfunction hardenDerivationPath(derivationPath: DerivationPathArray): number[] {\n return derivationPath.map((pathElement, index) =>\n index < 3 ? ((pathElement as number) | 0x80000000) >>> 0 : (pathElement as number),\n );\n}\n\nfunction isTrezorBip32Derivation(value: unknown): value is TrezorBip32Derivation {\n return (\n Array.isArray(value) &&\n value[0] instanceof Uint8Array &&\n typeof value[1] === \"object\" &&\n value[1] !== null &&\n typeof (value[1] as { fingerprint?: unknown }).fingerprint === \"number\" &&\n Array.isArray((value[1] as { path?: unknown }).path)\n );\n}\n\nfunction getFirstBip32Derivation(input: { bip32Derivation?: unknown }): TrezorBip32Derivation | undefined {\n if (!Array.isArray(input.bip32Derivation)) return undefined;\n const [firstDerivation] = input.bip32Derivation;\n\n return isTrezorBip32Derivation(firstDerivation) ? firstDerivation : undefined;\n}\n\nfunction isTrezorTapBip32Derivation(value: unknown): value is TrezorTapBip32Derivation {\n if (!(Array.isArray(value) && value[0] instanceof Uint8Array)) return false;\n const origin = value[1] as { der?: { path?: unknown }; hashes?: unknown } | undefined;\n\n return Array.isArray(origin?.hashes) && Array.isArray(origin?.der?.path);\n}\n\n// Key-path origins carry no leaf hashes; take the one for the internal key, or the only one when it is unset.\nfunction selectTapKeyOrigin(input: { tapBip32Derivation?: unknown; tapInternalKey?: Uint8Array }, inputIndex: number) {\n const origins = Array.isArray(input.tapBip32Derivation) ? input.tapBip32Derivation : [];\n if (origins.length === 0) return undefined;\n\n const { tapInternalKey } = input;\n const keyPathOrigins = origins.filter(\n (origin): origin is TrezorTapBip32Derivation =>\n isTrezorTapBip32Derivation(origin) &&\n origin[1].hashes.length === 0 &&\n (!tapInternalKey || hex.encode(origin[0]) === hex.encode(tapInternalKey)),\n );\n const [xOnlyKey, origin] = keyPathOrigins[0] ?? [];\n\n if (keyPathOrigins.length !== 1 || !(xOnlyKey && origin)) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: Chain.Bitcoin, error: `Input ${inputIndex} has no single taproot key-path origin to sign with` },\n });\n }\n\n return { path: origin.der.path, xOnlyKey };\n}\n\nfunction getPrevoutAmount(input: {\n index?: number;\n nonWitnessUtxo?: { outputs?: Array<{ amount?: bigint | number }> };\n witnessUtxo?: { amount?: bigint | number };\n}) {\n if (input.witnessUtxo?.amount !== undefined) return input.witnessUtxo.amount.toString();\n\n const prevout = input.index !== undefined ? input.nonWitnessUtxo?.outputs?.[input.index] : undefined;\n if (prevout?.amount !== undefined) return prevout.amount.toString();\n\n return undefined;\n}\n\nexport function normalizeTrezorSignature(signatureHex: string, chain: Chain) {\n const signature = Buffer.from(signatureHex, \"hex\");\n const derLength = signature[1] !== undefined ? signature[1] + 2 : undefined;\n\n if (derLength !== undefined && signature.length === derLength) {\n return new Uint8Array([...signature, chain === Chain.BitcoinCash ? BITCOIN_CASH_SIGHASH_ALL : 0x01]);\n }\n\n return new Uint8Array(signature);\n}\n\nfunction buildPCZTInputsForTrezor(\n pczt: PCZT,\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < pczt.inputsLength; i++) {\n const input = pczt.getInput(i);\n inputs.push({\n address_n,\n amount: input.value.toString(),\n prev_hash: hexEncode.encode(input.txid),\n prev_index: input.index,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nasync function buildPCZTOutputsForTrezor(pczt: PCZT, address_n: number[], myAddress: string, chain: Chain) {\n const outputs = [];\n for (let i = 0; i < pczt.outputsLength; i++) {\n const output = pczt.getOutput(i);\n const script = output.scriptPubkey;\n\n if (script?.[0] === 0x6a) {\n outputs.push(await toTrezorOpReturnOutput(script, output.value, chain));\n continue;\n }\n\n const outputAddress = await decodeOutputAddress(script);\n\n if (!outputAddress && output.value > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n\n if (isChangeAddress) {\n outputs.push({ address_n, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n } else {\n outputs.push({ address: outputAddress, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n }\n }\n return outputs;\n}\n\nasync function decodeOutputAddress(script: Uint8Array): Promise<string | undefined> {\n try {\n const { OutScript, Address, NETWORKS } = await import(\"@swapkit/utxo-signer\");\n const decoded = OutScript.decode(script);\n if (decoded.type === \"pkh\" || decoded.type === \"pk\") {\n return Address(NETWORKS.zcash).encode(decoded);\n }\n } catch {\n // ignore decode errors\n }\n return undefined;\n}\n\nasync function extractSignaturesFromSignedTx(signedTxHex: string, pczt: PCZT): Promise<PCZT> {\n const { ZcashTransaction: ZcashTx, Script } = await import(\"@swapkit/utxo-signer\");\n const signedTx = ZcashTx.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 const script = signedInput.script;\n if (script && script.length > 0) {\n const scriptParts = Script.decode(script);\n if (scriptParts.length >= 2) {\n signedPczt.addSignature(i, scriptParts[1] as Uint8Array, scriptParts[0] as Uint8Array);\n }\n }\n }\n return signedPczt;\n}\n\nfunction buildZcashTxInputsForTrezor(\n tx: ZcashTransaction,\n utxoInputs: UTXOType[],\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < tx.inputsLength; i++) {\n const input = tx.getInput(i);\n const utxoInfo = utxoInputs[i];\n inputs.push({\n address_n,\n amount: utxoInfo?.value?.toString() || input.value?.toString() || \"0\",\n prev_hash: input.txid ? hexEncode.encode(input.txid) : \"\",\n prev_index: input.index ?? 0,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nasync function buildZcashTxOutputsForTrezor({\n addressN,\n chain,\n myAddress,\n network,\n tx,\n}: {\n addressN: number[];\n chain: Chain;\n myAddress: string;\n network: BTCNetwork;\n tx: ZcashTransaction;\n}) {\n const outputs = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, network);\n const script = output.script;\n\n if (script?.[0] === 0x6a) {\n outputs.push(await toTrezorOpReturnOutput(script, output.amount, chain));\n continue;\n }\n\n if (!outputAddress && (output.amount ?? 0n) > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n const outputParam = isChangeAddress || !outputAddress ? { address_n: addressN } : { address: outputAddress };\n outputs.push({ ...outputParam, amount: output.amount?.toString() || \"0\", script_type: \"PAYTOADDRESS\" as const });\n }\n return outputs;\n}\n\nasync function buildUtxoOutputsForTrezor(\n tx: Transaction,\n network: BTCNetwork,\n address_n: number[],\n myAddress: string,\n chain: Chain,\n scriptType: { input: string; output: string },\n toCashAddress: (addr: string) => string,\n stripPrefix: (addr: string) => string,\n) {\n const outputs: any[] = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, network);\n\n if (output.script?.[0] === 0x6a) {\n outputs.push(await toTrezorOpReturnOutput(output.script, output.amount, chain));\n continue;\n }\n\n if (!outputAddress) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n if (output.amount === undefined) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Output amount is missing\" },\n });\n }\n\n const isBch = chain === Chain.BitcoinCash;\n const cashAddrWithPrefix = isBch ? toCashAddress(outputAddress) : outputAddress;\n const isChangeAddress = isBch\n ? stripPrefix(cashAddrWithPrefix) === stripPrefix(myAddress)\n : cashAddrWithPrefix === myAddress;\n\n outputs.push(\n isChangeAddress\n ? { address_n, amount: output.amount.toString(), script_type: scriptType.output }\n : { address: cashAddrWithPrefix, amount: output.amount.toString(), script_type: \"PAYTOADDRESS\" },\n );\n }\n return outputs;\n}\n\nfunction shouldUseTrezorPsbtSigner(chain: Chain) {\n return chain === Chain.Bitcoin || chain === Chain.Litecoin;\n}\n\nfunction shouldUseTrezorSerializedSigner(chain: Chain) {\n return chain === Chain.BitcoinCash || chain === Chain.Dash || chain === Chain.Dogecoin;\n}\n\nfunction buildTrezorRefTxs(chain: Chain, inputs: UTXOType[]): TrezorAccountRefTransaction[] | undefined {\n if (chain !== Chain.Dash) return undefined;\n\n const refs = new Map<string, TrezorAccountRefTransaction>();\n\n for (const input of inputs) {\n if (!input.txHex) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: `Missing previous transaction hex for ${input.hash}:${input.index}` },\n });\n }\n\n refs.set(input.hash, { details: {}, hex: input.txHex, txid: input.hash });\n }\n\n return [...refs.values()];\n}\n\nasync function getTrezorWallet<T extends Chain>({\n address: providedAddress,\n chain,\n derivationPath,\n}: {\n address?: string;\n chain: T;\n derivationPath: DerivationPathArray;\n}) {\n switch (chain) {\n case Chain.Arbitrum:\n case Chain.Arc:\n case Chain.Aurora:\n case Chain.Avalanche:\n case Chain.Base:\n case Chain.Berachain:\n case Chain.BinanceSmartChain:\n case Chain.Ethereum:\n case Chain.Gnosis:\n case Chain.Hyperevm:\n case Chain.Monad:\n case Chain.Optimism:\n case Chain.Polygon:\n case Chain.Robinhood:\n case Chain.XLayer: {\n const { getProvider, getEvmToolboxAsync } = await import(\"@swapkit/toolboxes/evm\");\n const { getEVMSigner } = await import(\"./evmSigner\");\n\n const provider = await getProvider(chain);\n const signer = await getEVMSigner({ chain, derivationPath, provider });\n const address = await signer.getAddress();\n const toolbox = await getEvmToolboxAsync(chain, { provider, signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Zcash: {\n const { getUtxoToolbox } = await import(\"@swapkit/toolboxes/utxo\");\n\n const derivationPathStr = derivationPathToString(derivationPath);\n\n const getAddress = async () => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { success, payload } = await TrezorConnect.getAddress({ coin: \"zcash\", path: derivationPathStr });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n return payload.address;\n };\n\n const address = providedAddress ?? (await getAddress());\n\n const signPCZTWithSerializedTx = async (pczt: PCZT) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const global = pczt.getGlobal();\n\n const inputs = buildPCZTInputsForTrezor(pczt, address_n, hexEncode);\n const outputs = await buildPCZTOutputsForTrezor(pczt, address_n, address, chain);\n const result = await TrezorConnect.signTransaction({\n branchId: global.consensusBranchId,\n coin: \"zcash\",\n expiry: global.expiryHeight,\n inputs,\n locktime: global.lockTime,\n outputs: outputs as any,\n overwintered: true,\n version: global.txVersion,\n versionGroupId: global.versionGroupId,\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n }\n\n return {\n serializedTx: result.payload.serializedTx,\n signedPczt: await extractSignaturesFromSignedTx(result.payload.serializedTx, pczt),\n };\n };\n\n const parseSignedZcashTransaction = async (signedTxHex: string) => {\n const { ZcashTransaction: ZcashTx } = await import(\"@swapkit/utxo-signer\");\n return ZcashTx.fromHex(signedTxHex, { allowUnknownOutputs: true });\n };\n\n const signZcashTransactionWithSerializedTx = async (tx: ZcashTransaction) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const { NETWORKS, ZcashVersionGroupId } = await import(\"@swapkit/utxo-signer\");\n const address_n = hardenDerivationPath(derivationPath);\n\n const inputs = buildZcashTxInputsForTrezor(tx, [], address_n, hexEncode);\n const outputs = await buildZcashTxOutputsForTrezor({\n addressN: address_n,\n chain,\n myAddress: address,\n network: NETWORKS.zcash,\n tx,\n });\n\n const result = await TrezorConnect.signTransaction({\n branchId: tx.consensusBranchId,\n coin: \"zcash\",\n expiry: 0,\n inputs,\n locktime: 0,\n outputs: outputs as any,\n overwintered: true,\n version: 4,\n versionGroupId: ZcashVersionGroupId.SAPLING,\n });\n\n if (result.success) {\n return {\n serializedTx: result.payload.serializedTx,\n signedTx: await parseSignedZcashTransaction(result.payload.serializedTx),\n };\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n };\n\n const signer = {\n getAddress: async () => address,\n\n signPCZT: async (pczt: PCZT): Promise<PCZT> => {\n return (await signPCZTWithSerializedTx(pczt)).signedPczt;\n },\n\n signTransaction: async (tx: ZcashSignableTransaction): Promise<ZcashTransaction> => {\n if (\"toPCZT\" in tx) {\n const { serializedTx } = await signPCZTWithSerializedTx(tx.toPCZT());\n return parseSignedZcashTransaction(serializedTx);\n }\n\n if (\"getGlobal\" in tx) {\n const { serializedTx } = await signPCZTWithSerializedTx(tx);\n return parseSignedZcashTransaction(serializedTx);\n }\n\n return (await signZcashTransactionWithSerializedTx(tx)).signedTx;\n },\n };\n\n const toolbox = getUtxoToolbox(Chain.Zcash, { signer });\n\n const signAndBroadcastTransaction = async (tx: ZcashSignableTransaction) => {\n if (\"toPCZT\" in tx) {\n const { serializedTx } = await signPCZTWithSerializedTx(tx.toPCZT());\n return toolbox.broadcastTx(serializedTx);\n }\n\n if (\"getGlobal\" in tx) {\n const { serializedTx } = await signPCZTWithSerializedTx(tx);\n return toolbox.broadcastTx(serializedTx);\n }\n\n const { serializedTx } = await signZcashTransactionWithSerializedTx(tx);\n return toolbox.broadcastTx(serializedTx);\n };\n\n const transfer = async ({ recipient, feeOptionKey, feeRate: paramFeeRate, ...rest }: GenericTransferParams) => {\n if (!(address && recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const feeRate = paramFeeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n const { tx } = await toolbox.createTransaction({\n ...rest,\n feeRate,\n fetchTxHex: false,\n recipient,\n sender: address,\n });\n const { serializedTx } = await signZcashTransactionWithSerializedTx(tx);\n\n return toolbox.broadcastTx(serializedTx);\n };\n\n return { ...toolbox, address, signAndBroadcastTransaction, signPCZT: signer.signPCZT, transfer };\n }\n\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n case Chain.Dash:\n case Chain.Dogecoin:\n case Chain.Litecoin: {\n const { toCashAddress, getUtxoToolbox, stripPrefix } = await import(\"@swapkit/toolboxes/utxo\");\n const utxoChain = chain as UTXOChain;\n const scriptType = getScriptType(chain, derivationPath);\n\n if (!scriptType) {\n throw new SwapKitError({ errorKey: \"wallet_trezor_derivation_path_not_supported\", info: { derivationPath } });\n }\n\n const resolvedScriptType = scriptType;\n const isTaproot = scriptType.utxo === UTXOScriptType.P2TR;\n const toolboxParams = { scriptType: scriptType.utxo };\n const coin = chain.toLowerCase();\n\n const getAddress = async (path: DerivationPathArray = derivationPath) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const pathString = derivationPathToString(path);\n const { success, payload } = await TrezorConnect.getAddress({\n coin,\n ...TREZOR_KEEP_SESSION_PARAMS,\n path: pathString,\n showOnTrezor: false,\n });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n if (chain === Chain.BitcoinCash) {\n return stripPrefix(payload.address);\n }\n\n return payload.address;\n };\n\n const address = providedAddress ?? (await getAddress());\n const baseToolbox = getUtxoToolbox(chain, toolboxParams);\n\n const signTransaction = async (tx: Transaction, inputs: UTXOType[], memo = \"\") => {\n await assertTransactionCarriesMemo(tx, memo, chain);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n\n const outputs = await buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n chain,\n resolvedScriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index, value }) => ({\n address_n,\n amount: value,\n prev_hash: hash,\n prev_index: index,\n script_type: resolvedScriptType.input,\n }));\n\n const result = await TrezorConnect.signTransaction({\n coin,\n inputs: trezorInputs,\n outputs,\n refTxs: buildTrezorRefTxs(chain, inputs) as never,\n });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n };\n\n const signPsbtTransaction = async (tx: Transaction): Promise<Transaction> => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n let fallbackPublicKey: Uint8Array | undefined;\n\n async function getFallbackDerivation(): Promise<TrezorBip32Derivation> {\n if (!fallbackPublicKey) {\n const accountInfo = await getExtendedPublicKeyInfo();\n const accountKey = HDKey.fromExtendedKey(accountInfo.xpub, network.bip32);\n const leaf = accountKey.derive(`m/${Number(derivationPath[3] ?? 0)}/${Number(derivationPath[4] ?? 0)}`);\n\n if (!leaf.publicKey) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: \"Unable to derive Trezor leaf public key from account xpub\" },\n });\n }\n\n fallbackPublicKey = leaf.publicKey;\n }\n\n return [fallbackPublicKey, { fingerprint: 0, path: address_n }];\n }\n\n const signerPubkeys: Uint8Array[] = [];\n const trezorInputs = [];\n\n async function prepareInputForSigning(inputIndex: number, input: ReturnType<Transaction[\"getInput\"]>) {\n if (isTaproot) {\n let keyOrigin = selectTapKeyOrigin(input, inputIndex);\n\n if (!keyOrigin) {\n const [publicKey, { path }] = await getFallbackDerivation();\n keyOrigin = { path, xOnlyKey: publicKey.slice(1) };\n tx.updateInput(inputIndex, {\n tapBip32Derivation: [[keyOrigin.xOnlyKey, { der: { fingerprint: 0, path }, hashes: [] }]],\n });\n }\n\n // A BIP86 key-path input's internal key is the x-only key its origin names.\n if (!input.tapInternalKey) tx.updateInput(inputIndex, { tapInternalKey: keyOrigin.xOnlyKey });\n return keyOrigin.path;\n }\n\n const existingDerivation = getFirstBip32Derivation(input);\n const derivation = existingDerivation ?? (await getFallbackDerivation());\n signerPubkeys[inputIndex] = derivation[0];\n\n if (!existingDerivation) {\n tx.updateInput(inputIndex, { bip32Derivation: [derivation] });\n }\n\n await applyMissingSpendingMetadata({ chain: utxoChain, indexes: [inputIndex], publicKey: derivation[0], tx });\n return derivation[1].path;\n }\n\n for (let inputIndex = 0; inputIndex < tx.inputsLength; inputIndex++) {\n const input = tx.getInput(inputIndex);\n const amount = getPrevoutAmount(input);\n\n if (!input.txid || input.index === undefined || !amount) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: `Input ${inputIndex} is missing prevout data required by Trezor` },\n });\n }\n\n const inputAddressN = await prepareInputForSigning(inputIndex, input);\n\n trezorInputs.push({\n address_n: inputAddressN,\n amount,\n prev_hash: hexEncode.encode(input.txid),\n prev_index: input.index,\n script_type: resolvedScriptType.input,\n ...(input.sequence !== undefined ? { sequence: input.sequence } : {}),\n });\n }\n\n const outputs = await buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n chain,\n resolvedScriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const result = await TrezorConnect.signTransaction({\n coin,\n ...TREZOR_KEEP_SESSION_PARAMS,\n inputs: trezorInputs,\n locktime: tx.lockTime,\n outputs,\n version: tx.version,\n });\n\n if (!result.success) {\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n }\n\n result.payload.signatures.forEach((signatureHex, inputIndex) => {\n if (!signatureHex) return;\n\n // Taproot key-path signatures are Schnorr, not DER, and finalize from tapKeySig.\n if (isTaproot) {\n tx.updateInput(inputIndex, { tapKeySig: hexEncode.decode(signatureHex) });\n return;\n }\n\n const pubkey = signerPubkeys[inputIndex];\n if (!pubkey) return;\n\n tx.updateInput(inputIndex, { partialSig: [[pubkey, normalizeTrezorSignature(signatureHex, chain)]] });\n });\n\n return tx;\n };\n\n const signSerializedTransaction = async (tx: Transaction) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n\n const trezorInputs = [];\n for (let inputIndex = 0; inputIndex < tx.inputsLength; inputIndex++) {\n const input = tx.getInput(inputIndex);\n const amount = getPrevoutAmount(input);\n\n if (!input.txid || input.index === undefined || !amount) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: `Input ${inputIndex} is missing prevout data required by Trezor` },\n });\n }\n\n trezorInputs.push({\n address_n,\n amount,\n prev_hash: hexEncode.encode(input.txid),\n prev_index: input.index,\n script_type: resolvedScriptType.input,\n ...(input.sequence !== undefined ? { sequence: input.sequence } : {}),\n });\n }\n\n const outputs = await buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n chain,\n resolvedScriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const result = await TrezorConnect.signTransaction({\n coin,\n inputs: trezorInputs,\n locktime: tx.lockTime,\n outputs,\n version: tx.version,\n });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n };\n\n const signTransactionWithMultipleInputs = async (\n tx: Transaction,\n inputs: Array<{\n derivationIndex: number;\n hash: string;\n index: number;\n isChange: boolean;\n txHex?: string;\n value: number;\n }>,\n memo = \"\",\n ) => {\n await assertTransactionCarriesMemo(tx, memo, chain);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const network = getNetworkForChain(chain as UTXOChain);\n const baseAddressN = hardenDerivationPath(derivationPath.slice(0, 3) as unknown as DerivationPathArray);\n\n const outputs = await buildUtxoOutputsForTrezor(\n tx,\n network,\n baseAddressN,\n address,\n chain,\n resolvedScriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index: inputIndex, value, derivationIndex, isChange }) => {\n const changePath = isChange ? 1 : 0;\n const inputAddressN = [...baseAddressN, changePath, derivationIndex];\n return {\n address_n: inputAddressN,\n amount: value,\n prev_hash: hash,\n prev_index: inputIndex,\n script_type: resolvedScriptType.input,\n };\n });\n\n const result = await TrezorConnect.signTransaction({\n coin,\n inputs: trezorInputs,\n outputs,\n refTxs: buildTrezorRefTxs(chain, inputs) as never,\n });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n };\n\n const transferFromMultipleAddresses = async ({\n utxos,\n recipient,\n assetValue,\n memo,\n feeRate,\n feeOptionKey,\n }: {\n utxos: Array<{\n hash: string;\n index: number;\n value: number;\n txHex?: string;\n derivationIndex: number;\n isChange: boolean;\n address: string;\n }>;\n recipient: string;\n assetValue: { getBaseValue: (unit: string) => number; chain: string };\n memo?: string;\n feeRate?: number;\n feeOptionKey?: (typeof FeeOption)[keyof typeof FeeOption];\n }) => {\n const toolbox = getUtxoToolbox(chain, toolboxParams);\n const txFeeRate = feeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const { tx, inputs: selectedInputs } = await toolbox.createTransaction({\n assetValue: assetValue as any,\n feeRate: txFeeRate,\n fetchTxHex: chain === Chain.Dash,\n memo,\n recipient,\n sender: address,\n });\n\n const inputsWithDerivation = selectedInputs.map((input: { hash: string; index: number; value: number }) => {\n const utxoInfo = utxos.find((u) => u.hash === input.hash && u.index === input.index);\n return {\n ...input,\n derivationIndex: utxoInfo?.derivationIndex ?? 0,\n isChange: utxoInfo?.isChange ?? false,\n txHex: utxoInfo?.txHex,\n };\n });\n\n const signedTxHex = await signTransactionWithMultipleInputs(tx as Transaction, inputsWithDerivation, memo);\n return toolbox.broadcastTx(signedTxHex);\n };\n\n const transfer = async ({\n recipient,\n feeOptionKey,\n feeRate: paramFeeRate,\n memo,\n ...rest\n }: GenericTransferParams) => {\n if (!(address && recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, memo, recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const toolbox = getUtxoToolbox(chain, toolboxParams);\n\n const feeRate = paramFeeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const createTxMethod = (toolbox as UTXOToolboxes[\"BTC\"]).createTransaction;\n\n const { tx, inputs } = await createTxMethod({\n ...rest,\n feeRate,\n fetchTxHex: chain === Chain.Dash,\n memo,\n recipient,\n sender: address,\n });\n\n const signedTxHex = await signTransaction(tx, inputs, memo);\n const txHash = await toolbox.broadcastTx(signedTxHex);\n\n return txHash;\n };\n\n const toolbox = shouldUseTrezorPsbtSigner(chain)\n ? await getUtxoToolbox(utxoChain, {\n ...toolboxParams,\n signer: { getAddress: async () => address, signTransaction: signPsbtTransaction },\n })\n : baseToolbox;\n\n const signAndBroadcastTransaction = shouldUseTrezorSerializedSigner(chain)\n ? async (tx: Transaction) => baseToolbox.broadcastTx(await signSerializedTransaction(tx))\n : toolbox.signAndBroadcastTransaction;\n const walletSignTransaction = shouldUseTrezorPsbtSigner(chain) ? toolbox.signTransaction : signTransaction;\n const walletTransfer = shouldUseTrezorPsbtSigner(chain) ? toolbox.transfer : transfer;\n\n async function getExtendedPublicKeyInfo({ accountIndex }: { accountIndex?: number } = {}) {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const path = derivationPathToString(resolvedAccountPath);\n const cacheKey = `${chain}:${path}`;\n const cached = trezorXpubCache.get(cacheKey);\n if (cached) return cached;\n\n const result = await TrezorConnect.getPublicKey({ coin, path });\n const { success, payload } = result;\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n const xpub = normalizeTrezorExtendedPublicKey(payload.xpub, utxoChain);\n const xpubSegwit = tryNormalizeTrezorExtendedPublicKey(payload.xpubSegwit, utxoChain);\n const info = {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n chainCode: payload.chainCode,\n depth: payload.depth,\n fingerprint: payload.fingerprint,\n path: payload.serializedPath,\n publicKey: payload.publicKey,\n xpub,\n xpubSegwit,\n };\n\n trezorXpubCache.set(cacheKey, info);\n return info;\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 assertDerivationIndex(\"index\", index);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const fullPath = `${derivationPathToString(resolvedAccountPath)}/${Number(change)}/${index}`;\n\n const { success, payload } = await TrezorConnect.getAddress({\n coin,\n ...TREZOR_KEEP_SESSION_PARAMS,\n path: fullPath,\n showOnTrezor: false,\n });\n\n if (!success) {\n return undefined;\n }\n\n let finalAddress = payload.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(payload.address);\n }\n\n const pubKeyResult = await TrezorConnect.getPublicKey({\n coin,\n ...TREZOR_KEEP_SESSION_PARAMS,\n path: fullPath,\n scriptType: resolvedScriptType.input,\n showOnTrezor: false,\n });\n const pubkey = pubKeyResult.success ? pubKeyResult.payload.publicKey : \"\";\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index,\n path: fullPath,\n pubkey,\n };\n }\n\n async function deriveAddressesBatch({\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 TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const accountPath = derivationPathToString(resolvedAccountPath);\n\n const paths = Array.from({ length: count }, (_, i) => ({\n coin,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n showOnTrezor: false,\n }));\n\n const { success, payload } = await TrezorConnect.getAddress({ ...TREZOR_KEEP_SESSION_PARAMS, bundle: paths });\n\n if (!success || !Array.isArray(payload)) {\n return [];\n }\n\n const addresses = await Promise.all(\n payload.map(async (result, i) => {\n let finalAddress = result.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(result.address);\n }\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index: startIndex + i,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n pubkey: \"\",\n };\n }),\n );\n\n return addresses;\n }\n\n const hdHelpers = createHDWalletHelpers({\n chain,\n deriveAddress: deriveAddressAtIndex,\n getBalance: toolbox.getBalance,\n getUtxos: (addr: string) => getUtxoApi(chain).getUtxos({ address: addr, fetchTxHex: true }),\n });\n\n return {\n ...toolbox,\n ...hdHelpers,\n address,\n deriveAddressAtIndex,\n deriveAddresses: deriveAddressesBatch,\n getExtendedPublicKey,\n getExtendedPublicKeyInfo,\n signAndBroadcastTransaction,\n signTransaction: walletSignTransaction,\n signTransactionWithMultipleInputs,\n transfer: walletTransfer,\n transferFromMultipleAddresses,\n };\n }\n\n default:\n throw new SwapKitError({ errorKey: \"wallet_chain_not_supported\", info: { chain, wallet: WalletOption.TREZOR } });\n }\n}\n\nexport async function getTrezorExtendedPublicKey(\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({ errorKey: \"wallet_chain_not_supported\", info: { chain, wallet: WalletOption.TREZOR } });\n }\n\n const { TrezorConnect } = await initTrezorConnect();\n const utxoChain = chain as UTXOChain;\n const resolvedDerivationPath = derivationPath ?? (NetworkDerivationPath[chain] as DerivationPathArray);\n const coin = chain === Chain.Zcash ? \"zcash\" : chain.toLowerCase();\n\n const resolvedAccountPath = getUTXOAccountPath({\n accountIndex,\n chain: utxoChain,\n derivationPath: resolvedDerivationPath,\n });\n const path = derivationPathToString(resolvedAccountPath);\n const cacheKey = `${chain}:${path}`;\n const cached = trezorXpubCache.get(cacheKey);\n if (cached) return cached;\n\n const { success, payload } = await TrezorConnect.getPublicKey({ coin, path, showOnTrezor: true });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n const info = {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n chainCode: payload.chainCode,\n depth: payload.depth,\n fingerprint: payload.fingerprint,\n path: payload.serializedPath,\n publicKey: payload.publicKey,\n xpub: normalizeTrezorExtendedPublicKey(payload.xpub, utxoChain),\n xpubSegwit: tryNormalizeTrezorExtendedPublicKey(payload.xpubSegwit, utxoChain),\n };\n\n trezorXpubCache.set(cacheKey, info);\n return info;\n}\n\nexport const trezorWallet = createWallet({\n connect: ({ addChain, supportedChains, walletType }) =>\n async function connectTrezor(\n chains: Chain[],\n derivationPath: DerivationPathArray,\n { address }: ConnectTrezorOptions = {},\n ) {\n const [chain] = filterSupportedChains({ chains, supportedChains, walletType });\n if (!chain) {\n throw new SwapKitError({\n errorKey: \"wallet_chain_not_supported\",\n info: { chain, wallet: WalletOption.TREZOR },\n });\n }\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const trezorConfig = SKConfig.get(\"integrations\").trezor as Record<string, unknown> | undefined;\n const {\n connectSrc,\n coreMode,\n debug,\n interactionTimeout,\n lazyLoad,\n pendingTransportEvent,\n popup,\n transportReconnect,\n transports,\n ...manifestConfig\n } = trezorConfig ?? {};\n const manifest = {\n ...manifestConfig,\n appName: getTrezorManifestValue(trezorConfig?.appName, DEFAULT_TREZOR_MANIFEST.appName),\n appUrl: getTrezorManifestValue(trezorConfig?.appUrl, getDefaultTrezorAppUrl()),\n email: getTrezorManifestValue(trezorConfig?.email, DEFAULT_TREZOR_MANIFEST.email),\n };\n const isLocalhost =\n typeof globalThis.location !== \"undefined\" && [\"localhost\", \"127.0.0.1\"].includes(globalThis.location.hostname);\n const resolvedCoreMode = normalizeTrezorCoreMode(coreMode) ?? DEFAULT_TREZOR_CORE_MODE;\n const resolvedTransports = normalizeTrezorTransports(transports) ?? DEFAULT_TREZOR_TRANSPORTS;\n\n if (trezorSessionDispose) {\n await trezorSessionDispose;\n }\n\n if (isLocalhost) {\n await TrezorConnect.dispose();\n }\n\n await TrezorConnect.init({\n connectSrc: connectSrc as string | undefined,\n coreMode: resolvedCoreMode,\n debug: debug as boolean | undefined,\n interactionTimeout: interactionTimeout as number | undefined,\n lazyLoad: (lazyLoad as boolean | undefined) ?? false,\n manifest,\n pendingTransportEvent: pendingTransportEvent as boolean | undefined,\n popup: (popup as boolean | undefined) ?? true,\n transportReconnect: transportReconnect as boolean | undefined,\n transports: resolvedTransports,\n });\n\n const wallet = await getTrezorWallet({ address, chain, derivationPath });\n\n addChain({ ...wallet, chain, disconnect: disconnectTrezorSession, walletType });\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.Bitcoin]: true,\n [Chain.BitcoinCash]: true,\n [Chain.Dash]: true,\n [Chain.Ethereum]: true,\n [Chain.Gnosis]: true,\n [Chain.Dogecoin]: true,\n [Chain.Hyperevm]: true,\n [Chain.Litecoin]: true,\n [Chain.Monad]: true,\n [Chain.Optimism]: true,\n [Chain.Polygon]: true,\n [Chain.Robinhood]: true,\n [Chain.XLayer]: true,\n [Chain.Zcash]: true,\n },\n getExtendedPublicKey: getTrezorExtendedPublicKey,\n name: \"connectTrezor\",\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.Dash,\n Chain.Dogecoin,\n Chain.Ethereum,\n Chain.Gnosis,\n Chain.Hyperevm,\n Chain.Litecoin,\n Chain.Monad,\n Chain.Optimism,\n Chain.Polygon,\n Chain.Robinhood,\n Chain.XLayer,\n Chain.Zcash,\n ],\n walletType: WalletOption.TREZOR,\n});\n\nexport const TREZOR_SUPPORTED_CHAINS = getWalletSupportedChains(trezorWallet);\n",
6
+ "import { hex } from \"@scure/base\";\nimport { Chain, type DerivationPathArray, derivationPathToString, SwapKitError } from \"@swapkit/helpers\";\nimport {\n addCardanoVkeyWitnesses,\n decodeCardanoTransaction,\n getCardanoAddressFromBytes,\n getCardanoPublicKeyHash,\n} from \"@swapkit/toolboxes/cardano\";\nimport type {\n CardanoAssetGroup,\n CardanoInput,\n CardanoOutput,\n CardanoSignedTxData,\n CardanoSignTransaction,\n PROTO,\n} from \"@trezor/connect-web\";\n\ntype CardanoAddressParams = { address: string; path: string; stakingPath: string };\nexport type TrezorConnectModule = typeof import(\"@trezor/connect-web\");\n\nfunction getConnectParams({ CARDANO, PROTO }: TrezorConnectModule) {\n return {\n // Trezor Suite default, same as the SwapKit keystore\n derivationType: PROTO.CardanoDerivationType.ICARUS,\n mainnet: { networkId: CARDANO.NETWORK_IDS.mainnet, protocolMagic: CARDANO.PROTOCOL_MAGICS.mainnet },\n };\n}\n\nconst BODY = { AUXILIARY_DATA_HASH: 7, FEE: 2, INPUTS: 0, OUTPUTS: 1, TTL: 3, VALIDITY_INTERVAL_START: 8 } as const;\nconst SET_TAG = 258;\n\nfunction notSupported(reason: string) {\n return new SwapKitError({ errorKey: \"wallet_trezor_method_not_supported\", info: { chain: Chain.Cardano, reason } });\n}\n\nfunction signFailed(error: string) {\n return new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: Chain.Cardano, error },\n });\n}\n\nfunction toUint(value: unknown, field: string) {\n const isBigNumber = typeof value === \"object\" && value !== null && \"toFixed\" in value;\n const text = isBigNumber || Number.isSafeInteger(value) ? String((value as number).toFixed()) : \"\";\n if (!/^\\d+$/.test(text)) throw notSupported(`Invalid ${field} in Cardano transaction`);\n return text;\n}\n\nfunction toTokenBundle(multiAsset: Map<Uint8Array, Map<Uint8Array, unknown>>): CardanoAssetGroup[] {\n return [...multiAsset].map(([policyId, assets]) => ({\n policyId: hex.encode(policyId),\n tokenAmounts: [...assets].map(([assetName, amount]) => ({\n amount: toUint(amount, \"token amount\"),\n assetNameBytes: hex.encode(assetName),\n })),\n }));\n}\n\nasync function toTrezorOutput(\n output: unknown,\n own: CardanoAddressParams,\n proto: TrezorConnectModule[\"PROTO\"],\n): Promise<CardanoOutput> {\n let address: unknown;\n let value: unknown;\n let format: PROTO.CardanoTxOutputSerializationFormat;\n\n if (Array.isArray(output)) {\n if (output.length !== 2) throw notSupported(\"Trezor cannot sign Cardano outputs with a datum\");\n [address, value] = output;\n format = proto.CardanoTxOutputSerializationFormat.ARRAY_LEGACY;\n } else if (output instanceof Map) {\n if (output.has(2)) throw notSupported(\"Trezor cannot sign Cardano outputs with a datum\");\n if (output.has(3)) throw notSupported(\"Trezor cannot sign Cardano outputs with a reference script\");\n if (output.size !== 2) throw notSupported(\"Unsupported field in Cardano output\");\n address = output.get(0);\n value = output.get(1);\n format = proto.CardanoTxOutputSerializationFormat.MAP_BABBAGE;\n } else {\n throw notSupported(\"Invalid Cardano output\");\n }\n\n if (Array.isArray(value) && value.length !== 2) throw notSupported(\"Invalid Cardano output value\");\n const [coin, multiAsset] = Array.isArray(value) ? value : [value];\n const outputAddress = await getCardanoAddressFromBytes(address as Uint8Array);\n const destination =\n outputAddress === own.address\n ? {\n addressParameters: {\n addressType: proto.CardanoAddressType.BASE,\n path: own.path,\n stakingPath: own.stakingPath,\n },\n }\n : { address: outputAddress };\n\n return {\n ...destination,\n amount: toUint(coin, \"output amount\"),\n format,\n ...(multiAsset === undefined ? {} : { tokenBundle: toTokenBundle(multiAsset) }),\n };\n}\n\nfunction toTrezorInputs(inputs: unknown, path: string) {\n const isTagged =\n typeof inputs === \"object\" && inputs !== null && \"tag\" in inputs && inputs.tag === SET_TAG && \"value\" in inputs;\n const list = (isTagged ? inputs.value : inputs) as unknown[][];\n\n const trezorInputs: CardanoInput[] = list.map((input) => {\n if (input.length !== 2) throw notSupported(\"Invalid Cardano input\");\n const [txHash, index] = input as [Uint8Array, unknown];\n return { path, prev_hash: hex.encode(txHash), prev_index: Number(toUint(index, \"input index\")) };\n });\n\n return { inputs: trezorInputs, tagCborSets: isTagged };\n}\n\nexport async function toTrezorCardanoTransaction(\n txHex: string,\n own: CardanoAddressParams,\n connect: TrezorConnectModule,\n): Promise<CardanoSignTransaction> {\n const { body } = await decodeCardanoTransaction(txHex);\n const { derivationType, mainnet } = getConnectParams(connect);\n const { PROTO: proto } = connect;\n\n const supportedFields: unknown[] = Object.values(BODY);\n const unsupported = [...body.keys()].filter((field) => !supportedFields.includes(field));\n if (unsupported.length > 0) {\n throw notSupported(`Trezor cannot sign Cardano transactions with body fields ${unsupported.join(\", \")}`);\n }\n\n const outputs = body.get(BODY.OUTPUTS) as unknown[];\n const auxiliaryDataHash = body.get(BODY.AUXILIARY_DATA_HASH) as Uint8Array | undefined;\n\n const ttl = body.get(BODY.TTL);\n const validityIntervalStart = body.get(BODY.VALIDITY_INTERVAL_START);\n\n return {\n ...toTrezorInputs(body.get(BODY.INPUTS), own.path),\n ...mainnet,\n derivationType,\n fee: toUint(body.get(BODY.FEE), \"fee\"),\n outputs: await Promise.all(outputs.map((output) => toTrezorOutput(output, own, proto))),\n signingMode: proto.CardanoTxSigningMode.ORDINARY_TRANSACTION,\n ...(auxiliaryDataHash ? { auxiliaryData: { hash: hex.encode(auxiliaryDataHash) } } : {}),\n ...(ttl === undefined ? {} : { ttl: toUint(ttl, \"ttl\") }),\n ...(validityIntervalStart === undefined\n ? {}\n : { validityIntervalStart: toUint(validityIntervalStart, \"validity interval start\") }),\n };\n}\n\nexport async function addTrezorWitnesses(\n txHex: string,\n { hash, witnesses }: Pick<CardanoSignedTxData, \"hash\" | \"witnesses\">,\n publicKey: string,\n { PROTO: proto }: TrezorConnectModule,\n) {\n const { bodyHash } = await decodeCardanoTransaction(txHex);\n\n if (hash.toLowerCase() !== bodyHash) throw signFailed(\"Trezor signed a different transaction body\");\n\n const vkeyWitnesses = witnesses.map(({ pubKey, signature, type }) => {\n if (type !== proto.CardanoTxWitnessType.SHELLEY_WITNESS || pubKey.toLowerCase() !== publicKey) {\n throw signFailed(\"Trezor returned a witness for an unexpected key\");\n }\n return { publicKey: hex.decode(pubKey), signature: hex.decode(signature) };\n });\n\n return addCardanoVkeyWitnesses(txHex, vkeyWitnesses);\n}\n\nexport async function getCardanoSigner({\n connect,\n derivationPath,\n}: {\n connect: TrezorConnectModule;\n derivationPath: DerivationPathArray;\n}) {\n const [purpose, coinType, account, role, index] = derivationPath;\n if (derivationPath.length !== 5 || role !== 0 || index === undefined) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_derivation_path_not_supported\",\n info: { chain: Chain.Cardano, derivationPath },\n });\n }\n\n const path = derivationPathToString(derivationPath);\n const stakingPath = derivationPathToString([purpose, coinType, account, 2, 0] as DerivationPathArray);\n const { derivationType, mainnet } = getConnectParams(connect);\n const TrezorConnect = connect.default;\n\n // One device call: a second one right after would need a new Connect popup\n const keysResult = await TrezorConnect.cardanoGetPublicKey({\n bundle: [path, stakingPath].map((keyPath) => ({ derivationType, path: keyPath })),\n });\n if (!keysResult.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain: Chain.Cardano, derivationPath, error: keysResult.payload.error },\n });\n }\n\n const [publicKey, stakingKey] = keysResult.payload.map(({ node }) => Buffer.from(node.public_key, \"hex\")) as [\n Buffer,\n Buffer,\n ];\n const publicKeyHash = await getCardanoPublicKeyHash(publicKey);\n const address = await getCardanoAddressFromBytes(\n Buffer.concat([Buffer.from([mainnet.networkId]), publicKeyHash, await getCardanoPublicKeyHash(stakingKey)]),\n );\n\n async function signTransaction(txHex: string) {\n const params = await toTrezorCardanoTransaction(txHex, { address, path, stakingPath }, connect);\n const result = await TrezorConnect.cardanoSignTransaction(params);\n\n if (!result.success) throw signFailed(result.payload.error);\n\n return addTrezorWitnesses(txHex, result.payload, publicKey.toString(\"hex\"), connect);\n }\n\n return { getAddress: () => address, publicKey, publicKeyHash, signTransaction };\n}\n",
7
+ "import { Chain, type DerivationPathArray, derivationPathToString, SwapKitError } from \"@swapkit/helpers\";\nimport type { RippleTransaction } from \"@swapkit/toolboxes/ripple\";\nimport { GlobalFlags, hashes, isValidClassicAddress } from \"xrpl\";\n\n// Fields Trezor serializes itself; anything else would be dropped from the signed transaction\nconst TREZOR_RIPPLE_FIELDS = new Set([\n \"Account\",\n \"Amount\",\n \"Destination\",\n \"DestinationTag\",\n \"Fee\",\n \"Flags\",\n \"LastLedgerSequence\",\n \"Sequence\",\n \"SigningPubKey\",\n \"TransactionType\",\n]);\n\nfunction notSupported(reason: string) {\n return new SwapKitError({ errorKey: \"wallet_trezor_method_not_supported\", info: { chain: Chain.Ripple, reason } });\n}\n\nexport function toTrezorRippleTransaction(transaction: RippleTransaction) {\n const tx = transaction as unknown as Record<string, unknown>;\n\n if (tx.TransactionType !== \"Payment\") {\n throw notSupported(`Trezor only signs XRP payments, got ${String(tx.TransactionType)}`);\n }\n\n const unsupportedFields = Object.keys(tx).filter(\n (field) => tx[field] !== undefined && tx[field] !== null && !TREZOR_RIPPLE_FIELDS.has(field),\n );\n if (unsupportedFields.length > 0) {\n throw notSupported(`Trezor cannot sign XRP payments with ${unsupportedFields.join(\", \")}`);\n }\n\n const { Amount, Destination, DestinationTag, Fee, Flags, LastLedgerSequence, Sequence } = tx;\n\n if (typeof Amount !== \"string\" || !/^\\d+$/.test(Amount)) throw notSupported(\"Trezor only signs native XRP amounts\");\n if (typeof Destination !== \"string\") throw notSupported(\"Missing destination\");\n if (!isValidClassicAddress(Destination)) throw notSupported(\"Destination must be a classic XRP address\");\n if (typeof Fee !== \"string\" || typeof Sequence !== \"number\") throw notSupported(\"Transaction is not autofilled\");\n if (Flags !== undefined && typeof Flags !== \"number\") throw notSupported(\"Flags must be numeric\");\n if (((Flags ?? 0) & GlobalFlags.tfInnerBatchTxn) !== 0) {\n throw notSupported(\"Trezor cannot sign Batch inner XRP transactions\");\n }\n\n return {\n fee: Fee,\n flags: Flags as number | undefined,\n maxLedgerVersion: LastLedgerSequence as number | undefined,\n payment: { amount: Amount, destination: Destination, destinationTag: DestinationTag as number | undefined },\n sequence: Sequence,\n };\n}\n\nexport function getRippleSigner({ derivationPath }: { derivationPath: DerivationPathArray }) {\n const path = derivationPathToString(derivationPath);\n let address = \"\";\n\n async function getAddress() {\n if (address) return address;\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const result = await TrezorConnect.rippleGetAddress({ path, showOnTrezor: true });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain: Chain.Ripple, derivationPath, error: result.payload.error },\n });\n }\n\n address = result.payload.address;\n return address;\n }\n\n async function signTransaction(transaction: RippleTransaction) {\n const trezorTransaction = toTrezorRippleTransaction(transaction);\n if (transaction.Account !== (await getAddress())) {\n throw notSupported(\"Transaction account does not match the Trezor address\");\n }\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const result = await TrezorConnect.rippleSignTransaction({ path, transaction: trezorTransaction });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: Chain.Ripple, error: result.payload.error },\n });\n }\n\n const tx_blob = result.payload.serializedTx.toUpperCase();\n return { hash: hashes.hashSignedTx(tx_blob), tx_blob };\n }\n\n return { getAddress, signTransaction };\n}\n",
8
+ "import { ed25519 } from \"@noble/curves/ed25519.js\";\nimport { hex } from \"@scure/base\";\nimport { PublicKey, type Transaction, type VersionedTransaction } from \"@solana/web3.js\";\nimport { Chain, type DerivationPathArray, derivationPathToString, SwapKitError } from \"@swapkit/helpers\";\n\ntype SolanaTransaction = Transaction | VersionedTransaction;\n\nfunction notSupported(reason: string) {\n return new SwapKitError({ errorKey: \"wallet_trezor_method_not_supported\", info: { chain: Chain.Solana, reason } });\n}\n\nfunction getSigners(transaction: SolanaTransaction) {\n if (\"version\" in transaction) {\n const { header, staticAccountKeys } = transaction.message;\n return {\n message: transaction.message.serialize(),\n signerKeys: staticAccountKeys.slice(0, header.numRequiredSignatures),\n };\n }\n\n return {\n message: transaction.serializeMessage(),\n signerKeys: transaction.signatures.map(({ publicKey }) => publicKey),\n };\n}\n\nfunction getSolanaSigningPayload(transaction: SolanaTransaction, address: string) {\n const { message, signerKeys } = getSigners(transaction);\n const signerKey = signerKeys.find((key) => key.toBase58() === address);\n\n if (!signerKey) throw notSupported(\"Trezor account is not a required signer of this transaction\");\n\n return { message, signerKey };\n}\n\nfunction addSolanaSignature<T extends SolanaTransaction>(\n transaction: T,\n { message, signature, signerKey }: { message: Uint8Array; signature: Uint8Array; signerKey: PublicKey },\n) {\n if (signature.length !== 64) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: Chain.Solana, error: `Invalid signature length: ${signature.length}` },\n });\n }\n\n if (!ed25519.verify(signature, message, signerKey.toBytes())) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: Chain.Solana, error: \"Signature does not match the Trezor account\" },\n });\n }\n\n transaction.addSignature(signerKey, Buffer.from(signature));\n return transaction;\n}\n\nexport function getSolanaSigner({\n address,\n derivationPath,\n}: {\n address?: string;\n derivationPath: DerivationPathArray;\n}) {\n // Trezor firmware only accepts m/44'/501' plus up to two more levels.\n const [purpose, coinType] = derivationPath;\n if (purpose !== 44 || coinType !== 501 || derivationPath.length > 4) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_derivation_path_not_supported\",\n info: { chain: Chain.Solana, derivationPath },\n });\n }\n\n const path = derivationPathToString(derivationPath, { allHardened: true });\n const knownKey = address ? new PublicKey(address) : null;\n let publicKey: PublicKey | null = null;\n\n async function loadAddress(showOnTrezor: boolean) {\n if (publicKey) return publicKey.toBase58();\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const result = await TrezorConnect.solanaGetAddress({ path, showOnTrezor });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain: Chain.Solana, derivationPath, error: result.payload.error },\n });\n }\n\n const deviceKey = new PublicKey(result.payload.address);\n if (knownKey && !deviceKey.equals(knownKey)) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain: Chain.Solana, derivationPath, error: \"Trezor account does not match the restored address\" },\n });\n }\n\n publicKey = deviceKey;\n return result.payload.address;\n }\n\n async function signTransaction<T extends SolanaTransaction>(transaction: T) {\n const { message, signerKey } = getSolanaSigningPayload(transaction, await loadAddress(false));\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const result = await TrezorConnect.solanaSignTransaction({ path, serializedTx: hex.encode(message) });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: Chain.Solana, error: result.payload.error },\n });\n }\n\n const signature = hex.decode(result.payload.signature.replace(/^0x/, \"\"));\n return addSolanaSignature(transaction, { message, signature, signerKey });\n }\n\n return {\n connect: async () => ({ publicKey: new PublicKey(await loadAddress(true)) }),\n disconnect: () => Promise.resolve(),\n getAddress: () => loadAddress(true),\n get publicKey() {\n return publicKey ?? knownKey;\n },\n signTransaction,\n };\n}\n",
9
+ "import { Chain, type DerivationPathArray, derivationPathToString, SwapKitError } from \"@swapkit/helpers\";\nimport type { StellarSigner, StellarTransaction } from \"@swapkit/toolboxes/stellar\";\n\ntype StellarClassicTransaction = Exclude<StellarTransaction, { innerTransaction: unknown }>;\ntype StellarOperation = StellarClassicTransaction[\"operations\"][number];\ntype StellarAsset = Extract<StellarOperation, { type: \"changeTrust\" }>[\"line\"];\n\nconst STELLAR_DECIMALS = 7;\nconst MAX_UINT32 = 4294967295n;\nconst ASSET_TYPES: Record<string, \"NATIVE\" | \"ALPHANUM4\" | \"ALPHANUM12\"> = {\n credit_alphanum4: \"ALPHANUM4\",\n credit_alphanum12: \"ALPHANUM12\",\n native: \"NATIVE\",\n};\nconst MEMO_TYPES = { hash: 3, id: 2, return: 4, text: 1 } as const;\n\nfunction notSupported(reason: string) {\n return new SwapKitError({ errorKey: \"wallet_trezor_method_not_supported\", info: { chain: Chain.Stellar, reason } });\n}\n\nfunction toStroops(amount: string) {\n const match = /^(\\d+)(?:\\.(\\d{1,7}))?$/.exec(amount);\n if (!match) throw notSupported(`Invalid Stellar amount: ${amount}`);\n\n const [, whole = \"0\", fraction = \"\"] = match;\n return BigInt(`${whole}${fraction.padEnd(STELLAR_DECIMALS, \"0\")}`).toString();\n}\n\nfunction toTimeBound(value: string) {\n if (!/^\\d+$/.test(value) || BigInt(value) > MAX_UINT32) {\n throw notSupported(`Unsupported Stellar time bound: ${value}`);\n }\n return Number(value);\n}\n\nfunction toTrezorAsset(asset: StellarAsset) {\n const type = ASSET_TYPES[asset.getAssetType()];\n if (!type || !(\"getCode\" in asset)) throw notSupported(\"Trezor does not support liquidity pool assets\");\n\n return type === \"NATIVE\" ? { type } : { code: asset.getCode(), issuer: asset.getIssuer(), type };\n}\n\nfunction toTrezorOperation({ source, ...operation }: StellarOperation) {\n const withSource = source ? { source } : {};\n\n switch (operation.type) {\n case \"payment\":\n return {\n ...withSource,\n amount: toStroops(operation.amount),\n asset: toTrezorAsset(operation.asset),\n destination: operation.destination,\n type: \"payment\" as const,\n };\n case \"createAccount\":\n return {\n ...withSource,\n destination: operation.destination,\n startingBalance: toStroops(operation.startingBalance),\n type: \"createAccount\" as const,\n };\n case \"changeTrust\":\n return {\n ...withSource,\n limit: toStroops(operation.limit),\n line: toTrezorAsset(operation.line),\n type: \"changeTrust\" as const,\n };\n default:\n throw notSupported(`Unsupported Stellar operation: ${operation.type}`);\n }\n}\n\nfunction decodeTextMemo(value: StellarClassicTransaction[\"memo\"][\"value\"]) {\n if (typeof value === \"string\") return value;\n\n try {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(value ?? undefined);\n } catch {\n throw notSupported(\"Trezor only signs UTF-8 text memos\");\n }\n}\n\nfunction toTrezorMemo({ type, value }: StellarClassicTransaction[\"memo\"]) {\n switch (type) {\n case \"none\":\n return undefined;\n case \"text\":\n return { text: decodeTextMemo(value), type: MEMO_TYPES.text };\n case \"id\":\n return { id: String(value), type: MEMO_TYPES.id };\n case \"hash\":\n case \"return\":\n return { hash: Buffer.from(value ?? \"\").toString(\"hex\"), type: MEMO_TYPES[type] };\n default:\n throw notSupported(`Unsupported Stellar memo type: ${type}`);\n }\n}\n\nexport function toTrezorStellarTransaction(transaction: StellarTransaction) {\n if (\"innerTransaction\" in transaction) throw notSupported(\"Trezor cannot sign fee bump transactions\");\n\n if (!transaction.timeBounds) throw notSupported(\"Trezor requires transaction time bounds\");\n const { extraSigners, ledgerBounds, minAccountSequence, minAccountSequenceAge, minAccountSequenceLedgerGap } =\n transaction;\n const hasPreconditions = [ledgerBounds, minAccountSequence, minAccountSequenceAge, minAccountSequenceLedgerGap].some(\n (precondition) => precondition !== undefined,\n );\n if (hasPreconditions || extraSigners?.length) {\n throw notSupported(\"Trezor cannot sign Stellar transactions with extra preconditions\");\n }\n\n return {\n networkPassphrase: transaction.networkPassphrase,\n transaction: {\n fee: Number(transaction.fee),\n memo: toTrezorMemo(transaction.memo),\n operations: transaction.operations.map(toTrezorOperation),\n sequence: transaction.sequence,\n source: transaction.source,\n timebounds: {\n maxTime: toTimeBound(transaction.timeBounds.maxTime),\n minTime: toTimeBound(transaction.timeBounds.minTime),\n },\n },\n };\n}\n\nexport function getStellarSigner({ derivationPath }: { derivationPath: DerivationPathArray }): StellarSigner {\n if (derivationPath[3] || derivationPath[4]) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_derivation_path_not_supported\",\n info: { chain: Chain.Stellar, derivationPath, reason: \"Stellar only uses m/44'/148'/x'\" },\n });\n }\n\n const path = derivationPathToString(derivationPath.slice(0, 3) as [number, number, number]);\n let address = \"\";\n\n async function getAddress() {\n if (address) return address;\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const result = await TrezorConnect.stellarGetAddress({ path, showOnTrezor: true });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain: Chain.Stellar, derivationPath, error: result.payload.error },\n });\n }\n\n address = result.payload.address;\n return address;\n }\n\n async function signTransaction(transaction: StellarTransaction) {\n const params = toTrezorStellarTransaction(transaction);\n if (params.transaction.source !== (await getAddress())) {\n throw notSupported(\"Transaction source does not match the Trezor address\");\n }\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const result = await TrezorConnect.stellarSignTransaction({ path, ...params });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: Chain.Stellar, error: result.payload.error },\n });\n }\n\n try {\n transaction.addSignature(address, Buffer.from(result.payload.signature, \"hex\").toString(\"base64\"));\n } catch (error) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: Chain.Stellar, error },\n });\n }\n\n return transaction;\n }\n\n return { getAddress, signTransaction };\n}\n",
10
+ "import { Chain, type DerivationPathArray, derivationPathToString, SwapKitError } from \"@swapkit/helpers\";\nimport {\n type TronSignedTransaction,\n type TronSigner,\n type TronTransaction,\n tronAddressToHex,\n} from \"@swapkit/toolboxes/tron\";\n\ntype TronFields = Record<string, unknown>;\n\nconst TRON_HEX_ADDRESS = /^41[0-9a-f]{40}$/i;\n// Fields Trezor rebuilds itself; anything else would change the bytes it signs\nconst RAW_DATA_FIELDS = new Set([\n \"contract\",\n \"data\",\n \"expiration\",\n \"fee_limit\",\n \"ref_block_bytes\",\n \"ref_block_hash\",\n \"timestamp\",\n]);\nconst CONTRACT_FIELDS = new Set([\"parameter\", \"type\"]);\nconst CONTRACT_VALUE_FIELDS: Record<string, Set<string>> = {\n TransferContract: new Set([\"amount\", \"owner_address\", \"to_address\"]),\n TriggerSmartContract: new Set([\"contract_address\", \"data\", \"owner_address\"]),\n};\nconst PROTOBUF_DEFAULTS: unknown[] = [undefined, null, 0, \"\", false];\n\nfunction notSupported(reason: string) {\n return new SwapKitError({ errorKey: \"wallet_trezor_method_not_supported\", info: { chain: Chain.Tron, reason } });\n}\n\nfunction assertKnownFields(fields: TronFields, allowed: Set<string>, scope: string) {\n const unknown = Object.keys(fields).filter(\n (field) => !allowed.has(field) && !PROTOBUF_DEFAULTS.includes(fields[field]),\n );\n if (unknown.length > 0) throw notSupported(`Trezor cannot sign Tron ${scope} with ${unknown.join(\", \")}`);\n}\n\nfunction getStringField(value: TronFields, field: string) {\n const fieldValue = value[field];\n if (typeof fieldValue !== \"string\" || !fieldValue) throw notSupported(`Missing ${field} in Tron contract`);\n return fieldValue;\n}\n\nfunction getAmount(value: TronFields) {\n const { amount } = value;\n const isValid =\n (typeof amount === \"number\" && Number.isSafeInteger(amount) && amount > 0) ||\n (typeof amount === \"string\" && /^[1-9]\\d*$/.test(amount));\n\n if (!isValid) throw notSupported(\"Invalid amount in Tron contract\");\n return String(amount);\n}\n\nexport function toTrezorTronContract(transaction: TronTransaction) {\n const [contract, ...rest] = transaction.raw_data.contract;\n if (!contract || rest.length > 0) throw notSupported(\"Trezor signs Tron transactions with exactly one contract\");\n\n const value = contract.parameter.value;\n const allowedValueFields = CONTRACT_VALUE_FIELDS[contract.type];\n if (!allowedValueFields) throw notSupported(`Unsupported Tron contract type: ${contract.type}`);\n\n assertKnownFields(transaction.raw_data as unknown as TronFields, RAW_DATA_FIELDS, \"transactions\");\n assertKnownFields(contract as unknown as TronFields, CONTRACT_FIELDS, \"contracts\");\n assertKnownFields(value, allowedValueFields, contract.type);\n\n // `visible: false` means the node already returned the addresses in hex\n const toHexAddress = (field: string) => {\n const address = getStringField(value, field);\n if (transaction.visible !== false) return tronAddressToHex(address);\n if (TRON_HEX_ADDRESS.test(address)) return address.toLowerCase();\n\n throw notSupported(`Invalid hex ${field} in Tron contract`);\n };\n\n const owner_address = toHexAddress(\"owner_address\");\n\n if (contract.type === \"TransferContract\") {\n return {\n parameter: { value: { amount: getAmount(value), owner_address, to_address: toHexAddress(\"to_address\") } },\n type: \"TransferContract\" as const,\n };\n }\n\n return {\n parameter: {\n value: { contract_address: toHexAddress(\"contract_address\"), data: getStringField(value, \"data\"), owner_address },\n },\n type: \"TriggerSmartContract\" as const,\n };\n}\n\nexport function getTronSigner({\n address: knownAddress,\n derivationPath,\n}: {\n address?: string;\n derivationPath: DerivationPathArray;\n}): TronSigner {\n const path = derivationPathToString(derivationPath);\n let address = knownAddress ?? \"\";\n\n return {\n getAddress: async () => {\n if (address) return address;\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const result = await TrezorConnect.tronGetAddress({ path, showOnTrezor: true });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain: Chain.Tron, derivationPath, error: result.payload.error },\n });\n }\n\n address = result.payload.address;\n return address;\n },\n\n signTransaction: async (transaction: TronTransaction): Promise<TronSignedTransaction> => {\n const contract = toTrezorTronContract(transaction);\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { data, expiration, fee_limit, ref_block_bytes, ref_block_hash, timestamp } = transaction.raw_data;\n\n const result = await TrezorConnect.tronSignTransaction({\n contract: [contract],\n data,\n expiration,\n fee_limit,\n path,\n ref_block_bytes,\n ref_block_hash,\n timestamp,\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: Chain.Tron, error: result.payload.error },\n });\n }\n\n return { ...transaction, signature: [result.payload.signature.replace(/^0x/, \"\")] };\n },\n };\n}\n",
11
+ "import { hex } from \"@scure/base\";\nimport { HDKey, type Versions } from \"@scure/bip32\";\nimport {\n Chain,\n type DerivationPathArray,\n derivationPathToString,\n FeeOption,\n filterSupportedChains,\n type GenericTransferParams,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n type UTXOChain,\n UTXOScriptType,\n WalletOption,\n} from \"@swapkit/helpers\";\nimport {\n assertDerivationIndex,\n createHDWalletHelpers,\n getNetworkForChain,\n getUTXOAccountIndexFromPath,\n getUTXOAccountPath,\n getUtxoApi,\n type UTXOToolboxes,\n type UTXOType,\n} from \"@swapkit/toolboxes/utxo\";\nimport type { BTCNetwork, PCZT, Transaction, ZcashPSBT, ZcashTransaction } from \"@swapkit/utxo-signer\";\nimport { createWallet, getWalletSupportedChains, type HardwareExtendedPublicKeyInfo } from \"@swapkit/wallet-core\";\n\nimport { applyMissingSpendingMetadata } from \"../helpers/psbt\";\n\ntype TrezorBip32Derivation = [Uint8Array, { fingerprint: number; path: number[] }];\ntype TrezorTapBip32Derivation = [Uint8Array, { der: { fingerprint: number; path: number[] }; hashes: Uint8Array[] }];\ntype TrezorCoreMode = \"auto\" | \"iframe\" | \"popup\" | \"suite-desktop\" | \"suite-web\";\ntype TrezorTransport = \"BridgeTransport\" | \"WebUsbTransport\" | \"NodeUsbTransport\";\ntype ConnectTrezorOptions = { address?: string };\ntype TrezorAccountRefTransaction = { details: Record<string, never>; hex: string; txid: string };\ntype ZcashSignableTransaction = PCZT | ZcashPSBT | ZcashTransaction;\ntype TrezorExtendedPublicKeyInfo = {\n accountIndex: number;\n chainCode?: string;\n depth?: number;\n fingerprint?: number;\n path: string;\n publicKey?: string;\n xpub: string;\n xpubSegwit?: string;\n};\n\nconst TREZOR_CORE_MODES = new Set<TrezorCoreMode>([\"auto\", \"iframe\", \"popup\", \"suite-desktop\", \"suite-web\"]);\nconst TREZOR_TRANSPORTS = new Set<TrezorTransport>([\"BridgeTransport\", \"WebUsbTransport\", \"NodeUsbTransport\"]);\nconst DEFAULT_TREZOR_CORE_MODE: TrezorCoreMode = \"auto\";\nconst DEFAULT_TREZOR_MANIFEST = { appName: \"SwapKit\", appUrl: \"https://swapkit.dev\", email: \"support@swapkit.dev\" };\nconst DEFAULT_TREZOR_TRANSPORTS = [\"WebUsbTransport\" as const];\nconst TREZOR_KEEP_SESSION_PARAMS = { keepSession: true } as const;\nconst BITCOIN_CASH_SIGHASH_ALL = 0x41;\nconst trezorXpubCache = new Map<string, TrezorExtendedPublicKeyInfo>();\nlet trezorSessionDispose: Promise<void> | undefined;\nconst EXTENDED_KEY_VERSION_CANDIDATES = (\n [Chain.Bitcoin, Chain.BitcoinCash, Chain.Dash, Chain.Dogecoin, Chain.Litecoin] as const satisfies readonly UTXOChain[]\n).map((chain) => getNetworkForChain(chain).bip32);\n\nasync function disconnectTrezorSession() {\n trezorXpubCache.clear();\n\n const dispose = (async () => {\n try {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n await TrezorConnect.dispose();\n } catch {\n // Ignore stale or already-disposed sessions.\n }\n })();\n\n trezorSessionDispose = dispose;\n await dispose;\n\n if (trezorSessionDispose === dispose) {\n trezorSessionDispose = undefined;\n }\n}\n\nfunction normalizeTrezorCoreMode(coreMode: unknown): TrezorCoreMode | undefined {\n return typeof coreMode === \"string\" && TREZOR_CORE_MODES.has(coreMode as TrezorCoreMode)\n ? (coreMode as TrezorCoreMode)\n : undefined;\n}\n\nfunction normalizeTrezorTransports(transports: unknown): TrezorTransport[] | undefined {\n if (!Array.isArray(transports)) return undefined;\n\n const normalized = transports.filter(\n (transport): transport is TrezorTransport =>\n typeof transport === \"string\" && TREZOR_TRANSPORTS.has(transport as TrezorTransport),\n );\n\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction getTrezorManifestValue(value: unknown, fallback: string) {\n return typeof value === \"string\" && value.trim() ? value : fallback;\n}\n\nfunction getDefaultTrezorAppUrl() {\n return typeof globalThis.location !== \"undefined\" && globalThis.location.origin\n ? globalThis.location.origin\n : DEFAULT_TREZOR_MANIFEST.appUrl;\n}\n\nasync function initTrezorConnect() {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const trezorConfig = SKConfig.get(\"integrations\").trezor as Record<string, unknown> | undefined;\n const {\n connectSrc,\n coreMode,\n debug,\n interactionTimeout,\n lazyLoad,\n pendingTransportEvent,\n popup,\n transportReconnect,\n transports,\n ...manifestConfig\n } = trezorConfig ?? {};\n const manifest = {\n ...manifestConfig,\n appName: getTrezorManifestValue(trezorConfig?.appName, DEFAULT_TREZOR_MANIFEST.appName),\n appUrl: getTrezorManifestValue(trezorConfig?.appUrl, getDefaultTrezorAppUrl()),\n email: getTrezorManifestValue(trezorConfig?.email, DEFAULT_TREZOR_MANIFEST.email),\n };\n const isLocalhost =\n typeof globalThis.location !== \"undefined\" && [\"localhost\", \"127.0.0.1\"].includes(globalThis.location.hostname);\n const resolvedCoreMode = normalizeTrezorCoreMode(coreMode) ?? DEFAULT_TREZOR_CORE_MODE;\n const resolvedTransports = normalizeTrezorTransports(transports) ?? DEFAULT_TREZOR_TRANSPORTS;\n\n if (trezorSessionDispose) {\n await trezorSessionDispose;\n }\n\n if (isLocalhost) {\n await TrezorConnect.dispose();\n }\n\n await TrezorConnect.init({\n connectSrc: connectSrc as string | undefined,\n coreMode: resolvedCoreMode,\n debug: debug as boolean | undefined,\n interactionTimeout: interactionTimeout as number | undefined,\n lazyLoad: (lazyLoad as boolean | undefined) ?? false,\n manifest,\n pendingTransportEvent: pendingTransportEvent as boolean | undefined,\n popup: (popup as boolean | undefined) ?? true,\n transportReconnect: transportReconnect as boolean | undefined,\n transports: resolvedTransports,\n });\n\n return { coreMode: resolvedCoreMode, isLocalhost, popup: (popup as boolean | undefined) ?? true, TrezorConnect };\n}\n\nexport function normalizeTrezorExtendedPublicKey(xpub: string, chain: UTXOChain) {\n const targetVersions = getNetworkForChain(chain).bip32;\n const candidates = [\n targetVersions,\n ...EXTENDED_KEY_VERSION_CANDIDATES.filter(\n (versions) => versions.public !== targetVersions.public || versions.private !== targetVersions.private,\n ),\n ];\n let lastError: unknown;\n\n for (const versions of candidates) {\n try {\n const key = HDKey.fromExtendedKey(xpub, versions as Versions);\n if (!(key.publicKey && key.chainCode)) throw new Error(\"Extended key is missing public key data\");\n\n return new HDKey({\n chainCode: key.chainCode,\n depth: key.depth,\n index: key.index,\n parentFingerprint: key.parentFingerprint,\n publicKey: key.publicKey,\n versions: targetVersions,\n }).publicExtendedKey;\n } catch (error) {\n lastError = error;\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(\"Unable to parse Trezor extended public key\");\n}\n\nfunction tryNormalizeTrezorExtendedPublicKey(xpub: string | undefined, chain: UTXOChain) {\n if (!xpub) return undefined;\n\n try {\n return normalizeTrezorExtendedPublicKey(xpub, chain);\n } catch {\n return xpub;\n }\n}\n\nasync function decodeOpReturnData(script: Uint8Array) {\n const { Script } = await import(\"@swapkit/utxo-signer\");\n\n try {\n const [opcode, data] = Script.decode(script);\n const bytes = data === 0 ? new Uint8Array() : data;\n if (opcode !== \"RETURN\" || !(bytes instanceof Uint8Array)) return null;\n\n // Trezor rebuilds the script from the data, so only accept scripts it reproduces byte for byte\n return hex.encode(Script.encode([\"RETURN\", bytes])) === hex.encode(script) ? hex.encode(bytes) : null;\n } catch {\n return null;\n }\n}\n\nasync function toTrezorOpReturnOutput(script: Uint8Array, amount: bigint | undefined, chain: Chain) {\n if (amount !== 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"OP_RETURN output carrying value cannot be signed\" },\n });\n }\n\n const opReturnData = await decodeOpReturnData(script);\n\n if (opReturnData === null) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Malformed OP_RETURN output cannot be signed\" },\n });\n }\n\n return { amount: \"0\", op_return_data: opReturnData, script_type: \"PAYTOOPRETURN\" as const };\n}\n\nasync function assertTransactionCarriesMemo(tx: Transaction, memo: string, chain: Chain) {\n if (!memo) return;\n\n const expected = hex.encode(new TextEncoder().encode(memo));\n\n for (let i = 0; i < tx.outputsLength; i++) {\n const script = tx.getOutput(i).script;\n if (script?.[0] === 0x6a && (await decodeOpReturnData(script)) === expected) return;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Transaction does not carry the provided memo\" },\n });\n}\n\nfunction getScriptType(chain: Chain, derivationPath: DerivationPathArray) {\n switch (derivationPath[0]) {\n case 86:\n return chain === Chain.Bitcoin\n ? ({ input: \"SPENDTAPROOT\", output: \"PAYTOTAPROOT\", utxo: UTXOScriptType.P2TR } as const)\n : null;\n case 84:\n return { input: \"SPENDWITNESS\", output: \"PAYTOWITNESS\", utxo: UTXOScriptType.P2WPKH } as const;\n case 49:\n return { input: \"SPENDP2SHWITNESS\", output: \"PAYTOP2SHWITNESS\", utxo: UTXOScriptType.P2SH_P2WPKH } as const;\n case 44:\n return { input: \"SPENDADDRESS\", output: \"PAYTOADDRESS\", utxo: UTXOScriptType.P2PKH } as const;\n default:\n return null;\n }\n}\n\nfunction hardenDerivationPath(derivationPath: DerivationPathArray): number[] {\n return derivationPath.map((pathElement, index) =>\n index < 3 ? ((pathElement as number) | 0x80000000) >>> 0 : (pathElement as number),\n );\n}\n\nfunction isTrezorBip32Derivation(value: unknown): value is TrezorBip32Derivation {\n return (\n Array.isArray(value) &&\n value[0] instanceof Uint8Array &&\n typeof value[1] === \"object\" &&\n value[1] !== null &&\n typeof (value[1] as { fingerprint?: unknown }).fingerprint === \"number\" &&\n Array.isArray((value[1] as { path?: unknown }).path)\n );\n}\n\nfunction getFirstBip32Derivation(input: { bip32Derivation?: unknown }): TrezorBip32Derivation | undefined {\n if (!Array.isArray(input.bip32Derivation)) return undefined;\n const [firstDerivation] = input.bip32Derivation;\n\n return isTrezorBip32Derivation(firstDerivation) ? firstDerivation : undefined;\n}\n\nfunction isTrezorTapBip32Derivation(value: unknown): value is TrezorTapBip32Derivation {\n if (!(Array.isArray(value) && value[0] instanceof Uint8Array)) return false;\n const origin = value[1] as { der?: { path?: unknown }; hashes?: unknown } | undefined;\n\n return Array.isArray(origin?.hashes) && Array.isArray(origin?.der?.path);\n}\n\n// Key-path origins carry no leaf hashes; take the one for the internal key, or the only one when it is unset.\nfunction selectTapKeyOrigin(input: { tapBip32Derivation?: unknown; tapInternalKey?: Uint8Array }, inputIndex: number) {\n const origins = Array.isArray(input.tapBip32Derivation) ? input.tapBip32Derivation : [];\n if (origins.length === 0) return undefined;\n\n const { tapInternalKey } = input;\n const keyPathOrigins = origins.filter(\n (origin): origin is TrezorTapBip32Derivation =>\n isTrezorTapBip32Derivation(origin) &&\n origin[1].hashes.length === 0 &&\n (!tapInternalKey || hex.encode(origin[0]) === hex.encode(tapInternalKey)),\n );\n const [xOnlyKey, origin] = keyPathOrigins[0] ?? [];\n\n if (keyPathOrigins.length !== 1 || !(xOnlyKey && origin)) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: Chain.Bitcoin, error: `Input ${inputIndex} has no single taproot key-path origin to sign with` },\n });\n }\n\n return { path: origin.der.path, xOnlyKey };\n}\n\nfunction getPrevoutAmount(input: {\n index?: number;\n nonWitnessUtxo?: { outputs?: Array<{ amount?: bigint | number }> };\n witnessUtxo?: { amount?: bigint | number };\n}) {\n if (input.witnessUtxo?.amount !== undefined) return input.witnessUtxo.amount.toString();\n\n const prevout = input.index !== undefined ? input.nonWitnessUtxo?.outputs?.[input.index] : undefined;\n if (prevout?.amount !== undefined) return prevout.amount.toString();\n\n return undefined;\n}\n\nexport function normalizeTrezorSignature(signatureHex: string, chain: Chain) {\n const signature = Buffer.from(signatureHex, \"hex\");\n const derLength = signature[1] !== undefined ? signature[1] + 2 : undefined;\n\n if (derLength !== undefined && signature.length === derLength) {\n return new Uint8Array([...signature, chain === Chain.BitcoinCash ? BITCOIN_CASH_SIGHASH_ALL : 0x01]);\n }\n\n return new Uint8Array(signature);\n}\n\nfunction buildPCZTInputsForTrezor(\n pczt: PCZT,\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < pczt.inputsLength; i++) {\n const input = pczt.getInput(i);\n inputs.push({\n address_n,\n amount: input.value.toString(),\n prev_hash: hexEncode.encode(input.txid),\n prev_index: input.index,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nasync function buildPCZTOutputsForTrezor(pczt: PCZT, address_n: number[], myAddress: string, chain: Chain) {\n const outputs = [];\n for (let i = 0; i < pczt.outputsLength; i++) {\n const output = pczt.getOutput(i);\n const script = output.scriptPubkey;\n\n if (script?.[0] === 0x6a) {\n outputs.push(await toTrezorOpReturnOutput(script, output.value, chain));\n continue;\n }\n\n const outputAddress = await decodeOutputAddress(script);\n\n if (!outputAddress && output.value > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n\n if (isChangeAddress) {\n outputs.push({ address_n, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n } else {\n outputs.push({ address: outputAddress, amount: output.value.toString(), script_type: \"PAYTOADDRESS\" as const });\n }\n }\n return outputs;\n}\n\nasync function decodeOutputAddress(script: Uint8Array): Promise<string | undefined> {\n try {\n const { OutScript, Address, NETWORKS } = await import(\"@swapkit/utxo-signer\");\n const decoded = OutScript.decode(script);\n if (decoded.type === \"pkh\" || decoded.type === \"pk\") {\n return Address(NETWORKS.zcash).encode(decoded);\n }\n } catch {\n // ignore decode errors\n }\n return undefined;\n}\n\nasync function extractSignaturesFromSignedTx(signedTxHex: string, pczt: PCZT): Promise<PCZT> {\n const { ZcashTransaction: ZcashTx, Script } = await import(\"@swapkit/utxo-signer\");\n const signedTx = ZcashTx.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 const script = signedInput.script;\n if (script && script.length > 0) {\n const scriptParts = Script.decode(script);\n if (scriptParts.length >= 2) {\n signedPczt.addSignature(i, scriptParts[1] as Uint8Array, scriptParts[0] as Uint8Array);\n }\n }\n }\n return signedPczt;\n}\n\nfunction buildZcashTxInputsForTrezor(\n tx: ZcashTransaction,\n utxoInputs: UTXOType[],\n address_n: number[],\n hexEncode: { encode: (data: Uint8Array) => string },\n) {\n const inputs = [];\n for (let i = 0; i < tx.inputsLength; i++) {\n const input = tx.getInput(i);\n const utxoInfo = utxoInputs[i];\n inputs.push({\n address_n,\n amount: utxoInfo?.value?.toString() || input.value?.toString() || \"0\",\n prev_hash: input.txid ? hexEncode.encode(input.txid) : \"\",\n prev_index: input.index ?? 0,\n script_type: \"SPENDADDRESS\" as const,\n });\n }\n return inputs;\n}\n\nasync function buildZcashTxOutputsForTrezor({\n addressN,\n chain,\n myAddress,\n network,\n tx,\n}: {\n addressN: number[];\n chain: Chain;\n myAddress: string;\n network: BTCNetwork;\n tx: ZcashTransaction;\n}) {\n const outputs = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, network);\n const script = output.script;\n\n if (script?.[0] === 0x6a) {\n outputs.push(await toTrezorOpReturnOutput(script, output.amount, chain));\n continue;\n }\n\n if (!outputAddress && (output.amount ?? 0n) > 0n) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address\" },\n });\n }\n\n const isChangeAddress = outputAddress === myAddress;\n const outputParam = isChangeAddress || !outputAddress ? { address_n: addressN } : { address: outputAddress };\n outputs.push({ ...outputParam, amount: output.amount?.toString() || \"0\", script_type: \"PAYTOADDRESS\" as const });\n }\n return outputs;\n}\n\nasync function buildUtxoOutputsForTrezor(\n tx: Transaction,\n network: BTCNetwork,\n address_n: number[],\n myAddress: string,\n chain: Chain,\n scriptType: { input: string; output: string },\n toCashAddress: (addr: string) => string,\n stripPrefix: (addr: string) => string,\n) {\n const outputs: any[] = [];\n for (let i = 0; i < tx.outputsLength; i++) {\n const output = tx.getOutput(i);\n const outputAddress = tx.getOutputAddress(i, network);\n\n if (output.script?.[0] === 0x6a) {\n outputs.push(await toTrezorOpReturnOutput(output.script, output.amount, chain));\n continue;\n }\n\n if (!outputAddress) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Unable to decode output address from scriptPubkey\" },\n });\n }\n\n if (output.amount === undefined) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: \"Output amount is missing\" },\n });\n }\n\n const isBch = chain === Chain.BitcoinCash;\n const cashAddrWithPrefix = isBch ? toCashAddress(outputAddress) : outputAddress;\n const isChangeAddress = isBch\n ? stripPrefix(cashAddrWithPrefix) === stripPrefix(myAddress)\n : cashAddrWithPrefix === myAddress;\n\n outputs.push(\n isChangeAddress\n ? { address_n, amount: output.amount.toString(), script_type: scriptType.output }\n : { address: cashAddrWithPrefix, amount: output.amount.toString(), script_type: \"PAYTOADDRESS\" },\n );\n }\n return outputs;\n}\n\nfunction shouldUseTrezorPsbtSigner(chain: Chain) {\n return chain === Chain.Bitcoin || chain === Chain.Litecoin;\n}\n\nfunction shouldUseTrezorSerializedSigner(chain: Chain) {\n return chain === Chain.BitcoinCash || chain === Chain.Dash || chain === Chain.Dogecoin;\n}\n\nfunction buildTrezorRefTxs(chain: Chain, inputs: UTXOType[]): TrezorAccountRefTransaction[] | undefined {\n if (chain !== Chain.Dash) return undefined;\n\n const refs = new Map<string, TrezorAccountRefTransaction>();\n\n for (const input of inputs) {\n if (!input.txHex) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: `Missing previous transaction hex for ${input.hash}:${input.index}` },\n });\n }\n\n refs.set(input.hash, { details: {}, hex: input.txHex, txid: input.hash });\n }\n\n return [...refs.values()];\n}\n\nasync function getTrezorWallet<T extends Chain>({\n address: providedAddress,\n chain,\n derivationPath,\n}: {\n address?: string;\n chain: T;\n derivationPath: DerivationPathArray;\n}) {\n switch (chain) {\n case Chain.Arbitrum:\n case Chain.Arc:\n case Chain.Aurora:\n case Chain.Avalanche:\n case Chain.Base:\n case Chain.Berachain:\n case Chain.BinanceSmartChain:\n case Chain.Ethereum:\n case Chain.Gnosis:\n case Chain.Hyperevm:\n case Chain.Monad:\n case Chain.Optimism:\n case Chain.Polygon:\n case Chain.Robinhood:\n case Chain.XLayer: {\n const { getProvider, getEvmToolboxAsync } = await import(\"@swapkit/toolboxes/evm\");\n const { getEVMSigner } = await import(\"./evmSigner\");\n\n const provider = await getProvider(chain);\n const signer = await getEVMSigner({ chain, derivationPath, provider });\n const address = await signer.getAddress();\n const toolbox = await getEvmToolboxAsync(chain, { provider, signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Cardano: {\n const { getCardanoToolbox } = await import(\"@swapkit/toolboxes/cardano\");\n const { getCardanoSigner } = await import(\"./cardanoSigner\");\n\n const connect = await import(\"@trezor/connect-web\");\n const signer = await getCardanoSigner({ connect, derivationPath });\n const address = signer.getAddress();\n const toolbox = getCardanoToolbox({ signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Ripple: {\n const { getRippleToolbox } = await import(\"@swapkit/toolboxes/ripple\");\n const { getRippleSigner } = await import(\"./rippleSigner\");\n\n const signer = getRippleSigner({ derivationPath });\n const address = providedAddress ?? (await signer.getAddress());\n const toolbox = getRippleToolbox({ signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Solana: {\n const { getSolanaToolbox } = await import(\"@swapkit/toolboxes/solana\");\n const { getSolanaSigner } = await import(\"./solanaSigner\");\n\n const signer = getSolanaSigner({ address: providedAddress, derivationPath });\n const address = providedAddress ?? (await signer.getAddress());\n const toolbox = getSolanaToolbox({ signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Stellar: {\n const { getStellarToolbox } = await import(\"@swapkit/toolboxes/stellar\");\n const { getStellarSigner } = await import(\"./stellarSigner\");\n\n const signer = getStellarSigner({ derivationPath });\n const address = providedAddress ?? (await signer.getAddress());\n const toolbox = getStellarToolbox({ signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Tron: {\n const { getTronToolbox } = await import(\"@swapkit/toolboxes/tron\");\n const { getTronSigner } = await import(\"./tronSigner\");\n\n const signer = getTronSigner({ address: providedAddress, derivationPath });\n const address = await signer.getAddress();\n const toolbox = getTronToolbox({ signer });\n\n return { ...toolbox, address };\n }\n\n case Chain.Zcash: {\n const { getUtxoToolbox } = await import(\"@swapkit/toolboxes/utxo\");\n\n const derivationPathStr = derivationPathToString(derivationPath);\n\n const getAddress = async () => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { success, payload } = await TrezorConnect.getAddress({ coin: \"zcash\", path: derivationPathStr });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n return payload.address;\n };\n\n const address = providedAddress ?? (await getAddress());\n\n const signPCZTWithSerializedTx = async (pczt: PCZT) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const global = pczt.getGlobal();\n\n const inputs = buildPCZTInputsForTrezor(pczt, address_n, hexEncode);\n const outputs = await buildPCZTOutputsForTrezor(pczt, address_n, address, chain);\n const result = await TrezorConnect.signTransaction({\n branchId: global.consensusBranchId,\n coin: \"zcash\",\n expiry: global.expiryHeight,\n inputs,\n locktime: global.lockTime,\n outputs: outputs as any,\n overwintered: true,\n version: global.txVersion,\n versionGroupId: global.versionGroupId,\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n }\n\n return {\n serializedTx: result.payload.serializedTx,\n signedPczt: await extractSignaturesFromSignedTx(result.payload.serializedTx, pczt),\n };\n };\n\n const parseSignedZcashTransaction = async (signedTxHex: string) => {\n const { ZcashTransaction: ZcashTx } = await import(\"@swapkit/utxo-signer\");\n return ZcashTx.fromHex(signedTxHex, { allowUnknownOutputs: true });\n };\n\n const signZcashTransactionWithSerializedTx = async (tx: ZcashTransaction) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const { NETWORKS, ZcashVersionGroupId } = await import(\"@swapkit/utxo-signer\");\n const address_n = hardenDerivationPath(derivationPath);\n\n const inputs = buildZcashTxInputsForTrezor(tx, [], address_n, hexEncode);\n const outputs = await buildZcashTxOutputsForTrezor({\n addressN: address_n,\n chain,\n myAddress: address,\n network: NETWORKS.zcash,\n tx,\n });\n\n const result = await TrezorConnect.signTransaction({\n branchId: tx.consensusBranchId,\n coin: \"zcash\",\n expiry: 0,\n inputs,\n locktime: 0,\n outputs: outputs as any,\n overwintered: true,\n version: 4,\n versionGroupId: ZcashVersionGroupId.SAPLING,\n });\n\n if (result.success) {\n return {\n serializedTx: result.payload.serializedTx,\n signedTx: await parseSignedZcashTransaction(result.payload.serializedTx),\n };\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n };\n\n const signer = {\n getAddress: async () => address,\n\n signPCZT: async (pczt: PCZT): Promise<PCZT> => {\n return (await signPCZTWithSerializedTx(pczt)).signedPczt;\n },\n\n signTransaction: async (tx: ZcashSignableTransaction): Promise<ZcashTransaction> => {\n if (\"toPCZT\" in tx) {\n const { serializedTx } = await signPCZTWithSerializedTx(tx.toPCZT());\n return parseSignedZcashTransaction(serializedTx);\n }\n\n if (\"getGlobal\" in tx) {\n const { serializedTx } = await signPCZTWithSerializedTx(tx);\n return parseSignedZcashTransaction(serializedTx);\n }\n\n return (await signZcashTransactionWithSerializedTx(tx)).signedTx;\n },\n };\n\n const toolbox = getUtxoToolbox(Chain.Zcash, { signer });\n\n const signAndBroadcastTransaction = async (tx: ZcashSignableTransaction) => {\n if (\"toPCZT\" in tx) {\n const { serializedTx } = await signPCZTWithSerializedTx(tx.toPCZT());\n return toolbox.broadcastTx(serializedTx);\n }\n\n if (\"getGlobal\" in tx) {\n const { serializedTx } = await signPCZTWithSerializedTx(tx);\n return toolbox.broadcastTx(serializedTx);\n }\n\n const { serializedTx } = await signZcashTransactionWithSerializedTx(tx);\n return toolbox.broadcastTx(serializedTx);\n };\n\n const transfer = async ({ recipient, feeOptionKey, feeRate: paramFeeRate, ...rest }: GenericTransferParams) => {\n if (!(address && recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const feeRate = paramFeeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n const { tx } = await toolbox.createTransaction({\n ...rest,\n feeRate,\n fetchTxHex: false,\n recipient,\n sender: address,\n });\n const { serializedTx } = await signZcashTransactionWithSerializedTx(tx);\n\n return toolbox.broadcastTx(serializedTx);\n };\n\n return { ...toolbox, address, signAndBroadcastTransaction, signPCZT: signer.signPCZT, transfer };\n }\n\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n case Chain.Dash:\n case Chain.Dogecoin:\n case Chain.Litecoin: {\n const { toCashAddress, getUtxoToolbox, stripPrefix } = await import(\"@swapkit/toolboxes/utxo\");\n const utxoChain = chain as UTXOChain;\n const scriptType = getScriptType(chain, derivationPath);\n\n if (!scriptType) {\n throw new SwapKitError({ errorKey: \"wallet_trezor_derivation_path_not_supported\", info: { derivationPath } });\n }\n\n const resolvedScriptType = scriptType;\n const isTaproot = scriptType.utxo === UTXOScriptType.P2TR;\n const toolboxParams = { scriptType: scriptType.utxo };\n const coin = chain.toLowerCase();\n\n const getAddress = async (path: DerivationPathArray = derivationPath) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const pathString = derivationPathToString(path);\n const { success, payload } = await TrezorConnect.getAddress({\n coin,\n ...TREZOR_KEEP_SESSION_PARAMS,\n path: pathString,\n showOnTrezor: false,\n });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n if (chain === Chain.BitcoinCash) {\n return stripPrefix(payload.address);\n }\n\n return payload.address;\n };\n\n const address = providedAddress ?? (await getAddress());\n const baseToolbox = getUtxoToolbox(chain, toolboxParams);\n\n const signTransaction = async (tx: Transaction, inputs: UTXOType[], memo = \"\") => {\n await assertTransactionCarriesMemo(tx, memo, chain);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n\n const outputs = await buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n chain,\n resolvedScriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index, value }) => ({\n address_n,\n amount: value,\n prev_hash: hash,\n prev_index: index,\n script_type: resolvedScriptType.input,\n }));\n\n const result = await TrezorConnect.signTransaction({\n coin,\n inputs: trezorInputs,\n outputs,\n refTxs: buildTrezorRefTxs(chain, inputs) as never,\n });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n };\n\n const signPsbtTransaction = async (tx: Transaction): Promise<Transaction> => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n let fallbackPublicKey: Uint8Array | undefined;\n\n async function getFallbackDerivation(): Promise<TrezorBip32Derivation> {\n if (!fallbackPublicKey) {\n const accountInfo = await getExtendedPublicKeyInfo();\n const accountKey = HDKey.fromExtendedKey(accountInfo.xpub, network.bip32);\n const leaf = accountKey.derive(`m/${Number(derivationPath[3] ?? 0)}/${Number(derivationPath[4] ?? 0)}`);\n\n if (!leaf.publicKey) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: \"Unable to derive Trezor leaf public key from account xpub\" },\n });\n }\n\n fallbackPublicKey = leaf.publicKey;\n }\n\n return [fallbackPublicKey, { fingerprint: 0, path: address_n }];\n }\n\n const signerPubkeys: Uint8Array[] = [];\n const trezorInputs = [];\n\n async function prepareInputForSigning(inputIndex: number, input: ReturnType<Transaction[\"getInput\"]>) {\n if (isTaproot) {\n let keyOrigin = selectTapKeyOrigin(input, inputIndex);\n\n if (!keyOrigin) {\n const [publicKey, { path }] = await getFallbackDerivation();\n keyOrigin = { path, xOnlyKey: publicKey.slice(1) };\n tx.updateInput(inputIndex, {\n tapBip32Derivation: [[keyOrigin.xOnlyKey, { der: { fingerprint: 0, path }, hashes: [] }]],\n });\n }\n\n // A BIP86 key-path input's internal key is the x-only key its origin names.\n if (!input.tapInternalKey) tx.updateInput(inputIndex, { tapInternalKey: keyOrigin.xOnlyKey });\n return keyOrigin.path;\n }\n\n const existingDerivation = getFirstBip32Derivation(input);\n const derivation = existingDerivation ?? (await getFallbackDerivation());\n signerPubkeys[inputIndex] = derivation[0];\n\n if (!existingDerivation) {\n tx.updateInput(inputIndex, { bip32Derivation: [derivation] });\n }\n\n await applyMissingSpendingMetadata({ chain: utxoChain, indexes: [inputIndex], publicKey: derivation[0], tx });\n return derivation[1].path;\n }\n\n for (let inputIndex = 0; inputIndex < tx.inputsLength; inputIndex++) {\n const input = tx.getInput(inputIndex);\n const amount = getPrevoutAmount(input);\n\n if (!input.txid || input.index === undefined || !amount) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: `Input ${inputIndex} is missing prevout data required by Trezor` },\n });\n }\n\n const inputAddressN = await prepareInputForSigning(inputIndex, input);\n\n trezorInputs.push({\n address_n: inputAddressN,\n amount,\n prev_hash: hexEncode.encode(input.txid),\n prev_index: input.index,\n script_type: resolvedScriptType.input,\n ...(input.sequence !== undefined ? { sequence: input.sequence } : {}),\n });\n }\n\n const outputs = await buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n chain,\n resolvedScriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const result = await TrezorConnect.signTransaction({\n coin,\n ...TREZOR_KEEP_SESSION_PARAMS,\n inputs: trezorInputs,\n locktime: tx.lockTime,\n outputs,\n version: tx.version,\n });\n\n if (!result.success) {\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n }\n\n result.payload.signatures.forEach((signatureHex, inputIndex) => {\n if (!signatureHex) return;\n\n // Taproot key-path signatures are Schnorr, not DER, and finalize from tapKeySig.\n if (isTaproot) {\n tx.updateInput(inputIndex, { tapKeySig: hexEncode.decode(signatureHex) });\n return;\n }\n\n const pubkey = signerPubkeys[inputIndex];\n if (!pubkey) return;\n\n tx.updateInput(inputIndex, { partialSig: [[pubkey, normalizeTrezorSignature(signatureHex, chain)]] });\n });\n\n return tx;\n };\n\n const signSerializedTransaction = async (tx: Transaction) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { hex: hexEncode } = await import(\"@scure/base\");\n const address_n = hardenDerivationPath(derivationPath);\n const network = getNetworkForChain(chain as UTXOChain);\n\n const trezorInputs = [];\n for (let inputIndex = 0; inputIndex < tx.inputsLength; inputIndex++) {\n const input = tx.getInput(inputIndex);\n const amount = getPrevoutAmount(input);\n\n if (!input.txid || input.index === undefined || !amount) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: `Input ${inputIndex} is missing prevout data required by Trezor` },\n });\n }\n\n trezorInputs.push({\n address_n,\n amount,\n prev_hash: hexEncode.encode(input.txid),\n prev_index: input.index,\n script_type: resolvedScriptType.input,\n ...(input.sequence !== undefined ? { sequence: input.sequence } : {}),\n });\n }\n\n const outputs = await buildUtxoOutputsForTrezor(\n tx,\n network,\n address_n,\n address,\n chain,\n resolvedScriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const result = await TrezorConnect.signTransaction({\n coin,\n inputs: trezorInputs,\n locktime: tx.lockTime,\n outputs,\n version: tx.version,\n });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n const payload = result.payload as { error?: string; code?: string };\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, code: payload?.code ?? \"unknown\", error: payload?.error ?? \"unknown\", payload },\n });\n };\n\n const signTransactionWithMultipleInputs = async (\n tx: Transaction,\n inputs: Array<{\n derivationIndex: number;\n hash: string;\n index: number;\n isChange: boolean;\n txHex?: string;\n value: number;\n }>,\n memo = \"\",\n ) => {\n await assertTransactionCarriesMemo(tx, memo, chain);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const network = getNetworkForChain(chain as UTXOChain);\n const baseAddressN = hardenDerivationPath(derivationPath.slice(0, 3) as unknown as DerivationPathArray);\n\n const outputs = await buildUtxoOutputsForTrezor(\n tx,\n network,\n baseAddressN,\n address,\n chain,\n resolvedScriptType,\n toCashAddress,\n stripPrefix,\n );\n\n const trezorInputs = inputs.map(({ hash, index: inputIndex, value, derivationIndex, isChange }) => {\n const changePath = isChange ? 1 : 0;\n const inputAddressN = [...baseAddressN, changePath, derivationIndex];\n return {\n address_n: inputAddressN,\n amount: value,\n prev_hash: hash,\n prev_index: inputIndex,\n script_type: resolvedScriptType.input,\n };\n });\n\n const result = await TrezorConnect.signTransaction({\n coin,\n inputs: trezorInputs,\n outputs,\n refTxs: buildTrezorRefTxs(chain, inputs) as never,\n });\n\n if (result.success) {\n return result.payload.serializedTx;\n }\n\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain, error: (result.payload as { error: string; code?: string }).error },\n });\n };\n\n const transferFromMultipleAddresses = async ({\n utxos,\n recipient,\n assetValue,\n memo,\n feeRate,\n feeOptionKey,\n }: {\n utxos: Array<{\n hash: string;\n index: number;\n value: number;\n txHex?: string;\n derivationIndex: number;\n isChange: boolean;\n address: string;\n }>;\n recipient: string;\n assetValue: { getBaseValue: (unit: string) => number; chain: string };\n memo?: string;\n feeRate?: number;\n feeOptionKey?: (typeof FeeOption)[keyof typeof FeeOption];\n }) => {\n const toolbox = getUtxoToolbox(chain, toolboxParams);\n const txFeeRate = feeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const { tx, inputs: selectedInputs } = await toolbox.createTransaction({\n assetValue: assetValue as any,\n feeRate: txFeeRate,\n fetchTxHex: chain === Chain.Dash,\n memo,\n recipient,\n sender: address,\n });\n\n const inputsWithDerivation = selectedInputs.map((input: { hash: string; index: number; value: number }) => {\n const utxoInfo = utxos.find((u) => u.hash === input.hash && u.index === input.index);\n return {\n ...input,\n derivationIndex: utxoInfo?.derivationIndex ?? 0,\n isChange: utxoInfo?.isChange ?? false,\n txHex: utxoInfo?.txHex,\n };\n });\n\n const signedTxHex = await signTransactionWithMultipleInputs(tx as Transaction, inputsWithDerivation, memo);\n return toolbox.broadcastTx(signedTxHex);\n };\n\n const transfer = async ({\n recipient,\n feeOptionKey,\n feeRate: paramFeeRate,\n memo,\n ...rest\n }: GenericTransferParams) => {\n if (!(address && recipient)) {\n throw new SwapKitError({\n errorKey: \"wallet_missing_params\",\n info: { address, memo, recipient, wallet: WalletOption.TREZOR },\n });\n }\n\n const toolbox = getUtxoToolbox(chain, toolboxParams);\n\n const feeRate = paramFeeRate || (await toolbox.getFeeRates())[feeOptionKey || FeeOption.Fast];\n\n const createTxMethod = (toolbox as UTXOToolboxes[\"BTC\"]).createTransaction;\n\n const { tx, inputs } = await createTxMethod({\n ...rest,\n feeRate,\n fetchTxHex: chain === Chain.Dash,\n memo,\n recipient,\n sender: address,\n });\n\n const signedTxHex = await signTransaction(tx, inputs, memo);\n const txHash = await toolbox.broadcastTx(signedTxHex);\n\n return txHash;\n };\n\n const toolbox = shouldUseTrezorPsbtSigner(chain)\n ? await getUtxoToolbox(utxoChain, {\n ...toolboxParams,\n signer: { getAddress: async () => address, signTransaction: signPsbtTransaction },\n })\n : baseToolbox;\n\n const signAndBroadcastTransaction = shouldUseTrezorSerializedSigner(chain)\n ? async (tx: Transaction) => baseToolbox.broadcastTx(await signSerializedTransaction(tx))\n : toolbox.signAndBroadcastTransaction;\n const walletSignTransaction = shouldUseTrezorPsbtSigner(chain) ? toolbox.signTransaction : signTransaction;\n const walletTransfer = shouldUseTrezorPsbtSigner(chain) ? toolbox.transfer : transfer;\n\n async function getExtendedPublicKeyInfo({ accountIndex }: { accountIndex?: number } = {}) {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const path = derivationPathToString(resolvedAccountPath);\n const cacheKey = `${chain}:${path}`;\n const cached = trezorXpubCache.get(cacheKey);\n if (cached) return cached;\n\n const result = await TrezorConnect.getPublicKey({ coin, path });\n const { success, payload } = result;\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n const xpub = normalizeTrezorExtendedPublicKey(payload.xpub, utxoChain);\n const xpubSegwit = tryNormalizeTrezorExtendedPublicKey(payload.xpubSegwit, utxoChain);\n const info = {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n chainCode: payload.chainCode,\n depth: payload.depth,\n fingerprint: payload.fingerprint,\n path: payload.serializedPath,\n publicKey: payload.publicKey,\n xpub,\n xpubSegwit,\n };\n\n trezorXpubCache.set(cacheKey, info);\n return info;\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 assertDerivationIndex(\"index\", index);\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const fullPath = `${derivationPathToString(resolvedAccountPath)}/${Number(change)}/${index}`;\n\n const { success, payload } = await TrezorConnect.getAddress({\n coin,\n ...TREZOR_KEEP_SESSION_PARAMS,\n path: fullPath,\n showOnTrezor: false,\n });\n\n if (!success) {\n return undefined;\n }\n\n let finalAddress = payload.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(payload.address);\n }\n\n const pubKeyResult = await TrezorConnect.getPublicKey({\n coin,\n ...TREZOR_KEEP_SESSION_PARAMS,\n path: fullPath,\n scriptType: resolvedScriptType.input,\n showOnTrezor: false,\n });\n const pubkey = pubKeyResult.success ? pubKeyResult.payload.publicKey : \"\";\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index,\n path: fullPath,\n pubkey,\n };\n }\n\n async function deriveAddressesBatch({\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 TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const resolvedAccountPath = getUTXOAccountPath({ accountIndex, chain: utxoChain, derivationPath });\n const accountPath = derivationPathToString(resolvedAccountPath);\n\n const paths = Array.from({ length: count }, (_, i) => ({\n coin,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n showOnTrezor: false,\n }));\n\n const { success, payload } = await TrezorConnect.getAddress({ ...TREZOR_KEEP_SESSION_PARAMS, bundle: paths });\n\n if (!success || !Array.isArray(payload)) {\n return [];\n }\n\n const addresses = await Promise.all(\n payload.map(async (result, i) => {\n let finalAddress = result.address;\n if (chain === Chain.BitcoinCash) {\n const bchToolbox = await getUtxoToolbox(chain as typeof Chain.BitcoinCash);\n finalAddress = bchToolbox.stripPrefix(result.address);\n }\n\n return {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n address: finalAddress,\n change,\n index: startIndex + i,\n path: `${accountPath}/${Number(change)}/${startIndex + i}`,\n pubkey: \"\",\n };\n }),\n );\n\n return addresses;\n }\n\n const hdHelpers = createHDWalletHelpers({\n chain,\n deriveAddress: deriveAddressAtIndex,\n getBalance: toolbox.getBalance,\n getUtxos: (addr: string) => getUtxoApi(chain).getUtxos({ address: addr, fetchTxHex: true }),\n });\n\n return {\n ...toolbox,\n ...hdHelpers,\n address,\n deriveAddressAtIndex,\n deriveAddresses: deriveAddressesBatch,\n getExtendedPublicKey,\n getExtendedPublicKeyInfo,\n signAndBroadcastTransaction,\n signTransaction: walletSignTransaction,\n signTransactionWithMultipleInputs,\n transfer: walletTransfer,\n transferFromMultipleAddresses,\n };\n }\n\n default:\n throw new SwapKitError({ errorKey: \"wallet_chain_not_supported\", info: { chain, wallet: WalletOption.TREZOR } });\n }\n}\n\nexport async function getTrezorExtendedPublicKey(\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({ errorKey: \"wallet_chain_not_supported\", info: { chain, wallet: WalletOption.TREZOR } });\n }\n\n const { TrezorConnect } = await initTrezorConnect();\n const utxoChain = chain as UTXOChain;\n const resolvedDerivationPath = derivationPath ?? (NetworkDerivationPath[chain] as DerivationPathArray);\n const coin = chain === Chain.Zcash ? \"zcash\" : chain.toLowerCase();\n\n const resolvedAccountPath = getUTXOAccountPath({\n accountIndex,\n chain: utxoChain,\n derivationPath: resolvedDerivationPath,\n });\n const path = derivationPathToString(resolvedAccountPath);\n const cacheKey = `${chain}:${path}`;\n const cached = trezorXpubCache.get(cacheKey);\n if (cached) return cached;\n\n const { success, payload } = await TrezorConnect.getPublicKey({ coin, path, showOnTrezor: true });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_public_key\",\n info: { chain, error: (payload as { error: string; code?: string }).error || \"Unknown error\" },\n });\n }\n\n const info = {\n accountIndex: getUTXOAccountIndexFromPath(resolvedAccountPath),\n chainCode: payload.chainCode,\n depth: payload.depth,\n fingerprint: payload.fingerprint,\n path: payload.serializedPath,\n publicKey: payload.publicKey,\n xpub: normalizeTrezorExtendedPublicKey(payload.xpub, utxoChain),\n xpubSegwit: tryNormalizeTrezorExtendedPublicKey(payload.xpubSegwit, utxoChain),\n };\n\n trezorXpubCache.set(cacheKey, info);\n return info;\n}\n\nexport const trezorWallet = createWallet({\n connect: ({ addChain, supportedChains, walletType }) =>\n async function connectTrezor(\n chains: Chain[],\n derivationPath: DerivationPathArray,\n { address }: ConnectTrezorOptions = {},\n ) {\n const [chain] = filterSupportedChains({ chains, supportedChains, walletType });\n if (!chain) {\n throw new SwapKitError({\n errorKey: \"wallet_chain_not_supported\",\n info: { chain, wallet: WalletOption.TREZOR },\n });\n }\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const trezorConfig = SKConfig.get(\"integrations\").trezor as Record<string, unknown> | undefined;\n const {\n connectSrc,\n coreMode,\n debug,\n interactionTimeout,\n lazyLoad,\n pendingTransportEvent,\n popup,\n transportReconnect,\n transports,\n ...manifestConfig\n } = trezorConfig ?? {};\n const manifest = {\n ...manifestConfig,\n appName: getTrezorManifestValue(trezorConfig?.appName, DEFAULT_TREZOR_MANIFEST.appName),\n appUrl: getTrezorManifestValue(trezorConfig?.appUrl, getDefaultTrezorAppUrl()),\n email: getTrezorManifestValue(trezorConfig?.email, DEFAULT_TREZOR_MANIFEST.email),\n };\n const isLocalhost =\n typeof globalThis.location !== \"undefined\" && [\"localhost\", \"127.0.0.1\"].includes(globalThis.location.hostname);\n const resolvedCoreMode = normalizeTrezorCoreMode(coreMode) ?? DEFAULT_TREZOR_CORE_MODE;\n const resolvedTransports = normalizeTrezorTransports(transports) ?? DEFAULT_TREZOR_TRANSPORTS;\n\n if (trezorSessionDispose) {\n await trezorSessionDispose;\n }\n\n if (isLocalhost) {\n await TrezorConnect.dispose();\n }\n\n await TrezorConnect.init({\n connectSrc: connectSrc as string | undefined,\n coreMode: resolvedCoreMode,\n debug: debug as boolean | undefined,\n interactionTimeout: interactionTimeout as number | undefined,\n lazyLoad: (lazyLoad as boolean | undefined) ?? false,\n manifest,\n pendingTransportEvent: pendingTransportEvent as boolean | undefined,\n popup: (popup as boolean | undefined) ?? true,\n transportReconnect: transportReconnect as boolean | undefined,\n transports: resolvedTransports,\n });\n\n const wallet = await getTrezorWallet({ address, chain, derivationPath });\n\n addChain({ ...wallet, chain, disconnect: disconnectTrezorSession, walletType });\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.Bitcoin]: true,\n [Chain.BitcoinCash]: true,\n [Chain.Cardano]: true,\n [Chain.Dash]: true,\n [Chain.Ethereum]: true,\n [Chain.Gnosis]: true,\n [Chain.Dogecoin]: true,\n [Chain.Hyperevm]: true,\n [Chain.Litecoin]: true,\n [Chain.Monad]: true,\n [Chain.Optimism]: true,\n [Chain.Polygon]: true,\n [Chain.Ripple]: true,\n [Chain.Robinhood]: true,\n [Chain.Solana]: true,\n [Chain.Stellar]: true,\n [Chain.Tron]: true,\n [Chain.XLayer]: true,\n [Chain.Zcash]: true,\n },\n getExtendedPublicKey: getTrezorExtendedPublicKey,\n name: \"connectTrezor\",\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.Cardano,\n Chain.Dash,\n Chain.Dogecoin,\n Chain.Ethereum,\n Chain.Gnosis,\n Chain.Hyperevm,\n Chain.Litecoin,\n Chain.Monad,\n Chain.Optimism,\n Chain.Polygon,\n Chain.Ripple,\n Chain.Robinhood,\n Chain.Solana,\n Chain.Stellar,\n Chain.Tron,\n Chain.XLayer,\n Chain.Zcash,\n ],\n walletType: WalletOption.TREZOR,\n});\n\nexport const TREZOR_SUPPORTED_CHAINS = getWalletSupportedChains(trezorWallet);\n",
7
12
  "import type { UTXOChain } from \"@swapkit/helpers\";\nimport type { Transaction } from \"@swapkit/utxo-signer\";\n\nexport async function applyMissingSpendingMetadata({\n chain,\n indexes,\n publicKey,\n tx,\n}: {\n chain: UTXOChain;\n indexes?: number[];\n publicKey: Uint8Array;\n tx: Transaction;\n}) {\n const { getMissingSpendingMetadata, getNetworkForChain } = await import(\"@swapkit/toolboxes/utxo\");\n\n for (const { index, ...metadata } of getMissingSpendingMetadata({\n chain,\n indexes,\n network: getNetworkForChain(chain),\n publicKey,\n tx,\n })) {\n tx.updateInput(index, metadata);\n }\n}\n"
8
13
  ],
9
- "mappings": "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",
10
- "debugId": "8BDBB94B87083DFE64756E2164756E21",
14
+ "mappings": "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",
15
+ "debugId": "CBDA9F4428A5BBCD64756E2164756E21",
11
16
  "names": []
12
17
  }