@ledgerhq/device-signer-kit-ethereum 1.4.0 → 1.6.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 (349) hide show
  1. package/README.md +53 -0
  2. package/lib/cjs/api/SignerEth.js +1 -1
  3. package/lib/cjs/api/SignerEth.js.map +1 -1
  4. package/lib/cjs/api/app-binder/SignDelegationAuthorizationTypes.js +2 -0
  5. package/lib/cjs/api/app-binder/SignDelegationAuthorizationTypes.js.map +7 -0
  6. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  7. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  8. package/lib/cjs/api/index.js +1 -1
  9. package/lib/cjs/api/index.js.map +2 -2
  10. package/lib/cjs/api/model/ClearSigningType.js +2 -0
  11. package/lib/cjs/api/model/ClearSigningType.js.map +7 -0
  12. package/lib/cjs/internal/DefaultSignerEth.js +1 -1
  13. package/lib/cjs/internal/DefaultSignerEth.js.map +3 -3
  14. package/lib/cjs/internal/DefaultSignerEth.test.js +1 -1
  15. package/lib/cjs/internal/DefaultSignerEth.test.js.map +3 -3
  16. package/lib/cjs/internal/address/di/addressModule.js +1 -1
  17. package/lib/cjs/internal/address/di/addressModule.js.map +3 -3
  18. package/lib/cjs/internal/address/di/addressModule.test.js +1 -1
  19. package/lib/cjs/internal/address/di/addressModule.test.js.map +2 -2
  20. package/lib/cjs/internal/app-binder/EthAppBinder.js +1 -1
  21. package/lib/cjs/internal/app-binder/EthAppBinder.js.map +3 -3
  22. package/lib/cjs/internal/app-binder/EthAppBinder.test.js +1 -1
  23. package/lib/cjs/internal/app-binder/EthAppBinder.test.js.map +3 -3
  24. package/lib/cjs/internal/app-binder/command/ProvideProxyInfoCommand.js +2 -0
  25. package/lib/cjs/internal/app-binder/command/ProvideProxyInfoCommand.js.map +7 -0
  26. package/lib/cjs/internal/app-binder/command/ProvideProxyInfoCommand.test.js +2 -0
  27. package/lib/cjs/internal/app-binder/command/ProvideProxyInfoCommand.test.js.map +7 -0
  28. package/lib/cjs/internal/app-binder/command/SignAuthorizationDelegationCommand.js +2 -0
  29. package/lib/cjs/internal/app-binder/command/SignAuthorizationDelegationCommand.js.map +7 -0
  30. package/lib/cjs/internal/app-binder/command/SignAuthorizationDelegationCommand.test.js +2 -0
  31. package/lib/cjs/internal/app-binder/command/SignAuthorizationDelegationCommand.test.js.map +7 -0
  32. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
  33. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
  34. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  35. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  36. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
  37. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +3 -3
  38. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
  39. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +2 -2
  40. package/lib/cjs/internal/app-binder/di/appBinderModule.js +1 -1
  41. package/lib/cjs/internal/app-binder/di/appBinderModule.js.map +3 -3
  42. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
  43. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +2 -2
  44. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.js +2 -0
  45. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.js.map +7 -0
  46. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.test.js +2 -0
  47. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.test.js.map +7 -0
  48. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  49. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +3 -3
  50. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  51. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  52. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.js +1 -1
  53. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.js.map +3 -3
  54. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.test.js +1 -1
  55. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.test.js.map +3 -3
  56. package/lib/cjs/internal/app-binder/task/PreBuildContextTask.js +2 -0
  57. package/lib/cjs/internal/app-binder/task/PreBuildContextTask.js.map +7 -0
  58. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  59. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +2 -2
  60. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  61. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  62. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  63. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  64. package/lib/cjs/internal/app-binder/task/SendPayloadInChunksTask.js +1 -1
  65. package/lib/cjs/internal/app-binder/task/SendPayloadInChunksTask.js.map +1 -1
  66. package/lib/cjs/internal/app-binder/task/SendSignAuthorizationDelegationTask.js +2 -0
  67. package/lib/cjs/internal/app-binder/task/SendSignAuthorizationDelegationTask.js.map +7 -0
  68. package/lib/cjs/internal/app-binder/task/SendSignAuthorizationDelegationTask.test.js +2 -0
  69. package/lib/cjs/internal/app-binder/task/SendSignAuthorizationDelegationTask.test.js.map +7 -0
  70. package/lib/cjs/internal/app-binder/task/SendSignTransactionTask.js +1 -1
  71. package/lib/cjs/internal/app-binder/task/SendSignTransactionTask.js.map +3 -3
  72. package/lib/cjs/internal/app-binder/task/SendSignTransactionTask.test.js +1 -1
  73. package/lib/cjs/internal/app-binder/task/SendSignTransactionTask.test.js.map +3 -3
  74. package/lib/cjs/internal/di.js +1 -1
  75. package/lib/cjs/internal/di.js.map +3 -3
  76. package/lib/cjs/internal/eip7702/di/eip7702Module.js +2 -0
  77. package/lib/cjs/internal/eip7702/di/eip7702Module.js.map +7 -0
  78. package/lib/cjs/internal/eip7702/di/eip7702Module.test.js +2 -0
  79. package/lib/cjs/internal/eip7702/di/eip7702Module.test.js.map +7 -0
  80. package/lib/cjs/internal/eip7702/di/eip7702Types.js +2 -0
  81. package/lib/cjs/internal/eip7702/di/eip7702Types.js.map +7 -0
  82. package/lib/cjs/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.js +2 -0
  83. package/lib/cjs/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.js.map +7 -0
  84. package/lib/cjs/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.test.js +2 -0
  85. package/lib/cjs/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.test.js.map +7 -0
  86. package/lib/cjs/internal/message/di/messageModule.js +1 -1
  87. package/lib/cjs/internal/message/di/messageModule.js.map +3 -3
  88. package/lib/cjs/internal/message/di/messageModule.test.js +1 -1
  89. package/lib/cjs/internal/message/di/messageModule.test.js.map +2 -2
  90. package/lib/cjs/internal/shared/utils/ApplicationChecker.js +1 -1
  91. package/lib/cjs/internal/shared/utils/ApplicationChecker.js.map +3 -3
  92. package/lib/cjs/internal/shared/utils/ApplicationChecker.test.js +1 -1
  93. package/lib/cjs/internal/shared/utils/ApplicationChecker.test.js.map +2 -2
  94. package/lib/cjs/internal/transaction/di/transactionModule.js +1 -1
  95. package/lib/cjs/internal/transaction/di/transactionModule.js.map +3 -3
  96. package/lib/cjs/internal/transaction/di/transactionModule.test.js +1 -1
  97. package/lib/cjs/internal/transaction/di/transactionModule.test.js.map +2 -2
  98. package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.js +2 -0
  99. package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.js.map +7 -0
  100. package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.test.js +2 -0
  101. package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.test.js.map +7 -0
  102. package/lib/cjs/internal/transaction/service/mapper/TransactionMapperService.js +1 -1
  103. package/lib/cjs/internal/transaction/service/mapper/TransactionMapperService.js.map +3 -3
  104. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.js +1 -1
  105. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.js.map +3 -3
  106. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.test.js +1 -1
  107. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.test.js.map +3 -3
  108. package/lib/cjs/internal/typed-data/di/typedDataModule.js +1 -1
  109. package/lib/cjs/internal/typed-data/di/typedDataModule.js.map +3 -3
  110. package/lib/cjs/internal/typed-data/di/typedDataModule.test.js +1 -1
  111. package/lib/cjs/internal/typed-data/di/typedDataModule.test.js.map +2 -2
  112. package/lib/cjs/package.json +3 -4
  113. package/lib/esm/api/app-binder/SignDelegationAuthorizationTypes.js +1 -0
  114. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  115. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  116. package/lib/esm/api/index.js +1 -1
  117. package/lib/esm/api/index.js.map +2 -2
  118. package/lib/esm/api/model/ClearSigningType.js +2 -0
  119. package/lib/esm/api/model/ClearSigningType.js.map +7 -0
  120. package/lib/esm/internal/DefaultSignerEth.js +1 -1
  121. package/lib/esm/internal/DefaultSignerEth.js.map +3 -3
  122. package/lib/esm/internal/DefaultSignerEth.test.js +1 -1
  123. package/lib/esm/internal/DefaultSignerEth.test.js.map +3 -3
  124. package/lib/esm/internal/address/di/addressModule.js +1 -1
  125. package/lib/esm/internal/address/di/addressModule.js.map +3 -3
  126. package/lib/esm/internal/address/di/addressModule.test.js +1 -1
  127. package/lib/esm/internal/address/di/addressModule.test.js.map +2 -2
  128. package/lib/esm/internal/app-binder/EthAppBinder.js +1 -1
  129. package/lib/esm/internal/app-binder/EthAppBinder.js.map +3 -3
  130. package/lib/esm/internal/app-binder/EthAppBinder.test.js +1 -1
  131. package/lib/esm/internal/app-binder/EthAppBinder.test.js.map +3 -3
  132. package/lib/esm/internal/app-binder/command/ProvideProxyInfoCommand.js +2 -0
  133. package/lib/esm/internal/app-binder/command/ProvideProxyInfoCommand.js.map +7 -0
  134. package/lib/esm/internal/app-binder/command/ProvideProxyInfoCommand.test.js +2 -0
  135. package/lib/esm/internal/app-binder/command/ProvideProxyInfoCommand.test.js.map +7 -0
  136. package/lib/esm/internal/app-binder/command/SignAuthorizationDelegationCommand.js +2 -0
  137. package/lib/esm/internal/app-binder/command/SignAuthorizationDelegationCommand.js.map +7 -0
  138. package/lib/esm/internal/app-binder/command/SignAuthorizationDelegationCommand.test.js +2 -0
  139. package/lib/esm/internal/app-binder/command/SignAuthorizationDelegationCommand.test.js.map +7 -0
  140. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
  141. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
  142. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  143. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  144. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
  145. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +3 -3
  146. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
  147. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +2 -2
  148. package/lib/esm/internal/app-binder/di/appBinderModule.js +1 -1
  149. package/lib/esm/internal/app-binder/di/appBinderModule.js.map +3 -3
  150. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
  151. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +2 -2
  152. package/lib/esm/internal/app-binder/task/BuildSubContextTask.js +2 -0
  153. package/lib/esm/internal/app-binder/task/BuildSubContextTask.js.map +7 -0
  154. package/lib/esm/internal/app-binder/task/BuildSubContextTask.test.js +2 -0
  155. package/lib/esm/internal/app-binder/task/BuildSubContextTask.test.js.map +7 -0
  156. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  157. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +3 -3
  158. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  159. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  160. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.js +1 -1
  161. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.js.map +3 -3
  162. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.test.js +1 -1
  163. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.test.js.map +3 -3
  164. package/lib/esm/internal/app-binder/task/PreBuildContextTask.js +2 -0
  165. package/lib/esm/internal/app-binder/task/PreBuildContextTask.js.map +7 -0
  166. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  167. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +2 -2
  168. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  169. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  170. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  171. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  172. package/lib/esm/internal/app-binder/task/SendPayloadInChunksTask.js +1 -1
  173. package/lib/esm/internal/app-binder/task/SendPayloadInChunksTask.js.map +1 -1
  174. package/lib/esm/internal/app-binder/task/SendSignAuthorizationDelegationTask.js +2 -0
  175. package/lib/esm/internal/app-binder/task/SendSignAuthorizationDelegationTask.js.map +7 -0
  176. package/lib/esm/internal/app-binder/task/SendSignAuthorizationDelegationTask.test.js +2 -0
  177. package/lib/esm/internal/app-binder/task/SendSignAuthorizationDelegationTask.test.js.map +7 -0
  178. package/lib/esm/internal/app-binder/task/SendSignTransactionTask.js +1 -1
  179. package/lib/esm/internal/app-binder/task/SendSignTransactionTask.js.map +3 -3
  180. package/lib/esm/internal/app-binder/task/SendSignTransactionTask.test.js +1 -1
  181. package/lib/esm/internal/app-binder/task/SendSignTransactionTask.test.js.map +3 -3
  182. package/lib/esm/internal/di.js +1 -1
  183. package/lib/esm/internal/di.js.map +3 -3
  184. package/lib/esm/internal/eip7702/di/eip7702Module.js +2 -0
  185. package/lib/esm/internal/eip7702/di/eip7702Module.js.map +7 -0
  186. package/lib/esm/internal/eip7702/di/eip7702Module.test.js +2 -0
  187. package/lib/esm/internal/eip7702/di/eip7702Module.test.js.map +7 -0
  188. package/lib/esm/internal/eip7702/di/eip7702Types.js +2 -0
  189. package/lib/esm/internal/eip7702/di/eip7702Types.js.map +7 -0
  190. package/lib/esm/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.js +2 -0
  191. package/lib/esm/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.js.map +7 -0
  192. package/lib/esm/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.test.js +2 -0
  193. package/lib/esm/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.test.js.map +7 -0
  194. package/lib/esm/internal/message/di/messageModule.js +1 -1
  195. package/lib/esm/internal/message/di/messageModule.js.map +3 -3
  196. package/lib/esm/internal/message/di/messageModule.test.js +1 -1
  197. package/lib/esm/internal/message/di/messageModule.test.js.map +2 -2
  198. package/lib/esm/internal/shared/utils/ApplicationChecker.js +1 -1
  199. package/lib/esm/internal/shared/utils/ApplicationChecker.js.map +3 -3
  200. package/lib/esm/internal/shared/utils/ApplicationChecker.test.js +1 -1
  201. package/lib/esm/internal/shared/utils/ApplicationChecker.test.js.map +2 -2
  202. package/lib/esm/internal/transaction/di/transactionModule.js +1 -1
  203. package/lib/esm/internal/transaction/di/transactionModule.js.map +3 -3
  204. package/lib/esm/internal/transaction/di/transactionModule.test.js +1 -1
  205. package/lib/esm/internal/transaction/di/transactionModule.test.js.map +2 -2
  206. package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.js +2 -0
  207. package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.js.map +7 -0
  208. package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.test.js +2 -0
  209. package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.test.js.map +7 -0
  210. package/lib/esm/internal/transaction/service/mapper/TransactionMapperService.js +0 -1
  211. package/lib/esm/internal/transaction/service/mapper/TransactionMapperService.js.map +4 -4
  212. package/lib/esm/internal/transaction/service/parser/TransactionParserService.js +1 -1
  213. package/lib/esm/internal/transaction/service/parser/TransactionParserService.js.map +3 -3
  214. package/lib/esm/internal/transaction/service/parser/TransactionParserService.test.js +1 -1
  215. package/lib/esm/internal/transaction/service/parser/TransactionParserService.test.js.map +3 -3
  216. package/lib/esm/internal/typed-data/di/typedDataModule.js +1 -1
  217. package/lib/esm/internal/typed-data/di/typedDataModule.js.map +3 -3
  218. package/lib/esm/internal/typed-data/di/typedDataModule.test.js +1 -1
  219. package/lib/esm/internal/typed-data/di/typedDataModule.test.js.map +2 -2
  220. package/lib/esm/package.json +3 -4
  221. package/lib/types/api/SignerEth.d.ts +4 -2
  222. package/lib/types/api/SignerEth.d.ts.map +1 -1
  223. package/lib/types/api/app-binder/SignDelegationAuthorizationTypes.d.ts +19 -0
  224. package/lib/types/api/app-binder/SignDelegationAuthorizationTypes.d.ts.map +1 -0
  225. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +8 -9
  226. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  227. package/lib/types/api/index.d.ts +5 -0
  228. package/lib/types/api/index.d.ts.map +1 -1
  229. package/lib/types/api/model/ClearSigningType.d.ts +5 -0
  230. package/lib/types/api/model/ClearSigningType.d.ts.map +1 -0
  231. package/lib/types/internal/DefaultSignerEth.d.ts +2 -0
  232. package/lib/types/internal/DefaultSignerEth.d.ts.map +1 -1
  233. package/lib/types/internal/address/di/addressModule.d.ts.map +1 -1
  234. package/lib/types/internal/app-binder/EthAppBinder.d.ts +8 -1
  235. package/lib/types/internal/app-binder/EthAppBinder.d.ts.map +1 -1
  236. package/lib/types/internal/app-binder/command/ProvideProxyInfoCommand.d.ts +20 -0
  237. package/lib/types/internal/app-binder/command/ProvideProxyInfoCommand.d.ts.map +1 -0
  238. package/lib/types/internal/app-binder/command/ProvideProxyInfoCommand.test.d.ts +2 -0
  239. package/lib/types/internal/app-binder/command/ProvideProxyInfoCommand.test.d.ts.map +1 -0
  240. package/lib/types/internal/app-binder/command/SignAuthorizationDelegationCommand.d.ts +29 -0
  241. package/lib/types/internal/app-binder/command/SignAuthorizationDelegationCommand.d.ts.map +1 -0
  242. package/lib/types/internal/app-binder/command/SignAuthorizationDelegationCommand.test.d.ts +2 -0
  243. package/lib/types/internal/app-binder/command/SignAuthorizationDelegationCommand.test.d.ts.map +1 -0
  244. package/lib/types/internal/app-binder/command/utils/ethAppErrors.d.ts.map +1 -1
  245. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts +14 -31
  246. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts.map +1 -1
  247. package/lib/types/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.d.ts.map +1 -1
  248. package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +1 -1
  249. package/lib/types/internal/app-binder/di/appBinderModule.d.ts.map +1 -1
  250. package/lib/types/internal/app-binder/task/BuildEIP712ContextTask.d.ts.map +1 -1
  251. package/lib/types/internal/app-binder/task/BuildSubContextTask.d.ts +20 -0
  252. package/lib/types/internal/app-binder/task/BuildSubContextTask.d.ts.map +1 -0
  253. package/lib/types/internal/app-binder/task/BuildSubContextTask.test.d.ts +2 -0
  254. package/lib/types/internal/app-binder/task/BuildSubContextTask.test.d.ts.map +1 -0
  255. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +10 -14
  256. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
  257. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.d.ts +2 -3
  258. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.d.ts.map +1 -1
  259. package/lib/types/internal/app-binder/task/PreBuildContextTask.d.ts +17 -0
  260. package/lib/types/internal/app-binder/task/PreBuildContextTask.d.ts.map +1 -0
  261. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +28 -22
  262. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
  263. package/lib/types/internal/app-binder/task/SendPayloadInChunksTask.d.ts +1 -2
  264. package/lib/types/internal/app-binder/task/SendPayloadInChunksTask.d.ts.map +1 -1
  265. package/lib/types/internal/app-binder/task/SendSignAuthorizationDelegationTask.d.ts +18 -0
  266. package/lib/types/internal/app-binder/task/SendSignAuthorizationDelegationTask.d.ts.map +1 -0
  267. package/lib/types/internal/app-binder/task/SendSignAuthorizationDelegationTask.test.d.ts +2 -0
  268. package/lib/types/internal/app-binder/task/SendSignAuthorizationDelegationTask.test.d.ts.map +1 -0
  269. package/lib/types/internal/app-binder/task/SendSignTransactionTask.d.ts +2 -1
  270. package/lib/types/internal/app-binder/task/SendSignTransactionTask.d.ts.map +1 -1
  271. package/lib/types/internal/di.d.ts.map +1 -1
  272. package/lib/types/internal/eip7702/di/eip7702Module.d.ts +3 -0
  273. package/lib/types/internal/eip7702/di/eip7702Module.d.ts.map +1 -0
  274. package/lib/types/internal/eip7702/di/eip7702Module.test.d.ts +2 -0
  275. package/lib/types/internal/eip7702/di/eip7702Module.test.d.ts.map +1 -0
  276. package/lib/types/internal/eip7702/di/eip7702Types.d.ts +4 -0
  277. package/lib/types/internal/eip7702/di/eip7702Types.d.ts.map +1 -0
  278. package/lib/types/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.d.ts +8 -0
  279. package/lib/types/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.d.ts.map +1 -0
  280. package/lib/types/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.test.d.ts +2 -0
  281. package/lib/types/internal/eip7702/use-case/SignDelegationAuthorizationUseCase.test.d.ts.map +1 -0
  282. package/lib/types/internal/message/di/messageModule.d.ts.map +1 -1
  283. package/lib/types/internal/shared/utils/ApplicationChecker.d.ts.map +1 -1
  284. package/lib/types/internal/transaction/di/transactionModule.d.ts.map +1 -1
  285. package/lib/types/internal/transaction/service/mapper/EthersTransactionMapperService.d.ts +8 -0
  286. package/lib/types/internal/transaction/service/mapper/EthersTransactionMapperService.d.ts.map +1 -0
  287. package/lib/types/internal/transaction/service/mapper/EthersTransactionMapperService.test.d.ts +2 -0
  288. package/lib/types/internal/transaction/service/mapper/EthersTransactionMapperService.test.d.ts.map +1 -0
  289. package/lib/types/internal/transaction/service/mapper/TransactionMapperService.d.ts +4 -7
  290. package/lib/types/internal/transaction/service/mapper/TransactionMapperService.d.ts.map +1 -1
  291. package/lib/types/internal/transaction/service/parser/TransactionParserService.d.ts +2 -2
  292. package/lib/types/internal/transaction/service/parser/TransactionParserService.d.ts.map +1 -1
  293. package/lib/types/internal/typed-data/di/typedDataModule.d.ts.map +1 -1
  294. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  295. package/package.json +8 -9
  296. package/lib/cjs/internal/app-binder/constant/plugins.js +0 -2
  297. package/lib/cjs/internal/app-binder/constant/plugins.js.map +0 -7
  298. package/lib/cjs/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js +0 -2
  299. package/lib/cjs/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js.map +0 -7
  300. package/lib/cjs/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.js +0 -2
  301. package/lib/cjs/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.js.map +0 -7
  302. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.js +0 -2
  303. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.js.map +0 -7
  304. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js +0 -2
  305. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js.map +0 -7
  306. package/lib/cjs/internal/transaction/service/mapper/EthersRawTransactionMapper.js +0 -2
  307. package/lib/cjs/internal/transaction/service/mapper/EthersRawTransactionMapper.js.map +0 -7
  308. package/lib/cjs/internal/transaction/service/mapper/EthersRawTransactionMapper.test.js +0 -2
  309. package/lib/cjs/internal/transaction/service/mapper/EthersRawTransactionMapper.test.js.map +0 -7
  310. package/lib/cjs/internal/transaction/service/mapper/TransactionMapper.js +0 -2
  311. package/lib/cjs/internal/transaction/service/mapper/TransactionMapper.js.map +0 -7
  312. package/lib/cjs/internal/transaction/service/mapper/TransactionMapperService.test.js +0 -2
  313. package/lib/cjs/internal/transaction/service/mapper/TransactionMapperService.test.js.map +0 -7
  314. package/lib/esm/internal/app-binder/constant/plugins.js +0 -2
  315. package/lib/esm/internal/app-binder/constant/plugins.js.map +0 -7
  316. package/lib/esm/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js +0 -2
  317. package/lib/esm/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js.map +0 -7
  318. package/lib/esm/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.js +0 -2
  319. package/lib/esm/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.js.map +0 -7
  320. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.js +0 -2
  321. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.js.map +0 -7
  322. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js +0 -2
  323. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js.map +0 -7
  324. package/lib/esm/internal/transaction/service/mapper/EthersRawTransactionMapper.js +0 -2
  325. package/lib/esm/internal/transaction/service/mapper/EthersRawTransactionMapper.js.map +0 -7
  326. package/lib/esm/internal/transaction/service/mapper/EthersRawTransactionMapper.test.js +0 -2
  327. package/lib/esm/internal/transaction/service/mapper/EthersRawTransactionMapper.test.js.map +0 -7
  328. package/lib/esm/internal/transaction/service/mapper/TransactionMapper.js +0 -1
  329. package/lib/esm/internal/transaction/service/mapper/TransactionMapperService.test.js +0 -2
  330. package/lib/esm/internal/transaction/service/mapper/TransactionMapperService.test.js.map +0 -7
  331. package/lib/types/internal/app-binder/constant/plugins.d.ts +0 -2
  332. package/lib/types/internal/app-binder/constant/plugins.d.ts.map +0 -1
  333. package/lib/types/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.d.ts +0 -80
  334. package/lib/types/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.d.ts.map +0 -1
  335. package/lib/types/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.d.ts +0 -2
  336. package/lib/types/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.d.ts.map +0 -1
  337. package/lib/types/internal/app-binder/task/ProvideTransactionGenericContextTask.d.ts +0 -28
  338. package/lib/types/internal/app-binder/task/ProvideTransactionGenericContextTask.d.ts.map +0 -1
  339. package/lib/types/internal/app-binder/task/ProvideTransactionGenericContextTask.test.d.ts +0 -2
  340. package/lib/types/internal/app-binder/task/ProvideTransactionGenericContextTask.test.d.ts.map +0 -1
  341. package/lib/types/internal/transaction/service/mapper/EthersRawTransactionMapper.d.ts +0 -7
  342. package/lib/types/internal/transaction/service/mapper/EthersRawTransactionMapper.d.ts.map +0 -1
  343. package/lib/types/internal/transaction/service/mapper/EthersRawTransactionMapper.test.d.ts +0 -2
  344. package/lib/types/internal/transaction/service/mapper/EthersRawTransactionMapper.test.d.ts.map +0 -1
  345. package/lib/types/internal/transaction/service/mapper/TransactionMapper.d.ts +0 -6
  346. package/lib/types/internal/transaction/service/mapper/TransactionMapper.d.ts.map +0 -1
  347. package/lib/types/internal/transaction/service/mapper/TransactionMapperService.test.d.ts +0 -2
  348. package/lib/types/internal/transaction/service/mapper/TransactionMapperService.test.d.ts.map +0 -1
  349. /package/lib/esm/{internal/transaction/service/mapper/TransactionMapper.js.map → api/app-binder/SignDelegationAuthorizationTypes.js.map} +0 -0
