@ledgerhq/device-signer-kit-ethereum 1.5.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 (229) hide show
  1. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  2. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  3. package/lib/cjs/api/model/ClearSigningType.js +2 -0
  4. package/lib/cjs/api/model/ClearSigningType.js.map +7 -0
  5. package/lib/cjs/internal/app-binder/EthAppBinder.js +1 -1
  6. package/lib/cjs/internal/app-binder/EthAppBinder.js.map +3 -3
  7. package/lib/cjs/internal/app-binder/EthAppBinder.test.js +1 -1
  8. package/lib/cjs/internal/app-binder/EthAppBinder.test.js.map +3 -3
  9. package/lib/cjs/internal/app-binder/command/ProvideProxyInfoCommand.js +2 -0
  10. package/lib/cjs/internal/app-binder/command/ProvideProxyInfoCommand.js.map +7 -0
  11. package/lib/cjs/internal/app-binder/command/ProvideProxyInfoCommand.test.js +2 -0
  12. package/lib/cjs/internal/app-binder/command/ProvideProxyInfoCommand.test.js.map +7 -0
  13. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
  14. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
  15. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  16. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  17. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
  18. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +3 -3
  19. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
  20. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +2 -2
  21. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
  22. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +2 -2
  23. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.js +2 -0
  24. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.js.map +7 -0
  25. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.test.js +2 -0
  26. package/lib/cjs/internal/app-binder/task/BuildSubContextTask.test.js.map +7 -0
  27. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  28. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +3 -3
  29. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  30. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  31. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.js +1 -1
  32. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.js.map +3 -3
  33. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.test.js +1 -1
  34. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.test.js.map +3 -3
  35. package/lib/cjs/internal/app-binder/task/PreBuildContextTask.js +2 -0
  36. package/lib/cjs/internal/app-binder/task/PreBuildContextTask.js.map +7 -0
  37. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  38. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +2 -2
  39. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  40. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  41. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  42. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  43. package/lib/cjs/internal/app-binder/task/SendPayloadInChunksTask.js +1 -1
  44. package/lib/cjs/internal/app-binder/task/SendPayloadInChunksTask.js.map +1 -1
  45. package/lib/cjs/internal/app-binder/task/SendSignTransactionTask.js +1 -1
  46. package/lib/cjs/internal/app-binder/task/SendSignTransactionTask.js.map +3 -3
  47. package/lib/cjs/internal/app-binder/task/SendSignTransactionTask.test.js +1 -1
  48. package/lib/cjs/internal/app-binder/task/SendSignTransactionTask.test.js.map +3 -3
  49. package/lib/cjs/internal/shared/utils/ApplicationChecker.js +1 -1
  50. package/lib/cjs/internal/shared/utils/ApplicationChecker.js.map +3 -3
  51. package/lib/cjs/internal/shared/utils/ApplicationChecker.test.js +1 -1
  52. package/lib/cjs/internal/shared/utils/ApplicationChecker.test.js.map +2 -2
  53. package/lib/cjs/internal/transaction/di/transactionModule.js +1 -1
  54. package/lib/cjs/internal/transaction/di/transactionModule.js.map +3 -3
  55. package/lib/cjs/internal/transaction/di/transactionModule.test.js +1 -1
  56. package/lib/cjs/internal/transaction/di/transactionModule.test.js.map +2 -2
  57. package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.js +2 -0
  58. package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.js.map +7 -0
  59. package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.test.js +2 -0
  60. package/lib/cjs/internal/transaction/service/mapper/EthersTransactionMapperService.test.js.map +7 -0
  61. package/lib/cjs/internal/transaction/service/mapper/TransactionMapperService.js +1 -1
  62. package/lib/cjs/internal/transaction/service/mapper/TransactionMapperService.js.map +3 -3
  63. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.js +1 -1
  64. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.js.map +3 -3
  65. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.test.js +1 -1
  66. package/lib/cjs/internal/transaction/service/parser/TransactionParserService.test.js.map +3 -3
  67. package/lib/cjs/package.json +3 -3
  68. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  69. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  70. package/lib/esm/api/model/ClearSigningType.js +2 -0
  71. package/lib/esm/api/model/ClearSigningType.js.map +7 -0
  72. package/lib/esm/internal/app-binder/EthAppBinder.js +1 -1
  73. package/lib/esm/internal/app-binder/EthAppBinder.js.map +3 -3
  74. package/lib/esm/internal/app-binder/EthAppBinder.test.js +1 -1
  75. package/lib/esm/internal/app-binder/EthAppBinder.test.js.map +3 -3
  76. package/lib/esm/internal/app-binder/command/ProvideProxyInfoCommand.js +2 -0
  77. package/lib/esm/internal/app-binder/command/ProvideProxyInfoCommand.js.map +7 -0
  78. package/lib/esm/internal/app-binder/command/ProvideProxyInfoCommand.test.js +2 -0
  79. package/lib/esm/internal/app-binder/command/ProvideProxyInfoCommand.test.js.map +7 -0
  80. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
  81. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
  82. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  83. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  84. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
  85. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +3 -3
  86. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
  87. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +2 -2
  88. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
  89. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +2 -2
  90. package/lib/esm/internal/app-binder/task/BuildSubContextTask.js +2 -0
  91. package/lib/esm/internal/app-binder/task/BuildSubContextTask.js.map +7 -0
  92. package/lib/esm/internal/app-binder/task/BuildSubContextTask.test.js +2 -0
  93. package/lib/esm/internal/app-binder/task/BuildSubContextTask.test.js.map +7 -0
  94. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  95. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +3 -3
  96. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  97. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  98. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.js +1 -1
  99. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.js.map +3 -3
  100. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.test.js +1 -1
  101. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.test.js.map +3 -3
  102. package/lib/esm/internal/app-binder/task/PreBuildContextTask.js +2 -0
  103. package/lib/esm/internal/app-binder/task/PreBuildContextTask.js.map +7 -0
  104. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  105. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +2 -2
  106. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  107. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  108. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  109. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  110. package/lib/esm/internal/app-binder/task/SendPayloadInChunksTask.js +1 -1
  111. package/lib/esm/internal/app-binder/task/SendPayloadInChunksTask.js.map +1 -1
  112. package/lib/esm/internal/app-binder/task/SendSignTransactionTask.js +1 -1
  113. package/lib/esm/internal/app-binder/task/SendSignTransactionTask.js.map +3 -3
  114. package/lib/esm/internal/app-binder/task/SendSignTransactionTask.test.js +1 -1
  115. package/lib/esm/internal/app-binder/task/SendSignTransactionTask.test.js.map +3 -3
  116. package/lib/esm/internal/shared/utils/ApplicationChecker.js +1 -1
  117. package/lib/esm/internal/shared/utils/ApplicationChecker.js.map +3 -3
  118. package/lib/esm/internal/shared/utils/ApplicationChecker.test.js +1 -1
  119. package/lib/esm/internal/shared/utils/ApplicationChecker.test.js.map +2 -2
  120. package/lib/esm/internal/transaction/di/transactionModule.js +1 -1
  121. package/lib/esm/internal/transaction/di/transactionModule.js.map +3 -3
  122. package/lib/esm/internal/transaction/di/transactionModule.test.js +1 -1
  123. package/lib/esm/internal/transaction/di/transactionModule.test.js.map +2 -2
  124. package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.js +2 -0
  125. package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.js.map +7 -0
  126. package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.test.js +2 -0
  127. package/lib/esm/internal/transaction/service/mapper/EthersTransactionMapperService.test.js.map +7 -0
  128. package/lib/esm/internal/transaction/service/mapper/TransactionMapperService.js +0 -1
  129. package/lib/esm/internal/transaction/service/mapper/TransactionMapperService.js.map +4 -4
  130. package/lib/esm/internal/transaction/service/parser/TransactionParserService.js +1 -1
  131. package/lib/esm/internal/transaction/service/parser/TransactionParserService.js.map +3 -3
  132. package/lib/esm/internal/transaction/service/parser/TransactionParserService.test.js +1 -1
  133. package/lib/esm/internal/transaction/service/parser/TransactionParserService.test.js.map +3 -3
  134. package/lib/esm/package.json +3 -3
  135. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +8 -9
  136. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  137. package/lib/types/api/model/ClearSigningType.d.ts +5 -0
  138. package/lib/types/api/model/ClearSigningType.d.ts.map +1 -0
  139. package/lib/types/internal/app-binder/EthAppBinder.d.ts +1 -1
  140. package/lib/types/internal/app-binder/EthAppBinder.d.ts.map +1 -1
  141. package/lib/types/internal/app-binder/command/ProvideProxyInfoCommand.d.ts +20 -0
  142. package/lib/types/internal/app-binder/command/ProvideProxyInfoCommand.d.ts.map +1 -0
  143. package/lib/types/internal/app-binder/command/ProvideProxyInfoCommand.test.d.ts +2 -0
  144. package/lib/types/internal/app-binder/command/ProvideProxyInfoCommand.test.d.ts.map +1 -0
  145. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts +14 -31
  146. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts.map +1 -1
  147. package/lib/types/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.d.ts.map +1 -1
  148. package/lib/types/internal/app-binder/task/BuildSubContextTask.d.ts +20 -0
  149. package/lib/types/internal/app-binder/task/BuildSubContextTask.d.ts.map +1 -0
  150. package/lib/types/internal/app-binder/task/BuildSubContextTask.test.d.ts +2 -0
  151. package/lib/types/internal/app-binder/task/BuildSubContextTask.test.d.ts.map +1 -0
  152. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +10 -14
  153. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
  154. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.d.ts +2 -3
  155. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.d.ts.map +1 -1
  156. package/lib/types/internal/app-binder/task/PreBuildContextTask.d.ts +17 -0
  157. package/lib/types/internal/app-binder/task/PreBuildContextTask.d.ts.map +1 -0
  158. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +28 -22
  159. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
  160. package/lib/types/internal/app-binder/task/SendPayloadInChunksTask.d.ts +1 -2
  161. package/lib/types/internal/app-binder/task/SendPayloadInChunksTask.d.ts.map +1 -1
  162. package/lib/types/internal/app-binder/task/SendSignTransactionTask.d.ts +2 -1
  163. package/lib/types/internal/app-binder/task/SendSignTransactionTask.d.ts.map +1 -1
  164. package/lib/types/internal/shared/utils/ApplicationChecker.d.ts.map +1 -1
  165. package/lib/types/internal/transaction/di/transactionModule.d.ts.map +1 -1
  166. package/lib/types/internal/transaction/service/mapper/EthersTransactionMapperService.d.ts +8 -0
  167. package/lib/types/internal/transaction/service/mapper/EthersTransactionMapperService.d.ts.map +1 -0
  168. package/lib/types/internal/transaction/service/mapper/EthersTransactionMapperService.test.d.ts +2 -0
  169. package/lib/types/internal/transaction/service/mapper/EthersTransactionMapperService.test.d.ts.map +1 -0
  170. package/lib/types/internal/transaction/service/mapper/TransactionMapperService.d.ts +4 -7
  171. package/lib/types/internal/transaction/service/mapper/TransactionMapperService.d.ts.map +1 -1
  172. package/lib/types/internal/transaction/service/parser/TransactionParserService.d.ts +2 -2
  173. package/lib/types/internal/transaction/service/parser/TransactionParserService.d.ts.map +1 -1
  174. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  175. package/package.json +8 -8
  176. package/lib/cjs/internal/app-binder/constant/plugins.js +0 -2
  177. package/lib/cjs/internal/app-binder/constant/plugins.js.map +0 -7
  178. package/lib/cjs/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js +0 -2
  179. package/lib/cjs/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js.map +0 -7
  180. package/lib/cjs/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.js +0 -2
  181. package/lib/cjs/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.js.map +0 -7
  182. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.js +0 -2
  183. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.js.map +0 -7
  184. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js +0 -2
  185. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js.map +0 -7
  186. package/lib/cjs/internal/transaction/service/mapper/EthersRawTransactionMapper.js +0 -2
  187. package/lib/cjs/internal/transaction/service/mapper/EthersRawTransactionMapper.js.map +0 -7
  188. package/lib/cjs/internal/transaction/service/mapper/EthersRawTransactionMapper.test.js +0 -2
  189. package/lib/cjs/internal/transaction/service/mapper/EthersRawTransactionMapper.test.js.map +0 -7
  190. package/lib/cjs/internal/transaction/service/mapper/TransactionMapper.js +0 -2
  191. package/lib/cjs/internal/transaction/service/mapper/TransactionMapper.js.map +0 -7
  192. package/lib/cjs/internal/transaction/service/mapper/TransactionMapperService.test.js +0 -2
  193. package/lib/cjs/internal/transaction/service/mapper/TransactionMapperService.test.js.map +0 -7
  194. package/lib/esm/internal/app-binder/constant/plugins.js +0 -2
  195. package/lib/esm/internal/app-binder/constant/plugins.js.map +0 -7
  196. package/lib/esm/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js +0 -2
  197. package/lib/esm/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js.map +0 -7
  198. package/lib/esm/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.js +0 -2
  199. package/lib/esm/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.js.map +0 -7
  200. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.js +0 -2
  201. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.js.map +0 -7
  202. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js +0 -2
  203. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js.map +0 -7
  204. package/lib/esm/internal/transaction/service/mapper/EthersRawTransactionMapper.js +0 -2
  205. package/lib/esm/internal/transaction/service/mapper/EthersRawTransactionMapper.js.map +0 -7
  206. package/lib/esm/internal/transaction/service/mapper/EthersRawTransactionMapper.test.js +0 -2
  207. package/lib/esm/internal/transaction/service/mapper/EthersRawTransactionMapper.test.js.map +0 -7
  208. package/lib/esm/internal/transaction/service/mapper/TransactionMapper.js +0 -1
  209. package/lib/esm/internal/transaction/service/mapper/TransactionMapper.js.map +0 -7
  210. package/lib/esm/internal/transaction/service/mapper/TransactionMapperService.test.js +0 -2
  211. package/lib/esm/internal/transaction/service/mapper/TransactionMapperService.test.js.map +0 -7
  212. package/lib/types/internal/app-binder/constant/plugins.d.ts +0 -2
  213. package/lib/types/internal/app-binder/constant/plugins.d.ts.map +0 -1
  214. package/lib/types/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.d.ts +0 -80
  215. package/lib/types/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.d.ts.map +0 -1
  216. package/lib/types/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.d.ts +0 -2
  217. package/lib/types/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.test.d.ts.map +0 -1
  218. package/lib/types/internal/app-binder/task/ProvideTransactionGenericContextTask.d.ts +0 -28
  219. package/lib/types/internal/app-binder/task/ProvideTransactionGenericContextTask.d.ts.map +0 -1
  220. package/lib/types/internal/app-binder/task/ProvideTransactionGenericContextTask.test.d.ts +0 -2
  221. package/lib/types/internal/app-binder/task/ProvideTransactionGenericContextTask.test.d.ts.map +0 -1
  222. package/lib/types/internal/transaction/service/mapper/EthersRawTransactionMapper.d.ts +0 -7
  223. package/lib/types/internal/transaction/service/mapper/EthersRawTransactionMapper.d.ts.map +0 -1
  224. package/lib/types/internal/transaction/service/mapper/EthersRawTransactionMapper.test.d.ts +0 -2
  225. package/lib/types/internal/transaction/service/mapper/EthersRawTransactionMapper.test.d.ts.map +0 -1
  226. package/lib/types/internal/transaction/service/mapper/TransactionMapper.d.ts +0 -6
  227. package/lib/types/internal/transaction/service/mapper/TransactionMapper.d.ts.map +0 -1
  228. package/lib/types/internal/transaction/service/mapper/TransactionMapperService.test.d.ts +0 -2
  229. package/lib/types/internal/transaction/service/mapper/TransactionMapperService.test.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.ts"],
