@ledgerhq/device-signer-kit-solana 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +23 -15
  2. package/lib/cjs/api/SignerSolanaBuilder.js +1 -1
  3. package/lib/cjs/api/SignerSolanaBuilder.js.map +3 -3
  4. package/lib/cjs/api/app-binder/DelayedSignTransactionDeviceActionTypes.js +2 -0
  5. package/lib/cjs/api/app-binder/DelayedSignTransactionDeviceActionTypes.js.map +7 -0
  6. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  7. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  8. package/lib/cjs/api/model/SolanaTransactionOptionalConfig.js +1 -1
  9. package/lib/cjs/api/model/SolanaTransactionOptionalConfig.js.map +1 -1
  10. package/lib/cjs/internal/DefaultSignerSolana.js +1 -1
  11. package/lib/cjs/internal/DefaultSignerSolana.js.map +3 -3
  12. package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
  13. package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +3 -3
  14. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
  15. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  16. package/lib/cjs/internal/app-binder/SolanaApplicationResolver.js +1 -1
  17. package/lib/cjs/internal/app-binder/SolanaApplicationResolver.js.map +3 -3
  18. package/lib/cjs/internal/app-binder/SolanaApplicationResolver.test.js +1 -1
  19. package/lib/cjs/internal/app-binder/SolanaApplicationResolver.test.js.map +3 -3
  20. package/lib/cjs/internal/app-binder/command/DelayedSignTransactionCommand.js +2 -0
  21. package/lib/cjs/internal/app-binder/command/DelayedSignTransactionCommand.js.map +7 -0
  22. package/lib/cjs/internal/app-binder/command/DelayedSignTransactionCommand.test.js +2 -0
  23. package/lib/cjs/internal/app-binder/command/DelayedSignTransactionCommand.test.js.map +7 -0
  24. package/lib/cjs/internal/app-binder/command/SignTransactionPreviewCommand.js +2 -0
  25. package/lib/cjs/internal/app-binder/command/SignTransactionPreviewCommand.js.map +7 -0
  26. package/lib/cjs/internal/app-binder/command/SignTransactionPreviewCommand.test.js +2 -0
  27. package/lib/cjs/internal/app-binder/command/SignTransactionPreviewCommand.test.js.map +7 -0
  28. package/lib/cjs/internal/app-binder/command/utils/SolanaApplicationErrors.js +1 -1
  29. package/lib/cjs/internal/app-binder/command/utils/SolanaApplicationErrors.js.map +2 -2
  30. package/lib/cjs/internal/app-binder/constants.js +2 -0
  31. package/lib/cjs/internal/app-binder/constants.js.map +7 -0
  32. package/lib/cjs/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.js +2 -0
  33. package/lib/cjs/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.js.map +7 -0
  34. package/lib/cjs/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.test.js +2 -0
  35. package/lib/cjs/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.test.js.map +7 -0
  36. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  37. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  38. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  39. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  40. package/lib/cjs/internal/app-binder/di/appBinderModule.js +1 -1
  41. package/lib/cjs/internal/app-binder/di/appBinderModule.js.map +3 -3
  42. package/lib/cjs/internal/app-binder/di/appBinderTypes.js +1 -1
  43. package/lib/cjs/internal/app-binder/di/appBinderTypes.js.map +2 -2
  44. package/lib/cjs/internal/app-binder/services/BlockhashService.js +2 -0
  45. package/lib/cjs/internal/app-binder/services/BlockhashService.js.map +7 -0
  46. package/lib/cjs/internal/app-binder/services/BlockhashService.test.js +2 -0
  47. package/lib/cjs/internal/app-binder/services/BlockhashService.test.js.map +7 -0
  48. package/lib/cjs/internal/app-binder/services/TransactionInspector.js +1 -1
  49. package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +3 -3
  50. package/lib/cjs/internal/app-binder/task/SendSignDataTask.js +1 -1
  51. package/lib/cjs/internal/app-binder/task/SendSignDataTask.js.map +2 -2
  52. package/lib/cjs/internal/di.js +1 -1
  53. package/lib/cjs/internal/di.js.map +3 -3
  54. package/lib/cjs/internal/externalTypes.js +1 -1
  55. package/lib/cjs/internal/externalTypes.js.map +2 -2
  56. package/lib/cjs/package.json +4 -4
  57. package/lib/esm/api/SignerSolanaBuilder.js +1 -1
  58. package/lib/esm/api/SignerSolanaBuilder.js.map +3 -3
  59. package/lib/esm/api/app-binder/DelayedSignTransactionDeviceActionTypes.js +2 -0
  60. package/lib/esm/api/app-binder/DelayedSignTransactionDeviceActionTypes.js.map +7 -0
  61. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  62. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  63. package/lib/esm/internal/DefaultSignerSolana.js +1 -1
  64. package/lib/esm/internal/DefaultSignerSolana.js.map +3 -3
  65. package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
  66. package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +3 -3
  67. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
  68. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  69. package/lib/esm/internal/app-binder/SolanaApplicationResolver.js +1 -1
  70. package/lib/esm/internal/app-binder/SolanaApplicationResolver.js.map +3 -3
  71. package/lib/esm/internal/app-binder/SolanaApplicationResolver.test.js +1 -1
  72. package/lib/esm/internal/app-binder/SolanaApplicationResolver.test.js.map +3 -3
  73. package/lib/esm/internal/app-binder/command/DelayedSignTransactionCommand.js +2 -0
  74. package/lib/esm/internal/app-binder/command/DelayedSignTransactionCommand.js.map +7 -0
  75. package/lib/esm/internal/app-binder/command/DelayedSignTransactionCommand.test.js +2 -0
  76. package/lib/esm/internal/app-binder/command/DelayedSignTransactionCommand.test.js.map +7 -0
  77. package/lib/esm/internal/app-binder/command/SignTransactionPreviewCommand.js +2 -0
  78. package/lib/esm/internal/app-binder/command/SignTransactionPreviewCommand.js.map +7 -0
  79. package/lib/esm/internal/app-binder/command/SignTransactionPreviewCommand.test.js +2 -0
  80. package/lib/esm/internal/app-binder/command/SignTransactionPreviewCommand.test.js.map +7 -0
  81. package/lib/esm/internal/app-binder/command/utils/SolanaApplicationErrors.js +1 -1
  82. package/lib/esm/internal/app-binder/command/utils/SolanaApplicationErrors.js.map +2 -2
  83. package/lib/esm/internal/app-binder/constants.js +2 -0
  84. package/lib/esm/internal/app-binder/constants.js.map +7 -0
  85. package/lib/esm/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.js +2 -0
  86. package/lib/esm/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.js.map +7 -0
  87. package/lib/esm/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.test.js +2 -0
  88. package/lib/esm/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.test.js.map +7 -0
  89. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  90. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  91. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  92. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  93. package/lib/esm/internal/app-binder/di/appBinderModule.js +1 -1
  94. package/lib/esm/internal/app-binder/di/appBinderModule.js.map +3 -3
  95. package/lib/esm/internal/app-binder/di/appBinderTypes.js +1 -1
  96. package/lib/esm/internal/app-binder/di/appBinderTypes.js.map +2 -2
  97. package/lib/esm/internal/app-binder/services/BlockhashService.js +2 -0
  98. package/lib/esm/internal/app-binder/services/BlockhashService.js.map +7 -0
  99. package/lib/esm/internal/app-binder/services/BlockhashService.test.js +2 -0
  100. package/lib/esm/internal/app-binder/services/BlockhashService.test.js.map +7 -0
  101. package/lib/esm/internal/app-binder/services/TransactionInspector.js +1 -1
  102. package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +3 -3
  103. package/lib/esm/internal/app-binder/task/SendSignDataTask.js +1 -1
  104. package/lib/esm/internal/app-binder/task/SendSignDataTask.js.map +2 -2
  105. package/lib/esm/internal/di.js +1 -1
  106. package/lib/esm/internal/di.js.map +3 -3
  107. package/lib/esm/internal/externalTypes.js +1 -1
  108. package/lib/esm/internal/externalTypes.js.map +2 -2
  109. package/lib/esm/package.json +4 -4
  110. package/lib/types/api/SignerSolanaBuilder.d.ts +3 -1
  111. package/lib/types/api/SignerSolanaBuilder.d.ts.map +1 -1
  112. package/lib/types/api/app-binder/DelayedSignTransactionDeviceActionTypes.d.ts +41 -0
  113. package/lib/types/api/app-binder/DelayedSignTransactionDeviceActionTypes.d.ts.map +1 -0
  114. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +6 -1
  115. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  116. package/lib/types/api/model/SolanaTransactionOptionalConfig.d.ts +3 -0
  117. package/lib/types/api/model/SolanaTransactionOptionalConfig.d.ts.map +1 -1
  118. package/lib/types/internal/DefaultSignerSolana.d.ts +96 -205
  119. package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
  120. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +4 -1
  121. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
  122. package/lib/types/internal/app-binder/SolanaApplicationResolver.d.ts +4 -1
  123. package/lib/types/internal/app-binder/SolanaApplicationResolver.d.ts.map +1 -1
  124. package/lib/types/internal/app-binder/command/DelayedSignTransactionCommand.d.ts +30 -0
  125. package/lib/types/internal/app-binder/command/DelayedSignTransactionCommand.d.ts.map +1 -0
  126. package/lib/types/internal/app-binder/command/DelayedSignTransactionCommand.test.d.ts +2 -0
  127. package/lib/types/internal/app-binder/command/DelayedSignTransactionCommand.test.d.ts.map +1 -0
  128. package/lib/types/internal/app-binder/command/SignTransactionPreviewCommand.d.ts +30 -0
  129. package/lib/types/internal/app-binder/command/SignTransactionPreviewCommand.d.ts.map +1 -0
  130. package/lib/types/internal/app-binder/command/SignTransactionPreviewCommand.test.d.ts +2 -0
  131. package/lib/types/internal/app-binder/command/SignTransactionPreviewCommand.test.d.ts.map +1 -0
  132. package/lib/types/internal/app-binder/command/utils/SolanaApplicationErrors.d.ts +1 -1
  133. package/lib/types/internal/app-binder/command/utils/SolanaApplicationErrors.d.ts.map +1 -1
  134. package/lib/types/internal/app-binder/constants.d.ts +2 -0
  135. package/lib/types/internal/app-binder/constants.d.ts.map +1 -0
  136. package/lib/types/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.d.ts +51 -0
  137. package/lib/types/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.d.ts.map +1 -0
  138. package/lib/types/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.test.d.ts +2 -0
  139. package/lib/types/internal/app-binder/device-action/DelayedSignTransactionDeviceAction.test.d.ts.map +1 -0
  140. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +1 -1
  141. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  142. package/lib/types/internal/app-binder/di/appBinderModule.d.ts.map +1 -1
  143. package/lib/types/internal/app-binder/di/appBinderTypes.d.ts +1 -0
  144. package/lib/types/internal/app-binder/di/appBinderTypes.d.ts.map +1 -1
  145. package/lib/types/internal/app-binder/services/BlockhashService.d.ts +45 -0
  146. package/lib/types/internal/app-binder/services/BlockhashService.d.ts.map +1 -0
  147. package/lib/types/internal/app-binder/services/BlockhashService.test.d.ts +2 -0
  148. package/lib/types/internal/app-binder/services/BlockhashService.test.d.ts.map +1 -0
  149. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -1
  150. package/lib/types/internal/app-binder/task/SendSignDataTask.d.ts +2 -2
  151. package/lib/types/internal/app-binder/task/SendSignDataTask.d.ts.map +1 -1
  152. package/lib/types/internal/di.d.ts +2 -1
  153. package/lib/types/internal/di.d.ts.map +1 -1
  154. package/lib/types/internal/externalTypes.d.ts +1 -0
  155. package/lib/types/internal/externalTypes.d.ts.map +1 -1
  156. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  157. package/package.json +6 -6