@@ -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()},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{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")}})});
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 };\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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",
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
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"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{ClearSignContextType as t}from"@ledgerhq/context-module";import{bufferToHexaString as u,isSuccessCommandResult as C}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as x}from"../../app-binder/command/GetChallengeCommand";class y{constructor(e,a){this.api=e;this.args=a}run(){const e=this.args.context;if(e.type===t.TRANSACTION_INFO||e.type===t.ENUM||e.type===t.WEB3_CHECK||e.type===t.PLUGIN||e.type===t.EXTERNAL_PLUGIN)return{subcontextCallbacks:[]};if(e.reference!==void 0&&"value"in e.reference&&e.reference.value!==void 0){const a={type:e.reference.type,chainId:this.args.subset.chainId,address:e.reference.value};return{subcontextCallbacks:[()=>this.args.contextModule.getContext(a)]}}if(e.reference!==void 0&&e.reference.valuePath!==void 0){const a=this.args.transactionParser.extractValue(this.args.subset,e.reference.valuePath);if(a.isRight()){const o=[];for(const r of a.extract()){if(e.reference.type===t.ENUM){const n=e.reference,s=r[r.length-1];if(!s)continue;const l=this.args.contextOptional.filter(c=>c.type===t.ENUM).find(c=>c.value===s&&c.id===n.id);l&&o.push(()=>Promise.resolve(l))}if(e.reference.type===t.TOKEN||e.reference.type===t.NFT){const n=e.reference,s=u(r.slice(Math.max(0,r.length-20)));o.push(()=>this.args.contextModule.getContext({type:n.type,chainId:this.args.subset.chainId,address:s}))}if(e.reference.type===t.TRUSTED_NAME){const n=e.reference;o.push(async()=>{const s=u(r.slice(Math.max(0,r.length-20))),i=await this.api.sendCommand(new x);return C(i)?await this.args.contextModule.getContext({type:n.type,chainId:this.args.subset.chainId,address:s,challenge:i.data.challenge,types:n.types,sources:n.sources}):{type:t.ERROR,error:new Error("Failed to get challenge")}})}}return{subcontextCallbacks:o}}}return{subcontextCallbacks:[]}}}export{y as BuildSubContextTask};
2
+ //# sourceMappingURL=BuildSubContextTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildSubContextTask.ts"],
4
+ "sourcesContent": ["import {\n type ClearSignContext,\n type ClearSignContextReference,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type TransactionFieldContext,\n type TransactionSubset,\n} from \"@ledgerhq/context-module\";\nimport {\n bufferToHexaString,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nexport type BuildSubContextTaskArgs = {\n readonly context: ClearSignContextSuccess;\n readonly contextOptional: ClearSignContextSuccess[];\n readonly transactionParser: TransactionParserService;\n readonly subset: TransactionSubset;\n readonly contextModule: ContextModule;\n};\n\nexport type BuildSubContextTaskResult = {\n subcontextCallbacks: (() => Promise<ClearSignContext>)[];\n};\n\nexport class BuildSubContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildSubContextTaskArgs,\n ) {}\n\n run(): BuildSubContextTaskResult {\n const context = this.args.context;\n\n if (\n context.type === ClearSignContextType.TRANSACTION_INFO ||\n context.type === ClearSignContextType.ENUM ||\n context.type === ClearSignContextType.WEB3_CHECK ||\n context.type === ClearSignContextType.PLUGIN ||\n context.type === ClearSignContextType.EXTERNAL_PLUGIN\n ) {\n return {\n subcontextCallbacks: [],\n };\n }\n\n // if the reference is a string, it means it is a direct address\n // and we don't need to extract the value from the transaction\n // as it is already provided in the reference\n if (\n context.reference !== undefined &&\n \"value\" in context.reference &&\n context.reference.value !== undefined\n ) {\n const transactionFieldContext: TransactionFieldContext = {\n type: context.reference.type,\n chainId: this.args.subset.chainId,\n address: context.reference.value,\n };\n\n return {\n subcontextCallbacks: [\n () => this.args.contextModule.getContext(transactionFieldContext),\n ],\n };\n }\n\n // if the reference is a path, it means we need to extract the value\n // from the transaction and provide it to the device\n if (\n context.reference !== undefined &&\n context.reference.valuePath !== undefined\n ) {\n // iterate on each reference and provide the context\n const referenceValues = this.args.transactionParser.extractValue(\n this.args.subset,\n context.reference.valuePath,\n );\n\n if (referenceValues.isRight()) {\n const subcontextCallbacks: (() => Promise<ClearSignContext>)[] = [];\n\n for (const value of referenceValues.extract()) {\n if (context.reference.type === ClearSignContextType.ENUM) {\n const reference: ClearSignContextReference<ClearSignContextType.ENUM> =\n context.reference;\n const enumValue = value[value.length - 1];\n if (!enumValue) continue;\n\n const enumsContext = this.args.contextOptional.filter(\n (c) => c.type === ClearSignContextType.ENUM,\n );\n\n const subcontext = enumsContext.find(\n (enumContext) =>\n enumContext.value === enumValue &&\n enumContext.id === reference.id,\n );\n\n if (subcontext) {\n subcontextCallbacks.push(() => Promise.resolve(subcontext));\n }\n }\n\n if (\n context.reference.type === ClearSignContextType.TOKEN ||\n context.reference.type === ClearSignContextType.NFT\n ) {\n const reference: ClearSignContextReference<\n ClearSignContextType.TOKEN | ClearSignContextType.NFT\n > = context.reference;\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n subcontextCallbacks.push(() =>\n this.args.contextModule.getContext({\n type: reference.type,\n chainId: this.args.subset.chainId,\n address,\n }),\n );\n }\n\n if (context.reference.type === ClearSignContextType.TRUSTED_NAME) {\n const reference: ClearSignContextReference<ClearSignContextType.TRUSTED_NAME> =\n context.reference;\n subcontextCallbacks.push(async () => {\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n // TODO: we need to return an error here\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get challenge\"),\n };\n }\n\n const subcontext = await this.args.contextModule.getContext({\n type: reference.type,\n chainId: this.args.subset.chainId,\n address,\n challenge: getChallengeResult.data.challenge,\n types: reference.types,\n sources: reference.sources,\n });\n\n return subcontext;\n });\n }\n }\n\n return {\n subcontextCallbacks,\n };\n }\n }\n\n return {\n subcontextCallbacks: [],\n };\n }\n}\n"],
5
+ "mappings": "AAAA,OAIE,wBAAAA,MAIK,2BACP,OACE,sBAAAC,EAEA,0BAAAC,MACK,kCAEP,OAAS,uBAAAC,MAA2B,mDAe7B,MAAMC,CAAoB,CAC/B,YACmBC,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,KAAiC,CAC/B,MAAMC,EAAU,KAAK,KAAK,QAE1B,GACEA,EAAQ,OAASP,EAAqB,kBACtCO,EAAQ,OAASP,EAAqB,MACtCO,EAAQ,OAASP,EAAqB,YACtCO,EAAQ,OAASP,EAAqB,QACtCO,EAAQ,OAASP,EAAqB,gBAEtC,MAAO,CACL,oBAAqB,CAAC,CACxB,EAMF,GACEO,EAAQ,YAAc,QACtB,UAAWA,EAAQ,WACnBA,EAAQ,UAAU,QAAU,OAC5B,CACA,MAAMC,EAAmD,CACvD,KAAMD,EAAQ,UAAU,KACxB,QAAS,KAAK,KAAK,OAAO,QAC1B,QAASA,EAAQ,UAAU,KAC7B,EAEA,MAAO,CACL,oBAAqB,CACnB,IAAM,KAAK,KAAK,cAAc,WAAWC,CAAuB,CAClE,CACF,CACF,CAIA,GACED,EAAQ,YAAc,QACtBA,EAAQ,UAAU,YAAc,OAChC,CAEA,MAAME,EAAkB,KAAK,KAAK,kBAAkB,aAClD,KAAK,KAAK,OACVF,EAAQ,UAAU,SACpB,EAEA,GAAIE,EAAgB,QAAQ,EAAG,CAC7B,MAAMC,EAA2D,CAAC,EAElE,UAAWC,KAASF,EAAgB,QAAQ,EAAG,CAC7C,GAAIF,EAAQ,UAAU,OAASP,EAAqB,KAAM,CACxD,MAAMY,EACJL,EAAQ,UACJM,EAAYF,EAAMA,EAAM,OAAS,CAAC,EACxC,GAAI,CAACE,EAAW,SAMhB,MAAMC,EAJe,KAAK,KAAK,gBAAgB,OAC5C,GAAM,EAAE,OAASd,EAAqB,IACzC,EAEgC,KAC7Be,GACCA,EAAY,QAAUF,GACtBE,EAAY,KAAOH,EAAU,EACjC,EAEIE,GACFJ,EAAoB,KAAK,IAAM,QAAQ,QAAQI,CAAU,CAAC,CAE9D,CAEA,GACEP,EAAQ,UAAU,OAASP,EAAqB,OAChDO,EAAQ,UAAU,OAASP,EAAqB,IAChD,CACA,MAAMY,EAEFL,EAAQ,UACNS,EAAUf,EACdU,EAAM,MAAM,KAAK,IAAI,EAAGA,EAAM,OAAS,EAAE,CAAC,CAC5C,EAEAD,EAAoB,KAAK,IACvB,KAAK,KAAK,cAAc,WAAW,CACjC,KAAME,EAAU,KAChB,QAAS,KAAK,KAAK,OAAO,QAC1B,QAAAI,CACF,CAAC,CACH,CACF,CAEA,GAAIT,EAAQ,UAAU,OAASP,EAAqB,aAAc,CAChE,MAAMY,EACJL,EAAQ,UACVG,EAAoB,KAAK,SAAY,CACnC,MAAMM,EAAUf,EACdU,EAAM,MAAM,KAAK,IAAI,EAAGA,EAAM,OAAS,EAAE,CAAC,CAC5C,EAEMM,EAAqB,MAAM,KAAK,IAAI,YACxC,IAAId,CACN,EACA,OAAKD,EAAuBe,CAAkB,EAQ3B,MAAM,KAAK,KAAK,cAAc,WAAW,CAC1D,KAAML,EAAU,KAChB,QAAS,KAAK,KAAK,OAAO,QAC1B,QAAAI,EACA,UAAWC,EAAmB,KAAK,UACnC,MAAOL,EAAU,MACjB,QAASA,EAAU,OACrB,CAAC,EAbQ,CACL,KAAMZ,EAAqB,MAC3B,MAAO,IAAI,MAAM,yBAAyB,CAC5C,CAaJ,CAAC,CACH,CACF,CAEA,MAAO,CACL,oBAAAU,CACF,CACF,CACF,CAEA,MAAO,CACL,oBAAqB,CAAC,CACxB,CACF,CACF",
6
+ "names": ["ClearSignContextType", "bufferToHexaString", "isSuccessCommandResult", "GetChallengeCommand", "BuildSubContextTask", "api", "args", "context", "transactionFieldContext", "referenceValues", "subcontextCallbacks", "value", "reference", "enumValue", "subcontext", "enumContext", "address", "getChallengeResult"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ClearSignContextType as e}from"@ledgerhq/context-module";import{CommandResultFactory as b,UnknownDeviceExchangeError as k}from"@ledgerhq/device-management-kit";import{Left as E,Right as p}from"purify-ts";import{GetChallengeCommand as T}from"../../app-binder/command/GetChallengeCommand";import{makeDeviceActionInternalApiMock as f}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildSubContextTask as u}from"./BuildSubContextTask";describe("BuildSubContextTask",()=>{const x={getContext:vi.fn()},d={extractValue:vi.fn()},s=f();let l;beforeEach(()=>{vi.resetAllMocks(),l={context:{type:e.TRANSACTION_INFO,payload:"test payload"},contextOptional:[],transactionParser:d,subset:{chainId:1,data:"0x",selector:"0x",to:"0x",value:BigInt(0)},contextModule:x}}),describe("when context type is a simple type",()=>{const n=[e.TRANSACTION_INFO,e.WEB3_CHECK,e.PLUGIN,e.EXTERNAL_PLUGIN,e.TRANSACTION_FIELD_DESCRIPTION];it.each(n)("should return context with empty subcontextCallbacks for %s",t=>{const c={...l,context:{type:t,payload:"test payload"}},o=new u(s,c).run();expect(o.subcontextCallbacks).toHaveLength(0)})}),describe("when context has a direct value reference",()=>{it("should create a callback to get context with the direct value",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,value:"0x1234567890123456789012345678901234567890"}},t={...l,context:n},a={type:e.TOKEN,chainId:1,address:"0x1234567890123456789012345678901234567890"},c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0];await o(),expect(x.getContext).toHaveBeenCalledWith(a)}),it("should handle undefined value in reference",()=>{const n={type:e.TOKEN,payload:"test payload",reference:void 0},t={...l,context:n},a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when context has a valuePath reference",()=>{beforeEach(()=>{s.sendCommand.mockResolvedValue(b({data:{challenge:"test-challenge"}}))}),describe("when extractValue returns Left (error)",()=>{it("should return context with empty subcontextCallbacks",()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"SLICE",start:0,end:20}]}},t={...l,context:n};d.extractValue.mockReturnValue(E(new Error("Extraction failed")));const a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when extractValue returns Right with values",()=>{describe("for ENUM type",()=>{it("should create callbacks for matching enum contexts",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ENUM,id:1,value:2,payload:"enum context 2"},c={type:e.ENUM,id:2,value:2,payload:"enum context 3"},o={...l,context:n,contextOptional:[t,a,c]},r=[new Uint8Array([1,2])];d.extractValue.mockReturnValue(p(r));const i=new u(s,o).run();expect(i.subcontextCallbacks).toHaveLength(1);const y=i.subcontextCallbacks[0],C=await y();expect(C).toEqual(a)}),it("should create callbacks for matching enum contexts with two values",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ENUM,id:1,value:2,payload:"enum context 2"},c={type:e.ENUM,id:2,value:2,payload:"enum context 3"},o={...l,context:n,contextOptional:[t,a,c]},r=[new Uint8Array([1,2]),new Uint8Array([3,2,1])];d.extractValue.mockReturnValue(p(r));const i=new u(s,o).run();expect(i.subcontextCallbacks).toHaveLength(2);const y=i.subcontextCallbacks[0],C=i.subcontextCallbacks[1],h=await y(),g=await C();expect(h).toEqual(a),expect(g).toEqual(t)}),it("should skip when enum value is undefined",()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([])];d.extractValue.mockReturnValue(p(a));const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(0)}),it("should skip when no matching enum context found",()=>{const n={type:e.NFT,payload:"test payload",reference:{type:e.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:2,value:2,payload:"enum context"},a={...l,context:n,contextOptional:[t]},c=[new Uint8Array([1,2])];d.extractValue.mockReturnValue(p(c));const o=new u(s,a).run();expect(o.subcontextCallbacks).toHaveLength(0)})}),describe("for TOKEN type",()=>{it("should create callbacks to get token context",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getContext).toHaveBeenCalledWith({type:e.TOKEN,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"})})}),describe("for NFT type",()=>{it("should create callbacks to get NFT context",async()=>{const n={type:e.NFT,payload:"test payload",reference:{type:e.NFT,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.NFT,payload:"nft result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.NFT,payload:"nft result"}),expect(x.getContext).toHaveBeenCalledWith({type:e.NFT,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"})})}),describe("for TRUSTED_NAME type",()=>{it("should create callbacks to get trusted name context with challenge",async()=>{const n={type:e.TRUSTED_NAME,payload:"test payload",reference:{type:e.TRUSTED_NAME,valuePath:[{type:"TUPLE",offset:0}],types:["type1","type2"],sources:["source1","source2"]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.TRUSTED_NAME,payload:"trusted name result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.TRUSTED_NAME,payload:"trusted name result"}),expect(s.sendCommand).toHaveBeenCalledWith(expect.any(T)),expect(x.getContext).toHaveBeenCalledWith({type:e.TRUSTED_NAME,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516",challenge:"test-challenge",types:["type1","type2"],sources:["source1","source2"]})}),it("should handle challenge command failure",async()=>{const n={type:e.TRUSTED_NAME,payload:"test payload",reference:{type:e.TRUSTED_NAME,valuePath:[{type:"TUPLE",offset:0}],types:["type1"],sources:["source1"]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];d.extractValue.mockReturnValue(p(a));const c=new k("Failed");s.sendCommand.mockResolvedValueOnce(b({error:c}));const o=new u(s,t).run();expect(o.subcontextCallbacks).toHaveLength(1);const r=o.subcontextCallbacks[0],i=await r();expect(i).toEqual({error:new Error("Failed to get challenge"),type:e.ERROR})})}),describe("for multiple values",()=>{it("should create callbacks for each extracted value",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]),new Uint8Array([33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValueOnce({type:e.TOKEN,payload:"token result 1"}),x.getContext.mockResolvedValueOnce({type:e.TOKEN,payload:"token result 2"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(2);const o=c.subcontextCallbacks[0],r=c.subcontextCallbacks[1],i=await o(),y=await r();expect(i).toEqual({type:e.TOKEN,payload:"token result 1"}),expect(y).toEqual({type:e.TOKEN,payload:"token result 2"}),expect(x.getContext).toHaveBeenCalledTimes(2),expect(x.getContext).toHaveBeenNthCalledWith(1,{type:e.TOKEN,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"}),expect(x.getContext).toHaveBeenNthCalledWith(2,{type:e.TOKEN,chainId:1,address:"0x232425262728292a2b2c2d2e2f30313233343536"})})})})}),describe("when context has no reference",()=>{it("should return context with empty subcontextCallbacks",()=>{const n={type:e.TOKEN,payload:"test payload"},t={...l,context:n},a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when context has reference but no valuePath",()=>{it("should return context with empty subcontextCallbacks",()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN}},t={...l,context:n},a=new u(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("edge cases",()=>{it("should handle value array shorter than 20 bytes for address extraction",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.ERROR,message:"Invalid address"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.ERROR,message:"Invalid address"}),expect(x.getContext).toHaveBeenCalledWith({type:e.TOKEN,chainId:1,address:"0x010203"})}),it("should handle empty value array",async()=>{const n={type:e.TOKEN,payload:"test payload",reference:{type:e.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([])];d.extractValue.mockReturnValue(p(a)),x.getContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const c=new u(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],r=await o();expect(r).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getContext).toHaveBeenCalledWith({type:e.TOKEN,chainId:1,address:"0x"})})})});
2
+ //# sourceMappingURL=BuildSubContextTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildSubContextTask.test.ts"],
4
+ "sourcesContent": ["import {\n type ClearSignContextReference,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type TransactionFieldContext,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nimport {\n BuildSubContextTask,\n type BuildSubContextTaskArgs,\n} from \"./BuildSubContextTask\";\n\ndescribe(\"BuildSubContextTask\", () => {\n const contextModuleMock = {\n getContext: vi.fn(),\n };\n const transactionParserMock = {\n extractValue: vi.fn(),\n };\n const apiMock = makeDeviceActionInternalApiMock();\n\n let defaultArgs: BuildSubContextTaskArgs;\n\n beforeEach(() => {\n vi.resetAllMocks();\n defaultArgs = {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"test payload\",\n },\n contextOptional: [],\n transactionParser:\n transactionParserMock as unknown as TransactionParserService,\n subset: {\n chainId: 1,\n data: \"0x\",\n selector: \"0x\",\n to: \"0x\",\n value: BigInt(0),\n },\n contextModule: contextModuleMock as unknown as ContextModule,\n };\n });\n\n describe(\"when context type is a simple type\", () => {\n const simpleTypes: ClearSignContextSuccess[\"type\"][] = [\n ClearSignContextType.TRANSACTION_INFO,\n ClearSignContextType.WEB3_CHECK,\n ClearSignContextType.PLUGIN,\n ClearSignContextType.EXTERNAL_PLUGIN,\n ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n ];\n\n it.each(simpleTypes)(\n \"should return context with empty subcontextCallbacks for %s\",\n (type) => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type,\n payload: \"test payload\",\n } as ClearSignContextSuccess;\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n },\n );\n });\n\n describe(\"when context has a direct value reference\", () => {\n it(\"should create a callback to get context with the direct value\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.TOKEN,\n value: \"0x1234567890123456789012345678901234567890\",\n },\n };\n const args = { ...defaultArgs, context };\n const expectedContext: TransactionFieldContext = {\n type: ClearSignContextType.TOKEN,\n chainId: 1,\n address: \"0x1234567890123456789012345678901234567890\",\n };\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n\n // Verify the callback calls getContext with correct parameters\n const callback = result.subcontextCallbacks[0]!;\n await callback();\n expect(contextModuleMock.getContext).toHaveBeenCalledWith(\n expectedContext,\n );\n });\n\n it(\"should handle undefined value in reference\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n reference: undefined as unknown as ClearSignContextReference,\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"when context has a valuePath reference\", () => {\n beforeEach(() => {\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { challenge: \"test-challenge\" } }),\n );\n });\n\n describe(\"when extractValue returns Left (error)\", () => {\n it(\"should return context with empty subcontextCallbacks\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.TOKEN,\n valuePath: [{ type: \"SLICE\", start: 0, end: 20 }],\n },\n };\n const args = { ...defaultArgs, context };\n transactionParserMock.extractValue.mockReturnValue(\n Left(new Error(\"Extraction failed\")),\n );\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"when extractValue returns Right with values\", () => {\n describe(\"for ENUM type\", () => {\n it(\"should create callbacks for matching enum contexts\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n // enum with the same id but different value\n const enumContext1: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 1,\n payload: \"enum context 1\",\n };\n // enum to select, id and value match\n const enumContext2: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 2,\n payload: \"enum context 2\",\n };\n // other enum context with different id\n const enumContext3: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 2,\n value: 2,\n payload: \"enum context 3\",\n };\n const args = {\n ...defaultArgs,\n context,\n contextOptional: [enumContext1, enumContext2, enumContext3],\n };\n const extractedValues = [new Uint8Array([0x01, 0x02])]; // Last byte is 2\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual(enumContext2);\n });\n\n it(\"should create callbacks for matching enum contexts with two values\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n // enum to select, id and value match\n const enumContext1: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 1,\n payload: \"enum context 1\",\n };\n // enum to select, id and value match\n const enumContext2: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 2,\n payload: \"enum context 2\",\n };\n // other enum context with different id\n const enumContext3: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 2,\n value: 2,\n payload: \"enum context 3\",\n };\n const args = {\n ...defaultArgs,\n context,\n contextOptional: [enumContext1, enumContext2, enumContext3],\n };\n const extractedValues = [\n new Uint8Array([0x01, 0x02]),\n new Uint8Array([0x03, 0x02, 0x01]),\n ]; // Last byte is 2\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(2);\n const callback1 = result.subcontextCallbacks[0]!;\n const callback2 = result.subcontextCallbacks[1]!;\n const callbackResult1 = await callback1();\n const callbackResult2 = await callback2();\n expect(callbackResult1).toEqual(enumContext2);\n expect(callbackResult2).toEqual(enumContext1);\n });\n\n it(\"should skip when enum value is undefined\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [new Uint8Array([])]; // Empty array\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n\n it(\"should skip when no matching enum context found\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.NFT,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const enumContext: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 2, // Different ID\n value: 2,\n payload: \"enum context\",\n };\n const args = {\n ...defaultArgs,\n context,\n contextOptional: [enumContext],\n };\n const extractedValues = [new Uint8Array([0x01, 0x02])];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"for TOKEN type\", () => {\n it(\"should create callbacks to get token context\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getContext.mockResolvedValue({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n expect(contextModuleMock.getContext).toHaveBeenCalledWith({\n type: ClearSignContextType.TOKEN,\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n });\n });\n });\n\n describe(\"for NFT type\", () => {\n it(\"should create callbacks to get NFT context\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.NFT,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.NFT,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getContext.mockResolvedValue({\n type: ClearSignContextType.NFT,\n payload: \"nft result\",\n });\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.NFT,\n payload: \"nft result\",\n });\n expect(contextModuleMock.getContext).toHaveBeenCalledWith({\n type: ClearSignContextType.NFT,\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n });\n });\n });\n\n describe(\"for TRUSTED_NAME type\", () => {\n it(\"should create callbacks to get trusted name context with challenge\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.TRUSTED_NAME,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n types: [\"type1\", \"type2\"],\n sources: [\"source1\", \"source2\"],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getContext.mockResolvedValue({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"trusted name result\",\n });\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"trusted name result\",\n });\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n expect(contextModuleMock.getContext).toHaveBeenCalledWith({\n type: ClearSignContextType.TRUSTED_NAME,\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n challenge: \"test-challenge\",\n types: [\"type1\", \"type2\"],\n sources: [\"source1\", \"source2\"],\n });\n });\n\n it(\"should handle challenge command failure\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.TRUSTED_NAME,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n types: [\"type1\"],\n sources: [\"source1\"],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n const error = new UnknownDeviceExchangeError(\"Failed\");\n apiMock.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error,\n }),\n );\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n error: new Error(\"Failed to get challenge\"),\n type: ClearSignContextType.ERROR,\n });\n });\n });\n\n describe(\"for multiple values\", () => {\n it(\"should create callbacks for each extracted value\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n new Uint8Array([\n 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,\n 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getContext.mockResolvedValueOnce({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 1\",\n });\n contextModuleMock.getContext.mockResolvedValueOnce({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 2\",\n });\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(2);\n const callback1 = result.subcontextCallbacks[0]!;\n const callback2 = result.subcontextCallbacks[1]!;\n const callbackResult1 = await callback1();\n const callbackResult2 = await callback2();\n expect(callbackResult1).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 1\",\n });\n expect(callbackResult2).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 2\",\n });\n expect(contextModuleMock.getContext).toHaveBeenCalledTimes(2);\n expect(contextModuleMock.getContext).toHaveBeenNthCalledWith(1, {\n type: ClearSignContextType.TOKEN,\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n });\n expect(contextModuleMock.getContext).toHaveBeenNthCalledWith(2, {\n type: ClearSignContextType.TOKEN,\n chainId: 1,\n address: \"0x232425262728292a2b2c2d2e2f30313233343536\",\n });\n });\n });\n });\n });\n\n describe(\"when context has no reference\", () => {\n it(\"should return context with empty subcontextCallbacks\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"when context has reference but no valuePath\", () => {\n it(\"should return context with empty subcontextCallbacks\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.TOKEN,\n } as ClearSignContextReference<ClearSignContextType.TOKEN>,\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle value array shorter than 20 bytes for address extraction\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [new Uint8Array([0x01, 0x02, 0x03])]; // Only 3 bytes\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getContext.mockResolvedValue({\n type: ClearSignContextType.ERROR,\n message: \"Invalid address\",\n });\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.ERROR,\n message: \"Invalid address\",\n });\n expect(contextModuleMock.getContext).toHaveBeenCalledWith({\n type: ClearSignContextType.TOKEN,\n chainId: 1,\n address: \"0x010203\",\n });\n });\n\n it(\"should handle empty value array\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [new Uint8Array([])]; // Empty array\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getContext.mockResolvedValue({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n\n // WHEN\n const result = new BuildSubContextTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n\n // Verify the callback calls getContext with empty address\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n expect(contextModuleMock.getContext).toHaveBeenCalledWith({\n type: ClearSignContextType.TOKEN,\n chainId: 1,\n address: \"0x\",\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["ClearSignContextType", "CommandResultFactory", "UnknownDeviceExchangeError", "Left", "Right", "GetChallengeCommand", "makeDeviceActionInternalApiMock", "BuildSubContextTask", "contextModuleMock", "transactionParserMock", "apiMock", "defaultArgs", "simpleTypes", "type", "args", "result", "context", "expectedContext", "callback", "enumContext1", "enumContext2", "enumContext3", "extractedValues", "callbackResult", "callback1", "callback2", "callbackResult1", "callbackResult2", "enumContext", "error"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{ClearSignContextType as t}from"@ledgerhq/context-module";import{DeviceModelId as I,isSuccessCommandResult as k}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as A}from"../../app-binder/command/GetChallengeCommand";import{GetWeb3CheckTask as N}from"../../app-binder/task/GetWeb3CheckTask";import{ApplicationChecker as v}from"../../shared/utils/ApplicationChecker";class O{constructor(n,a,r=(s,o)=>new N(s,o)){this.api=n;this.args=a;this.getWeb3ChecksFactory=r}async run(){const{contextModule:n,mapper:a,transaction:r,options:s,appConfig:o,derivationPath:g}=this.args,p=this.api.getDeviceSessionState(),C=a.mapTransactionToSubset(r);C.ifLeft(e=>{throw e});const{subset:d,serializedTransaction:m,type:f}=C.unsafeCoerce();let y=null;o.web3ChecksEnabled&&(y=(await this.getWeb3ChecksFactory(this.api,{contextModule:n,derivationPath:g,mapper:a,transaction:r}).run()).web3Check);let S;const u=await this.api.sendCommand(new A);k(u)&&(S=u.data.challenge);const T=await n.getContexts({challenge:S,domain:s.domain,deviceModelId:p.deviceModelId,...d}),c=T.filter(e=>e.type!==t.ERROR&&e.type!==t.ENUM),x=T.filter(e=>e.type===t.ENUM);let l=[];const i=c.find(e=>e.type===t.TRANSACTION_INFO);if(!this.supportsGenericParser(p,o)||i===void 0)l=c.filter(e=>e.type!==t.TRANSACTION_INFO&&e.type!==t.TRANSACTION_FIELD_DESCRIPTION);else if(i.certificate){const e=c.filter(h=>h.type===t.TRANSACTION_FIELD_DESCRIPTION);l={transactionInfo:i.payload,transactionInfoCertificate:i.certificate,transactionFields:e,transactionEnums:x}}return{clearSignContexts:l,serializedTransaction:m,chainId:d.chainId,transactionType:f,web3Check:y}}supportsGenericParser(n,a){return new v(n,a).withMinVersionExclusive("1.14.0").excludeDeviceModel(I.NANO_S).check()}}export{O as BuildTransactionContextTask};
1
+ import{ClearSignContextType as t}from"@ledgerhq/context-module";import{DeviceModelId as T,isSuccessCommandResult as h}from"@ledgerhq/device-management-kit";import{ClearSigningType as x}from"../../../api/model/ClearSigningType";import{GetChallengeCommand as I}from"../../app-binder/command/GetChallengeCommand";import{GetWeb3CheckTask as A}from"../../app-binder/task/GetWeb3CheckTask";import{ApplicationChecker as N}from"../../shared/utils/ApplicationChecker";class M{constructor(n,a,s=(r,l)=>new A(r,l)){this._api=n;this._args=a;this.getWeb3ChecksFactory=s}async run(){const{contextModule:n,options:a,appConfig:s,derivationPath:r,transaction:l,subset:d}=this._args,c=this._api.getDeviceSessionState();let i=[],S=[],g=x.BASIC,o=null;s.web3ChecksEnabled&&(o=(await this.getWeb3ChecksFactory(this._api,{contextModule:n,derivationPath:r,subset:d,transaction:l}).run()).web3Check);let y;if(c.deviceModelId!==T.NANO_S){const e=await this._api.sendCommand(new I);h(e)&&(y=e.data.challenge)}const u=await n.getContexts({challenge:y,domain:a.domain,deviceModelId:c.deviceModelId,...d}),C=u.filter(e=>e.type!==t.ERROR&&e.type!==t.ENUM),m=u.filter(e=>e.type===t.ENUM),p=C.find(e=>e.type===t.TRANSACTION_INFO);if(!this.supportsGenericParser(c,s)||p===void 0)i=C.filter(e=>e.type!==t.TRANSACTION_INFO&&e.type!==t.TRANSACTION_FIELD_DESCRIPTION),o&&(i=[o,...i]);else if(p.certificate){const e=C.filter(f=>f.type===t.TRANSACTION_FIELD_DESCRIPTION);i=[p,...e,...o?[o]:[]],S=[...m],g=x.EIP7730}return{clearSignContexts:i,clearSignContextsOptional:S,clearSigningType:g}}supportsGenericParser(n,a){return new N(n,a).withMinVersionExclusive("1.14.0").excludeDeviceModel(T.NANO_S).check()}}export{M as BuildTransactionContextTask};
2
2
  //# sourceMappingURL=BuildTransactionContextTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.ts"],
4
- "sourcesContent": ["import {\n type ClearSignContextSuccess,\n type ClearSignContextSuccessType,\n ClearSignContextType,\n type ContextModule,\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 { type TransactionOptions } from \"@api/model/TransactionOptions\";\nimport { type TransactionType } from \"@api/model/TransactionType\";\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\";\nimport { type TransactionMapperService } from \"@internal/transaction/service/mapper/TransactionMapperService\";\n\nimport { type GenericContext } from \"./ProvideTransactionGenericContextTask\";\n\nexport type BuildTransactionTaskResult = {\n readonly clearSignContexts: ClearSignContextSuccess[] | GenericContext;\n readonly serializedTransaction: Uint8Array;\n readonly chainId: number;\n readonly transactionType: TransactionType;\n readonly web3Check: ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK> | null;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly mapper: TransactionMapperService;\n readonly transaction: Uint8Array;\n readonly options: TransactionOptions;\n readonly appConfig: GetConfigCommandResponse;\n readonly derivationPath: string;\n};\n\nexport class BuildTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildTransactionContextTaskArgs,\n private readonly getWeb3ChecksFactory = (\n api: InternalApi,\n args: GetWeb3CheckTaskArgs,\n ) => new GetWeb3CheckTask(api, args),\n ) {}\n\n async run(): Promise<BuildTransactionTaskResult> {\n const {\n contextModule,\n mapper,\n transaction,\n options,\n appConfig,\n derivationPath,\n } = this.args;\n const deviceState = this.api.getDeviceSessionState();\n\n // Parse transaction\n const parsed = mapper.mapTransactionToSubset(transaction);\n parsed.ifLeft((err) => {\n throw err;\n });\n const { subset, serializedTransaction, type } = parsed.unsafeCoerce();\n\n // Run the web3checks if needed\n let web3Check: ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK> | null =\n null;\n if (appConfig.web3ChecksEnabled) {\n web3Check = (\n await this.getWeb3ChecksFactory(this.api, {\n contextModule,\n derivationPath,\n mapper,\n transaction,\n }).run()\n ).web3Check;\n }\n\n // Get challenge\n let challenge: string | undefined = undefined;\n const challengeRes = await this.api.sendCommand(new GetChallengeCommand());\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n }\n\n // Get the clear sign contexts\n const clearSignContexts = await contextModule.getContexts({\n challenge: challenge,\n domain: options.domain,\n deviceModelId: deviceState.deviceModelId,\n ...subset,\n });\n\n // NOTE: we need to filter out the ENUM and ERROR types\n // ENUM are handled differently\n // ERROR are not handled at all for now\n const clearSignContextsSuccess: ClearSignContextSuccess<\n Exclude<ClearSignContextSuccessType, ClearSignContextType.ENUM>\n >[] = clearSignContexts.filter(\n (context) =>\n context.type !== ClearSignContextType.ERROR &&\n context.type !== ClearSignContextType.ENUM,\n );\n\n // Retrieve all ENUM contexts\n const transactionEnums: ClearSignContextSuccess<ClearSignContextType.ENUM>[] =\n clearSignContexts.filter(\n (context) => context.type === ClearSignContextType.ENUM,\n );\n\n let filteredContexts: ClearSignContextSuccess[] | GenericContext = [];\n const transactionInfo = clearSignContextsSuccess.find(\n (ctx) => ctx.type === ClearSignContextType.TRANSACTION_INFO,\n );\n\n // If the device does not support the generic parser,\n // we need to filter out the transaction info and transaction field description\n // as they are not supported by the device\n if (\n !this.supportsGenericParser(deviceState, appConfig) ||\n transactionInfo === undefined\n ) {\n filteredContexts = clearSignContextsSuccess.filter(\n (ctx) =>\n ctx.type !== ClearSignContextType.TRANSACTION_INFO &&\n ctx.type !== ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n );\n } else if (transactionInfo.certificate) {\n const transactionFields = clearSignContextsSuccess.filter(\n (ctx) =>\n ctx.type === ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n );\n filteredContexts = {\n transactionInfo: transactionInfo.payload,\n transactionInfoCertificate: transactionInfo.certificate!,\n transactionFields,\n transactionEnums,\n };\n }\n\n return {\n clearSignContexts: filteredContexts,\n serializedTransaction,\n chainId: subset.chainId,\n transactionType: type,\n web3Check,\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"],
5
- "mappings": "AAAA,OAGE,wBAAAA,MAEK,2BACP,OACE,iBAAAC,EAGA,0BAAAC,MACK,kCAKP,OAAS,uBAAAC,MAA2B,mDACpC,OACE,oBAAAC,MAEK,6CACP,OAAS,sBAAAC,MAA0B,4CAsB5B,MAAMC,CAA4B,CACvC,YACmBC,EACAC,EACAC,EAAuB,CACtCF,EACAC,IACG,IAAIJ,EAAiBG,EAAKC,CAAI,EACnC,CANiB,SAAAD,EACA,UAAAC,EACA,0BAAAC,CAIhB,CAEH,MAAM,KAA2C,CAC/C,KAAM,CACJ,cAAAC,EACA,OAAAC,EACA,YAAAC,EACA,QAAAC,EACA,UAAAC,EACA,eAAAC,CACF,EAAI,KAAK,KACHC,EAAc,KAAK,IAAI,sBAAsB,EAG7CC,EAASN,EAAO,uBAAuBC,CAAW,EACxDK,EAAO,OAAQC,GAAQ,CACrB,MAAMA,CACR,CAAC,EACD,KAAM,CAAE,OAAAC,EAAQ,sBAAAC,EAAuB,KAAAC,CAAK,EAAIJ,EAAO,aAAa,EAGpE,IAAIK,EACF,KACER,EAAU,oBACZQ,GACE,MAAM,KAAK,qBAAqB,KAAK,IAAK,CACxC,cAAAZ,EACA,eAAAK,EACA,OAAAJ,EACA,YAAAC,CACF,CAAC,EAAE,IAAI,GACP,WAIJ,IAAIW,EACJ,MAAMC,EAAe,MAAM,KAAK,IAAI,YAAY,IAAIrB,CAAqB,EACrED,EAAuBsB,CAAY,IACrCD,EAAYC,EAAa,KAAK,WAIhC,MAAMC,EAAoB,MAAMf,EAAc,YAAY,CACxD,UAAWa,EACX,OAAQV,EAAQ,OAChB,cAAeG,EAAY,cAC3B,GAAGG,CACL,CAAC,EAKKO,EAEAD,EAAkB,OACrBE,GACCA,EAAQ,OAAS3B,EAAqB,OACtC2B,EAAQ,OAAS3B,EAAqB,IAC1C,EAGM4B,EACJH,EAAkB,OACfE,GAAYA,EAAQ,OAAS3B,EAAqB,IACrD,EAEF,IAAI6B,EAA+D,CAAC,EACpE,MAAMC,EAAkBJ,EAAyB,KAC9CK,GAAQA,EAAI,OAAS/B,EAAqB,gBAC7C,EAKA,GACE,CAAC,KAAK,sBAAsBgB,EAAaF,CAAS,GAClDgB,IAAoB,OAEpBD,EAAmBH,EAAyB,OACzCK,GACCA,EAAI,OAAS/B,EAAqB,kBAClC+B,EAAI,OAAS/B,EAAqB,6BACtC,UACS8B,EAAgB,YAAa,CACtC,MAAME,EAAoBN,EAAyB,OAChDK,GACCA,EAAI,OAAS/B,EAAqB,6BACtC,EACA6B,EAAmB,CACjB,gBAAiBC,EAAgB,QACjC,2BAA4BA,EAAgB,YAC5C,kBAAAE,EACA,iBAAAJ,CACF,CACF,CAEA,MAAO,CACL,kBAAmBC,EACnB,sBAAAT,EACA,QAASD,EAAO,QAChB,gBAAiBE,EACjB,UAAAC,CACF,CACF,CAEQ,sBACNN,EACAF,EACS,CACT,OAAO,IAAIT,EAAmBW,EAAaF,CAAS,EACjD,wBAAwB,QAAQ,EAChC,mBAAmBb,EAAc,MAAM,EACvC,MAAM,CACX,CACF",
6
- "names": ["ClearSignContextType", "DeviceModelId", "isSuccessCommandResult", "GetChallengeCommand", "GetWeb3CheckTask", "ApplicationChecker", "BuildTransactionContextTask", "api", "args", "getWeb3ChecksFactory", "contextModule", "mapper", "transaction", "options", "appConfig", "derivationPath", "deviceState", "parsed", "err", "subset", "serializedTransaction", "type", "web3Check", "challenge", "challengeRes", "clearSignContexts", "clearSignContextsSuccess", "context", "transactionEnums", "filteredContexts", "transactionInfo", "ctx", "transactionFields"]
4
+ "sourcesContent": ["import {\n type ClearSignContextSuccess,\n type ClearSignContextSuccessType,\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 type BuildTransactionTaskResult = {\n readonly clearSignContexts: ClearSignContextSuccess[];\n readonly clearSignContextsOptional: ClearSignContextSuccess[];\n readonly clearSigningType: ClearSigningType;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionOptions;\n readonly appConfig: GetConfigCommandResponse;\n readonly derivationPath: string;\n readonly transaction: Uint8Array;\n readonly subset: TransactionSubset;\n};\n\nexport class BuildTransactionContextTask {\n constructor(\n private readonly _api: InternalApi,\n private readonly _args: BuildTransactionContextTaskArgs,\n private readonly getWeb3ChecksFactory = (\n api: InternalApi,\n args: GetWeb3CheckTaskArgs,\n ) => new GetWeb3CheckTask(api, args),\n ) {}\n\n async run(): Promise<BuildTransactionTaskResult> {\n const {\n contextModule,\n options,\n appConfig,\n derivationPath,\n transaction,\n subset,\n } = this._args;\n const deviceState = this._api.getDeviceSessionState();\n let filteredContexts: ClearSignContextSuccess[] = [];\n let filteredContextOptional: ClearSignContextSuccess[] = [];\n let clearSigningType: ClearSigningType = ClearSigningType.BASIC;\n\n // Run the web3checks if needed\n let web3Check: ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK> | null =\n null;\n if (appConfig.web3ChecksEnabled) {\n web3Check = (\n await this.getWeb3ChecksFactory(this._api, {\n contextModule,\n derivationPath,\n subset,\n transaction,\n }).run()\n ).web3Check;\n }\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 = await contextModule.getContexts({\n challenge: challenge,\n domain: options.domain,\n deviceModelId: deviceState.deviceModelId,\n ...subset,\n });\n\n // NOTE: we need to filter out the ENUM and ERROR types\n // ENUM are handled differently\n // ERROR are not handled at all for now\n const clearSignContextsSuccess: ClearSignContextSuccess<\n Exclude<ClearSignContextSuccessType, ClearSignContextType.ENUM>\n >[] = clearSignContexts.filter(\n (context) =>\n context.type !== ClearSignContextType.ERROR &&\n context.type !== ClearSignContextType.ENUM,\n );\n\n // Retrieve all ENUM contexts\n const transactionEnums: ClearSignContextSuccess<ClearSignContextType.ENUM>[] =\n clearSignContexts.filter(\n (context) => context.type === ClearSignContextType.ENUM,\n );\n\n const transactionInfo = clearSignContextsSuccess.find(\n (ctx) => ctx.type === ClearSignContextType.TRANSACTION_INFO,\n );\n\n // If the device does not support the generic parser,\n // we need to filter out the transaction info and transaction field description\n // as they are not supported by the device\n if (\n !this.supportsGenericParser(deviceState, appConfig) ||\n transactionInfo === undefined\n ) {\n filteredContexts = clearSignContextsSuccess.filter(\n (ctx) =>\n ctx.type !== ClearSignContextType.TRANSACTION_INFO &&\n ctx.type !== ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n );\n\n // If the device supports the web3 check, we need to add it to the list of contexts\n if (web3Check) {\n filteredContexts = [web3Check, ...filteredContexts];\n }\n } else if (transactionInfo.certificate) {\n const transactionFields = clearSignContextsSuccess.filter(\n (ctx) =>\n ctx.type === ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n );\n\n filteredContexts = [\n transactionInfo,\n ...transactionFields,\n ...(web3Check ? [web3Check] : []),\n ];\n filteredContextOptional = [...transactionEnums];\n clearSigningType = ClearSigningType.EIP7730;\n }\n\n return {\n clearSignContexts: filteredContexts,\n clearSignContextsOptional: filteredContextOptional,\n clearSigningType,\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"],
5
+ "mappings": "AAAA,OAGE,wBAAAA,MAGK,2BACP,OACE,iBAAAC,EAGA,0BAAAC,MACK,kCAGP,OAAS,oBAAAC,MAAwB,8BAEjC,OAAS,uBAAAC,MAA2B,mDACpC,OACE,oBAAAC,MAEK,6CACP,OAAS,sBAAAC,MAA0B,4CAiB5B,MAAMC,CAA4B,CACvC,YACmBC,EACAC,EACAC,EAAuB,CACtCC,EACAC,IACG,IAAIP,EAAiBM,EAAKC,CAAI,EACnC,CANiB,UAAAJ,EACA,WAAAC,EACA,0BAAAC,CAIhB,CAEH,MAAM,KAA2C,CAC/C,KAAM,CACJ,cAAAG,EACA,QAAAC,EACA,UAAAC,EACA,eAAAC,EACA,YAAAC,EACA,OAAAC,CACF,EAAI,KAAK,MACHC,EAAc,KAAK,KAAK,sBAAsB,EACpD,IAAIC,EAA8C,CAAC,EAC/CC,EAAqD,CAAC,EACtDC,EAAqCnB,EAAiB,MAGtDoB,EACF,KACER,EAAU,oBACZQ,GACE,MAAM,KAAK,qBAAqB,KAAK,KAAM,CACzC,cAAAV,EACA,eAAAG,EACA,OAAAE,EACA,YAAAD,CACF,CAAC,EAAE,IAAI,GACP,WAIJ,IAAIO,EACJ,GAAIL,EAAY,gBAAkBlB,EAAc,OAAQ,CACtD,MAAMwB,EAAe,MAAM,KAAK,KAAK,YACnC,IAAIrB,CACN,EACIF,EAAuBuB,CAAY,IACrCD,EAAYC,EAAa,KAAK,UAElC,CAGA,MAAMC,EAAoB,MAAMb,EAAc,YAAY,CACxD,UAAWW,EACX,OAAQV,EAAQ,OAChB,cAAeK,EAAY,cAC3B,GAAGD,CACL,CAAC,EAKKS,EAEAD,EAAkB,OACrBE,GACCA,EAAQ,OAAS5B,EAAqB,OACtC4B,EAAQ,OAAS5B,EAAqB,IAC1C,EAGM6B,EACJH,EAAkB,OACfE,GAAYA,EAAQ,OAAS5B,EAAqB,IACrD,EAEI8B,EAAkBH,EAAyB,KAC9CI,GAAQA,EAAI,OAAS/B,EAAqB,gBAC7C,EAKA,GACE,CAAC,KAAK,sBAAsBmB,EAAaJ,CAAS,GAClDe,IAAoB,OAEpBV,EAAmBO,EAAyB,OACzCI,GACCA,EAAI,OAAS/B,EAAqB,kBAClC+B,EAAI,OAAS/B,EAAqB,6BACtC,EAGIuB,IACFH,EAAmB,CAACG,EAAW,GAAGH,CAAgB,WAE3CU,EAAgB,YAAa,CACtC,MAAME,EAAoBL,EAAyB,OAChDI,GACCA,EAAI,OAAS/B,EAAqB,6BACtC,EAEAoB,EAAmB,CACjBU,EACA,GAAGE,EACH,GAAIT,EAAY,CAACA,CAAS,EAAI,CAAC,CACjC,EACAF,EAA0B,CAAC,GAAGQ,CAAgB,EAC9CP,EAAmBnB,EAAiB,OACtC,CAEA,MAAO,CACL,kBAAmBiB,EACnB,0BAA2BC,EAC3B,iBAAAC,CACF,CACF,CAEQ,sBACNH,EACAJ,EACS,CACT,OAAO,IAAIT,EAAmBa,EAAaJ,CAAS,EACjD,wBAAwB,QAAQ,EAChC,mBAAmBd,EAAc,MAAM,EACvC,MAAM,CACX,CACF",
6
+ "names": ["ClearSignContextType", "DeviceModelId", "isSuccessCommandResult", "ClearSigningType", "GetChallengeCommand", "GetWeb3CheckTask", "ApplicationChecker", "BuildTransactionContextTask", "_api", "_args", "getWeb3ChecksFactory", "api", "args", "contextModule", "options", "appConfig", "derivationPath", "transaction", "subset", "deviceState", "filteredContexts", "filteredContextOptional", "clearSigningType", "web3Check", "challenge", "challengeRes", "clearSignContexts", "clearSignContextsSuccess", "context", "transactionEnums", "transactionInfo", "ctx", "transactionFields"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ClearSignContextType as n}from"@ledgerhq/context-module";import{CommandResultFactory as h,DeviceModelId as l,DeviceSessionStateType as d,DeviceStatus as p,hexaStringToBuffer as E,UnknownDeviceExchangeError as g}from"@ledgerhq/device-management-kit";import{Transaction as v}from"ethers";import{Left as O,Right as y}from"purify-ts";import{makeDeviceActionInternalApiMock as w}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildTransactionContextTask as C}from"./BuildTransactionContextTask";describe("BuildTransactionContextTask",()=>{const i={getContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn()},r={mapTransactionToSubset:vi.fn()},R={domain:"domain-name.eth"},x=E(v.from({chainId:1n,nonce:0,data:"0x"}).unsignedSerialized),S={keyUsageNumber:1,payload:new Uint8Array([1,2,3])};let u;const a=w(),c=vi.fn();function T(t){return{blindSigningEnabled:!1,web3ChecksEnabled:t,web3ChecksOptIn:!1,version:"1.13.0"}}beforeEach(()=>{vi.resetAllMocks(),a.sendCommand.mockResolvedValue(h({data:{challenge:"challenge"}})),c.mockReturnValue({run:async()=>({web3Check:null})}),u={contextModule:i,mapper:r,transaction:x,options:R,appConfig:T(!1),derivationPath:"44'/60'/0'/0/0"}}),it("should build the transaction context without clear sign contexts",async()=>{const t=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:0};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const s=await new C(a,{...u,appConfig:T(!0)},c).run();expect(s).toEqual({clearSignContexts:e,serializedTransaction:t,chainId:1,transactionType:0,web3Check:null})}),it("should build the transaction context with web3checks",async()=>{const t=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:0},s="web3Check";c.mockReturnValueOnce({run:async()=>({web3Check:s})}),r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const m=await new C(a,{...u,appConfig:T(!0)},c).run();expect(m).toEqual({clearSignContexts:e,serializedTransaction:t,chainId:1,transactionType:0,web3Check:s})}),it("should build the transaction context with clear sign contexts",async()=>{const t=new Uint8Array([1,2,3]),e=[{type:n.TOKEN,payload:"payload-1"},{type:n.NFT,payload:"payload-2"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:2},s="web3Check";c.mockReturnValueOnce({run:async()=>({web3Check:s})}),r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const m=await new C(a,u,c).run();expect(m).toEqual({clearSignContexts:e,serializedTransaction:t,chainId:1,transactionType:2,web3Check:null})}),it("should build the transaction context with generic-parser context",async()=>{const t=new Uint8Array([1,2,3]),e=[{type:n.TRANSACTION_INFO,payload:"payload-1",certificate:S},{type:n.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:n.ENUM,payload:"payload-3",id:1,value:2,certificate:S},{type:n.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:2};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const s=await new C(a,u,c).run();expect(s).toEqual({clearSignContexts:{transactionInfo:"payload-1",transactionInfoCertificate:S,transactionFields:[e[1],e[3]],transactionEnums:[e[2]]},serializedTransaction:t,chainId:1,transactionType:2,web3Check:null})}),it("should call the mapper with the transaction",async()=>{const t=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:0};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new C(a,u,c).run(),expect(r.mapTransactionToSubset).toHaveBeenCalledWith(x)}),it("should call the web3checks factory with correct parameters",async()=>{const t=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:0};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new C(a,{...u,appConfig:T(!0)},c).run(),expect(c).toHaveBeenCalledWith(a,{contextModule:i,derivationPath:"44'/60'/0'/0/0",mapper:r,transaction:x})}),it("should call the context module with the correct parameters",async()=>{const t=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:0};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new C(a,u,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:l.FLEX,challenge:"challenge",domain:"domain-name.eth",...o.subset})}),it("should call the context module without context on error",async()=>{const t=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:0};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),a.sendCommand.mockResolvedValueOnce(h({error:new g})),await new C(a,u,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:l.FLEX,challenge:void 0,domain:"domain-name.eth",...o.subset})}),it("should throw an error if the mapper returns an error",async()=>{const t=new Error("error");r.mapTransactionToSubset.mockReturnValueOnce(O(t)),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const e=new C(a,u,c);await expect(e.run()).rejects.toThrow(t)}),it("should exclude error contexts from the result",async()=>{const t=new Uint8Array([1,2,3]),e=[{type:n.ERROR,error:new Error("error")},{type:n.TOKEN,payload:"payload-1"},{type:n.ERROR,error:new Error("error")},{type:n.NFT,payload:"payload-2"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:0};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const s=await new C(a,u,c).run();expect(s).toEqual({clearSignContexts:[e[1],e[3]],serializedTransaction:t,chainId:1,transactionType:0,web3Check:null})}),it("should exclude generic-parser contexts from the result on old apps",async()=>{const t=new Uint8Array([1,2,3]),e=[{type:n.TRANSACTION_INFO,payload:"transaction_info",certificate:S},{type:n.TOKEN,payload:"payload-1"},{type:n.TRANSACTION_FIELD_DESCRIPTION,payload:"transaction_field"},{type:n.NFT,payload:"payload-2"},{type:n.ENUM,payload:"enum",id:1,value:2,certificate:S}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:0};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const s=await new C(a,u,c).run();expect(s).toEqual({clearSignContexts:[e[1],e[3]],serializedTransaction:t,chainId:1,transactionType:0,web3Check:null})}),it("should exclude generic-parser contexts from the result if no transaction_info was found",async()=>{const t=new Uint8Array([1,2,3]),e=[{type:n.TRANSACTION_FIELD_DESCRIPTION,payload:"transaction_field"},{type:n.TOKEN,payload:"payload-1"},{type:n.ENUM,payload:"enum",id:1,value:2},{type:n.NFT,payload:"payload-2"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:0};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const s=await new C(a,u,c).run();expect(s).toEqual({clearSignContexts:[e[1],e[3]],serializedTransaction:t,chainId:1,transactionType:0,web3Check:null})}),it("should exclude legacy contexts from the result for generic-parser transactions",async()=>{const t=new Uint8Array([1,2,3]),e=[{type:n.TOKEN,payload:"payload-1"},{type:n.TRANSACTION_INFO,payload:"payload-2",certificate:S},{type:n.EXTERNAL_PLUGIN,payload:"payload-3"},{type:n.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"},{type:n.ENUM,payload:"payload-5",id:1,value:2,certificate:S}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:2};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const s=await new C(a,u,c).run();expect(s).toEqual({clearSignContexts:{transactionInfo:"payload-2",transactionInfoCertificate:S,transactionFields:[e[3]],transactionEnums:[e[4]]},serializedTransaction:t,chainId:1,transactionType:2,web3Check:null})}),it("should exclude generic-parser contexts with a nano s device",async()=>{const t=new Uint8Array([1,2,3]),e=[{type:n.TOKEN,payload:"payload-1"},{type:n.TRANSACTION_INFO,payload:"payload-2",certificate:S},{type:n.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:n.ENUM,payload:"payload-4",id:1,value:2,certificate:S}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:2};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:l.NANO_S,isSecureConnectionAllowed:!1});const s=await new C(a,u,c).run();expect(s).toEqual({clearSignContexts:[e[0]],serializedTransaction:t,chainId:1,transactionType:2,web3Check:null})}),it("should exclude generic-parser contexts with an old app version",async()=>{const t=new Uint8Array([1,2,3]),e=[{type:n.TOKEN,payload:"payload-1"},{type:n.TRANSACTION_INFO,payload:"payload-2",certificate:S},{type:n.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:n.ENUM,payload:"payload-4",id:1,value:2,certificate:S}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:2};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const s=await new C(a,u,c).run();expect(s).toEqual({clearSignContexts:[e[0]],serializedTransaction:t,chainId:1,transactionType:2,web3Check:null})}),it("should exclude generic-parser contexts with a non ready device",async()=>{const t=new Uint8Array([1,2,3]),e=[{type:n.TOKEN,payload:"payload-1"},{type:n.TRANSACTION_INFO,payload:"payload-2",certificate:S},{type:n.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:n.ENUM,payload:"payload-4",id:1,value:2,certificate:S}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:2};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.Connected,deviceStatus:p.NOT_CONNECTED,deviceModelId:l.FLEX});const s=await new C(a,u,c).run();expect(s).toEqual({clearSignContexts:[e[0]],serializedTransaction:t,chainId:1,transactionType:2,web3Check:null})}),it("should return no clear sign context if the transaction info certificate is missing",async()=>{const t=new Uint8Array([1,2,3]),e=[{type:n.TRANSACTION_INFO,payload:"payload-1"},{type:n.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:n.ENUM,payload:"payload-3",id:1,value:2}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:t,type:2};r.mapTransactionToSubset.mockReturnValueOnce(y(o)),i.getContexts.mockResolvedValueOnce(e),a.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:p.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.17.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const s=await new C(a,u,c).run();expect(s).toEqual({clearSignContexts:[],serializedTransaction:t,chainId:1,transactionType:2,web3Check:null})})});
1
+ import{ClearSignContextType as t}from"@ledgerhq/context-module";import{CommandResultFactory as g,DeviceModelId as s,DeviceSessionStateType as r,DeviceStatus as d,hexaStringToBuffer as h,UnknownDeviceExchangeError as T}from"@ledgerhq/device-management-kit";import{Transaction as m}from"ethers";import{ClearSigningType as u}from"../../../api/model/ClearSigningType";import{makeDeviceActionInternalApiMock as N}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildTransactionContextTask as l}from"./BuildTransactionContextTask";import{GetWeb3CheckTask as O}from"./GetWeb3CheckTask";describe("BuildTransactionContextTask",()=>{const i={getContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn(),getSolanaContext:vi.fn()},x={domain:"domain-name.eth"},y=h(m.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(g({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:y,options:x,appConfig:S(!1),derivationPath:"44'/60'/0'/0/0"}}),it("should init with a default GetWeb3CheckTaskFactory",()=>{const e=new l(n,o);expect(e.getWeb3ChecksFactory).toBeDefined(),expect(e.getWeb3ChecksFactory(n,{contextModule:o.contextModule,derivationPath:o.derivationPath,subset:o.subset,transaction:o.transaction})).toBeInstanceOf(O)}),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:s.FLEX,isSecureConnectionAllowed:!1});const C=await new l(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="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:s.FLEX,isSecureConnectionAllowed:!1});const E=await new l(n,{...o,appConfig:S(!0)},c).run();expect(E).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="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:s.FLEX,isSecureConnectionAllowed:!1});const C=await new l(n,{...o,appConfig:S(!0)},c).run();expect(C).toEqual({clearSignContexts:[e[0],e[1],e[3],a],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="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:s.FLEX,isSecureConnectionAllowed:!1});const C=await new l(n,{...o,appConfig:S(!0)},c).run();expect(C).toEqual({clearSignContexts:[e[3],e[1],e[2],a],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="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:s.FLEX,isSecureConnectionAllowed:!1});const C=await new l(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:s.FLEX,isSecureConnectionAllowed:!1});const a=await new l(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0],e[1],e[3]],clearSignContextsOptional:[e[2]],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:s.FLEX,isSecureConnectionAllowed:!1}),await new l(n,{...o,appConfig:S(!0)},c).run(),expect(c).toHaveBeenCalledWith(n,{contextModule:i,derivationPath:"44'/60'/0'/0/0",subset:o.subset,transaction:y})}),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:s.FLEX,isSecureConnectionAllowed:!1}),await new l(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:s.FLEX,challenge:"challenge",domain:"domain-name.eth",...o.subset})}),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:s.NANO_S,isSecureConnectionAllowed:!1}),await new l(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:s.NANO_S,domain:"domain-name.eth",...o.subset})}),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:s.FLEX,isSecureConnectionAllowed:!1}),n.sendCommand.mockResolvedValueOnce(g({error:new T})),await new l(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:s.FLEX,challenge:void 0,domain:"domain-name.eth",...o.subset})}),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:s.FLEX,isSecureConnectionAllowed:!1});const a=await new l(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:s.FLEX,isSecureConnectionAllowed:!1});const a=await new l(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:s.FLEX,isSecureConnectionAllowed:!1});const a=await new l(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:s.FLEX,isSecureConnectionAllowed:!1});const a=await new l(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:s.NANO_S,isSecureConnectionAllowed:!1});const a=await new l(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:s.FLEX,isSecureConnectionAllowed:!1});const a=await new l(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:s.FLEX});const a=await new l(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:s.FLEX,isSecureConnectionAllowed:!1});const a=await new l(n,o,c).run();expect(a).toEqual({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:u.BASIC})})});
2
2
  //# sourceMappingURL=BuildTransactionContextTask.test.js.map