@ledgerhq/device-signer-kit-solana 0.0.0-develop-20250625001228 → 0.0.0-develop-20250627001242

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 (155) hide show
  1. package/README.md +5 -1
  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/SignTransactionDeviceActionTypes.js +1 -1
  5. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +1 -1
  6. package/lib/cjs/api/model/TransactionOptions.js +1 -1
  7. package/lib/cjs/api/model/TransactionOptions.js.map +1 -1
  8. package/lib/cjs/internal/DefaultSignerSolana.js +1 -1
  9. package/lib/cjs/internal/DefaultSignerSolana.js.map +3 -3
  10. package/lib/cjs/internal/DefaultSignerSolana.test.js +1 -1
  11. package/lib/cjs/internal/DefaultSignerSolana.test.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/command/GetChallengeCommand.js +2 -0
  17. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js.map +7 -0
  18. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js +2 -0
  19. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js.map +7 -0
  20. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js +2 -0
  21. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +7 -0
  22. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +2 -0
  23. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +7 -0
  24. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js +2 -0
  25. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +7 -0
  26. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +2 -0
  27. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +7 -0
  28. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  29. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  30. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  31. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  32. package/lib/cjs/internal/app-binder/services/ApplicationChecker.js +2 -0
  33. package/lib/cjs/internal/app-binder/services/ApplicationChecker.js.map +7 -0
  34. package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js +2 -0
  35. package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js.map +7 -0
  36. package/lib/cjs/internal/app-binder/services/TransactionInspector.js +4 -0
  37. package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +7 -0
  38. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +2 -0
  39. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +7 -0
  40. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +2 -0
  41. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +7 -0
  42. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +2 -0
  43. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +7 -0
  44. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +2 -0
  45. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +7 -0
  46. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +2 -0
  47. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +7 -0
  48. package/lib/cjs/internal/di.js +1 -1
  49. package/lib/cjs/internal/di.js.map +3 -3
  50. package/lib/cjs/internal/externalTypes.js +1 -1
  51. package/lib/cjs/internal/externalTypes.js.map +2 -2
  52. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  53. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js.map +2 -2
  54. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  55. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +3 -3
  56. package/lib/cjs/package.json +7 -1
  57. package/lib/esm/api/SignerSolanaBuilder.js +1 -1
  58. package/lib/esm/api/SignerSolanaBuilder.js.map +3 -3
  59. package/lib/esm/internal/DefaultSignerSolana.js +1 -1
  60. package/lib/esm/internal/DefaultSignerSolana.js.map +3 -3
  61. package/lib/esm/internal/DefaultSignerSolana.test.js +1 -1
  62. package/lib/esm/internal/DefaultSignerSolana.test.js.map +3 -3
  63. package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
  64. package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +3 -3
  65. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
  66. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  67. package/lib/esm/internal/app-binder/command/GetChallengeCommand.js +2 -0
  68. package/lib/esm/internal/app-binder/command/GetChallengeCommand.js.map +7 -0
  69. package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js +2 -0
  70. package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js.map +7 -0
  71. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js +2 -0
  72. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +7 -0
  73. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +2 -0
  74. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +7 -0
  75. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js +2 -0
  76. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +7 -0
  77. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +2 -0
  78. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +7 -0
  79. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  80. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  81. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  82. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  83. package/lib/esm/internal/app-binder/services/ApplicationChecker.js +2 -0
  84. package/lib/esm/internal/app-binder/services/ApplicationChecker.js.map +7 -0
  85. package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js +2 -0
  86. package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js.map +7 -0
  87. package/lib/esm/internal/app-binder/services/TransactionInspector.js +4 -0
  88. package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +7 -0
  89. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +2 -0
  90. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +7 -0
  91. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +2 -0
  92. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +7 -0
  93. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +2 -0
  94. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +7 -0
  95. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +2 -0
  96. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +7 -0
  97. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +2 -0
  98. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +7 -0
  99. package/lib/esm/internal/di.js +1 -1
  100. package/lib/esm/internal/di.js.map +3 -3
  101. package/lib/esm/internal/externalTypes.js +1 -1
  102. package/lib/esm/internal/externalTypes.js.map +2 -2
  103. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  104. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js.map +2 -2
  105. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  106. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +3 -3
  107. package/lib/esm/package.json +7 -1
  108. package/lib/types/api/SignerSolanaBuilder.d.ts +12 -1
  109. package/lib/types/api/SignerSolanaBuilder.d.ts.map +1 -1
  110. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +9 -1
  111. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  112. package/lib/types/api/model/TransactionOptions.d.ts +5 -1
  113. package/lib/types/api/model/TransactionOptions.d.ts.map +1 -1
  114. package/lib/types/internal/DefaultSignerSolana.d.ts +4 -3
  115. package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
  116. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +3 -1
  117. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
  118. package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts +11 -0
  119. package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts.map +1 -0
  120. package/lib/types/internal/app-binder/command/GetChallengeCommand.test.d.ts +2 -0
  121. package/lib/types/internal/app-binder/command/GetChallengeCommand.test.d.ts.map +1 -0
  122. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts +13 -0
  123. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts.map +1 -0
  124. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.test.d.ts +2 -0
  125. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.test.d.ts.map +1 -0
  126. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts +13 -0
  127. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts.map +1 -0
  128. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts +2 -0
  129. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts.map +1 -0
  130. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +15 -1
  131. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  132. package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts +13 -0
  133. package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts.map +1 -0
  134. package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts +2 -0
  135. package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts.map +1 -0
  136. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +22 -0
  137. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -0
  138. package/lib/types/internal/app-binder/services/TransactionInspector.test.d.ts +2 -0
  139. package/lib/types/internal/app-binder/services/TransactionInspector.test.d.ts.map +1 -0
  140. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +24 -0
  141. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -0
  142. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts +2 -0
  143. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts.map +1 -0
  144. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +15 -0
  145. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -0
  146. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts +2 -0
  147. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts.map +1 -0
  148. package/lib/types/internal/di.d.ts +3 -1
  149. package/lib/types/internal/di.d.ts.map +1 -1
  150. package/lib/types/internal/externalTypes.d.ts +1 -0
  151. package/lib/types/internal/externalTypes.d.ts.map +1 -1
  152. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts +3 -2
  153. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts.map +1 -1
  154. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  155. package/package.json +11 -5