package/README.md CHANGED
@@ -39,9 +39,15 @@ npm install @ledgerhq/device-signer-kit-solana
39
39
  To initialise a Solana signer instance, you need a Ledger Device Management Kit instance and the ID of the session of the connected device. Use the `SignerSolanaBuilder` along with the [Context Module](https://github.com/LedgerHQ/device-sdk-ts/tree/develop/packages/signer/context-module) by default developed by Ledger:
40
40
 
41
41
  ```typescript
42
- const signerSolana = new SignerSolanaBuilder({ sdk, sessionId }).build();
42
+ const signerSolana = new SignerSolanaBuilder({
43
+ dmk,
44
+ sessionId,
45
+ solanaRPCURL,
46
+ }).build();
43
47
  ```
44
48
 
49
+ - **solanaRPCURL** _(optional)_ — Solana RPC endpoint used for fetching a fresh `recentBlockhash` during delayed signing. Only required when using `delayed: true` without a custom `fetchBlockhash` callback. You can override it per `signTransaction` call via `SolanaTransactionOptionalConfig.solanaRPCURL`. In browser environments, use a CORS-enabled RPC URL.
50
+
45
51
  ## 🔹 Use Cases
46
52
 
47
53
  The `SignerSolanaBuilder.build()` method will return a `SignerSolana` instance that exposes 4 dedicated methods, each of which calls an independent use case. Each use case will return an object that contains an observable and a method called `cancel`.
@@ -82,9 +88,7 @@ const { observable, cancel } = signerSolana.getAddress(derivationPath, options);
82
88
  - `observable` Emits DeviceActionState updates, including the following details:
83
89
 
84
90
  ```typescript
85
- type GetAddressCommandResponse = {
86
- publicKey: string; // Address in base58 format
87
- };
91
+ type GetAddressDAOutput = string; // base58-encoded Solana address
88
92
  ```
89
93
 
90
94
  - `cancel` A function to cancel the action on the Ledger device.
@@ -121,6 +125,15 @@ const { observable, cancel } = signerSolana.signTransaction(
121
125
  - **transactionOptions** `SolanaTransactionOptionalConfig`
122
126
  Provides additional context for transaction signing.
123
127
 
128
+ - **solanaRPCURL** `string` _(optional)_
129
+ Overrides the RPC URL from `SignerSolanaBuilder` for this call. Used only for fetching a fresh blockhash during delayed signing.
130
+
131
+ - **delayed** `boolean` _(optional)_
132
+ When `true`, uses the two-step delayed signing flow so the user's review time does not race the blockhash expiry. Requires the Solana app version to support delayed signing and either `solanaRPCURL` (builder or per-call) or `fetchBlockhash` to be provided. If the conditions are not met (missing RPC config or unsupported app version), the signer falls back to standard signing and logs a warning.
133
+
134
+ - **fetchBlockhash** `() => Promise<Uint8Array>` _(optional)_
135
+ Custom callback to supply the fresh 32-byte blockhash for delayed signing instead of fetching via `solanaRPCURL`. When provided, `solanaRPCURL` is not required for the delayed path.
136
+
124
137
  - **transactionResolutionContext** `object`
125
138
  Lets you explicitly pass `tokenAddress` and ATA details, bypassing extraction from the transaction itself.
126
139
 
@@ -136,11 +149,8 @@ const { observable, cancel } = signerSolana.signTransaction(
136
149
  - **tokenInternalId** `string`
137
150
  Ledger internal token ID
138
151
 
139
- - **solanaRPCURL** `string`
140
- RPC endpoint to use if `transactionResolutionContext` is not provided
141
- and parsing requires network lookups.
142
- In browser environments, use a CORS-enabled RPC URL.
143
- Defaults to: `"https://api.mainnet-beta.solana.com/"`.
152
+ - **skipOpenApp** `boolean`
153
+ If `true`, skips opening the Solana app on the device.
144
154
 
145
155
  ---
146
156
 
@@ -149,9 +159,7 @@ const { observable, cancel } = signerSolana.signTransaction(
149
159
  - `observable` That emits DeviceActionState updates, including the following details:
150
160
 
151
161
  ```ts
152
- type SolanaSignature = {
153
- signature: Uint8Array; // Signed transaction bytes
154
- };
162
+ type SignTransactionDAOutput = Uint8Array; // raw signature (64 bytes)
155
163
  ```
156
164
 
157
165
  - `cancel` A function to cancel the action on the Ledger device.
@@ -188,7 +196,7 @@ enum DeviceActionStatus {
188
196
  - **Pending** → Waiting for user confirmation on the device.
189
197
  Includes an `intermediateValue` of type `IntermediateValue`.
190
198
  - **Stopped** → Action was cancelled before completion.
191
- - **Completed** → Provides the signed transaction bytes (`Uint8Array`).
199
+ - **Completed** → Provides the raw 64-byte Ed25519 signature (`Uint8Array`).
192
200
  - **Error** → The device or signing operation failed (`SignTransactionDAError`).
193
201
 
194
202
  ---
@@ -228,7 +236,7 @@ const subscription = observable.subscribe({
228
236
 
229
237
  #### **Notes**
230
238
 
231
- - Clear signing only supports simple instructions like a single `transfer` or combos like `createAccound + fundAccount` or `createAccount + transfer`. If you are receiving `6808` error from device, most likely the instructions are not supported and blind signing is required.
239
+ - Clear signing only supports simple instructions like a single `transfer` or combos like `createAccount + fundAccount` or `createAccount + transfer`. If you are receiving `6808` error from device, most likely the instructions are not supported and blind signing is required.
232
240
 
233
241
  ---
234
242
 
@@ -283,7 +291,7 @@ const { observable, cancel } = signerSolana.signMessage(
283
291
  - `skipOpenApp`: Skip the automatic open-app step.
284
292
  - `version`: The off-chain message signing mode. Defaults to `SignMessageVersion.V0`.
285
293
  - **V0** (default) — original off-chain message header with `appDomain`, format detection, and up to 65 515 bytes. Falls back to Legacy on `6a81`.
286
- - **V1** — simplified header: no `appDomain`, no format byte. Up to 65 535 bytes. Falls back to V0 -> Legacy on `6a81`. Not yet supported by released firmware.
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+.
287
295
  - **Legacy** — compact header for backward compatibility with old Solana app firmware. Current firmware will reject it with `6a81`.
288
296
  - **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).
289
297
  - `appDomain`: Application domain string for V0 headers. Encoded as UTF-8 and padded/truncated to 32 bytes. Ignored for V1, Legacy, and Raw.
@@ -1,2 +1,2 @@
1
- "use strict";var s=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var g=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},c=(t,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of l(e))!a.call(t,i)&&i!==o&&s(t,i,{get:()=>e[i],enumerable:!(n=u(e,i))||n.enumerable});return t};var m=t=>c(s({},"__esModule",{value:!0}),t);var M={};g(M,{SignerSolanaBuilder:()=>p});module.exports=m(M);var r=require("@ledgerhq/context-module"),d=require("../internal/DefaultSignerSolana");class p{_dmk;_sessionId;_customContextModule;_originToken;constructor({dmk:e,sessionId:o,originToken:n}){this._dmk=e,this._sessionId=o,this._originToken=n}withContextModule(e){return this._customContextModule=e,this}build(){return new d.DefaultSignerSolana({dmk:this._dmk,sessionId:this._sessionId,contextModule:this._customContextModule??new r.ContextModuleBuilder({originToken:this._originToken,loggerFactory:e=>this._dmk.getLoggerFactory()(["ContextModule",e])}).build()})}}0&&(module.exports={SignerSolanaBuilder});
1
+ "use strict";var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var g=(t,e)=>{for(var i in e)s(t,i,{get:e[i],enumerable:!0})},c=(t,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of l(e))!u.call(t,o)&&o!==i&&s(t,o,{get:()=>e[o],enumerable:!(n=a(e,o))||n.enumerable});return t};var m=t=>c(s({},"__esModule",{value:!0}),t);var _={};g(_,{SignerSolanaBuilder:()=>C});module.exports=m(_);var r=require("@ledgerhq/context-module"),d=require("../internal/DefaultSignerSolana");class C{_dmk;_sessionId;_customContextModule;_originToken;_solanaRPCURL;constructor({dmk:e,sessionId:i,originToken:n,solanaRPCURL:o}){this._dmk=e,this._sessionId=i,this._originToken=n,this._solanaRPCURL=o}withContextModule(e){return this._customContextModule=e,this}build(){return new d.DefaultSignerSolana({dmk:this._dmk,sessionId:this._sessionId,solanaRPCURL:this._solanaRPCURL,contextModule:this._customContextModule??new r.ContextModuleBuilder({originToken:this._originToken,loggerFactory:e=>this._dmk.getLoggerFactory()(["ContextModule",e])}).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};\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\n constructor({\n dmk,\n sessionId,\n originToken,\n }: SignerSolanaBuilderConstructorArgs) {\n this._dmk = dmk;\n this._sessionId = sessionId;\n this._originToken = originToken;\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 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,EAGO,oCAMPC,EAAoC,yCAiB7B,MAAMH,CAAoB,CACvB,KACA,WACA,qBACA,aAER,YAAY,CACV,IAAAI,EACA,UAAAC,EACA,YAAAC,CACF,EAAuC,CACrC,KAAK,KAAOF,EACZ,KAAK,WAAaC,EAClB,KAAK,aAAeC,CACtB,CAQA,kBAAkBC,EAA8B,CAC9C,YAAK,qBAAuBA,EACrB,IACT,CAOO,OAAQ,CACb,OAAO,IAAI,sBAAoB,CAC7B,IAAK,KAAK,KACV,UAAW,KAAK,WAChB,cACE,KAAK,sBACL,IAAI,uBAAqB,CACvB,YAAa,KAAK,aAClB,cAAgBC,GACd,KAAK,KAAK,iBAAiB,EAAE,CAAC,gBAAiBA,CAAG,CAAC,CACvD,CAAC,EAAE,MAAM,CACb,CAAC,CACH,CACF",
6
- "names": ["SignerSolanaBuilder_exports", "__export", "SignerSolanaBuilder", "__toCommonJS", "import_context_module", "import_DefaultSignerSolana", "dmk", "sessionId", "originToken", "contextModule", "tag"]
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,EAGO,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,EAAE,MAAM,CACb,CAAC,CACH,CACF",
6
+ "names": ["SignerSolanaBuilder_exports", "__export", "SignerSolanaBuilder", "__toCommonJS", "import_context_module", "import_DefaultSignerSolana", "dmk", "sessionId", "originToken", "solanaRPCURL", "contextModule", "tag"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var y=(r,e)=>{for(var n in e)a(r,n,{get:e[n],enumerable:!0})},d=(r,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of i(e))!l.call(r,t)&&t!==n&&a(r,t,{get:()=>e[t],enumerable:!(o=p(e,t))||o.enumerable});return r};var s=r=>d(a({},"__esModule",{value:!0}),r);var D={};y(D,{delayedSignDAStateSteps:()=>A});module.exports=s(D);const A=Object.freeze({ZERO_BLOCKHASH:"signer.sol.steps.zeroBlockhash",PREVIEW_TRANSACTION:"signer.sol.steps.previewTransaction",FETCH_BLOCKHASH:"signer.sol.steps.fetchBlockhash",PATCH_TRANSACTION:"signer.sol.steps.patchTransaction",DELAYED_SIGN:"signer.sol.steps.delayedSign",FALLBACK_TO_NON_DELAYED_SIGN:"signer.sol.steps.fallbackToNonDelayedSign"});0&&(module.exports={delayedSignDAStateSteps});
2
+ //# sourceMappingURL=DelayedSignTransactionDeviceActionTypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/api/app-binder/DelayedSignTransactionDeviceActionTypes.ts"],
4
+ "sourcesContent": ["import {\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 Signature } from \"@api/model/Signature\";\nimport { type UserInputType } from \"@api/model/TransactionResolutionContext\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { type BlockhashService } from \"@internal/app-binder/services/BlockhashService\";\n\nexport const delayedSignDAStateSteps = Object.freeze({\n ZERO_BLOCKHASH: \"signer.sol.steps.zeroBlockhash\",\n PREVIEW_TRANSACTION: \"signer.sol.steps.previewTransaction\",\n FETCH_BLOCKHASH: \"signer.sol.steps.fetchBlockhash\",\n PATCH_TRANSACTION: \"signer.sol.steps.patchTransaction\",\n DELAYED_SIGN: \"signer.sol.steps.delayedSign\",\n FALLBACK_TO_NON_DELAYED_SIGN: \"signer.sol.steps.fallbackToNonDelayedSign\",\n} as const);\n\nexport type DelayedSignDAStateStep =\n (typeof delayedSignDAStateSteps)[keyof typeof delayedSignDAStateSteps];\n\nexport type DelayedSignDAOutput = Signature;\n\nexport type DelayedSignDAInput = {\n readonly derivationPath: string;\n readonly transaction: Uint8Array;\n readonly rpcUrl?: string;\n readonly fetchBlockhash?: () => Promise<Uint8Array>;\n readonly userInputType?: UserInputType;\n readonly blockhashService?: BlockhashService;\n};\n\nexport type DelayedSignDAError =\n | OpenAppDAError\n | SendCommandInAppDAError<SolanaAppErrorCodes>;\n\ntype DelayedSignDARequiredInteraction =\n | UserInteractionRequired\n | OpenAppDARequiredInteraction;\n\nexport type DelayedSignDAIntermediateValue = {\n requiredUserInteraction: DelayedSignDARequiredInteraction;\n step: DelayedSignDAStateStep;\n};\n\nexport type DelayedSignDAState = DeviceActionState<\n DelayedSignDAOutput,\n DelayedSignDAError,\n DelayedSignDAIntermediateValue\n>;\n\nexport type DelayedSignDAInternalState = {\n readonly error: DelayedSignDAError | null;\n readonly signature: Signature | null;\n readonly zeroedTransaction: Uint8Array | null;\n readonly freshBlockhash: Uint8Array | null;\n readonly patchedTransaction: Uint8Array | null;\n readonly previewFallback: boolean;\n};\n\nexport type DelayedSignDAReturnType = ExecuteDeviceActionReturnType<\n DelayedSignDAOutput,\n DelayedSignDAError,\n DelayedSignDAIntermediateValue\n>;\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAcO,MAAME,EAA0B,OAAO,OAAO,CACnD,eAAgB,iCAChB,oBAAqB,sCACrB,gBAAiB,kCACjB,kBAAmB,oCACnB,aAAc,+BACd,6BAA8B,2CAChC,CAAU",
6
+ "names": ["DelayedSignTransactionDeviceActionTypes_exports", "__export", "delayedSignDAStateSteps", "__toCommonJS"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var c=(n,t)=>{for(var r in t)o(n,r,{get:t[r],enumerable:!0})},A=(n,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of p(t))!s.call(n,e)&&e!==r&&o(n,e,{get:()=>t[e],enumerable:!(a=i(t,e))||a.enumerable});return n};var S=n=>A(o({},"__esModule",{value:!0}),n);var l={};c(l,{signTransactionDAStateSteps:()=>T});module.exports=S(l);const T=Object.freeze({OPEN_APP:"signer.sol.steps.openApp",GET_APP_CONFIG:"signer.sol.steps.getAppConfig",INSPECT_TRANSACTION:"signer.sol.steps.inspectTransaction",BUILD_TRANSACTION_CONTEXT:"signer.sol.steps.buildTransactionContext",PROVIDE_TRANSACTION_CONTEXT:"signer.sol.steps.provideTransactionContext",SIGN_TRANSACTION:"signer.sol.steps.signTransaction"});0&&(module.exports={signTransactionDAStateSteps});
1
+ "use strict";var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var c=(n,t)=>{for(var r in t)o(n,r,{get:t[r],enumerable:!0})},S=(n,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of p(t))!s.call(n,e)&&e!==r&&o(n,e,{get:()=>t[e],enumerable:!(a=i(t,e))||a.enumerable});return n};var l=n=>S(o({},"__esModule",{value:!0}),n);var T={};c(T,{signTransactionDAStateSteps:()=>A});module.exports=l(T);const A=Object.freeze({OPEN_APP:"signer.sol.steps.openApp",GET_APP_CONFIG:"signer.sol.steps.getAppConfig",INSPECT_TRANSACTION:"signer.sol.steps.inspectTransaction",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 { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type SolanaTransactionContextResultSuccess } from \"@ledgerhq/context-module/src/solana/domain/solanaContextTypes.js\";\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 TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\n\nexport const signTransactionDAStateSteps = Object.freeze({\n OPEN_APP: \"signer.sol.steps.openApp\",\n GET_APP_CONFIG: \"signer.sol.steps.getAppConfig\",\n INSPECT_TRANSACTION: \"signer.sol.steps.inspectTransaction\",\n BUILD_TRANSACTION_CONTEXT: \"signer.sol.steps.buildTransactionContext\",\n PROVIDE_TRANSACTION_CONTEXT: \"signer.sol.steps.provideTransactionContext\",\n SIGN_TRANSACTION: \"signer.sol.steps.signTransaction\",\n} as const);\n\nexport type SignTransactionDAStateStep =\n (typeof signTransactionDAStateSteps)[keyof typeof signTransactionDAStateSteps];\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};\n\nexport type SignTransactionDAError =\n | OpenAppDAError\n | SendCommandInAppDAError<SolanaAppErrorCodes>;\n\ntype SignTransactionDARequiredInteraction =\n | UserInteractionRequired\n | OpenAppDARequiredInteraction;\n\nexport type SignTransactionDAIntermediateValue = {\n requiredUserInteraction: SignTransactionDARequiredInteraction;\n step: SignTransactionDAStateStep;\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};\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,GAkBO,MAAME,EAA8B,OAAO,OAAO,CACvD,SAAU,2BACV,eAAgB,gCAChB,oBAAqB,sCACrB,0BAA2B,2CAC3B,4BAA6B,6CAC7B,iBAAkB,kCACpB,CAAU",
4
+ "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type SolanaTransactionContextResultSuccess } from \"@ledgerhq/context-module/src/solana/domain/solanaContextTypes.js\";\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 INSPECT_TRANSACTION: \"signer.sol.steps.inspectTransaction\",\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 requiredUserInteraction: SignTransactionDARequiredInteraction;\n step: SignTransactionDAStateStep;\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};\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,GAqBO,MAAME,EAA8B,OAAO,OAAO,CACvD,SAAU,2BACV,eAAgB,gCAChB,oBAAqB,sCACrB,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 i=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var r=Object.prototype.hasOwnProperty;var l=(n,o,e,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of p(o))!r.call(n,t)&&t!==e&&i(n,t,{get:()=>o[t],enumerable:!(a=s(o,t))||a.enumerable});return n};var C=n=>l(i({},"__esModule",{value:!0}),n);var R={};module.exports=C(R);
1
+ "use strict";var e=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var p=(n,o,i,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of r(o))!l.call(n,t)&&t!==i&&e(n,t,{get:()=>o[t],enumerable:!(a=s(o,t))||a.enumerable});return n};var c=n=>p(e({},"__esModule",{value:!0}),n);var C={};module.exports=c(C);
2
2
  //# sourceMappingURL=SolanaTransactionOptionalConfig.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/model/SolanaTransactionOptionalConfig.ts"],
4
- "sourcesContent": ["import { type TransactionResolutionContext } from \"./TransactionResolutionContext\";\n\nexport type SolanaTransactionOptionalConfig = {\n transactionResolutionContext?: TransactionResolutionContext;\n solanaRPCURL?: string;\n skipOpenApp?: boolean;\n};\n"],
4
+ "sourcesContent": ["import { type TransactionResolutionContext } from \"./TransactionResolutionContext\";\n\nexport type SolanaTransactionOptionalConfig = {\n transactionResolutionContext?: TransactionResolutionContext;\n /** When set, overrides the signer-level RPC URL for this call. */\n solanaRPCURL?: string;\n skipOpenApp?: boolean;\n delayed?: boolean;\n fetchBlockhash?: () => Promise<Uint8Array>;\n};\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["SolanaTransactionOptionalConfig_exports", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var i=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var u=(n,e)=>{for(var t in e)i(n,t,{get:e[t],enumerable:!0})},c=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of g(e))!m.call(n,s)&&s!==t&&i(n,s,{get:()=>e[s],enumerable:!(r=p(e,s))||r.enumerable});return n};var f=n=>c(i({},"__esModule",{value:!0}),n);var C={};u(C,{DefaultSignerSolana:()=>y});module.exports=f(C);var o=require("./use-cases/di/useCasesTypes"),a=require("./di");class y{_container;constructor({dmk:e,sessionId:t,contextModule:r}){this._container=(0,a.makeContainer)({dmk:e,sessionId:t,contextModule:r})}signTransaction(e,t,r){return this._container.get(o.useCasesTypes.SignTransactionUseCase).execute(e,t,r)}signMessage(e,t,r){return this._container.get(o.useCasesTypes.SignMessageUseCase).execute(e,t,r)}getAddress(e,t){return this._container.get(o.useCasesTypes.GetAddressUseCase).execute(e,t)}getAppConfiguration(){return this._container.get(o.useCasesTypes.GetAppConfigurationUseCase).execute()}}0&&(module.exports={DefaultSignerSolana});
1
+ "use strict";var i=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var u=(n,e)=>{for(var t in e)i(n,t,{get:e[t],enumerable:!0})},c=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of g(e))!m.call(n,s)&&s!==t&&i(n,s,{get:()=>e[s],enumerable:!(r=p(e,s))||r.enumerable});return n};var f=n=>c(i({},"__esModule",{value:!0}),n);var y={};u(y,{DefaultSignerSolana:()=>C});module.exports=f(y);var o=require("./use-cases/di/useCasesTypes"),a=require("./di");class C{_container;constructor({dmk:e,sessionId:t,contextModule:r,solanaRPCURL:s}){this._container=(0,a.makeContainer)({dmk:e,sessionId:t,contextModule:r,solanaRPCURL:s})}signTransaction(e,t,r){return this._container.get(o.useCasesTypes.SignTransactionUseCase).execute(e,t,r)}signMessage(e,t,r){return this._container.get(o.useCasesTypes.SignMessageUseCase).execute(e,t,r)}getAddress(e,t){return this._container.get(o.useCasesTypes.GetAddressUseCase).execute(e,t)}getAppConfiguration(){return this._container.get(o.useCasesTypes.GetAppConfigurationUseCase).execute()}}0&&(module.exports={DefaultSignerSolana});
2
2
  //# sourceMappingURL=DefaultSignerSolana.js.map
@@ -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};\n\nexport class DefaultSignerSolana implements SignerSolana {\n private _container: Container;\n\n constructor({\n dmk,\n sessionId,\n contextModule,\n }: DefaultSignerSolanaConstructorArgs) {\n this._container = makeContainer({ dmk, sessionId, contextModule });\n }\n\n /**\n * ## signTransaction\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.\n *\n * - **transaction** `Uint8Array`\n * The serialised transaction to sign.\n *\n * **Optional**\n * - **options** `SolanaTransactionOptionalConfig`\n * Provides additional context for transaction signing.\n *\n * - **transactionResolutionContext** `object`\n * Lets you explicitly pass `tokenAddress` and ATA details, bypassing 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 * - **solanaRPCURL** `string`\n * RPC endpoint to use if `transactionResolutionContext` is not provided\n * and parsing requires network lookups.\n * In browser environments, use a CORS-enabled RPC URL.\n * Defaults to: `\"https://api.mainnet-beta.solana.com/\"`.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignTransactionDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed transaction bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignTransactionDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signTransaction(\"m/44'/501'/0'/0'\", serializedTx, {\n * transactionResolutionContext: resolution,\n * });\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\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 * ## signMessage\n * #### Sign a Solana off-chain message on Ledger devices.\n *\n * Supports multiple signing modes via `SignMessageVersion`:\n * - **V0** (default) \u2014 original header with `appDomain`, up to 65 515 bytes. Falls back to Legacy on `6a81`.\n * - **V1** \u2014 simplified header, up to 65 535 bytes. Falls back to V0 -> Legacy on `6a81`. Not yet supported by released firmware.\n * - **Legacy** \u2014 compact header for backward compatibility with old Solana app firmware.\n * - **Raw** \u2014 pass-through: sends a caller-formatted `Uint8Array` payload as-is, no header wrapping.\n *\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used for signing.\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 * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<{ signature: string }, SignMessageDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides `{ signature: string }` \u2014 a base58 envelope\n * (V1/V0/Legacy) or a raw base58 signature (Raw).\n * - **Error** \u2192 The device or signing operation failed (`SignMessageDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * import { SignMessageVersion } from \"@ledgerhq/device-signer-kit-solana\";\n *\n * const { observable } = signerSolana.signMessage(\n * \"m/44'/501'/0'/0'\",\n * \"Hello World\",\n * { version: SignMessageVersion.V0 },\n * );\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output.signature);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\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 * ## getAddress\n * #### Retrieve a Solana address from Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path of the account to retrieve the address from.\n *\n * **Optional**\n * - **options** `AddressOptions`\n * - **checkOnDevice** `boolean`\n * If `true`, prompts the user to verify the address on the device.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<string, GetAddressDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the base58-encoded address string, decoded to `Uint8Array`.\n * - **Error** \u2192 The device or signing operation failed (`GetAddressDAError`).\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 * ## getAppConfiguration\n * #### Retrieve the current Solana app configuration from a Ledger device.\n * ---\n * ### Parameters\n *\n * This method does not require any parameters.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<GetAppConfigurationResult, Error, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the app configuration object.\n * - **Error** \u2192 The device or signing operation failed.\n *\n * ---\n * ### Example\n *\n * ```ts\n * const config = await signerSolana.getAppConfiguration();\n * console.log(config.version, config.flags);\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,gBAQvB,MAAMH,CAA4C,CAC/C,WAER,YAAY,CACV,IAAAI,EACA,UAAAC,EACA,cAAAC,CACF,EAAuC,CACrC,KAAK,cAAa,iBAAc,CAAE,IAAAF,EAAK,UAAAC,EAAW,cAAAC,CAAc,CAAC,CACnE,CAsGA,gBACEC,EACAC,EACAC,EAC6B,CAC7B,OAAO,KAAK,WACT,IAA4B,gBAAc,sBAAsB,EAChE,QAAQF,EAAgBC,EAAaC,CAA+B,CACzE,CAkGA,YACEF,EACAG,EACAC,EACyB,CACzB,OAAO,KAAK,WACT,IAAwB,gBAAc,kBAAkB,EACxD,QAAQJ,EAAgBG,EAASC,CAAO,CAC7C,CA4DA,WACEJ,EACAI,EACwB,CACxB,OAAO,KAAK,WACT,IAAuB,gBAAc,iBAAiB,EACtD,QAAQJ,EAAgBI,CAAO,CACpC,CAyDA,qBAAuD,CACrD,OAAO,KAAK,WACT,IAAgC,gBAAc,0BAA0B,EACxE,QAAQ,CACb,CACF",
6
- "names": ["DefaultSignerSolana_exports", "__export", "DefaultSignerSolana", "__toCommonJS", "import_useCasesTypes", "import_di", "dmk", "sessionId", "contextModule", "derivationPath", "transaction", "solanaTransactionOptionalConfig", "message", "options"]
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,CAyDA,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
+ "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 m=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var y=(i,e)=>{for(var t in e)m(i,t,{get:e[t],enumerable:!0})},T=(i,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of k(e))!h.call(i,n)&&n!==t&&m(i,n,{get:()=>e[n],enumerable:!(o=u(e,n))||o.enumerable});return i};var S=i=>T(m({},"__esModule",{value:!0}),i),A=(i,e,t,o)=>{for(var n=o>1?void 0:o?u(e,t):e,d=i.length-1,g;d>=0;d--)(g=i[d])&&(n=(o?g(e,t,n):g(n))||n);return o&&n&&m(e,t,n),n},a=(i,e)=>(t,o)=>e(t,o,i);var C={};y(C,{SolanaAppBinder:()=>c});module.exports=S(C);var r=require("@ledgerhq/device-management-kit"),s=require("inversify"),v=require("../app-binder/task/SendSignMessageTask"),p=require("../externalTypes"),l=require("./command/GetAppConfigurationCommand"),D=require("./command/GetPubKeyCommand"),f=require("./device-action/SignTransactionDeviceAction");let c=class{constructor(e,t,o,n){this.dmk=e;this.sessionId=t;this.contextModule=o;this.dmkLoggerFactory=n}getAddress(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new r.SendCommandInAppDeviceAction({input:{command:new D.GetPubKeyCommand(e),appName:"Solana",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},loggerFactory:this.dmkLoggerFactory})})}signMessage(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new r.CallTaskInAppDeviceAction({input:{task:async t=>new v.SendSignMessageTask(t,{derivationPath:e.derivationPath,sendingData:e.message,version:e.version,appDomain:e.appDomain}).run(),appName:"Solana",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:"Solana",requiredUserInteraction:r.UserInteractionRequired.None,skipOpenApp:!1},logger:this.dmkLoggerFactory("GetAppConfigurationCommand")})})}};c=A([(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))],c);0&&(module.exports={SolanaAppBinder});
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"),l=require("../app-binder/task/SendSignMessageTask"),p=require("../externalTypes"),A=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 l.SendSignMessageTask(t,{derivationPath:e.derivationPath,sendingData:e.message,version:e.version,appDomain:e.appDomain}).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 A.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\";\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 ) {}\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: \"Solana\",\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 },\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: \"Solana\",\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: \"Solana\",\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,uDAGrC,IAAMC,EAAN,KAAsB,CAC3B,YACqCC,EACMC,EACIC,EAErCC,EACR,CALmC,SAAAH,EACM,eAAAC,EACI,mBAAAC,EAErC,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,SACT,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,aACtB,EACA,cAAe,KAAK,gBACtB,CAAC,CACH,CAAC,CACH,CAEA,YAAYA,EAMgB,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,SAClB,CAAC,EAAE,IAAI,EACT,QAAS,SACT,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,SACT,wBAAyB,0BAAwB,KACjD,YAAa,EACf,EACA,OAAQ,KAAK,iBAAiB,4BAA4B,CAC5D,CAAC,CACH,CAAC,CACH,CACF,EA1FaL,EAANO,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,gBAAc,GAAG,GACxBA,EAAA,eAAO,gBAAc,SAAS,GAC9BA,EAAA,eAAO,gBAAc,aAAa,GAClCA,EAAA,eAAO,gBAAc,gBAAgB,IAL7BR",
6
- "names": ["SolanaAppBinder_exports", "__export", "SolanaAppBinder", "__toCommonJS", "import_device_management_kit", "import_inversify", "import_SendSignMessageTask", "import_externalTypes", "import_GetAppConfigurationCommand", "import_GetPubKeyCommand", "import_SignTransactionDeviceAction", "SolanaAppBinder", "dmk", "sessionId", "contextModule", "dmkLoggerFactory", "args", "internalApi", "__decorateClass", "__decorateParam"]
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,EAMgB,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,SAClB,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,EAhGaP,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
+ "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"),A=require("rxjs"),v=require("./command/GetAppConfigurationCommand"),m=require("./command/GetPubKeyCommand"),u=require("./SolanaAppBinder");const d=()=>({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,d);expect(s).toBeDefined()}),describe("getAddress",()=>{it("should return the address",()=>new Promise((s,n)=>{const t="D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5";vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,A.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const a=new u.SolanaAppBinder(i,"sessionId",c,d),{observable:l}=a.getAddress({derivationPath:"44'/501'",checkOnDevice:!1,skipOpenApp:!1}),r=[];l.subscribe({next:e=>{r.push(e)},error:e=>{n(e)},complete:()=>{try{expect(r).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,d).getAddress(t),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new m.GetPubKeyCommand(t),appName:"Solana",requiredUserInteraction:o.UserInteractionRequired.VerifyAddress,skipOpenApp:!1}})}))}),it("when checkOnDevice is false: UserInteractionRequired.None",()=>{const t={...s,checkOnDevice:!1};new u.SolanaAppBinder(i,"sessionId",c,d).getAddress(t),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new m.GetPubKeyCommand(t),appName:"Solana",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,A.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const a=new u.SolanaAppBinder(i,"sessionId",c,d),{observable:l}=a.signTransaction({derivationPath:"44'/501'",transaction:new Uint8Array([1,2,3,4]),solanaTransactionOptionalConfig:{skipOpenApp:!1}}),r=[];l.subscribe({next:e=>{r.push(e)},error:e=>{n(e)},complete:()=>{try{expect(r).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,d).signTransaction({derivationPath:s,transaction:n,solanaTransactionOptionalConfig:{skipOpenApp:!1}}),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{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"},a={derivationPath:"44'/501'/0'/0'",message:"Hello world",skipOpenApp:!1};vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,A.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const l=new u.SolanaAppBinder(i,"sessionId",c,d),{observable:r}=l.signMessage(a),e=[];r.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("should accept a Uint8Array message for Raw pass-through",()=>new Promise((s,n)=>{const t={signature:"rawSig"},a=new Uint8Array([255,1,2]);vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,A.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const l=new u.SolanaAppBinder(i,"sessionId",c,d),{observable:r}=l.signMessage({derivationPath:"44'/501'/0'/0'",message:a,skipOpenApp:!1}),e=[];r.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,A.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const a=new u.SolanaAppBinder(i,"sessionId",c,d),{observable:l}=a.getAppConfiguration(),r=[];l.subscribe({next:e=>{r.push(e)},error:e=>{n(e)},complete:()=>{try{expect(r).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,d).getAppConfiguration(),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new v.GetAppConfigurationCommand,appName:"Solana",requiredUserInteraction:o.UserInteractionRequired.None,skipOpenApp:!1}})}))})})});
1
+ "use strict";var o=require("@ledgerhq/device-management-kit"),m=require("rxjs"),D=require("./command/GetAppConfigurationCommand"),g=require("./command/GetPubKeyCommand"),u=require("./services/BlockhashService"),v=require("./constants"),d=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 d.SolanaAppBinder({},{},c,A,void 0,new u.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 a=new d.SolanaAppBinder(i,"sessionId",c,A,void 0,new u.BlockhashService),{observable:l}=a.getAddress({derivationPath:"44'/501'",checkOnDevice:!1,skipOpenApp:!1}),r=[];l.subscribe({next:e=>{r.push(e)},error:e=>{n(e)},complete:()=>{try{expect(r).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 d.SolanaAppBinder(i,"sessionId",c,A,void 0,new u.BlockhashService).getAddress(t),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new g.GetPubKeyCommand(t),appName:v.APP_NAME,requiredUserInteraction:o.UserInteractionRequired.VerifyAddress,skipOpenApp:!1}})}))}),it("when checkOnDevice is false: UserInteractionRequired.None",()=>{const t={...s,checkOnDevice:!1};new d.SolanaAppBinder(i,"sessionId",c,A,void 0,new u.BlockhashService).getAddress(t),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new g.GetPubKeyCommand(t),appName:v.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 a=new d.SolanaAppBinder(i,"sessionId",c,A,void 0,new u.BlockhashService),{observable:l}=a.signTransaction({derivationPath:"44'/501'",transaction:new Uint8Array([1,2,3,4]),solanaTransactionOptionalConfig:{skipOpenApp:!1}}),r=[];l.subscribe({next:e=>{r.push(e)},error:e=>{n(e)},complete:()=>{try{expect(r).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 d.SolanaAppBinder(i,"sessionId",c,A,void 0,new u.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"},a={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 d.SolanaAppBinder(i,"sessionId",c,A,void 0,new u.BlockhashService),{observable:r}=l.signMessage(a),e=[];r.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("should accept a Uint8Array message for Raw pass-through",()=>new Promise((s,n)=>{const t={signature:"rawSig"},a=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 d.SolanaAppBinder(i,"sessionId",c,A,void 0,new u.BlockhashService),{observable:r}=l.signMessage({derivationPath:"44'/501'/0'/0'",message:a,skipOpenApp:!1}),e=[];r.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 a=new d.SolanaAppBinder(i,"sessionId",c,A,void 0,new u.BlockhashService),{observable:l}=a.getAppConfiguration(),r=[];l.subscribe({next:e=>{r.push(e)},error:e=>{n(e)},complete:()=>{try{expect(r).toEqual([{status:o.DeviceActionStatus.Completed,output:t}]),s()}catch(e){n(e)}}})})),it("should call executeDeviceAction with the correct params",()=>{new d.SolanaAppBinder(i,"sessionId",c,A,void 0,new u.BlockhashService).getAppConfiguration(),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new D.GetAppConfigurationCommand,appName:v.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 { 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 );\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 );\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 );\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: \"Solana\",\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 );\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: \"Solana\",\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 );\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 );\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: {\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 );\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 );\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 );\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 );\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: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n });\n});\n"],
5
- "mappings": "aACA,IAAAA,EAQO,2CACPC,EAAqB,gBAiBrBC,EAA2C,gDAC3CC,EAAiC,sCACjCC,EAAgC,6BAEhC,MAAMC,EAAoB,KAAO,CAC/B,MAAO,GAAG,GAAG,EACb,KAAM,GAAG,GAAG,EACZ,KAAM,GAAG,GAAG,EACZ,MAAO,GAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEA,SAAS,kBAAmB,IAAM,CAEhC,MAAMC,EAAmC,CAAC,EAEpCC,EAAiC,CACrC,YAAa,GAAG,GAAG,EACnB,oBAAqB,GAAG,GAAG,CAC7B,EACA,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAED,GAAG,oBAAqB,IAAM,CAC5B,MAAMC,EAAS,IAAI,kBACjB,CAAC,EACD,CAAC,EACDF,EACAD,CACF,EACA,OAAOG,CAAM,EAAE,YAAY,CAC7B,CAAC,EAED,SAAS,aAAc,IAAM,CAC3B,GAAG,4BAA6B,IAC9B,IAAI,QAAc,CAACC,EAASC,IAAW,CAErC,MAAMC,EAAU,+CAEhB,GAAG,MAAMJ,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,cAAY,QAAK,CACf,CACE,OAAQ,qBAAmB,UAC3B,OAAQI,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMC,EAAY,IAAI,kBACpBL,EACA,YACAD,EACAD,CACF,EACM,CAAE,WAAAQ,CAAW,EAAID,EAAU,WAAW,CAC1C,eAAgB,WAChB,cAAe,GACf,YAAa,EACf,CAAC,EAGKE,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQ,qBAAmB,UAC3B,OAAQH,CACV,CACF,CAAC,EACDF,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,SAAS,uDAAwD,IAAM,CACrE,MAAMC,EAAa,CACjB,eAAgB,iBAChB,gBAAiB,GACjB,YAAa,EACf,EAEA,GAAG,oEAAqE,IAAM,CAG5E,MAAMC,EAAS,CACb,GAAGD,EACH,gBACF,EAGkB,IAAI,kBACpBV,EACA,YACAD,EACAD,CACF,EACU,WAAWa,CAAM,EAG3B,OAAOX,EAAU,mBAAmB,EAAE,qBACpC,OAAO,iBAAiB,CACtB,UAAW,YACX,aAAc,OAAO,iBAAiB,CACpC,MAAO,CACL,QAAS,IAAI,mBAAiBW,CAAM,EACpC,QAAS,SACT,wBAAyB,0BAAwB,cACjD,YAAa,EACf,CACF,CAAC,CACH,CAAC,CACH,CACF,CAAC,EAED,GAAG,4DAA6D,IAAM,CAGpE,MAAMA,EAAS,CACb,GAAGD,EACH,gBACF,EAGkB,IAAI,kBACpBV,EACA,YACAD,EACAD,CACF,EACU,WAAWa,CAAM,EAG3B,OAAOX,EAAU,mBAAmB,EAAE,qBACpC,OAAO,iBAAiB,CACtB,UAAW,YACX,aAAc,OAAO,iBAAiB,CACpC,MAAO,CACL,QAAS,IAAI,mBAAiBW,CAAM,EACpC,QAAS,SACT,wBAAyB,0BAAwB,KACjD,YAAa,EACf,CACF,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,kBAAmB,IAAM,CAChC,GAAG,8BAA+B,IAChC,IAAI,QAAc,CAACT,EAASC,IAAW,CAErC,MAAMS,EAAY,IAAI,WAAW,CAAC,EAAM,EAAM,CAAI,CAAC,EAEnD,GAAG,MAAMZ,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,cAAY,QAAK,CACf,CACE,OAAQ,qBAAmB,UAC3B,OAAQY,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMP,EAAY,IAAI,kBACpBL,EACA,YACAD,EACAD,CACF,EACM,CAAE,WAAAQ,CAAW,EAAID,EAAU,gBAAgB,CAC/C,eAAgB,WAChB,YAAa,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,EACpD,gCAAiC,CAAE,YAAa,EAAM,CACxD,CAAC,EAGKE,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQ,qBAAmB,UAC3B,OAAQK,CACV,CACF,CAAC,EACDV,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,0DAA2D,IAAM,CAElE,MAAMI,EAAiB,iBACjBC,EAAc,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,EACrDC,EAAc,GAGF,IAAI,kBACpBf,EACA,YACAD,EACAD,CACF,EACU,gBAAgB,CACxB,eAAAe,EACA,YAAAC,EACA,gCAAiC,CAAE,YAAa,EAAM,CACxD,CAAC,EAGD,OAAOd,EAAU,mBAAmB,EAAE,qBACpC,OAAO,iBAAiB,CACtB,UAAW,YACX,aAAc,OAAO,iBAAiB,CACpC,MAAO,CACL,eAAAa,EACA,YAAAC,EACA,mBAAoB,CAAE,YAAAC,CAAY,EAClC,cAAehB,CACjB,CACF,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CAAC,EAED,SAAS,cAAe,IAAM,CAC5B,GAAG,mCAAoC,IACrC,IAAI,QAAc,CAACG,EAASC,IAAW,CAErC,MAAMa,EAAgB,CACpB,UAAW,WACb,EACMC,EAAkB,CACtB,eAAgB,iBAChB,QAAS,cACT,YAAa,EACf,EAEA,GAAG,MAAMjB,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,cAAY,QAAK,CACf,CACE,OAAQ,qBAAmB,UAC3B,OAAQgB,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMX,EAAY,IAAI,kBACpBL,EACA,YACAD,EACAD,CACF,EACM,CAAE,WAAAQ,CAAW,EAAID,EAAU,YAAYY,CAAe,EAGtDV,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQ,qBAAmB,UAC3B,OAAQS,CACV,CACF,CAAC,EACDd,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,0DAA2D,IAC5D,IAAI,QAAc,CAACP,EAASC,IAAW,CAErC,MAAMa,EAAgB,CAAE,UAAW,QAAS,EACtCE,EAAgB,IAAI,WAAW,CAAC,IAAM,EAAM,CAAI,CAAC,EAEvD,GAAG,MAAMlB,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,cAAY,QAAK,CACf,CACE,OAAQ,qBAAmB,UAC3B,OAAQgB,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMX,EAAY,IAAI,kBACpBL,EACA,YACAD,EACAD,CACF,EACM,CAAE,WAAAQ,CAAW,EAAID,EAAU,YAAY,CAC3C,eAAgB,iBAChB,QAASa,EACT,YAAa,EACf,CAAC,EAGKX,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAUD,EAAO,KAAKC,CAAK,EAClC,MAAQC,GAAQN,EAAOM,CAAG,EAC1B,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQ,qBAAmB,UAC3B,OAAQS,CACV,CACF,CAAC,EACDd,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,CACN,CAAC,EAED,SAAS,sBAAuB,IAAM,CACpC,GAAG,sCAAuC,IACxC,IAAI,QAAc,CAACP,EAASC,IAAW,CAErC,MAAMgB,EAAmB,CACvB,oBAAqB,GACrB,kBAAmB,OACnB,QAAS,QACX,EAEA,GAAG,MAAMnB,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,cAAY,QAAK,CACf,CACE,OAAQ,qBAAmB,UAC3B,OAAQmB,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMd,EAAY,IAAI,kBACpBL,EACA,YACAD,EACAD,CACF,EACM,CAAE,WAAAQ,CAAW,EAAID,EAAU,oBAAoB,EAG/CE,EAIA,CAAC,EAEPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQ,qBAAmB,UAC3B,OAAQY,CACV,CACF,CAAC,EACDjB,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,0DAA2D,IAAM,CAEhD,IAAI,kBACpBT,EACA,YACAD,EACAD,CACF,EAGU,oBAAoB,EAG9B,OAAOE,EAAU,mBAAmB,EAAE,qBACpC,OAAO,iBAAiB,CACtB,UAAW,YACX,aAAc,OAAO,iBAAiB,CACpC,MAAO,CACL,QAAS,IAAI,6BACb,QAAS,SACT,wBAAyB,0BAAwB,KACjD,YAAa,EACf,CACF,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CAAC,CACH,CAAC",
6
- "names": ["import_device_management_kit", "import_rxjs", "import_GetAppConfigurationCommand", "import_GetPubKeyCommand", "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 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": "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",
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"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var t=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var v=(p,e)=>{for(var s in e)t(p,s,{get:e[s],enumerable:!0})},A=(p,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of l(e))!c.call(p,o)&&o!==s&&t(p,o,{get:()=>e[o],enumerable:!(i=a(e,o))||i.enumerable});return p};var m=p=>A(t({},"__esModule",{value:!0}),p);var f={};v(f,{SolanaApplicationResolver:()=>S});module.exports=m(f);var r=require("@ledgerhq/device-management-kit");const n="0.0.1";class S{resolve(e,s){if(e.sessionStateType===r.DeviceSessionStateType.Connected)return{isCompatible:!1,version:n};const i=e.currentApp,o=i?.name;return!o||o!=="Solana"?{isCompatible:!1,version:n}:{isCompatible:!0,version:i.version}}}0&&(module.exports={SolanaApplicationResolver});
1
+ "use strict";var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var p in e)i(o,p,{get:e[p],enumerable:!0})},N=(o,e,p,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of l(e))!S.call(o,s)&&s!==p&&i(o,s,{get:()=>e[s],enumerable:!(t=a(e,s))||t.enumerable});return o};var _=o=>N(i({},"__esModule",{value:!0}),o);var R={};c(R,{SOLANA_APP_SPL_MIN_VERSION:()=>E,SOLANA_MIN_DELAYED_SIGNING_VERSION:()=>m,SOLANA_MIN_SPL_VERSION:()=>v,SolanaApplicationResolver:()=>I});module.exports=_(R);var r=require("@ledgerhq/device-management-kit"),A=require("./constants");const n="0.0.1",v="1.9.2",m="1.14.0",E="1.9.2";class I{resolve(e,p){if(e.sessionStateType===r.DeviceSessionStateType.Connected)return{isCompatible:!1,version:n};const t=e.currentApp?.name;return!t||t!==A.APP_NAME&&t!=="Exchange"?{isCompatible:!1,version:n}:{isCompatible:!0,version:p.version}}}0&&(module.exports={SOLANA_APP_SPL_MIN_VERSION,SOLANA_MIN_DELAYED_SIGNING_VERSION,SOLANA_MIN_SPL_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\nconst DEFAULT_VERSION = \"0.0.1\";\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 currentApp = deviceState.currentApp;\n const appName = currentApp?.name;\n\n if (!appName || appName !== \"Solana\") {\n return { isCompatible: false, version: DEFAULT_VERSION };\n }\n\n return { isCompatible: true, version: currentApp.version };\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,+BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAMO,2CAEP,MAAMC,EAAkB,QAEjB,MAAMH,CAAyD,CACpE,QAAQI,EAAiCC,EAAoC,CAC3E,GAAID,EAAY,mBAAqB,yBAAuB,UAC1D,MAAO,CAAE,aAAc,GAAO,QAASD,CAAgB,EAGzD,MAAMG,EAAaF,EAAY,WACzBG,EAAUD,GAAY,KAE5B,MAAI,CAACC,GAAWA,IAAY,SACnB,CAAE,aAAc,GAAO,QAASJ,CAAgB,EAGlD,CAAE,aAAc,GAAM,QAASG,EAAW,OAAQ,CAC3D,CACF",
6
- "names": ["SolanaApplicationResolver_exports", "__export", "SolanaApplicationResolver", "__toCommonJS", "import_device_management_kit", "DEFAULT_VERSION", "deviceState", "_appConfig", "currentApp", "appName"]
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\";\n\nexport const SOLANA_APP_SPL_MIN_VERSION = \"1.9.2\";\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,gCAAAE,EAAA,uCAAAC,EAAA,2BAAAC,EAAA,8BAAAC,IAAA,eAAAC,EAAAN,GAAA,IAAAO,EAMO,2CAEPC,EAAyB,uBAEzB,MAAMC,EAAkB,QACXL,EAAyB,QACzBD,EAAqC,SAErCD,EAA6B,QAEnC,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_APP_SPL_MIN_VERSION", "SOLANA_MIN_DELAYED_SIGNING_VERSION", "SOLANA_MIN_SPL_VERSION", "SolanaApplicationResolver", "__toCommonJS", "import_device_management_kit", "import_constants", "DEFAULT_VERSION", "deviceState", "appConfig", "appName"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var t=require("@ledgerhq/device-management-kit"),l=require("./SolanaApplicationResolver");describe("SolanaApplicationResolver",()=>{const s=new l.SolanaApplicationResolver;function i(e){return{version:e,blindSigningEnabled:!1}}function a(e,n,o=t.DeviceModelId.FLEX){return{sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:e,version:n},deviceModelId:o,isSecureConnectionAllowed:!1}}function c(){return{sessionStateType:t.DeviceSessionStateType.Connected,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.0.0"},deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1}}it("should resolve as incompatible when device is Connected",()=>{const e=c(),n=i("1.0.0"),o=s.resolve(e,n);expect(o).toStrictEqual({isCompatible:!1,version:"0.0.1"})}),it("should resolve as compatible with currentApp.version when app is Solana",()=>{const e=a("Solana","1.4.0"),n=i("1.0.0"),o=s.resolve(e,n);expect(o).toStrictEqual({isCompatible:!0,version:"1.4.0"})}),it("should resolve as incompatible when app is not Solana",()=>{const e=a("Ethereum","1.0.0"),n=i("1.0.0"),o=s.resolve(e,n);expect(o).toStrictEqual({isCompatible:!1,version:"0.0.1"})})});
1
+ "use strict";var t=require("@ledgerhq/device-management-kit"),a=require("./SolanaApplicationResolver");describe("SolanaApplicationResolver",()=>{const n=new a.SolanaApplicationResolver;function i(e){return{version:e,blindSigningEnabled:!1}}function o(e,s,l=t.DeviceModelId.FLEX){return{sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:e,version:s},deviceModelId:l,isSecureConnectionAllowed:!1}}it("should be incompatible when device session is not ready",()=>{const e={sessionStateType:t.DeviceSessionStateType.Connected,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1};expect(n.resolve(e,i("1.4.0"))).toStrictEqual({isCompatible:!1,version:"0.0.1"})}),it("should be incompatible when no app is open",()=>{const e={sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:void 0,deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1};expect(n.resolve(e,i("1.4.0"))).toStrictEqual({isCompatible:!1,version:"0.0.1"})}),it("should be incompatible when a different app is open",()=>{const e=o("Bitcoin","2.1.0");expect(n.resolve(e,i("1.4.0"))).toStrictEqual({isCompatible:!1,version:"0.0.1"})}),it("should be compatible and use the version from appConfig when Solana is open",()=>{const e=o("Solana","1.4.0");expect(n.resolve(e,i("1.4.0"))).toStrictEqual({isCompatible:!0,version:"1.4.0"})}),it("should be compatible and use Solana version from appConfig when Exchange is orchestrating",()=>{const e=o("Exchange","4.4.2"),s=i("1.9.5");expect(n.resolve(e,s)).toStrictEqual({isCompatible:!0,version:"1.9.5"})})});
2
2
  //# sourceMappingURL=SolanaApplicationResolver.test.js.map