@onekeyfe/hardware-cli 1.1.26-alpha.106 → 1.1.26-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.eslintignore +4 -0
  2. package/dist/chains.d.ts +6 -0
  3. package/dist/chains.js +191 -87
  4. package/dist/cli.js +615 -496
  5. package/dist/index.d.ts +16 -89
  6. package/dist/index.js +1 -2
  7. package/dist/sdk.d.ts +15 -5
  8. package/dist/sdk.js +237 -131
  9. package/dist/session.d.ts +22 -0
  10. package/dist/session.js +83 -0
  11. package/dist/storage/index.d.ts +2 -0
  12. package/dist/storage/index.js +5 -0
  13. package/dist/storage/process-utils.d.ts +2 -0
  14. package/dist/storage/process-utils.js +44 -0
  15. package/dist/storage/secure-storage.linux.d.ts +11 -0
  16. package/dist/storage/secure-storage.linux.js +59 -0
  17. package/dist/storage/secure-storage.macos.d.ts +11 -0
  18. package/dist/storage/secure-storage.macos.js +65 -0
  19. package/dist/storage/storage-factory.d.ts +3 -0
  20. package/dist/storage/storage-factory.js +14 -0
  21. package/dist/storage/types.d.ts +18 -0
  22. package/dist/storage/types.js +2 -0
  23. package/package.json +15 -13
  24. package/src/chains.ts +229 -85
  25. package/src/cli.ts +620 -297
  26. package/src/sdk.ts +244 -125
  27. package/src/session.ts +89 -0
  28. package/src/storage/index.ts +2 -0
  29. package/src/storage/process-utils.ts +50 -0
  30. package/src/storage/secure-storage.linux.ts +68 -0
  31. package/src/storage/secure-storage.macos.ts +68 -0
  32. package/src/storage/storage-factory.ts +13 -0
  33. package/src/storage/types.ts +17 -0
  34. package/tsconfig.json +5 -7
  35. package/.claude-plugin/plugin.json +0 -14
  36. package/AGENTS.md +0 -40
  37. package/CLAUDE.md +0 -40
  38. package/README.md +0 -112
  39. package/evals/cases.json +0 -373
  40. package/evals/run-evals.sh +0 -136
  41. package/rollup.config.js +0 -28
package/src/chains.ts CHANGED
@@ -11,6 +11,27 @@
11
11
 
12
12
  import type { CoreApi } from '@onekeyfe/hd-core';
13
13
 
14
+ /**
15
+ * Extract params shared by every SDK method. Forwarded unconditionally:
16
+ *
17
+ * - `passphraseState` / `useEmptyPassphrase` — wallet selection.
18
+ * - `skipPassphraseCheck` — tells the SDK to skip its own
19
+ * `checkPassphraseStateSafety` + error-114 gate so our interactive
20
+ * `REQUEST_PASSPHRASE` handler can own the passphrase prompt flow.
21
+ * `runCommand` always sets this to `true` via `getCommonParams`.
22
+ *
23
+ * All three are forwarded even when falsy/undefined — SDK treats missing
24
+ * and undefined identically. This avoids silent losses when inner calls
25
+ * (e.g. `resolveBatchGetAddress`) reconstruct a params object manually.
26
+ */
27
+ function extractCommonParams(params: CommonCLIParams): Record<string, unknown> {
28
+ return {
29
+ passphraseState: params.passphraseState,
30
+ useEmptyPassphrase: params.useEmptyPassphrase,
31
+ skipPassphraseCheck: params.skipPassphraseCheck,
32
+ };
33
+ }
34
+
14
35
  // Default BIP44 derivation paths per chain
15
36
  // Sources: developer-portal core-api-guide.mdx + chain-specific docs
