@ledgerhq/revault-sdk 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/lib/bake.cjs +1214 -1361
  2. package/lib/bake.cjs.map +1 -1
  3. package/lib/bake.d.cts +564 -562
  4. package/lib/bake.d.ts +564 -562
  5. package/lib/bake.js +1204 -1359
  6. package/lib/bake.js.map +1 -1
  7. package/lib/chunk-CKQMccvm.cjs +28 -0
  8. package/lib/crypto-BDBF_rfw.cjs +266 -0
  9. package/lib/crypto-BDBF_rfw.cjs.map +1 -0
  10. package/lib/crypto-CPCBrCSZ.js +245 -0
  11. package/lib/crypto-CPCBrCSZ.js.map +1 -0
  12. package/lib/crypto.cjs +5 -11
  13. package/lib/crypto.d.cts +10 -7
  14. package/lib/crypto.d.ts +10 -7
  15. package/lib/crypto.js +2 -11
  16. package/lib/device-0lcfYGHr.cjs +791 -0
  17. package/lib/device-0lcfYGHr.cjs.map +1 -0
  18. package/lib/device-B8Fww8_6.js +719 -0
  19. package/lib/device-B8Fww8_6.js.map +1 -0
  20. package/lib/device.cjs +6 -13
  21. package/lib/device.d.cts +2 -50
  22. package/lib/device.d.ts +2 -50
  23. package/lib/device.js +2 -13
  24. package/lib/engine.cjs +851 -888
  25. package/lib/engine.cjs.map +1 -1
  26. package/lib/engine.d.cts +3 -25
  27. package/lib/engine.d.ts +3 -25
  28. package/lib/engine.js +844 -885
  29. package/lib/engine.js.map +1 -1
  30. package/lib/index--fscLDTT.d.ts +237 -0
  31. package/lib/index-BE7oUpCb.d.cts +237 -0
  32. package/lib/index-DOn7RPPt.d.cts +23 -0
  33. package/lib/index-U0iFMp3g.d.ts +23 -0
  34. package/lib/index.cjs +0 -1
  35. package/lib/index.d.cts +10 -5
  36. package/lib/index.d.ts +10 -5
  37. package/lib/index.js +1 -1
  38. package/lib/logger-Cme0iL1f.d.cts +10 -0
  39. package/lib/logger-DWLViq7U.d.ts +10 -0
  40. package/lib/onboarding.cjs +215 -183
  41. package/lib/onboarding.cjs.map +1 -1
  42. package/lib/onboarding.d.cts +1918 -1722
  43. package/lib/onboarding.d.ts +1918 -1722
  44. package/lib/onboarding.js +211 -181
  45. package/lib/onboarding.js.map +1 -1
  46. package/lib/trpc-CWGPr8Ox.d.ts +20 -0
  47. package/lib/trpc-C_dUOB1u.d.cts +20 -0
  48. package/lib/types-BXkDuD6i.d.ts +207 -0
  49. package/lib/types-CQROu0nu.d.cts +6 -0
  50. package/lib/types-Ngwgtu_U.d.cts +207 -0
  51. package/lib/types-_QeBv1U4.d.ts +6 -0
  52. package/lib/types.cjs +0 -1
  53. package/lib/types.d.cts +3 -4
  54. package/lib/types.d.ts +3 -4
  55. package/lib/types.js +1 -1
  56. package/lib/utils-BGbdjOP9.js +61 -0
  57. package/lib/utils-BGbdjOP9.js.map +1 -0
  58. package/lib/utils-DbSFXp4c.cjs +84 -0
  59. package/lib/utils-DbSFXp4c.cjs.map +1 -0
  60. package/package.json +6 -6
  61. package/lib/chunk-2WGM7EWA.cjs +0 -282
  62. package/lib/chunk-2WGM7EWA.cjs.map +0 -1
  63. package/lib/chunk-AXI72NFY.js +0 -50
  64. package/lib/chunk-AXI72NFY.js.map +0 -1
  65. package/lib/chunk-DRMYBKL3.cjs +0 -820
  66. package/lib/chunk-DRMYBKL3.cjs.map +0 -1
  67. package/lib/chunk-KV5FO7N5.js +0 -282
  68. package/lib/chunk-KV5FO7N5.js.map +0 -1
  69. package/lib/chunk-LH4QQXUH.cjs +0 -50
  70. package/lib/chunk-LH4QQXUH.cjs.map +0 -1
  71. package/lib/chunk-PFZIW6UP.js +0 -820
  72. package/lib/chunk-PFZIW6UP.js.map +0 -1
  73. package/lib/crypto.cjs.map +0 -1
  74. package/lib/crypto.js.map +0 -1
  75. package/lib/device.cjs.map +0 -1
  76. package/lib/device.js.map +0 -1
  77. package/lib/index.cjs.map +0 -1
  78. package/lib/index.js.map +0 -1
  79. package/lib/logger-C-TPbnjv.d.cts +0 -9
  80. package/lib/logger-C-TPbnjv.d.ts +0 -9
  81. package/lib/types-C-ngtI5m.d.ts +0 -202
  82. package/lib/types-CpGEbAxh.d.cts +0 -19
  83. package/lib/types-CpGEbAxh.d.ts +0 -19
  84. package/lib/types-CryvY9pW.d.cts +0 -202
  85. package/lib/types-DJfbanPz.d.cts +0 -167
  86. package/lib/types-DJfbanPz.d.ts +0 -167
  87. package/lib/types.cjs.map +0 -1
  88. package/lib/types.js.map +0 -1