4
- "sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: 0 */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UnknownDAError,\n UnknownDeviceExchangeError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\n\nimport { type SignTypedDataDAState } from \"@api/app-binder/SignTypedDataDeviceActionTypes\";\nimport { SignTypedDataDAStateStep } from \"@api/app-binder/SignTypedDataDeviceActionTypes\";\nimport { EthAppCommandErrorFactory } from \"@internal/app-binder/command/utils/ethAppErrors\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { type ProvideEIP712ContextTaskArgs } from \"@internal/app-binder/task/ProvideEIP712ContextTask\";\nimport {\n PrimitiveType,\n StructType,\n TypedDataValueField,\n} from \"@internal/typed-data/model/Types\";\nimport { type TypedDataParserService } from \"@internal/typed-data/service/TypedDataParserService\";\n\nimport { SignTypedDataDeviceAction } from \"./SignTypedDataDeviceAction\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\ndescribe(\"SignTypedDataDeviceAction\", () => {\n const TEST_MESSAGE = {\n domain: {},\n message: {},\n primaryType: \"TestMessage\",\n types: {},\n };\n const TEST_BUILT_CONTEXT: ProvideEIP712ContextTaskArgs = {\n web3Check: null,\n 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 },\n domain: [\n {\n path: \"chainId\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([137])),\n },\n ],\n message: [\n {\n path: \"details.expiration\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x13])),\n },\n ],\n clearSignContext: Just({\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\n const mockParser: TypedDataParserService = {\n parse: vi.fn(),\n };\n const mockContextModule: ContextModule = {\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n };\n const apiMock = makeDeviceActionInternalApiMock();\n const getAppConfigMock = vi.fn();\n const web3CheckOptInMock = vi.fn();\n const buildContextMock = vi.fn();\n const provideContextMock = vi.fn();\n const signTypedDataMock = vi.fn();\n const signTypedDataLegacyMock = vi.fn();\n function extractDependenciesMock() {\n return {\n getAppConfig: getAppConfigMock,\n web3CheckOptIn: web3CheckOptInMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTypedData: signTypedDataMock,\n signTypedDataLegacy: signTypedDataLegacyMock,\n };\n }\n\n function createAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n return {\n blindSigningEnabled: false,\n web3ChecksEnabled,\n web3ChecksOptIn,\n version,\n };\n }\n\n function setupAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n getAppConfigMock.mockResolvedValue(\n CommandResultFactory({\n data: createAppConfig(version, web3ChecksEnabled, web3ChecksOptIn),\n }),\n );\n }\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"Success case\", () => {\n it(\"should call external dependencies with the correct parameters\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideContext -> SignTypedData\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n expect(provideContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n taskArgs: TEST_BUILT_CONTEXT,\n },\n }),\n );\n\n expect(signTypedDataMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n resolve();\n },\n });\n }));\n\n it(\"should be successful whlie skipping OpenApp\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: true,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> BuildContext -> ProvideContext -> SignTypedData\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should fallback to legacy signing if the new one fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: EthAppCommandErrorFactory({\n errorCode: \"6a80\",\n message: \"\",\n }),\n }),\n );\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should fallback to legacy signing BuildContext fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(new UnknownDAError(\"Error\"));\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should not fallback to legacy signing if rejected by the user during streaming\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: EthAppCommandErrorFactory({\n errorCode: \"6985\",\n message: \"\",\n }),\n }),\n );\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: EthAppCommandErrorFactory({\n errorCode: \"6985\",\n message: \"\",\n }),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n\n describe(\"Web3Checks\", () => {\n it(\"should call external dependencies with web3Checks enabled and supported\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", true, true);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", true, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks supported but disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, true);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", false, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then enabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: true } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: true,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", true, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: false } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: false,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n });\n\n describe(\"error cases\", () => {\n it(\"Error if the open app fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock(new UnknownDAError(\"Mocked error\"));\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"Mocked error\"),\n },\n ];\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"Error thrown while providing context\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockRejectedValueOnce(new UnknownDAError(\"Error\"));\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDAError(\"Error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"Error while signing\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock signing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\n \"Error while signing the typed data\",\n ),\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDeviceExchangeError(\n \"Error while signing the typed data\",\n ),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: 0 */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UnknownDAError,\n UnknownDeviceExchangeError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\n\nimport { type SignTypedDataDAState } from \"@api/app-binder/SignTypedDataDeviceActionTypes\";\nimport { SignTypedDataDAStateStep } from \"@api/app-binder/SignTypedDataDeviceActionTypes\";\nimport { EthAppCommandErrorFactory } from \"@internal/app-binder/command/utils/ethAppErrors\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { type ProvideEIP712ContextTaskArgs } from \"@internal/app-binder/task/ProvideEIP712ContextTask\";\nimport {\n PrimitiveType,\n StructType,\n TypedDataValueField,\n} from \"@internal/typed-data/model/Types\";\nimport { type TypedDataParserService } from \"@internal/typed-data/service/TypedDataParserService\";\n\nimport { SignTypedDataDeviceAction } from \"./SignTypedDataDeviceAction\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\ndescribe(\"SignTypedDataDeviceAction\", () => {\n const TEST_MESSAGE = {\n domain: {},\n message: {},\n primaryType: \"TestMessage\",\n types: {},\n };\n const TEST_BUILT_CONTEXT: ProvideEIP712ContextTaskArgs = {\n web3Check: null,\n 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 },\n domain: [\n {\n path: \"chainId\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([137])),\n },\n ],\n message: [\n {\n path: \"details.expiration\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x13])),\n },\n ],\n clearSignContext: Just({\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\n const mockParser: TypedDataParserService = {\n parse: vi.fn(),\n };\n const mockContextModule: ContextModule = {\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getSolanaContext: vi.fn(),\n };\n const apiMock = makeDeviceActionInternalApiMock();\n const getAppConfigMock = vi.fn();\n const web3CheckOptInMock = vi.fn();\n const buildContextMock = vi.fn();\n const provideContextMock = vi.fn();\n const signTypedDataMock = vi.fn();\n const signTypedDataLegacyMock = vi.fn();\n function extractDependenciesMock() {\n return {\n getAppConfig: getAppConfigMock,\n web3CheckOptIn: web3CheckOptInMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTypedData: signTypedDataMock,\n signTypedDataLegacy: signTypedDataLegacyMock,\n };\n }\n\n function createAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n return {\n blindSigningEnabled: false,\n web3ChecksEnabled,\n web3ChecksOptIn,\n version,\n };\n }\n\n function setupAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n getAppConfigMock.mockResolvedValue(\n CommandResultFactory({\n data: createAppConfig(version, web3ChecksEnabled, web3ChecksOptIn),\n }),\n );\n }\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"Success case\", () => {\n it(\"should call external dependencies with the correct parameters\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideContext -> SignTypedData\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n expect(provideContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n taskArgs: TEST_BUILT_CONTEXT,\n },\n }),\n );\n\n expect(signTypedDataMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n resolve();\n },\n });\n }));\n\n it(\"should be successful whlie skipping OpenApp\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: true,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> BuildContext -> ProvideContext -> SignTypedData\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should fallback to legacy signing if the new one fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: EthAppCommandErrorFactory({\n errorCode: \"6a80\",\n message: \"\",\n }),\n }),\n );\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should fallback to legacy signing BuildContext fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(new UnknownDAError(\"Error\"));\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should not fallback to legacy signing if rejected by the user during streaming\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: EthAppCommandErrorFactory({\n errorCode: \"6985\",\n message: \"\",\n }),\n }),\n );\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: EthAppCommandErrorFactory({\n errorCode: \"6985\",\n message: \"\",\n }),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n\n describe(\"Web3Checks\", () => {\n it(\"should call external dependencies with web3Checks enabled and supported\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", true, true);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", true, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks supported but disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, true);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", false, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then enabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: true } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: true,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", true, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: false } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: false,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n });\n\n describe(\"error cases\", () => {\n it(\"Error if the open app fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock(new UnknownDAError(\"Mocked error\"));\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"Mocked error\"),\n },\n ];\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"Error thrown while providing context\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockRejectedValueOnce(new UnknownDAError(\"Error\"));\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDAError(\"Error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"Error while signing\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock signing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\n \"Error while signing the typed data\",\n ),\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDeviceExchangeError(\n \"Error while signing the typed data\",\n ),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n});\n"],
5
+ "mappings": "aAEA,IAAAA,EAUO,2CACPC,EAA8B,qBAG9BC,EAAyC,0DACzCC,EAA0C,2DAC1CC,EAAgD,6EAChDC,EAAmC,gFACnCC,EAAuC,oFAEvCC,EAIO,4CAGPC,EAA0C,uCAE1C,GAAG,KAAK,kCAAmC,MAAOC,IAGzC,CACL,GAFA,MAAMA,EAAiE,EAGvE,oBAAqB,GAAG,GAAG,KAAO,CAChC,iBAAkB,GAAG,GAAG,CAC1B,EAAE,CACJ,EACD,EAED,SAAS,4BAA6B,IAAM,CAC1C,MAAMC,EAAe,CACnB,OAAQ,CAAC,EACT,QAAS,CAAC,EACV,YAAa,cACb,MAAO,CAAC,CACV,EACMC,EAAmD,CACvD,UAAW,KACX,MAAO,CACL,aAAc,CACZ,QAAS,IAAI,aAAW,eAAe,EACvC,QAAS,IAAI,gBAAc,UAAW,UAAW,SAAO,EACxD,YAAa,IAAI,gBAAc,UAAW,UAAQ,QAAK,EAAE,CAAC,CAC5D,CACF,EACA,OAAQ,CACN,CACE,KAAM,UACN,KAAM,UACN,MAAO,IAAI,sBAAoB,WAAW,KAAK,CAAC,GAAG,CAAC,CAAC,CACvD,CACF,EACA,QAAS,CACP,CACE,KAAM,qBACN,KAAM,SACN,MAAO,IAAI,sBAAoB,WAAW,KAAK,CAAC,EAAI,CAAC,CAAC,CACxD,CACF,EACA,oBAAkB,QAAK,CACrB,KAAM,UACN,YAAa,CACX,YAAa,UACb,aAAc,EACd,UACE,gJACJ,EACA,sBAAuB,CAAC,EACxB,OAAQ,CAAC,EACT,QAAS,CACP,iBAAkB,CAChB,YAAa,mBACb,KAAM,iBACN,UACE,+IACF,WAAY,IACZ,KAAM,QACR,CACF,CACF,CAAC,CACH,EAEMC,EAAqC,CACzC,MAAO,GAAG,GAAG,CACf,EACMC,EAAmC,CACvC,WAAY,GAAG,GAAG,EAClB,YAAa,GAAG,GAAG,EACnB,oBAAqB,GAAG,GAAG,EAC3B,cAAe,GAAG,GAAG,EACrB,iBAAkB,GAAG,GAAG,CAC1B,EACMC,KAAU,mCAAgC,EAC1CC,EAAmB,GAAG,GAAG,EACzBC,EAAqB,GAAG,GAAG,EAC3BC,EAAmB,GAAG,GAAG,EACzBC,EAAqB,GAAG,GAAG,EAC3BC,EAAoB,GAAG,GAAG,EAC1BC,EAA0B,GAAG,GAAG,EACtC,SAASC,GAA0B,CACjC,MAAO,CACL,aAAcN,EACd,eAAgBC,EAChB,aAAcC,EACd,eAAgBC,EAChB,cAAeC,EACf,oBAAqBC,CACvB,CACF,CAEA,SAASE,EACPC,EACAC,EACAC,EACA,CACA,MAAO,CACL,oBAAqB,GACrB,kBAAAD,EACA,gBAAAC,EACA,QAAAF,CACF,CACF,CAEA,SAASG,EACPH,EACAC,EACAC,EACA,CACAX,EAAQ,sBAAsB,oBAAoB,CAChD,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,WAAY,QAAAS,CAAQ,EACxC,cAAe,gBAAc,KAC7B,0BAA2B,EAC7B,CAAC,EACDR,EAAiB,qBACf,wBAAqB,CACnB,KAAMO,EAAgBC,EAASC,EAAmBC,CAAe,CACnE,CAAC,CACH,CACF,CAEA,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAED,SAAS,eAAgB,IAAM,CAC7B,GAAG,gEAAiE,IAClE,IAAI,QAAc,CAACE,EAASC,IAAW,IACrC,sBAAmB,EACnBF,EAAe,SAAU,GAAO,EAAK,EAErC,MAAMG,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,EAGD,GAAG,MAAMiB,EAAc,qBAAqB,EAAE,gBAC5CR,EAAwB,CAC1B,EACAJ,EAAiB,sBAAsBN,CAAkB,EACzDO,EAAmB,yBACjB,wBAAqB,CAAE,KAAM,MAAU,CAAC,CAC1C,EACAC,EAAkB,yBAChB,wBAAqB,CACnB,KAAM,CACJ,EAAG,GACH,EAAG,qEACH,EAAG,oEACL,CACF,CAAC,CACH,EAIA,MAAMW,EAA8C,CAClD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,cACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,aACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,eACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,eACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,OAAQ,CACN,EAAG,GACH,EAAG,qEACH,EAAG,oEACL,EACA,OAAQ,qBAAmB,SAC7B,CACF,KAEA,0BAAuBD,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQ,IAAM,CAEZ,OAAOX,CAAgB,EAAE,qBACvB,OAAO,iBAAiB,CACtB,MAAO,CACL,cAAeJ,EACf,OAAQD,EACR,KAAMF,EACN,UAAWY,EAAgB,SAAU,GAAO,EAAK,EACjD,eAAgB,gBAClB,CACF,CAAC,CACH,EAEA,OAAOJ,CAAkB,EAAE,qBACzB,OAAO,iBAAiB,CACtB,MAAO,CACL,cAAeL,EACf,SAAUF,CACZ,CACF,CAAC,CACH,EAEA,OAAOQ,CAAiB,EAAE,qBACxB,OAAO,iBAAiB,CACtB,MAAO,CACL,eAAgB,gBAClB,CACF,CAAC,CACH,EAEAQ,EAAQ,CACV,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,8CAA+C,IAChD,IAAI,QAAc,CAACA,EAASC,IAAW,IACrC,sBAAmB,EACnBF,EAAe,SAAU,GAAO,EAAK,EAErC,MAAMG,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,EAGD,GAAG,MAAMiB,EAAc,qBAAqB,EAAE,gBAC5CR,EAAwB,CAC1B,EACAJ,EAAiB,sBAAsBN,CAAkB,EACzDO,EAAmB,yBACjB,wBAAqB,CAAE,KAAM,MAAU,CAAC,CAC1C,EACAC,EAAkB,yBAChB,wBAAqB,CACnB,KAAM,CACJ,EAAG,GACH,EAAG,qEACH,EAAG,oEACL,CACF,CAAC,CACH,EAIA,MAAMW,EAA8C,CAClD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,cACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,aACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,eACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,eACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,OAAQ,CACN,EAAG,GACH,EAAG,qEACH,EAAG,oEACL,EACA,OAAQ,qBAAmB,SAC7B,CACF,KAEA,0BAAuBD,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQD,CACV,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,yDAA0D,IAC3D,IAAI,QAAc,CAACA,EAASC,IAAW,IACrC,sBAAmB,EACnBF,EAAe,SAAU,GAAO,EAAK,EAErC,MAAMG,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,EAGD,GAAG,MAAMiB,EAAc,qBAAqB,EAAE,gBAC5CR,EAAwB,CAC1B,EACAJ,EAAiB,sBAAsBN,CAAkB,EACzDO,EAAmB,yBACjB,wBAAqB,CACnB,SAAO,6BAA0B,CAC/B,UAAW,OACX,QAAS,EACX,CAAC,CACH,CAAC,CACH,EACAE,EAAwB,yBACtB,wBAAqB,CACnB,KAAM,CACJ,EAAG,GACH,EAAG,qEACH,EAAG,oEACL,CACF,CAAC,CACH,EAEA,MAAMU,EAA8C,CAClD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,cACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,aACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,eACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,sBACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,OAAQ,CACN,EAAG,GACH,EAAG,qEACH,EAAG,oEACL,EACA,OAAQ,qBAAmB,SAC7B,CACF,KAEA,0BAAuBD,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQD,CACV,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,uDAAwD,IACzD,IAAI,QAAc,CAACA,EAASC,IAAW,IACrC,sBAAmB,EACnBF,EAAe,SAAU,GAAO,EAAK,EAErC,MAAMG,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,EAGD,GAAG,MAAMiB,EAAc,qBAAqB,EAAE,gBAC5CR,EAAwB,CAC1B,EACAJ,EAAiB,sBAAsB,IAAI,iBAAe,OAAO,CAAC,EAClEG,EAAwB,yBACtB,wBAAqB,CACnB,KAAM,CACJ,EAAG,GACH,EAAG,qEACH,EAAG,oEACL,CACF,CAAC,CACH,EAEA,MAAMU,EAA8C,CAClD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,cACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,aACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,sBACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,OAAQ,CACN,EAAG,GACH,EAAG,qEACH,EAAG,oEACL,EACA,OAAQ,qBAAmB,SAC7B,CACF,KAEA,0BAAuBD,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQD,CACV,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,iFAAkF,IACnF,IAAI,QAAc,CAACA,EAASC,IAAW,IACrC,sBAAmB,EACnBF,EAAe,SAAU,GAAO,EAAK,EAErC,MAAMG,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,EAGD,GAAG,MAAMiB,EAAc,qBAAqB,EAAE,gBAC5CR,EAAwB,CAC1B,EACAJ,EAAiB,sBAAsBN,CAAkB,EACzDO,EAAmB,yBACjB,wBAAqB,CACnB,SAAO,6BAA0B,CAC/B,UAAW,OACX,QAAS,EACX,CAAC,CACH,CAAC,CACH,EACAE,EAAwB,yBACtB,wBAAqB,CACnB,KAAM,CACJ,EAAG,GACH,EAAG,qEACH,EAAG,oEACL,CACF,CAAC,CACH,EAEA,MAAMU,EAA8C,CAClD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,cACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,aACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,eACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,SAAO,6BAA0B,CAC/B,UAAW,OACX,QAAS,EACX,CAAC,EACD,OAAQ,qBAAmB,KAC7B,CACF,KAEA,0BAAuBD,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQD,CACV,CAAC,CACH,CAAC,CAAC,CACN,CAAC,EAED,SAAS,aAAc,IAAM,CAC3B,GAAG,0EAA2E,IAC5E,IAAI,QAAc,CAACA,EAASC,IAAW,IACrC,sBAAmB,EACnBF,EAAe,SAAU,GAAM,EAAI,EAEnC,MAAMG,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,EAGD,GAAG,MAAMiB,EAAc,qBAAqB,EAAE,gBAC5CR,EAAwB,CAC1B,EACAJ,EAAiB,sBACf,IAAI,yBAAuB,oBAAoB,CACjD,EACAG,EAAwB,sBACtB,IAAI,yBAAuB,2BAA2B,CACxD,EAIA,MAAMU,EAA8C,CAClD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,cACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,aACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,sBACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,MAAO,IAAI,yBAAuB,2BAA2B,EAC7D,OAAQ,qBAAmB,KAC7B,CACF,KAEA,0BAAuBD,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQ,IAAM,CAEZ,OAAOb,CAAgB,EAAE,iBAAiB,EAC1C,OAAOE,CAAgB,EAAE,qBACvB,OAAO,iBAAiB,CACtB,MAAO,CACL,cAAeJ,EACf,OAAQD,EACR,KAAMF,EACN,UAAWY,EAAgB,SAAU,GAAM,EAAI,EAC/C,eAAgB,gBAClB,CACF,CAAC,CACH,EACAK,EAAQ,CACV,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,2EAA4E,IAC7E,IAAI,QAAc,CAACA,EAASC,IAAW,IACrC,sBAAmB,EACnBF,EAAe,SAAU,GAAO,EAAI,EAEpC,MAAMG,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,EAGD,GAAG,MAAMiB,EAAc,qBAAqB,EAAE,gBAC5CR,EAAwB,CAC1B,EACAJ,EAAiB,sBACf,IAAI,yBAAuB,oBAAoB,CACjD,EACAG,EAAwB,sBACtB,IAAI,yBAAuB,2BAA2B,CACxD,EAIA,MAAMU,EAA8C,CAClD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,cACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,aACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,sBACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,MAAO,IAAI,yBAAuB,2BAA2B,EAC7D,OAAQ,qBAAmB,KAC7B,CACF,KAEA,0BAAuBD,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQ,IAAM,CAEZ,OAAOb,CAAgB,EAAE,iBAAiB,EAC1C,OAAOE,CAAgB,EAAE,qBACvB,OAAO,iBAAiB,CACtB,MAAO,CACL,cAAeJ,EACf,OAAQD,EACR,KAAMF,EACN,UAAWY,EAAgB,SAAU,GAAO,EAAI,EAChD,eAAgB,gBAClB,CACF,CAAC,CACH,EACAK,EAAQ,CACV,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,yEAA0E,IAC3E,IAAI,QAAc,CAACA,EAASC,IAAW,IACrC,sBAAmB,EACnBF,EAAe,SAAU,GAAO,EAAK,EAErC,MAAMG,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,EAGD,GAAG,MAAMiB,EAAc,qBAAqB,EAAE,gBAC5CR,EAAwB,CAC1B,EACAL,EAAmB,yBACjB,wBAAqB,CAAE,KAAM,CAAE,QAAS,EAAK,CAAE,CAAC,CAClD,EACAC,EAAiB,sBACf,IAAI,yBAAuB,oBAAoB,CACjD,EACAG,EAAwB,sBACtB,IAAI,yBAAuB,2BAA2B,CACxD,EAIA,MAAMU,EAA8C,CAClD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,cACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,gBACjD,KAAM,2BAAyB,kBACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,0BAC/B,OAAQ,EACV,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,aACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,sBACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,MAAO,IAAI,yBAAuB,2BAA2B,EAC7D,OAAQ,qBAAmB,KAC7B,CACF,KAEA,0BAAuBD,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQ,IAAM,CAEZ,OAAOb,CAAgB,EAAE,iBAAiB,EAC1C,OAAOC,CAAkB,EAAE,iBAAiB,EAC5C,OAAOC,CAAgB,EAAE,qBACvB,OAAO,iBAAiB,CACtB,MAAO,CACL,cAAeJ,EACf,OAAQD,EACR,KAAMF,EACN,UAAWY,EAAgB,SAAU,GAAM,EAAK,EAChD,eAAgB,gBAClB,CACF,CAAC,CACH,EACAK,EAAQ,CACV,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,0EAA2E,IAC5E,IAAI,QAAc,CAACA,EAASC,IAAW,IACrC,sBAAmB,EACnBF,EAAe,SAAU,GAAO,EAAK,EAErC,MAAMG,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,EAGD,GAAG,MAAMiB,EAAc,qBAAqB,EAAE,gBAC5CR,EAAwB,CAC1B,EACAL,EAAmB,yBACjB,wBAAqB,CAAE,KAAM,CAAE,QAAS,EAAM,CAAE,CAAC,CACnD,EACAC,EAAiB,sBACf,IAAI,yBAAuB,oBAAoB,CACjD,EACAG,EAAwB,sBACtB,IAAI,yBAAuB,2BAA2B,CACxD,EAIA,MAAMU,EAA8C,CAClD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,cACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,gBACjD,KAAM,2BAAyB,kBACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,0BAC/B,OAAQ,EACV,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,aACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,sBACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,MAAO,IAAI,yBAAuB,2BAA2B,EAC7D,OAAQ,qBAAmB,KAC7B,CACF,KAEA,0BAAuBD,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQ,IAAM,CAEZ,OAAOb,CAAgB,EAAE,iBAAiB,EAC1C,OAAOC,CAAkB,EAAE,iBAAiB,EAC5C,OAAOC,CAAgB,EAAE,qBACvB,OAAO,iBAAiB,CACtB,MAAO,CACL,cAAeJ,EACf,OAAQD,EACR,KAAMF,EACN,UAAWY,EAAgB,SAAU,GAAO,EAAK,EACjD,eAAgB,gBAClB,CACF,CAAC,CACH,EACAK,EAAQ,CACV,CACF,CAAC,CACH,CAAC,CAAC,CACN,CAAC,EAED,SAAS,cAAe,IAAM,CAC5B,GAAG,8BAA+B,IAChC,IAAI,QAAc,CAACA,EAASC,IAAW,IACrC,sBAAmB,IAAI,iBAAe,cAAc,CAAC,EAErD,MAAME,EAA8C,CAClD,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,QACjC,CACF,EACA,CACE,OAAQ,qBAAmB,QAC3B,kBAAmB,CACjB,wBAAyB,0BAAwB,eACjD,KAAM,2BAAyB,QACjC,CACF,EACA,CACE,OAAQ,qBAAmB,MAC3B,MAAO,IAAI,iBAAe,cAAc,CAC1C,CACF,EAEMD,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,KAED,0BAAuBiB,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQD,CACV,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,uCAAwC,IACzC,IAAI,QAAc,CAACA,EAASC,IAAW,IACrC,sBAAmB,EACnBF,EAAe,SAAU,GAAO,EAAK,EAErC,MAAMG,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,EAGD,GAAG,MAAMiB,EAAc,qBAAqB,EAAE,gBAC5CR,EAAwB,CAC1B,EACAJ,EAAiB,sBAAsBN,CAAkB,EACzDO,EAAmB,sBAAsB,IAAI,iBAAe,OAAO,CAAC,EAEpE,MAAMY,EAA8C,CAClD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,cACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,aACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,eACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,MAAO,IAAI,iBAAe,OAAO,EACjC,OAAQ,qBAAmB,KAC7B,CACF,KAEA,0BAAuBD,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQD,CACV,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,sBAAuB,IACxB,IAAI,QAAc,CAACA,EAASC,IAAW,IACrC,sBAAmB,EACnBF,EAAe,SAAU,GAAO,EAAK,EAErC,MAAMG,EAAe,IAAI,4BAA0B,CACjD,MAAO,CACL,eAAgB,iBAChB,KAAMnB,EACN,cAAeG,EACf,OAAQD,EACR,YAAa,EACf,CACF,CAAC,EAGD,GAAG,MAAMiB,EAAc,qBAAqB,EAAE,gBAC5CR,EAAwB,CAC1B,EACAJ,EAAiB,sBAAsBN,CAAkB,EACzDO,EAAmB,yBACjB,wBAAqB,CAAE,KAAM,MAAU,CAAC,CAC1C,EACAC,EAAkB,yBAChB,wBAAqB,CACnB,MAAO,IAAI,6BACT,oCACF,CACF,CAAC,CACH,EAEA,MAAMW,EAA8C,CAClD,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,eACjD,KAAM,2BAAyB,QACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,cACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,2BAAyB,aACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,eACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,cACjD,KAAM,2BAAyB,eACjC,EACA,OAAQ,qBAAmB,OAC7B,EACA,CACE,MAAO,IAAI,6BACT,oCACF,EACA,OAAQ,qBAAmB,KAC7B,CACF,KAEA,0BAAuBD,EAAcC,EAAgBhB,EAAS,CAC5D,QAASc,EACT,OAAQD,CACV,CAAC,CACH,CAAC,CAAC,CACN,CAAC,CACH,CAAC",
6
6
  "names": ["import_device_management_kit", "import_purify_ts", "import_SignTypedDataDeviceActionTypes", "import_ethAppErrors", "import_makeInternalApi", "import_setupOpenAppDAMock", "import_testDeviceActionStates", "import_Types", "import_SignTypedDataDeviceAction", "importOriginal", "TEST_MESSAGE", "TEST_BUILT_CONTEXT", "mockParser", "mockContextModule", "apiMock", "getAppConfigMock", "web3CheckOptInMock", "buildContextMock", "provideContextMock", "signTypedDataMock", "signTypedDataLegacyMock", "extractDependenciesMock", "createAppConfig", "version", "web3ChecksEnabled", "web3ChecksOptIn", "setupAppConfig", "resolve", "reject", "deviceAction", "expectedStates"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var t=require("@ledgerhq/device-management-kit"),e=require("purify-ts"),g=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),n=require("../../typed-data/model/Types"),m=require("./BuildEIP712ContextTask");describe("BuildEIP712ContextTask",()=>{const o=(0,g.makeDeviceActionInternalApiMock)(),i={getContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn()},s={parse:vi.fn()},c=vi.fn();function f(a){return{blindSigningEnabled:!1,web3ChecksEnabled:a,web3ChecksOptIn:!1,version:"1.13.0"}}const r={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"}]}},d={PermitSingle:{details:new n.StructType("PermitDetails"),spender:new n.PrimitiveType("address","address",e.Nothing),sigDeadline:new n.PrimitiveType("uint256","uint",(0,e.Just)(32))},PermitDetails:{token:new n.PrimitiveType("address","address",e.Nothing),amount:new n.PrimitiveType("uint160","uint",(0,e.Just)(20)),expiration:new n.PrimitiveType("uint48","uint",(0,e.Just)(6)),nonce:new n.PrimitiveType("uint48","uint",(0,e.Just)(6))}},u=[{path:"",type:"",value:new n.TypedDataValueRoot("EIP712Domain")},{path:"chainId",type:"uint256",value:new n.TypedDataValueField(Uint8Array.from([137]))}],p=[{path:"",type:"",value:new n.TypedDataValueRoot("PermitSingle")},{path:"details.amount",type:"uint160",value:new n.TypedDataValueField(Uint8Array.from([18]))},{path:"details.expiration",type:"uint48",value:new n.TypedDataValueField(Uint8Array.from([19]))}],C={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(),c.mockReturnValue({run:async()=>({web3Check:null})})}),it("Build context with clear signing context not supported by the device",async()=>{const a=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!1),c);s.parse.mockReturnValueOnce((0,e.Right)({types:d,domain:u,message:p})),o.getDeviceSessionState.mockReturnValueOnce({sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.11.0"},deviceModelId:t.DeviceModelId.NANO_S,isSecureConnectionAllowed:!1});const l=await a.run();expect(l).toStrictEqual({web3Check:null,types:d,domain:u,message:p,clearSignContext:e.Nothing})}),it("Build context with no clear signing context",async()=>{const a=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!1),c);s.parse.mockReturnValueOnce((0,e.Right)({types:d,domain:u,message:p})),o.getDeviceSessionState.mockReturnValueOnce({sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1}),i.getTypedDataFilters.mockResolvedValueOnce({type:"error",error:new Error("no filter")});const l=await a.run();expect(l).toStrictEqual({web3Check:null,types:d,domain:u,message:p,clearSignContext:e.Nothing})}),it("Build context with clear signing context",async()=>{const a="web3Check",l=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!1),c);c.mockReturnValueOnce({run:async()=>({web3Check:a})}),s.parse.mockReturnValueOnce((0,e.Right)({types:d,domain:u,message:p})),o.getDeviceSessionState.mockReturnValueOnce({sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1}),i.getTypedDataFilters.mockResolvedValueOnce(C);const y=await l.run();expect(y).toStrictEqual({web3Check:null,types:d,domain:u,message:p,clearSignContext:(0,e.Just)(C)}),expect(s.parse).toHaveBeenCalledWith(r),expect(i.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v2",schema:r.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 a="web3Check",l=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!0),c);c.mockReturnValueOnce({run:async()=>({web3Check:a})}),s.parse.mockReturnValueOnce((0,e.Right)({types:d,domain:u,message:p})),o.getDeviceSessionState.mockReturnValueOnce({sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1}),i.getTypedDataFilters.mockResolvedValueOnce(C);const y=await l.run();expect(y).toStrictEqual({web3Check:a,types:d,domain:u,message:p,clearSignContext:(0,e.Just)(C)}),expect(c).toHaveBeenCalledWith(o,{contextModule:i,derivationPath:"44'/60'/0'/0/0",data:r})}),it("Build context with clear signing context V1",async()=>{const a=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!1),c);s.parse.mockReturnValueOnce((0,e.Right)({types:d,domain:u,message:p})),o.getDeviceSessionState.mockReturnValueOnce({sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.11.0"},deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1}),i.getTypedDataFilters.mockResolvedValueOnce(C),await a.run(),expect(i.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v1",schema:r.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 a=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!1),c);s.parse.mockReturnValueOnce((0,e.Left)(new Error("Parsing error")));try{await a.run()}catch(l){expect(l).toBeInstanceOf(Error),expect(l.message).toBe("Parsing error")}})});
1
+ "use strict";var t=require("@ledgerhq/device-management-kit"),e=require("purify-ts"),g=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),n=require("../../typed-data/model/Types"),m=require("./BuildEIP712ContextTask");describe("BuildEIP712ContextTask",()=>{const o=(0,g.makeDeviceActionInternalApiMock)(),i={getContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn(),getSolanaContext:vi.fn()},s={parse:vi.fn()},c=vi.fn();function f(a){return{blindSigningEnabled:!1,web3ChecksEnabled:a,web3ChecksOptIn:!1,version:"1.13.0"}}const r={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"}]}},d={PermitSingle:{details:new n.StructType("PermitDetails"),spender:new n.PrimitiveType("address","address",e.Nothing),sigDeadline:new n.PrimitiveType("uint256","uint",(0,e.Just)(32))},PermitDetails:{token:new n.PrimitiveType("address","address",e.Nothing),amount:new n.PrimitiveType("uint160","uint",(0,e.Just)(20)),expiration:new n.PrimitiveType("uint48","uint",(0,e.Just)(6)),nonce:new n.PrimitiveType("uint48","uint",(0,e.Just)(6))}},u=[{path:"",type:"",value:new n.TypedDataValueRoot("EIP712Domain")},{path:"chainId",type:"uint256",value:new n.TypedDataValueField(Uint8Array.from([137]))}],p=[{path:"",type:"",value:new n.TypedDataValueRoot("PermitSingle")},{path:"details.amount",type:"uint160",value:new n.TypedDataValueField(Uint8Array.from([18]))},{path:"details.expiration",type:"uint48",value:new n.TypedDataValueField(Uint8Array.from([19]))}],C={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(),c.mockReturnValue({run:async()=>({web3Check:null})})}),it("Build context with clear signing context not supported by the device",async()=>{const a=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!1),c);s.parse.mockReturnValueOnce((0,e.Right)({types:d,domain:u,message:p})),o.getDeviceSessionState.mockReturnValueOnce({sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.11.0"},deviceModelId:t.DeviceModelId.NANO_S,isSecureConnectionAllowed:!1});const l=await a.run();expect(l).toStrictEqual({web3Check:null,types:d,domain:u,message:p,clearSignContext:e.Nothing})}),it("Build context with no clear signing context",async()=>{const a=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!1),c);s.parse.mockReturnValueOnce((0,e.Right)({types:d,domain:u,message:p})),o.getDeviceSessionState.mockReturnValueOnce({sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1}),i.getTypedDataFilters.mockResolvedValueOnce({type:"error",error:new Error("no filter")});const l=await a.run();expect(l).toStrictEqual({web3Check:null,types:d,domain:u,message:p,clearSignContext:e.Nothing})}),it("Build context with clear signing context",async()=>{const a="web3Check",l=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!1),c);c.mockReturnValueOnce({run:async()=>({web3Check:a})}),s.parse.mockReturnValueOnce((0,e.Right)({types:d,domain:u,message:p})),o.getDeviceSessionState.mockReturnValueOnce({sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1}),i.getTypedDataFilters.mockResolvedValueOnce(C);const y=await l.run();expect(y).toStrictEqual({web3Check:null,types:d,domain:u,message:p,clearSignContext:(0,e.Just)(C)}),expect(s.parse).toHaveBeenCalledWith(r),expect(i.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v2",schema:r.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 a="web3Check",l=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!0),c);c.mockReturnValueOnce({run:async()=>({web3Check:a})}),s.parse.mockReturnValueOnce((0,e.Right)({types:d,domain:u,message:p})),o.getDeviceSessionState.mockReturnValueOnce({sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1}),i.getTypedDataFilters.mockResolvedValueOnce(C);const y=await l.run();expect(y).toStrictEqual({web3Check:a,types:d,domain:u,message:p,clearSignContext:(0,e.Just)(C)}),expect(c).toHaveBeenCalledWith(o,{contextModule:i,derivationPath:"44'/60'/0'/0/0",data:r})}),it("Build context with clear signing context V1",async()=>{const a=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!1),c);s.parse.mockReturnValueOnce((0,e.Right)({types:d,domain:u,message:p})),o.getDeviceSessionState.mockReturnValueOnce({sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.11.0"},deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1}),i.getTypedDataFilters.mockResolvedValueOnce(C),await a.run(),expect(i.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v1",schema:r.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 a=new m.BuildEIP712ContextTask(o,i,s,r,"44'/60'/0'/0/0",f(!1),c);s.parse.mockReturnValueOnce((0,e.Left)(new Error("Parsing error")));try{await a.run()}catch(l){expect(l).toBeInstanceOf(Error),expect(l.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": ["import_device_management_kit", "import_purify_ts", "import_makeInternalApi", "import_Types", "import_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
+ "use strict";var x=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var y=(s,e)=>{for(var r in e)x(s,r,{get:e[r],enumerable:!0})},h=(s,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of f(e))!g.call(s,t)&&t!==r&&x(s,t,{get:()=>e[t],enumerable:!(a=d(e,t))||a.enumerable});return s};var S=s=>h(x({},"__esModule",{value:!0}),s);var b={};y(b,{BuildSubContextTask:()=>T});module.exports=S(b);var n=require("@ledgerhq/context-module"),i=require("@ledgerhq/device-management-kit"),p=require("../../app-binder/command/GetChallengeCommand");class T{constructor(e,r){this.api=e;this.args=r}run(){const e=this.args.context;if(e.type===n.ClearSignContextType.TRANSACTION_INFO||e.type===n.ClearSignContextType.ENUM||e.type===n.ClearSignContextType.WEB3_CHECK||e.type===n.ClearSignContextType.PLUGIN||e.type===n.ClearSignContextType.EXTERNAL_PLUGIN)return{subcontextCallbacks:[]};if(e.reference!==void 0&&"value"in e.reference&&e.reference.value!==void 0){const r={type:e.reference.type,chainId:this.args.subset.chainId,address:e.reference.value};return{subcontextCallbacks:[()=>this.args.contextModule.getContext(r)]}}if(e.reference!==void 0&&e.reference.valuePath!==void 0){const r=this.args.transactionParser.extractValue(this.args.subset,e.reference.valuePath);if(r.isRight()){const a=[];for(const t of r.extract()){if(e.reference.type===n.ClearSignContextType.ENUM){const o=e.reference,c=t[t.length-1];if(!c)continue;const C=this.args.contextOptional.filter(l=>l.type===n.ClearSignContextType.ENUM).find(l=>l.value===c&&l.id===o.id);C&&a.push(()=>Promise.resolve(C))}if(e.reference.type===n.ClearSignContextType.TOKEN||e.reference.type===n.ClearSignContextType.NFT){const o=e.reference,c=(0,i.bufferToHexaString)(t.slice(Math.max(0,t.length-20)));a.push(()=>this.args.contextModule.getContext({type:o.type,chainId:this.args.subset.chainId,address:c}))}if(e.reference.type===n.ClearSignContextType.TRUSTED_NAME){const o=e.reference;a.push(async()=>{const c=(0,i.bufferToHexaString)(t.slice(Math.max(0,t.length-20))),u=await this.api.sendCommand(new p.GetChallengeCommand);return(0,i.isSuccessCommandResult)(u)?await this.args.contextModule.getContext({type:o.type,chainId:this.args.subset.chainId,address:c,challenge:u.data.challenge,types:o.types,sources:o.sources}):{type:n.ClearSignContextType.ERROR,error:new Error("Failed to get challenge")}})}}return{subcontextCallbacks:a}}}return{subcontextCallbacks:[]}}}0&&(module.exports={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": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAQO,oCACPC,EAIO,2CAEPC,EAAoC,4DAe7B,MAAMJ,CAAoB,CAC/B,YACmBK,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,KAAiC,CAC/B,MAAMC,EAAU,KAAK,KAAK,QAE1B,GACEA,EAAQ,OAAS,uBAAqB,kBACtCA,EAAQ,OAAS,uBAAqB,MACtCA,EAAQ,OAAS,uBAAqB,YACtCA,EAAQ,OAAS,uBAAqB,QACtCA,EAAQ,OAAS,uBAAqB,gBAEtC,MAAO,CACL,oBAAqB,CAAC,CACxB,EAMF,GACEA,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,OAAS,uBAAqB,KAAM,CACxD,MAAMK,EACJL,EAAQ,UACJM,EAAYF,EAAMA,EAAM,OAAS,CAAC,EACxC,GAAI,CAACE,EAAW,SAMhB,MAAMC,EAJe,KAAK,KAAK,gBAAgB,OAC5CC,GAAMA,EAAE,OAAS,uBAAqB,IACzC,EAEgC,KAC7BC,GACCA,EAAY,QAAUH,GACtBG,EAAY,KAAOJ,EAAU,EACjC,EAEIE,GACFJ,EAAoB,KAAK,IAAM,QAAQ,QAAQI,CAAU,CAAC,CAE9D,CAEA,GACEP,EAAQ,UAAU,OAAS,uBAAqB,OAChDA,EAAQ,UAAU,OAAS,uBAAqB,IAChD,CACA,MAAMK,EAEFL,EAAQ,UACNU,KAAU,sBACdN,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,QAAAK,CACF,CAAC,CACH,CACF,CAEA,GAAIV,EAAQ,UAAU,OAAS,uBAAqB,aAAc,CAChE,MAAMK,EACJL,EAAQ,UACVG,EAAoB,KAAK,SAAY,CACnC,MAAMO,KAAU,sBACdN,EAAM,MAAM,KAAK,IAAI,EAAGA,EAAM,OAAS,EAAE,CAAC,CAC5C,EAEMO,EAAqB,MAAM,KAAK,IAAI,YACxC,IAAI,qBACN,EACA,SAAK,0BAAuBA,CAAkB,EAQ3B,MAAM,KAAK,KAAK,cAAc,WAAW,CAC1D,KAAMN,EAAU,KAChB,QAAS,KAAK,KAAK,OAAO,QAC1B,QAAAK,EACA,UAAWC,EAAmB,KAAK,UACnC,MAAON,EAAU,MACjB,QAASA,EAAU,OACrB,CAAC,EAbQ,CACL,KAAM,uBAAqB,MAC3B,MAAO,IAAI,MAAM,yBAAyB,CAC5C,CAaJ,CAAC,CACH,CACF,CAEA,MAAO,CACL,oBAAAF,CACF,CACF,CACF,CAEA,MAAO,CACL,oBAAqB,CAAC,CACxB,CACF,CACF",
6
+ "names": ["BuildSubContextTask_exports", "__export", "BuildSubContextTask", "__toCommonJS", "import_context_module", "import_device_management_kit", "import_GetChallengeCommand", "api", "args", "context", "transactionFieldContext", "referenceValues", "subcontextCallbacks", "value", "reference", "enumValue", "subcontext", "c", "enumContext", "address", "getChallengeResult"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("@ledgerhq/context-module"),C=require("@ledgerhq/device-management-kit"),d=require("purify-ts"),h=require("../../app-binder/command/GetChallengeCommand"),g=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),x=require("./BuildSubContextTask");describe("BuildSubContextTask",()=>{const r={getContext:vi.fn()},p={extractValue:vi.fn()},s=(0,g.makeDeviceActionInternalApiMock)();let l;beforeEach(()=>{vi.resetAllMocks(),l={context:{type:e.ClearSignContextType.TRANSACTION_INFO,payload:"test payload"},contextOptional:[],transactionParser:p,subset:{chainId:1,data:"0x",selector:"0x",to:"0x",value:BigInt(0)},contextModule:r}}),describe("when context type is a simple type",()=>{const n=[e.ClearSignContextType.TRANSACTION_INFO,e.ClearSignContextType.WEB3_CHECK,e.ClearSignContextType.PLUGIN,e.ClearSignContextType.EXTERNAL_PLUGIN,e.ClearSignContextType.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 x.BuildSubContextTask(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.ClearSignContextType.TOKEN,payload:"test payload",reference:{type:e.ClearSignContextType.TOKEN,value:"0x1234567890123456789012345678901234567890"}},t={...l,context:n},a={type:e.ClearSignContextType.TOKEN,chainId:1,address:"0x1234567890123456789012345678901234567890"},c=new x.BuildSubContextTask(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0];await o(),expect(r.getContext).toHaveBeenCalledWith(a)}),it("should handle undefined value in reference",()=>{const n={type:e.ClearSignContextType.TOKEN,payload:"test payload",reference:void 0},t={...l,context:n},a=new x.BuildSubContextTask(s,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when context has a valuePath reference",()=>{beforeEach(()=>{s.sendCommand.mockResolvedValue((0,C.CommandResultFactory)({data:{challenge:"test-challenge"}}))}),describe("when extractValue returns Left (error)",()=>{it("should return context with empty subcontextCallbacks",()=>{const n={type:e.ClearSignContextType.TOKEN,payload:"test payload",reference:{type:e.ClearSignContextType.TOKEN,valuePath:[{type:"SLICE",start:0,end:20}]}},t={...l,context:n};p.extractValue.mockReturnValue((0,d.Left)(new Error("Extraction failed")));const a=new x.BuildSubContextTask(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.ClearSignContextType.TOKEN,payload:"test payload",reference:{type:e.ClearSignContextType.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ClearSignContextType.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ClearSignContextType.ENUM,id:1,value:2,payload:"enum context 2"},c={type:e.ClearSignContextType.ENUM,id:2,value:2,payload:"enum context 3"},o={...l,context:n,contextOptional:[t,a,c]},u=[new Uint8Array([1,2])];p.extractValue.mockReturnValue((0,d.Right)(u));const i=new x.BuildSubContextTask(s,o).run();expect(i.subcontextCallbacks).toHaveLength(1);const y=i.subcontextCallbacks[0],b=await y();expect(b).toEqual(a)}),it("should create callbacks for matching enum contexts with two values",async()=>{const n={type:e.ClearSignContextType.TOKEN,payload:"test payload",reference:{type:e.ClearSignContextType.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ClearSignContextType.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ClearSignContextType.ENUM,id:1,value:2,payload:"enum context 2"},c={type:e.ClearSignContextType.ENUM,id:2,value:2,payload:"enum context 3"},o={...l,context:n,contextOptional:[t,a,c]},u=[new Uint8Array([1,2]),new Uint8Array([3,2,1])];p.extractValue.mockReturnValue((0,d.Right)(u));const i=new x.BuildSubContextTask(s,o).run();expect(i.subcontextCallbacks).toHaveLength(2);const y=i.subcontextCallbacks[0],b=i.subcontextCallbacks[1],k=await y(),E=await b();expect(k).toEqual(a),expect(E).toEqual(t)}),it("should skip when enum value is undefined",()=>{const n={type:e.ClearSignContextType.TOKEN,payload:"test payload",reference:{type:e.ClearSignContextType.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([])];p.extractValue.mockReturnValue((0,d.Right)(a));const c=new x.BuildSubContextTask(s,t).run();expect(c.subcontextCallbacks).toHaveLength(0)}),it("should skip when no matching enum context found",()=>{const n={type:e.ClearSignContextType.NFT,payload:"test payload",reference:{type:e.ClearSignContextType.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ClearSignContextType.ENUM,id:2,value:2,payload:"enum context"},a={...l,context:n,contextOptional:[t]},c=[new Uint8Array([1,2])];p.extractValue.mockReturnValue((0,d.Right)(c));const o=new x.BuildSubContextTask(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.ClearSignContextType.TOKEN,payload:"test payload",reference:{type:e.ClearSignContextType.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])];p.extractValue.mockReturnValue((0,d.Right)(a)),r.getContext.mockResolvedValue({type:e.ClearSignContextType.TOKEN,payload:"token result"});const c=new x.BuildSubContextTask(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],u=await o();expect(u).toEqual({type:e.ClearSignContextType.TOKEN,payload:"token result"}),expect(r.getContext).toHaveBeenCalledWith({type:e.ClearSignContextType.TOKEN,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"})})}),describe("for NFT type",()=>{it("should create callbacks to get NFT context",async()=>{const n={type:e.ClearSignContextType.NFT,payload:"test payload",reference:{type:e.ClearSignContextType.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])];p.extractValue.mockReturnValue((0,d.Right)(a)),r.getContext.mockResolvedValue({type:e.ClearSignContextType.NFT,payload:"nft result"});const c=new x.BuildSubContextTask(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],u=await o();expect(u).toEqual({type:e.ClearSignContextType.NFT,payload:"nft result"}),expect(r.getContext).toHaveBeenCalledWith({type:e.ClearSignContextType.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.ClearSignContextType.TRUSTED_NAME,payload:"test payload",reference:{type:e.ClearSignContextType.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])];p.extractValue.mockReturnValue((0,d.Right)(a)),r.getContext.mockResolvedValue({type:e.ClearSignContextType.TRUSTED_NAME,payload:"trusted name result"});const c=new x.BuildSubContextTask(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],u=await o();expect(u).toEqual({type:e.ClearSignContextType.TRUSTED_NAME,payload:"trusted name result"}),expect(s.sendCommand).toHaveBeenCalledWith(expect.any(h.GetChallengeCommand)),expect(r.getContext).toHaveBeenCalledWith({type:e.ClearSignContextType.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.ClearSignContextType.TRUSTED_NAME,payload:"test payload",reference:{type:e.ClearSignContextType.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])];p.extractValue.mockReturnValue((0,d.Right)(a));const c=new C.UnknownDeviceExchangeError("Failed");s.sendCommand.mockResolvedValueOnce((0,C.CommandResultFactory)({error:c}));const o=new x.BuildSubContextTask(s,t).run();expect(o.subcontextCallbacks).toHaveLength(1);const u=o.subcontextCallbacks[0],i=await u();expect(i).toEqual({error:new Error("Failed to get challenge"),type:e.ClearSignContextType.ERROR})})}),describe("for multiple values",()=>{it("should create callbacks for each extracted value",async()=>{const n={type:e.ClearSignContextType.TOKEN,payload:"test payload",reference:{type:e.ClearSignContextType.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])];p.extractValue.mockReturnValue((0,d.Right)(a)),r.getContext.mockResolvedValueOnce({type:e.ClearSignContextType.TOKEN,payload:"token result 1"}),r.getContext.mockResolvedValueOnce({type:e.ClearSignContextType.TOKEN,payload:"token result 2"});const c=new x.BuildSubContextTask(s,t).run();expect(c.subcontextCallbacks).toHaveLength(2);const o=c.subcontextCallbacks[0],u=c.subcontextCallbacks[1],i=await o(),y=await u();expect(i).toEqual({type:e.ClearSignContextType.TOKEN,payload:"token result 1"}),expect(y).toEqual({type:e.ClearSignContextType.TOKEN,payload:"token result 2"}),expect(r.getContext).toHaveBeenCalledTimes(2),expect(r.getContext).toHaveBeenNthCalledWith(1,{type:e.ClearSignContextType.TOKEN,chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"}),expect(r.getContext).toHaveBeenNthCalledWith(2,{type:e.ClearSignContextType.TOKEN,chainId:1,address:"0x232425262728292a2b2c2d2e2f30313233343536"})})})})}),describe("when context has no reference",()=>{it("should return context with empty subcontextCallbacks",()=>{const n={type:e.ClearSignContextType.TOKEN,payload:"test payload"},t={...l,context:n},a=new x.BuildSubContextTask(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.ClearSignContextType.TOKEN,payload:"test payload",reference:{type:e.ClearSignContextType.TOKEN}},t={...l,context:n},a=new x.BuildSubContextTask(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.ClearSignContextType.TOKEN,payload:"test payload",reference:{type:e.ClearSignContextType.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([1,2,3])];p.extractValue.mockReturnValue((0,d.Right)(a)),r.getContext.mockResolvedValue({type:e.ClearSignContextType.ERROR,message:"Invalid address"});const c=new x.BuildSubContextTask(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],u=await o();expect(u).toEqual({type:e.ClearSignContextType.ERROR,message:"Invalid address"}),expect(r.getContext).toHaveBeenCalledWith({type:e.ClearSignContextType.TOKEN,chainId:1,address:"0x010203"})}),it("should handle empty value array",async()=>{const n={type:e.ClearSignContextType.TOKEN,payload:"test payload",reference:{type:e.ClearSignContextType.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:n},a=[new Uint8Array([])];p.extractValue.mockReturnValue((0,d.Right)(a)),r.getContext.mockResolvedValue({type:e.ClearSignContextType.TOKEN,payload:"token result"});const c=new x.BuildSubContextTask(s,t).run();expect(c.subcontextCallbacks).toHaveLength(1);const o=c.subcontextCallbacks[0],u=await o();expect(u).toEqual({type:e.ClearSignContextType.TOKEN,payload:"token result"}),expect(r.getContext).toHaveBeenCalledWith({type:e.ClearSignContextType.TOKEN,chainId:1,address:"0x"})})})});
2
+ //# sourceMappingURL=BuildSubContextTask.test.js.map