@@ -1,2 +1,2 @@
1
- import{isSuccessCommandResult as c,OpenAppDeviceAction as p,UnknownDAError as s,UserInteractionRequired as r,XStateDeviceAction as u}from"@ledgerhq/device-management-kit";import{Left as S,Right as l}from"purify-ts";import{assign as e,fromPromise as g,setup as d}from"xstate";import{SignTransactionCommand as A}from"../../app-binder/command/SignTransactionCommand";import{SignDataTask as m}from"../../app-binder/task/SendSignDataTask";class E extends u{makeStateMachine(a){const{signTransaction:i}=this.extractDependencies(a);return d({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new p({input:{appName:"Solana"}}).makeStateMachine(a),signTransaction:g(i)},guards:{noInternalError:({context:n})=>n._internalState.error===null,skipOpenApp:({context:n})=>n.input.skipOpenApp},actions:{assignErrorFromEvent:e({_internalState:n=>({...n.context._internalState,error:n.event.error})})}}).createMachine({id:"SignTransactionDeviceAction",initial:"InitialState",context:({input:n})=>({input:n,intermediateValue:{requiredUserInteraction:r.None},_internalState:{error:null,signature:null}}),states:{InitialState:{always:[{target:"SignTransaction",guard:"skipOpenApp"},"OpenAppDeviceAction"]},OpenAppDeviceAction:{exit:e({intermediateValue:{requiredUserInteraction:r.None}}),invoke:{id:"openAppStateMachine",input:{appName:"Solana"},src:"openAppStateMachine",onSnapshot:{actions:e({intermediateValue:n=>n.event.snapshot.context.intermediateValue})},onDone:{actions:e({_internalState:n=>n.event.output.caseOf({Right:()=>n.context._internalState,Left:t=>({...n.context._internalState,error:t})})}),target:"CheckOpenAppDeviceActionResult"}}},CheckOpenAppDeviceActionResult:{always:[{target:"SignTransaction",guard:"noInternalError"},"Error"]},SignTransaction:{entry:e({intermediateValue:{requiredUserInteraction:r.SignTransaction}}),exit:e({intermediateValue:{requiredUserInteraction:r.None}}),invoke:{id:"signTransaction",src:"signTransaction",input:({context:n})=>({derivationPath:n.input.derivationPath,serializedTransaction:n.input.transaction}),onDone:{target:"SignTransactionResultCheck",actions:[e({_internalState:({event:n,context:t})=>{if(!c(n.output))return{...t._internalState,error:n.output.error};const o=n.output.data.extract();return n.output.data.isJust()&&o instanceof Uint8Array?{...t._internalState,signature:o}:{...t._internalState,error:new s("No Signature available")}}})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignTransactionResultCheck:{always:[{guard:"noInternalError",target:"Success"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:n})=>n._internalState.signature?l(n._internalState.signature):S(n._internalState.error||new s("No error or signature available"))})}extractDependencies(a){return{signTransaction:async n=>new m(a,{commandFactory:t=>new A({serializedTransaction:t.chunkedData,more:t.more,extend:t.extend}),derivationPath:n.input.derivationPath,sendingData:n.input.serializedTransaction}).run()}}}export{E as SignTransactionDeviceAction};
1
+ import{DeviceModelId as S,isSuccessCommandResult as g,OpenAppDeviceAction as T,UnknownDAError as s,UserInteractionRequired as a,XStateDeviceAction as A}from"@ledgerhq/device-management-kit";import{Left as m,Right as C}from"purify-ts";import{assign as e,fromPromise as i,setup as y}from"xstate";import{GetAppConfigurationCommand as D}from"../../app-binder/command/GetAppConfigurationCommand";import{SignTransactionCommand as E}from"../../app-binder/command/SignTransactionCommand";import{ApplicationChecker as f}from"../../app-binder/services/ApplicationChecker";import{SolanaTransactionTypes as x,TransactionInspector as v}from"../../app-binder/services/TransactionInspector";import{BuildTransactionContextTask as I}from"../../app-binder/task/BuildTransactionContextTask";import{ProvideSolanaTransactionContextTask as h}from"../../app-binder/task/ProvideTransactionContextTask";import{SignDataTask as k}from"../../app-binder/task/SendSignDataTask";class F extends A{makeStateMachine(r){const{signTransaction:p,getAppConfig:c,buildContext:u,provideContext:l,inspectTransaction:d}=this.extractDependencies(r);return y({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new T({input:{appName:"Solana"}}).makeStateMachine(r),getAppConfig:i(c),inspectTransaction:i(({input:t})=>d({serializedTransaction:t.transaction})),buildContext:i(u),provideContext:i(l),signTransaction:i(p)},guards:{noInternalError:({context:t})=>t._internalState.error===null,skipOpenApp:({context:t})=>t.input.skipOpenApp,isSPLSupported:({context:t})=>new f(r.getDeviceSessionState(),t._internalState.appConfig).withMinVersionExclusive("1.4.0").excludeDeviceModel(S.NANO_S).check(),isAnSPLTransaction:({context:t})=>t._internalState.inspectorResult?.transactionType===x.SPL},actions:{assignErrorFromEvent:e({_internalState:t=>({...t.context._internalState,error:new s(t.event.error instanceof Error?t.event.error.message:String(t.event.error))})})}}).createMachine({id:"SignTransactionDeviceAction",initial:"InitialState",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:a.None},_internalState:{error:null,signature:null,appConfig:null,solanaTransactionContext:null,inspectorResult:null}}),states:{InitialState:{always:[{target:"GetAppConfig",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{exit:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:"Solana"}),onSnapshot:{actions:e({intermediateValue:({event:t})=>t.snapshot.context.intermediateValue})},onDone:{target:"CheckOpenAppDeviceActionResult",actions:e({_internalState:({event:t,context:n})=>t.output.caseOf({Right:()=>n._internalState,Left:o=>({...n._internalState,error:o})})})}}},CheckOpenAppDeviceActionResult:{always:[{target:"GetAppConfig",guard:"noInternalError"},{target:"Error"}]},GetAppConfig:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"getAppConfig",src:"getAppConfig",onDone:{target:"GetAppConfigResultCheck",actions:e({_internalState:({event:t,context:n})=>g(t.output)?{...n._internalState,appConfig:t.output.data}:{...n._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},GetAppConfigResultCheck:{always:[{target:"InspectTransaction",guard:"noInternalError"},{target:"Error"}]},InspectTransaction:{invoke:{id:"inspectTransaction",src:"inspectTransaction",input:({context:t})=>({...t.input,serializedTransaction:t.input.transaction}),onDone:{target:"AfterInspect",actions:e({_internalState:({context:t,event:n})=>({...t._internalState,inspectorResult:n.output})})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},AfterInspect:{always:[{target:"BuildContext",guard:"isAnSPLTransaction"},{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},BuildContext:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"buildContext",src:"buildContext",input:({context:t})=>{const n=t._internalState.inspectorResult?.data;return{contextModule:t.input.contextModule,options:{tokenAddress:n?.tokenAddress,createATA:n?.createATA}}},onDone:{target:"ProvideContext",actions:[e({_internalState:({event:t,context:n})=>({...n._internalState,solanaTransactionContext:{descriptor:t.output.descriptor,certificate:t.output.calCertificate,tokenAccount:t.output.addressResult.tokenAccount,owner:t.output.addressResult.owner,contract:t.output.addressResult.contract}})})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContext:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"provideContext",src:"provideContext",input:({context:t})=>{if(!t._internalState.solanaTransactionContext)throw new s("Solana transaction context is not available");return t._internalState.solanaTransactionContext},onDone:{target:"ProvideContextResultCheck"},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContextResultCheck:{always:[{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},SignTransaction:{entry:e({intermediateValue:{requiredUserInteraction:a.SignTransaction}}),exit:e({intermediateValue:{requiredUserInteraction:a.None}}),invoke:{id:"signTransaction",src:"signTransaction",input:({context:t})=>({derivationPath:t.input.derivationPath,serializedTransaction:t.input.transaction}),onDone:{target:"SignTransactionResultCheck",actions:[e({_internalState:({event:t,context:n})=>{if(!g(t.output))return{...n._internalState,error:t.output.error};const o=t.output.data.extract();return t.output.data.isJust()&&o instanceof Uint8Array?{...n._internalState,signature:o}:{...n._internalState,error:new s("No Signature available")}}})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignTransactionResultCheck:{always:[{guard:"noInternalError",target:"Success"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.signature?C(t._internalState.signature):m(t._internalState.error||new s("No error or signature available"))})}extractDependencies(r){return{getAppConfig:async()=>r.sendCommand(new D),buildContext:async t=>new I(r,t.input).run(),provideContext:async t=>new h(r,t.input).run(),signTransaction:async t=>new k(r,{commandFactory:n=>new E({serializedTransaction:n.chunkedData,more:n.more,extend:n.extend}),derivationPath:t.input.derivationPath,sendingData:t.input.serializedTransaction}).run(),inspectTransaction:async t=>new v(t.serializedTransaction).inspectTransactionType()}}}export{F as SignTransactionDeviceAction};
2
2
  //# sourceMappingURL=SignTransactionDeviceAction.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.ts"],
4
- "sourcesContent": ["import {\n type CommandResult,\n type DeviceActionStateMachine,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const { signTransaction } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) => context.input.skipOpenApp,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: it should never happen, the error is not typed anymore here\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoB5ABzA2Y8etBk1bkqAYghUwHVBjoUA1nIp8BQ5KTykwAWRIALBWADaABgC6iUDwqxUEjLZAAPRABYAzAHYOAJwAHABMFgCMnhYWUSFBvgA0IACeiEEAbOkcAKxBQQGeASG+3tmeISEAvpVJaJi4BERsVCKMLM2cAMJGYMTKvPyCwvRt4uwASnAArgA2pJKWNkgg9o7Orh4IAQEWHN7RvgGH2dne4UHhSakI+Vnpvtkh4eme2Udh3tW16Nj4hCTOVpiDocbq9foaIZA9rOSawWbzMzhJZ2BxOdgbRDbXb7CyHY6nc6XFJpcIcc6+OLebzxCoBbLhL4gOq-RoA9jQsZUDgAcTApG6eBmM34MGksnkihUchgAqMQpFGBgi1cq3RVExCEi+Q4nnO6RC3ji232QSuiBKZPCEQyZwsmSCNKZLIa-w6nJBfLlCtFYEkYBwOAoOA4PBmugAZsGALYcWWC4W+lXLNXrZabbUBXX6w3GgKm803eLk7ZBTwZF6Uz41Zk-V1NQEjYHODgAISmqBmEE6VD0bnmMgwcgUSlUHAARh2uz2MH3SMnUWsMenEOFtv5HhYghEdt5PPvC7ks2v89EAvdwuFDc6638GxymzD2G2p93e2B+-7A8HQ+HSFGcFjSdOzfWcP3naxVTRNNQAzdccjCbc1wsPcDxJBBfFeDgQneDJHgZAib3qO92RaR8uU4AAFIMGAgMAZzncUh0lUc5B4GjUDohjwIXFZoOXWDEBCU4sl8DJwl8Xxogsc8YkLTwxI4TDlMwjJfHSCwqhrF0SPdciQWoihaPo99PwDIMQzDSMY1DDiuNMiCUT4pcNRXBBhO8UTxMk6TZM8QsNO8PYCkpHwghOIIiNZN1G1EJ9uUM4zuP7OEETBPoFkglN+NcwSEFxHEtziB49wCYlrj3XZhM8e5HQiCJCii+tSJofSW0SziTLAlLpjmdLlAWZEoJclw3IKvYiviU5CnKxBsi3DhHT8fd7hwmk9ya3TYtGEEdLZDomOHKUx0cYj9ucXjUwE9xEFKHDyRCfcHhCF411m9zIiU88jXyQ4-CvTbzofOKKI4PaYvYL8LN-azAI4U7ovvKhLpy0a8ru49HoUx5XrKwtqSzfdSgeeILjKmJAYhsiQd228gaoVK+p6DKUZGzVvHghrNKNEoHn89CT2zHYyjOalPIB7S6ap1qaZbcGkYwRm5XBQanKu3KbvyznIm54o-DKQsscW0I3nSZ4TkKalqhrDAKDo+BlnllqPRg5z1TRzWAFp0kLb2OGkgPA4OSmFZd58Bk0YZZeu9WPc2cpCzLEJdRkix5oI-cQ+dtrn36iOoRzhnetIYb3c1dIy11alHWyTIzfSbJEnQvIgmw14t1KwpMOrb4zulsPuS9BNFRgUvXYzc4goZTzgntE980T3wySNPEJPCfZyg5rO9Oj7l2xA5KS+ytm3OeI5FoqGrMiiEofELSlCaJMpsXCx7t+25tnw6+zuqPxcy7chUNOgRHovHwuUbGh5iwETeHEBkcR7Tv2BjtdqdkupziVv1Me11NjFCwshTSKEGTqX5tceauwojiwkluNcb9JZ91DoXTgTsOjYI1psM4+YEKXniK9N4704itx2CUUI4UGTBC0r3RG2dd7MKlgrTBzNlBsLjrdXmCFHT6kiNsV4htPK6keDVFeW4UKZ3odIneKDnzICmMQJgsAHb-3Hl4J4VUXpFGrjEUohY1xZHCLXE4-j8zkIUkg6mVjuQAFFvw4BUZqco1psLuMNDSLx2RDzAMblePU9I7QvWrNUIAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => {\n return {\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n },\n };\n },\n states: {\n InitialState: {\n always: [\n {\n target: \"SignTransaction\",\n guard: \"skipOpenApp\",\n },\n \"OpenAppDeviceAction\",\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"openAppStateMachine\",\n input: { appName: \"Solana\" },\n src: \"openAppStateMachine\",\n onSnapshot: {\n actions: assign({\n intermediateValue: (_) =>\n _.event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n actions: assign({\n _internalState: (_) => {\n return _.event.output.caseOf<SignTransactionDAInternalState>({\n Right: () => _.context._internalState,\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n });\n },\n }),\n target: \"CheckOpenAppDeviceActionResult\",\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n {\n target: \"SignTransaction\",\n guard: \"noInternalError\",\n },\n \"Error\",\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => ({\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n }),\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(\"No error or signature available\"),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => {\n return new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n };\n\n return {\n signTransaction,\n };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "SignTransactionCommand", "SignDataTask", "SignTransactionDeviceAction", "internalApi", "signTransaction", "context", "_", "input", "error", "event", "data", "arg0", "args"]
4
+ "sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n type TxInspectorResult,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({ input }: { input: SignTransactionDAInput }) =>\n inspectTransaction({ serializedTransaction: input.transaction }),\n ),\n buildContext: fromPromise(buildContext),\n provideContext: fromPromise(provideContext),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) => context.input.skipOpenApp,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EARgDsAZg4AOPdL37pAFj1WArACYANCACeuh4Y46dxgGzSBnZ6AQZ6dgC+ES5omLgERGxUtAxMrORU3Lz8QiJiUjrySCDKqhkYGtoI+kam5pY29s5uujrSxhzSAJw+AcZWplZ+BlEx6Nj4hCTlKYwsSZwA8opgGMyKirNpC+IQVGAcqBh0FADWBxQraxvComAAsiQAFkdgMkVKKmpUlYjhOhw7F0bAYrAN9HZrC53NV2lZAV1AnYrGEul0wpFoiBYhMEtN2Ft5uUOABhJ5gYinZardabehzdLsABKcAArgJSFI5BpSt8KsUqjoDDoHJ0ug5jAY6jowbZoa0ZYDpHYfA59A47H4BqNseN4lMFoTGZkyRSqVdaUaFizYOzOZJCjyvuVftVhaLuhKpWYZY15QhjADpH4HAMQ0FzOEujqcfrEjN6dtiQBxMCkWkkqgAM3Qu32h2OZwOMHTG0zGBzUHeTrK6gFukDeg4fj04Slwbavis-pFAw4en6wSGfmRXWMMb1k3jBMTRPYHFTpcU5cr4jAOBwFBwHEUAlEWa3AFsOCWM9n0NXiryXfXqo3m627O2-J3+j20RwHIjhiHPAOrIEE5xFO+LJLOxqcIuZ4VugNp2qalJch8JTOnWoBVA4njwv0OiOFYaohNIwY9p4HR+GiGrGNYAEOEEQG4gaCapHOmRQWW55QHBHIIacBTIdeaFaIgmG2CYVi4aGBEBMRLQIKCQY6F0QIigY0iKdGWKxiBhrgQsWSwCsZBxqBGB5hgBxHCc5wFgZFKkMZCyXp8tY-LeEr4f2yKmGOwyGF0JHkRwYQGORxj+C2fgtvRDlMQyek8LZRnaeUa4bluO57qQB44MeRyJfZyXsE5KEufy6HCf0orhAMeg+cF-myfYXSfjYtgiphiLIn40WFWBzEQRwzBZmIOAJYZ9rcleqGueVcmYUYtFdC2spSphPYih0QxLX4gbCqCdiYmMwF4jp-V6UNI1jXZfE1nyroGPNn4GEttggsYa2yUK0iilYSkorRaqqQYIyaZOJ2xUm84XeuV1kFIDj8dNZVCXNtFPS9K3vc0MLSRwXQhFqkZKYpOg9eDM5ncSABCrKoAIEDlmImicns5kFlZBwAEa0-TjNgMzxUCTNKNhDYn5jqpA6guJB3rWjNiOARX74-YZOMRTcXUzzDNUEznLrpu267vuR4cNzdM6xgeuC0j922E2X6SuYkpgrhdj+hYzUONY-QK8Y4o7Wr059Zr84AAqbgwEBgHzzNmRZhbWYokeoNHsekDbpWuvhYWAp4in9Pj4r2OtWr9p4yIE-0YXjqDx3qyHkOZBHFBRzHuv8-raVG5l2XHsnrep+3Vud5nd23jnHSOJ7he1aG7uyf40h48Dr3CgdAGHbq9fBzQunEi3bfp1xpA8Uht03rNCvYQO3T+IMIbrRYJhLUC3syvtQcmVaB8p2nHfMxPmfB0iMs4T2qiYW+PkH7Y10ERUUkUHBam9GqZEIMjoMV3j-ecWlyZUHjuzIsHBVA7xMmPS+KNHCSiCsCMEAQfRjhIgObwL4vwahJqwr+p1Q6ZFwQ3UyBt0rGyyqbEhmCyGTWcuPWaVCjDPTBEMcwalGGfRFMvf2cIBwqk1L4LhEMWKcD4bvIB5JELkMElUYIyJvDBEijYF8wweyqQ6OYAIkJhT6DClvIx39944LBvwkxZobpTTATIiBuECb2J0I4z6SCEEFzsO9NErZAxRCxBgCg0d4DFB8dwpuyMhbIyqAAWj8P6Epdg8ZohqbUmpX49EawKVkNQghbhiAvhYxA+EArwnIm0b6SC1JmG8QErBfjMjUmuHSSmgkin3QOs2bo5hHDbXEjoHswZl5fkUphAZ-gkGNMbgY0kpjzQ0g2NgqgJ9OnC0FERZerZES7X2Z4dawZOiPjaMYTUoUjl71maxNM0FKy3OKboSEP0RQ+HCFY-GsDqioI4DVAI3skn-FGaQ-JJy2LLg4kEykYLXTew1J0B6L5HCr1qgYJh2yLAqnaL4XCwN-lXM4LDAqeDCm2zckMKpMSVK-RbCFZUJEnzIuGe-GqIRSZ13Ediga0NRqEHGkS28qkdotQOWGQMxgSKIhMH0A6oIgieAcKyiZnAaYW3Tmq2a0sqnkWRJqAYalgx6E2QazxIq1IDCBhawFnBD5D1taE6RIs-rNlWU+HwQRIrlNUe0Zs1cJTKk1GYbqcqYpNJOcG-+I9AFsm4mcu1KMwRKRMFjcILZgw-NLkYIYpgQqBkhHoUMAaeGGLGSZUtVRfr2G8PjKiwIwiYQRe1JsT4-rPVwuib6Hbml5PKAS04vbECjkeb9SlkklINRhCKD8Wpfb+13WqTNGDs3HIGsgVkxAmCwByVIihlixzwlahiFUQo926FUthX0iJ8K-Xmguk5ABRbua6EBAn6Mi1sH7Y3foQIYJsQR1n42VEKRw6SIhAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n input: ({ context }) => ({\n ...context.input,\n serializedTransaction: context.input.transaction,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n }) =>\n new TransactionInspector(\n arg0.serializedTransaction,\n ).inspectTransactionType();\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "GetAppConfigurationCommand", "SignTransactionCommand", "ApplicationChecker", "SolanaTransactionTypes", "TransactionInspector", "BuildTransactionContextTask", "ProvideSolanaTransactionContextTask", "SignDataTask", "SignTransactionDeviceAction", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "input", "context", "_", "event", "error", "inspectorData", "data", "arg0", "args"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{CommandResultFactory as p,DeviceActionStatus as n,InvalidStatusWordError as g,UnknownDAError as v,UserInteractionRequired as i}from"@ledgerhq/device-management-kit";import{Just as A,Nothing as x}from"purify-ts";import{makeDeviceActionInternalApiMock as d}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupOpenAppDAMock as l}from"../../app-binder/device-action/__test-utils__/setupOpenAppDAMock";import{testDeviceActionStates as m}from"../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{SignTransactionDeviceAction as u}from"./SignTransactionDeviceAction";vi.mock("@ledgerhq/device-management-kit",async o=>({...await o(),OpenAppDeviceAction:vi.fn(()=>({makeStateMachine:vi.fn()}))}));describe("SignTransactionDeviceAction",()=>{const o=vi.fn();function c(){return{signTransaction:o}}let s;beforeEach(()=>{vi.clearAllMocks(),s=new Uint8Array([1,2,3])}),describe("Happy path",()=>{it("should call external dependencies with the correct parameters",()=>new Promise((r,t)=>{l();const e=new u({input:{derivationPath:"44'/501'/0'/0'",transaction:s,skipOpenApp:!1}});o.mockResolvedValueOnce(p({data:A(new Uint8Array([5,6,7]))})),vi.spyOn(e,"extractDependencies").mockReturnValue(c());const a=[{intermediateValue:{requiredUserInteraction:i.None},status:n.Pending},{intermediateValue:{requiredUserInteraction:i.ConfirmOpenApp},status:n.Pending},{intermediateValue:{requiredUserInteraction:i.SignTransaction},status:n.Pending},{output:new Uint8Array([5,6,7]),status:n.Completed}];m(e,a,d(),{onError:t,onDone:()=>{expect(o).toHaveBeenCalledWith(expect.objectContaining({input:{derivationPath:"44'/501'/0'/0'",serializedTransaction:new Uint8Array([1,2,3])}})),r()}})})),it("should be successful while skipping OpenApp",()=>new Promise((r,t)=>{l();const e=new u({input:{derivationPath:"44'/501'/0'/0'",transaction:s,skipOpenApp:!0}});o.mockResolvedValueOnce(p({data:A(new Uint8Array([5,6,7]))})),vi.spyOn(e,"extractDependencies").mockReturnValue(c());const a=[{intermediateValue:{requiredUserInteraction:i.SignTransaction},status:n.Pending},{output:new Uint8Array([5,6,7]),status:n.Completed}];m(e,a,d(),{onError:t,onDone:r})}))}),describe("OpenApp errors",()=>{it("should fail if OpenApp throw an error",()=>new Promise((r,t)=>{l(new v("OpenApp error"));const e=new u({input:{derivationPath:"44'/501'/0'/0'",transaction:s,skipOpenApp:!1}});vi.spyOn(e,"extractDependencies").mockReturnValue(c());const a=[{intermediateValue:{requiredUserInteraction:i.None},status:n.Pending},{intermediateValue:{requiredUserInteraction:i.ConfirmOpenApp},status:n.Pending},{error:new v("OpenApp error"),status:n.Error}];m(e,a,d(),{onDone:r,onError:t})}))}),describe("SignTransaction errors",()=>{it("should fail if signTransaction returns an error",()=>new Promise((r,t)=>{l();const e=new u({input:{derivationPath:"44'/501'/0'/0'",transaction:s,skipOpenApp:!1}});o.mockResolvedValueOnce(p({error:new g("signTransaction error")})),vi.spyOn(e,"extractDependencies").mockReturnValue(c());const a=[{intermediateValue:{requiredUserInteraction:i.None},status:n.Pending},{intermediateValue:{requiredUserInteraction:i.ConfirmOpenApp},status:n.Pending},{intermediateValue:{requiredUserInteraction:i.SignTransaction},status:n.Pending},{error:new g("signTransaction error"),status:n.Error}];m(e,a,d(),{onDone:r,onError:t})})),it("should fail if signTransaction returns nothing",()=>new Promise((r,t)=>{l();const e=new u({input:{derivationPath:"44'/501'/0'/0'",transaction:s,skipOpenApp:!1}});o.mockResolvedValueOnce(p({data:x})),vi.spyOn(e,"extractDependencies").mockReturnValue(c());const a=[{intermediateValue:{requiredUserInteraction:i.None},status:n.Pending},{intermediateValue:{requiredUserInteraction:i.ConfirmOpenApp},status:n.Pending},{intermediateValue:{requiredUserInteraction:i.SignTransaction},status:n.Pending},{error:new v("No Signature available"),status:n.Error}];m(e,a,d(),{onDone:r,onError:t})}))}),describe("extractDependencies",()=>{it("should extract dependencies",async()=>{const r=new u({input:{derivationPath:"44'/501'/0'/0'",transaction:s,skipOpenApp:!1}}),t=d();vi.spyOn(t,"sendCommand").mockResolvedValue(p({data:A(new Uint8Array([5,6,7]))}));const e=r.extractDependencies(t),a=await e.signTransaction({input:{derivationPath:"44'/501'/0'/0'",serializedTransaction:s}});expect(e.signTransaction).toBeInstanceOf(Function),expect(a).toEqual(p({data:A(new Uint8Array([5,6,7]))})),expect(t.sendCommand).toHaveBeenCalledTimes(1)})})});
1
+ import{CommandResultFactory as o,DeviceActionStatus as e,DeviceModelId as g,DeviceSessionStateType as v,DeviceStatus as y,InvalidStatusWordError as C,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{Just as T,Nothing as N}from"purify-ts";import{beforeEach as P,describe as w,it as D,vi as n}from"vitest";import{testDeviceActionStates as f}from"../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{SolanaTransactionTypes as m}from"../../app-binder/services/TransactionInspector";import{makeDeviceActionInternalApiMock as E}from"./__test-utils__/makeInternalApi";import{SignTransactionDeviceAction as k}from"./SignTransactionDeviceAction";const V="44'/501'/0'/0'",x=new Uint8Array([222,173,190,239]),I={getSolanaContext:n.fn(),getContext:n.fn(),getContexts:n.fn(),getTypedDataFilters:n.fn(),getWeb3Checks:n.fn()};let r,u,d,A,S,l;function R(){return{getAppConfig:u,buildContext:d,provideContext:A,signTransaction:S,inspectTransaction:l}}w("SignTransactionDeviceAction (Solana)",()=>{P(()=>{r=E(),u=n.fn(),d=n.fn(),A=n.fn(),S=n.fn(),l=n.fn().mockResolvedValue({transactionType:m.SPL,data:{tokenAddress:null,createATA:!1}})}),D("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL});const a={descriptor:new Uint8Array([1]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}};d.mockResolvedValue(a),A.mockResolvedValue(N);const i=new Uint8Array([170,187]);S.mockResolvedValue(o({data:T(i)}));const p=new k({input:{derivationPath:V,transaction:x,skipOpenApp:!0,options:{},contextModule:I}});n.spyOn(p,"extractDependencies").mockReturnValue(R());const U=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{output:i,status:e.Completed}];f(p,U,r,{onDone:s,onError:c})})),D("failure in provideContext still signs",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL}),d.mockResolvedValue({descriptor:new Uint8Array([2]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}}),A.mockResolvedValue(T(o({error:new C("ctxErr")})));const a=new Uint8Array([254]);S.mockResolvedValue(o({data:T(a)}));const i=new k({input:{derivationPath:V,transaction:x,skipOpenApp:!0,options:{},contextModule:I}});n.spyOn(i,"extractDependencies").mockReturnValue(R());const p=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{output:a,status:e.Completed}];f(i,p,r,{onDone:s,onError:c})})),D("buildContext throws \u2192 error",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL}),d.mockRejectedValue(new C("bldErr"));const a=new k({input:{derivationPath:V,transaction:x,skipOpenApp:!0,options:{},contextModule:I}});n.spyOn(a,"extractDependencies").mockReturnValue(R());const i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:expect.anything(),status:e.Error}];f(a,i,r,{onDone:s,onError:c})}))});
2
2
  //# sourceMappingURL=SignTransactionDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.test.ts"],
4
- "sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: off */\nimport {\n CommandResultFactory,\n DeviceActionStatus,\n InvalidStatusWordError,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\n\nimport { type SignTransactionDAState } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\n\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\ndescribe(\"SignTransactionDeviceAction\", () => {\n const signTransactionMock = vi.fn();\n function extractDependenciesMock() {\n return {\n signTransaction: signTransactionMock,\n };\n }\n let defaultTransaction: Transaction;\n\n beforeEach(() => {\n vi.clearAllMocks();\n defaultTransaction = new Uint8Array([0x01, 0x02, 0x03]);\n });\n\n describe(\"Happy path\", () => {\n it(\"should call external dependencies with the correct parameters\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n transaction: defaultTransaction,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: Just(new Uint8Array([0x05, 0x06, 0x07])),\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetChallenge -> BuildContext -> ProvideContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: new Uint8Array([0x05, 0x06, 0x07]),\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n },\n }),\n );\n resolve();\n },\n },\n );\n }));\n\n it(\"should be successful while skipping OpenApp\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n transaction: defaultTransaction,\n skipOpenApp: true,\n },\n });\n\n // Mock the dependencies to return some sample data\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: Just(new Uint8Array([0x05, 0x06, 0x07])),\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n const expectedStates: Array<SignTransactionDAState> = [\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: new Uint8Array([0x05, 0x06, 0x07]),\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: resolve,\n },\n );\n }));\n });\n\n describe(\"OpenApp errors\", () => {\n it(\"should fail if OpenApp throw an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock(new UnknownDAError(\"OpenApp error\"));\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n transaction: defaultTransaction,\n skipOpenApp: false,\n },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp error\n {\n error: new UnknownDAError(\"OpenApp error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n describe(\"SignTransaction errors\", () => {\n it(\"should fail if signTransaction returns an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n transaction: defaultTransaction,\n skipOpenApp: false,\n },\n });\n\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"signTransaction error\"),\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction error\n {\n error: new InvalidStatusWordError(\"signTransaction error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should fail if signTransaction returns nothing\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n transaction: defaultTransaction,\n skipOpenApp: false,\n },\n });\n\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: Nothing,\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction error\n {\n error: new UnknownDAError(\"No Signature available\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n describe(\"extractDependencies\", () => {\n it(\"should extract dependencies\", async () => {\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n transaction: defaultTransaction,\n skipOpenApp: false,\n },\n });\n // mock sendCommand to return a successful result\n const api = makeDeviceActionInternalApiMock();\n vi.spyOn(api, \"sendCommand\").mockResolvedValue(\n CommandResultFactory({\n data: Just(new Uint8Array([0x05, 0x06, 0x07])),\n }),\n );\n\n const dependencies = deviceAction.extractDependencies(api);\n const signature = await dependencies.signTransaction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n serializedTransaction: defaultTransaction,\n },\n });\n\n expect(dependencies.signTransaction).toBeInstanceOf(Function);\n expect(signature).toEqual(\n CommandResultFactory({\n data: Just(new Uint8Array([0x05, 0x06, 0x07])),\n }),\n );\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["CommandResultFactory", "DeviceActionStatus", "InvalidStatusWordError", "UnknownDAError", "UserInteractionRequired", "Just", "Nothing", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "testDeviceActionStates", "SignTransactionDeviceAction", "importOriginal", "signTransactionMock", "extractDependenciesMock", "defaultTransaction", "resolve", "reject", "deviceAction", "expectedStates", "api", "dependencies", "signature"]
4
+ "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n};\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n descriptor: new Uint8Array([1]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array([0x01]) },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true, // always skip open\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array() },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "InvalidStatusWordError", "UserInteractionRequired", "Just", "Nothing", "beforeEach", "describe", "it", "vi", "testDeviceActionStates", "SolanaTransactionTypes", "makeDeviceActionInternalApiMock", "SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "contextModuleStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "action", "expected", "sig"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{DeviceSessionStateType as t}from"@ledgerhq/device-management-kit";import{gt as s,gte as o}from"semver";class l{isCompatible=!0;version="0.0.1";modelId;constructor(e,i){if(this.modelId=e.deviceModelId,e.sessionStateType===t.Connected){this.isCompatible=!1;return}if(e.currentApp.name!=="Solana"){this.isCompatible=!1;return}e.currentApp.name==="Solana"?this.version=e.currentApp.version:this.version=i.version}withMinVersionInclusive(e){return o(this.version,e)||(this.isCompatible=!1),this}withMinVersionExclusive(e){return s(this.version,e)||(this.isCompatible=!1),this}excludeDeviceModel(e){return this.modelId===e&&(this.isCompatible=!1),this}check(){return this.isCompatible}}export{l as ApplicationChecker};
2
+ //# sourceMappingURL=ApplicationChecker.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/ApplicationChecker.ts"],
4
+ "sourcesContent": ["import {\n type DeviceModelId,\n type DeviceSessionState,\n DeviceSessionStateType,\n} from \"@ledgerhq/device-management-kit\";\nimport { gt, gte } from \"semver\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\n\nexport class ApplicationChecker {\n private isCompatible: boolean = true;\n private version: string = \"0.0.1\";\n private modelId: DeviceModelId;\n\n constructor(deviceState: DeviceSessionState, appConfig: AppConfiguration) {\n this.modelId = deviceState.deviceModelId;\n\n // If device is not ready or app is unexpected, checker cannot be successful\n if (deviceState.sessionStateType === DeviceSessionStateType.Connected) {\n this.isCompatible = false;\n return;\n }\n if (deviceState.currentApp.name !== \"Solana\") {\n this.isCompatible = false;\n return;\n }\n if (deviceState.currentApp.name === \"Solana\") {\n this.version = deviceState.currentApp.version;\n } else {\n // Fallback on appConfig version if a plugin is running.\n // It won't contain release candidate suffix but it should be enough for that edge case.\n this.version = appConfig.version;\n }\n }\n\n withMinVersionInclusive(version: string): ApplicationChecker {\n if (!gte(this.version, version)) {\n this.isCompatible = false;\n }\n return this;\n }\n\n withMinVersionExclusive(version: string): ApplicationChecker {\n if (!gt(this.version, version)) {\n this.isCompatible = false;\n }\n return this;\n }\n\n excludeDeviceModel(modelId: DeviceModelId): ApplicationChecker {\n if (this.modelId === modelId) {\n this.isCompatible = false;\n }\n return this;\n }\n\n check(): boolean {\n return this.isCompatible;\n }\n}\n"],
5
+ "mappings": "AAAA,OAGE,0BAAAA,MACK,kCACP,OAAS,MAAAC,EAAI,OAAAC,MAAW,SAIjB,MAAMC,CAAmB,CACtB,aAAwB,GACxB,QAAkB,QAClB,QAER,YAAYC,EAAiCC,EAA6B,CAIxE,GAHA,KAAK,QAAUD,EAAY,cAGvBA,EAAY,mBAAqBJ,EAAuB,UAAW,CACrE,KAAK,aAAe,GACpB,MACF,CACA,GAAII,EAAY,WAAW,OAAS,SAAU,CAC5C,KAAK,aAAe,GACpB,MACF,CACIA,EAAY,WAAW,OAAS,SAClC,KAAK,QAAUA,EAAY,WAAW,QAItC,KAAK,QAAUC,EAAU,OAE7B,CAEA,wBAAwBC,EAAqC,CAC3D,OAAKJ,EAAI,KAAK,QAASI,CAAO,IAC5B,KAAK,aAAe,IAEf,IACT,CAEA,wBAAwBA,EAAqC,CAC3D,OAAKL,EAAG,KAAK,QAASK,CAAO,IAC3B,KAAK,aAAe,IAEf,IACT,CAEA,mBAAmBC,EAA4C,CAC7D,OAAI,KAAK,UAAYA,IACnB,KAAK,aAAe,IAEf,IACT,CAEA,OAAiB,CACf,OAAO,KAAK,YACd,CACF",
6
+ "names": ["DeviceSessionStateType", "gt", "gte", "ApplicationChecker", "deviceState", "appConfig", "version", "modelId"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{DeviceModelId as s,DeviceSessionStateType as o,DeviceStatus as i}from"@ledgerhq/device-management-kit";import{describe as r,expect as c,it as l}from"vitest";import{PublicKeyDisplayMode as u}from"../../../api/model/PublicKeyDisplayMode";import{ApplicationChecker as a}from"./ApplicationChecker";function d(e){return{version:e,blindSigningEnabled:!1,pubKeyDisplayMode:u.SHORT}}r("ApplicationChecker (Solana)",()=>{l("should pass check when on Solana app and in valid state",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).check();c(t).toBe(!0)}),l("should reject if session state is Connected",()=>{const e={sessionStateType:o.Connected,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).check();c(t).toBe(!1)}),l("should reject if not Solana app",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.0.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.0.0"),t=new a(e,n).check();c(t).toBe(!1)}),l("should pass with min version inclusive",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).withMinVersionInclusive("1.3.0").check();c(t).toBe(!0)}),l("should reject with min version inclusive if version too low",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.3.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.3.0"),t=new a(e,n).withMinVersionInclusive("1.4.0").check();c(t).toBe(!1)}),l("should pass with min version exclusive",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).withMinVersionExclusive("1.3.0").check();c(t).toBe(!0)}),l("should reject with min version exclusive if equal",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).withMinVersionExclusive("1.4.0").check();c(t).toBe(!1)}),l("should reject excluded device model",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.NANO_S,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).excludeDeviceModel(s.NANO_S).check();c(t).toBe(!1)}),l("should allow allowed device model",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).excludeDeviceModel(s.NANO_S).check();c(t).toBe(!0)})});
2
+ //# sourceMappingURL=ApplicationChecker.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/ApplicationChecker.test.ts"],
4
+ "sourcesContent": ["import {\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { PublicKeyDisplayMode } from \"@api/model/PublicKeyDisplayMode\";\n\nimport { ApplicationChecker } from \"./ApplicationChecker\";\n\nfunction createAppConfig(version: string): AppConfiguration {\n return {\n version,\n blindSigningEnabled: false,\n pubKeyDisplayMode: PublicKeyDisplayMode.SHORT,\n };\n}\n\ndescribe(\"ApplicationChecker (Solana)\", () => {\n it(\"should pass check when on Solana app and in valid state\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config).check();\n\n // then\n expect(result).toBe(true);\n });\n\n it(\"should reject if session state is Connected\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config).check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should reject if not Solana app\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.0.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.0.0\");\n // when\n const result = new ApplicationChecker(state, config).check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should pass with min version inclusive\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionInclusive(\"1.3.0\")\n .check();\n\n // then\n expect(result).toBe(true);\n });\n\n it(\"should reject with min version inclusive if version too low\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.3.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.3.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionInclusive(\"1.4.0\")\n .check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should pass with min version exclusive\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionExclusive(\"1.3.0\")\n .check();\n\n // then\n expect(result).toBe(true);\n });\n\n it(\"should reject with min version exclusive if equal\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionExclusive(\"1.4.0\")\n .check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should reject excluded device model\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.NANO_S,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should allow allowed device model\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check();\n\n // then\n expect(result).toBe(true);\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "describe", "expect", "it", "PublicKeyDisplayMode", "ApplicationChecker", "createAppConfig", "version", "state", "config", "result"]
7
+ }
@@ -0,0 +1,4 @@
1
+ import{decodeInstruction as m,getAssociatedTokenAddress as f,TOKEN_PROGRAM_ID as T}from"@solana/spl-token";import{PublicKey as u,Transaction as A,TransactionInstruction as I,VersionedMessage as g,VersionedTransaction as h}from"@solana/web3.js";import{Buffer as k}from"buffer";var S=(n=>(n.STANDARD="Standard",n.SPL="SPL",n))(S||{});class D{constructor(t){this.rawTransactionBytes=t}async inspectTransactionType(){try{const t=this.extractMessage(this.rawTransactionBytes),n=t.compiledInstructions.filter(e=>t.staticAccountKeys[e.programIdIndex]?.equals(T)).map(e=>({programIdIndex:e.programIdIndex,accountIndexes:e.accountKeyIndexes,data:e.data instanceof Uint8Array?e.data:new Uint8Array(e.data)}));if(n.length===0)return{transactionType:"Standard",data:{}};for(const{programIdIndex:e,accountIndexes:o,data:i}of n){const a=new I({programId:t.staticAccountKeys[e],keys:o.map(s=>({pubkey:t.staticAccountKeys[s],isSigner:t.isAccountSigner(s),isWritable:t.isAccountWritable(s)})),data:k.from(i)}),r=m(a);if(r instanceof Error)continue;const c=r.data;if("amount"in c&&!("mint"in c)){const s=a.keys[2]?.pubkey;if(!s)throw new Error("Transfer instruction does not have a destination key");return{transactionType:"SPL",data:{tokenAddress:s.toBase58()}}}if(this.isTransferCheckedData(c)){const{mint:s,authority:p,source:y,destination:l}=c,d=await f(s,p);return y.equals(d)||l.equals(d)?{transactionType:"SPL",data:{tokenAddress:d.toBase58()}}:{transactionType:"SPL",data:{createATA:{address:d.toBase58(),mintAddress:s.toBase58()}}}}}throw new Error("Found SPL-token instructions, but none decoded as Transfer or TransferChecked")}catch{return{transactionType:"Standard",data:{}}}}isTransferCheckedData(t){if(t===null||typeof t!="object")return!1;const n=t;return"mint"in n&&n.mint instanceof u&&"authority"in n&&n.authority instanceof u&&"source"in n&&n.source instanceof u&&"destination"in n&&n.destination instanceof u}extractMessage(t){const n=[];try{return h.deserialize(t).message}catch(e){n.push(e instanceof Error?e.message:String(e))}try{return g.deserialize(t)}catch(e){n.push(e instanceof Error?e.message:String(e))}try{const e=A.from(t),o=e.instructions.flatMap(a=>a.keys.map(r=>r.pubkey)),i=[...new Set([e.feePayer,...o])].filter(Boolean);return{compiledInstructions:e.instructions.map(a=>({programIdIndex:i.findIndex(r=>r.equals(a.programId)),accountKeyIndexes:a.keys.map(r=>i.findIndex(c=>c.equals(r.pubkey))),data:a.data})),staticAccountKeys:i,isAccountSigner:a=>e.signatures.some(r=>r.publicKey.equals(i[a])),isAccountWritable:a=>!0}}catch(e){n.push(e instanceof Error?e.message:String(e))}throw new Error(`Invalid transaction payload \u2013 all deserializers failed:
2
+ `+n.map((e,o)=>`${o+1}) ${e}`).join(`
3
+ `))}}export{S as SolanaTransactionTypes,D as TransactionInspector};
4
+ //# sourceMappingURL=TransactionInspector.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.ts"],
4
+ "sourcesContent": ["import {\n decodeInstruction,\n getAssociatedTokenAddress,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport interface TxInspectorResult {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n createATA?: {\n address: string;\n mintAddress: string;\n };\n };\n}\n\ninterface ParsedSplInstruction {\n programIdIndex: number;\n accountIndexes: number[];\n data: Uint8Array;\n}\n\ntype TransferCheckedData = {\n mint: PublicKey;\n authority: PublicKey;\n source: PublicKey;\n destination: PublicKey;\n};\n\nexport class TransactionInspector {\n constructor(private readonly rawTransactionBytes: Uint8Array) {}\n\n public async inspectTransactionType(): Promise<TxInspectorResult> {\n try {\n const message = this.extractMessage(this.rawTransactionBytes);\n\n const splInstructions: ParsedSplInstruction[] =\n message.compiledInstructions\n .filter((instruction) => {\n const programId =\n message.staticAccountKeys[instruction.programIdIndex];\n return programId?.equals(TOKEN_PROGRAM_ID);\n })\n .map((instruction) => ({\n programIdIndex: instruction.programIdIndex,\n accountIndexes: instruction.accountKeyIndexes,\n data:\n instruction.data instanceof Uint8Array\n ? instruction.data\n : new Uint8Array(instruction.data),\n }));\n\n if (splInstructions.length === 0) {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n\n for (const { programIdIndex, accountIndexes, data } of splInstructions) {\n const instruction = new TransactionInstruction({\n programId: message.staticAccountKeys[programIdIndex]!,\n keys: accountIndexes.map((index) => ({\n pubkey: message.staticAccountKeys[index]!,\n isSigner: message.isAccountSigner(index),\n isWritable: message.isAccountWritable(index),\n })),\n data: Buffer.from(data),\n });\n\n const decodedInstruction = decodeInstruction(instruction);\n if (decodedInstruction instanceof Error) continue;\n\n const decodedData = decodedInstruction.data;\n\n // transfer without mint info (likely a direct SPL transfer)\n if (\"amount\" in decodedData && !(\"mint\" in decodedData)) {\n const destinationAccount = instruction.keys[2]?.pubkey;\n if (!destinationAccount) {\n throw new Error(\n \"Transfer instruction does not have a destination key\",\n );\n }\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: destinationAccount.toBase58() },\n };\n }\n\n // transferChecked or CreateAssociatedTokenAccount\n if (this.isTransferCheckedData(decodedData)) {\n const { mint, authority, source, destination } = decodedData;\n\n const associatedTokenAccount = await getAssociatedTokenAddress(\n mint,\n authority,\n );\n const isATAUsed =\n source.equals(associatedTokenAccount) ||\n destination.equals(associatedTokenAccount);\n\n if (isATAUsed) {\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: associatedTokenAccount.toBase58() },\n };\n } else {\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n createATA: {\n address: associatedTokenAccount.toBase58(),\n mintAddress: mint.toBase58(),\n },\n },\n };\n }\n }\n }\n\n throw new Error(\n \"Found SPL-token instructions, but none decoded as Transfer or TransferChecked\",\n );\n } catch (_e) {\n return {\n transactionType: SolanaTransactionTypes.STANDARD,\n data: {}, // Fallback to standard if any error occurs\n };\n }\n }\n\n private isTransferCheckedData(data: unknown): data is TransferCheckedData {\n if (data === null || typeof data !== \"object\") return false;\n const d = data as Record<string, unknown>;\n return (\n \"mint\" in d &&\n d[\"mint\"] instanceof PublicKey &&\n \"authority\" in d &&\n d[\"authority\"] instanceof PublicKey &&\n \"source\" in d &&\n d[\"source\"] instanceof PublicKey &&\n \"destination\" in d &&\n d[\"destination\"] instanceof PublicKey\n );\n }\n\n private extractMessage(rawBytes: Uint8Array): VersionedMessage {\n const errors: string[] = [];\n\n try {\n return VersionedTransaction.deserialize(rawBytes).message;\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err));\n }\n\n try {\n return VersionedMessage.deserialize(rawBytes);\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err));\n }\n\n try {\n const legacyTx = Transaction.from(rawBytes);\n const accountKeys = legacyTx.instructions.flatMap((ix) =>\n ix.keys.map((k) => k.pubkey),\n );\n const staticAccountKeys = [\n ...new Set([legacyTx.feePayer, ...accountKeys]),\n ].filter(Boolean) as PublicKey[];\n\n return {\n compiledInstructions: legacyTx.instructions.map((ix) => ({\n programIdIndex: staticAccountKeys.findIndex((k) =>\n k.equals(ix.programId),\n ),\n accountKeyIndexes: ix.keys.map((k) =>\n staticAccountKeys.findIndex((key) => key.equals(k.pubkey)),\n ),\n data: ix.data,\n })),\n staticAccountKeys,\n isAccountSigner: (i: number) =>\n legacyTx.signatures.some((sig) =>\n sig.publicKey.equals(staticAccountKeys[i]!),\n ),\n isAccountWritable: (_: number) => true,\n } as unknown as VersionedMessage;\n } catch (err) {\n errors.push(err instanceof Error ? err.message : String(err));\n }\n\n throw new Error(\n \"Invalid transaction payload \u2013 all deserializers failed:\\n\" +\n errors.map((msg, i) => `${i + 1}) ${msg}`).join(\"\\n\"),\n );\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["decodeInstruction", "getAssociatedTokenAddress", "TOKEN_PROGRAM_ID", "PublicKey", "Transaction", "TransactionInstruction", "VersionedMessage", "VersionedTransaction", "Buffer", "SolanaTransactionTypes", "TransactionInspector", "rawTransactionBytes", "message", "splInstructions", "instruction", "programIdIndex", "accountIndexes", "data", "index", "decodedInstruction", "decodedData", "destinationAccount", "mint", "authority", "source", "destination", "associatedTokenAccount", "d", "rawBytes", "errors", "err", "legacyTx", "accountKeys", "ix", "k", "staticAccountKeys", "key", "i", "sig", "_", "msg"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import*as w from"@solana/spl-token";import{Keypair as a,SystemProgram as g,Transaction as y,VersionedMessage as l,VersionedTransaction as m}from"@solana/web3.js";import{SolanaTransactionTypes as i,TransactionInspector as o}from"./TransactionInspector";function d(e){return{compiledInstructions:e.compiledInstructions.map(t=>({...t,data:t.data instanceof Uint8Array||typeof Buffer<"u"&&t.data instanceof Buffer?t.data:new Uint8Array(t.data)})),staticAccountKeys:e.staticAccountKeys,isAccountSigner:t=>!1,isAccountWritable:t=>!1}}vi.mock("@solana/spl-token",async()=>{const e=await vi.importActual("@solana/spl-token");return{...e,decodeInstruction:vi.fn(),getAssociatedTokenAddress:vi.fn(),TOKEN_PROGRAM_ID:e.TOKEN_PROGRAM_ID}});const{decodeInstruction:u,getAssociatedTokenAddress:f,TOKEN_PROGRAM_ID:p}=w;describe("TransactionInspector",()=>{beforeEach(()=>{vi.clearAllMocks()}),afterEach(()=>{vi.restoreAllMocks()}),it("returns STANDARD when no SPL instructions are found",async()=>{const e=new o(new Uint8Array);vi.spyOn(e,"extractMessage").mockReturnValue(d({compiledInstructions:[],staticAccountKeys:[]}));const t=await e.inspectTransactionType();expect(t).toEqual({transactionType:i.STANDARD,data:{}})}),it("ignores instructions not targeting TOKEN_PROGRAM_ID",async()=>{const e=a.generate().publicKey,t=d({compiledInstructions:[{programIdIndex:0,accountKeyIndexes:[1],data:new Uint8Array([1])}],staticAccountKeys:[e,a.generate().publicKey]}),n=new o(new Uint8Array);vi.spyOn(n,"extractMessage").mockReturnValue(t);const s=await n.inspectTransactionType();expect(s.transactionType).toBe(i.STANDARD)}),it("skips a first bad decodeInstruction and succeeds on the next",async()=>{const e=a.generate().publicKey,t=a.generate().publicKey,n=d({compiledInstructions:[{programIdIndex:0,accountKeyIndexes:[0,1,2],data:new Uint8Array([0])},{programIdIndex:0,accountKeyIndexes:[0,1,2],data:new Uint8Array([0])}],staticAccountKeys:[p,t,e]}),s=new o(new Uint8Array);vi.spyOn(s,"extractMessage").mockReturnValue(n),u.mockReturnValueOnce(new Error("bad")).mockReturnValueOnce({data:{amount:7}});const r=await s.inspectTransactionType();expect(r).toEqual({transactionType:i.SPL,data:{tokenAddress:e.toBase58()}})}),it("converts Buffer or number[] data into Uint8Array before decoding",async()=>{const e=a.generate().publicKey,t=a.generate().publicKey,n=d({compiledInstructions:[{programIdIndex:0,accountKeyIndexes:[0,1,2],data:Buffer.from([5,6,7])},{programIdIndex:0,accountKeyIndexes:[0,1,2],data:[8,9,10]}],staticAccountKeys:[p,t,e]}),s=new o(new Uint8Array);vi.spyOn(s,"extractMessage").mockReturnValue(n),u.mockReturnValueOnce(new Error("nope")).mockImplementation(c=>(expect(c.data).toBeInstanceOf(Uint8Array),{data:{amount:21}}));const r=await s.inspectTransactionType();expect(r.data).toEqual({tokenAddress:e.toBase58()})}),it("detects TransferChecked with existing ATA",async()=>{const e=a.generate().publicKey,t=a.generate().publicKey,n=a.generate().publicKey;f.mockResolvedValue(n);const s=d({compiledInstructions:[{programIdIndex:0,accountKeyIndexes:[1,2,3,4],data:new Uint8Array([3])}],staticAccountKeys:[p,t,n,n,e]}),r=new o(new Uint8Array);vi.spyOn(r,"extractMessage").mockReturnValue(s),u.mockReturnValue({data:{mint:e,authority:t,source:n,destination:n}});const c=await r.inspectTransactionType();expect(c).toEqual({transactionType:i.SPL,data:{tokenAddress:n.toBase58()}})}),it("detects TransferChecked without existing ATA \u21D2 createATA",async()=>{const e=a.generate().publicKey,t=a.generate().publicKey,n=a.generate().publicKey,s=a.generate().publicKey;f.mockResolvedValue(n);const r=d({compiledInstructions:[{programIdIndex:0,accountKeyIndexes:[1,2,3,4],data:new Uint8Array([3])}],staticAccountKeys:[p,t,s,s,e]}),c=new o(new Uint8Array);vi.spyOn(c,"extractMessage").mockReturnValue(r),u.mockReturnValue({data:{mint:e,authority:t,source:s,destination:s}});const A=await c.inspectTransactionType();expect(A).toEqual({transactionType:i.SPL,data:{createATA:{address:n.toBase58(),mintAddress:e.toBase58()}}})}),it("extractMessage: throws combined error if all three deserializers fail",()=>{vi.spyOn(m,"deserialize").mockImplementation(()=>{throw new Error("vtx fail")}),vi.spyOn(l,"deserialize").mockImplementation(()=>{throw new Error("vmd fail")}),vi.spyOn(y,"from").mockImplementation(()=>{throw new Error("tx fail")});const e=new o(new Uint8Array([1,2]));expect(()=>e.extractMessage(new Uint8Array([1,2]))).toThrow(/Invalid transaction payload[\s\S]*1\) vtx fail[\s\S]*2\) vmd fail[\s\S]*3\) tx fail/)}),it("returns STANDARD fallback when all deserialisers throw",async()=>{vi.spyOn(m,"deserialize").mockImplementation(()=>{throw new Error("vtx fail")}),vi.spyOn(l,"deserialize").mockImplementation(()=>{throw new Error("vmd fail")}),vi.spyOn(y,"from").mockImplementation(()=>{throw new Error("tx fail")});const t=await new o(new Uint8Array([222,173,190,239])).inspectTransactionType();expect(t).toEqual({transactionType:i.STANDARD,data:{}})})});describe("isTransferCheckedData",()=>{const e=new o(new Uint8Array);it("returns false for null or primitive values",()=>{expect(e.isTransferCheckedData(null)).toBe(!1),expect(e.isTransferCheckedData(42)).toBe(!1),expect(e.isTransferCheckedData("string")).toBe(!1)}),it("returns false for objects missing required keys or wrong types",()=>{const t=a.generate().publicKey;expect(e.isTransferCheckedData({mint:t,authority:t})).toBe(!1),expect(e.isTransferCheckedData({mint:"nope",authority:null,source:{},destination:[]})).toBe(!1)}),it("returns true for a properly shaped object",()=>{const t=a.generate().publicKey,n={mint:t,authority:t,source:t,destination:t};expect(e.isTransferCheckedData(n)).toBe(!0)})});describe("extractMessage legacy fallback",()=>{it("handles a legacy Transaction via serializeMessage and returns STANDARD",async()=>{vi.spyOn(m,"deserialize").mockImplementation(()=>{throw new Error("vtx fail")}),vi.spyOn(l,"deserialize").mockImplementation(()=>{throw new Error("vmd fail")});const e=a.generate(),t=a.generate(),n=new y().add(g.transfer({fromPubkey:e.publicKey,toPubkey:t.publicKey,lamports:1}));n.feePayer=e.publicKey,n.recentBlockhash="11111111111111111111111111111111",n.sign(e);const s=n.serialize(),r=await new o(s).inspectTransactionType();expect(r.transactionType).toBe("Standard"),expect(r.data).toEqual({})})});
2
+ //# sourceMappingURL=TransactionInspector.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport * as splToken from \"@solana/spl-token\";\nimport {\n Keypair,\n type PublicKey,\n SystemProgram,\n Transaction,\n type TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\n\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"./TransactionInspector\";\n\nfunction makeFakeMessage(opts: {\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array | number[] | Buffer;\n }>;\n staticAccountKeys: PublicKey[];\n}): VersionedMessage {\n return {\n compiledInstructions: opts.compiledInstructions.map((ix) => ({\n ...ix,\n data:\n ix.data instanceof Uint8Array\n ? ix.data\n : typeof Buffer !== \"undefined\" && ix.data instanceof Buffer\n ? ix.data\n : new Uint8Array(ix.data as number[]),\n })),\n staticAccountKeys: opts.staticAccountKeys,\n isAccountSigner: (_: number) => false,\n isAccountWritable: (_: number) => false,\n } as any;\n}\n\nvi.mock(\"@solana/spl-token\", async () => {\n const actual = await vi.importActual<any>(\"@solana/spl-token\");\n return {\n ...actual,\n decodeInstruction: vi.fn(),\n getAssociatedTokenAddress: vi.fn(),\n TOKEN_PROGRAM_ID: actual.TOKEN_PROGRAM_ID,\n };\n});\nconst { decodeInstruction, getAssociatedTokenAddress, TOKEN_PROGRAM_ID } =\n splToken as any;\n\ndescribe(\"TransactionInspector\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"returns STANDARD when no SPL instructions are found\", async () => {\n // given\n const inspector = new TransactionInspector(new Uint8Array());\n vi.spyOn(inspector as any, \"extractMessage\").mockReturnValue(\n makeFakeMessage({ compiledInstructions: [], staticAccountKeys: [] }),\n );\n\n // when\n const res = await inspector.inspectTransactionType();\n\n // then\n expect(res).toEqual({\n transactionType: SolanaTransactionTypes.STANDARD,\n data: {},\n });\n });\n\n it(\"ignores instructions not targeting TOKEN_PROGRAM_ID\", async () => {\n // given\n const fakePk = Keypair.generate().publicKey;\n const msg = makeFakeMessage({\n compiledInstructions: [\n {\n programIdIndex: 0,\n accountKeyIndexes: [1],\n data: new Uint8Array([1]),\n },\n ],\n staticAccountKeys: [fakePk, Keypair.generate().publicKey],\n });\n const inspector = new TransactionInspector(new Uint8Array());\n vi.spyOn(inspector as any, \"extractMessage\").mockReturnValue(msg);\n\n // when\n const res = await inspector.inspectTransactionType();\n\n // then\n expect(res.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n });\n\n it(\"skips a first bad decodeInstruction and succeeds on the next\", async () => {\n // given\n const dest = Keypair.generate().publicKey;\n const other = Keypair.generate().publicKey;\n\n const msg = makeFakeMessage({\n compiledInstructions: [\n {\n programIdIndex: 0,\n accountKeyIndexes: [0, 1, 2],\n data: new Uint8Array([0]),\n },\n {\n programIdIndex: 0,\n accountKeyIndexes: [0, 1, 2],\n data: new Uint8Array([0]),\n },\n ],\n staticAccountKeys: [TOKEN_PROGRAM_ID, other, dest],\n });\n const inspector = new TransactionInspector(new Uint8Array());\n vi.spyOn(inspector as any, \"extractMessage\").mockReturnValue(msg);\n\n decodeInstruction\n .mockReturnValueOnce(new Error(\"bad\"))\n .mockReturnValueOnce({ data: { amount: 7 } });\n\n // when\n const res = await inspector.inspectTransactionType();\n\n // then\n expect(res).toEqual({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: dest.toBase58() },\n });\n });\n\n it(\"converts Buffer or number[] data into Uint8Array before decoding\", async () => {\n // given\n const dest = Keypair.generate().publicKey;\n const other = Keypair.generate().publicKey;\n const msg = makeFakeMessage({\n compiledInstructions: [\n {\n programIdIndex: 0,\n accountKeyIndexes: [0, 1, 2],\n data: Buffer.from([5, 6, 7]),\n },\n { programIdIndex: 0, accountKeyIndexes: [0, 1, 2], data: [8, 9, 10] },\n ],\n staticAccountKeys: [TOKEN_PROGRAM_ID, other, dest],\n });\n const inspector = new TransactionInspector(new Uint8Array());\n vi.spyOn(inspector as any, \"extractMessage\").mockReturnValue(msg);\n\n decodeInstruction\n .mockReturnValueOnce(new Error(\"nope\"))\n .mockImplementation((ix: TransactionInstruction) => {\n expect(ix.data).toBeInstanceOf(Uint8Array);\n return { data: { amount: 21 } };\n });\n\n // when\n const res = await inspector.inspectTransactionType();\n\n // then\n expect(res.data).toEqual({ tokenAddress: dest.toBase58() });\n });\n\n it(\"detects TransferChecked with existing ATA\", async () => {\n // given\n const mint = Keypair.generate().publicKey;\n const auth = Keypair.generate().publicKey;\n const ata = Keypair.generate().publicKey;\n getAssociatedTokenAddress.mockResolvedValue(ata);\n\n const msg = makeFakeMessage({\n compiledInstructions: [\n {\n programIdIndex: 0,\n accountKeyIndexes: [1, 2, 3, 4],\n data: new Uint8Array([3]),\n },\n ],\n staticAccountKeys: [TOKEN_PROGRAM_ID, auth, ata, ata, mint],\n });\n const inspector = new TransactionInspector(new Uint8Array());\n vi.spyOn(inspector as any, \"extractMessage\").mockReturnValue(msg);\n\n decodeInstruction.mockReturnValue({\n data: { mint, authority: auth, source: ata, destination: ata },\n });\n\n // when\n const res = await inspector.inspectTransactionType();\n\n // then\n expect(res).toEqual({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: ata.toBase58() },\n });\n });\n\n it(\"detects TransferChecked without existing ATA \u21D2 createATA\", async () => {\n // given\n const mint = Keypair.generate().publicKey;\n const auth = Keypair.generate().publicKey;\n const ata = Keypair.generate().publicKey;\n const other = Keypair.generate().publicKey;\n getAssociatedTokenAddress.mockResolvedValue(ata);\n\n const msg = makeFakeMessage({\n compiledInstructions: [\n {\n programIdIndex: 0,\n accountKeyIndexes: [1, 2, 3, 4],\n data: new Uint8Array([3]),\n },\n ],\n staticAccountKeys: [TOKEN_PROGRAM_ID, auth, other, other, mint],\n });\n const inspector = new TransactionInspector(new Uint8Array());\n vi.spyOn(inspector as any, \"extractMessage\").mockReturnValue(msg);\n\n decodeInstruction.mockReturnValue({\n data: { mint, authority: auth, source: other, destination: other },\n });\n\n // when\n const res = await inspector.inspectTransactionType();\n\n // then\n expect(res).toEqual({\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n createATA: {\n address: ata.toBase58(),\n mintAddress: mint.toBase58(),\n },\n },\n });\n });\n\n it(\"extractMessage: throws combined error if all three deserializers fail\", () => {\n // given\n vi.spyOn(VersionedTransaction, \"deserialize\").mockImplementation(() => {\n throw new Error(\"vtx fail\");\n });\n vi.spyOn(VersionedMessage, \"deserialize\").mockImplementation(() => {\n throw new Error(\"vmd fail\");\n });\n vi.spyOn(Transaction, \"from\").mockImplementation(() => {\n throw new Error(\"tx fail\");\n });\n\n // when\n const inspector = new TransactionInspector(new Uint8Array([0x01, 0x02]));\n\n // then\n expect(() =>\n (inspector as any).extractMessage(new Uint8Array([0x01, 0x02])),\n ).toThrow(\n /Invalid transaction payload[\\s\\S]*1\\) vtx fail[\\s\\S]*2\\) vmd fail[\\s\\S]*3\\) tx fail/,\n );\n });\n\n it(\"returns STANDARD fallback when all deserialisers throw\", async () => {\n vi.spyOn(VersionedTransaction, \"deserialize\").mockImplementation(() => {\n throw new Error(\"vtx fail\");\n });\n vi.spyOn(VersionedMessage, \"deserialize\").mockImplementation(() => {\n throw new Error(\"vmd fail\");\n });\n vi.spyOn(Transaction, \"from\").mockImplementation(() => {\n throw new Error(\"tx fail\");\n });\n\n const inspector = new TransactionInspector(\n new Uint8Array([0xde, 0xad, 0xbe, 0xef]),\n );\n const result = await inspector.inspectTransactionType();\n\n expect(result).toEqual({\n transactionType: SolanaTransactionTypes.STANDARD,\n data: {},\n });\n });\n});\n\ndescribe(\"isTransferCheckedData\", () => {\n const inspector = new TransactionInspector(new Uint8Array());\n\n it(\"returns false for null or primitive values\", () => {\n expect((inspector as any).isTransferCheckedData(null)).toBe(false);\n expect((inspector as any).isTransferCheckedData(42)).toBe(false);\n expect((inspector as any).isTransferCheckedData(\"string\")).toBe(false);\n });\n\n it(\"returns false for objects missing required keys or wrong types\", () => {\n // given\n const fakePk = Keypair.generate().publicKey;\n\n // when / then\n // Missing keys\n expect(\n (inspector as any).isTransferCheckedData({\n mint: fakePk,\n authority: fakePk,\n }),\n ).toBe(false);\n // Wrong types\n expect(\n (inspector as any).isTransferCheckedData({\n mint: \"nope\",\n authority: null,\n source: {},\n destination: [],\n }),\n ).toBe(false);\n });\n\n it(\"returns true for a properly shaped object\", () => {\n // given\n const fakePk = Keypair.generate().publicKey;\n const data = {\n mint: fakePk,\n authority: fakePk,\n source: fakePk,\n destination: fakePk,\n };\n\n // when / then\n expect((inspector as any).isTransferCheckedData(data)).toBe(true);\n });\n});\n\ndescribe(\"extractMessage legacy fallback\", () => {\n it(\"handles a legacy Transaction via serializeMessage and returns STANDARD\", async () => {\n // given\n vi.spyOn(VersionedTransaction, \"deserialize\").mockImplementation(() => {\n throw new Error(\"vtx fail\");\n });\n vi.spyOn(VersionedMessage, \"deserialize\").mockImplementation(() => {\n throw new Error(\"vmd fail\");\n });\n\n const from = Keypair.generate();\n const to = Keypair.generate();\n const tx = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: from.publicKey,\n toPubkey: to.publicKey,\n lamports: 1,\n }),\n );\n tx.feePayer = from.publicKey;\n tx.recentBlockhash = \"11111111111111111111111111111111\";\n\n tx.sign(from);\n\n const raw = tx.serialize();\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(\"Standard\");\n expect(result.data).toEqual({});\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["splToken", "Keypair", "SystemProgram", "Transaction", "VersionedMessage", "VersionedTransaction", "SolanaTransactionTypes", "TransactionInspector", "makeFakeMessage", "opts", "ix", "_", "actual", "decodeInstruction", "getAssociatedTokenAddress", "TOKEN_PROGRAM_ID", "inspector", "res", "fakePk", "msg", "dest", "other", "mint", "auth", "ata", "result", "data", "from", "to", "tx", "raw"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{isSuccessCommandResult as i}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as s}from"../../app-binder/command/GetChallengeCommand";class u{constructor(o,e){this.api=o;this.args=e}async run(){const{contextModule:o,options:e}=this.args,a=this.api.getDeviceSessionState();let n;const r=await this.api.sendCommand(new s);return i(r)&&(n=r.data.challenge),(await o.getSolanaContext({deviceModelId:a.deviceModelId,tokenAddress:e.tokenAddress,challenge:n,createATA:e.createATA})).caseOf({Left:t=>{throw t},Right:t=>({challenge:n,descriptor:t.descriptor,addressResult:{tokenAccount:t.tokenAccount,owner:t.owner,contract:t.contract},calCertificate:t.certificate})})}}export{u as BuildTransactionContextTask};
2
+ //# sourceMappingURL=BuildTransactionContextTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.ts"],
4
+ "sourcesContent": ["import {\n type ContextModule,\n type PkiCertificate,\n} from \"@ledgerhq/context-module\";\nimport {\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TransactionOptions } from \"@api/model/TransactionOptions\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type SolanaBuildContextResult = {\n challenge: string | undefined;\n addressResult: {\n tokenAccount: string;\n owner: string;\n contract: string;\n };\n calCertificate: PkiCertificate;\n descriptor: Uint8Array;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionOptions;\n};\n\nexport class BuildTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildTransactionContextTaskArgs,\n ) {}\n\n async run(): Promise<SolanaBuildContextResult> {\n const { contextModule, options } = this.args;\n const deviceState = this.api.getDeviceSessionState();\n\n // get challenge\n let challenge: string | undefined;\n const challengeRes = await this.api.sendCommand(new GetChallengeCommand());\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n }\n\n // get Solana context\n const contextResult = await contextModule.getSolanaContext({\n deviceModelId: deviceState.deviceModelId,\n tokenAddress: options.tokenAddress,\n challenge,\n createATA: options.createATA,\n });\n\n return contextResult.caseOf({\n Left: (err) => {\n throw err;\n },\n Right: (ctx) => {\n return {\n challenge,\n descriptor: ctx.descriptor,\n addressResult: {\n tokenAccount: ctx.tokenAccount,\n owner: ctx.owner,\n contract: ctx.contract,\n },\n calCertificate: ctx.certificate,\n };\n },\n });\n }\n}\n"],
5
+ "mappings": "AAIA,OAEE,0BAAAA,MACK,kCAGP,OAAS,uBAAAC,MAA2B,mDAkB7B,MAAMC,CAA4B,CACvC,YACmBC,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAAyC,CAC7C,KAAM,CAAE,cAAAC,EAAe,QAAAC,CAAQ,EAAI,KAAK,KAClCC,EAAc,KAAK,IAAI,sBAAsB,EAGnD,IAAIC,EACJ,MAAMC,EAAe,MAAM,KAAK,IAAI,YAAY,IAAIR,CAAqB,EACzE,OAAID,EAAuBS,CAAY,IACrCD,EAAYC,EAAa,KAAK,YAIV,MAAMJ,EAAc,iBAAiB,CACzD,cAAeE,EAAY,cAC3B,aAAcD,EAAQ,aACtB,UAAAE,EACA,UAAWF,EAAQ,SACrB,CAAC,GAEoB,OAAO,CAC1B,KAAOI,GAAQ,CACb,MAAMA,CACR,EACA,MAAQC,IACC,CACL,UAAAH,EACA,WAAYG,EAAI,WAChB,cAAe,CACb,aAAcA,EAAI,aAClB,MAAOA,EAAI,MACX,SAAUA,EAAI,QAChB,EACA,eAAgBA,EAAI,WACtB,EAEJ,CAAC,CACH,CACF",
6
+ "names": ["isSuccessCommandResult", "GetChallengeCommand", "BuildTransactionContextTask", "api", "args", "contextModule", "options", "deviceState", "challenge", "challengeRes", "err", "ctx"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{CommandResultStatus as u,DeviceModelId as l}from"@ledgerhq/device-management-kit";import{Left as f,Right as m}from"purify-ts";import{beforeEach as C,describe as k,expect as n,it as r,vi as t}from"vitest";import{GetChallengeCommand as A}from"../../app-binder/command/GetChallengeCommand";import{BuildTransactionContextTask as d}from"./BuildTransactionContextTask";const a={getSolanaContext:t.fn(),getContext:t.fn(),getContexts:t.fn(),getTypedDataFilters:t.fn(),getWeb3Checks:t.fn()},i={contextModule:a,options:{tokenAddress:"someAddress",createATA:void 0}},e={descriptor:new Uint8Array([1,2,3]),tokenAccount:"someTokenAccount",owner:"someOwner",contract:"someContract",certificate:{payload:new Uint8Array([170,187]),keyUsageNumber:1}};let o;k("BuildTransactionContextTask",()=>{C(()=>{t.resetAllMocks(),o={getDeviceSessionState:t.fn().mockReturnValue({deviceModelId:l.NANO_X}),sendCommand:t.fn().mockResolvedValue({status:u.Success,data:{challenge:"someChallenge"}})}}),r("returns context successfully when challenge command succeeds",async()=>{a.getSolanaContext.mockResolvedValue(m(e));const s=await new d(o,i).run();n(o.sendCommand).toHaveBeenCalledWith(n.any(A)),n(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:l.NANO_X,tokenAddress:"someAddress",challenge:"someChallenge",createATA:void 0}),n(s).toEqual({challenge:"someChallenge",descriptor:e.descriptor,calCertificate:e.certificate,addressResult:{tokenAccount:e.tokenAccount,owner:e.owner,contract:e.contract}})}),r("returns context when challenge command fails",async()=>{o.sendCommand.mockResolvedValue({status:u.Error,data:{}}),a.getSolanaContext.mockResolvedValue(m(e));const s=await new d(o,i).run();n(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:l.NANO_X,tokenAddress:"someAddress",challenge:void 0,createATA:void 0}),n(s).toEqual({challenge:void 0,descriptor:e.descriptor,calCertificate:e.certificate,addressResult:{tokenAccount:e.tokenAccount,owner:e.owner,contract:e.contract}})}),r("throws if getSolanaContext returns Left",async()=>{const c=new Error("Solana context failure");a.getSolanaContext.mockResolvedValue(f(c));const s=new d(o,i);await n(s.run()).rejects.toThrow("Solana context failure")})});
2
+ //# sourceMappingURL=BuildTransactionContextTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultStatus,\n DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nimport {\n BuildTransactionContextTask,\n type SolanaBuildContextResult,\n} from \"./BuildTransactionContextTask\";\n\nconst contextModuleMock: ContextModule = {\n getSolanaContext: vi.fn(),\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n};\n\nconst defaultArgs = {\n contextModule: contextModuleMock,\n options: {\n tokenAddress: \"someAddress\",\n createATA: undefined,\n },\n};\n\nconst domainSolanaPayload = {\n descriptor: new Uint8Array([1, 2, 3]),\n tokenAccount: \"someTokenAccount\",\n owner: \"someOwner\",\n contract: \"someContract\",\n certificate: { payload: new Uint8Array([0xaa, 0xbb]), keyUsageNumber: 1 },\n} as const;\n\nlet apiMock: InternalApi;\n\ndescribe(\"BuildTransactionContextTask\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n\n apiMock = {\n getDeviceSessionState: vi\n .fn()\n .mockReturnValue({ deviceModelId: DeviceModelId.NANO_X }),\n sendCommand: vi.fn().mockResolvedValue({\n status: CommandResultStatus.Success,\n data: { challenge: \"someChallenge\" },\n }),\n } as unknown as InternalApi;\n });\n\n it(\"returns context successfully when challenge command succeeds\", async () => {\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: \"someChallenge\",\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: \"someChallenge\",\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"returns context when challenge command fails\", async () => {\n (apiMock.sendCommand as any).mockResolvedValue({\n status: CommandResultStatus.Error,\n data: {},\n });\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: undefined,\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: undefined,\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"throws if getSolanaContext returns Left\", async () => {\n const error = new Error(\"Solana context failure\");\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(Left(error));\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\"Solana context failure\");\n });\n});\n"],
5
+ "mappings": "AAIA,OACE,uBAAAA,EACA,iBAAAC,MAEK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAErD,OAAS,uBAAAC,MAA2B,mDAEpC,OACE,+BAAAC,MAEK,gCAEP,MAAMC,EAAmC,CACvC,iBAAkBH,EAAG,GAAG,EACxB,WAAYA,EAAG,GAAG,EAClB,YAAaA,EAAG,GAAG,EACnB,oBAAqBA,EAAG,GAAG,EAC3B,cAAeA,EAAG,GAAG,CACvB,EAEMI,EAAc,CAClB,cAAeD,EACf,QAAS,CACP,aAAc,cACd,UAAW,MACb,CACF,EAEME,EAAsB,CAC1B,WAAY,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACpC,aAAc,mBACd,MAAO,YACP,SAAU,eACV,YAAa,CAAE,QAAS,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAAG,eAAgB,CAAE,CAC1E,EAEA,IAAIC,EAEJT,EAAS,8BAA+B,IAAM,CAC5CD,EAAW,IAAM,CACfI,EAAG,cAAc,EAEjBM,EAAU,CACR,sBAAuBN,EACpB,GAAG,EACH,gBAAgB,CAAE,cAAeP,EAAc,MAAO,CAAC,EAC1D,YAAaO,EAAG,GAAG,EAAE,kBAAkB,CACrC,OAAQR,EAAoB,QAC5B,KAAM,CAAE,UAAW,eAAgB,CACrC,CAAC,CACH,CACF,CAAC,EAEDO,EAAG,+DAAgE,SAAY,CAC5EI,EAAkB,iBAAyB,kBAC1CR,EAAMU,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAIL,EAA4BI,EAASF,CAAW,EACvC,IAAI,EAE9BN,EAAOQ,EAAQ,WAAW,EAAE,qBAC1BR,EAAO,IAAIG,CAAmB,CAChC,EAEAH,EAAOK,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAeV,EAAc,OAC7B,aAAc,cACd,UAAW,gBACX,UAAW,MACb,CAAC,EAEDK,EAAOS,CAAM,EAAE,QAAkC,CAC/C,UAAW,gBACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,EAEDN,EAAG,+CAAgD,SAAY,CAC5DO,EAAQ,YAAoB,kBAAkB,CAC7C,OAAQd,EAAoB,MAC5B,KAAM,CAAC,CACT,CAAC,EACAW,EAAkB,iBAAyB,kBAC1CR,EAAMU,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAIL,EAA4BI,EAASF,CAAW,EACvC,IAAI,EAE9BN,EAAOK,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAeV,EAAc,OAC7B,aAAc,cACd,UAAW,OACX,UAAW,MACb,CAAC,EAEDK,EAAOS,CAAM,EAAE,QAAkC,CAC/C,UAAW,OACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,EAEDN,EAAG,0CAA2C,SAAY,CACxD,MAAMS,EAAQ,IAAI,MAAM,wBAAwB,EAC/CL,EAAkB,iBAAyB,kBAAkBT,EAAKc,CAAK,CAAC,EAEzE,MAAMC,EAAO,IAAIP,EAA4BI,EAASF,CAAW,EAEjE,MAAMN,EAAOW,EAAK,IAAI,CAAC,EAAE,QAAQ,QAAQ,wBAAwB,CACnE,CAAC,CACH,CAAC",
6
+ "names": ["CommandResultStatus", "DeviceModelId", "Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "GetChallengeCommand", "BuildTransactionContextTask", "contextModuleMock", "defaultArgs", "domainSolanaPayload", "apiMock", "result", "error", "task"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{isSuccessCommandResult as a}from"@ledgerhq/device-management-kit";import{Nothing as n}from"purify-ts";import{ProvideTLVDescriptorCommand as p}from"../../app-binder/command/ProvideTLVDescriptorCommand";import{ProvideTrustedNamePKICommand as s}from"../../app-binder/command/ProvideTrustedNamePKICommand";class C{constructor(t,o){this.api=t;this.context=o}async run(){const{descriptor:t,certificate:o}=this.context,{payload:i}=o,r=await this.api.sendCommand(new s({pkiBlob:i}));if(!a(r))throw r;const e=await this.api.sendCommand(new p({payload:t}));if(!a(e))throw e;return n}}export{C as ProvideSolanaTransactionContextTask};
2
+ //# sourceMappingURL=ProvideTransactionContextTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextTask.ts"],
4
+ "sourcesContent": ["import { type PkiCertificate } from \"@ledgerhq/context-module\";\nimport {\n type CommandErrorResult,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Maybe, Nothing } from \"purify-ts\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTrustedNamePKICommand } from \"@internal/app-binder/command/ProvideTrustedNamePKICommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\n\nexport type SolanaContextForDevice = {\n descriptor: Uint8Array;\n certificate: PkiCertificate;\n};\n\nexport class ProvideSolanaTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly context: SolanaContextForDevice,\n ) {}\n\n async run(): Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>> {\n const { descriptor, certificate } = this.context;\n const { payload: certificatePayload } = certificate;\n\n // send CAL certificate + signature\n const pkiResult = await this.api.sendCommand(\n new ProvideTrustedNamePKICommand({\n pkiBlob: certificatePayload,\n }),\n );\n if (!isSuccessCommandResult(pkiResult)) {\n throw pkiResult;\n }\n\n // send signed TLV descriptor\n const tlvResult = await this.api.sendCommand(\n new ProvideTLVDescriptorCommand({ payload: descriptor }),\n );\n if (!isSuccessCommandResult(tlvResult)) {\n throw tlvResult;\n }\n\n return Nothing;\n }\n}\n"],
5
+ "mappings": "AACA,OAGE,0BAAAA,MACK,kCACP,OAAqB,WAAAC,MAAe,YAEpC,OAAS,+BAAAC,MAAmC,2DAC5C,OAAS,gCAAAC,MAAoC,4DAQtC,MAAMC,CAAoC,CAC/C,YACmBC,EACAC,EACjB,CAFiB,SAAAD,EACA,aAAAC,CAChB,CAEH,MAAM,KAA+D,CACnE,KAAM,CAAE,WAAAC,EAAY,YAAAC,CAAY,EAAI,KAAK,QACnC,CAAE,QAASC,CAAmB,EAAID,EAGlCE,EAAY,MAAM,KAAK,IAAI,YAC/B,IAAIP,EAA6B,CAC/B,QAASM,CACX,CAAC,CACH,EACA,GAAI,CAACT,EAAuBU,CAAS,EACnC,MAAMA,EAIR,MAAMC,EAAY,MAAM,KAAK,IAAI,YAC/B,IAAIT,EAA4B,CAAE,QAASK,CAAW,CAAC,CACzD,EACA,GAAI,CAACP,EAAuBW,CAAS,EACnC,MAAMA,EAGR,OAAOV,CACT,CACF",
6
+ "names": ["isSuccessCommandResult", "Nothing", "ProvideTLVDescriptorCommand", "ProvideTrustedNamePKICommand", "ProvideSolanaTransactionContextTask", "api", "context", "descriptor", "certificate", "certificatePayload", "pkiResult", "tlvResult"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{CommandResultFactory as r}from"@ledgerhq/device-management-kit";import{Maybe as k,Nothing as y}from"purify-ts";import{beforeEach as v,describe as x,expect as o,it as m,vi as p}from"vitest";import{ProvideTLVDescriptorCommand as w}from"../../app-binder/command/ProvideTLVDescriptorCommand";import{ProvideTrustedNamePKICommand as T}from"../../app-binder/command/ProvideTrustedNamePKICommand";import{ProvideSolanaTransactionContextTask as c}from"./ProvideTransactionContextTask";x("ProvideSolanaTransactionContextTask",()=>{let e,t;const d=Uint8Array.from([170,170,170]),l={payload:Uint8Array.from([222,173,190,239,222,173,190,239])},i={_tag:"SomeError",errorCode:0,message:"SomeError"};v(()=>{p.resetAllMocks(),e={sendCommand:p.fn()},t={descriptor:d,certificate:l}}),m("returns Nothing when both commands succeed",async()=>{const a=r({data:k.of(null)});e.sendCommand.mockResolvedValue(a);const s=await new c(e,t).run();o(e.sendCommand).toHaveBeenCalledTimes(2);const u=e.sendCommand.mock.calls[0];o(u).toBeDefined();const C=u[0];o(C).toBeInstanceOf(T),o(C.args.pkiBlob).toStrictEqual(l.payload);const f=e.sendCommand.mock.calls[1][0];o(f).toBeInstanceOf(w),o(f.args.payload).toStrictEqual(d),o(s).toStrictEqual(y)}),m("throws error if PKI command fails",async()=>{const a=r({error:i});e.sendCommand.mockResolvedValueOnce(a);const n=new c(e,t);await o(n.run()).rejects.toBe(a),o(e.sendCommand).toHaveBeenCalledTimes(1)}),m("throws error if TLV command fails",async()=>{const a=r({data:k.of(null)}),n=r({error:i});e.sendCommand.mockResolvedValueOnce(a).mockResolvedValueOnce(n);const s=new c(e,t);await o(s.run()).rejects.toBe(n),o(e.sendCommand).toHaveBeenCalledTimes(2)})});
2
+ //# sourceMappingURL=ProvideTransactionContextTask.test.js.map