@@ -1,820 +0,0 @@
1
- // src/device/api-device.ts
2
- import axios from "axios";
3
- import axiosRetry from "axios-retry";
4
- import { v4 as uuidv4 } from "uuid";
5
-
6
- // src/device/constants.ts
7
- var PATHS = {
8
- U2F: "5655636'/5583430'",
9
- CONFIDENTIALITY: "5655636'/4410950'",
10
- KEY_MATERIAL: "5655636'/4932953'",
11
- VALIDATION: "5655636'/5652812'"
12
- };
13
- var STATUS_LENGTH = 2;
14
- var SCRIPT_IDS = {
15
- INIT_SESSION: 3,
16
- ACCOUNT_MANAGER_SESSION: 2
17
- };
18
- var STR_ROLES = {
19
- OPERATOR: "00",
20
- ADMIN: "01",
21
- SHARED_OWNER: "02"
22
- };
23
- var APPID_VAULT_ADMINISTRATOR = "ad5be1a1fe011ce7f53ae081a22ae000a42021f3f94106a3bac9f76e8230e4b9";
24
- var all61xxStatus = [];
25
- for (let i = 24832; i <= 25087; i++) {
26
- all61xxStatus.push(i);
27
- }
28
- var PAGINATED_STATUS = all61xxStatus;
29
- var STREAMING_RESPONSE = 2;
30
- var STREAMING_NEXT_ACTION = 1;
31
-
32
- // src/device/api-device.ts
33
- function createApiDevice(options, logger) {
34
- const { genSeed } = options;
35
- const sessionId = uuidv4();
36
- const deviceApi = axios.create({ baseURL: options.deviceApiUrl });
37
- axiosRetry(deviceApi, {
38
- retryDelay: axiosRetry.linearDelay(1e3),
39
- retries: 3,
40
- retryCondition: (
41
- /* v8 ignore next -- @preserve */
42
- () => true
43
- ),
44
- onRetry: (
45
- /* v8 ignore next -- @preserve */
46
- (retryCount, err) => {
47
- const formattedErr = `${err.code ?? `UNKNOWN`} on ${err.config?.method?.toUpperCase() ?? "UNKNOWN_METHOD"} ${err.config?.url ?? "UNKNOWN_URL"}`;
48
- logger.warning(
49
- `Retrying request to device-api (attempt ${retryCount}) - Cause: ${formattedErr}`
50
- );
51
- }
52
- )
53
- });
54
- deviceApi.interceptors.request.use(
55
- (config) => {
56
- logger.debug(
57
- `[device-api] ${config.method?.toUpperCase()} ${config.url}${config.data ? ` ${JSON.stringify(config.data)}` : ""}`
58
- );
59
- if (["post", "put"].includes(config.method)) {
60
- const isStringMode = typeof config.data === "string";
61
- const data = isStringMode ? JSON.parse(config.data) : config.data;
62
- const enhancedData = {
63
- sessionID: sessionId,
64
- // Used to ensure dedicated session if someones else uses same seed
65
- psd_model: "02",
66
- // Stax
67
- version: 3,
68
- // Used to properly enable noise channel
69
- ...data
70
- };
71
- config.data = isStringMode ? JSON.stringify(enhancedData) : enhancedData;
72
- }
73
- return config;
74
- },
75
- (error) => Promise.reject(error)
76
- );
77
- return {
78
- with: (index) => {
79
- const __seed = genSeed({ salt: options.salt, index });
80
- const getSeed = async () => {
81
- if (typeof __seed === "string") return Promise.resolve(__seed);
82
- return __seed;
83
- };
84
- const authenticate = async ({
85
- challenge,
86
- workspaceName
87
- }) => {
88
- const role = challenge.role;
89
- if (role === "READ_ONLY_API_KEY")
90
- throw new Error("Invalid role for authenticate: READ_ONLY_API_KEY");
91
- const { data } = await deviceApi.post("/authenticate", {
92
- seed: await getSeed(),
93
- challenge: Buffer.from(challenge.challenge, "base64").toString("hex"),
94
- application: APPID_VAULT_ADMINISTRATOR,
95
- key_handle: challenge.keyHandle,
96
- name: challenge.name,
97
- role: STR_ROLES[role],
98
- type: "02",
99
- // Stax
100
- workspaceName
101
- });
102
- return data;
103
- };
104
- const finalizePairingHandshake = async (params) => {
105
- const { handshake, partitionId } = params;
106
- const payload = { seed: await getSeed(), handshake, ciphertext: partitionId };
107
- const res = await deviceApi.post("/finalize-pairing-handshake", payload);
108
- return res.data;
109
- };
110
- const generateSeedFragment = async () => {
111
- const payload = {
112
- seed: await getSeed(),
113
- path: PATHS.KEY_MATERIAL,
114
- goal: 0
115
- // seed fragment
116
- };
117
- const { data } = await deviceApi.post("/generate-key-component", payload);
118
- return data;
119
- };
120
- const generateWrappingKeyFragment = async () => {
121
- const goal = 1;
122
- const payload = { seed: await getSeed(), goal, path: PATHS.KEY_MATERIAL };
123
- const res = await deviceApi.post("/generate-key-fragments", payload);
124
- return Buffer.from(res.data, "hex").toString("base64");
125
- };
126
- const getAttestation = async () => {
127
- const { data: attestationStr } = await deviceApi.post("/get-attestation", {
128
- seed: await getSeed()
129
- });
130
- const attestationBuffer = Buffer.from(attestationStr, "hex");
131
- const certLen = attestationBuffer.readInt8(32 + 65 + 1);
132
- return {
133
- attestation: {
134
- codeHash: attestationBuffer.slice(0, 32).toString("base64"),
135
- attestationPub: attestationBuffer.slice(32, 32 + 65).toString("base64"),
136
- certificate: attestationBuffer.slice(32 + 65, 32 + 65 + 2 + certLen).toString("base64")
137
- },
138
- buffer: attestationBuffer
139
- };
140
- };
141
- const getConfidentialityKey = async () => {
142
- const res = await deviceApi.post("/get-confidentiality-key", { seed: await getSeed() });
143
- return {
144
- confidentialityKeyCurve25519: res.data.confidentiality_key_curve25519,
145
- confidentialityKeySignature: res.data.confidentiality_key_signature
146
- };
147
- };
148
- const getConfidentialityPubKey = async () => {
149
- return getPublicKey({ path: PATHS.CONFIDENTIALITY });
150
- };
151
- const getDeviceUserId = async () => {
152
- const res = await deviceApi.post("/blue-device-id", {
153
- seed: await getSeed()
154
- });
155
- return res.data.blue_device_id.toUpperCase();
156
- };
157
- const getU2FPubKey = async () => {
158
- return getPublicKey({ path: PATHS.U2F });
159
- };
160
- const getValidationPubKey = async () => {
161
- return getPublicKey({ path: PATHS.VALIDATION });
162
- };
163
- const hasPairing = async () => {
164
- const res = await deviceApi.post("/get-partition-ids", { seed: await getSeed() });
165
- return res.data.length > 0;
166
- };
167
- const initPairingHandshake = async () => {
168
- const { data } = await deviceApi.post(
169
- "/initiate-pairing-handshake",
170
- { seed: await getSeed() }
171
- );
172
- return {
173
- pubKey: data.pubKey,
174
- signature: Buffer.from(data.attestation, "hex").toString("base64")
175
- };
176
- };
177
- const openSession = async (params) => {
178
- const { secureChannel } = params;
179
- const signature = Buffer.from(secureChannel.certificate.signature, "base64");
180
- const attestationPubKey = Buffer.from(secureChannel.certificate.attestationPub, "base64");
181
- const attestationCertificate = Buffer.from(secureChannel.certificate.certificate, "base64");
182
- const attestation = Buffer.concat([
183
- Buffer.from([signature.length]),
184
- signature,
185
- attestationPubKey,
186
- Buffer.from([attestationCertificate.length]),
187
- attestationCertificate
188
- ]);
189
- const payload = {
190
- seed: await getSeed(),
191
- path: PATHS.CONFIDENTIALITY,
192
- pubKey: secureChannel.pubKey,
193
- attestation: attestation.toString("hex"),
194
- scriptId: SCRIPT_IDS.INIT_SESSION
195
- };
196
- const { data: deviceResponse } = await deviceApi.post("/open-session", payload);
197
- if (deviceResponse !== "9000") {
198
- throw new Error(`device-api device failed with code: ${deviceResponse}`);
199
- }
200
- };
201
- const register = async (params) => {
202
- const { challenge, u2fRegisterData, name, role } = params;
203
- const payload = {
204
- seed: await getSeed(),
205
- challenge,
206
- name,
207
- role: STR_ROLES[role],
208
- hsm_data: u2fRegisterData,
209
- type: "02",
210
- // Stax
211
- application: APPID_VAULT_ADMINISTRATOR
212
- };
213
- const { data } = await deviceApi.post("/register", payload);
214
- const response = Buffer.from(data, "hex");
215
- let i = 0;
216
- const rfu = response.slice(i, i + 1)[0];
217
- i += 1;
218
- const pubKey = response.slice(i, i + 65).toString("hex");
219
- i += 65;
220
- const keyHandleLength = response.slice(i, i + 1)[0];
221
- i++;
222
- const keyHandle = response.slice(i, i + keyHandleLength);
223
- i += keyHandleLength;
224
- return {
225
- u2fRegister: response.slice(0, response.length - 2),
226
- keyHandle,
227
- rfu,
228
- pubKey
229
- };
230
- };
231
- const registerData = async (params) => {
232
- const { challenge } = params;
233
- const payload = { seed: await getSeed(), challenge };
234
- const res = await deviceApi.post("/u2f-register-data", payload);
235
- return res.data;
236
- };
237
- const setPairing = async ({ pairing }) => {
238
- const payload = {
239
- seed: await getSeed(),
240
- blob: pairing.blob,
241
- pairing: {
242
- bootstrap_enabled: pairing.pairing.bootstrapEnabled,
243
- partition_key: pairing.pairing.partitionKey,
244
- workspace_name: pairing.pairing.workspaceName
245
- },
246
- partition_key_attestation: {
247
- code_hash: pairing.partitionKeyAttestation.codeHash,
248
- attestation_pub: pairing.partitionKeyAttestation.attestationPub,
249
- certificate: pairing.partitionKeyAttestation.certificate,
250
- signature: pairing.partitionKeyAttestation.signature
251
- }
252
- };
253
- await deviceApi.post("/set-partition-key", payload);
254
- };
255
- const startKKPatternAsResponder = async (params) => {
256
- const payload = {
257
- seed: await getSeed(),
258
- script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,
259
- handshake: params.handshake,
260
- // for device-api it's normal to have empty string as handshake_attestation
261
- handshake_attestation: "",
262
- partition_id: params.partitionId
263
- };
264
- const { data } = await deviceApi.post("/start-kk-pattern-as-responder", payload);
265
- const buffer = Buffer.from(data, "hex");
266
- const dataLength = buffer.readInt8(0);
267
- return {
268
- handshake: buffer.slice(1, dataLength + 1).toString("base64"),
269
- signature: buffer.slice(dataLength + 1).toString("base64")
270
- };
271
- };
272
- const startKPatternAsResponder = async (params) => {
273
- const { handshake, partitionId } = params;
274
- const payload = {
275
- seed: await getSeed(),
276
- script_id: SCRIPT_IDS.ACCOUNT_MANAGER_SESSION,
277
- handshake,
278
- // for device-api it's normal to have empty string as handshake_attestation
279
- handshake_attestation: "",
280
- partition_id: partitionId
281
- };
282
- const { data: deviceResponse } = await deviceApi.post(
283
- "/start-k-pattern-as-responder",
284
- payload
285
- );
286
- if (deviceResponse !== "9000") {
287
- throw new Error(`device-api device failed with code: ${deviceResponse}`);
288
- }
289
- };
290
- const getPublicKey = async (params) => {
291
- const { path } = params;
292
- const payload = { seed: await getSeed(), secp256k1: true, path };
293
- const res = await deviceApi.post("/get-public-key", payload);
294
- return {
295
- pubKey: res.data.pubKey,
296
- signature: Buffer.from(res.data.attestation, "hex").toString("base64")
297
- };
298
- };
299
- const validateVaultOperation = async (params) => {
300
- const { actions } = params;
301
- const payload = {
302
- seed: await getSeed(),
303
- path: PATHS.VALIDATION,
304
- actions
305
- };
306
- const { data: signature } = await deviceApi.post("/validate-op", payload);
307
- return signature;
308
- };
309
- const sendAPDU = (_apdu) => {
310
- logger.info("Can't send arbitrary APDU to software device");
311
- return Promise.resolve("9000");
312
- };
313
- const getVersion = async () => {
314
- return "1.2.3";
315
- };
316
- const poll = async () => {
317
- await new Promise((r) => setTimeout(r, 1e3));
318
- return { isAppOpened: true };
319
- };
320
- const pollApp = async () => {
321
- await new Promise((r) => setTimeout(r, 1e3));
322
- return "9000";
323
- };
324
- return {
325
- authenticate,
326
- finalizePairingHandshake,
327
- generateSeedFragment,
328
- generateWrappingKeyFragment,
329
- getAttestation,
330
- getConfidentialityKey,
331
- getConfidentialityPubKey,
332
- getDeviceUserId,
333
- getU2FPubKey,
334
- getValidationPubKey,
335
- hasPairing,
336
- initPairingHandshake,
337
- openSession,
338
- register,
339
- registerData,
340
- setPairing,
341
- startKKPatternAsResponder,
342
- startKPatternAsResponder,
343
- validateVaultOperation,
344
- getVersion,
345
- sendAPDU,
346
- poll,
347
- pollApp
348
- };
349
- }
350
- };
351
- }
352
-
353
- // ../../node_modules/.pnpm/@ledgerhq+errors@6.32.0/node_modules/@ledgerhq/errors/lib-es/helpers.js
354
- var errorClasses = {};
355
- var deserializers = {};
356
- var addCustomErrorDeserializer = (name, deserializer) => {
357
- deserializers[name] = deserializer;
358
- };
359
- var createCustomErrorClass = (name) => {
360
- class CustomErrorClass extends Error {
361
- cause;
362
- constructor(message, fields, options) {
363
- super(message || name, options);
364
- Object.setPrototypeOf(this, CustomErrorClass.prototype);
365
- this.name = name;
366
- if (fields) {
367
- for (const k in fields) {
368
- this[k] = fields[k];
369
- }
370
- }
371
- if (options && isObject(options) && "cause" in options && !this.cause) {
372
- const cause = options.cause;
373
- this.cause = cause;
374
- if ("stack" in cause) {
375
- this.stack = this.stack + "\nCAUSE: " + cause.stack;
376
- }
377
- }
378
- }
379
- }
380
- errorClasses[name] = CustomErrorClass;
381
- return CustomErrorClass;
382
- };
383
- function isObject(value) {
384
- return typeof value === "object";
385
- }
386
-
387
- // ../../node_modules/.pnpm/@ledgerhq+errors@6.32.0/node_modules/@ledgerhq/errors/lib-es/index.js
388
- var AccountNameRequiredError = createCustomErrorClass("AccountNameRequired");
389
- var AccountNotSupported = createCustomErrorClass("AccountNotSupported");
390
- var AccountAwaitingSendPendingOperations = createCustomErrorClass("AccountAwaitingSendPendingOperations");
391
- var AmountRequired = createCustomErrorClass("AmountRequired");
392
- var BluetoothRequired = createCustomErrorClass("BluetoothRequired");
393
- var BtcUnmatchedApp = createCustomErrorClass("BtcUnmatchedApp");
394
- var CantOpenDevice = createCustomErrorClass("CantOpenDevice");
395
- var CashAddrNotSupported = createCustomErrorClass("CashAddrNotSupported");
396
- var ClaimRewardsFeesWarning = createCustomErrorClass("ClaimRewardsFeesWarning");
397
- var CurrencyNotSupported = createCustomErrorClass("CurrencyNotSupported");
398
- var DeviceAppVerifyNotSupported = createCustomErrorClass("DeviceAppVerifyNotSupported");
399
- var DeviceGenuineSocketEarlyClose = createCustomErrorClass("DeviceGenuineSocketEarlyClose");
400
- var DeviceNotGenuineError = createCustomErrorClass("DeviceNotGenuine");
401
- var DeviceOnDashboardExpected = createCustomErrorClass("DeviceOnDashboardExpected");
402
- var DeviceOnDashboardUnexpected = createCustomErrorClass("DeviceOnDashboardUnexpected");
403
- var DeviceInOSUExpected = createCustomErrorClass("DeviceInOSUExpected");
404
- var DeviceHalted = createCustomErrorClass("DeviceHalted");
405
- var DeviceNameInvalid = createCustomErrorClass("DeviceNameInvalid");
406
- var DeviceSocketFail = createCustomErrorClass("DeviceSocketFail");
407
- var DeviceSocketNoBulkStatus = createCustomErrorClass("DeviceSocketNoBulkStatus");
408
- var DeviceNeedsRestart = createCustomErrorClass("DeviceSocketNoBulkStatus");
409
- var UnresponsiveDeviceError = createCustomErrorClass("UnresponsiveDeviceError");
410
- var DisconnectedDevice = createCustomErrorClass("DisconnectedDevice");
411
- var DisconnectedDeviceDuringOperation = createCustomErrorClass("DisconnectedDeviceDuringOperation");
412
- var DeviceExtractOnboardingStateError = createCustomErrorClass("DeviceExtractOnboardingStateError");
413
- var DeviceOnboardingStatePollingError = createCustomErrorClass("DeviceOnboardingStatePollingError");
414
- var EnpointConfigError = createCustomErrorClass("EnpointConfig");
415
- var EthAppPleaseEnableContractData = createCustomErrorClass("EthAppPleaseEnableContractData");
416
- var SolAppPleaseEnableContractData = createCustomErrorClass("SolAppPleaseEnableContractData");
417
- var CeloAppPleaseEnableContractData = createCustomErrorClass("CeloAppPleaseEnableContractData");
418
- var FeeEstimationFailed = createCustomErrorClass("FeeEstimationFailed");
419
- var FirmwareNotRecognized = createCustomErrorClass("FirmwareNotRecognized");
420
- var HardResetFail = createCustomErrorClass("HardResetFail");
421
- var InvalidXRPTag = createCustomErrorClass("InvalidXRPTag");
422
- var InvalidAddress = createCustomErrorClass("InvalidAddress");
423
- var InvalidTransactionError = createCustomErrorClass("InvalidTransactionError");
424
- var InvalidNonce = createCustomErrorClass("InvalidNonce");
425
- var InvalidAddressBecauseDestinationIsAlsoSource = createCustomErrorClass("InvalidAddressBecauseDestinationIsAlsoSource");
426
- var LatestMCUInstalledError = createCustomErrorClass("LatestMCUInstalledError");
427
- var LatestFirmwareVersionRequired = createCustomErrorClass("LatestFirmwareVersionRequired");
428
- var UnsupportedFeatureError = createCustomErrorClass("UnsupportedFeatureError");
429
- var NanoSNotSupported = createCustomErrorClass("NanoSNotSupported");
430
- var UnknownMCU = createCustomErrorClass("UnknownMCU");
431
- var LedgerAPIError = createCustomErrorClass("LedgerAPIError");
432
- var LedgerAPIErrorWithMessage = createCustomErrorClass("LedgerAPIErrorWithMessage");
433
- var LedgerAPINotAvailable = createCustomErrorClass("LedgerAPINotAvailable");
434
- var ManagerAppAlreadyInstalledError = createCustomErrorClass("ManagerAppAlreadyInstalled");
435
- var ManagerAppRelyOnBTCError = createCustomErrorClass("ManagerAppRelyOnBTC");
436
- var ManagerAppDepInstallRequired = createCustomErrorClass("ManagerAppDepInstallRequired");
437
- var ManagerAppDepUninstallRequired = createCustomErrorClass("ManagerAppDepUninstallRequired");
438
- var ManagerDeviceLockedError = createCustomErrorClass("ManagerDeviceLocked");
439
- var ManagerFirmwareNotEnoughSpaceError = createCustomErrorClass("ManagerFirmwareNotEnoughSpace");
440
- var ManagerNotEnoughSpaceError = createCustomErrorClass("ManagerNotEnoughSpace");
441
- var ManagerUninstallBTCDep = createCustomErrorClass("ManagerUninstallBTCDep");
442
- var NetworkDown = createCustomErrorClass("NetworkDown");
443
- var NetworkError = createCustomErrorClass("NetworkError");
444
- var NoAddressesFound = createCustomErrorClass("NoAddressesFound");
445
- var NotEnoughBalance = createCustomErrorClass("NotEnoughBalance");
446
- var NotEnoughBalanceFees = createCustomErrorClass("NotEnoughBalanceFees");
447
- var NotEnoughBalanceSwap = createCustomErrorClass("NotEnoughBalanceSwap");
448
- var NotEnoughBalanceToDelegate = createCustomErrorClass("NotEnoughBalanceToDelegate");
449
- var UnstakeNotEnoughStakedBalanceLeft = createCustomErrorClass("UnstakeNotEnoughStakedBalanceLeft");
450
- var RestakeNotEnoughStakedBalanceLeft = createCustomErrorClass("RestakeNotEnoughStakedBalanceLeft");
451
- var NotEnoughToRestake = createCustomErrorClass("NotEnoughToRestake");
452
- var NotEnoughToUnstake = createCustomErrorClass("NotEnoughToUnstake");
453
- var NotEnoughBalanceInParentAccount = createCustomErrorClass("NotEnoughBalanceInParentAccount");
454
- var NotEnoughSpendableBalance = createCustomErrorClass("NotEnoughSpendableBalance");
455
- var NotEnoughBalanceBecauseDestinationNotCreated = createCustomErrorClass("NotEnoughBalanceBecauseDestinationNotCreated");
456
- var NotEnoughToStake = createCustomErrorClass("NotEnoughToStake");
457
- var NoAccessToCamera = createCustomErrorClass("NoAccessToCamera");
458
- var NotEnoughGas = createCustomErrorClass("NotEnoughGas");
459
- var NotEnoughGasSwap = createCustomErrorClass("NotEnoughGasSwap");
460
- var TronEmptyAccount = createCustomErrorClass("TronEmptyAccount");
461
- var MaybeKeepTronAccountAlive = createCustomErrorClass("MaybeKeepTronAccountAlive");
462
- var NotSupportedLegacyAddress = createCustomErrorClass("NotSupportedLegacyAddress");
463
- var GasLessThanEstimate = createCustomErrorClass("GasLessThanEstimate");
464
- var PriorityFeeTooLow = createCustomErrorClass("PriorityFeeTooLow");
465
- var PriorityFeeTooHigh = createCustomErrorClass("PriorityFeeTooHigh");
466
- var PriorityFeeHigherThanMaxFee = createCustomErrorClass("PriorityFeeHigherThanMaxFee");
467
- var MaxFeeTooLow = createCustomErrorClass("MaxFeeTooLow");
468
- var PasswordsDontMatchError = createCustomErrorClass("PasswordsDontMatch");
469
- var PasswordIncorrectError = createCustomErrorClass("PasswordIncorrect");
470
- var RecommendSubAccountsToEmpty = createCustomErrorClass("RecommendSubAccountsToEmpty");
471
- var RecommendUndelegation = createCustomErrorClass("RecommendUndelegation");
472
- var TimeoutTagged = createCustomErrorClass("TimeoutTagged");
473
- var UnexpectedBootloader = createCustomErrorClass("UnexpectedBootloader");
474
- var MCUNotGenuineToDashboard = createCustomErrorClass("MCUNotGenuineToDashboard");
475
- var RecipientRequired = createCustomErrorClass("RecipientRequired");
476
- var UnavailableTezosOriginatedAccountReceive = createCustomErrorClass("UnavailableTezosOriginatedAccountReceive");
477
- var UnavailableTezosOriginatedAccountSend = createCustomErrorClass("UnavailableTezosOriginatedAccountSend");
478
- var UpdateFetchFileFail = createCustomErrorClass("UpdateFetchFileFail");
479
- var UpdateIncorrectHash = createCustomErrorClass("UpdateIncorrectHash");
480
- var UpdateIncorrectSig = createCustomErrorClass("UpdateIncorrectSig");
481
- var UpdateYourApp = createCustomErrorClass("UpdateYourApp");
482
- var UserRefusedDeviceNameChange = createCustomErrorClass("UserRefusedDeviceNameChange");
483
- var UserRefusedAddress = createCustomErrorClass("UserRefusedAddress");
484
- var UserRefusedFirmwareUpdate = createCustomErrorClass("UserRefusedFirmwareUpdate");
485
- var UserRefusedAllowManager = createCustomErrorClass("UserRefusedAllowManager");
486
- var UserRefusedOnDevice = createCustomErrorClass("UserRefusedOnDevice");
487
- var PinNotSet = createCustomErrorClass("PinNotSet");
488
- var ExpertModeRequired = createCustomErrorClass("ExpertModeRequired");
489
- var TransportOpenUserCancelled = createCustomErrorClass("TransportOpenUserCancelled");
490
- var TransportInterfaceNotAvailable = createCustomErrorClass("TransportInterfaceNotAvailable");
491
- var TransportRaceCondition = createCustomErrorClass("TransportRaceCondition");
492
- var TransportWebUSBGestureRequired = createCustomErrorClass("TransportWebUSBGestureRequired");
493
- var TransactionHasBeenValidatedError = createCustomErrorClass("TransactionHasBeenValidatedError");
494
- var TransportExchangeTimeoutError = createCustomErrorClass("TransportExchangeTimeoutError");
495
- var DeviceShouldStayInApp = createCustomErrorClass("DeviceShouldStayInApp");
496
- var WebsocketConnectionError = createCustomErrorClass("WebsocketConnectionError");
497
- var WebsocketConnectionFailed = createCustomErrorClass("WebsocketConnectionFailed");
498
- var WrongDeviceForAccount = createCustomErrorClass("WrongDeviceForAccount");
499
- var WrongDeviceForAccountPayout = createCustomErrorClass("WrongDeviceForAccountPayout");
500
- var MissingSwapPayloadParamaters = createCustomErrorClass("MissingSwapPayloadParamaters");
501
- var WrongDeviceForAccountRefund = createCustomErrorClass("WrongDeviceForAccountRefund");
502
- var WrongAppForCurrency = createCustomErrorClass("WrongAppForCurrency");
503
- var ETHAddressNonEIP = createCustomErrorClass("ETHAddressNonEIP");
504
- var CantScanQRCode = createCustomErrorClass("CantScanQRCode");
505
- var FeeNotLoaded = createCustomErrorClass("FeeNotLoaded");
506
- var FeeNotLoadedSwap = createCustomErrorClass("FeeNotLoadedSwap");
507
- var FeeRequired = createCustomErrorClass("FeeRequired");
508
- var FeeTooHigh = createCustomErrorClass("FeeTooHigh");
509
- var PendingOperation = createCustomErrorClass("PendingOperation");
510
- var SyncError = createCustomErrorClass("SyncError");
511
- var PairingFailed = createCustomErrorClass("PairingFailed");
512
- var PeerRemovedPairing = createCustomErrorClass("PeerRemovedPairing");
513
- var GenuineCheckFailed = createCustomErrorClass("GenuineCheckFailed");
514
- var LedgerAPI4xx = createCustomErrorClass("LedgerAPI4xx");
515
- var LedgerAPI5xx = createCustomErrorClass("LedgerAPI5xx");
516
- var FirmwareOrAppUpdateRequired = createCustomErrorClass("FirmwareOrAppUpdateRequired");
517
- var ReplacementTransactionUnderpriced = createCustomErrorClass("ReplacementTransactionUnderpriced");
518
- var OpReturnDataSizeLimit = createCustomErrorClass("OpReturnSizeLimit");
519
- var DustLimit = createCustomErrorClass("DustLimit");
520
- var ConcordiumInsufficientFunds = createCustomErrorClass("ConcordiumInsufficientFunds");
521
- var ConcordiumMemoTooLong = createCustomErrorClass("ConcordiumMemoTooLong");
522
- var ConcordiumPairingExpiredError = createCustomErrorClass("ConcordiumPairingExpiredError");
523
- var ConcordiumSessionExpiredError = createCustomErrorClass("ConcordiumSessionExpiredError");
524
- var LanguageNotFound = createCustomErrorClass("LanguageNotFound");
525
- var NoDBPathGiven = createCustomErrorClass("NoDBPathGiven");
526
- var DBWrongPassword = createCustomErrorClass("DBWrongPassword");
527
- var DBNotReset = createCustomErrorClass("DBNotReset");
528
- var SequenceNumberError = createCustomErrorClass("SequenceNumberError");
529
- var DisabledTransactionBroadcastError = createCustomErrorClass("DisabledTransactionBroadcastError");
530
- var HwTransportErrorType;
531
- (function(HwTransportErrorType2) {
532
- HwTransportErrorType2["Unknown"] = "Unknown";
533
- HwTransportErrorType2["LocationServicesDisabled"] = "LocationServicesDisabled";
534
- HwTransportErrorType2["LocationServicesUnauthorized"] = "LocationServicesUnauthorized";
535
- HwTransportErrorType2["BluetoothScanStartFailed"] = "BluetoothScanStartFailed";
536
- })(HwTransportErrorType || (HwTransportErrorType = {}));
537
- var TransportError = class extends Error {
538
- id;
539
- constructor(message, id) {
540
- const name = "TransportError";
541
- super(message || name);
542
- this.name = name;
543
- this.message = message;
544
- this.stack = new Error(message).stack;
545
- this.id = id;
546
- }
547
- };
548
- addCustomErrorDeserializer("TransportError", (e) => new TransportError(e.message, e.id));
549
- var StatusCodes = {
550
- ACCESS_CONDITION_NOT_FULFILLED: 38916,
551
- ALGORITHM_NOT_SUPPORTED: 38020,
552
- CLA_NOT_SUPPORTED: 28160,
553
- CODE_BLOCKED: 38976,
554
- CODE_NOT_INITIALIZED: 38914,
555
- COMMAND_INCOMPATIBLE_FILE_STRUCTURE: 27009,
556
- CONDITIONS_OF_USE_NOT_SATISFIED: 27013,
557
- CONTRADICTION_INVALIDATION: 38928,
558
- CONTRADICTION_SECRET_CODE_STATUS: 38920,
559
- DEVICE_IN_RECOVERY_MODE: 26159,
560
- CUSTOM_IMAGE_EMPTY: 26158,
561
- FILE_ALREADY_EXISTS: 27273,
562
- FILE_NOT_FOUND: 37892,
563
- GP_AUTH_FAILED: 25344,
564
- HALTED: 28586,
565
- INCONSISTENT_FILE: 37896,
566
- INCORRECT_DATA: 27264,
567
- INCORRECT_LENGTH: 26368,
568
- INCORRECT_P1_P2: 27392,
569
- INS_NOT_SUPPORTED: 27904,
570
- DEVICE_NOT_ONBOARDED: 27911,
571
- DEVICE_NOT_ONBOARDED_2: 26129,
572
- INVALID_KCV: 38021,
573
- INVALID_OFFSET: 37890,
574
- LICENSING: 28482,
575
- LOCKED_DEVICE: 21781,
576
- MAX_VALUE_REACHED: 38992,
577
- MEMORY_PROBLEM: 37440,
578
- MISSING_CRITICAL_PARAMETER: 26624,
579
- NO_EF_SELECTED: 37888,
580
- NOT_ENOUGH_MEMORY_SPACE: 27268,
581
- OK: 36864,
582
- PIN_REMAINING_ATTEMPTS: 25536,
583
- REFERENCED_DATA_NOT_FOUND: 27272,
584
- SECURITY_STATUS_NOT_SATISFIED: 27010,
585
- TECHNICAL_PROBLEM: 28416,
586
- UNKNOWN_APDU: 27906,
587
- USER_REFUSED_ON_DEVICE: 21761,
588
- NOT_ENOUGH_SPACE: 20738,
589
- APP_NOT_FOUND_OR_INVALID_CONTEXT: 20771,
590
- INVALID_APP_NAME_LENGTH: 26378,
591
- GEN_AES_KEY_FAILED: 21529,
592
- INTERNAL_CRYPTO_OPERATION_FAILED: 21530,
593
- INTERNAL_COMPUTE_AES_CMAC_FAILED: 21531,
594
- ENCRYPT_APP_STORAGE_FAILED: 21532,
595
- INVALID_BACKUP_STATE: 26178,
596
- PIN_NOT_SET: 21762,
597
- INVALID_BACKUP_LENGTH: 26419,
598
- INVALID_RESTORE_STATE: 26179,
599
- INVALID_CHUNK_LENGTH: 26420,
600
- INVALID_BACKUP_HEADER: 26698,
601
- SW_BAD_STATE: 45063
602
- };
603
- function getAltStatusMessage(code) {
604
- switch (code) {
605
- // improve text of most common errors
606
- case 26368:
607
- return "Incorrect length";
608
- case 26624:
609
- return "Missing critical parameter";
610
- case 27010:
611
- return "Security not satisfied (dongle locked or have invalid access rights)";
612
- case 27013:
613
- return "Condition of use not satisfied (denied by the user?)";
614
- case 27264:
615
- return "Invalid data received";
616
- case 27392:
617
- return "Invalid parameter received";
618
- case 21781:
619
- return "Locked device";
620
- case 45063:
621
- return "Unexpected state on the device";
622
- }
623
- if (28416 <= code && code <= 28671) {
624
- return "Internal error, please report";
625
- }
626
- }
627
- var TransportStatusError = class _TransportStatusError extends Error {
628
- statusCode;
629
- statusText;
630
- /**
631
- * @param statusCode The error status code coming from a Transport implementation
632
- * @param options containing:
633
- * - canBeMappedToChildError: enable the mapping of TransportStatusError to an error extending/inheriting from it
634
- * . Ex: LockedDeviceError. Default to true.
635
- */
636
- constructor(statusCode, { canBeMappedToChildError = true } = {}) {
637
- const statusText = Object.keys(StatusCodes).find((k) => StatusCodes[k] === statusCode) || "UNKNOWN_ERROR";
638
- const smsg = getAltStatusMessage(statusCode) || statusText;
639
- const statusCodeStr = statusCode.toString(16);
640
- const message = `Ledger device: ${smsg} (0x${statusCodeStr})`;
641
- super(message);
642
- this.name = "TransportStatusError";
643
- this.statusCode = statusCode;
644
- this.statusText = statusText;
645
- Object.setPrototypeOf(this, _TransportStatusError.prototype);
646
- if (canBeMappedToChildError && statusCode === StatusCodes.LOCKED_DEVICE) {
647
- return new LockedDeviceError(message);
648
- }
649
- }
650
- };
651
- var LockedDeviceError = class _LockedDeviceError extends TransportStatusError {
652
- constructor(message) {
653
- super(StatusCodes.LOCKED_DEVICE, { canBeMappedToChildError: false });
654
- if (message) {
655
- this.message = message;
656
- }
657
- this.name = "LockedDeviceError";
658
- Object.setPrototypeOf(this, _LockedDeviceError.prototype);
659
- }
660
- };
661
- addCustomErrorDeserializer("TransportStatusError", (e) => new TransportStatusError(e.statusCode));
662
-
663
- // src/device/device-access.ts
664
- import { Observable, throwError, timer } from "rxjs";
665
- import { catchError, mergeMap, retryWhen } from "rxjs/operators";
666
- var initialErrorRemapping = (error) => throwError(
667
- error && error instanceof TransportStatusError && error.statusCode === 28586 ? new DeviceHalted(error.message) : error instanceof TransportStatusError && error.statusCode === 27392 ? new FirmwareOrAppUpdateRequired(error.message) : error
668
- );
669
- var never = new Promise(() => {
670
- });
671
- var modules = [];
672
- var registerTransportModule = (module) => {
673
- modules.push(module);
674
- };
675
- var close = (transport, deviceId) => {
676
- for (const m of modules) {
677
- const p = m.close?.(transport, deviceId);
678
- if (p) return p;
679
- }
680
- return transport.close();
681
- };
682
- var open = (deviceId) => {
683
- for (const m of modules) {
684
- const p = m.open(deviceId);
685
- if (p) return p;
686
- }
687
- return Promise.reject(new Error(`Can't find handler to open ${deviceId}`));
688
- };
689
- var transportFinally = (cleanup) => (observable) => (
690
- // @ts-expect-error typescript not checking against the instanceof
691
- Observable.create((o) => {
692
- let done = false;
693
- const finalize = () => {
694
- if (done) return never;
695
- done = true;
696
- return cleanup();
697
- };
698
- const sub = observable.subscribe({
699
- next: (e) => o.next(e),
700
- complete: () => {
701
- void finalize().then(() => o.complete());
702
- },
703
- error: (e) => {
704
- void finalize().then(() => o.error(e));
705
- }
706
- });
707
- return () => {
708
- sub.unsubscribe();
709
- void finalize();
710
- };
711
- })
712
- );
713
- var accessHooks = [];
714
- var deviceQueues = {};
715
- var withDevice = (deviceId) => (job) => new Observable((o) => {
716
- let unsubscribed;
717
- let sub;
718
- const deviceQueue = deviceQueues[deviceId] ?? Promise.resolve();
719
- const finalize = (transport, cleanups) => close(transport, deviceId).catch(() => {
720
- }).then(() => {
721
- cleanups.forEach((c) => c());
722
- });
723
- let finish;
724
- deviceQueues[deviceId] = new Promise((resolve) => {
725
- finish = resolve;
726
- });
727
- deviceQueue.then(() => open(deviceId)).then(async (transport) => {
728
- if (unsubscribed) {
729
- return finalize(transport, [finish]);
730
- }
731
- if (transport.requestConnectionPriority && typeof transport.requestConnectionPriority === "function") {
732
- await transport.requestConnectionPriority("High");
733
- }
734
- return transport;
735
- }).catch((e) => {
736
- finish();
737
- if (e instanceof BluetoothRequired) throw e;
738
- if (e instanceof TransportWebUSBGestureRequired) throw e;
739
- if (e instanceof TransportInterfaceNotAvailable) throw e;
740
- throw new CantOpenDevice(e.message);
741
- }).then((transport) => {
742
- if (!transport) return;
743
- if (unsubscribed) {
744
- return finalize(transport, [finish]);
745
- }
746
- const cleanups = accessHooks.map((hook) => hook());
747
- sub = job(transport).pipe(
748
- catchError(initialErrorRemapping),
749
- // $FlowFixMe
750
- transportFinally(
751
- () => (
752
- // @ts-expect-error typescript not checking against the instanceof
753
- finalize(transport, [...cleanups, finish])
754
- )
755
- )
756
- ).subscribe(o);
757
- }).catch((error) => o.error(error));
758
- return () => {
759
- unsubscribed = true;
760
- if (sub) sub.unsubscribe();
761
- };
762
- });
763
- var WITH_DEVICE_POLLING_DELAY = 500;
764
- var retryWhileErrors = (acceptError) => (
765
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
766
- (attempts) => attempts.pipe(
767
- mergeMap((error) => {
768
- if (!acceptError(error)) {
769
- return throwError(error);
770
- }
771
- return timer(WITH_DEVICE_POLLING_DELAY);
772
- })
773
- )
774
- );
775
- var withDevicePolling = (deviceId) => (job, acceptError = () => false) => withDevice(deviceId)(job).pipe(retryWhen(retryWhileErrors(acceptError)));
776
-
777
- // src/device/utils.ts
778
- var isTransportStatusError = (error) => {
779
- return error instanceof TransportStatusError || error instanceof Error && "statusCode" in error && error.message.startsWith("Ledger device:");
780
- };
781
- var CANCEL_STATUS_CODES = [
782
- 27013,
783
- // cancel on Ledger Blue
784
- // STAX
785
- 45068,
786
- // cancel collect wk fragment
787
- 45069,
788
- // cancel user registration
789
- 45072,
790
- // cancel review
791
- 45074,
792
- // cancel master seed generation
793
- 45075,
794
- // cancel login
795
- 21761
796
- // cancel openApp
797
- ];
798
- var isDeviceCancelError = (error) => {
799
- return isTransportStatusError(error) && CANCEL_STATUS_CODES.includes(error.statusCode);
800
- };
801
-
802
- export {
803
- PATHS,
804
- STATUS_LENGTH,
805
- SCRIPT_IDS,
806
- STR_ROLES,
807
- APPID_VAULT_ADMINISTRATOR,
808
- PAGINATED_STATUS,
809
- STREAMING_RESPONSE,
810
- STREAMING_NEXT_ACTION,
811
- createApiDevice,
812
- DisconnectedDevice,
813
- LockedDeviceError,
814
- registerTransportModule,
815
- withDevicePolling,
816
- isTransportStatusError,
817
- isDeviceCancelError
818
- };
819
- /* v8 ignore next -- @preserve */
820
- //# sourceMappingURL=chunk-PFZIW6UP.js.map