@onekeyfe/hwk-keystone-adapter 1.2.3-alpha.2 → 1.2.3-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +14 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +14 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/urEngine/KeystoneUrEngine.ts","../src/urEngine/TronSignRequest.ts","../src/urEngine/TronSignature.ts","../src/adapter/KeystoneAdapter.ts","../src/adapter/deviceTable.ts","../src/adapter/pathUtils.ts"],"sourcesContent":["// UR engine (used by the QR event loop and the USB connector alike — both\n// channels carry the same UR payloads).\nexport { KeystoneUrEngine } from './urEngine/KeystoneUrEngine';\nexport type {\n BtcScriptType,\n KeystoneBtcSignatureResult,\n KeystoneBtcSignRequestAccount,\n KeystoneDerivationCurve,\n KeystoneEthSignatureResult,\n KeystoneEthSignRequestInput,\n KeystoneKeyDerivationRequestInput,\n KeystoneKeySchema,\n KeystoneParsedAccount,\n KeystoneParsedMultiAccounts,\n KeystoneSolSignatureResult,\n KeystoneSolSignRequestInput,\n KeystoneTronSignatureResult,\n KeystoneTronSignRequestInput,\n KeystoneUr,\n} from './urEngine/types';\n\n// Adapter\nexport { KeystoneAdapter } from './adapter/KeystoneAdapter';\nexport type { ImportFromQrOptions } from './adapter/KeystoneAdapter';\nexport {\n KEYSTONE_WALLET_CONNECT_ID_PREFIX,\n KEYSTONE_WALLET_ID_PATH,\n accountKey,\n createDeviceRecord,\n deriveKeystoneWalletId,\n placeholderDeviceInfo,\n toDeviceInfo,\n walletConnectId,\n} from './adapter/deviceTable';\nexport type { KeystoneAccountEntry, KeystoneDeviceRecord } from './adapter/deviceTable';\nexport { btcScriptTypeFromPath, normalizePath, splitAccountPath } from './adapter/pathUtils';\n","import { generateAddressFromXpub } from '@keystonehq/bc-ur-registry-eth';\nimport { Curve, KeystoneSDK, QRHardwareCallVersion, UR } from '@keystonehq/keystone-sdk';\nimport bs58check from 'bs58check';\nimport * as bitcoin from 'bitcoinjs-lib';\nimport HDKey from 'hdkey';\nimport { parse as uuidParse, stringify as uuidStringify } from 'uuid';\nimport { parseBip32MasterFingerprint } from '@onekeyfe/hwk-adapter-core';\n\nimport { TronSignRequest, TronSignType } from './TronSignRequest';\nimport { TronSignature } from './TronSignature';\n\nimport type {\n BtcScriptType,\n KeystoneBtcSignRequestAccount,\n KeystoneBtcSignatureResult,\n KeystoneEthSignRequestInput,\n KeystoneEthSignatureResult,\n KeystoneKeyDerivationRequestInput,\n KeystoneParsedAccount,\n KeystoneParsedMultiAccounts,\n KeystoneSolSignRequestInput,\n KeystoneSolSignatureResult,\n KeystoneTronSignRequestInput,\n KeystoneTronSignatureResult,\n KeystoneUr,\n} from './types';\n\n/** TRON's own address-version byte, prepended before base58check encoding. */\nconst TRON_ADDRESS_PREFIX = 0x41;\n\nfunction stripHexPrefix(hex: string): string {\n return hex.replace(/^0x/i, '');\n}\n\nconst ETH_DATA_TYPE = {\n transaction: 1,\n typedData: 2,\n personalMessage: 3,\n typedTransaction: 4,\n} as const;\n\nconst DERIVATION_CURVE = {\n secp256k1: Curve.secp256k1,\n ed25519: Curve.ed25519,\n} as const;\n\nfunction toSdkUr(ur: KeystoneUr): UR {\n return new UR(Buffer.from(ur.urData, 'hex'), ur.urType);\n}\n\nfunction fromSdkUr(ur: UR): KeystoneUr {\n return { urType: ur.type, urData: ur.cbor.toString('hex') };\n}\n\n/** r(32) | s(32) | v(1). A short answer must fail here, not reach a caller as `v: ''`. */\nfunction splitSignature65(hex: string): { r: string; s: string; v: string } {\n if (hex.length !== 130) {\n throw new Error(\n `Keystone returned a ${hex.length / 2}-byte signature; expected 65 bytes (r|s|v)`\n );\n }\n return { r: hex.slice(0, 64), s: hex.slice(64, 128), v: hex.slice(128) };\n}\n\nfunction requireBip32MasterFingerprint(value: unknown): string {\n const fingerprint = parseBip32MasterFingerprint(value);\n if (!fingerprint) {\n throw new Error('Keystone master fingerprint must be exactly 4 bytes (8 hex characters)');\n }\n return fingerprint;\n}\n\n/**\n * Single touch point with `@keystonehq/keystone-sdk`; the same UR building\n * and parsing serves QR and USB. Uses the bare constructor, not\n * `KeystoneSDK.create()`, which fetches remote config at call time.\n */\nexport class KeystoneUrEngine {\n private readonly sdk: KeystoneSDK;\n\n constructor(origin = 'OneKey') {\n this.sdk = new KeystoneSDK({ origin });\n }\n\n // --- Account sync (works for both a device-initiated QR export and a\n // wallet-initiated KeyDerivation request/response over either channel) ---\n\n parseMultiAccounts(ur: KeystoneUr): KeystoneParsedMultiAccounts {\n const parsed = this.sdk.parseMultiAccounts(toSdkUr(ur));\n return {\n masterFingerprint: requireBip32MasterFingerprint(parsed.masterFingerprint),\n device: parsed.device,\n deviceId: parsed.deviceId,\n deviceVersion: parsed.deviceVersion,\n accounts: parsed.keys.map(\n (key): KeystoneParsedAccount => ({\n chain: key.chain,\n path: key.path,\n publicKey: key.publicKey,\n extendedPublicKey: key.extendedPublicKey,\n xfp: key.xfp ? requireBip32MasterFingerprint(key.xfp) : undefined,\n name: key.name,\n })\n ),\n };\n }\n\n parseHDKey(ur: KeystoneUr): KeystoneParsedAccount {\n const key = this.sdk.parseHDKey(toSdkUr(ur));\n return {\n chain: key.chain,\n path: key.path,\n publicKey: key.publicKey,\n extendedPublicKey: key.extendedPublicKey,\n xfp: key.xfp ? requireBip32MasterFingerprint(key.xfp) : undefined,\n name: key.name,\n };\n }\n\n /**\n * Build a `qr-hardware-call` (KeyDerivation) request: the host asks for\n * specific paths instead of waiting for whatever the device happens to be\n * showing. The device replies with a `crypto-multi-accounts` UR — parse it\n * with `parseMultiAccounts`. Used for the implicit \"sync this wallet's xfp\n * before the first sign\" round trip as well as an explicit account import.\n *\n * `version: V1` is required — verified against real Keystone hardware and\n * `keystone3-firmware`'s `CheckHardwareCallRequestIsLegal` source: an\n * unversioned/V0 request is validated as a legacy Cardano-only request\n * (`m/1852'/1815'/...`) and firmware rejects every other chain's path with\n * `PRS_PARSING_ERROR` (device-shown message: \"路径不受支持\" / \"path not\n * supported\"), regardless of the path's shape. V1 is what actually enables\n * the general per-chain path whitelist (includes `m/44'/60'` for ETH, the\n * standard BTC purposes, etc.). The SDK itself defaults to V0 unless a\n * truthy `version` is passed — omitting this silently produces a request\n * every non-Cardano device rejects.\n */\n buildKeyDerivationRequest(input: KeystoneKeyDerivationRequestInput): KeystoneUr {\n const ur = this.sdk.generateKeyDerivationCall({\n schemas: input.schemas.map(schema => ({\n path: schema.path,\n curve: DERIVATION_CURVE[schema.curve ?? 'secp256k1'],\n })),\n origin: input.origin,\n version: QRHardwareCallVersion.V1,\n });\n return fromSdkUr(ur);\n }\n\n /**\n * Parse the response to a KeyDerivation request (or a device-initiated\n * account export): `crypto-multi-accounts` for a multi-schema request,\n * `crypto-hdkey` for a single-key response some firmware paths use instead.\n * Both are normalized to the same `KeystoneParsedMultiAccounts` shape — a\n * single `crypto-hdkey` becomes a one-entry account list, with its own\n * `origin.sourceFingerprint` promoted to `masterFingerprint` (correct for a\n * key derived directly from the seed, which every request this engine\n * builds asks for).\n */\n parseAccountResponse(ur: KeystoneUr): KeystoneParsedMultiAccounts {\n if (ur.urType === 'crypto-hdkey') {\n const account = this.parseHDKey(ur);\n if (!account.xfp) {\n throw new Error('Keystone crypto-hdkey response is missing its source fingerprint');\n }\n return {\n masterFingerprint: requireBip32MasterFingerprint(account.xfp),\n accounts: [account],\n };\n }\n return this.parseMultiAccounts(ur);\n }\n\n // --- EVM ---\n\n buildEthSignRequest(input: KeystoneEthSignRequestInput): KeystoneUr {\n const ur = this.sdk.eth.generateSignRequest({\n requestId: input.requestId,\n signData: input.unsignedTxHex,\n dataType: ETH_DATA_TYPE[input.dataType],\n path: input.path,\n xfp: input.xfp,\n chainId: input.chainId,\n address: input.address,\n origin: input.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseEthSignature(ur: KeystoneUr): KeystoneEthSignatureResult {\n const signature = this.sdk.eth.parseSignature(toSdkUr(ur));\n return { requestId: signature.requestId, ...splitSignature65(signature.signature) };\n }\n\n /**\n * Derive one EVM address offline from an already-synced account xpub —\n * verified against the same `@keystonehq/bc-ur-registry-eth` helper the\n * Keystone-based OneKey air-gap demo uses in production\n * (`generateAddressFromXpub`), so no unverified assumption about what a\n * leaf-path KeyDerivation request would return. `relativeDerivePath` is\n * relative to the xpub's own depth, e.g. `'0/0'` for an account xpub.\n */\n deriveEvmAddressFromXpub(xpub: string, relativeDerivePath: string): string {\n return generateAddressFromXpub(xpub, `m/${relativeDerivePath.replace(/^m\\//i, '')}`);\n }\n\n // --- BTC (PSBT transaction signing + plain message signing) ---\n\n /**\n * Derive one BTC address offline from an already-synced account xpub, the\n * same way `deriveEvmAddressFromXpub` does. Keystone's `CryptoHDKey`\n * always emits standard mainnet-xpub version bytes (`0488B21E`) regardless\n * of the account's purpose/script type (verified against\n * `@keystonehq/bc-ur-registry`'s `CryptoHDKey.getBip32Key`, which hardcodes\n * that version rather than switching to a SLIP-132 ypub/zpub prefix per\n * script type) — so `hdkey.fromExtendedKey` parses it correctly for every\n * `scriptType` without needing custom version bytes configured.\n *\n * `p2tr` is deliberately not handled: taproot output-key tweaking (BIP-341)\n * needs an elliptic-curve library wired via bitcoinjs-lib's `initEccLib`,\n * which this package doesn't set up yet — every other payment function\n * here needs no such library.\n */\n deriveBtcAddressFromXpub(\n xpub: string,\n relativeDerivePath: string,\n scriptType: BtcScriptType\n ): string {\n const node = HDKey.fromExtendedKey(xpub).derive(`m/${relativeDerivePath.replace(/^m\\//i, '')}`);\n if (!node.publicKey) throw new Error('HDKey derivation did not produce a public key');\n return this.deriveBtcAddressFromPublicKey(\n Buffer.from(node.publicKey).toString('hex'),\n scriptType\n );\n }\n\n deriveBtcAddressFromPublicKey(publicKeyHex: string, scriptType: BtcScriptType): string {\n const pubkey = Buffer.from(stripHexPrefix(publicKeyHex), 'hex');\n const network = bitcoin.networks.bitcoin;\n\n switch (scriptType) {\n case 'p2pkh': {\n const { address } = bitcoin.payments.p2pkh({ pubkey, network });\n if (!address) throw new Error('Failed to derive a P2PKH address from this public key');\n return address;\n }\n case 'p2sh-p2wpkh': {\n const { address } = bitcoin.payments.p2sh({\n redeem: bitcoin.payments.p2wpkh({ pubkey, network }),\n network,\n });\n if (!address)\n throw new Error('Failed to derive a P2SH-P2WPKH address from this public key');\n return address;\n }\n case 'p2wpkh': {\n const { address } = bitcoin.payments.p2wpkh({ pubkey, network });\n if (!address) throw new Error('Failed to derive a P2WPKH address from this public key');\n return address;\n }\n case 'p2tr':\n throw new Error(\n 'BTC P2TR (taproot) address derivation is not supported yet — needs an elliptic-curve library for BIP-341 tweaking'\n );\n default: {\n const exhaustive: never = scriptType;\n throw new Error(`Unsupported BTC script type: ${String(exhaustive)}`);\n }\n }\n }\n\n buildBtcPsbtRequest(unsignedPsbtHex: string): KeystoneUr {\n const ur = this.sdk.btc.generatePSBT(Buffer.from(unsignedPsbtHex, 'hex'));\n return fromSdkUr(ur);\n }\n\n /** Returns the hex-encoded (possibly still-unsigned-in-part) PSBT the device replied with. */\n parseBtcPsbt(ur: KeystoneUr): string {\n return this.sdk.btc.parsePSBT(toSdkUr(ur));\n }\n\n buildBtcMessageSignRequest(params: {\n requestId: string;\n /** Hex, no 0x prefix. */\n messageHex: string;\n accounts: KeystoneBtcSignRequestAccount[];\n origin?: string;\n }): KeystoneUr {\n const ur = this.sdk.btc.generateSignRequest({\n requestId: params.requestId,\n signData: params.messageHex,\n dataType: 1, // BtcSignRequest.DataType.message — PSBT signing never goes through this path.\n accounts: params.accounts,\n origin: params.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseBtcSignature(ur: KeystoneUr): KeystoneBtcSignatureResult {\n const signature = this.sdk.btc.parseSignature(toSdkUr(ur));\n return {\n requestId: signature.requestId,\n publicKey: signature.publicKey,\n signature: signature.signature,\n };\n }\n\n // --- SOL ---\n\n buildSolSignRequest(input: KeystoneSolSignRequestInput): KeystoneUr {\n const ur = this.sdk.sol.generateSignRequest({\n requestId: input.requestId,\n signData: input.unsignedPayloadHex,\n dataType: input.dataType === 'transaction' ? 1 : 2,\n path: input.path,\n xfp: input.xfp,\n address: input.address,\n origin: input.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseSolSignature(ur: KeystoneUr): KeystoneSolSignatureResult {\n const signature = this.sdk.sol.parseSignature(toSdkUr(ur));\n return { requestId: signature.requestId, signature: signature.signature };\n }\n\n // --- TRON ---\n\n /**\n * Keystone's native tron-sign-request/tron-signature pair (bare signature).\n * `sdk.tron` from keystone-sdk is the older protobuf envelope; not used.\n */\n buildTronSignRequest(input: KeystoneTronSignRequestInput): KeystoneUr {\n const request = new TronSignRequest({\n requestId: Buffer.from(uuidParse(input.requestId) as Uint8Array),\n signData: Buffer.from(stripHexPrefix(input.rawTxHex), 'hex'),\n signType: input.signType ?? TronSignType.Transaction,\n derivationPath: TronSignRequest.parsePath(input.path, input.xfp),\n origin: input.origin,\n });\n return fromSdkUr(request.toUR());\n }\n\n parseTronSignature(ur: KeystoneUr): KeystoneTronSignatureResult {\n if (ur.urType !== 'tron-signature') {\n throw new Error(`Expected a tron-signature UR, got ${ur.urType}`);\n }\n const signature = TronSignature.fromCBOR(Buffer.from(ur.urData, 'hex'));\n const requestId = signature.getRequestId();\n return {\n requestId: requestId ? uuidStringify(requestId) : undefined,\n signature: signature.getSignature().toString('hex'),\n };\n }\n\n /**\n * Derive one TRON address offline from an already-synced account xpub.\n * TRON reuses EVM's exact secp256k1-pubkey → keccak256 → last-20-bytes\n * derivation (verified against Keystone's own `formatAddress()` in\n * `keystone-sdk`'s TRON chain source) — only the final text encoding\n * differs (base58check with a `0x41` version byte, not checksummed hex).\n * Reusing `generateAddressFromXpub` here means no new hashing dependency:\n * strip its \"0x\" and re-encode the same 20 bytes.\n */\n deriveTronAddressFromXpub(xpub: string, relativeDerivePath: string): string {\n const evmStyleHex = generateAddressFromXpub(\n xpub,\n `m/${relativeDerivePath.replace(/^m\\//i, '')}`\n ) as string;\n const addressBytes = Buffer.concat([\n Buffer.from([TRON_ADDRESS_PREFIX]),\n Buffer.from(evmStyleHex.replace(/^0x/i, ''), 'hex'),\n ]);\n return bs58check.encode(addressBytes);\n }\n\n /**\n * Split an account-level xpub back into the BIP-32 fields a host needs to\n * treat it as a real extended key (`BtcPublicKey`). Everything here is\n * carried inside the xpub's own serialization — depth, the PARENT key\n * fingerprint (not the seed's master fingerprint), the chain code and the\n * compressed public key — so this is a pure decode with no device round\n * trip; the xpub itself was already device-verified when it was synced.\n */\n parseXpubMeta(xpub: string): {\n publicKey: string;\n chainCode: string;\n depth: number;\n parentFingerprint: number;\n } {\n // Decoded straight off the wire format rather than through HDKey: the\n // `@types/hdkey` surface only declares publicKey/privateKey/chainCode, so\n // depth and parentFingerprint would need an undeclared-field cast. BIP-32\n // serialization is fixed-width, so reading it here is exact:\n // [0..4) version | [4] depth | [5..9) parentFingerprint\n // [9..13) childNumber | [13..45) chainCode | [45..78) publicKey\n const raw = Buffer.from(bs58check.decode(xpub));\n if (raw.length !== 78) {\n throw new Error(`Keystone xpub did not decode to a 78-byte BIP-32 key (got ${raw.length})`);\n }\n return {\n publicKey: raw.subarray(45, 78).toString('hex'),\n chainCode: raw.subarray(13, 45).toString('hex'),\n depth: raw.readUInt8(4),\n parentFingerprint: raw.readUInt32BE(5),\n };\n }\n}\n","import {\n CryptoKeypath,\n DataItem,\n PathComponent,\n RegistryItem,\n RegistryType,\n RegistryTypes,\n extend,\n} from '@keystonehq/bc-ur-registry';\n\nimport type { DataItemMap } from '@keystonehq/bc-ur-registry';\n\nconst { decodeToDataItem } = extend;\n\n/**\n * Keystone's native `tron-sign-request` (tag 5201). Key layout follows\n * keystone-sdk-rust libs/ur-registry/src/tron (firmware >= 2.5.0); the\n * OneKey Pro air-gap layout differs and is not accepted by Keystone.\n */\nconst TRON_SIGN_REQUEST_TYPE = new RegistryType('tron-sign-request', 5201);\n\nenum RequestKeys {\n requestId = 1,\n signData,\n dataType,\n derivationPath,\n address,\n origin,\n}\n\n/** Keystone `DataType`: 1 = transaction, 2 = personal message. */\nexport enum TronSignType {\n Transaction = 1,\n PersonalMessage = 2,\n}\n\ninterface TronSignRequestProps {\n requestId?: Buffer;\n signData: Buffer;\n signType: TronSignType;\n derivationPath: CryptoKeypath;\n address?: Buffer;\n origin?: string;\n}\n\nexport class TronSignRequest extends RegistryItem {\n private readonly requestId?: Buffer;\n\n private readonly signData: Buffer;\n\n private readonly signType: TronSignType;\n\n private readonly derivationPath: CryptoKeypath;\n\n private readonly address?: Buffer;\n\n private readonly origin?: string;\n\n getRegistryType = (): RegistryType => TRON_SIGN_REQUEST_TYPE;\n\n constructor(args: TronSignRequestProps) {\n super();\n this.requestId = args.requestId;\n this.signData = args.signData;\n this.derivationPath = args.derivationPath;\n this.address = args.address;\n this.origin = args.origin;\n this.signType = args.signType;\n }\n\n getRequestId = (): Buffer | undefined => this.requestId;\n\n getSignData = (): Buffer => this.signData;\n\n getSignType = (): TronSignType => this.signType;\n\n getDerivationPath = (): string => this.derivationPath.getPath();\n\n toDataItem = (): DataItem => {\n const map: DataItemMap = {};\n if (this.requestId) {\n map[RequestKeys.requestId] = new DataItem(this.requestId, RegistryTypes.UUID.getTag());\n }\n if (this.address) map[RequestKeys.address] = this.address;\n if (this.origin) map[RequestKeys.origin] = this.origin;\n map[RequestKeys.signData] = this.signData;\n map[RequestKeys.dataType] = this.signType;\n const keyPath = this.derivationPath.toDataItem();\n keyPath.setTag(this.derivationPath.getRegistryType().getTag());\n map[RequestKeys.derivationPath] = keyPath;\n return new DataItem(map);\n };\n\n static fromDataItem(dataItem: DataItem): TronSignRequest {\n const map = dataItem.getData() as Record<number, unknown>;\n const signData = map[RequestKeys.signData] as Buffer;\n const derivationPath = CryptoKeypath.fromDataItem(map[RequestKeys.derivationPath] as DataItem);\n const address = map[RequestKeys.address] as Buffer | undefined;\n const requestIdItem = map[RequestKeys.requestId] as DataItem | undefined;\n const requestId = requestIdItem?.getData() as Buffer | undefined;\n const origin = map[RequestKeys.origin] as string | undefined;\n const signType = map[RequestKeys.dataType] as TronSignType;\n return new TronSignRequest({ requestId, signData, derivationPath, address, origin, signType });\n }\n\n static fromCBOR(cborPayload: Buffer): TronSignRequest {\n return TronSignRequest.fromDataItem(decodeToDataItem(cborPayload));\n }\n\n static parsePath(path: string, xfp: string): CryptoKeypath {\n const segments = path.replace(/^[mM]\\//, '').split('/');\n const components = segments.map(segment => {\n const hardened = segment.endsWith(\"'\");\n return new PathComponent({\n index: parseInt(hardened ? segment.slice(0, -1) : segment, 10),\n hardened,\n });\n });\n return new CryptoKeypath(components, Buffer.from(xfp, 'hex'));\n }\n}\n","import {\n DataItem,\n RegistryItem,\n RegistryType,\n RegistryTypes,\n extend,\n} from '@keystonehq/bc-ur-registry';\n\nimport type { DataItemMap } from '@keystonehq/bc-ur-registry';\n\nconst { decodeToDataItem } = extend;\n\n/** See `TronSignRequest.ts`'s doc comment — same proven, CBOR-native pair (registry type 5202). */\nconst TRON_SIGNATURE_TYPE = new RegistryType('tron-signature', 5202);\n\nenum SignatureKeys {\n requestId = 1,\n signature,\n}\n\nexport class TronSignature extends RegistryItem {\n private readonly requestId?: Buffer;\n\n private readonly signatureBytes: Buffer;\n\n getRegistryType = (): RegistryType => TRON_SIGNATURE_TYPE;\n\n constructor(signature: Buffer, requestId?: Buffer) {\n super();\n this.signatureBytes = signature;\n this.requestId = requestId;\n }\n\n getRequestId = (): Buffer | undefined => this.requestId;\n\n getSignature = (): Buffer => this.signatureBytes;\n\n toDataItem = (): DataItem => {\n const map: DataItemMap = {};\n if (this.requestId) {\n map[SignatureKeys.requestId] = new DataItem(this.requestId, RegistryTypes.UUID.getTag());\n }\n map[SignatureKeys.signature] = this.signatureBytes;\n return new DataItem(map);\n };\n\n static fromDataItem(dataItem: DataItem): TronSignature {\n const map = dataItem.getData() as Record<number, unknown>;\n const signature = map[SignatureKeys.signature] as Buffer;\n const requestIdItem = map[SignatureKeys.requestId] as DataItem | undefined;\n const requestId = requestIdItem?.getData() as Buffer | undefined;\n return new TronSignature(signature, requestId);\n }\n\n static fromCBOR(cborPayload: Buffer): TronSignature {\n return TronSignature.fromDataItem(decodeToDataItem(cborPayload));\n }\n}\n","import bs58 from 'bs58';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n CHAIN_FINGERPRINT_PATHS,\n DEVICE,\n DeviceJobQueue,\n HardwareErrorCode,\n OperationRegistry,\n SDK,\n TypedEventEmitter,\n UI_REQUEST,\n UI_REQUEST_CANCELLED_TAG,\n UI_REQUEST_PREEMPTED_TAG,\n UI_REQUEST_TIMEOUT_TAG,\n UI_RESPONSE,\n UiRequestRegistry,\n createHardwareSearchTargetId,\n createHwkError,\n deriveDeviceFingerprint,\n ensure0x,\n failure,\n getAllNetworkMethodChain,\n hasHardwareRuntimeIdPrefix,\n isAllNetworkMethodName,\n isHardwareOperationId,\n isHwkRecoveryHint,\n operationMayHaveCompletedParams,\n parseBip32MasterFingerprint,\n rehydrateConnectorError,\n resolveHardwareOperationTarget as resolveGenericHardwareOperationTarget,\n runAllNetworkGetAddress,\n stripHex,\n success,\n} from '@onekeyfe/hwk-adapter-core';\n\nimport { KeystoneUrEngine } from '../urEngine/KeystoneUrEngine';\nimport { TronSignType } from '../urEngine/TronSignRequest';\nimport {\n KEYSTONE_WALLET_CONNECT_ID_PREFIX,\n KEYSTONE_WALLET_ID_PATH,\n accountKey,\n createDeviceRecord,\n deriveKeystoneWalletId,\n placeholderDeviceInfo,\n toDeviceInfo,\n} from './deviceTable';\nimport {\n KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE,\n btcScriptTypeFromPath,\n isKeystoneSignableBtcAccountPath,\n normalizePath,\n splitAccountPath,\n} from './pathUtils';\n\nimport type { KeystoneParsedMultiAccounts, KeystoneUr } from '../urEngine/types';\nimport type { KeystoneAccountEntry, KeystoneDeviceRecord } from './deviceTable';\nimport type {\n AllNetworkAddressParams,\n AllNetworkAddressResponse,\n AllNetworkGetAddressParams,\n BtcAddress,\n BtcGetAddressParams,\n BtcGetPublicKeyParams,\n BtcPublicKey,\n BtcSignMsgParams,\n BtcSignPsbtParams,\n BtcSignTxParams,\n BtcSignature,\n BtcSignedPsbt,\n BtcSignedTx,\n ChainCapability,\n ChainForFingerprint,\n ConnectionTarget,\n ConnectorCallResult,\n ConnectorConnectTarget,\n ConnectorDevice,\n ConnectorEventMap,\n DeviceEventListener,\n DeviceInfo,\n DeviceSearchTarget,\n EvmAddress,\n EvmGetAddressParams,\n EvmSignMsgParams,\n EvmSignTxParams,\n EvmSignTypedDataParams,\n EvmSignature,\n EvmSignedTx,\n HardwareEvent,\n HardwareEventMap,\n IConnector,\n IHardwareCallParams,\n IHardwareCommonCallParams,\n IHardwareWallet,\n NullableCallArg,\n QrDisplayData,\n Response,\n SearchDevicesOptions,\n SolAddress,\n SolGetAddressParams,\n SolSignMsgParams,\n SolSignTxParams,\n SolSignature,\n SolSignedTx,\n TransportType,\n TronAddress,\n TronGetAddressParams,\n TronSignMsgParams,\n TronSignTxParams,\n TronSignature,\n TronSignedTx,\n UiResponseEvent,\n} from '@onekeyfe/hwk-adapter-core';\n\n/** Key material for one operation, keyed by `accountKey()`; never retained. */\ntype AccountBook = Map<string, KeystoneAccountEntry>;\n\nconst COLD_START_JOB_LABEL = 'keystone-cold-start';\n\n// Keystone briefly leaves the USB bus while entering external-wallet mode.\n// A persisted-wallet call can therefore race the macOS/Chromium re-enumeration\n// and must not fall back to QR after a single empty snapshot.\nconst KEYSTONE_USB_REATTACH_PROBE_ATTEMPTS = 4;\nconst KEYSTONE_USB_REATTACH_PROBE_INTERVAL_MS = 500;\n\nfunction resolveHardwareOperationTarget(\n positionalTargetId: string | null | undefined,\n operationId: string | null | undefined\n) {\n const result = resolveGenericHardwareOperationTarget(positionalTargetId, operationId, 'keystone');\n return result;\n}\n\nfunction waitForKeystoneUsbReattachProbe(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, KEYSTONE_USB_REATTACH_PROBE_INTERVAL_MS);\n });\n}\n\nfunction getKeystoneJobId(connectId?: string, deviceId?: string): string {\n return isHardwareOperationId(connectId)\n ? connectId\n : deviceId || connectId || COLD_START_JOB_LABEL;\n}\n\nconst BIP44_COIN_TYPE_TO_CHAIN: Record<number, ChainCapability> = {\n 60: 'evm',\n 0: 'btc',\n 501: 'sol',\n 195: 'tron',\n};\n\n/**\n * Classifies a returned account by BIP44 coin type (2nd segment), not by\n * purpose, so 44'/49'/84'/86' BTC entries all map to `btc`.\n */\nfunction inferHwkChainFromPath(path: string): ChainCapability | undefined {\n const match = normalizePath(path).match(/^m\\/\\d+'\\/(\\d+)'/);\n return match ? BIP44_COIN_TYPE_TO_CHAIN[Number(match[1])] : undefined;\n}\n\nexport interface ImportFromQrOptions {\n /**\n * 'request': ask the device for the fixed identity xpub via a\n * `qr-hardware-call` (KeyDerivation) UR. 'scan': just wait for whatever\n * multi-account/HD-key export the device is already showing. Either way\n * only the wallet identity is learned; key material is never retained.\n */\n mode?: 'request' | 'scan';\n}\n\n/**\n * Keystone adapter: QR and USB behind one `IHardwareWallet`, keyed by a\n * wallet id derived from the fixed identity xpub. `_resolveUr` picks the\n * channel per request (USB when a session exists, else QR). Key material\n * is fetched per operation and never retained on the wallet record.\n */\nexport class KeystoneAdapter implements IHardwareWallet {\n readonly vendor = 'keystone' as const;\n\n private readonly urEngine: KeystoneUrEngine;\n\n private readonly emitter = new TypedEventEmitter<HardwareEventMap>();\n\n private readonly _operationRoutes = new Map<\n string,\n { operationId: string; connectionType: 'usb' | 'qr' }\n >();\n\n private readonly _operations = new OperationRegistry({\n vendor: 'keystone',\n onEnded: (operation, reason) => {\n const route = this._operationRoutes.get(operation.connectId);\n if (route?.operationId === operation.operationId) {\n this._operationRoutes.delete(operation.connectId);\n }\n this.emitter.emit(SDK.OPERATION_ENDED, {\n type: SDK.OPERATION_ENDED,\n payload: { operationId: operation.operationId, reason },\n });\n if (reason === 'timeout') {\n this._releaseOperationConnection(operation).catch(() => undefined);\n }\n },\n });\n\n private readonly _uiRegistry = new UiRequestRegistry();\n\n private readonly _jobQueue: DeviceJobQueue;\n\n private readonly _devices = new Map<string, KeystoneDeviceRecord>();\n\n private readonly _searchDeviceTargets = new Map<string, 'usb' | 'qr'>();\n\n private _activeSearchGeneration: symbol | undefined;\n\n private readonly _origin: string;\n\n /** How long to wait for the app to answer a `REQUEST_QR_DISPLAY`/`REQUEST_QR_SCAN` before failing. Defaults to the registry's own 10-minute default. */\n private readonly _qrTimeoutMs: number | undefined;\n\n /** Optional USB `IConnector` — supplied by the host app (DI, same pattern as Trezor/Ledger), e.g. via `createKeystoneWebUsbConnector()` from `@onekeyfe/hwk-keystone-connector-usb`. Undefined means QR-only. */\n private readonly _usbConnector: IConnector | undefined;\n\n /** Serializes USB open/identity handshakes that run outside the job queue. */\n private _usbConnectTail: Promise<void> = Promise.resolve();\n\n private readonly _unsettledUsbOperations = new Map<string, number>();\n\n private readonly _usbIdleWaiters = new Set<() => void>();\n\n private _usbTeardownTail: Promise<void> = Promise.resolve();\n\n private _pendingUsbTeardowns = 0;\n\n /** Explicit `switchTransport` pin. `undefined` means \"auto\": USB when a live session exists for the target wallet, else QR. */\n private _forcedTransport: 'qr' | 'usb' | undefined;\n\n private readonly _handleUsbDisconnect = ({ connectId }: { connectId: string }): void => {\n const record = Array.from(this._devices.values()).find(item => item.usbSessionId === connectId);\n if (!record) return;\n\n this._operations.endByConnectionKey(connectId, 'disconnect');\n this._operations.endByConnectionKey(record.connectId, 'disconnect');\n\n record.usbSessionId = undefined;\n const info = toDeviceInfo(record);\n if (record.qrSynced) {\n this.emitter.emit(DEVICE.CHANGED, { type: DEVICE.CHANGED, payload: info });\n } else {\n this._devices.delete(record.walletId);\n this.emitter.emit(DEVICE.DISCONNECT, { type: DEVICE.DISCONNECT, payload: info });\n }\n };\n\n private readonly _handleUsbUiEvent = (event: ConnectorEventMap['ui-event']): void => {\n this.emitter.emit('ui-event', event);\n };\n\n constructor(options?: { origin?: string; qrTimeoutMs?: number; usbConnector?: IConnector }) {\n this._origin = options?.origin ?? 'OneKey';\n this._qrTimeoutMs = options?.qrTimeoutMs;\n this.urEngine = new KeystoneUrEngine(this._origin);\n this._jobQueue = new DeviceJobQueue();\n this._usbConnector = options?.usbConnector;\n this._usbConnector?.on('device-disconnect', this._handleUsbDisconnect);\n // Relay connector operation events (ConfirmOnDevice / InteractionComplete\n // around every USB UR round trip) to the host verbatim — same pass-through\n // the Ledger adapter does, so hosts reuse one handler for both vendors.\n this._usbConnector?.on('ui-event', this._handleUsbUiEvent);\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle / transport\n // ---------------------------------------------------------------------------\n\n get activeTransport(): TransportType | null {\n if (this._devices.size === 0) return null;\n const hasUsbSession = Array.from(this._devices.values()).some(r => r.usbSessionId);\n return hasUsbSession ? 'usb' : 'qr';\n }\n\n getAvailableTransports(): TransportType[] {\n return this._usbConnector ? ['qr', 'usb'] : ['qr'];\n }\n\n /** Pins subsequent calls to 'qr' or 'usb' (routing otherwise defaults to \"USB when the target wallet has a live session, else QR\" — see `_resolveUr`). Any other value clears the pin back to auto. */\n switchTransport(type: TransportType): Promise<void> {\n this._forcedTransport = type === 'qr' || type === 'usb' ? type : undefined;\n return Promise.resolve();\n }\n\n init(_config?: unknown): Promise<void> {\n return Promise.resolve();\n }\n\n async dispose(): Promise<void> {\n this._operations.endAll('runtime-reset');\n this._uiRegistry.cancel();\n this._jobQueue.clear();\n this._searchDeviceTargets.clear();\n await this._resetUsbSessions();\n this._usbConnector?.off('device-disconnect', this._handleUsbDisconnect);\n this._usbConnector?.off('ui-event', this._handleUsbUiEvent);\n this._usbConnector?.reset();\n this._devices.clear();\n this.emitter.removeAllListeners();\n }\n\n // ---------------------------------------------------------------------------\n // Device table\n // ---------------------------------------------------------------------------\n\n /**\n * Unscoped discovery includes QR-synced wallets already known to this\n * adapter. Explicit QR discovery returns a virtual connection target because\n * there is no physical descriptor to enumerate. When a USB connector is\n * configured, its raw scan results are appended as-is: a USB descriptor has\n * no mfp until `connectDevice()` actually opens+claims it (see\n * `KeystoneUsbConnectorBase.searchDevices`), so these entries carry an\n * empty `deviceId` and exist purely so a host can list \"plugged in, click\n * to connect\" candidates.\n */\n async searchDevices(options?: SearchDevicesOptions): Promise<DeviceInfo[]> {\n const searchGeneration = Symbol('keystone-device-search');\n this._activeSearchGeneration = searchGeneration;\n this._searchDeviceTargets.clear();\n if (options?.resetSession) {\n await this._resetUsbSessions();\n } else {\n await this._usbTeardownTail;\n }\n const known = Array.from(this._devices.values()).map(toDeviceInfo);\n\n // QR has no physical descriptor to enumerate. Return one virtual target so\n // the host can keep the common search -> connect flow without starting a\n // wallet protocol round trip during discovery.\n if (options?.transportType === 'qr') {\n const searchTargetId = createHardwareSearchTargetId('keystone');\n this._searchDeviceTargets.set(searchTargetId, 'qr');\n return [\n {\n ...placeholderDeviceInfo(),\n model: '',\n connectId: searchTargetId,\n capabilities: { persistentDeviceIdentity: false },\n },\n ];\n }\n\n if (options?.transportType === 'ble') return [];\n if (!this._usbConnector) return options?.transportType === 'usb' ? [] : known;\n\n let usbDevices: ConnectorDevice[];\n try {\n usbDevices = await this._usbConnector.searchDevices();\n } catch (error) {\n // A USB scan failing (no WebUSB support, permission not yet granted,\n // etc.) must not sink the QR-known devices this instance already has.\n if (options?.transportType === 'usb') throw error;\n return known;\n }\n if (this._activeSearchGeneration !== searchGeneration) return [];\n const placeholders: DeviceInfo[] = usbDevices.map(d => ({\n vendor: 'keystone',\n // Empty, not 'unknown': enumeration genuinely cannot tell the model\n // apart (every Keystone shares one vid/pid), and a literal placeholder\n // string would beat the host's own default-name fallback and surface as\n // a device called \"unknown\".\n model: d.model ?? '',\n modelName: d.modelName,\n // Placeholders — neither is knowable until the device is opened.\n firmwareVersion: '0.0.0',\n deviceId: d.deviceId,\n connectId: d.connectId,\n connectionType: 'usb',\n // The USB product name, which IS readable at enumeration time.\n label: d.name,\n serialNumber: d.serialNumber,\n capabilities: d.capabilities ?? { persistentDeviceIdentity: false },\n raw: d.raw,\n }));\n for (const placeholder of placeholders) {\n this._searchDeviceTargets.set(placeholder.connectId, 'usb');\n }\n return options?.transportType === 'usb' ? placeholders : [...known, ...placeholders];\n }\n\n private async _resetUsbSessions(): Promise<void> {\n await this._runUsbTeardown(async () => {\n await this._usbConnectTail;\n this._operations.endAll('runtime-reset');\n if (!this._usbConnector) return;\n\n const sessionIds = new Set(\n Array.from(this._devices.values())\n .map(record => record.usbSessionId)\n .filter((sessionId): sessionId is string => Boolean(sessionId))\n );\n for (const sessionId of sessionIds) {\n try {\n await this._usbConnector.disconnect(sessionId);\n } catch {\n // The adapter state is still retired below so a stale session cannot\n // be selected after an explicit reset.\n }\n this._handleUsbDisconnect({ connectId: sessionId });\n }\n });\n }\n\n async searchDeviceTargets(options?: SearchDevicesOptions): Promise<DeviceSearchTarget[]> {\n const devices = await this.searchDevices(options);\n return devices.map(device => ({\n searchTargetId: device.connectId,\n // Keystone's wallet id is stable only after the USB/QR handshake. The\n // selectable handle remains owned by the current discovery snapshot.\n searchTargetReusePolicy: 'current-discovery',\n vendor: device.vendor,\n connectionType: device.connectionType,\n kind: device.connectionType === 'qr' ? 'interactive' : 'physical',\n label: device.label,\n model: device.model,\n modelName: device.modelName,\n serialNumber: device.serialNumber,\n }));\n }\n\n async listConnectionTargets(options?: SearchDevicesOptions): Promise<ConnectionTarget[]> {\n const targets = await this.searchDeviceTargets(options);\n return targets.map(({ searchTargetId, ...target }) => ({\n ...target,\n targetId: searchTargetId,\n }));\n }\n\n async connectDevice(searchTargetId: string): Promise<Response<string>> {\n try {\n let connected: Response<DeviceInfo>;\n let selectedConnectionType: 'usb' | 'qr';\n const discoveredConnectionType = this._searchDeviceTargets.get(searchTargetId);\n if (discoveredConnectionType === 'qr') {\n selectedConnectionType = 'qr';\n connected = await this.importFromQr();\n } else if (discoveredConnectionType === 'usb') {\n selectedConnectionType = 'usb';\n if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.TransportNotAvailable,\n 'No USB connector configured for this Keystone adapter'\n );\n }\n connected = await this._connectUsb({}, searchTargetId);\n } else if (hasHardwareRuntimeIdPrefix(searchTargetId)) {\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Keystone search target has expired; search for devices again',\n undefined,\n undefined,\n { scope: 'search-target' }\n );\n } else {\n const target = this._resolveTarget(searchTargetId);\n if (target.record) {\n selectedConnectionType = target.record.usbSessionId ? 'usb' : 'qr';\n connected = success(toDeviceInfo(target.record));\n } else if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.DeviceNotFound,\n `Unknown Keystone device search target: ${searchTargetId}`\n );\n } else {\n selectedConnectionType = 'usb';\n connected = await this._connectUsb(target);\n }\n }\n if (!connected.success) return connected;\n\n const record = this._devices.get(connected.payload.deviceId);\n this._operations.endByConnectionKey(connected.payload.connectId, 'explicit');\n const operation = this._operations.create({\n searchTargetId,\n connectId: connected.payload.connectId,\n device: connected.payload,\n connectionKeys:\n selectedConnectionType === 'usb' && record?.usbSessionId ? [record.usbSessionId] : [],\n });\n this._operationRoutes.set(connected.payload.connectId, {\n operationId: operation.operationId,\n connectionType: selectedConnectionType,\n });\n return success(operation.operationId);\n } catch (err) {\n return this._errorToFailure<string>(err);\n }\n }\n\n /**\n * QR has no persistent connection to tear down — the account cache\n * survives so a later call resumes without re-syncing. For a USB session,\n * this closes the connector session and either demotes the record back to\n * QR-only (if it was ever QR-synced) or removes it entirely (pure-USB\n * wallet that was never seen over QR) — see §4.2 of the design doc.\n */\n async releaseOperation(operationId: string): Promise<void> {\n const operation = this._operations.find(operationId);\n if (!operation) {\n this._operations.resolve(operationId);\n return;\n }\n const endedOperation = this._operations.end(operationId, 'explicit');\n if (!endedOperation) return;\n await this._releaseOperationConnection(endedOperation);\n }\n\n private async _releaseOperationConnection(\n operation: NonNullable<ReturnType<OperationRegistry['find']>>\n ): Promise<void> {\n const { connectId } = operation;\n let record: KeystoneDeviceRecord | undefined;\n try {\n record = this._resolveTarget(connectId).record;\n } catch {\n return;\n }\n if (!record?.usbSessionId || !operation.connectionKeys.includes(record.usbSessionId)) {\n return;\n }\n\n const { usbSessionId } = record;\n await this._runUsbTeardown(async () => {\n if (this._usbConnector) {\n try {\n await this._usbConnector.disconnect(usbSessionId);\n } catch {\n // Best-effort teardown — local routing state is cleared below either way.\n }\n }\n this._handleUsbDisconnect({ connectId: usbSessionId });\n });\n }\n\n getDeviceInfo(connectIdOrOperationId: string, deviceId: string): Promise<Response<DeviceInfo>> {\n try {\n const connectId = isHardwareOperationId(connectIdOrOperationId)\n ? this._operations.resolve(connectIdOrOperationId).connectId\n : connectIdOrOperationId;\n const { record } = this._resolveTarget(connectId, deviceId);\n if (!record) {\n return Promise.resolve(\n failure(\n HardwareErrorCode.DeviceNotFound,\n `Unknown Keystone device: ${connectId || deviceId}`\n )\n );\n }\n return Promise.resolve(success(toDeviceInfo(record)));\n } catch (err) {\n return Promise.resolve(this._errorToFailure<DeviceInfo>(err));\n }\n }\n\n cancel(connectId?: string): void {\n const reason = createHwkError({\n code: HardwareErrorCode.UserAborted,\n message: 'User aborted operation',\n });\n const activeJobId = this._jobQueue.getActiveJob()?.deviceId;\n if (connectId) {\n if (\n !activeJobId ||\n (activeJobId !== connectId && activeJobId !== this._walletIdFromIdentifier(connectId))\n ) {\n this._jobQueue.cancelActiveAndPending(connectId, reason);\n const walletId = this._walletIdFromIdentifier(connectId);\n if (walletId && walletId !== connectId) {\n this._jobQueue.cancelActiveAndPending(walletId, reason);\n }\n return;\n }\n this._jobQueue.cancelActiveAndPending(activeJobId, reason);\n } else {\n this._jobQueue.cancelActiveAndPending(undefined, reason);\n }\n this._uiRegistry.cancel();\n }\n\n getChainFingerprint(\n connectId: string,\n deviceId: string,\n chain: ChainForFingerprint\n ): Promise<Response<string>> {\n try {\n const target = this._resolveTarget(connectId, deviceId);\n const walletId = target.record?.walletId ?? target.expectedWalletId;\n if (!walletId) {\n return Promise.resolve(\n failure(HardwareErrorCode.DeviceNotFound, 'Unknown Keystone wallet identity')\n );\n }\n return Promise.resolve(success(deriveDeviceFingerprint(`keystone:${chain}:${walletId}`)));\n } catch (err) {\n return Promise.resolve(this._errorToFailure<string>(err));\n }\n }\n\n uiResponse(response: UiResponseEvent): void {\n if (response.type === UI_RESPONSE.CANCEL) {\n this.cancel();\n return;\n }\n this._uiRegistry.resolve(response.type, response.payload);\n }\n\n on<K extends keyof HardwareEventMap>(\n event: K,\n listener: (event: HardwareEventMap[K]) => void\n ): void;\n\n on(event: string, listener: DeviceEventListener): void;\n\n on(event: string, listener: (event: HardwareEvent) => void): void {\n this.emitter.on(event, listener);\n }\n\n off<K extends keyof HardwareEventMap>(\n event: K,\n listener: (event: HardwareEventMap[K]) => void\n ): void;\n\n off(event: string, listener: DeviceEventListener): void;\n\n off(event: string, listener: (event: HardwareEvent) => void): void {\n this.emitter.off(event, listener);\n }\n\n // ---------------------------------------------------------------------------\n // Explicit account import — the recommended entry point before signing, so\n // signing calls don't each pay for their own cold-sync round trip.\n // ---------------------------------------------------------------------------\n\n async importFromQr(options: ImportFromQrOptions = {}): Promise<Response<DeviceInfo>> {\n try {\n return await this._jobQueue.enqueue(COLD_START_JOB_LABEL, async signal => {\n const displayDevice = placeholderDeviceInfo();\n let responseUr: KeystoneUr;\n\n if (options.mode === 'scan') {\n responseUr = await this._requestQrScanAndAwaitResponse(displayDevice);\n } else {\n // Identity only; key material is never retained.\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: [{ path: KEYSTONE_WALLET_ID_PATH, curve: 'secp256k1' }],\n origin: this._origin,\n });\n responseUr = await this._requestQrDisplayAndAwaitResponse(displayDevice, {\n ...requestUr,\n animated: false,\n });\n }\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n const record = this._upsertDeviceRecord(parsed);\n return success(toDeviceInfo(record));\n });\n } catch (err) {\n return this._errorToFailure<DeviceInfo>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // All-network bundle — dispatches to the same per-chain methods below, so\n // there's exactly one implementation of each chain's address logic.\n // ---------------------------------------------------------------------------\n\n allNetworkGetAddress = async (\n connectId: string,\n deviceId: string,\n params: AllNetworkGetAddressParams\n ): Promise<Response<AllNetworkAddressResponse[]>> => {\n const operationTarget = resolveHardwareOperationTarget(connectId, params.operationId);\n if (!operationTarget.success) return operationTarget;\n const effectiveConnectId = operationTarget.payload.targetId ?? '';\n const { operationId } = operationTarget.payload;\n try {\n const prefetched = await this._prefetchAllNetworkAccounts(\n effectiveConnectId,\n deviceId,\n params\n );\n const { book } = prefetched;\n // Implicit cold start (no connectId/deviceId): the prefetch round trip\n // just established the wallet identity, so route the per-item calls to\n // it instead of resolving an empty target and re-syncing per item.\n const itemDeviceId = deviceId || prefetched.walletId || '';\n return await runAllNetworkGetAddress({\n connectId: effectiveConnectId,\n deviceId: itemDeviceId,\n params,\n callItem: async ({ method, item }) => {\n const commonArgs = {\n path: item.path,\n showOnDevice: item.showOnDevice,\n operationId,\n };\n switch (method) {\n case 'evmGetAddress':\n return this.evmGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'btcGetAddress':\n return this.btcGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'btcGetPublicKey':\n return this.btcGetPublicKey(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'solGetAddress':\n return this.solGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'tronGetAddress':\n return this.tronGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n default:\n return failure(\n HardwareErrorCode.MethodNotSupported,\n `Unsupported method: ${String(method)}`\n );\n }\n },\n attachIdentity: context => {\n const { record } = this._resolveTarget(effectiveConnectId, itemDeviceId);\n return Promise.resolve({\n ...context.item,\n success: true,\n payload: {\n ...context.payload,\n rootFingerprint: record ? Number.parseInt(record.masterFingerprint, 16) : undefined,\n deviceIdentity: record\n ? {\n vendor: 'keystone' as const,\n type: 'walletId' as const,\n value: record.walletId,\n }\n : undefined,\n },\n });\n },\n });\n } catch (err) {\n return this._errorToFailure<AllNetworkAddressResponse[]>(err);\n }\n };\n\n // ---------------------------------------------------------------------------\n // EVM\n // ---------------------------------------------------------------------------\n\n async evmGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<EvmGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<EvmAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'evmGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'evmGetAddress requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"evmGetAddress requires a full leaf path, e.g. m/44'/60'/0'/0/0\"\n );\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { account } = await this._fetchAccount(\n connectId,\n deviceId,\n 'evm',\n accountPath,\n signal,\n { book }\n );\n KeystoneAdapter._throwIfAborted(signal);\n if (!account.extendedPublicKey) {\n throw createHwkError({\n code: HardwareErrorCode.MethodNotSupported,\n message: 'Keystone did not return an extended public key for this account path',\n });\n }\n // params.showOnDevice: Keystone on-device re-display/verification for\n // one leaf address isn't wired yet; the address itself is still\n // correct — it's derived offline from a device-verified xpub, just\n // not re-shown.\n const address = this.urEngine.deriveEvmAddressFromXpub(\n account.extendedPublicKey,\n relativeDerivePath\n );\n return success<EvmAddress>({ address, path: normalizePath(params.path) });\n });\n } catch (err) {\n return this._errorToFailure<EvmAddress>(err);\n }\n }\n\n async evmSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<EvmSignTxParams>>\n ): Promise<Response<EvmSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTransaction requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTransaction requires params.path');\n }\n if (\n !('serializedTx' in params) ||\n typeof params.serializedTx !== 'string' ||\n !params.serializedTx\n ) {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone only signs a fully RLP-serialized transaction (params.serializedTx) — structured-field signing is not supported'\n );\n }\n const rawTxHex = stripHex(params.serializedTx);\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // Signing only needs the wallet's mfp (the device re-derives the\n // signing key itself from path+xfp) — not a cached xpub for this\n // exact path, so this must NOT key off the leaf path the way\n // evmGetAddress's account-xpub cache does, or a wallet imported at\n // the account level would never hit cache for a sign call.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'evm', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n // EIP-2718 typed-tx bytes always start with a type byte < 0x80; a\n // legacy RLP-encoded tx list always starts with a byte >= 0xc0 — the\n // standard disambiguation rule (that gap is exactly why EIP-2718\n // chose those type-byte values).\n const dataType =\n parseInt(rawTxHex.slice(0, 2), 16) < 0xc0 ? 'typedTransaction' : 'transaction';\n const requestUr = this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: rawTxHex,\n dataType,\n path,\n xfp: record.masterFingerprint,\n chainId: params.chainId,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'evmSignTransaction'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseEthSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<EvmSignedTx>({\n v: ensure0x(sig.v),\n r: ensure0x(sig.r),\n s: ensure0x(sig.s),\n });\n });\n } catch (err) {\n return this._errorToFailure<EvmSignedTx>(err);\n }\n }\n\n async evmSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<EvmSignMsgParams>>\n ): Promise<Response<EvmSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'evmSignMessage requires params');\n if (!params.path || params.message === undefined) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'evmSignMessage requires params.path and params.message'\n );\n }\n const messageHex = params.hex\n ? stripHex(params.message)\n : Buffer.from(params.message, 'utf8').toString('hex');\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // Signing only needs the wallet's mfp (the device re-derives the\n // signing key itself from path+xfp) — not a cached xpub for this\n // exact path, so this must NOT key off the leaf path the way\n // evmGetAddress's account-xpub cache does, or a wallet imported at\n // the account level would never hit cache for a sign call.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'evm', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: messageHex,\n dataType: 'personalMessage',\n path,\n xfp: record.masterFingerprint,\n chainId: params.chainId,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'evmSignMessage'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseEthSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<EvmSignature>({ signature: ensure0x(sig.r + sig.s + sig.v) });\n });\n } catch (err) {\n return this._errorToFailure<EvmSignature>(err);\n }\n }\n\n async evmSignTypedData(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<EvmSignTypedDataParams>>\n ): Promise<Response<EvmSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTypedData requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTypedData requires params.path');\n }\n if (params.mode === 'hash') {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone always displays the full EIP-712 payload for on-device review — pre-hashed signing is not supported'\n );\n }\n // Matches the Keystone USB SDK's own `signEIP712Message` convention\n // (the typed-data JSON as UTF-8) — QR and USB share the same sign-request\n // format, so the wire convention is the same either way. `dataJson` is the\n // dApp's original bytes; re-stringifying the parsed object is the fallback\n // and can rewrite >2^53 integer literals, so it is never preferred.\n const signDataHex = Buffer.from(\n params.dataJson ?? JSON.stringify(params.data),\n 'utf8'\n ).toString('hex');\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // Signing only needs the wallet's mfp (the device re-derives the\n // signing key itself from path+xfp) — not a cached xpub for this\n // exact path, so this must NOT key off the leaf path the way\n // evmGetAddress's account-xpub cache does, or a wallet imported at\n // the account level would never hit cache for a sign call.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'evm', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: signDataHex,\n dataType: 'typedData',\n path,\n xfp: record.masterFingerprint,\n chainId: params.chainId,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'evmSignTypedData'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseEthSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<EvmSignature>({ signature: ensure0x(sig.r + sig.s + sig.v) });\n });\n } catch (err) {\n return this._errorToFailure<EvmSignature>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // BTC — PSBT signing and message signing only for now. Address/pubkey\n // derivation needs script-type-aware xpub decoding (P2WPKH/P2TR/…) this\n // phase doesn't wire in yet; structured-field tx signing needs host-side\n // PSBT construction. Both are real, bounded follow-ups, not silent gaps.\n // ---------------------------------------------------------------------------\n\n async btcGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<BtcGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<BtcAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'btcGetAddress requires params.path');\n\n const scriptType = btcScriptTypeFromPath(params.path);\n if (!scriptType) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetAddress requires a path whose purpose is 44'/49'/84'/86' (P2PKH/P2SH-P2WPKH/P2WPKH/P2TR)\"\n );\n }\n if (scriptType === 'p2tr') {\n return this._unsupported(\n 'btcGetAddress',\n \"P2TR (purpose 86') needs an elliptic-curve library for BIP-341 tweaking, not yet wired in — 44'/49'/84' work\"\n );\n }\n\n const normalizedPath = normalizePath(params.path);\n const { accountPath, relativeDerivePath } = splitAccountPath(normalizedPath);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetAddress requires a full leaf path, e.g. m/84'/0'/0'/0/0\"\n );\n }\n if (!isKeystoneSignableBtcAccountPath(accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { account } = await this._fetchAccount(\n connectId,\n deviceId,\n 'btc',\n accountPath,\n signal,\n { book }\n );\n KeystoneAdapter._throwIfAborted(signal);\n if (!account.extendedPublicKey) {\n throw createHwkError({\n code: HardwareErrorCode.MethodNotSupported,\n message: 'Keystone did not return an extended public key for this account path',\n });\n }\n // Same on-device re-display caveat as evmGetAddress: the address is\n // still correct (derived offline from a device-verified xpub), it\n // just isn't re-shown on-device for this call yet.\n const address = this.urEngine.deriveBtcAddressFromXpub(\n account.extendedPublicKey,\n relativeDerivePath,\n scriptType\n );\n return success<BtcAddress>({ address, path: normalizedPath });\n });\n } catch (err) {\n return this._errorToFailure<BtcAddress>(err);\n }\n }\n\n /**\n * Returns the account-level extended public key. `params.path` must be an\n * ACCOUNT path (`m/84'/0'/0'`), not a leaf — that is the level Keystone\n * actually syncs, and it is what a host needs to derive a whole account's\n * addresses offline. Unlike `btcGetAddress` this has no script-type\n * restriction: an xpub is script-type agnostic, so `86'` (taproot) works\n * here even though deriving a taproot ADDRESS still needs an EC library\n * this package doesn't wire in.\n */\n async btcGetPublicKey(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<BtcGetPublicKeyParams>>,\n book?: AccountBook\n ): Promise<Response<BtcPublicKey>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcGetPublicKey requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'btcGetPublicKey requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetPublicKey requires an account path, e.g. m/84'/0'/0' (not a leaf path)\"\n );\n }\n if (!isKeystoneSignableBtcAccountPath(accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { account } = await this._fetchAccount(\n connectId,\n deviceId,\n 'btc',\n accountPath,\n signal,\n { book }\n );\n KeystoneAdapter._throwIfAborted(signal);\n if (!account.extendedPublicKey) {\n throw createHwkError({\n code: HardwareErrorCode.MethodNotSupported,\n message: 'Keystone did not return an extended public key for this account path',\n });\n }\n const meta = this.urEngine.parseXpubMeta(account.extendedPublicKey);\n return success<BtcPublicKey>({\n xpub: account.extendedPublicKey,\n publicKey: meta.publicKey,\n chainCode: meta.chainCode,\n depth: meta.depth,\n fingerprint: meta.parentFingerprint,\n path: normalizePath(accountPath),\n });\n });\n } catch (err) {\n return this._errorToFailure<BtcPublicKey>(err);\n }\n }\n\n async btcSignTransaction(\n _connectId?: NullableCallArg<string>,\n _deviceId?: NullableCallArg<string>,\n _params?: NullableCallArg<IHardwareCallParams<BtcSignTxParams>>\n ): Promise<Response<BtcSignedTx>> {\n return this._unsupported(\n 'btcSignTransaction',\n 'use btcSignPsbt — structured input/output signing needs host-side PSBT construction, not yet wired in'\n );\n }\n\n async btcSignPsbt(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<BtcSignPsbtParams>>\n ): Promise<Response<BtcSignedPsbt>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcSignPsbt requires params');\n if (!params.psbt)\n return failure(HardwareErrorCode.InvalidParams, 'btcSignPsbt requires params.psbt');\n if (\n params.path &&\n !isKeystoneSignableBtcAccountPath(splitAccountPath(params.path).accountPath)\n ) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // A PSBT can span multiple inputs/paths — there's no single leaf path\n // to scope a sync to, so this only needs the wallet's mfp to be known.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'btc', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestUr = this.urEngine.buildBtcPsbtRequest(stripHex(params.psbt));\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'btcSignPsbt'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const signedPsbt = this.urEngine.parseBtcPsbt(responseUr);\n return success<BtcSignedPsbt>({ signedPsbt });\n });\n } catch (err) {\n return this._errorToFailure<BtcSignedPsbt>(err);\n }\n }\n\n async btcSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<BtcSignMsgParams>>\n ): Promise<Response<BtcSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcSignMessage requires params');\n if (!params.path || params.message === undefined) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'btcSignMessage requires params.path and params.message'\n );\n }\n const messageHex = params.hex\n ? stripHex(params.message)\n : Buffer.from(params.message, 'utf8').toString('hex');\n const path = normalizePath(params.path);\n if (!isKeystoneSignableBtcAccountPath(splitAccountPath(path).accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'btc', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildBtcMessageSignRequest({\n requestId,\n messageHex,\n accounts: [{ path, xfp: record.masterFingerprint }],\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'btcSignMessage'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseBtcSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<BtcSignature>({ signature: sig.signature });\n });\n } catch (err) {\n return this._errorToFailure<BtcSignature>(err);\n }\n }\n\n async btcGetMasterFingerprint(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCommonCallParams>\n ): Promise<Response<{ masterFingerprint: string }>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'btc', signal);\n return success({ masterFingerprint: record.masterFingerprint });\n });\n } catch (err) {\n return this._errorToFailure<{ masterFingerprint: string }>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // SOL\n // ---------------------------------------------------------------------------\n\n async solGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<SolGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<SolAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'solGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'solGetAddress requires params.path');\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { account } = await this._fetchAccount(connectId, deviceId, 'sol', path, signal, {\n book,\n });\n KeystoneAdapter._throwIfAborted(signal);\n // Ed25519 public key IS the Solana address (base58) — no further\n // derivation, unlike EVM. params.showOnDevice: same on-device\n // re-display caveat as evmGetAddress.\n const address = bs58.encode(Buffer.from(account.publicKey, 'hex'));\n return success<SolAddress>({ address, path });\n });\n } catch (err) {\n return this._errorToFailure<SolAddress>(err);\n }\n }\n\n async solSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<SolSignTxParams>>\n ): Promise<Response<SolSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'solSignTransaction requires params');\n if (!params.path || !params.serializedTx) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'solSignTransaction requires params.path and params.serializedTx'\n );\n }\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // Same reasoning as evmSignTransaction — signing needs only the mfp.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'sol', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildSolSignRequest({\n requestId,\n unsignedPayloadHex: stripHex(params.serializedTx),\n dataType: 'transaction',\n path,\n xfp: record.masterFingerprint,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'solSignTransaction'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseSolSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<SolSignedTx>({ signature: sig.signature });\n });\n } catch (err) {\n return this._errorToFailure<SolSignedTx>(err);\n }\n }\n\n async solSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<SolSignMsgParams>>\n ): Promise<Response<SolSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'solSignMessage requires params');\n if (!params.path || !params.message) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'solSignMessage requires params.path and params.message'\n );\n }\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // Same reasoning as evmSignTransaction — signing needs only the mfp.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'sol', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildSolSignRequest({\n requestId,\n unsignedPayloadHex: stripHex(params.message),\n dataType: 'message',\n path,\n xfp: record.masterFingerprint,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'solSignMessage'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseSolSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<SolSignature>({ signature: sig.signature });\n });\n } catch (err) {\n return this._errorToFailure<SolSignature>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // TRON — routed through `TronSignRequest`/`TronSignature` (see\n // urEngine/TronSignRequest.ts), a port of OneKey's own already-proven\n // production TRON QR-wallet implementation — NOT keystone-sdk's own\n // bundled `sdk.tron` module (different, protobuf-based protocol with\n // unverified response semantics).\n // ---------------------------------------------------------------------------\n\n async tronGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<TronGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<TronAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'tronGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'tronGetAddress requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"tronGetAddress requires a full leaf path, e.g. m/44'/195'/0'/0/0\"\n );\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { account } = await this._fetchAccount(\n connectId,\n deviceId,\n 'tron',\n accountPath,\n signal,\n { book }\n );\n KeystoneAdapter._throwIfAborted(signal);\n if (!account.extendedPublicKey) {\n throw createHwkError({\n code: HardwareErrorCode.MethodNotSupported,\n message: 'Keystone did not return an extended public key for this account path',\n });\n }\n const address = this.urEngine.deriveTronAddressFromXpub(\n account.extendedPublicKey,\n relativeDerivePath\n );\n return success<TronAddress>({ address, path: normalizePath(params.path) });\n });\n } catch (err) {\n return this._errorToFailure<TronAddress>(err);\n }\n }\n\n async tronSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<TronSignTxParams>>\n ): Promise<Response<TronSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'tronSignTransaction requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignTransaction requires params.path');\n }\n if (!params.rawTxHex) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'Keystone only signs a fully protobuf-serialized TRON transaction (params.rawTxHex) — the Trezor-style structured contract fields have no equivalent here'\n );\n }\n const rawTxHex = stripHex(params.rawTxHex);\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'tron', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildTronSignRequest({\n requestId,\n rawTxHex,\n path,\n xfp: record.masterFingerprint,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'tronSignTransaction'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseTronSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n // Keystone signs the exact rawTxHex bytes it was given and returns\n // only the bare signature — unlike EVM/BTC there's no host-side\n // re-encoding step, so `serializedTx` stays unset (the caller\n // already has the raw tx it sent in).\n return success<TronSignedTx>({ signature: sig.signature });\n });\n } catch (err) {\n return this._errorToFailure<TronSignedTx>(err);\n }\n }\n\n async tronSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<TronSignMsgParams>>\n ): Promise<Response<TronSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params.path');\n }\n if (!params.messageHex) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params.messageHex');\n }\n // Firmware implements TIP-191 signMessageV2 only.\n if (params.messageType !== 'V2') {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone signs TRON messages as TIP-191 signMessageV2 only (messageType: \"V2\")'\n );\n }\n const messageHex = stripHex(params.messageHex);\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'tron', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildTronSignRequest({\n requestId,\n rawTxHex: messageHex,\n path,\n xfp: record.masterFingerprint,\n signType: TronSignType.PersonalMessage,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'tronSignMessage'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseTronSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<TronSignature>({ signature: sig.signature });\n });\n } catch (err) {\n return this._errorToFailure<TronSignature>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n private _walletIdFromIdentifier(identifier: string): string | undefined {\n const value = identifier.startsWith(KEYSTONE_WALLET_CONNECT_ID_PREFIX)\n ? identifier.slice(KEYSTONE_WALLET_CONNECT_ID_PREFIX.length)\n : identifier;\n return /^[0-9a-f]{64}$/i.test(value) ? value.toLowerCase() : undefined;\n }\n\n private _allNetworkSyncSchema(\n item: AllNetworkAddressParams\n ): { hwkChain: ChainCapability; path: string } | undefined {\n if (!isAllNetworkMethodName(String(item.methodName)) || !item.path) return undefined;\n\n const method = item.methodName;\n const hwkChain = getAllNetworkMethodChain(method);\n const path = normalizePath(item.path);\n // Unsignable BTC accounts are refused by the per-item call; keep them out\n // of the prefetch so the device is not asked to export them.\n if (\n hwkChain === 'btc' &&\n !isKeystoneSignableBtcAccountPath(splitAccountPath(path).accountPath)\n ) {\n return undefined;\n }\n switch (method) {\n case 'evmGetAddress':\n case 'btcGetAddress':\n case 'tronGetAddress':\n return { hwkChain, path: splitAccountPath(path).accountPath };\n case 'btcGetPublicKey':\n case 'solGetAddress':\n return { hwkChain, path };\n default:\n return undefined;\n }\n }\n\n /**\n * QR is an interactive batch transport: one account-creation action must\n * produce one request QR and one response scan, regardless of how many\n * chains or derivation paths the host bundled. USB keeps its proven\n * one-path-at-a-time export flow because the device limits that channel.\n */\n private async _prefetchAllNetworkAccounts(\n connectId: string,\n deviceId: string,\n params: AllNetworkGetAddressParams\n ): Promise<{ book: AccountBook; walletId?: string }> {\n return this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const target = this._resolveTarget(connectId, deviceId);\n const { record: targetRecord } = target;\n let record = targetRecord;\n\n const requestedByKey = new Map<string, { hwkChain: ChainCapability; path: string }>();\n for (const item of params.bundle) {\n const schema = this._allNetworkSyncSchema(item);\n if (schema) requestedByKey.set(accountKey(schema.hwkChain, schema.path), schema);\n }\n\n const book: AccountBook = new Map();\n if (!requestedByKey.size) {\n return { book };\n }\n\n if (\n this._forcedTransport !== 'qr' &&\n !record?.usbSessionId &&\n this._usbConnector &&\n target.expectedWalletId\n ) {\n record =\n (await this._tryUsbAttach(\n target.expectedWalletId,\n record?.masterFingerprint ?? target.expectedMasterFingerprint\n )) ?? record;\n KeystoneAdapter._throwIfAborted(signal);\n }\n\n if (this._forcedTransport !== 'qr' && record?.usbSessionId) {\n const bundleSessionId = record.usbSessionId;\n const assertBundleSession = () => {\n if (record?.usbSessionId !== bundleSessionId) {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'Keystone USB connection was lost during account export',\n });\n }\n };\n const missingSchemas = Array.from(requestedByKey.values());\n for (const schema of missingSchemas) {\n if (!book.has(accountKey(schema.hwkChain, schema.path))) {\n assertBundleSession();\n const synced = await this._fetchAccount(\n connectId,\n deviceId,\n schema.hwkChain,\n schema.path,\n signal,\n { book }\n );\n record = synced.record;\n assertBundleSession();\n }\n }\n for (const schema of missingSchemas) {\n if (!book.has(accountKey(schema.hwkChain, schema.path))) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Keystone did not return the requested derivation path (${schema.path})`,\n });\n }\n }\n return { book, walletId: record.walletId };\n }\n if (this._forcedTransport === 'usb') {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'USB channel is not connected for this Keystone wallet',\n });\n }\n\n const missingSchemas = Array.from(requestedByKey.values());\n\n const schemas = [\n { hwkChain: 'evm' as const, path: KEYSTONE_WALLET_ID_PATH },\n ...missingSchemas.filter(schema => normalizePath(schema.path) !== KEYSTONE_WALLET_ID_PATH),\n ];\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: schemas.map(schema => ({\n path: schema.path,\n curve: schema.hwkChain === 'sol' ? 'ed25519' : 'secp256k1',\n })),\n origin: this._origin,\n });\n const responseUr = await this._requestQrDisplayAndAwaitResponse(\n record ? toDeviceInfo(record) : placeholderDeviceInfo(),\n { ...requestUr, animated: false }\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n this._assertParsedIdentity(parsed, target);\n record = this._upsertDeviceRecord(parsed);\n const requestedChainByPath = new Map(\n schemas.map(schema => [normalizePath(schema.path), schema.hwkChain] as const)\n );\n for (const account of parsed.accounts) {\n const normalizedPath = normalizePath(account.path);\n const hwkChain =\n requestedChainByPath.get(normalizedPath) ?? inferHwkChainFromPath(normalizedPath);\n if (hwkChain) {\n book.set(accountKey(hwkChain, normalizedPath), {\n ...account,\n hwkChain,\n });\n }\n }\n for (const schema of missingSchemas) {\n if (!book.has(accountKey(schema.hwkChain, schema.path))) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Keystone did not return the requested derivation path (${schema.path})`,\n });\n }\n }\n return { book, walletId: record.walletId };\n });\n }\n\n /**\n * Resolve only the stable 64-hex wallet identity. The 8-hex BIP32 master\n * fingerprint is protocol metadata and is never accepted as a lookup key.\n */\n private _resolveTarget(\n connectId?: string,\n deviceId?: string\n ): {\n record?: KeystoneDeviceRecord;\n expectedWalletId?: string;\n expectedMasterFingerprint?: string;\n } {\n let resolvedConnectId = connectId;\n if (isHardwareOperationId(connectId)) {\n resolvedConnectId = this._operations.resolve(connectId).connectId;\n }\n const identifiers = [deviceId, resolvedConnectId].filter((identifier): identifier is string =>\n Boolean(identifier)\n );\n if (!identifiers.length) return {};\n\n const walletIds = identifiers\n .map(identifier => this._walletIdFromIdentifier(identifier))\n .filter((walletId): walletId is string => Boolean(walletId));\n if (!walletIds.length) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceNotFound,\n message: 'Keystone device lookup requires a 64-hex wallet identity',\n });\n }\n\n const expectedWalletId = walletIds[0];\n if (walletIds.some(walletId => walletId !== expectedWalletId)) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone connectId and deviceId identify different wallets',\n });\n }\n if (identifiers.some(identifier => !this._walletIdFromIdentifier(identifier))) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone connectId and deviceId are inconsistent',\n });\n }\n\n const record = this._devices.get(expectedWalletId);\n return record\n ? {\n record,\n expectedWalletId,\n expectedMasterFingerprint: record.masterFingerprint,\n }\n : { expectedWalletId };\n }\n\n private _assertParsedIdentity(\n parsed: KeystoneParsedMultiAccounts,\n expected: { expectedWalletId?: string; expectedMasterFingerprint?: string }\n ): string {\n const walletId = deriveKeystoneWalletId(parsed.accounts);\n if (\n expected.expectedMasterFingerprint &&\n parsed.masterFingerprint !== expected.expectedMasterFingerprint\n ) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Connected Keystone wallet (mfp ${parsed.masterFingerprint}) does not match the requested wallet fingerprint (${expected.expectedMasterFingerprint})`,\n });\n }\n if (expected.expectedWalletId && walletId !== expected.expectedWalletId) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Connected Keystone wallet does not match the requested wallet identity',\n });\n }\n return walletId;\n }\n\n /**\n * Folds a parsed account-response UR into the device table. `viaUsb`\n * (defaults false) says which channel actually carried this round trip —\n * `_resolveUr` routes a KeyDerivation sync over USB when the target record\n * already has a live session, so this must NOT unconditionally mark\n * `qrSynced`, or a USB-only wallet would wrongly survive a later USB\n * disconnect as a \"QR-synced, demote to QR-only\" entry instead of being\n * dropped outright (see `releaseOperation`).\n */\n private _upsertDeviceRecord(\n parsed: KeystoneParsedMultiAccounts,\n options?: { viaUsb?: boolean; usbSessionId?: string }\n ): KeystoneDeviceRecord {\n const walletId = deriveKeystoneWalletId(parsed.accounts);\n let record = this._devices.get(walletId);\n const isNew = !record;\n if (!record) {\n record = createDeviceRecord(walletId, parsed.masterFingerprint);\n this._devices.set(walletId, record);\n } else if (record.masterFingerprint !== parsed.masterFingerprint) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone wallet identity returned an inconsistent master fingerprint',\n });\n }\n record.model = parsed.device ?? record.model;\n record.deviceVersion = parsed.deviceVersion ?? record.deviceVersion;\n record.hardwareDeviceId = parsed.deviceId ?? record.hardwareDeviceId;\n record.usbSessionId = options?.usbSessionId ?? record.usbSessionId;\n if (!options?.viaUsb) record.qrSynced = true;\n\n const info = toDeviceInfo(record);\n const eventType = isNew ? DEVICE.CONNECT : DEVICE.CHANGED;\n this.emitter.emit(eventType, { type: eventType, payload: info });\n return record;\n }\n\n /**\n * Opens+claims whatever Keystone the USB connector currently has\n * permission for, learns its protocol mfp via `getAppConfig`, then requests\n * one fixed account-level xpub and derives the stable wallet id. A\n * QR-synced entry becomes\n * `{qr, usb}`-capable in place (one `device-changed`, not a second\n * `device-connect`); a wallet never seen before becomes a new USB-only\n * entry. See §4.2 of the design doc.\n */\n private async _connectUsb(\n expected: {\n expectedWalletId?: string;\n expectedMasterFingerprint?: string;\n },\n searchTargetId?: string\n ): Promise<Response<DeviceInfo>> {\n if (this._pendingUsbTeardowns > 0) {\n return failure(\n HardwareErrorCode.DeviceBusyInternal,\n 'Keystone USB session is being released'\n );\n }\n const previous = this._usbConnectTail;\n let release: (() => void) | undefined;\n this._usbConnectTail = new Promise<void>(resolve => {\n release = resolve;\n });\n await previous;\n try {\n return await this._connectUsbExclusive(expected, searchTargetId);\n } finally {\n release?.();\n }\n }\n\n private async _connectUsbExclusive(\n expected: {\n expectedWalletId?: string;\n expectedMasterFingerprint?: string;\n },\n searchTargetId?: string\n ): Promise<Response<DeviceInfo>> {\n if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.TransportNotAvailable,\n 'No USB connector configured for this Keystone adapter'\n );\n }\n let sessionId: string | undefined;\n try {\n let connectTarget: ConnectorConnectTarget = { type: 'default' };\n if (searchTargetId) {\n connectTarget = { type: 'search-target', searchTargetId };\n } else if (expected.expectedMasterFingerprint) {\n connectTarget = {\n type: 'expected-device-identity',\n deviceIdentity: expected.expectedMasterFingerprint,\n };\n }\n const connector = this._usbConnector;\n const session = await (connector.connectTarget\n ? connector.connectTarget(connectTarget)\n : connector.connect(searchTargetId ?? expected.expectedMasterFingerprint));\n sessionId = session.sessionId;\n const raw = session.deviceInfo.raw as { masterFingerprint?: unknown } | undefined;\n const mfpValue = parseBip32MasterFingerprint(raw?.masterFingerprint);\n if (!mfpValue) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone USB did not report a master fingerprint',\n });\n }\n const masterFingerprint = mfpValue.toLowerCase();\n if (\n expected.expectedMasterFingerprint &&\n masterFingerprint !== expected.expectedMasterFingerprint\n ) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Connected Keystone wallet (mfp ${masterFingerprint}) does not match the requested wallet fingerprint (${expected.expectedMasterFingerprint})`,\n });\n }\n\n const identityRequest = this.urEngine.buildKeyDerivationRequest({\n schemas: [{ path: KEYSTONE_WALLET_ID_PATH, curve: 'secp256k1' }],\n origin: this._origin,\n });\n const identityResult = await this._callUsbConnector(\n session.sessionId,\n 'resolveUr',\n identityRequest\n );\n if (!identityResult.success) {\n throw rehydrateConnectorError(identityResult.error);\n }\n const parsed = this.urEngine.parseAccountResponse(identityResult.payload as KeystoneUr);\n this._assertParsedIdentity(parsed, {\n ...expected,\n expectedMasterFingerprint: expected.expectedMasterFingerprint ?? masterFingerprint,\n });\n const walletId = deriveKeystoneWalletId(parsed.accounts);\n const previousUsbSessionId = this._devices.get(walletId)?.usbSessionId;\n const record = this._upsertDeviceRecord(parsed, {\n viaUsb: true,\n usbSessionId: session.sessionId,\n });\n if (previousUsbSessionId && previousUsbSessionId !== session.sessionId) {\n try {\n await this._usbConnector.disconnect(previousUsbSessionId);\n } catch {\n // The replacement session is authoritative even if stale teardown fails.\n }\n }\n record.hadUsbSession = true;\n record.model = session.deviceInfo.modelName ?? session.deviceInfo.model ?? record.model;\n record.deviceVersion = session.deviceInfo.firmwareVersion ?? record.deviceVersion;\n const info = toDeviceInfo(record);\n return success(info);\n } catch (err) {\n if (sessionId) {\n try {\n await this._usbConnector.disconnect(sessionId);\n } catch {\n // Preserve the identity/export failure; teardown is best-effort.\n }\n }\n return this._errorToFailure<DeviceInfo>(err);\n }\n }\n\n /**\n * Probe already-authorized USB devices without opening a permission picker,\n * then attach and verify the requested wallet when one is present. This is\n * used both after an adapter restart and after a QR-only period, so plugging\n * USB back in affects the next business call without changing an in-flight\n * QR operation.\n */\n private async _tryUsbAttach(\n expectedWalletId?: string,\n expectedMasterFingerprint?: string,\n options?: { waitForReenumeration?: boolean }\n ): Promise<KeystoneDeviceRecord | undefined> {\n if (!expectedWalletId || this._forcedTransport === 'qr' || !this._usbConnector) {\n return undefined;\n }\n\n const maxAttempts = options?.waitForReenumeration ? KEYSTONE_USB_REATTACH_PROBE_ATTEMPTS : 1;\n let availableDevices: ConnectorDevice[] = [];\n let lastSearchError: unknown;\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n // eslint-disable-next-line no-await-in-loop\n availableDevices = await this._usbConnector.searchDevices({ purpose: 'availability' });\n lastSearchError = undefined;\n } catch (error) {\n lastSearchError = error;\n }\n if (availableDevices.length) {\n break;\n }\n if (attempt < maxAttempts) {\n // eslint-disable-next-line no-await-in-loop\n await waitForKeystoneUsbReattachProbe();\n }\n }\n if (!availableDevices.length) {\n if (this._forcedTransport === 'usb' && lastSearchError) {\n throw lastSearchError instanceof Error\n ? lastSearchError\n : new Error(String(lastSearchError));\n }\n return undefined;\n }\n\n // Enumeration retries are silent. Perform the identity handshake only\n // once so a temporarily unhealthy channel cannot flash the device's\n // connection approval screen four times.\n let attached: Response<DeviceInfo> | undefined;\n let record: KeystoneDeviceRecord | undefined;\n const candidates = expectedMasterFingerprint ? [undefined] : availableDevices;\n for (const device of candidates) {\n // A cold adapter has only the persisted wallet id, not the short master\n // fingerprint. Probe each exact discovery target and verify the fixed\n // identity xpub before any business/signing request is dispatched.\n // eslint-disable-next-line no-await-in-loop\n attached = await this._connectUsb(\n { expectedWalletId, expectedMasterFingerprint },\n device?.connectId\n );\n if (attached.success) {\n record = this._devices.get(expectedWalletId);\n if (record) break;\n }\n }\n return record;\n }\n\n /**\n * The one place that decides QR vs. USB for a UR round trip and carries it\n * out. `record` is the (possibly not-yet-existing, for a true cold start)\n * device row for the target wallet. USB is the preferred channel: a known\n * wallet record with no live session gets ONE best-effort re-attach here,\n * and anything that goes wrong just leaves the call on QR. A\n * `switchTransport('qr')` pin forces QR even for a USB-attached wallet;\n * `switchTransport('usb')` on a wallet with no live USB session fails\n * closed rather than silently falling back to QR.\n */\n private async _resolveUr(\n record: KeystoneDeviceRecord | undefined,\n requestUr: KeystoneUr,\n animated: boolean,\n operationId: string | undefined,\n signal: AbortSignal,\n operationName?: string\n ): Promise<KeystoneUr> {\n const releaseOperationRetention = isHardwareOperationId(operationId)\n ? this._operations.retain(operationId)\n : undefined;\n try {\n return await this._resolveUrWithRoute(\n record,\n requestUr,\n animated,\n operationId,\n signal,\n operationName\n );\n } finally {\n releaseOperationRetention?.();\n }\n }\n\n private async _resolveUrWithRoute(\n record: KeystoneDeviceRecord | undefined,\n requestUr: KeystoneUr,\n animated: boolean,\n operationId: string | undefined,\n signal: AbortSignal,\n operationName?: string\n ): Promise<KeystoneUr> {\n let interactionRoute: { operationId: string; connectionType: 'usb' | 'qr' } | undefined;\n if (isHardwareOperationId(operationId)) {\n const operation = this._operations.resolve(operationId);\n const route = this._operationRoutes.get(operation.connectId);\n if (!route || route.operationId !== operationId) {\n this._operations.end(operationId, 'disconnect');\n throw createHwkError({\n code: HardwareErrorCode.OperationEnded,\n message: 'Keystone hardware operation is no longer connected',\n params: { operationId, reason: 'disconnect' },\n });\n }\n interactionRoute = route;\n }\n // USB is the preferred channel, so a record with no live session gets one\n // best-effort attempt to (re)attach before anything falls back to QR. This\n // covers an expired or physically disconnected USB session while the\n // adapter still knows the wallet. Cold adapter restarts are handled in\n // `_tryUsbAttach` before this method is called.\n //\n // Best-effort is the whole point — a failure here (nothing plugged in, a\n // different wallet on the bus, permission not granted) must NOT surface.\n // Leaving `usbSessionId` unset makes the code below route to QR on its\n // own, which is exactly the desired fallback: no error dialog, no retry\n // button, the user just gets the QR they would have gotten anyway.\n // Skipped when the caller pinned a transport explicitly.\n if (\n !interactionRoute &&\n !this._forcedTransport &&\n record &&\n !record.usbSessionId &&\n this._usbConnector\n ) {\n await this._tryUsbAttach(record.walletId, record.masterFingerprint, {\n waitForReenumeration: record.hadUsbSession,\n });\n }\n\n const wantUsb = interactionRoute\n ? interactionRoute.connectionType === 'usb'\n : this._forcedTransport === 'usb' ||\n (this._forcedTransport !== 'qr' && Boolean(record?.usbSessionId));\n if (wantUsb) {\n if (!record?.usbSessionId || !this._usbConnector) {\n if (interactionRoute) {\n this._operations.end(interactionRoute.operationId, 'disconnect');\n throw createHwkError({\n code: HardwareErrorCode.OperationEnded,\n message: 'Keystone operation USB connection was lost',\n params: {\n operationId: interactionRoute.operationId,\n reason: 'disconnect',\n },\n });\n }\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'USB channel is not connected for this Keystone wallet',\n });\n }\n const result = await this._callUsbConnector(\n record.usbSessionId,\n 'resolveUr',\n requestUr,\n signal\n );\n if (result.success) return result.payload as KeystoneUr;\n\n const usbError = rehydrateConnectorError(result.error);\n const usbErrorOrigin = (usbError as Error & { origin?: string }).origin;\n const usbErrorCode = (usbError as Error & { code?: number }).code;\n if (\n !interactionRoute &&\n !this._forcedTransport &&\n usbErrorCode === HardwareErrorCode.PayloadTooLarge &&\n usbErrorOrigin !== 'device'\n ) {\n const displayDevice = toDeviceInfo(record);\n return this._requestQrDisplayAndAwaitResponse(displayDevice, {\n ...requestUr,\n animated,\n });\n }\n // Deliberately does NOT retry over QR. By this point the request has\n // been put on the wire and the device may well be mid-operation —\n // showing a passphrase keyboard or a confirm screen. Swapping channels\n // here throws away work the user is in the middle of and asks them to\n // redo it a different way, which is worse than either succeeding or\n // failing. Channel selection happens once, before the request goes out.\n //\n // The case this used to cover — a cable pulled after connect, leaving a\n // stale session — is now handled at its source: the connector wires the\n // transport's disconnect listener, so an unplug drops the session and\n // the next call takes the attach path (which does fall back to QR).\n // Keep the session when the DEVICE answered. Declining on screen, a\n // locked device, the wrong wallet — none of those say anything about the\n // cable, and dropping the session there is what made \"cancel, then\n // retry and confirm\" impossible: the retry no longer had a live session\n // to reuse and had to re-open the transport from scratch. Only a failure\n // of the pipe itself makes the session untrustworthy.\n //\n // `origin` is authoritative when the mapper stamped it; the code list\n // below is the legacy fallback for errors that predate the field.\n const deviceAnswered =\n usbErrorOrigin !== undefined\n ? usbErrorOrigin === 'device'\n : usbErrorCode === HardwareErrorCode.UserRejected ||\n usbErrorCode === HardwareErrorCode.UserAborted ||\n usbErrorCode === HardwareErrorCode.DeviceLocked ||\n usbErrorCode === HardwareErrorCode.DeviceMismatch;\n if (!deviceAnswered) {\n // The pipe failed, not the device. Hand the session back to the\n // connector so its transport and disconnect listener are released and\n // the host hears the wallet drop to QR-only; `_handleUsbDisconnect`\n // clears `usbSessionId` on the way through.\n const lostSessionId = record.usbSessionId;\n if (lostSessionId) {\n this._usbConnector?.disconnect(lostSessionId).catch(() => undefined);\n }\n record.usbSessionId = undefined;\n if (interactionRoute) {\n this._operations.end(interactionRoute.operationId, 'disconnect');\n throw createHwkError({\n code: HardwareErrorCode.OperationEnded,\n message: operationName\n ? `Keystone ${operationName} may have completed before the USB connection was lost`\n : 'Keystone operation USB connection was lost',\n recovery: operationName ? { scope: 'unknown' } : undefined,\n params: operationName\n ? operationMayHaveCompletedParams(operationName, {\n operationId: interactionRoute.operationId,\n reason: 'disconnect',\n })\n : {\n operationId: interactionRoute.operationId,\n reason: 'disconnect',\n },\n });\n }\n if (operationName) {\n throw createHwkError({\n code: (usbErrorCode as HardwareErrorCode) ?? HardwareErrorCode.TransportError,\n message: `Keystone ${operationName} may have completed before the USB connection was lost`,\n origin: 'transport',\n recovery: { scope: 'unknown' },\n params: operationMayHaveCompletedParams(operationName),\n });\n }\n }\n throw usbError;\n }\n\n const displayDevice = record ? toDeviceInfo(record) : placeholderDeviceInfo();\n try {\n return await this._requestQrDisplayAndAwaitResponse(displayDevice, {\n ...requestUr,\n animated,\n });\n } catch (error) {\n const { code, _tag: tag } = error as { code?: unknown; _tag?: unknown };\n if (\n operationName &&\n (code === HardwareErrorCode.OperationTimeout || tag === UI_REQUEST_TIMEOUT_TAG)\n ) {\n throw createHwkError({\n code: HardwareErrorCode.OperationTimeout,\n message: `Keystone ${operationName} may have completed before the QR response timed out`,\n recovery: { scope: 'unknown' },\n params: operationMayHaveCompletedParams(operationName),\n });\n }\n throw error;\n }\n }\n\n /**\n * Fetch one account's key material from the device for this operation only.\n * `book` lets earlier fetches of the same operation be reused; nothing is\n * retained on the record. A failed USB export ends this operation without\n * replaying the request or switching transports.\n */\n private async _fetchAccount(\n connectId: string | undefined,\n deviceId: string | undefined,\n hwkChain: ChainCapability,\n syncPath: string,\n signal: AbortSignal,\n options?: {\n book?: AccountBook;\n }\n ): Promise<{ record: KeystoneDeviceRecord; account: KeystoneAccountEntry }> {\n const target = this._resolveTarget(connectId, deviceId);\n const key = accountKey(hwkChain, syncPath);\n\n let existingRecord = target.record;\n if (!existingRecord) {\n const attached = await this._tryUsbAttach(target.expectedWalletId);\n KeystoneAdapter._throwIfAborted(signal);\n existingRecord = attached;\n }\n const book = options?.book;\n const booked = book?.get(key);\n if (existingRecord && booked) {\n return { record: existingRecord, account: booked };\n }\n if (existingRecord && !existingRecord.usbSessionId && this._forcedTransport === 'usb') {\n // Pinned to USB without a session: attach here so enumeration errors\n // surface (resolveUr skips its probe for pinned transports).\n await this._tryUsbAttach(existingRecord.walletId, existingRecord.masterFingerprint, {\n waitForReenumeration: existingRecord.hadUsbSession,\n });\n KeystoneAdapter._throwIfAborted(signal);\n existingRecord = this._devices.get(existingRecord.walletId) ?? existingRecord;\n }\n\n // Match the proven browser-demo flow: USB exports one missing account path\n // per request, while QR keeps its batched import flow. The all-network API\n // still returns one result bundle after these per-chain calls complete.\n const useSinglePathUsbExport =\n this._forcedTransport !== 'qr' && Boolean(existingRecord?.usbSessionId);\n const requestedSchemaPaths: Array<{ hwkChain: ChainCapability; path: string }> = [\n { hwkChain, path: syncPath },\n ];\n const schemaPaths =\n useSinglePathUsbExport ||\n requestedSchemaPaths.some(schema => normalizePath(schema.path) === KEYSTONE_WALLET_ID_PATH)\n ? requestedSchemaPaths\n : [{ hwkChain: 'evm' as const, path: KEYSTONE_WALLET_ID_PATH }, ...requestedSchemaPaths];\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: schemaPaths.map(s => ({\n path: s.path,\n curve: s.hwkChain === 'sol' ? 'ed25519' : 'secp256k1',\n })),\n origin: this._origin,\n });\n const resolvedViaUsb = useSinglePathUsbExport;\n const responseUr = await this._resolveUr(existingRecord, requestUr, false, connectId, signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n let record: KeystoneDeviceRecord;\n if (resolvedViaUsb && existingRecord) {\n if (parsed.masterFingerprint !== existingRecord.masterFingerprint) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone USB account export returned a different master fingerprint',\n });\n }\n record = existingRecord;\n } else {\n this._assertParsedIdentity(parsed, target);\n record = this._upsertDeviceRecord(parsed, {\n viaUsb: Boolean(existingRecord?.usbSessionId),\n });\n }\n const account = parsed.accounts.find(a => normalizePath(a.path) === syncPath);\n if (!account) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Keystone did not return the requested derivation path (${syncPath})`,\n });\n }\n const entry: KeystoneAccountEntry = { ...account, hwkChain };\n if (book) {\n // Everything the device answered stays usable for this operation.\n for (const returned of parsed.accounts) {\n const returnedChain = inferHwkChainFromPath(returned.path);\n if (returnedChain) {\n book.set(accountKey(returnedChain, returned.path), {\n ...returned,\n hwkChain: returnedChain,\n });\n }\n }\n book.set(key, entry);\n }\n return { record, account: entry };\n }\n\n /**\n * Like `_fetchAccount`, but for operations (PSBT signing, master\n * fingerprint) that only need to know WHICH wallet is attached, not a\n * specific cached path. Syncs the account-level path for `chain` as a\n * throwaway probe when the wallet record isn't already known.\n *\n * `CHAIN_FINGERPRINT_PATHS[chain]` is a 5-segment LEAF path for `evm`\n * (`m/44'/60'/0'/0/0`) — sending that verbatim as a KeyDerivation request\n * asks Keystone for a non-standard path. Keystone's own docs\n * (dev.keyst.one's multichain KeyDerivation example) show the ETH\n * account-level path as `m/44'/60'/0'` (3 segments), same as what\n * `_fetchAccount` already requests — so\n * truncate through `splitAccountPath` here too instead of using the raw\n * fingerprint leaf path. `btc`/`sol` are already 3-segment account paths\n * and pass through unchanged.\n */\n private async _ensureWalletKnown(\n connectId: string | undefined,\n deviceId: string | undefined,\n chain: ChainForFingerprint,\n signal: AbortSignal\n ): Promise<{ record: KeystoneDeviceRecord }> {\n const target = this._resolveTarget(connectId, deviceId);\n if (target.record) return { record: target.record };\n\n const attached = await this._tryUsbAttach(target.expectedWalletId);\n KeystoneAdapter._throwIfAborted(signal);\n if (attached) return { record: attached };\n\n // No known or restorable USB record remains, so continue with QR.\n const { accountPath } = splitAccountPath(CHAIN_FINGERPRINT_PATHS[chain]);\n const schemas =\n accountPath === KEYSTONE_WALLET_ID_PATH\n ? [{ path: KEYSTONE_WALLET_ID_PATH, curve: 'secp256k1' as const }]\n : [\n { path: KEYSTONE_WALLET_ID_PATH, curve: 'secp256k1' as const },\n {\n path: accountPath,\n curve: chain === 'sol' ? ('ed25519' as const) : ('secp256k1' as const),\n },\n ];\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas,\n origin: this._origin,\n });\n const responseUr = await this._resolveUr(undefined, requestUr, false, connectId, signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n this._assertParsedIdentity(parsed, target);\n const record = this._upsertDeviceRecord(parsed);\n return { record };\n }\n\n private async _requestQrDisplayAndAwaitResponse(\n device: DeviceInfo,\n data: QrDisplayData\n ): Promise<KeystoneUr> {\n const waitPromise = this._uiRegistry.wait<{ urType: string; urData: string }>(\n UI_REQUEST.REQUEST_QR_DISPLAY,\n { timeoutMs: this._qrTimeoutMs }\n );\n this.emitter.emit(UI_REQUEST.REQUEST_QR_DISPLAY, {\n type: UI_REQUEST.REQUEST_QR_DISPLAY,\n payload: { device, data },\n });\n const response = await waitPromise;\n return { urType: response.urType, urData: response.urData };\n }\n\n private async _requestQrScanAndAwaitResponse(device: DeviceInfo): Promise<KeystoneUr> {\n const waitPromise = this._uiRegistry.wait<{ urType: string; urData: string }>(\n UI_REQUEST.REQUEST_QR_SCAN,\n { timeoutMs: this._qrTimeoutMs }\n );\n this.emitter.emit(UI_REQUEST.REQUEST_QR_SCAN, {\n type: UI_REQUEST.REQUEST_QR_SCAN,\n payload: { device },\n });\n const response = await waitPromise;\n return { urType: response.urType, urData: response.urData };\n }\n\n private async _callUsbConnector(\n sessionId: string,\n method: string,\n params: unknown,\n signal?: AbortSignal\n ): Promise<ConnectorCallResult> {\n if (!this._usbConnector) {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'No USB connector configured for this Keystone adapter',\n });\n }\n if (this._pendingUsbTeardowns > 0 || this._unsettledUsbOperations.size > 0) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceBusyInternal,\n message: `Keystone USB is busy while calling ${method}`,\n });\n }\n const releaseOperation = this._retainUsbOperation(`call:${sessionId}`);\n let rawCall: Promise<ConnectorCallResult>;\n try {\n const connector = this._usbConnector;\n rawCall = connector.call(sessionId, method, params).finally(releaseOperation);\n } catch (error) {\n releaseOperation();\n throw error;\n }\n return signal ? KeystoneAdapter._abortable(signal, rawCall) : rawCall;\n }\n\n private _runUsbTeardown(task: () => Promise<void>): Promise<void> {\n const previous = this._usbTeardownTail;\n let releaseTail: () => void = () => undefined;\n this._usbTeardownTail = new Promise<void>(resolve => {\n releaseTail = resolve;\n });\n this._pendingUsbTeardowns += 1;\n return (async () => {\n try {\n await previous;\n await this._waitForUsbOperationsToDrain();\n await task();\n } finally {\n this._pendingUsbTeardowns -= 1;\n releaseTail();\n }\n })();\n }\n\n private _waitForUsbOperationsToDrain(): Promise<void> {\n if (this._unsettledUsbOperations.size === 0) return Promise.resolve();\n return new Promise(resolve => {\n this._usbIdleWaiters.add(resolve);\n });\n }\n\n private _retainUsbOperation(key: string): () => void {\n this._unsettledUsbOperations.set(key, (this._unsettledUsbOperations.get(key) ?? 0) + 1);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const remaining = (this._unsettledUsbOperations.get(key) ?? 1) - 1;\n if (remaining > 0) {\n this._unsettledUsbOperations.set(key, remaining);\n } else {\n this._unsettledUsbOperations.delete(key);\n }\n if (this._unsettledUsbOperations.size === 0) {\n for (const resolve of this._usbIdleWaiters) resolve();\n this._usbIdleWaiters.clear();\n }\n };\n }\n\n private static _abortable<T>(signal: AbortSignal, promise: Promise<T>): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(signal.reason instanceof Error ? signal.reason : new Error('Aborted'));\n }\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n reject(signal.reason instanceof Error ? signal.reason : new Error('Aborted'));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n value => {\n signal.removeEventListener('abort', onAbort);\n resolve(value);\n },\n error => {\n signal.removeEventListener('abort', onAbort);\n reject(error);\n }\n );\n });\n }\n\n private static _throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw signal.reason instanceof Error ? signal.reason : new Error('Operation aborted');\n }\n }\n\n private static _assertRequestIdMatches(expected: string, actual?: string): void {\n if (actual && actual.toLowerCase() !== expected.toLowerCase()) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message:\n 'Keystone response requestId does not match the pending request — discarding a stale or unrelated scan',\n });\n }\n }\n\n private _unsupported<T>(method: string, reason: string): Promise<Response<T>> {\n return Promise.resolve(\n failure(\n HardwareErrorCode.MethodNotSupported,\n `KeystoneAdapter.${method} is not implemented yet: ${reason}`\n )\n );\n }\n\n private _errorToFailure<T>(err: unknown): Response<T> {\n if (err && typeof err === 'object') {\n const e = err as {\n code?: unknown;\n message?: string;\n params?: Record<string, unknown>;\n _tag?: string;\n recovery?: unknown;\n };\n if (typeof e.code === 'number') {\n const { origin } = e as { origin?: unknown };\n return failure(\n e.code as HardwareErrorCode,\n e.message ?? 'Unknown error',\n e.params,\n origin === 'device' || origin === 'transport' || origin === 'host' ? origin : undefined,\n isHwkRecoveryHint(e.recovery) ? e.recovery : undefined\n );\n }\n if (e._tag === UI_REQUEST_CANCELLED_TAG || e._tag === UI_REQUEST_PREEMPTED_TAG) {\n return failure(\n HardwareErrorCode.UserAborted,\n e.message ?? 'Keystone QR operation was cancelled'\n );\n }\n if (e._tag === UI_REQUEST_TIMEOUT_TAG) {\n return failure(\n HardwareErrorCode.OperationTimeout,\n e.message ?? 'Keystone QR operation timed out'\n );\n }\n }\n const message = err instanceof Error ? err.message : String(err);\n // An unrecognized JS error (not a coded HwkError) reaching here is\n // usually a real bug, not a device/user condition — keep the stack so\n // the app/demo can surface it without needing a debugger attached.\n const params = err instanceof Error && err.stack ? { stack: err.stack } : undefined;\n return failure(HardwareErrorCode.UnknownError, message, params);\n }\n}\n","import { deriveWalletId } from '@onekeyfe/hwk-adapter-core';\n\nimport { normalizePath } from './pathUtils';\n\nimport type { KeystoneParsedAccount } from '../urEngine/types';\nimport type { ChainCapability, DeviceCapabilities, DeviceInfo } from '@onekeyfe/hwk-adapter-core';\n\nexport const KEYSTONE_WALLET_CONNECT_ID_PREFIX = 'keystone-wallet:';\n\n/** Fixed public source used to derive a collision-resistant wallet id. */\nexport const KEYSTONE_WALLET_ID_PATH = \"m/44'/60'/0'\";\n\nexport function walletConnectId(walletId: string): string {\n return `${KEYSTONE_WALLET_CONNECT_ID_PREFIX}${walletId}`;\n}\n\nexport interface KeystoneAccountEntry extends KeystoneParsedAccount {\n hwkChain: ChainCapability;\n}\n\nexport function accountKey(hwkChain: ChainCapability, path: string): string {\n return `${hwkChain}:${normalizePath(path)}`;\n}\n\nexport interface KeystoneDeviceRecord {\n /** SHA-256 id derived from the fixed account-level identity xpub. */\n walletId: string;\n /** Lowercase 8-char BIP32 fingerprint used by BC-UR as xfp, never as identity. */\n masterFingerprint: string;\n connectId: string;\n /** Optional physical-device id exposed by some Keystone QR export menus. */\n hardwareDeviceId?: string;\n /** Model string from the device (e.g. \"Keystone 3 Pro\"); not unique per unit. */\n model?: string;\n deviceVersion?: string;\n importedAt: number;\n /**\n * Set to the connector's process-local `sessionId` once a live USB session exists for\n * this wallet. Cleared by `releaseOperation`. Presence of this field is\n * what `KeystoneAdapter._resolveUr` uses to route a call over USB instead\n * of QR.\n */\n usbSessionId?: string;\n /**\n * Remains true after a live USB session is lost. It allows the adapter to\n * wait through the device's short USB re-enumeration window without making\n * wallets that have only ever used QR pay the same retry delay.\n */\n hadUsbSession?: boolean;\n /**\n * True once this wallet has completed at least one QR round trip.\n * Distinguishes \"USB session dropped but this wallet was also QR-synced —\n * fall back to a QR-only entry\" from \"this was a USB-only wallet that\n * never synced over QR — drop the entry entirely\" on USB disconnect.\n */\n qrSynced?: boolean;\n}\n\nexport function deriveKeystoneWalletId(accounts: KeystoneParsedAccount[]): string {\n const identityAccount = accounts.find(\n account => normalizePath(account.path) === KEYSTONE_WALLET_ID_PATH\n );\n if (!identityAccount?.extendedPublicKey) {\n throw new Error(\n `Keystone identity response is missing the extended public key at ${KEYSTONE_WALLET_ID_PATH}`\n );\n }\n return deriveWalletId(\n `keystone:secp256k1:${KEYSTONE_WALLET_ID_PATH}:${identityAccount.extendedPublicKey.trim()}`\n );\n}\n\nexport function createDeviceRecord(\n walletId: string,\n masterFingerprint: string\n): KeystoneDeviceRecord {\n return {\n walletId,\n masterFingerprint,\n connectId: walletConnectId(walletId),\n importedAt: Date.now(),\n };\n}\n\nconst CAPABILITIES: DeviceCapabilities = { persistentDeviceIdentity: true };\n\nexport function toDeviceInfo(record: KeystoneDeviceRecord): DeviceInfo {\n // `connectionType` reflects the channel a call would currently be routed\n // over (USB preferred when live — see `KeystoneAdapter._resolveUr`), not\n // just \"however this record was first created\". `raw.availableChannels`\n // carries the full picture for a merged (QR + USB) wallet — see §4.2 of\n // docs/design/keystone-integration/README.md.\n let availableChannels: Array<'qr' | 'usb'> = ['qr'];\n if (record.usbSessionId) {\n availableChannels = record.qrSynced ? ['qr', 'usb'] : ['usb'];\n }\n return {\n vendor: 'keystone',\n model: record.model ?? 'unknown',\n modelName: record.model,\n firmwareVersion: record.deviceVersion ?? '0.0.0',\n deviceId: record.walletId,\n connectId: record.connectId,\n connectionType: record.usbSessionId ? 'usb' : 'qr',\n capabilities: CAPABILITIES,\n raw: {\n availableChannels,\n masterFingerprint: record.masterFingerprint,\n hardwareDeviceId: record.hardwareDeviceId,\n },\n };\n}\n\n/** A device row for a wallet the adapter hasn't synced yet — used while a cold-start round trip is in flight. */\nexport function placeholderDeviceInfo(): DeviceInfo {\n return {\n vendor: 'keystone',\n model: 'unknown',\n firmwareVersion: '0.0.0',\n deviceId: '',\n connectId: '',\n connectionType: 'qr',\n capabilities: CAPABILITIES,\n };\n}\n","import type { BtcScriptType } from '../urEngine/types';\n\n/** Always returns an `m/`-prefixed path, regardless of the input's casing/prefix. */\nexport function normalizePath(path: string): string {\n const trimmed = path.trim();\n return /^m\\//i.test(trimmed) ? `m/${trimmed.slice(2)}` : `m/${trimmed}`;\n}\n\n/**\n * Split a full BIP-44 leaf path (`purpose'/coin'/account'/change/index`, 5\n * segments) into its 3-segment account path and the relative `change/index`\n * path from that account to the leaf. Matches the OneKey Keystone air-gap\n * demo's `removePathLastSegment({removeCount: 2})` convention, which is\n * verified against real Keystone hardware.\n *\n * A path with 3 or fewer segments IS already an account path (or shorter) —\n * BIP-44's account level is exactly 3 hardened components — so there is\n * nothing to split off: `relativeDerivePath` is empty and `accountPath` is\n * the (normalized) input unchanged.\n */\nexport function splitAccountPath(path: string): {\n accountPath: string;\n relativeDerivePath: string;\n} {\n const normalized = normalizePath(path);\n const segments = normalized.slice(2).split('/');\n if (segments.length <= 3) {\n return { accountPath: normalized, relativeDerivePath: '' };\n }\n const accountSegments = segments.slice(0, segments.length - 2);\n const relativeSegments = segments.slice(segments.length - 2);\n return {\n accountPath: `m/${accountSegments.join('/')}`,\n relativeDerivePath: relativeSegments.join('/'),\n };\n}\n\n/**\n * Standard BIP-44/49/84/86 purpose → script-type mapping. Returns `undefined`\n * for a path whose purpose isn't one of these four (or isn't parseable),\n * rather than guessing.\n */\nexport function btcScriptTypeFromPath(path: string): BtcScriptType | undefined {\n const match = normalizePath(path).match(/^m\\/(\\d+)'/);\n if (!match) return undefined;\n switch (Number(match[1])) {\n case 44:\n return 'p2pkh';\n case 49:\n return 'p2sh-p2wpkh';\n case 84:\n return 'p2wpkh';\n case 86:\n return 'p2tr';\n default:\n return undefined;\n }\n}\n\n/**\n * Keystone firmware signs BTC only against account-0 xpubs (gui_btc.c\n * PreparePublicKeys). Testnet (coin 1') is excluded on top of that: this\n * package derives every BTC address with mainnet parameters, so admitting a\n * testnet path would hand back a mainnet address for a testnet account.\n */\nexport function isKeystoneSignableBtcAccountPath(accountPath: string): boolean {\n const segments = normalizePath(accountPath).slice(2).split('/');\n if (segments.length !== 3) return false;\n const [purpose, coin, account] = segments;\n return [\"44'\", \"49'\", \"84'\", \"86'\"].includes(purpose) && coin === \"0'\" && account === \"0'\";\n}\n\nexport const KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE =\n \"Keystone BTC is limited to mainnet account 0 (m/44'|49'|84'|86'/0'/0')\";\n"],"mappings":"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","names":["import_bc_ur_registry","decodeToDataItem","decodeToDataItem","HDKey","uuidParse","uuidStringify","bs58check","import_uuid","import_hwk_adapter_core","import_hwk_adapter_core","resolveGenericHardwareOperationTarget","uuidv4","bs58","missingSchemas","displayDevice"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/urEngine/KeystoneUrEngine.ts","../src/urEngine/TronSignRequest.ts","../src/urEngine/TronSignature.ts","../src/adapter/KeystoneAdapter.ts","../src/adapter/deviceTable.ts","../src/adapter/pathUtils.ts"],"sourcesContent":["// UR engine (used by the QR event loop and the USB connector alike — both\n// channels carry the same UR payloads).\nexport { KeystoneUrEngine } from './urEngine/KeystoneUrEngine';\nexport type {\n BtcScriptType,\n KeystoneBtcSignatureResult,\n KeystoneBtcSignRequestAccount,\n KeystoneDerivationCurve,\n KeystoneEthSignatureResult,\n KeystoneEthSignRequestInput,\n KeystoneKeyDerivationRequestInput,\n KeystoneKeySchema,\n KeystoneParsedAccount,\n KeystoneParsedMultiAccounts,\n KeystoneSolSignatureResult,\n KeystoneSolSignRequestInput,\n KeystoneTronSignatureResult,\n KeystoneTronSignRequestInput,\n KeystoneUr,\n} from './urEngine/types';\n\n// Adapter\nexport { KeystoneAdapter } from './adapter/KeystoneAdapter';\nexport type { ImportFromQrOptions } from './adapter/KeystoneAdapter';\nexport {\n KEYSTONE_WALLET_CONNECT_ID_PREFIX,\n KEYSTONE_WALLET_ID_PATH,\n accountKey,\n createDeviceRecord,\n deriveKeystoneWalletId,\n placeholderDeviceInfo,\n toDeviceInfo,\n walletConnectId,\n} from './adapter/deviceTable';\nexport type { KeystoneAccountEntry, KeystoneDeviceRecord } from './adapter/deviceTable';\nexport { btcScriptTypeFromPath, normalizePath, splitAccountPath } from './adapter/pathUtils';\n","import { generateAddressFromXpub } from '@keystonehq/bc-ur-registry-eth';\nimport { Curve, KeystoneSDK, QRHardwareCallVersion, UR } from '@keystonehq/keystone-sdk';\nimport bs58check from 'bs58check';\nimport * as bitcoin from 'bitcoinjs-lib';\nimport HDKey from 'hdkey';\nimport { parse as uuidParse, stringify as uuidStringify } from 'uuid';\nimport { parseBip32MasterFingerprint } from '@onekeyfe/hwk-adapter-core';\n\nimport { TronSignRequest, TronSignType } from './TronSignRequest';\nimport { TronSignature } from './TronSignature';\n\nimport type {\n BtcScriptType,\n KeystoneBtcSignRequestAccount,\n KeystoneBtcSignatureResult,\n KeystoneEthSignRequestInput,\n KeystoneEthSignatureResult,\n KeystoneKeyDerivationRequestInput,\n KeystoneParsedAccount,\n KeystoneParsedMultiAccounts,\n KeystoneSolSignRequestInput,\n KeystoneSolSignatureResult,\n KeystoneTronSignRequestInput,\n KeystoneTronSignatureResult,\n KeystoneUr,\n} from './types';\n\n/** TRON's own address-version byte, prepended before base58check encoding. */\nconst TRON_ADDRESS_PREFIX = 0x41;\n\nfunction stripHexPrefix(hex: string): string {\n return hex.replace(/^0x/i, '');\n}\n\nconst ETH_DATA_TYPE = {\n transaction: 1,\n typedData: 2,\n personalMessage: 3,\n typedTransaction: 4,\n} as const;\n\nconst DERIVATION_CURVE = {\n secp256k1: Curve.secp256k1,\n ed25519: Curve.ed25519,\n} as const;\n\nfunction toSdkUr(ur: KeystoneUr): UR {\n return new UR(Buffer.from(ur.urData, 'hex'), ur.urType);\n}\n\nfunction fromSdkUr(ur: UR): KeystoneUr {\n return { urType: ur.type, urData: ur.cbor.toString('hex') };\n}\n\n/** r(32) | s(32) | v(1). A short answer must fail here, not reach a caller as `v: ''`. */\nfunction splitSignature65(hex: string): { r: string; s: string; v: string } {\n if (hex.length !== 130) {\n throw new Error(\n `Keystone returned a ${hex.length / 2}-byte signature; expected 65 bytes (r|s|v)`\n );\n }\n return { r: hex.slice(0, 64), s: hex.slice(64, 128), v: hex.slice(128) };\n}\n\nfunction requireBip32MasterFingerprint(value: unknown): string {\n const fingerprint = parseBip32MasterFingerprint(value);\n if (!fingerprint) {\n throw new Error('Keystone master fingerprint must be exactly 4 bytes (8 hex characters)');\n }\n return fingerprint;\n}\n\n/**\n * Single touch point with `@keystonehq/keystone-sdk`; the same UR building\n * and parsing serves QR and USB. Uses the bare constructor, not\n * `KeystoneSDK.create()`, which fetches remote config at call time.\n */\nexport class KeystoneUrEngine {\n private readonly sdk: KeystoneSDK;\n\n constructor(origin = 'OneKey') {\n this.sdk = new KeystoneSDK({ origin });\n }\n\n // --- Account sync (works for both a device-initiated QR export and a\n // wallet-initiated KeyDerivation request/response over either channel) ---\n\n parseMultiAccounts(ur: KeystoneUr): KeystoneParsedMultiAccounts {\n const parsed = this.sdk.parseMultiAccounts(toSdkUr(ur));\n return {\n masterFingerprint: requireBip32MasterFingerprint(parsed.masterFingerprint),\n device: parsed.device,\n deviceId: parsed.deviceId,\n deviceVersion: parsed.deviceVersion,\n accounts: parsed.keys.map(\n (key): KeystoneParsedAccount => ({\n chain: key.chain,\n path: key.path,\n publicKey: key.publicKey,\n extendedPublicKey: key.extendedPublicKey,\n xfp: key.xfp ? requireBip32MasterFingerprint(key.xfp) : undefined,\n name: key.name,\n })\n ),\n };\n }\n\n parseHDKey(ur: KeystoneUr): KeystoneParsedAccount {\n const key = this.sdk.parseHDKey(toSdkUr(ur));\n return {\n chain: key.chain,\n path: key.path,\n publicKey: key.publicKey,\n extendedPublicKey: key.extendedPublicKey,\n xfp: key.xfp ? requireBip32MasterFingerprint(key.xfp) : undefined,\n name: key.name,\n };\n }\n\n /**\n * Build a `qr-hardware-call` (KeyDerivation) request: the host asks for\n * specific paths instead of waiting for whatever the device happens to be\n * showing. The device replies with a `crypto-multi-accounts` UR — parse it\n * with `parseMultiAccounts`. Used for the implicit \"sync this wallet's xfp\n * before the first sign\" round trip as well as an explicit account import.\n *\n * `version: V1` is required — verified against real Keystone hardware and\n * `keystone3-firmware`'s `CheckHardwareCallRequestIsLegal` source: an\n * unversioned/V0 request is validated as a legacy Cardano-only request\n * (`m/1852'/1815'/...`) and firmware rejects every other chain's path with\n * `PRS_PARSING_ERROR` (device-shown message: \"路径不受支持\" / \"path not\n * supported\"), regardless of the path's shape. V1 is what actually enables\n * the general per-chain path whitelist (includes `m/44'/60'` for ETH, the\n * standard BTC purposes, etc.). The SDK itself defaults to V0 unless a\n * truthy `version` is passed — omitting this silently produces a request\n * every non-Cardano device rejects.\n */\n buildKeyDerivationRequest(input: KeystoneKeyDerivationRequestInput): KeystoneUr {\n const ur = this.sdk.generateKeyDerivationCall({\n schemas: input.schemas.map(schema => ({\n path: schema.path,\n curve: DERIVATION_CURVE[schema.curve ?? 'secp256k1'],\n })),\n origin: input.origin,\n version: QRHardwareCallVersion.V1,\n });\n return fromSdkUr(ur);\n }\n\n /**\n * Parse the response to a KeyDerivation request (or a device-initiated\n * account export): `crypto-multi-accounts` for a multi-schema request,\n * `crypto-hdkey` for a single-key response some firmware paths use instead.\n * Both are normalized to the same `KeystoneParsedMultiAccounts` shape — a\n * single `crypto-hdkey` becomes a one-entry account list, with its own\n * `origin.sourceFingerprint` promoted to `masterFingerprint` (correct for a\n * key derived directly from the seed, which every request this engine\n * builds asks for).\n */\n parseAccountResponse(ur: KeystoneUr): KeystoneParsedMultiAccounts {\n if (ur.urType === 'crypto-hdkey') {\n const account = this.parseHDKey(ur);\n if (!account.xfp) {\n throw new Error('Keystone crypto-hdkey response is missing its source fingerprint');\n }\n return {\n masterFingerprint: requireBip32MasterFingerprint(account.xfp),\n accounts: [account],\n };\n }\n return this.parseMultiAccounts(ur);\n }\n\n // --- EVM ---\n\n buildEthSignRequest(input: KeystoneEthSignRequestInput): KeystoneUr {\n const ur = this.sdk.eth.generateSignRequest({\n requestId: input.requestId,\n signData: input.unsignedTxHex,\n dataType: ETH_DATA_TYPE[input.dataType],\n path: input.path,\n xfp: input.xfp,\n chainId: input.chainId,\n address: input.address,\n origin: input.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseEthSignature(ur: KeystoneUr): KeystoneEthSignatureResult {\n const signature = this.sdk.eth.parseSignature(toSdkUr(ur));\n return { requestId: signature.requestId, ...splitSignature65(signature.signature) };\n }\n\n /**\n * Derive one EVM address offline from an already-synced account xpub —\n * verified against the same `@keystonehq/bc-ur-registry-eth` helper the\n * Keystone-based OneKey air-gap demo uses in production\n * (`generateAddressFromXpub`), so no unverified assumption about what a\n * leaf-path KeyDerivation request would return. `relativeDerivePath` is\n * relative to the xpub's own depth, e.g. `'0/0'` for an account xpub.\n */\n deriveEvmAddressFromXpub(xpub: string, relativeDerivePath: string): string {\n return generateAddressFromXpub(xpub, `m/${relativeDerivePath.replace(/^m\\//i, '')}`);\n }\n\n // --- BTC (PSBT transaction signing + plain message signing) ---\n\n /**\n * Derive one BTC address offline from an already-synced account xpub, the\n * same way `deriveEvmAddressFromXpub` does. Keystone's `CryptoHDKey`\n * always emits standard mainnet-xpub version bytes (`0488B21E`) regardless\n * of the account's purpose/script type (verified against\n * `@keystonehq/bc-ur-registry`'s `CryptoHDKey.getBip32Key`, which hardcodes\n * that version rather than switching to a SLIP-132 ypub/zpub prefix per\n * script type) — so `hdkey.fromExtendedKey` parses it correctly for every\n * `scriptType` without needing custom version bytes configured.\n *\n * `p2tr` is deliberately not handled: taproot output-key tweaking (BIP-341)\n * needs an elliptic-curve library wired via bitcoinjs-lib's `initEccLib`,\n * which this package doesn't set up yet — every other payment function\n * here needs no such library.\n */\n deriveBtcAddressFromXpub(\n xpub: string,\n relativeDerivePath: string,\n scriptType: BtcScriptType\n ): string {\n const node = HDKey.fromExtendedKey(xpub).derive(`m/${relativeDerivePath.replace(/^m\\//i, '')}`);\n if (!node.publicKey) throw new Error('HDKey derivation did not produce a public key');\n return this.deriveBtcAddressFromPublicKey(\n Buffer.from(node.publicKey).toString('hex'),\n scriptType\n );\n }\n\n deriveBtcAddressFromPublicKey(publicKeyHex: string, scriptType: BtcScriptType): string {\n const pubkey = Buffer.from(stripHexPrefix(publicKeyHex), 'hex');\n const network = bitcoin.networks.bitcoin;\n\n switch (scriptType) {\n case 'p2pkh': {\n const { address } = bitcoin.payments.p2pkh({ pubkey, network });\n if (!address) throw new Error('Failed to derive a P2PKH address from this public key');\n return address;\n }\n case 'p2sh-p2wpkh': {\n const { address } = bitcoin.payments.p2sh({\n redeem: bitcoin.payments.p2wpkh({ pubkey, network }),\n network,\n });\n if (!address)\n throw new Error('Failed to derive a P2SH-P2WPKH address from this public key');\n return address;\n }\n case 'p2wpkh': {\n const { address } = bitcoin.payments.p2wpkh({ pubkey, network });\n if (!address) throw new Error('Failed to derive a P2WPKH address from this public key');\n return address;\n }\n case 'p2tr':\n throw new Error(\n 'BTC P2TR (taproot) address derivation is not supported yet — needs an elliptic-curve library for BIP-341 tweaking'\n );\n default: {\n const exhaustive: never = scriptType;\n throw new Error(`Unsupported BTC script type: ${String(exhaustive)}`);\n }\n }\n }\n\n buildBtcPsbtRequest(unsignedPsbtHex: string): KeystoneUr {\n const ur = this.sdk.btc.generatePSBT(Buffer.from(unsignedPsbtHex, 'hex'));\n return fromSdkUr(ur);\n }\n\n /** Returns the hex-encoded (possibly still-unsigned-in-part) PSBT the device replied with. */\n parseBtcPsbt(ur: KeystoneUr): string {\n return this.sdk.btc.parsePSBT(toSdkUr(ur));\n }\n\n buildBtcMessageSignRequest(params: {\n requestId: string;\n /** Hex, no 0x prefix. */\n messageHex: string;\n accounts: KeystoneBtcSignRequestAccount[];\n origin?: string;\n }): KeystoneUr {\n const ur = this.sdk.btc.generateSignRequest({\n requestId: params.requestId,\n signData: params.messageHex,\n dataType: 1, // BtcSignRequest.DataType.message — PSBT signing never goes through this path.\n accounts: params.accounts,\n origin: params.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseBtcSignature(ur: KeystoneUr): KeystoneBtcSignatureResult {\n const signature = this.sdk.btc.parseSignature(toSdkUr(ur));\n return {\n requestId: signature.requestId,\n publicKey: signature.publicKey,\n signature: signature.signature,\n };\n }\n\n // --- SOL ---\n\n buildSolSignRequest(input: KeystoneSolSignRequestInput): KeystoneUr {\n const ur = this.sdk.sol.generateSignRequest({\n requestId: input.requestId,\n signData: input.unsignedPayloadHex,\n dataType: input.dataType === 'transaction' ? 1 : 2,\n path: input.path,\n xfp: input.xfp,\n address: input.address,\n origin: input.origin,\n });\n return fromSdkUr(ur);\n }\n\n parseSolSignature(ur: KeystoneUr): KeystoneSolSignatureResult {\n const signature = this.sdk.sol.parseSignature(toSdkUr(ur));\n return { requestId: signature.requestId, signature: signature.signature };\n }\n\n // --- TRON ---\n\n /**\n * Keystone's native tron-sign-request/tron-signature pair (bare signature).\n * `sdk.tron` from keystone-sdk is the older protobuf envelope; not used.\n */\n buildTronSignRequest(input: KeystoneTronSignRequestInput): KeystoneUr {\n const request = new TronSignRequest({\n requestId: Buffer.from(uuidParse(input.requestId) as Uint8Array),\n signData: Buffer.from(stripHexPrefix(input.rawTxHex), 'hex'),\n signType: input.signType ?? TronSignType.Transaction,\n derivationPath: TronSignRequest.parsePath(input.path, input.xfp),\n origin: input.origin,\n });\n return fromSdkUr(request.toUR());\n }\n\n parseTronSignature(ur: KeystoneUr): KeystoneTronSignatureResult {\n if (ur.urType !== 'tron-signature') {\n throw new Error(`Expected a tron-signature UR, got ${ur.urType}`);\n }\n const signature = TronSignature.fromCBOR(Buffer.from(ur.urData, 'hex'));\n const requestId = signature.getRequestId();\n return {\n requestId: requestId ? uuidStringify(requestId) : undefined,\n signature: signature.getSignature().toString('hex'),\n };\n }\n\n /**\n * Derive one TRON address offline from an already-synced account xpub.\n * TRON reuses EVM's exact secp256k1-pubkey → keccak256 → last-20-bytes\n * derivation (verified against Keystone's own `formatAddress()` in\n * `keystone-sdk`'s TRON chain source) — only the final text encoding\n * differs (base58check with a `0x41` version byte, not checksummed hex).\n * Reusing `generateAddressFromXpub` here means no new hashing dependency:\n * strip its \"0x\" and re-encode the same 20 bytes.\n */\n deriveTronAddressFromXpub(xpub: string, relativeDerivePath: string): string {\n const evmStyleHex = generateAddressFromXpub(\n xpub,\n `m/${relativeDerivePath.replace(/^m\\//i, '')}`\n ) as string;\n const addressBytes = Buffer.concat([\n Buffer.from([TRON_ADDRESS_PREFIX]),\n Buffer.from(evmStyleHex.replace(/^0x/i, ''), 'hex'),\n ]);\n return bs58check.encode(addressBytes);\n }\n\n /**\n * Split an account-level xpub back into the BIP-32 fields a host needs to\n * treat it as a real extended key (`BtcPublicKey`). Everything here is\n * carried inside the xpub's own serialization — depth, the PARENT key\n * fingerprint (not the seed's master fingerprint), the chain code and the\n * compressed public key — so this is a pure decode with no device round\n * trip; the xpub itself was already device-verified when it was synced.\n */\n parseXpubMeta(xpub: string): {\n publicKey: string;\n chainCode: string;\n depth: number;\n parentFingerprint: number;\n } {\n // Decoded straight off the wire format rather than through HDKey: the\n // `@types/hdkey` surface only declares publicKey/privateKey/chainCode, so\n // depth and parentFingerprint would need an undeclared-field cast. BIP-32\n // serialization is fixed-width, so reading it here is exact:\n // [0..4) version | [4] depth | [5..9) parentFingerprint\n // [9..13) childNumber | [13..45) chainCode | [45..78) publicKey\n const raw = Buffer.from(bs58check.decode(xpub));\n if (raw.length !== 78) {\n throw new Error(`Keystone xpub did not decode to a 78-byte BIP-32 key (got ${raw.length})`);\n }\n return {\n publicKey: raw.subarray(45, 78).toString('hex'),\n chainCode: raw.subarray(13, 45).toString('hex'),\n depth: raw.readUInt8(4),\n parentFingerprint: raw.readUInt32BE(5),\n };\n }\n}\n","import {\n CryptoKeypath,\n DataItem,\n PathComponent,\n RegistryItem,\n RegistryType,\n RegistryTypes,\n extend,\n} from '@keystonehq/bc-ur-registry';\n\nimport type { DataItemMap } from '@keystonehq/bc-ur-registry';\n\nconst { decodeToDataItem } = extend;\n\n/**\n * Keystone's native `tron-sign-request` (tag 5201). Key layout follows\n * keystone-sdk-rust libs/ur-registry/src/tron (firmware >= 2.5.0); the\n * OneKey Pro air-gap layout differs and is not accepted by Keystone.\n */\nconst TRON_SIGN_REQUEST_TYPE = new RegistryType('tron-sign-request', 5201);\n\nenum RequestKeys {\n requestId = 1,\n signData,\n dataType,\n derivationPath,\n address,\n origin,\n}\n\n/** Keystone `DataType`: 1 = transaction, 2 = personal message. */\nexport enum TronSignType {\n Transaction = 1,\n PersonalMessage = 2,\n}\n\ninterface TronSignRequestProps {\n requestId?: Buffer;\n signData: Buffer;\n signType: TronSignType;\n derivationPath: CryptoKeypath;\n address?: Buffer;\n origin?: string;\n}\n\nexport class TronSignRequest extends RegistryItem {\n private readonly requestId?: Buffer;\n\n private readonly signData: Buffer;\n\n private readonly signType: TronSignType;\n\n private readonly derivationPath: CryptoKeypath;\n\n private readonly address?: Buffer;\n\n private readonly origin?: string;\n\n getRegistryType = (): RegistryType => TRON_SIGN_REQUEST_TYPE;\n\n constructor(args: TronSignRequestProps) {\n super();\n this.requestId = args.requestId;\n this.signData = args.signData;\n this.derivationPath = args.derivationPath;\n this.address = args.address;\n this.origin = args.origin;\n this.signType = args.signType;\n }\n\n getRequestId = (): Buffer | undefined => this.requestId;\n\n getSignData = (): Buffer => this.signData;\n\n getSignType = (): TronSignType => this.signType;\n\n getDerivationPath = (): string => this.derivationPath.getPath();\n\n toDataItem = (): DataItem => {\n const map: DataItemMap = {};\n if (this.requestId) {\n map[RequestKeys.requestId] = new DataItem(this.requestId, RegistryTypes.UUID.getTag());\n }\n if (this.address) map[RequestKeys.address] = this.address;\n if (this.origin) map[RequestKeys.origin] = this.origin;\n map[RequestKeys.signData] = this.signData;\n map[RequestKeys.dataType] = this.signType;\n const keyPath = this.derivationPath.toDataItem();\n keyPath.setTag(this.derivationPath.getRegistryType().getTag());\n map[RequestKeys.derivationPath] = keyPath;\n return new DataItem(map);\n };\n\n static fromDataItem(dataItem: DataItem): TronSignRequest {\n const map = dataItem.getData() as Record<number, unknown>;\n const signData = map[RequestKeys.signData] as Buffer;\n const derivationPath = CryptoKeypath.fromDataItem(map[RequestKeys.derivationPath] as DataItem);\n const address = map[RequestKeys.address] as Buffer | undefined;\n const requestIdItem = map[RequestKeys.requestId] as DataItem | undefined;\n const requestId = requestIdItem?.getData() as Buffer | undefined;\n const origin = map[RequestKeys.origin] as string | undefined;\n const signType = map[RequestKeys.dataType] as TronSignType;\n return new TronSignRequest({ requestId, signData, derivationPath, address, origin, signType });\n }\n\n static fromCBOR(cborPayload: Buffer): TronSignRequest {\n return TronSignRequest.fromDataItem(decodeToDataItem(cborPayload));\n }\n\n static parsePath(path: string, xfp: string): CryptoKeypath {\n const segments = path.replace(/^[mM]\\//, '').split('/');\n const components = segments.map(segment => {\n const hardened = segment.endsWith(\"'\");\n return new PathComponent({\n index: parseInt(hardened ? segment.slice(0, -1) : segment, 10),\n hardened,\n });\n });\n return new CryptoKeypath(components, Buffer.from(xfp, 'hex'));\n }\n}\n","import {\n DataItem,\n RegistryItem,\n RegistryType,\n RegistryTypes,\n extend,\n} from '@keystonehq/bc-ur-registry';\n\nimport type { DataItemMap } from '@keystonehq/bc-ur-registry';\n\nconst { decodeToDataItem } = extend;\n\n/** See `TronSignRequest.ts`'s doc comment — same proven, CBOR-native pair (registry type 5202). */\nconst TRON_SIGNATURE_TYPE = new RegistryType('tron-signature', 5202);\n\nenum SignatureKeys {\n requestId = 1,\n signature,\n}\n\nexport class TronSignature extends RegistryItem {\n private readonly requestId?: Buffer;\n\n private readonly signatureBytes: Buffer;\n\n getRegistryType = (): RegistryType => TRON_SIGNATURE_TYPE;\n\n constructor(signature: Buffer, requestId?: Buffer) {\n super();\n this.signatureBytes = signature;\n this.requestId = requestId;\n }\n\n getRequestId = (): Buffer | undefined => this.requestId;\n\n getSignature = (): Buffer => this.signatureBytes;\n\n toDataItem = (): DataItem => {\n const map: DataItemMap = {};\n if (this.requestId) {\n map[SignatureKeys.requestId] = new DataItem(this.requestId, RegistryTypes.UUID.getTag());\n }\n map[SignatureKeys.signature] = this.signatureBytes;\n return new DataItem(map);\n };\n\n static fromDataItem(dataItem: DataItem): TronSignature {\n const map = dataItem.getData() as Record<number, unknown>;\n const signature = map[SignatureKeys.signature] as Buffer;\n const requestIdItem = map[SignatureKeys.requestId] as DataItem | undefined;\n const requestId = requestIdItem?.getData() as Buffer | undefined;\n return new TronSignature(signature, requestId);\n }\n\n static fromCBOR(cborPayload: Buffer): TronSignature {\n return TronSignature.fromDataItem(decodeToDataItem(cborPayload));\n }\n}\n","import bs58 from 'bs58';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n CHAIN_FINGERPRINT_PATHS,\n DEVICE,\n DeviceJobQueue,\n HardwareErrorCode,\n OperationRegistry,\n SDK,\n TypedEventEmitter,\n UI_REQUEST,\n UI_REQUEST_CANCELLED_TAG,\n UI_REQUEST_PREEMPTED_TAG,\n UI_REQUEST_TIMEOUT_TAG,\n UI_RESPONSE,\n UiRequestRegistry,\n createHardwareSearchTargetId,\n createHwkError,\n deriveDeviceFingerprint,\n ensure0x,\n failure,\n getAllNetworkMethodChain,\n hasHardwareRuntimeIdPrefix,\n isAllNetworkMethodName,\n isHardwareOperationId,\n isHwkRecoveryHint,\n operationMayHaveCompletedParams,\n parseBip32MasterFingerprint,\n rehydrateConnectorError,\n resolveHardwareOperationTarget as resolveGenericHardwareOperationTarget,\n runAllNetworkGetAddress,\n stripHex,\n success,\n} from '@onekeyfe/hwk-adapter-core';\n\nimport { KeystoneUrEngine } from '../urEngine/KeystoneUrEngine';\nimport { TronSignType } from '../urEngine/TronSignRequest';\nimport {\n KEYSTONE_WALLET_CONNECT_ID_PREFIX,\n KEYSTONE_WALLET_ID_PATH,\n accountKey,\n createDeviceRecord,\n deriveKeystoneWalletId,\n placeholderDeviceInfo,\n toDeviceInfo,\n} from './deviceTable';\nimport {\n KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE,\n btcScriptTypeFromPath,\n isKeystoneSignableBtcAccountPath,\n normalizePath,\n splitAccountPath,\n} from './pathUtils';\n\nimport type { KeystoneParsedMultiAccounts, KeystoneUr } from '../urEngine/types';\nimport type { KeystoneAccountEntry, KeystoneDeviceRecord } from './deviceTable';\nimport type {\n AllNetworkAddressParams,\n AllNetworkAddressResponse,\n AllNetworkGetAddressParams,\n BtcAddress,\n BtcGetAddressParams,\n BtcGetPublicKeyParams,\n BtcPublicKey,\n BtcSignMsgParams,\n BtcSignPsbtParams,\n BtcSignTxParams,\n BtcSignature,\n BtcSignedPsbt,\n BtcSignedTx,\n ChainCapability,\n ChainForFingerprint,\n ConnectionTarget,\n ConnectorCallResult,\n ConnectorConnectTarget,\n ConnectorDevice,\n ConnectorEventMap,\n DeviceEventListener,\n DeviceInfo,\n DeviceSearchTarget,\n EvmAddress,\n EvmGetAddressParams,\n EvmSignMsgParams,\n EvmSignTxParams,\n EvmSignTypedDataParams,\n EvmSignature,\n EvmSignedTx,\n HardwareEvent,\n HardwareEventMap,\n IConnector,\n IHardwareCallParams,\n IHardwareCommonCallParams,\n IHardwareWallet,\n NullableCallArg,\n QrDisplayData,\n Response,\n SearchDevicesOptions,\n SolAddress,\n SolGetAddressParams,\n SolSignMsgParams,\n SolSignTxParams,\n SolSignature,\n SolSignedTx,\n TransportType,\n TronAddress,\n TronGetAddressParams,\n TronSignMsgParams,\n TronSignTxParams,\n TronSignature,\n TronSignedTx,\n UiResponseEvent,\n} from '@onekeyfe/hwk-adapter-core';\n\n/** Key material for one operation, keyed by `accountKey()`; never retained. */\ntype AccountBook = Map<string, KeystoneAccountEntry>;\n\nconst COLD_START_JOB_LABEL = 'keystone-cold-start';\n\n// Keystone briefly leaves the USB bus while entering external-wallet mode.\n// A persisted-wallet call can therefore race the macOS/Chromium re-enumeration\n// and must not fall back to QR after a single empty snapshot.\nconst KEYSTONE_USB_REATTACH_PROBE_ATTEMPTS = 4;\nconst KEYSTONE_USB_REATTACH_PROBE_INTERVAL_MS = 500;\n\nfunction resolveHardwareOperationTarget(\n positionalTargetId: string | null | undefined,\n operationId: string | null | undefined\n) {\n const result = resolveGenericHardwareOperationTarget(positionalTargetId, operationId, 'keystone');\n return result;\n}\n\nfunction waitForKeystoneUsbReattachProbe(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, KEYSTONE_USB_REATTACH_PROBE_INTERVAL_MS);\n });\n}\n\nfunction getKeystoneJobId(connectId?: string, deviceId?: string): string {\n return isHardwareOperationId(connectId)\n ? connectId\n : deviceId || connectId || COLD_START_JOB_LABEL;\n}\n\nconst BIP44_COIN_TYPE_TO_CHAIN: Record<number, ChainCapability> = {\n 60: 'evm',\n 0: 'btc',\n 501: 'sol',\n 195: 'tron',\n};\n\n/**\n * Classifies a returned account by BIP44 coin type (2nd segment), not by\n * purpose, so 44'/49'/84'/86' BTC entries all map to `btc`.\n */\nfunction inferHwkChainFromPath(path: string): ChainCapability | undefined {\n const match = normalizePath(path).match(/^m\\/\\d+'\\/(\\d+)'/);\n return match ? BIP44_COIN_TYPE_TO_CHAIN[Number(match[1])] : undefined;\n}\n\nexport interface ImportFromQrOptions {\n /**\n * 'request': ask the device for the fixed identity xpub via a\n * `qr-hardware-call` (KeyDerivation) UR. 'scan': just wait for whatever\n * multi-account/HD-key export the device is already showing. Either way\n * only the wallet identity is learned; key material is never retained.\n */\n mode?: 'request' | 'scan';\n}\n\n/**\n * Keystone adapter: QR and USB behind one `IHardwareWallet`, keyed by a\n * wallet id derived from the fixed identity xpub. `_resolveUr` picks the\n * channel per request (USB when a session exists, else QR). Key material\n * is fetched per operation and never retained on the wallet record.\n */\nexport class KeystoneAdapter implements IHardwareWallet {\n readonly vendor = 'keystone' as const;\n\n private readonly urEngine: KeystoneUrEngine;\n\n private readonly emitter = new TypedEventEmitter<HardwareEventMap>();\n\n private readonly _operationRoutes = new Map<\n string,\n { operationId: string; connectionType: 'usb' | 'qr' }\n >();\n\n private readonly _operations = new OperationRegistry({\n vendor: 'keystone',\n onEnded: (operation, reason) => {\n const route = this._operationRoutes.get(operation.connectId);\n if (route?.operationId === operation.operationId) {\n this._operationRoutes.delete(operation.connectId);\n }\n this.emitter.emit(SDK.OPERATION_ENDED, {\n type: SDK.OPERATION_ENDED,\n payload: { operationId: operation.operationId, reason },\n });\n if (reason === 'timeout') {\n this._releaseOperationConnection(operation).catch(() => undefined);\n }\n },\n });\n\n private readonly _uiRegistry = new UiRequestRegistry();\n\n private readonly _jobQueue: DeviceJobQueue;\n\n private readonly _devices = new Map<string, KeystoneDeviceRecord>();\n\n private readonly _searchDeviceTargets = new Map<string, 'usb' | 'qr'>();\n\n private _activeSearchGeneration: symbol | undefined;\n\n private readonly _origin: string;\n\n /** How long to wait for the app to answer a `REQUEST_QR_DISPLAY`/`REQUEST_QR_SCAN` before failing. Defaults to the registry's own 10-minute default. */\n private readonly _qrTimeoutMs: number | undefined;\n\n /** Optional USB `IConnector` — supplied by the host app (DI, same pattern as Trezor/Ledger), e.g. via `createKeystoneWebUsbConnector()` from `@onekeyfe/hwk-keystone-connector-usb`. Undefined means QR-only. */\n private readonly _usbConnector: IConnector | undefined;\n\n /** Serializes USB open/identity handshakes that run outside the job queue. */\n private _usbConnectTail: Promise<void> = Promise.resolve();\n\n private readonly _unsettledUsbOperations = new Map<string, number>();\n\n private readonly _usbIdleWaiters = new Set<() => void>();\n\n private _usbTeardownTail: Promise<void> = Promise.resolve();\n\n private _pendingUsbTeardowns = 0;\n\n /** Explicit `switchTransport` pin. `undefined` means \"auto\": USB when a live session exists for the target wallet, else QR. */\n private _forcedTransport: 'qr' | 'usb' | undefined;\n\n private readonly _handleUsbDisconnect = ({ connectId }: { connectId: string }): void => {\n const record = Array.from(this._devices.values()).find(item => item.usbSessionId === connectId);\n if (!record) return;\n\n this._operations.endByConnectionKey(connectId, 'disconnect');\n this._operations.endByConnectionKey(record.connectId, 'disconnect');\n\n record.usbSessionId = undefined;\n const info = toDeviceInfo(record);\n if (record.qrSynced) {\n this.emitter.emit(DEVICE.CHANGED, { type: DEVICE.CHANGED, payload: info });\n } else {\n this._devices.delete(record.walletId);\n this.emitter.emit(DEVICE.DISCONNECT, { type: DEVICE.DISCONNECT, payload: info });\n }\n };\n\n private readonly _handleUsbUiEvent = (event: ConnectorEventMap['ui-event']): void => {\n this.emitter.emit('ui-event', event);\n };\n\n constructor(options?: { origin?: string; qrTimeoutMs?: number; usbConnector?: IConnector }) {\n this._origin = options?.origin ?? 'OneKey';\n this._qrTimeoutMs = options?.qrTimeoutMs;\n this.urEngine = new KeystoneUrEngine(this._origin);\n this._jobQueue = new DeviceJobQueue();\n this._usbConnector = options?.usbConnector;\n this._usbConnector?.on('device-disconnect', this._handleUsbDisconnect);\n // Relay connector operation events (ConfirmOnDevice / InteractionComplete\n // around every USB UR round trip) to the host verbatim — same pass-through\n // the Ledger adapter does, so hosts reuse one handler for both vendors.\n this._usbConnector?.on('ui-event', this._handleUsbUiEvent);\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle / transport\n // ---------------------------------------------------------------------------\n\n get activeTransport(): TransportType | null {\n if (this._devices.size === 0) return null;\n const hasUsbSession = Array.from(this._devices.values()).some(r => r.usbSessionId);\n return hasUsbSession ? 'usb' : 'qr';\n }\n\n getAvailableTransports(): TransportType[] {\n return this._usbConnector ? ['qr', 'usb'] : ['qr'];\n }\n\n /** Pins subsequent calls to 'qr' or 'usb' (routing otherwise defaults to \"USB when the target wallet has a live session, else QR\" — see `_resolveUr`). Any other value clears the pin back to auto. */\n switchTransport(type: TransportType): Promise<void> {\n this._forcedTransport = type === 'qr' || type === 'usb' ? type : undefined;\n return Promise.resolve();\n }\n\n init(_config?: unknown): Promise<void> {\n return Promise.resolve();\n }\n\n async dispose(): Promise<void> {\n this._operations.endAll('runtime-reset');\n this._uiRegistry.cancel();\n this._jobQueue.clear();\n this._searchDeviceTargets.clear();\n await this._resetUsbSessions();\n this._usbConnector?.off('device-disconnect', this._handleUsbDisconnect);\n this._usbConnector?.off('ui-event', this._handleUsbUiEvent);\n this._usbConnector?.reset();\n this._devices.clear();\n this.emitter.removeAllListeners();\n }\n\n // ---------------------------------------------------------------------------\n // Device table\n // ---------------------------------------------------------------------------\n\n /**\n * Unscoped discovery includes QR-synced wallets already known to this\n * adapter. Explicit QR discovery returns a virtual connection target because\n * there is no physical descriptor to enumerate. When a USB connector is\n * configured, its raw scan results are appended as-is: a USB descriptor has\n * no mfp until `connectDevice()` actually opens+claims it (see\n * `KeystoneUsbConnectorBase.searchDevices`), so these entries carry an\n * empty `deviceId` and exist purely so a host can list \"plugged in, click\n * to connect\" candidates.\n */\n async searchDevices(options?: SearchDevicesOptions): Promise<DeviceInfo[]> {\n const searchGeneration = Symbol('keystone-device-search');\n this._activeSearchGeneration = searchGeneration;\n this._searchDeviceTargets.clear();\n if (options?.resetSession) {\n await this._resetUsbSessions();\n } else {\n await this._usbTeardownTail;\n }\n const known = Array.from(this._devices.values()).map(toDeviceInfo);\n\n // QR has no physical descriptor to enumerate. Return one virtual target so\n // the host can keep the common search -> connect flow without starting a\n // wallet protocol round trip during discovery.\n if (options?.transportType === 'qr') {\n const searchTargetId = createHardwareSearchTargetId('keystone');\n this._searchDeviceTargets.set(searchTargetId, 'qr');\n return [\n {\n ...placeholderDeviceInfo(),\n model: '',\n connectId: searchTargetId,\n capabilities: { persistentDeviceIdentity: false },\n },\n ];\n }\n\n if (options?.transportType === 'ble') return [];\n if (!this._usbConnector) return options?.transportType === 'usb' ? [] : known;\n\n let usbDevices: ConnectorDevice[];\n try {\n usbDevices = await this._usbConnector.searchDevices();\n } catch (error) {\n // A USB scan failing (no WebUSB support, permission not yet granted,\n // etc.) must not sink the QR-known devices this instance already has.\n if (options?.transportType === 'usb') throw error;\n return known;\n }\n if (this._activeSearchGeneration !== searchGeneration) return [];\n const placeholders: DeviceInfo[] = usbDevices.map(d => ({\n vendor: 'keystone',\n // Empty, not 'unknown': enumeration genuinely cannot tell the model\n // apart (every Keystone shares one vid/pid), and a literal placeholder\n // string would beat the host's own default-name fallback and surface as\n // a device called \"unknown\".\n model: d.model ?? '',\n modelName: d.modelName,\n // Placeholders — neither is knowable until the device is opened.\n firmwareVersion: '0.0.0',\n deviceId: d.deviceId,\n connectId: d.connectId,\n connectionType: 'usb',\n // The USB product name, which IS readable at enumeration time.\n label: d.name,\n serialNumber: d.serialNumber,\n capabilities: d.capabilities ?? { persistentDeviceIdentity: false },\n raw: d.raw,\n }));\n for (const placeholder of placeholders) {\n this._searchDeviceTargets.set(placeholder.connectId, 'usb');\n }\n return options?.transportType === 'usb' ? placeholders : [...known, ...placeholders];\n }\n\n private async _resetUsbSessions(): Promise<void> {\n await this._runUsbTeardown(async () => {\n await this._usbConnectTail;\n this._operations.endAll('runtime-reset');\n if (!this._usbConnector) return;\n\n const sessionIds = new Set(\n Array.from(this._devices.values())\n .map(record => record.usbSessionId)\n .filter((sessionId): sessionId is string => Boolean(sessionId))\n );\n for (const sessionId of sessionIds) {\n try {\n await this._usbConnector.disconnect(sessionId);\n } catch {\n // The adapter state is still retired below so a stale session cannot\n // be selected after an explicit reset.\n }\n this._handleUsbDisconnect({ connectId: sessionId });\n }\n });\n }\n\n async searchDeviceTargets(options?: SearchDevicesOptions): Promise<DeviceSearchTarget[]> {\n const devices = await this.searchDevices(options);\n return devices.map(device => ({\n searchTargetId: device.connectId,\n // Keystone's wallet id is stable only after the USB/QR handshake. The\n // selectable handle remains owned by the current discovery snapshot.\n searchTargetReusePolicy: 'current-discovery',\n vendor: device.vendor,\n connectionType: device.connectionType,\n kind: device.connectionType === 'qr' ? 'interactive' : 'physical',\n label: device.label,\n model: device.model,\n modelName: device.modelName,\n serialNumber: device.serialNumber,\n }));\n }\n\n async listConnectionTargets(options?: SearchDevicesOptions): Promise<ConnectionTarget[]> {\n const targets = await this.searchDeviceTargets(options);\n return targets.map(({ searchTargetId, ...target }) => ({\n ...target,\n targetId: searchTargetId,\n }));\n }\n\n async connectDevice(searchTargetId: string): Promise<Response<string>> {\n try {\n let connected: Response<DeviceInfo>;\n let selectedConnectionType: 'usb' | 'qr';\n const discoveredConnectionType = this._searchDeviceTargets.get(searchTargetId);\n if (discoveredConnectionType === 'qr') {\n selectedConnectionType = 'qr';\n connected = await this.importFromQr();\n } else if (discoveredConnectionType === 'usb') {\n selectedConnectionType = 'usb';\n if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.TransportNotAvailable,\n 'No USB connector configured for this Keystone adapter'\n );\n }\n connected = await this._connectUsb({}, searchTargetId);\n } else if (hasHardwareRuntimeIdPrefix(searchTargetId)) {\n return failure(\n HardwareErrorCode.DeviceNotFound,\n 'Keystone search target has expired; search for devices again',\n undefined,\n undefined,\n { scope: 'search-target' }\n );\n } else {\n const target = this._resolveTarget(searchTargetId);\n if (target.record) {\n selectedConnectionType = target.record.usbSessionId ? 'usb' : 'qr';\n connected = success(toDeviceInfo(target.record));\n } else if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.DeviceNotFound,\n `Unknown Keystone device search target: ${searchTargetId}`\n );\n } else {\n selectedConnectionType = 'usb';\n connected = await this._connectUsb(target);\n }\n }\n if (!connected.success) return connected;\n\n const record = this._devices.get(connected.payload.deviceId);\n this._operations.endByConnectionKey(connected.payload.connectId, 'explicit');\n const operation = this._operations.create({\n searchTargetId,\n connectId: connected.payload.connectId,\n device: connected.payload,\n connectionKeys:\n selectedConnectionType === 'usb' && record?.usbSessionId ? [record.usbSessionId] : [],\n });\n this._operationRoutes.set(connected.payload.connectId, {\n operationId: operation.operationId,\n connectionType: selectedConnectionType,\n });\n return success(operation.operationId);\n } catch (err) {\n return this._errorToFailure<string>(err);\n }\n }\n\n /**\n * QR has no persistent connection to tear down — the account cache\n * survives so a later call resumes without re-syncing. For a USB session,\n * this closes the connector session and either demotes the record back to\n * QR-only (if it was ever QR-synced) or removes it entirely (pure-USB\n * wallet that was never seen over QR) — see §4.2 of the design doc.\n */\n async releaseOperation(operationId: string): Promise<void> {\n const operation = this._operations.find(operationId);\n if (!operation) {\n this._operations.resolve(operationId);\n return;\n }\n const endedOperation = this._operations.end(operationId, 'explicit');\n if (!endedOperation) return;\n await this._releaseOperationConnection(endedOperation);\n }\n\n private async _releaseOperationConnection(\n operation: NonNullable<ReturnType<OperationRegistry['find']>>\n ): Promise<void> {\n const { connectId } = operation;\n let record: KeystoneDeviceRecord | undefined;\n try {\n record = this._resolveTarget(connectId).record;\n } catch {\n return;\n }\n if (!record?.usbSessionId || !operation.connectionKeys.includes(record.usbSessionId)) {\n return;\n }\n\n const { usbSessionId } = record;\n await this._runUsbTeardown(async () => {\n if (this._usbConnector) {\n try {\n await this._usbConnector.disconnect(usbSessionId);\n } catch {\n // Best-effort teardown — local routing state is cleared below either way.\n }\n }\n this._handleUsbDisconnect({ connectId: usbSessionId });\n });\n }\n\n getDeviceInfo(connectIdOrOperationId: string, deviceId: string): Promise<Response<DeviceInfo>> {\n try {\n const connectId = isHardwareOperationId(connectIdOrOperationId)\n ? this._operations.resolve(connectIdOrOperationId).connectId\n : connectIdOrOperationId;\n const { record } = this._resolveTarget(connectId, deviceId);\n if (!record) {\n return Promise.resolve(\n failure(\n HardwareErrorCode.DeviceNotFound,\n `Unknown Keystone device: ${connectId || deviceId}`\n )\n );\n }\n return Promise.resolve(success(toDeviceInfo(record)));\n } catch (err) {\n return Promise.resolve(this._errorToFailure<DeviceInfo>(err));\n }\n }\n\n cancel(connectId?: string): void {\n const reason = createHwkError({\n code: HardwareErrorCode.UserAborted,\n message: 'User aborted operation',\n });\n const activeJobId = this._jobQueue.getActiveJob()?.deviceId;\n if (connectId) {\n if (\n !activeJobId ||\n (activeJobId !== connectId && activeJobId !== this._walletIdFromIdentifier(connectId))\n ) {\n this._jobQueue.cancelActiveAndPending(connectId, reason);\n const walletId = this._walletIdFromIdentifier(connectId);\n if (walletId && walletId !== connectId) {\n this._jobQueue.cancelActiveAndPending(walletId, reason);\n }\n return;\n }\n this._jobQueue.cancelActiveAndPending(activeJobId, reason);\n } else {\n this._jobQueue.cancelActiveAndPending(undefined, reason);\n }\n this._uiRegistry.cancel();\n }\n\n getChainFingerprint(\n connectId: string,\n deviceId: string,\n chain: ChainForFingerprint\n ): Promise<Response<string>> {\n try {\n const target = this._resolveTarget(connectId, deviceId);\n const walletId = target.record?.walletId ?? target.expectedWalletId;\n if (!walletId) {\n return Promise.resolve(\n failure(HardwareErrorCode.DeviceNotFound, 'Unknown Keystone wallet identity')\n );\n }\n return Promise.resolve(success(deriveDeviceFingerprint(`keystone:${chain}:${walletId}`)));\n } catch (err) {\n return Promise.resolve(this._errorToFailure<string>(err));\n }\n }\n\n uiResponse(response: UiResponseEvent): void {\n if (response.type === UI_RESPONSE.CANCEL) {\n this.cancel();\n return;\n }\n this._uiRegistry.resolve(response.type, response.payload);\n }\n\n on<K extends keyof HardwareEventMap>(\n event: K,\n listener: (event: HardwareEventMap[K]) => void\n ): void;\n\n on(event: string, listener: DeviceEventListener): void;\n\n on(event: string, listener: (event: HardwareEvent) => void): void {\n this.emitter.on(event, listener);\n }\n\n off<K extends keyof HardwareEventMap>(\n event: K,\n listener: (event: HardwareEventMap[K]) => void\n ): void;\n\n off(event: string, listener: DeviceEventListener): void;\n\n off(event: string, listener: (event: HardwareEvent) => void): void {\n this.emitter.off(event, listener);\n }\n\n // ---------------------------------------------------------------------------\n // Explicit account import — the recommended entry point before signing, so\n // signing calls don't each pay for their own cold-sync round trip.\n // ---------------------------------------------------------------------------\n\n async importFromQr(options: ImportFromQrOptions = {}): Promise<Response<DeviceInfo>> {\n try {\n return await this._jobQueue.enqueue(COLD_START_JOB_LABEL, async signal => {\n const displayDevice = placeholderDeviceInfo();\n let responseUr: KeystoneUr;\n\n if (options.mode === 'scan') {\n responseUr = await this._requestQrScanAndAwaitResponse(displayDevice);\n } else {\n // Identity only; key material is never retained.\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: [{ path: KEYSTONE_WALLET_ID_PATH, curve: 'secp256k1' }],\n origin: this._origin,\n });\n responseUr = await this._requestQrDisplayAndAwaitResponse(displayDevice, {\n ...requestUr,\n animated: false,\n });\n }\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n const record = this._upsertDeviceRecord(parsed);\n return success(toDeviceInfo(record));\n });\n } catch (err) {\n return this._errorToFailure<DeviceInfo>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // All-network bundle — dispatches to the same per-chain methods below, so\n // there's exactly one implementation of each chain's address logic.\n // ---------------------------------------------------------------------------\n\n allNetworkGetAddress = async (\n connectId: string,\n deviceId: string,\n params: AllNetworkGetAddressParams\n ): Promise<Response<AllNetworkAddressResponse[]>> => {\n const operationTarget = resolveHardwareOperationTarget(connectId, params.operationId);\n if (!operationTarget.success) return operationTarget;\n const effectiveConnectId = operationTarget.payload.targetId ?? '';\n const { operationId } = operationTarget.payload;\n try {\n const prefetched = await this._prefetchAllNetworkAccounts(\n effectiveConnectId,\n deviceId,\n params\n );\n const { book } = prefetched;\n // Implicit cold start (no connectId/deviceId): the prefetch round trip\n // just established the wallet identity, so route the per-item calls to\n // it instead of resolving an empty target and re-syncing per item.\n const itemDeviceId = deviceId || prefetched.walletId || '';\n return await runAllNetworkGetAddress({\n connectId: effectiveConnectId,\n deviceId: itemDeviceId,\n params,\n callItem: async ({ method, item }) => {\n const commonArgs = {\n path: item.path,\n showOnDevice: item.showOnDevice,\n operationId,\n };\n switch (method) {\n case 'evmGetAddress':\n return this.evmGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'btcGetAddress':\n return this.btcGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'btcGetPublicKey':\n return this.btcGetPublicKey(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'solGetAddress':\n return this.solGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n case 'tronGetAddress':\n return this.tronGetAddress(effectiveConnectId, itemDeviceId, commonArgs, book);\n default:\n return failure(\n HardwareErrorCode.MethodNotSupported,\n `Unsupported method: ${String(method)}`\n );\n }\n },\n attachIdentity: context => {\n const { record } = this._resolveTarget(effectiveConnectId, itemDeviceId);\n return Promise.resolve({\n ...context.item,\n success: true,\n payload: {\n ...context.payload,\n rootFingerprint: record ? Number.parseInt(record.masterFingerprint, 16) : undefined,\n deviceIdentity: record\n ? {\n vendor: 'keystone' as const,\n type: 'walletId' as const,\n value: record.walletId,\n }\n : undefined,\n },\n });\n },\n });\n } catch (err) {\n return this._errorToFailure<AllNetworkAddressResponse[]>(err);\n }\n };\n\n // ---------------------------------------------------------------------------\n // EVM\n // ---------------------------------------------------------------------------\n\n async evmGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<EvmGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<EvmAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'evmGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'evmGetAddress requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"evmGetAddress requires a full leaf path, e.g. m/44'/60'/0'/0/0\"\n );\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { account } = await this._fetchAccount(\n connectId,\n deviceId,\n 'evm',\n accountPath,\n signal,\n { book }\n );\n KeystoneAdapter._throwIfAborted(signal);\n if (!account.extendedPublicKey) {\n throw createHwkError({\n code: HardwareErrorCode.MethodNotSupported,\n message: 'Keystone did not return an extended public key for this account path',\n });\n }\n // params.showOnDevice: Keystone on-device re-display/verification for\n // one leaf address isn't wired yet; the address itself is still\n // correct — it's derived offline from a device-verified xpub, just\n // not re-shown.\n const address = this.urEngine.deriveEvmAddressFromXpub(\n account.extendedPublicKey,\n relativeDerivePath\n );\n return success<EvmAddress>({ address, path: normalizePath(params.path) });\n });\n } catch (err) {\n return this._errorToFailure<EvmAddress>(err);\n }\n }\n\n async evmSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<EvmSignTxParams>>\n ): Promise<Response<EvmSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTransaction requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTransaction requires params.path');\n }\n if (\n !('serializedTx' in params) ||\n typeof params.serializedTx !== 'string' ||\n !params.serializedTx\n ) {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone only signs a fully RLP-serialized transaction (params.serializedTx) — structured-field signing is not supported'\n );\n }\n const rawTxHex = stripHex(params.serializedTx);\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // Signing only needs the wallet's mfp (the device re-derives the\n // signing key itself from path+xfp) — not a cached xpub for this\n // exact path, so this must NOT key off the leaf path the way\n // evmGetAddress's account-xpub cache does, or a wallet imported at\n // the account level would never hit cache for a sign call.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'evm', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n // EIP-2718 typed-tx bytes always start with a type byte < 0x80; a\n // legacy RLP-encoded tx list always starts with a byte >= 0xc0 — the\n // standard disambiguation rule (that gap is exactly why EIP-2718\n // chose those type-byte values).\n const dataType =\n parseInt(rawTxHex.slice(0, 2), 16) < 0xc0 ? 'typedTransaction' : 'transaction';\n const requestUr = this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: rawTxHex,\n dataType,\n path,\n xfp: record.masterFingerprint,\n chainId: params.chainId,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'evmSignTransaction'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseEthSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<EvmSignedTx>({\n v: ensure0x(sig.v),\n r: ensure0x(sig.r),\n s: ensure0x(sig.s),\n });\n });\n } catch (err) {\n return this._errorToFailure<EvmSignedTx>(err);\n }\n }\n\n async evmSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<EvmSignMsgParams>>\n ): Promise<Response<EvmSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'evmSignMessage requires params');\n if (!params.path || params.message === undefined) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'evmSignMessage requires params.path and params.message'\n );\n }\n const messageHex = params.hex\n ? stripHex(params.message)\n : Buffer.from(params.message, 'utf8').toString('hex');\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // Signing only needs the wallet's mfp (the device re-derives the\n // signing key itself from path+xfp) — not a cached xpub for this\n // exact path, so this must NOT key off the leaf path the way\n // evmGetAddress's account-xpub cache does, or a wallet imported at\n // the account level would never hit cache for a sign call.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'evm', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: messageHex,\n dataType: 'personalMessage',\n path,\n xfp: record.masterFingerprint,\n chainId: params.chainId,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'evmSignMessage'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseEthSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<EvmSignature>({ signature: ensure0x(sig.r + sig.s + sig.v) });\n });\n } catch (err) {\n return this._errorToFailure<EvmSignature>(err);\n }\n }\n\n async evmSignTypedData(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<EvmSignTypedDataParams>>\n ): Promise<Response<EvmSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTypedData requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'evmSignTypedData requires params.path');\n }\n if (params.mode === 'hash') {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone always displays the full EIP-712 payload for on-device review — pre-hashed signing is not supported'\n );\n }\n // Matches the Keystone USB SDK's own `signEIP712Message` convention\n // (the typed-data JSON as UTF-8) — QR and USB share the same sign-request\n // format, so the wire convention is the same either way. `dataJson` is the\n // dApp's original bytes; re-stringifying the parsed object is the fallback\n // and can rewrite >2^53 integer literals, so it is never preferred.\n const signDataHex = Buffer.from(\n params.dataJson ?? JSON.stringify(params.data),\n 'utf8'\n ).toString('hex');\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // Signing only needs the wallet's mfp (the device re-derives the\n // signing key itself from path+xfp) — not a cached xpub for this\n // exact path, so this must NOT key off the leaf path the way\n // evmGetAddress's account-xpub cache does, or a wallet imported at\n // the account level would never hit cache for a sign call.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'evm', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildEthSignRequest({\n requestId,\n unsignedTxHex: signDataHex,\n dataType: 'typedData',\n path,\n xfp: record.masterFingerprint,\n chainId: params.chainId,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'evmSignTypedData'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseEthSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<EvmSignature>({ signature: ensure0x(sig.r + sig.s + sig.v) });\n });\n } catch (err) {\n return this._errorToFailure<EvmSignature>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // BTC — PSBT signing and message signing only for now. Address/pubkey\n // derivation needs script-type-aware xpub decoding (P2WPKH/P2TR/…) this\n // phase doesn't wire in yet; structured-field tx signing needs host-side\n // PSBT construction. Both are real, bounded follow-ups, not silent gaps.\n // ---------------------------------------------------------------------------\n\n async btcGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<BtcGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<BtcAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'btcGetAddress requires params.path');\n\n const scriptType = btcScriptTypeFromPath(params.path);\n if (!scriptType) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetAddress requires a path whose purpose is 44'/49'/84'/86' (P2PKH/P2SH-P2WPKH/P2WPKH/P2TR)\"\n );\n }\n if (scriptType === 'p2tr') {\n return this._unsupported(\n 'btcGetAddress',\n \"P2TR (purpose 86') needs an elliptic-curve library for BIP-341 tweaking, not yet wired in — 44'/49'/84' work\"\n );\n }\n\n const normalizedPath = normalizePath(params.path);\n const { accountPath, relativeDerivePath } = splitAccountPath(normalizedPath);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetAddress requires a full leaf path, e.g. m/84'/0'/0'/0/0\"\n );\n }\n if (!isKeystoneSignableBtcAccountPath(accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { account } = await this._fetchAccount(\n connectId,\n deviceId,\n 'btc',\n accountPath,\n signal,\n { book }\n );\n KeystoneAdapter._throwIfAborted(signal);\n if (!account.extendedPublicKey) {\n throw createHwkError({\n code: HardwareErrorCode.MethodNotSupported,\n message: 'Keystone did not return an extended public key for this account path',\n });\n }\n // Same on-device re-display caveat as evmGetAddress: the address is\n // still correct (derived offline from a device-verified xpub), it\n // just isn't re-shown on-device for this call yet.\n const address = this.urEngine.deriveBtcAddressFromXpub(\n account.extendedPublicKey,\n relativeDerivePath,\n scriptType\n );\n return success<BtcAddress>({ address, path: normalizedPath });\n });\n } catch (err) {\n return this._errorToFailure<BtcAddress>(err);\n }\n }\n\n /**\n * Returns the account-level extended public key. `params.path` must be an\n * ACCOUNT path (`m/84'/0'/0'`), not a leaf — that is the level Keystone\n * actually syncs, and it is what a host needs to derive a whole account's\n * addresses offline. Unlike `btcGetAddress` this has no script-type\n * restriction: an xpub is script-type agnostic, so `86'` (taproot) works\n * here even though deriving a taproot ADDRESS still needs an EC library\n * this package doesn't wire in.\n */\n async btcGetPublicKey(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<BtcGetPublicKeyParams>>,\n book?: AccountBook\n ): Promise<Response<BtcPublicKey>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcGetPublicKey requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'btcGetPublicKey requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"btcGetPublicKey requires an account path, e.g. m/84'/0'/0' (not a leaf path)\"\n );\n }\n if (!isKeystoneSignableBtcAccountPath(accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { account } = await this._fetchAccount(\n connectId,\n deviceId,\n 'btc',\n accountPath,\n signal,\n { book }\n );\n KeystoneAdapter._throwIfAborted(signal);\n if (!account.extendedPublicKey) {\n throw createHwkError({\n code: HardwareErrorCode.MethodNotSupported,\n message: 'Keystone did not return an extended public key for this account path',\n });\n }\n const meta = this.urEngine.parseXpubMeta(account.extendedPublicKey);\n return success<BtcPublicKey>({\n xpub: account.extendedPublicKey,\n publicKey: meta.publicKey,\n chainCode: meta.chainCode,\n depth: meta.depth,\n fingerprint: meta.parentFingerprint,\n path: normalizePath(accountPath),\n });\n });\n } catch (err) {\n return this._errorToFailure<BtcPublicKey>(err);\n }\n }\n\n async btcSignTransaction(\n _connectId?: NullableCallArg<string>,\n _deviceId?: NullableCallArg<string>,\n _params?: NullableCallArg<IHardwareCallParams<BtcSignTxParams>>\n ): Promise<Response<BtcSignedTx>> {\n return this._unsupported(\n 'btcSignTransaction',\n 'use btcSignPsbt — structured input/output signing needs host-side PSBT construction, not yet wired in'\n );\n }\n\n async btcSignPsbt(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<BtcSignPsbtParams>>\n ): Promise<Response<BtcSignedPsbt>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcSignPsbt requires params');\n if (!params.psbt)\n return failure(HardwareErrorCode.InvalidParams, 'btcSignPsbt requires params.psbt');\n // `path` is optional in the shared param type, but the account-0 gate is\n // only enforceable with it — so require it here rather than let a pathless\n // request reach the device ungated.\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'btcSignPsbt requires params.path');\n if (!isKeystoneSignableBtcAccountPath(splitAccountPath(params.path).accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // A PSBT can span multiple inputs/paths — there's no single leaf path\n // to scope a sync to, so this only needs the wallet's mfp to be known.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'btc', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestUr = this.urEngine.buildBtcPsbtRequest(stripHex(params.psbt));\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'btcSignPsbt'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const signedPsbt = this.urEngine.parseBtcPsbt(responseUr);\n return success<BtcSignedPsbt>({ signedPsbt });\n });\n } catch (err) {\n return this._errorToFailure<BtcSignedPsbt>(err);\n }\n }\n\n async btcSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<BtcSignMsgParams>>\n ): Promise<Response<BtcSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'btcSignMessage requires params');\n if (!params.path || params.message === undefined) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'btcSignMessage requires params.path and params.message'\n );\n }\n const messageHex = params.hex\n ? stripHex(params.message)\n : Buffer.from(params.message, 'utf8').toString('hex');\n const path = normalizePath(params.path);\n if (!isKeystoneSignableBtcAccountPath(splitAccountPath(path).accountPath)) {\n return failure(HardwareErrorCode.DevicePathForbidden, KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE);\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'btc', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildBtcMessageSignRequest({\n requestId,\n messageHex,\n accounts: [{ path, xfp: record.masterFingerprint }],\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'btcSignMessage'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseBtcSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<BtcSignature>({ signature: sig.signature });\n });\n } catch (err) {\n return this._errorToFailure<BtcSignature>(err);\n }\n }\n\n async btcGetMasterFingerprint(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCommonCallParams>\n ): Promise<Response<{ masterFingerprint: string }>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'btc', signal);\n return success({ masterFingerprint: record.masterFingerprint });\n });\n } catch (err) {\n return this._errorToFailure<{ masterFingerprint: string }>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // SOL\n // ---------------------------------------------------------------------------\n\n async solGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<SolGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<SolAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'solGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'solGetAddress requires params.path');\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { account } = await this._fetchAccount(connectId, deviceId, 'sol', path, signal, {\n book,\n });\n KeystoneAdapter._throwIfAborted(signal);\n // Ed25519 public key IS the Solana address (base58) — no further\n // derivation, unlike EVM. params.showOnDevice: same on-device\n // re-display caveat as evmGetAddress.\n const address = bs58.encode(Buffer.from(account.publicKey, 'hex'));\n return success<SolAddress>({ address, path });\n });\n } catch (err) {\n return this._errorToFailure<SolAddress>(err);\n }\n }\n\n async solSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<SolSignTxParams>>\n ): Promise<Response<SolSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'solSignTransaction requires params');\n if (!params.path || !params.serializedTx) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'solSignTransaction requires params.path and params.serializedTx'\n );\n }\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // Same reasoning as evmSignTransaction — signing needs only the mfp.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'sol', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildSolSignRequest({\n requestId,\n unsignedPayloadHex: stripHex(params.serializedTx),\n dataType: 'transaction',\n path,\n xfp: record.masterFingerprint,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'solSignTransaction'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseSolSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<SolSignedTx>({ signature: sig.signature });\n });\n } catch (err) {\n return this._errorToFailure<SolSignedTx>(err);\n }\n }\n\n async solSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<SolSignMsgParams>>\n ): Promise<Response<SolSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'solSignMessage requires params');\n if (!params.path || !params.message) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'solSignMessage requires params.path and params.message'\n );\n }\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n // Same reasoning as evmSignTransaction — signing needs only the mfp.\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'sol', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildSolSignRequest({\n requestId,\n unsignedPayloadHex: stripHex(params.message),\n dataType: 'message',\n path,\n xfp: record.masterFingerprint,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'solSignMessage'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseSolSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<SolSignature>({ signature: sig.signature });\n });\n } catch (err) {\n return this._errorToFailure<SolSignature>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // TRON — routed through `TronSignRequest`/`TronSignature` (see\n // urEngine/TronSignRequest.ts), whose key layout follows keystone-sdk-rust\n // (tags 5201/5202, firmware >= 2.5.0). The OneKey Pro air-gap encoding under\n // the same tag is a different layout the firmware rejects. Not keystone-sdk's\n // bundled `sdk.tron` module either (protobuf-based, unverified response\n // semantics).\n // ---------------------------------------------------------------------------\n\n async tronGetAddress(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<TronGetAddressParams>>,\n book?: AccountBook\n ): Promise<Response<TronAddress>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'tronGetAddress requires params');\n if (!params.path)\n return failure(HardwareErrorCode.InvalidParams, 'tronGetAddress requires params.path');\n\n const { accountPath, relativeDerivePath } = splitAccountPath(params.path);\n if (!relativeDerivePath) {\n return failure(\n HardwareErrorCode.InvalidParams,\n \"tronGetAddress requires a full leaf path, e.g. m/44'/195'/0'/0/0\"\n );\n }\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { account } = await this._fetchAccount(\n connectId,\n deviceId,\n 'tron',\n accountPath,\n signal,\n { book }\n );\n KeystoneAdapter._throwIfAborted(signal);\n if (!account.extendedPublicKey) {\n throw createHwkError({\n code: HardwareErrorCode.MethodNotSupported,\n message: 'Keystone did not return an extended public key for this account path',\n });\n }\n const address = this.urEngine.deriveTronAddressFromXpub(\n account.extendedPublicKey,\n relativeDerivePath\n );\n return success<TronAddress>({ address, path: normalizePath(params.path) });\n });\n } catch (err) {\n return this._errorToFailure<TronAddress>(err);\n }\n }\n\n async tronSignTransaction(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<TronSignTxParams>>\n ): Promise<Response<TronSignedTx>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params)\n return failure(HardwareErrorCode.InvalidParams, 'tronSignTransaction requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignTransaction requires params.path');\n }\n if (!params.rawTxHex) {\n return failure(\n HardwareErrorCode.InvalidParams,\n 'Keystone only signs a fully protobuf-serialized TRON transaction (params.rawTxHex) — the Trezor-style structured contract fields have no equivalent here'\n );\n }\n const rawTxHex = stripHex(params.rawTxHex);\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'tron', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildTronSignRequest({\n requestId,\n rawTxHex,\n path,\n xfp: record.masterFingerprint,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'tronSignTransaction'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseTronSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n // Keystone signs the exact rawTxHex bytes it was given and returns\n // only the bare signature — unlike EVM/BTC there's no host-side\n // re-encoding step, so `serializedTx` stays unset (the caller\n // already has the raw tx it sent in).\n return success<TronSignedTx>({ signature: sig.signature });\n });\n } catch (err) {\n return this._errorToFailure<TronSignedTx>(err);\n }\n }\n\n async tronSignMessage(\n connectIdArg?: NullableCallArg<string>,\n deviceIdArg?: NullableCallArg<string>,\n paramsArg?: NullableCallArg<IHardwareCallParams<TronSignMsgParams>>\n ): Promise<Response<TronSignature>> {\n const operationTarget = resolveHardwareOperationTarget(connectIdArg, paramsArg?.operationId);\n if (!operationTarget.success) return operationTarget;\n const connectId = operationTarget.payload.targetId;\n const deviceId = deviceIdArg ?? undefined;\n const params = paramsArg;\n if (!params) return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params');\n if (!params.path) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params.path');\n }\n if (!params.messageHex) {\n return failure(HardwareErrorCode.InvalidParams, 'tronSignMessage requires params.messageHex');\n }\n // Firmware implements TIP-191 signMessageV2 only.\n if (params.messageType !== 'V2') {\n return failure(\n HardwareErrorCode.MethodNotSupported,\n 'Keystone signs TRON messages as TIP-191 signMessageV2 only (messageType: \"V2\")'\n );\n }\n const messageHex = stripHex(params.messageHex);\n const path = normalizePath(params.path);\n\n try {\n return await this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const { record } = await this._ensureWalletKnown(connectId, deviceId, 'tron', signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const requestId = uuidv4();\n const requestUr = this.urEngine.buildTronSignRequest({\n requestId,\n rawTxHex: messageHex,\n path,\n xfp: record.masterFingerprint,\n signType: TronSignType.PersonalMessage,\n });\n const responseUr = await this._resolveUr(\n record,\n requestUr,\n true,\n connectId,\n signal,\n 'tronSignMessage'\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const sig = this.urEngine.parseTronSignature(responseUr);\n KeystoneAdapter._assertRequestIdMatches(requestId, sig.requestId);\n return success<TronSignature>({ signature: sig.signature });\n });\n } catch (err) {\n return this._errorToFailure<TronSignature>(err);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n private _walletIdFromIdentifier(identifier: string): string | undefined {\n const value = identifier.startsWith(KEYSTONE_WALLET_CONNECT_ID_PREFIX)\n ? identifier.slice(KEYSTONE_WALLET_CONNECT_ID_PREFIX.length)\n : identifier;\n return /^[0-9a-f]{64}$/i.test(value) ? value.toLowerCase() : undefined;\n }\n\n private _allNetworkSyncSchema(\n item: AllNetworkAddressParams\n ): { hwkChain: ChainCapability; path: string } | undefined {\n if (!isAllNetworkMethodName(String(item.methodName)) || !item.path) return undefined;\n\n const method = item.methodName;\n const hwkChain = getAllNetworkMethodChain(method);\n const path = normalizePath(item.path);\n // Unsignable BTC accounts are refused by the per-item call; keep them out\n // of the prefetch so the device is not asked to export them.\n if (\n hwkChain === 'btc' &&\n !isKeystoneSignableBtcAccountPath(splitAccountPath(path).accountPath)\n ) {\n return undefined;\n }\n switch (method) {\n case 'evmGetAddress':\n case 'btcGetAddress':\n case 'tronGetAddress':\n return { hwkChain, path: splitAccountPath(path).accountPath };\n case 'btcGetPublicKey':\n case 'solGetAddress':\n return { hwkChain, path };\n default:\n return undefined;\n }\n }\n\n /**\n * QR is an interactive batch transport: one account-creation action must\n * produce one request QR and one response scan, regardless of how many\n * chains or derivation paths the host bundled. USB keeps its proven\n * one-path-at-a-time export flow because the device limits that channel.\n */\n private async _prefetchAllNetworkAccounts(\n connectId: string,\n deviceId: string,\n params: AllNetworkGetAddressParams\n ): Promise<{ book: AccountBook; walletId?: string }> {\n return this._jobQueue.enqueue(getKeystoneJobId(connectId, deviceId), async signal => {\n const target = this._resolveTarget(connectId, deviceId);\n const { record: targetRecord } = target;\n let record = targetRecord;\n\n const requestedByKey = new Map<string, { hwkChain: ChainCapability; path: string }>();\n for (const item of params.bundle) {\n const schema = this._allNetworkSyncSchema(item);\n if (schema) requestedByKey.set(accountKey(schema.hwkChain, schema.path), schema);\n }\n\n const book: AccountBook = new Map();\n if (!requestedByKey.size) {\n return { book };\n }\n\n // An operation routed to QR at connectDevice must stay on QR: attaching\n // USB here would export per path while `_resolveUr` still prompts a QR.\n const operation = isHardwareOperationId(params.operationId)\n ? this._operations.find(params.operationId)\n : undefined;\n const operationRoute = operation ? this._operationRoutes.get(operation.connectId) : undefined;\n const routedToQr =\n operationRoute?.operationId === operation?.operationId &&\n operationRoute?.connectionType === 'qr';\n\n if (\n this._forcedTransport !== 'qr' &&\n !routedToQr &&\n !record?.usbSessionId &&\n this._usbConnector &&\n target.expectedWalletId\n ) {\n record =\n (await this._tryUsbAttach(\n target.expectedWalletId,\n record?.masterFingerprint ?? target.expectedMasterFingerprint\n )) ?? record;\n KeystoneAdapter._throwIfAborted(signal);\n }\n\n // importFromQr remembers the record without clearing usbSessionId, so a\n // wallet with an earlier USB session still carries one when the user\n // comes back in through QR. Route, not the leftover session, decides.\n if (this._forcedTransport !== 'qr' && !routedToQr && record?.usbSessionId) {\n const bundleSessionId = record.usbSessionId;\n const assertBundleSession = () => {\n if (record?.usbSessionId !== bundleSessionId) {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'Keystone USB connection was lost during account export',\n });\n }\n };\n const missingSchemas = Array.from(requestedByKey.values());\n for (const schema of missingSchemas) {\n if (!book.has(accountKey(schema.hwkChain, schema.path))) {\n assertBundleSession();\n const synced = await this._fetchAccount(\n connectId,\n deviceId,\n schema.hwkChain,\n schema.path,\n signal,\n { book }\n );\n record = synced.record;\n assertBundleSession();\n }\n }\n for (const schema of missingSchemas) {\n if (!book.has(accountKey(schema.hwkChain, schema.path))) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Keystone did not return the requested derivation path (${schema.path})`,\n });\n }\n }\n return { book, walletId: record.walletId };\n }\n if (this._forcedTransport === 'usb') {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'USB channel is not connected for this Keystone wallet',\n });\n }\n\n const missingSchemas = Array.from(requestedByKey.values());\n\n const schemas = [\n { hwkChain: 'evm' as const, path: KEYSTONE_WALLET_ID_PATH },\n ...missingSchemas.filter(schema => normalizePath(schema.path) !== KEYSTONE_WALLET_ID_PATH),\n ];\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: schemas.map(schema => ({\n path: schema.path,\n curve: schema.hwkChain === 'sol' ? 'ed25519' : 'secp256k1',\n })),\n origin: this._origin,\n });\n const responseUr = await this._requestQrDisplayAndAwaitResponse(\n record ? toDeviceInfo(record) : placeholderDeviceInfo(),\n { ...requestUr, animated: false }\n );\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n this._assertParsedIdentity(parsed, target);\n record = this._upsertDeviceRecord(parsed);\n const requestedChainByPath = new Map(\n schemas.map(schema => [normalizePath(schema.path), schema.hwkChain] as const)\n );\n for (const account of parsed.accounts) {\n const normalizedPath = normalizePath(account.path);\n const hwkChain =\n requestedChainByPath.get(normalizedPath) ?? inferHwkChainFromPath(normalizedPath);\n if (hwkChain) {\n book.set(accountKey(hwkChain, normalizedPath), {\n ...account,\n hwkChain,\n });\n }\n }\n for (const schema of missingSchemas) {\n if (!book.has(accountKey(schema.hwkChain, schema.path))) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Keystone did not return the requested derivation path (${schema.path})`,\n });\n }\n }\n return { book, walletId: record.walletId };\n });\n }\n\n /**\n * Resolve only the stable 64-hex wallet identity. The 8-hex BIP32 master\n * fingerprint is protocol metadata and is never accepted as a lookup key.\n */\n private _resolveTarget(\n connectId?: string,\n deviceId?: string\n ): {\n record?: KeystoneDeviceRecord;\n expectedWalletId?: string;\n expectedMasterFingerprint?: string;\n } {\n let resolvedConnectId = connectId;\n if (isHardwareOperationId(connectId)) {\n resolvedConnectId = this._operations.resolve(connectId).connectId;\n }\n const identifiers = [deviceId, resolvedConnectId].filter((identifier): identifier is string =>\n Boolean(identifier)\n );\n if (!identifiers.length) return {};\n\n const walletIds = identifiers\n .map(identifier => this._walletIdFromIdentifier(identifier))\n .filter((walletId): walletId is string => Boolean(walletId));\n if (!walletIds.length) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceNotFound,\n message: 'Keystone device lookup requires a 64-hex wallet identity',\n });\n }\n\n const expectedWalletId = walletIds[0];\n if (walletIds.some(walletId => walletId !== expectedWalletId)) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone connectId and deviceId identify different wallets',\n });\n }\n if (identifiers.some(identifier => !this._walletIdFromIdentifier(identifier))) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone connectId and deviceId are inconsistent',\n });\n }\n\n const record = this._devices.get(expectedWalletId);\n return record\n ? {\n record,\n expectedWalletId,\n expectedMasterFingerprint: record.masterFingerprint,\n }\n : { expectedWalletId };\n }\n\n private _assertParsedIdentity(\n parsed: KeystoneParsedMultiAccounts,\n expected: { expectedWalletId?: string; expectedMasterFingerprint?: string }\n ): string {\n const walletId = deriveKeystoneWalletId(parsed.accounts);\n if (\n expected.expectedMasterFingerprint &&\n parsed.masterFingerprint !== expected.expectedMasterFingerprint\n ) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Connected Keystone wallet (mfp ${parsed.masterFingerprint}) does not match the requested wallet fingerprint (${expected.expectedMasterFingerprint})`,\n });\n }\n if (expected.expectedWalletId && walletId !== expected.expectedWalletId) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Connected Keystone wallet does not match the requested wallet identity',\n });\n }\n return walletId;\n }\n\n /**\n * Folds a parsed account-response UR into the device table. `viaUsb`\n * (defaults false) says which channel actually carried this round trip —\n * `_resolveUr` routes a KeyDerivation sync over USB when the target record\n * already has a live session, so this must NOT unconditionally mark\n * `qrSynced`, or a USB-only wallet would wrongly survive a later USB\n * disconnect as a \"QR-synced, demote to QR-only\" entry instead of being\n * dropped outright (see `releaseOperation`).\n */\n private _upsertDeviceRecord(\n parsed: KeystoneParsedMultiAccounts,\n options?: { viaUsb?: boolean; usbSessionId?: string }\n ): KeystoneDeviceRecord {\n const walletId = deriveKeystoneWalletId(parsed.accounts);\n let record = this._devices.get(walletId);\n const isNew = !record;\n if (!record) {\n record = createDeviceRecord(walletId, parsed.masterFingerprint);\n this._devices.set(walletId, record);\n } else if (record.masterFingerprint !== parsed.masterFingerprint) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone wallet identity returned an inconsistent master fingerprint',\n });\n }\n record.model = parsed.device ?? record.model;\n record.deviceVersion = parsed.deviceVersion ?? record.deviceVersion;\n record.hardwareDeviceId = parsed.deviceId ?? record.hardwareDeviceId;\n record.usbSessionId = options?.usbSessionId ?? record.usbSessionId;\n if (!options?.viaUsb) record.qrSynced = true;\n\n const info = toDeviceInfo(record);\n const eventType = isNew ? DEVICE.CONNECT : DEVICE.CHANGED;\n this.emitter.emit(eventType, { type: eventType, payload: info });\n return record;\n }\n\n /**\n * Opens+claims whatever Keystone the USB connector currently has\n * permission for, learns its protocol mfp via `getAppConfig`, then requests\n * one fixed account-level xpub and derives the stable wallet id. A\n * QR-synced entry becomes\n * `{qr, usb}`-capable in place (one `device-changed`, not a second\n * `device-connect`); a wallet never seen before becomes a new USB-only\n * entry. See §4.2 of the design doc.\n */\n private async _connectUsb(\n expected: {\n expectedWalletId?: string;\n expectedMasterFingerprint?: string;\n },\n searchTargetId?: string\n ): Promise<Response<DeviceInfo>> {\n if (this._pendingUsbTeardowns > 0) {\n return failure(\n HardwareErrorCode.DeviceBusyInternal,\n 'Keystone USB session is being released'\n );\n }\n const previous = this._usbConnectTail;\n let release: (() => void) | undefined;\n this._usbConnectTail = new Promise<void>(resolve => {\n release = resolve;\n });\n await previous;\n try {\n return await this._connectUsbExclusive(expected, searchTargetId);\n } finally {\n release?.();\n }\n }\n\n private async _connectUsbExclusive(\n expected: {\n expectedWalletId?: string;\n expectedMasterFingerprint?: string;\n },\n searchTargetId?: string\n ): Promise<Response<DeviceInfo>> {\n if (!this._usbConnector) {\n return failure(\n HardwareErrorCode.TransportNotAvailable,\n 'No USB connector configured for this Keystone adapter'\n );\n }\n let sessionId: string | undefined;\n try {\n let connectTarget: ConnectorConnectTarget = { type: 'default' };\n if (searchTargetId) {\n connectTarget = { type: 'search-target', searchTargetId };\n } else if (expected.expectedMasterFingerprint) {\n connectTarget = {\n type: 'expected-device-identity',\n deviceIdentity: expected.expectedMasterFingerprint,\n };\n }\n const connector = this._usbConnector;\n const session = await (connector.connectTarget\n ? connector.connectTarget(connectTarget)\n : connector.connect(searchTargetId ?? expected.expectedMasterFingerprint));\n sessionId = session.sessionId;\n const raw = session.deviceInfo.raw as { masterFingerprint?: unknown } | undefined;\n const mfpValue = parseBip32MasterFingerprint(raw?.masterFingerprint);\n if (!mfpValue) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone USB did not report a master fingerprint',\n });\n }\n const masterFingerprint = mfpValue.toLowerCase();\n if (\n expected.expectedMasterFingerprint &&\n masterFingerprint !== expected.expectedMasterFingerprint\n ) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Connected Keystone wallet (mfp ${masterFingerprint}) does not match the requested wallet fingerprint (${expected.expectedMasterFingerprint})`,\n });\n }\n\n const identityRequest = this.urEngine.buildKeyDerivationRequest({\n schemas: [{ path: KEYSTONE_WALLET_ID_PATH, curve: 'secp256k1' }],\n origin: this._origin,\n });\n const identityResult = await this._callUsbConnector(\n session.sessionId,\n 'resolveUr',\n identityRequest\n );\n if (!identityResult.success) {\n throw rehydrateConnectorError(identityResult.error);\n }\n const parsed = this.urEngine.parseAccountResponse(identityResult.payload as KeystoneUr);\n this._assertParsedIdentity(parsed, {\n ...expected,\n expectedMasterFingerprint: expected.expectedMasterFingerprint ?? masterFingerprint,\n });\n const walletId = deriveKeystoneWalletId(parsed.accounts);\n const previousUsbSessionId = this._devices.get(walletId)?.usbSessionId;\n const record = this._upsertDeviceRecord(parsed, {\n viaUsb: true,\n usbSessionId: session.sessionId,\n });\n if (previousUsbSessionId && previousUsbSessionId !== session.sessionId) {\n try {\n await this._usbConnector.disconnect(previousUsbSessionId);\n } catch {\n // The replacement session is authoritative even if stale teardown fails.\n }\n }\n record.hadUsbSession = true;\n record.model = session.deviceInfo.modelName ?? session.deviceInfo.model ?? record.model;\n record.deviceVersion = session.deviceInfo.firmwareVersion ?? record.deviceVersion;\n const info = toDeviceInfo(record);\n return success(info);\n } catch (err) {\n if (sessionId) {\n try {\n await this._usbConnector.disconnect(sessionId);\n } catch {\n // Preserve the identity/export failure; teardown is best-effort.\n }\n }\n return this._errorToFailure<DeviceInfo>(err);\n }\n }\n\n /**\n * Probe already-authorized USB devices without opening a permission picker,\n * then attach and verify the requested wallet when one is present. This is\n * used both after an adapter restart and after a QR-only period, so plugging\n * USB back in affects the next business call without changing an in-flight\n * QR operation.\n */\n private async _tryUsbAttach(\n expectedWalletId?: string,\n expectedMasterFingerprint?: string,\n options?: { waitForReenumeration?: boolean }\n ): Promise<KeystoneDeviceRecord | undefined> {\n if (!expectedWalletId || this._forcedTransport === 'qr' || !this._usbConnector) {\n return undefined;\n }\n\n const maxAttempts = options?.waitForReenumeration ? KEYSTONE_USB_REATTACH_PROBE_ATTEMPTS : 1;\n let availableDevices: ConnectorDevice[] = [];\n let lastSearchError: unknown;\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n // eslint-disable-next-line no-await-in-loop\n availableDevices = await this._usbConnector.searchDevices({ purpose: 'availability' });\n lastSearchError = undefined;\n } catch (error) {\n lastSearchError = error;\n }\n if (availableDevices.length) {\n break;\n }\n if (attempt < maxAttempts) {\n // eslint-disable-next-line no-await-in-loop\n await waitForKeystoneUsbReattachProbe();\n }\n }\n if (!availableDevices.length) {\n if (this._forcedTransport === 'usb' && lastSearchError) {\n throw lastSearchError instanceof Error\n ? lastSearchError\n : new Error(String(lastSearchError));\n }\n return undefined;\n }\n\n // Enumeration retries are silent. Perform the identity handshake only\n // once so a temporarily unhealthy channel cannot flash the device's\n // connection approval screen four times.\n let attached: Response<DeviceInfo> | undefined;\n let record: KeystoneDeviceRecord | undefined;\n const candidates = expectedMasterFingerprint ? [undefined] : availableDevices;\n for (const device of candidates) {\n // A cold adapter has only the persisted wallet id, not the short master\n // fingerprint. Probe each exact discovery target and verify the fixed\n // identity xpub before any business/signing request is dispatched.\n // eslint-disable-next-line no-await-in-loop\n attached = await this._connectUsb(\n { expectedWalletId, expectedMasterFingerprint },\n device?.connectId\n );\n if (attached.success) {\n record = this._devices.get(expectedWalletId);\n if (record) break;\n }\n }\n return record;\n }\n\n /**\n * The one place that decides QR vs. USB for a UR round trip and carries it\n * out. `record` is the (possibly not-yet-existing, for a true cold start)\n * device row for the target wallet. USB is the preferred channel: a known\n * wallet record with no live session gets ONE best-effort re-attach here,\n * and anything that goes wrong just leaves the call on QR. A\n * `switchTransport('qr')` pin forces QR even for a USB-attached wallet;\n * `switchTransport('usb')` on a wallet with no live USB session fails\n * closed rather than silently falling back to QR.\n */\n private async _resolveUr(\n record: KeystoneDeviceRecord | undefined,\n requestUr: KeystoneUr,\n animated: boolean,\n operationId: string | undefined,\n signal: AbortSignal,\n operationName?: string\n ): Promise<KeystoneUr> {\n const releaseOperationRetention = isHardwareOperationId(operationId)\n ? this._operations.retain(operationId)\n : undefined;\n try {\n return await this._resolveUrWithRoute(\n record,\n requestUr,\n animated,\n operationId,\n signal,\n operationName\n );\n } finally {\n releaseOperationRetention?.();\n }\n }\n\n private async _resolveUrWithRoute(\n record: KeystoneDeviceRecord | undefined,\n requestUr: KeystoneUr,\n animated: boolean,\n operationId: string | undefined,\n signal: AbortSignal,\n operationName?: string\n ): Promise<KeystoneUr> {\n let interactionRoute: { operationId: string; connectionType: 'usb' | 'qr' } | undefined;\n if (isHardwareOperationId(operationId)) {\n const operation = this._operations.resolve(operationId);\n const route = this._operationRoutes.get(operation.connectId);\n if (!route || route.operationId !== operationId) {\n this._operations.end(operationId, 'disconnect');\n throw createHwkError({\n code: HardwareErrorCode.OperationEnded,\n message: 'Keystone hardware operation is no longer connected',\n params: { operationId, reason: 'disconnect' },\n });\n }\n interactionRoute = route;\n }\n // USB is the preferred channel, so a record with no live session gets one\n // best-effort attempt to (re)attach before anything falls back to QR. This\n // covers an expired or physically disconnected USB session while the\n // adapter still knows the wallet. Cold adapter restarts are handled in\n // `_tryUsbAttach` before this method is called.\n //\n // Best-effort is the whole point — a failure here (nothing plugged in, a\n // different wallet on the bus, permission not granted) must NOT surface.\n // Leaving `usbSessionId` unset makes the code below route to QR on its\n // own, which is exactly the desired fallback: no error dialog, no retry\n // button, the user just gets the QR they would have gotten anyway.\n // Skipped when the caller pinned a transport explicitly.\n if (\n !interactionRoute &&\n !this._forcedTransport &&\n record &&\n !record.usbSessionId &&\n this._usbConnector\n ) {\n await this._tryUsbAttach(record.walletId, record.masterFingerprint, {\n waitForReenumeration: record.hadUsbSession,\n });\n }\n\n const wantUsb = interactionRoute\n ? interactionRoute.connectionType === 'usb'\n : this._forcedTransport === 'usb' ||\n (this._forcedTransport !== 'qr' && Boolean(record?.usbSessionId));\n if (wantUsb) {\n if (!record?.usbSessionId || !this._usbConnector) {\n if (interactionRoute) {\n this._operations.end(interactionRoute.operationId, 'disconnect');\n throw createHwkError({\n code: HardwareErrorCode.OperationEnded,\n message: 'Keystone operation USB connection was lost',\n params: {\n operationId: interactionRoute.operationId,\n reason: 'disconnect',\n },\n });\n }\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'USB channel is not connected for this Keystone wallet',\n });\n }\n const result = await this._callUsbConnector(\n record.usbSessionId,\n 'resolveUr',\n requestUr,\n signal\n );\n if (result.success) return result.payload as KeystoneUr;\n\n const usbError = rehydrateConnectorError(result.error);\n const usbErrorOrigin = (usbError as Error & { origin?: string }).origin;\n const usbErrorCode = (usbError as Error & { code?: number }).code;\n if (\n !interactionRoute &&\n !this._forcedTransport &&\n usbErrorCode === HardwareErrorCode.PayloadTooLarge &&\n usbErrorOrigin !== 'device'\n ) {\n const displayDevice = toDeviceInfo(record);\n return this._requestQrDisplayAndAwaitResponse(displayDevice, {\n ...requestUr,\n animated,\n });\n }\n // Deliberately does NOT retry over QR. By this point the request has\n // been put on the wire and the device may well be mid-operation —\n // showing a passphrase keyboard or a confirm screen. Swapping channels\n // here throws away work the user is in the middle of and asks them to\n // redo it a different way, which is worse than either succeeding or\n // failing. Channel selection happens once, before the request goes out.\n //\n // The case this used to cover — a cable pulled after connect, leaving a\n // stale session — is now handled at its source: the connector wires the\n // transport's disconnect listener, so an unplug drops the session and\n // the next call takes the attach path (which does fall back to QR).\n // Keep the session when the DEVICE answered. Declining on screen, a\n // locked device, the wrong wallet — none of those say anything about the\n // cable, and dropping the session there is what made \"cancel, then\n // retry and confirm\" impossible: the retry no longer had a live session\n // to reuse and had to re-open the transport from scratch. Only a failure\n // of the pipe itself makes the session untrustworthy.\n //\n // `origin` is authoritative when the mapper stamped it; the code list\n // below is the legacy fallback for errors that predate the field.\n const deviceAnswered =\n usbErrorOrigin !== undefined\n ? usbErrorOrigin === 'device'\n : usbErrorCode === HardwareErrorCode.UserRejected ||\n usbErrorCode === HardwareErrorCode.UserAborted ||\n usbErrorCode === HardwareErrorCode.DeviceLocked ||\n usbErrorCode === HardwareErrorCode.DeviceMismatch;\n if (!deviceAnswered) {\n // The pipe failed, not the device. Hand the session back to the\n // connector so its transport and disconnect listener are released and\n // the host hears the wallet drop to QR-only; `_handleUsbDisconnect`\n // clears `usbSessionId` on the way through.\n const lostSessionId = record.usbSessionId;\n if (lostSessionId) {\n this._usbConnector?.disconnect(lostSessionId).catch(() => undefined);\n }\n record.usbSessionId = undefined;\n if (interactionRoute) {\n this._operations.end(interactionRoute.operationId, 'disconnect');\n throw createHwkError({\n code: HardwareErrorCode.OperationEnded,\n message: operationName\n ? `Keystone ${operationName} may have completed before the USB connection was lost`\n : 'Keystone operation USB connection was lost',\n recovery: operationName ? { scope: 'unknown' } : undefined,\n params: operationName\n ? operationMayHaveCompletedParams(operationName, {\n operationId: interactionRoute.operationId,\n reason: 'disconnect',\n })\n : {\n operationId: interactionRoute.operationId,\n reason: 'disconnect',\n },\n });\n }\n if (operationName) {\n throw createHwkError({\n code: (usbErrorCode as HardwareErrorCode) ?? HardwareErrorCode.TransportError,\n message: `Keystone ${operationName} may have completed before the USB connection was lost`,\n origin: 'transport',\n recovery: { scope: 'unknown' },\n params: operationMayHaveCompletedParams(operationName),\n });\n }\n }\n throw usbError;\n }\n\n const displayDevice = record ? toDeviceInfo(record) : placeholderDeviceInfo();\n try {\n return await this._requestQrDisplayAndAwaitResponse(displayDevice, {\n ...requestUr,\n animated,\n });\n } catch (error) {\n const { code, _tag: tag } = error as { code?: unknown; _tag?: unknown };\n if (\n operationName &&\n (code === HardwareErrorCode.OperationTimeout || tag === UI_REQUEST_TIMEOUT_TAG)\n ) {\n throw createHwkError({\n code: HardwareErrorCode.OperationTimeout,\n message: `Keystone ${operationName} may have completed before the QR response timed out`,\n recovery: { scope: 'unknown' },\n params: operationMayHaveCompletedParams(operationName),\n });\n }\n throw error;\n }\n }\n\n /**\n * Fetch one account's key material from the device for this operation only.\n * `book` lets earlier fetches of the same operation be reused; nothing is\n * retained on the record. A failed USB export ends this operation without\n * replaying the request or switching transports.\n */\n private async _fetchAccount(\n connectId: string | undefined,\n deviceId: string | undefined,\n hwkChain: ChainCapability,\n syncPath: string,\n signal: AbortSignal,\n options?: {\n book?: AccountBook;\n }\n ): Promise<{ record: KeystoneDeviceRecord; account: KeystoneAccountEntry }> {\n const target = this._resolveTarget(connectId, deviceId);\n const key = accountKey(hwkChain, syncPath);\n\n let existingRecord = target.record;\n if (!existingRecord) {\n const attached = await this._tryUsbAttach(target.expectedWalletId);\n KeystoneAdapter._throwIfAborted(signal);\n existingRecord = attached;\n }\n const book = options?.book;\n const booked = book?.get(key);\n if (existingRecord && booked) {\n return { record: existingRecord, account: booked };\n }\n if (existingRecord && !existingRecord.usbSessionId && this._forcedTransport === 'usb') {\n // Pinned to USB without a session: attach here so enumeration errors\n // surface (resolveUr skips its probe for pinned transports).\n await this._tryUsbAttach(existingRecord.walletId, existingRecord.masterFingerprint, {\n waitForReenumeration: existingRecord.hadUsbSession,\n });\n KeystoneAdapter._throwIfAborted(signal);\n existingRecord = this._devices.get(existingRecord.walletId) ?? existingRecord;\n }\n\n // Match the proven browser-demo flow: USB exports one missing account path\n // per request, while QR keeps its batched import flow. The all-network API\n // still returns one result bundle after these per-chain calls complete.\n const useSinglePathUsbExport =\n this._forcedTransport !== 'qr' && Boolean(existingRecord?.usbSessionId);\n const requestedSchemaPaths: Array<{ hwkChain: ChainCapability; path: string }> = [\n { hwkChain, path: syncPath },\n ];\n const schemaPaths =\n useSinglePathUsbExport ||\n requestedSchemaPaths.some(schema => normalizePath(schema.path) === KEYSTONE_WALLET_ID_PATH)\n ? requestedSchemaPaths\n : [{ hwkChain: 'evm' as const, path: KEYSTONE_WALLET_ID_PATH }, ...requestedSchemaPaths];\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas: schemaPaths.map(s => ({\n path: s.path,\n curve: s.hwkChain === 'sol' ? 'ed25519' : 'secp256k1',\n })),\n origin: this._origin,\n });\n const resolvedViaUsb = useSinglePathUsbExport;\n const responseUr = await this._resolveUr(existingRecord, requestUr, false, connectId, signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n let record: KeystoneDeviceRecord;\n if (resolvedViaUsb && existingRecord) {\n if (parsed.masterFingerprint !== existingRecord.masterFingerprint) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: 'Keystone USB account export returned a different master fingerprint',\n });\n }\n record = existingRecord;\n } else {\n this._assertParsedIdentity(parsed, target);\n record = this._upsertDeviceRecord(parsed, {\n viaUsb: Boolean(existingRecord?.usbSessionId),\n });\n }\n const account = parsed.accounts.find(a => normalizePath(a.path) === syncPath);\n if (!account) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message: `Keystone did not return the requested derivation path (${syncPath})`,\n });\n }\n const entry: KeystoneAccountEntry = { ...account, hwkChain };\n if (book) {\n // Everything the device answered stays usable for this operation.\n for (const returned of parsed.accounts) {\n const returnedChain = inferHwkChainFromPath(returned.path);\n if (returnedChain) {\n book.set(accountKey(returnedChain, returned.path), {\n ...returned,\n hwkChain: returnedChain,\n });\n }\n }\n book.set(key, entry);\n }\n return { record, account: entry };\n }\n\n /**\n * Like `_fetchAccount`, but for operations (PSBT signing, master\n * fingerprint) that only need to know WHICH wallet is attached, not a\n * specific cached path. Syncs the account-level path for `chain` as a\n * throwaway probe when the wallet record isn't already known.\n *\n * `CHAIN_FINGERPRINT_PATHS[chain]` is a 5-segment LEAF path for `evm`\n * (`m/44'/60'/0'/0/0`) — sending that verbatim as a KeyDerivation request\n * asks Keystone for a non-standard path. Keystone's own docs\n * (dev.keyst.one's multichain KeyDerivation example) show the ETH\n * account-level path as `m/44'/60'/0'` (3 segments), same as what\n * `_fetchAccount` already requests — so\n * truncate through `splitAccountPath` here too instead of using the raw\n * fingerprint leaf path. `btc`/`sol` are already 3-segment account paths\n * and pass through unchanged.\n */\n private async _ensureWalletKnown(\n connectId: string | undefined,\n deviceId: string | undefined,\n chain: ChainForFingerprint,\n signal: AbortSignal\n ): Promise<{ record: KeystoneDeviceRecord }> {\n const target = this._resolveTarget(connectId, deviceId);\n if (target.record) return { record: target.record };\n\n const attached = await this._tryUsbAttach(target.expectedWalletId);\n KeystoneAdapter._throwIfAborted(signal);\n if (attached) return { record: attached };\n\n // No known or restorable USB record remains, so continue with QR.\n const { accountPath } = splitAccountPath(CHAIN_FINGERPRINT_PATHS[chain]);\n const schemas =\n accountPath === KEYSTONE_WALLET_ID_PATH\n ? [{ path: KEYSTONE_WALLET_ID_PATH, curve: 'secp256k1' as const }]\n : [\n { path: KEYSTONE_WALLET_ID_PATH, curve: 'secp256k1' as const },\n {\n path: accountPath,\n curve: chain === 'sol' ? ('ed25519' as const) : ('secp256k1' as const),\n },\n ];\n const requestUr = this.urEngine.buildKeyDerivationRequest({\n schemas,\n origin: this._origin,\n });\n const responseUr = await this._resolveUr(undefined, requestUr, false, connectId, signal);\n KeystoneAdapter._throwIfAborted(signal);\n\n const parsed = this.urEngine.parseAccountResponse(responseUr);\n this._assertParsedIdentity(parsed, target);\n const record = this._upsertDeviceRecord(parsed);\n return { record };\n }\n\n private async _requestQrDisplayAndAwaitResponse(\n device: DeviceInfo,\n data: QrDisplayData\n ): Promise<KeystoneUr> {\n const waitPromise = this._uiRegistry.wait<{ urType: string; urData: string }>(\n UI_REQUEST.REQUEST_QR_DISPLAY,\n { timeoutMs: this._qrTimeoutMs }\n );\n this.emitter.emit(UI_REQUEST.REQUEST_QR_DISPLAY, {\n type: UI_REQUEST.REQUEST_QR_DISPLAY,\n payload: { device, data },\n });\n const response = await waitPromise;\n return { urType: response.urType, urData: response.urData };\n }\n\n private async _requestQrScanAndAwaitResponse(device: DeviceInfo): Promise<KeystoneUr> {\n const waitPromise = this._uiRegistry.wait<{ urType: string; urData: string }>(\n UI_REQUEST.REQUEST_QR_SCAN,\n { timeoutMs: this._qrTimeoutMs }\n );\n this.emitter.emit(UI_REQUEST.REQUEST_QR_SCAN, {\n type: UI_REQUEST.REQUEST_QR_SCAN,\n payload: { device },\n });\n const response = await waitPromise;\n return { urType: response.urType, urData: response.urData };\n }\n\n private async _callUsbConnector(\n sessionId: string,\n method: string,\n params: unknown,\n signal?: AbortSignal\n ): Promise<ConnectorCallResult> {\n if (!this._usbConnector) {\n throw createHwkError({\n code: HardwareErrorCode.TransportNotAvailable,\n message: 'No USB connector configured for this Keystone adapter',\n });\n }\n if (this._pendingUsbTeardowns > 0 || this._unsettledUsbOperations.size > 0) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceBusyInternal,\n message: `Keystone USB is busy while calling ${method}`,\n });\n }\n const releaseOperation = this._retainUsbOperation(`call:${sessionId}`);\n let rawCall: Promise<ConnectorCallResult>;\n try {\n const connector = this._usbConnector;\n rawCall = connector.call(sessionId, method, params).finally(releaseOperation);\n } catch (error) {\n releaseOperation();\n throw error;\n }\n return signal ? KeystoneAdapter._abortable(signal, rawCall) : rawCall;\n }\n\n private _runUsbTeardown(task: () => Promise<void>): Promise<void> {\n const previous = this._usbTeardownTail;\n let releaseTail: () => void = () => undefined;\n this._usbTeardownTail = new Promise<void>(resolve => {\n releaseTail = resolve;\n });\n this._pendingUsbTeardowns += 1;\n return (async () => {\n try {\n await previous;\n await this._waitForUsbOperationsToDrain();\n await task();\n } finally {\n this._pendingUsbTeardowns -= 1;\n releaseTail();\n }\n })();\n }\n\n private _waitForUsbOperationsToDrain(): Promise<void> {\n if (this._unsettledUsbOperations.size === 0) return Promise.resolve();\n return new Promise(resolve => {\n this._usbIdleWaiters.add(resolve);\n });\n }\n\n private _retainUsbOperation(key: string): () => void {\n this._unsettledUsbOperations.set(key, (this._unsettledUsbOperations.get(key) ?? 0) + 1);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const remaining = (this._unsettledUsbOperations.get(key) ?? 1) - 1;\n if (remaining > 0) {\n this._unsettledUsbOperations.set(key, remaining);\n } else {\n this._unsettledUsbOperations.delete(key);\n }\n if (this._unsettledUsbOperations.size === 0) {\n for (const resolve of this._usbIdleWaiters) resolve();\n this._usbIdleWaiters.clear();\n }\n };\n }\n\n private static _abortable<T>(signal: AbortSignal, promise: Promise<T>): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(signal.reason instanceof Error ? signal.reason : new Error('Aborted'));\n }\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n reject(signal.reason instanceof Error ? signal.reason : new Error('Aborted'));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n value => {\n signal.removeEventListener('abort', onAbort);\n resolve(value);\n },\n error => {\n signal.removeEventListener('abort', onAbort);\n reject(error);\n }\n );\n });\n }\n\n private static _throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw signal.reason instanceof Error ? signal.reason : new Error('Operation aborted');\n }\n }\n\n private static _assertRequestIdMatches(expected: string, actual?: string): void {\n if (actual && actual.toLowerCase() !== expected.toLowerCase()) {\n throw createHwkError({\n code: HardwareErrorCode.DeviceMismatch,\n message:\n 'Keystone response requestId does not match the pending request — discarding a stale or unrelated scan',\n });\n }\n }\n\n private _unsupported<T>(method: string, reason: string): Promise<Response<T>> {\n return Promise.resolve(\n failure(\n HardwareErrorCode.MethodNotSupported,\n `KeystoneAdapter.${method} is not implemented yet: ${reason}`\n )\n );\n }\n\n private _errorToFailure<T>(err: unknown): Response<T> {\n if (err && typeof err === 'object') {\n const e = err as {\n code?: unknown;\n message?: string;\n params?: Record<string, unknown>;\n _tag?: string;\n recovery?: unknown;\n };\n // Only five-digit HWK codes are already-mapped errors. A low-numbered\n // `.code` (a DOMException's legacy code, an errno) would otherwise\n // escape as a bogus HWK code and break the range contract; those fall\n // through to UnknownError below and keep their message.\n if (typeof e.code === 'number' && e.code >= 10000 && e.code <= 99999) {\n const { origin } = e as { origin?: unknown };\n return failure(\n e.code as HardwareErrorCode,\n e.message ?? 'Unknown error',\n e.params,\n origin === 'device' || origin === 'transport' || origin === 'host' ? origin : undefined,\n isHwkRecoveryHint(e.recovery) ? e.recovery : undefined\n );\n }\n if (e._tag === UI_REQUEST_CANCELLED_TAG || e._tag === UI_REQUEST_PREEMPTED_TAG) {\n return failure(\n HardwareErrorCode.UserAborted,\n e.message ?? 'Keystone QR operation was cancelled'\n );\n }\n if (e._tag === UI_REQUEST_TIMEOUT_TAG) {\n return failure(\n HardwareErrorCode.OperationTimeout,\n e.message ?? 'Keystone QR operation timed out'\n );\n }\n }\n const message = err instanceof Error ? err.message : String(err);\n // An unrecognized JS error (not a coded HwkError) reaching here is\n // usually a real bug, not a device/user condition — keep the stack so\n // the app/demo can surface it without needing a debugger attached.\n const params = err instanceof Error && err.stack ? { stack: err.stack } : undefined;\n return failure(HardwareErrorCode.UnknownError, message, params);\n }\n}\n","import { deriveWalletId } from '@onekeyfe/hwk-adapter-core';\n\nimport { normalizePath } from './pathUtils';\n\nimport type { KeystoneParsedAccount } from '../urEngine/types';\nimport type { ChainCapability, DeviceCapabilities, DeviceInfo } from '@onekeyfe/hwk-adapter-core';\n\nexport const KEYSTONE_WALLET_CONNECT_ID_PREFIX = 'keystone-wallet:';\n\n/** Fixed public source used to derive a collision-resistant wallet id. */\nexport const KEYSTONE_WALLET_ID_PATH = \"m/44'/60'/0'\";\n\nexport function walletConnectId(walletId: string): string {\n return `${KEYSTONE_WALLET_CONNECT_ID_PREFIX}${walletId}`;\n}\n\nexport interface KeystoneAccountEntry extends KeystoneParsedAccount {\n hwkChain: ChainCapability;\n}\n\nexport function accountKey(hwkChain: ChainCapability, path: string): string {\n return `${hwkChain}:${normalizePath(path)}`;\n}\n\nexport interface KeystoneDeviceRecord {\n /** SHA-256 id derived from the fixed account-level identity xpub. */\n walletId: string;\n /** Lowercase 8-char BIP32 fingerprint used by BC-UR as xfp, never as identity. */\n masterFingerprint: string;\n connectId: string;\n /** Optional physical-device id exposed by some Keystone QR export menus. */\n hardwareDeviceId?: string;\n /** Model string from the device (e.g. \"Keystone 3 Pro\"); not unique per unit. */\n model?: string;\n deviceVersion?: string;\n importedAt: number;\n /**\n * Set to the connector's process-local `sessionId` once a live USB session exists for\n * this wallet. Cleared by `releaseOperation`. Presence of this field is\n * what `KeystoneAdapter._resolveUr` uses to route a call over USB instead\n * of QR.\n */\n usbSessionId?: string;\n /**\n * Remains true after a live USB session is lost. It allows the adapter to\n * wait through the device's short USB re-enumeration window without making\n * wallets that have only ever used QR pay the same retry delay.\n */\n hadUsbSession?: boolean;\n /**\n * True once this wallet has completed at least one QR round trip.\n * Distinguishes \"USB session dropped but this wallet was also QR-synced —\n * fall back to a QR-only entry\" from \"this was a USB-only wallet that\n * never synced over QR — drop the entry entirely\" on USB disconnect.\n */\n qrSynced?: boolean;\n}\n\nexport function deriveKeystoneWalletId(accounts: KeystoneParsedAccount[]): string {\n const identityAccount = accounts.find(\n account => normalizePath(account.path) === KEYSTONE_WALLET_ID_PATH\n );\n if (!identityAccount?.extendedPublicKey) {\n throw new Error(\n `Keystone identity response is missing the extended public key at ${KEYSTONE_WALLET_ID_PATH}`\n );\n }\n return deriveWalletId(\n `keystone:secp256k1:${KEYSTONE_WALLET_ID_PATH}:${identityAccount.extendedPublicKey.trim()}`\n );\n}\n\nexport function createDeviceRecord(\n walletId: string,\n masterFingerprint: string\n): KeystoneDeviceRecord {\n return {\n walletId,\n masterFingerprint,\n connectId: walletConnectId(walletId),\n importedAt: Date.now(),\n };\n}\n\nconst CAPABILITIES: DeviceCapabilities = { persistentDeviceIdentity: true };\n\nexport function toDeviceInfo(record: KeystoneDeviceRecord): DeviceInfo {\n // `connectionType` reflects the channel a call would currently be routed\n // over (USB preferred when live — see `KeystoneAdapter._resolveUr`), not\n // just \"however this record was first created\". `raw.availableChannels`\n // carries the full picture for a merged (QR + USB) wallet — see §4.2 of\n // docs/design/keystone-integration/README.md.\n let availableChannels: Array<'qr' | 'usb'> = ['qr'];\n if (record.usbSessionId) {\n availableChannels = record.qrSynced ? ['qr', 'usb'] : ['usb'];\n }\n return {\n vendor: 'keystone',\n model: record.model ?? 'unknown',\n modelName: record.model,\n firmwareVersion: record.deviceVersion ?? '0.0.0',\n deviceId: record.walletId,\n connectId: record.connectId,\n connectionType: record.usbSessionId ? 'usb' : 'qr',\n capabilities: CAPABILITIES,\n raw: {\n availableChannels,\n masterFingerprint: record.masterFingerprint,\n hardwareDeviceId: record.hardwareDeviceId,\n },\n };\n}\n\n/** A device row for a wallet the adapter hasn't synced yet — used while a cold-start round trip is in flight. */\nexport function placeholderDeviceInfo(): DeviceInfo {\n return {\n vendor: 'keystone',\n model: 'unknown',\n firmwareVersion: '0.0.0',\n deviceId: '',\n connectId: '',\n connectionType: 'qr',\n capabilities: CAPABILITIES,\n };\n}\n","import type { BtcScriptType } from '../urEngine/types';\n\n/** Always returns an `m/`-prefixed path, regardless of the input's casing/prefix. */\nexport function normalizePath(path: string): string {\n const trimmed = path.trim();\n return /^m\\//i.test(trimmed) ? `m/${trimmed.slice(2)}` : `m/${trimmed}`;\n}\n\n/**\n * Split a full BIP-44 leaf path (`purpose'/coin'/account'/change/index`, 5\n * segments) into its 3-segment account path and the relative `change/index`\n * path from that account to the leaf. Matches the OneKey Keystone air-gap\n * demo's `removePathLastSegment({removeCount: 2})` convention, which is\n * verified against real Keystone hardware.\n *\n * A path with 3 or fewer segments IS already an account path (or shorter) —\n * BIP-44's account level is exactly 3 hardened components — so there is\n * nothing to split off: `relativeDerivePath` is empty and `accountPath` is\n * the (normalized) input unchanged.\n */\nexport function splitAccountPath(path: string): {\n accountPath: string;\n relativeDerivePath: string;\n} {\n const normalized = normalizePath(path);\n const segments = normalized.slice(2).split('/');\n if (segments.length <= 3) {\n return { accountPath: normalized, relativeDerivePath: '' };\n }\n const accountSegments = segments.slice(0, segments.length - 2);\n const relativeSegments = segments.slice(segments.length - 2);\n return {\n accountPath: `m/${accountSegments.join('/')}`,\n relativeDerivePath: relativeSegments.join('/'),\n };\n}\n\n/**\n * Standard BIP-44/49/84/86 purpose → script-type mapping. Returns `undefined`\n * for a path whose purpose isn't one of these four (or isn't parseable),\n * rather than guessing.\n */\nexport function btcScriptTypeFromPath(path: string): BtcScriptType | undefined {\n const match = normalizePath(path).match(/^m\\/(\\d+)'/);\n if (!match) return undefined;\n switch (Number(match[1])) {\n case 44:\n return 'p2pkh';\n case 49:\n return 'p2sh-p2wpkh';\n case 84:\n return 'p2wpkh';\n case 86:\n return 'p2tr';\n default:\n return undefined;\n }\n}\n\n/**\n * Keystone firmware signs BTC only against account-0 xpubs (gui_btc.c\n * PreparePublicKeys). Testnet (coin 1') is excluded on top of that: this\n * package derives every BTC address with mainnet parameters, so admitting a\n * testnet path would hand back a mainnet address for a testnet account.\n */\nexport function isKeystoneSignableBtcAccountPath(accountPath: string): boolean {\n const segments = normalizePath(accountPath).slice(2).split('/');\n if (segments.length !== 3) return false;\n const [purpose, coin, account] = segments;\n return [\"44'\", \"49'\", \"84'\", \"86'\"].includes(purpose) && coin === \"0'\" && account === \"0'\";\n}\n\nexport const KEYSTONE_BTC_ACCOUNT_FORBIDDEN_MESSAGE =\n \"Keystone BTC is limited to mainnet account 0 (m/44'|49'|84'|86'/0'/0')\";\n"],"mappings":"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","names":["import_bc_ur_registry","decodeToDataItem","decodeToDataItem","HDKey","uuidParse","uuidStringify","bs58check","import_uuid","import_hwk_adapter_core","import_hwk_adapter_core","resolveGenericHardwareOperationTarget","uuidv4","bs58","missingSchemas","displayDevice"]}
|