@ledgerhq/device-signer-kit-ethereum 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/README.md +59 -1
  2. package/lib/cjs/api/SignerEth.js +1 -1
  3. package/lib/cjs/api/SignerEth.js.map +1 -1
  4. package/lib/cjs/api/SignerEthBuilder.test.js +1 -1
  5. package/lib/cjs/api/SignerEthBuilder.test.js.map +2 -2
  6. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  7. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  8. package/lib/cjs/api/app-binder/SignTypedDataDeviceActionTypes.js +1 -1
  9. package/lib/cjs/api/app-binder/SignTypedDataDeviceActionTypes.js.map +2 -2
  10. package/lib/cjs/api/app-binder/VerifySafeAddressDeviceActionTypes.js +2 -0
  11. package/lib/cjs/api/app-binder/VerifySafeAddressDeviceActionTypes.js.map +7 -0
  12. package/lib/cjs/api/model/SafeAddressOptions.js +2 -0
  13. package/lib/cjs/api/model/SafeAddressOptions.js.map +7 -0
  14. package/lib/cjs/internal/DefaultSignerEth.js +1 -1
  15. package/lib/cjs/internal/DefaultSignerEth.js.map +3 -3
  16. package/lib/cjs/internal/app-binder/EthAppBinder.js +1 -1
  17. package/lib/cjs/internal/app-binder/EthAppBinder.js.map +3 -3
  18. package/lib/cjs/internal/app-binder/EthAppBinder.test.js +1 -1
  19. package/lib/cjs/internal/app-binder/EthAppBinder.test.js.map +2 -2
  20. package/lib/cjs/internal/app-binder/command/ProvideSafeAccountCommand.js +2 -0
  21. package/lib/cjs/internal/app-binder/command/ProvideSafeAccountCommand.js.map +7 -0
  22. package/lib/cjs/internal/app-binder/command/ProvideSafeAccountCommand.test.js +2 -0
  23. package/lib/cjs/internal/app-binder/command/ProvideSafeAccountCommand.test.js.map +7 -0
  24. package/lib/cjs/internal/app-binder/command/SendEIP712FilteringCommand.js +1 -1
  25. package/lib/cjs/internal/app-binder/command/SendEIP712FilteringCommand.js.map +3 -3
  26. package/lib/cjs/internal/app-binder/command/SendEIP712FilteringCommand.test.js +1 -1
  27. package/lib/cjs/internal/app-binder/command/SendEIP712FilteringCommand.test.js.map +3 -3
  28. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
  29. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
  30. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  31. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  32. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
  33. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +2 -2
  34. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
  35. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +3 -3
  36. package/lib/cjs/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.js +2 -0
  37. package/lib/cjs/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.js.map +7 -0
  38. package/lib/cjs/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.js +2 -0
  39. package/lib/cjs/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.js.map +7 -0
  40. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionUntilStep.js +2 -0
  41. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionUntilStep.js.map +7 -0
  42. package/lib/cjs/internal/app-binder/task/BuildBaseContexts.js +2 -0
  43. package/lib/cjs/internal/app-binder/task/BuildBaseContexts.js.map +7 -0
  44. package/lib/cjs/internal/app-binder/task/BuildBaseContexts.test.js +2 -0
  45. package/lib/cjs/internal/app-binder/task/BuildBaseContexts.test.js.map +7 -0
  46. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.js +1 -1
  47. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.js.map +3 -3
  48. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
  49. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +3 -3
  50. package/lib/cjs/internal/app-binder/task/BuildFullContextsTask.js +2 -0
  51. package/lib/cjs/internal/app-binder/task/BuildFullContextsTask.js.map +7 -0
  52. package/lib/cjs/internal/app-binder/task/BuildFullContextsTask.test.js +2 -0
  53. package/lib/cjs/internal/app-binder/task/BuildFullContextsTask.test.js.map +7 -0
  54. package/lib/cjs/internal/app-binder/task/BuildSafeAddressContextTask.js +2 -0
  55. package/lib/cjs/internal/app-binder/task/BuildSafeAddressContextTask.js.map +7 -0
  56. package/lib/cjs/internal/app-binder/task/BuildSafeAddressContextTask.test.js +2 -0
  57. package/lib/cjs/internal/app-binder/task/BuildSafeAddressContextTask.test.js.map +7 -0
  58. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.js +2 -0
  59. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.js.map +7 -0
  60. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.test.js +2 -0
  61. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.test.js.map +7 -0
  62. package/lib/cjs/internal/app-binder/task/ParseNestedTransactionTask.js +2 -0
  63. package/lib/cjs/internal/app-binder/task/ParseNestedTransactionTask.js.map +7 -0
  64. package/lib/cjs/internal/app-binder/task/ParseNestedTransactionTask.test.js +2 -0
  65. package/lib/cjs/internal/app-binder/task/ParseNestedTransactionTask.test.js.map +7 -0
  66. package/lib/cjs/internal/app-binder/task/ParseTransactionTask.js +2 -0
  67. package/lib/cjs/internal/app-binder/task/ParseTransactionTask.js.map +7 -0
  68. package/lib/cjs/internal/app-binder/task/ParseTransactionTask.test.js +2 -0
  69. package/lib/cjs/internal/app-binder/task/ParseTransactionTask.test.js.map +7 -0
  70. package/lib/cjs/internal/app-binder/task/ProvideContextTask.js +2 -0
  71. package/lib/cjs/internal/app-binder/task/ProvideContextTask.js.map +7 -0
  72. package/lib/cjs/internal/app-binder/task/ProvideContextTask.test.js +2 -0
  73. package/lib/cjs/internal/app-binder/task/ProvideContextTask.test.js.map +7 -0
  74. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
  75. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
  76. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  77. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +3 -3
  78. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextsTask.js +2 -0
  79. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextsTask.js.map +7 -0
  80. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextsTask.test.js +2 -0
  81. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextsTask.test.js.map +7 -0
  82. package/lib/cjs/internal/di.js +1 -1
  83. package/lib/cjs/internal/di.js.map +3 -3
  84. package/lib/cjs/internal/safe/di/safeModule.js +2 -0
  85. package/lib/cjs/internal/safe/di/safeModule.js.map +7 -0
  86. package/lib/cjs/internal/safe/di/safeModule.test.js +2 -0
  87. package/lib/cjs/internal/safe/di/safeModule.test.js.map +7 -0
  88. package/lib/cjs/internal/safe/di/safeTypes.js +2 -0
  89. package/lib/cjs/internal/safe/di/safeTypes.js.map +7 -0
  90. package/lib/cjs/internal/safe/use-case/VerifySafeAddressUseCase.js +2 -0
  91. package/lib/cjs/internal/safe/use-case/VerifySafeAddressUseCase.js.map +7 -0
  92. package/lib/cjs/internal/safe/use-case/VerifySafeAddressUseCase.test.js +2 -0
  93. package/lib/cjs/internal/safe/use-case/VerifySafeAddressUseCase.test.js.map +7 -0
  94. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.js +1 -1
  95. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.js.map +2 -2
  96. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.test.js +1 -1
  97. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.test.js.map +2 -2
  98. package/lib/cjs/package.json +2 -2
  99. package/lib/esm/api/SignerEthBuilder.test.js +1 -1
  100. package/lib/esm/api/SignerEthBuilder.test.js.map +2 -2
  101. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  102. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  103. package/lib/esm/api/app-binder/SignTypedDataDeviceActionTypes.js +1 -1
  104. package/lib/esm/api/app-binder/SignTypedDataDeviceActionTypes.js.map +2 -2
  105. package/lib/esm/api/app-binder/VerifySafeAddressDeviceActionTypes.js +2 -0
  106. package/lib/esm/api/app-binder/VerifySafeAddressDeviceActionTypes.js.map +7 -0
  107. package/lib/esm/api/model/SafeAddressOptions.js +1 -0
  108. package/lib/esm/api/model/SafeAddressOptions.js.map +7 -0
  109. package/lib/esm/internal/DefaultSignerEth.js +1 -1
  110. package/lib/esm/internal/DefaultSignerEth.js.map +3 -3
  111. package/lib/esm/internal/app-binder/EthAppBinder.js +1 -1
  112. package/lib/esm/internal/app-binder/EthAppBinder.js.map +3 -3
  113. package/lib/esm/internal/app-binder/EthAppBinder.test.js +1 -1
  114. package/lib/esm/internal/app-binder/EthAppBinder.test.js.map +2 -2
  115. package/lib/esm/internal/app-binder/command/ProvideSafeAccountCommand.js +2 -0
  116. package/lib/esm/internal/app-binder/command/ProvideSafeAccountCommand.js.map +7 -0
  117. package/lib/esm/internal/app-binder/command/ProvideSafeAccountCommand.test.js +2 -0
  118. package/lib/esm/internal/app-binder/command/ProvideSafeAccountCommand.test.js.map +7 -0
  119. package/lib/esm/internal/app-binder/command/SendEIP712FilteringCommand.js +1 -1
  120. package/lib/esm/internal/app-binder/command/SendEIP712FilteringCommand.js.map +3 -3
  121. package/lib/esm/internal/app-binder/command/SendEIP712FilteringCommand.test.js +1 -1
  122. package/lib/esm/internal/app-binder/command/SendEIP712FilteringCommand.test.js.map +3 -3
  123. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
  124. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
  125. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  126. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  127. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
  128. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +2 -2
  129. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
  130. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +3 -3
  131. package/lib/esm/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.js +2 -0
  132. package/lib/esm/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.js.map +7 -0
  133. package/lib/esm/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.js +2 -0
  134. package/lib/esm/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.js.map +7 -0
  135. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionUntilStep.js +2 -0
  136. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionUntilStep.js.map +7 -0
  137. package/lib/esm/internal/app-binder/task/BuildBaseContexts.js +2 -0
  138. package/lib/esm/internal/app-binder/task/BuildBaseContexts.js.map +7 -0
  139. package/lib/esm/internal/app-binder/task/BuildBaseContexts.test.js +2 -0
  140. package/lib/esm/internal/app-binder/task/BuildBaseContexts.test.js.map +7 -0
  141. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.js +1 -1
  142. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.js.map +3 -3
  143. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
  144. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +3 -3
  145. package/lib/esm/internal/app-binder/task/BuildFullContextsTask.js +2 -0
  146. package/lib/esm/internal/app-binder/task/BuildFullContextsTask.js.map +7 -0
  147. package/lib/esm/internal/app-binder/task/BuildFullContextsTask.test.js +2 -0
  148. package/lib/esm/internal/app-binder/task/BuildFullContextsTask.test.js.map +7 -0
  149. package/lib/esm/internal/app-binder/task/BuildSafeAddressContextTask.js +2 -0
  150. package/lib/esm/internal/app-binder/task/BuildSafeAddressContextTask.js.map +7 -0
  151. package/lib/esm/internal/app-binder/task/BuildSafeAddressContextTask.test.js +2 -0
  152. package/lib/esm/internal/app-binder/task/BuildSafeAddressContextTask.test.js.map +7 -0
  153. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.js +2 -0
  154. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.js.map +7 -0
  155. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.test.js +2 -0
  156. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.test.js.map +7 -0
  157. package/lib/esm/internal/app-binder/task/ParseNestedTransactionTask.js +2 -0
  158. package/lib/esm/internal/app-binder/task/ParseNestedTransactionTask.js.map +7 -0
  159. package/lib/esm/internal/app-binder/task/ParseNestedTransactionTask.test.js +2 -0
  160. package/lib/esm/internal/app-binder/task/ParseNestedTransactionTask.test.js.map +7 -0
  161. package/lib/esm/internal/app-binder/task/ParseTransactionTask.js +2 -0
  162. package/lib/esm/internal/app-binder/task/ParseTransactionTask.js.map +7 -0
  163. package/lib/esm/internal/app-binder/task/ParseTransactionTask.test.js +2 -0
  164. package/lib/esm/internal/app-binder/task/ParseTransactionTask.test.js.map +7 -0
  165. package/lib/esm/internal/app-binder/task/ProvideContextTask.js +2 -0
  166. package/lib/esm/internal/app-binder/task/ProvideContextTask.js.map +7 -0
  167. package/lib/esm/internal/app-binder/task/ProvideContextTask.test.js +2 -0
  168. package/lib/esm/internal/app-binder/task/ProvideContextTask.test.js.map +7 -0
  169. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
  170. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
  171. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  172. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +3 -3
  173. package/lib/esm/internal/app-binder/task/ProvideTransactionContextsTask.js +2 -0
  174. package/lib/esm/internal/app-binder/task/ProvideTransactionContextsTask.js.map +7 -0
  175. package/lib/esm/internal/app-binder/task/ProvideTransactionContextsTask.test.js +2 -0
  176. package/lib/esm/internal/app-binder/task/ProvideTransactionContextsTask.test.js.map +7 -0
  177. package/lib/esm/internal/di.js +1 -1
  178. package/lib/esm/internal/di.js.map +3 -3
  179. package/lib/esm/internal/safe/di/safeModule.js +2 -0
  180. package/lib/esm/internal/safe/di/safeModule.js.map +7 -0
  181. package/lib/esm/internal/safe/di/safeModule.test.js +2 -0
  182. package/lib/esm/internal/safe/di/safeModule.test.js.map +7 -0
  183. package/lib/esm/internal/safe/di/safeTypes.js +2 -0
  184. package/lib/esm/internal/safe/di/safeTypes.js.map +7 -0
  185. package/lib/esm/internal/safe/use-case/VerifySafeAddressUseCase.js +2 -0
  186. package/lib/esm/internal/safe/use-case/VerifySafeAddressUseCase.js.map +7 -0
  187. package/lib/esm/internal/safe/use-case/VerifySafeAddressUseCase.test.js +2 -0
  188. package/lib/esm/internal/safe/use-case/VerifySafeAddressUseCase.test.js.map +7 -0
  189. package/lib/esm/internal/transaction/service/parser/TransactionParserService.js +1 -1
  190. package/lib/esm/internal/transaction/service/parser/TransactionParserService.js.map +2 -2
  191. package/lib/esm/internal/transaction/service/parser/TransactionParserService.test.js +1 -1
  192. package/lib/esm/internal/transaction/service/parser/TransactionParserService.test.js.map +2 -2
  193. package/lib/esm/package.json +2 -2
  194. package/lib/types/api/SignerEth.d.ts +3 -0
  195. package/lib/types/api/SignerEth.d.ts.map +1 -1
  196. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +9 -8
  197. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  198. package/lib/types/api/app-binder/SignTypedDataDeviceActionTypes.d.ts +4 -0
  199. package/lib/types/api/app-binder/SignTypedDataDeviceActionTypes.d.ts.map +1 -1
  200. package/lib/types/api/app-binder/VerifySafeAddressDeviceActionTypes.d.ts +30 -0
  201. package/lib/types/api/app-binder/VerifySafeAddressDeviceActionTypes.d.ts.map +1 -0
  202. package/lib/types/api/model/SafeAddressOptions.d.ts +5 -0
  203. package/lib/types/api/model/SafeAddressOptions.d.ts.map +1 -0
  204. package/lib/types/internal/DefaultSignerEth.d.ts +3 -0
  205. package/lib/types/internal/DefaultSignerEth.d.ts.map +1 -1
  206. package/lib/types/internal/app-binder/EthAppBinder.d.ts +6 -0
  207. package/lib/types/internal/app-binder/EthAppBinder.d.ts.map +1 -1
  208. package/lib/types/internal/app-binder/command/ProvideSafeAccountCommand.d.ts +34 -0
  209. package/lib/types/internal/app-binder/command/ProvideSafeAccountCommand.d.ts.map +1 -0
  210. package/lib/types/internal/app-binder/command/ProvideSafeAccountCommand.test.d.ts +2 -0
  211. package/lib/types/internal/app-binder/command/ProvideSafeAccountCommand.test.d.ts.map +1 -0
  212. package/lib/types/internal/app-binder/command/SendEIP712FilteringCommand.d.ts +29 -1
  213. package/lib/types/internal/app-binder/command/SendEIP712FilteringCommand.d.ts.map +1 -1
  214. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts +14 -18
  215. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts.map +1 -1
  216. package/lib/types/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.d.ts +4 -0
  217. package/lib/types/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.d.ts.map +1 -1
  218. package/lib/types/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.d.ts +20 -0
  219. package/lib/types/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.d.ts.map +1 -0
  220. package/lib/types/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.d.ts +2 -0
  221. package/lib/types/internal/app-binder/device-action/VerifySafeAddress/VerifySafeAddress.test.d.ts.map +1 -0
  222. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionUntilStep.d.ts +6 -0
  223. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionUntilStep.d.ts.map +1 -0
  224. package/lib/types/internal/app-binder/task/BuildBaseContexts.d.ts +51 -0
  225. package/lib/types/internal/app-binder/task/BuildBaseContexts.d.ts.map +1 -0
  226. package/lib/types/internal/app-binder/task/BuildBaseContexts.test.d.ts +2 -0
  227. package/lib/types/internal/app-binder/task/BuildBaseContexts.test.d.ts.map +1 -0
  228. package/lib/types/internal/app-binder/task/BuildEIP712ContextTask.d.ts +8 -1
  229. package/lib/types/internal/app-binder/task/BuildEIP712ContextTask.d.ts.map +1 -1
  230. package/lib/types/internal/app-binder/task/BuildFullContextsTask.d.ts +39 -0
  231. package/lib/types/internal/app-binder/task/BuildFullContextsTask.d.ts.map +1 -0
  232. package/lib/types/internal/app-binder/task/BuildFullContextsTask.test.d.ts +2 -0
  233. package/lib/types/internal/app-binder/task/BuildFullContextsTask.test.d.ts.map +1 -0
  234. package/lib/types/internal/app-binder/task/BuildSafeAddressContextTask.d.ts +19 -0
  235. package/lib/types/internal/app-binder/task/BuildSafeAddressContextTask.d.ts.map +1 -0
  236. package/lib/types/internal/app-binder/task/BuildSafeAddressContextTask.test.d.ts +2 -0
  237. package/lib/types/internal/app-binder/task/BuildSafeAddressContextTask.test.d.ts.map +1 -0
  238. package/lib/types/internal/app-binder/task/BuildSubcontextsTask.d.ts +28 -0
  239. package/lib/types/internal/app-binder/task/BuildSubcontextsTask.d.ts.map +1 -0
  240. package/lib/types/internal/app-binder/task/BuildSubcontextsTask.test.d.ts +2 -0
  241. package/lib/types/internal/app-binder/task/BuildSubcontextsTask.test.d.ts.map +1 -0
  242. package/lib/types/internal/app-binder/task/ParseNestedTransactionTask.d.ts +21 -0
  243. package/lib/types/internal/app-binder/task/ParseNestedTransactionTask.d.ts.map +1 -0
  244. package/lib/types/internal/app-binder/task/ParseNestedTransactionTask.test.d.ts +2 -0
  245. package/lib/types/internal/app-binder/task/ParseNestedTransactionTask.test.d.ts.map +1 -0
  246. package/lib/types/internal/app-binder/task/{PreBuildContextTask.d.ts → ParseTransactionTask.d.ts} +6 -6
  247. package/lib/types/internal/app-binder/task/ParseTransactionTask.d.ts.map +1 -0
  248. package/lib/types/internal/app-binder/task/ParseTransactionTask.test.d.ts +2 -0
  249. package/lib/types/internal/app-binder/task/ParseTransactionTask.test.d.ts.map +1 -0
  250. package/lib/types/internal/app-binder/task/ProvideContextTask.d.ts +22 -0
  251. package/lib/types/internal/app-binder/task/ProvideContextTask.d.ts.map +1 -0
  252. package/lib/types/internal/app-binder/task/ProvideContextTask.test.d.ts +2 -0
  253. package/lib/types/internal/app-binder/task/ProvideContextTask.test.d.ts.map +1 -0
  254. package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts +14 -3
  255. package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts.map +1 -1
  256. package/lib/types/internal/app-binder/task/ProvideTransactionContextsTask.d.ts +36 -0
  257. package/lib/types/internal/app-binder/task/ProvideTransactionContextsTask.d.ts.map +1 -0
  258. package/lib/types/internal/app-binder/task/ProvideTransactionContextsTask.test.d.ts +2 -0
  259. package/lib/types/internal/app-binder/task/ProvideTransactionContextsTask.test.d.ts.map +1 -0
  260. package/lib/types/internal/di.d.ts.map +1 -1
  261. package/lib/types/internal/safe/di/safeModule.d.ts +3 -0
  262. package/lib/types/internal/safe/di/safeModule.d.ts.map +1 -0
  263. package/lib/types/internal/safe/di/safeModule.test.d.ts +2 -0
  264. package/lib/types/internal/safe/di/safeModule.test.d.ts.map +1 -0
  265. package/lib/types/internal/safe/di/safeTypes.d.ts +4 -0
  266. package/lib/types/internal/safe/di/safeTypes.d.ts.map +1 -0
  267. package/lib/types/internal/safe/use-case/VerifySafeAddressUseCase.d.ts +9 -0
  268. package/lib/types/internal/safe/use-case/VerifySafeAddressUseCase.d.ts.map +1 -0
  269. package/lib/types/internal/safe/use-case/VerifySafeAddressUseCase.test.d.ts +2 -0
  270. package/lib/types/internal/safe/use-case/VerifySafeAddressUseCase.test.d.ts.map +1 -0
  271. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  272. package/package.json +9 -9
  273. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.js +0 -2
  274. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.js.map +0 -7
  275. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.test.js +0 -2
  276. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.test.js.map +0 -7
  277. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +0 -2
  278. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +0 -7
  279. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +0 -2
  280. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +0 -7
  281. package/lib/cjs/internal/app-binder/task/PreBuildContextTask.js +0 -2
  282. package/lib/cjs/internal/app-binder/task/PreBuildContextTask.js.map +0 -7
  283. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +0 -2
  284. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +0 -7
  285. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +0 -2
  286. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +0 -7
  287. package/lib/esm/internal/app-binder/task/BuildSubContextTask.js +0 -2
  288. package/lib/esm/internal/app-binder/task/BuildSubContextTask.js.map +0 -7
  289. package/lib/esm/internal/app-binder/task/BuildSubContextTask.test.js +0 -2
  290. package/lib/esm/internal/app-binder/task/BuildSubContextTask.test.js.map +0 -7
  291. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +0 -2
  292. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +0 -7
  293. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +0 -2
  294. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +0 -7
  295. package/lib/esm/internal/app-binder/task/PreBuildContextTask.js +0 -2
  296. package/lib/esm/internal/app-binder/task/PreBuildContextTask.js.map +0 -7
  297. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +0 -2
  298. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +0 -7
  299. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +0 -2
  300. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +0 -7
  301. package/lib/types/internal/app-binder/task/BuildSubContextTask.d.ts +0 -20
  302. package/lib/types/internal/app-binder/task/BuildSubContextTask.d.ts.map +0 -1
  303. package/lib/types/internal/app-binder/task/BuildSubContextTask.test.d.ts +0 -2
  304. package/lib/types/internal/app-binder/task/BuildSubContextTask.test.d.ts.map +0 -1
  305. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +0 -28
  306. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +0 -1
  307. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts +0 -2
  308. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts.map +0 -1
  309. package/lib/types/internal/app-binder/task/PreBuildContextTask.d.ts.map +0 -1
  310. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +0 -44
  311. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +0 -1
  312. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts +0 -2
  313. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildBaseContexts.ts"],
