@ledgerhq/device-signer-kit-solana 1.8.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -2
- package/lib/cjs/api/SignerSolanaBuilder.js +1 -1
- package/lib/cjs/api/SignerSolanaBuilder.js.map +2 -2
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
- package/lib/cjs/api/model/AppConfiguration.js +1 -1
- package/lib/cjs/api/model/AppConfiguration.js.map +1 -1
- package/lib/cjs/api/model/MessageOptions.js +1 -1
- package/lib/cjs/api/model/MessageOptions.js.map +1 -1
- package/lib/cjs/internal/DefaultSignerSolana.js.map +2 -2
- package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +2 -2
- package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/SolanaApplicationResolver.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaApplicationResolver.js.map +3 -3
- package/lib/cjs/internal/app-binder/SolanaApplicationResolver.test.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaApplicationResolver.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/ProvideWeb3CheckCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideWeb3CheckCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/ProvideWeb3CheckCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideWeb3CheckCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/Web3CheckOptInCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/Web3CheckOptInCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/Web3CheckOptInCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/Web3CheckOptInCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/constants.js +1 -1
- package/lib/cjs/internal/app-binder/constants.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/services/OffchainMessageBuilder.js +1 -1
- package/lib/cjs/internal/app-binder/services/OffchainMessageBuilder.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/context-providers/loadCertificate.js +2 -0
- package/lib/cjs/internal/app-binder/task/context-providers/loadCertificate.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideContextRegistry.js +2 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideContextRegistry.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideContextRegistry.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideContextRegistry.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideContextTypes.js +2 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideContextTypes.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideLifiContext.js +2 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideLifiContext.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideLifiContext.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideLifiContext.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideTokenContext.js +2 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideTokenContext.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideTokenContext.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideTokenContext.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideTransactionCheckContext.js +2 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideTransactionCheckContext.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideTransactionCheckContext.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/context-providers/provideTransactionCheckContext.test.js.map +7 -0
- package/lib/cjs/internal/use-cases/app-configuration/GetAppConfiguration.test.js +1 -1
- package/lib/cjs/internal/use-cases/app-configuration/GetAppConfiguration.test.js.map +2 -2
- package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js +1 -1
- package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js.map +2 -2
- package/lib/cjs/internal/use-cases/message/SignMessageUseCase.test.js +1 -1
- package/lib/cjs/internal/use-cases/message/SignMessageUseCase.test.js.map +3 -3
- package/lib/cjs/package.json +3 -3
- package/lib/esm/api/SignerSolanaBuilder.js +1 -1
- package/lib/esm/api/SignerSolanaBuilder.js.map +3 -3
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
- package/lib/esm/api/model/MessageOptions.js.map +1 -1
- package/lib/esm/internal/DefaultSignerSolana.js.map +2 -2
- package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
- package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +2 -2
- package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
- package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
- package/lib/esm/internal/app-binder/SolanaApplicationResolver.js +1 -1
- package/lib/esm/internal/app-binder/SolanaApplicationResolver.js.map +3 -3
- package/lib/esm/internal/app-binder/SolanaApplicationResolver.test.js +1 -1
- package/lib/esm/internal/app-binder/SolanaApplicationResolver.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js.map +3 -3
- package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
- package/lib/esm/internal/app-binder/command/ProvideWeb3CheckCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideWeb3CheckCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/ProvideWeb3CheckCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideWeb3CheckCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/Web3CheckOptInCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/Web3CheckOptInCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/Web3CheckOptInCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/Web3CheckOptInCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/constants.js +1 -1
- package/lib/esm/internal/app-binder/constants.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
- package/lib/esm/internal/app-binder/services/OffchainMessageBuilder.js +1 -1
- package/lib/esm/internal/app-binder/services/OffchainMessageBuilder.js.map +3 -3
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.js +1 -1
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/context-providers/loadCertificate.js +2 -0
- package/lib/esm/internal/app-binder/task/context-providers/loadCertificate.js.map +7 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideContextRegistry.js +2 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideContextRegistry.js.map +7 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideContextRegistry.test.js +2 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideContextRegistry.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideContextTypes.js +1 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideContextTypes.js.map +7 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideLifiContext.js +2 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideLifiContext.js.map +7 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideLifiContext.test.js +2 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideLifiContext.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideTokenContext.js +2 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideTokenContext.js.map +7 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideTokenContext.test.js +2 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideTokenContext.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideTransactionCheckContext.js +2 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideTransactionCheckContext.js.map +7 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideTransactionCheckContext.test.js +2 -0
- package/lib/esm/internal/app-binder/task/context-providers/provideTransactionCheckContext.test.js.map +7 -0
- package/lib/esm/internal/use-cases/app-configuration/GetAppConfiguration.test.js +1 -1
- package/lib/esm/internal/use-cases/app-configuration/GetAppConfiguration.test.js.map +2 -2
- package/lib/esm/internal/use-cases/message/SignMessageUseCase.js +1 -1
- package/lib/esm/internal/use-cases/message/SignMessageUseCase.js.map +2 -2
- package/lib/esm/internal/use-cases/message/SignMessageUseCase.test.js +1 -1
- package/lib/esm/internal/use-cases/message/SignMessageUseCase.test.js.map +3 -3
- package/lib/esm/package.json +3 -3
- package/lib/types/api/SignerSolanaBuilder.d.ts.map +1 -1
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +10 -3
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/api/model/AppConfiguration.d.ts +2 -0
- package/lib/types/api/model/AppConfiguration.d.ts.map +1 -1
- package/lib/types/api/model/MessageOptions.d.ts +13 -0
- package/lib/types/api/model/MessageOptions.d.ts.map +1 -1
- package/lib/types/internal/DefaultSignerSolana.d.ts +21 -2
- package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
- package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +1 -0
- package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/SolanaApplicationResolver.d.ts +19 -2
- package/lib/types/internal/app-binder/SolanaApplicationResolver.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ProvideWeb3CheckCommand.d.ts +29 -0
- package/lib/types/internal/app-binder/command/ProvideWeb3CheckCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/ProvideWeb3CheckCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/ProvideWeb3CheckCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/Web3CheckOptInCommand.d.ts +16 -0
- package/lib/types/internal/app-binder/command/Web3CheckOptInCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/Web3CheckOptInCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/Web3CheckOptInCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/constants.d.ts +1 -0
- package/lib/types/internal/app-binder/constants.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +9 -0
- package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/services/OffchainMessageBuilder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +5 -7
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +0 -14
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts +1 -0
- package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/context-providers/loadCertificate.d.ts +4 -0
- package/lib/types/internal/app-binder/task/context-providers/loadCertificate.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/context-providers/provideContextRegistry.d.ts +8 -0
- package/lib/types/internal/app-binder/task/context-providers/provideContextRegistry.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/context-providers/provideContextRegistry.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/context-providers/provideContextRegistry.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/context-providers/provideContextTypes.d.ts +11 -0
- package/lib/types/internal/app-binder/task/context-providers/provideContextTypes.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/context-providers/provideLifiContext.d.ts +4 -0
- package/lib/types/internal/app-binder/task/context-providers/provideLifiContext.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/context-providers/provideLifiContext.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/context-providers/provideLifiContext.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/context-providers/provideTokenContext.d.ts +4 -0
- package/lib/types/internal/app-binder/task/context-providers/provideTokenContext.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/context-providers/provideTokenContext.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/context-providers/provideTokenContext.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/context-providers/provideTransactionCheckContext.d.ts +4 -0
- package/lib/types/internal/app-binder/task/context-providers/provideTransactionCheckContext.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/context-providers/provideTransactionCheckContext.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/context-providers/provideTransactionCheckContext.test.d.ts.map +1 -0
- package/lib/types/internal/use-cases/message/SignMessageUseCase.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -285,16 +285,18 @@ const { observable, cancel } = signerSolana.signMessage(
|
|
|
285
285
|
skipOpenApp?: boolean;
|
|
286
286
|
version?: SignMessageVersion; // defaults to V0
|
|
287
287
|
appDomain?: string; // V0 only
|
|
288
|
+
signers?: Uint8Array[]; // V1 only
|
|
288
289
|
};
|
|
289
290
|
```
|
|
290
291
|
|
|
291
292
|
- `skipOpenApp`: Skip the automatic open-app step.
|
|
292
293
|
- `version`: The off-chain message signing mode. Defaults to `SignMessageVersion.V0`.
|
|
293
294
|
- **V0** (default) — original off-chain message header with `appDomain`, format detection, and up to 65 515 bytes. Falls back to Legacy on `6a81`.
|
|
294
|
-
- **V1** — simplified header: no `appDomain`, no format byte. Up to 65 535 bytes. Falls back to V0 -> Legacy on `6a81`. Requires Solana device app version 1.14+.
|
|
295
|
+
- **V1** — simplified header per [sRFC 38](https://github.com/solana-foundation/SRFCs/discussions/3): no `appDomain`, no format byte. Up to 65 535 bytes. Falls back to V0 -> Legacy on `6a81`. Requires Solana device app version 1.14+.
|
|
295
296
|
- **Legacy** — compact header for backward compatibility with old Solana app firmware. Current firmware will reject it with `6a81`.
|
|
296
297
|
- **Raw** — pass-through mode: sends the caller-provided `Uint8Array` payload directly with no header wrapping. Use when you have already built a valid off-chain message. Returns a plain base58 signature (no envelope).
|
|
297
|
-
- `appDomain`: Application domain string
|
|
298
|
+
- `appDomain`: V0 only. Application domain string included in the off-chain message header. Encoded as UTF-8 and padded/truncated to 32 bytes. Ignored for V1, Legacy, and Raw.
|
|
299
|
+
- `signers`: V1 only. Additional required signers to include in the off-chain message header alongside the user's key. Per sRFC 38, this is the recommended replacement for the V0 `appDomain` field — pass the dApp's public key here to bind the message to a specific application. Signers are sorted and deduplicated automatically. Each entry must be a 32-byte Ed25519 public key; at most 254 additional signers are supported (1 slot reserved for the user's key). Passing a signer with the wrong length or exceeding the limit returns an error before any device communication. Ignored for V0, Legacy, and Raw.
|
|
298
300
|
|
|
299
301
|
#### **Returns**
|
|
300
302
|
|
|
@@ -308,6 +310,26 @@ type SignMessageOutput = {
|
|
|
308
310
|
|
|
309
311
|
- `cancel` A function to cancel the action on the Ledger device.
|
|
310
312
|
|
|
313
|
+
#### **Examples**
|
|
314
|
+
|
|
315
|
+
V0 with app domain:
|
|
316
|
+
|
|
317
|
+
```typescript
|
|
318
|
+
const { observable } = signerSolana.signMessage("44'/501'/0'", "Hello World", {
|
|
319
|
+
version: SignMessageVersion.V0,
|
|
320
|
+
appDomain: "my-app.com",
|
|
321
|
+
});
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
V1 with additional required signer (replaces `appDomain` per sRFC 38):
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
const { observable } = signerSolana.signMessage("44'/501'/0'", "Hello World", {
|
|
328
|
+
version: SignMessageVersion.V1,
|
|
329
|
+
signers: [dAppPubkeyBytes], // dApp's Ed25519 public key as Uint8Array(32)
|
|
330
|
+
});
|
|
331
|
+
```
|
|
332
|
+
|
|
311
333
|
---
|
|
312
334
|
|
|
313
335
|
### Use Case 4: Get App Configuration
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var r=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var g=(t,e)=>{for(var n in e)r(t,n,{get:e[n],enumerable:!0})},C=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of l(e))!u.call(t,o)&&o!==n&&r(t,o,{get:()=>e[o],enumerable:!(i=d(e,o))||i.enumerable});return t};var c=t=>C(r({},"__esModule",{value:!0}),t);var _={};g(_,{SignerSolanaBuilder:()=>m});module.exports=c(_);var s=require("@ledgerhq/context-module"),a=require("../internal/DefaultSignerSolana");class m{_dmk;_sessionId;_customContextModule;_originToken;_solanaRPCURL;constructor({dmk:e,sessionId:n,originToken:i,solanaRPCURL:o}){this._dmk=e,this._sessionId=n,this._originToken=i,this._solanaRPCURL=o}withContextModule(e){return this._customContextModule=e,this}build(){return new a.DefaultSignerSolana({dmk:this._dmk,sessionId:this._sessionId,solanaRPCURL:this._solanaRPCURL,contextModule:this._customContextModule??new s.ContextModuleBuilder({originToken:this._originToken,loggerFactory:e=>this._dmk.getLoggerFactory()(["ContextModule",e])}).setChain(s.ContextModuleChainID.Solana).build()})}}0&&(module.exports={SignerSolanaBuilder});
|
|
2
2
|
//# sourceMappingURL=SignerSolanaBuilder.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/SignerSolanaBuilder.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type ContextModule,\n ContextModuleBuilder,\n} from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { DefaultSignerSolana } from \"@internal/DefaultSignerSolana\";\n\ntype SignerSolanaBuilderConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n originToken?: string;\n solanaRPCURL?: string;\n};\n\n/**\n * Builder for the `SignerSolana` class.\n *\n * @example\n * ```\n * const signer = new SignerSolanaBuilder({ dmk, sessionId })\n * .build();\n * ```\n */\nexport class SignerSolanaBuilder {\n private _dmk: DeviceManagementKit;\n private _sessionId: DeviceSessionId;\n private _customContextModule: ContextModule | undefined;\n private _originToken: string | undefined;\n private readonly _solanaRPCURL: string | undefined;\n\n constructor({\n dmk,\n sessionId,\n originToken,\n solanaRPCURL,\n }: SignerSolanaBuilderConstructorArgs) {\n this._dmk = dmk;\n this._sessionId = sessionId;\n this._originToken = originToken;\n this._solanaRPCURL = solanaRPCURL;\n }\n\n /**\n * Override the default context module\n *\n * @param contextModule\n * @returns this\n */\n withContextModule(contextModule: ContextModule) {\n this._customContextModule = contextModule;\n return this;\n }\n\n /**\n * Build the solana signer\n *\n * @returns the solana signer\n */\n public build() {\n return new DefaultSignerSolana({\n dmk: this._dmk,\n sessionId: this._sessionId,\n solanaRPCURL: this._solanaRPCURL,\n contextModule:\n this._customContextModule ??\n new ContextModuleBuilder({\n originToken: this._originToken,\n loggerFactory: (tag: string) =>\n this._dmk.getLoggerFactory()([\"ContextModule\", tag]),\n }).build(),\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,
|
|
4
|
+
"sourcesContent": ["import {\n type ContextModule,\n ContextModuleBuilder,\n ContextModuleChainID,\n} from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { DefaultSignerSolana } from \"@internal/DefaultSignerSolana\";\n\ntype SignerSolanaBuilderConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n originToken?: string;\n solanaRPCURL?: string;\n};\n\n/**\n * Builder for the `SignerSolana` class.\n *\n * @example\n * ```\n * const signer = new SignerSolanaBuilder({ dmk, sessionId })\n * .build();\n * ```\n */\nexport class SignerSolanaBuilder {\n private _dmk: DeviceManagementKit;\n private _sessionId: DeviceSessionId;\n private _customContextModule: ContextModule | undefined;\n private _originToken: string | undefined;\n private readonly _solanaRPCURL: string | undefined;\n\n constructor({\n dmk,\n sessionId,\n originToken,\n solanaRPCURL,\n }: SignerSolanaBuilderConstructorArgs) {\n this._dmk = dmk;\n this._sessionId = sessionId;\n this._originToken = originToken;\n this._solanaRPCURL = solanaRPCURL;\n }\n\n /**\n * Override the default context module\n *\n * @param contextModule\n * @returns this\n */\n withContextModule(contextModule: ContextModule) {\n this._customContextModule = contextModule;\n return this;\n }\n\n /**\n * Build the solana signer\n *\n * @returns the solana signer\n */\n public build() {\n return new DefaultSignerSolana({\n dmk: this._dmk,\n sessionId: this._sessionId,\n solanaRPCURL: this._solanaRPCURL,\n contextModule:\n this._customContextModule ??\n new ContextModuleBuilder({\n originToken: this._originToken,\n loggerFactory: (tag: string) =>\n this._dmk.getLoggerFactory()([\"ContextModule\", tag]),\n })\n .setChain(ContextModuleChainID.Solana)\n .build(),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAIO,oCAMPC,EAAoC,yCAkB7B,MAAMH,CAAoB,CACvB,KACA,WACA,qBACA,aACS,cAEjB,YAAY,CACV,IAAAI,EACA,UAAAC,EACA,YAAAC,EACA,aAAAC,CACF,EAAuC,CACrC,KAAK,KAAOH,EACZ,KAAK,WAAaC,EAClB,KAAK,aAAeC,EACpB,KAAK,cAAgBC,CACvB,CAQA,kBAAkBC,EAA8B,CAC9C,YAAK,qBAAuBA,EACrB,IACT,CAOO,OAAQ,CACb,OAAO,IAAI,sBAAoB,CAC7B,IAAK,KAAK,KACV,UAAW,KAAK,WAChB,aAAc,KAAK,cACnB,cACE,KAAK,sBACL,IAAI,uBAAqB,CACvB,YAAa,KAAK,aAClB,cAAgBC,GACd,KAAK,KAAK,iBAAiB,EAAE,CAAC,gBAAiBA,CAAG,CAAC,CACvD,CAAC,EACE,SAAS,uBAAqB,MAAM,EACpC,MAAM,CACb,CAAC,CACH,CACF",
|
|
6
6
|
"names": ["SignerSolanaBuilder_exports", "__export", "SignerSolanaBuilder", "__toCommonJS", "import_context_module", "import_DefaultSignerSolana", "dmk", "sessionId", "originToken", "solanaRPCURL", "contextModule", "tag"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var
|
|
1
|
+
"use strict";var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var r in e)o(t,r,{get:e[r],enumerable:!0})},S=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of s(e))!p.call(t,n)&&n!==r&&o(t,n,{get:()=>e[n],enumerable:!(a=i(e,n))||a.enumerable});return t};var l=t=>S(o({},"__esModule",{value:!0}),t);var A={};c(A,{signTransactionDAStateSteps:()=>T});module.exports=l(A);const T=Object.freeze({OPEN_APP:"signer.sol.steps.openApp",GET_APP_CONFIG:"signer.sol.steps.getAppConfig",WEB3_CHECKS_OPT_IN:"signer.sol.steps.web3ChecksOptIn",WEB3_CHECKS_OPT_IN_RESULT:"signer.sol.steps.web3ChecksOptInResult",INSPECT_TRANSACTION:"signer.sol.steps.inspectTransaction",GET_PUB_KEY:"signer.sol.steps.getPubKey",BUILD_TRANSACTION_CONTEXT:"signer.sol.steps.buildTransactionContext",PROVIDE_TRANSACTION_CONTEXT:"signer.sol.steps.provideTransactionContext",SIGN_TRANSACTION:"signer.sol.steps.signTransaction",DELAYED_SIGN:"signer.sol.steps.delayedSign"});0&&(module.exports={signTransactionDAStateSteps});
|
|
2
2
|
//# sourceMappingURL=SignTransactionDeviceActionTypes.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/app-binder/SignTransactionDeviceActionTypes.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,
|
|
4
|
+
"sourcesContent": ["import {\n type ContextModule,\n type SolanaTransactionContextResultSuccess,\n} from \"@ledgerhq/context-module\";\nimport {\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type SendCommandInAppDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { type BlockhashService } from \"@internal/app-binder/services/BlockhashService\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\n\nimport { type DelayedSignDAStateStep } from \"./DelayedSignTransactionDeviceActionTypes\";\n\nexport const signTransactionDAStateSteps = Object.freeze({\n OPEN_APP: \"signer.sol.steps.openApp\",\n GET_APP_CONFIG: \"signer.sol.steps.getAppConfig\",\n WEB3_CHECKS_OPT_IN: \"signer.sol.steps.web3ChecksOptIn\",\n WEB3_CHECKS_OPT_IN_RESULT: \"signer.sol.steps.web3ChecksOptInResult\",\n INSPECT_TRANSACTION: \"signer.sol.steps.inspectTransaction\",\n GET_PUB_KEY: \"signer.sol.steps.getPubKey\",\n BUILD_TRANSACTION_CONTEXT: \"signer.sol.steps.buildTransactionContext\",\n PROVIDE_TRANSACTION_CONTEXT: \"signer.sol.steps.provideTransactionContext\",\n SIGN_TRANSACTION: \"signer.sol.steps.signTransaction\",\n DELAYED_SIGN: \"signer.sol.steps.delayedSign\",\n} as const);\n\nexport type SignTransactionDAStateStep =\n | (typeof signTransactionDAStateSteps)[keyof typeof signTransactionDAStateSteps]\n | DelayedSignDAStateStep;\n\nexport type SignTransactionDAOutput = Signature;\n\nexport type SignTransactionDAInput = {\n readonly derivationPath: string;\n readonly transaction: Transaction;\n readonly contextModule: ContextModule;\n readonly transactionOptions?: SolanaTransactionOptionalConfig;\n readonly solanaRPCURL?: string;\n readonly blockhashService?: BlockhashService;\n};\n\nexport type SignTransactionDAError =\n | OpenAppDAError\n | SendCommandInAppDAError<SolanaAppErrorCodes>;\n\ntype SignTransactionDARequiredInteraction =\n | UserInteractionRequired\n | OpenAppDARequiredInteraction;\n\nexport type SignTransactionDAIntermediateValue =\n | {\n requiredUserInteraction: SignTransactionDARequiredInteraction;\n step: Exclude<\n SignTransactionDAStateStep,\n typeof signTransactionDAStateSteps.WEB3_CHECKS_OPT_IN_RESULT\n >;\n }\n | {\n requiredUserInteraction: UserInteractionRequired.None;\n step: typeof signTransactionDAStateSteps.WEB3_CHECKS_OPT_IN_RESULT;\n result: boolean;\n };\n\nexport type SignTransactionDAState = DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n\nexport type SignTransactionDAInternalState = {\n readonly error: SignTransactionDAError | null;\n readonly signature: Signature | null;\n readonly appConfig: AppConfiguration | null;\n readonly solanaTransactionContext: SolanaTransactionContextResultSuccess | null;\n readonly inspectorResult: TxInspectorResult | null;\n readonly signerAddress: string | null;\n};\n\nexport type SignTransactionDAReturnType = ExecuteDeviceActionReturnType<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAuBO,MAAME,EAA8B,OAAO,OAAO,CACvD,SAAU,2BACV,eAAgB,gCAChB,mBAAoB,mCACpB,0BAA2B,yCAC3B,oBAAqB,sCACrB,YAAa,6BACb,0BAA2B,2CAC3B,4BAA6B,6CAC7B,iBAAkB,mCAClB,aAAc,8BAChB,CAAU",
|
|
6
6
|
"names": ["SignTransactionDeviceActionTypes_exports", "__export", "signTransactionDAStateSteps", "__toCommonJS"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var b=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var s=(o,e,l,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of a(e))!y.call(o,i)&&i!==l&&b(o,i,{get:()=>e[i],enumerable:!(n=p(e,i))||n.enumerable});return o};var t=o=>s(b({},"__esModule",{value:!0}),o);var d={};module.exports=t(d);
|
|
2
2
|
//# sourceMappingURL=AppConfiguration.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/model/AppConfiguration.ts"],
|
|
4
|
-
"sourcesContent": ["import { type PublicKeyDisplayMode } from \"./PublicKeyDisplayMode\";\n\nexport type AppConfiguration = {\n blindSigningEnabled: boolean;\n pubKeyDisplayMode: PublicKeyDisplayMode;\n version: string;\n};\n"],
|
|
4
|
+
"sourcesContent": ["import { type PublicKeyDisplayMode } from \"./PublicKeyDisplayMode\";\n\nexport type AppConfiguration = {\n blindSigningEnabled: boolean;\n pubKeyDisplayMode: PublicKeyDisplayMode;\n version: string;\n web3ChecksEnabled?: boolean;\n web3ChecksOptIn?: boolean;\n};\n"],
|
|
5
5
|
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
6
|
"names": ["AppConfiguration_exports", "__toCommonJS"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var o=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(t,a)=>{for(var r in a)o(t,r,{get:a[r],enumerable:!0})},m=(t,a,r,y)=>{if(a&&typeof a=="object"||typeof a=="function")for(let p of v(a))!c.call(t,p)&&p!==r&&o(t,p,{get:()=>a[p],enumerable:!(y=n(a,p))||y.enumerable});return t};var w=t=>m(o({},"__esModule",{value:!0}),t);var x={};l(x,{SignMessageVersion:()=>e});module.exports=w(x);var e=(p=>(p.Raw="raw",p.Legacy="legacy",p.V0="v0",p.V1="v1",p))(e||{});0&&(module.exports={SignMessageVersion});
|
|
2
2
|
//# sourceMappingURL=MessageOptions.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/model/MessageOptions.ts"],
|
|
4
|
-
"sourcesContent": ["export enum SignMessageVersion {\n /**\n * Pass-through mode: sends `sendingData` directly to the device with no\n * header wrapping. Use this when the caller has already built a valid\n * off-chain message payload (e.g. a correctly formatted V0 or V1 OCM).\n * Returns a plain base58 signature (no envelope).\n */\n Raw = \"raw\",\n /**\n * Compact V0 header without `appDomain` or signer fields.\n * Only recognised by older Solana app firmware versions.\n * Current firmware (>= 1.x) requires the full V0 header and will\n * reject this format with `6a81`.\n */\n Legacy = \"legacy\",\n V0 = \"v0\",\n V1 = \"v1\",\n}\n\nexport type MessageOptions = {\n skipOpenApp?: boolean;\n /**\n * Off-chain message signing mode. Defaults to `V0`.\n *\n * - `V0` (default) \u2014 supported on all firmware with off-chain signing.\n * Falls back to Legacy on `6a81`.\n * - `V1` \u2014 supported on firmware with V1 off-chain signing (not yet\n * released). Falls back to V0 on `6a81`.\n * - `Legacy` \u2014 for backward compatibility with very old Solana app\n * firmware. Current firmware will reject it.\n * - `Raw` \u2014 pass-through: the caller provides the fully formatted\n * payload (as `Uint8Array`) and the SDK sends it as-is.\n *\n * Fallback cascade on `6a81` (invalid header):\n * V1 -> V0 -> Legacy\n * V0 -> Legacy\n * Legacy / Raw -> no fallback\n */\n version?: SignMessageVersion;\n /**\n * V0 only: the application domain to include in the off-chain message header.\n * Encoded as UTF-8 and padded/truncated to 32 bytes.\n * If omitted, defaults to 32 zero bytes. Ignored for V1, Legacy, and Raw.\n *\n * @see https://docs.anza.xyz/proposals/off-chain-message-signing\n */\n appDomain?: string;\n};\n"],
|
|
4
|
+
"sourcesContent": ["export enum SignMessageVersion {\n /**\n * Pass-through mode: sends `sendingData` directly to the device with no\n * header wrapping. Use this when the caller has already built a valid\n * off-chain message payload (e.g. a correctly formatted V0 or V1 OCM).\n * Returns a plain base58 signature (no envelope).\n */\n Raw = \"raw\",\n /**\n * Compact V0 header without `appDomain` or signer fields.\n * Only recognised by older Solana app firmware versions.\n * Current firmware (>= 1.x) requires the full V0 header and will\n * reject this format with `6a81`.\n */\n Legacy = \"legacy\",\n V0 = \"v0\",\n V1 = \"v1\",\n}\n\nexport type MessageOptions = {\n skipOpenApp?: boolean;\n /**\n * Off-chain message signing mode. Defaults to `V0`.\n *\n * - `V0` (default) \u2014 supported on all firmware with off-chain signing.\n * Falls back to Legacy on `6a81`.\n * - `V1` \u2014 supported on firmware with V1 off-chain signing (not yet\n * released). Falls back to V0 on `6a81`.\n * - `Legacy` \u2014 for backward compatibility with very old Solana app\n * firmware. Current firmware will reject it.\n * - `Raw` \u2014 pass-through: the caller provides the fully formatted\n * payload (as `Uint8Array`) and the SDK sends it as-is.\n *\n * Fallback cascade on `6a81` (invalid header):\n * V1 -> V0 -> Legacy\n * V0 -> Legacy\n * Legacy / Raw -> no fallback\n */\n version?: SignMessageVersion;\n /**\n * V0 only: the application domain to include in the off-chain message header.\n * Encoded as UTF-8 and padded/truncated to 32 bytes.\n * If omitted, defaults to 32 zero bytes. Ignored for V1, Legacy, and Raw.\n *\n * @see https://docs.anza.xyz/proposals/off-chain-message-signing\n */\n appDomain?: string;\n /**\n * V1 only: additional required signers to include in the off-chain message\n * header alongside the user's key. Per sRFC 38, this is the recommended\n * replacement for the V0 `appDomain` field \u2014 add the dApp's pubkey here to\n * bind the message to a specific application. Ignored for V0, Legacy, and Raw.\n *\n * Each entry must be a 32-byte Ed25519 public key (`Uint8Array` of length 32).\n * The V1 signer count is encoded as a `uint8`, so at most 254 additional\n * signers are supported (1 slot is reserved for the user's key). Passing a\n * signer with the wrong length or exceeding the limit returns an error before\n * any device communication.\n */\n signers?: Uint8Array[];\n};\n"],
|
|
5
5
|
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAO,IAAKE,OAOVA,EAAA,IAAM,MAONA,EAAA,OAAS,SACTA,EAAA,GAAK,KACLA,EAAA,GAAK,KAhBKA,OAAA",
|
|
6
6
|
"names": ["MessageOptions_exports", "__export", "SignMessageVersion", "__toCommonJS"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/DefaultSignerSolana.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { type SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOption\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SignerSolana } from \"@api/SignerSolana\";\n\nimport { type GetAddressUseCase } from \"./use-cases/address/GetAddressUseCase\";\nimport { type GetAppConfigurationUseCase } from \"./use-cases/app-configuration/GetAppConfigurationUseCase\";\nimport { useCasesTypes } from \"./use-cases/di/useCasesTypes\";\nimport { type SignMessageUseCase } from \"./use-cases/message/SignMessageUseCase\";\nimport { type SignTransactionUseCase } from \"./use-cases/transaction/SignTransactionUseCase\";\nimport { makeContainer } from \"./di\";\n\nexport type DefaultSignerSolanaConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n solanaRPCURL?: string;\n};\n\nexport class DefaultSignerSolana implements SignerSolana {\n private _container: Container;\n\n constructor({\n dmk,\n sessionId,\n contextModule,\n solanaRPCURL,\n }: DefaultSignerSolanaConstructorArgs) {\n this._container = makeContainer({\n dmk,\n sessionId,\n contextModule,\n solanaRPCURL,\n });\n }\n\n /**\n * Securely sign a Solana or SPL transaction using **clear signing** on Ledger devices.\n *\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used in the transaction (e.g. `\"44'/501'/0'/0'\"`).\n *\n * - **transaction** `Uint8Array`\n * The serialised transaction to sign.\n *\n * **Optional**\n * - **solanaTransactionOptionalConfig** `SolanaTransactionOptionalConfig`\n * Provides additional context for transaction signing. The\n * `transactionResolutionContext` is not required \u2014 the signer will attempt\n * to resolve metadata from the transaction itself. Explicitly providing it\n * is recommended when the information is available, as it removes ambiguity\n * and ensures accurate clear-signing details on the device.\n *\n * - **solanaRPCURL** `string`\n * Solana RPC endpoint for fetching a fresh blockhash when\n * `delayed: true`. If the signer was built with\n * `SignerSolanaBuilder({ solanaRPCURL })`, the value here overrides\n * that default for this call only.\n *\n * - **delayed** `boolean`\n * When `true`, uses the device\u2019s two-step signing flow (preview then\n * delayed sign) so review time does not race the blockhash. Requires a\n * Solana app version that supports delayed signing, and either a\n * resolved RPC URL (builder and/or **solanaRPCURL** above) or\n * **fetchBlockhash**. Otherwise the signer falls back to legacy signing.\n *\n * - **fetchBlockhash** `() => Promise<Uint8Array>`\n * Optional. When `delayed: true`, use this instead of the default RPC\n * `getLatestBlockhash` (e.g. custom commitment or RPC). Must return the\n * 32-byte recent blockhash. If provided, an RPC URL is not required for\n * the delayed path.\n *\n * - **transactionResolutionContext** `object`\n * Lets you explicitly pass `tokenAddress` and ATA details, bypassing\n * extraction from the transaction itself.\n *\n * - **tokenAddress** `string`\n * SPL token address being transferred.\n *\n * - **createATA** `object`\n * Information about creating an associated token account (ATA).\n *\n * - **address** `string` \u2013 Address (owner) of the ATA.\n * - **mintAddress** `string` \u2013 Mint address of the ATA.\n *\n * - **tokenInternalId** `string`\n * Ledger internal token ID.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ### Returns\n *\n * `{ observable, cancel }` where:\n * - `observable` emits `DeviceActionState<Uint8Array, SignTransactionDAError, IntermediateValue>` updates.\n * On **Completed**, `output` is a `Uint8Array` containing the 64-byte Ed25519 signature.\n * - `cancel` aborts the action on the Ledger device.\n *\n * @example\n * ```ts\n * const { observable } = signer.signTransaction(\"44'/501'/0'/0'\", serializedTx, {\n * transactionResolutionContext: { tokenAddress: \"EPjFWdd5...\" },\n * });\n * observable.subscribe({\n * next: (state) => {\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output); // Uint8Array\n * }\n * },\n * });\n * ```\n */\n signTransaction(\n derivationPath: string,\n transaction: Transaction,\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig,\n ): SignTransactionDAReturnType {\n return this._container\n .get<SignTransactionUseCase>(useCasesTypes.SignTransactionUseCase)\n .execute(derivationPath, transaction, solanaTransactionOptionalConfig);\n }\n\n /**\n * Sign a Solana off-chain message on the device.\n *\n * Supports multiple signing modes via `SignMessageVersion`:\n * - **V0** (default) \u2014 original header with `appDomain`, up to 65 515 bytes.\n * Falls back to Legacy on `6a81`.\n * - **V1** \u2014 simplified header, up to 65 535 bytes. Falls back to V0 then\n * Legacy on `6a81`. Requires Solana device app version 1.14+.\n * - **Legacy** \u2014 compact header for backward compatibility with old Solana app firmware.\n * - **Raw** \u2014 pass-through: sends a caller-formatted `Uint8Array` payload\n * as-is, no header wrapping.\n *\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used for signing (e.g. `\"44'/501'/0'\"`).\n *\n * - **message** `string | Uint8Array`\n * The message to sign. Pass a `string` for V0/V1/Legacy (UTF-8 encoded\n * automatically). Pass a `Uint8Array` for Raw mode when you have an\n * already-formatted binary payload.\n *\n * **Optional**\n * - **options** `MessageOptions`\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n * - **version** `SignMessageVersion`\n * Off-chain message signing mode. Defaults to `SignMessageVersion.V0`.\n * - **appDomain** `string`\n * V0 only: application domain included in the header (padded/truncated to 32 bytes).\n * Ignored for V1, Legacy, and Raw.\n *\n * ### Returns\n *\n * `{ observable, cancel }` where:\n * - `observable` emits `DeviceActionState<{ signature: string }, SignMessageDAError, IntermediateValue>` updates.\n * On **Completed**, `output.signature` is a base58-encoded string \u2014 a full\n * envelope (V0/V1/Legacy) or the plain Ed25519 signature (Raw).\n * - `cancel` aborts the action on the Ledger device.\n *\n * @example\n * ```ts\n * const { observable } = signer.signMessage(\"44'/501'/0'\", \"Hello World\", {\n * version: SignMessageVersion.V0,\n * });\n * observable.subscribe({\n * next: (state) => {\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output.signature); // base58 string\n * }\n * },\n * });\n * ```\n */\n signMessage(\n derivationPath: string,\n message: string | Uint8Array,\n options?: MessageOptions,\n ): SignMessageDAReturnType {\n return this._container\n .get<SignMessageUseCase>(useCasesTypes.SignMessageUseCase)\n .execute(derivationPath, message, options);\n }\n\n /**\n * Derive and optionally display a Solana address on the device.\n *\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path of the account to retrieve the address from\n * (e.g. `\"44'/501'/0'\"`).\n *\n * **Optional**\n * - **options** `AddressOptions`\n * - **checkOnDevice** `boolean`\n * If `true`, prompts the user to verify the address on the device.\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ### Returns\n *\n * `{ observable, cancel }` where:\n * - `observable` emits `DeviceActionState<string, GetAddressDAError, IntermediateValue>` updates.\n * On **Completed**, `output` is the base58-encoded Solana address.\n * - `cancel` aborts the action on the Ledger device.\n *\n * @example\n * ```ts\n * const { observable } = signer.getAddress(\"44'/501'/0'\", { checkOnDevice: true });\n * observable.subscribe({\n * next: (state) => {\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Address:\", state.output); // base58 string\n * }\n * },\n * });\n * ```\n */\n getAddress(\n derivationPath: string,\n options?: AddressOptions,\n ): GetAddressDAReturnType {\n return this._container\n .get<GetAddressUseCase>(useCasesTypes.GetAddressUseCase)\n .execute(derivationPath, options);\n }\n\n /**\n * Query the Solana app version and settings on the connected device.\n *\n * ### Parameters\n *\n * This method does not require any parameters.\n *\n * ### Returns\n *\n * `{ observable, cancel }` where:\n * - `observable` emits `DeviceActionState<AppConfiguration, GetAppConfigurationDAError, IntermediateValue>` updates.\n * On **Completed**, `output` contains:\n * - `blindSigningEnabled` `boolean` \u2014 whether blind signing is enabled.\n * - `pubKeyDisplayMode` `PublicKeyDisplayMode` \u2014 how the public key is displayed.\n * - `version` `string` \u2014 the Solana app version (e.g. `\"1.14.0\"`).\n * - `cancel` aborts the action on the Ledger device.\n *\n * @example\n * ```ts\n * const { observable } = signer.getAppConfiguration();\n * observable.subscribe({\n * next: (state) => {\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(`Solana app v${state.output.version}`);\n * }\n * },\n * });\n * ```\n */\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this._container\n .get<GetAppConfigurationUseCase>(useCasesTypes.GetAppConfigurationUseCase)\n .execute();\n }\n}\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAmBA,IAAAI,EAA8B,wCAG9BC,EAA8B,gBASvB,MAAMH,CAA4C,CAC/C,WAER,YAAY,CACV,IAAAI,EACA,UAAAC,EACA,cAAAC,EACA,aAAAC,CACF,EAAuC,CACrC,KAAK,cAAa,iBAAc,CAC9B,IAAAH,EACA,UAAAC,EACA,cAAAC,EACA,aAAAC,CACF,CAAC,CACH,CAiFA,gBACEC,EACAC,EACAC,EAC6B,CAC7B,OAAO,KAAK,WACT,IAA4B,gBAAc,sBAAsB,EAChE,QAAQF,EAAgBC,EAAaC,CAA+B,CACzE,
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { type SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOption\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SignerSolana } from \"@api/SignerSolana\";\n\nimport { type GetAddressUseCase } from \"./use-cases/address/GetAddressUseCase\";\nimport { type GetAppConfigurationUseCase } from \"./use-cases/app-configuration/GetAppConfigurationUseCase\";\nimport { useCasesTypes } from \"./use-cases/di/useCasesTypes\";\nimport { type SignMessageUseCase } from \"./use-cases/message/SignMessageUseCase\";\nimport { type SignTransactionUseCase } from \"./use-cases/transaction/SignTransactionUseCase\";\nimport { makeContainer } from \"./di\";\n\nexport type DefaultSignerSolanaConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n solanaRPCURL?: string;\n};\n\nexport class DefaultSignerSolana implements SignerSolana {\n private _container: Container;\n\n constructor({\n dmk,\n sessionId,\n contextModule,\n solanaRPCURL,\n }: DefaultSignerSolanaConstructorArgs) {\n this._container = makeContainer({\n dmk,\n sessionId,\n contextModule,\n solanaRPCURL,\n });\n }\n\n /**\n * Securely sign a Solana or SPL transaction using **clear signing** on Ledger devices.\n *\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used in the transaction (e.g. `\"44'/501'/0'/0'\"`).\n *\n * - **transaction** `Uint8Array`\n * The serialised transaction to sign.\n *\n * **Optional**\n * - **solanaTransactionOptionalConfig** `SolanaTransactionOptionalConfig`\n * Provides additional context for transaction signing. The\n * `transactionResolutionContext` is not required \u2014 the signer will attempt\n * to resolve metadata from the transaction itself. Explicitly providing it\n * is recommended when the information is available, as it removes ambiguity\n * and ensures accurate clear-signing details on the device.\n *\n * - **solanaRPCURL** `string`\n * Solana RPC endpoint for fetching a fresh blockhash when\n * `delayed: true`. If the signer was built with\n * `SignerSolanaBuilder({ solanaRPCURL })`, the value here overrides\n * that default for this call only.\n *\n * - **delayed** `boolean`\n * When `true`, uses the device\u2019s two-step signing flow (preview then\n * delayed sign) so review time does not race the blockhash. Requires a\n * Solana app version that supports delayed signing, and either a\n * resolved RPC URL (builder and/or **solanaRPCURL** above) or\n * **fetchBlockhash**. Otherwise the signer falls back to legacy signing.\n *\n * - **fetchBlockhash** `() => Promise<Uint8Array>`\n * Optional. When `delayed: true`, use this instead of the default RPC\n * `getLatestBlockhash` (e.g. custom commitment or RPC). Must return the\n * 32-byte recent blockhash. If provided, an RPC URL is not required for\n * the delayed path.\n *\n * - **transactionResolutionContext** `object`\n * Lets you explicitly pass `tokenAddress` and ATA details, bypassing\n * extraction from the transaction itself.\n *\n * - **tokenAddress** `string`\n * SPL token address being transferred.\n *\n * - **createATA** `object`\n * Information about creating an associated token account (ATA).\n *\n * - **address** `string` \u2013 Address (owner) of the ATA.\n * - **mintAddress** `string` \u2013 Mint address of the ATA.\n *\n * - **tokenInternalId** `string`\n * Ledger internal token ID.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ### Returns\n *\n * `{ observable, cancel }` where:\n * - `observable` emits `DeviceActionState<Uint8Array, SignTransactionDAError, IntermediateValue>` updates.\n * On **Completed**, `output` is a `Uint8Array` containing the 64-byte Ed25519 signature.\n * - `cancel` aborts the action on the Ledger device.\n *\n * @example\n * ```ts\n * const { observable } = signer.signTransaction(\"44'/501'/0'/0'\", serializedTx, {\n * transactionResolutionContext: { tokenAddress: \"EPjFWdd5...\" },\n * });\n * observable.subscribe({\n * next: (state) => {\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output); // Uint8Array\n * }\n * },\n * });\n * ```\n */\n signTransaction(\n derivationPath: string,\n transaction: Transaction,\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig,\n ): SignTransactionDAReturnType {\n return this._container\n .get<SignTransactionUseCase>(useCasesTypes.SignTransactionUseCase)\n .execute(derivationPath, transaction, solanaTransactionOptionalConfig);\n }\n\n /**\n * Sign a Solana off-chain message on the device.\n *\n * Supports multiple signing modes via `SignMessageVersion`:\n * - **V0** (default) \u2014 original header with `appDomain`, up to 65 515 bytes.\n * Falls back to Legacy on `6a81`.\n * - **V1** \u2014 simplified header per sRFC 38, up to 65 535 bytes. No `appDomain`\n * field; use `signers` to bind the message to a specific application instead.\n * Falls back to V0 then Legacy on `6a81`. Requires Solana device app version 1.14+.\n * - **Legacy** \u2014 compact header for backward compatibility with old Solana app firmware.\n * - **Raw** \u2014 pass-through: sends a caller-formatted `Uint8Array` payload\n * as-is, no header wrapping.\n *\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used for signing (e.g. `\"44'/501'/0'\"`).\n *\n * - **message** `string | Uint8Array`\n * The message to sign. Pass a `string` for V0/V1/Legacy (UTF-8 encoded\n * automatically). Pass a `Uint8Array` for Raw mode when you have an\n * already-formatted binary payload.\n *\n * **Optional**\n * - **options** `MessageOptions`\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n * - **version** `SignMessageVersion`\n * Off-chain message signing mode. Defaults to `SignMessageVersion.V0`.\n * - **appDomain** `string`\n * V0 only: application domain included in the header (padded/truncated to 32 bytes).\n * Ignored for V1, Legacy, and Raw.\n * - **signers** `Uint8Array[]`\n * V1 only: additional required signers included in the off-chain message header\n * alongside the user's key. Per sRFC 38, this is the recommended replacement for\n * the V0 `appDomain` field \u2014 pass the dApp's public key here to bind the message\n * to a specific application. Signers are sorted and deduplicated automatically.\n * Each entry must be a 32-byte Ed25519 public key. At most 254 additional signers\n * are supported (1 slot reserved for the user's key). Invalid length or exceeding\n * the limit returns an error before any device communication.\n * Ignored for V0, Legacy, and Raw.\n *\n * ### Returns\n *\n * `{ observable, cancel }` where:\n * - `observable` emits `DeviceActionState<{ signature: string }, SignMessageDAError, IntermediateValue>` updates.\n * On **Completed**, `output.signature` is a base58-encoded string \u2014 a full\n * envelope (V0/V1/Legacy) or the plain Ed25519 signature (Raw).\n * - `cancel` aborts the action on the Ledger device.\n *\n * @example\n * ```ts\n * // V0 with app domain\n * const { observable } = signer.signMessage(\"44'/501'/0'\", \"Hello World\", {\n * version: SignMessageVersion.V0,\n * appDomain: \"my-app.com\",\n * });\n *\n * // V1 with additional required signer (replaces appDomain per sRFC 38)\n * const { observable } = signer.signMessage(\"44'/501'/0'\", \"Hello World\", {\n * version: SignMessageVersion.V1,\n * signers: [dAppPubkeyBytes],\n * });\n *\n * observable.subscribe({\n * next: (state) => {\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output.signature); // base58 string\n * }\n * },\n * });\n * ```\n */\n signMessage(\n derivationPath: string,\n message: string | Uint8Array,\n options?: MessageOptions,\n ): SignMessageDAReturnType {\n return this._container\n .get<SignMessageUseCase>(useCasesTypes.SignMessageUseCase)\n .execute(derivationPath, message, options);\n }\n\n /**\n * Derive and optionally display a Solana address on the device.\n *\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path of the account to retrieve the address from\n * (e.g. `\"44'/501'/0'\"`).\n *\n * **Optional**\n * - **options** `AddressOptions`\n * - **checkOnDevice** `boolean`\n * If `true`, prompts the user to verify the address on the device.\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ### Returns\n *\n * `{ observable, cancel }` where:\n * - `observable` emits `DeviceActionState<string, GetAddressDAError, IntermediateValue>` updates.\n * On **Completed**, `output` is the base58-encoded Solana address.\n * - `cancel` aborts the action on the Ledger device.\n *\n * @example\n * ```ts\n * const { observable } = signer.getAddress(\"44'/501'/0'\", { checkOnDevice: true });\n * observable.subscribe({\n * next: (state) => {\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Address:\", state.output); // base58 string\n * }\n * },\n * });\n * ```\n */\n getAddress(\n derivationPath: string,\n options?: AddressOptions,\n ): GetAddressDAReturnType {\n return this._container\n .get<GetAddressUseCase>(useCasesTypes.GetAddressUseCase)\n .execute(derivationPath, options);\n }\n\n /**\n * Query the Solana app version and settings on the connected device.\n *\n * ### Parameters\n *\n * This method does not require any parameters.\n *\n * ### Returns\n *\n * `{ observable, cancel }` where:\n * - `observable` emits `DeviceActionState<AppConfiguration, GetAppConfigurationDAError, IntermediateValue>` updates.\n * On **Completed**, `output` contains:\n * - `blindSigningEnabled` `boolean` \u2014 whether blind signing is enabled.\n * - `pubKeyDisplayMode` `PublicKeyDisplayMode` \u2014 how the public key is displayed.\n * - `version` `string` \u2014 the Solana app version (e.g. `\"1.14.0\"`).\n * - `cancel` aborts the action on the Ledger device.\n *\n * @example\n * ```ts\n * const { observable } = signer.getAppConfiguration();\n * observable.subscribe({\n * next: (state) => {\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(`Solana app v${state.output.version}`);\n * }\n * },\n * });\n * ```\n */\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this._container\n .get<GetAppConfigurationUseCase>(useCasesTypes.GetAppConfigurationUseCase)\n .execute();\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAmBA,IAAAI,EAA8B,wCAG9BC,EAA8B,gBASvB,MAAMH,CAA4C,CAC/C,WAER,YAAY,CACV,IAAAI,EACA,UAAAC,EACA,cAAAC,EACA,aAAAC,CACF,EAAuC,CACrC,KAAK,cAAa,iBAAc,CAC9B,IAAAH,EACA,UAAAC,EACA,cAAAC,EACA,aAAAC,CACF,CAAC,CACH,CAiFA,gBACEC,EACAC,EACAC,EAC6B,CAC7B,OAAO,KAAK,WACT,IAA4B,gBAAc,sBAAsB,EAChE,QAAQF,EAAgBC,EAAaC,CAA+B,CACzE,CA4EA,YACEF,EACAG,EACAC,EACyB,CACzB,OAAO,KAAK,WACT,IAAwB,gBAAc,kBAAkB,EACxD,QAAQJ,EAAgBG,EAASC,CAAO,CAC7C,CAsCA,WACEJ,EACAI,EACwB,CACxB,OAAO,KAAK,WACT,IAAuB,gBAAc,iBAAiB,EACtD,QAAQJ,EAAgBI,CAAO,CACpC,CA+BA,qBAAuD,CACrD,OAAO,KAAK,WACT,IAAgC,gBAAc,0BAA0B,EACxE,QAAQ,CACb,CACF",
|
|
6
6
|
"names": ["DefaultSignerSolana_exports", "__export", "DefaultSignerSolana", "__toCommonJS", "import_useCasesTypes", "import_di", "dmk", "sessionId", "contextModule", "solanaRPCURL", "derivationPath", "transaction", "solanaTransactionOptionalConfig", "message", "options"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var g=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var T=(n,e)=>{for(var t in e)g(n,t,{get:e[t],enumerable:!0})},C=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of y(e))!S.call(n,i)&&i!==t&&g(n,i,{get:()=>e[i],enumerable:!(o=v(e,i))||o.enumerable});return n};var I=n=>C(g({},"__esModule",{value:!0}),n),h=(n,e,t,o)=>{for(var i=o>1?void 0:o?v(e,t):e,m=n.length-1,d;m>=0;m--)(d=n[m])&&(i=(o?d(e,t,i):d(i))||i);return o&&i&&g(e,t,i),i},a=(n,e)=>(t,o)=>e(t,o,n);var P={};T(P,{SolanaAppBinder:()=>c});module.exports=I(P);var r=require("@ledgerhq/device-management-kit"),s=require("inversify"),
|
|
1
|
+
"use strict";var g=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var T=(n,e)=>{for(var t in e)g(n,t,{get:e[t],enumerable:!0})},C=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of y(e))!S.call(n,i)&&i!==t&&g(n,i,{get:()=>e[i],enumerable:!(o=v(e,i))||o.enumerable});return n};var I=n=>C(g({},"__esModule",{value:!0}),n),h=(n,e,t,o)=>{for(var i=o>1?void 0:o?v(e,t):e,m=n.length-1,d;m>=0;m--)(d=n[m])&&(i=(o?d(e,t,i):d(i))||i);return o&&i&&g(e,t,i),i},a=(n,e)=>(t,o)=>e(t,o,n);var P={};T(P,{SolanaAppBinder:()=>c});module.exports=I(P);var r=require("@ledgerhq/device-management-kit"),s=require("inversify"),A=require("../app-binder/task/SendSignMessageTask"),p=require("../externalTypes"),l=require("./command/GetAppConfigurationCommand"),k=require("./command/GetPubKeyCommand"),f=require("./device-action/SignTransactionDeviceAction"),D=require("./di/appBinderTypes"),u=require("./constants");let c=class{constructor(e,t,o,i,m,d){this.dmk=e;this.sessionId=t;this.contextModule=o;this.dmkLoggerFactory=i;this.solanaRPCURL=m;this.blockhashService=d}getAddress(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new r.SendCommandInAppDeviceAction({input:{command:new k.GetPubKeyCommand(e),appName:u.APP_NAME,requiredUserInteraction:e.checkOnDevice?r.UserInteractionRequired.VerifyAddress:r.UserInteractionRequired.None,skipOpenApp:e.skipOpenApp},logger:this.dmkLoggerFactory("GetPubKeyCommand")})})}signTransaction(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new f.SignTransactionDeviceAction({input:{derivationPath:e.derivationPath,transaction:e.transaction,transactionOptions:e.solanaTransactionOptionalConfig,contextModule:this.contextModule,solanaRPCURL:this.solanaRPCURL,blockhashService:this.blockhashService},loggerFactory:this.dmkLoggerFactory})})}signMessage(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new r.CallTaskInAppDeviceAction({input:{task:async t=>new A.SendSignMessageTask(t,{derivationPath:e.derivationPath,sendingData:e.message,version:e.version,appDomain:e.appDomain,signers:e.signers}).run(),appName:u.APP_NAME,requiredUserInteraction:r.UserInteractionRequired.SignPersonalMessage,skipOpenApp:e.skipOpenApp},logger:this.dmkLoggerFactory("SendSignMessageTask")})})}getAppConfiguration(){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new r.SendCommandInAppDeviceAction({input:{command:new l.GetAppConfigurationCommand,appName:u.APP_NAME,requiredUserInteraction:r.UserInteractionRequired.None,skipOpenApp:!1},logger:this.dmkLoggerFactory("GetAppConfigurationCommand")})})}};c=h([(0,s.injectable)(),a(0,(0,s.inject)(p.externalTypes.Dmk)),a(1,(0,s.inject)(p.externalTypes.SessionId)),a(2,(0,s.inject)(p.externalTypes.ContextModule)),a(3,(0,s.inject)(p.externalTypes.DmkLoggerFactory)),a(4,(0,s.inject)(p.externalTypes.SolanaRPCURL)),a(5,(0,s.inject)(D.appBinderTypes.BlockhashService))],c);0&&(module.exports={SolanaAppBinder});
|
|
2
2
|
//# sourceMappingURL=SolanaAppBinder.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/app-binder/SolanaAppBinder.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CallTaskInAppDeviceAction,\n DeviceManagementKit,\n type DeviceSessionId,\n LoggerPublisherService,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type SignMessageVersion } from \"@api/model/MessageOptions\";\nimport { SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { Transaction } from \"@api/model/Transaction\";\nimport { SendSignMessageTask } from \"@internal/app-binder/task/SendSignMessageTask\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\nimport { GetAppConfigurationCommand } from \"./command/GetAppConfigurationCommand\";\nimport { GetPubKeyCommand } from \"./command/GetPubKeyCommand\";\nimport { SignTransactionDeviceAction } from \"./device-action/SignTransactionDeviceAction\";\nimport { appBinderTypes } from \"./di/appBinderTypes\";\nimport { BlockhashService } from \"./services/BlockhashService\";\nimport { APP_NAME } from \"./constants\";\n\n@injectable()\nexport class SolanaAppBinder {\n constructor(\n @inject(externalTypes.Dmk) private dmk: DeviceManagementKit,\n @inject(externalTypes.SessionId) private sessionId: DeviceSessionId,\n @inject(externalTypes.ContextModule) private contextModule: ContextModule,\n @inject(externalTypes.DmkLoggerFactory)\n private dmkLoggerFactory: (tag: string) => LoggerPublisherService,\n @inject(externalTypes.SolanaRPCURL)\n private solanaRPCURL: string | undefined,\n @inject(appBinderTypes.BlockhashService)\n private blockhashService: BlockhashService,\n ) {}\n\n getAddress(args: {\n derivationPath: string;\n checkOnDevice: boolean;\n skipOpenApp: boolean;\n }): GetAddressDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetPubKeyCommand(args),\n appName: APP_NAME,\n requiredUserInteraction: args.checkOnDevice\n ? UserInteractionRequired.VerifyAddress\n : UserInteractionRequired.None,\n skipOpenApp: args.skipOpenApp,\n },\n logger: this.dmkLoggerFactory(\"GetPubKeyCommand\"),\n }),\n });\n }\n\n signTransaction(args: {\n derivationPath: string;\n transaction: Transaction;\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig;\n }): SignTransactionDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SignTransactionDeviceAction({\n input: {\n derivationPath: args.derivationPath,\n transaction: args.transaction,\n transactionOptions: args.solanaTransactionOptionalConfig,\n contextModule: this.contextModule,\n solanaRPCURL: this.solanaRPCURL,\n blockhashService: this.blockhashService,\n },\n loggerFactory: this.dmkLoggerFactory,\n }),\n });\n }\n\n signMessage(args: {\n derivationPath: string;\n message: string | Uint8Array;\n skipOpenApp: boolean;\n version?: SignMessageVersion;\n appDomain?: string;\n }): SignMessageDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new CallTaskInAppDeviceAction({\n input: {\n task: async (internalApi) =>\n new SendSignMessageTask(internalApi, {\n derivationPath: args.derivationPath,\n sendingData: args.message,\n version: args.version,\n appDomain: args.appDomain,\n }).run(),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.SignPersonalMessage,\n skipOpenApp: args.skipOpenApp,\n },\n logger: this.dmkLoggerFactory(\"SendSignMessageTask\"),\n }),\n });\n }\n\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n logger: this.dmkLoggerFactory(\"GetAppConfigurationCommand\"),\n }),\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAOO,2CACPC,EAAmC,qBASnCC,EAAoC,yDACpCC,EAA8B,mCAE9BC,EAA2C,gDAC3CC,EAAiC,sCACjCC,EAA4C,uDAC5CC,EAA+B,+BAE/BC,EAAyB,uBAGlB,IAAMC,EAAN,KAAsB,CAC3B,YACqCC,EACMC,EACIC,EAErCC,EAEAC,EAEAC,EACR,CATmC,SAAAL,EACM,eAAAC,EACI,mBAAAC,EAErC,sBAAAC,EAEA,kBAAAC,EAEA,sBAAAC,CACP,CAEH,WAAWC,EAIgB,CACzB,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAI,+BAA6B,CAC7C,MAAO,CACL,QAAS,IAAI,mBAAiBA,CAAI,EAClC,QAAS,WACT,wBAAyBA,EAAK,cAC1B,0BAAwB,cACxB,0BAAwB,KAC5B,YAAaA,EAAK,WACpB,EACA,OAAQ,KAAK,iBAAiB,kBAAkB,CAClD,CAAC,CACH,CAAC,CACH,CAEA,gBAAgBA,EAIgB,CAC9B,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAI,8BAA4B,CAC5C,MAAO,CACL,eAAgBA,EAAK,eACrB,YAAaA,EAAK,YAClB,mBAAoBA,EAAK,gCACzB,cAAe,KAAK,cACpB,aAAc,KAAK,aACnB,iBAAkB,KAAK,gBACzB,EACA,cAAe,KAAK,gBACtB,CAAC,CACH,CAAC,CACH,CAEA,YAAYA,
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CallTaskInAppDeviceAction,\n DeviceManagementKit,\n type DeviceSessionId,\n LoggerPublisherService,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type SignMessageVersion } from \"@api/model/MessageOptions\";\nimport { SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { Transaction } from \"@api/model/Transaction\";\nimport { SendSignMessageTask } from \"@internal/app-binder/task/SendSignMessageTask\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\nimport { GetAppConfigurationCommand } from \"./command/GetAppConfigurationCommand\";\nimport { GetPubKeyCommand } from \"./command/GetPubKeyCommand\";\nimport { SignTransactionDeviceAction } from \"./device-action/SignTransactionDeviceAction\";\nimport { appBinderTypes } from \"./di/appBinderTypes\";\nimport { BlockhashService } from \"./services/BlockhashService\";\nimport { APP_NAME } from \"./constants\";\n\n@injectable()\nexport class SolanaAppBinder {\n constructor(\n @inject(externalTypes.Dmk) private dmk: DeviceManagementKit,\n @inject(externalTypes.SessionId) private sessionId: DeviceSessionId,\n @inject(externalTypes.ContextModule) private contextModule: ContextModule,\n @inject(externalTypes.DmkLoggerFactory)\n private dmkLoggerFactory: (tag: string) => LoggerPublisherService,\n @inject(externalTypes.SolanaRPCURL)\n private solanaRPCURL: string | undefined,\n @inject(appBinderTypes.BlockhashService)\n private blockhashService: BlockhashService,\n ) {}\n\n getAddress(args: {\n derivationPath: string;\n checkOnDevice: boolean;\n skipOpenApp: boolean;\n }): GetAddressDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetPubKeyCommand(args),\n appName: APP_NAME,\n requiredUserInteraction: args.checkOnDevice\n ? UserInteractionRequired.VerifyAddress\n : UserInteractionRequired.None,\n skipOpenApp: args.skipOpenApp,\n },\n logger: this.dmkLoggerFactory(\"GetPubKeyCommand\"),\n }),\n });\n }\n\n signTransaction(args: {\n derivationPath: string;\n transaction: Transaction;\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig;\n }): SignTransactionDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SignTransactionDeviceAction({\n input: {\n derivationPath: args.derivationPath,\n transaction: args.transaction,\n transactionOptions: args.solanaTransactionOptionalConfig,\n contextModule: this.contextModule,\n solanaRPCURL: this.solanaRPCURL,\n blockhashService: this.blockhashService,\n },\n loggerFactory: this.dmkLoggerFactory,\n }),\n });\n }\n\n signMessage(args: {\n derivationPath: string;\n message: string | Uint8Array;\n skipOpenApp: boolean;\n version?: SignMessageVersion;\n appDomain?: string;\n signers?: Uint8Array[];\n }): SignMessageDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new CallTaskInAppDeviceAction({\n input: {\n task: async (internalApi) =>\n new SendSignMessageTask(internalApi, {\n derivationPath: args.derivationPath,\n sendingData: args.message,\n version: args.version,\n appDomain: args.appDomain,\n signers: args.signers,\n }).run(),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.SignPersonalMessage,\n skipOpenApp: args.skipOpenApp,\n },\n logger: this.dmkLoggerFactory(\"SendSignMessageTask\"),\n }),\n });\n }\n\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n logger: this.dmkLoggerFactory(\"GetAppConfigurationCommand\"),\n }),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAOO,2CACPC,EAAmC,qBASnCC,EAAoC,yDACpCC,EAA8B,mCAE9BC,EAA2C,gDAC3CC,EAAiC,sCACjCC,EAA4C,uDAC5CC,EAA+B,+BAE/BC,EAAyB,uBAGlB,IAAMC,EAAN,KAAsB,CAC3B,YACqCC,EACMC,EACIC,EAErCC,EAEAC,EAEAC,EACR,CATmC,SAAAL,EACM,eAAAC,EACI,mBAAAC,EAErC,sBAAAC,EAEA,kBAAAC,EAEA,sBAAAC,CACP,CAEH,WAAWC,EAIgB,CACzB,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAI,+BAA6B,CAC7C,MAAO,CACL,QAAS,IAAI,mBAAiBA,CAAI,EAClC,QAAS,WACT,wBAAyBA,EAAK,cAC1B,0BAAwB,cACxB,0BAAwB,KAC5B,YAAaA,EAAK,WACpB,EACA,OAAQ,KAAK,iBAAiB,kBAAkB,CAClD,CAAC,CACH,CAAC,CACH,CAEA,gBAAgBA,EAIgB,CAC9B,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAI,8BAA4B,CAC5C,MAAO,CACL,eAAgBA,EAAK,eACrB,YAAaA,EAAK,YAClB,mBAAoBA,EAAK,gCACzB,cAAe,KAAK,cACpB,aAAc,KAAK,aACnB,iBAAkB,KAAK,gBACzB,EACA,cAAe,KAAK,gBACtB,CAAC,CACH,CAAC,CACH,CAEA,YAAYA,EAOgB,CAC1B,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAI,4BAA0B,CAC1C,MAAO,CACL,KAAM,MAAOC,GACX,IAAI,sBAAoBA,EAAa,CACnC,eAAgBD,EAAK,eACrB,YAAaA,EAAK,QAClB,QAASA,EAAK,QACd,UAAWA,EAAK,UAChB,QAASA,EAAK,OAChB,CAAC,EAAE,IAAI,EACT,QAAS,WACT,wBAAyB,0BAAwB,oBACjD,YAAaA,EAAK,WACpB,EACA,OAAQ,KAAK,iBAAiB,qBAAqB,CACrD,CAAC,CACH,CAAC,CACH,CAEA,qBAAuD,CACrD,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAI,+BAA6B,CAC7C,MAAO,CACL,QAAS,IAAI,6BACb,QAAS,WACT,wBAAyB,0BAAwB,KACjD,YAAa,EACf,EACA,OAAQ,KAAK,iBAAiB,4BAA4B,CAC5D,CAAC,CACH,CAAC,CACH,CACF,EAlGaP,EAANS,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,gBAAc,GAAG,GACxBA,EAAA,eAAO,gBAAc,SAAS,GAC9BA,EAAA,eAAO,gBAAc,aAAa,GAClCA,EAAA,eAAO,gBAAc,gBAAgB,GAErCA,EAAA,eAAO,gBAAc,YAAY,GAEjCA,EAAA,eAAO,iBAAe,gBAAgB,IAT9BV",
|
|
6
6
|
"names": ["SolanaAppBinder_exports", "__export", "SolanaAppBinder", "__toCommonJS", "import_device_management_kit", "import_inversify", "import_SendSignMessageTask", "import_externalTypes", "import_GetAppConfigurationCommand", "import_GetPubKeyCommand", "import_SignTransactionDeviceAction", "import_appBinderTypes", "import_constants", "SolanaAppBinder", "dmk", "sessionId", "contextModule", "dmkLoggerFactory", "solanaRPCURL", "blockhashService", "args", "internalApi", "__decorateClass", "__decorateParam"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var o=require("@ledgerhq/device-management-kit"),m=require("rxjs"),
|
|
1
|
+
"use strict";var o=require("@ledgerhq/device-management-kit"),m=require("rxjs"),x=require("../../api/index"),f=require("../app-binder/services/bs58Encoder"),b=require("./command/GetAppConfigurationCommand"),D=require("./command/GetPubKeyCommand"),d=require("./services/BlockhashService"),g=require("./constants"),u=require("./SolanaAppBinder");const A=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]});describe("SolanaAppBinder",()=>{const c={},i={sendCommand:vi.fn(),executeDeviceAction:vi.fn()};beforeEach(()=>{vi.clearAllMocks()}),it("should be defined",()=>{const s=new u.SolanaAppBinder({},{},c,A,void 0,new d.BlockhashService);expect(s).toBeDefined()}),describe("getAddress",()=>{it("should return the address",()=>new Promise((s,n)=>{const t="D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5";vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,m.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const r=new u.SolanaAppBinder(i,"sessionId",c,A,void 0,new d.BlockhashService),{observable:l}=r.getAddress({derivationPath:"44'/501'",checkOnDevice:!1,skipOpenApp:!1}),a=[];l.subscribe({next:e=>{a.push(e)},error:e=>{n(e)},complete:()=>{try{expect(a).toEqual([{status:o.DeviceActionStatus.Completed,output:t}]),s()}catch(e){n(e)}}})})),describe("calls of executeDeviceAction with the correct params",()=>{const s={derivationPath:"44'/60'/3'/2/1",returnChainCode:!1,skipOpenApp:!1};it("when checkOnDevice is true: UserInteractionRequired.VerifyAddress",()=>{const t={...s,checkOnDevice:!0};new u.SolanaAppBinder(i,"sessionId",c,A,void 0,new d.BlockhashService).getAddress(t),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new D.GetPubKeyCommand(t),appName:g.APP_NAME,requiredUserInteraction:o.UserInteractionRequired.VerifyAddress,skipOpenApp:!1}})}))}),it("when checkOnDevice is false: UserInteractionRequired.None",()=>{const t={...s,checkOnDevice:!1};new u.SolanaAppBinder(i,"sessionId",c,A,void 0,new d.BlockhashService).getAddress(t),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new D.GetPubKeyCommand(t),appName:g.APP_NAME,requiredUserInteraction:o.UserInteractionRequired.None,skipOpenApp:!1}})}))})})}),describe("signTransaction",()=>{it("should return the signature",()=>new Promise((s,n)=>{const t=new Uint8Array([1,2,3]);vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,m.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const r=new u.SolanaAppBinder(i,"sessionId",c,A,void 0,new d.BlockhashService),{observable:l}=r.signTransaction({derivationPath:"44'/501'",transaction:new Uint8Array([1,2,3,4]),solanaTransactionOptionalConfig:{skipOpenApp:!1}}),a=[];l.subscribe({next:e=>{a.push(e)},error:e=>{n(e)},complete:()=>{try{expect(a).toEqual([{status:o.DeviceActionStatus.Completed,output:t}]),s()}catch(e){n(e)}}})})),it("should call executeDeviceAction with the correct params",()=>{const s="44'/60'/3'/2/1",n=new Uint8Array([1,2,3,4]),t=!1;new u.SolanaAppBinder(i,"sessionId",c,A,void 0,new d.BlockhashService).signTransaction({derivationPath:s,transaction:n,solanaTransactionOptionalConfig:{skipOpenApp:!1}}),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:expect.objectContaining({derivationPath:s,transaction:n,transactionOptions:{skipOpenApp:t},contextModule:c})})}))})}),describe("signMessage",()=>{it("should return the signed message",()=>new Promise((s,n)=>{const t={signature:"signature"},r={derivationPath:"44'/501'/0'/0'",message:"Hello world",skipOpenApp:!1};vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,m.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const l=new u.SolanaAppBinder(i,"sessionId",c,A,void 0,new d.BlockhashService),{observable:a}=l.signMessage(r),e=[];a.subscribe({next:p=>{e.push(p)},error:p=>{n(p)},complete:()=>{try{expect(e).toEqual([{status:o.DeviceActionStatus.Completed,output:t}]),s()}catch(p){n(p)}}})})),it("passes signers into the V1 OCM via the task closure",async()=>{const s=[new Uint8Array(32).fill(34)],n=new Uint8Array(32).fill(17),t=new Uint8Array(64).fill(170);i.executeDeviceAction.mockReturnValueOnce({observable:(0,m.from)([]),cancel:vi.fn()}),new u.SolanaAppBinder(i,"sessionId",c,A,void 0,new d.BlockhashService).signMessage({derivationPath:"44'/501'/0'/0'",message:"hi",skipOpenApp:!1,version:x.SignMessageVersion.V1,signers:s});const l=vi.mocked(i.executeDeviceAction).mock.calls[0][0].deviceAction.input.task,a=vi.fn().mockResolvedValueOnce((0,o.CommandResultFactory)({data:f.DefaultBs58Encoder.encode(n)})).mockResolvedValueOnce((0,o.CommandResultFactory)({data:t})),e=await l({sendCommand:a});if(expect("data"in e).toBe(!0),!("data"in e))throw new Error("expected data result");const v=f.DefaultBs58Encoder.decode(e.data.signature).slice(65);expect(v[16]).toBe(1),expect(v[17]).toBe(2),expect(v.slice(18,50)).toEqual(n),expect(v.slice(50,82)).toEqual(s[0])}),it("should accept a Uint8Array message for Raw pass-through",()=>new Promise((s,n)=>{const t={signature:"rawSig"},r=new Uint8Array([255,1,2]);vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,m.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const l=new u.SolanaAppBinder(i,"sessionId",c,A,void 0,new d.BlockhashService),{observable:a}=l.signMessage({derivationPath:"44'/501'/0'/0'",message:r,skipOpenApp:!1}),e=[];a.subscribe({next:p=>e.push(p),error:p=>n(p),complete:()=>{try{expect(e).toEqual([{status:o.DeviceActionStatus.Completed,output:t}]),s()}catch(p){n(p)}}})}))}),describe("getAppConfiguration",()=>{it("should return the app configuration",()=>new Promise((s,n)=>{const t={blindSigningEnabled:!0,pubKeyDisplayMode:"LONG",version:"2.5.10"};vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,m.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const r=new u.SolanaAppBinder(i,"sessionId",c,A,void 0,new d.BlockhashService),{observable:l}=r.getAppConfiguration(),a=[];l.subscribe({next:e=>{a.push(e)},error:e=>{n(e)},complete:()=>{try{expect(a).toEqual([{status:o.DeviceActionStatus.Completed,output:t}]),s()}catch(e){n(e)}}})})),it("should call executeDeviceAction with the correct params",()=>{new u.SolanaAppBinder(i,"sessionId",c,A,void 0,new d.BlockhashService).getAppConfiguration(),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new b.GetAppConfigurationCommand,appName:g.APP_NAME,requiredUserInteraction:o.UserInteractionRequired.None,skipOpenApp:!1}})}))})})});
|
|
2
2
|
//# sourceMappingURL=SolanaAppBinder.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/app-binder/SolanaAppBinder.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceActionIntermediateValue,\n type DeviceActionState,\n DeviceActionStatus,\n type DeviceManagementKit,\n type DeviceSessionId,\n type DmkError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { from } from \"rxjs\";\n\nimport {\n type GetAppConfigurationDAError,\n type GetAppConfigurationDAIntermediateValue,\n type GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport {\n type GetAddressDAError,\n type GetAddressDAIntermediateValue,\n type GetAddressDAOutput,\n type SignMessageDAOutput,\n type SignTransactionDAError,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAOutput,\n} from \"@api/index\";\n\nimport { GetAppConfigurationCommand } from \"./command/GetAppConfigurationCommand\";\nimport { GetPubKeyCommand } from \"./command/GetPubKeyCommand\";\nimport { BlockhashService } from \"./services/BlockhashService\";\nimport { APP_NAME } from \"./constants\";\nimport { SolanaAppBinder } from \"./SolanaAppBinder\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"SolanaAppBinder\", () => {\n // stub ContextModule for tests\n const contextModuleStub: ContextModule = {} as ContextModule;\n\n const mockedDmk: DeviceManagementKit = {\n sendCommand: vi.fn(),\n executeDeviceAction: vi.fn(),\n } as unknown as DeviceManagementKit;\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should be defined\", () => {\n const binder = new SolanaAppBinder(\n {} as DeviceManagementKit,\n {} as DeviceSessionId,\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n expect(binder).toBeDefined();\n });\n\n describe(\"getAddress\", () => {\n it(\"should return the address\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const address = \"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5\";\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n } as DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n const { observable } = appBinder.getAddress({\n derivationPath: \"44'/501'\",\n checkOnDevice: false,\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls of executeDeviceAction with the correct params\", () => {\n const baseParams = {\n derivationPath: \"44'/60'/3'/2/1\",\n returnChainCode: false,\n skipOpenApp: false,\n };\n\n it(\"when checkOnDevice is true: UserInteractionRequired.VerifyAddress\", () => {\n // GIVEN\n const checkOnDevice = true;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetPubKeyCommand(params),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n\n it(\"when checkOnDevice is false: UserInteractionRequired.None\", () => {\n // GIVEN\n const checkOnDevice = false;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetPubKeyCommand(params),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n });\n });\n\n describe(\"signTransaction\", () => {\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signature = new Uint8Array([0x01, 0x02, 0x03]);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n } as DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n const { observable } = appBinder.signTransaction({\n derivationPath: \"44'/501'\",\n transaction: new Uint8Array([0x01, 0x02, 0x03, 0x04]),\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n const states: DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const derivationPath = \"44'/60'/3'/2/1\";\n const transaction = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n const skipOpenApp = false;\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n appBinder.signTransaction({\n derivationPath,\n transaction,\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: expect.objectContaining({\n derivationPath,\n transaction,\n transactionOptions: { skipOpenApp },\n contextModule: contextModuleStub,\n }),\n }),\n }),\n );\n });\n });\n\n describe(\"signMessage\", () => {\n it(\"should return the signed message\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signedMessage = {\n signature: \"signature\",\n };\n const signMessageArgs = {\n derivationPath: \"44'/501'/0'/0'\",\n message: \"Hello world\",\n skipOpenApp: false,\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n } as DeviceActionState<\n SignMessageDAOutput,\n DmkError,\n DeviceActionIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n const { observable } = appBinder.signMessage(signMessageArgs);\n\n // THEN\n const states: DeviceActionState<\n SignMessageDAOutput,\n unknown,\n unknown\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should accept a Uint8Array message for Raw pass-through\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signedMessage = { signature: \"rawSig\" };\n const binaryPayload = new Uint8Array([0xff, 0x01, 0x02]);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n } as DeviceActionState<\n SignMessageDAOutput,\n DmkError,\n DeviceActionIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n const { observable } = appBinder.signMessage({\n derivationPath: \"44'/501'/0'/0'\",\n message: binaryPayload,\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n SignMessageDAOutput,\n unknown,\n unknown\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: (err) => reject(err),\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n });\n\n describe(\"getAppConfiguration\", () => {\n it(\"should return the app configuration\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const appConfiguration = {\n blindSigningEnabled: true,\n pubKeyDisplayMode: \"LONG\",\n version: \"2.5.10\",\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n } as DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n const { observable } = appBinder.getAppConfiguration();\n\n // THEN\n const states: DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >[] = [];\n\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n\n // WHEN\n appBinder.getAppConfiguration();\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "aACA,IAAAA,
|
|
6
|
-
"names": ["import_device_management_kit", "import_rxjs", "import_GetAppConfigurationCommand", "import_GetPubKeyCommand", "import_BlockhashService", "import_constants", "import_SolanaAppBinder", "mockLoggerFactory", "contextModuleStub", "mockedDmk", "binder", "resolve", "reject", "address", "appBinder", "observable", "states", "state", "err", "baseParams", "params", "signature", "derivationPath", "transaction", "skipOpenApp", "signedMessage", "signMessageArgs", "binaryPayload", "appConfiguration"]
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type CommandResult,\n CommandResultFactory,\n type DeviceActionIntermediateValue,\n type DeviceActionState,\n DeviceActionStatus,\n type DeviceManagementKit,\n type DeviceSessionId,\n type DmkError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { from } from \"rxjs\";\n\nimport {\n type GetAppConfigurationDAError,\n type GetAppConfigurationDAIntermediateValue,\n type GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport {\n type GetAddressDAError,\n type GetAddressDAIntermediateValue,\n type GetAddressDAOutput,\n type SignMessageDAOutput,\n SignMessageVersion,\n type SignTransactionDAError,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAOutput,\n type SolanaAppErrorCodes,\n} from \"@api/index\";\nimport { DefaultBs58Encoder } from \"@internal/app-binder/services/bs58Encoder\";\n\nimport { GetAppConfigurationCommand } from \"./command/GetAppConfigurationCommand\";\nimport { GetPubKeyCommand } from \"./command/GetPubKeyCommand\";\nimport { BlockhashService } from \"./services/BlockhashService\";\nimport { APP_NAME } from \"./constants\";\nimport { SolanaAppBinder } from \"./SolanaAppBinder\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"SolanaAppBinder\", () => {\n // stub ContextModule for tests\n const contextModuleStub: ContextModule = {} as ContextModule;\n\n const mockedDmk: DeviceManagementKit = {\n sendCommand: vi.fn(),\n executeDeviceAction: vi.fn(),\n } as unknown as DeviceManagementKit;\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should be defined\", () => {\n const binder = new SolanaAppBinder(\n {} as DeviceManagementKit,\n {} as DeviceSessionId,\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n expect(binder).toBeDefined();\n });\n\n describe(\"getAddress\", () => {\n it(\"should return the address\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const address = \"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5\";\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n } as DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n const { observable } = appBinder.getAddress({\n derivationPath: \"44'/501'\",\n checkOnDevice: false,\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls of executeDeviceAction with the correct params\", () => {\n const baseParams = {\n derivationPath: \"44'/60'/3'/2/1\",\n returnChainCode: false,\n skipOpenApp: false,\n };\n\n it(\"when checkOnDevice is true: UserInteractionRequired.VerifyAddress\", () => {\n // GIVEN\n const checkOnDevice = true;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetPubKeyCommand(params),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n\n it(\"when checkOnDevice is false: UserInteractionRequired.None\", () => {\n // GIVEN\n const checkOnDevice = false;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetPubKeyCommand(params),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n });\n });\n\n describe(\"signTransaction\", () => {\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signature = new Uint8Array([0x01, 0x02, 0x03]);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n } as DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n const { observable } = appBinder.signTransaction({\n derivationPath: \"44'/501'\",\n transaction: new Uint8Array([0x01, 0x02, 0x03, 0x04]),\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n const states: DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const derivationPath = \"44'/60'/3'/2/1\";\n const transaction = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n const skipOpenApp = false;\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n appBinder.signTransaction({\n derivationPath,\n transaction,\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: expect.objectContaining({\n derivationPath,\n transaction,\n transactionOptions: { skipOpenApp },\n contextModule: contextModuleStub,\n }),\n }),\n }),\n );\n });\n });\n\n describe(\"signMessage\", () => {\n it(\"should return the signed message\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signedMessage = {\n signature: \"signature\",\n };\n const signMessageArgs = {\n derivationPath: \"44'/501'/0'/0'\",\n message: \"Hello world\",\n skipOpenApp: false,\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n } as DeviceActionState<\n SignMessageDAOutput,\n DmkError,\n DeviceActionIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n const { observable } = appBinder.signMessage(signMessageArgs);\n\n // THEN\n const states: DeviceActionState<\n SignMessageDAOutput,\n unknown,\n unknown\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"passes signers into the V1 OCM via the task closure\", async () => {\n const signers = [new Uint8Array(32).fill(0x22)];\n const userPubkey = new Uint8Array(32).fill(0x11);\n const rawSig = new Uint8Array(64).fill(0xaa);\n\n (\n mockedDmk.executeDeviceAction as ReturnType<typeof vi.fn>\n ).mockReturnValueOnce({ observable: from([]), cancel: vi.fn() });\n\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n\n appBinder.signMessage({\n derivationPath: \"44'/501'/0'/0'\",\n message: \"hi\",\n skipOpenApp: false,\n version: SignMessageVersion.V1,\n signers,\n });\n\n type TaskFn = (api: {\n sendCommand: ReturnType<typeof vi.fn>;\n }) => Promise<CommandResult<{ signature: string }, SolanaAppErrorCodes>>;\n type DeviceActionArg = { deviceAction: { input: { task: TaskFn } } };\n\n const taskFn = (\n vi.mocked(mockedDmk.executeDeviceAction).mock\n .calls[0]![0] as DeviceActionArg\n ).deviceAction.input.task;\n const mockSendCommand = vi\n .fn()\n .mockResolvedValueOnce(\n CommandResultFactory({ data: DefaultBs58Encoder.encode(userPubkey) }),\n )\n .mockResolvedValueOnce(CommandResultFactory({ data: rawSig }));\n\n const result = await taskFn({ sendCommand: mockSendCommand });\n\n expect(\"data\" in result).toBe(true);\n if (!(\"data\" in result)) throw new Error(\"expected data result\");\n const envelope = DefaultBs58Encoder.decode(result.data.signature);\n const ocm = envelope.slice(65);\n expect(ocm[16]).toBe(1); // V1 version byte\n expect(ocm[17]).toBe(2); // 2 signers: userPubkey + extra\n // userPubkey (0x11) < signers[0] (0x22) \u2192 sorted: userPubkey first\n expect(ocm.slice(18, 50)).toEqual(userPubkey);\n expect(ocm.slice(50, 82)).toEqual(signers[0]);\n });\n\n it(\"should accept a Uint8Array message for Raw pass-through\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signedMessage = { signature: \"rawSig\" };\n const binaryPayload = new Uint8Array([0xff, 0x01, 0x02]);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n } as DeviceActionState<\n SignMessageDAOutput,\n DmkError,\n DeviceActionIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n const { observable } = appBinder.signMessage({\n derivationPath: \"44'/501'/0'/0'\",\n message: binaryPayload,\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n SignMessageDAOutput,\n unknown,\n unknown\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: (err) => reject(err),\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n });\n\n describe(\"getAppConfiguration\", () => {\n it(\"should return the app configuration\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const appConfiguration = {\n blindSigningEnabled: true,\n pubKeyDisplayMode: \"LONG\",\n version: \"2.5.10\",\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n } as DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n const { observable } = appBinder.getAppConfiguration();\n\n // THEN\n const states: DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >[] = [];\n\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n undefined,\n new BlockhashService(),\n );\n\n // WHEN\n appBinder.getAppConfiguration();\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: APP_NAME,\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_rxjs", "import_api", "import_bs58Encoder", "import_GetAppConfigurationCommand", "import_GetPubKeyCommand", "import_BlockhashService", "import_constants", "import_SolanaAppBinder", "mockLoggerFactory", "contextModuleStub", "mockedDmk", "binder", "resolve", "reject", "address", "appBinder", "observable", "states", "state", "err", "baseParams", "params", "signature", "derivationPath", "transaction", "skipOpenApp", "signedMessage", "signMessageArgs", "signers", "userPubkey", "rawSig", "taskFn", "mockSendCommand", "result", "ocm", "binaryPayload", "appConfiguration"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var t=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var _=(s,e)=>{for(var p in e)t(s,p,{get:e[p],enumerable:!0})},m=(s,e,p,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of N(e))!S.call(s,n)&&n!==p&&t(s,n,{get:()=>e[n],enumerable:!(i=d(e,n))||i.enumerable});return s};var v=s=>m(t({},"__esModule",{value:!0}),s);var O={};_(O,{SOLANA_FEATURES:()=>E,SOLANA_MIN_DELAYED_SIGNING_VERSION:()=>c,SOLANA_MIN_SPL_VERSION:()=>A,SOLANA_MIN_WEB3_CHECKS_VERSION:()=>a,SolanaApplicationResolver:()=>x});module.exports=v(O);var o=require("@ledgerhq/device-management-kit"),l=require("./constants");const r="0.0.1",A="1.9.2",c="1.14.0",a="1.15.0",E={spl:{minVersion:A,excludedModels:[o.DeviceModelId.NANO_S],excludedApps:[]},web3Checks:{minVersion:a,excludedModels:[o.DeviceModelId.NANO_S,o.DeviceModelId.NANO_SP,o.DeviceModelId.NANO_X],excludedApps:["Exchange"]},delayedSigning:{minVersion:c,excludedModels:[],excludedApps:[]}};class x{resolve(e,p){if(e.sessionStateType===o.DeviceSessionStateType.Connected)return{isCompatible:!1,version:r};const i=e.currentApp?.name;return!i||i!==l.APP_NAME&&i!=="Exchange"?{isCompatible:!1,version:r}:{isCompatible:!0,version:p.version}}}0&&(module.exports={SOLANA_FEATURES,SOLANA_MIN_DELAYED_SIGNING_VERSION,SOLANA_MIN_SPL_VERSION,SOLANA_MIN_WEB3_CHECKS_VERSION,SolanaApplicationResolver});
|
|
2
2
|
//# sourceMappingURL=SolanaApplicationResolver.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/app-binder/SolanaApplicationResolver.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type AppConfig,\n type ApplicationResolver,\n type DeviceSessionState,\n DeviceSessionStateType,\n type ResolvedApp,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { APP_NAME } from \"./constants\";\n\nconst DEFAULT_VERSION = \"0.0.1\";\nexport const SOLANA_MIN_SPL_VERSION = \"1.9.2\";\nexport const SOLANA_MIN_DELAYED_SIGNING_VERSION = \"1.14.0\";\
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,
|
|
6
|
-
"names": ["SolanaApplicationResolver_exports", "__export", "
|
|
4
|
+
"sourcesContent": ["import {\n type AppConfig,\n type ApplicationResolver,\n DeviceModelId,\n type DeviceSessionState,\n DeviceSessionStateType,\n type ResolvedApp,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { APP_NAME } from \"./constants\";\n\nconst DEFAULT_VERSION = \"0.0.1\";\nexport const SOLANA_MIN_SPL_VERSION = \"1.9.2\";\nexport const SOLANA_MIN_DELAYED_SIGNING_VERSION = \"1.14.0\";\nexport const SOLANA_MIN_WEB3_CHECKS_VERSION = \"1.15.0\";\n\nexport const SOLANA_FEATURES = {\n spl: {\n minVersion: SOLANA_MIN_SPL_VERSION,\n excludedModels: [DeviceModelId.NANO_S],\n excludedApps: [] as string[],\n },\n web3Checks: {\n minVersion: SOLANA_MIN_WEB3_CHECKS_VERSION,\n excludedModels: [\n DeviceModelId.NANO_S,\n DeviceModelId.NANO_SP,\n DeviceModelId.NANO_X,\n ],\n excludedApps: [\"Exchange\"],\n },\n delayedSigning: {\n minVersion: SOLANA_MIN_DELAYED_SIGNING_VERSION,\n excludedModels: [] as DeviceModelId[],\n excludedApps: [] as string[],\n },\n} as const;\n\nexport class SolanaApplicationResolver implements ApplicationResolver {\n resolve(deviceState: DeviceSessionState, appConfig: AppConfig): ResolvedApp {\n if (deviceState.sessionStateType === DeviceSessionStateType.Connected) {\n return { isCompatible: false, version: DEFAULT_VERSION };\n }\n\n const appName = deviceState.currentApp?.name;\n\n if (!appName || (appName !== APP_NAME && appName !== \"Exchange\")) {\n return { isCompatible: false, version: DEFAULT_VERSION };\n }\n\n // appConfig.version is authoritative: it comes from GetAppConfiguration\n // executed against the signer app, so it reflects the actual on-device version\n // whether Solana is opened directly or via Exchange orchestration.\n return { isCompatible: true, version: appConfig.version };\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,uCAAAC,EAAA,2BAAAC,EAAA,mCAAAC,EAAA,8BAAAC,IAAA,eAAAC,EAAAP,GAAA,IAAAQ,EAOO,2CAEPC,EAAyB,uBAEzB,MAAMC,EAAkB,QACXN,EAAyB,QACzBD,EAAqC,SACrCE,EAAiC,SAEjCH,EAAkB,CAC7B,IAAK,CACH,WAAYE,EACZ,eAAgB,CAAC,gBAAc,MAAM,EACrC,aAAc,CAAC,CACjB,EACA,WAAY,CACV,WAAYC,EACZ,eAAgB,CACd,gBAAc,OACd,gBAAc,QACd,gBAAc,MAChB,EACA,aAAc,CAAC,UAAU,CAC3B,EACA,eAAgB,CACd,WAAYF,EACZ,eAAgB,CAAC,EACjB,aAAc,CAAC,CACjB,CACF,EAEO,MAAMG,CAAyD,CACpE,QAAQK,EAAiCC,EAAmC,CAC1E,GAAID,EAAY,mBAAqB,yBAAuB,UAC1D,MAAO,CAAE,aAAc,GAAO,QAASD,CAAgB,EAGzD,MAAMG,EAAUF,EAAY,YAAY,KAExC,MAAI,CAACE,GAAYA,IAAY,YAAYA,IAAY,WAC5C,CAAE,aAAc,GAAO,QAASH,CAAgB,EAMlD,CAAE,aAAc,GAAM,QAASE,EAAU,OAAQ,CAC1D,CACF",
|
|
6
|
+
"names": ["SolanaApplicationResolver_exports", "__export", "SOLANA_FEATURES", "SOLANA_MIN_DELAYED_SIGNING_VERSION", "SOLANA_MIN_SPL_VERSION", "SOLANA_MIN_WEB3_CHECKS_VERSION", "SolanaApplicationResolver", "__toCommonJS", "import_device_management_kit", "import_constants", "DEFAULT_VERSION", "deviceState", "appConfig", "appName"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var e=require("@ledgerhq/device-management-kit"),l=require("./SolanaApplicationResolver");function s(t){return{version:t,blindSigningEnabled:!1}}function a(t,n,o=e.DeviceModelId.FLEX){return{sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:t,version:n},deviceModelId:o,isSecureConnectionAllowed:!1}}function c(){return{sessionStateType:e.DeviceSessionStateType.Connected,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.0.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!1}}describe("SolanaApplicationResolver",()=>{const t=new l.SolanaApplicationResolver;it("should resolve as incompatible when device is Connected",()=>{const n=c(),o=s("1.0.0"),i=t.resolve(n,o);expect(i).toStrictEqual({isCompatible:!1,version:"0.0.1"})}),it("should resolve as compatible with appConfig.version when app is Solana",()=>{const n=a("Solana","1.4.0"),o=s("1.0.0"),i=t.resolve(n,o);expect(i).toStrictEqual({isCompatible:!0,version:"1.0.0"})}),it("should resolve as incompatible when app is not Solana",()=>{const n=a("Ethereum","1.0.0"),o=s("1.0.0"),i=t.resolve(n,o);expect(i).toStrictEqual({isCompatible:!1,version:"0.0.1"})})});
|
|
2
2
|
//# sourceMappingURL=SolanaApplicationResolver.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/app-binder/SolanaApplicationResolver.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type AppConfig,\n DeviceModelId,\n
|
|
5
|
-
"mappings": "aAAA,IAAAA,
|
|
6
|
-
"names": ["import_device_management_kit", "import_SolanaApplicationResolver", "
|
|
4
|
+
"sourcesContent": ["import {\n type AppConfig,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { SolanaApplicationResolver } from \"./SolanaApplicationResolver\";\n\nfunction createAppConfig(version: string): AppConfig {\n return {\n version,\n blindSigningEnabled: false,\n };\n}\n\nfunction createReadyState(\n appName: string,\n appVersion: string,\n modelId: DeviceModelId = DeviceModelId.FLEX,\n) {\n return {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: appName, version: appVersion },\n deviceModelId: modelId,\n isSecureConnectionAllowed: false,\n };\n}\n\nfunction createConnectedState() {\n return {\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.0.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n}\n\ndescribe(\"SolanaApplicationResolver\", () => {\n const resolver = new SolanaApplicationResolver();\n\n it(\"should resolve as incompatible when device is Connected\", () => {\n const state = createConnectedState();\n const config = createAppConfig(\"1.0.0\");\n const result = resolver.resolve(state, config);\n expect(result).toStrictEqual({\n isCompatible: false,\n version: \"0.0.1\",\n });\n });\n\n it(\"should resolve as compatible with appConfig.version when app is Solana\", () => {\n const state = createReadyState(\"Solana\", \"1.4.0\");\n const config = createAppConfig(\"1.0.0\");\n const result = resolver.resolve(state, config);\n expect(result).toStrictEqual({\n isCompatible: true,\n version: \"1.0.0\",\n });\n });\n\n it(\"should resolve as incompatible when app is not Solana\", () => {\n const state = createReadyState(\"Ethereum\", \"1.0.0\");\n const config = createAppConfig(\"1.0.0\");\n const result = resolver.resolve(state, config);\n expect(result).toStrictEqual({\n isCompatible: false,\n version: \"0.0.1\",\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAKO,2CAEPC,EAA0C,uCAE1C,SAASC,EAAgBC,EAA4B,CACnD,MAAO,CACL,QAAAA,EACA,oBAAqB,EACvB,CACF,CAEA,SAASC,EACPC,EACAC,EACAC,EAAyB,gBAAc,KACvC,CACA,MAAO,CACL,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAMF,EAAS,QAASC,CAAW,EACjD,cAAeC,EACf,0BAA2B,EAC7B,CACF,CAEA,SAASC,GAAuB,CAC9B,MAAO,CACL,iBAAkB,yBAAuB,UACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAe,gBAAc,KAC7B,0BAA2B,EAC7B,CACF,CAEA,SAAS,4BAA6B,IAAM,CAC1C,MAAMC,EAAW,IAAI,4BAErB,GAAG,0DAA2D,IAAM,CAClE,MAAMC,EAAQF,EAAqB,EAC7BG,EAAST,EAAgB,OAAO,EAChCU,EAASH,EAAS,QAAQC,EAAOC,CAAM,EAC7C,OAAOC,CAAM,EAAE,cAAc,CAC3B,aAAc,GACd,QAAS,OACX,CAAC,CACH,CAAC,EAED,GAAG,yEAA0E,IAAM,CACjF,MAAMF,EAAQN,EAAiB,SAAU,OAAO,EAC1CO,EAAST,EAAgB,OAAO,EAChCU,EAASH,EAAS,QAAQC,EAAOC,CAAM,EAC7C,OAAOC,CAAM,EAAE,cAAc,CAC3B,aAAc,GACd,QAAS,OACX,CAAC,CACH,CAAC,EAED,GAAG,wDAAyD,IAAM,CAChE,MAAMF,EAAQN,EAAiB,WAAY,OAAO,EAC5CO,EAAST,EAAgB,OAAO,EAChCU,EAASH,EAAS,QAAQC,EAAOC,CAAM,EAC7C,OAAOC,CAAM,EAAE,cAAc,CAC3B,aAAc,GACd,QAAS,OACX,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_device_management_kit", "import_SolanaApplicationResolver", "createAppConfig", "version", "createReadyState", "appName", "appVersion", "modelId", "createConnectedState", "resolver", "state", "config", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var E=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var c=(n,o)=>{for(var r in o)E(n,r,{get:o[r],enumerable:!0})},O=(n,o,r,p)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of C(o))!u.call(n,e)&&e!==r&&E(n,e,{get:()=>o[e],enumerable:!(p=d(o,e))||p.enumerable});return n};var R=n=>O(E({},"__esModule",{value:!0}),n);var B={};c(B,{GetAppConfigurationCommand:()=>D});module.exports=R(B);var t=require("@ledgerhq/device-management-kit"),_=require("@ledgerhq/signer-utils"),m=require("purify-ts"),s=require("../../../api/model/PublicKeyDisplayMode"),a=require("./utils/SolanaApplicationErrors");const g=224,f=4,N=0,F=1,P=2,T=3,y=4,G=5,I=5,L=6,b=16,H=32;class D{name="getAppConfiguration";errorHelper=new _.CommandErrorHelper(a.SOLANA_APP_ERRORS,a.SolanaAppCommandErrorFactory);args;constructor(o){this.args=o}getApdu(){return new t.ApduBuilder({cla:g,ins:f,p1:0,p2:0}).build()}parseResponse(o){return m.Maybe.fromNullable(this.errorHelper.getError(o)).orDefaultLazy(()=>{const{data:r}=o;if(r.length<I)return(0,t.CommandResultFactory)({error:new t.InvalidStatusWordError("Invalid response")});const p=!!r[N],e=r[F]===0?s.PublicKeyDisplayMode.LONG:s.PublicKeyDisplayMode.SHORT,l=`${r[P]}.${r[T]}.${r[y]}`;let i=!1,A=!1;if(r.length>=L){const S=r[G];i=!!(S&b),A=!!(S&H)}return(0,t.CommandResultFactory)({data:{blindSigningEnabled:p,pubKeyDisplayMode:e,version:l,web3ChecksEnabled:i,web3ChecksOptIn:A}})})}}0&&(module.exports={GetAppConfigurationCommand});
|
|
2
2
|
//# sourceMappingURL=GetAppConfigurationCommand.js.map
|