16
37
  const DEFAULT_PATHS: Record<string, string> = {
@@ -30,7 +51,7 @@ const DEFAULT_PATHS: Record<string, string> = {
30
51
  nostr: "m/44'/1237'/0'/0/0",
31
52
  filecoin: "m/44'/461'/0'/0/0",
32
53
  kaspa: "m/44'/111111'/0'/0/0",
33
- algo: "m/44'/283'/0'/0/0",
54
+ algo: "m/44'/283'/0'/0'/0'",
34
55
  conflux: "m/44'/503'/0'/0/0",
35
56
  nervos: "m/44'/309'/0'/0/0",
36
57
  alephium: "m/44'/1234'/0'/0/0",
@@ -83,12 +104,18 @@ function getDefaultPath(chain: string): string {
83
104
  /**
84
105
  * Common params passed to all SDK methods.
85
106
  * Reference: packages/core/src/types/api/export.ts (CommonParams)
107
+ *
108
+ * `skipPassphraseCheck` is CLI-internal plumbing — runCommand sets it to
109
+ * true so the interactive REQUEST_PASSPHRASE handler can own the prompt
110
+ * flow without the SDK rejecting with error 114 first. Exposed on the
111
+ * interface so inner helpers (batch flows, etc.) can forward it safely.
86
112
  */
87
113
  export interface CommonCLIParams {
88
114
  connectId?: string;
89
115
  deviceId?: string;
90
116
  passphraseState?: string;
91
117
  useEmptyPassphrase?: boolean;
118
+ skipPassphraseCheck?: boolean;
92
119
  }
93
120
 
94
121
  export interface GetAddressParams extends CommonCLIParams {
@@ -103,14 +130,17 @@ export async function resolveGetAddress(sdk: CoreApi, params: GetAddressParams)
103
130
  const showOnOneKey = params.showOnDevice ?? true;
104
131
  const connectId = params.connectId || '';
105
132
  const deviceId = params.deviceId || '';
133
+ const commonParams = extractCommonParams(params);
106
134
 
107
135
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
108
136
  const chainMethodMap: Record<string, () => Promise<any>> = {
109
- evm: () => sdk.evmGetAddress(connectId, deviceId, { path, showOnOneKey }),
110
- btc: () => sdk.btcGetAddress(connectId, deviceId, { path, showOnOneKey, coin: 'btc' }),
111
- sol: () => sdk.solGetAddress(connectId, deviceId, { path, showOnOneKey }),
112
- tron: () => sdk.tronGetAddress(connectId, deviceId, { path, showOnOneKey }),
113
- cosmos: () => sdk.cosmosGetAddress(connectId, deviceId, { path, showOnOneKey }),
137
+ evm: () => sdk.evmGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
138
+ btc: () =>
139
+ sdk.btcGetAddress(connectId, deviceId, { path, showOnOneKey, coin: 'btc', ...commonParams }),
140
+ sol: () => sdk.solGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
141
+ tron: () => sdk.tronGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
142
+ cosmos: () =>
143
+ sdk.cosmosGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
114
144
  // Cardano requires networkId, protocolMagic, derivationType
115
145
  cardano: () =>
116
146
  sdk.cardanoGetAddress(connectId, deviceId, {
@@ -119,6 +149,7 @@ export async function resolveGetAddress(sdk: CoreApi, params: GetAddressParams)
119
149
  protocolMagic: 764824073, // mainnet magic
120
150
  derivationType: 1, // Icarus
121
151
  showOnOneKey,
152
+ ...commonParams,
122
153
  }),
123
154
  // Polkadot requires network param
124
155
  polkadot: () =>
@@ -127,26 +158,57 @@ export async function resolveGetAddress(sdk: CoreApi, params: GetAddressParams)
127
158
  prefix: 0,
128
159
  network: 'polkadot',
129
160
  showOnOneKey,
161
+ ...commonParams,
162
+ }),
163
+ aptos: () => sdk.aptosGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
164
+ sui: () => sdk.suiGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
165
+ near: () => sdk.nearGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
166
+ xrp: () => sdk.xrpGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
167
+ stellar: () =>
168
+ sdk.stellarGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
169
+ ton: () => sdk.tonGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
170
+ filecoin: () =>
171
+ sdk.filecoinGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
172
+ kaspa: () =>
173
+ sdk.kaspaGetAddress(connectId, deviceId, {
174
+ path,
175
+ showOnOneKey,
176
+ prefix: 'kaspa',
177
+ ...commonParams,
178
+ }),
179
+ algo: () => sdk.algoGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
180
+ conflux: () =>
181
+ sdk.confluxGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
182
+ nervos: () =>
183
+ sdk.nervosGetAddress(connectId, deviceId, {
184
+ path,
185
+ showOnOneKey,
186
+ network: 'ckb',
187
+ ...commonParams,
188
+ }),
189
+ alephium: () =>
190
+ sdk.alephiumGetAddress(connectId, deviceId, {
191
+ path,
192
+ showOnOneKey,
193
+ group: 0,
194
+ ...commonParams,
195
+ }),
196
+ neo: () => sdk.neoGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
197
+ starcoin: () =>
198
+ sdk.starcoinGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
199
+ nem: () =>
200
+ sdk.nemGetAddress(connectId, deviceId, { path, showOnOneKey, network: 104, ...commonParams }),
201
+ dnx: () => sdk.dnxGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
202
+ scdo: () => sdk.scdoGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
203
+ benfen: () =>
204
+ sdk.benfenGetAddress(connectId, deviceId, { path, showOnOneKey, ...commonParams }),
205
+ nexa: () =>
206
+ sdk.nexaGetAddress(connectId, deviceId, {
207
+ path,
208
+ showOnOneKey,
209
+ prefix: 'nexa',
210
+ ...commonParams,
130
211
  }),
131
- aptos: () => sdk.aptosGetAddress(connectId, deviceId, { path, showOnOneKey }),
132
- sui: () => sdk.suiGetAddress(connectId, deviceId, { path, showOnOneKey }),
133
- near: () => sdk.nearGetAddress(connectId, deviceId, { path, showOnOneKey }),
134
- xrp: () => sdk.xrpGetAddress(connectId, deviceId, { path, showOnOneKey }),
135
- stellar: () => sdk.stellarGetAddress(connectId, deviceId, { path, showOnOneKey }),
136
- ton: () => sdk.tonGetAddress(connectId, deviceId, { path, showOnOneKey }),
137
- filecoin: () => sdk.filecoinGetAddress(connectId, deviceId, { path, showOnOneKey }),
138
- kaspa: () => sdk.kaspaGetAddress(connectId, deviceId, { path, showOnOneKey, prefix: 'kaspa' }),
139
- algo: () => sdk.algoGetAddress(connectId, deviceId, { path, showOnOneKey }),
140
- conflux: () => sdk.confluxGetAddress(connectId, deviceId, { path, showOnOneKey }),
141
- nervos: () => sdk.nervosGetAddress(connectId, deviceId, { path, showOnOneKey, network: 'ckb' }),
142
- alephium: () => sdk.alephiumGetAddress(connectId, deviceId, { path, showOnOneKey, group: 0 }),
143
- neo: () => sdk.neoGetAddress(connectId, deviceId, { path, showOnOneKey }),
144
- starcoin: () => sdk.starcoinGetAddress(connectId, deviceId, { path, showOnOneKey }),
145
- nem: () => sdk.nemGetAddress(connectId, deviceId, { path, showOnOneKey, network: 104 }),
146
- dnx: () => sdk.dnxGetAddress(connectId, deviceId, { path, showOnOneKey }),
147
- scdo: () => sdk.scdoGetAddress(connectId, deviceId, { path, showOnOneKey }),
148
- benfen: () => sdk.benfenGetAddress(connectId, deviceId, { path, showOnOneKey }),
149
- nexa: () => sdk.nexaGetAddress(connectId, deviceId, { path, showOnOneKey, prefix: 'nexa' }),
150
212
  };
151
213
 
152
214
  const method = chainMethodMap[chain];
@@ -171,18 +233,20 @@ export async function resolveGetPublicKey(sdk: CoreApi, params: GetPublicKeyPara
171
233
  const path = params.path || getDefaultPath(chain);
172
234
  const connectId = params.connectId || '';
173
235
  const deviceId = params.deviceId || '';
236
+ const commonParams = extractCommonParams(params);
174
237
 
175
238
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
176
239
  const chainMethodMap: Record<string, () => Promise<any>> = {
177
- evm: () => sdk.evmGetPublicKey(connectId, deviceId, { path }),
178
- btc: () => sdk.btcGetPublicKey(connectId, deviceId, { path, coin: 'btc' }),
179
- aptos: () => sdk.aptosGetPublicKey(connectId, deviceId, { path }),
180
- cosmos: () => sdk.cosmosGetPublicKey(connectId, deviceId, { path }),
181
- sui: () => sdk.suiGetPublicKey(connectId, deviceId, { path }),
182
- starcoin: () => sdk.starcoinGetPublicKey(connectId, deviceId, { path }),
183
- nostr: () => sdk.nostrGetPublicKey(connectId, deviceId, { path }),
184
- benfen: () => sdk.benfenGetPublicKey(connectId, deviceId, { path }),
185
- cardano: () => sdk.cardanoGetPublicKey(connectId, deviceId, { path, derivationType: 1 }),
240
+ evm: () => sdk.evmGetPublicKey(connectId, deviceId, { path, ...commonParams }),
241
+ btc: () => sdk.btcGetPublicKey(connectId, deviceId, { path, coin: 'btc', ...commonParams }),
242
+ aptos: () => sdk.aptosGetPublicKey(connectId, deviceId, { path, ...commonParams }),
243
+ cosmos: () => sdk.cosmosGetPublicKey(connectId, deviceId, { path, ...commonParams }),
244
+ sui: () => sdk.suiGetPublicKey(connectId, deviceId, { path, ...commonParams }),
245
+ starcoin: () => sdk.starcoinGetPublicKey(connectId, deviceId, { path, ...commonParams }),
246
+ nostr: () => sdk.nostrGetPublicKey(connectId, deviceId, { path, ...commonParams }),
247
+ benfen: () => sdk.benfenGetPublicKey(connectId, deviceId, { path, ...commonParams }),
248
+ cardano: () =>
249
+ sdk.cardanoGetPublicKey(connectId, deviceId, { path, derivationType: 1, ...commonParams }),
186
250
  };
187
251
 
188
252
  const method = chainMethodMap[chain];
@@ -210,60 +274,125 @@ export async function resolveSignTransaction(sdk: CoreApi, params: SignTransacti
210
274
  const connectId = params.connectId || '';
211
275
  const deviceId = params.deviceId || '';
212
276
  const tx = params.transaction;
277
+ const commonParams = extractCommonParams(params);
213
278
 
214
279
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
215
280
  const chainMethodMap: Record<string, () => Promise<any>> = {
216
281
  // EVM: chainId is inside the transaction object, not top-level
217
- evm: () => sdk.evmSignTransaction(connectId, deviceId, { path, transaction: tx as any }),
218
- // BTC: requires inputs/outputs/refTxs/coin format
219
- btc: () => sdk.btcSignTransaction(connectId, deviceId, { coin: 'btc', ...(tx as any) }),
220
- sol: () => sdk.solSignTransaction(connectId, deviceId, { path, rawTx: tx.rawTx as string }),
221
- tron: () => sdk.tronSignTransaction(connectId, deviceId, { path, transaction: tx as any }),
282
+ evm: () =>
283
+ sdk.evmSignTransaction(connectId, deviceId, {
284
+ path,
285
+ transaction: tx as any,
286
+ ...commonParams,
287
+ }),
288
+ btc: () =>
289
+ sdk.btcSignTransaction(connectId, deviceId, { coin: 'btc', ...(tx as any), ...commonParams }),
290
+ sol: () =>
291
+ sdk.solSignTransaction(connectId, deviceId, {
292
+ path,
293
+ rawTx: tx.rawTx as string,
294
+ ...commonParams,
295
+ }),
296
+ tron: () =>
297
+ sdk.tronSignTransaction(connectId, deviceId, {
298
+ path,
299
+ transaction: tx as any,
300
+ ...commonParams,
301
+ }),
222
302
  cosmos: () =>
223
- sdk.cosmosSignTransaction(connectId, deviceId, { path, rawTx: tx.rawTx as string }),
224
- aptos: () => sdk.aptosSignTransaction(connectId, deviceId, { path, rawTx: tx.rawTx as string }),
225
- sui: () => sdk.suiSignTransaction(connectId, deviceId, { path, rawTx: tx.rawTx as string }),
226
- near: () => sdk.nearSignTransaction(connectId, deviceId, { path, rawTx: tx.rawTx as string }),
227
- // XRP: implementation reads path + transaction from payload despite type declaration
303
+ sdk.cosmosSignTransaction(connectId, deviceId, {
304
+ path,
305
+ rawTx: tx.rawTx as string,
306
+ ...commonParams,
307
+ }),
308
+ aptos: () =>
309
+ sdk.aptosSignTransaction(connectId, deviceId, {
310
+ path,
311
+ rawTx: tx.rawTx as string,
312
+ ...commonParams,
313
+ }),
314
+ sui: () =>
315
+ sdk.suiSignTransaction(connectId, deviceId, {
316
+ path,
317
+ rawTx: tx.rawTx as string,
318
+ ...commonParams,
319
+ }),
320
+ near: () =>
321
+ sdk.nearSignTransaction(connectId, deviceId, {
322
+ path,
323
+ rawTx: tx.rawTx as string,
324
+ ...commonParams,
325
+ }),
228
326
  // eslint-disable-next-line @typescript-eslint/ban-types
229
327
  xrp: () =>
230
328
  (sdk.xrpSignTransaction as (...args: unknown[]) => Promise<unknown>)(connectId, deviceId, {
231
329
  path,
232
330
  transaction: tx,
331
+ ...commonParams,
233
332
  }),
234
333
  stellar: () =>
235
334
  sdk.stellarSignTransaction(connectId, deviceId, {
236
335
  path,
237
336
  networkPassphrase: tx.networkPassphrase as string,
238
337
  transaction: tx.transaction as any,
338
+ ...commonParams,
239
339
  }),
240
- // Polkadot: requires prefix param
241
340
  polkadot: () =>
242
341
  sdk.polkadotSignTransaction(connectId, deviceId, {
243
342
  path,
244
343
  rawTx: tx.rawTx as string,
245
344
  network: (tx.network as string) || 'polkadot',
246
345
  prefix: (tx.prefix as number) ?? 0,
346
+ ...commonParams,
247
347
  }),
248
348
  filecoin: () =>
249
- sdk.filecoinSignTransaction(connectId, deviceId, { path, rawTx: tx.rawTx as string }),
250
- kaspa: () => sdk.kaspaSignTransaction(connectId, deviceId, { ...(tx as any) }),
251
- algo: () => sdk.algoSignTransaction(connectId, deviceId, { path, rawTx: tx.rawTx as string }),
349
+ sdk.filecoinSignTransaction(connectId, deviceId, {
350
+ path,
351
+ rawTx: tx.rawTx as string,
352
+ ...commonParams,
353
+ }),
354
+ kaspa: () => sdk.kaspaSignTransaction(connectId, deviceId, { ...(tx as any), ...commonParams }),
355
+ algo: () =>
356
+ sdk.algoSignTransaction(connectId, deviceId, {
357
+ path,
358
+ rawTx: tx.rawTx as string,
359
+ ...commonParams,
360
+ }),
252
361
  conflux: () =>
253
- sdk.confluxSignTransaction(connectId, deviceId, { path, transaction: tx as any }),
254
- nervos: () => sdk.nervosSignTransaction(connectId, deviceId, { ...(tx as any) }),
362
+ sdk.confluxSignTransaction(connectId, deviceId, {
363
+ path,
364
+ transaction: tx as any,
365
+ ...commonParams,
366
+ }),
367
+ nervos: () =>
368
+ sdk.nervosSignTransaction(connectId, deviceId, { ...(tx as any), ...commonParams }),
255
369
  alephium: () =>
256
- sdk.alephiumSignTransaction(connectId, deviceId, { path, rawTx: tx.rawTx as string }),
257
- neo: () => sdk.neoSignTransaction(connectId, deviceId, { path, ...(tx as any) }),
258
- dnx: () => sdk.dnxSignTransaction(connectId, deviceId, { path, ...(tx as any) }),
259
- // SCDO: flat params (nonce, gasPrice, gasLimit, to, value, data), not wrapped
260
- scdo: () => sdk.scdoSignTransaction(connectId, deviceId, { path, ...(tx as any) }),
370
+ sdk.alephiumSignTransaction(connectId, deviceId, {
371
+ path,
372
+ rawTx: tx.rawTx as string,
373
+ ...commonParams,
374
+ }),
375
+ neo: () =>
376
+ sdk.neoSignTransaction(connectId, deviceId, { path, ...(tx as any), ...commonParams }),
377
+ dnx: () =>
378
+ sdk.dnxSignTransaction(connectId, deviceId, { path, ...(tx as any), ...commonParams }),
379
+ scdo: () =>
380
+ sdk.scdoSignTransaction(connectId, deviceId, { path, ...(tx as any), ...commonParams }),
261
381
  benfen: () =>
262
- sdk.benfenSignTransaction(connectId, deviceId, { path, rawTx: tx.rawTx as string }),
263
- nexa: () => sdk.nexaSignTransaction(connectId, deviceId, { ...(tx as any) }),
264
- cardano: () => sdk.cardanoSignTransaction(connectId, deviceId, { ...(tx as any) }),
382
+ sdk.benfenSignTransaction(connectId, deviceId, {
383
+ path,
384
+ rawTx: tx.rawTx as string,
385
+ ...commonParams,
386
+ }),
387
+ nexa: () => sdk.nexaSignTransaction(connectId, deviceId, { ...(tx as any), ...commonParams }),
388
+ cardano: () =>
389
+ sdk.cardanoSignTransaction(connectId, deviceId, { ...(tx as any), ...commonParams }),
265
390
  starcoin: () =>
266
- sdk.starcoinSignTransaction(connectId, deviceId, { path, rawTx: tx.rawTx as string }),
391
+ sdk.starcoinSignTransaction(connectId, deviceId, {
392
+ path,
393
+ rawTx: tx.rawTx as string,
394
+ ...commonParams,
395
+ }),
267
396
  };
268
397
 
269
398
  const method = chainMethodMap[chain];
@@ -286,6 +415,7 @@ export async function resolveSignMessage(sdk: CoreApi, params: SignMessageParams
286
415
  const path = params.path || getDefaultPath(chain);
287
416
  const connectId = params.connectId || '';
288
417
  const deviceId = params.deviceId || '';
418
+ const commonParams = extractCommonParams(params);
289
419
 
290
420
  // Most chains use `messageHex` (hex-encoded). CLI accepts either:
291
421
  // - Already hex-encoded string (starts with "0x" or matches /^[0-9a-fA-F]+$/)
@@ -296,39 +426,49 @@ export async function resolveSignMessage(sdk: CoreApi, params: SignMessageParams
296
426
 
297
427
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
298
428
  const chainMethodMap: Record<string, () => Promise<any>> = {
299
- evm: () => sdk.evmSignMessage(connectId, deviceId, { path, messageHex: msg }),
300
- // BTC: uses messageHex, not message
301
- btc: () => sdk.btcSignMessage(connectId, deviceId, { path, messageHex: msg, coin: 'btc' }),
302
- sol: () => sdk.solSignMessage(connectId, deviceId, { path, messageHex: msg }),
303
- // Tron: uses messageHex
304
- tron: () => sdk.tronSignMessage(connectId, deviceId, { path, messageHex: msg }),
429
+ evm: () => sdk.evmSignMessage(connectId, deviceId, { path, messageHex: msg, ...commonParams }),
430
+ btc: () =>
431
+ sdk.btcSignMessage(connectId, deviceId, {
432
+ path,
433
+ messageHex: msg,
434
+ coin: 'btc',
435
+ ...commonParams,
436
+ }),
437
+ sol: () => sdk.solSignMessage(connectId, deviceId, { path, messageHex: msg, ...commonParams }),
438
+ tron: () =>
439
+ sdk.tronSignMessage(connectId, deviceId, { path, messageHex: msg, ...commonParams }),
305
440
  aptos: () =>
306
- sdk.aptosSignMessage(connectId, deviceId, { path, payload: { message: msg } as any }),
307
- sui: () => sdk.suiSignMessage(connectId, deviceId, { path, messageHex: msg }),
308
- // Conflux: uses messageHex
309
- conflux: () => sdk.confluxSignMessage(connectId, deviceId, { path, messageHex: msg }),
310
- // Starcoin: uses messageHex
311
- starcoin: () => sdk.starcoinSignMessage(connectId, deviceId, { path, messageHex: msg }),
312
- // TON: tonSignMessage is transfer-signing, pass JSON params
441
+ sdk.aptosSignMessage(connectId, deviceId, {
442
+ path,
443
+ payload: { message: msg } as any,
444
+ ...commonParams,
445
+ }),
446
+ sui: () => sdk.suiSignMessage(connectId, deviceId, { path, messageHex: msg, ...commonParams }),
447
+ conflux: () =>
448
+ sdk.confluxSignMessage(connectId, deviceId, { path, messageHex: msg, ...commonParams }),
449
+ starcoin: () =>
450
+ sdk.starcoinSignMessage(connectId, deviceId, { path, messageHex: msg, ...commonParams }),
313
451
  ton: () => {
314
- const tonParams = JSON.parse(msg);
315
- return sdk.tonSignMessage(connectId, deviceId, { path, ...tonParams });
452
+ // TON expects structured params, parse from original raw input (not hex-encoded)
453
+ const tonParams = JSON.parse(raw);
454
+ return sdk.tonSignMessage(connectId, deviceId, { path, ...tonParams, ...commonParams });
316
455
  },
317
- // Nostr: event must be a NostrEvent object (kind, content, tags, created_at)
318
456
  nostr: () => {
319
- const event = JSON.parse(msg);
320
- return sdk.nostrSignEvent(connectId, deviceId, { path, event });
457
+ // Nostr expects a JSON event object, parse from original raw input (not hex-encoded)
458
+ const event = JSON.parse(raw);
459
+ return sdk.nostrSignEvent(connectId, deviceId, { path, event, ...commonParams });
321
460
  },
322
- // SCDO: uses messageHex
323
- scdo: () => sdk.scdoSignMessage(connectId, deviceId, { path, messageHex: msg }),
324
- // Alephium: requires messageType
461
+ scdo: () =>
462
+ sdk.scdoSignMessage(connectId, deviceId, { path, messageHex: msg, ...commonParams }),
325
463
  alephium: () =>
326
464
  sdk.alephiumSignMessage(connectId, deviceId, {
327
465
  path,
328
466
  messageHex: msg,
329
467
  messageType: 'alephium',
468
+ ...commonParams,
330
469
  }),
331
- benfen: () => sdk.benfenSignMessage(connectId, deviceId, { path, messageHex: msg }),
470
+ benfen: () =>
471
+ sdk.benfenSignMessage(connectId, deviceId, { path, messageHex: msg, ...commonParams }),
332
472
  // Cardano: uses `message` field, requires networkId
333
473
  cardano: () =>
334
474
  sdk.cardanoSignMessage(connectId, deviceId, {
@@ -336,6 +476,7 @@ export async function resolveSignMessage(sdk: CoreApi, params: SignMessageParams
336
476
  message: msg,
337
477
  derivationType: 1,
338
478
  networkId: 1,
479
+ ...commonParams,
339
480
  }),
340
481
  };
341
482
 
@@ -361,16 +502,19 @@ export interface BatchGetAddressParams extends CommonCLIParams {
361
502
  }
362
503
 
363
504
  export async function resolveBatchGetAddress(sdk: CoreApi, params: BatchGetAddressParams) {
364
- // #13 FIX: Collect per-item results with error handling for partial failures
505
+ // Spread `common` so every CommonCLIParams field (including
506
+ // skipPassphraseCheck) propagates to each inner resolveGetAddress
507
+ // call. Enumerating fields manually used to drop skipPassphraseCheck
508
+ // and cause error 114 on hidden-wallet batch calls.
509
+ const { bundle, ...common } = params;
365
510
  const results: Array<Record<string, unknown>> = [];
366
- for (const item of params.bundle) {
511
+ for (const item of bundle) {
367
512
  try {
368
513
  const result = await resolveGetAddress(sdk, {
514
+ ...common,
369
515
  chain: item.chain,
370
516
  path: item.path,
371
517
  showOnDevice: item.showOnDevice ?? false,
372
- connectId: params.connectId,
373
- deviceId: params.deviceId,
374
518
  });
375
519
  results.push(result);
376
520
  } catch (err) {