4
+ "sourcesContent": ["import {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type TransactionSubset,\n} from \"@ledgerhq/context-module\";\nimport {\n DeviceModelId,\n type DeviceSessionState,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type GetConfigCommandResponse } from \"@api/app-binder/GetConfigCommandTypes\";\nimport { ClearSigningType } from \"@api/model/ClearSigningType\";\nimport { type TransactionOptions } from \"@api/model/TransactionOptions\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport {\n GetWeb3CheckTask,\n type GetWeb3CheckTaskArgs,\n} from \"@internal/app-binder/task/GetWeb3CheckTask\";\nimport { ApplicationChecker } from \"@internal/shared/utils/ApplicationChecker\";\n\nexport const NESTED_CALLDATA_CONTEXT_TYPES_FILTER: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_INFO,\n ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n ClearSignContextType.ENUM,\n ClearSignContextType.PROXY_INFO,\n];\n\nexport const BASE_CONTEXT_TYPES_FILTER: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_INFO,\n ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n ClearSignContextType.PROXY_INFO,\n ClearSignContextType.WEB3_CHECK,\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ClearSignContextType.ENUM,\n ClearSignContextType.TRUSTED_NAME,\n ClearSignContextType.TOKEN,\n ClearSignContextType.NFT,\n ClearSignContextType.PLUGIN,\n ClearSignContextType.EXTERNAL_PLUGIN,\n];\n\nexport type BuildBaseContextsResult = {\n readonly clearSignContexts: ClearSignContextSuccess[];\n readonly clearSignContextsOptional: ClearSignContextSuccess[];\n readonly clearSigningType: ClearSigningType;\n};\n\nexport type BuildBaseContextsArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionOptions;\n readonly appConfig: GetConfigCommandResponse;\n readonly derivationPath: string;\n readonly subset: TransactionSubset;\n readonly transaction?: Uint8Array;\n};\n\n/**\n * Builds the base contexts for a transaction\n * @param api - The internal API\n * @param args - The arguments for the build\n * @param getWeb3ChecksFactory - The factory for the web3 checks\n *\n * returns the base contexts for a transaction, without subcontexts or nested call data contexts\n */\nexport class BuildBaseContexts {\n constructor(\n private readonly _api: InternalApi,\n private readonly _args: BuildBaseContextsArgs,\n private readonly getWeb3ChecksFactory = (\n api: InternalApi,\n args: GetWeb3CheckTaskArgs,\n ) => new GetWeb3CheckTask(api, args),\n ) {}\n\n async run(): Promise<BuildBaseContextsResult> {\n const {\n contextModule,\n options,\n appConfig,\n derivationPath,\n transaction,\n subset,\n } = this._args;\n const isNestedCallData = transaction === undefined;\n const deviceState = this._api.getDeviceSessionState();\n\n // Get challenge (not supported on Nano S)\n let challenge: string | undefined = undefined;\n if (deviceState.deviceModelId !== DeviceModelId.NANO_S) {\n const challengeRes = await this._api.sendCommand(\n new GetChallengeCommand(),\n );\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n }\n }\n\n // Get the clear sign contexts\n const clearSignContexts: ClearSignContext[] =\n await contextModule.getContexts(\n {\n challenge: challenge,\n domain: options.domain,\n deviceModelId: deviceState.deviceModelId,\n ...subset,\n },\n isNestedCallData\n ? NESTED_CALLDATA_CONTEXT_TYPES_FILTER\n : BASE_CONTEXT_TYPES_FILTER,\n );\n\n // Run the web3checks if needed\n if (transaction && appConfig.web3ChecksEnabled) {\n const web3CheckContext = (\n await this.getWeb3ChecksFactory(this._api, {\n contextModule,\n derivationPath,\n subset,\n transaction,\n }).run()\n ).web3Check;\n if (web3CheckContext) {\n clearSignContexts.unshift(web3CheckContext);\n }\n }\n\n // filter out the error contexts\n const contextsSuccess: ClearSignContextSuccess[] = clearSignContexts.filter(\n (context) => context.type !== ClearSignContextType.ERROR,\n );\n\n if (\n this._supportsGenericParser(deviceState, appConfig) &&\n this._hasValidTransactionInfo(contextsSuccess)\n ) {\n return this._getERC7730Contexts(contextsSuccess);\n } else {\n return this._getBasicContexts(contextsSuccess);\n }\n }\n\n private _getERC7730Contexts(\n contexts: ClearSignContextSuccess[],\n ): BuildBaseContextsResult {\n const clearSignContexts: ClearSignContextSuccess[] = contexts\n .filter((context) => this._isContextNeededForERC7730ClearSigning(context))\n .sort(\n (a, b) => this._getContextPriority(a) - this._getContextPriority(b),\n );\n\n const clearSignContextsOptional: ClearSignContextSuccess[] =\n contexts.filter((context) => context.type === ClearSignContextType.ENUM);\n\n return {\n clearSignContexts,\n clearSignContextsOptional,\n clearSigningType: ClearSigningType.EIP7730,\n };\n }\n\n private _getBasicContexts(\n contexts: ClearSignContextSuccess[],\n ): BuildBaseContextsResult {\n const clearSignContexts: ClearSignContextSuccess[] = contexts\n .filter((context) => this._isContextNeededForBasicClearSigning(context))\n .sort(\n (a, b) => this._getContextPriority(a) - this._getContextPriority(b),\n );\n\n return {\n clearSignContexts,\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n };\n }\n\n private _isContextNeededForBasicClearSigning({\n type,\n }: ClearSignContextSuccess): boolean {\n switch (type) {\n case ClearSignContextType.WEB3_CHECK:\n case ClearSignContextType.PLUGIN:\n case ClearSignContextType.EXTERNAL_PLUGIN:\n case ClearSignContextType.DYNAMIC_NETWORK:\n case ClearSignContextType.DYNAMIC_NETWORK_ICON:\n case ClearSignContextType.TRUSTED_NAME:\n case ClearSignContextType.TOKEN:\n case ClearSignContextType.NFT:\n return true;\n case ClearSignContextType.TRANSACTION_INFO:\n case ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:\n case ClearSignContextType.ENUM:\n case ClearSignContextType.PROXY_INFO:\n case ClearSignContextType.SAFE:\n case ClearSignContextType.SIGNER:\n return false;\n default: {\n const uncoveredType: never = type;\n throw new Error(`Unhandled context type ${String(uncoveredType)}`);\n }\n }\n }\n\n private _isContextNeededForERC7730ClearSigning({\n type,\n }: ClearSignContextSuccess): boolean {\n switch (type) {\n case ClearSignContextType.TRANSACTION_INFO:\n case ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:\n case ClearSignContextType.PROXY_INFO:\n case ClearSignContextType.WEB3_CHECK:\n case ClearSignContextType.DYNAMIC_NETWORK:\n case ClearSignContextType.DYNAMIC_NETWORK_ICON:\n return true;\n case ClearSignContextType.ENUM: // enum is needed but as optional\n case ClearSignContextType.TRUSTED_NAME:\n case ClearSignContextType.TOKEN:\n case ClearSignContextType.NFT:\n case ClearSignContextType.PLUGIN:\n case ClearSignContextType.EXTERNAL_PLUGIN:\n case ClearSignContextType.SAFE:\n case ClearSignContextType.SIGNER:\n return false;\n default: {\n const uncoveredType: never = type;\n throw new Error(`Unhandled context type ${String(uncoveredType)}`);\n }\n }\n }\n\n private _hasValidTransactionInfo(\n contexts: ClearSignContextSuccess[],\n ): boolean {\n return (\n contexts.find(\n (context) => context.type === ClearSignContextType.TRANSACTION_INFO,\n )?.certificate !== undefined\n );\n }\n\n private _supportsGenericParser(\n deviceState: DeviceSessionState,\n appConfig: GetConfigCommandResponse,\n ): boolean {\n return new ApplicationChecker(deviceState, appConfig)\n .withMinVersionExclusive(\"1.14.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check();\n }\n\n /**\n * Determines the processing priority of a clear sign context.\n * Lower numbers indicate higher priority (processed first).\n *\n * @param context The clear sign context to get priority for\n * @returns Priority number (lower = higher priority)\n */\n private _getContextPriority({ type }: ClearSignContextSuccess): number {\n switch (type) {\n case ClearSignContextType.WEB3_CHECK:\n return 10;\n case ClearSignContextType.DYNAMIC_NETWORK:\n case ClearSignContextType.DYNAMIC_NETWORK_ICON:\n case ClearSignContextType.PROXY_INFO:\n return 30;\n case ClearSignContextType.TRANSACTION_INFO:\n return 50;\n case ClearSignContextType.PLUGIN:\n case ClearSignContextType.EXTERNAL_PLUGIN:\n case ClearSignContextType.TOKEN:\n case ClearSignContextType.NFT:\n case ClearSignContextType.TRUSTED_NAME:\n case ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:\n case ClearSignContextType.ENUM:\n return 70;\n\n /* not used here */\n case ClearSignContextType.SAFE:\n case ClearSignContextType.SIGNER:\n return 90;\n\n default: {\n const uncoveredType: never = type;\n throw new Error(\n `Unhandled context type for priority: ${String(uncoveredType)}`,\n );\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ClearSignContextType", "DeviceModelId", "isSuccessCommandResult", "ClearSigningType", "GetChallengeCommand", "GetWeb3CheckTask", "ApplicationChecker", "NESTED_CALLDATA_CONTEXT_TYPES_FILTER", "BASE_CONTEXT_TYPES_FILTER", "BuildBaseContexts", "_api", "_args", "getWeb3ChecksFactory", "api", "args", "contextModule", "options", "appConfig", "derivationPath", "transaction", "subset", "isNestedCallData", "deviceState", "challenge", "challengeRes", "clearSignContexts", "web3CheckContext", "contextsSuccess", "context", "contexts", "a", "b", "clearSignContextsOptional", "type", "uncoveredType"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ClearSignContextType as t}from"@ledgerhq/context-module";import{CommandResultFactory as x,DeviceModelId as l,DeviceSessionStateType as r,DeviceStatus as d,hexaStringToBuffer as O,UnknownDeviceExchangeError as m}from"@ledgerhq/device-management-kit";import{Transaction as v}from"ethers";import{ClearSigningType as u}from"../../../api/model/ClearSigningType";import{makeDeviceActionInternalApiMock as N}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BASE_CONTEXT_TYPES_FILTER as y,BuildBaseContexts as s}from"./BuildBaseContexts";import{GetWeb3CheckTask as T}from"./GetWeb3CheckTask";describe("BuildBaseContexts",()=>{const i={getFieldContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn(),getSolanaContext:vi.fn()},E={domain:"domain-name.eth"},g=O(v.from({chainId:1n,nonce:0,data:"0x"}).unsignedSerialized),p={keyUsageNumber:1,payload:new Uint8Array([1,2,3])};let o;const n=N(),c=vi.fn();function S(e){return{blindSigningEnabled:!1,web3ChecksEnabled:e,web3ChecksOptIn:!1,version:"1.13.0"}}beforeEach(()=>{vi.resetAllMocks(),n.sendCommand.mockResolvedValue(x({data:{challenge:"challenge"}})),c.mockReturnValue({run:async()=>Promise.resolve({web3Check:null})}),o={contextModule:i,subset:{chainId:1,to:void 0,data:"0x",selector:"0x"},transaction:g,options:E,appConfig:S(!1),derivationPath:"44'/60'/0'/0/0"}}),it("should init with a default GetWeb3CheckTaskFactory",()=>{const e=new s(n,o);expect(e.getWeb3ChecksFactory).toBeDefined(),expect(e.getWeb3ChecksFactory(n,{contextModule:o.contextModule,derivationPath:o.derivationPath,subset:o.subset,transaction:o.transaction})).toBeInstanceOf(T)}),it("should build the transaction context without clear sign contexts",async()=>{const e=[],a=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,{...o,appConfig:S(!0)},c).run();expect(C).toEqual({clearSignContexts:e,clearSignContextsOptional:a,clearSigningType:u.BASIC})}),it("should build the transaction context with web3checks",async()=>{const e=[],a=[],C={type:t.WEB3_CHECK,payload:"web3Check"};c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:C})}),i.getContexts.mockResolvedValueOnce([...e]),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const h=await new s(n,{...o,appConfig:S(!0)},c).run();expect(h).toEqual({clearSignContexts:[C,...e],clearSignContextsOptional:a,clearSigningType:u.BASIC})}),it("should build the transaction context with web3checks and generic-parser clear sign contexts",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"}],a={type:t.WEB3_CHECK,payload:"web3Check"};c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:a})}),i.getContexts.mockResolvedValueOnce([...e]),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,{...o,appConfig:S(!0)},c).run();expect(C).toEqual({clearSignContexts:[a,e[0],e[1],e[3]],clearSignContextsOptional:[e[2]],clearSigningType:u.EIP7730})}),it("should build the transaction context with web3checks and generic-parser clear sign contexts in the correct order",async()=>{const e=[{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p}],a={type:t.WEB3_CHECK,payload:"web3Check"};c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:a})}),i.getContexts.mockResolvedValueOnce([...e]),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,{...o,appConfig:S(!0)},c).run();expect(C).toEqual({clearSignContexts:[a,e[3],e[1],e[2]],clearSignContextsOptional:[e[0]],clearSigningType:u.EIP7730})}),it("should build the transaction context with clear sign contexts",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.NFT,payload:"payload-2"}],a={type:t.WEB3_CHECK,payload:"web3Check"};c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:a})}),i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,o,c).run();expect(C).toEqual({clearSignContexts:e,clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should build the transaction context with generic-parser context",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0],e[1],e[3]],clearSignContextsOptional:[e[2]],clearSigningType:u.EIP7730})}),it("should build the transaction context with proxy delegate call context",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p},{type:t.PROXY_INFO,payload:"payload-2"}],a=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,o,c).run();expect(C).toEqual({clearSignContexts:[e[1],e[0]],clearSignContextsOptional:a,clearSigningType:u.EIP7730})}),it("should call the web3checks factory with correct parameters",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new s(n,{...o,appConfig:S(!0)},c).run(),expect(c).toHaveBeenCalledWith(n,{contextModule:i,derivationPath:"44'/60'/0'/0/0",subset:o.subset,transaction:g})}),it("should call the context module with the correct parameters",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new s(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:l.FLEX,challenge:"challenge",domain:"domain-name.eth",...o.subset},y)}),it("should call the context module without challenge for Nano S",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.NANO_S,isSecureConnectionAllowed:!1}),await new s(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:l.NANO_S,domain:"domain-name.eth",...o.subset},y)}),it("should call the context module without context on error",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),n.sendCommand.mockResolvedValueOnce(x({error:new m})),await new s(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:l.FLEX,challenge:void 0,domain:"domain-name.eth",...o.subset},y)}),it("should exclude error contexts from the result",async()=>{const e=[{type:t.ERROR,error:new Error("error")},{type:t.TOKEN,payload:"payload-1"},{type:t.ERROR,error:new Error("error")},{type:t.NFT,payload:"payload-2"}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts from the result on old apps",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"transaction_info",certificate:p},{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"transaction_field"},{type:t.NFT,payload:"payload-2"},{type:t.ENUM,payload:"enum",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts from the result if no transaction_info was found",async()=>{const e=[{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"transaction_field"},{type:t.TOKEN,payload:"payload-1"},{type:t.ENUM,payload:"enum",id:1,value:2},{type:t.NFT,payload:"payload-2"}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude legacy contexts from the result for generic-parser transactions",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.EXTERNAL_PLUGIN,payload:"payload-3"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"},{type:t.ENUM,payload:"payload-5",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[e[4]],clearSigningType:u.EIP7730})}),it("should exclude generic-parser contexts with a nano s device",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:l.NANO_S,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts with an old app version",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts with a non ready device",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.Connected,deviceStatus:d.NOT_CONNECTED,deviceModelId:l.FLEX});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should return no clear sign context if the transaction info certificate is missing",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.17.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should not return web3check if the transaction is undefined",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.17.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new s(n,{...o,transaction:void 0},c).run(),expect(c).not.toHaveBeenCalled()})});
2
+ //# sourceMappingURL=BuildBaseContexts.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildBaseContexts.test.ts"],
4
+ "sourcesContent": ["import {\n type ClearSignContext,\n ClearSignContextType,\n type PkiCertificate,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n hexaStringToBuffer,\n UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Transaction } from \"ethers\";\n\nimport type { GetConfigCommandResponse } from \"@api/app-binder/GetConfigCommandTypes\";\nimport { ClearSigningType } from \"@api/model/ClearSigningType\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\n\nimport {\n BASE_CONTEXT_TYPES_FILTER,\n BuildBaseContexts,\n type BuildBaseContextsArgs,\n} from \"./BuildBaseContexts\";\nimport { GetWeb3CheckTask } from \"./GetWeb3CheckTask\";\n\ndescribe(\"BuildBaseContexts\", () => {\n const contextModuleMock = {\n getFieldContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getSolanaContext: vi.fn(),\n };\n const defaultOptions = {\n domain: \"domain-name.eth\",\n };\n const defaultTransaction: Uint8Array = hexaStringToBuffer(\n Transaction.from({\n chainId: 1n,\n nonce: 0,\n data: \"0x\",\n }).unsignedSerialized,\n )!;\n const defaultCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([0x01, 0x02, 0x03]),\n };\n\n let defaultArgs: BuildBaseContextsArgs;\n const apiMock = makeDeviceActionInternalApiMock();\n const getWeb3ChecksFactoryMock = vi.fn();\n\n function createAppConfig(\n web3ChecksEnabled: boolean,\n ): GetConfigCommandResponse {\n return {\n blindSigningEnabled: false,\n web3ChecksEnabled,\n web3ChecksOptIn: false,\n version: \"1.13.0\",\n };\n }\n\n beforeEach(() => {\n vi.resetAllMocks();\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { challenge: \"challenge\" } }),\n );\n getWeb3ChecksFactoryMock.mockReturnValue({\n run: async () => Promise.resolve({ web3Check: null }),\n });\n\n defaultArgs = {\n contextModule: contextModuleMock,\n subset: { chainId: 1, to: undefined, data: \"0x\", selector: \"0x\" },\n transaction: defaultTransaction,\n options: defaultOptions,\n appConfig: createAppConfig(false),\n derivationPath: \"44'/60'/0'/0/0\",\n };\n });\n\n it(\"should init with a default GetWeb3CheckTaskFactory\", () => {\n // GIVEN\n const task = new BuildBaseContexts(apiMock, defaultArgs);\n\n // THEN\n expect(task[\"getWeb3ChecksFactory\"]).toBeDefined();\n expect(\n task[\"getWeb3ChecksFactory\"](apiMock, {\n contextModule: defaultArgs.contextModule,\n derivationPath: defaultArgs.derivationPath,\n subset: defaultArgs.subset,\n transaction: defaultArgs.transaction!,\n }),\n ).toBeInstanceOf(GetWeb3CheckTask);\n });\n\n it(\"should build the transaction context without clear sign contexts\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [];\n const clearSignContextsOptional: ClearSignContext[] = [];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n { ...defaultArgs, appConfig: createAppConfig(true) },\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts,\n clearSignContextsOptional,\n clearSigningType: ClearSigningType.BASIC,\n });\n });\n\n it(\"should build the transaction context with web3checks\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [];\n const clearSignContextsOptional: ClearSignContext[] = [];\n const expectedWeb3Check = {\n type: ClearSignContextType.WEB3_CHECK,\n payload: \"web3Check\",\n };\n getWeb3ChecksFactoryMock.mockReturnValueOnce({\n run: async () => Promise.resolve({ web3Check: expectedWeb3Check }),\n });\n contextModuleMock.getContexts.mockResolvedValueOnce([...clearSignContexts]);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n { ...defaultArgs, appConfig: createAppConfig(true) },\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [expectedWeb3Check, ...clearSignContexts],\n clearSignContextsOptional,\n clearSigningType: ClearSigningType.BASIC,\n });\n });\n\n it(\"should build the transaction context with web3checks and generic-parser clear sign contexts\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n certificate: defaultCertificate,\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n {\n type: ClearSignContextType.ENUM,\n payload: \"payload-3\",\n id: 1,\n value: 2,\n certificate: defaultCertificate,\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-4\",\n },\n ];\n const expectedWeb3Check = {\n type: ClearSignContextType.WEB3_CHECK,\n payload: \"web3Check\",\n };\n getWeb3ChecksFactoryMock.mockReturnValueOnce({\n run: async () => Promise.resolve({ web3Check: expectedWeb3Check }),\n });\n contextModuleMock.getContexts.mockResolvedValueOnce([...clearSignContexts]);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n { ...defaultArgs, appConfig: createAppConfig(true) },\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [\n expectedWeb3Check,\n clearSignContexts[0],\n clearSignContexts[1],\n clearSignContexts[3],\n ],\n clearSignContextsOptional: [clearSignContexts[2]],\n clearSigningType: ClearSigningType.EIP7730,\n });\n });\n\n it(\"should build the transaction context with web3checks and generic-parser clear sign contexts in the correct order\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.ENUM,\n payload: \"payload-3\",\n id: 1,\n value: 2,\n certificate: defaultCertificate,\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-4\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n certificate: defaultCertificate,\n },\n ];\n const expectedWeb3Check = {\n type: ClearSignContextType.WEB3_CHECK,\n payload: \"web3Check\",\n };\n getWeb3ChecksFactoryMock.mockReturnValueOnce({\n run: async () => Promise.resolve({ web3Check: expectedWeb3Check }),\n });\n contextModuleMock.getContexts.mockResolvedValueOnce([...clearSignContexts]);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n { ...defaultArgs, appConfig: createAppConfig(true) },\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [\n expectedWeb3Check, // web3 check\n clearSignContexts[3], // transaction info\n clearSignContexts[1], // transaction field description\n clearSignContexts[2], // transaction field description\n ],\n clearSignContextsOptional: [clearSignContexts[0]], // enum\n clearSigningType: ClearSigningType.EIP7730,\n });\n });\n\n it(\"should build the transaction context with clear sign contexts\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.TOKEN,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.NFT,\n payload: \"payload-2\",\n },\n ];\n const expectedWeb3Check = {\n type: ClearSignContextType.WEB3_CHECK,\n payload: \"web3Check\",\n };\n getWeb3ChecksFactoryMock.mockReturnValueOnce({\n run: async () => Promise.resolve({ web3Check: expectedWeb3Check }),\n });\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts,\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n });\n\n it(\"should build the transaction context with generic-parser context\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n certificate: defaultCertificate,\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n {\n type: ClearSignContextType.ENUM,\n payload: \"payload-3\",\n id: 1,\n value: 2,\n certificate: defaultCertificate,\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-4\",\n },\n ];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [\n clearSignContexts[0],\n clearSignContexts[1],\n clearSignContexts[3],\n ],\n clearSignContextsOptional: [clearSignContexts[2]],\n clearSigningType: ClearSigningType.EIP7730,\n });\n });\n\n it(\"should build the transaction context with proxy delegate call context\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n certificate: defaultCertificate,\n },\n {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"payload-2\",\n },\n ];\n const clearSignContextsOptional: ClearSignContext[] = [];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [clearSignContexts[1], clearSignContexts[0]],\n clearSignContextsOptional,\n clearSigningType: ClearSigningType.EIP7730,\n });\n });\n\n it(\"should call the web3checks factory with correct parameters\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n await new BuildBaseContexts(\n apiMock,\n { ...defaultArgs, appConfig: createAppConfig(true) },\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(getWeb3ChecksFactoryMock).toHaveBeenCalledWith(apiMock, {\n contextModule: contextModuleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n subset: defaultArgs.subset,\n transaction: defaultTransaction,\n });\n });\n\n it(\"should call the context module with the correct parameters\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n {\n deviceModelId: DeviceModelId.FLEX,\n challenge: \"challenge\",\n domain: \"domain-name.eth\",\n ...defaultArgs.subset,\n },\n BASE_CONTEXT_TYPES_FILTER,\n );\n });\n\n it(\"should call the context module without challenge for Nano S\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.NANO_S,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n {\n deviceModelId: DeviceModelId.NANO_S,\n domain: \"domain-name.eth\",\n ...defaultArgs.subset,\n },\n BASE_CONTEXT_TYPES_FILTER,\n );\n });\n\n it(\"should call the context module without context on error\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n apiMock.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ error: new UnknownDeviceExchangeError() }),\n );\n\n // WHEN\n await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n {\n deviceModelId: DeviceModelId.FLEX,\n challenge: undefined,\n domain: \"domain-name.eth\",\n ...defaultArgs.subset,\n },\n BASE_CONTEXT_TYPES_FILTER,\n );\n });\n\n it(\"should exclude error contexts from the result\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\"error\"),\n },\n {\n type: ClearSignContextType.TOKEN,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\"error\"),\n },\n {\n type: ClearSignContextType.NFT,\n payload: \"payload-2\",\n },\n ];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [clearSignContexts[1], clearSignContexts[3]],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n });\n\n it(\"should exclude generic-parser contexts from the result on old apps\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"transaction_info\",\n certificate: defaultCertificate,\n },\n {\n type: ClearSignContextType.TOKEN,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"transaction_field\",\n },\n {\n type: ClearSignContextType.NFT,\n payload: \"payload-2\",\n },\n {\n type: ClearSignContextType.ENUM,\n payload: \"enum\",\n id: 1,\n value: 2,\n certificate: defaultCertificate,\n },\n ];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [clearSignContexts[1], clearSignContexts[3]],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n });\n\n it(\"should exclude generic-parser contexts from the result if no transaction_info was found\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"transaction_field\",\n },\n {\n type: ClearSignContextType.TOKEN,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.ENUM,\n payload: \"enum\",\n id: 1,\n value: 2,\n },\n {\n type: ClearSignContextType.NFT,\n payload: \"payload-2\",\n },\n ];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.14.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [clearSignContexts[1], clearSignContexts[3]],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n });\n\n it(\"should exclude legacy contexts from the result for generic-parser transactions\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.TOKEN,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-2\",\n certificate: defaultCertificate,\n },\n {\n type: ClearSignContextType.EXTERNAL_PLUGIN,\n payload: \"payload-3\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-4\",\n },\n {\n type: ClearSignContextType.ENUM,\n payload: \"payload-5\",\n id: 1,\n value: 2,\n certificate: defaultCertificate,\n },\n ];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [clearSignContexts[1], clearSignContexts[3]],\n clearSignContextsOptional: [clearSignContexts[4]],\n clearSigningType: ClearSigningType.EIP7730,\n });\n });\n\n it(\"should exclude generic-parser contexts with a nano s device\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.TOKEN,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-2\",\n certificate: defaultCertificate,\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-3\",\n },\n {\n type: ClearSignContextType.ENUM,\n payload: \"payload-4\",\n id: 1,\n value: 2,\n certificate: defaultCertificate,\n },\n ];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.14.0\" },\n deviceModelId: DeviceModelId.NANO_S,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [clearSignContexts[0]],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n });\n\n it(\"should exclude generic-parser contexts with an old app version\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.TOKEN,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-2\",\n certificate: defaultCertificate,\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-3\",\n },\n {\n type: ClearSignContextType.ENUM,\n payload: \"payload-4\",\n id: 1,\n value: 2,\n certificate: defaultCertificate,\n },\n ];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [clearSignContexts[0]],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n });\n\n it(\"should exclude generic-parser contexts with a non ready device\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.TOKEN,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-2\",\n certificate: defaultCertificate,\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-3\",\n },\n {\n type: ClearSignContextType.ENUM,\n payload: \"payload-4\",\n id: 1,\n value: 2,\n certificate: defaultCertificate,\n },\n ];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.NOT_CONNECTED,\n deviceModelId: DeviceModelId.FLEX,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [clearSignContexts[0]],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n });\n\n it(\"should return no clear sign context if the transaction info certificate is missing\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n {\n type: ClearSignContextType.ENUM,\n payload: \"payload-3\",\n id: 1,\n value: 2,\n },\n ];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.17.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n const result = await new BuildBaseContexts(\n apiMock,\n defaultArgs,\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n });\n\n it(\"should not return web3check if the transaction is undefined\", async () => {\n // GIVEN\n const clearSignContexts: ClearSignContext[] = [];\n contextModuleMock.getContexts.mockResolvedValueOnce(clearSignContexts);\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.17.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n\n // WHEN\n await new BuildBaseContexts(\n apiMock,\n { ...defaultArgs, transaction: undefined },\n getWeb3ChecksFactoryMock,\n ).run();\n\n // THEN\n expect(getWeb3ChecksFactoryMock).not.toHaveBeenCalled();\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["ClearSignContextType", "CommandResultFactory", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "hexaStringToBuffer", "UnknownDeviceExchangeError", "Transaction", "ClearSigningType", "makeDeviceActionInternalApiMock", "BASE_CONTEXT_TYPES_FILTER", "BuildBaseContexts", "GetWeb3CheckTask", "contextModuleMock", "defaultOptions", "defaultTransaction", "defaultCertificate", "defaultArgs", "apiMock", "getWeb3ChecksFactoryMock", "createAppConfig", "web3ChecksEnabled", "task", "clearSignContexts", "clearSignContextsOptional", "result", "expectedWeb3Check"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as v}from"@ledgerhq/device-management-kit";import{Just as n,Nothing as C}from"purify-ts";import{GetWeb3CheckTask as g}from"../../app-binder/task/GetWeb3CheckTask";import{ApplicationChecker as h}from"../../shared/utils/ApplicationChecker";import{TypedDataValueField as m}from"../../typed-data/model/Types";const f="0x0000000000000000000000000000000000000000";class M{constructor(e,t,p,c,i,r,o=(d,s)=>new g(d,s)){this.api=e;this.contextModule=t;this.parser=p;this.data=c;this.derivationPath=i;this.appConfig=r;this.getWeb3ChecksFactory=o}async run(){let e=null;this.appConfig.web3ChecksEnabled&&(e=(await this.getWeb3ChecksFactory(this.api,{contextModule:this.contextModule,derivationPath:this.derivationPath,data:this.data}).run()).web3Check);const t=this.parser.parse(this.data);if(t.isLeft())throw t.extract();const{types:p,domain:c,message:i}=t.unsafeCoerce();let r=C;const o=this.getClearSignVersion();if(o.isJust()){const s=this.data.domain.verifyingContract?.toLowerCase()||f,y=this.data.domain.chainId||0,u=i.filter(a=>a.value instanceof m).map(a=>({path:a.path,value:a.value.data})),l=await this.contextModule.getTypedDataFilters({verifyingContract:s,chainId:y,version:o.extract(),schema:this.data.types,fieldsValues:u});l.type==="success"&&(r=n(l))}return{web3Check:e,types:p,domain:c,message:i,clearSignContext:r}}getClearSignVersion(){const e=this.api.getDeviceSessionState();return new h(e,this.appConfig).withMinVersionInclusive("1.10.0").excludeDeviceModel(v.NANO_S).check()?new h(e,this.appConfig).withMinVersionInclusive("1.12.0").check()?n("v2"):n("v1"):C}}export{M as BuildEIP712ContextTask,f as ZERO_ADDRESS};
1
+ import{DeviceModelId as f,isSuccessCommandResult as S}from"@ledgerhq/device-management-kit";import{Just as h,Nothing as y}from"purify-ts";import{ClearSigningType as T}from"../../../api/model/ClearSigningType";import{GetChallengeCommand as I}from"../../app-binder/command/GetChallengeCommand";import{BuildFullContextsTask as M}from"../../app-binder/task/BuildFullContextsTask";import{GetWeb3CheckTask as k}from"../../app-binder/task/GetWeb3CheckTask";import{ApplicationChecker as u}from"../../shared/utils/ApplicationChecker";import{TypedDataValueField as P}from"../../typed-data/model/Types";const D="0x0000000000000000000000000000000000000000";class B{constructor(e,t,o,r,s,a,l,p,c=(i,n)=>new k(i,n),v=(i,n)=>new M(i,n)){this.api=e;this.contextModule=t;this.parser=o;this.transactionParser=r;this.transactionMapper=s;this.data=a;this.derivationPath=l;this.appConfig=p;this.getWeb3ChecksFactory=c;this.buildFullContextFactory=v}async run(){let e=null;this.appConfig.web3ChecksEnabled&&(e=(await this.getWeb3ChecksFactory(this.api,{contextModule:this.contextModule,derivationPath:this.derivationPath,data:this.data}).run()).web3Check);const t=this.parser.parse(this.data);if(t.isLeft())throw t.extract();const{types:o,domain:r,message:s}=t.unsafeCoerce(),a=this.api.getDeviceSessionState();let l=y,p={};const c=this.getClearSignVersion(a);if(c.isJust()){let i;const n=await this.api.sendCommand(new I);S(n)&&(i=n.data.challenge);const g=this.data.domain.verifyingContract?.toLowerCase()||D,x=this.data.domain.chainId||0,m=s.filter(d=>d.value instanceof P).map(d=>({path:d.path,value:d.value.data})),C=await this.contextModule.getTypedDataFilters({verifyingContract:g,chainId:x,version:c.extract(),schema:this.data.types,challenge:i,deviceModelId:a.deviceModelId,fieldsValues:m});C.type==="success"&&(l=h(C),p=await this.getCalldatasContexts(a,C))}return{derivationPath:this.derivationPath,web3Check:e,types:o,domain:r,message:s,clearSignContext:l,calldatasContexts:p,deviceModelId:a.deviceModelId}}getClearSignVersion(e){return new u(e,this.appConfig).withMinVersionInclusive("1.10.0").excludeDeviceModel(f.NANO_S).check()?new u(e,this.appConfig).withMinVersionInclusive("1.12.0").check()?h("v2"):h("v1"):y}async getCalldatasContexts(e,t){const o={};for(const r in t.calldatas){const{subset:s}=t.calldatas[r],a=await this.buildFullContextFactory(this.api,{contextModule:this.contextModule,mapper:this.transactionMapper,parser:this.transactionParser,options:{},appConfig:this.appConfig,derivationPath:this.derivationPath,subset:s,deviceModelId:e.deviceModelId}).run();a.clearSigningType===T.EIP7730&&(o[r]=a.clearSignContexts)}return o}}export{B as BuildEIP712ContextTask,D as ZERO_ADDRESS};
2
2
  //# sourceMappingURL=BuildEIP712ContextTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildEIP712ContextTask.ts"],
4
- "sourcesContent": ["import {\n type ClearSignContextSuccess,\n type ClearSignContextType,\n type ContextModule,\n type TypedDataClearSignContextSuccess,\n} from \"@ledgerhq/context-module\";\nimport {\n DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, type Maybe, Nothing } from \"purify-ts\";\n\nimport { type GetConfigCommandResponse } from \"@api/app-binder/GetConfigCommandTypes\";\nimport { type TypedData } from \"@api/model/TypedData\";\nimport {\n GetWeb3CheckTask,\n type GetWeb3CheckTaskArgs,\n} from \"@internal/app-binder/task/GetWeb3CheckTask\";\nimport { type ProvideEIP712ContextTaskArgs } from \"@internal/app-binder/task/ProvideEIP712ContextTask\";\nimport { ApplicationChecker } from \"@internal/shared/utils/ApplicationChecker\";\nimport { TypedDataValueField } from \"@internal/typed-data/model/Types\";\nimport { type TypedDataParserService } from \"@internal/typed-data/service/TypedDataParserService\";\n\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport class BuildEIP712ContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly contextModule: ContextModule,\n private readonly parser: TypedDataParserService,\n private readonly data: TypedData,\n private readonly derivationPath: string,\n private readonly appConfig: GetConfigCommandResponse,\n private readonly getWeb3ChecksFactory = (\n api: InternalApi,\n args: GetWeb3CheckTaskArgs,\n ) => new GetWeb3CheckTask(api, args),\n ) {}\n\n async run(): Promise<ProvideEIP712ContextTaskArgs> {\n // Run the web3checks if needed\n let web3Check: ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK> | null =\n null;\n if (this.appConfig.web3ChecksEnabled) {\n web3Check = (\n await this.getWeb3ChecksFactory(this.api, {\n contextModule: this.contextModule,\n derivationPath: this.derivationPath,\n data: this.data,\n }).run()\n ).web3Check;\n }\n\n // Clear signing context\n // Parse the message types and values\n const parsed = this.parser.parse(this.data);\n if (parsed.isLeft()) {\n throw parsed.extract();\n }\n const { types, domain, message } = parsed.unsafeCoerce();\n\n // Get clear signing context, if any\n let clearSignContext: Maybe<TypedDataClearSignContextSuccess> = Nothing;\n const version = this.getClearSignVersion();\n if (version.isJust()) {\n const verifyingContract =\n this.data.domain.verifyingContract?.toLowerCase() || ZERO_ADDRESS;\n const chainId = this.data.domain.chainId || 0;\n const fieldsValues = message\n .filter((v) => v.value instanceof TypedDataValueField)\n .map((v) => ({\n path: v.path,\n value: (v.value as TypedDataValueField).data,\n }));\n const filters = await this.contextModule.getTypedDataFilters({\n verifyingContract,\n chainId,\n version: version.extract(),\n schema: this.data.types,\n fieldsValues,\n });\n if (filters.type === \"success\") {\n clearSignContext = Just(filters);\n }\n }\n\n // Return the args for provide context task\n const provideTaskArgs: ProvideEIP712ContextTaskArgs = {\n web3Check,\n types,\n domain,\n message,\n clearSignContext,\n };\n return provideTaskArgs;\n }\n\n private getClearSignVersion(): Maybe<\"v1\" | \"v2\"> {\n const deviceState = this.api.getDeviceSessionState();\n if (\n !new ApplicationChecker(deviceState, this.appConfig)\n .withMinVersionInclusive(\"1.10.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check()\n ) {\n return Nothing;\n }\n\n // EIP712 v2 (amount & datetime filters) supported since 1.11.0:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#1110-1\n // But some issues were still present until 1.12.0 among which:\n // * V2 descriptor with missing token not supported by the app\n // * Empty arrays with filters not correctly handled\n // * Trusted name filters not yet released\n // Therefore it's safer and easier to use V1 filters before 1.12.0:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#1120\n const shouldUseV2Filters = new ApplicationChecker(\n deviceState,\n this.appConfig,\n )\n .withMinVersionInclusive(\"1.12.0\")\n .check();\n return shouldUseV2Filters ? Just(\"v2\") : Just(\"v1\");\n }\n}\n"],
5
- "mappings": "AAMA,OACE,iBAAAA,MAEK,kCACP,OAAS,QAAAC,EAAkB,WAAAC,MAAe,YAI1C,OACE,oBAAAC,MAEK,6CAEP,OAAS,sBAAAC,MAA0B,4CACnC,OAAS,uBAAAC,MAA2B,mCAG7B,MAAMC,EAAe,6CAErB,MAAMC,CAAuB,CAClC,YACmBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAuB,CACtCN,EACAO,IACG,IAAIZ,EAAiBK,EAAKO,CAAI,EACnC,CAViB,SAAAP,EACA,mBAAAC,EACA,YAAAC,EACA,UAAAC,EACA,oBAAAC,EACA,eAAAC,EACA,0BAAAC,CAIhB,CAEH,MAAM,KAA6C,CAEjD,IAAIE,EACF,KACE,KAAK,UAAU,oBACjBA,GACE,MAAM,KAAK,qBAAqB,KAAK,IAAK,CACxC,cAAe,KAAK,cACpB,eAAgB,KAAK,eACrB,KAAM,KAAK,IACb,CAAC,EAAE,IAAI,GACP,WAKJ,MAAMC,EAAS,KAAK,OAAO,MAAM,KAAK,IAAI,EAC1C,GAAIA,EAAO,OAAO,EAChB,MAAMA,EAAO,QAAQ,EAEvB,KAAM,CAAE,MAAAC,EAAO,OAAAC,EAAQ,QAAAC,CAAQ,EAAIH,EAAO,aAAa,EAGvD,IAAII,EAA4DnB,EAChE,MAAMoB,EAAU,KAAK,oBAAoB,EACzC,GAAIA,EAAQ,OAAO,EAAG,CACpB,MAAMC,EACJ,KAAK,KAAK,OAAO,mBAAmB,YAAY,GAAKjB,EACjDkB,EAAU,KAAK,KAAK,OAAO,SAAW,EACtCC,EAAeL,EAClB,OAAQM,GAAMA,EAAE,iBAAiBrB,CAAmB,EACpD,IAAKqB,IAAO,CACX,KAAMA,EAAE,KACR,MAAQA,EAAE,MAA8B,IAC1C,EAAE,EACEC,EAAU,MAAM,KAAK,cAAc,oBAAoB,CAC3D,kBAAAJ,EACA,QAAAC,EACA,QAASF,EAAQ,QAAQ,EACzB,OAAQ,KAAK,KAAK,MAClB,aAAAG,CACF,CAAC,EACGE,EAAQ,OAAS,YACnBN,EAAmBpB,EAAK0B,CAAO,EAEnC,CAUA,MAPsD,CACpD,UAAAX,EACA,MAAAE,EACA,OAAAC,EACA,QAAAC,EACA,iBAAAC,CACF,CAEF,CAEQ,qBAA0C,CAChD,MAAMO,EAAc,KAAK,IAAI,sBAAsB,EACnD,OACG,IAAIxB,EAAmBwB,EAAa,KAAK,SAAS,EAChD,wBAAwB,QAAQ,EAChC,mBAAmB5B,EAAc,MAAM,EACvC,MAAM,EAagB,IAAII,EAC7BwB,EACA,KAAK,SACP,EACG,wBAAwB,QAAQ,EAChC,MAAM,EACmB3B,EAAK,IAAI,EAAIA,EAAK,IAAI,EAjBzCC,CAkBX,CACF",
6
- "names": ["DeviceModelId", "Just", "Nothing", "GetWeb3CheckTask", "ApplicationChecker", "TypedDataValueField", "ZERO_ADDRESS", "BuildEIP712ContextTask", "api", "contextModule", "parser", "data", "derivationPath", "appConfig", "getWeb3ChecksFactory", "args", "web3Check", "parsed", "types", "domain", "message", "clearSignContext", "version", "verifyingContract", "chainId", "fieldsValues", "v", "filters", "deviceState"]
4
+ "sourcesContent": ["import {\n type ClearSignContextSuccess,\n type ClearSignContextType,\n type ContextModule,\n type TypedDataCalldataIndex,\n type TypedDataClearSignContextSuccess,\n} from \"@ledgerhq/context-module\";\nimport {\n DeviceModelId,\n type DeviceSessionState,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, type Maybe, Nothing } from \"purify-ts\";\n\nimport { type GetConfigCommandResponse } from \"@api/app-binder/GetConfigCommandTypes\";\nimport { ClearSigningType } from \"@api/model/ClearSigningType\";\nimport { type TypedData } from \"@api/model/TypedData\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport {\n BuildFullContextsTask,\n type BuildFullContextsTaskArgs,\n type ContextWithSubContexts,\n} from \"@internal/app-binder/task/BuildFullContextsTask\";\nimport {\n GetWeb3CheckTask,\n type GetWeb3CheckTaskArgs,\n} from \"@internal/app-binder/task/GetWeb3CheckTask\";\nimport { type ProvideEIP712ContextTaskArgs } from \"@internal/app-binder/task/ProvideEIP712ContextTask\";\nimport { ApplicationChecker } from \"@internal/shared/utils/ApplicationChecker\";\nimport { type TransactionMapperService } from \"@internal/transaction/service/mapper/TransactionMapperService\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\nimport { TypedDataValueField } from \"@internal/typed-data/model/Types\";\nimport { type TypedDataParserService } from \"@internal/typed-data/service/TypedDataParserService\";\n\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport class BuildEIP712ContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly contextModule: ContextModule,\n private readonly parser: TypedDataParserService,\n private readonly transactionParser: TransactionParserService,\n private readonly transactionMapper: TransactionMapperService,\n private readonly data: TypedData,\n private readonly derivationPath: string,\n private readonly appConfig: GetConfigCommandResponse,\n private readonly getWeb3ChecksFactory = (\n api: InternalApi,\n args: GetWeb3CheckTaskArgs,\n ) => new GetWeb3CheckTask(api, args),\n private readonly buildFullContextFactory = (\n api: InternalApi,\n args: BuildFullContextsTaskArgs,\n ) => new BuildFullContextsTask(api, args),\n ) {}\n\n async run(): Promise<ProvideEIP712ContextTaskArgs> {\n // Run the web3checks if needed\n let web3Check: ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK> | null =\n null;\n if (this.appConfig.web3ChecksEnabled) {\n web3Check = (\n await this.getWeb3ChecksFactory(this.api, {\n contextModule: this.contextModule,\n derivationPath: this.derivationPath,\n data: this.data,\n }).run()\n ).web3Check;\n }\n\n // Clear signing context\n // Parse the message types and values\n const parsed = this.parser.parse(this.data);\n if (parsed.isLeft()) {\n throw parsed.extract();\n }\n const { types, domain, message } = parsed.unsafeCoerce();\n\n // Get clear signing context, if any\n const deviceState = this.api.getDeviceSessionState();\n let clearSignContext: Maybe<TypedDataClearSignContextSuccess> = Nothing;\n let calldatasContexts: Record<\n TypedDataCalldataIndex,\n ContextWithSubContexts[]\n > = {};\n const version = this.getClearSignVersion(deviceState);\n if (version.isJust()) {\n // Get challenge\n let challenge: string | undefined = undefined;\n const challengeRes = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n }\n\n // Get filters\n const verifyingContract =\n this.data.domain.verifyingContract?.toLowerCase() || ZERO_ADDRESS;\n const chainId = this.data.domain.chainId || 0;\n const fieldsValues = message\n .filter((v) => v.value instanceof TypedDataValueField)\n .map((v) => ({\n path: v.path,\n value: (v.value as TypedDataValueField).data,\n }));\n const filters = await this.contextModule.getTypedDataFilters({\n verifyingContract,\n chainId,\n version: version.extract(),\n schema: this.data.types,\n challenge,\n deviceModelId: deviceState.deviceModelId,\n fieldsValues,\n });\n if (filters.type === \"success\") {\n clearSignContext = Just(filters);\n calldatasContexts = await this.getCalldatasContexts(\n deviceState,\n filters,\n );\n }\n }\n\n // Return the args for provide context task\n const provideTaskArgs: ProvideEIP712ContextTaskArgs = {\n derivationPath: this.derivationPath,\n web3Check,\n types,\n domain,\n message,\n clearSignContext,\n calldatasContexts,\n deviceModelId: deviceState.deviceModelId,\n };\n return provideTaskArgs;\n }\n\n private getClearSignVersion(\n deviceState: DeviceSessionState,\n ): Maybe<\"v1\" | \"v2\"> {\n if (\n !new ApplicationChecker(deviceState, this.appConfig)\n .withMinVersionInclusive(\"1.10.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check()\n ) {\n return Nothing;\n }\n\n // EIP712 v2 (amount & datetime filters) supported since 1.11.0:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#1110-1\n // But some issues were still present until 1.12.0 among which:\n // * V2 descriptor with missing token not supported by the app\n // * Empty arrays with filters not correctly handled\n // * Trusted name filters not yet released\n // Therefore it's safer and easier to use V1 filters before 1.12.0:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#1120\n const shouldUseV2Filters = new ApplicationChecker(\n deviceState,\n this.appConfig,\n )\n .withMinVersionInclusive(\"1.12.0\")\n .check();\n return shouldUseV2Filters ? Just(\"v2\") : Just(\"v1\");\n }\n\n private async getCalldatasContexts(\n deviceState: DeviceSessionState,\n filters: TypedDataClearSignContextSuccess,\n ): Promise<Record<TypedDataCalldataIndex, ContextWithSubContexts[]>> {\n const calldatasContexts: Record<\n TypedDataCalldataIndex,\n ContextWithSubContexts[]\n > = {};\n for (const calldataIndex in filters.calldatas) {\n const { subset } = filters.calldatas[calldataIndex]!;\n const calldataContext = await this.buildFullContextFactory(this.api, {\n contextModule: this.contextModule,\n mapper: this.transactionMapper,\n parser: this.transactionParser,\n options: {},\n appConfig: this.appConfig,\n derivationPath: this.derivationPath,\n subset,\n deviceModelId: deviceState.deviceModelId,\n }).run();\n if (calldataContext.clearSigningType === ClearSigningType.EIP7730) {\n calldatasContexts[calldataIndex] = calldataContext.clearSignContexts;\n }\n }\n return calldatasContexts;\n }\n}\n"],
5
+ "mappings": "AAOA,OACE,iBAAAA,EAGA,0BAAAC,MACK,kCACP,OAAS,QAAAC,EAAkB,WAAAC,MAAe,YAG1C,OAAS,oBAAAC,MAAwB,8BAEjC,OAAS,uBAAAC,MAA2B,mDACpC,OACE,yBAAAC,MAGK,kDACP,OACE,oBAAAC,MAEK,6CAEP,OAAS,sBAAAC,MAA0B,4CAGnC,OAAS,uBAAAC,MAA2B,mCAG7B,MAAMC,EAAe,6CAErB,MAAMC,CAAuB,CAClC,YACmBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAuB,CACtCR,EACAS,IACG,IAAId,EAAiBK,EAAKS,CAAI,EAClBC,EAA0B,CACzCV,EACAS,IACG,IAAIf,EAAsBM,EAAKS,CAAI,EACxC,CAhBiB,SAAAT,EACA,mBAAAC,EACA,YAAAC,EACA,uBAAAC,EACA,uBAAAC,EACA,UAAAC,EACA,oBAAAC,EACA,eAAAC,EACA,0BAAAC,EAIA,6BAAAE,CAIhB,CAEH,MAAM,KAA6C,CAEjD,IAAIC,EACF,KACE,KAAK,UAAU,oBACjBA,GACE,MAAM,KAAK,qBAAqB,KAAK,IAAK,CACxC,cAAe,KAAK,cACpB,eAAgB,KAAK,eACrB,KAAM,KAAK,IACb,CAAC,EAAE,IAAI,GACP,WAKJ,MAAMC,EAAS,KAAK,OAAO,MAAM,KAAK,IAAI,EAC1C,GAAIA,EAAO,OAAO,EAChB,MAAMA,EAAO,QAAQ,EAEvB,KAAM,CAAE,MAAAC,EAAO,OAAAC,EAAQ,QAAAC,CAAQ,EAAIH,EAAO,aAAa,EAGjDI,EAAc,KAAK,IAAI,sBAAsB,EACnD,IAAIC,EAA4D1B,EAC5D2B,EAGA,CAAC,EACL,MAAMC,EAAU,KAAK,oBAAoBH,CAAW,EACpD,GAAIG,EAAQ,OAAO,EAAG,CAEpB,IAAIC,EACJ,MAAMC,EAAe,MAAM,KAAK,IAAI,YAClC,IAAI5B,CACN,EACIJ,EAAuBgC,CAAY,IACrCD,EAAYC,EAAa,KAAK,WAIhC,MAAMC,EACJ,KAAK,KAAK,OAAO,mBAAmB,YAAY,GAAKxB,EACjDyB,EAAU,KAAK,KAAK,OAAO,SAAW,EACtCC,EAAeT,EAClB,OAAQU,GAAMA,EAAE,iBAAiB5B,CAAmB,EACpD,IAAK4B,IAAO,CACX,KAAMA,EAAE,KACR,MAAQA,EAAE,MAA8B,IAC1C,EAAE,EACEC,EAAU,MAAM,KAAK,cAAc,oBAAoB,CAC3D,kBAAAJ,EACA,QAAAC,EACA,QAASJ,EAAQ,QAAQ,EACzB,OAAQ,KAAK,KAAK,MAClB,UAAAC,EACA,cAAeJ,EAAY,cAC3B,aAAAQ,CACF,CAAC,EACGE,EAAQ,OAAS,YACnBT,EAAmB3B,EAAKoC,CAAO,EAC/BR,EAAoB,MAAM,KAAK,qBAC7BF,EACAU,CACF,EAEJ,CAaA,MAVsD,CACpD,eAAgB,KAAK,eACrB,UAAAf,EACA,MAAAE,EACA,OAAAC,EACA,QAAAC,EACA,iBAAAE,EACA,kBAAAC,EACA,cAAeF,EAAY,aAC7B,CAEF,CAEQ,oBACNA,EACoB,CACpB,OACG,IAAIpB,EAAmBoB,EAAa,KAAK,SAAS,EAChD,wBAAwB,QAAQ,EAChC,mBAAmB5B,EAAc,MAAM,EACvC,MAAM,EAagB,IAAIQ,EAC7BoB,EACA,KAAK,SACP,EACG,wBAAwB,QAAQ,EAChC,MAAM,EACmB1B,EAAK,IAAI,EAAIA,EAAK,IAAI,EAjBzCC,CAkBX,CAEA,MAAc,qBACZyB,EACAU,EACmE,CACnE,MAAMR,EAGF,CAAC,EACL,UAAWS,KAAiBD,EAAQ,UAAW,CAC7C,KAAM,CAAE,OAAAE,CAAO,EAAIF,EAAQ,UAAUC,CAAa,EAC5CE,EAAkB,MAAM,KAAK,wBAAwB,KAAK,IAAK,CACnE,cAAe,KAAK,cACpB,OAAQ,KAAK,kBACb,OAAQ,KAAK,kBACb,QAAS,CAAC,EACV,UAAW,KAAK,UAChB,eAAgB,KAAK,eACrB,OAAAD,EACA,cAAeZ,EAAY,aAC7B,CAAC,EAAE,IAAI,EACHa,EAAgB,mBAAqBrC,EAAiB,UACxD0B,EAAkBS,CAAa,EAAIE,EAAgB,kBAEvD,CACA,OAAOX,CACT,CACF",
6
+ "names": ["DeviceModelId", "isSuccessCommandResult", "Just", "Nothing", "ClearSigningType", "GetChallengeCommand", "BuildFullContextsTask", "GetWeb3CheckTask", "ApplicationChecker", "TypedDataValueField", "ZERO_ADDRESS", "BuildEIP712ContextTask", "api", "contextModule", "parser", "transactionParser", "transactionMapper", "data", "derivationPath", "appConfig", "getWeb3ChecksFactory", "args", "buildFullContextFactory", "web3Check", "parsed", "types", "domain", "message", "deviceState", "clearSignContext", "calldatasContexts", "version", "challenge", "challengeRes", "verifyingContract", "chainId", "fieldsValues", "v", "filters", "calldataIndex", "subset", "calldataContext"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as C,DeviceSessionStateType as y,DeviceStatus as g}from"@ledgerhq/device-management-kit";import{Just as u,Left as k,Nothing as h,Right as S}from"purify-ts";import{makeDeviceActionInternalApiMock as w}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{PrimitiveType as p,StructType as E,TypedDataValueField as v,TypedDataValueRoot as b}from"../../typed-data/model/Types";import{BuildEIP712ContextTask as m}from"./BuildEIP712ContextTask";describe("BuildEIP712ContextTask",()=>{const a=w(),t={getContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn(),getSolanaContext:vi.fn()},n={parse:vi.fn()},i=vi.fn();function d(e){return{blindSigningEnabled:!1,web3ChecksEnabled:e,web3ChecksOptIn:!1,version:"1.13.0"}}const s={domain:{name:"Permit2",chainId:137,verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3"},primaryType:"PermitSingle",message:{details:{token:"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619",amount:"69420000000000000000",expiration:"1718184249",nonce:"0"},spender:"0xec7be89e9d109e7e3fec59c222cf297125fefda2",sigDeadline:"1715594049"},types:{PermitSingle:[{name:"details",type:"PermitDetails"},{name:"spender",type:"address"},{name:"sigDeadline",type:"uint256"}],PermitDetails:[{name:"token",type:"address"},{name:"amount",type:"uint"},{name:"expiration",type:"uint"},{name:"nonce",type:"uint"}]}},c={PermitSingle:{details:new E("PermitDetails"),spender:new p("address","address",h),sigDeadline:new p("uint256","uint",u(32))},PermitDetails:{token:new p("address","address",h),amount:new p("uint160","uint",u(20)),expiration:new p("uint48","uint",u(6)),nonce:new p("uint48","uint",u(6))}},r=[{path:"",type:"",value:new b("EIP712Domain")},{path:"chainId",type:"uint256",value:new v(Uint8Array.from([137]))}],l=[{path:"",type:"",value:new b("PermitSingle")},{path:"details.amount",type:"uint160",value:new v(Uint8Array.from([18]))},{path:"details.expiration",type:"uint48",value:new v(Uint8Array.from([19]))}],f={type:"success",messageInfo:{displayName:"Permit2",filtersCount:1,signature:"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3"},trustedNamesAddresses:{},tokens:{},filters:{"details.amount":{displayName:"Amount allowance",path:"details.amount",signature:"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3",tokenIndex:255,type:"amount"}}};beforeEach(()=>{vi.resetAllMocks(),i.mockReturnValue({run:async()=>({web3Check:null})})}),it("Build context with clear signing context not supported by the device",async()=>{const e=new m(a,t,n,s,"44'/60'/0'/0/0",d(!1),i);n.parse.mockReturnValueOnce(S({types:c,domain:r,message:l})),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:y.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.11.0"},deviceModelId:C.NANO_S,isSecureConnectionAllowed:!1});const o=await e.run();expect(o).toStrictEqual({web3Check:null,types:c,domain:r,message:l,clearSignContext:h})}),it("Build context with no clear signing context",async()=>{const e=new m(a,t,n,s,"44'/60'/0'/0/0",d(!1),i);n.parse.mockReturnValueOnce(S({types:c,domain:r,message:l})),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:y.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:C.FLEX,isSecureConnectionAllowed:!1}),t.getTypedDataFilters.mockResolvedValueOnce({type:"error",error:new Error("no filter")});const o=await e.run();expect(o).toStrictEqual({web3Check:null,types:c,domain:r,message:l,clearSignContext:h})}),it("Build context with clear signing context",async()=>{const e="web3Check",o=new m(a,t,n,s,"44'/60'/0'/0/0",d(!1),i);i.mockReturnValueOnce({run:async()=>({web3Check:e})}),n.parse.mockReturnValueOnce(S({types:c,domain:r,message:l})),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:y.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:C.FLEX,isSecureConnectionAllowed:!1}),t.getTypedDataFilters.mockResolvedValueOnce(f);const x=await o.run();expect(x).toStrictEqual({web3Check:null,types:c,domain:r,message:l,clearSignContext:u(f)}),expect(n.parse).toHaveBeenCalledWith(s),expect(t.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v2",schema:s.types,fieldsValues:[{path:"details.amount",value:Uint8Array.from([18])},{path:"details.expiration",value:Uint8Array.from([19])}]})}),it("Build context with clear signing context and web3Check",async()=>{const e="web3Check",o=new m(a,t,n,s,"44'/60'/0'/0/0",d(!0),i);i.mockReturnValueOnce({run:async()=>({web3Check:e})}),n.parse.mockReturnValueOnce(S({types:c,domain:r,message:l})),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:y.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:C.FLEX,isSecureConnectionAllowed:!1}),t.getTypedDataFilters.mockResolvedValueOnce(f);const x=await o.run();expect(x).toStrictEqual({web3Check:e,types:c,domain:r,message:l,clearSignContext:u(f)}),expect(i).toHaveBeenCalledWith(a,{contextModule:t,derivationPath:"44'/60'/0'/0/0",data:s})}),it("Build context with clear signing context V1",async()=>{const e=new m(a,t,n,s,"44'/60'/0'/0/0",d(!1),i);n.parse.mockReturnValueOnce(S({types:c,domain:r,message:l})),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:y.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.11.0"},deviceModelId:C.FLEX,isSecureConnectionAllowed:!1}),t.getTypedDataFilters.mockResolvedValueOnce(f),await e.run(),expect(t.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v1",schema:s.types,fieldsValues:[{path:"details.amount",value:Uint8Array.from([18])},{path:"details.expiration",value:Uint8Array.from([19])}]})}),it("Should throw an error if parsing fails",async()=>{const e=new m(a,t,n,s,"44'/60'/0'/0/0",d(!1),i);n.parse.mockReturnValueOnce(k(new Error("Parsing error")));try{await e.run()}catch(o){expect(o).toBeInstanceOf(Error),expect(o.message).toBe("Parsing error")}})});
1
+ import{TypedDataCalldataParamPresence as w}from"@ledgerhq/context-module";import{CommandResultFactory as I,DeviceModelId as s,DeviceSessionStateType as v,DeviceStatus as x}from"@ledgerhq/device-management-kit";import{Just as C,Left as O,Nothing as k,Right as b}from"purify-ts";import{ClearSigningType as A}from"../../../api/model/ClearSigningType";import{makeDeviceActionInternalApiMock as P}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{PrimitiveType as h,StructType as V,TypedDataValueField as E,TypedDataValueRoot as D}from"../../typed-data/model/Types";import{BuildEIP712ContextTask as g}from"./BuildEIP712ContextTask";describe("BuildEIP712ContextTask",()=>{const e=P(),a={getFieldContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn(),getSolanaContext:vi.fn()},n={parse:vi.fn()},p={extractValue:vi.fn()},m={mapTransactionToSubset:vi.fn()},o=vi.fn(),u=vi.fn();function f(t){return{blindSigningEnabled:!1,web3ChecksEnabled:t,web3ChecksOptIn:!1,version:"1.13.0"}}const c={domain:{name:"Permit2",chainId:137,verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3"},primaryType:"PermitSingle",message:{details:{token:"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619",amount:"69420000000000000000",expiration:"1718184249",nonce:"0"},spender:"0xec7be89e9d109e7e3fec59c222cf297125fefda2",sigDeadline:"1715594049"},types:{PermitSingle:[{name:"details",type:"PermitDetails"},{name:"spender",type:"address"},{name:"sigDeadline",type:"uint256"}],PermitDetails:[{name:"token",type:"address"},{name:"amount",type:"uint"},{name:"expiration",type:"uint"},{name:"nonce",type:"uint"}]}},r={PermitSingle:{details:new V("PermitDetails"),spender:new h("address","address",k),sigDeadline:new h("uint256","uint",C(32))},PermitDetails:{token:new h("address","address",k),amount:new h("uint160","uint",C(20)),expiration:new h("uint48","uint",C(6)),nonce:new h("uint48","uint",C(6))}},l=[{path:"",type:"",value:new D("EIP712Domain")},{path:"chainId",type:"uint256",value:new E(Uint8Array.from([137]))}],d=[{path:"",type:"",value:new D("PermitSingle")},{path:"details.amount",type:"uint160",value:new E(Uint8Array.from([18]))},{path:"details.expiration",type:"uint48",value:new E(Uint8Array.from([19]))}],y={type:"success",messageInfo:{displayName:"Permit2",filtersCount:1,signature:"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3"},trustedNamesAddresses:{},tokens:{},calldatas:{},proxy:void 0,filters:{"details.amount":{displayName:"Amount allowance",path:"details.amount",signature:"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3",tokenIndex:255,type:"amount"}}},T="0x1234";beforeEach(()=>{vi.resetAllMocks(),o.mockReturnValue({run:async()=>({web3Check:null})}),u.mockReturnValue({run:async()=>({clearSignContexts:[],clearSigningType:A.BASIC})}),e.sendCommand.mockResolvedValue(I({data:{challenge:T}}))}),it("Build context with clear signing context not supported by the device",async()=>{const t=new g(e,a,n,p,m,c,"44'/60'/0'/0/0",f(!1),o,u);n.parse.mockReturnValueOnce(b({types:r,domain:l,message:d})),e.getDeviceSessionState.mockReturnValueOnce({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:x.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.11.0"},deviceModelId:s.NANO_S,isSecureConnectionAllowed:!1});const i=await t.run();expect(i).toStrictEqual({deviceModelId:s.NANO_S,derivationPath:"44'/60'/0'/0/0",web3Check:null,types:r,domain:l,message:d,clearSignContext:k,calldatasContexts:{}})}),it("Build context with no clear signing context",async()=>{const t=new g(e,a,n,p,m,c,"44'/60'/0'/0/0",f(!1),o,u);n.parse.mockReturnValueOnce(b({types:r,domain:l,message:d})),e.getDeviceSessionState.mockReturnValueOnce({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:x.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1}),a.getTypedDataFilters.mockResolvedValueOnce({type:"error",error:new Error("no filter")});const i=await t.run();expect(i).toStrictEqual({deviceModelId:s.FLEX,derivationPath:"44'/60'/0'/0/0",web3Check:null,types:r,domain:l,message:d,clearSignContext:k,calldatasContexts:{}})}),it("Build context with clear signing context",async()=>{const t="web3Check",i=new g(e,a,n,p,m,c,"44'/60'/0'/0/0",f(!1),o,u);o.mockReturnValueOnce({run:async()=>({web3Check:t})}),n.parse.mockReturnValueOnce(b({types:r,domain:l,message:d})),e.getDeviceSessionState.mockReturnValueOnce({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:x.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1}),a.getTypedDataFilters.mockResolvedValueOnce(y);const S=await i.run();expect(S).toStrictEqual({deviceModelId:s.FLEX,derivationPath:"44'/60'/0'/0/0",web3Check:null,types:r,domain:l,message:d,clearSignContext:C(y),calldatasContexts:{}}),expect(n.parse).toHaveBeenCalledWith(c),expect(a.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v2",schema:c.types,challenge:T,deviceModelId:s.FLEX,fieldsValues:[{path:"details.amount",value:Uint8Array.from([18])},{path:"details.expiration",value:Uint8Array.from([19])}]})}),it("Build context with clear signing context and web3Check",async()=>{const t="web3Check",i=new g(e,a,n,p,m,c,"44'/60'/0'/0/0",f(!0),o,u);o.mockReturnValueOnce({run:async()=>({web3Check:t})}),n.parse.mockReturnValueOnce(b({types:r,domain:l,message:d})),e.getDeviceSessionState.mockReturnValueOnce({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:x.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1}),a.getTypedDataFilters.mockResolvedValueOnce(y);const S=await i.run();expect(S).toStrictEqual({deviceModelId:s.FLEX,derivationPath:"44'/60'/0'/0/0",web3Check:t,types:r,domain:l,message:d,clearSignContext:C(y),calldatasContexts:{}}),expect(o).toHaveBeenCalledWith(e,{contextModule:a,derivationPath:"44'/60'/0'/0/0",data:c})}),it("Build context with clear signing context V1",async()=>{const t=new g(e,a,n,p,m,c,"44'/60'/0'/0/0",f(!1),o,u);n.parse.mockReturnValueOnce(b({types:r,domain:l,message:d})),e.getDeviceSessionState.mockReturnValueOnce({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:x.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.11.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1}),a.getTypedDataFilters.mockResolvedValueOnce(y),await t.run(),expect(a.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v1",schema:c.types,challenge:T,deviceModelId:s.FLEX,fieldsValues:[{path:"details.amount",value:Uint8Array.from([18])},{path:"details.expiration",value:Uint8Array.from([19])}]})}),it("Build context with clear signing context and calldatas",async()=>{const t=new g(e,a,n,p,m,c,"44'/60'/0'/0/0",f(!1),o,u),i={chainId:4660,data:"0x6a76120200000000000000000000000023f8abfc2824c397ccb3da89ae772984107ddb99",from:"0x8ceb23fd6bc0add59e62ac25578270cff1b9f619",selector:"0x778899aa",to:"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619",value:4200000000000000n},S={...y,calldatas:{0:{filter:{calldataIndex:0,displayName:"Transaction",valueFlag:!0,calleeFlag:w.Present,chainIdFlag:!1,selectorFlag:!1,amountFlag:!0,spenderFlag:w.Present,signature:"3045022100d8496ab69152efeef6a923a3ebd225334ad65dcb985814994243be7bc09bf27e02206314835816908dd6d51d3cbb0f9465d91d7ddc9104b34dd6c4247f65c551836e"},subset:i}}};n.parse.mockReturnValueOnce(b({types:r,domain:l,message:d})),e.getDeviceSessionState.mockReturnValueOnce({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:x.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1}),a.getTypedDataFilters.mockResolvedValueOnce(S),u.mockReturnValue({run:async()=>({clearSignContexts:[],clearSigningType:A.EIP7730})});const R=await t.run();expect(u).toHaveBeenCalledWith(e,expect.objectContaining({subset:i})),expect(R).toStrictEqual({deviceModelId:s.FLEX,derivationPath:"44'/60'/0'/0/0",web3Check:null,types:r,domain:l,message:d,clearSignContext:C(S),calldatasContexts:{0:[]}})}),it("Should throw an error if parsing fails",async()=>{const t=new g(e,a,n,p,m,c,"44'/60'/0'/0/0",f(!1),o,u);n.parse.mockReturnValueOnce(O(new Error("Parsing error")));try{await t.run()}catch(i){expect(i).toBeInstanceOf(Error),expect(i.message).toBe("Parsing error")}})});
2
2
  //# sourceMappingURL=BuildEIP712ContextTask.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildEIP712ContextTask.test.ts"],
4
- "sourcesContent": ["import type {\n ClearSignContextSuccess,\n ClearSignContextType,\n TypedDataClearSignContextSuccess,\n} from \"@ledgerhq/context-module\";\nimport {\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Left, Nothing, Right } from \"purify-ts\";\n\nimport type { GetConfigCommandResponse } from \"@api/app-binder/GetConfigCommandTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport {\n PrimitiveType,\n StructType,\n TypedDataValueField,\n TypedDataValueRoot,\n} from \"@internal/typed-data/model/Types\";\n\nimport { BuildEIP712ContextTask } from \"./BuildEIP712ContextTask\";\n\ndescribe(\"BuildEIP712ContextTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const contextMouleMock = {\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getSolanaContext: vi.fn(),\n };\n const parserMock = {\n parse: vi.fn(),\n };\n const getWeb3ChecksFactoryMock = vi.fn();\n\n function createAppConfig(\n web3ChecksEnabled: boolean,\n ): GetConfigCommandResponse {\n return {\n blindSigningEnabled: false,\n web3ChecksEnabled,\n web3ChecksOptIn: false,\n version: \"1.13.0\",\n };\n }\n\n const TEST_DATA = {\n domain: {\n name: \"Permit2\",\n chainId: 137,\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n },\n primaryType: \"PermitSingle\",\n message: {\n details: {\n token: \"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n amount: \"69420000000000000000\",\n expiration: \"1718184249\",\n nonce: \"0\",\n },\n spender: \"0xec7be89e9d109e7e3fec59c222cf297125fefda2\",\n sigDeadline: \"1715594049\",\n },\n types: {\n PermitSingle: [\n {\n name: \"details\",\n type: \"PermitDetails\",\n },\n {\n name: \"spender\",\n type: \"address\",\n },\n {\n name: \"sigDeadline\",\n type: \"uint256\",\n },\n ],\n PermitDetails: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint\" },\n { name: \"expiration\", type: \"uint\" },\n { name: \"nonce\", type: \"uint\" },\n ],\n },\n };\n\n const TEST_TYPES = {\n PermitSingle: {\n details: new StructType(\"PermitDetails\"),\n spender: new PrimitiveType(\"address\", \"address\", Nothing),\n sigDeadline: new PrimitiveType(\"uint256\", \"uint\", Just(32)),\n },\n PermitDetails: {\n token: new PrimitiveType(\"address\", \"address\", Nothing),\n amount: new PrimitiveType(\"uint160\", \"uint\", Just(20)),\n expiration: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n nonce: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n },\n };\n const TEST_DOMAIN_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"EIP712Domain\"),\n },\n {\n path: \"chainId\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([137])),\n },\n ];\n const TEST_MESSAGE_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"PermitSingle\"),\n },\n {\n path: \"details.amount\",\n type: \"uint160\",\n value: new TypedDataValueField(Uint8Array.from([0x12])),\n },\n {\n path: \"details.expiration\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x13])),\n },\n ];\n const TEST_CLEAR_SIGN_CONTEXT: TypedDataClearSignContextSuccess = {\n type: \"success\",\n messageInfo: {\n displayName: \"Permit2\",\n filtersCount: 1,\n signature:\n \"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3\",\n },\n trustedNamesAddresses: {},\n tokens: {},\n filters: {\n \"details.amount\": {\n displayName: \"Amount allowance\",\n path: \"details.amount\",\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n tokenIndex: 255,\n type: \"amount\",\n },\n },\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n getWeb3ChecksFactoryMock.mockReturnValue({\n run: async () => ({ web3Check: null }),\n });\n });\n\n it(\"Build context with clear signing context not supported by the device\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(false),\n getWeb3ChecksFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.11.0\" },\n deviceModelId: DeviceModelId.NANO_S,\n isSecureConnectionAllowed: false,\n });\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n web3Check: null,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n });\n });\n\n it(\"Build context with no clear signing context\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(false),\n getWeb3ChecksFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce({\n type: \"error\",\n error: new Error(\"no filter\"),\n });\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n web3Check: null,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n });\n });\n\n it(\"Build context with clear signing context\", async () => {\n // GIVEN\n const expectedWeb3Check =\n \"web3Check\" as unknown as ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK>;\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(false),\n getWeb3ChecksFactoryMock,\n );\n getWeb3ChecksFactoryMock.mockReturnValueOnce({\n run: async () => ({ web3Check: expectedWeb3Check }),\n });\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n TEST_CLEAR_SIGN_CONTEXT,\n );\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n web3Check: null,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n });\n expect(parserMock.parse).toHaveBeenCalledWith(TEST_DATA);\n expect(contextMouleMock.getTypedDataFilters).toHaveBeenCalledWith({\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n chainId: 137,\n version: \"v2\",\n schema: TEST_DATA[\"types\"],\n fieldsValues: [\n {\n path: \"details.amount\",\n value: Uint8Array.from([0x12]),\n },\n {\n path: \"details.expiration\",\n value: Uint8Array.from([0x13]),\n },\n ],\n });\n });\n\n it(\"Build context with clear signing context and web3Check\", async () => {\n // GIVEN\n const expectedWeb3Check =\n \"web3Check\" as unknown as ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK>;\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(true),\n getWeb3ChecksFactoryMock,\n );\n getWeb3ChecksFactoryMock.mockReturnValueOnce({\n run: async () => ({ web3Check: expectedWeb3Check }),\n });\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n TEST_CLEAR_SIGN_CONTEXT,\n );\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n web3Check: expectedWeb3Check,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n });\n expect(getWeb3ChecksFactoryMock).toHaveBeenCalledWith(apiMock, {\n contextModule: contextMouleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_DATA,\n });\n });\n\n it(\"Build context with clear signing context V1\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(false),\n getWeb3ChecksFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.11.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n TEST_CLEAR_SIGN_CONTEXT,\n );\n // WHEN\n await task.run();\n // THEN\n expect(contextMouleMock.getTypedDataFilters).toHaveBeenCalledWith({\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n chainId: 137,\n version: \"v1\",\n schema: TEST_DATA[\"types\"],\n fieldsValues: [\n {\n path: \"details.amount\",\n value: Uint8Array.from([0x12]),\n },\n {\n path: \"details.expiration\",\n value: Uint8Array.from([0x13]),\n },\n ],\n });\n });\n\n it(\"Should throw an error if parsing fails\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(false),\n getWeb3ChecksFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(Left(new Error(\"Parsing error\")));\n // WHEN\n try {\n await task.run();\n } catch (e) {\n // THEN\n expect(e).toBeInstanceOf(Error);\n // @ts-expect-error\n expect(e.message).toBe(\"Parsing error\");\n }\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "Just", "Left", "Nothing", "Right", "makeDeviceActionInternalApiMock", "PrimitiveType", "StructType", "TypedDataValueField", "TypedDataValueRoot", "BuildEIP712ContextTask", "apiMock", "contextMouleMock", "parserMock", "getWeb3ChecksFactoryMock", "createAppConfig", "web3ChecksEnabled", "TEST_DATA", "TEST_TYPES", "TEST_DOMAIN_VALUES", "TEST_MESSAGE_VALUES", "TEST_CLEAR_SIGN_CONTEXT", "task", "builtContext", "expectedWeb3Check", "e"]
4
+ "sourcesContent": ["import type {\n ClearSignContextSuccess,\n ClearSignContextType,\n TypedDataClearSignContextSuccess,\n} from \"@ledgerhq/context-module\";\nimport { TypedDataCalldataParamPresence } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Left, Nothing, Right } from \"purify-ts\";\n\nimport type { GetConfigCommandResponse } from \"@api/app-binder/GetConfigCommandTypes\";\nimport { ClearSigningType } from \"@api/model/ClearSigningType\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { type TransactionMapperService } from \"@internal/transaction/service/mapper/TransactionMapperService\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\nimport {\n PrimitiveType,\n StructType,\n TypedDataValueField,\n TypedDataValueRoot,\n} from \"@internal/typed-data/model/Types\";\n\nimport { BuildEIP712ContextTask } from \"./BuildEIP712ContextTask\";\n\ndescribe(\"BuildEIP712ContextTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const contextMouleMock = {\n getFieldContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getSolanaContext: vi.fn(),\n };\n const parserMock = {\n parse: vi.fn(),\n };\n const mockTransactionParser: TransactionParserService = {\n extractValue: vi.fn(),\n } as unknown as TransactionParserService;\n const mockTransactionMapper: TransactionMapperService = {\n mapTransactionToSubset: vi.fn(),\n };\n const getWeb3ChecksFactoryMock = vi.fn();\n const buildFullContextFactoryMock = vi.fn();\n\n function createAppConfig(\n web3ChecksEnabled: boolean,\n ): GetConfigCommandResponse {\n return {\n blindSigningEnabled: false,\n web3ChecksEnabled,\n web3ChecksOptIn: false,\n version: \"1.13.0\",\n };\n }\n\n const TEST_DATA = {\n domain: {\n name: \"Permit2\",\n chainId: 137,\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n },\n primaryType: \"PermitSingle\",\n message: {\n details: {\n token: \"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n amount: \"69420000000000000000\",\n expiration: \"1718184249\",\n nonce: \"0\",\n },\n spender: \"0xec7be89e9d109e7e3fec59c222cf297125fefda2\",\n sigDeadline: \"1715594049\",\n },\n types: {\n PermitSingle: [\n {\n name: \"details\",\n type: \"PermitDetails\",\n },\n {\n name: \"spender\",\n type: \"address\",\n },\n {\n name: \"sigDeadline\",\n type: \"uint256\",\n },\n ],\n PermitDetails: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint\" },\n { name: \"expiration\", type: \"uint\" },\n { name: \"nonce\", type: \"uint\" },\n ],\n },\n };\n\n const TEST_TYPES = {\n PermitSingle: {\n details: new StructType(\"PermitDetails\"),\n spender: new PrimitiveType(\"address\", \"address\", Nothing),\n sigDeadline: new PrimitiveType(\"uint256\", \"uint\", Just(32)),\n },\n PermitDetails: {\n token: new PrimitiveType(\"address\", \"address\", Nothing),\n amount: new PrimitiveType(\"uint160\", \"uint\", Just(20)),\n expiration: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n nonce: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n },\n };\n const TEST_DOMAIN_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"EIP712Domain\"),\n },\n {\n path: \"chainId\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([137])),\n },\n ];\n const TEST_MESSAGE_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"PermitSingle\"),\n },\n {\n path: \"details.amount\",\n type: \"uint160\",\n value: new TypedDataValueField(Uint8Array.from([0x12])),\n },\n {\n path: \"details.expiration\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x13])),\n },\n ];\n const TEST_CLEAR_SIGN_CONTEXT: TypedDataClearSignContextSuccess = {\n type: \"success\",\n messageInfo: {\n displayName: \"Permit2\",\n filtersCount: 1,\n signature:\n \"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3\",\n },\n trustedNamesAddresses: {},\n tokens: {},\n calldatas: {},\n proxy: undefined,\n filters: {\n \"details.amount\": {\n displayName: \"Amount allowance\",\n path: \"details.amount\",\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n tokenIndex: 255,\n type: \"amount\",\n },\n },\n };\n\n const TEST_CHALLENGE = \"0x1234\";\n\n beforeEach(() => {\n vi.resetAllMocks();\n getWeb3ChecksFactoryMock.mockReturnValue({\n run: async () => ({ web3Check: null }),\n });\n buildFullContextFactoryMock.mockReturnValue({\n run: async () => ({\n clearSignContexts: [],\n clearSigningType: ClearSigningType.BASIC,\n }),\n });\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { challenge: TEST_CHALLENGE } }),\n );\n });\n\n it(\"Build context with clear signing context not supported by the device\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n mockTransactionParser,\n mockTransactionMapper,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(false),\n getWeb3ChecksFactoryMock,\n buildFullContextFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.11.0\" },\n deviceModelId: DeviceModelId.NANO_S,\n isSecureConnectionAllowed: false,\n });\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n deviceModelId: DeviceModelId.NANO_S,\n derivationPath: \"44'/60'/0'/0/0\",\n web3Check: null,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n calldatasContexts: {},\n });\n });\n\n it(\"Build context with no clear signing context\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n mockTransactionParser,\n mockTransactionMapper,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(false),\n getWeb3ChecksFactoryMock,\n buildFullContextFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce({\n type: \"error\",\n error: new Error(\"no filter\"),\n });\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n deviceModelId: DeviceModelId.FLEX,\n derivationPath: \"44'/60'/0'/0/0\",\n web3Check: null,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n calldatasContexts: {},\n });\n });\n\n it(\"Build context with clear signing context\", async () => {\n // GIVEN\n const expectedWeb3Check =\n \"web3Check\" as unknown as ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK>;\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n mockTransactionParser,\n mockTransactionMapper,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(false),\n getWeb3ChecksFactoryMock,\n buildFullContextFactoryMock,\n );\n getWeb3ChecksFactoryMock.mockReturnValueOnce({\n run: async () => ({ web3Check: expectedWeb3Check }),\n });\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n TEST_CLEAR_SIGN_CONTEXT,\n );\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n deviceModelId: DeviceModelId.FLEX,\n derivationPath: \"44'/60'/0'/0/0\",\n web3Check: null,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n calldatasContexts: {},\n });\n expect(parserMock.parse).toHaveBeenCalledWith(TEST_DATA);\n expect(contextMouleMock.getTypedDataFilters).toHaveBeenCalledWith({\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n chainId: 137,\n version: \"v2\",\n schema: TEST_DATA[\"types\"],\n challenge: TEST_CHALLENGE,\n deviceModelId: DeviceModelId.FLEX,\n fieldsValues: [\n {\n path: \"details.amount\",\n value: Uint8Array.from([0x12]),\n },\n {\n path: \"details.expiration\",\n value: Uint8Array.from([0x13]),\n },\n ],\n });\n });\n\n it(\"Build context with clear signing context and web3Check\", async () => {\n // GIVEN\n const expectedWeb3Check =\n \"web3Check\" as unknown as ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK>;\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n mockTransactionParser,\n mockTransactionMapper,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(true),\n getWeb3ChecksFactoryMock,\n buildFullContextFactoryMock,\n );\n getWeb3ChecksFactoryMock.mockReturnValueOnce({\n run: async () => ({ web3Check: expectedWeb3Check }),\n });\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n TEST_CLEAR_SIGN_CONTEXT,\n );\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n deviceModelId: DeviceModelId.FLEX,\n derivationPath: \"44'/60'/0'/0/0\",\n web3Check: expectedWeb3Check,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n calldatasContexts: {},\n });\n expect(getWeb3ChecksFactoryMock).toHaveBeenCalledWith(apiMock, {\n contextModule: contextMouleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_DATA,\n });\n });\n\n it(\"Build context with clear signing context V1\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n mockTransactionParser,\n mockTransactionMapper,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(false),\n getWeb3ChecksFactoryMock,\n buildFullContextFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.11.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n TEST_CLEAR_SIGN_CONTEXT,\n );\n // WHEN\n await task.run();\n // THEN\n expect(contextMouleMock.getTypedDataFilters).toHaveBeenCalledWith({\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n chainId: 137,\n version: \"v1\",\n schema: TEST_DATA[\"types\"],\n challenge: TEST_CHALLENGE,\n deviceModelId: DeviceModelId.FLEX,\n fieldsValues: [\n {\n path: \"details.amount\",\n value: Uint8Array.from([0x12]),\n },\n {\n path: \"details.expiration\",\n value: Uint8Array.from([0x13]),\n },\n ],\n });\n });\n\n it(\"Build context with clear signing context and calldatas\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n mockTransactionParser,\n mockTransactionMapper,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(false),\n getWeb3ChecksFactoryMock,\n buildFullContextFactoryMock,\n );\n const subset = {\n chainId: 0x1234,\n data: \"0x6a76120200000000000000000000000023f8abfc2824c397ccb3da89ae772984107ddb99\",\n from: \"0x8ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n selector: \"0x778899aa\",\n to: \"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n value: 4200000000000000n,\n };\n const clearSignContext = {\n ...TEST_CLEAR_SIGN_CONTEXT,\n calldatas: {\n 0: {\n filter: {\n calldataIndex: 0,\n displayName: \"Transaction\",\n valueFlag: true,\n calleeFlag: TypedDataCalldataParamPresence.Present,\n chainIdFlag: false,\n selectorFlag: false,\n amountFlag: true,\n spenderFlag: TypedDataCalldataParamPresence.Present,\n signature:\n \"3045022100d8496ab69152efeef6a923a3ebd225334ad65dcb985814994243be7bc09bf27e02206314835816908dd6d51d3cbb0f9465d91d7ddc9104b34dd6c4247f65c551836e\",\n },\n subset,\n },\n },\n };\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n clearSignContext,\n );\n buildFullContextFactoryMock.mockReturnValue({\n run: async () => ({\n clearSignContexts: [],\n clearSigningType: ClearSigningType.EIP7730,\n }),\n });\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(buildFullContextFactoryMock).toHaveBeenCalledWith(\n apiMock,\n expect.objectContaining({\n subset,\n }),\n );\n expect(builtContext).toStrictEqual({\n deviceModelId: DeviceModelId.FLEX,\n derivationPath: \"44'/60'/0'/0/0\",\n web3Check: null,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(clearSignContext),\n calldatasContexts: {\n 0: [],\n },\n });\n });\n\n it(\"Should throw an error if parsing fails\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n mockTransactionParser,\n mockTransactionMapper,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n createAppConfig(false),\n getWeb3ChecksFactoryMock,\n buildFullContextFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(Left(new Error(\"Parsing error\")));\n // WHEN\n try {\n await task.run();\n } catch (e) {\n // THEN\n expect(e).toBeInstanceOf(Error);\n // @ts-expect-error\n expect(e.message).toBe(\"Parsing error\");\n }\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["TypedDataCalldataParamPresence", "CommandResultFactory", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "Just", "Left", "Nothing", "Right", "ClearSigningType", "makeDeviceActionInternalApiMock", "PrimitiveType", "StructType", "TypedDataValueField", "TypedDataValueRoot", "BuildEIP712ContextTask", "apiMock", "contextMouleMock", "parserMock", "mockTransactionParser", "mockTransactionMapper", "getWeb3ChecksFactoryMock", "buildFullContextFactoryMock", "createAppConfig", "web3ChecksEnabled", "TEST_DATA", "TEST_TYPES", "TEST_DOMAIN_VALUES", "TEST_MESSAGE_VALUES", "TEST_CLEAR_SIGN_CONTEXT", "TEST_CHALLENGE", "task", "builtContext", "expectedWeb3Check", "subset", "clearSignContext", "e"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{ClearSignContextReferenceType as p,ClearSignContextType as d}from"@ledgerhq/context-module";import{BuildBaseContexts as u}from"./BuildBaseContexts";import{BuildSubcontextsTask as x}from"./BuildSubcontextsTask";import{ParseNestedTransactionTask as C}from"./ParseNestedTransactionTask";class i{constructor(n,a,o=(t,e)=>new x(t,e),r=(t,e)=>new u(t,e),s=t=>new C(t)){this._api=n;this._args=a;this._buildSubcontextsTaskFactory=o;this._buildBaseContextsTaskFactory=r;this._preBuildNestedCallDataTaskFactory=s}async run(){const{clearSignContexts:n,clearSigningType:a,clearSignContextsOptional:o}=await this._buildBaseContextsTaskFactory(this._api,this._args).run(),r=n.map(t=>{const{subcontextCallbacks:e}=this._buildSubcontextsTaskFactory(this._api,{context:t,contextOptional:o,contextModule:this._args.contextModule,subset:this._args.subset,transactionParser:this._args.parser,deviceModelId:this._args.deviceModelId}).run();return{context:t,subcontextCallbacks:e}}),s=[];for(const t of r)if(s.push(t),t.context.type===d.TRANSACTION_FIELD_DESCRIPTION&&t.context.reference?.type===p.CALLDATA){const{subsets:e}=this._preBuildNestedCallDataTaskFactory({parser:this._args.parser,subset:this._args.subset,context:t.context}).run();for(const l of e){const{clearSignContexts:c}=await new i(this._api,{...this._args,transaction:void 0,subset:l},this._buildSubcontextsTaskFactory,this._buildBaseContextsTaskFactory,this._preBuildNestedCallDataTaskFactory).run();s.push(...c)}}return{clearSignContexts:s,clearSigningType:a}}}export{i as BuildFullContextsTask};
2
+ //# sourceMappingURL=BuildFullContextsTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildFullContextsTask.ts"],
4
+ "sourcesContent": ["import {\n type ClearSignContext,\n ClearSignContextReferenceType,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type TransactionSubset,\n} from \"@ledgerhq/context-module\";\nimport {\n type DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type GetConfigCommandResponse } from \"@api/app-binder/GetConfigCommandTypes\";\nimport { type ClearSigningType } from \"@api/model/ClearSigningType\";\nimport { type TransactionOptions } from \"@api/model/TransactionOptions\";\nimport { type TransactionMapperService } from \"@internal/transaction/service/mapper/TransactionMapperService\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nimport {\n BuildBaseContexts,\n type BuildBaseContextsArgs,\n} from \"./BuildBaseContexts\";\nimport {\n BuildSubcontextsTask,\n type BuildSubcontextsTaskArgs,\n} from \"./BuildSubcontextsTask\";\nimport {\n ParseNestedTransactionTask,\n type ParseNestedTransactionTaskArgs,\n} from \"./ParseNestedTransactionTask\";\n\nexport type BuildFullContextsTaskResult = {\n readonly clearSignContexts: ContextWithSubContexts[];\n readonly clearSigningType: ClearSigningType;\n};\n\nexport type BuildFullContextsTaskArgs = {\n readonly contextModule: ContextModule;\n readonly mapper: TransactionMapperService;\n readonly parser: TransactionParserService;\n readonly options: TransactionOptions;\n readonly appConfig: GetConfigCommandResponse;\n readonly derivationPath: string;\n readonly subset: TransactionSubset;\n readonly deviceModelId: DeviceModelId;\n readonly transaction?: Uint8Array;\n};\n\nexport type ContextWithSubContexts = {\n context: ClearSignContextSuccess;\n subcontextCallbacks: (() => Promise<ClearSignContext>)[];\n};\n\nexport class BuildFullContextsTask {\n constructor(\n private readonly _api: InternalApi,\n private readonly _args: BuildFullContextsTaskArgs,\n private readonly _buildSubcontextsTaskFactory = (\n api: InternalApi,\n args: BuildSubcontextsTaskArgs,\n ) => new BuildSubcontextsTask(api, args),\n private readonly _buildBaseContextsTaskFactory = (\n api: InternalApi,\n args: BuildBaseContextsArgs,\n ) => new BuildBaseContexts(api, args),\n private readonly _preBuildNestedCallDataTaskFactory = (\n args: ParseNestedTransactionTaskArgs,\n ) => new ParseNestedTransactionTask(args),\n ) {}\n\n async run(): Promise<BuildFullContextsTaskResult> {\n // get the base contexts\n const { clearSignContexts, clearSigningType, clearSignContextsOptional } =\n await this._buildBaseContextsTaskFactory(this._api, this._args).run();\n\n // for each context, build the subcontexts\n const contextsWithSubContexts: ContextWithSubContexts[] =\n clearSignContexts.map((context: ClearSignContextSuccess) => {\n const { subcontextCallbacks } = this._buildSubcontextsTaskFactory(\n this._api,\n {\n context,\n contextOptional: clearSignContextsOptional,\n contextModule: this._args.contextModule,\n subset: this._args.subset,\n transactionParser: this._args.parser,\n deviceModelId: this._args.deviceModelId,\n },\n ).run();\n\n return {\n context,\n subcontextCallbacks,\n };\n });\n\n // recursively build the nested contexts\n const contextWithNestedContexts: ContextWithSubContexts[] = [];\n for (const context of contextsWithSubContexts) {\n contextWithNestedContexts.push(context);\n\n if (\n context.context.type ===\n ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION &&\n context.context.reference?.type ===\n ClearSignContextReferenceType.CALLDATA\n ) {\n const { subsets } = this._preBuildNestedCallDataTaskFactory({\n parser: this._args.parser,\n subset: this._args.subset,\n context: context.context,\n }).run();\n\n for (const subset of subsets) {\n const { clearSignContexts: nestedContexts } =\n await new BuildFullContextsTask(\n this._api,\n {\n ...this._args,\n transaction: undefined, // don't pass the transaction to the nested context builder\n subset,\n },\n // inject the factories for testing\n this._buildSubcontextsTaskFactory,\n this._buildBaseContextsTaskFactory,\n this._preBuildNestedCallDataTaskFactory,\n ).run();\n\n // Contexts order as expected by the Ethereum application:\n // * previous contexts\n // * calldata field from the parent\n // * list of nested transactions infos and nested fields\n contextWithNestedContexts.push(...nestedContexts);\n }\n }\n }\n\n return {\n clearSignContexts: contextWithNestedContexts,\n clearSigningType,\n };\n }\n}\n"],
5
+ "mappings": "AAAA,OAEE,iCAAAA,EAEA,wBAAAC,MAGK,2BAYP,OACE,qBAAAC,MAEK,sBACP,OACE,wBAAAC,MAEK,yBACP,OACE,8BAAAC,MAEK,+BAwBA,MAAMC,CAAsB,CACjC,YACmBC,EACAC,EACAC,EAA+B,CAC9CC,EACAC,IACG,IAAIP,EAAqBM,EAAKC,CAAI,EACtBC,EAAgC,CAC/CF,EACAC,IACG,IAAIR,EAAkBO,EAAKC,CAAI,EACnBE,EACfF,GACG,IAAIN,EAA2BM,CAAI,EACxC,CAbiB,UAAAJ,EACA,WAAAC,EACA,kCAAAC,EAIA,mCAAAG,EAIA,wCAAAC,CAGhB,CAEH,MAAM,KAA4C,CAEhD,KAAM,CAAE,kBAAAC,EAAmB,iBAAAC,EAAkB,0BAAAC,CAA0B,EACrE,MAAM,KAAK,8BAA8B,KAAK,KAAM,KAAK,KAAK,EAAE,IAAI,EAGhEC,EACJH,EAAkB,IAAKI,GAAqC,CAC1D,KAAM,CAAE,oBAAAC,CAAoB,EAAI,KAAK,6BACnC,KAAK,KACL,CACE,QAAAD,EACA,gBAAiBF,EACjB,cAAe,KAAK,MAAM,cAC1B,OAAQ,KAAK,MAAM,OACnB,kBAAmB,KAAK,MAAM,OAC9B,cAAe,KAAK,MAAM,aAC5B,CACF,EAAE,IAAI,EAEN,MAAO,CACL,QAAAE,EACA,oBAAAC,CACF,CACF,CAAC,EAGGC,EAAsD,CAAC,EAC7D,UAAWF,KAAWD,EAGpB,GAFAG,EAA0B,KAAKF,CAAO,EAGpCA,EAAQ,QAAQ,OACdhB,EAAqB,+BACvBgB,EAAQ,QAAQ,WAAW,OACzBjB,EAA8B,SAChC,CACA,KAAM,CAAE,QAAAoB,CAAQ,EAAI,KAAK,mCAAmC,CAC1D,OAAQ,KAAK,MAAM,OACnB,OAAQ,KAAK,MAAM,OACnB,QAASH,EAAQ,OACnB,CAAC,EAAE,IAAI,EAEP,UAAWI,KAAUD,EAAS,CAC5B,KAAM,CAAE,kBAAmBE,CAAe,EACxC,MAAM,IAAIjB,EACR,KAAK,KACL,CACE,GAAG,KAAK,MACR,YAAa,OACb,OAAAgB,CACF,EAEA,KAAK,6BACL,KAAK,8BACL,KAAK,kCACP,EAAE,IAAI,EAMRF,EAA0B,KAAK,GAAGG,CAAc,CAClD,CACF,CAGF,MAAO,CACL,kBAAmBH,EACnB,iBAAAL,CACF,CACF,CACF",
6
+ "names": ["ClearSignContextReferenceType", "ClearSignContextType", "BuildBaseContexts", "BuildSubcontextsTask", "ParseNestedTransactionTask", "BuildFullContextsTask", "_api", "_args", "_buildSubcontextsTaskFactory", "api", "args", "_buildBaseContextsTaskFactory", "_preBuildNestedCallDataTaskFactory", "clearSignContexts", "clearSigningType", "clearSignContextsOptional", "contextsWithSubContexts", "context", "subcontextCallbacks", "contextWithNestedContexts", "subsets", "subset", "nestedContexts"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ClearSignContextReferenceType as b,ClearSignContextType as e}from"@ledgerhq/context-module";import{DeviceModelId as x}from"@ledgerhq/device-management-kit";import{ClearSigningType as o}from"../../../api/model/ClearSigningType";import{makeDeviceActionInternalApiMock as A}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildBaseContexts as N}from"./BuildBaseContexts";import{BuildFullContextsTask as T}from"./BuildFullContextsTask";import{BuildSubcontextsTask as g}from"./BuildSubcontextsTask";import{ParseNestedTransactionTask as O}from"./ParseNestedTransactionTask";describe("BuildFullContextsTask",()=>{const n=A(),c={},l={},p={},i={blindSigningEnabled:!1,web3ChecksEnabled:!1,web3ChecksOptIn:!1,version:"1.0.0"},r={},d={chainId:1,data:"0x",selector:"0x"},u="44'/60'/0'/0/0",y=vi.fn(),C=(a,t)=>({run:y}),s=vi.fn(),S=(a,t)=>({run:s}),k=vi.fn(),I=a=>({run:k});describe("Init",()=>{it("should init with defaults tasks",()=>{const a=new T(n,{contextModule:c,mapper:l,parser:p,options:r,appConfig:i,derivationPath:u,subset:d,deviceModelId:x.STAX});expect(a).toBeDefined(),expect(a._buildSubcontextsTaskFactory(n,{})).toBeInstanceOf(g),expect(a._buildBaseContextsTaskFactory(n,{})).toBeInstanceOf(N),expect(a._preBuildNestedCallDataTaskFactory({})).toBeInstanceOf(O)})}),describe("Happy path",()=>{beforeEach(()=>{vi.resetAllMocks()}),it("should build with no context",async()=>{s.mockReturnValue({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:o.BASIC});const t=await new T(n,{contextModule:c,mapper:l,parser:p,options:r,appConfig:i,derivationPath:u,subset:d,deviceModelId:x.STAX},C,S,I).run();expect(t).toEqual({clearSignContexts:[],clearSigningType:o.BASIC})}),it("should build with multiple contexts and no subcontexts",async()=>{s.mockReturnValueOnce({clearSignContexts:[{type:e.TRANSACTION_INFO,payload:"payload-1"},{type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"}],clearSigningType:o.EIP7730}),y.mockReturnValue({subcontextCallbacks:[]});const t=await new T(n,{contextModule:c,mapper:l,parser:p,options:r,appConfig:i,derivationPath:u,subset:d,deviceModelId:x.STAX},C,S,I).run();expect(t).toEqual({clearSignContexts:[{context:{type:e.TRANSACTION_INFO,payload:"payload-1"},subcontextCallbacks:[]},{context:{type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},subcontextCallbacks:[]},{context:{type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},subcontextCallbacks:[]}],clearSigningType:o.EIP7730})}),it("should build with multiple contexts and subcontexts",async()=>{s.mockReturnValueOnce({clearSignContexts:[{type:e.TRANSACTION_INFO,payload:"payload-1"},{type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"}],clearSignContextsOptional:[],clearSigningType:o.EIP7730}),y.mockReturnValueOnce({subcontextCallbacks:[]}),y.mockReturnValueOnce({subcontextCallbacks:[()=>Promise.resolve({type:e.TOKEN,payload:"payload-3"}),()=>Promise.resolve({type:e.TOKEN,payload:"payload-4"})]});const t=await new T(n,{contextModule:c,mapper:l,parser:p,options:r,appConfig:i,derivationPath:u,subset:d,deviceModelId:x.STAX},C,S,I).run();expect(t.clearSignContexts[0]).toEqual({context:{type:e.TRANSACTION_INFO,payload:"payload-1"},subcontextCallbacks:[]}),expect(t.clearSignContexts[1]).toEqual({context:{type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},subcontextCallbacks:[expect.any(Function),expect.any(Function)]}),await expect(t.clearSignContexts[1].subcontextCallbacks[0]()).resolves.toEqual({type:e.TOKEN,payload:"payload-3"}),await expect(t.clearSignContexts[1].subcontextCallbacks[1]()).resolves.toEqual({type:e.TOKEN,payload:"payload-4"})}),it("should build with nested contexts",async()=>{s.mockReturnValueOnce({clearSignContexts:[{type:e.TRANSACTION_INFO,payload:"payload-1"},{type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2",reference:{type:b.CALLDATA,subset:{chainId:1,data:"0x",selector:"0x"}}}],clearSigningType:o.EIP7730}),s.mockReturnValueOnce({clearSignContexts:[{type:e.TRANSACTION_INFO,payload:"payload-3"},{type:e.TOKEN,payload:"payload-4"}],clearSignContextsOptional:[],clearSigningType:o.EIP7730}),y.mockReturnValue({subcontextCallbacks:[]}),k.mockReturnValue({subsets:[{chainId:1,data:"0x",selector:"0x"}]});const t=await new T(n,{contextModule:c,mapper:l,parser:p,options:r,appConfig:i,derivationPath:u,subset:d,deviceModelId:x.STAX},C,S,I).run();expect(t).toEqual({clearSignContexts:expect.any(Array),clearSigningType:o.EIP7730}),expect(t.clearSignContexts[0]).toEqual({context:{type:e.TRANSACTION_INFO,payload:"payload-1"},subcontextCallbacks:[]}),expect(t.clearSignContexts[1]).toEqual({context:{type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2",reference:{type:b.CALLDATA,subset:{chainId:1,data:"0x",selector:"0x"}}},subcontextCallbacks:[]}),expect(t.clearSignContexts[2]).toEqual({context:{type:e.TRANSACTION_INFO,payload:"payload-3"},subcontextCallbacks:[]}),expect(t.clearSignContexts[3]).toEqual({context:{type:e.TOKEN,payload:"payload-4"},subcontextCallbacks:[]})})})});
2
+ //# sourceMappingURL=BuildFullContextsTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildFullContextsTask.test.ts"],
4
+ "sourcesContent": ["import {\n ClearSignContextReferenceType,\n ClearSignContextType,\n type ContextModule,\n type TransactionSubset,\n} from \"@ledgerhq/context-module\";\nimport {\n DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type GetConfigCommandResponse } from \"@api/app-binder/GetConfigCommandTypes\";\nimport { type TransactionOptions } from \"@api/index\";\nimport { ClearSigningType } from \"@api/model/ClearSigningType\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { type TransactionMapperService } from \"@internal/transaction/service/mapper/TransactionMapperService\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nimport {\n BuildBaseContexts,\n type BuildBaseContextsArgs,\n} from \"./BuildBaseContexts\";\nimport { BuildFullContextsTask } from \"./BuildFullContextsTask\";\nimport {\n BuildSubcontextsTask,\n type BuildSubcontextsTaskArgs,\n} from \"./BuildSubcontextsTask\";\nimport {\n ParseNestedTransactionTask,\n type ParseNestedTransactionTaskArgs,\n} from \"./ParseNestedTransactionTask\";\n\ndescribe(\"BuildFullContextsTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const contextModuleMock = {} as ContextModule;\n const mapperMock = {} as TransactionMapperService;\n const parserMock = {} as TransactionParserService;\n\n const defaultAppConfig: GetConfigCommandResponse = {\n blindSigningEnabled: false,\n web3ChecksEnabled: false,\n web3ChecksOptIn: false,\n version: \"1.0.0\",\n };\n const defaultOptions: TransactionOptions = {};\n const defaultSubset: TransactionSubset = {\n chainId: 1,\n data: \"0x\",\n selector: \"0x\",\n };\n const defaultDerivationPath = \"44'/60'/0'/0/0\";\n\n const buildSubContextTaskRunMock = vi.fn();\n const buildSubcontextsTaskFactory = (\n _api: InternalApi,\n _args: BuildSubcontextsTaskArgs,\n ) =>\n ({\n run: buildSubContextTaskRunMock,\n }) as unknown as BuildSubcontextsTask;\n\n const buildBaseContextsTaskRunMock = vi.fn();\n const buildBaseContextsTaskFactory = (\n _api: InternalApi,\n _args: BuildBaseContextsArgs,\n ) =>\n ({\n run: buildBaseContextsTaskRunMock,\n }) as unknown as BuildBaseContexts;\n\n const parseNestedTransactionTaskRunMock = vi.fn();\n const parseNestedTransactionTaskFactory = (\n _args: ParseNestedTransactionTaskArgs,\n ) =>\n ({\n run: parseNestedTransactionTaskRunMock,\n }) as unknown as ParseNestedTransactionTask;\n\n describe(\"Init\", () => {\n it(\"should init with defaults tasks\", () => {\n const task = new BuildFullContextsTask(apiMock, {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n options: defaultOptions,\n appConfig: defaultAppConfig,\n derivationPath: defaultDerivationPath,\n subset: defaultSubset,\n deviceModelId: DeviceModelId.STAX,\n });\n\n expect(task).toBeDefined();\n expect(\n task[\"_buildSubcontextsTaskFactory\"](\n apiMock,\n {} as BuildSubcontextsTaskArgs,\n ),\n ).toBeInstanceOf(BuildSubcontextsTask);\n expect(\n task[\"_buildBaseContextsTaskFactory\"](\n apiMock,\n {} as BuildBaseContextsArgs,\n ),\n ).toBeInstanceOf(BuildBaseContexts);\n expect(\n task[\"_preBuildNestedCallDataTaskFactory\"](\n {} as ParseNestedTransactionTaskArgs,\n ),\n ).toBeInstanceOf(ParseNestedTransactionTask);\n });\n });\n\n describe(\"Happy path\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n it(\"should build with no context\", async () => {\n // GIVEN\n buildBaseContextsTaskRunMock.mockReturnValue({\n clearSignContexts: [],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n\n const task = new BuildFullContextsTask(\n apiMock,\n {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n options: defaultOptions,\n appConfig: defaultAppConfig,\n derivationPath: defaultDerivationPath,\n subset: defaultSubset,\n deviceModelId: DeviceModelId.STAX,\n },\n buildSubcontextsTaskFactory,\n buildBaseContextsTaskFactory,\n parseNestedTransactionTaskFactory,\n );\n\n // WHEN\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [],\n clearSigningType: ClearSigningType.BASIC,\n });\n });\n\n it(\"should build with multiple contexts and no subcontexts\", async () => {\n // GIVEN\n buildBaseContextsTaskRunMock.mockReturnValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-3\",\n },\n ],\n clearSigningType: ClearSigningType.EIP7730,\n });\n buildSubContextTaskRunMock.mockReturnValue({\n subcontextCallbacks: [],\n });\n\n const task = new BuildFullContextsTask(\n apiMock,\n {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n options: defaultOptions,\n appConfig: defaultAppConfig,\n derivationPath: defaultDerivationPath,\n subset: defaultSubset,\n deviceModelId: DeviceModelId.STAX,\n },\n buildSubcontextsTaskFactory,\n buildBaseContextsTaskFactory,\n parseNestedTransactionTaskFactory,\n );\n\n // WHEN\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [\n {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n subcontextCallbacks: [],\n },\n {\n context: {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n subcontextCallbacks: [],\n },\n {\n context: {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-3\",\n },\n subcontextCallbacks: [],\n },\n ],\n clearSigningType: ClearSigningType.EIP7730,\n });\n });\n\n it(\"should build with multiple contexts and subcontexts\", async () => {\n // GIVEN\n buildBaseContextsTaskRunMock.mockReturnValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n ],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.EIP7730,\n });\n buildSubContextTaskRunMock.mockReturnValueOnce({\n subcontextCallbacks: [],\n });\n buildSubContextTaskRunMock.mockReturnValueOnce({\n subcontextCallbacks: [\n () =>\n Promise.resolve({\n type: ClearSignContextType.TOKEN,\n payload: \"payload-3\",\n }),\n () =>\n Promise.resolve({\n type: ClearSignContextType.TOKEN,\n payload: \"payload-4\",\n }),\n ],\n });\n\n const task = new BuildFullContextsTask(\n apiMock,\n {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n options: defaultOptions,\n appConfig: defaultAppConfig,\n derivationPath: defaultDerivationPath,\n subset: defaultSubset,\n deviceModelId: DeviceModelId.STAX,\n },\n buildSubcontextsTaskFactory,\n buildBaseContextsTaskFactory,\n parseNestedTransactionTaskFactory,\n );\n\n // WHEN\n const result = await task.run();\n\n // THEN\n expect(result.clearSignContexts[0]).toEqual({\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n subcontextCallbacks: [],\n });\n expect(result.clearSignContexts[1]).toEqual({\n context: {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n },\n subcontextCallbacks: [expect.any(Function), expect.any(Function)],\n });\n await expect(\n result.clearSignContexts[1]!.subcontextCallbacks[0]!(),\n ).resolves.toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"payload-3\",\n });\n await expect(\n result.clearSignContexts[1]!.subcontextCallbacks[1]!(),\n ).resolves.toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"payload-4\",\n });\n });\n\n it(\"should build with nested contexts\", async () => {\n // GIVEN\n buildBaseContextsTaskRunMock.mockReturnValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n reference: {\n type: ClearSignContextReferenceType.CALLDATA,\n subset: {\n chainId: 1,\n data: \"0x\",\n selector: \"0x\",\n },\n },\n },\n ],\n clearSigningType: ClearSigningType.EIP7730,\n });\n // nested context\n buildBaseContextsTaskRunMock.mockReturnValueOnce({\n clearSignContexts: [\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-3\",\n },\n {\n type: ClearSignContextType.TOKEN,\n payload: \"payload-4\",\n },\n ],\n clearSignContextsOptional: [],\n clearSigningType: ClearSigningType.EIP7730,\n });\n buildSubContextTaskRunMock.mockReturnValue({\n subcontextCallbacks: [],\n });\n parseNestedTransactionTaskRunMock.mockReturnValue({\n subsets: [\n {\n chainId: 1,\n data: \"0x\",\n selector: \"0x\",\n },\n ],\n });\n\n const task = new BuildFullContextsTask(\n apiMock,\n {\n contextModule: contextModuleMock,\n mapper: mapperMock,\n parser: parserMock,\n options: defaultOptions,\n appConfig: defaultAppConfig,\n derivationPath: defaultDerivationPath,\n subset: defaultSubset,\n deviceModelId: DeviceModelId.STAX,\n },\n buildSubcontextsTaskFactory,\n buildBaseContextsTaskFactory,\n parseNestedTransactionTaskFactory,\n );\n\n // WHEN\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n clearSignContexts: expect.any(Array),\n clearSigningType: ClearSigningType.EIP7730,\n });\n expect(result.clearSignContexts[0]).toEqual({\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-1\",\n },\n subcontextCallbacks: [],\n });\n expect(result.clearSignContexts[1]).toEqual({\n context: {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"payload-2\",\n reference: {\n type: ClearSignContextReferenceType.CALLDATA,\n subset: {\n chainId: 1,\n data: \"0x\",\n selector: \"0x\",\n },\n },\n },\n subcontextCallbacks: [],\n });\n expect(result.clearSignContexts[2]).toEqual({\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"payload-3\",\n },\n subcontextCallbacks: [],\n });\n expect(result.clearSignContexts[3]).toEqual({\n context: {\n type: ClearSignContextType.TOKEN,\n payload: \"payload-4\",\n },\n subcontextCallbacks: [],\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["ClearSignContextReferenceType", "ClearSignContextType", "DeviceModelId", "ClearSigningType", "makeDeviceActionInternalApiMock", "BuildBaseContexts", "BuildFullContextsTask", "BuildSubcontextsTask", "ParseNestedTransactionTask", "apiMock", "contextModuleMock", "mapperMock", "parserMock", "defaultAppConfig", "defaultOptions", "defaultSubset", "defaultDerivationPath", "buildSubContextTaskRunMock", "buildSubcontextsTaskFactory", "_api", "_args", "buildBaseContextsTaskRunMock", "buildBaseContextsTaskFactory", "parseNestedTransactionTaskRunMock", "parseNestedTransactionTaskFactory", "task", "result"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ClearSignContextType as s}from"@ledgerhq/context-module";import{isSuccessCommandResult as r}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as a}from"../../app-binder/command/GetChallengeCommand";class p{constructor(n,o){this._api=n;this._args=o}async run(){const n=await this._api.sendCommand(new a);if(!r(n))throw new Error("Failed to get challenge");const o=n.data.challenge,t=await this._args.contextModule.getContexts({safeContractAddress:this._args.safeContractAddress,chainId:this._args.options.chainId,deviceModelId:this._args.deviceModelId,challenge:o},[s.SAFE,s.SIGNER]);if(t.forEach(e=>{if(e.type===s.ERROR)throw new Error(e.error.message)}),t.length!==2||t.find(e=>e.type===s.SAFE)===void 0||t.find(e=>e.type===s.SIGNER)===void 0)throw new Error("Invalid safe address contexts");return{clearSignContexts:t}}}export{p as BuildSafeAddressContextTask};
2
+ //# sourceMappingURL=BuildSafeAddressContextTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildSafeAddressContextTask.ts"],
4
+ "sourcesContent": ["import {\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n} from \"@ledgerhq/context-module\";\nimport {\n type DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type SafeAddressOptions } from \"@api/model/SafeAddressOptions\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type BuildSafeAddressContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly safeContractAddress: string;\n readonly options: SafeAddressOptions;\n readonly deviceModelId: DeviceModelId;\n};\n\nexport type BuildSafeAddressContextTaskResult = {\n readonly clearSignContexts: ClearSignContextSuccess[];\n};\n\nexport class BuildSafeAddressContextTask {\n constructor(\n private readonly _api: InternalApi,\n private readonly _args: BuildSafeAddressContextTaskArgs,\n ) {}\n\n async run(): Promise<BuildSafeAddressContextTaskResult> {\n const challengeResponse = await this._api.sendCommand(\n new GetChallengeCommand(),\n );\n\n if (!isSuccessCommandResult(challengeResponse)) {\n throw new Error(\"Failed to get challenge\");\n }\n\n const challenge = challengeResponse.data.challenge;\n\n const contexts = await this._args.contextModule.getContexts(\n {\n safeContractAddress: this._args.safeContractAddress,\n chainId: this._args.options.chainId,\n deviceModelId: this._args.deviceModelId,\n challenge,\n },\n [ClearSignContextType.SAFE, ClearSignContextType.SIGNER],\n );\n\n contexts.forEach((context) => {\n if (context.type === ClearSignContextType.ERROR) {\n throw new Error(context.error.message);\n }\n });\n\n // should contain one SAFE and one SIGNER context\n if (\n contexts.length !== 2 ||\n contexts.find((context) => context.type === ClearSignContextType.SAFE) ===\n undefined ||\n contexts.find(\n (context) => context.type === ClearSignContextType.SIGNER,\n ) === undefined\n ) {\n throw new Error(\"Invalid safe address contexts\");\n }\n\n return {\n clearSignContexts: contexts as ClearSignContextSuccess[],\n };\n }\n}\n"],
5
+ "mappings": "AAAA,OAEE,wBAAAA,MAEK,2BACP,OAGE,0BAAAC,MACK,kCAGP,OAAS,uBAAAC,MAA2B,mDAa7B,MAAMC,CAA4B,CACvC,YACmBC,EACAC,EACjB,CAFiB,UAAAD,EACA,WAAAC,CAChB,CAEH,MAAM,KAAkD,CACtD,MAAMC,EAAoB,MAAM,KAAK,KAAK,YACxC,IAAIJ,CACN,EAEA,GAAI,CAACD,EAAuBK,CAAiB,EAC3C,MAAM,IAAI,MAAM,yBAAyB,EAG3C,MAAMC,EAAYD,EAAkB,KAAK,UAEnCE,EAAW,MAAM,KAAK,MAAM,cAAc,YAC9C,CACE,oBAAqB,KAAK,MAAM,oBAChC,QAAS,KAAK,MAAM,QAAQ,QAC5B,cAAe,KAAK,MAAM,cAC1B,UAAAD,CACF,EACA,CAACP,EAAqB,KAAMA,EAAqB,MAAM,CACzD,EASA,GAPAQ,EAAS,QAASC,GAAY,CAC5B,GAAIA,EAAQ,OAAST,EAAqB,MACxC,MAAM,IAAI,MAAMS,EAAQ,MAAM,OAAO,CAEzC,CAAC,EAICD,EAAS,SAAW,GACpBA,EAAS,KAAMC,GAAYA,EAAQ,OAAST,EAAqB,IAAI,IACnE,QACFQ,EAAS,KACNC,GAAYA,EAAQ,OAAST,EAAqB,MACrD,IAAM,OAEN,MAAM,IAAI,MAAM,+BAA+B,EAGjD,MAAO,CACL,kBAAmBQ,CACrB,CACF,CACF",
6
+ "names": ["ClearSignContextType", "isSuccessCommandResult", "GetChallengeCommand", "BuildSafeAddressContextTask", "_api", "_args", "challengeResponse", "challenge", "contexts", "context"]
7
+ }