@ledgerhq/revault-sdk 0.29.1 → 0.29.2
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/lib/{device-DgFn_PG4.cjs → device-BT5YbF2y.cjs} +2 -2
- package/lib/{device-DgFn_PG4.cjs.map → device-BT5YbF2y.cjs.map} +1 -1
- package/lib/{device-FfbMtrzj.js → device-CcE29Cid.js} +2 -2
- package/lib/{device-FfbMtrzj.js.map → device-CcE29Cid.js.map} +1 -1
- package/lib/device.cjs +1 -1
- package/lib/device.js +1 -1
- package/lib/engine.cjs +1 -1
- package/lib/engine.js +1 -1
- package/package.json +10 -10
|
@@ -92,7 +92,7 @@ var require_is_retry_allowed = /* @__PURE__ */ require_rolldown_runtime.__common
|
|
|
92
92
|
module.exports = (error) => !denyList.has(error && error.code);
|
|
93
93
|
}));
|
|
94
94
|
//#endregion
|
|
95
|
-
//#region ../../node_modules/.pnpm/axios-retry@4.5.0_axios@1.
|
|
95
|
+
//#region ../../node_modules/.pnpm/axios-retry@4.5.0_axios@1.20.0/node_modules/axios-retry/dist/esm/index.js
|
|
96
96
|
var import_is_retry_allowed = /* @__PURE__ */ require_rolldown_runtime.__toESM(require_is_retry_allowed());
|
|
97
97
|
const namespace = "axios-retry";
|
|
98
98
|
function isNetworkError(error) {
|
|
@@ -1129,4 +1129,4 @@ Object.defineProperty(exports, "withDevicePolling", {
|
|
|
1129
1129
|
}
|
|
1130
1130
|
});
|
|
1131
1131
|
|
|
1132
|
-
//# sourceMappingURL=device-
|
|
1132
|
+
//# sourceMappingURL=device-BT5YbF2y.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-DgFn_PG4.cjs","names":["isRetryAllowed","uuidv4","throwError","Observable","catchError","mergeMap","timer","retryWhen"],"sources":["../src/device/abort.ts","../../../node_modules/.pnpm/is-retry-allowed@2.2.0/node_modules/is-retry-allowed/index.js","../../../node_modules/.pnpm/axios-retry@4.5.0_axios@1.19.0/node_modules/axios-retry/dist/esm/index.js","../src/device/constants.ts","../src/device/api-device.ts","../../../node_modules/.pnpm/@ledgerhq+errors@6.36.0/node_modules/@ledgerhq/errors/lib-es/helpers.js","../../../node_modules/.pnpm/@ledgerhq+errors@6.36.0/node_modules/@ledgerhq/errors/lib-es/index.js","../src/device/device-access.ts","../src/device/utils.ts"],"sourcesContent":["/** Error returned when the application aborts a device operation. */\nexport class DeviceOperationAbortedError extends Error {\n constructor() {\n super(\"Device operation aborted\");\n this.name = \"DeviceOperationAbortedError\";\n }\n}\n\nexport type DeviceOperationOptions = {\n /** Stops this operation when the application no longer owns the interaction. */\n signal?: AbortSignal;\n};\n\nexport const isDeviceOperationAbortedError = (\n error: unknown,\n): error is DeviceOperationAbortedError =>\n error instanceof Error && error.name === \"DeviceOperationAbortedError\";\n\nexport const throwIfDeviceOperationAborted = (signal?: AbortSignal): void => {\n if (signal?.aborted) {\n throw new DeviceOperationAbortedError();\n }\n};\n\nexport const withDeviceOperationSignal = <T>(\n operation: () => Promise<T>,\n signal?: AbortSignal,\n): Promise<T> => {\n try {\n throwIfDeviceOperationAborted(signal);\n } catch (error) {\n return Promise.reject(error);\n }\n if (!signal) return Promise.resolve().then(operation);\n\n return new Promise<T>((resolve, reject) => {\n const onAbort = (): void => reject(new DeviceOperationAbortedError());\n signal.addEventListener(\"abort\", onAbort, { once: true });\n Promise.resolve()\n .then(() => {\n throwIfDeviceOperationAborted(signal);\n return operation();\n })\n .then(resolve, (error: unknown) => {\n reject(signal.aborted ? new DeviceOperationAbortedError() : error);\n })\n .finally(() => signal.removeEventListener(\"abort\", onAbort));\n });\n};\n\nexport const deviceOperationDelay = (delay: number, signal?: AbortSignal): Promise<void> => {\n try {\n throwIfDeviceOperationAborted(signal);\n } catch (error) {\n return Promise.reject(error);\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delay);\n const onAbort = (): void => {\n clearTimeout(timeout);\n reject(new DeviceOperationAbortedError());\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n};\n","'use strict';\n\nconst denyList = new Set([\n\t'ENOTFOUND',\n\t'ENETUNREACH',\n\n\t// SSL errors from https://github.com/nodejs/node/blob/fc8e3e2cdc521978351de257030db0076d79e0ab/src/crypto/crypto_common.cc#L301-L328\n\t'UNABLE_TO_GET_ISSUER_CERT',\n\t'UNABLE_TO_GET_CRL',\n\t'UNABLE_TO_DECRYPT_CERT_SIGNATURE',\n\t'UNABLE_TO_DECRYPT_CRL_SIGNATURE',\n\t'UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY',\n\t'CERT_SIGNATURE_FAILURE',\n\t'CRL_SIGNATURE_FAILURE',\n\t'CERT_NOT_YET_VALID',\n\t'CERT_HAS_EXPIRED',\n\t'CRL_NOT_YET_VALID',\n\t'CRL_HAS_EXPIRED',\n\t'ERROR_IN_CERT_NOT_BEFORE_FIELD',\n\t'ERROR_IN_CERT_NOT_AFTER_FIELD',\n\t'ERROR_IN_CRL_LAST_UPDATE_FIELD',\n\t'ERROR_IN_CRL_NEXT_UPDATE_FIELD',\n\t'OUT_OF_MEM',\n\t'DEPTH_ZERO_SELF_SIGNED_CERT',\n\t'SELF_SIGNED_CERT_IN_CHAIN',\n\t'UNABLE_TO_GET_ISSUER_CERT_LOCALLY',\n\t'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\n\t'CERT_CHAIN_TOO_LONG',\n\t'CERT_REVOKED',\n\t'INVALID_CA',\n\t'PATH_LENGTH_EXCEEDED',\n\t'INVALID_PURPOSE',\n\t'CERT_UNTRUSTED',\n\t'CERT_REJECTED',\n\t'HOSTNAME_MISMATCH'\n]);\n\n// TODO: Use `error?.code` when targeting Node.js 14\nmodule.exports = error => !denyList.has(error && error.code);\n","import isRetryAllowed from 'is-retry-allowed';\nexport const namespace = 'axios-retry';\nexport function isNetworkError(error) {\n const CODE_EXCLUDE_LIST = ['ERR_CANCELED', 'ECONNABORTED'];\n if (error.response) {\n return false;\n }\n if (!error.code) {\n return false;\n }\n // Prevents retrying timed out & cancelled requests\n if (CODE_EXCLUDE_LIST.includes(error.code)) {\n return false;\n }\n // Prevents retrying unsafe errors\n return isRetryAllowed(error);\n}\nconst SAFE_HTTP_METHODS = ['get', 'head', 'options'];\nconst IDEMPOTENT_HTTP_METHODS = SAFE_HTTP_METHODS.concat(['put', 'delete']);\nexport function isRetryableError(error) {\n return (error.code !== 'ECONNABORTED' &&\n (!error.response ||\n error.response.status === 429 ||\n (error.response.status >= 500 && error.response.status <= 599)));\n}\nexport function isSafeRequestError(error) {\n if (!error.config?.method) {\n // Cannot determine if the request can be retried\n return false;\n }\n return isRetryableError(error) && SAFE_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\nexport function isIdempotentRequestError(error) {\n if (!error.config?.method) {\n // Cannot determine if the request can be retried\n return false;\n }\n return isRetryableError(error) && IDEMPOTENT_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\nexport function isNetworkOrIdempotentRequestError(error) {\n return isNetworkError(error) || isIdempotentRequestError(error);\n}\nexport function retryAfter(error = undefined) {\n const retryAfterHeader = error?.response?.headers['retry-after'];\n if (!retryAfterHeader) {\n return 0;\n }\n // if the retry after header is a number, convert it to milliseconds\n let retryAfterMs = (Number(retryAfterHeader) || 0) * 1000;\n // If the retry after header is a date, get the number of milliseconds until that date\n if (retryAfterMs === 0) {\n retryAfterMs = (new Date(retryAfterHeader).valueOf() || 0) - Date.now();\n }\n return Math.max(0, retryAfterMs);\n}\nfunction noDelay(_retryNumber = 0, error = undefined) {\n return Math.max(0, retryAfter(error));\n}\nexport function exponentialDelay(retryNumber = 0, error = undefined, delayFactor = 100) {\n const calculatedDelay = 2 ** retryNumber * delayFactor;\n const delay = Math.max(calculatedDelay, retryAfter(error));\n const randomSum = delay * 0.2 * Math.random(); // 0-20% of the delay\n return delay + randomSum;\n}\n/**\n * Linear delay\n * @param {number | undefined} delayFactor - delay factor in milliseconds (default: 100)\n * @returns {function} (retryNumber: number, error: AxiosError | undefined) => number\n */\nexport function linearDelay(delayFactor = 100) {\n return (retryNumber = 0, error = undefined) => {\n const delay = retryNumber * delayFactor;\n return Math.max(delay, retryAfter(error));\n };\n}\nexport const DEFAULT_OPTIONS = {\n retries: 3,\n retryCondition: isNetworkOrIdempotentRequestError,\n retryDelay: noDelay,\n shouldResetTimeout: false,\n onRetry: () => { },\n onMaxRetryTimesExceeded: () => { },\n validateResponse: null\n};\nfunction getRequestOptions(config, defaultOptions) {\n return { ...DEFAULT_OPTIONS, ...defaultOptions, ...config[namespace] };\n}\nfunction setCurrentState(config, defaultOptions, resetLastRequestTime = false) {\n const currentState = getRequestOptions(config, defaultOptions || {});\n currentState.retryCount = currentState.retryCount || 0;\n if (!currentState.lastRequestTime || resetLastRequestTime) {\n currentState.lastRequestTime = Date.now();\n }\n config[namespace] = currentState;\n return currentState;\n}\nfunction fixConfig(axiosInstance, config) {\n // @ts-ignore\n if (axiosInstance.defaults.agent === config.agent) {\n // @ts-ignore\n delete config.agent;\n }\n if (axiosInstance.defaults.httpAgent === config.httpAgent) {\n delete config.httpAgent;\n }\n if (axiosInstance.defaults.httpsAgent === config.httpsAgent) {\n delete config.httpsAgent;\n }\n}\nasync function shouldRetry(currentState, error) {\n const { retries, retryCondition } = currentState;\n const shouldRetryOrPromise = (currentState.retryCount || 0) < retries && retryCondition(error);\n // This could be a promise\n if (typeof shouldRetryOrPromise === 'object') {\n try {\n const shouldRetryPromiseResult = await shouldRetryOrPromise;\n // keep return true unless shouldRetryPromiseResult return false for compatibility\n return shouldRetryPromiseResult !== false;\n }\n catch (_err) {\n return false;\n }\n }\n return shouldRetryOrPromise;\n}\nasync function handleRetry(axiosInstance, currentState, error, config) {\n currentState.retryCount += 1;\n const { retryDelay, shouldResetTimeout, onRetry } = currentState;\n const delay = retryDelay(currentState.retryCount, error);\n // Axios fails merging this configuration to the default configuration because it has an issue\n // with circular structures: https://github.com/mzabriskie/axios/issues/370\n fixConfig(axiosInstance, config);\n if (!shouldResetTimeout && config.timeout && currentState.lastRequestTime) {\n const lastRequestDuration = Date.now() - currentState.lastRequestTime;\n const timeout = config.timeout - lastRequestDuration - delay;\n if (timeout <= 0) {\n return Promise.reject(error);\n }\n config.timeout = timeout;\n }\n config.transformRequest = [(data) => data];\n await onRetry(currentState.retryCount, error, config);\n if (config.signal?.aborted) {\n return Promise.resolve(axiosInstance(config));\n }\n return new Promise((resolve) => {\n const abortListener = () => {\n clearTimeout(timeout);\n resolve(axiosInstance(config));\n };\n const timeout = setTimeout(() => {\n resolve(axiosInstance(config));\n if (config.signal?.removeEventListener) {\n config.signal.removeEventListener('abort', abortListener);\n }\n }, delay);\n if (config.signal?.addEventListener) {\n config.signal.addEventListener('abort', abortListener, { once: true });\n }\n });\n}\nasync function handleMaxRetryTimesExceeded(currentState, error) {\n if (currentState.retryCount >= currentState.retries)\n await currentState.onMaxRetryTimesExceeded(error, currentState.retryCount);\n}\nconst axiosRetry = (axiosInstance, defaultOptions) => {\n const requestInterceptorId = axiosInstance.interceptors.request.use((config) => {\n setCurrentState(config, defaultOptions, true);\n if (config[namespace]?.validateResponse) {\n // by setting this, all HTTP responses will be go through the error interceptor first\n config.validateStatus = () => false;\n }\n return config;\n });\n const responseInterceptorId = axiosInstance.interceptors.response.use(null, async (error) => {\n const { config } = error;\n // If we have no information to retry the request\n if (!config) {\n return Promise.reject(error);\n }\n const currentState = setCurrentState(config, defaultOptions);\n if (error.response && currentState.validateResponse?.(error.response)) {\n // no issue with response\n return error.response;\n }\n if (await shouldRetry(currentState, error)) {\n return handleRetry(axiosInstance, currentState, error, config);\n }\n await handleMaxRetryTimesExceeded(currentState, error);\n return Promise.reject(error);\n });\n return { requestInterceptorId, responseInterceptorId };\n};\n// Compatibility with CommonJS\naxiosRetry.isNetworkError = isNetworkError;\naxiosRetry.isSafeRequestError = isSafeRequestError;\naxiosRetry.isIdempotentRequestError = isIdempotentRequestError;\naxiosRetry.isNetworkOrIdempotentRequestError = isNetworkOrIdempotentRequestError;\naxiosRetry.exponentialDelay = exponentialDelay;\naxiosRetry.linearDelay = linearDelay;\naxiosRetry.isRetryableError = isRetryableError;\nexport default axiosRetry;\n","export const PATHS = {\n U2F: \"5655636'/5583430'\",\n CONFIDENTIALITY: \"5655636'/4410950'\",\n KEY_MATERIAL: \"5655636'/4932953'\",\n VALIDATION: \"5655636'/5652812'\",\n} as const;\n\nexport const STATUS_LENGTH = 2;\n\nexport const SCRIPT_IDS = {\n INIT_SESSION: 3,\n ACCOUNT_MANAGER_SESSION: 2,\n} as const;\n\nexport const STR_ROLES: Record<\"OPERATOR\" | \"ADMIN\" | \"SHARED_OWNER\", string> = {\n OPERATOR: \"00\",\n ADMIN: \"01\",\n SHARED_OWNER: \"02\",\n} as const;\n\nexport const APPID_VAULT_ADMINISTRATOR =\n \"ad5be1a1fe011ce7f53ae081a22ae000a42021f3f94106a3bac9f76e8230e4b9\";\n\nconst all61xxStatus = [];\nfor (let i = 0x6100; i <= 0x61ff; i++) {\n all61xxStatus.push(i);\n}\n\nexport const PAGINATED_STATUS = all61xxStatus;\nexport const STREAMING_RESPONSE = 0x02;\nexport const STREAMING_NEXT_ACTION = 0x01;\n","import type {\n HsmCertificate,\n PsdAuthChallengeResponse,\n PsdPairingData,\n PubKey,\n RefreshPskData,\n} from \"@ledgerhq/revault-api\";\nimport axios from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport invariant from \"invariant\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport type { Logger } from \"@/logger\";\n\nimport { deviceOperationDelay, withDeviceOperationSignal } from \"./abort\";\nimport { APPID_VAULT_ADMINISTRATOR, PATHS, SCRIPT_IDS, STR_ROLES } from \"./constants\";\nimport type { Device, PairingStatus } from \"./types\";\n\ntype Options = {\n /**\n * device-api URL\n */\n deviceApiUrl: string;\n\n /**\n * salt used by device-api\n */\n salt: string;\n\n /**\n * seed generation function used for device-api device spawn\n */\n genSeed: (p: { salt: string; index: number }) => string | Promise<string>;\n};\n\nexport type ApiDevice = {\n /**\n * bind a device to the given device index\n */\n with: (index: number) => Device;\n};\n\nexport function createApiDevice(options: Options, logger: Logger): ApiDevice {\n const { genSeed } = options;\n const sessionId = uuidv4();\n const deviceApi = axios.create({ baseURL: options.deviceApiUrl });\n\n axiosRetry(deviceApi, {\n retryDelay: axiosRetry.linearDelay(1000),\n retries: 3,\n /* v8 ignore start -- @preserve */\n retryCondition: () => true,\n onRetry: (retryCount, err) => {\n const formattedErr = `${err.code ?? `UNKNOWN`} on ${err.config?.method?.toUpperCase() ?? \"UNKNOWN_METHOD\"} ${err.config?.url ?? \"UNKNOWN_URL\"}`;\n logger.warning(\n `Retrying request to device-api (attempt ${retryCount}) - Cause: ${formattedErr}`,\n );\n },\n /* v8 ignore stop */\n });\n\n /* v8 ignore start -- @preserve */\n deviceApi.interceptors.request.use(\n (config) => {\n logger.debug(\n `[device-api] ${config.method?.toUpperCase()} ${config.url}${config.data ? ` ${JSON.stringify(config.data)}` : \"\"}`,\n );\n if ([\"post\", \"put\"].includes(config.method!)) {\n // when interceptor is called in combination with axios-retry, config.data can be a string or an object\n // and we should return either a string or an object compatible with the original type\n const isStringMode = typeof config.data === \"string\";\n const data = (isStringMode ? JSON.parse(config.data) : config.data) as Record<\n string,\n unknown\n >;\n const enhancedData = {\n sessionID: sessionId, // Used to ensure dedicated session if someones else uses same seed\n psd_model: \"02\", // Stax\n version: 3, // Used to properly enable noise channel\n ...data,\n };\n config.data = isStringMode ? JSON.stringify(enhancedData) : enhancedData;\n }\n return config;\n },\n (error: Error) => Promise.reject(error),\n );\n /* v8 ignore stop */\n\n return {\n with: (index: number): Device => {\n const __seed = genSeed({ salt: options.salt, index });\n\n const getSeed = async (): Promise<string> => {\n if (typeof __seed === \"string\") return Promise.resolve(__seed);\n return __seed;\n };\n\n const postWithSignal = async <T>(\n url: string,\n data: unknown,\n signal?: AbortSignal,\n ): Promise<{ data: T }> =>\n withDeviceOperationSignal(\n () => (signal ? deviceApi.post<T>(url, data, { signal }) : deviceApi.post<T>(url, data)),\n signal,\n );\n\n const authenticate = async ({\n challenge,\n workspaceName,\n }: {\n challenge: PsdAuthChallengeResponse;\n workspaceName: string;\n }): Promise<string> => {\n const role = challenge.role;\n if (role === \"READ_ONLY_API_KEY\")\n throw new Error(\"Invalid role for authenticate: READ_ONLY_API_KEY\");\n const { data } = await deviceApi.post<string>(\"/authenticate\", {\n seed: await getSeed(),\n challenge: Buffer.from(challenge.challenge, \"base64\").toString(\"hex\"),\n application: APPID_VAULT_ADMINISTRATOR,\n key_handle: challenge.keyHandle,\n name: challenge.name,\n role: STR_ROLES[role],\n type: \"02\", // Stax\n workspaceName,\n });\n return data;\n };\n\n const finalizePairingHandshake = async (params: {\n handshake: string;\n partitionId: string;\n }): Promise<string> => {\n const { handshake, partitionId } = params;\n const payload = { seed: await getSeed(), handshake, ciphertext: partitionId };\n const res = await deviceApi.post<string>(\"/finalize-pairing-handshake\", payload);\n return res.data;\n };\n\n const generateSeedFragment = async (): Promise<string> => {\n const payload = {\n seed: await getSeed(),\n path: PATHS.KEY_MATERIAL,\n goal: 0, // seed fragment\n };\n const { data } = await deviceApi.post<string>(\"/generate-key-component\", payload);\n return data;\n };\n\n const getAttestation = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{\n attestation: {\n codeHash: string;\n attestationPub: string;\n certificate: string;\n };\n buffer: Buffer;\n }> => {\n const { data: attestationStr } = await postWithSignal<string>(\n \"/get-attestation\",\n { seed: await getSeed() },\n opts.signal,\n );\n const attestationBuffer = Buffer.from(attestationStr, \"hex\");\n const certLen = attestationBuffer.readInt8(32 + 65 + 1);\n return {\n attestation: {\n codeHash: attestationBuffer.slice(0, 32).toString(\"base64\"),\n attestationPub: attestationBuffer.slice(32, 32 + 65).toString(\"base64\"),\n certificate: attestationBuffer.slice(32 + 65, 32 + 65 + 2 + certLen).toString(\"base64\"),\n },\n buffer: attestationBuffer,\n };\n };\n\n const getConfidentialityKey = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{\n confidentialityKeyCurve25519: string;\n confidentialityKeySignature: string;\n }> => {\n const res = await postWithSignal<{\n confidentiality_key_curve25519: string;\n confidentiality_key_signature: string;\n }>(\"/get-confidentiality-key\", { seed: await getSeed() }, opts.signal);\n return {\n confidentialityKeyCurve25519: res.data.confidentiality_key_curve25519,\n confidentialityKeySignature: res.data.confidentiality_key_signature,\n };\n };\n\n const getConfidentialityPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.CONFIDENTIALITY });\n };\n\n const getDeviceUserId = async (): Promise<string> => {\n const res = await deviceApi.post<{ blue_device_id: string }>(\"/blue-device-id\", {\n seed: await getSeed(),\n });\n return res.data.blue_device_id.toUpperCase();\n };\n\n const getU2FPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.U2F });\n };\n\n const getValidationPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.VALIDATION });\n };\n\n const hasPairing = async (opts: { signal?: AbortSignal } = {}): Promise<PairingStatus> => {\n const seed = await getSeed();\n const res = await postWithSignal<string[]>(\"/get-partition-ids\", { seed }, opts.signal);\n if (res.data.length === 0) return \"NO_PAIRING\";\n // A pairing exists; ask device-api whether its PSK slot is populated. Mirrors the firmware\n // returning SW_PSK_MISSING from GET_PARTITION_IDS when the NVM PSK is the all-zero sentinel.\n // POST (not GET) so the body carries `seed` and the interceptor-injected `sessionID`,\n // letting device-api resolve THIS session's device instead of its global current device.\n const status = await postWithSignal<{ partition_id: string | null; psk_missing: boolean }>(\n \"/partition-psk-status\",\n { seed },\n opts.signal,\n );\n return status.data.psk_missing ? \"PSK_MISSING\" : \"OK\";\n };\n\n const initPairingHandshake = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{ pubKey: string; signature: string }> => {\n const { data } = await postWithSignal<{ attestation: string; pubKey: string }>(\n \"/initiate-pairing-handshake\",\n { seed: await getSeed() },\n opts.signal,\n );\n return {\n pubKey: data.pubKey,\n signature: Buffer.from(data.attestation, \"hex\").toString(\"base64\"),\n };\n };\n\n const openSession = async (params: {\n secureChannel: { pubKey: PubKey; certificate: HsmCertificate };\n }): Promise<void> => {\n const { secureChannel } = params;\n const signature = Buffer.from(secureChannel.certificate.signature, \"base64\");\n const attestationPubKey = Buffer.from(secureChannel.certificate.attestationPub, \"base64\");\n const attestationCertificate = Buffer.from(secureChannel.certificate.certificate, \"base64\");\n const attestation = Buffer.concat([\n Buffer.from([signature.length]),\n signature,\n attestationPubKey,\n Buffer.from([attestationCertificate.length]),\n attestationCertificate,\n ]);\n const payload = {\n seed: await getSeed(),\n path: PATHS.CONFIDENTIALITY,\n pubKey: secureChannel.pubKey,\n attestation: attestation.toString(\"hex\"),\n scriptId: SCRIPT_IDS.INIT_SESSION,\n };\n const { data: deviceResponse } = await deviceApi.post<string>(\"/open-session\", payload);\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const register = async (params: {\n challenge: string;\n u2fRegisterData: string;\n name: string;\n role: \"ADMIN\" | \"SHARED_OWNER\" | \"OPERATOR\";\n }): Promise<{\n u2fRegister: Buffer;\n keyHandle: Buffer;\n rfu: number;\n pubKey: string;\n }> => {\n const { challenge, u2fRegisterData, name, role } = params;\n const payload = {\n seed: await getSeed(),\n challenge,\n name,\n role: STR_ROLES[role],\n hsm_data: u2fRegisterData,\n type: \"02\", // Stax\n application: APPID_VAULT_ADMINISTRATOR,\n };\n const { data } = await deviceApi.post<string>(\"/register\", payload);\n const response = Buffer.from(data, \"hex\");\n let i = 0;\n const rfu = response.slice(i, i + 1)[0]!;\n i += 1;\n const pubKey = response.slice(i, i + 65).toString(\"hex\");\n i += 65;\n const keyHandleLength = response.slice(i, i + 1)[0]!;\n i++;\n const keyHandle = response.slice(i, i + keyHandleLength);\n i += keyHandleLength;\n return {\n u2fRegister: response.slice(0, response.length - 2),\n keyHandle,\n rfu,\n pubKey,\n };\n };\n\n const registerData = async (params: { challenge: string }): Promise<string> => {\n const { challenge } = params;\n const payload = { seed: await getSeed(), challenge };\n const res = await deviceApi.post<string>(\"/u2f-register-data\", payload);\n return res.data;\n };\n\n const setPairing = async ({\n pairing,\n signal,\n }: {\n pairing: PsdPairingData;\n signal?: AbortSignal;\n }): Promise<void> => {\n const payload = {\n seed: await getSeed(),\n blob: pairing.blob,\n pairing: {\n bootstrap_enabled: pairing.pairing.bootstrapEnabled,\n partition_key: pairing.pairing.partitionKey,\n workspace_name: pairing.pairing.workspaceName,\n },\n partition_key_attestation: {\n code_hash: pairing.partitionKeyAttestation.codeHash,\n attestation_pub: pairing.partitionKeyAttestation.attestationPub,\n certificate: pairing.partitionKeyAttestation.certificate,\n signature: pairing.partitionKeyAttestation.signature,\n },\n };\n await postWithSignal(\"/set-partition-key\", payload, signal);\n };\n\n const signRefreshPskAuth = async ({\n ephemeralKey,\n signal,\n }: {\n ephemeralKey: string;\n signal?: AbortSignal;\n }): Promise<string> => {\n // Mirrors the firmware's SIGN_REFRESH_PSK_AUTH (`0x55`). The firmware signs over the\n // ephemeral it captured at INITIALIZE_NN_HANDSHAKE; the stateless device-api has no such\n // capture, so we pass the framed ephemeral (hex, from initPairingHandshake) back here.\n // The endpoint returns the DER signature as raw hex; convert to base64 to match the proxy's\n // base64 `validation_key_signature` field.\n const { data } = await postWithSignal<string>(\n \"/sign-refresh-psk-auth\",\n {\n seed: await getSeed(),\n ephemeral_key: ephemeralKey,\n },\n signal,\n );\n return Buffer.from(data, \"hex\").toString(\"base64\");\n };\n\n const finalizePskRefresh = async (\n params: RefreshPskData & { signal?: AbortSignal },\n ): Promise<void> => {\n // Mirrors the firmware's FINALIZE_PSK_REFRESH handler. device-api takes only the NN\n // `handshake` and the encrypted PairingPayload `ciphertext`, both hex — no attestation\n // (it doesn't verify the HSM endorsement). The proxy hands us base64, so convert to hex.\n const payload = {\n seed: await getSeed(),\n handshake: Buffer.from(params.handshake, \"base64\").toString(\"hex\"),\n ciphertext: Buffer.from(params.encryptedPairingPayload, \"base64\").toString(\"hex\"),\n };\n await postWithSignal(\"/finalize-psk-refresh\", payload, params.signal);\n };\n\n const startKKPatternAsResponder = async (params: {\n handshake: string;\n handshakeAttestation: HsmCertificate;\n partitionId: string;\n }): Promise<{ handshake: string; signature: string }> => {\n const payload = {\n seed: await getSeed(),\n script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,\n handshake: params.handshake,\n // for device-api it's normal to have empty string as handshake_attestation\n handshake_attestation: \"\",\n partition_id: params.partitionId,\n };\n const { data } = await deviceApi.post<string>(\"/start-kk-pattern-as-responder\", payload);\n const buffer = Buffer.from(data, \"hex\");\n const dataLength = buffer.readInt8(0);\n return {\n handshake: buffer.slice(1, dataLength + 1).toString(\"base64\"),\n signature: buffer.slice(dataLength + 1).toString(\"base64\"),\n };\n };\n\n const startKPatternAsResponder = async (params: {\n handshake: string;\n handshakeAttestation: HsmCertificate;\n partitionId: string;\n signal?: AbortSignal;\n }): Promise<void> => {\n const { handshake, partitionId } = params;\n const payload = {\n seed: await getSeed(),\n script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,\n handshake,\n // for device-api it's normal to have empty string as handshake_attestation\n handshake_attestation: \"\",\n partition_id: partitionId,\n };\n const { data: deviceResponse } = await postWithSignal<string>(\n \"/start-k-pattern-as-responder\",\n payload,\n params.signal,\n );\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const startPskSession = async (params: {\n nonce: string;\n partitionId: string;\n signal?: AbortSignal;\n }): Promise<void> => {\n const { nonce, partitionId } = params;\n invariant(\n nonce.length === 64,\n `PSK nonce must be 32 bytes (64 hex chars), got ${nonce.length} chars`,\n );\n invariant(\n partitionId.length === 32,\n `partitionId must be 16 bytes (32 hex chars), got ${partitionId.length} chars`,\n );\n // Mirrors firmware START_PSK_SESSION. Unlike the hex-decoded k-pattern route, the\n // device-api /start-psk-session base64-decodes nonce + partition_id, so convert the\n // challenge's hex strings to base64 here.\n const payload = {\n seed: await getSeed(),\n nonce: Buffer.from(nonce, \"hex\").toString(\"base64\"),\n partition_id: Buffer.from(partitionId, \"hex\").toString(\"base64\"),\n };\n const { data: deviceResponse } = await postWithSignal<string>(\n \"/start-psk-session\",\n payload,\n params.signal,\n );\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const getPublicKey = async (params: {\n path: string;\n }): Promise<{ pubKey: string; signature: string }> => {\n const { path } = params;\n type DeviceApiGetPubKeyResponse = { attestation: string; pubKey: string };\n const payload = { seed: await getSeed(), secp256k1: true, path };\n const res = await deviceApi.post<DeviceApiGetPubKeyResponse>(\"/get-public-key\", payload);\n return {\n pubKey: res.data.pubKey,\n signature: Buffer.from(res.data.attestation, \"hex\").toString(\"base64\"),\n };\n };\n\n const validateVaultOperation = async (params: {\n actions: string[];\n signal?: AbortSignal;\n }): Promise<string> => {\n const { actions } = params;\n const payload = {\n seed: await getSeed(),\n path: PATHS.VALIDATION,\n actions,\n };\n const { data: signature } = await postWithSignal<string>(\n \"/validate-op\",\n payload,\n params.signal,\n );\n return signature;\n };\n\n const sendAPDU = (_apdu: string): Promise<string> => {\n logger.info(\"Can't send arbitrary APDU to software device\");\n return Promise.resolve(\"9000\");\n };\n\n const getVersion = async (opts: { signal?: AbortSignal } = {}): Promise<string> =>\n withDeviceOperationSignal(() => Promise.resolve(\"1.2.3\"), opts.signal);\n\n const poll = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{ isAppOpened: boolean }> => {\n await deviceOperationDelay(1e3, opts.signal);\n return { isAppOpened: true };\n };\n\n const pollApp = async (\n _name: string,\n opts: { signal?: AbortSignal } = {},\n ): Promise<string> => {\n await deviceOperationDelay(1e3, opts.signal);\n return \"9000\";\n };\n\n return {\n authenticate,\n finalizePairingHandshake,\n generateSeedFragment,\n getAttestation,\n getConfidentialityKey,\n getConfidentialityPubKey,\n getDeviceUserId,\n getU2FPubKey,\n getValidationPubKey,\n hasPairing,\n initPairingHandshake,\n openSession,\n register,\n registerData,\n setPairing,\n signRefreshPskAuth,\n finalizePskRefresh,\n startKKPatternAsResponder,\n startKPatternAsResponder,\n startPskSession,\n validateVaultOperation,\n getVersion,\n sendAPDU,\n poll,\n pollApp,\n };\n },\n };\n}\n","/* eslint-disable no-continue */\n/* eslint-disable no-unused-vars */\n/* eslint-disable no-param-reassign */\n/* eslint-disable no-prototype-builtins */\nconst errorClasses = {};\nconst deserializers = {};\nexport const addCustomErrorDeserializer = (name, deserializer) => {\n deserializers[name] = deserializer;\n};\nexport const createCustomErrorClass = (name) => {\n class CustomErrorClass extends Error {\n cause;\n constructor(message, fields, options) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n super(message || name, options);\n // Set the prototype explicitly. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, CustomErrorClass.prototype);\n this.name = name;\n if (fields) {\n for (const k in fields) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this[k] = fields[k];\n }\n }\n if (options && isObject(options) && \"cause\" in options && !this.cause) {\n // .cause was specified but the superconstructor\n // did not create an instance property.\n const cause = options.cause;\n this.cause = cause;\n if (\"stack\" in cause) {\n this.stack = this.stack + \"\\nCAUSE: \" + cause.stack;\n }\n }\n }\n }\n errorClasses[name] = CustomErrorClass;\n return CustomErrorClass;\n};\nfunction isObject(value) {\n return typeof value === \"object\";\n}\n// inspired from https://github.com/programble/errio/blob/master/index.js\nexport const deserializeError = (object) => {\n if (object && typeof object === \"object\") {\n try {\n if (typeof object.message === \"string\") {\n const msg = JSON.parse(object.message);\n if (msg.message && msg.name) {\n object = msg;\n }\n }\n }\n catch {\n // nothing\n }\n let error;\n if (typeof object.name === \"string\") {\n const { name } = object;\n const des = deserializers[name];\n if (des) {\n error = des(object);\n }\n else {\n let constructor = name === \"Error\" ? Error : errorClasses[name];\n if (!constructor) {\n console.warn(\"deserializing an unknown class '\" + name + \"'\");\n constructor = createCustomErrorClass(name);\n }\n error = Object.create(constructor.prototype);\n try {\n for (const prop in object) {\n if (object.hasOwnProperty(prop)) {\n error[prop] = object[prop];\n }\n }\n }\n catch {\n // sometimes setting a property can fail (e.g. .name)\n }\n }\n }\n else {\n if (typeof object.message === \"string\") {\n error = new Error(object.message);\n }\n }\n // captureStackTrace is V8/Node-specific and not in @types/node\n const Err = Error;\n if (error && !error.stack && Err.captureStackTrace) {\n Err.captureStackTrace(error, deserializeError);\n }\n return error;\n }\n return new Error(String(object));\n};\n// inspired from https://github.com/sindresorhus/serialize-error/blob/master/index.js\nexport const serializeError = (value) => {\n if (!value)\n return value;\n if (typeof value === \"object\") {\n return destroyCircular(value, []);\n }\n if (typeof value === \"function\") {\n return `[Function: ${value.name || \"anonymous\"}]`;\n }\n return value;\n};\n// https://www.npmjs.com/package/destroy-circular\nfunction destroyCircular(from, seen) {\n const to = {};\n seen.push(from);\n for (const key of Object.keys(from)) {\n const value = from[key];\n if (typeof value === \"function\") {\n continue;\n }\n if (!value || typeof value !== \"object\") {\n to[key] = value;\n continue;\n }\n if (seen.indexOf(from[key]) === -1) {\n to[key] = destroyCircular(from[key], seen.slice(0));\n continue;\n }\n to[key] = \"[Circular]\";\n }\n if (typeof from.name === \"string\") {\n to.name = from.name;\n }\n if (typeof from.message === \"string\") {\n to.message = from.message;\n }\n if (typeof from.stack === \"string\") {\n to.stack = from.stack;\n }\n return to;\n}\n//# sourceMappingURL=helpers.js.map","import { serializeError, deserializeError, createCustomErrorClass, addCustomErrorDeserializer, } from \"./helpers\";\nexport { serializeError, deserializeError, createCustomErrorClass, addCustomErrorDeserializer };\nexport const AccountNameRequiredError = createCustomErrorClass(\"AccountNameRequired\");\nexport const AccountNotSupported = createCustomErrorClass(\"AccountNotSupported\");\nexport const AccountAwaitingSendPendingOperations = createCustomErrorClass(\"AccountAwaitingSendPendingOperations\");\nexport const AmountRequired = createCustomErrorClass(\"AmountRequired\");\nexport const BluetoothRequired = createCustomErrorClass(\"BluetoothRequired\");\nexport const BtcUnmatchedApp = createCustomErrorClass(\"BtcUnmatchedApp\");\nexport const CantOpenDevice = createCustomErrorClass(\"CantOpenDevice\");\nexport const CashAddrNotSupported = createCustomErrorClass(\"CashAddrNotSupported\");\nexport const ClaimRewardsFeesWarning = createCustomErrorClass(\"ClaimRewardsFeesWarning\");\nexport const CurrencyNotSupported = createCustomErrorClass(\"CurrencyNotSupported\");\nexport const DeviceAppVerifyNotSupported = createCustomErrorClass(\"DeviceAppVerifyNotSupported\");\nexport const DeviceGenuineSocketEarlyClose = createCustomErrorClass(\"DeviceGenuineSocketEarlyClose\");\nexport const DeviceNotGenuineError = createCustomErrorClass(\"DeviceNotGenuine\");\nexport const DeviceOnDashboardExpected = createCustomErrorClass(\"DeviceOnDashboardExpected\");\nexport const DeviceOnDashboardUnexpected = createCustomErrorClass(\"DeviceOnDashboardUnexpected\");\nexport const DeviceInOSUExpected = createCustomErrorClass(\"DeviceInOSUExpected\");\nexport const DeviceHalted = createCustomErrorClass(\"DeviceHalted\");\nexport const DeviceNameInvalid = createCustomErrorClass(\"DeviceNameInvalid\");\nexport const DeviceSocketFail = createCustomErrorClass(\"DeviceSocketFail\");\nexport const DeviceSocketNoBulkStatus = createCustomErrorClass(\"DeviceSocketNoBulkStatus\");\nexport const DeviceNeedsRestart = createCustomErrorClass(\"DeviceSocketNoBulkStatus\");\nexport const UnresponsiveDeviceError = createCustomErrorClass(\"UnresponsiveDeviceError\");\nexport const DisconnectedDevice = createCustomErrorClass(\"DisconnectedDevice\");\nexport const DisconnectedDeviceDuringOperation = createCustomErrorClass(\"DisconnectedDeviceDuringOperation\");\nexport const DeviceExtractOnboardingStateError = createCustomErrorClass(\"DeviceExtractOnboardingStateError\");\nexport const DeviceOnboardingStatePollingError = createCustomErrorClass(\"DeviceOnboardingStatePollingError\");\nexport const EnpointConfigError = createCustomErrorClass(\"EnpointConfig\");\nexport const EthAppPleaseEnableContractData = createCustomErrorClass(\"EthAppPleaseEnableContractData\");\nexport const SolAppPleaseEnableContractData = createCustomErrorClass(\"SolAppPleaseEnableContractData\");\nexport const CeloAppPleaseEnableContractData = createCustomErrorClass(\"CeloAppPleaseEnableContractData\");\nexport const FeeEstimationFailed = createCustomErrorClass(\"FeeEstimationFailed\");\nexport const FirmwareNotRecognized = createCustomErrorClass(\"FirmwareNotRecognized\");\nexport const HardResetFail = createCustomErrorClass(\"HardResetFail\");\nexport const InvalidXRPTag = createCustomErrorClass(\"InvalidXRPTag\");\nexport const InvalidAddress = createCustomErrorClass(\"InvalidAddress\");\nexport const InvalidTransactionError = createCustomErrorClass(\"InvalidTransactionError\");\nexport const InvalidNonce = createCustomErrorClass(\"InvalidNonce\");\nexport const InvalidAddressBecauseDestinationIsAlsoSource = createCustomErrorClass(\"InvalidAddressBecauseDestinationIsAlsoSource\");\nexport const LatestMCUInstalledError = createCustomErrorClass(\"LatestMCUInstalledError\");\nexport const LatestFirmwareVersionRequired = createCustomErrorClass(\"LatestFirmwareVersionRequired\");\nexport const UnsupportedFeatureError = createCustomErrorClass(\"UnsupportedFeatureError\");\nexport const NanoSNotSupported = createCustomErrorClass(\"NanoSNotSupported\");\nexport const UnknownMCU = createCustomErrorClass(\"UnknownMCU\");\nexport const LedgerAPIError = createCustomErrorClass(\"LedgerAPIError\");\nexport const LedgerAPIErrorWithMessage = createCustomErrorClass(\"LedgerAPIErrorWithMessage\");\nexport const LedgerAPINotAvailable = createCustomErrorClass(\"LedgerAPINotAvailable\");\nexport const ManagerAppAlreadyInstalledError = createCustomErrorClass(\"ManagerAppAlreadyInstalled\");\nexport const ManagerAppRelyOnBTCError = createCustomErrorClass(\"ManagerAppRelyOnBTC\");\nexport const ManagerAppDepInstallRequired = createCustomErrorClass(\"ManagerAppDepInstallRequired\");\nexport const ManagerAppDepUninstallRequired = createCustomErrorClass(\"ManagerAppDepUninstallRequired\");\nexport const ManagerDeviceLockedError = createCustomErrorClass(\"ManagerDeviceLocked\");\nexport const ManagerFirmwareNotEnoughSpaceError = createCustomErrorClass(\"ManagerFirmwareNotEnoughSpace\");\nexport const ManagerNotEnoughSpaceError = createCustomErrorClass(\"ManagerNotEnoughSpace\");\nexport const ManagerUninstallBTCDep = createCustomErrorClass(\"ManagerUninstallBTCDep\");\nexport const NetworkDown = createCustomErrorClass(\"NetworkDown\");\nexport const NetworkError = createCustomErrorClass(\"NetworkError\");\nexport const NoAddressesFound = createCustomErrorClass(\"NoAddressesFound\");\nexport const NotEnoughBalance = createCustomErrorClass(\"NotEnoughBalance\");\nexport const NotEnoughBalanceFees = createCustomErrorClass(\"NotEnoughBalanceFees\");\nexport const NotEnoughBalanceSwap = createCustomErrorClass(\"NotEnoughBalanceSwap\");\nexport const NotEnoughBalanceToDelegate = createCustomErrorClass(\"NotEnoughBalanceToDelegate\");\nexport const UnstakeNotEnoughStakedBalanceLeft = createCustomErrorClass(\"UnstakeNotEnoughStakedBalanceLeft\");\nexport const RestakeNotEnoughStakedBalanceLeft = createCustomErrorClass(\"RestakeNotEnoughStakedBalanceLeft\");\nexport const NotEnoughToRestake = createCustomErrorClass(\"NotEnoughToRestake\");\nexport const NotEnoughToUnstake = createCustomErrorClass(\"NotEnoughToUnstake\");\nexport const NotEnoughBalanceInParentAccount = createCustomErrorClass(\"NotEnoughBalanceInParentAccount\");\nexport const NotEnoughSpendableBalance = createCustomErrorClass(\"NotEnoughSpendableBalance\");\nexport const NotEnoughBalanceBecauseDestinationNotCreated = createCustomErrorClass(\"NotEnoughBalanceBecauseDestinationNotCreated\");\nexport const NotEnoughToStake = createCustomErrorClass(\"NotEnoughToStake\");\nexport const NoAccessToCamera = createCustomErrorClass(\"NoAccessToCamera\");\nexport const NotEnoughGas = createCustomErrorClass(\"NotEnoughGas\");\n// Error message specifically for the PTX swap flow\nexport const NotEnoughGasSwap = createCustomErrorClass(\"NotEnoughGasSwap\");\nexport const TronEmptyAccount = createCustomErrorClass(\"TronEmptyAccount\");\nexport const MaybeKeepTronAccountAlive = createCustomErrorClass(\"MaybeKeepTronAccountAlive\");\nexport const NotSupportedLegacyAddress = createCustomErrorClass(\"NotSupportedLegacyAddress\");\nexport const GasLessThanEstimate = createCustomErrorClass(\"GasLessThanEstimate\");\nexport const PriorityFeeTooLow = createCustomErrorClass(\"PriorityFeeTooLow\");\nexport const PriorityFeeTooHigh = createCustomErrorClass(\"PriorityFeeTooHigh\");\nexport const PriorityFeeHigherThanMaxFee = createCustomErrorClass(\"PriorityFeeHigherThanMaxFee\");\nexport const MaxFeeTooLow = createCustomErrorClass(\"MaxFeeTooLow\");\nexport const PasswordsDontMatchError = createCustomErrorClass(\"PasswordsDontMatch\");\nexport const PasswordIncorrectError = createCustomErrorClass(\"PasswordIncorrect\");\nexport const RecommendSubAccountsToEmpty = createCustomErrorClass(\"RecommendSubAccountsToEmpty\");\nexport const RecommendUndelegation = createCustomErrorClass(\"RecommendUndelegation\");\nexport const TimeoutTagged = createCustomErrorClass(\"TimeoutTagged\");\nexport const UnexpectedBootloader = createCustomErrorClass(\"UnexpectedBootloader\");\nexport const MCUNotGenuineToDashboard = createCustomErrorClass(\"MCUNotGenuineToDashboard\");\nexport const RecipientRequired = createCustomErrorClass(\"RecipientRequired\");\nexport const UnavailableTezosOriginatedAccountReceive = createCustomErrorClass(\"UnavailableTezosOriginatedAccountReceive\");\nexport const UnavailableTezosOriginatedAccountSend = createCustomErrorClass(\"UnavailableTezosOriginatedAccountSend\");\nexport const UpdateFetchFileFail = createCustomErrorClass(\"UpdateFetchFileFail\");\nexport const UpdateIncorrectHash = createCustomErrorClass(\"UpdateIncorrectHash\");\nexport const UpdateIncorrectSig = createCustomErrorClass(\"UpdateIncorrectSig\");\nexport const UpdateYourApp = createCustomErrorClass(\"UpdateYourApp\");\nexport const UserRefusedDeviceNameChange = createCustomErrorClass(\"UserRefusedDeviceNameChange\");\nexport const UserRefusedAddress = createCustomErrorClass(\"UserRefusedAddress\");\nexport const UserRefusedFirmwareUpdate = createCustomErrorClass(\"UserRefusedFirmwareUpdate\");\nexport const UserRefusedAllowManager = createCustomErrorClass(\"UserRefusedAllowManager\");\nexport const UserRefusedOnDevice = createCustomErrorClass(\"UserRefusedOnDevice\"); // TODO rename because it's just for transaction refusal\nexport const PinNotSet = createCustomErrorClass(\"PinNotSet\");\nexport const ExpertModeRequired = createCustomErrorClass(\"ExpertModeRequired\");\nexport const TransportOpenUserCancelled = createCustomErrorClass(\"TransportOpenUserCancelled\");\nexport const TransportInterfaceNotAvailable = createCustomErrorClass(\"TransportInterfaceNotAvailable\");\nexport const TransportRaceCondition = createCustomErrorClass(\"TransportRaceCondition\");\nexport const TransportWebUSBGestureRequired = createCustomErrorClass(\"TransportWebUSBGestureRequired\");\nexport const TransactionHasBeenValidatedError = createCustomErrorClass(\"TransactionHasBeenValidatedError\");\nexport const TransportExchangeTimeoutError = createCustomErrorClass(\"TransportExchangeTimeoutError\");\nexport const DeviceShouldStayInApp = createCustomErrorClass(\"DeviceShouldStayInApp\");\nexport const WebsocketConnectionError = createCustomErrorClass(\"WebsocketConnectionError\");\nexport const WebsocketConnectionFailed = createCustomErrorClass(\"WebsocketConnectionFailed\");\nexport const WrongDeviceForAccount = createCustomErrorClass(\"WrongDeviceForAccount\");\nexport const WrongDeviceForAccountPayout = createCustomErrorClass(\"WrongDeviceForAccountPayout\");\nexport const MissingSwapPayloadParamaters = createCustomErrorClass(\"MissingSwapPayloadParamaters\");\nexport const WrongDeviceForAccountRefund = createCustomErrorClass(\"WrongDeviceForAccountRefund\");\nexport const WrongAppForCurrency = createCustomErrorClass(\"WrongAppForCurrency\");\nexport const ETHAddressNonEIP = createCustomErrorClass(\"ETHAddressNonEIP\");\nexport const CantScanQRCode = createCustomErrorClass(\"CantScanQRCode\");\nexport const FeeNotLoaded = createCustomErrorClass(\"FeeNotLoaded\");\nexport const FeeNotLoadedSwap = createCustomErrorClass(\"FeeNotLoadedSwap\");\nexport const FeeRequired = createCustomErrorClass(\"FeeRequired\");\nexport const FeeTooHigh = createCustomErrorClass(\"FeeTooHigh\");\nexport const ValAddressRequired = createCustomErrorClass(\"ValAddressRequired\");\nexport const RedelegateDstValAddressRequired = createCustomErrorClass(\"RedelegateDstValAddressRequired\");\nexport const PendingOperation = createCustomErrorClass(\"PendingOperation\");\nexport const SyncError = createCustomErrorClass(\"SyncError\");\nexport const PairingFailed = createCustomErrorClass(\"PairingFailed\");\nexport const PeerRemovedPairing = createCustomErrorClass(\"PeerRemovedPairing\");\nexport const GenuineCheckFailed = createCustomErrorClass(\"GenuineCheckFailed\");\nexport const LedgerAPI4xx = createCustomErrorClass(\"LedgerAPI4xx\");\nexport const LedgerAPI5xx = createCustomErrorClass(\"LedgerAPI5xx\");\nexport const FirmwareOrAppUpdateRequired = createCustomErrorClass(\"FirmwareOrAppUpdateRequired\");\n// SpeedUp / Cancel EVM tx\nexport const ReplacementTransactionUnderpriced = createCustomErrorClass(\"ReplacementTransactionUnderpriced\");\n// Bitcoin family\nexport const OpReturnDataSizeLimit = createCustomErrorClass(\"OpReturnSizeLimit\");\nexport const DustLimit = createCustomErrorClass(\"DustLimit\");\n// Concordium family\nexport const ConcordiumInsufficientFunds = createCustomErrorClass(\"ConcordiumInsufficientFunds\");\nexport const ConcordiumMemoTooLong = createCustomErrorClass(\"ConcordiumMemoTooLong\");\nexport const ConcordiumPairingExpiredError = createCustomErrorClass(\"ConcordiumPairingExpiredError\");\nexport const ConcordiumSessionExpiredError = createCustomErrorClass(\"ConcordiumSessionExpiredError\");\nexport const ConcordiumTrustedMetadataServiceError = createCustomErrorClass(\"ConcordiumTrustedMetadataServiceError\");\nexport const ConcordiumAddressVerificationFailedError = createCustomErrorClass(\"ConcordiumAddressVerificationFailedError\");\nexport const ConcordiumInvalidMaxFeeError = createCustomErrorClass(\"ConcordiumInvalidMaxFeeError\");\n// Language\nexport const LanguageNotFound = createCustomErrorClass(\"LanguageNotFound\");\n// db stuff, no need to translate\nexport const NoDBPathGiven = createCustomErrorClass(\"NoDBPathGiven\");\nexport const DBWrongPassword = createCustomErrorClass(\"DBWrongPassword\");\nexport const DBNotReset = createCustomErrorClass(\"DBNotReset\");\nexport const SequenceNumberError = createCustomErrorClass(\"SequenceNumberError\");\nexport const DisabledTransactionBroadcastError = createCustomErrorClass(\"DisabledTransactionBroadcastError\");\nexport const InvalidParameterError = createCustomErrorClass(\"InvalidParameterError\");\n/**\n * Type of a Transport error used to represent all equivalent errors coming from all possible implementation of Transport\n */\nexport var HwTransportErrorType;\n(function (HwTransportErrorType) {\n HwTransportErrorType[\"Unknown\"] = \"Unknown\";\n HwTransportErrorType[\"LocationServicesDisabled\"] = \"LocationServicesDisabled\";\n HwTransportErrorType[\"LocationServicesUnauthorized\"] = \"LocationServicesUnauthorized\";\n HwTransportErrorType[\"BluetoothScanStartFailed\"] = \"BluetoothScanStartFailed\";\n})(HwTransportErrorType || (HwTransportErrorType = {}));\n/**\n * Represents an error coming from the usage of any Transport implementation.\n *\n * Needed to map a specific implementation error into an error that\n * can be managed by any code unaware of the specific Transport implementation\n * that was used.\n */\nexport class HwTransportError extends Error {\n type;\n constructor(type, message) {\n super(message);\n this.name = \"HwTransportError\";\n this.type = type;\n // Needed as long as we target < ES6\n Object.setPrototypeOf(this, HwTransportError.prototype);\n }\n}\n/**\n * TransportError is used for any generic transport errors.\n * e.g. Error thrown when data received by exchanges are incorrect or if exchanged failed to communicate with the device for various reason.\n */\nexport class TransportError extends Error {\n id;\n constructor(message, id) {\n const name = \"TransportError\";\n super(message || name);\n this.name = name;\n this.message = message;\n this.stack = new Error(message).stack;\n this.id = id;\n }\n}\naddCustomErrorDeserializer(\"TransportError\", e => new TransportError(e.message, e.id));\nexport const StatusCodes = {\n ACCESS_CONDITION_NOT_FULFILLED: 0x9804,\n ALGORITHM_NOT_SUPPORTED: 0x9484,\n CLA_NOT_SUPPORTED: 0x6e00,\n CLA_NOT_SUPPORTED_BOOTLOADER: 0x6e01,\n CODE_BLOCKED: 0x9840,\n CODE_NOT_INITIALIZED: 0x9802,\n COMMAND_INCOMPATIBLE_FILE_STRUCTURE: 0x6981,\n CONDITIONS_OF_USE_NOT_SATISFIED: 0x6985,\n CONTRADICTION_INVALIDATION: 0x9810,\n CONTRADICTION_SECRET_CODE_STATUS: 0x9808,\n DEVICE_IN_RECOVERY_MODE: 0x662f,\n CUSTOM_IMAGE_EMPTY: 0x662e,\n FILE_ALREADY_EXISTS: 0x6a89,\n FILE_NOT_FOUND: 0x9404,\n GP_AUTH_FAILED: 0x6300,\n HALTED: 0x6faa,\n INCONSISTENT_FILE: 0x9408,\n INCORRECT_DATA: 0x6a80,\n INCORRECT_LENGTH: 0x6700,\n INCORRECT_P1_P2: 0x6b00,\n INS_NOT_SUPPORTED: 0x6d00,\n DEVICE_NOT_ONBOARDED: 0x6d07,\n DEVICE_NOT_ONBOARDED_2: 0x6611,\n INVALID_KCV: 0x9485,\n INVALID_OFFSET: 0x9402,\n LICENSING: 0x6f42,\n LOCKED_DEVICE: 0x5515,\n MAX_VALUE_REACHED: 0x9850,\n MEMORY_PROBLEM: 0x9240,\n MISSING_CRITICAL_PARAMETER: 0x6800,\n NO_EF_SELECTED: 0x9400,\n NOT_ENOUGH_MEMORY_SPACE: 0x6a84,\n OK: 0x9000,\n PIN_REMAINING_ATTEMPTS: 0x63c0,\n REFERENCED_DATA_NOT_FOUND: 0x6a88,\n SECURITY_STATUS_NOT_SATISFIED: 0x6982,\n TECHNICAL_PROBLEM: 0x6f00,\n UNKNOWN_APDU: 0x6d02,\n USER_REFUSED_ON_DEVICE: 0x5501,\n NOT_ENOUGH_SPACE: 0x5102,\n APP_NOT_FOUND_OR_INVALID_CONTEXT: 0x5123,\n INVALID_APP_NAME_LENGTH: 0x670a,\n GEN_AES_KEY_FAILED: 0x5419,\n INTERNAL_CRYPTO_OPERATION_FAILED: 0x541a,\n INTERNAL_COMPUTE_AES_CMAC_FAILED: 0x541b,\n ENCRYPT_APP_STORAGE_FAILED: 0x541c,\n INVALID_BACKUP_STATE: 0x6642,\n PIN_NOT_SET: 0x5502,\n INVALID_BACKUP_LENGTH: 0x6733,\n INVALID_RESTORE_STATE: 0x6643,\n INVALID_CHUNK_LENGTH: 0x6734,\n INVALID_BACKUP_HEADER: 0x684a,\n SW_BAD_STATE: 0xb007,\n};\nexport function getAltStatusMessage(code) {\n switch (code) {\n // improve text of most common errors\n case 0x6700:\n return \"Incorrect length\";\n case 0x6800:\n return \"Missing critical parameter\";\n case 0x6982:\n return \"Security not satisfied (dongle locked or have invalid access rights)\";\n case 0x6985:\n return \"Condition of use not satisfied (denied by the user?)\";\n case 0x6a80:\n return \"Invalid data received\";\n case 0x6b00:\n return \"Invalid parameter received\";\n case 0x5515:\n return \"Locked device\";\n case 0xb007:\n return \"Unexpected state on the device\";\n }\n if (0x6f00 <= code && code <= 0x6fff) {\n return \"Internal error, please report\";\n }\n}\n/**\n * Error thrown when a device returned a non success status.\n * the error.statusCode is one of the `StatusCodes` exported by this library.\n */\nexport class TransportStatusError extends Error {\n statusCode;\n statusText;\n /**\n * @param statusCode The error status code coming from a Transport implementation\n * @param options containing:\n * - canBeMappedToChildError: enable the mapping of TransportStatusError to an error extending/inheriting from it\n * . Ex: LockedDeviceError. Default to true.\n */\n constructor(statusCode, { canBeMappedToChildError = true } = {}) {\n const statusText = Object.keys(StatusCodes).find(k => StatusCodes[k] === statusCode) || \"UNKNOWN_ERROR\";\n const smsg = getAltStatusMessage(statusCode) || statusText;\n const statusCodeStr = statusCode.toString(16);\n const message = `Ledger device: ${smsg} (0x${statusCodeStr})`;\n super(message);\n this.name = \"TransportStatusError\";\n this.statusCode = statusCode;\n this.statusText = statusText;\n Object.setPrototypeOf(this, TransportStatusError.prototype);\n // Maps to a LockedDeviceError\n if (canBeMappedToChildError && statusCode === StatusCodes.LOCKED_DEVICE) {\n return new LockedDeviceError(message);\n }\n }\n}\nexport class LockedDeviceError extends TransportStatusError {\n constructor(message) {\n super(StatusCodes.LOCKED_DEVICE, { canBeMappedToChildError: false });\n if (message) {\n this.message = message;\n }\n this.name = \"LockedDeviceError\";\n Object.setPrototypeOf(this, LockedDeviceError.prototype);\n }\n}\nexport class DeviceMangementKitError extends Error {\n constructor(name, message) {\n super(message);\n this.name = name;\n Object.setPrototypeOf(this, DeviceMangementKitError.prototype);\n }\n}\naddCustomErrorDeserializer(\"TransportStatusError\", e => new TransportStatusError(e.statusCode));\n//# sourceMappingURL=index.js.map","// biome-ignore-all lint: outside copy-paste, not worth fixing\n// ------------------------------------------------------------------------------------------------\n// ------------------------------------------------------------------------------------------------\n// THIS IS SOME HORRIBLE CODE IMPORTED JUST\n// FOR THE SAKE OF NOT IMPORTING UGLY, WICKED, AND\n// BROKEN @ledgerhq/live-* LIBRARIES\n//\n// IT'S MEANT TO BE CONSIDERED AS A BLACK BOX\n// ------------------------------------------------------------------------------------------------\n// ------------------------------------------------------------------------------------------------\nimport {\n BluetoothRequired,\n CantOpenDevice,\n DeviceHalted,\n FirmwareOrAppUpdateRequired,\n TransportInterfaceNotAvailable,\n TransportStatusError,\n TransportWebUSBGestureRequired,\n} from \"@ledgerhq/errors\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { Observable, throwError, timer } from \"rxjs\";\nimport { catchError, mergeMap, retryWhen } from \"rxjs/operators\";\n\nconst initialErrorRemapping = (error: Error): Observable<never> =>\n throwError(\n error && error instanceof TransportStatusError && error.statusCode === 0x6faa\n ? new DeviceHalted(error.message)\n : error instanceof TransportStatusError && error.statusCode === 0x6b00\n ? new FirmwareOrAppUpdateRequired(error.message)\n : error,\n );\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst never = new Promise(() => {});\n\ntype Discovery = Observable<{\n type: \"add\" | \"remove\";\n id: string;\n name: string;\n}>;\n\nexport type TransportModule = {\n // unique transport name that identify the transport module\n id: string;\n // open a device by an id, this id must be unique across all modules\n // you can typically prefix it with `something|` that identify it globally\n // returns falsy if the transport module can't handle this id\n // here, open means we want to START doing something with the transport\n open: (id: string) => Promise<Transport> | null | undefined;\n // here, close means we want to STOP doing something with the transport\n close?: (transport: Transport, id: string) => Promise<void> | null | undefined;\n // disconnect/interrupt a device connection globally\n // returns falsy if the transport module can't handle this id\n disconnect: (id: string) => Promise<void> | null | undefined;\n // optional observable that allows to discover a transport\n discovery?: Discovery;\n};\n\nconst modules: TransportModule[] = [];\n\nexport const registerTransportModule = (module: TransportModule): void => {\n modules.push(module);\n};\n\nexport const close = (transport: Transport, deviceId: string): Promise<void> => {\n for (const m of modules) {\n const p = m.close?.(transport, deviceId);\n if (p) return p;\n }\n // fallback on an actual close\n return transport.close();\n};\n\nexport const open = (deviceId: string): Promise<Transport> => {\n for (const m of modules) {\n const p = m.open(deviceId);\n if (p) return p;\n }\n return Promise.reject(new Error(`Can't find handler to open ${deviceId}`));\n};\n\nconst transportFinally =\n (cleanup: () => Promise<void>) =>\n <T>(observable: Observable<T>): Observable<T> =>\n // @ts-expect-error typescript not checking against the instanceof\n Observable.create((o) => {\n let done = false;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const finalize = (): any => {\n if (done) return never;\n done = true;\n return cleanup();\n };\n\n const sub = observable.subscribe({\n next: (e) => o.next(e),\n complete: () => {\n void finalize().then(() => o.complete());\n },\n error: (e) => {\n void finalize().then(() => o.error(e));\n },\n });\n return () => {\n sub.unsubscribe();\n void finalize();\n };\n });\n\ntype AccessHook = () => () => void;\n\nconst accessHooks: AccessHook[] = [];\n\nconst deviceQueues = {};\n\nexport const withDevice =\n (deviceId: string) =>\n <T>(job: (t: Transport) => Observable<T>): Observable<T> =>\n new Observable((o) => {\n // @ts-expect-error typescript not checking against the instanceof\n let unsubscribed;\n // @ts-expect-error typescript not checking against the instanceof\n let sub;\n // @ts-expect-error typescript not checking against the instanceof\n const deviceQueue = deviceQueues[deviceId] ?? Promise.resolve();\n\n // @ts-expect-error typescript not checking against the instanceof\n const finalize = (transport, cleanups): Promise<void> =>\n close(transport, deviceId)\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n .catch(() => {})\n .then(() => {\n // @ts-expect-error typescript not checking against the instanceof\n cleanups.forEach((c) => c());\n });\n\n // when we'll finish all the current job, we'll call finish\n // @ts-expect-error typescript not checking against the instanceof\n let finish;\n // this new promise is the next exec queue\n // @ts-expect-error typescript not checking against the instanceof\n deviceQueues[deviceId] = new Promise((resolve) => {\n finish = resolve;\n });\n // for any new job, we'll now wait the exec queue to be available\n deviceQueue\n .then(() => {\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // Release this queue slot without opening a transport.\n // @ts-expect-error typescript not checking against the instanceof\n finish();\n return;\n }\n return open(deviceId);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .then(async (transport) => {\n if (!transport) return;\n\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // it was unsubscribed prematurely\n // @ts-expect-error typescript not checking against the instanceof\n return finalize(transport, [finish]);\n }\n\n if (\n transport.requestConnectionPriority &&\n typeof transport.requestConnectionPriority === \"function\"\n ) {\n await transport.requestConnectionPriority(\"High\");\n }\n\n return transport;\n })\n // @ts-expect-error typescript not checking against the instanceof\n .catch((e) => {\n // @ts-expect-error typescript not checking against the instanceof\n finish();\n if (e instanceof BluetoothRequired) throw e;\n if (e instanceof TransportWebUSBGestureRequired) throw e;\n if (e instanceof TransportInterfaceNotAvailable) throw e;\n throw new CantOpenDevice(e.message);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .then((transport) => {\n if (!transport) return;\n\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // it was unsubscribed prematurely\n // @ts-expect-error typescript not checking against the instanceof\n return finalize(transport, [finish]);\n }\n\n const cleanups = accessHooks.map((hook) => hook());\n sub = job(transport) // $FlowFixMe\n .pipe(\n catchError(initialErrorRemapping),\n // $FlowFixMe\n transportFinally(() =>\n // @ts-expect-error typescript not checking against the instanceof\n finalize(transport, [...cleanups, finish]),\n ),\n )\n .subscribe(o);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .catch((error) => o.error(error));\n return () => {\n unsubscribed = true;\n // @ts-expect-error typescript not checking against the instanceof\n if (sub) sub.unsubscribe();\n };\n });\n\nconst WITH_DEVICE_POLLING_DELAY = 500;\n\nexport const retryWhileErrors =\n (acceptError: (arg0: Error) => boolean) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (attempts: Observable<any>): Observable<any> =>\n attempts.pipe(\n mergeMap((error) => {\n if (!acceptError(error)) {\n return throwError(error);\n }\n\n return timer(WITH_DEVICE_POLLING_DELAY);\n }),\n );\n\nexport const withDevicePolling =\n (deviceId: string) =>\n <T>(\n job: (arg0: Transport) => Observable<T>,\n acceptError: (arg0: Error) => boolean = () => false,\n ): Observable<T> =>\n withDevice(deviceId)(job).pipe(retryWhen(retryWhileErrors(acceptError)));\n","import { TransportStatusError } from \"@ledgerhq/errors\";\n\nexport const isTransportStatusError = (error: unknown): error is TransportStatusError => {\n return (\n error instanceof TransportStatusError ||\n (error instanceof Error && \"statusCode\" in error && error.message.startsWith(\"Ledger device:\"))\n );\n};\n\nconst CANCEL_STATUS_CODES = [\n 0x6985, // cancel on Ledger Blue\n\n // STAX\n 0xb00c, // cancel collect wk fragment\n 0xb00d, // cancel user registration\n 0xb010, // cancel review\n 0xb012, // cancel master seed generation\n 0xb013, // cancel login\n 0x5501, // cancel openApp\n];\n\n// The software device (device-api) surfaces firmware status words as an HTTP 409 whose JSON body\n// carries `{ sw: \"<hex>\" }`. The Web proxy can wrap this body one level below `data`.\nconst isDeviceApiSwError = (error: unknown, sw: string): boolean => {\n if (typeof error !== \"object\" || error === null || !(\"response\" in error)) return false;\n const { response } = error as { response?: unknown };\n if (typeof response !== \"object\" || response === null || !(\"data\" in response)) return false;\n const { data } = response as { data?: unknown };\n if (typeof data !== \"object\" || data === null) return false;\n const hasSw = (obj: unknown): boolean =>\n typeof obj === \"object\" && obj !== null && \"sw\" in obj && (obj as { sw?: unknown }).sw === sw;\n return hasSw(data) || hasSw((data as { data?: unknown }).data);\n};\n\nexport const isDeviceCancelError = (error: Error): boolean => {\n if (isTransportStatusError(error)) return CANCEL_STATUS_CODES.includes(error.statusCode);\n return CANCEL_STATUS_CODES.some((status) => isDeviceApiSwError(error, status.toString(16)));\n};\n\n// `@ledgerhq/errors` classes are created via `createCustomErrorClass`, which sets `error.name` to\n// the class name on every instance. Bundlers (the SDK bundles its own `@ledgerhq/errors`) can\n// produce a second, nominally-distinct copy of these classes, so `instanceof` is unreliable across\n// a package/bundle boundary. Matching on `error.name` accepts instances from any copy, so\n// consumers must use these predicates instead of importing the class and doing `instanceof`\n// themselves.\nconst namedErrorPredicate =\n (name: string) =>\n (error: unknown): boolean =>\n error instanceof Error && error.name === name;\n\n// CantOpenDevice — the transport failed to open, most notably when the user dismisses the WebHID\n// native chooser without selecting a device (surfaced as \"Access denied to use Ledger device\").\n// Used to STOP polling instead of re-opening the chooser forever.\nexport const isCantOpenDeviceError = namedErrorPredicate(\"CantOpenDevice\");\n\n// LockedDeviceError — the device is connected but locked with its PIN.\nexport const isLockedDeviceError = namedErrorPredicate(\"LockedDeviceError\");\n\n// SW_PSK_MISSING (0x6065) — the device-side `start_psk_session` (and any secure-channel APDU\n// transitively relying on a populated PSK) returns this when the NVM record's PSK field is the\n// all-zero sentinel. Used as the trigger to drive the PSK refresh sub-chain mid-operation.\nexport const isPskMissingError = (error: unknown): boolean => {\n return (\n (isTransportStatusError(error) && error.statusCode === 0x6065) ||\n isDeviceApiSwError(error, \"6065\")\n );\n};\n\n// SW_PSK_MISMATCH (0x6067) — `FINALIZE_PSK_REFRESH` returns this when the PSK delivered by the HSM\n// differs from the one already stored for the partition. Because the PSK is static this signals a\n// genuine divergence (e.g. an un-migrated user), so it must surface as an error rather than be\n// retried like SW_PSK_MISSING.\nexport const isPskMismatchError = (error: unknown): boolean => {\n return (\n (isTransportStatusError(error) && error.statusCode === 0x6067) ||\n isDeviceApiSwError(error, \"6067\")\n );\n};\n"],"x_google_ignoreList":[1,2,5,6],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"device-BT5YbF2y.cjs","names":["isRetryAllowed","uuidv4","throwError","Observable","catchError","mergeMap","timer","retryWhen"],"sources":["../src/device/abort.ts","../../../node_modules/.pnpm/is-retry-allowed@2.2.0/node_modules/is-retry-allowed/index.js","../../../node_modules/.pnpm/axios-retry@4.5.0_axios@1.20.0/node_modules/axios-retry/dist/esm/index.js","../src/device/constants.ts","../src/device/api-device.ts","../../../node_modules/.pnpm/@ledgerhq+errors@6.36.0/node_modules/@ledgerhq/errors/lib-es/helpers.js","../../../node_modules/.pnpm/@ledgerhq+errors@6.36.0/node_modules/@ledgerhq/errors/lib-es/index.js","../src/device/device-access.ts","../src/device/utils.ts"],"sourcesContent":["/** Error returned when the application aborts a device operation. */\nexport class DeviceOperationAbortedError extends Error {\n constructor() {\n super(\"Device operation aborted\");\n this.name = \"DeviceOperationAbortedError\";\n }\n}\n\nexport type DeviceOperationOptions = {\n /** Stops this operation when the application no longer owns the interaction. */\n signal?: AbortSignal;\n};\n\nexport const isDeviceOperationAbortedError = (\n error: unknown,\n): error is DeviceOperationAbortedError =>\n error instanceof Error && error.name === \"DeviceOperationAbortedError\";\n\nexport const throwIfDeviceOperationAborted = (signal?: AbortSignal): void => {\n if (signal?.aborted) {\n throw new DeviceOperationAbortedError();\n }\n};\n\nexport const withDeviceOperationSignal = <T>(\n operation: () => Promise<T>,\n signal?: AbortSignal,\n): Promise<T> => {\n try {\n throwIfDeviceOperationAborted(signal);\n } catch (error) {\n return Promise.reject(error);\n }\n if (!signal) return Promise.resolve().then(operation);\n\n return new Promise<T>((resolve, reject) => {\n const onAbort = (): void => reject(new DeviceOperationAbortedError());\n signal.addEventListener(\"abort\", onAbort, { once: true });\n Promise.resolve()\n .then(() => {\n throwIfDeviceOperationAborted(signal);\n return operation();\n })\n .then(resolve, (error: unknown) => {\n reject(signal.aborted ? new DeviceOperationAbortedError() : error);\n })\n .finally(() => signal.removeEventListener(\"abort\", onAbort));\n });\n};\n\nexport const deviceOperationDelay = (delay: number, signal?: AbortSignal): Promise<void> => {\n try {\n throwIfDeviceOperationAborted(signal);\n } catch (error) {\n return Promise.reject(error);\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delay);\n const onAbort = (): void => {\n clearTimeout(timeout);\n reject(new DeviceOperationAbortedError());\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n};\n","'use strict';\n\nconst denyList = new Set([\n\t'ENOTFOUND',\n\t'ENETUNREACH',\n\n\t// SSL errors from https://github.com/nodejs/node/blob/fc8e3e2cdc521978351de257030db0076d79e0ab/src/crypto/crypto_common.cc#L301-L328\n\t'UNABLE_TO_GET_ISSUER_CERT',\n\t'UNABLE_TO_GET_CRL',\n\t'UNABLE_TO_DECRYPT_CERT_SIGNATURE',\n\t'UNABLE_TO_DECRYPT_CRL_SIGNATURE',\n\t'UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY',\n\t'CERT_SIGNATURE_FAILURE',\n\t'CRL_SIGNATURE_FAILURE',\n\t'CERT_NOT_YET_VALID',\n\t'CERT_HAS_EXPIRED',\n\t'CRL_NOT_YET_VALID',\n\t'CRL_HAS_EXPIRED',\n\t'ERROR_IN_CERT_NOT_BEFORE_FIELD',\n\t'ERROR_IN_CERT_NOT_AFTER_FIELD',\n\t'ERROR_IN_CRL_LAST_UPDATE_FIELD',\n\t'ERROR_IN_CRL_NEXT_UPDATE_FIELD',\n\t'OUT_OF_MEM',\n\t'DEPTH_ZERO_SELF_SIGNED_CERT',\n\t'SELF_SIGNED_CERT_IN_CHAIN',\n\t'UNABLE_TO_GET_ISSUER_CERT_LOCALLY',\n\t'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\n\t'CERT_CHAIN_TOO_LONG',\n\t'CERT_REVOKED',\n\t'INVALID_CA',\n\t'PATH_LENGTH_EXCEEDED',\n\t'INVALID_PURPOSE',\n\t'CERT_UNTRUSTED',\n\t'CERT_REJECTED',\n\t'HOSTNAME_MISMATCH'\n]);\n\n// TODO: Use `error?.code` when targeting Node.js 14\nmodule.exports = error => !denyList.has(error && error.code);\n","import isRetryAllowed from 'is-retry-allowed';\nexport const namespace = 'axios-retry';\nexport function isNetworkError(error) {\n const CODE_EXCLUDE_LIST = ['ERR_CANCELED', 'ECONNABORTED'];\n if (error.response) {\n return false;\n }\n if (!error.code) {\n return false;\n }\n // Prevents retrying timed out & cancelled requests\n if (CODE_EXCLUDE_LIST.includes(error.code)) {\n return false;\n }\n // Prevents retrying unsafe errors\n return isRetryAllowed(error);\n}\nconst SAFE_HTTP_METHODS = ['get', 'head', 'options'];\nconst IDEMPOTENT_HTTP_METHODS = SAFE_HTTP_METHODS.concat(['put', 'delete']);\nexport function isRetryableError(error) {\n return (error.code !== 'ECONNABORTED' &&\n (!error.response ||\n error.response.status === 429 ||\n (error.response.status >= 500 && error.response.status <= 599)));\n}\nexport function isSafeRequestError(error) {\n if (!error.config?.method) {\n // Cannot determine if the request can be retried\n return false;\n }\n return isRetryableError(error) && SAFE_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\nexport function isIdempotentRequestError(error) {\n if (!error.config?.method) {\n // Cannot determine if the request can be retried\n return false;\n }\n return isRetryableError(error) && IDEMPOTENT_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\nexport function isNetworkOrIdempotentRequestError(error) {\n return isNetworkError(error) || isIdempotentRequestError(error);\n}\nexport function retryAfter(error = undefined) {\n const retryAfterHeader = error?.response?.headers['retry-after'];\n if (!retryAfterHeader) {\n return 0;\n }\n // if the retry after header is a number, convert it to milliseconds\n let retryAfterMs = (Number(retryAfterHeader) || 0) * 1000;\n // If the retry after header is a date, get the number of milliseconds until that date\n if (retryAfterMs === 0) {\n retryAfterMs = (new Date(retryAfterHeader).valueOf() || 0) - Date.now();\n }\n return Math.max(0, retryAfterMs);\n}\nfunction noDelay(_retryNumber = 0, error = undefined) {\n return Math.max(0, retryAfter(error));\n}\nexport function exponentialDelay(retryNumber = 0, error = undefined, delayFactor = 100) {\n const calculatedDelay = 2 ** retryNumber * delayFactor;\n const delay = Math.max(calculatedDelay, retryAfter(error));\n const randomSum = delay * 0.2 * Math.random(); // 0-20% of the delay\n return delay + randomSum;\n}\n/**\n * Linear delay\n * @param {number | undefined} delayFactor - delay factor in milliseconds (default: 100)\n * @returns {function} (retryNumber: number, error: AxiosError | undefined) => number\n */\nexport function linearDelay(delayFactor = 100) {\n return (retryNumber = 0, error = undefined) => {\n const delay = retryNumber * delayFactor;\n return Math.max(delay, retryAfter(error));\n };\n}\nexport const DEFAULT_OPTIONS = {\n retries: 3,\n retryCondition: isNetworkOrIdempotentRequestError,\n retryDelay: noDelay,\n shouldResetTimeout: false,\n onRetry: () => { },\n onMaxRetryTimesExceeded: () => { },\n validateResponse: null\n};\nfunction getRequestOptions(config, defaultOptions) {\n return { ...DEFAULT_OPTIONS, ...defaultOptions, ...config[namespace] };\n}\nfunction setCurrentState(config, defaultOptions, resetLastRequestTime = false) {\n const currentState = getRequestOptions(config, defaultOptions || {});\n currentState.retryCount = currentState.retryCount || 0;\n if (!currentState.lastRequestTime || resetLastRequestTime) {\n currentState.lastRequestTime = Date.now();\n }\n config[namespace] = currentState;\n return currentState;\n}\nfunction fixConfig(axiosInstance, config) {\n // @ts-ignore\n if (axiosInstance.defaults.agent === config.agent) {\n // @ts-ignore\n delete config.agent;\n }\n if (axiosInstance.defaults.httpAgent === config.httpAgent) {\n delete config.httpAgent;\n }\n if (axiosInstance.defaults.httpsAgent === config.httpsAgent) {\n delete config.httpsAgent;\n }\n}\nasync function shouldRetry(currentState, error) {\n const { retries, retryCondition } = currentState;\n const shouldRetryOrPromise = (currentState.retryCount || 0) < retries && retryCondition(error);\n // This could be a promise\n if (typeof shouldRetryOrPromise === 'object') {\n try {\n const shouldRetryPromiseResult = await shouldRetryOrPromise;\n // keep return true unless shouldRetryPromiseResult return false for compatibility\n return shouldRetryPromiseResult !== false;\n }\n catch (_err) {\n return false;\n }\n }\n return shouldRetryOrPromise;\n}\nasync function handleRetry(axiosInstance, currentState, error, config) {\n currentState.retryCount += 1;\n const { retryDelay, shouldResetTimeout, onRetry } = currentState;\n const delay = retryDelay(currentState.retryCount, error);\n // Axios fails merging this configuration to the default configuration because it has an issue\n // with circular structures: https://github.com/mzabriskie/axios/issues/370\n fixConfig(axiosInstance, config);\n if (!shouldResetTimeout && config.timeout && currentState.lastRequestTime) {\n const lastRequestDuration = Date.now() - currentState.lastRequestTime;\n const timeout = config.timeout - lastRequestDuration - delay;\n if (timeout <= 0) {\n return Promise.reject(error);\n }\n config.timeout = timeout;\n }\n config.transformRequest = [(data) => data];\n await onRetry(currentState.retryCount, error, config);\n if (config.signal?.aborted) {\n return Promise.resolve(axiosInstance(config));\n }\n return new Promise((resolve) => {\n const abortListener = () => {\n clearTimeout(timeout);\n resolve(axiosInstance(config));\n };\n const timeout = setTimeout(() => {\n resolve(axiosInstance(config));\n if (config.signal?.removeEventListener) {\n config.signal.removeEventListener('abort', abortListener);\n }\n }, delay);\n if (config.signal?.addEventListener) {\n config.signal.addEventListener('abort', abortListener, { once: true });\n }\n });\n}\nasync function handleMaxRetryTimesExceeded(currentState, error) {\n if (currentState.retryCount >= currentState.retries)\n await currentState.onMaxRetryTimesExceeded(error, currentState.retryCount);\n}\nconst axiosRetry = (axiosInstance, defaultOptions) => {\n const requestInterceptorId = axiosInstance.interceptors.request.use((config) => {\n setCurrentState(config, defaultOptions, true);\n if (config[namespace]?.validateResponse) {\n // by setting this, all HTTP responses will be go through the error interceptor first\n config.validateStatus = () => false;\n }\n return config;\n });\n const responseInterceptorId = axiosInstance.interceptors.response.use(null, async (error) => {\n const { config } = error;\n // If we have no information to retry the request\n if (!config) {\n return Promise.reject(error);\n }\n const currentState = setCurrentState(config, defaultOptions);\n if (error.response && currentState.validateResponse?.(error.response)) {\n // no issue with response\n return error.response;\n }\n if (await shouldRetry(currentState, error)) {\n return handleRetry(axiosInstance, currentState, error, config);\n }\n await handleMaxRetryTimesExceeded(currentState, error);\n return Promise.reject(error);\n });\n return { requestInterceptorId, responseInterceptorId };\n};\n// Compatibility with CommonJS\naxiosRetry.isNetworkError = isNetworkError;\naxiosRetry.isSafeRequestError = isSafeRequestError;\naxiosRetry.isIdempotentRequestError = isIdempotentRequestError;\naxiosRetry.isNetworkOrIdempotentRequestError = isNetworkOrIdempotentRequestError;\naxiosRetry.exponentialDelay = exponentialDelay;\naxiosRetry.linearDelay = linearDelay;\naxiosRetry.isRetryableError = isRetryableError;\nexport default axiosRetry;\n","export const PATHS = {\n U2F: \"5655636'/5583430'\",\n CONFIDENTIALITY: \"5655636'/4410950'\",\n KEY_MATERIAL: \"5655636'/4932953'\",\n VALIDATION: \"5655636'/5652812'\",\n} as const;\n\nexport const STATUS_LENGTH = 2;\n\nexport const SCRIPT_IDS = {\n INIT_SESSION: 3,\n ACCOUNT_MANAGER_SESSION: 2,\n} as const;\n\nexport const STR_ROLES: Record<\"OPERATOR\" | \"ADMIN\" | \"SHARED_OWNER\", string> = {\n OPERATOR: \"00\",\n ADMIN: \"01\",\n SHARED_OWNER: \"02\",\n} as const;\n\nexport const APPID_VAULT_ADMINISTRATOR =\n \"ad5be1a1fe011ce7f53ae081a22ae000a42021f3f94106a3bac9f76e8230e4b9\";\n\nconst all61xxStatus = [];\nfor (let i = 0x6100; i <= 0x61ff; i++) {\n all61xxStatus.push(i);\n}\n\nexport const PAGINATED_STATUS = all61xxStatus;\nexport const STREAMING_RESPONSE = 0x02;\nexport const STREAMING_NEXT_ACTION = 0x01;\n","import type {\n HsmCertificate,\n PsdAuthChallengeResponse,\n PsdPairingData,\n PubKey,\n RefreshPskData,\n} from \"@ledgerhq/revault-api\";\nimport axios from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport invariant from \"invariant\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport type { Logger } from \"@/logger\";\n\nimport { deviceOperationDelay, withDeviceOperationSignal } from \"./abort\";\nimport { APPID_VAULT_ADMINISTRATOR, PATHS, SCRIPT_IDS, STR_ROLES } from \"./constants\";\nimport type { Device, PairingStatus } from \"./types\";\n\ntype Options = {\n /**\n * device-api URL\n */\n deviceApiUrl: string;\n\n /**\n * salt used by device-api\n */\n salt: string;\n\n /**\n * seed generation function used for device-api device spawn\n */\n genSeed: (p: { salt: string; index: number }) => string | Promise<string>;\n};\n\nexport type ApiDevice = {\n /**\n * bind a device to the given device index\n */\n with: (index: number) => Device;\n};\n\nexport function createApiDevice(options: Options, logger: Logger): ApiDevice {\n const { genSeed } = options;\n const sessionId = uuidv4();\n const deviceApi = axios.create({ baseURL: options.deviceApiUrl });\n\n axiosRetry(deviceApi, {\n retryDelay: axiosRetry.linearDelay(1000),\n retries: 3,\n /* v8 ignore start -- @preserve */\n retryCondition: () => true,\n onRetry: (retryCount, err) => {\n const formattedErr = `${err.code ?? `UNKNOWN`} on ${err.config?.method?.toUpperCase() ?? \"UNKNOWN_METHOD\"} ${err.config?.url ?? \"UNKNOWN_URL\"}`;\n logger.warning(\n `Retrying request to device-api (attempt ${retryCount}) - Cause: ${formattedErr}`,\n );\n },\n /* v8 ignore stop */\n });\n\n /* v8 ignore start -- @preserve */\n deviceApi.interceptors.request.use(\n (config) => {\n logger.debug(\n `[device-api] ${config.method?.toUpperCase()} ${config.url}${config.data ? ` ${JSON.stringify(config.data)}` : \"\"}`,\n );\n if ([\"post\", \"put\"].includes(config.method!)) {\n // when interceptor is called in combination with axios-retry, config.data can be a string or an object\n // and we should return either a string or an object compatible with the original type\n const isStringMode = typeof config.data === \"string\";\n const data = (isStringMode ? JSON.parse(config.data) : config.data) as Record<\n string,\n unknown\n >;\n const enhancedData = {\n sessionID: sessionId, // Used to ensure dedicated session if someones else uses same seed\n psd_model: \"02\", // Stax\n version: 3, // Used to properly enable noise channel\n ...data,\n };\n config.data = isStringMode ? JSON.stringify(enhancedData) : enhancedData;\n }\n return config;\n },\n (error: Error) => Promise.reject(error),\n );\n /* v8 ignore stop */\n\n return {\n with: (index: number): Device => {\n const __seed = genSeed({ salt: options.salt, index });\n\n const getSeed = async (): Promise<string> => {\n if (typeof __seed === \"string\") return Promise.resolve(__seed);\n return __seed;\n };\n\n const postWithSignal = async <T>(\n url: string,\n data: unknown,\n signal?: AbortSignal,\n ): Promise<{ data: T }> =>\n withDeviceOperationSignal(\n () => (signal ? deviceApi.post<T>(url, data, { signal }) : deviceApi.post<T>(url, data)),\n signal,\n );\n\n const authenticate = async ({\n challenge,\n workspaceName,\n }: {\n challenge: PsdAuthChallengeResponse;\n workspaceName: string;\n }): Promise<string> => {\n const role = challenge.role;\n if (role === \"READ_ONLY_API_KEY\")\n throw new Error(\"Invalid role for authenticate: READ_ONLY_API_KEY\");\n const { data } = await deviceApi.post<string>(\"/authenticate\", {\n seed: await getSeed(),\n challenge: Buffer.from(challenge.challenge, \"base64\").toString(\"hex\"),\n application: APPID_VAULT_ADMINISTRATOR,\n key_handle: challenge.keyHandle,\n name: challenge.name,\n role: STR_ROLES[role],\n type: \"02\", // Stax\n workspaceName,\n });\n return data;\n };\n\n const finalizePairingHandshake = async (params: {\n handshake: string;\n partitionId: string;\n }): Promise<string> => {\n const { handshake, partitionId } = params;\n const payload = { seed: await getSeed(), handshake, ciphertext: partitionId };\n const res = await deviceApi.post<string>(\"/finalize-pairing-handshake\", payload);\n return res.data;\n };\n\n const generateSeedFragment = async (): Promise<string> => {\n const payload = {\n seed: await getSeed(),\n path: PATHS.KEY_MATERIAL,\n goal: 0, // seed fragment\n };\n const { data } = await deviceApi.post<string>(\"/generate-key-component\", payload);\n return data;\n };\n\n const getAttestation = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{\n attestation: {\n codeHash: string;\n attestationPub: string;\n certificate: string;\n };\n buffer: Buffer;\n }> => {\n const { data: attestationStr } = await postWithSignal<string>(\n \"/get-attestation\",\n { seed: await getSeed() },\n opts.signal,\n );\n const attestationBuffer = Buffer.from(attestationStr, \"hex\");\n const certLen = attestationBuffer.readInt8(32 + 65 + 1);\n return {\n attestation: {\n codeHash: attestationBuffer.slice(0, 32).toString(\"base64\"),\n attestationPub: attestationBuffer.slice(32, 32 + 65).toString(\"base64\"),\n certificate: attestationBuffer.slice(32 + 65, 32 + 65 + 2 + certLen).toString(\"base64\"),\n },\n buffer: attestationBuffer,\n };\n };\n\n const getConfidentialityKey = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{\n confidentialityKeyCurve25519: string;\n confidentialityKeySignature: string;\n }> => {\n const res = await postWithSignal<{\n confidentiality_key_curve25519: string;\n confidentiality_key_signature: string;\n }>(\"/get-confidentiality-key\", { seed: await getSeed() }, opts.signal);\n return {\n confidentialityKeyCurve25519: res.data.confidentiality_key_curve25519,\n confidentialityKeySignature: res.data.confidentiality_key_signature,\n };\n };\n\n const getConfidentialityPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.CONFIDENTIALITY });\n };\n\n const getDeviceUserId = async (): Promise<string> => {\n const res = await deviceApi.post<{ blue_device_id: string }>(\"/blue-device-id\", {\n seed: await getSeed(),\n });\n return res.data.blue_device_id.toUpperCase();\n };\n\n const getU2FPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.U2F });\n };\n\n const getValidationPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.VALIDATION });\n };\n\n const hasPairing = async (opts: { signal?: AbortSignal } = {}): Promise<PairingStatus> => {\n const seed = await getSeed();\n const res = await postWithSignal<string[]>(\"/get-partition-ids\", { seed }, opts.signal);\n if (res.data.length === 0) return \"NO_PAIRING\";\n // A pairing exists; ask device-api whether its PSK slot is populated. Mirrors the firmware\n // returning SW_PSK_MISSING from GET_PARTITION_IDS when the NVM PSK is the all-zero sentinel.\n // POST (not GET) so the body carries `seed` and the interceptor-injected `sessionID`,\n // letting device-api resolve THIS session's device instead of its global current device.\n const status = await postWithSignal<{ partition_id: string | null; psk_missing: boolean }>(\n \"/partition-psk-status\",\n { seed },\n opts.signal,\n );\n return status.data.psk_missing ? \"PSK_MISSING\" : \"OK\";\n };\n\n const initPairingHandshake = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{ pubKey: string; signature: string }> => {\n const { data } = await postWithSignal<{ attestation: string; pubKey: string }>(\n \"/initiate-pairing-handshake\",\n { seed: await getSeed() },\n opts.signal,\n );\n return {\n pubKey: data.pubKey,\n signature: Buffer.from(data.attestation, \"hex\").toString(\"base64\"),\n };\n };\n\n const openSession = async (params: {\n secureChannel: { pubKey: PubKey; certificate: HsmCertificate };\n }): Promise<void> => {\n const { secureChannel } = params;\n const signature = Buffer.from(secureChannel.certificate.signature, \"base64\");\n const attestationPubKey = Buffer.from(secureChannel.certificate.attestationPub, \"base64\");\n const attestationCertificate = Buffer.from(secureChannel.certificate.certificate, \"base64\");\n const attestation = Buffer.concat([\n Buffer.from([signature.length]),\n signature,\n attestationPubKey,\n Buffer.from([attestationCertificate.length]),\n attestationCertificate,\n ]);\n const payload = {\n seed: await getSeed(),\n path: PATHS.CONFIDENTIALITY,\n pubKey: secureChannel.pubKey,\n attestation: attestation.toString(\"hex\"),\n scriptId: SCRIPT_IDS.INIT_SESSION,\n };\n const { data: deviceResponse } = await deviceApi.post<string>(\"/open-session\", payload);\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const register = async (params: {\n challenge: string;\n u2fRegisterData: string;\n name: string;\n role: \"ADMIN\" | \"SHARED_OWNER\" | \"OPERATOR\";\n }): Promise<{\n u2fRegister: Buffer;\n keyHandle: Buffer;\n rfu: number;\n pubKey: string;\n }> => {\n const { challenge, u2fRegisterData, name, role } = params;\n const payload = {\n seed: await getSeed(),\n challenge,\n name,\n role: STR_ROLES[role],\n hsm_data: u2fRegisterData,\n type: \"02\", // Stax\n application: APPID_VAULT_ADMINISTRATOR,\n };\n const { data } = await deviceApi.post<string>(\"/register\", payload);\n const response = Buffer.from(data, \"hex\");\n let i = 0;\n const rfu = response.slice(i, i + 1)[0]!;\n i += 1;\n const pubKey = response.slice(i, i + 65).toString(\"hex\");\n i += 65;\n const keyHandleLength = response.slice(i, i + 1)[0]!;\n i++;\n const keyHandle = response.slice(i, i + keyHandleLength);\n i += keyHandleLength;\n return {\n u2fRegister: response.slice(0, response.length - 2),\n keyHandle,\n rfu,\n pubKey,\n };\n };\n\n const registerData = async (params: { challenge: string }): Promise<string> => {\n const { challenge } = params;\n const payload = { seed: await getSeed(), challenge };\n const res = await deviceApi.post<string>(\"/u2f-register-data\", payload);\n return res.data;\n };\n\n const setPairing = async ({\n pairing,\n signal,\n }: {\n pairing: PsdPairingData;\n signal?: AbortSignal;\n }): Promise<void> => {\n const payload = {\n seed: await getSeed(),\n blob: pairing.blob,\n pairing: {\n bootstrap_enabled: pairing.pairing.bootstrapEnabled,\n partition_key: pairing.pairing.partitionKey,\n workspace_name: pairing.pairing.workspaceName,\n },\n partition_key_attestation: {\n code_hash: pairing.partitionKeyAttestation.codeHash,\n attestation_pub: pairing.partitionKeyAttestation.attestationPub,\n certificate: pairing.partitionKeyAttestation.certificate,\n signature: pairing.partitionKeyAttestation.signature,\n },\n };\n await postWithSignal(\"/set-partition-key\", payload, signal);\n };\n\n const signRefreshPskAuth = async ({\n ephemeralKey,\n signal,\n }: {\n ephemeralKey: string;\n signal?: AbortSignal;\n }): Promise<string> => {\n // Mirrors the firmware's SIGN_REFRESH_PSK_AUTH (`0x55`). The firmware signs over the\n // ephemeral it captured at INITIALIZE_NN_HANDSHAKE; the stateless device-api has no such\n // capture, so we pass the framed ephemeral (hex, from initPairingHandshake) back here.\n // The endpoint returns the DER signature as raw hex; convert to base64 to match the proxy's\n // base64 `validation_key_signature` field.\n const { data } = await postWithSignal<string>(\n \"/sign-refresh-psk-auth\",\n {\n seed: await getSeed(),\n ephemeral_key: ephemeralKey,\n },\n signal,\n );\n return Buffer.from(data, \"hex\").toString(\"base64\");\n };\n\n const finalizePskRefresh = async (\n params: RefreshPskData & { signal?: AbortSignal },\n ): Promise<void> => {\n // Mirrors the firmware's FINALIZE_PSK_REFRESH handler. device-api takes only the NN\n // `handshake` and the encrypted PairingPayload `ciphertext`, both hex — no attestation\n // (it doesn't verify the HSM endorsement). The proxy hands us base64, so convert to hex.\n const payload = {\n seed: await getSeed(),\n handshake: Buffer.from(params.handshake, \"base64\").toString(\"hex\"),\n ciphertext: Buffer.from(params.encryptedPairingPayload, \"base64\").toString(\"hex\"),\n };\n await postWithSignal(\"/finalize-psk-refresh\", payload, params.signal);\n };\n\n const startKKPatternAsResponder = async (params: {\n handshake: string;\n handshakeAttestation: HsmCertificate;\n partitionId: string;\n }): Promise<{ handshake: string; signature: string }> => {\n const payload = {\n seed: await getSeed(),\n script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,\n handshake: params.handshake,\n // for device-api it's normal to have empty string as handshake_attestation\n handshake_attestation: \"\",\n partition_id: params.partitionId,\n };\n const { data } = await deviceApi.post<string>(\"/start-kk-pattern-as-responder\", payload);\n const buffer = Buffer.from(data, \"hex\");\n const dataLength = buffer.readInt8(0);\n return {\n handshake: buffer.slice(1, dataLength + 1).toString(\"base64\"),\n signature: buffer.slice(dataLength + 1).toString(\"base64\"),\n };\n };\n\n const startKPatternAsResponder = async (params: {\n handshake: string;\n handshakeAttestation: HsmCertificate;\n partitionId: string;\n signal?: AbortSignal;\n }): Promise<void> => {\n const { handshake, partitionId } = params;\n const payload = {\n seed: await getSeed(),\n script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,\n handshake,\n // for device-api it's normal to have empty string as handshake_attestation\n handshake_attestation: \"\",\n partition_id: partitionId,\n };\n const { data: deviceResponse } = await postWithSignal<string>(\n \"/start-k-pattern-as-responder\",\n payload,\n params.signal,\n );\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const startPskSession = async (params: {\n nonce: string;\n partitionId: string;\n signal?: AbortSignal;\n }): Promise<void> => {\n const { nonce, partitionId } = params;\n invariant(\n nonce.length === 64,\n `PSK nonce must be 32 bytes (64 hex chars), got ${nonce.length} chars`,\n );\n invariant(\n partitionId.length === 32,\n `partitionId must be 16 bytes (32 hex chars), got ${partitionId.length} chars`,\n );\n // Mirrors firmware START_PSK_SESSION. Unlike the hex-decoded k-pattern route, the\n // device-api /start-psk-session base64-decodes nonce + partition_id, so convert the\n // challenge's hex strings to base64 here.\n const payload = {\n seed: await getSeed(),\n nonce: Buffer.from(nonce, \"hex\").toString(\"base64\"),\n partition_id: Buffer.from(partitionId, \"hex\").toString(\"base64\"),\n };\n const { data: deviceResponse } = await postWithSignal<string>(\n \"/start-psk-session\",\n payload,\n params.signal,\n );\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const getPublicKey = async (params: {\n path: string;\n }): Promise<{ pubKey: string; signature: string }> => {\n const { path } = params;\n type DeviceApiGetPubKeyResponse = { attestation: string; pubKey: string };\n const payload = { seed: await getSeed(), secp256k1: true, path };\n const res = await deviceApi.post<DeviceApiGetPubKeyResponse>(\"/get-public-key\", payload);\n return {\n pubKey: res.data.pubKey,\n signature: Buffer.from(res.data.attestation, \"hex\").toString(\"base64\"),\n };\n };\n\n const validateVaultOperation = async (params: {\n actions: string[];\n signal?: AbortSignal;\n }): Promise<string> => {\n const { actions } = params;\n const payload = {\n seed: await getSeed(),\n path: PATHS.VALIDATION,\n actions,\n };\n const { data: signature } = await postWithSignal<string>(\n \"/validate-op\",\n payload,\n params.signal,\n );\n return signature;\n };\n\n const sendAPDU = (_apdu: string): Promise<string> => {\n logger.info(\"Can't send arbitrary APDU to software device\");\n return Promise.resolve(\"9000\");\n };\n\n const getVersion = async (opts: { signal?: AbortSignal } = {}): Promise<string> =>\n withDeviceOperationSignal(() => Promise.resolve(\"1.2.3\"), opts.signal);\n\n const poll = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{ isAppOpened: boolean }> => {\n await deviceOperationDelay(1e3, opts.signal);\n return { isAppOpened: true };\n };\n\n const pollApp = async (\n _name: string,\n opts: { signal?: AbortSignal } = {},\n ): Promise<string> => {\n await deviceOperationDelay(1e3, opts.signal);\n return \"9000\";\n };\n\n return {\n authenticate,\n finalizePairingHandshake,\n generateSeedFragment,\n getAttestation,\n getConfidentialityKey,\n getConfidentialityPubKey,\n getDeviceUserId,\n getU2FPubKey,\n getValidationPubKey,\n hasPairing,\n initPairingHandshake,\n openSession,\n register,\n registerData,\n setPairing,\n signRefreshPskAuth,\n finalizePskRefresh,\n startKKPatternAsResponder,\n startKPatternAsResponder,\n startPskSession,\n validateVaultOperation,\n getVersion,\n sendAPDU,\n poll,\n pollApp,\n };\n },\n };\n}\n","/* eslint-disable no-continue */\n/* eslint-disable no-unused-vars */\n/* eslint-disable no-param-reassign */\n/* eslint-disable no-prototype-builtins */\nconst errorClasses = {};\nconst deserializers = {};\nexport const addCustomErrorDeserializer = (name, deserializer) => {\n deserializers[name] = deserializer;\n};\nexport const createCustomErrorClass = (name) => {\n class CustomErrorClass extends Error {\n cause;\n constructor(message, fields, options) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n super(message || name, options);\n // Set the prototype explicitly. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, CustomErrorClass.prototype);\n this.name = name;\n if (fields) {\n for (const k in fields) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this[k] = fields[k];\n }\n }\n if (options && isObject(options) && \"cause\" in options && !this.cause) {\n // .cause was specified but the superconstructor\n // did not create an instance property.\n const cause = options.cause;\n this.cause = cause;\n if (\"stack\" in cause) {\n this.stack = this.stack + \"\\nCAUSE: \" + cause.stack;\n }\n }\n }\n }\n errorClasses[name] = CustomErrorClass;\n return CustomErrorClass;\n};\nfunction isObject(value) {\n return typeof value === \"object\";\n}\n// inspired from https://github.com/programble/errio/blob/master/index.js\nexport const deserializeError = (object) => {\n if (object && typeof object === \"object\") {\n try {\n if (typeof object.message === \"string\") {\n const msg = JSON.parse(object.message);\n if (msg.message && msg.name) {\n object = msg;\n }\n }\n }\n catch {\n // nothing\n }\n let error;\n if (typeof object.name === \"string\") {\n const { name } = object;\n const des = deserializers[name];\n if (des) {\n error = des(object);\n }\n else {\n let constructor = name === \"Error\" ? Error : errorClasses[name];\n if (!constructor) {\n console.warn(\"deserializing an unknown class '\" + name + \"'\");\n constructor = createCustomErrorClass(name);\n }\n error = Object.create(constructor.prototype);\n try {\n for (const prop in object) {\n if (object.hasOwnProperty(prop)) {\n error[prop] = object[prop];\n }\n }\n }\n catch {\n // sometimes setting a property can fail (e.g. .name)\n }\n }\n }\n else {\n if (typeof object.message === \"string\") {\n error = new Error(object.message);\n }\n }\n // captureStackTrace is V8/Node-specific and not in @types/node\n const Err = Error;\n if (error && !error.stack && Err.captureStackTrace) {\n Err.captureStackTrace(error, deserializeError);\n }\n return error;\n }\n return new Error(String(object));\n};\n// inspired from https://github.com/sindresorhus/serialize-error/blob/master/index.js\nexport const serializeError = (value) => {\n if (!value)\n return value;\n if (typeof value === \"object\") {\n return destroyCircular(value, []);\n }\n if (typeof value === \"function\") {\n return `[Function: ${value.name || \"anonymous\"}]`;\n }\n return value;\n};\n// https://www.npmjs.com/package/destroy-circular\nfunction destroyCircular(from, seen) {\n const to = {};\n seen.push(from);\n for (const key of Object.keys(from)) {\n const value = from[key];\n if (typeof value === \"function\") {\n continue;\n }\n if (!value || typeof value !== \"object\") {\n to[key] = value;\n continue;\n }\n if (seen.indexOf(from[key]) === -1) {\n to[key] = destroyCircular(from[key], seen.slice(0));\n continue;\n }\n to[key] = \"[Circular]\";\n }\n if (typeof from.name === \"string\") {\n to.name = from.name;\n }\n if (typeof from.message === \"string\") {\n to.message = from.message;\n }\n if (typeof from.stack === \"string\") {\n to.stack = from.stack;\n }\n return to;\n}\n//# sourceMappingURL=helpers.js.map","import { serializeError, deserializeError, createCustomErrorClass, addCustomErrorDeserializer, } from \"./helpers\";\nexport { serializeError, deserializeError, createCustomErrorClass, addCustomErrorDeserializer };\nexport const AccountNameRequiredError = createCustomErrorClass(\"AccountNameRequired\");\nexport const AccountNotSupported = createCustomErrorClass(\"AccountNotSupported\");\nexport const AccountAwaitingSendPendingOperations = createCustomErrorClass(\"AccountAwaitingSendPendingOperations\");\nexport const AmountRequired = createCustomErrorClass(\"AmountRequired\");\nexport const BluetoothRequired = createCustomErrorClass(\"BluetoothRequired\");\nexport const BtcUnmatchedApp = createCustomErrorClass(\"BtcUnmatchedApp\");\nexport const CantOpenDevice = createCustomErrorClass(\"CantOpenDevice\");\nexport const CashAddrNotSupported = createCustomErrorClass(\"CashAddrNotSupported\");\nexport const ClaimRewardsFeesWarning = createCustomErrorClass(\"ClaimRewardsFeesWarning\");\nexport const CurrencyNotSupported = createCustomErrorClass(\"CurrencyNotSupported\");\nexport const DeviceAppVerifyNotSupported = createCustomErrorClass(\"DeviceAppVerifyNotSupported\");\nexport const DeviceGenuineSocketEarlyClose = createCustomErrorClass(\"DeviceGenuineSocketEarlyClose\");\nexport const DeviceNotGenuineError = createCustomErrorClass(\"DeviceNotGenuine\");\nexport const DeviceOnDashboardExpected = createCustomErrorClass(\"DeviceOnDashboardExpected\");\nexport const DeviceOnDashboardUnexpected = createCustomErrorClass(\"DeviceOnDashboardUnexpected\");\nexport const DeviceInOSUExpected = createCustomErrorClass(\"DeviceInOSUExpected\");\nexport const DeviceHalted = createCustomErrorClass(\"DeviceHalted\");\nexport const DeviceNameInvalid = createCustomErrorClass(\"DeviceNameInvalid\");\nexport const DeviceSocketFail = createCustomErrorClass(\"DeviceSocketFail\");\nexport const DeviceSocketNoBulkStatus = createCustomErrorClass(\"DeviceSocketNoBulkStatus\");\nexport const DeviceNeedsRestart = createCustomErrorClass(\"DeviceSocketNoBulkStatus\");\nexport const UnresponsiveDeviceError = createCustomErrorClass(\"UnresponsiveDeviceError\");\nexport const DisconnectedDevice = createCustomErrorClass(\"DisconnectedDevice\");\nexport const DisconnectedDeviceDuringOperation = createCustomErrorClass(\"DisconnectedDeviceDuringOperation\");\nexport const DeviceExtractOnboardingStateError = createCustomErrorClass(\"DeviceExtractOnboardingStateError\");\nexport const DeviceOnboardingStatePollingError = createCustomErrorClass(\"DeviceOnboardingStatePollingError\");\nexport const EnpointConfigError = createCustomErrorClass(\"EnpointConfig\");\nexport const EthAppPleaseEnableContractData = createCustomErrorClass(\"EthAppPleaseEnableContractData\");\nexport const SolAppPleaseEnableContractData = createCustomErrorClass(\"SolAppPleaseEnableContractData\");\nexport const CeloAppPleaseEnableContractData = createCustomErrorClass(\"CeloAppPleaseEnableContractData\");\nexport const FeeEstimationFailed = createCustomErrorClass(\"FeeEstimationFailed\");\nexport const FirmwareNotRecognized = createCustomErrorClass(\"FirmwareNotRecognized\");\nexport const HardResetFail = createCustomErrorClass(\"HardResetFail\");\nexport const InvalidXRPTag = createCustomErrorClass(\"InvalidXRPTag\");\nexport const InvalidAddress = createCustomErrorClass(\"InvalidAddress\");\nexport const InvalidTransactionError = createCustomErrorClass(\"InvalidTransactionError\");\nexport const InvalidNonce = createCustomErrorClass(\"InvalidNonce\");\nexport const InvalidAddressBecauseDestinationIsAlsoSource = createCustomErrorClass(\"InvalidAddressBecauseDestinationIsAlsoSource\");\nexport const LatestMCUInstalledError = createCustomErrorClass(\"LatestMCUInstalledError\");\nexport const LatestFirmwareVersionRequired = createCustomErrorClass(\"LatestFirmwareVersionRequired\");\nexport const UnsupportedFeatureError = createCustomErrorClass(\"UnsupportedFeatureError\");\nexport const NanoSNotSupported = createCustomErrorClass(\"NanoSNotSupported\");\nexport const UnknownMCU = createCustomErrorClass(\"UnknownMCU\");\nexport const LedgerAPIError = createCustomErrorClass(\"LedgerAPIError\");\nexport const LedgerAPIErrorWithMessage = createCustomErrorClass(\"LedgerAPIErrorWithMessage\");\nexport const LedgerAPINotAvailable = createCustomErrorClass(\"LedgerAPINotAvailable\");\nexport const ManagerAppAlreadyInstalledError = createCustomErrorClass(\"ManagerAppAlreadyInstalled\");\nexport const ManagerAppRelyOnBTCError = createCustomErrorClass(\"ManagerAppRelyOnBTC\");\nexport const ManagerAppDepInstallRequired = createCustomErrorClass(\"ManagerAppDepInstallRequired\");\nexport const ManagerAppDepUninstallRequired = createCustomErrorClass(\"ManagerAppDepUninstallRequired\");\nexport const ManagerDeviceLockedError = createCustomErrorClass(\"ManagerDeviceLocked\");\nexport const ManagerFirmwareNotEnoughSpaceError = createCustomErrorClass(\"ManagerFirmwareNotEnoughSpace\");\nexport const ManagerNotEnoughSpaceError = createCustomErrorClass(\"ManagerNotEnoughSpace\");\nexport const ManagerUninstallBTCDep = createCustomErrorClass(\"ManagerUninstallBTCDep\");\nexport const NetworkDown = createCustomErrorClass(\"NetworkDown\");\nexport const NetworkError = createCustomErrorClass(\"NetworkError\");\nexport const NoAddressesFound = createCustomErrorClass(\"NoAddressesFound\");\nexport const NotEnoughBalance = createCustomErrorClass(\"NotEnoughBalance\");\nexport const NotEnoughBalanceFees = createCustomErrorClass(\"NotEnoughBalanceFees\");\nexport const NotEnoughBalanceSwap = createCustomErrorClass(\"NotEnoughBalanceSwap\");\nexport const NotEnoughBalanceToDelegate = createCustomErrorClass(\"NotEnoughBalanceToDelegate\");\nexport const UnstakeNotEnoughStakedBalanceLeft = createCustomErrorClass(\"UnstakeNotEnoughStakedBalanceLeft\");\nexport const RestakeNotEnoughStakedBalanceLeft = createCustomErrorClass(\"RestakeNotEnoughStakedBalanceLeft\");\nexport const NotEnoughToRestake = createCustomErrorClass(\"NotEnoughToRestake\");\nexport const NotEnoughToUnstake = createCustomErrorClass(\"NotEnoughToUnstake\");\nexport const NotEnoughBalanceInParentAccount = createCustomErrorClass(\"NotEnoughBalanceInParentAccount\");\nexport const NotEnoughSpendableBalance = createCustomErrorClass(\"NotEnoughSpendableBalance\");\nexport const NotEnoughBalanceBecauseDestinationNotCreated = createCustomErrorClass(\"NotEnoughBalanceBecauseDestinationNotCreated\");\nexport const NotEnoughToStake = createCustomErrorClass(\"NotEnoughToStake\");\nexport const NoAccessToCamera = createCustomErrorClass(\"NoAccessToCamera\");\nexport const NotEnoughGas = createCustomErrorClass(\"NotEnoughGas\");\n// Error message specifically for the PTX swap flow\nexport const NotEnoughGasSwap = createCustomErrorClass(\"NotEnoughGasSwap\");\nexport const TronEmptyAccount = createCustomErrorClass(\"TronEmptyAccount\");\nexport const MaybeKeepTronAccountAlive = createCustomErrorClass(\"MaybeKeepTronAccountAlive\");\nexport const NotSupportedLegacyAddress = createCustomErrorClass(\"NotSupportedLegacyAddress\");\nexport const GasLessThanEstimate = createCustomErrorClass(\"GasLessThanEstimate\");\nexport const PriorityFeeTooLow = createCustomErrorClass(\"PriorityFeeTooLow\");\nexport const PriorityFeeTooHigh = createCustomErrorClass(\"PriorityFeeTooHigh\");\nexport const PriorityFeeHigherThanMaxFee = createCustomErrorClass(\"PriorityFeeHigherThanMaxFee\");\nexport const MaxFeeTooLow = createCustomErrorClass(\"MaxFeeTooLow\");\nexport const PasswordsDontMatchError = createCustomErrorClass(\"PasswordsDontMatch\");\nexport const PasswordIncorrectError = createCustomErrorClass(\"PasswordIncorrect\");\nexport const RecommendSubAccountsToEmpty = createCustomErrorClass(\"RecommendSubAccountsToEmpty\");\nexport const RecommendUndelegation = createCustomErrorClass(\"RecommendUndelegation\");\nexport const TimeoutTagged = createCustomErrorClass(\"TimeoutTagged\");\nexport const UnexpectedBootloader = createCustomErrorClass(\"UnexpectedBootloader\");\nexport const MCUNotGenuineToDashboard = createCustomErrorClass(\"MCUNotGenuineToDashboard\");\nexport const RecipientRequired = createCustomErrorClass(\"RecipientRequired\");\nexport const UnavailableTezosOriginatedAccountReceive = createCustomErrorClass(\"UnavailableTezosOriginatedAccountReceive\");\nexport const UnavailableTezosOriginatedAccountSend = createCustomErrorClass(\"UnavailableTezosOriginatedAccountSend\");\nexport const UpdateFetchFileFail = createCustomErrorClass(\"UpdateFetchFileFail\");\nexport const UpdateIncorrectHash = createCustomErrorClass(\"UpdateIncorrectHash\");\nexport const UpdateIncorrectSig = createCustomErrorClass(\"UpdateIncorrectSig\");\nexport const UpdateYourApp = createCustomErrorClass(\"UpdateYourApp\");\nexport const UserRefusedDeviceNameChange = createCustomErrorClass(\"UserRefusedDeviceNameChange\");\nexport const UserRefusedAddress = createCustomErrorClass(\"UserRefusedAddress\");\nexport const UserRefusedFirmwareUpdate = createCustomErrorClass(\"UserRefusedFirmwareUpdate\");\nexport const UserRefusedAllowManager = createCustomErrorClass(\"UserRefusedAllowManager\");\nexport const UserRefusedOnDevice = createCustomErrorClass(\"UserRefusedOnDevice\"); // TODO rename because it's just for transaction refusal\nexport const PinNotSet = createCustomErrorClass(\"PinNotSet\");\nexport const ExpertModeRequired = createCustomErrorClass(\"ExpertModeRequired\");\nexport const TransportOpenUserCancelled = createCustomErrorClass(\"TransportOpenUserCancelled\");\nexport const TransportInterfaceNotAvailable = createCustomErrorClass(\"TransportInterfaceNotAvailable\");\nexport const TransportRaceCondition = createCustomErrorClass(\"TransportRaceCondition\");\nexport const TransportWebUSBGestureRequired = createCustomErrorClass(\"TransportWebUSBGestureRequired\");\nexport const TransactionHasBeenValidatedError = createCustomErrorClass(\"TransactionHasBeenValidatedError\");\nexport const TransportExchangeTimeoutError = createCustomErrorClass(\"TransportExchangeTimeoutError\");\nexport const DeviceShouldStayInApp = createCustomErrorClass(\"DeviceShouldStayInApp\");\nexport const WebsocketConnectionError = createCustomErrorClass(\"WebsocketConnectionError\");\nexport const WebsocketConnectionFailed = createCustomErrorClass(\"WebsocketConnectionFailed\");\nexport const WrongDeviceForAccount = createCustomErrorClass(\"WrongDeviceForAccount\");\nexport const WrongDeviceForAccountPayout = createCustomErrorClass(\"WrongDeviceForAccountPayout\");\nexport const MissingSwapPayloadParamaters = createCustomErrorClass(\"MissingSwapPayloadParamaters\");\nexport const WrongDeviceForAccountRefund = createCustomErrorClass(\"WrongDeviceForAccountRefund\");\nexport const WrongAppForCurrency = createCustomErrorClass(\"WrongAppForCurrency\");\nexport const ETHAddressNonEIP = createCustomErrorClass(\"ETHAddressNonEIP\");\nexport const CantScanQRCode = createCustomErrorClass(\"CantScanQRCode\");\nexport const FeeNotLoaded = createCustomErrorClass(\"FeeNotLoaded\");\nexport const FeeNotLoadedSwap = createCustomErrorClass(\"FeeNotLoadedSwap\");\nexport const FeeRequired = createCustomErrorClass(\"FeeRequired\");\nexport const FeeTooHigh = createCustomErrorClass(\"FeeTooHigh\");\nexport const ValAddressRequired = createCustomErrorClass(\"ValAddressRequired\");\nexport const RedelegateDstValAddressRequired = createCustomErrorClass(\"RedelegateDstValAddressRequired\");\nexport const PendingOperation = createCustomErrorClass(\"PendingOperation\");\nexport const SyncError = createCustomErrorClass(\"SyncError\");\nexport const PairingFailed = createCustomErrorClass(\"PairingFailed\");\nexport const PeerRemovedPairing = createCustomErrorClass(\"PeerRemovedPairing\");\nexport const GenuineCheckFailed = createCustomErrorClass(\"GenuineCheckFailed\");\nexport const LedgerAPI4xx = createCustomErrorClass(\"LedgerAPI4xx\");\nexport const LedgerAPI5xx = createCustomErrorClass(\"LedgerAPI5xx\");\nexport const FirmwareOrAppUpdateRequired = createCustomErrorClass(\"FirmwareOrAppUpdateRequired\");\n// SpeedUp / Cancel EVM tx\nexport const ReplacementTransactionUnderpriced = createCustomErrorClass(\"ReplacementTransactionUnderpriced\");\n// Bitcoin family\nexport const OpReturnDataSizeLimit = createCustomErrorClass(\"OpReturnSizeLimit\");\nexport const DustLimit = createCustomErrorClass(\"DustLimit\");\n// Concordium family\nexport const ConcordiumInsufficientFunds = createCustomErrorClass(\"ConcordiumInsufficientFunds\");\nexport const ConcordiumMemoTooLong = createCustomErrorClass(\"ConcordiumMemoTooLong\");\nexport const ConcordiumPairingExpiredError = createCustomErrorClass(\"ConcordiumPairingExpiredError\");\nexport const ConcordiumSessionExpiredError = createCustomErrorClass(\"ConcordiumSessionExpiredError\");\nexport const ConcordiumTrustedMetadataServiceError = createCustomErrorClass(\"ConcordiumTrustedMetadataServiceError\");\nexport const ConcordiumAddressVerificationFailedError = createCustomErrorClass(\"ConcordiumAddressVerificationFailedError\");\nexport const ConcordiumInvalidMaxFeeError = createCustomErrorClass(\"ConcordiumInvalidMaxFeeError\");\n// Language\nexport const LanguageNotFound = createCustomErrorClass(\"LanguageNotFound\");\n// db stuff, no need to translate\nexport const NoDBPathGiven = createCustomErrorClass(\"NoDBPathGiven\");\nexport const DBWrongPassword = createCustomErrorClass(\"DBWrongPassword\");\nexport const DBNotReset = createCustomErrorClass(\"DBNotReset\");\nexport const SequenceNumberError = createCustomErrorClass(\"SequenceNumberError\");\nexport const DisabledTransactionBroadcastError = createCustomErrorClass(\"DisabledTransactionBroadcastError\");\nexport const InvalidParameterError = createCustomErrorClass(\"InvalidParameterError\");\n/**\n * Type of a Transport error used to represent all equivalent errors coming from all possible implementation of Transport\n */\nexport var HwTransportErrorType;\n(function (HwTransportErrorType) {\n HwTransportErrorType[\"Unknown\"] = \"Unknown\";\n HwTransportErrorType[\"LocationServicesDisabled\"] = \"LocationServicesDisabled\";\n HwTransportErrorType[\"LocationServicesUnauthorized\"] = \"LocationServicesUnauthorized\";\n HwTransportErrorType[\"BluetoothScanStartFailed\"] = \"BluetoothScanStartFailed\";\n})(HwTransportErrorType || (HwTransportErrorType = {}));\n/**\n * Represents an error coming from the usage of any Transport implementation.\n *\n * Needed to map a specific implementation error into an error that\n * can be managed by any code unaware of the specific Transport implementation\n * that was used.\n */\nexport class HwTransportError extends Error {\n type;\n constructor(type, message) {\n super(message);\n this.name = \"HwTransportError\";\n this.type = type;\n // Needed as long as we target < ES6\n Object.setPrototypeOf(this, HwTransportError.prototype);\n }\n}\n/**\n * TransportError is used for any generic transport errors.\n * e.g. Error thrown when data received by exchanges are incorrect or if exchanged failed to communicate with the device for various reason.\n */\nexport class TransportError extends Error {\n id;\n constructor(message, id) {\n const name = \"TransportError\";\n super(message || name);\n this.name = name;\n this.message = message;\n this.stack = new Error(message).stack;\n this.id = id;\n }\n}\naddCustomErrorDeserializer(\"TransportError\", e => new TransportError(e.message, e.id));\nexport const StatusCodes = {\n ACCESS_CONDITION_NOT_FULFILLED: 0x9804,\n ALGORITHM_NOT_SUPPORTED: 0x9484,\n CLA_NOT_SUPPORTED: 0x6e00,\n CLA_NOT_SUPPORTED_BOOTLOADER: 0x6e01,\n CODE_BLOCKED: 0x9840,\n CODE_NOT_INITIALIZED: 0x9802,\n COMMAND_INCOMPATIBLE_FILE_STRUCTURE: 0x6981,\n CONDITIONS_OF_USE_NOT_SATISFIED: 0x6985,\n CONTRADICTION_INVALIDATION: 0x9810,\n CONTRADICTION_SECRET_CODE_STATUS: 0x9808,\n DEVICE_IN_RECOVERY_MODE: 0x662f,\n CUSTOM_IMAGE_EMPTY: 0x662e,\n FILE_ALREADY_EXISTS: 0x6a89,\n FILE_NOT_FOUND: 0x9404,\n GP_AUTH_FAILED: 0x6300,\n HALTED: 0x6faa,\n INCONSISTENT_FILE: 0x9408,\n INCORRECT_DATA: 0x6a80,\n INCORRECT_LENGTH: 0x6700,\n INCORRECT_P1_P2: 0x6b00,\n INS_NOT_SUPPORTED: 0x6d00,\n DEVICE_NOT_ONBOARDED: 0x6d07,\n DEVICE_NOT_ONBOARDED_2: 0x6611,\n INVALID_KCV: 0x9485,\n INVALID_OFFSET: 0x9402,\n LICENSING: 0x6f42,\n LOCKED_DEVICE: 0x5515,\n MAX_VALUE_REACHED: 0x9850,\n MEMORY_PROBLEM: 0x9240,\n MISSING_CRITICAL_PARAMETER: 0x6800,\n NO_EF_SELECTED: 0x9400,\n NOT_ENOUGH_MEMORY_SPACE: 0x6a84,\n OK: 0x9000,\n PIN_REMAINING_ATTEMPTS: 0x63c0,\n REFERENCED_DATA_NOT_FOUND: 0x6a88,\n SECURITY_STATUS_NOT_SATISFIED: 0x6982,\n TECHNICAL_PROBLEM: 0x6f00,\n UNKNOWN_APDU: 0x6d02,\n USER_REFUSED_ON_DEVICE: 0x5501,\n NOT_ENOUGH_SPACE: 0x5102,\n APP_NOT_FOUND_OR_INVALID_CONTEXT: 0x5123,\n INVALID_APP_NAME_LENGTH: 0x670a,\n GEN_AES_KEY_FAILED: 0x5419,\n INTERNAL_CRYPTO_OPERATION_FAILED: 0x541a,\n INTERNAL_COMPUTE_AES_CMAC_FAILED: 0x541b,\n ENCRYPT_APP_STORAGE_FAILED: 0x541c,\n INVALID_BACKUP_STATE: 0x6642,\n PIN_NOT_SET: 0x5502,\n INVALID_BACKUP_LENGTH: 0x6733,\n INVALID_RESTORE_STATE: 0x6643,\n INVALID_CHUNK_LENGTH: 0x6734,\n INVALID_BACKUP_HEADER: 0x684a,\n SW_BAD_STATE: 0xb007,\n};\nexport function getAltStatusMessage(code) {\n switch (code) {\n // improve text of most common errors\n case 0x6700:\n return \"Incorrect length\";\n case 0x6800:\n return \"Missing critical parameter\";\n case 0x6982:\n return \"Security not satisfied (dongle locked or have invalid access rights)\";\n case 0x6985:\n return \"Condition of use not satisfied (denied by the user?)\";\n case 0x6a80:\n return \"Invalid data received\";\n case 0x6b00:\n return \"Invalid parameter received\";\n case 0x5515:\n return \"Locked device\";\n case 0xb007:\n return \"Unexpected state on the device\";\n }\n if (0x6f00 <= code && code <= 0x6fff) {\n return \"Internal error, please report\";\n }\n}\n/**\n * Error thrown when a device returned a non success status.\n * the error.statusCode is one of the `StatusCodes` exported by this library.\n */\nexport class TransportStatusError extends Error {\n statusCode;\n statusText;\n /**\n * @param statusCode The error status code coming from a Transport implementation\n * @param options containing:\n * - canBeMappedToChildError: enable the mapping of TransportStatusError to an error extending/inheriting from it\n * . Ex: LockedDeviceError. Default to true.\n */\n constructor(statusCode, { canBeMappedToChildError = true } = {}) {\n const statusText = Object.keys(StatusCodes).find(k => StatusCodes[k] === statusCode) || \"UNKNOWN_ERROR\";\n const smsg = getAltStatusMessage(statusCode) || statusText;\n const statusCodeStr = statusCode.toString(16);\n const message = `Ledger device: ${smsg} (0x${statusCodeStr})`;\n super(message);\n this.name = \"TransportStatusError\";\n this.statusCode = statusCode;\n this.statusText = statusText;\n Object.setPrototypeOf(this, TransportStatusError.prototype);\n // Maps to a LockedDeviceError\n if (canBeMappedToChildError && statusCode === StatusCodes.LOCKED_DEVICE) {\n return new LockedDeviceError(message);\n }\n }\n}\nexport class LockedDeviceError extends TransportStatusError {\n constructor(message) {\n super(StatusCodes.LOCKED_DEVICE, { canBeMappedToChildError: false });\n if (message) {\n this.message = message;\n }\n this.name = \"LockedDeviceError\";\n Object.setPrototypeOf(this, LockedDeviceError.prototype);\n }\n}\nexport class DeviceMangementKitError extends Error {\n constructor(name, message) {\n super(message);\n this.name = name;\n Object.setPrototypeOf(this, DeviceMangementKitError.prototype);\n }\n}\naddCustomErrorDeserializer(\"TransportStatusError\", e => new TransportStatusError(e.statusCode));\n//# sourceMappingURL=index.js.map","// biome-ignore-all lint: outside copy-paste, not worth fixing\n// ------------------------------------------------------------------------------------------------\n// ------------------------------------------------------------------------------------------------\n// THIS IS SOME HORRIBLE CODE IMPORTED JUST\n// FOR THE SAKE OF NOT IMPORTING UGLY, WICKED, AND\n// BROKEN @ledgerhq/live-* LIBRARIES\n//\n// IT'S MEANT TO BE CONSIDERED AS A BLACK BOX\n// ------------------------------------------------------------------------------------------------\n// ------------------------------------------------------------------------------------------------\nimport {\n BluetoothRequired,\n CantOpenDevice,\n DeviceHalted,\n FirmwareOrAppUpdateRequired,\n TransportInterfaceNotAvailable,\n TransportStatusError,\n TransportWebUSBGestureRequired,\n} from \"@ledgerhq/errors\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { Observable, throwError, timer } from \"rxjs\";\nimport { catchError, mergeMap, retryWhen } from \"rxjs/operators\";\n\nconst initialErrorRemapping = (error: Error): Observable<never> =>\n throwError(\n error && error instanceof TransportStatusError && error.statusCode === 0x6faa\n ? new DeviceHalted(error.message)\n : error instanceof TransportStatusError && error.statusCode === 0x6b00\n ? new FirmwareOrAppUpdateRequired(error.message)\n : error,\n );\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst never = new Promise(() => {});\n\ntype Discovery = Observable<{\n type: \"add\" | \"remove\";\n id: string;\n name: string;\n}>;\n\nexport type TransportModule = {\n // unique transport name that identify the transport module\n id: string;\n // open a device by an id, this id must be unique across all modules\n // you can typically prefix it with `something|` that identify it globally\n // returns falsy if the transport module can't handle this id\n // here, open means we want to START doing something with the transport\n open: (id: string) => Promise<Transport> | null | undefined;\n // here, close means we want to STOP doing something with the transport\n close?: (transport: Transport, id: string) => Promise<void> | null | undefined;\n // disconnect/interrupt a device connection globally\n // returns falsy if the transport module can't handle this id\n disconnect: (id: string) => Promise<void> | null | undefined;\n // optional observable that allows to discover a transport\n discovery?: Discovery;\n};\n\nconst modules: TransportModule[] = [];\n\nexport const registerTransportModule = (module: TransportModule): void => {\n modules.push(module);\n};\n\nexport const close = (transport: Transport, deviceId: string): Promise<void> => {\n for (const m of modules) {\n const p = m.close?.(transport, deviceId);\n if (p) return p;\n }\n // fallback on an actual close\n return transport.close();\n};\n\nexport const open = (deviceId: string): Promise<Transport> => {\n for (const m of modules) {\n const p = m.open(deviceId);\n if (p) return p;\n }\n return Promise.reject(new Error(`Can't find handler to open ${deviceId}`));\n};\n\nconst transportFinally =\n (cleanup: () => Promise<void>) =>\n <T>(observable: Observable<T>): Observable<T> =>\n // @ts-expect-error typescript not checking against the instanceof\n Observable.create((o) => {\n let done = false;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const finalize = (): any => {\n if (done) return never;\n done = true;\n return cleanup();\n };\n\n const sub = observable.subscribe({\n next: (e) => o.next(e),\n complete: () => {\n void finalize().then(() => o.complete());\n },\n error: (e) => {\n void finalize().then(() => o.error(e));\n },\n });\n return () => {\n sub.unsubscribe();\n void finalize();\n };\n });\n\ntype AccessHook = () => () => void;\n\nconst accessHooks: AccessHook[] = [];\n\nconst deviceQueues = {};\n\nexport const withDevice =\n (deviceId: string) =>\n <T>(job: (t: Transport) => Observable<T>): Observable<T> =>\n new Observable((o) => {\n // @ts-expect-error typescript not checking against the instanceof\n let unsubscribed;\n // @ts-expect-error typescript not checking against the instanceof\n let sub;\n // @ts-expect-error typescript not checking against the instanceof\n const deviceQueue = deviceQueues[deviceId] ?? Promise.resolve();\n\n // @ts-expect-error typescript not checking against the instanceof\n const finalize = (transport, cleanups): Promise<void> =>\n close(transport, deviceId)\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n .catch(() => {})\n .then(() => {\n // @ts-expect-error typescript not checking against the instanceof\n cleanups.forEach((c) => c());\n });\n\n // when we'll finish all the current job, we'll call finish\n // @ts-expect-error typescript not checking against the instanceof\n let finish;\n // this new promise is the next exec queue\n // @ts-expect-error typescript not checking against the instanceof\n deviceQueues[deviceId] = new Promise((resolve) => {\n finish = resolve;\n });\n // for any new job, we'll now wait the exec queue to be available\n deviceQueue\n .then(() => {\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // Release this queue slot without opening a transport.\n // @ts-expect-error typescript not checking against the instanceof\n finish();\n return;\n }\n return open(deviceId);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .then(async (transport) => {\n if (!transport) return;\n\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // it was unsubscribed prematurely\n // @ts-expect-error typescript not checking against the instanceof\n return finalize(transport, [finish]);\n }\n\n if (\n transport.requestConnectionPriority &&\n typeof transport.requestConnectionPriority === \"function\"\n ) {\n await transport.requestConnectionPriority(\"High\");\n }\n\n return transport;\n })\n // @ts-expect-error typescript not checking against the instanceof\n .catch((e) => {\n // @ts-expect-error typescript not checking against the instanceof\n finish();\n if (e instanceof BluetoothRequired) throw e;\n if (e instanceof TransportWebUSBGestureRequired) throw e;\n if (e instanceof TransportInterfaceNotAvailable) throw e;\n throw new CantOpenDevice(e.message);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .then((transport) => {\n if (!transport) return;\n\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // it was unsubscribed prematurely\n // @ts-expect-error typescript not checking against the instanceof\n return finalize(transport, [finish]);\n }\n\n const cleanups = accessHooks.map((hook) => hook());\n sub = job(transport) // $FlowFixMe\n .pipe(\n catchError(initialErrorRemapping),\n // $FlowFixMe\n transportFinally(() =>\n // @ts-expect-error typescript not checking against the instanceof\n finalize(transport, [...cleanups, finish]),\n ),\n )\n .subscribe(o);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .catch((error) => o.error(error));\n return () => {\n unsubscribed = true;\n // @ts-expect-error typescript not checking against the instanceof\n if (sub) sub.unsubscribe();\n };\n });\n\nconst WITH_DEVICE_POLLING_DELAY = 500;\n\nexport const retryWhileErrors =\n (acceptError: (arg0: Error) => boolean) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (attempts: Observable<any>): Observable<any> =>\n attempts.pipe(\n mergeMap((error) => {\n if (!acceptError(error)) {\n return throwError(error);\n }\n\n return timer(WITH_DEVICE_POLLING_DELAY);\n }),\n );\n\nexport const withDevicePolling =\n (deviceId: string) =>\n <T>(\n job: (arg0: Transport) => Observable<T>,\n acceptError: (arg0: Error) => boolean = () => false,\n ): Observable<T> =>\n withDevice(deviceId)(job).pipe(retryWhen(retryWhileErrors(acceptError)));\n","import { TransportStatusError } from \"@ledgerhq/errors\";\n\nexport const isTransportStatusError = (error: unknown): error is TransportStatusError => {\n return (\n error instanceof TransportStatusError ||\n (error instanceof Error && \"statusCode\" in error && error.message.startsWith(\"Ledger device:\"))\n );\n};\n\nconst CANCEL_STATUS_CODES = [\n 0x6985, // cancel on Ledger Blue\n\n // STAX\n 0xb00c, // cancel collect wk fragment\n 0xb00d, // cancel user registration\n 0xb010, // cancel review\n 0xb012, // cancel master seed generation\n 0xb013, // cancel login\n 0x5501, // cancel openApp\n];\n\n// The software device (device-api) surfaces firmware status words as an HTTP 409 whose JSON body\n// carries `{ sw: \"<hex>\" }`. The Web proxy can wrap this body one level below `data`.\nconst isDeviceApiSwError = (error: unknown, sw: string): boolean => {\n if (typeof error !== \"object\" || error === null || !(\"response\" in error)) return false;\n const { response } = error as { response?: unknown };\n if (typeof response !== \"object\" || response === null || !(\"data\" in response)) return false;\n const { data } = response as { data?: unknown };\n if (typeof data !== \"object\" || data === null) return false;\n const hasSw = (obj: unknown): boolean =>\n typeof obj === \"object\" && obj !== null && \"sw\" in obj && (obj as { sw?: unknown }).sw === sw;\n return hasSw(data) || hasSw((data as { data?: unknown }).data);\n};\n\nexport const isDeviceCancelError = (error: Error): boolean => {\n if (isTransportStatusError(error)) return CANCEL_STATUS_CODES.includes(error.statusCode);\n return CANCEL_STATUS_CODES.some((status) => isDeviceApiSwError(error, status.toString(16)));\n};\n\n// `@ledgerhq/errors` classes are created via `createCustomErrorClass`, which sets `error.name` to\n// the class name on every instance. Bundlers (the SDK bundles its own `@ledgerhq/errors`) can\n// produce a second, nominally-distinct copy of these classes, so `instanceof` is unreliable across\n// a package/bundle boundary. Matching on `error.name` accepts instances from any copy, so\n// consumers must use these predicates instead of importing the class and doing `instanceof`\n// themselves.\nconst namedErrorPredicate =\n (name: string) =>\n (error: unknown): boolean =>\n error instanceof Error && error.name === name;\n\n// CantOpenDevice — the transport failed to open, most notably when the user dismisses the WebHID\n// native chooser without selecting a device (surfaced as \"Access denied to use Ledger device\").\n// Used to STOP polling instead of re-opening the chooser forever.\nexport const isCantOpenDeviceError = namedErrorPredicate(\"CantOpenDevice\");\n\n// LockedDeviceError — the device is connected but locked with its PIN.\nexport const isLockedDeviceError = namedErrorPredicate(\"LockedDeviceError\");\n\n// SW_PSK_MISSING (0x6065) — the device-side `start_psk_session` (and any secure-channel APDU\n// transitively relying on a populated PSK) returns this when the NVM record's PSK field is the\n// all-zero sentinel. Used as the trigger to drive the PSK refresh sub-chain mid-operation.\nexport const isPskMissingError = (error: unknown): boolean => {\n return (\n (isTransportStatusError(error) && error.statusCode === 0x6065) ||\n isDeviceApiSwError(error, \"6065\")\n );\n};\n\n// SW_PSK_MISMATCH (0x6067) — `FINALIZE_PSK_REFRESH` returns this when the PSK delivered by the HSM\n// differs from the one already stored for the partition. Because the PSK is static this signals a\n// genuine divergence (e.g. an un-migrated user), so it must surface as an error rather than be\n// retried like SW_PSK_MISSING.\nexport const isPskMismatchError = (error: unknown): boolean => {\n return (\n (isTransportStatusError(error) && error.statusCode === 0x6067) ||\n isDeviceApiSwError(error, \"6067\")\n );\n};\n"],"x_google_ignoreList":[1,2,5,6],"mappings":"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"}
|
|
@@ -75,7 +75,7 @@ const deviceOperationDelay = (delay, signal) => {
|
|
|
75
75
|
});
|
|
76
76
|
};
|
|
77
77
|
//#endregion
|
|
78
|
-
//#region ../../node_modules/.pnpm/axios-retry@4.5.0_axios@1.
|
|
78
|
+
//#region ../../node_modules/.pnpm/axios-retry@4.5.0_axios@1.20.0/node_modules/axios-retry/dist/esm/index.js
|
|
79
79
|
var import_is_retry_allowed = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
80
80
|
const denyList = /* @__PURE__ */ new Set([
|
|
81
81
|
"ENOTFOUND",
|
|
@@ -1027,4 +1027,4 @@ const isPskMismatchError = (error) => {
|
|
|
1027
1027
|
//#endregion
|
|
1028
1028
|
export { DeviceOperationAbortedError as _, isPskMissingError as a, throwIfDeviceOperationAborted as b, withDevicePolling as c, createApiDevice as d, APPID_VAULT_ADMINISTRATOR as f, STR_ROLES as g, SCRIPT_IDS as h, isPskMismatchError as i, DisconnectedDevice as l, PATHS as m, isDeviceCancelError as n, isTransportStatusError as o, PAGINATED_STATUS as p, isLockedDeviceError as r, registerTransportModule as s, isCantOpenDeviceError as t, LockedDeviceError as u, deviceOperationDelay as v, isDeviceOperationAbortedError as y };
|
|
1029
1029
|
|
|
1030
|
-
//# sourceMappingURL=device-
|
|
1030
|
+
//# sourceMappingURL=device-CcE29Cid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-FfbMtrzj.js","names":["isRetryAllowed","uuidv4"],"sources":["../src/device/abort.ts","../../../node_modules/.pnpm/is-retry-allowed@2.2.0/node_modules/is-retry-allowed/index.js","../../../node_modules/.pnpm/axios-retry@4.5.0_axios@1.19.0/node_modules/axios-retry/dist/esm/index.js","../src/device/constants.ts","../src/device/api-device.ts","../../../node_modules/.pnpm/@ledgerhq+errors@6.36.0/node_modules/@ledgerhq/errors/lib-es/helpers.js","../../../node_modules/.pnpm/@ledgerhq+errors@6.36.0/node_modules/@ledgerhq/errors/lib-es/index.js","../src/device/device-access.ts","../src/device/utils.ts"],"sourcesContent":["/** Error returned when the application aborts a device operation. */\nexport class DeviceOperationAbortedError extends Error {\n constructor() {\n super(\"Device operation aborted\");\n this.name = \"DeviceOperationAbortedError\";\n }\n}\n\nexport type DeviceOperationOptions = {\n /** Stops this operation when the application no longer owns the interaction. */\n signal?: AbortSignal;\n};\n\nexport const isDeviceOperationAbortedError = (\n error: unknown,\n): error is DeviceOperationAbortedError =>\n error instanceof Error && error.name === \"DeviceOperationAbortedError\";\n\nexport const throwIfDeviceOperationAborted = (signal?: AbortSignal): void => {\n if (signal?.aborted) {\n throw new DeviceOperationAbortedError();\n }\n};\n\nexport const withDeviceOperationSignal = <T>(\n operation: () => Promise<T>,\n signal?: AbortSignal,\n): Promise<T> => {\n try {\n throwIfDeviceOperationAborted(signal);\n } catch (error) {\n return Promise.reject(error);\n }\n if (!signal) return Promise.resolve().then(operation);\n\n return new Promise<T>((resolve, reject) => {\n const onAbort = (): void => reject(new DeviceOperationAbortedError());\n signal.addEventListener(\"abort\", onAbort, { once: true });\n Promise.resolve()\n .then(() => {\n throwIfDeviceOperationAborted(signal);\n return operation();\n })\n .then(resolve, (error: unknown) => {\n reject(signal.aborted ? new DeviceOperationAbortedError() : error);\n })\n .finally(() => signal.removeEventListener(\"abort\", onAbort));\n });\n};\n\nexport const deviceOperationDelay = (delay: number, signal?: AbortSignal): Promise<void> => {\n try {\n throwIfDeviceOperationAborted(signal);\n } catch (error) {\n return Promise.reject(error);\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delay);\n const onAbort = (): void => {\n clearTimeout(timeout);\n reject(new DeviceOperationAbortedError());\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n};\n","'use strict';\n\nconst denyList = new Set([\n\t'ENOTFOUND',\n\t'ENETUNREACH',\n\n\t// SSL errors from https://github.com/nodejs/node/blob/fc8e3e2cdc521978351de257030db0076d79e0ab/src/crypto/crypto_common.cc#L301-L328\n\t'UNABLE_TO_GET_ISSUER_CERT',\n\t'UNABLE_TO_GET_CRL',\n\t'UNABLE_TO_DECRYPT_CERT_SIGNATURE',\n\t'UNABLE_TO_DECRYPT_CRL_SIGNATURE',\n\t'UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY',\n\t'CERT_SIGNATURE_FAILURE',\n\t'CRL_SIGNATURE_FAILURE',\n\t'CERT_NOT_YET_VALID',\n\t'CERT_HAS_EXPIRED',\n\t'CRL_NOT_YET_VALID',\n\t'CRL_HAS_EXPIRED',\n\t'ERROR_IN_CERT_NOT_BEFORE_FIELD',\n\t'ERROR_IN_CERT_NOT_AFTER_FIELD',\n\t'ERROR_IN_CRL_LAST_UPDATE_FIELD',\n\t'ERROR_IN_CRL_NEXT_UPDATE_FIELD',\n\t'OUT_OF_MEM',\n\t'DEPTH_ZERO_SELF_SIGNED_CERT',\n\t'SELF_SIGNED_CERT_IN_CHAIN',\n\t'UNABLE_TO_GET_ISSUER_CERT_LOCALLY',\n\t'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\n\t'CERT_CHAIN_TOO_LONG',\n\t'CERT_REVOKED',\n\t'INVALID_CA',\n\t'PATH_LENGTH_EXCEEDED',\n\t'INVALID_PURPOSE',\n\t'CERT_UNTRUSTED',\n\t'CERT_REJECTED',\n\t'HOSTNAME_MISMATCH'\n]);\n\n// TODO: Use `error?.code` when targeting Node.js 14\nmodule.exports = error => !denyList.has(error && error.code);\n","import isRetryAllowed from 'is-retry-allowed';\nexport const namespace = 'axios-retry';\nexport function isNetworkError(error) {\n const CODE_EXCLUDE_LIST = ['ERR_CANCELED', 'ECONNABORTED'];\n if (error.response) {\n return false;\n }\n if (!error.code) {\n return false;\n }\n // Prevents retrying timed out & cancelled requests\n if (CODE_EXCLUDE_LIST.includes(error.code)) {\n return false;\n }\n // Prevents retrying unsafe errors\n return isRetryAllowed(error);\n}\nconst SAFE_HTTP_METHODS = ['get', 'head', 'options'];\nconst IDEMPOTENT_HTTP_METHODS = SAFE_HTTP_METHODS.concat(['put', 'delete']);\nexport function isRetryableError(error) {\n return (error.code !== 'ECONNABORTED' &&\n (!error.response ||\n error.response.status === 429 ||\n (error.response.status >= 500 && error.response.status <= 599)));\n}\nexport function isSafeRequestError(error) {\n if (!error.config?.method) {\n // Cannot determine if the request can be retried\n return false;\n }\n return isRetryableError(error) && SAFE_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\nexport function isIdempotentRequestError(error) {\n if (!error.config?.method) {\n // Cannot determine if the request can be retried\n return false;\n }\n return isRetryableError(error) && IDEMPOTENT_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\nexport function isNetworkOrIdempotentRequestError(error) {\n return isNetworkError(error) || isIdempotentRequestError(error);\n}\nexport function retryAfter(error = undefined) {\n const retryAfterHeader = error?.response?.headers['retry-after'];\n if (!retryAfterHeader) {\n return 0;\n }\n // if the retry after header is a number, convert it to milliseconds\n let retryAfterMs = (Number(retryAfterHeader) || 0) * 1000;\n // If the retry after header is a date, get the number of milliseconds until that date\n if (retryAfterMs === 0) {\n retryAfterMs = (new Date(retryAfterHeader).valueOf() || 0) - Date.now();\n }\n return Math.max(0, retryAfterMs);\n}\nfunction noDelay(_retryNumber = 0, error = undefined) {\n return Math.max(0, retryAfter(error));\n}\nexport function exponentialDelay(retryNumber = 0, error = undefined, delayFactor = 100) {\n const calculatedDelay = 2 ** retryNumber * delayFactor;\n const delay = Math.max(calculatedDelay, retryAfter(error));\n const randomSum = delay * 0.2 * Math.random(); // 0-20% of the delay\n return delay + randomSum;\n}\n/**\n * Linear delay\n * @param {number | undefined} delayFactor - delay factor in milliseconds (default: 100)\n * @returns {function} (retryNumber: number, error: AxiosError | undefined) => number\n */\nexport function linearDelay(delayFactor = 100) {\n return (retryNumber = 0, error = undefined) => {\n const delay = retryNumber * delayFactor;\n return Math.max(delay, retryAfter(error));\n };\n}\nexport const DEFAULT_OPTIONS = {\n retries: 3,\n retryCondition: isNetworkOrIdempotentRequestError,\n retryDelay: noDelay,\n shouldResetTimeout: false,\n onRetry: () => { },\n onMaxRetryTimesExceeded: () => { },\n validateResponse: null\n};\nfunction getRequestOptions(config, defaultOptions) {\n return { ...DEFAULT_OPTIONS, ...defaultOptions, ...config[namespace] };\n}\nfunction setCurrentState(config, defaultOptions, resetLastRequestTime = false) {\n const currentState = getRequestOptions(config, defaultOptions || {});\n currentState.retryCount = currentState.retryCount || 0;\n if (!currentState.lastRequestTime || resetLastRequestTime) {\n currentState.lastRequestTime = Date.now();\n }\n config[namespace] = currentState;\n return currentState;\n}\nfunction fixConfig(axiosInstance, config) {\n // @ts-ignore\n if (axiosInstance.defaults.agent === config.agent) {\n // @ts-ignore\n delete config.agent;\n }\n if (axiosInstance.defaults.httpAgent === config.httpAgent) {\n delete config.httpAgent;\n }\n if (axiosInstance.defaults.httpsAgent === config.httpsAgent) {\n delete config.httpsAgent;\n }\n}\nasync function shouldRetry(currentState, error) {\n const { retries, retryCondition } = currentState;\n const shouldRetryOrPromise = (currentState.retryCount || 0) < retries && retryCondition(error);\n // This could be a promise\n if (typeof shouldRetryOrPromise === 'object') {\n try {\n const shouldRetryPromiseResult = await shouldRetryOrPromise;\n // keep return true unless shouldRetryPromiseResult return false for compatibility\n return shouldRetryPromiseResult !== false;\n }\n catch (_err) {\n return false;\n }\n }\n return shouldRetryOrPromise;\n}\nasync function handleRetry(axiosInstance, currentState, error, config) {\n currentState.retryCount += 1;\n const { retryDelay, shouldResetTimeout, onRetry } = currentState;\n const delay = retryDelay(currentState.retryCount, error);\n // Axios fails merging this configuration to the default configuration because it has an issue\n // with circular structures: https://github.com/mzabriskie/axios/issues/370\n fixConfig(axiosInstance, config);\n if (!shouldResetTimeout && config.timeout && currentState.lastRequestTime) {\n const lastRequestDuration = Date.now() - currentState.lastRequestTime;\n const timeout = config.timeout - lastRequestDuration - delay;\n if (timeout <= 0) {\n return Promise.reject(error);\n }\n config.timeout = timeout;\n }\n config.transformRequest = [(data) => data];\n await onRetry(currentState.retryCount, error, config);\n if (config.signal?.aborted) {\n return Promise.resolve(axiosInstance(config));\n }\n return new Promise((resolve) => {\n const abortListener = () => {\n clearTimeout(timeout);\n resolve(axiosInstance(config));\n };\n const timeout = setTimeout(() => {\n resolve(axiosInstance(config));\n if (config.signal?.removeEventListener) {\n config.signal.removeEventListener('abort', abortListener);\n }\n }, delay);\n if (config.signal?.addEventListener) {\n config.signal.addEventListener('abort', abortListener, { once: true });\n }\n });\n}\nasync function handleMaxRetryTimesExceeded(currentState, error) {\n if (currentState.retryCount >= currentState.retries)\n await currentState.onMaxRetryTimesExceeded(error, currentState.retryCount);\n}\nconst axiosRetry = (axiosInstance, defaultOptions) => {\n const requestInterceptorId = axiosInstance.interceptors.request.use((config) => {\n setCurrentState(config, defaultOptions, true);\n if (config[namespace]?.validateResponse) {\n // by setting this, all HTTP responses will be go through the error interceptor first\n config.validateStatus = () => false;\n }\n return config;\n });\n const responseInterceptorId = axiosInstance.interceptors.response.use(null, async (error) => {\n const { config } = error;\n // If we have no information to retry the request\n if (!config) {\n return Promise.reject(error);\n }\n const currentState = setCurrentState(config, defaultOptions);\n if (error.response && currentState.validateResponse?.(error.response)) {\n // no issue with response\n return error.response;\n }\n if (await shouldRetry(currentState, error)) {\n return handleRetry(axiosInstance, currentState, error, config);\n }\n await handleMaxRetryTimesExceeded(currentState, error);\n return Promise.reject(error);\n });\n return { requestInterceptorId, responseInterceptorId };\n};\n// Compatibility with CommonJS\naxiosRetry.isNetworkError = isNetworkError;\naxiosRetry.isSafeRequestError = isSafeRequestError;\naxiosRetry.isIdempotentRequestError = isIdempotentRequestError;\naxiosRetry.isNetworkOrIdempotentRequestError = isNetworkOrIdempotentRequestError;\naxiosRetry.exponentialDelay = exponentialDelay;\naxiosRetry.linearDelay = linearDelay;\naxiosRetry.isRetryableError = isRetryableError;\nexport default axiosRetry;\n","export const PATHS = {\n U2F: \"5655636'/5583430'\",\n CONFIDENTIALITY: \"5655636'/4410950'\",\n KEY_MATERIAL: \"5655636'/4932953'\",\n VALIDATION: \"5655636'/5652812'\",\n} as const;\n\nexport const STATUS_LENGTH = 2;\n\nexport const SCRIPT_IDS = {\n INIT_SESSION: 3,\n ACCOUNT_MANAGER_SESSION: 2,\n} as const;\n\nexport const STR_ROLES: Record<\"OPERATOR\" | \"ADMIN\" | \"SHARED_OWNER\", string> = {\n OPERATOR: \"00\",\n ADMIN: \"01\",\n SHARED_OWNER: \"02\",\n} as const;\n\nexport const APPID_VAULT_ADMINISTRATOR =\n \"ad5be1a1fe011ce7f53ae081a22ae000a42021f3f94106a3bac9f76e8230e4b9\";\n\nconst all61xxStatus = [];\nfor (let i = 0x6100; i <= 0x61ff; i++) {\n all61xxStatus.push(i);\n}\n\nexport const PAGINATED_STATUS = all61xxStatus;\nexport const STREAMING_RESPONSE = 0x02;\nexport const STREAMING_NEXT_ACTION = 0x01;\n","import type {\n HsmCertificate,\n PsdAuthChallengeResponse,\n PsdPairingData,\n PubKey,\n RefreshPskData,\n} from \"@ledgerhq/revault-api\";\nimport axios from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport invariant from \"invariant\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport type { Logger } from \"@/logger\";\n\nimport { deviceOperationDelay, withDeviceOperationSignal } from \"./abort\";\nimport { APPID_VAULT_ADMINISTRATOR, PATHS, SCRIPT_IDS, STR_ROLES } from \"./constants\";\nimport type { Device, PairingStatus } from \"./types\";\n\ntype Options = {\n /**\n * device-api URL\n */\n deviceApiUrl: string;\n\n /**\n * salt used by device-api\n */\n salt: string;\n\n /**\n * seed generation function used for device-api device spawn\n */\n genSeed: (p: { salt: string; index: number }) => string | Promise<string>;\n};\n\nexport type ApiDevice = {\n /**\n * bind a device to the given device index\n */\n with: (index: number) => Device;\n};\n\nexport function createApiDevice(options: Options, logger: Logger): ApiDevice {\n const { genSeed } = options;\n const sessionId = uuidv4();\n const deviceApi = axios.create({ baseURL: options.deviceApiUrl });\n\n axiosRetry(deviceApi, {\n retryDelay: axiosRetry.linearDelay(1000),\n retries: 3,\n /* v8 ignore start -- @preserve */\n retryCondition: () => true,\n onRetry: (retryCount, err) => {\n const formattedErr = `${err.code ?? `UNKNOWN`} on ${err.config?.method?.toUpperCase() ?? \"UNKNOWN_METHOD\"} ${err.config?.url ?? \"UNKNOWN_URL\"}`;\n logger.warning(\n `Retrying request to device-api (attempt ${retryCount}) - Cause: ${formattedErr}`,\n );\n },\n /* v8 ignore stop */\n });\n\n /* v8 ignore start -- @preserve */\n deviceApi.interceptors.request.use(\n (config) => {\n logger.debug(\n `[device-api] ${config.method?.toUpperCase()} ${config.url}${config.data ? ` ${JSON.stringify(config.data)}` : \"\"}`,\n );\n if ([\"post\", \"put\"].includes(config.method!)) {\n // when interceptor is called in combination with axios-retry, config.data can be a string or an object\n // and we should return either a string or an object compatible with the original type\n const isStringMode = typeof config.data === \"string\";\n const data = (isStringMode ? JSON.parse(config.data) : config.data) as Record<\n string,\n unknown\n >;\n const enhancedData = {\n sessionID: sessionId, // Used to ensure dedicated session if someones else uses same seed\n psd_model: \"02\", // Stax\n version: 3, // Used to properly enable noise channel\n ...data,\n };\n config.data = isStringMode ? JSON.stringify(enhancedData) : enhancedData;\n }\n return config;\n },\n (error: Error) => Promise.reject(error),\n );\n /* v8 ignore stop */\n\n return {\n with: (index: number): Device => {\n const __seed = genSeed({ salt: options.salt, index });\n\n const getSeed = async (): Promise<string> => {\n if (typeof __seed === \"string\") return Promise.resolve(__seed);\n return __seed;\n };\n\n const postWithSignal = async <T>(\n url: string,\n data: unknown,\n signal?: AbortSignal,\n ): Promise<{ data: T }> =>\n withDeviceOperationSignal(\n () => (signal ? deviceApi.post<T>(url, data, { signal }) : deviceApi.post<T>(url, data)),\n signal,\n );\n\n const authenticate = async ({\n challenge,\n workspaceName,\n }: {\n challenge: PsdAuthChallengeResponse;\n workspaceName: string;\n }): Promise<string> => {\n const role = challenge.role;\n if (role === \"READ_ONLY_API_KEY\")\n throw new Error(\"Invalid role for authenticate: READ_ONLY_API_KEY\");\n const { data } = await deviceApi.post<string>(\"/authenticate\", {\n seed: await getSeed(),\n challenge: Buffer.from(challenge.challenge, \"base64\").toString(\"hex\"),\n application: APPID_VAULT_ADMINISTRATOR,\n key_handle: challenge.keyHandle,\n name: challenge.name,\n role: STR_ROLES[role],\n type: \"02\", // Stax\n workspaceName,\n });\n return data;\n };\n\n const finalizePairingHandshake = async (params: {\n handshake: string;\n partitionId: string;\n }): Promise<string> => {\n const { handshake, partitionId } = params;\n const payload = { seed: await getSeed(), handshake, ciphertext: partitionId };\n const res = await deviceApi.post<string>(\"/finalize-pairing-handshake\", payload);\n return res.data;\n };\n\n const generateSeedFragment = async (): Promise<string> => {\n const payload = {\n seed: await getSeed(),\n path: PATHS.KEY_MATERIAL,\n goal: 0, // seed fragment\n };\n const { data } = await deviceApi.post<string>(\"/generate-key-component\", payload);\n return data;\n };\n\n const getAttestation = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{\n attestation: {\n codeHash: string;\n attestationPub: string;\n certificate: string;\n };\n buffer: Buffer;\n }> => {\n const { data: attestationStr } = await postWithSignal<string>(\n \"/get-attestation\",\n { seed: await getSeed() },\n opts.signal,\n );\n const attestationBuffer = Buffer.from(attestationStr, \"hex\");\n const certLen = attestationBuffer.readInt8(32 + 65 + 1);\n return {\n attestation: {\n codeHash: attestationBuffer.slice(0, 32).toString(\"base64\"),\n attestationPub: attestationBuffer.slice(32, 32 + 65).toString(\"base64\"),\n certificate: attestationBuffer.slice(32 + 65, 32 + 65 + 2 + certLen).toString(\"base64\"),\n },\n buffer: attestationBuffer,\n };\n };\n\n const getConfidentialityKey = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{\n confidentialityKeyCurve25519: string;\n confidentialityKeySignature: string;\n }> => {\n const res = await postWithSignal<{\n confidentiality_key_curve25519: string;\n confidentiality_key_signature: string;\n }>(\"/get-confidentiality-key\", { seed: await getSeed() }, opts.signal);\n return {\n confidentialityKeyCurve25519: res.data.confidentiality_key_curve25519,\n confidentialityKeySignature: res.data.confidentiality_key_signature,\n };\n };\n\n const getConfidentialityPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.CONFIDENTIALITY });\n };\n\n const getDeviceUserId = async (): Promise<string> => {\n const res = await deviceApi.post<{ blue_device_id: string }>(\"/blue-device-id\", {\n seed: await getSeed(),\n });\n return res.data.blue_device_id.toUpperCase();\n };\n\n const getU2FPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.U2F });\n };\n\n const getValidationPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.VALIDATION });\n };\n\n const hasPairing = async (opts: { signal?: AbortSignal } = {}): Promise<PairingStatus> => {\n const seed = await getSeed();\n const res = await postWithSignal<string[]>(\"/get-partition-ids\", { seed }, opts.signal);\n if (res.data.length === 0) return \"NO_PAIRING\";\n // A pairing exists; ask device-api whether its PSK slot is populated. Mirrors the firmware\n // returning SW_PSK_MISSING from GET_PARTITION_IDS when the NVM PSK is the all-zero sentinel.\n // POST (not GET) so the body carries `seed` and the interceptor-injected `sessionID`,\n // letting device-api resolve THIS session's device instead of its global current device.\n const status = await postWithSignal<{ partition_id: string | null; psk_missing: boolean }>(\n \"/partition-psk-status\",\n { seed },\n opts.signal,\n );\n return status.data.psk_missing ? \"PSK_MISSING\" : \"OK\";\n };\n\n const initPairingHandshake = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{ pubKey: string; signature: string }> => {\n const { data } = await postWithSignal<{ attestation: string; pubKey: string }>(\n \"/initiate-pairing-handshake\",\n { seed: await getSeed() },\n opts.signal,\n );\n return {\n pubKey: data.pubKey,\n signature: Buffer.from(data.attestation, \"hex\").toString(\"base64\"),\n };\n };\n\n const openSession = async (params: {\n secureChannel: { pubKey: PubKey; certificate: HsmCertificate };\n }): Promise<void> => {\n const { secureChannel } = params;\n const signature = Buffer.from(secureChannel.certificate.signature, \"base64\");\n const attestationPubKey = Buffer.from(secureChannel.certificate.attestationPub, \"base64\");\n const attestationCertificate = Buffer.from(secureChannel.certificate.certificate, \"base64\");\n const attestation = Buffer.concat([\n Buffer.from([signature.length]),\n signature,\n attestationPubKey,\n Buffer.from([attestationCertificate.length]),\n attestationCertificate,\n ]);\n const payload = {\n seed: await getSeed(),\n path: PATHS.CONFIDENTIALITY,\n pubKey: secureChannel.pubKey,\n attestation: attestation.toString(\"hex\"),\n scriptId: SCRIPT_IDS.INIT_SESSION,\n };\n const { data: deviceResponse } = await deviceApi.post<string>(\"/open-session\", payload);\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const register = async (params: {\n challenge: string;\n u2fRegisterData: string;\n name: string;\n role: \"ADMIN\" | \"SHARED_OWNER\" | \"OPERATOR\";\n }): Promise<{\n u2fRegister: Buffer;\n keyHandle: Buffer;\n rfu: number;\n pubKey: string;\n }> => {\n const { challenge, u2fRegisterData, name, role } = params;\n const payload = {\n seed: await getSeed(),\n challenge,\n name,\n role: STR_ROLES[role],\n hsm_data: u2fRegisterData,\n type: \"02\", // Stax\n application: APPID_VAULT_ADMINISTRATOR,\n };\n const { data } = await deviceApi.post<string>(\"/register\", payload);\n const response = Buffer.from(data, \"hex\");\n let i = 0;\n const rfu = response.slice(i, i + 1)[0]!;\n i += 1;\n const pubKey = response.slice(i, i + 65).toString(\"hex\");\n i += 65;\n const keyHandleLength = response.slice(i, i + 1)[0]!;\n i++;\n const keyHandle = response.slice(i, i + keyHandleLength);\n i += keyHandleLength;\n return {\n u2fRegister: response.slice(0, response.length - 2),\n keyHandle,\n rfu,\n pubKey,\n };\n };\n\n const registerData = async (params: { challenge: string }): Promise<string> => {\n const { challenge } = params;\n const payload = { seed: await getSeed(), challenge };\n const res = await deviceApi.post<string>(\"/u2f-register-data\", payload);\n return res.data;\n };\n\n const setPairing = async ({\n pairing,\n signal,\n }: {\n pairing: PsdPairingData;\n signal?: AbortSignal;\n }): Promise<void> => {\n const payload = {\n seed: await getSeed(),\n blob: pairing.blob,\n pairing: {\n bootstrap_enabled: pairing.pairing.bootstrapEnabled,\n partition_key: pairing.pairing.partitionKey,\n workspace_name: pairing.pairing.workspaceName,\n },\n partition_key_attestation: {\n code_hash: pairing.partitionKeyAttestation.codeHash,\n attestation_pub: pairing.partitionKeyAttestation.attestationPub,\n certificate: pairing.partitionKeyAttestation.certificate,\n signature: pairing.partitionKeyAttestation.signature,\n },\n };\n await postWithSignal(\"/set-partition-key\", payload, signal);\n };\n\n const signRefreshPskAuth = async ({\n ephemeralKey,\n signal,\n }: {\n ephemeralKey: string;\n signal?: AbortSignal;\n }): Promise<string> => {\n // Mirrors the firmware's SIGN_REFRESH_PSK_AUTH (`0x55`). The firmware signs over the\n // ephemeral it captured at INITIALIZE_NN_HANDSHAKE; the stateless device-api has no such\n // capture, so we pass the framed ephemeral (hex, from initPairingHandshake) back here.\n // The endpoint returns the DER signature as raw hex; convert to base64 to match the proxy's\n // base64 `validation_key_signature` field.\n const { data } = await postWithSignal<string>(\n \"/sign-refresh-psk-auth\",\n {\n seed: await getSeed(),\n ephemeral_key: ephemeralKey,\n },\n signal,\n );\n return Buffer.from(data, \"hex\").toString(\"base64\");\n };\n\n const finalizePskRefresh = async (\n params: RefreshPskData & { signal?: AbortSignal },\n ): Promise<void> => {\n // Mirrors the firmware's FINALIZE_PSK_REFRESH handler. device-api takes only the NN\n // `handshake` and the encrypted PairingPayload `ciphertext`, both hex — no attestation\n // (it doesn't verify the HSM endorsement). The proxy hands us base64, so convert to hex.\n const payload = {\n seed: await getSeed(),\n handshake: Buffer.from(params.handshake, \"base64\").toString(\"hex\"),\n ciphertext: Buffer.from(params.encryptedPairingPayload, \"base64\").toString(\"hex\"),\n };\n await postWithSignal(\"/finalize-psk-refresh\", payload, params.signal);\n };\n\n const startKKPatternAsResponder = async (params: {\n handshake: string;\n handshakeAttestation: HsmCertificate;\n partitionId: string;\n }): Promise<{ handshake: string; signature: string }> => {\n const payload = {\n seed: await getSeed(),\n script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,\n handshake: params.handshake,\n // for device-api it's normal to have empty string as handshake_attestation\n handshake_attestation: \"\",\n partition_id: params.partitionId,\n };\n const { data } = await deviceApi.post<string>(\"/start-kk-pattern-as-responder\", payload);\n const buffer = Buffer.from(data, \"hex\");\n const dataLength = buffer.readInt8(0);\n return {\n handshake: buffer.slice(1, dataLength + 1).toString(\"base64\"),\n signature: buffer.slice(dataLength + 1).toString(\"base64\"),\n };\n };\n\n const startKPatternAsResponder = async (params: {\n handshake: string;\n handshakeAttestation: HsmCertificate;\n partitionId: string;\n signal?: AbortSignal;\n }): Promise<void> => {\n const { handshake, partitionId } = params;\n const payload = {\n seed: await getSeed(),\n script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,\n handshake,\n // for device-api it's normal to have empty string as handshake_attestation\n handshake_attestation: \"\",\n partition_id: partitionId,\n };\n const { data: deviceResponse } = await postWithSignal<string>(\n \"/start-k-pattern-as-responder\",\n payload,\n params.signal,\n );\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const startPskSession = async (params: {\n nonce: string;\n partitionId: string;\n signal?: AbortSignal;\n }): Promise<void> => {\n const { nonce, partitionId } = params;\n invariant(\n nonce.length === 64,\n `PSK nonce must be 32 bytes (64 hex chars), got ${nonce.length} chars`,\n );\n invariant(\n partitionId.length === 32,\n `partitionId must be 16 bytes (32 hex chars), got ${partitionId.length} chars`,\n );\n // Mirrors firmware START_PSK_SESSION. Unlike the hex-decoded k-pattern route, the\n // device-api /start-psk-session base64-decodes nonce + partition_id, so convert the\n // challenge's hex strings to base64 here.\n const payload = {\n seed: await getSeed(),\n nonce: Buffer.from(nonce, \"hex\").toString(\"base64\"),\n partition_id: Buffer.from(partitionId, \"hex\").toString(\"base64\"),\n };\n const { data: deviceResponse } = await postWithSignal<string>(\n \"/start-psk-session\",\n payload,\n params.signal,\n );\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const getPublicKey = async (params: {\n path: string;\n }): Promise<{ pubKey: string; signature: string }> => {\n const { path } = params;\n type DeviceApiGetPubKeyResponse = { attestation: string; pubKey: string };\n const payload = { seed: await getSeed(), secp256k1: true, path };\n const res = await deviceApi.post<DeviceApiGetPubKeyResponse>(\"/get-public-key\", payload);\n return {\n pubKey: res.data.pubKey,\n signature: Buffer.from(res.data.attestation, \"hex\").toString(\"base64\"),\n };\n };\n\n const validateVaultOperation = async (params: {\n actions: string[];\n signal?: AbortSignal;\n }): Promise<string> => {\n const { actions } = params;\n const payload = {\n seed: await getSeed(),\n path: PATHS.VALIDATION,\n actions,\n };\n const { data: signature } = await postWithSignal<string>(\n \"/validate-op\",\n payload,\n params.signal,\n );\n return signature;\n };\n\n const sendAPDU = (_apdu: string): Promise<string> => {\n logger.info(\"Can't send arbitrary APDU to software device\");\n return Promise.resolve(\"9000\");\n };\n\n const getVersion = async (opts: { signal?: AbortSignal } = {}): Promise<string> =>\n withDeviceOperationSignal(() => Promise.resolve(\"1.2.3\"), opts.signal);\n\n const poll = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{ isAppOpened: boolean }> => {\n await deviceOperationDelay(1e3, opts.signal);\n return { isAppOpened: true };\n };\n\n const pollApp = async (\n _name: string,\n opts: { signal?: AbortSignal } = {},\n ): Promise<string> => {\n await deviceOperationDelay(1e3, opts.signal);\n return \"9000\";\n };\n\n return {\n authenticate,\n finalizePairingHandshake,\n generateSeedFragment,\n getAttestation,\n getConfidentialityKey,\n getConfidentialityPubKey,\n getDeviceUserId,\n getU2FPubKey,\n getValidationPubKey,\n hasPairing,\n initPairingHandshake,\n openSession,\n register,\n registerData,\n setPairing,\n signRefreshPskAuth,\n finalizePskRefresh,\n startKKPatternAsResponder,\n startKPatternAsResponder,\n startPskSession,\n validateVaultOperation,\n getVersion,\n sendAPDU,\n poll,\n pollApp,\n };\n },\n };\n}\n","/* eslint-disable no-continue */\n/* eslint-disable no-unused-vars */\n/* eslint-disable no-param-reassign */\n/* eslint-disable no-prototype-builtins */\nconst errorClasses = {};\nconst deserializers = {};\nexport const addCustomErrorDeserializer = (name, deserializer) => {\n deserializers[name] = deserializer;\n};\nexport const createCustomErrorClass = (name) => {\n class CustomErrorClass extends Error {\n cause;\n constructor(message, fields, options) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n super(message || name, options);\n // Set the prototype explicitly. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, CustomErrorClass.prototype);\n this.name = name;\n if (fields) {\n for (const k in fields) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this[k] = fields[k];\n }\n }\n if (options && isObject(options) && \"cause\" in options && !this.cause) {\n // .cause was specified but the superconstructor\n // did not create an instance property.\n const cause = options.cause;\n this.cause = cause;\n if (\"stack\" in cause) {\n this.stack = this.stack + \"\\nCAUSE: \" + cause.stack;\n }\n }\n }\n }\n errorClasses[name] = CustomErrorClass;\n return CustomErrorClass;\n};\nfunction isObject(value) {\n return typeof value === \"object\";\n}\n// inspired from https://github.com/programble/errio/blob/master/index.js\nexport const deserializeError = (object) => {\n if (object && typeof object === \"object\") {\n try {\n if (typeof object.message === \"string\") {\n const msg = JSON.parse(object.message);\n if (msg.message && msg.name) {\n object = msg;\n }\n }\n }\n catch {\n // nothing\n }\n let error;\n if (typeof object.name === \"string\") {\n const { name } = object;\n const des = deserializers[name];\n if (des) {\n error = des(object);\n }\n else {\n let constructor = name === \"Error\" ? Error : errorClasses[name];\n if (!constructor) {\n console.warn(\"deserializing an unknown class '\" + name + \"'\");\n constructor = createCustomErrorClass(name);\n }\n error = Object.create(constructor.prototype);\n try {\n for (const prop in object) {\n if (object.hasOwnProperty(prop)) {\n error[prop] = object[prop];\n }\n }\n }\n catch {\n // sometimes setting a property can fail (e.g. .name)\n }\n }\n }\n else {\n if (typeof object.message === \"string\") {\n error = new Error(object.message);\n }\n }\n // captureStackTrace is V8/Node-specific and not in @types/node\n const Err = Error;\n if (error && !error.stack && Err.captureStackTrace) {\n Err.captureStackTrace(error, deserializeError);\n }\n return error;\n }\n return new Error(String(object));\n};\n// inspired from https://github.com/sindresorhus/serialize-error/blob/master/index.js\nexport const serializeError = (value) => {\n if (!value)\n return value;\n if (typeof value === \"object\") {\n return destroyCircular(value, []);\n }\n if (typeof value === \"function\") {\n return `[Function: ${value.name || \"anonymous\"}]`;\n }\n return value;\n};\n// https://www.npmjs.com/package/destroy-circular\nfunction destroyCircular(from, seen) {\n const to = {};\n seen.push(from);\n for (const key of Object.keys(from)) {\n const value = from[key];\n if (typeof value === \"function\") {\n continue;\n }\n if (!value || typeof value !== \"object\") {\n to[key] = value;\n continue;\n }\n if (seen.indexOf(from[key]) === -1) {\n to[key] = destroyCircular(from[key], seen.slice(0));\n continue;\n }\n to[key] = \"[Circular]\";\n }\n if (typeof from.name === \"string\") {\n to.name = from.name;\n }\n if (typeof from.message === \"string\") {\n to.message = from.message;\n }\n if (typeof from.stack === \"string\") {\n to.stack = from.stack;\n }\n return to;\n}\n//# sourceMappingURL=helpers.js.map","import { serializeError, deserializeError, createCustomErrorClass, addCustomErrorDeserializer, } from \"./helpers\";\nexport { serializeError, deserializeError, createCustomErrorClass, addCustomErrorDeserializer };\nexport const AccountNameRequiredError = createCustomErrorClass(\"AccountNameRequired\");\nexport const AccountNotSupported = createCustomErrorClass(\"AccountNotSupported\");\nexport const AccountAwaitingSendPendingOperations = createCustomErrorClass(\"AccountAwaitingSendPendingOperations\");\nexport const AmountRequired = createCustomErrorClass(\"AmountRequired\");\nexport const BluetoothRequired = createCustomErrorClass(\"BluetoothRequired\");\nexport const BtcUnmatchedApp = createCustomErrorClass(\"BtcUnmatchedApp\");\nexport const CantOpenDevice = createCustomErrorClass(\"CantOpenDevice\");\nexport const CashAddrNotSupported = createCustomErrorClass(\"CashAddrNotSupported\");\nexport const ClaimRewardsFeesWarning = createCustomErrorClass(\"ClaimRewardsFeesWarning\");\nexport const CurrencyNotSupported = createCustomErrorClass(\"CurrencyNotSupported\");\nexport const DeviceAppVerifyNotSupported = createCustomErrorClass(\"DeviceAppVerifyNotSupported\");\nexport const DeviceGenuineSocketEarlyClose = createCustomErrorClass(\"DeviceGenuineSocketEarlyClose\");\nexport const DeviceNotGenuineError = createCustomErrorClass(\"DeviceNotGenuine\");\nexport const DeviceOnDashboardExpected = createCustomErrorClass(\"DeviceOnDashboardExpected\");\nexport const DeviceOnDashboardUnexpected = createCustomErrorClass(\"DeviceOnDashboardUnexpected\");\nexport const DeviceInOSUExpected = createCustomErrorClass(\"DeviceInOSUExpected\");\nexport const DeviceHalted = createCustomErrorClass(\"DeviceHalted\");\nexport const DeviceNameInvalid = createCustomErrorClass(\"DeviceNameInvalid\");\nexport const DeviceSocketFail = createCustomErrorClass(\"DeviceSocketFail\");\nexport const DeviceSocketNoBulkStatus = createCustomErrorClass(\"DeviceSocketNoBulkStatus\");\nexport const DeviceNeedsRestart = createCustomErrorClass(\"DeviceSocketNoBulkStatus\");\nexport const UnresponsiveDeviceError = createCustomErrorClass(\"UnresponsiveDeviceError\");\nexport const DisconnectedDevice = createCustomErrorClass(\"DisconnectedDevice\");\nexport const DisconnectedDeviceDuringOperation = createCustomErrorClass(\"DisconnectedDeviceDuringOperation\");\nexport const DeviceExtractOnboardingStateError = createCustomErrorClass(\"DeviceExtractOnboardingStateError\");\nexport const DeviceOnboardingStatePollingError = createCustomErrorClass(\"DeviceOnboardingStatePollingError\");\nexport const EnpointConfigError = createCustomErrorClass(\"EnpointConfig\");\nexport const EthAppPleaseEnableContractData = createCustomErrorClass(\"EthAppPleaseEnableContractData\");\nexport const SolAppPleaseEnableContractData = createCustomErrorClass(\"SolAppPleaseEnableContractData\");\nexport const CeloAppPleaseEnableContractData = createCustomErrorClass(\"CeloAppPleaseEnableContractData\");\nexport const FeeEstimationFailed = createCustomErrorClass(\"FeeEstimationFailed\");\nexport const FirmwareNotRecognized = createCustomErrorClass(\"FirmwareNotRecognized\");\nexport const HardResetFail = createCustomErrorClass(\"HardResetFail\");\nexport const InvalidXRPTag = createCustomErrorClass(\"InvalidXRPTag\");\nexport const InvalidAddress = createCustomErrorClass(\"InvalidAddress\");\nexport const InvalidTransactionError = createCustomErrorClass(\"InvalidTransactionError\");\nexport const InvalidNonce = createCustomErrorClass(\"InvalidNonce\");\nexport const InvalidAddressBecauseDestinationIsAlsoSource = createCustomErrorClass(\"InvalidAddressBecauseDestinationIsAlsoSource\");\nexport const LatestMCUInstalledError = createCustomErrorClass(\"LatestMCUInstalledError\");\nexport const LatestFirmwareVersionRequired = createCustomErrorClass(\"LatestFirmwareVersionRequired\");\nexport const UnsupportedFeatureError = createCustomErrorClass(\"UnsupportedFeatureError\");\nexport const NanoSNotSupported = createCustomErrorClass(\"NanoSNotSupported\");\nexport const UnknownMCU = createCustomErrorClass(\"UnknownMCU\");\nexport const LedgerAPIError = createCustomErrorClass(\"LedgerAPIError\");\nexport const LedgerAPIErrorWithMessage = createCustomErrorClass(\"LedgerAPIErrorWithMessage\");\nexport const LedgerAPINotAvailable = createCustomErrorClass(\"LedgerAPINotAvailable\");\nexport const ManagerAppAlreadyInstalledError = createCustomErrorClass(\"ManagerAppAlreadyInstalled\");\nexport const ManagerAppRelyOnBTCError = createCustomErrorClass(\"ManagerAppRelyOnBTC\");\nexport const ManagerAppDepInstallRequired = createCustomErrorClass(\"ManagerAppDepInstallRequired\");\nexport const ManagerAppDepUninstallRequired = createCustomErrorClass(\"ManagerAppDepUninstallRequired\");\nexport const ManagerDeviceLockedError = createCustomErrorClass(\"ManagerDeviceLocked\");\nexport const ManagerFirmwareNotEnoughSpaceError = createCustomErrorClass(\"ManagerFirmwareNotEnoughSpace\");\nexport const ManagerNotEnoughSpaceError = createCustomErrorClass(\"ManagerNotEnoughSpace\");\nexport const ManagerUninstallBTCDep = createCustomErrorClass(\"ManagerUninstallBTCDep\");\nexport const NetworkDown = createCustomErrorClass(\"NetworkDown\");\nexport const NetworkError = createCustomErrorClass(\"NetworkError\");\nexport const NoAddressesFound = createCustomErrorClass(\"NoAddressesFound\");\nexport const NotEnoughBalance = createCustomErrorClass(\"NotEnoughBalance\");\nexport const NotEnoughBalanceFees = createCustomErrorClass(\"NotEnoughBalanceFees\");\nexport const NotEnoughBalanceSwap = createCustomErrorClass(\"NotEnoughBalanceSwap\");\nexport const NotEnoughBalanceToDelegate = createCustomErrorClass(\"NotEnoughBalanceToDelegate\");\nexport const UnstakeNotEnoughStakedBalanceLeft = createCustomErrorClass(\"UnstakeNotEnoughStakedBalanceLeft\");\nexport const RestakeNotEnoughStakedBalanceLeft = createCustomErrorClass(\"RestakeNotEnoughStakedBalanceLeft\");\nexport const NotEnoughToRestake = createCustomErrorClass(\"NotEnoughToRestake\");\nexport const NotEnoughToUnstake = createCustomErrorClass(\"NotEnoughToUnstake\");\nexport const NotEnoughBalanceInParentAccount = createCustomErrorClass(\"NotEnoughBalanceInParentAccount\");\nexport const NotEnoughSpendableBalance = createCustomErrorClass(\"NotEnoughSpendableBalance\");\nexport const NotEnoughBalanceBecauseDestinationNotCreated = createCustomErrorClass(\"NotEnoughBalanceBecauseDestinationNotCreated\");\nexport const NotEnoughToStake = createCustomErrorClass(\"NotEnoughToStake\");\nexport const NoAccessToCamera = createCustomErrorClass(\"NoAccessToCamera\");\nexport const NotEnoughGas = createCustomErrorClass(\"NotEnoughGas\");\n// Error message specifically for the PTX swap flow\nexport const NotEnoughGasSwap = createCustomErrorClass(\"NotEnoughGasSwap\");\nexport const TronEmptyAccount = createCustomErrorClass(\"TronEmptyAccount\");\nexport const MaybeKeepTronAccountAlive = createCustomErrorClass(\"MaybeKeepTronAccountAlive\");\nexport const NotSupportedLegacyAddress = createCustomErrorClass(\"NotSupportedLegacyAddress\");\nexport const GasLessThanEstimate = createCustomErrorClass(\"GasLessThanEstimate\");\nexport const PriorityFeeTooLow = createCustomErrorClass(\"PriorityFeeTooLow\");\nexport const PriorityFeeTooHigh = createCustomErrorClass(\"PriorityFeeTooHigh\");\nexport const PriorityFeeHigherThanMaxFee = createCustomErrorClass(\"PriorityFeeHigherThanMaxFee\");\nexport const MaxFeeTooLow = createCustomErrorClass(\"MaxFeeTooLow\");\nexport const PasswordsDontMatchError = createCustomErrorClass(\"PasswordsDontMatch\");\nexport const PasswordIncorrectError = createCustomErrorClass(\"PasswordIncorrect\");\nexport const RecommendSubAccountsToEmpty = createCustomErrorClass(\"RecommendSubAccountsToEmpty\");\nexport const RecommendUndelegation = createCustomErrorClass(\"RecommendUndelegation\");\nexport const TimeoutTagged = createCustomErrorClass(\"TimeoutTagged\");\nexport const UnexpectedBootloader = createCustomErrorClass(\"UnexpectedBootloader\");\nexport const MCUNotGenuineToDashboard = createCustomErrorClass(\"MCUNotGenuineToDashboard\");\nexport const RecipientRequired = createCustomErrorClass(\"RecipientRequired\");\nexport const UnavailableTezosOriginatedAccountReceive = createCustomErrorClass(\"UnavailableTezosOriginatedAccountReceive\");\nexport const UnavailableTezosOriginatedAccountSend = createCustomErrorClass(\"UnavailableTezosOriginatedAccountSend\");\nexport const UpdateFetchFileFail = createCustomErrorClass(\"UpdateFetchFileFail\");\nexport const UpdateIncorrectHash = createCustomErrorClass(\"UpdateIncorrectHash\");\nexport const UpdateIncorrectSig = createCustomErrorClass(\"UpdateIncorrectSig\");\nexport const UpdateYourApp = createCustomErrorClass(\"UpdateYourApp\");\nexport const UserRefusedDeviceNameChange = createCustomErrorClass(\"UserRefusedDeviceNameChange\");\nexport const UserRefusedAddress = createCustomErrorClass(\"UserRefusedAddress\");\nexport const UserRefusedFirmwareUpdate = createCustomErrorClass(\"UserRefusedFirmwareUpdate\");\nexport const UserRefusedAllowManager = createCustomErrorClass(\"UserRefusedAllowManager\");\nexport const UserRefusedOnDevice = createCustomErrorClass(\"UserRefusedOnDevice\"); // TODO rename because it's just for transaction refusal\nexport const PinNotSet = createCustomErrorClass(\"PinNotSet\");\nexport const ExpertModeRequired = createCustomErrorClass(\"ExpertModeRequired\");\nexport const TransportOpenUserCancelled = createCustomErrorClass(\"TransportOpenUserCancelled\");\nexport const TransportInterfaceNotAvailable = createCustomErrorClass(\"TransportInterfaceNotAvailable\");\nexport const TransportRaceCondition = createCustomErrorClass(\"TransportRaceCondition\");\nexport const TransportWebUSBGestureRequired = createCustomErrorClass(\"TransportWebUSBGestureRequired\");\nexport const TransactionHasBeenValidatedError = createCustomErrorClass(\"TransactionHasBeenValidatedError\");\nexport const TransportExchangeTimeoutError = createCustomErrorClass(\"TransportExchangeTimeoutError\");\nexport const DeviceShouldStayInApp = createCustomErrorClass(\"DeviceShouldStayInApp\");\nexport const WebsocketConnectionError = createCustomErrorClass(\"WebsocketConnectionError\");\nexport const WebsocketConnectionFailed = createCustomErrorClass(\"WebsocketConnectionFailed\");\nexport const WrongDeviceForAccount = createCustomErrorClass(\"WrongDeviceForAccount\");\nexport const WrongDeviceForAccountPayout = createCustomErrorClass(\"WrongDeviceForAccountPayout\");\nexport const MissingSwapPayloadParamaters = createCustomErrorClass(\"MissingSwapPayloadParamaters\");\nexport const WrongDeviceForAccountRefund = createCustomErrorClass(\"WrongDeviceForAccountRefund\");\nexport const WrongAppForCurrency = createCustomErrorClass(\"WrongAppForCurrency\");\nexport const ETHAddressNonEIP = createCustomErrorClass(\"ETHAddressNonEIP\");\nexport const CantScanQRCode = createCustomErrorClass(\"CantScanQRCode\");\nexport const FeeNotLoaded = createCustomErrorClass(\"FeeNotLoaded\");\nexport const FeeNotLoadedSwap = createCustomErrorClass(\"FeeNotLoadedSwap\");\nexport const FeeRequired = createCustomErrorClass(\"FeeRequired\");\nexport const FeeTooHigh = createCustomErrorClass(\"FeeTooHigh\");\nexport const ValAddressRequired = createCustomErrorClass(\"ValAddressRequired\");\nexport const RedelegateDstValAddressRequired = createCustomErrorClass(\"RedelegateDstValAddressRequired\");\nexport const PendingOperation = createCustomErrorClass(\"PendingOperation\");\nexport const SyncError = createCustomErrorClass(\"SyncError\");\nexport const PairingFailed = createCustomErrorClass(\"PairingFailed\");\nexport const PeerRemovedPairing = createCustomErrorClass(\"PeerRemovedPairing\");\nexport const GenuineCheckFailed = createCustomErrorClass(\"GenuineCheckFailed\");\nexport const LedgerAPI4xx = createCustomErrorClass(\"LedgerAPI4xx\");\nexport const LedgerAPI5xx = createCustomErrorClass(\"LedgerAPI5xx\");\nexport const FirmwareOrAppUpdateRequired = createCustomErrorClass(\"FirmwareOrAppUpdateRequired\");\n// SpeedUp / Cancel EVM tx\nexport const ReplacementTransactionUnderpriced = createCustomErrorClass(\"ReplacementTransactionUnderpriced\");\n// Bitcoin family\nexport const OpReturnDataSizeLimit = createCustomErrorClass(\"OpReturnSizeLimit\");\nexport const DustLimit = createCustomErrorClass(\"DustLimit\");\n// Concordium family\nexport const ConcordiumInsufficientFunds = createCustomErrorClass(\"ConcordiumInsufficientFunds\");\nexport const ConcordiumMemoTooLong = createCustomErrorClass(\"ConcordiumMemoTooLong\");\nexport const ConcordiumPairingExpiredError = createCustomErrorClass(\"ConcordiumPairingExpiredError\");\nexport const ConcordiumSessionExpiredError = createCustomErrorClass(\"ConcordiumSessionExpiredError\");\nexport const ConcordiumTrustedMetadataServiceError = createCustomErrorClass(\"ConcordiumTrustedMetadataServiceError\");\nexport const ConcordiumAddressVerificationFailedError = createCustomErrorClass(\"ConcordiumAddressVerificationFailedError\");\nexport const ConcordiumInvalidMaxFeeError = createCustomErrorClass(\"ConcordiumInvalidMaxFeeError\");\n// Language\nexport const LanguageNotFound = createCustomErrorClass(\"LanguageNotFound\");\n// db stuff, no need to translate\nexport const NoDBPathGiven = createCustomErrorClass(\"NoDBPathGiven\");\nexport const DBWrongPassword = createCustomErrorClass(\"DBWrongPassword\");\nexport const DBNotReset = createCustomErrorClass(\"DBNotReset\");\nexport const SequenceNumberError = createCustomErrorClass(\"SequenceNumberError\");\nexport const DisabledTransactionBroadcastError = createCustomErrorClass(\"DisabledTransactionBroadcastError\");\nexport const InvalidParameterError = createCustomErrorClass(\"InvalidParameterError\");\n/**\n * Type of a Transport error used to represent all equivalent errors coming from all possible implementation of Transport\n */\nexport var HwTransportErrorType;\n(function (HwTransportErrorType) {\n HwTransportErrorType[\"Unknown\"] = \"Unknown\";\n HwTransportErrorType[\"LocationServicesDisabled\"] = \"LocationServicesDisabled\";\n HwTransportErrorType[\"LocationServicesUnauthorized\"] = \"LocationServicesUnauthorized\";\n HwTransportErrorType[\"BluetoothScanStartFailed\"] = \"BluetoothScanStartFailed\";\n})(HwTransportErrorType || (HwTransportErrorType = {}));\n/**\n * Represents an error coming from the usage of any Transport implementation.\n *\n * Needed to map a specific implementation error into an error that\n * can be managed by any code unaware of the specific Transport implementation\n * that was used.\n */\nexport class HwTransportError extends Error {\n type;\n constructor(type, message) {\n super(message);\n this.name = \"HwTransportError\";\n this.type = type;\n // Needed as long as we target < ES6\n Object.setPrototypeOf(this, HwTransportError.prototype);\n }\n}\n/**\n * TransportError is used for any generic transport errors.\n * e.g. Error thrown when data received by exchanges are incorrect or if exchanged failed to communicate with the device for various reason.\n */\nexport class TransportError extends Error {\n id;\n constructor(message, id) {\n const name = \"TransportError\";\n super(message || name);\n this.name = name;\n this.message = message;\n this.stack = new Error(message).stack;\n this.id = id;\n }\n}\naddCustomErrorDeserializer(\"TransportError\", e => new TransportError(e.message, e.id));\nexport const StatusCodes = {\n ACCESS_CONDITION_NOT_FULFILLED: 0x9804,\n ALGORITHM_NOT_SUPPORTED: 0x9484,\n CLA_NOT_SUPPORTED: 0x6e00,\n CLA_NOT_SUPPORTED_BOOTLOADER: 0x6e01,\n CODE_BLOCKED: 0x9840,\n CODE_NOT_INITIALIZED: 0x9802,\n COMMAND_INCOMPATIBLE_FILE_STRUCTURE: 0x6981,\n CONDITIONS_OF_USE_NOT_SATISFIED: 0x6985,\n CONTRADICTION_INVALIDATION: 0x9810,\n CONTRADICTION_SECRET_CODE_STATUS: 0x9808,\n DEVICE_IN_RECOVERY_MODE: 0x662f,\n CUSTOM_IMAGE_EMPTY: 0x662e,\n FILE_ALREADY_EXISTS: 0x6a89,\n FILE_NOT_FOUND: 0x9404,\n GP_AUTH_FAILED: 0x6300,\n HALTED: 0x6faa,\n INCONSISTENT_FILE: 0x9408,\n INCORRECT_DATA: 0x6a80,\n INCORRECT_LENGTH: 0x6700,\n INCORRECT_P1_P2: 0x6b00,\n INS_NOT_SUPPORTED: 0x6d00,\n DEVICE_NOT_ONBOARDED: 0x6d07,\n DEVICE_NOT_ONBOARDED_2: 0x6611,\n INVALID_KCV: 0x9485,\n INVALID_OFFSET: 0x9402,\n LICENSING: 0x6f42,\n LOCKED_DEVICE: 0x5515,\n MAX_VALUE_REACHED: 0x9850,\n MEMORY_PROBLEM: 0x9240,\n MISSING_CRITICAL_PARAMETER: 0x6800,\n NO_EF_SELECTED: 0x9400,\n NOT_ENOUGH_MEMORY_SPACE: 0x6a84,\n OK: 0x9000,\n PIN_REMAINING_ATTEMPTS: 0x63c0,\n REFERENCED_DATA_NOT_FOUND: 0x6a88,\n SECURITY_STATUS_NOT_SATISFIED: 0x6982,\n TECHNICAL_PROBLEM: 0x6f00,\n UNKNOWN_APDU: 0x6d02,\n USER_REFUSED_ON_DEVICE: 0x5501,\n NOT_ENOUGH_SPACE: 0x5102,\n APP_NOT_FOUND_OR_INVALID_CONTEXT: 0x5123,\n INVALID_APP_NAME_LENGTH: 0x670a,\n GEN_AES_KEY_FAILED: 0x5419,\n INTERNAL_CRYPTO_OPERATION_FAILED: 0x541a,\n INTERNAL_COMPUTE_AES_CMAC_FAILED: 0x541b,\n ENCRYPT_APP_STORAGE_FAILED: 0x541c,\n INVALID_BACKUP_STATE: 0x6642,\n PIN_NOT_SET: 0x5502,\n INVALID_BACKUP_LENGTH: 0x6733,\n INVALID_RESTORE_STATE: 0x6643,\n INVALID_CHUNK_LENGTH: 0x6734,\n INVALID_BACKUP_HEADER: 0x684a,\n SW_BAD_STATE: 0xb007,\n};\nexport function getAltStatusMessage(code) {\n switch (code) {\n // improve text of most common errors\n case 0x6700:\n return \"Incorrect length\";\n case 0x6800:\n return \"Missing critical parameter\";\n case 0x6982:\n return \"Security not satisfied (dongle locked or have invalid access rights)\";\n case 0x6985:\n return \"Condition of use not satisfied (denied by the user?)\";\n case 0x6a80:\n return \"Invalid data received\";\n case 0x6b00:\n return \"Invalid parameter received\";\n case 0x5515:\n return \"Locked device\";\n case 0xb007:\n return \"Unexpected state on the device\";\n }\n if (0x6f00 <= code && code <= 0x6fff) {\n return \"Internal error, please report\";\n }\n}\n/**\n * Error thrown when a device returned a non success status.\n * the error.statusCode is one of the `StatusCodes` exported by this library.\n */\nexport class TransportStatusError extends Error {\n statusCode;\n statusText;\n /**\n * @param statusCode The error status code coming from a Transport implementation\n * @param options containing:\n * - canBeMappedToChildError: enable the mapping of TransportStatusError to an error extending/inheriting from it\n * . Ex: LockedDeviceError. Default to true.\n */\n constructor(statusCode, { canBeMappedToChildError = true } = {}) {\n const statusText = Object.keys(StatusCodes).find(k => StatusCodes[k] === statusCode) || \"UNKNOWN_ERROR\";\n const smsg = getAltStatusMessage(statusCode) || statusText;\n const statusCodeStr = statusCode.toString(16);\n const message = `Ledger device: ${smsg} (0x${statusCodeStr})`;\n super(message);\n this.name = \"TransportStatusError\";\n this.statusCode = statusCode;\n this.statusText = statusText;\n Object.setPrototypeOf(this, TransportStatusError.prototype);\n // Maps to a LockedDeviceError\n if (canBeMappedToChildError && statusCode === StatusCodes.LOCKED_DEVICE) {\n return new LockedDeviceError(message);\n }\n }\n}\nexport class LockedDeviceError extends TransportStatusError {\n constructor(message) {\n super(StatusCodes.LOCKED_DEVICE, { canBeMappedToChildError: false });\n if (message) {\n this.message = message;\n }\n this.name = \"LockedDeviceError\";\n Object.setPrototypeOf(this, LockedDeviceError.prototype);\n }\n}\nexport class DeviceMangementKitError extends Error {\n constructor(name, message) {\n super(message);\n this.name = name;\n Object.setPrototypeOf(this, DeviceMangementKitError.prototype);\n }\n}\naddCustomErrorDeserializer(\"TransportStatusError\", e => new TransportStatusError(e.statusCode));\n//# sourceMappingURL=index.js.map","// biome-ignore-all lint: outside copy-paste, not worth fixing\n// ------------------------------------------------------------------------------------------------\n// ------------------------------------------------------------------------------------------------\n// THIS IS SOME HORRIBLE CODE IMPORTED JUST\n// FOR THE SAKE OF NOT IMPORTING UGLY, WICKED, AND\n// BROKEN @ledgerhq/live-* LIBRARIES\n//\n// IT'S MEANT TO BE CONSIDERED AS A BLACK BOX\n// ------------------------------------------------------------------------------------------------\n// ------------------------------------------------------------------------------------------------\nimport {\n BluetoothRequired,\n CantOpenDevice,\n DeviceHalted,\n FirmwareOrAppUpdateRequired,\n TransportInterfaceNotAvailable,\n TransportStatusError,\n TransportWebUSBGestureRequired,\n} from \"@ledgerhq/errors\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { Observable, throwError, timer } from \"rxjs\";\nimport { catchError, mergeMap, retryWhen } from \"rxjs/operators\";\n\nconst initialErrorRemapping = (error: Error): Observable<never> =>\n throwError(\n error && error instanceof TransportStatusError && error.statusCode === 0x6faa\n ? new DeviceHalted(error.message)\n : error instanceof TransportStatusError && error.statusCode === 0x6b00\n ? new FirmwareOrAppUpdateRequired(error.message)\n : error,\n );\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst never = new Promise(() => {});\n\ntype Discovery = Observable<{\n type: \"add\" | \"remove\";\n id: string;\n name: string;\n}>;\n\nexport type TransportModule = {\n // unique transport name that identify the transport module\n id: string;\n // open a device by an id, this id must be unique across all modules\n // you can typically prefix it with `something|` that identify it globally\n // returns falsy if the transport module can't handle this id\n // here, open means we want to START doing something with the transport\n open: (id: string) => Promise<Transport> | null | undefined;\n // here, close means we want to STOP doing something with the transport\n close?: (transport: Transport, id: string) => Promise<void> | null | undefined;\n // disconnect/interrupt a device connection globally\n // returns falsy if the transport module can't handle this id\n disconnect: (id: string) => Promise<void> | null | undefined;\n // optional observable that allows to discover a transport\n discovery?: Discovery;\n};\n\nconst modules: TransportModule[] = [];\n\nexport const registerTransportModule = (module: TransportModule): void => {\n modules.push(module);\n};\n\nexport const close = (transport: Transport, deviceId: string): Promise<void> => {\n for (const m of modules) {\n const p = m.close?.(transport, deviceId);\n if (p) return p;\n }\n // fallback on an actual close\n return transport.close();\n};\n\nexport const open = (deviceId: string): Promise<Transport> => {\n for (const m of modules) {\n const p = m.open(deviceId);\n if (p) return p;\n }\n return Promise.reject(new Error(`Can't find handler to open ${deviceId}`));\n};\n\nconst transportFinally =\n (cleanup: () => Promise<void>) =>\n <T>(observable: Observable<T>): Observable<T> =>\n // @ts-expect-error typescript not checking against the instanceof\n Observable.create((o) => {\n let done = false;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const finalize = (): any => {\n if (done) return never;\n done = true;\n return cleanup();\n };\n\n const sub = observable.subscribe({\n next: (e) => o.next(e),\n complete: () => {\n void finalize().then(() => o.complete());\n },\n error: (e) => {\n void finalize().then(() => o.error(e));\n },\n });\n return () => {\n sub.unsubscribe();\n void finalize();\n };\n });\n\ntype AccessHook = () => () => void;\n\nconst accessHooks: AccessHook[] = [];\n\nconst deviceQueues = {};\n\nexport const withDevice =\n (deviceId: string) =>\n <T>(job: (t: Transport) => Observable<T>): Observable<T> =>\n new Observable((o) => {\n // @ts-expect-error typescript not checking against the instanceof\n let unsubscribed;\n // @ts-expect-error typescript not checking against the instanceof\n let sub;\n // @ts-expect-error typescript not checking against the instanceof\n const deviceQueue = deviceQueues[deviceId] ?? Promise.resolve();\n\n // @ts-expect-error typescript not checking against the instanceof\n const finalize = (transport, cleanups): Promise<void> =>\n close(transport, deviceId)\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n .catch(() => {})\n .then(() => {\n // @ts-expect-error typescript not checking against the instanceof\n cleanups.forEach((c) => c());\n });\n\n // when we'll finish all the current job, we'll call finish\n // @ts-expect-error typescript not checking against the instanceof\n let finish;\n // this new promise is the next exec queue\n // @ts-expect-error typescript not checking against the instanceof\n deviceQueues[deviceId] = new Promise((resolve) => {\n finish = resolve;\n });\n // for any new job, we'll now wait the exec queue to be available\n deviceQueue\n .then(() => {\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // Release this queue slot without opening a transport.\n // @ts-expect-error typescript not checking against the instanceof\n finish();\n return;\n }\n return open(deviceId);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .then(async (transport) => {\n if (!transport) return;\n\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // it was unsubscribed prematurely\n // @ts-expect-error typescript not checking against the instanceof\n return finalize(transport, [finish]);\n }\n\n if (\n transport.requestConnectionPriority &&\n typeof transport.requestConnectionPriority === \"function\"\n ) {\n await transport.requestConnectionPriority(\"High\");\n }\n\n return transport;\n })\n // @ts-expect-error typescript not checking against the instanceof\n .catch((e) => {\n // @ts-expect-error typescript not checking against the instanceof\n finish();\n if (e instanceof BluetoothRequired) throw e;\n if (e instanceof TransportWebUSBGestureRequired) throw e;\n if (e instanceof TransportInterfaceNotAvailable) throw e;\n throw new CantOpenDevice(e.message);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .then((transport) => {\n if (!transport) return;\n\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // it was unsubscribed prematurely\n // @ts-expect-error typescript not checking against the instanceof\n return finalize(transport, [finish]);\n }\n\n const cleanups = accessHooks.map((hook) => hook());\n sub = job(transport) // $FlowFixMe\n .pipe(\n catchError(initialErrorRemapping),\n // $FlowFixMe\n transportFinally(() =>\n // @ts-expect-error typescript not checking against the instanceof\n finalize(transport, [...cleanups, finish]),\n ),\n )\n .subscribe(o);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .catch((error) => o.error(error));\n return () => {\n unsubscribed = true;\n // @ts-expect-error typescript not checking against the instanceof\n if (sub) sub.unsubscribe();\n };\n });\n\nconst WITH_DEVICE_POLLING_DELAY = 500;\n\nexport const retryWhileErrors =\n (acceptError: (arg0: Error) => boolean) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (attempts: Observable<any>): Observable<any> =>\n attempts.pipe(\n mergeMap((error) => {\n if (!acceptError(error)) {\n return throwError(error);\n }\n\n return timer(WITH_DEVICE_POLLING_DELAY);\n }),\n );\n\nexport const withDevicePolling =\n (deviceId: string) =>\n <T>(\n job: (arg0: Transport) => Observable<T>,\n acceptError: (arg0: Error) => boolean = () => false,\n ): Observable<T> =>\n withDevice(deviceId)(job).pipe(retryWhen(retryWhileErrors(acceptError)));\n","import { TransportStatusError } from \"@ledgerhq/errors\";\n\nexport const isTransportStatusError = (error: unknown): error is TransportStatusError => {\n return (\n error instanceof TransportStatusError ||\n (error instanceof Error && \"statusCode\" in error && error.message.startsWith(\"Ledger device:\"))\n );\n};\n\nconst CANCEL_STATUS_CODES = [\n 0x6985, // cancel on Ledger Blue\n\n // STAX\n 0xb00c, // cancel collect wk fragment\n 0xb00d, // cancel user registration\n 0xb010, // cancel review\n 0xb012, // cancel master seed generation\n 0xb013, // cancel login\n 0x5501, // cancel openApp\n];\n\n// The software device (device-api) surfaces firmware status words as an HTTP 409 whose JSON body\n// carries `{ sw: \"<hex>\" }`. The Web proxy can wrap this body one level below `data`.\nconst isDeviceApiSwError = (error: unknown, sw: string): boolean => {\n if (typeof error !== \"object\" || error === null || !(\"response\" in error)) return false;\n const { response } = error as { response?: unknown };\n if (typeof response !== \"object\" || response === null || !(\"data\" in response)) return false;\n const { data } = response as { data?: unknown };\n if (typeof data !== \"object\" || data === null) return false;\n const hasSw = (obj: unknown): boolean =>\n typeof obj === \"object\" && obj !== null && \"sw\" in obj && (obj as { sw?: unknown }).sw === sw;\n return hasSw(data) || hasSw((data as { data?: unknown }).data);\n};\n\nexport const isDeviceCancelError = (error: Error): boolean => {\n if (isTransportStatusError(error)) return CANCEL_STATUS_CODES.includes(error.statusCode);\n return CANCEL_STATUS_CODES.some((status) => isDeviceApiSwError(error, status.toString(16)));\n};\n\n// `@ledgerhq/errors` classes are created via `createCustomErrorClass`, which sets `error.name` to\n// the class name on every instance. Bundlers (the SDK bundles its own `@ledgerhq/errors`) can\n// produce a second, nominally-distinct copy of these classes, so `instanceof` is unreliable across\n// a package/bundle boundary. Matching on `error.name` accepts instances from any copy, so\n// consumers must use these predicates instead of importing the class and doing `instanceof`\n// themselves.\nconst namedErrorPredicate =\n (name: string) =>\n (error: unknown): boolean =>\n error instanceof Error && error.name === name;\n\n// CantOpenDevice — the transport failed to open, most notably when the user dismisses the WebHID\n// native chooser without selecting a device (surfaced as \"Access denied to use Ledger device\").\n// Used to STOP polling instead of re-opening the chooser forever.\nexport const isCantOpenDeviceError = namedErrorPredicate(\"CantOpenDevice\");\n\n// LockedDeviceError — the device is connected but locked with its PIN.\nexport const isLockedDeviceError = namedErrorPredicate(\"LockedDeviceError\");\n\n// SW_PSK_MISSING (0x6065) — the device-side `start_psk_session` (and any secure-channel APDU\n// transitively relying on a populated PSK) returns this when the NVM record's PSK field is the\n// all-zero sentinel. Used as the trigger to drive the PSK refresh sub-chain mid-operation.\nexport const isPskMissingError = (error: unknown): boolean => {\n return (\n (isTransportStatusError(error) && error.statusCode === 0x6065) ||\n isDeviceApiSwError(error, \"6065\")\n );\n};\n\n// SW_PSK_MISMATCH (0x6067) — `FINALIZE_PSK_REFRESH` returns this when the PSK delivered by the HSM\n// differs from the one already stored for the partition. Because the PSK is static this signals a\n// genuine divergence (e.g. an un-migrated user), so it must surface as an error rather than be\n// retried like SW_PSK_MISSING.\nexport const isPskMismatchError = (error: unknown): boolean => {\n return (\n (isTransportStatusError(error) && error.statusCode === 0x6067) ||\n isDeviceApiSwError(error, \"6067\")\n );\n};\n"],"x_google_ignoreList":[1,2,5,6],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,IAAa,8BAAb,cAAiD,MAAM;CACrD,cAAc;EACZ,MAAM,0BAA0B;EAChC,KAAK,OAAO;CACd;AACF;AAOA,MAAa,iCACX,UAEA,iBAAiB,SAAS,MAAM,SAAS;AAE3C,MAAa,iCAAiC,WAA+B;CAC3E,IAAI,QAAQ,SACV,MAAM,IAAI,4BAA4B;AAE1C;AAEA,MAAa,6BACX,WACA,WACe;CACf,IAAI;EACF,8BAA8B,MAAM;CACtC,SAAS,OAAO;EACd,OAAO,QAAQ,OAAO,KAAK;CAC7B;CACA,IAAI,CAAC,QAAQ,OAAO,QAAQ,QAAQ,CAAC,CAAC,KAAK,SAAS;CAEpD,OAAO,IAAI,SAAY,SAAS,WAAW;EACzC,MAAM,gBAAsB,OAAO,IAAI,4BAA4B,CAAC;EACpE,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EACxD,QAAQ,QAAQ,CAAC,CACd,WAAW;GACV,8BAA8B,MAAM;GACpC,OAAO,UAAU;EACnB,CAAC,CAAC,CACD,KAAK,UAAU,UAAmB;GACjC,OAAO,OAAO,UAAU,IAAI,4BAA4B,IAAI,KAAK;EACnE,CAAC,CAAC,CACD,cAAc,OAAO,oBAAoB,SAAS,OAAO,CAAC;CAC/D,CAAC;AACH;AAEA,MAAa,wBAAwB,OAAe,WAAwC;CAC1F,IAAI;EACF,8BAA8B,MAAM;CACtC,SAAS,OAAO;EACd,OAAO,QAAQ,OAAO,KAAK;CAC7B;CACA,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,UAAU,iBAAiB;GAC/B,QAAQ,oBAAoB,SAAS,OAAO;GAC5C,QAAQ;EACV,GAAG,KAAK;EACR,MAAM,gBAAsB;GAC1B,aAAa,OAAO;GACpB,OAAO,IAAI,4BAA4B,CAAC;EAC1C;EACA,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;CAC3D,CAAC;AACH;;;;CCjEA,MAAM,2BAAW,IAAI,IAAI;EACxB;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,CAAC;CAGD,OAAO,WAAU,UAAS,CAAC,SAAS,IAAI,SAAS,MAAM,IAAI;;ACrC3D,MAAa,YAAY;AACzB,SAAgB,eAAe,OAAO;CAClC,MAAM,oBAAoB,CAAC,gBAAgB,cAAc;CACzD,IAAI,MAAM,UACN,OAAO;CAEX,IAAI,CAAC,MAAM,MACP,OAAO;CAGX,IAAI,kBAAkB,SAAS,MAAM,IAAI,GACrC,OAAO;CAGX,QAAA,GAAOA,wBAAAA,QAAAA,CAAe,KAAK;AAC/B;AACA,MAAM,oBAAoB;CAAC;CAAO;CAAQ;AAAS;AACnD,MAAM,0BAA0B,kBAAkB,OAAO,CAAC,OAAO,QAAQ,CAAC;AAC1E,SAAgB,iBAAiB,OAAO;CACpC,OAAQ,MAAM,SAAS,mBAClB,CAAC,MAAM,YACJ,MAAM,SAAS,WAAW,OACzB,MAAM,SAAS,UAAU,OAAO,MAAM,SAAS,UAAU;AACtE;AACA,SAAgB,mBAAmB,OAAO;CACtC,IAAI,CAAC,MAAM,QAAQ,QAEf,OAAO;CAEX,OAAO,iBAAiB,KAAK,KAAK,kBAAkB,QAAQ,MAAM,OAAO,MAAM,MAAM;AACzF;AACA,SAAgB,yBAAyB,OAAO;CAC5C,IAAI,CAAC,MAAM,QAAQ,QAEf,OAAO;CAEX,OAAO,iBAAiB,KAAK,KAAK,wBAAwB,QAAQ,MAAM,OAAO,MAAM,MAAM;AAC/F;AACA,SAAgB,kCAAkC,OAAO;CACrD,OAAO,eAAe,KAAK,KAAK,yBAAyB,KAAK;AAClE;AACA,SAAgB,WAAW,QAAQ,KAAA,GAAW;CAC1C,MAAM,mBAAmB,OAAO,UAAU,QAAQ;CAClD,IAAI,CAAC,kBACD,OAAO;CAGX,IAAI,gBAAgB,OAAO,gBAAgB,KAAK,KAAK;CAErD,IAAI,iBAAiB,GACjB,gBAAgB,IAAI,KAAK,gBAAgB,CAAC,CAAC,QAAQ,KAAK,KAAK,KAAK,IAAI;CAE1E,OAAO,KAAK,IAAI,GAAG,YAAY;AACnC;AACA,SAAS,QAAQ,eAAe,GAAG,QAAQ,KAAA,GAAW;CAClD,OAAO,KAAK,IAAI,GAAG,WAAW,KAAK,CAAC;AACxC;AACA,SAAgB,iBAAiB,cAAc,GAAG,QAAQ,KAAA,GAAW,cAAc,KAAK;CACpF,MAAM,kBAAkB,KAAK,cAAc;CAC3C,MAAM,QAAQ,KAAK,IAAI,iBAAiB,WAAW,KAAK,CAAC;CAEzD,OAAO,QADW,QAAQ,KAAM,KAAK,OAAO;AAEhD;;;;;;AAMA,SAAgB,YAAY,cAAc,KAAK;CAC3C,QAAQ,cAAc,GAAG,QAAQ,KAAA,MAAc;EAC3C,MAAM,QAAQ,cAAc;EAC5B,OAAO,KAAK,IAAI,OAAO,WAAW,KAAK,CAAC;CAC5C;AACJ;AACA,MAAa,kBAAkB;CAC3B,SAAS;CACT,gBAAgB;CAChB,YAAY;CACZ,oBAAoB;CACpB,eAAe,CAAE;CACjB,+BAA+B,CAAE;CACjC,kBAAkB;AACtB;AACA,SAAS,kBAAkB,QAAQ,gBAAgB;CAC/C,OAAO;EAAE,GAAG;EAAiB,GAAG;EAAgB,GAAG,OAAO;CAAW;AACzE;AACA,SAAS,gBAAgB,QAAQ,gBAAgB,uBAAuB,OAAO;CAC3E,MAAM,eAAe,kBAAkB,QAAQ,kBAAkB,CAAC,CAAC;CACnE,aAAa,aAAa,aAAa,cAAc;CACrD,IAAI,CAAC,aAAa,mBAAmB,sBACjC,aAAa,kBAAkB,KAAK,IAAI;CAE5C,OAAO,aAAa;CACpB,OAAO;AACX;AACA,SAAS,UAAU,eAAe,QAAQ;CAEtC,IAAI,cAAc,SAAS,UAAU,OAAO,OAExC,OAAO,OAAO;CAElB,IAAI,cAAc,SAAS,cAAc,OAAO,WAC5C,OAAO,OAAO;CAElB,IAAI,cAAc,SAAS,eAAe,OAAO,YAC7C,OAAO,OAAO;AAEtB;AACA,eAAe,YAAY,cAAc,OAAO;CAC5C,MAAM,EAAE,SAAS,mBAAmB;CACpC,MAAM,wBAAwB,aAAa,cAAc,KAAK,WAAW,eAAe,KAAK;CAE7F,IAAI,OAAO,yBAAyB,UAChC,IAAI;EAGA,OAAO,MAFgC,yBAEH;CACxC,SACO,MAAM;EACT,OAAO;CACX;CAEJ,OAAO;AACX;AACA,eAAe,YAAY,eAAe,cAAc,OAAO,QAAQ;CACnE,aAAa,cAAc;CAC3B,MAAM,EAAE,YAAY,oBAAoB,YAAY;CACpD,MAAM,QAAQ,WAAW,aAAa,YAAY,KAAK;CAGvD,UAAU,eAAe,MAAM;CAC/B,IAAI,CAAC,sBAAsB,OAAO,WAAW,aAAa,iBAAiB;EACvE,MAAM,sBAAsB,KAAK,IAAI,IAAI,aAAa;EACtD,MAAM,UAAU,OAAO,UAAU,sBAAsB;EACvD,IAAI,WAAW,GACX,OAAO,QAAQ,OAAO,KAAK;EAE/B,OAAO,UAAU;CACrB;CACA,OAAO,mBAAmB,EAAE,SAAS,IAAI;CACzC,MAAM,QAAQ,aAAa,YAAY,OAAO,MAAM;CACpD,IAAI,OAAO,QAAQ,SACf,OAAO,QAAQ,QAAQ,cAAc,MAAM,CAAC;CAEhD,OAAO,IAAI,SAAS,YAAY;EAC5B,MAAM,sBAAsB;GACxB,aAAa,OAAO;GACpB,QAAQ,cAAc,MAAM,CAAC;EACjC;EACA,MAAM,UAAU,iBAAiB;GAC7B,QAAQ,cAAc,MAAM,CAAC;GAC7B,IAAI,OAAO,QAAQ,qBACf,OAAO,OAAO,oBAAoB,SAAS,aAAa;EAEhE,GAAG,KAAK;EACR,IAAI,OAAO,QAAQ,kBACf,OAAO,OAAO,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;CAE7E,CAAC;AACL;AACA,eAAe,4BAA4B,cAAc,OAAO;CAC5D,IAAI,aAAa,cAAc,aAAa,SACxC,MAAM,aAAa,wBAAwB,OAAO,aAAa,UAAU;AACjF;AACA,MAAM,cAAc,eAAe,mBAAmB;CA0BlD,OAAO;EAAE,sBAzBoB,cAAc,aAAa,QAAQ,KAAK,WAAW;GAC5E,gBAAgB,QAAQ,gBAAgB,IAAI;GAC5C,IAAI,OAAA,cAAiB,EAAE,kBAEnB,OAAO,uBAAuB;GAElC,OAAO;EACX,CAkB4B;EAAG,uBAjBD,cAAc,aAAa,SAAS,IAAI,MAAM,OAAO,UAAU;GACzF,MAAM,EAAE,WAAW;GAEnB,IAAI,CAAC,QACD,OAAO,QAAQ,OAAO,KAAK;GAE/B,MAAM,eAAe,gBAAgB,QAAQ,cAAc;GAC3D,IAAI,MAAM,YAAY,aAAa,mBAAmB,MAAM,QAAQ,GAEhE,OAAO,MAAM;GAEjB,IAAI,MAAM,YAAY,cAAc,KAAK,GACrC,OAAO,YAAY,eAAe,cAAc,OAAO,MAAM;GAEjE,MAAM,4BAA4B,cAAc,KAAK;GACrD,OAAO,QAAQ,OAAO,KAAK;EAC/B,CACmD;CAAE;AACzD;AAEA,WAAW,iBAAiB;AAC5B,WAAW,qBAAqB;AAChC,WAAW,2BAA2B;AACtC,WAAW,oCAAoC;AAC/C,WAAW,mBAAmB;AAC9B,WAAW,cAAc;AACzB,WAAW,mBAAmB;;;ACxM9B,MAAa,QAAQ;CACnB,KAAK;CACL,iBAAiB;CACjB,cAAc;CACd,YAAY;AACd;AAIA,MAAa,aAAa;CACxB,cAAc;CACd,yBAAyB;AAC3B;AAEA,MAAa,YAAmE;CAC9E,UAAU;CACV,OAAO;CACP,cAAc;AAChB;AAEA,MAAa,4BACX;AAEF,MAAM,gBAAgB,CAAC;AACvB,KAAK,IAAI,IAAI,OAAQ,KAAK,OAAQ,KAChC,cAAc,KAAK,CAAC;AAGtB,MAAa,mBAAmB;;;ACchC,SAAgB,gBAAgB,SAAkB,QAA2B;CAC3E,MAAM,EAAE,YAAY;CACpB,MAAM,YAAYC,GAAO;CACzB,MAAM,YAAY,MAAM,OAAO,EAAE,SAAS,QAAQ,aAAa,CAAC;CAEhE,WAAW,WAAW;EACpB,YAAY,WAAW,YAAY,GAAI;EACvC,SAAS;;EAET,sBAAsB;EACtB,UAAU,YAAY,QAAQ;GAC5B,MAAM,eAAe,GAAG,IAAI,QAAQ,UAAU,MAAM,IAAI,QAAQ,QAAQ,YAAY,KAAK,iBAAiB,GAAG,IAAI,QAAQ,OAAO;GAChI,OAAO,QACL,2CAA2C,WAAW,aAAa,cACrE;EACF;CAEF,CAAC;;CAGD,UAAU,aAAa,QAAQ,KAC5B,WAAW;EACV,OAAO,MACL,gBAAgB,OAAO,QAAQ,YAAY,EAAE,GAAG,OAAO,MAAM,OAAO,OAAO,IAAI,KAAK,UAAU,OAAO,IAAI,MAAM,IACjH;EACA,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,SAAS,OAAO,MAAO,GAAG;GAG5C,MAAM,eAAe,OAAO,OAAO,SAAS;GAC5C,MAAM,OAAQ,eAAe,KAAK,MAAM,OAAO,IAAI,IAAI,OAAO;GAI9D,MAAM,eAAe;IACnB,WAAW;IACX,WAAW;IACX,SAAS;IACT,GAAG;GACL;GACA,OAAO,OAAO,eAAe,KAAK,UAAU,YAAY,IAAI;EAC9D;EACA,OAAO;CACT,IACC,UAAiB,QAAQ,OAAO,KAAK,CACxC;;CAGA,OAAO,EACL,OAAO,UAA0B;EAC/B,MAAM,SAAS,QAAQ;GAAE,MAAM,QAAQ;GAAM;EAAM,CAAC;EAEpD,MAAM,UAAU,YAA6B;GAC3C,IAAI,OAAO,WAAW,UAAU,OAAO,QAAQ,QAAQ,MAAM;GAC7D,OAAO;EACT;EAEA,MAAM,iBAAiB,OACrB,KACA,MACA,WAEA,gCACS,SAAS,UAAU,KAAQ,KAAK,MAAM,EAAE,OAAO,CAAC,IAAI,UAAU,KAAQ,KAAK,IAAI,GACtF,MACF;EAEF,MAAM,eAAe,OAAO,EAC1B,WACA,oBAIqB;GACrB,MAAM,OAAO,UAAU;GACvB,IAAI,SAAS,qBACX,MAAM,IAAI,MAAM,kDAAkD;GACpE,MAAM,EAAE,SAAS,MAAM,UAAU,KAAa,iBAAiB;IAC7D,MAAM,MAAM,QAAQ;IACpB,WAAW,OAAO,KAAK,UAAU,WAAW,QAAQ,CAAC,CAAC,SAAS,KAAK;IACpE,aAAa;IACb,YAAY,UAAU;IACtB,MAAM,UAAU;IAChB,MAAM,UAAU;IAChB,MAAM;IACN;GACF,CAAC;GACD,OAAO;EACT;EAEA,MAAM,2BAA2B,OAAO,WAGjB;GACrB,MAAM,EAAE,WAAW,gBAAgB;GACnC,MAAM,UAAU;IAAE,MAAM,MAAM,QAAQ;IAAG;IAAW,YAAY;GAAY;GAE5E,QAAO,MADW,UAAU,KAAa,+BAA+B,OAAO,EAAA,CACpE;EACb;EAEA,MAAM,uBAAuB,YAA6B;GACxD,MAAM,UAAU;IACd,MAAM,MAAM,QAAQ;IACpB,MAAM,MAAM;IACZ,MAAM;GACR;GACA,MAAM,EAAE,SAAS,MAAM,UAAU,KAAa,2BAA2B,OAAO;GAChF,OAAO;EACT;EAEA,MAAM,iBAAiB,OACrB,OAAiC,CAAC,MAQ9B;GACJ,MAAM,EAAE,MAAM,mBAAmB,MAAM,eACrC,oBACA,EAAE,MAAM,MAAM,QAAQ,EAAE,GACxB,KAAK,MACP;GACA,MAAM,oBAAoB,OAAO,KAAK,gBAAgB,KAAK;GAC3D,MAAM,UAAU,kBAAkB,SAAS,EAAW;GACtD,OAAO;IACL,aAAa;KACX,UAAU,kBAAkB,MAAM,GAAG,EAAE,CAAC,CAAC,SAAS,QAAQ;KAC1D,gBAAgB,kBAAkB,MAAM,IAAI,EAAO,CAAC,CAAC,SAAS,QAAQ;KACtE,aAAa,kBAAkB,MAAM,IAAS,KAAc,OAAO,CAAC,CAAC,SAAS,QAAQ;IACxF;IACA,QAAQ;GACV;EACF;EAEA,MAAM,wBAAwB,OAC5B,OAAiC,CAAC,MAI9B;GACJ,MAAM,MAAM,MAAM,eAGf,4BAA4B,EAAE,MAAM,MAAM,QAAQ,EAAE,GAAG,KAAK,MAAM;GACrE,OAAO;IACL,8BAA8B,IAAI,KAAK;IACvC,6BAA6B,IAAI,KAAK;GACxC;EACF;EAEA,MAAM,2BAA2B,YAA4D;GAC3F,OAAO,aAAa,EAAE,MAAM,MAAM,gBAAgB,CAAC;EACrD;EAEA,MAAM,kBAAkB,YAA6B;GAInD,QAAO,MAHW,UAAU,KAAiC,mBAAmB,EAC9E,MAAM,MAAM,QAAQ,EACtB,CAAC,EAAA,CACU,KAAK,eAAe,YAAY;EAC7C;EAEA,MAAM,eAAe,YAA4D;GAC/E,OAAO,aAAa,EAAE,MAAM,MAAM,IAAI,CAAC;EACzC;EAEA,MAAM,sBAAsB,YAA4D;GACtF,OAAO,aAAa,EAAE,MAAM,MAAM,WAAW,CAAC;EAChD;EAEA,MAAM,aAAa,OAAO,OAAiC,CAAC,MAA8B;GACxF,MAAM,OAAO,MAAM,QAAQ;GAE3B,KAAI,MADc,eAAyB,sBAAsB,EAAE,KAAK,GAAG,KAAK,MAAM,EAAA,CAC9E,KAAK,WAAW,GAAG,OAAO;GAUlC,QAAO,MALc,eACnB,yBACA,EAAE,KAAK,GACP,KAAK,MACP,EAAA,CACc,KAAK,cAAc,gBAAgB;EACnD;EAEA,MAAM,uBAAuB,OAC3B,OAAiC,CAAC,MACiB;GACnD,MAAM,EAAE,SAAS,MAAM,eACrB,+BACA,EAAE,MAAM,MAAM,QAAQ,EAAE,GACxB,KAAK,MACP;GACA,OAAO;IACL,QAAQ,KAAK;IACb,WAAW,OAAO,KAAK,KAAK,aAAa,KAAK,CAAC,CAAC,SAAS,QAAQ;GACnE;EACF;EAEA,MAAM,cAAc,OAAO,WAEN;GACnB,MAAM,EAAE,kBAAkB;GAC1B,MAAM,YAAY,OAAO,KAAK,cAAc,YAAY,WAAW,QAAQ;GAC3E,MAAM,oBAAoB,OAAO,KAAK,cAAc,YAAY,gBAAgB,QAAQ;GACxF,MAAM,yBAAyB,OAAO,KAAK,cAAc,YAAY,aAAa,QAAQ;GAC1F,MAAM,cAAc,OAAO,OAAO;IAChC,OAAO,KAAK,CAAC,UAAU,MAAM,CAAC;IAC9B;IACA;IACA,OAAO,KAAK,CAAC,uBAAuB,MAAM,CAAC;IAC3C;GACF,CAAC;GACD,MAAM,UAAU;IACd,MAAM,MAAM,QAAQ;IACpB,MAAM,MAAM;IACZ,QAAQ,cAAc;IACtB,aAAa,YAAY,SAAS,KAAK;IACvC,UAAU,WAAW;GACvB;GACA,MAAM,EAAE,MAAM,mBAAmB,MAAM,UAAU,KAAa,iBAAiB,OAAO;GACtF,IAAI,mBAAmB,QACrB,MAAM,IAAI,MAAM,uCAAuC,gBAAgB;EAE3E;EAEA,MAAM,WAAW,OAAO,WAUlB;GACJ,MAAM,EAAE,WAAW,iBAAiB,MAAM,SAAS;GACnD,MAAM,UAAU;IACd,MAAM,MAAM,QAAQ;IACpB;IACA;IACA,MAAM,UAAU;IAChB,UAAU;IACV,MAAM;IACN,aAAa;GACf;GACA,MAAM,EAAE,SAAS,MAAM,UAAU,KAAa,aAAa,OAAO;GAClE,MAAM,WAAW,OAAO,KAAK,MAAM,KAAK;GACxC,IAAI,IAAI;GACR,MAAM,MAAM,SAAS,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;GACrC,KAAK;GACL,MAAM,SAAS,SAAS,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,SAAS,KAAK;GACvD,KAAK;GACL,MAAM,kBAAkB,SAAS,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;GACjD;GACA,MAAM,YAAY,SAAS,MAAM,GAAG,IAAI,eAAe;GACvD,KAAK;GACL,OAAO;IACL,aAAa,SAAS,MAAM,GAAG,SAAS,SAAS,CAAC;IAClD;IACA;IACA;GACF;EACF;EAEA,MAAM,eAAe,OAAO,WAAmD;GAC7E,MAAM,EAAE,cAAc;GACtB,MAAM,UAAU;IAAE,MAAM,MAAM,QAAQ;IAAG;GAAU;GAEnD,QAAO,MADW,UAAU,KAAa,sBAAsB,OAAO,EAAA,CAC3D;EACb;EAEA,MAAM,aAAa,OAAO,EACxB,SACA,aAImB;GACnB,MAAM,UAAU;IACd,MAAM,MAAM,QAAQ;IACpB,MAAM,QAAQ;IACd,SAAS;KACP,mBAAmB,QAAQ,QAAQ;KACnC,eAAe,QAAQ,QAAQ;KAC/B,gBAAgB,QAAQ,QAAQ;IAClC;IACA,2BAA2B;KACzB,WAAW,QAAQ,wBAAwB;KAC3C,iBAAiB,QAAQ,wBAAwB;KACjD,aAAa,QAAQ,wBAAwB;KAC7C,WAAW,QAAQ,wBAAwB;IAC7C;GACF;GACA,MAAM,eAAe,sBAAsB,SAAS,MAAM;EAC5D;EAEA,MAAM,qBAAqB,OAAO,EAChC,cACA,aAIqB;GAMrB,MAAM,EAAE,SAAS,MAAM,eACrB,0BACA;IACE,MAAM,MAAM,QAAQ;IACpB,eAAe;GACjB,GACA,MACF;GACA,OAAO,OAAO,KAAK,MAAM,KAAK,CAAC,CAAC,SAAS,QAAQ;EACnD;EAEA,MAAM,qBAAqB,OACzB,WACkB;GAIlB,MAAM,UAAU;IACd,MAAM,MAAM,QAAQ;IACpB,WAAW,OAAO,KAAK,OAAO,WAAW,QAAQ,CAAC,CAAC,SAAS,KAAK;IACjE,YAAY,OAAO,KAAK,OAAO,yBAAyB,QAAQ,CAAC,CAAC,SAAS,KAAK;GAClF;GACA,MAAM,eAAe,yBAAyB,SAAS,OAAO,MAAM;EACtE;EAEA,MAAM,4BAA4B,OAAO,WAIgB;GACvD,MAAM,UAAU;IACd,MAAM,MAAM,QAAQ;IACpB,WAAW,WAAW;IACtB,WAAW,OAAO;IAElB,uBAAuB;IACvB,cAAc,OAAO;GACvB;GACA,MAAM,EAAE,SAAS,MAAM,UAAU,KAAa,kCAAkC,OAAO;GACvF,MAAM,SAAS,OAAO,KAAK,MAAM,KAAK;GACtC,MAAM,aAAa,OAAO,SAAS,CAAC;GACpC,OAAO;IACL,WAAW,OAAO,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,QAAQ;IAC5D,WAAW,OAAO,MAAM,aAAa,CAAC,CAAC,CAAC,SAAS,QAAQ;GAC3D;EACF;EAEA,MAAM,2BAA2B,OAAO,WAKnB;GACnB,MAAM,EAAE,WAAW,gBAAgB;GACnC,MAAM,UAAU;IACd,MAAM,MAAM,QAAQ;IACpB,WAAW,WAAW;IACtB;IAEA,uBAAuB;IACvB,cAAc;GAChB;GACA,MAAM,EAAE,MAAM,mBAAmB,MAAM,eACrC,iCACA,SACA,OAAO,MACT;GACA,IAAI,mBAAmB,QACrB,MAAM,IAAI,MAAM,uCAAuC,gBAAgB;EAE3E;EAEA,MAAM,kBAAkB,OAAO,WAIV;GACnB,MAAM,EAAE,OAAO,gBAAgB;GAC/B,UACE,MAAM,WAAW,IACjB,kDAAkD,MAAM,OAAO,OACjE;GACA,UACE,YAAY,WAAW,IACvB,oDAAoD,YAAY,OAAO,OACzE;GAIA,MAAM,UAAU;IACd,MAAM,MAAM,QAAQ;IACpB,OAAO,OAAO,KAAK,OAAO,KAAK,CAAC,CAAC,SAAS,QAAQ;IAClD,cAAc,OAAO,KAAK,aAAa,KAAK,CAAC,CAAC,SAAS,QAAQ;GACjE;GACA,MAAM,EAAE,MAAM,mBAAmB,MAAM,eACrC,sBACA,SACA,OAAO,MACT;GACA,IAAI,mBAAmB,QACrB,MAAM,IAAI,MAAM,uCAAuC,gBAAgB;EAE3E;EAEA,MAAM,eAAe,OAAO,WAE0B;GACpD,MAAM,EAAE,SAAS;GAEjB,MAAM,UAAU;IAAE,MAAM,MAAM,QAAQ;IAAG,WAAW;IAAM;GAAK;GAC/D,MAAM,MAAM,MAAM,UAAU,KAAiC,mBAAmB,OAAO;GACvF,OAAO;IACL,QAAQ,IAAI,KAAK;IACjB,WAAW,OAAO,KAAK,IAAI,KAAK,aAAa,KAAK,CAAC,CAAC,SAAS,QAAQ;GACvE;EACF;EAEA,MAAM,yBAAyB,OAAO,WAGf;GACrB,MAAM,EAAE,YAAY;GACpB,MAAM,UAAU;IACd,MAAM,MAAM,QAAQ;IACpB,MAAM,MAAM;IACZ;GACF;GACA,MAAM,EAAE,MAAM,cAAc,MAAM,eAChC,gBACA,SACA,OAAO,MACT;GACA,OAAO;EACT;EAEA,MAAM,YAAY,UAAmC;GACnD,OAAO,KAAK,8CAA8C;GAC1D,OAAO,QAAQ,QAAQ,MAAM;EAC/B;EAEA,MAAM,aAAa,OAAO,OAAiC,CAAC,MAC1D,gCAAgC,QAAQ,QAAQ,OAAO,GAAG,KAAK,MAAM;EAEvE,MAAM,OAAO,OACX,OAAiC,CAAC,MACI;GACtC,MAAM,qBAAqB,KAAK,KAAK,MAAM;GAC3C,OAAO,EAAE,aAAa,KAAK;EAC7B;EAEA,MAAM,UAAU,OACd,OACA,OAAiC,CAAC,MACd;GACpB,MAAM,qBAAqB,KAAK,KAAK,MAAM;GAC3C,OAAO;EACT;EAEA,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;CACF,EACF;AACF;;;ACzhBA,MAAM,eAAe,CAAC;AACtB,MAAM,gBAAgB,CAAC;AACvB,MAAa,8BAA8B,MAAM,iBAAiB;CAC9D,cAAc,QAAQ;AAC1B;AACA,MAAa,0BAA0B,SAAS;CAC5C,MAAM,yBAAyB,MAAM;EACjC;EACA,YAAY,SAAS,QAAQ,SAAS;GAGlC,MAAM,WAAW,MAAM,OAAO;GAE9B,OAAO,eAAe,MAAM,iBAAiB,SAAS;GACtD,KAAK,OAAO;GACZ,IAAI,QACA,KAAK,MAAM,KAAK,QAGZ,KAAK,KAAK,OAAO;GAGzB,IAAI,WAAW,SAAS,OAAO,KAAK,WAAW,WAAW,CAAC,KAAK,OAAO;IAGnE,MAAM,QAAQ,QAAQ;IACtB,KAAK,QAAQ;IACb,IAAI,WAAW,OACX,KAAK,QAAQ,KAAK,QAAQ,cAAc,MAAM;GAEtD;EACJ;CACJ;CACA,aAAa,QAAQ;CACrB,OAAO;AACX;AACA,SAAS,SAAS,OAAO;CACrB,OAAO,OAAO,UAAU;AAC5B;ACxCwC,uBAAuB,qBAAqB;AACjD,uBAAuB,qBAAqB;AAC3B,uBAAuB,sCAAsC;AACnF,uBAAuB,gBAAgB;AACrE,MAAa,oBAAoB,uBAAuB,mBAAmB;AAC5C,uBAAuB,iBAAiB;AACvE,MAAa,iBAAiB,uBAAuB,gBAAgB;AACjC,uBAAuB,sBAAsB;AAC1C,uBAAuB,yBAAyB;AACnD,uBAAuB,sBAAsB;AACtC,uBAAuB,6BAA6B;AAClD,uBAAuB,+BAA+B;AAC9D,uBAAuB,kBAAkB;AACrC,uBAAuB,2BAA2B;AAChD,uBAAuB,6BAA6B;AAC5D,uBAAuB,qBAAqB;AAC/E,MAAa,eAAe,uBAAuB,cAAc;AAChC,uBAAuB,mBAAmB;AAC3C,uBAAuB,kBAAkB;AACjC,uBAAuB,0BAA0B;AACvD,uBAAuB,0BAA0B;AAC5C,uBAAuB,yBAAyB;AACvF,MAAa,qBAAqB,uBAAuB,oBAAoB;AAC5B,uBAAuB,mCAAmC;AAC1D,uBAAuB,mCAAmC;AAC1D,uBAAuB,mCAAmC;AACzE,uBAAuB,eAAe;AAC1B,uBAAuB,gCAAgC;AACvD,uBAAuB,gCAAgC;AACtD,uBAAuB,iCAAiC;AACpE,uBAAuB,qBAAqB;AAC1C,uBAAuB,uBAAuB;AACtD,uBAAuB,eAAe;AACtC,uBAAuB,eAAe;AACrC,uBAAuB,gBAAgB;AAC9B,uBAAuB,yBAAyB;AAC3D,uBAAuB,cAAc;AACL,uBAAuB,8CAA8C;AAC1F,uBAAuB,yBAAyB;AAC1C,uBAAuB,+BAA+B;AAC5D,uBAAuB,yBAAyB;AACtD,uBAAuB,mBAAmB;AACjD,uBAAuB,YAAY;AAC/B,uBAAuB,gBAAgB;AAC5B,uBAAuB,2BAA2B;AACtD,uBAAuB,uBAAuB;AACpC,uBAAuB,4BAA4B;AAC1D,uBAAuB,qBAAqB;AACxC,uBAAuB,8BAA8B;AACnD,uBAAuB,gCAAgC;AAC7D,uBAAuB,qBAAqB;AAClC,uBAAuB,+BAA+B;AAC9D,uBAAuB,uBAAuB;AAClD,uBAAuB,wBAAwB;AAC1D,uBAAuB,aAAa;AACnC,uBAAuB,cAAc;AACjC,uBAAuB,kBAAkB;AACzC,uBAAuB,kBAAkB;AACrC,uBAAuB,sBAAsB;AAC7C,uBAAuB,sBAAsB;AACvC,uBAAuB,4BAA4B;AAC5C,uBAAuB,mCAAmC;AAC1D,uBAAuB,mCAAmC;AACzE,uBAAuB,oBAAoB;AAC3C,uBAAuB,oBAAoB;AAC9B,uBAAuB,iCAAiC;AAC9D,uBAAuB,2BAA2B;AAC/B,uBAAuB,8CAA8C;AACjG,uBAAuB,kBAAkB;AACzC,uBAAuB,kBAAkB;AAC7C,uBAAuB,cAAc;AAEjC,uBAAuB,kBAAkB;AACzC,uBAAuB,kBAAkB;AAChC,uBAAuB,2BAA2B;AAClD,uBAAuB,2BAA2B;AACxD,uBAAuB,qBAAqB;AAC9C,uBAAuB,mBAAmB;AACzC,uBAAuB,oBAAoB;AAClC,uBAAuB,6BAA6B;AACnE,uBAAuB,cAAc;AAC1B,uBAAuB,oBAAoB;AAC5C,uBAAuB,mBAAmB;AACrC,uBAAuB,6BAA6B;AAC1D,uBAAuB,uBAAuB;AACtD,uBAAuB,eAAe;AAC/B,uBAAuB,sBAAsB;AACzC,uBAAuB,0BAA0B;AACxD,uBAAuB,mBAAmB;AACnB,uBAAuB,0CAA0C;AACpE,uBAAuB,uCAAuC;AAChF,uBAAuB,qBAAqB;AAC5C,uBAAuB,qBAAqB;AAC7C,uBAAuB,oBAAoB;AAChD,uBAAuB,eAAe;AACxB,uBAAuB,6BAA6B;AAC7D,uBAAuB,oBAAoB;AACpC,uBAAuB,2BAA2B;AACpD,uBAAuB,yBAAyB;AACpD,uBAAuB,qBAAqB;AACtD,uBAAuB,WAAW;AACzB,uBAAuB,oBAAoB;AACnC,uBAAuB,4BAA4B;AAC7F,MAAa,iCAAiC,uBAAuB,gCAAgC;AAC/D,uBAAuB,wBAAwB;AACrF,MAAa,iCAAiC,uBAAuB,gCAAgC;AACrD,uBAAuB,kCAAkC;AAC5D,uBAAuB,+BAA+B;AAC9D,uBAAuB,uBAAuB;AAC3C,uBAAuB,0BAA0B;AAChD,uBAAuB,2BAA2B;AACtD,uBAAuB,uBAAuB;AACxC,uBAAuB,6BAA6B;AACnD,uBAAuB,8BAA8B;AACtD,uBAAuB,6BAA6B;AAC5D,uBAAuB,qBAAqB;AAC/C,uBAAuB,kBAAkB;AAC3C,uBAAuB,gBAAgB;AACzC,uBAAuB,cAAc;AACjC,uBAAuB,kBAAkB;AAC9C,uBAAuB,aAAa;AACrC,uBAAuB,YAAY;AAC3B,uBAAuB,oBAAoB;AAC9B,uBAAuB,iCAAiC;AACvE,uBAAuB,kBAAkB;AAChD,uBAAuB,WAAW;AAC9B,uBAAuB,eAAe;AACjC,uBAAuB,oBAAoB;AAC3C,uBAAuB,oBAAoB;AACjD,uBAAuB,cAAc;AACrC,uBAAuB,cAAc;AACjE,MAAa,8BAA8B,uBAAuB,6BAA6B;AAE9C,uBAAuB,mCAAmC;AAEtE,uBAAuB,mBAAmB;AACtD,uBAAuB,WAAW;AAEhB,uBAAuB,6BAA6B;AAC1D,uBAAuB,uBAAuB;AACtC,uBAAuB,+BAA+B;AACtD,uBAAuB,+BAA+B;AAC9C,uBAAuB,uCAAuC;AAC3D,uBAAuB,0CAA0C;AAC7E,uBAAuB,8BAA8B;AAEjE,uBAAuB,kBAAkB;AAE5C,uBAAuB,eAAe;AACpC,uBAAuB,iBAAiB;AAC7C,uBAAuB,YAAY;AAC1B,uBAAuB,qBAAqB;AAC9B,uBAAuB,mCAAmC;AACtE,uBAAuB,uBAAuB;;;;AAInF,IAAW;CACV,SAAU,sBAAsB;CAC7B,qBAAqB,aAAa;CAClC,qBAAqB,8BAA8B;CACnD,qBAAqB,kCAAkC;CACvD,qBAAqB,8BAA8B;AACvD,EAAA,CAAG,yBAAyB,uBAAuB,CAAC,EAAE;;;;;AAsBtD,IAAa,iBAAb,cAAoC,MAAM;CACtC;CACA,YAAY,SAAS,IAAI;EACrB,MAAM,OAAO;EACb,MAAM,WAAW,IAAI;EACrB,KAAK,OAAO;EACZ,KAAK,UAAU;EACf,KAAK,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC;EAChC,KAAK,KAAK;CACd;AACJ;AACA,2BAA2B,mBAAkB,MAAK,IAAI,eAAe,EAAE,SAAS,EAAE,EAAE,CAAC;AACrF,MAAa,cAAc;CACvB,gCAAgC;CAChC,yBAAyB;CACzB,mBAAmB;CACnB,8BAA8B;CAC9B,cAAc;CACd,sBAAsB;CACtB,qCAAqC;CACrC,iCAAiC;CACjC,4BAA4B;CAC5B,kCAAkC;CAClC,yBAAyB;CACzB,oBAAoB;CACpB,qBAAqB;CACrB,gBAAgB;CAChB,gBAAgB;CAChB,QAAQ;CACR,mBAAmB;CACnB,gBAAgB;CAChB,kBAAkB;CAClB,iBAAiB;CACjB,mBAAmB;CACnB,sBAAsB;CACtB,wBAAwB;CACxB,aAAa;CACb,gBAAgB;CAChB,WAAW;CACX,eAAe;CACf,mBAAmB;CACnB,gBAAgB;CAChB,4BAA4B;CAC5B,gBAAgB;CAChB,yBAAyB;CACzB,IAAI;CACJ,wBAAwB;CACxB,2BAA2B;CAC3B,+BAA+B;CAC/B,mBAAmB;CACnB,cAAc;CACd,wBAAwB;CACxB,kBAAkB;CAClB,kCAAkC;CAClC,yBAAyB;CACzB,oBAAoB;CACpB,kCAAkC;CAClC,kCAAkC;CAClC,4BAA4B;CAC5B,sBAAsB;CACtB,aAAa;CACb,uBAAuB;CACvB,uBAAuB;CACvB,sBAAsB;CACtB,uBAAuB;CACvB,cAAc;AAClB;AACA,SAAgB,oBAAoB,MAAM;CACtC,QAAQ,MAAR;EAEI,KAAK,OACD,OAAO;EACX,KAAK,OACD,OAAO;EACX,KAAK,OACD,OAAO;EACX,KAAK,OACD,OAAO;EACX,KAAK,OACD,OAAO;EACX,KAAK,OACD,OAAO;EACX,KAAK,OACD,OAAO;EACX,KAAK,OACD,OAAO;CACf;CACA,IAAI,SAAU,QAAQ,QAAQ,OAC1B,OAAO;AAEf;;;;;AAKA,IAAa,uBAAb,MAAa,6BAA6B,MAAM;CAC5C;CACA;;;;;;;CAOA,YAAY,YAAY,EAAE,0BAA0B,SAAS,CAAC,GAAG;EAC7D,MAAM,aAAa,OAAO,KAAK,WAAW,CAAC,CAAC,MAAK,MAAK,YAAY,OAAO,UAAU,KAAK;EAGxF,MAAM,UAAU,kBAFH,oBAAoB,UAAU,KAAK,WAET,MADjB,WAAW,SAAS,EACe,EAAE;EAC3D,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,aAAa;EAClB,KAAK,aAAa;EAClB,OAAO,eAAe,MAAM,qBAAqB,SAAS;EAE1D,IAAI,2BAA2B,eAAe,YAAY,eACtD,OAAO,IAAI,kBAAkB,OAAO;CAE5C;AACJ;AACA,IAAa,oBAAb,MAAa,0BAA0B,qBAAqB;CACxD,YAAY,SAAS;EACjB,MAAM,YAAY,eAAe,EAAE,yBAAyB,MAAM,CAAC;EACnE,IAAI,SACA,KAAK,UAAU;EAEnB,KAAK,OAAO;EACZ,OAAO,eAAe,MAAM,kBAAkB,SAAS;CAC3D;AACJ;AAQA,2BAA2B,yBAAwB,MAAK,IAAI,qBAAqB,EAAE,UAAU,CAAC;;;AC7S9F,MAAM,yBAAyB,UAC7B,WACE,SAAS,iBAAiB,wBAAwB,MAAM,eAAe,QACnE,IAAI,aAAa,MAAM,OAAO,IAC9B,iBAAiB,wBAAwB,MAAM,eAAe,QAC5D,IAAI,4BAA4B,MAAM,OAAO,IAC7C,KACR;AAGF,MAAM,QAAQ,IAAI,cAAc,CAAC,CAAC;AAyBlC,MAAM,UAA6B,CAAC;AAEpC,MAAa,2BAA2B,WAAkC;CACxE,QAAQ,KAAK,MAAM;AACrB;AAEA,MAAa,SAAS,WAAsB,aAAoC;CAC9E,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,IAAI,EAAE,QAAQ,WAAW,QAAQ;EACvC,IAAI,GAAG,OAAO;CAChB;CAEA,OAAO,UAAU,MAAM;AACzB;AAEA,MAAa,QAAQ,aAAyC;CAC5D,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,IAAI,EAAE,KAAK,QAAQ;EACzB,IAAI,GAAG,OAAO;CAChB;CACA,OAAO,QAAQ,uBAAO,IAAI,MAAM,8BAA8B,UAAU,CAAC;AAC3E;AAEA,MAAM,oBACH,aACG,eAEF,WAAW,QAAQ,MAAM;CACvB,IAAI,OAAO;CAGX,MAAM,iBAAsB;EAC1B,IAAI,MAAM,OAAO;EACjB,OAAO;EACP,OAAO,QAAQ;CACjB;CAEA,MAAM,MAAM,WAAW,UAAU;EAC/B,OAAO,MAAM,EAAE,KAAK,CAAC;EACrB,gBAAgB;GACd,SAAc,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC;EACzC;EACA,QAAQ,MAAM;GACZ,SAAc,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;EACvC;CACF,CAAC;CACD,aAAa;EACX,IAAI,YAAY;EAChB,SAAc;CAChB;AACF,CAAC;AAIL,MAAM,cAA4B,CAAC;AAEnC,MAAM,eAAe,CAAC;AAEtB,MAAa,cACV,cACG,QACF,IAAI,YAAY,MAAM;CAEpB,IAAI;CAEJ,IAAI;CAEJ,MAAM,cAAc,aAAa,aAAa,QAAQ,QAAQ;CAG9D,MAAM,YAAY,WAAW,aAC3B,MAAM,WAAW,QAAQ,CAAC,CAEvB,YAAY,CAAC,CAAC,CAAC,CACf,WAAW;EAEV,SAAS,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC;CAIL,IAAI;CAGJ,aAAa,YAAY,IAAI,SAAS,YAAY;EAChD,SAAS;CACX,CAAC;CAED,YACG,WAAW;EAEV,IAAI,cAAc;GAGhB,OAAO;GACP;EACF;EACA,OAAO,KAAK,QAAQ;CACtB,CAAC,CAAC,CAED,KAAK,OAAO,cAAc;EACzB,IAAI,CAAC,WAAW;EAGhB,IAAI,cAGF,OAAO,SAAS,WAAW,CAAC,MAAM,CAAC;EAGrC,IACE,UAAU,6BACV,OAAO,UAAU,8BAA8B,YAE/C,MAAM,UAAU,0BAA0B,MAAM;EAGlD,OAAO;CACT,CAAC,CAAC,CAED,OAAO,MAAM;EAEZ,OAAO;EACP,IAAI,aAAa,mBAAmB,MAAM;EAC1C,IAAI,aAAa,gCAAgC,MAAM;EACvD,IAAI,aAAa,gCAAgC,MAAM;EACvD,MAAM,IAAI,eAAe,EAAE,OAAO;CACpC,CAAC,CAAC,CAED,MAAM,cAAc;EACnB,IAAI,CAAC,WAAW;EAGhB,IAAI,cAGF,OAAO,SAAS,WAAW,CAAC,MAAM,CAAC;EAGrC,MAAM,WAAW,YAAY,KAAK,SAAS,KAAK,CAAC;EACjD,MAAM,IAAI,SAAS,CAAC,CACjB,KACC,WAAW,qBAAqB,GAEhC,uBAEE,SAAS,WAAW,CAAC,GAAG,UAAU,MAAM,CAAC,CAC3C,CACF,CAAC,CACA,UAAU,CAAC;CAChB,CAAC,CAAC,CAED,OAAO,UAAU,EAAE,MAAM,KAAK,CAAC;CAClC,aAAa;EACX,eAAe;EAEf,IAAI,KAAK,IAAI,YAAY;CAC3B;AACF,CAAC;AAEL,MAAM,4BAA4B;AAElC,MAAa,oBACV,iBAEA,aACC,SAAS,KACP,UAAU,UAAU;CAClB,IAAI,CAAC,YAAY,KAAK,GACpB,OAAO,WAAW,KAAK;CAGzB,OAAO,MAAM,yBAAyB;AACxC,CAAC,CACH;AAEJ,MAAa,qBACV,cAEC,KACA,oBAA8C,UAE9C,WAAW,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,iBAAiB,WAAW,CAAC,CAAC;;;AC9O3E,MAAa,0BAA0B,UAAkD;CACvF,OACE,iBAAiB,wBAChB,iBAAiB,SAAS,gBAAgB,SAAS,MAAM,QAAQ,WAAW,gBAAgB;AAEjG;AAEA,MAAM,sBAAsB;CAC1B;CAGA;CACA;CACA;CACA;CACA;CACA;AACF;AAIA,MAAM,sBAAsB,OAAgB,OAAwB;CAClE,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,EAAE,cAAc,QAAQ,OAAO;CAClF,MAAM,EAAE,aAAa;CACrB,IAAI,OAAO,aAAa,YAAY,aAAa,QAAQ,EAAE,UAAU,WAAW,OAAO;CACvF,MAAM,EAAE,SAAS;CACjB,IAAI,OAAO,SAAS,YAAY,SAAS,MAAM,OAAO;CACtD,MAAM,SAAS,QACb,OAAO,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,OAAQ,IAAyB,OAAO;CAC7F,OAAO,MAAM,IAAI,KAAK,MAAO,KAA4B,IAAI;AAC/D;AAEA,MAAa,uBAAuB,UAA0B;CAC5D,IAAI,uBAAuB,KAAK,GAAG,OAAO,oBAAoB,SAAS,MAAM,UAAU;CACvF,OAAO,oBAAoB,MAAM,WAAW,mBAAmB,OAAO,OAAO,SAAS,EAAE,CAAC,CAAC;AAC5F;AAQA,MAAM,uBACH,UACA,UACC,iBAAiB,SAAS,MAAM,SAAS;AAK7C,MAAa,wBAAwB,oBAAoB,gBAAgB;AAGzE,MAAa,sBAAsB,oBAAoB,mBAAmB;AAK1E,MAAa,qBAAqB,UAA4B;CAC5D,OACG,uBAAuB,KAAK,KAAK,MAAM,eAAe,SACvD,mBAAmB,OAAO,MAAM;AAEpC;AAMA,MAAa,sBAAsB,UAA4B;CAC7D,OACG,uBAAuB,KAAK,KAAK,MAAM,eAAe,SACvD,mBAAmB,OAAO,MAAM;AAEpC"}
|
|
1
|
+
{"version":3,"file":"device-CcE29Cid.js","names":["isRetryAllowed","uuidv4"],"sources":["../src/device/abort.ts","../../../node_modules/.pnpm/is-retry-allowed@2.2.0/node_modules/is-retry-allowed/index.js","../../../node_modules/.pnpm/axios-retry@4.5.0_axios@1.20.0/node_modules/axios-retry/dist/esm/index.js","../src/device/constants.ts","../src/device/api-device.ts","../../../node_modules/.pnpm/@ledgerhq+errors@6.36.0/node_modules/@ledgerhq/errors/lib-es/helpers.js","../../../node_modules/.pnpm/@ledgerhq+errors@6.36.0/node_modules/@ledgerhq/errors/lib-es/index.js","../src/device/device-access.ts","../src/device/utils.ts"],"sourcesContent":["/** Error returned when the application aborts a device operation. */\nexport class DeviceOperationAbortedError extends Error {\n constructor() {\n super(\"Device operation aborted\");\n this.name = \"DeviceOperationAbortedError\";\n }\n}\n\nexport type DeviceOperationOptions = {\n /** Stops this operation when the application no longer owns the interaction. */\n signal?: AbortSignal;\n};\n\nexport const isDeviceOperationAbortedError = (\n error: unknown,\n): error is DeviceOperationAbortedError =>\n error instanceof Error && error.name === \"DeviceOperationAbortedError\";\n\nexport const throwIfDeviceOperationAborted = (signal?: AbortSignal): void => {\n if (signal?.aborted) {\n throw new DeviceOperationAbortedError();\n }\n};\n\nexport const withDeviceOperationSignal = <T>(\n operation: () => Promise<T>,\n signal?: AbortSignal,\n): Promise<T> => {\n try {\n throwIfDeviceOperationAborted(signal);\n } catch (error) {\n return Promise.reject(error);\n }\n if (!signal) return Promise.resolve().then(operation);\n\n return new Promise<T>((resolve, reject) => {\n const onAbort = (): void => reject(new DeviceOperationAbortedError());\n signal.addEventListener(\"abort\", onAbort, { once: true });\n Promise.resolve()\n .then(() => {\n throwIfDeviceOperationAborted(signal);\n return operation();\n })\n .then(resolve, (error: unknown) => {\n reject(signal.aborted ? new DeviceOperationAbortedError() : error);\n })\n .finally(() => signal.removeEventListener(\"abort\", onAbort));\n });\n};\n\nexport const deviceOperationDelay = (delay: number, signal?: AbortSignal): Promise<void> => {\n try {\n throwIfDeviceOperationAborted(signal);\n } catch (error) {\n return Promise.reject(error);\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delay);\n const onAbort = (): void => {\n clearTimeout(timeout);\n reject(new DeviceOperationAbortedError());\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n};\n","'use strict';\n\nconst denyList = new Set([\n\t'ENOTFOUND',\n\t'ENETUNREACH',\n\n\t// SSL errors from https://github.com/nodejs/node/blob/fc8e3e2cdc521978351de257030db0076d79e0ab/src/crypto/crypto_common.cc#L301-L328\n\t'UNABLE_TO_GET_ISSUER_CERT',\n\t'UNABLE_TO_GET_CRL',\n\t'UNABLE_TO_DECRYPT_CERT_SIGNATURE',\n\t'UNABLE_TO_DECRYPT_CRL_SIGNATURE',\n\t'UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY',\n\t'CERT_SIGNATURE_FAILURE',\n\t'CRL_SIGNATURE_FAILURE',\n\t'CERT_NOT_YET_VALID',\n\t'CERT_HAS_EXPIRED',\n\t'CRL_NOT_YET_VALID',\n\t'CRL_HAS_EXPIRED',\n\t'ERROR_IN_CERT_NOT_BEFORE_FIELD',\n\t'ERROR_IN_CERT_NOT_AFTER_FIELD',\n\t'ERROR_IN_CRL_LAST_UPDATE_FIELD',\n\t'ERROR_IN_CRL_NEXT_UPDATE_FIELD',\n\t'OUT_OF_MEM',\n\t'DEPTH_ZERO_SELF_SIGNED_CERT',\n\t'SELF_SIGNED_CERT_IN_CHAIN',\n\t'UNABLE_TO_GET_ISSUER_CERT_LOCALLY',\n\t'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\n\t'CERT_CHAIN_TOO_LONG',\n\t'CERT_REVOKED',\n\t'INVALID_CA',\n\t'PATH_LENGTH_EXCEEDED',\n\t'INVALID_PURPOSE',\n\t'CERT_UNTRUSTED',\n\t'CERT_REJECTED',\n\t'HOSTNAME_MISMATCH'\n]);\n\n// TODO: Use `error?.code` when targeting Node.js 14\nmodule.exports = error => !denyList.has(error && error.code);\n","import isRetryAllowed from 'is-retry-allowed';\nexport const namespace = 'axios-retry';\nexport function isNetworkError(error) {\n const CODE_EXCLUDE_LIST = ['ERR_CANCELED', 'ECONNABORTED'];\n if (error.response) {\n return false;\n }\n if (!error.code) {\n return false;\n }\n // Prevents retrying timed out & cancelled requests\n if (CODE_EXCLUDE_LIST.includes(error.code)) {\n return false;\n }\n // Prevents retrying unsafe errors\n return isRetryAllowed(error);\n}\nconst SAFE_HTTP_METHODS = ['get', 'head', 'options'];\nconst IDEMPOTENT_HTTP_METHODS = SAFE_HTTP_METHODS.concat(['put', 'delete']);\nexport function isRetryableError(error) {\n return (error.code !== 'ECONNABORTED' &&\n (!error.response ||\n error.response.status === 429 ||\n (error.response.status >= 500 && error.response.status <= 599)));\n}\nexport function isSafeRequestError(error) {\n if (!error.config?.method) {\n // Cannot determine if the request can be retried\n return false;\n }\n return isRetryableError(error) && SAFE_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\nexport function isIdempotentRequestError(error) {\n if (!error.config?.method) {\n // Cannot determine if the request can be retried\n return false;\n }\n return isRetryableError(error) && IDEMPOTENT_HTTP_METHODS.indexOf(error.config.method) !== -1;\n}\nexport function isNetworkOrIdempotentRequestError(error) {\n return isNetworkError(error) || isIdempotentRequestError(error);\n}\nexport function retryAfter(error = undefined) {\n const retryAfterHeader = error?.response?.headers['retry-after'];\n if (!retryAfterHeader) {\n return 0;\n }\n // if the retry after header is a number, convert it to milliseconds\n let retryAfterMs = (Number(retryAfterHeader) || 0) * 1000;\n // If the retry after header is a date, get the number of milliseconds until that date\n if (retryAfterMs === 0) {\n retryAfterMs = (new Date(retryAfterHeader).valueOf() || 0) - Date.now();\n }\n return Math.max(0, retryAfterMs);\n}\nfunction noDelay(_retryNumber = 0, error = undefined) {\n return Math.max(0, retryAfter(error));\n}\nexport function exponentialDelay(retryNumber = 0, error = undefined, delayFactor = 100) {\n const calculatedDelay = 2 ** retryNumber * delayFactor;\n const delay = Math.max(calculatedDelay, retryAfter(error));\n const randomSum = delay * 0.2 * Math.random(); // 0-20% of the delay\n return delay + randomSum;\n}\n/**\n * Linear delay\n * @param {number | undefined} delayFactor - delay factor in milliseconds (default: 100)\n * @returns {function} (retryNumber: number, error: AxiosError | undefined) => number\n */\nexport function linearDelay(delayFactor = 100) {\n return (retryNumber = 0, error = undefined) => {\n const delay = retryNumber * delayFactor;\n return Math.max(delay, retryAfter(error));\n };\n}\nexport const DEFAULT_OPTIONS = {\n retries: 3,\n retryCondition: isNetworkOrIdempotentRequestError,\n retryDelay: noDelay,\n shouldResetTimeout: false,\n onRetry: () => { },\n onMaxRetryTimesExceeded: () => { },\n validateResponse: null\n};\nfunction getRequestOptions(config, defaultOptions) {\n return { ...DEFAULT_OPTIONS, ...defaultOptions, ...config[namespace] };\n}\nfunction setCurrentState(config, defaultOptions, resetLastRequestTime = false) {\n const currentState = getRequestOptions(config, defaultOptions || {});\n currentState.retryCount = currentState.retryCount || 0;\n if (!currentState.lastRequestTime || resetLastRequestTime) {\n currentState.lastRequestTime = Date.now();\n }\n config[namespace] = currentState;\n return currentState;\n}\nfunction fixConfig(axiosInstance, config) {\n // @ts-ignore\n if (axiosInstance.defaults.agent === config.agent) {\n // @ts-ignore\n delete config.agent;\n }\n if (axiosInstance.defaults.httpAgent === config.httpAgent) {\n delete config.httpAgent;\n }\n if (axiosInstance.defaults.httpsAgent === config.httpsAgent) {\n delete config.httpsAgent;\n }\n}\nasync function shouldRetry(currentState, error) {\n const { retries, retryCondition } = currentState;\n const shouldRetryOrPromise = (currentState.retryCount || 0) < retries && retryCondition(error);\n // This could be a promise\n if (typeof shouldRetryOrPromise === 'object') {\n try {\n const shouldRetryPromiseResult = await shouldRetryOrPromise;\n // keep return true unless shouldRetryPromiseResult return false for compatibility\n return shouldRetryPromiseResult !== false;\n }\n catch (_err) {\n return false;\n }\n }\n return shouldRetryOrPromise;\n}\nasync function handleRetry(axiosInstance, currentState, error, config) {\n currentState.retryCount += 1;\n const { retryDelay, shouldResetTimeout, onRetry } = currentState;\n const delay = retryDelay(currentState.retryCount, error);\n // Axios fails merging this configuration to the default configuration because it has an issue\n // with circular structures: https://github.com/mzabriskie/axios/issues/370\n fixConfig(axiosInstance, config);\n if (!shouldResetTimeout && config.timeout && currentState.lastRequestTime) {\n const lastRequestDuration = Date.now() - currentState.lastRequestTime;\n const timeout = config.timeout - lastRequestDuration - delay;\n if (timeout <= 0) {\n return Promise.reject(error);\n }\n config.timeout = timeout;\n }\n config.transformRequest = [(data) => data];\n await onRetry(currentState.retryCount, error, config);\n if (config.signal?.aborted) {\n return Promise.resolve(axiosInstance(config));\n }\n return new Promise((resolve) => {\n const abortListener = () => {\n clearTimeout(timeout);\n resolve(axiosInstance(config));\n };\n const timeout = setTimeout(() => {\n resolve(axiosInstance(config));\n if (config.signal?.removeEventListener) {\n config.signal.removeEventListener('abort', abortListener);\n }\n }, delay);\n if (config.signal?.addEventListener) {\n config.signal.addEventListener('abort', abortListener, { once: true });\n }\n });\n}\nasync function handleMaxRetryTimesExceeded(currentState, error) {\n if (currentState.retryCount >= currentState.retries)\n await currentState.onMaxRetryTimesExceeded(error, currentState.retryCount);\n}\nconst axiosRetry = (axiosInstance, defaultOptions) => {\n const requestInterceptorId = axiosInstance.interceptors.request.use((config) => {\n setCurrentState(config, defaultOptions, true);\n if (config[namespace]?.validateResponse) {\n // by setting this, all HTTP responses will be go through the error interceptor first\n config.validateStatus = () => false;\n }\n return config;\n });\n const responseInterceptorId = axiosInstance.interceptors.response.use(null, async (error) => {\n const { config } = error;\n // If we have no information to retry the request\n if (!config) {\n return Promise.reject(error);\n }\n const currentState = setCurrentState(config, defaultOptions);\n if (error.response && currentState.validateResponse?.(error.response)) {\n // no issue with response\n return error.response;\n }\n if (await shouldRetry(currentState, error)) {\n return handleRetry(axiosInstance, currentState, error, config);\n }\n await handleMaxRetryTimesExceeded(currentState, error);\n return Promise.reject(error);\n });\n return { requestInterceptorId, responseInterceptorId };\n};\n// Compatibility with CommonJS\naxiosRetry.isNetworkError = isNetworkError;\naxiosRetry.isSafeRequestError = isSafeRequestError;\naxiosRetry.isIdempotentRequestError = isIdempotentRequestError;\naxiosRetry.isNetworkOrIdempotentRequestError = isNetworkOrIdempotentRequestError;\naxiosRetry.exponentialDelay = exponentialDelay;\naxiosRetry.linearDelay = linearDelay;\naxiosRetry.isRetryableError = isRetryableError;\nexport default axiosRetry;\n","export const PATHS = {\n U2F: \"5655636'/5583430'\",\n CONFIDENTIALITY: \"5655636'/4410950'\",\n KEY_MATERIAL: \"5655636'/4932953'\",\n VALIDATION: \"5655636'/5652812'\",\n} as const;\n\nexport const STATUS_LENGTH = 2;\n\nexport const SCRIPT_IDS = {\n INIT_SESSION: 3,\n ACCOUNT_MANAGER_SESSION: 2,\n} as const;\n\nexport const STR_ROLES: Record<\"OPERATOR\" | \"ADMIN\" | \"SHARED_OWNER\", string> = {\n OPERATOR: \"00\",\n ADMIN: \"01\",\n SHARED_OWNER: \"02\",\n} as const;\n\nexport const APPID_VAULT_ADMINISTRATOR =\n \"ad5be1a1fe011ce7f53ae081a22ae000a42021f3f94106a3bac9f76e8230e4b9\";\n\nconst all61xxStatus = [];\nfor (let i = 0x6100; i <= 0x61ff; i++) {\n all61xxStatus.push(i);\n}\n\nexport const PAGINATED_STATUS = all61xxStatus;\nexport const STREAMING_RESPONSE = 0x02;\nexport const STREAMING_NEXT_ACTION = 0x01;\n","import type {\n HsmCertificate,\n PsdAuthChallengeResponse,\n PsdPairingData,\n PubKey,\n RefreshPskData,\n} from \"@ledgerhq/revault-api\";\nimport axios from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport invariant from \"invariant\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport type { Logger } from \"@/logger\";\n\nimport { deviceOperationDelay, withDeviceOperationSignal } from \"./abort\";\nimport { APPID_VAULT_ADMINISTRATOR, PATHS, SCRIPT_IDS, STR_ROLES } from \"./constants\";\nimport type { Device, PairingStatus } from \"./types\";\n\ntype Options = {\n /**\n * device-api URL\n */\n deviceApiUrl: string;\n\n /**\n * salt used by device-api\n */\n salt: string;\n\n /**\n * seed generation function used for device-api device spawn\n */\n genSeed: (p: { salt: string; index: number }) => string | Promise<string>;\n};\n\nexport type ApiDevice = {\n /**\n * bind a device to the given device index\n */\n with: (index: number) => Device;\n};\n\nexport function createApiDevice(options: Options, logger: Logger): ApiDevice {\n const { genSeed } = options;\n const sessionId = uuidv4();\n const deviceApi = axios.create({ baseURL: options.deviceApiUrl });\n\n axiosRetry(deviceApi, {\n retryDelay: axiosRetry.linearDelay(1000),\n retries: 3,\n /* v8 ignore start -- @preserve */\n retryCondition: () => true,\n onRetry: (retryCount, err) => {\n const formattedErr = `${err.code ?? `UNKNOWN`} on ${err.config?.method?.toUpperCase() ?? \"UNKNOWN_METHOD\"} ${err.config?.url ?? \"UNKNOWN_URL\"}`;\n logger.warning(\n `Retrying request to device-api (attempt ${retryCount}) - Cause: ${formattedErr}`,\n );\n },\n /* v8 ignore stop */\n });\n\n /* v8 ignore start -- @preserve */\n deviceApi.interceptors.request.use(\n (config) => {\n logger.debug(\n `[device-api] ${config.method?.toUpperCase()} ${config.url}${config.data ? ` ${JSON.stringify(config.data)}` : \"\"}`,\n );\n if ([\"post\", \"put\"].includes(config.method!)) {\n // when interceptor is called in combination with axios-retry, config.data can be a string or an object\n // and we should return either a string or an object compatible with the original type\n const isStringMode = typeof config.data === \"string\";\n const data = (isStringMode ? JSON.parse(config.data) : config.data) as Record<\n string,\n unknown\n >;\n const enhancedData = {\n sessionID: sessionId, // Used to ensure dedicated session if someones else uses same seed\n psd_model: \"02\", // Stax\n version: 3, // Used to properly enable noise channel\n ...data,\n };\n config.data = isStringMode ? JSON.stringify(enhancedData) : enhancedData;\n }\n return config;\n },\n (error: Error) => Promise.reject(error),\n );\n /* v8 ignore stop */\n\n return {\n with: (index: number): Device => {\n const __seed = genSeed({ salt: options.salt, index });\n\n const getSeed = async (): Promise<string> => {\n if (typeof __seed === \"string\") return Promise.resolve(__seed);\n return __seed;\n };\n\n const postWithSignal = async <T>(\n url: string,\n data: unknown,\n signal?: AbortSignal,\n ): Promise<{ data: T }> =>\n withDeviceOperationSignal(\n () => (signal ? deviceApi.post<T>(url, data, { signal }) : deviceApi.post<T>(url, data)),\n signal,\n );\n\n const authenticate = async ({\n challenge,\n workspaceName,\n }: {\n challenge: PsdAuthChallengeResponse;\n workspaceName: string;\n }): Promise<string> => {\n const role = challenge.role;\n if (role === \"READ_ONLY_API_KEY\")\n throw new Error(\"Invalid role for authenticate: READ_ONLY_API_KEY\");\n const { data } = await deviceApi.post<string>(\"/authenticate\", {\n seed: await getSeed(),\n challenge: Buffer.from(challenge.challenge, \"base64\").toString(\"hex\"),\n application: APPID_VAULT_ADMINISTRATOR,\n key_handle: challenge.keyHandle,\n name: challenge.name,\n role: STR_ROLES[role],\n type: \"02\", // Stax\n workspaceName,\n });\n return data;\n };\n\n const finalizePairingHandshake = async (params: {\n handshake: string;\n partitionId: string;\n }): Promise<string> => {\n const { handshake, partitionId } = params;\n const payload = { seed: await getSeed(), handshake, ciphertext: partitionId };\n const res = await deviceApi.post<string>(\"/finalize-pairing-handshake\", payload);\n return res.data;\n };\n\n const generateSeedFragment = async (): Promise<string> => {\n const payload = {\n seed: await getSeed(),\n path: PATHS.KEY_MATERIAL,\n goal: 0, // seed fragment\n };\n const { data } = await deviceApi.post<string>(\"/generate-key-component\", payload);\n return data;\n };\n\n const getAttestation = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{\n attestation: {\n codeHash: string;\n attestationPub: string;\n certificate: string;\n };\n buffer: Buffer;\n }> => {\n const { data: attestationStr } = await postWithSignal<string>(\n \"/get-attestation\",\n { seed: await getSeed() },\n opts.signal,\n );\n const attestationBuffer = Buffer.from(attestationStr, \"hex\");\n const certLen = attestationBuffer.readInt8(32 + 65 + 1);\n return {\n attestation: {\n codeHash: attestationBuffer.slice(0, 32).toString(\"base64\"),\n attestationPub: attestationBuffer.slice(32, 32 + 65).toString(\"base64\"),\n certificate: attestationBuffer.slice(32 + 65, 32 + 65 + 2 + certLen).toString(\"base64\"),\n },\n buffer: attestationBuffer,\n };\n };\n\n const getConfidentialityKey = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{\n confidentialityKeyCurve25519: string;\n confidentialityKeySignature: string;\n }> => {\n const res = await postWithSignal<{\n confidentiality_key_curve25519: string;\n confidentiality_key_signature: string;\n }>(\"/get-confidentiality-key\", { seed: await getSeed() }, opts.signal);\n return {\n confidentialityKeyCurve25519: res.data.confidentiality_key_curve25519,\n confidentialityKeySignature: res.data.confidentiality_key_signature,\n };\n };\n\n const getConfidentialityPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.CONFIDENTIALITY });\n };\n\n const getDeviceUserId = async (): Promise<string> => {\n const res = await deviceApi.post<{ blue_device_id: string }>(\"/blue-device-id\", {\n seed: await getSeed(),\n });\n return res.data.blue_device_id.toUpperCase();\n };\n\n const getU2FPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.U2F });\n };\n\n const getValidationPubKey = async (): Promise<{ pubKey: string; signature: string }> => {\n return getPublicKey({ path: PATHS.VALIDATION });\n };\n\n const hasPairing = async (opts: { signal?: AbortSignal } = {}): Promise<PairingStatus> => {\n const seed = await getSeed();\n const res = await postWithSignal<string[]>(\"/get-partition-ids\", { seed }, opts.signal);\n if (res.data.length === 0) return \"NO_PAIRING\";\n // A pairing exists; ask device-api whether its PSK slot is populated. Mirrors the firmware\n // returning SW_PSK_MISSING from GET_PARTITION_IDS when the NVM PSK is the all-zero sentinel.\n // POST (not GET) so the body carries `seed` and the interceptor-injected `sessionID`,\n // letting device-api resolve THIS session's device instead of its global current device.\n const status = await postWithSignal<{ partition_id: string | null; psk_missing: boolean }>(\n \"/partition-psk-status\",\n { seed },\n opts.signal,\n );\n return status.data.psk_missing ? \"PSK_MISSING\" : \"OK\";\n };\n\n const initPairingHandshake = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{ pubKey: string; signature: string }> => {\n const { data } = await postWithSignal<{ attestation: string; pubKey: string }>(\n \"/initiate-pairing-handshake\",\n { seed: await getSeed() },\n opts.signal,\n );\n return {\n pubKey: data.pubKey,\n signature: Buffer.from(data.attestation, \"hex\").toString(\"base64\"),\n };\n };\n\n const openSession = async (params: {\n secureChannel: { pubKey: PubKey; certificate: HsmCertificate };\n }): Promise<void> => {\n const { secureChannel } = params;\n const signature = Buffer.from(secureChannel.certificate.signature, \"base64\");\n const attestationPubKey = Buffer.from(secureChannel.certificate.attestationPub, \"base64\");\n const attestationCertificate = Buffer.from(secureChannel.certificate.certificate, \"base64\");\n const attestation = Buffer.concat([\n Buffer.from([signature.length]),\n signature,\n attestationPubKey,\n Buffer.from([attestationCertificate.length]),\n attestationCertificate,\n ]);\n const payload = {\n seed: await getSeed(),\n path: PATHS.CONFIDENTIALITY,\n pubKey: secureChannel.pubKey,\n attestation: attestation.toString(\"hex\"),\n scriptId: SCRIPT_IDS.INIT_SESSION,\n };\n const { data: deviceResponse } = await deviceApi.post<string>(\"/open-session\", payload);\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const register = async (params: {\n challenge: string;\n u2fRegisterData: string;\n name: string;\n role: \"ADMIN\" | \"SHARED_OWNER\" | \"OPERATOR\";\n }): Promise<{\n u2fRegister: Buffer;\n keyHandle: Buffer;\n rfu: number;\n pubKey: string;\n }> => {\n const { challenge, u2fRegisterData, name, role } = params;\n const payload = {\n seed: await getSeed(),\n challenge,\n name,\n role: STR_ROLES[role],\n hsm_data: u2fRegisterData,\n type: \"02\", // Stax\n application: APPID_VAULT_ADMINISTRATOR,\n };\n const { data } = await deviceApi.post<string>(\"/register\", payload);\n const response = Buffer.from(data, \"hex\");\n let i = 0;\n const rfu = response.slice(i, i + 1)[0]!;\n i += 1;\n const pubKey = response.slice(i, i + 65).toString(\"hex\");\n i += 65;\n const keyHandleLength = response.slice(i, i + 1)[0]!;\n i++;\n const keyHandle = response.slice(i, i + keyHandleLength);\n i += keyHandleLength;\n return {\n u2fRegister: response.slice(0, response.length - 2),\n keyHandle,\n rfu,\n pubKey,\n };\n };\n\n const registerData = async (params: { challenge: string }): Promise<string> => {\n const { challenge } = params;\n const payload = { seed: await getSeed(), challenge };\n const res = await deviceApi.post<string>(\"/u2f-register-data\", payload);\n return res.data;\n };\n\n const setPairing = async ({\n pairing,\n signal,\n }: {\n pairing: PsdPairingData;\n signal?: AbortSignal;\n }): Promise<void> => {\n const payload = {\n seed: await getSeed(),\n blob: pairing.blob,\n pairing: {\n bootstrap_enabled: pairing.pairing.bootstrapEnabled,\n partition_key: pairing.pairing.partitionKey,\n workspace_name: pairing.pairing.workspaceName,\n },\n partition_key_attestation: {\n code_hash: pairing.partitionKeyAttestation.codeHash,\n attestation_pub: pairing.partitionKeyAttestation.attestationPub,\n certificate: pairing.partitionKeyAttestation.certificate,\n signature: pairing.partitionKeyAttestation.signature,\n },\n };\n await postWithSignal(\"/set-partition-key\", payload, signal);\n };\n\n const signRefreshPskAuth = async ({\n ephemeralKey,\n signal,\n }: {\n ephemeralKey: string;\n signal?: AbortSignal;\n }): Promise<string> => {\n // Mirrors the firmware's SIGN_REFRESH_PSK_AUTH (`0x55`). The firmware signs over the\n // ephemeral it captured at INITIALIZE_NN_HANDSHAKE; the stateless device-api has no such\n // capture, so we pass the framed ephemeral (hex, from initPairingHandshake) back here.\n // The endpoint returns the DER signature as raw hex; convert to base64 to match the proxy's\n // base64 `validation_key_signature` field.\n const { data } = await postWithSignal<string>(\n \"/sign-refresh-psk-auth\",\n {\n seed: await getSeed(),\n ephemeral_key: ephemeralKey,\n },\n signal,\n );\n return Buffer.from(data, \"hex\").toString(\"base64\");\n };\n\n const finalizePskRefresh = async (\n params: RefreshPskData & { signal?: AbortSignal },\n ): Promise<void> => {\n // Mirrors the firmware's FINALIZE_PSK_REFRESH handler. device-api takes only the NN\n // `handshake` and the encrypted PairingPayload `ciphertext`, both hex — no attestation\n // (it doesn't verify the HSM endorsement). The proxy hands us base64, so convert to hex.\n const payload = {\n seed: await getSeed(),\n handshake: Buffer.from(params.handshake, \"base64\").toString(\"hex\"),\n ciphertext: Buffer.from(params.encryptedPairingPayload, \"base64\").toString(\"hex\"),\n };\n await postWithSignal(\"/finalize-psk-refresh\", payload, params.signal);\n };\n\n const startKKPatternAsResponder = async (params: {\n handshake: string;\n handshakeAttestation: HsmCertificate;\n partitionId: string;\n }): Promise<{ handshake: string; signature: string }> => {\n const payload = {\n seed: await getSeed(),\n script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,\n handshake: params.handshake,\n // for device-api it's normal to have empty string as handshake_attestation\n handshake_attestation: \"\",\n partition_id: params.partitionId,\n };\n const { data } = await deviceApi.post<string>(\"/start-kk-pattern-as-responder\", payload);\n const buffer = Buffer.from(data, \"hex\");\n const dataLength = buffer.readInt8(0);\n return {\n handshake: buffer.slice(1, dataLength + 1).toString(\"base64\"),\n signature: buffer.slice(dataLength + 1).toString(\"base64\"),\n };\n };\n\n const startKPatternAsResponder = async (params: {\n handshake: string;\n handshakeAttestation: HsmCertificate;\n partitionId: string;\n signal?: AbortSignal;\n }): Promise<void> => {\n const { handshake, partitionId } = params;\n const payload = {\n seed: await getSeed(),\n script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,\n handshake,\n // for device-api it's normal to have empty string as handshake_attestation\n handshake_attestation: \"\",\n partition_id: partitionId,\n };\n const { data: deviceResponse } = await postWithSignal<string>(\n \"/start-k-pattern-as-responder\",\n payload,\n params.signal,\n );\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const startPskSession = async (params: {\n nonce: string;\n partitionId: string;\n signal?: AbortSignal;\n }): Promise<void> => {\n const { nonce, partitionId } = params;\n invariant(\n nonce.length === 64,\n `PSK nonce must be 32 bytes (64 hex chars), got ${nonce.length} chars`,\n );\n invariant(\n partitionId.length === 32,\n `partitionId must be 16 bytes (32 hex chars), got ${partitionId.length} chars`,\n );\n // Mirrors firmware START_PSK_SESSION. Unlike the hex-decoded k-pattern route, the\n // device-api /start-psk-session base64-decodes nonce + partition_id, so convert the\n // challenge's hex strings to base64 here.\n const payload = {\n seed: await getSeed(),\n nonce: Buffer.from(nonce, \"hex\").toString(\"base64\"),\n partition_id: Buffer.from(partitionId, \"hex\").toString(\"base64\"),\n };\n const { data: deviceResponse } = await postWithSignal<string>(\n \"/start-psk-session\",\n payload,\n params.signal,\n );\n if (deviceResponse !== \"9000\") {\n throw new Error(`device-api device failed with code: ${deviceResponse}`);\n }\n };\n\n const getPublicKey = async (params: {\n path: string;\n }): Promise<{ pubKey: string; signature: string }> => {\n const { path } = params;\n type DeviceApiGetPubKeyResponse = { attestation: string; pubKey: string };\n const payload = { seed: await getSeed(), secp256k1: true, path };\n const res = await deviceApi.post<DeviceApiGetPubKeyResponse>(\"/get-public-key\", payload);\n return {\n pubKey: res.data.pubKey,\n signature: Buffer.from(res.data.attestation, \"hex\").toString(\"base64\"),\n };\n };\n\n const validateVaultOperation = async (params: {\n actions: string[];\n signal?: AbortSignal;\n }): Promise<string> => {\n const { actions } = params;\n const payload = {\n seed: await getSeed(),\n path: PATHS.VALIDATION,\n actions,\n };\n const { data: signature } = await postWithSignal<string>(\n \"/validate-op\",\n payload,\n params.signal,\n );\n return signature;\n };\n\n const sendAPDU = (_apdu: string): Promise<string> => {\n logger.info(\"Can't send arbitrary APDU to software device\");\n return Promise.resolve(\"9000\");\n };\n\n const getVersion = async (opts: { signal?: AbortSignal } = {}): Promise<string> =>\n withDeviceOperationSignal(() => Promise.resolve(\"1.2.3\"), opts.signal);\n\n const poll = async (\n opts: { signal?: AbortSignal } = {},\n ): Promise<{ isAppOpened: boolean }> => {\n await deviceOperationDelay(1e3, opts.signal);\n return { isAppOpened: true };\n };\n\n const pollApp = async (\n _name: string,\n opts: { signal?: AbortSignal } = {},\n ): Promise<string> => {\n await deviceOperationDelay(1e3, opts.signal);\n return \"9000\";\n };\n\n return {\n authenticate,\n finalizePairingHandshake,\n generateSeedFragment,\n getAttestation,\n getConfidentialityKey,\n getConfidentialityPubKey,\n getDeviceUserId,\n getU2FPubKey,\n getValidationPubKey,\n hasPairing,\n initPairingHandshake,\n openSession,\n register,\n registerData,\n setPairing,\n signRefreshPskAuth,\n finalizePskRefresh,\n startKKPatternAsResponder,\n startKPatternAsResponder,\n startPskSession,\n validateVaultOperation,\n getVersion,\n sendAPDU,\n poll,\n pollApp,\n };\n },\n };\n}\n","/* eslint-disable no-continue */\n/* eslint-disable no-unused-vars */\n/* eslint-disable no-param-reassign */\n/* eslint-disable no-prototype-builtins */\nconst errorClasses = {};\nconst deserializers = {};\nexport const addCustomErrorDeserializer = (name, deserializer) => {\n deserializers[name] = deserializer;\n};\nexport const createCustomErrorClass = (name) => {\n class CustomErrorClass extends Error {\n cause;\n constructor(message, fields, options) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n super(message || name, options);\n // Set the prototype explicitly. See https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, CustomErrorClass.prototype);\n this.name = name;\n if (fields) {\n for (const k in fields) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this[k] = fields[k];\n }\n }\n if (options && isObject(options) && \"cause\" in options && !this.cause) {\n // .cause was specified but the superconstructor\n // did not create an instance property.\n const cause = options.cause;\n this.cause = cause;\n if (\"stack\" in cause) {\n this.stack = this.stack + \"\\nCAUSE: \" + cause.stack;\n }\n }\n }\n }\n errorClasses[name] = CustomErrorClass;\n return CustomErrorClass;\n};\nfunction isObject(value) {\n return typeof value === \"object\";\n}\n// inspired from https://github.com/programble/errio/blob/master/index.js\nexport const deserializeError = (object) => {\n if (object && typeof object === \"object\") {\n try {\n if (typeof object.message === \"string\") {\n const msg = JSON.parse(object.message);\n if (msg.message && msg.name) {\n object = msg;\n }\n }\n }\n catch {\n // nothing\n }\n let error;\n if (typeof object.name === \"string\") {\n const { name } = object;\n const des = deserializers[name];\n if (des) {\n error = des(object);\n }\n else {\n let constructor = name === \"Error\" ? Error : errorClasses[name];\n if (!constructor) {\n console.warn(\"deserializing an unknown class '\" + name + \"'\");\n constructor = createCustomErrorClass(name);\n }\n error = Object.create(constructor.prototype);\n try {\n for (const prop in object) {\n if (object.hasOwnProperty(prop)) {\n error[prop] = object[prop];\n }\n }\n }\n catch {\n // sometimes setting a property can fail (e.g. .name)\n }\n }\n }\n else {\n if (typeof object.message === \"string\") {\n error = new Error(object.message);\n }\n }\n // captureStackTrace is V8/Node-specific and not in @types/node\n const Err = Error;\n if (error && !error.stack && Err.captureStackTrace) {\n Err.captureStackTrace(error, deserializeError);\n }\n return error;\n }\n return new Error(String(object));\n};\n// inspired from https://github.com/sindresorhus/serialize-error/blob/master/index.js\nexport const serializeError = (value) => {\n if (!value)\n return value;\n if (typeof value === \"object\") {\n return destroyCircular(value, []);\n }\n if (typeof value === \"function\") {\n return `[Function: ${value.name || \"anonymous\"}]`;\n }\n return value;\n};\n// https://www.npmjs.com/package/destroy-circular\nfunction destroyCircular(from, seen) {\n const to = {};\n seen.push(from);\n for (const key of Object.keys(from)) {\n const value = from[key];\n if (typeof value === \"function\") {\n continue;\n }\n if (!value || typeof value !== \"object\") {\n to[key] = value;\n continue;\n }\n if (seen.indexOf(from[key]) === -1) {\n to[key] = destroyCircular(from[key], seen.slice(0));\n continue;\n }\n to[key] = \"[Circular]\";\n }\n if (typeof from.name === \"string\") {\n to.name = from.name;\n }\n if (typeof from.message === \"string\") {\n to.message = from.message;\n }\n if (typeof from.stack === \"string\") {\n to.stack = from.stack;\n }\n return to;\n}\n//# sourceMappingURL=helpers.js.map","import { serializeError, deserializeError, createCustomErrorClass, addCustomErrorDeserializer, } from \"./helpers\";\nexport { serializeError, deserializeError, createCustomErrorClass, addCustomErrorDeserializer };\nexport const AccountNameRequiredError = createCustomErrorClass(\"AccountNameRequired\");\nexport const AccountNotSupported = createCustomErrorClass(\"AccountNotSupported\");\nexport const AccountAwaitingSendPendingOperations = createCustomErrorClass(\"AccountAwaitingSendPendingOperations\");\nexport const AmountRequired = createCustomErrorClass(\"AmountRequired\");\nexport const BluetoothRequired = createCustomErrorClass(\"BluetoothRequired\");\nexport const BtcUnmatchedApp = createCustomErrorClass(\"BtcUnmatchedApp\");\nexport const CantOpenDevice = createCustomErrorClass(\"CantOpenDevice\");\nexport const CashAddrNotSupported = createCustomErrorClass(\"CashAddrNotSupported\");\nexport const ClaimRewardsFeesWarning = createCustomErrorClass(\"ClaimRewardsFeesWarning\");\nexport const CurrencyNotSupported = createCustomErrorClass(\"CurrencyNotSupported\");\nexport const DeviceAppVerifyNotSupported = createCustomErrorClass(\"DeviceAppVerifyNotSupported\");\nexport const DeviceGenuineSocketEarlyClose = createCustomErrorClass(\"DeviceGenuineSocketEarlyClose\");\nexport const DeviceNotGenuineError = createCustomErrorClass(\"DeviceNotGenuine\");\nexport const DeviceOnDashboardExpected = createCustomErrorClass(\"DeviceOnDashboardExpected\");\nexport const DeviceOnDashboardUnexpected = createCustomErrorClass(\"DeviceOnDashboardUnexpected\");\nexport const DeviceInOSUExpected = createCustomErrorClass(\"DeviceInOSUExpected\");\nexport const DeviceHalted = createCustomErrorClass(\"DeviceHalted\");\nexport const DeviceNameInvalid = createCustomErrorClass(\"DeviceNameInvalid\");\nexport const DeviceSocketFail = createCustomErrorClass(\"DeviceSocketFail\");\nexport const DeviceSocketNoBulkStatus = createCustomErrorClass(\"DeviceSocketNoBulkStatus\");\nexport const DeviceNeedsRestart = createCustomErrorClass(\"DeviceSocketNoBulkStatus\");\nexport const UnresponsiveDeviceError = createCustomErrorClass(\"UnresponsiveDeviceError\");\nexport const DisconnectedDevice = createCustomErrorClass(\"DisconnectedDevice\");\nexport const DisconnectedDeviceDuringOperation = createCustomErrorClass(\"DisconnectedDeviceDuringOperation\");\nexport const DeviceExtractOnboardingStateError = createCustomErrorClass(\"DeviceExtractOnboardingStateError\");\nexport const DeviceOnboardingStatePollingError = createCustomErrorClass(\"DeviceOnboardingStatePollingError\");\nexport const EnpointConfigError = createCustomErrorClass(\"EnpointConfig\");\nexport const EthAppPleaseEnableContractData = createCustomErrorClass(\"EthAppPleaseEnableContractData\");\nexport const SolAppPleaseEnableContractData = createCustomErrorClass(\"SolAppPleaseEnableContractData\");\nexport const CeloAppPleaseEnableContractData = createCustomErrorClass(\"CeloAppPleaseEnableContractData\");\nexport const FeeEstimationFailed = createCustomErrorClass(\"FeeEstimationFailed\");\nexport const FirmwareNotRecognized = createCustomErrorClass(\"FirmwareNotRecognized\");\nexport const HardResetFail = createCustomErrorClass(\"HardResetFail\");\nexport const InvalidXRPTag = createCustomErrorClass(\"InvalidXRPTag\");\nexport const InvalidAddress = createCustomErrorClass(\"InvalidAddress\");\nexport const InvalidTransactionError = createCustomErrorClass(\"InvalidTransactionError\");\nexport const InvalidNonce = createCustomErrorClass(\"InvalidNonce\");\nexport const InvalidAddressBecauseDestinationIsAlsoSource = createCustomErrorClass(\"InvalidAddressBecauseDestinationIsAlsoSource\");\nexport const LatestMCUInstalledError = createCustomErrorClass(\"LatestMCUInstalledError\");\nexport const LatestFirmwareVersionRequired = createCustomErrorClass(\"LatestFirmwareVersionRequired\");\nexport const UnsupportedFeatureError = createCustomErrorClass(\"UnsupportedFeatureError\");\nexport const NanoSNotSupported = createCustomErrorClass(\"NanoSNotSupported\");\nexport const UnknownMCU = createCustomErrorClass(\"UnknownMCU\");\nexport const LedgerAPIError = createCustomErrorClass(\"LedgerAPIError\");\nexport const LedgerAPIErrorWithMessage = createCustomErrorClass(\"LedgerAPIErrorWithMessage\");\nexport const LedgerAPINotAvailable = createCustomErrorClass(\"LedgerAPINotAvailable\");\nexport const ManagerAppAlreadyInstalledError = createCustomErrorClass(\"ManagerAppAlreadyInstalled\");\nexport const ManagerAppRelyOnBTCError = createCustomErrorClass(\"ManagerAppRelyOnBTC\");\nexport const ManagerAppDepInstallRequired = createCustomErrorClass(\"ManagerAppDepInstallRequired\");\nexport const ManagerAppDepUninstallRequired = createCustomErrorClass(\"ManagerAppDepUninstallRequired\");\nexport const ManagerDeviceLockedError = createCustomErrorClass(\"ManagerDeviceLocked\");\nexport const ManagerFirmwareNotEnoughSpaceError = createCustomErrorClass(\"ManagerFirmwareNotEnoughSpace\");\nexport const ManagerNotEnoughSpaceError = createCustomErrorClass(\"ManagerNotEnoughSpace\");\nexport const ManagerUninstallBTCDep = createCustomErrorClass(\"ManagerUninstallBTCDep\");\nexport const NetworkDown = createCustomErrorClass(\"NetworkDown\");\nexport const NetworkError = createCustomErrorClass(\"NetworkError\");\nexport const NoAddressesFound = createCustomErrorClass(\"NoAddressesFound\");\nexport const NotEnoughBalance = createCustomErrorClass(\"NotEnoughBalance\");\nexport const NotEnoughBalanceFees = createCustomErrorClass(\"NotEnoughBalanceFees\");\nexport const NotEnoughBalanceSwap = createCustomErrorClass(\"NotEnoughBalanceSwap\");\nexport const NotEnoughBalanceToDelegate = createCustomErrorClass(\"NotEnoughBalanceToDelegate\");\nexport const UnstakeNotEnoughStakedBalanceLeft = createCustomErrorClass(\"UnstakeNotEnoughStakedBalanceLeft\");\nexport const RestakeNotEnoughStakedBalanceLeft = createCustomErrorClass(\"RestakeNotEnoughStakedBalanceLeft\");\nexport const NotEnoughToRestake = createCustomErrorClass(\"NotEnoughToRestake\");\nexport const NotEnoughToUnstake = createCustomErrorClass(\"NotEnoughToUnstake\");\nexport const NotEnoughBalanceInParentAccount = createCustomErrorClass(\"NotEnoughBalanceInParentAccount\");\nexport const NotEnoughSpendableBalance = createCustomErrorClass(\"NotEnoughSpendableBalance\");\nexport const NotEnoughBalanceBecauseDestinationNotCreated = createCustomErrorClass(\"NotEnoughBalanceBecauseDestinationNotCreated\");\nexport const NotEnoughToStake = createCustomErrorClass(\"NotEnoughToStake\");\nexport const NoAccessToCamera = createCustomErrorClass(\"NoAccessToCamera\");\nexport const NotEnoughGas = createCustomErrorClass(\"NotEnoughGas\");\n// Error message specifically for the PTX swap flow\nexport const NotEnoughGasSwap = createCustomErrorClass(\"NotEnoughGasSwap\");\nexport const TronEmptyAccount = createCustomErrorClass(\"TronEmptyAccount\");\nexport const MaybeKeepTronAccountAlive = createCustomErrorClass(\"MaybeKeepTronAccountAlive\");\nexport const NotSupportedLegacyAddress = createCustomErrorClass(\"NotSupportedLegacyAddress\");\nexport const GasLessThanEstimate = createCustomErrorClass(\"GasLessThanEstimate\");\nexport const PriorityFeeTooLow = createCustomErrorClass(\"PriorityFeeTooLow\");\nexport const PriorityFeeTooHigh = createCustomErrorClass(\"PriorityFeeTooHigh\");\nexport const PriorityFeeHigherThanMaxFee = createCustomErrorClass(\"PriorityFeeHigherThanMaxFee\");\nexport const MaxFeeTooLow = createCustomErrorClass(\"MaxFeeTooLow\");\nexport const PasswordsDontMatchError = createCustomErrorClass(\"PasswordsDontMatch\");\nexport const PasswordIncorrectError = createCustomErrorClass(\"PasswordIncorrect\");\nexport const RecommendSubAccountsToEmpty = createCustomErrorClass(\"RecommendSubAccountsToEmpty\");\nexport const RecommendUndelegation = createCustomErrorClass(\"RecommendUndelegation\");\nexport const TimeoutTagged = createCustomErrorClass(\"TimeoutTagged\");\nexport const UnexpectedBootloader = createCustomErrorClass(\"UnexpectedBootloader\");\nexport const MCUNotGenuineToDashboard = createCustomErrorClass(\"MCUNotGenuineToDashboard\");\nexport const RecipientRequired = createCustomErrorClass(\"RecipientRequired\");\nexport const UnavailableTezosOriginatedAccountReceive = createCustomErrorClass(\"UnavailableTezosOriginatedAccountReceive\");\nexport const UnavailableTezosOriginatedAccountSend = createCustomErrorClass(\"UnavailableTezosOriginatedAccountSend\");\nexport const UpdateFetchFileFail = createCustomErrorClass(\"UpdateFetchFileFail\");\nexport const UpdateIncorrectHash = createCustomErrorClass(\"UpdateIncorrectHash\");\nexport const UpdateIncorrectSig = createCustomErrorClass(\"UpdateIncorrectSig\");\nexport const UpdateYourApp = createCustomErrorClass(\"UpdateYourApp\");\nexport const UserRefusedDeviceNameChange = createCustomErrorClass(\"UserRefusedDeviceNameChange\");\nexport const UserRefusedAddress = createCustomErrorClass(\"UserRefusedAddress\");\nexport const UserRefusedFirmwareUpdate = createCustomErrorClass(\"UserRefusedFirmwareUpdate\");\nexport const UserRefusedAllowManager = createCustomErrorClass(\"UserRefusedAllowManager\");\nexport const UserRefusedOnDevice = createCustomErrorClass(\"UserRefusedOnDevice\"); // TODO rename because it's just for transaction refusal\nexport const PinNotSet = createCustomErrorClass(\"PinNotSet\");\nexport const ExpertModeRequired = createCustomErrorClass(\"ExpertModeRequired\");\nexport const TransportOpenUserCancelled = createCustomErrorClass(\"TransportOpenUserCancelled\");\nexport const TransportInterfaceNotAvailable = createCustomErrorClass(\"TransportInterfaceNotAvailable\");\nexport const TransportRaceCondition = createCustomErrorClass(\"TransportRaceCondition\");\nexport const TransportWebUSBGestureRequired = createCustomErrorClass(\"TransportWebUSBGestureRequired\");\nexport const TransactionHasBeenValidatedError = createCustomErrorClass(\"TransactionHasBeenValidatedError\");\nexport const TransportExchangeTimeoutError = createCustomErrorClass(\"TransportExchangeTimeoutError\");\nexport const DeviceShouldStayInApp = createCustomErrorClass(\"DeviceShouldStayInApp\");\nexport const WebsocketConnectionError = createCustomErrorClass(\"WebsocketConnectionError\");\nexport const WebsocketConnectionFailed = createCustomErrorClass(\"WebsocketConnectionFailed\");\nexport const WrongDeviceForAccount = createCustomErrorClass(\"WrongDeviceForAccount\");\nexport const WrongDeviceForAccountPayout = createCustomErrorClass(\"WrongDeviceForAccountPayout\");\nexport const MissingSwapPayloadParamaters = createCustomErrorClass(\"MissingSwapPayloadParamaters\");\nexport const WrongDeviceForAccountRefund = createCustomErrorClass(\"WrongDeviceForAccountRefund\");\nexport const WrongAppForCurrency = createCustomErrorClass(\"WrongAppForCurrency\");\nexport const ETHAddressNonEIP = createCustomErrorClass(\"ETHAddressNonEIP\");\nexport const CantScanQRCode = createCustomErrorClass(\"CantScanQRCode\");\nexport const FeeNotLoaded = createCustomErrorClass(\"FeeNotLoaded\");\nexport const FeeNotLoadedSwap = createCustomErrorClass(\"FeeNotLoadedSwap\");\nexport const FeeRequired = createCustomErrorClass(\"FeeRequired\");\nexport const FeeTooHigh = createCustomErrorClass(\"FeeTooHigh\");\nexport const ValAddressRequired = createCustomErrorClass(\"ValAddressRequired\");\nexport const RedelegateDstValAddressRequired = createCustomErrorClass(\"RedelegateDstValAddressRequired\");\nexport const PendingOperation = createCustomErrorClass(\"PendingOperation\");\nexport const SyncError = createCustomErrorClass(\"SyncError\");\nexport const PairingFailed = createCustomErrorClass(\"PairingFailed\");\nexport const PeerRemovedPairing = createCustomErrorClass(\"PeerRemovedPairing\");\nexport const GenuineCheckFailed = createCustomErrorClass(\"GenuineCheckFailed\");\nexport const LedgerAPI4xx = createCustomErrorClass(\"LedgerAPI4xx\");\nexport const LedgerAPI5xx = createCustomErrorClass(\"LedgerAPI5xx\");\nexport const FirmwareOrAppUpdateRequired = createCustomErrorClass(\"FirmwareOrAppUpdateRequired\");\n// SpeedUp / Cancel EVM tx\nexport const ReplacementTransactionUnderpriced = createCustomErrorClass(\"ReplacementTransactionUnderpriced\");\n// Bitcoin family\nexport const OpReturnDataSizeLimit = createCustomErrorClass(\"OpReturnSizeLimit\");\nexport const DustLimit = createCustomErrorClass(\"DustLimit\");\n// Concordium family\nexport const ConcordiumInsufficientFunds = createCustomErrorClass(\"ConcordiumInsufficientFunds\");\nexport const ConcordiumMemoTooLong = createCustomErrorClass(\"ConcordiumMemoTooLong\");\nexport const ConcordiumPairingExpiredError = createCustomErrorClass(\"ConcordiumPairingExpiredError\");\nexport const ConcordiumSessionExpiredError = createCustomErrorClass(\"ConcordiumSessionExpiredError\");\nexport const ConcordiumTrustedMetadataServiceError = createCustomErrorClass(\"ConcordiumTrustedMetadataServiceError\");\nexport const ConcordiumAddressVerificationFailedError = createCustomErrorClass(\"ConcordiumAddressVerificationFailedError\");\nexport const ConcordiumInvalidMaxFeeError = createCustomErrorClass(\"ConcordiumInvalidMaxFeeError\");\n// Language\nexport const LanguageNotFound = createCustomErrorClass(\"LanguageNotFound\");\n// db stuff, no need to translate\nexport const NoDBPathGiven = createCustomErrorClass(\"NoDBPathGiven\");\nexport const DBWrongPassword = createCustomErrorClass(\"DBWrongPassword\");\nexport const DBNotReset = createCustomErrorClass(\"DBNotReset\");\nexport const SequenceNumberError = createCustomErrorClass(\"SequenceNumberError\");\nexport const DisabledTransactionBroadcastError = createCustomErrorClass(\"DisabledTransactionBroadcastError\");\nexport const InvalidParameterError = createCustomErrorClass(\"InvalidParameterError\");\n/**\n * Type of a Transport error used to represent all equivalent errors coming from all possible implementation of Transport\n */\nexport var HwTransportErrorType;\n(function (HwTransportErrorType) {\n HwTransportErrorType[\"Unknown\"] = \"Unknown\";\n HwTransportErrorType[\"LocationServicesDisabled\"] = \"LocationServicesDisabled\";\n HwTransportErrorType[\"LocationServicesUnauthorized\"] = \"LocationServicesUnauthorized\";\n HwTransportErrorType[\"BluetoothScanStartFailed\"] = \"BluetoothScanStartFailed\";\n})(HwTransportErrorType || (HwTransportErrorType = {}));\n/**\n * Represents an error coming from the usage of any Transport implementation.\n *\n * Needed to map a specific implementation error into an error that\n * can be managed by any code unaware of the specific Transport implementation\n * that was used.\n */\nexport class HwTransportError extends Error {\n type;\n constructor(type, message) {\n super(message);\n this.name = \"HwTransportError\";\n this.type = type;\n // Needed as long as we target < ES6\n Object.setPrototypeOf(this, HwTransportError.prototype);\n }\n}\n/**\n * TransportError is used for any generic transport errors.\n * e.g. Error thrown when data received by exchanges are incorrect or if exchanged failed to communicate with the device for various reason.\n */\nexport class TransportError extends Error {\n id;\n constructor(message, id) {\n const name = \"TransportError\";\n super(message || name);\n this.name = name;\n this.message = message;\n this.stack = new Error(message).stack;\n this.id = id;\n }\n}\naddCustomErrorDeserializer(\"TransportError\", e => new TransportError(e.message, e.id));\nexport const StatusCodes = {\n ACCESS_CONDITION_NOT_FULFILLED: 0x9804,\n ALGORITHM_NOT_SUPPORTED: 0x9484,\n CLA_NOT_SUPPORTED: 0x6e00,\n CLA_NOT_SUPPORTED_BOOTLOADER: 0x6e01,\n CODE_BLOCKED: 0x9840,\n CODE_NOT_INITIALIZED: 0x9802,\n COMMAND_INCOMPATIBLE_FILE_STRUCTURE: 0x6981,\n CONDITIONS_OF_USE_NOT_SATISFIED: 0x6985,\n CONTRADICTION_INVALIDATION: 0x9810,\n CONTRADICTION_SECRET_CODE_STATUS: 0x9808,\n DEVICE_IN_RECOVERY_MODE: 0x662f,\n CUSTOM_IMAGE_EMPTY: 0x662e,\n FILE_ALREADY_EXISTS: 0x6a89,\n FILE_NOT_FOUND: 0x9404,\n GP_AUTH_FAILED: 0x6300,\n HALTED: 0x6faa,\n INCONSISTENT_FILE: 0x9408,\n INCORRECT_DATA: 0x6a80,\n INCORRECT_LENGTH: 0x6700,\n INCORRECT_P1_P2: 0x6b00,\n INS_NOT_SUPPORTED: 0x6d00,\n DEVICE_NOT_ONBOARDED: 0x6d07,\n DEVICE_NOT_ONBOARDED_2: 0x6611,\n INVALID_KCV: 0x9485,\n INVALID_OFFSET: 0x9402,\n LICENSING: 0x6f42,\n LOCKED_DEVICE: 0x5515,\n MAX_VALUE_REACHED: 0x9850,\n MEMORY_PROBLEM: 0x9240,\n MISSING_CRITICAL_PARAMETER: 0x6800,\n NO_EF_SELECTED: 0x9400,\n NOT_ENOUGH_MEMORY_SPACE: 0x6a84,\n OK: 0x9000,\n PIN_REMAINING_ATTEMPTS: 0x63c0,\n REFERENCED_DATA_NOT_FOUND: 0x6a88,\n SECURITY_STATUS_NOT_SATISFIED: 0x6982,\n TECHNICAL_PROBLEM: 0x6f00,\n UNKNOWN_APDU: 0x6d02,\n USER_REFUSED_ON_DEVICE: 0x5501,\n NOT_ENOUGH_SPACE: 0x5102,\n APP_NOT_FOUND_OR_INVALID_CONTEXT: 0x5123,\n INVALID_APP_NAME_LENGTH: 0x670a,\n GEN_AES_KEY_FAILED: 0x5419,\n INTERNAL_CRYPTO_OPERATION_FAILED: 0x541a,\n INTERNAL_COMPUTE_AES_CMAC_FAILED: 0x541b,\n ENCRYPT_APP_STORAGE_FAILED: 0x541c,\n INVALID_BACKUP_STATE: 0x6642,\n PIN_NOT_SET: 0x5502,\n INVALID_BACKUP_LENGTH: 0x6733,\n INVALID_RESTORE_STATE: 0x6643,\n INVALID_CHUNK_LENGTH: 0x6734,\n INVALID_BACKUP_HEADER: 0x684a,\n SW_BAD_STATE: 0xb007,\n};\nexport function getAltStatusMessage(code) {\n switch (code) {\n // improve text of most common errors\n case 0x6700:\n return \"Incorrect length\";\n case 0x6800:\n return \"Missing critical parameter\";\n case 0x6982:\n return \"Security not satisfied (dongle locked or have invalid access rights)\";\n case 0x6985:\n return \"Condition of use not satisfied (denied by the user?)\";\n case 0x6a80:\n return \"Invalid data received\";\n case 0x6b00:\n return \"Invalid parameter received\";\n case 0x5515:\n return \"Locked device\";\n case 0xb007:\n return \"Unexpected state on the device\";\n }\n if (0x6f00 <= code && code <= 0x6fff) {\n return \"Internal error, please report\";\n }\n}\n/**\n * Error thrown when a device returned a non success status.\n * the error.statusCode is one of the `StatusCodes` exported by this library.\n */\nexport class TransportStatusError extends Error {\n statusCode;\n statusText;\n /**\n * @param statusCode The error status code coming from a Transport implementation\n * @param options containing:\n * - canBeMappedToChildError: enable the mapping of TransportStatusError to an error extending/inheriting from it\n * . Ex: LockedDeviceError. Default to true.\n */\n constructor(statusCode, { canBeMappedToChildError = true } = {}) {\n const statusText = Object.keys(StatusCodes).find(k => StatusCodes[k] === statusCode) || \"UNKNOWN_ERROR\";\n const smsg = getAltStatusMessage(statusCode) || statusText;\n const statusCodeStr = statusCode.toString(16);\n const message = `Ledger device: ${smsg} (0x${statusCodeStr})`;\n super(message);\n this.name = \"TransportStatusError\";\n this.statusCode = statusCode;\n this.statusText = statusText;\n Object.setPrototypeOf(this, TransportStatusError.prototype);\n // Maps to a LockedDeviceError\n if (canBeMappedToChildError && statusCode === StatusCodes.LOCKED_DEVICE) {\n return new LockedDeviceError(message);\n }\n }\n}\nexport class LockedDeviceError extends TransportStatusError {\n constructor(message) {\n super(StatusCodes.LOCKED_DEVICE, { canBeMappedToChildError: false });\n if (message) {\n this.message = message;\n }\n this.name = \"LockedDeviceError\";\n Object.setPrototypeOf(this, LockedDeviceError.prototype);\n }\n}\nexport class DeviceMangementKitError extends Error {\n constructor(name, message) {\n super(message);\n this.name = name;\n Object.setPrototypeOf(this, DeviceMangementKitError.prototype);\n }\n}\naddCustomErrorDeserializer(\"TransportStatusError\", e => new TransportStatusError(e.statusCode));\n//# sourceMappingURL=index.js.map","// biome-ignore-all lint: outside copy-paste, not worth fixing\n// ------------------------------------------------------------------------------------------------\n// ------------------------------------------------------------------------------------------------\n// THIS IS SOME HORRIBLE CODE IMPORTED JUST\n// FOR THE SAKE OF NOT IMPORTING UGLY, WICKED, AND\n// BROKEN @ledgerhq/live-* LIBRARIES\n//\n// IT'S MEANT TO BE CONSIDERED AS A BLACK BOX\n// ------------------------------------------------------------------------------------------------\n// ------------------------------------------------------------------------------------------------\nimport {\n BluetoothRequired,\n CantOpenDevice,\n DeviceHalted,\n FirmwareOrAppUpdateRequired,\n TransportInterfaceNotAvailable,\n TransportStatusError,\n TransportWebUSBGestureRequired,\n} from \"@ledgerhq/errors\";\nimport type Transport from \"@ledgerhq/hw-transport\";\nimport { Observable, throwError, timer } from \"rxjs\";\nimport { catchError, mergeMap, retryWhen } from \"rxjs/operators\";\n\nconst initialErrorRemapping = (error: Error): Observable<never> =>\n throwError(\n error && error instanceof TransportStatusError && error.statusCode === 0x6faa\n ? new DeviceHalted(error.message)\n : error instanceof TransportStatusError && error.statusCode === 0x6b00\n ? new FirmwareOrAppUpdateRequired(error.message)\n : error,\n );\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst never = new Promise(() => {});\n\ntype Discovery = Observable<{\n type: \"add\" | \"remove\";\n id: string;\n name: string;\n}>;\n\nexport type TransportModule = {\n // unique transport name that identify the transport module\n id: string;\n // open a device by an id, this id must be unique across all modules\n // you can typically prefix it with `something|` that identify it globally\n // returns falsy if the transport module can't handle this id\n // here, open means we want to START doing something with the transport\n open: (id: string) => Promise<Transport> | null | undefined;\n // here, close means we want to STOP doing something with the transport\n close?: (transport: Transport, id: string) => Promise<void> | null | undefined;\n // disconnect/interrupt a device connection globally\n // returns falsy if the transport module can't handle this id\n disconnect: (id: string) => Promise<void> | null | undefined;\n // optional observable that allows to discover a transport\n discovery?: Discovery;\n};\n\nconst modules: TransportModule[] = [];\n\nexport const registerTransportModule = (module: TransportModule): void => {\n modules.push(module);\n};\n\nexport const close = (transport: Transport, deviceId: string): Promise<void> => {\n for (const m of modules) {\n const p = m.close?.(transport, deviceId);\n if (p) return p;\n }\n // fallback on an actual close\n return transport.close();\n};\n\nexport const open = (deviceId: string): Promise<Transport> => {\n for (const m of modules) {\n const p = m.open(deviceId);\n if (p) return p;\n }\n return Promise.reject(new Error(`Can't find handler to open ${deviceId}`));\n};\n\nconst transportFinally =\n (cleanup: () => Promise<void>) =>\n <T>(observable: Observable<T>): Observable<T> =>\n // @ts-expect-error typescript not checking against the instanceof\n Observable.create((o) => {\n let done = false;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const finalize = (): any => {\n if (done) return never;\n done = true;\n return cleanup();\n };\n\n const sub = observable.subscribe({\n next: (e) => o.next(e),\n complete: () => {\n void finalize().then(() => o.complete());\n },\n error: (e) => {\n void finalize().then(() => o.error(e));\n },\n });\n return () => {\n sub.unsubscribe();\n void finalize();\n };\n });\n\ntype AccessHook = () => () => void;\n\nconst accessHooks: AccessHook[] = [];\n\nconst deviceQueues = {};\n\nexport const withDevice =\n (deviceId: string) =>\n <T>(job: (t: Transport) => Observable<T>): Observable<T> =>\n new Observable((o) => {\n // @ts-expect-error typescript not checking against the instanceof\n let unsubscribed;\n // @ts-expect-error typescript not checking against the instanceof\n let sub;\n // @ts-expect-error typescript not checking against the instanceof\n const deviceQueue = deviceQueues[deviceId] ?? Promise.resolve();\n\n // @ts-expect-error typescript not checking against the instanceof\n const finalize = (transport, cleanups): Promise<void> =>\n close(transport, deviceId)\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n .catch(() => {})\n .then(() => {\n // @ts-expect-error typescript not checking against the instanceof\n cleanups.forEach((c) => c());\n });\n\n // when we'll finish all the current job, we'll call finish\n // @ts-expect-error typescript not checking against the instanceof\n let finish;\n // this new promise is the next exec queue\n // @ts-expect-error typescript not checking against the instanceof\n deviceQueues[deviceId] = new Promise((resolve) => {\n finish = resolve;\n });\n // for any new job, we'll now wait the exec queue to be available\n deviceQueue\n .then(() => {\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // Release this queue slot without opening a transport.\n // @ts-expect-error typescript not checking against the instanceof\n finish();\n return;\n }\n return open(deviceId);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .then(async (transport) => {\n if (!transport) return;\n\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // it was unsubscribed prematurely\n // @ts-expect-error typescript not checking against the instanceof\n return finalize(transport, [finish]);\n }\n\n if (\n transport.requestConnectionPriority &&\n typeof transport.requestConnectionPriority === \"function\"\n ) {\n await transport.requestConnectionPriority(\"High\");\n }\n\n return transport;\n })\n // @ts-expect-error typescript not checking against the instanceof\n .catch((e) => {\n // @ts-expect-error typescript not checking against the instanceof\n finish();\n if (e instanceof BluetoothRequired) throw e;\n if (e instanceof TransportWebUSBGestureRequired) throw e;\n if (e instanceof TransportInterfaceNotAvailable) throw e;\n throw new CantOpenDevice(e.message);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .then((transport) => {\n if (!transport) return;\n\n // @ts-expect-error typescript not checking against the instanceof\n if (unsubscribed) {\n // it was unsubscribed prematurely\n // @ts-expect-error typescript not checking against the instanceof\n return finalize(transport, [finish]);\n }\n\n const cleanups = accessHooks.map((hook) => hook());\n sub = job(transport) // $FlowFixMe\n .pipe(\n catchError(initialErrorRemapping),\n // $FlowFixMe\n transportFinally(() =>\n // @ts-expect-error typescript not checking against the instanceof\n finalize(transport, [...cleanups, finish]),\n ),\n )\n .subscribe(o);\n })\n // @ts-expect-error typescript not checking against the instanceof\n .catch((error) => o.error(error));\n return () => {\n unsubscribed = true;\n // @ts-expect-error typescript not checking against the instanceof\n if (sub) sub.unsubscribe();\n };\n });\n\nconst WITH_DEVICE_POLLING_DELAY = 500;\n\nexport const retryWhileErrors =\n (acceptError: (arg0: Error) => boolean) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (attempts: Observable<any>): Observable<any> =>\n attempts.pipe(\n mergeMap((error) => {\n if (!acceptError(error)) {\n return throwError(error);\n }\n\n return timer(WITH_DEVICE_POLLING_DELAY);\n }),\n );\n\nexport const withDevicePolling =\n (deviceId: string) =>\n <T>(\n job: (arg0: Transport) => Observable<T>,\n acceptError: (arg0: Error) => boolean = () => false,\n ): Observable<T> =>\n withDevice(deviceId)(job).pipe(retryWhen(retryWhileErrors(acceptError)));\n","import { TransportStatusError } from \"@ledgerhq/errors\";\n\nexport const isTransportStatusError = (error: unknown): error is TransportStatusError => {\n return (\n error instanceof TransportStatusError ||\n (error instanceof Error && \"statusCode\" in error && error.message.startsWith(\"Ledger device:\"))\n );\n};\n\nconst CANCEL_STATUS_CODES = [\n 0x6985, // cancel on Ledger Blue\n\n // STAX\n 0xb00c, // cancel collect wk fragment\n 0xb00d, // cancel user registration\n 0xb010, // cancel review\n 0xb012, // cancel master seed generation\n 0xb013, // cancel login\n 0x5501, // cancel openApp\n];\n\n// The software device (device-api) surfaces firmware status words as an HTTP 409 whose JSON body\n// carries `{ sw: \"<hex>\" }`. The Web proxy can wrap this body one level below `data`.\nconst isDeviceApiSwError = (error: unknown, sw: string): boolean => {\n if (typeof error !== \"object\" || error === null || !(\"response\" in error)) return false;\n const { response } = error as { response?: unknown };\n if (typeof response !== \"object\" || response === null || !(\"data\" in response)) return false;\n const { data } = response as { data?: unknown };\n if (typeof data !== \"object\" || data === null) return false;\n const hasSw = (obj: unknown): boolean =>\n typeof obj === \"object\" && obj !== null && \"sw\" in obj && (obj as { sw?: unknown }).sw === sw;\n return hasSw(data) || hasSw((data as { data?: unknown }).data);\n};\n\nexport const isDeviceCancelError = (error: Error): boolean => {\n if (isTransportStatusError(error)) return CANCEL_STATUS_CODES.includes(error.statusCode);\n return CANCEL_STATUS_CODES.some((status) => isDeviceApiSwError(error, status.toString(16)));\n};\n\n// `@ledgerhq/errors` classes are created via `createCustomErrorClass`, which sets `error.name` to\n// the class name on every instance. Bundlers (the SDK bundles its own `@ledgerhq/errors`) can\n// produce a second, nominally-distinct copy of these classes, so `instanceof` is unreliable across\n// a package/bundle boundary. Matching on `error.name` accepts instances from any copy, so\n// consumers must use these predicates instead of importing the class and doing `instanceof`\n// themselves.\nconst namedErrorPredicate =\n (name: string) =>\n (error: unknown): boolean =>\n error instanceof Error && error.name === name;\n\n// CantOpenDevice — the transport failed to open, most notably when the user dismisses the WebHID\n// native chooser without selecting a device (surfaced as \"Access denied to use Ledger device\").\n// Used to STOP polling instead of re-opening the chooser forever.\nexport const isCantOpenDeviceError = namedErrorPredicate(\"CantOpenDevice\");\n\n// LockedDeviceError — the device is connected but locked with its PIN.\nexport const isLockedDeviceError = namedErrorPredicate(\"LockedDeviceError\");\n\n// SW_PSK_MISSING (0x6065) — the device-side `start_psk_session` (and any secure-channel APDU\n// transitively relying on a populated PSK) returns this when the NVM record's PSK field is the\n// all-zero sentinel. Used as the trigger to drive the PSK refresh sub-chain mid-operation.\nexport const isPskMissingError = (error: unknown): boolean => {\n return (\n (isTransportStatusError(error) && error.statusCode === 0x6065) ||\n isDeviceApiSwError(error, \"6065\")\n );\n};\n\n// SW_PSK_MISMATCH (0x6067) — `FINALIZE_PSK_REFRESH` returns this when the PSK delivered by the HSM\n// differs from the one already stored for the partition. Because the PSK is static this signals a\n// genuine divergence (e.g. an un-migrated user), so it must surface as an error rather than be\n// retried like SW_PSK_MISSING.\nexport const isPskMismatchError = (error: unknown): boolean => {\n return (\n (isTransportStatusError(error) && error.statusCode === 0x6067) ||\n isDeviceApiSwError(error, \"6067\")\n );\n};\n"],"x_google_ignoreList":[1,2,5,6],"mappings":"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"}
|
package/lib/device.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_device = require("./device-
|
|
2
|
+
const require_device = require("./device-BT5YbF2y.cjs");
|
|
3
3
|
exports.DeviceOperationAbortedError = require_device.DeviceOperationAbortedError;
|
|
4
4
|
exports.createApiDevice = require_device.createApiDevice;
|
|
5
5
|
exports.isCantOpenDeviceError = require_device.isCantOpenDeviceError;
|
package/lib/device.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { _ as DeviceOperationAbortedError, a as isPskMissingError, d as createApiDevice, i as isPskMismatchError, n as isDeviceCancelError, o as isTransportStatusError, r as isLockedDeviceError, s as registerTransportModule, t as isCantOpenDeviceError, y as isDeviceOperationAbortedError } from "./device-
|
|
1
|
+
import { _ as DeviceOperationAbortedError, a as isPskMissingError, d as createApiDevice, i as isPskMismatchError, n as isDeviceCancelError, o as isTransportStatusError, r as isLockedDeviceError, s as registerTransportModule, t as isCantOpenDeviceError, y as isDeviceOperationAbortedError } from "./device-CcE29Cid.js";
|
|
2
2
|
export { DeviceOperationAbortedError, createApiDevice, isCantOpenDeviceError, isDeviceCancelError, isDeviceOperationAbortedError, isLockedDeviceError, isPskMismatchError, isPskMissingError, isTransportStatusError, registerTransportModule };
|
package/lib/engine.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_rolldown_runtime = require("./rolldown-runtime-y5ARvAq5.cjs");
|
|
3
|
-
const require_device = require("./device-
|
|
3
|
+
const require_device = require("./device-BT5YbF2y.cjs");
|
|
4
4
|
const require_utils = require("./utils-qv4hwX4J.cjs");
|
|
5
5
|
let invariant = require("invariant");
|
|
6
6
|
invariant = require_rolldown_runtime.__toESM(invariant, 1);
|
package/lib/engine.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as DeviceOperationAbortedError, a as isPskMissingError, b as throwIfDeviceOperationAborted, c as withDevicePolling, d as createApiDevice, f as APPID_VAULT_ADMINISTRATOR, g as STR_ROLES, h as SCRIPT_IDS, l as DisconnectedDevice, m as PATHS, o as isTransportStatusError, p as PAGINATED_STATUS, u as LockedDeviceError, v as deviceOperationDelay } from "./device-
|
|
1
|
+
import { _ as DeviceOperationAbortedError, a as isPskMissingError, b as throwIfDeviceOperationAborted, c as withDevicePolling, d as createApiDevice, f as APPID_VAULT_ADMINISTRATOR, g as STR_ROLES, h as SCRIPT_IDS, l as DisconnectedDevice, m as PATHS, o as isTransportStatusError, p as PAGINATED_STATUS, u as LockedDeviceError, v as deviceOperationDelay } from "./device-CcE29Cid.js";
|
|
2
2
|
import { i as fetchAllCursor, r as fetchAll, t as buildTrpcContext } from "./utils-CW0gdJME.js";
|
|
3
3
|
import invariant from "invariant";
|
|
4
4
|
import { Observable, from, lastValueFrom } from "rxjs";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/revault-sdk",
|
|
3
|
-
"version": "0.29.
|
|
3
|
+
"version": "0.29.2",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -46,25 +46,25 @@
|
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@ledgerhq/errors": "^6.36.0",
|
|
48
48
|
"@ledgerhq/hw-transport": "^6.35.4",
|
|
49
|
-
"@noble/curves": "^2.
|
|
49
|
+
"@noble/curves": "^2.4.0",
|
|
50
50
|
"@noble/hashes": "^2.3.0",
|
|
51
51
|
"@scure/bip32": "^2.0.1",
|
|
52
52
|
"@scure/bip39": "^2.0.1",
|
|
53
|
-
"@trpc/client": "11.
|
|
54
|
-
"@trpc/server": "11.
|
|
53
|
+
"@trpc/client": "11.19.0",
|
|
54
|
+
"@trpc/server": "11.19.0",
|
|
55
55
|
"asn1.js": "^5.4.1",
|
|
56
|
-
"axios": "^1.
|
|
56
|
+
"axios": "^1.20.0",
|
|
57
57
|
"axios-retry": "^4.5.0",
|
|
58
58
|
"bn.js": "^5.2.3",
|
|
59
59
|
"invariant": "^2.2.4",
|
|
60
|
-
"jose": "^6.2.
|
|
60
|
+
"jose": "^6.2.12",
|
|
61
61
|
"lodash": "^4.18.1",
|
|
62
62
|
"rxjs": "^7.8.2",
|
|
63
63
|
"superjson": "^2.2.6",
|
|
64
64
|
"ts-pattern": "^5.9.0",
|
|
65
|
-
"uuid": "^14.0.
|
|
66
|
-
"zod": "^4.
|
|
67
|
-
"@ledgerhq/revault-api": "1.
|
|
65
|
+
"uuid": "^14.0.2",
|
|
66
|
+
"zod": "^4.6.5",
|
|
67
|
+
"@ledgerhq/revault-api": "1.87.0"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
70
|
"@eslint/js": "^9.39.4",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"eslint": "^9.39.4",
|
|
79
79
|
"eslint-plugin-unicorn": "^62.0.0",
|
|
80
80
|
"tsdown": "^0.22.14",
|
|
81
|
-
"tsx": "^4.23.
|
|
81
|
+
"tsx": "^4.23.13",
|
|
82
82
|
"typescript": "^5.9.3",
|
|
83
83
|
"typescript-eslint": "^8.58.1",
|
|
84
84
|
"vite-plugin-node-polyfills": "^0.26.0",
|