@ledgerhq/device-contacts-kit 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/README.md +29 -2
  2. package/lib/cjs/api/ContactsManager.js +1 -1
  3. package/lib/cjs/api/ContactsManager.js.map +1 -1
  4. package/lib/cjs/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.js +2 -0
  5. package/lib/cjs/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.js.map +7 -0
  6. package/lib/cjs/api/app-binder/EditExternalAddressScopeDeviceActionTypes.js +2 -0
  7. package/lib/cjs/api/app-binder/EditExternalAddressScopeDeviceActionTypes.js.map +7 -0
  8. package/lib/cjs/api/app-binder/RenameContactDeviceActionTypes.js +2 -0
  9. package/lib/cjs/api/app-binder/RenameContactDeviceActionTypes.js.map +7 -0
  10. package/lib/cjs/api/index.js +1 -1
  11. package/lib/cjs/api/index.js.map +2 -2
  12. package/lib/cjs/api/model/EditExternalAddressIdentifier.js +2 -0
  13. package/lib/cjs/api/model/EditExternalAddressIdentifier.js.map +7 -0
  14. package/lib/cjs/api/model/EditExternalAddressScope.js +2 -0
  15. package/lib/cjs/api/model/EditExternalAddressScope.js.map +7 -0
  16. package/lib/cjs/api/model/RenameContact.js +2 -0
  17. package/lib/cjs/api/model/RenameContact.js.map +7 -0
  18. package/lib/cjs/internal/DefaultContactsManager.js +1 -1
  19. package/lib/cjs/internal/DefaultContactsManager.js.map +2 -2
  20. package/lib/cjs/internal/DefaultContactsManager.test.js +1 -1
  21. package/lib/cjs/internal/DefaultContactsManager.test.js.map +3 -3
  22. package/lib/cjs/internal/app-binder/ContactsAppBinder.js +1 -1
  23. package/lib/cjs/internal/app-binder/ContactsAppBinder.js.map +3 -3
  24. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.js +2 -0
  25. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.js.map +7 -0
  26. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js +2 -0
  27. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js.map +7 -0
  28. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.js +2 -0
  29. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.js.map +7 -0
  30. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.test.js +2 -0
  31. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.test.js.map +7 -0
  32. package/lib/cjs/internal/app-binder/command/RenameContactCommand.js +2 -0
  33. package/lib/cjs/internal/app-binder/command/RenameContactCommand.js.map +7 -0
  34. package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js +2 -0
  35. package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js.map +7 -0
  36. package/lib/cjs/internal/app-binder/contactsVersionGuards.js +2 -0
  37. package/lib/cjs/internal/app-binder/contactsVersionGuards.js.map +7 -0
  38. package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js +2 -0
  39. package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js.map +7 -0
  40. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js +2 -0
  41. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js.map +7 -0
  42. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +2 -0
  43. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +7 -0
  44. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js +2 -0
  45. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js.map +7 -0
  46. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +2 -0
  47. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +7 -0
  48. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js +2 -0
  49. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js.map +7 -0
  50. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +2 -0
  51. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +7 -0
  52. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js +2 -0
  53. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js.map +7 -0
  54. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +2 -0
  55. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +7 -0
  56. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js +1 -1
  57. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js.map +3 -3
  58. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +2 -0
  59. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +7 -0
  60. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +2 -0
  61. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +7 -0
  62. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js +2 -0
  63. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js.map +7 -0
  64. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +2 -0
  65. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +7 -0
  66. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +2 -0
  67. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +7 -0
  68. package/lib/cjs/internal/app-binder/model/contactsConstants.js +1 -1
  69. package/lib/cjs/internal/app-binder/model/contactsConstants.js.map +3 -3
  70. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js +2 -0
  71. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js.map +7 -0
  72. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +2 -0
  73. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +7 -0
  74. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.js +2 -0
  75. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.js.map +7 -0
  76. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +2 -0
  77. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +7 -0
  78. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.js +1 -1
  79. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.js.map +2 -2
  80. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js +1 -1
  81. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +2 -2
  82. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js +2 -0
  83. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js.map +7 -0
  84. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js +2 -0
  85. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js.map +7 -0
  86. package/lib/cjs/internal/di.test.js +1 -1
  87. package/lib/cjs/internal/di.test.js.map +3 -3
  88. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.js +2 -0
  89. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.js.map +7 -0
  90. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +2 -0
  91. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +7 -0
  92. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.js +2 -0
  93. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.js.map +7 -0
  94. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js +2 -0
  95. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +7 -0
  96. package/lib/cjs/internal/use-cases/RenameContactUseCase.js +2 -0
  97. package/lib/cjs/internal/use-cases/RenameContactUseCase.js.map +7 -0
  98. package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js +2 -0
  99. package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js.map +7 -0
  100. package/lib/cjs/internal/use-cases/di/useCaseModule.js +1 -1
  101. package/lib/cjs/internal/use-cases/di/useCaseModule.js.map +3 -3
  102. package/lib/cjs/internal/use-cases/di/useCaseTypes.js +1 -1
  103. package/lib/cjs/internal/use-cases/di/useCaseTypes.js.map +2 -2
  104. package/lib/cjs/package.json +1 -1
  105. package/lib/esm/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.js +1 -0
  106. package/lib/esm/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.js.map +7 -0
  107. package/lib/esm/api/app-binder/EditExternalAddressScopeDeviceActionTypes.js +1 -0
  108. package/lib/esm/api/app-binder/EditExternalAddressScopeDeviceActionTypes.js.map +7 -0
  109. package/lib/esm/api/app-binder/RenameContactDeviceActionTypes.js +1 -0
  110. package/lib/esm/api/app-binder/RenameContactDeviceActionTypes.js.map +7 -0
  111. package/lib/esm/api/index.js +1 -1
  112. package/lib/esm/api/index.js.map +2 -2
  113. package/lib/esm/api/model/EditExternalAddressIdentifier.js +1 -0
  114. package/lib/esm/api/model/EditExternalAddressIdentifier.js.map +7 -0
  115. package/lib/esm/api/model/EditExternalAddressScope.js +1 -0
  116. package/lib/esm/api/model/EditExternalAddressScope.js.map +7 -0
  117. package/lib/esm/api/model/RenameContact.js +1 -0
  118. package/lib/esm/api/model/RenameContact.js.map +7 -0
  119. package/lib/esm/internal/DefaultContactsManager.js +1 -1
  120. package/lib/esm/internal/DefaultContactsManager.js.map +2 -2
  121. package/lib/esm/internal/DefaultContactsManager.test.js +1 -1
  122. package/lib/esm/internal/DefaultContactsManager.test.js.map +3 -3
  123. package/lib/esm/internal/app-binder/ContactsAppBinder.js +1 -1
  124. package/lib/esm/internal/app-binder/ContactsAppBinder.js.map +3 -3
  125. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.js +2 -0
  126. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.js.map +7 -0
  127. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js +2 -0
  128. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js.map +7 -0
  129. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.js +2 -0
  130. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.js.map +7 -0
  131. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js +2 -0
  132. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js.map +7 -0
  133. package/lib/esm/internal/app-binder/command/RenameContactCommand.js +2 -0
  134. package/lib/esm/internal/app-binder/command/RenameContactCommand.js.map +7 -0
  135. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js +2 -0
  136. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js.map +7 -0
  137. package/lib/esm/internal/app-binder/contactsVersionGuards.js +2 -0
  138. package/lib/esm/internal/app-binder/contactsVersionGuards.js.map +7 -0
  139. package/lib/esm/internal/app-binder/contactsVersionGuards.test.js +2 -0
  140. package/lib/esm/internal/app-binder/contactsVersionGuards.test.js.map +7 -0
  141. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js +2 -0
  142. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js.map +7 -0
  143. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +2 -0
  144. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +7 -0
  145. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js +2 -0
  146. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js.map +7 -0
  147. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +2 -0
  148. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +7 -0
  149. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js +2 -0
  150. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js.map +7 -0
  151. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +2 -0
  152. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +7 -0
  153. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js +2 -0
  154. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js.map +7 -0
  155. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +2 -0
  156. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +7 -0
  157. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js +1 -1
  158. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js.map +3 -3
  159. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +2 -0
  160. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +7 -0
  161. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +2 -0
  162. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +7 -0
  163. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js +2 -0
  164. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js.map +7 -0
  165. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +2 -0
  166. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +7 -0
  167. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +2 -0
  168. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +7 -0
  169. package/lib/esm/internal/app-binder/model/contactsConstants.js +1 -1
  170. package/lib/esm/internal/app-binder/model/contactsConstants.js.map +3 -3
  171. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js +2 -0
  172. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js.map +7 -0
  173. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +2 -0
  174. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +7 -0
  175. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.js +2 -0
  176. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.js.map +7 -0
  177. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +2 -0
  178. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +7 -0
  179. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.js +1 -1
  180. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.js.map +3 -3
  181. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js +1 -1
  182. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +2 -2
  183. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js +2 -0
  184. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js.map +7 -0
  185. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js +2 -0
  186. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js.map +7 -0
  187. package/lib/esm/internal/di.test.js +1 -1
  188. package/lib/esm/internal/di.test.js.map +3 -3
  189. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.js +2 -0
  190. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.js.map +7 -0
  191. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +2 -0
  192. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +7 -0
  193. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.js +2 -0
  194. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.js.map +7 -0
  195. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js +2 -0
  196. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +7 -0
  197. package/lib/esm/internal/use-cases/RenameContactUseCase.js +2 -0
  198. package/lib/esm/internal/use-cases/RenameContactUseCase.js.map +7 -0
  199. package/lib/esm/internal/use-cases/RenameContactUseCase.test.js +2 -0
  200. package/lib/esm/internal/use-cases/RenameContactUseCase.test.js.map +7 -0
  201. package/lib/esm/internal/use-cases/di/useCaseModule.js +1 -1
  202. package/lib/esm/internal/use-cases/di/useCaseModule.js.map +3 -3
  203. package/lib/esm/internal/use-cases/di/useCaseTypes.js +1 -1
  204. package/lib/esm/internal/use-cases/di/useCaseTypes.js.map +2 -2
  205. package/lib/esm/package.json +1 -1
  206. package/lib/types/api/ContactsManager.d.ts +35 -0
  207. package/lib/types/api/ContactsManager.d.ts.map +1 -1
  208. package/lib/types/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.d.ts +27 -0
  209. package/lib/types/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.d.ts.map +1 -0
  210. package/lib/types/api/app-binder/EditExternalAddressScopeDeviceActionTypes.d.ts +27 -0
  211. package/lib/types/api/app-binder/EditExternalAddressScopeDeviceActionTypes.d.ts.map +1 -0
  212. package/lib/types/api/app-binder/RenameContactDeviceActionTypes.d.ts +25 -0
  213. package/lib/types/api/app-binder/RenameContactDeviceActionTypes.d.ts.map +1 -0
  214. package/lib/types/api/index.d.ts +6 -0
  215. package/lib/types/api/index.d.ts.map +1 -1
  216. package/lib/types/api/model/EditExternalAddressIdentifier.d.ts +57 -0
  217. package/lib/types/api/model/EditExternalAddressIdentifier.d.ts.map +1 -0
  218. package/lib/types/api/model/EditExternalAddressScope.d.ts +59 -0
  219. package/lib/types/api/model/EditExternalAddressScope.d.ts.map +1 -0
  220. package/lib/types/api/model/RenameContact.d.ts +39 -0
  221. package/lib/types/api/model/RenameContact.d.ts.map +1 -0
  222. package/lib/types/internal/DefaultContactsManager.d.ts +9 -0
  223. package/lib/types/internal/DefaultContactsManager.d.ts.map +1 -1
  224. package/lib/types/internal/app-binder/ContactsAppBinder.d.ts +9 -0
  225. package/lib/types/internal/app-binder/ContactsAppBinder.d.ts.map +1 -1
  226. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.d.ts +25 -0
  227. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.d.ts.map +1 -0
  228. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts +2 -0
  229. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts.map +1 -0
  230. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.d.ts +25 -0
  231. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.d.ts.map +1 -0
  232. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts +2 -0
  233. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts.map +1 -0
  234. package/lib/types/internal/app-binder/command/RenameContactCommand.d.ts +25 -0
  235. package/lib/types/internal/app-binder/command/RenameContactCommand.d.ts.map +1 -0
  236. package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts +2 -0
  237. package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts.map +1 -0
  238. package/lib/types/internal/app-binder/contactsVersionGuards.d.ts +38 -0
  239. package/lib/types/internal/app-binder/contactsVersionGuards.d.ts.map +1 -0
  240. package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts +2 -0
  241. package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts.map +1 -0
  242. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.d.ts +14 -0
  243. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.d.ts.map +1 -0
  244. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts +2 -0
  245. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts.map +1 -0
  246. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.d.ts +9 -0
  247. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.d.ts.map +1 -0
  248. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts +2 -0
  249. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts.map +1 -0
  250. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.d.ts +14 -0
  251. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.d.ts.map +1 -0
  252. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts +2 -0
  253. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts.map +1 -0
  254. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.d.ts +9 -0
  255. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.d.ts.map +1 -0
  256. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts +2 -0
  257. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts.map +1 -0
  258. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.d.ts +1 -1
  259. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.d.ts.map +1 -1
  260. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.d.ts +13 -0
  261. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.d.ts.map +1 -0
  262. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts +2 -0
  263. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts.map +1 -0
  264. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.d.ts +12 -0
  265. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.d.ts.map +1 -0
  266. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts +2 -0
  267. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts.map +1 -0
  268. package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts +12 -0
  269. package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts.map +1 -0
  270. package/lib/types/internal/app-binder/model/contactsConstants.d.ts +26 -0
  271. package/lib/types/internal/app-binder/model/contactsConstants.d.ts.map +1 -1
  272. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.d.ts +25 -0
  273. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.d.ts.map +1 -0
  274. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts +2 -0
  275. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts.map +1 -0
  276. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.d.ts +25 -0
  277. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.d.ts.map +1 -0
  278. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts +2 -0
  279. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts.map +1 -0
  280. package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.d.ts.map +1 -1
  281. package/lib/types/internal/app-binder/task/SendRenameContactTask.d.ts +20 -0
  282. package/lib/types/internal/app-binder/task/SendRenameContactTask.d.ts.map +1 -0
  283. package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts +2 -0
  284. package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts.map +1 -0
  285. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.d.ts +14 -0
  286. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.d.ts.map +1 -0
  287. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts +2 -0
  288. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts.map +1 -0
  289. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.d.ts +14 -0
  290. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.d.ts.map +1 -0
  291. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts +2 -0
  292. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts.map +1 -0
  293. package/lib/types/internal/use-cases/RenameContactUseCase.d.ts +19 -0
  294. package/lib/types/internal/use-cases/RenameContactUseCase.d.ts.map +1 -0
  295. package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts +2 -0
  296. package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts.map +1 -0
  297. package/lib/types/internal/use-cases/di/useCaseModule.d.ts.map +1 -1
  298. package/lib/types/internal/use-cases/di/useCaseTypes.d.ts +3 -0
  299. package/lib/types/internal/use-cases/di/useCaseTypes.d.ts.map +1 -1
  300. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  301. package/package.json +4 -4
  302. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.js +0 -2
  303. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.js.map +0 -7
  304. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.test.js +0 -2
  305. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.test.js.map +0 -7
  306. package/lib/esm/internal/app-binder/isContactsSupportedForSession.js +0 -2
  307. package/lib/esm/internal/app-binder/isContactsSupportedForSession.js.map +0 -7
  308. package/lib/esm/internal/app-binder/isContactsSupportedForSession.test.js +0 -2
  309. package/lib/esm/internal/app-binder/isContactsSupportedForSession.test.js.map +0 -7
  310. package/lib/types/internal/app-binder/isContactsSupportedForSession.d.ts +0 -25
  311. package/lib/types/internal/app-binder/isContactsSupportedForSession.d.ts.map +0 -1
  312. package/lib/types/internal/app-binder/isContactsSupportedForSession.test.d.ts +0 -2
  313. package/lib/types/internal/app-binder/isContactsSupportedForSession.test.d.ts.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/internal/app-binder/contactsVersionGuards.ts"],
4
+ "sourcesContent": ["import {\n ApplicationChecker,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n type ContactsModelRequirement,\n type ContactsModelSupport,\n isVersionAtLeast,\n resolveContactsVersionRequirements,\n} from \"@api/model/ContactsVersionRequirements\";\n\nimport { ContactsApplicationResolver } from \"./ContactsApplicationResolver\";\n\n/** The running app's identity, read freshly from the device. */\nexport type RunningApp = {\n readonly name: string;\n readonly version: string;\n};\n\n/** Narrows a resolved requirement to the case where Contacts is supported at all on this device model. */\nfunction isContactsModelSupported(\n requirement: ContactsModelRequirement,\n): requirement is ContactsModelSupport {\n return requirement.supported;\n}\n\n/**\n * OS-only Contacts support check, for internal consumption by dashboard\n * `DeviceAction`s (e.g. Rename Contact, EDIT CONTACT NAME). Dashboard operations\n * are served by the device OS, not the embedded app, so only two dimensions\n * apply:\n * - the device model must be supported;\n * - the device OS must meet its minimum version.\n *\n * The running-app dimension is intentionally skipped: on the dashboard there is\n * no embedded app to gate on (the running \"app\" is BOLOS).\n *\n * @param internalApi - the DeviceAction's internal API for the current session.\n */\nexport function isContactsOsSupportedForSession(\n internalApi: InternalApi,\n): boolean {\n const deviceState = internalApi.getDeviceSessionState();\n const requirement = resolveContactsVersionRequirements(\n deviceState.deviceModelId,\n );\n if (!isContactsModelSupported(requirement)) return false;\n\n const osVersion =\n \"firmwareVersion\" in deviceState\n ? deviceState.firmwareVersion?.os\n : undefined;\n if (osVersion === undefined) return false;\n\n return isVersionAtLeast(osVersion, requirement.minOsVersion);\n}\n\n/**\n * Session-aware Contacts support check, for internal consumption by app-owned\n * Contacts `DeviceAction`s (registering / editing external addresses). These\n * operations are served by the embedded app, not the device OS, so only two\n * dimensions apply:\n * - the device model must be supported;\n * - the running app must be known to Contacts and meet its minimum version.\n *\n * The app `name` and `version` are supplied by the caller so they can come from\n * a fresh `WaitForAppAndVersion` result rather than the (potentially stale)\n * device session state; the model comes from the session state, which does\n * not change under the caller's feet the way the running app can.\n *\n * @param internalApi - the DeviceAction's internal API for the current session.\n * @param app - the running app's fresh name and version.\n */\nexport function isContactsAppVersionSupportedForSession(\n internalApi: InternalApi,\n app: RunningApp,\n): boolean {\n const deviceState = internalApi.getDeviceSessionState();\n const requirement = resolveContactsVersionRequirements(\n deviceState.deviceModelId,\n );\n if (!isContactsModelSupported(requirement)) return false;\n\n const minAppVersion = requirement.minAppVersion[app.name];\n if (minAppVersion === undefined) return false;\n\n return new ApplicationChecker(\n deviceState,\n { version: app.version },\n new ContactsApplicationResolver(),\n )\n .withMinVersionInclusive(minAppVersion)\n .check();\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6CAAAE,EAAA,oCAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAGO,2CAEPC,EAKO,kDAEPC,EAA4C,yCAS5C,SAASC,EACPC,EACqC,CACrC,OAAOA,EAAY,SACrB,CAeO,SAASN,EACdO,EACS,CACT,MAAMC,EAAcD,EAAY,sBAAsB,EAChDD,KAAc,sCAClBE,EAAY,aACd,EACA,GAAI,CAACH,EAAyBC,CAAW,EAAG,MAAO,GAEnD,MAAMG,EACJ,oBAAqBD,EACjBA,EAAY,iBAAiB,GAC7B,OACN,OAAIC,IAAc,OAAkB,MAE7B,oBAAiBA,EAAWH,EAAY,YAAY,CAC7D,CAkBO,SAASP,EACdQ,EACAG,EACS,CACT,MAAMF,EAAcD,EAAY,sBAAsB,EAChDD,KAAc,sCAClBE,EAAY,aACd,EACA,GAAI,CAACH,EAAyBC,CAAW,EAAG,MAAO,GAEnD,MAAMK,EAAgBL,EAAY,cAAcI,EAAI,IAAI,EACxD,OAAIC,IAAkB,OAAkB,GAEjC,IAAI,qBACTH,EACA,CAAE,QAASE,EAAI,OAAQ,EACvB,IAAI,6BACN,EACG,wBAAwBC,CAAa,EACrC,MAAM,CACX",
6
+ "names": ["contactsVersionGuards_exports", "__export", "isContactsAppVersionSupportedForSession", "isContactsOsSupportedForSession", "__toCommonJS", "import_device_management_kit", "import_ContactsVersionRequirements", "import_ContactsApplicationResolver", "isContactsModelSupported", "requirement", "internalApi", "deviceState", "osVersion", "app", "minAppVersion"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var t=require("@ledgerhq/device-management-kit"),i=require("../../api/model/ContactsVersionRequirements"),n=require("./contactsVersionGuards");const c=(()=>{const e=(0,i.resolveContactsVersionRequirements)(t.DeviceModelId.FLEX);if(!e.supported)throw new Error("Flex must be supported");return e})(),u=c.minOsVersion,d=(()=>{const e=c.minAppVersion[i.ETHEREUM_APP_NAME];if(e===void 0)throw new Error("Ethereum min version required");return e})(),a="0.0.1";function o({osVersion:e=u,modelId:p=t.DeviceModelId.FLEX}={}){return{sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:i.ETHEREUM_APP_NAME,version:"0.0.0"},deviceModelId:p,firmwareVersion:{mcu:"1.0.0",bootloader:"1.0.0",os:e},isSecureConnectionAllowed:!1}}function s(e){return{getDeviceSessionState:()=>e}}function r(e=i.ETHEREUM_APP_NAME,p=d){return{name:e,version:p}}describe("isContactsAppVersionSupportedForSession",()=>{it("returns true when the model and app version meet the minimums",()=>{const e=s(o());expect((0,n.isContactsAppVersionSupportedForSession)(e,r())).toBe(!0)}),it("returns true regardless of OS version, since app-owned operations are not gated by it",()=>{const e=s(o({osVersion:a}));expect((0,n.isContactsAppVersionSupportedForSession)(e,r())).toBe(!0)}),it("returns false on an unsupported device model",()=>{const e=s(o({modelId:t.DeviceModelId.NANO_X}));expect((0,n.isContactsAppVersionSupportedForSession)(e,r())).toBe(!1)}),it("returns false when the app version is below the minimum",()=>{const e=s(o());expect((0,n.isContactsAppVersionSupportedForSession)(e,r(i.ETHEREUM_APP_NAME,a))).toBe(!1)}),it("returns false when the running app is unknown to Contacts",()=>{const e=s(o());expect((0,n.isContactsAppVersionSupportedForSession)(e,r("Bitcoin"))).toBe(!1)}),it("returns false when the device session has no running app",()=>{const e=s({sessionStateType:t.DeviceSessionStateType.Connected,deviceStatus:t.DeviceStatus.CONNECTED,deviceModelId:t.DeviceModelId.FLEX});expect((0,n.isContactsAppVersionSupportedForSession)(e,r())).toBe(!1)})});describe("isContactsOsSupportedForSession",()=>{it("returns true when the model and OS version meet the minimums",()=>{const e=s(o());expect((0,n.isContactsOsSupportedForSession)(e)).toBe(!0)}),it("returns false on an unsupported device model",()=>{const e=s(o({modelId:t.DeviceModelId.NANO_X}));expect((0,n.isContactsOsSupportedForSession)(e)).toBe(!1)}),it("returns false when the OS version is below the minimum",()=>{const e=s(o({osVersion:a}));expect((0,n.isContactsOsSupportedForSession)(e)).toBe(!1)}),it("returns false when the device session has no firmware version",()=>{const e=s({sessionStateType:t.DeviceSessionStateType.Connected,deviceStatus:t.DeviceStatus.CONNECTED,deviceModelId:t.DeviceModelId.FLEX});expect((0,n.isContactsOsSupportedForSession)(e)).toBe(!1)})});
2
+ //# sourceMappingURL=contactsVersionGuards.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/internal/app-binder/contactsVersionGuards.test.ts"],
4
+ "sourcesContent": ["import {\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n ETHEREUM_APP_NAME,\n resolveContactsVersionRequirements,\n} from \"@api/model/ContactsVersionRequirements\";\n\nimport {\n isContactsAppVersionSupportedForSession,\n isContactsOsSupportedForSession,\n type RunningApp,\n} from \"./contactsVersionGuards\";\n\nconst flexSupport = (() => {\n const requirement = resolveContactsVersionRequirements(DeviceModelId.FLEX);\n if (!requirement.supported) throw new Error(\"Flex must be supported\");\n return requirement;\n})();\n\nconst MIN_OS_VERSION = flexSupport.minOsVersion;\nconst MIN_APP_VERSION = (() => {\n const version = flexSupport.minAppVersion[ETHEREUM_APP_NAME];\n if (version === undefined) throw new Error(\"Ethereum min version required\");\n return version;\n})();\nconst BELOW_ANY_VERSION = \"0.0.1\";\n\ntype ReadyStateOptions = {\n osVersion?: string;\n modelId?: DeviceModelId;\n};\n\nfunction createReadyState({\n osVersion = MIN_OS_VERSION,\n modelId = DeviceModelId.FLEX,\n}: ReadyStateOptions = {}) {\n return {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: ETHEREUM_APP_NAME, version: \"0.0.0\" },\n deviceModelId: modelId,\n firmwareVersion: { mcu: \"1.0.0\", bootloader: \"1.0.0\", os: osVersion },\n isSecureConnectionAllowed: false,\n };\n}\n\nfunction createInternalApi(deviceState: object): InternalApi {\n return {\n getDeviceSessionState: () => deviceState,\n } as unknown as InternalApi;\n}\n\n// The running app identity now comes from the caller (a fresh\n// WaitForAppAndVersion result), not the device session state.\nfunction runningApp(\n name = ETHEREUM_APP_NAME,\n version = MIN_APP_VERSION,\n): RunningApp {\n return { name, version };\n}\n\ndescribe(\"isContactsAppVersionSupportedForSession\", () => {\n it(\"returns true when the model and app version meet the minimums\", () => {\n const api = createInternalApi(createReadyState());\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n true,\n );\n });\n\n it(\"returns true regardless of OS version, since app-owned operations are not gated by it\", () => {\n const api = createInternalApi(\n createReadyState({ osVersion: BELOW_ANY_VERSION }),\n );\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n true,\n );\n });\n\n it(\"returns false on an unsupported device model\", () => {\n const api = createInternalApi(\n createReadyState({ modelId: DeviceModelId.NANO_X }),\n );\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n false,\n );\n });\n\n it(\"returns false when the app version is below the minimum\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(\n api,\n runningApp(ETHEREUM_APP_NAME, BELOW_ANY_VERSION),\n ),\n ).toBe(false);\n });\n\n it(\"returns false when the running app is unknown to Contacts\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(api, runningApp(\"Bitcoin\")),\n ).toBe(false);\n });\n\n it(\"returns false when the device session has no running app\", () => {\n const api = createInternalApi({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.FLEX,\n });\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n false,\n );\n });\n});\n\ndescribe(\"isContactsOsSupportedForSession\", () => {\n it(\"returns true when the model and OS version meet the minimums\", () => {\n const api = createInternalApi(createReadyState());\n expect(isContactsOsSupportedForSession(api)).toBe(true);\n });\n\n it(\"returns false on an unsupported device model\", () => {\n const api = createInternalApi(\n createReadyState({ modelId: DeviceModelId.NANO_X }),\n );\n expect(isContactsOsSupportedForSession(api)).toBe(false);\n });\n\n it(\"returns false when the OS version is below the minimum\", () => {\n const api = createInternalApi(\n createReadyState({ osVersion: BELOW_ANY_VERSION }),\n );\n expect(isContactsOsSupportedForSession(api)).toBe(false);\n });\n\n it(\"returns false when the device session has no firmware version\", () => {\n const api = createInternalApi({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.FLEX,\n });\n expect(isContactsOsSupportedForSession(api)).toBe(false);\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_ContactsVersionRequirements", "import_contactsVersionGuards", "flexSupport", "requirement", "MIN_OS_VERSION", "MIN_APP_VERSION", "version", "BELOW_ANY_VERSION", "createReadyState", "osVersion", "modelId", "createInternalApi", "deviceState", "runningApp", "name", "api"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var u=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var g=(d,n)=>{for(var p in n)u(d,p,{get:n[p],enumerable:!0})},D=(d,n,p,l)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of S(n))!h.call(d,r)&&r!==p&&u(d,r,{get:()=>n[r],enumerable:!(l=m(n,r))||l.enumerable});return d};var x=d=>D(u({},"__esModule",{value:!0}),d);var V={};g(V,{EditExternalAddressIdentifierDeviceAction:()=>y});module.exports=x(V);var a=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),i=require("xstate"),A=require("../../../app-binder/contactsVersionGuards"),E=require("../../../app-binder/model/contactsErrors"),I=require("../../../app-binder/task/SendEditExternalAddressIdentifierTask"),f=require("./validateEditExternalAddressIdentifierInput");class y extends a.XStateDeviceAction{makeStateMachine(n){const{isSupported:p,editIdentifier:l}=this.extractDependencies(n),r=this.input.appName;return(0,i.setup)({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new a.OpenAppDeviceAction({input:{appName:r}}).makeStateMachine(n),waitForAppAndVersionStateMachine:new a.WaitForAppAndVersionDeviceAction({input:{}}).makeStateMachine(n),editIdentifier:(0,i.fromPromise)(({input:e})=>l(e))},guards:{skipOpenApp:({context:e})=>e.input.skipOpenApp===!0,noInternalError:({context:e})=>e._internalState.error===null,contactsSupported:({context:e})=>{const{appAndVersion:t}=e._internalState;return t!==null&&p(t)}},actions:{assignValidationError:(0,i.assign)({_internalState:({context:e})=>{const t=(0,f.validateEditExternalAddressIdentifierInput)(e.input);return t?{...e._internalState,error:t}:e._internalState}}),assignVersionError:(0,i.assign)({_internalState:({context:e})=>({...e._internalState,error:new E.ContactsVersionRequirementError})}),assignErrorFromEvent:(0,i.assign)({_internalState:({context:e,event:t})=>({...e._internalState,error:new a.UnknownDAError(t.error instanceof Error?t.error.message:String(t.error))})})}}).createMachine({id:"EditExternalAddressIdentifierDeviceAction",initial:"InitialState",context:({input:e})=>({input:e,intermediateValue:{requiredUserInteraction:a.UserInteractionRequired.None},_internalState:{error:null,appAndVersion:null,hmacRest:null}}),states:{InitialState:{always:[{target:"ValidateInput",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:r}),onSnapshot:{actions:(0,i.assign)({intermediateValue:({event:e})=>e.snapshot.context.intermediateValue})},onDone:{target:"CheckOpenAppResult",actions:(0,i.assign)({_internalState:({event:e,context:t})=>e.output.caseOf({Right:()=>t._internalState,Left:s=>({...t._internalState,error:s})})})}}},CheckOpenAppResult:{always:[{target:"ValidateInput",guard:"noInternalError"},{target:"Error"}]},ValidateInput:{entry:"assignValidationError",always:[{target:"WaitForAppAndVersion",guard:"noInternalError"},{target:"Error"}]},WaitForAppAndVersion:{entry:(0,i.assign)({intermediateValue:{requiredUserInteraction:a.UserInteractionRequired.None}}),invoke:{id:"waitForAppAndVersion",src:"waitForAppAndVersionStateMachine",input:()=>({}),onSnapshot:{actions:(0,i.assign)({intermediateValue:({event:e})=>e.snapshot.context.intermediateValue})},onDone:{target:"CheckAppAndVersion",actions:(0,i.assign)({_internalState:({event:e,context:t})=>e.output.caseOf({Right:s=>({...t._internalState,appAndVersion:{name:s.name,version:s.version}}),Left:s=>({...t._internalState,error:s})})})}}},CheckAppAndVersion:{always:[{target:"VersionGuard",guard:"noInternalError"},{target:"Error"}]},VersionGuard:{always:[{target:"EditIdentifier",guard:"contactsSupported"},{target:"Error",actions:"assignVersionError"}]},EditIdentifier:{entry:(0,i.assign)({intermediateValue:{requiredUserInteraction:a.UserInteractionRequired.RegisterWallet}}),exit:(0,i.assign)({intermediateValue:{requiredUserInteraction:a.UserInteractionRequired.None}}),invoke:{id:"editIdentifier",src:"editIdentifier",input:({context:e})=>e.input,onDone:{target:"EditIdentifierResultCheck",actions:(0,i.assign)({_internalState:({event:e,context:t})=>(0,a.isSuccessCommandResult)(e.output)?{...t._internalState,hmacRest:e.output.data.hmacRest}:{...t._internalState,error:e.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},EditIdentifierResultCheck:{always:[{target:"Success",guard:"noInternalError"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:e})=>{const{hmacRest:t,error:s}=e._internalState;if(t){const{input:o}=e;return(0,c.Right)({contactName:o.contactName,scope:o.scope,previousIdentifier:o.previousIdentifier,identifier:o.newIdentifier,blockchainFamily:o.blockchainFamily,chainId:o.chainId,groupHandle:o.groupHandle,hmacProof:o.hmacProof,hmacRest:t})}return(0,c.Left)(s??new a.UnknownDAError("No error in final state"))}})}extractDependencies(n){return{isSupported:r=>(0,A.isContactsAppVersionSupportedForSession)(n,r),editIdentifier:r=>new I.SendEditExternalAddressIdentifierTask(n,{contactName:r.contactName,scope:r.scope,previousIdentifier:r.previousIdentifier,newIdentifier:r.newIdentifier,blockchainFamily:r.blockchainFamily,chainId:r.chainId,groupHandle:r.groupHandle,hmacProof:r.hmacProof,hmacRest:r.hmacRest}).run()}}}0&&(module.exports={EditExternalAddressIdentifierDeviceAction});
2
+ //# sourceMappingURL=EditExternalAddressIdentifierDeviceAction.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.ts"],
4
+ "sourcesContent": ["import {\n type DeviceActionStateMachine,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n WaitForAppAndVersionDeviceAction,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type EditExternalAddressIdentifierDAError,\n type EditExternalAddressIdentifierDAInput,\n type EditExternalAddressIdentifierDAIntermediateValue,\n type EditExternalAddressIdentifierDAInternalState,\n type EditExternalAddressIdentifierDAOutput,\n} from \"@api/app-binder/EditExternalAddressIdentifierDeviceActionTypes\";\nimport {\n isContactsAppVersionSupportedForSession,\n type RunningApp,\n} from \"@internal/app-binder/contactsVersionGuards\";\nimport { ContactsVersionRequirementError } from \"@internal/app-binder/model/contactsErrors\";\nimport {\n type EditIdentifierProof,\n SendEditExternalAddressIdentifierTask,\n} from \"@internal/app-binder/task/SendEditExternalAddressIdentifierTask\";\n\nimport { validateEditExternalAddressIdentifierInput } from \"./validateEditExternalAddressIdentifierInput\";\n\nexport type EditExternalAddressIdentifierMachineDependencies = {\n readonly isSupported: (app: RunningApp) => boolean;\n readonly editIdentifier: (\n input: EditExternalAddressIdentifierDAInput,\n ) => Promise<\n Awaited<ReturnType<SendEditExternalAddressIdentifierTask[\"run\"]>>\n >;\n};\n\nexport class EditExternalAddressIdentifierDeviceAction extends XStateDeviceAction<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAInput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue,\n EditExternalAddressIdentifierDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAInput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue,\n EditExternalAddressIdentifierDAInternalState\n > {\n type types = StateMachineTypes<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAInput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue,\n EditExternalAddressIdentifierDAInternalState\n >;\n\n const { isSupported, editIdentifier } =\n this.extractDependencies(internalApi);\n const appName = this.input.appName;\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName },\n }).makeStateMachine(internalApi),\n waitForAppAndVersionStateMachine: new WaitForAppAndVersionDeviceAction({\n input: {},\n }).makeStateMachine(internalApi),\n editIdentifier: fromPromise(\n ({ input }: { input: EditExternalAddressIdentifierDAInput }) =>\n editIdentifier(input),\n ),\n },\n guards: {\n skipOpenApp: ({ context }) => context.input.skipOpenApp === true,\n noInternalError: ({ context }) => context._internalState.error === null,\n contactsSupported: ({ context }) => {\n const { appAndVersion } = context._internalState;\n return appAndVersion !== null && isSupported(appAndVersion);\n },\n },\n actions: {\n assignValidationError: assign({\n _internalState: ({ context }) => {\n const error = validateEditExternalAddressIdentifierInput(\n context.input,\n );\n return error\n ? { ...context._internalState, error }\n : context._internalState;\n },\n }),\n assignVersionError: assign({\n _internalState: ({ context }) => ({\n ...context._internalState,\n error: new ContactsVersionRequirementError(),\n }),\n }),\n assignErrorFromEvent: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n error: new UnknownDAError(\n event[\"error\"] instanceof Error\n ? event[\"error\"].message\n : String(event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n id: \"EditExternalAddressIdentifierDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n appAndVersion: null,\n hmacRest: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"ValidateInput\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf<EditExternalAddressIdentifierDAInternalState>(\n {\n Right: () => context._internalState,\n Left: (error) => ({ ...context._internalState, error }),\n },\n ),\n }),\n },\n },\n },\n CheckOpenAppResult: {\n always: [\n { target: \"ValidateInput\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n // Input validation runs inside the device action (after the app is\n // opened) so invalid caller input surfaces as a typed terminal error\n // state on the observable instead of a synchronous throw. Runs on both\n // the open-app and skip-open-app paths.\n ValidateInput: {\n entry: \"assignValidationError\",\n always: [\n { target: \"WaitForAppAndVersion\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n // Read the running app + version freshly from the device (rather than\n // the possibly-stale session state) so the version guard evaluates the\n // app that is actually running \u2014 e.g. when open-app is skipped and the\n // app was changed outside DMK. Runs on both paths.\n WaitForAppAndVersion: {\n // Start the phase from a clean value, clearing any interaction left\n // over from the OpenApp phase (e.g. ConfirmOpenApp).\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"waitForAppAndVersion\",\n src: \"waitForAppAndVersionStateMachine\",\n input: () => ({}),\n // Propagate the child DA's intermediate value so a consuming client\n // can render, e.g., a \"please unlock your device\" prompt when the\n // device is locked. Mirrors the OpenAppDeviceAction invoke above.\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckAppAndVersion\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf<EditExternalAddressIdentifierDAInternalState>(\n {\n Right: (appAndVersion) => ({\n ...context._internalState,\n appAndVersion: {\n name: appAndVersion.name,\n version: appAndVersion.version,\n },\n }),\n Left: (error) => ({ ...context._internalState, error }),\n },\n ),\n }),\n },\n },\n },\n CheckAppAndVersion: {\n always: [\n { target: \"VersionGuard\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n // Version guard evaluates support from the fresh WaitForAppAndVersion\n // result. Runs on both the open-app and skip-open-app paths.\n VersionGuard: {\n always: [\n { target: \"EditIdentifier\", guard: \"contactsSupported\" },\n { target: \"Error\", actions: \"assignVersionError\" },\n ],\n },\n EditIdentifier: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"editIdentifier\",\n src: \"editIdentifier\",\n input: ({ context }) => context.input,\n onDone: {\n target: \"EditIdentifierResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n hmacRest: event.output.data.hmacRest,\n }\n : {\n ...context._internalState,\n error: event.output.error,\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n EditIdentifierResultCheck: {\n always: [\n { target: \"Success\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) => {\n const { hmacRest, error } = context._internalState;\n if (hmacRest) {\n const { input } = context;\n return Right({\n contactName: input.contactName,\n scope: input.scope,\n previousIdentifier: input.previousIdentifier,\n identifier: input.newIdentifier,\n blockchainFamily: input.blockchainFamily,\n chainId: input.chainId,\n groupHandle: input.groupHandle,\n // Preserved: the group-level name proof is untouched by an identifier\n // edit \u2014 only `hmacRest` (the address-level proof) rotates.\n hmacProof: input.hmacProof,\n hmacRest,\n });\n }\n return Left(error ?? new UnknownDAError(\"No error in final state\"));\n },\n });\n }\n\n extractDependencies(\n internalApi: InternalApi,\n ): EditExternalAddressIdentifierMachineDependencies {\n const isSupported = (app: RunningApp) =>\n isContactsAppVersionSupportedForSession(internalApi, app);\n\n const editIdentifier = (\n input: EditExternalAddressIdentifierDAInput,\n ): Promise<\n Awaited<ReturnType<SendEditExternalAddressIdentifierTask[\"run\"]>>\n > =>\n new SendEditExternalAddressIdentifierTask(internalApi, {\n contactName: input.contactName,\n scope: input.scope,\n previousIdentifier: input.previousIdentifier,\n newIdentifier: input.newIdentifier,\n blockchainFamily: input.blockchainFamily,\n chainId: input.chainId,\n groupHandle: input.groupHandle,\n hmacProof: input.hmacProof,\n hmacRest: input.hmacRest,\n }).run();\n\n return { isSupported, editIdentifier };\n }\n}\n\nexport type { EditIdentifierProof };\n"],
5
+ "mappings": "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",
6
+ "names": ["EditExternalAddressIdentifierDeviceAction_exports", "__export", "EditExternalAddressIdentifierDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_contactsVersionGuards", "import_contactsErrors", "import_SendEditExternalAddressIdentifierTask", "import_validateEditExternalAddressIdentifierInput", "internalApi", "isSupported", "editIdentifier", "appName", "input", "context", "appAndVersion", "error", "event", "hmacRest", "app"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),n=require("vitest"),h=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),s=require("../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock"),I=require("../../../app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock"),c=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),f=require("../../../app-binder/model/contactsErrors"),P=require("./EditExternalAddressIdentifierDeviceAction"),D=require("./validateEditExternalAddressIdentifierInput");n.vi.mock("@ledgerhq/device-management-kit",async o=>({...await o(),OpenAppDeviceAction:n.vi.fn(()=>({makeStateMachine:n.vi.fn()})),WaitForAppAndVersionDeviceAction:n.vi.fn(()=>({makeStateMachine:n.vi.fn()}))}));const V={name:"Ethereum",version:"1.15.0"},g=new Uint8Array(64).fill(204),v=new Uint8Array(32).fill(221),U=new Uint8Array(32).fill(170),x=new Uint8Array(32).fill(136),k=new Uint8Array(20).fill(17),O=new Uint8Array(20).fill(34),y={hmacRest:x},u={contactName:"Alice",scope:"Eth main",previousIdentifier:k,newIdentifier:O,blockchainFamily:"ethereum",chainId:1n,groupHandle:g,hmacProof:v,hmacRest:U,appName:"Ethereum"},A={contactName:"Alice",scope:"Eth main",previousIdentifier:k,identifier:O,blockchainFamily:"ethereum",chainId:1n,groupHandle:g,hmacProof:v,hmacRest:x};(0,n.describe)("EditExternalAddressIdentifierDeviceAction",()=>{let o,l,E;function R(){return{isSupported:l,editIdentifier:E}}(0,n.beforeEach)(()=>{o=(0,h.makeDeviceActionInternalApiMock)(),(0,I.setupWaitForAppAndVersionDAMock)(V),l=n.vi.fn().mockReturnValue(!0),E=n.vi.fn().mockResolvedValue((0,e.CommandResultFactory)({data:y})),o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!0})});function p(i){const r=new P.EditExternalAddressIdentifierDeviceAction({input:i});return n.vi.spyOn(r,"extractDependencies").mockReturnValue(R()),r}(0,n.it)("open-app path: OpenApp -> VersionGuard -> EditIdentifier -> Completed",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t=p({...u,skipOpenApp:!1}),a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,a,o,{onDone:i,onError:r})})),(0,n.it)("skip-open-app path: VersionGuard -> EditIdentifier -> Completed, preserving the group proof",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t=p({...u,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,a,o,{onDone:()=>{try{expect(A.hmacProof).toBe(v),expect(A.hmacRest).toBe(x),expect(A.hmacRest).not.toBe(U),i()}catch(d){r(d)}},onError:r})})),(0,n.it)("version guard rejects on skip-open-app path without running EDIT IDENTIFIER",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)(),l.mockReturnValue(!1);const t=p({...u,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:new f.ContactsVersionRequirementError,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(t,a,o,{onDone:i,onError:r}),expect(E).not.toHaveBeenCalled()})),(0,n.it)("surfaces an open-app failure as the device action error",()=>new Promise((i,r)=>{const t=new e.UnknownDAError("open app failed");(0,s.setupOpenAppDAMock)(t);const a=p({...u,skipOpenApp:!1}),d=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(a,d,o,{onDone:i,onError:r}),expect(l).not.toHaveBeenCalled()})),(0,n.it)("surfaces an Edit Identifier command error",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t=new f.ContactsCommandError({errorCode:"6982",message:"seed mismatch"});E.mockResolvedValue((0,e.CommandResultFactory)({error:t}));const a=p({...u,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(a,d,o,{onDone:i,onError:r})})),(0,n.it)("surfaces invalid input as a typed error state on the skip-open-app path",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t={...u,skipOpenApp:!0,contactName:""},a=(0,D.validateEditExternalAddressIdentifierInput)(t),d=p(t),m=[{error:a,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(d,m,o,{onDone:i,onError:r}),expect(l).not.toHaveBeenCalled(),expect(E).not.toHaveBeenCalled()})),(0,n.it)("validates only after opening the app on the default path",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t={...u,skipOpenApp:!1,contactName:""},a=(0,D.validateEditExternalAddressIdentifierInput)(t),d=p(t),m=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{error:a,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(d,m,o,{onDone:i,onError:r}),expect(E).not.toHaveBeenCalled()})),(0,n.it)("evaluates support from the fresh WaitForAppAndVersion result, not stale session state",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t={name:"Ethereum",version:"9.9.9"};(0,I.setupWaitForAppAndVersionDAMock)(t);const a=p({...u,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(a,d,o,{onDone:()=>{try{expect(l).toHaveBeenCalledWith(t),i()}catch(m){r(m)}},onError:r})})),(0,n.it)("surfaces a WaitForAppAndVersion failure as the device action error",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t=new e.UnknownDAError("could not read app and version");(0,I.setupWaitForAppAndVersionDAMock)({error:t});const a=p({...u,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(a,d,o,{onDone:i,onError:r}),expect(l).not.toHaveBeenCalled(),expect(E).not.toHaveBeenCalled()})),(0,n.it)("propagates the UnlockDevice interaction emitted by WaitForAppAndVersion",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)(),(0,I.setupWaitForAppAndVersionDAMock)(V,e.UserInteractionRequired.UnlockDevice);const t=p({...u,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,a,o,{onDone:i,onError:r})}))});
2
+ //# sourceMappingURL=EditExternalAddressIdentifierDeviceAction.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.ts"],
4
+ "sourcesContent": ["import {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type EditExternalAddressIdentifierDAError,\n type EditExternalAddressIdentifierDAInput,\n type EditExternalAddressIdentifierDAIntermediateValue,\n type EditExternalAddressIdentifierDAOutput,\n} from \"@api/app-binder/EditExternalAddressIdentifierDeviceActionTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { setupWaitForAppAndVersionDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport {\n ContactsCommandError,\n ContactsVersionRequirementError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { EditExternalAddressIdentifierDeviceAction } from \"./EditExternalAddressIdentifierDeviceAction\";\nimport { validateEditExternalAddressIdentifierInput } from \"./validateEditExternalAddressIdentifierInput\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n WaitForAppAndVersionDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\nconst FRESH_APP = { name: \"Ethereum\", version: \"1.15.0\" };\n\nconst GROUP_HANDLE = new Uint8Array(64).fill(0xcc);\nconst HMAC_PROOF = new Uint8Array(32).fill(0xdd);\nconst HMAC_REST_OLD = new Uint8Array(32).fill(0xaa);\nconst HMAC_REST_NEW = new Uint8Array(32).fill(0x88);\nconst PREVIOUS_IDENTIFIER = new Uint8Array(20).fill(0x11);\nconst NEW_IDENTIFIER = new Uint8Array(20).fill(0x22);\n\nconst OK_PROOF = { hmacRest: HMAC_REST_NEW };\n\nconst BASE_INPUT = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n previousIdentifier: PREVIOUS_IDENTIFIER,\n newIdentifier: NEW_IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF,\n hmacRest: HMAC_REST_OLD,\n appName: \"Ethereum\",\n};\n\nconst EXPECTED_OUTPUT = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n previousIdentifier: PREVIOUS_IDENTIFIER,\n identifier: NEW_IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n // Preserved: the group-level name proof is unchanged by an identifier edit.\n hmacProof: HMAC_PROOF,\n // Rotated: only the address-level proof changes.\n hmacRest: HMAC_REST_NEW,\n};\n\ndescribe(\"EditExternalAddressIdentifierDeviceAction\", () => {\n let apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\n let isSupportedMock: ReturnType<typeof vi.fn>;\n let editIdentifierMock: ReturnType<typeof vi.fn>;\n\n function extractDeps() {\n return {\n isSupported: isSupportedMock,\n editIdentifier: editIdentifierMock,\n };\n }\n\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n setupWaitForAppAndVersionDAMock(FRESH_APP);\n isSupportedMock = vi.fn().mockReturnValue(true);\n editIdentifierMock = vi\n .fn()\n .mockResolvedValue(CommandResultFactory({ data: OK_PROOF }));\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n });\n\n function makeAction(input: EditExternalAddressIdentifierDAInput) {\n const action = new EditExternalAddressIdentifierDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n return action;\n }\n\n it(\"open-app path: OpenApp -> VersionGuard -> EditIdentifier -> Completed\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"skip-open-app path: VersionGuard -> EditIdentifier -> Completed, preserving the group proof\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n // The device rotates only the address-level hmac_rest; the contact\n // group's name proof passes through unchanged.\n expect(EXPECTED_OUTPUT.hmacProof).toBe(HMAC_PROOF);\n expect(EXPECTED_OUTPUT.hmacRest).toBe(HMAC_REST_NEW);\n expect(EXPECTED_OUTPUT.hmacRest).not.toBe(HMAC_REST_OLD);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"version guard rejects on skip-open-app path without running EDIT IDENTIFIER\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n isSupportedMock.mockReturnValue(false);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new ContactsVersionRequirementError(),\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an open-app failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n const openAppError = new UnknownDAError(\"open app failed\");\n setupOpenAppDAMock(openAppError);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: openAppError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an Edit Identifier command error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const commandError = new ContactsCommandError({\n errorCode: \"6982\",\n message: \"seed mismatch\",\n });\n editIdentifierMock.mockResolvedValue(\n CommandResultFactory({ error: commandError }),\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: commandError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"surfaces invalid input as a typed error state on the skip-open-app path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: true,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressIdentifierInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"validates only after opening the app on the default path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: false,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressIdentifierInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"evaluates support from the fresh WaitForAppAndVersion result, not stale session state\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const freshApp = { name: \"Ethereum\", version: \"9.9.9\" };\n setupWaitForAppAndVersionDAMock(freshApp);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n expect(isSupportedMock).toHaveBeenCalledWith(freshApp);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a WaitForAppAndVersion failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const waitError = new UnknownDAError(\"could not read app and version\");\n setupWaitForAppAndVersionDAMock({ error: waitError });\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: waitError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"propagates the UnlockDevice interaction emitted by WaitForAppAndVersion\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupWaitForAppAndVersionDAMock(\n FRESH_APP,\n UserInteractionRequired.UnlockDevice,\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_vitest", "import_makeInternalApi", "import_setupOpenAppDAMock", "import_setupWaitForAppAndVersionDAMock", "import_testDeviceActionStates", "import_contactsErrors", "import_EditExternalAddressIdentifierDeviceAction", "import_validateEditExternalAddressIdentifierInput", "importOriginal", "FRESH_APP", "GROUP_HANDLE", "HMAC_PROOF", "HMAC_REST_OLD", "HMAC_REST_NEW", "PREVIOUS_IDENTIFIER", "NEW_IDENTIFIER", "OK_PROOF", "BASE_INPUT", "EXPECTED_OUTPUT", "apiMock", "isSupportedMock", "editIdentifierMock", "extractDeps", "makeAction", "input", "action", "resolve", "reject", "expected", "e", "openAppError", "commandError", "invalidInput", "validationError", "freshApp", "waitError"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var d=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var s=(t,i)=>{for(var n in i)d(t,n,{get:i[n],enumerable:!0})},h=(t,i,n,o)=>{if(i&&typeof i=="object"||typeof i=="function")for(let r of l(i))!c.call(t,r)&&r!==n&&d(t,r,{get:()=>i[r],enumerable:!(o=f(i,r))||o.enumerable});return t};var E=t=>h(d({},"__esModule",{value:!0}),t);var _={};s(_,{validateEditExternalAddressIdentifierInput:()=>I});module.exports=E(_);var a=require("../../../app-binder/model/contactsConstants"),e=require("../../../app-binder/model/contactsValidation");const m=e.HMAC_PROOF_LENGTH;function I(t){try{(0,e.validatePrintableLabel)(t.contactName,{field:"contactName",bufferLength:e.CONTACT_NAME_BUFFER_LENGTH}),(0,e.validatePrintableLabel)(t.scope,{field:"scope",bufferLength:e.SCOPE_BUFFER_LENGTH});const i=t.blockchainFamily.toLowerCase();if(!(i in a.BLOCKCHAIN_FAMILY_BY_NAME))throw new e.ContactsValidationError(`Unsupported blockchain family: ${t.blockchainFamily}`);if(i==="ethereum"){if((0,e.validateByteLength)(t.previousIdentifier,{field:"previousIdentifier",expectedBytes:e.ETH_ADDRESS_BYTES}),(0,e.validateByteLength)(t.newIdentifier,{field:"newIdentifier",expectedBytes:e.ETH_ADDRESS_BYTES}),t.chainId===void 0)throw new e.ContactsValidationError("chainId is required for the Ethereum blockchain family.")}else{if(t.previousIdentifier.length===0)throw new e.ContactsValidationError("previousIdentifier must not be empty.");if(t.newIdentifier.length===0)throw new e.ContactsValidationError("newIdentifier must not be empty.")}return t.chainId!==void 0&&(0,e.validateChainId)(t.chainId),(0,e.validateByteLength)(t.groupHandle,{field:"groupHandle",expectedBytes:e.GROUP_HANDLE_SIZE}),(0,e.validateByteLength)(t.hmacProof,{field:"hmacProof",expectedBytes:e.HMAC_PROOF_LENGTH}),(0,e.validateByteLength)(t.hmacRest,{field:"hmacRest",expectedBytes:m}),null}catch(i){if(i instanceof e.ContactsValidationError)return i;throw i}}0&&(module.exports={validateEditExternalAddressIdentifierInput});
2
+ //# sourceMappingURL=validateEditExternalAddressIdentifierInput.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.ts"],
4
+ "sourcesContent": ["import { type EditExternalAddressIdentifierInput } from \"@api/model/EditExternalAddressIdentifier\";\nimport { BLOCKCHAIN_FAMILY_BY_NAME } from \"@internal/app-binder/model/contactsConstants\";\nimport {\n CONTACT_NAME_BUFFER_LENGTH,\n ContactsValidationError,\n ETH_ADDRESS_BYTES,\n GROUP_HANDLE_SIZE,\n HMAC_PROOF_LENGTH,\n SCOPE_BUFFER_LENGTH,\n validateByteLength,\n validateChainId,\n validatePrintableLabel,\n} from \"@internal/app-binder/model/contactsValidation\";\n\n// The address-level proof (`hmac_rest`) shares the 32-byte HMAC width.\nconst HMAC_REST_LENGTH = HMAC_PROOF_LENGTH;\n\n/**\n * Validate the caller input for Edit External Address Identifier. Returns the\n * first `ContactsValidationError`, or `null` when valid. Non-throwing so the\n * device action can surface it as a typed terminal error state.\n */\nexport function validateEditExternalAddressIdentifierInput(\n input: EditExternalAddressIdentifierInput,\n): ContactsValidationError | null {\n try {\n validatePrintableLabel(input.contactName, {\n field: \"contactName\",\n bufferLength: CONTACT_NAME_BUFFER_LENGTH,\n });\n validatePrintableLabel(input.scope, {\n field: \"scope\",\n bufferLength: SCOPE_BUFFER_LENGTH,\n });\n\n const family = input.blockchainFamily.toLowerCase();\n if (!(family in BLOCKCHAIN_FAMILY_BY_NAME)) {\n throw new ContactsValidationError(\n `Unsupported blockchain family: ${input.blockchainFamily}`,\n );\n }\n if (family === \"ethereum\") {\n validateByteLength(input.previousIdentifier, {\n field: \"previousIdentifier\",\n expectedBytes: ETH_ADDRESS_BYTES,\n });\n validateByteLength(input.newIdentifier, {\n field: \"newIdentifier\",\n expectedBytes: ETH_ADDRESS_BYTES,\n });\n // CHAIN_ID is mandatory for the Ethereum family (multiple networks share\n // the same address format).\n if (input.chainId === undefined) {\n throw new ContactsValidationError(\n \"chainId is required for the Ethereum blockchain family.\",\n );\n }\n } else {\n if (input.previousIdentifier.length === 0) {\n throw new ContactsValidationError(\n \"previousIdentifier must not be empty.\",\n );\n }\n if (input.newIdentifier.length === 0) {\n throw new ContactsValidationError(\"newIdentifier must not be empty.\");\n }\n }\n\n if (input.chainId !== undefined) {\n validateChainId(input.chainId);\n }\n\n validateByteLength(input.groupHandle, {\n field: \"groupHandle\",\n expectedBytes: GROUP_HANDLE_SIZE,\n });\n validateByteLength(input.hmacProof, {\n field: \"hmacProof\",\n expectedBytes: HMAC_PROOF_LENGTH,\n });\n validateByteLength(input.hmacRest, {\n field: \"hmacRest\",\n expectedBytes: HMAC_REST_LENGTH,\n });\n\n return null;\n } catch (error) {\n if (error instanceof ContactsValidationError) {\n return error;\n }\n throw error;\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gDAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAA0C,wDAC1CC,EAUO,yDAGP,MAAMC,EAAmB,oBAOlB,SAASJ,EACdK,EACgC,CAChC,GAAI,IACF,0BAAuBA,EAAM,YAAa,CACxC,MAAO,cACP,aAAc,4BAChB,CAAC,KACD,0BAAuBA,EAAM,MAAO,CAClC,MAAO,QACP,aAAc,qBAChB,CAAC,EAED,MAAMC,EAASD,EAAM,iBAAiB,YAAY,EAClD,GAAI,EAAEC,KAAU,6BACd,MAAM,IAAI,0BACR,kCAAkCD,EAAM,gBAAgB,EAC1D,EAEF,GAAIC,IAAW,YAWb,MAVA,sBAAmBD,EAAM,mBAAoB,CAC3C,MAAO,qBACP,cAAe,mBACjB,CAAC,KACD,sBAAmBA,EAAM,cAAe,CACtC,MAAO,gBACP,cAAe,mBACjB,CAAC,EAGGA,EAAM,UAAY,OACpB,MAAM,IAAI,0BACR,yDACF,MAEG,CACL,GAAIA,EAAM,mBAAmB,SAAW,EACtC,MAAM,IAAI,0BACR,uCACF,EAEF,GAAIA,EAAM,cAAc,SAAW,EACjC,MAAM,IAAI,0BAAwB,kCAAkC,CAExE,CAEA,OAAIA,EAAM,UAAY,WACpB,mBAAgBA,EAAM,OAAO,KAG/B,sBAAmBA,EAAM,YAAa,CACpC,MAAO,cACP,cAAe,mBACjB,CAAC,KACD,sBAAmBA,EAAM,UAAW,CAClC,MAAO,YACP,cAAe,mBACjB,CAAC,KACD,sBAAmBA,EAAM,SAAU,CACjC,MAAO,WACP,cAAeD,CACjB,CAAC,EAEM,IACT,OAASG,EAAO,CACd,GAAIA,aAAiB,0BACnB,OAAOA,EAET,MAAMA,CACR,CACF",
6
+ "names": ["validateEditExternalAddressIdentifierInput_exports", "__export", "validateEditExternalAddressIdentifierInput", "__toCommonJS", "import_contactsConstants", "import_contactsValidation", "HMAC_REST_LENGTH", "input", "family", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var n=require("../../../app-binder/model/contactsValidation"),t=require("./validateEditExternalAddressIdentifierInput");const r={contactName:"Alice",scope:"Eth main",previousIdentifier:new Uint8Array(20).fill(17),newIdentifier:new Uint8Array(20).fill(34),blockchainFamily:"ethereum",chainId:1n,groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)};describe("validateEditExternalAddressIdentifierInput",()=>{it("returns null for a valid input",()=>{expect((0,t.validateEditExternalAddressIdentifierInput)(r)).toBeNull()}),it("rejects an empty contactName",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,contactName:""});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects a non-printable scope",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,scope:"caf\xE9"});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects an unsupported blockchain family",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,blockchainFamily:"dogecoin"});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects a previousIdentifier of the wrong length for Ethereum",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,previousIdentifier:new Uint8Array(19).fill(17)});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects a newIdentifier of the wrong length for Ethereum",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,newIdentifier:new Uint8Array(21).fill(34)});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("requires chainId for the Ethereum family",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,chainId:void 0});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects a groupHandle of the wrong length",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,groupHandle:new Uint8Array(63).fill(204)});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects an hmacProof of the wrong length",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,hmacProof:new Uint8Array(31).fill(221)});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects an hmacRest of the wrong length",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,hmacRest:new Uint8Array(33).fill(170)});expect(e).toBeInstanceOf(n.ContactsValidationError)})});
2
+ //# sourceMappingURL=validateEditExternalAddressIdentifierInput.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.ts"],
4
+ "sourcesContent": ["import { type EditExternalAddressIdentifierInput } from \"@api/model/EditExternalAddressIdentifier\";\nimport { ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\nimport { validateEditExternalAddressIdentifierInput } from \"./validateEditExternalAddressIdentifierInput\";\n\nconst VALID_INPUT: EditExternalAddressIdentifierInput = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n previousIdentifier: new Uint8Array(20).fill(0x11),\n newIdentifier: new Uint8Array(20).fill(0x22),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\ndescribe(\"validateEditExternalAddressIdentifierInput\", () => {\n it(\"returns null for a valid input\", () => {\n expect(validateEditExternalAddressIdentifierInput(VALID_INPUT)).toBeNull();\n });\n\n it(\"rejects an empty contactName\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n contactName: \"\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a non-printable scope\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n scope: \"caf\u00E9\", // 0xC3 0xA9 is non-ASCII\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an unsupported blockchain family\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n blockchainFamily: \"dogecoin\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a previousIdentifier of the wrong length for Ethereum\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n previousIdentifier: new Uint8Array(19).fill(0x11),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a newIdentifier of the wrong length for Ethereum\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n newIdentifier: new Uint8Array(21).fill(0x22),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"requires chainId for the Ethereum family\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n chainId: undefined,\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a groupHandle of the wrong length\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n groupHandle: new Uint8Array(63).fill(0xcc),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacProof of the wrong length\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n hmacProof: new Uint8Array(31).fill(0xdd),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacRest of the wrong length\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n hmacRest: new Uint8Array(33).fill(0xaa),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n});\n"],
5
+ "mappings": "aACA,IAAAA,EAAwC,yDAExCC,EAA2D,wDAE3D,MAAMC,EAAkD,CACtD,YAAa,QACb,MAAO,WACP,mBAAoB,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EAChD,cAAe,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EAC3C,iBAAkB,WAClB,QAAS,GACT,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACzC,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACvC,SAAU,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACxC,EAEA,SAAS,6CAA8C,IAAM,CAC3D,GAAG,iCAAkC,IAAM,CACzC,UAAO,8CAA2CA,CAAW,CAAC,EAAE,SAAS,CAC3E,CAAC,EAED,GAAG,+BAAgC,IAAM,CACvC,MAAMC,KAAQ,8CAA2C,CACvD,GAAGD,EACH,YAAa,EACf,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,gCAAiC,IAAM,CACxC,MAAMA,KAAQ,8CAA2C,CACvD,GAAGD,EACH,MAAO,SACT,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMA,KAAQ,8CAA2C,CACvD,GAAGD,EACH,iBAAkB,UACpB,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,gEAAiE,IAAM,CACxE,MAAMA,KAAQ,8CAA2C,CACvD,GAAGD,EACH,mBAAoB,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,CAClD,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,2DAA4D,IAAM,CACnE,MAAMA,KAAQ,8CAA2C,CACvD,GAAGD,EACH,cAAe,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,CAC7C,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMA,KAAQ,8CAA2C,CACvD,GAAGD,EACH,QAAS,MACX,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,4CAA6C,IAAM,CACpD,MAAMA,KAAQ,8CAA2C,CACvD,GAAGD,EACH,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CAC3C,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMA,KAAQ,8CAA2C,CACvD,GAAGD,EACH,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACzC,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,0CAA2C,IAAM,CAClD,MAAMA,KAAQ,8CAA2C,CACvD,GAAGD,EACH,SAAU,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACxC,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,CACH,CAAC",
6
+ "names": ["import_contactsValidation", "import_validateEditExternalAddressIdentifierInput", "VALID_INPUT", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var u=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var I=(o,n)=>{for(var d in n)u(o,d,{get:n[d],enumerable:!0})},x=(o,n,d,c)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of g(n))!D.call(o,r)&&r!==d&&u(o,r,{get:()=>n[r],enumerable:!(c=h(n,r))||c.enumerable});return o};var y=o=>x(u({},"__esModule",{value:!0}),o);var f={};I(f,{EditExternalAddressScopeDeviceAction:()=>V});module.exports=y(f);var i=require("@ledgerhq/device-management-kit"),l=require("purify-ts"),a=require("xstate"),S=require("../../../app-binder/contactsVersionGuards"),A=require("../../../app-binder/model/contactsErrors"),E=require("../../../app-binder/task/SendEditExternalAddressScopeTask"),m=require("./validateEditExternalAddressScopeInput");class V extends i.XStateDeviceAction{makeStateMachine(n){const{isSupported:d,editScope:c}=this.extractDependencies(n),r=this.input.appName;return(0,a.setup)({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new i.OpenAppDeviceAction({input:{appName:r}}).makeStateMachine(n),waitForAppAndVersionStateMachine:new i.WaitForAppAndVersionDeviceAction({input:{}}).makeStateMachine(n),editScope:(0,a.fromPromise)(({input:e})=>c(e))},guards:{skipOpenApp:({context:e})=>e.input.skipOpenApp===!0,noInternalError:({context:e})=>e._internalState.error===null,contactsSupported:({context:e})=>{const{appAndVersion:t}=e._internalState;return t!==null&&d(t)}},actions:{assignValidationError:(0,a.assign)({_internalState:({context:e})=>{const t=(0,m.validateEditExternalAddressScopeInput)(e.input);return t?{...e._internalState,error:t}:e._internalState}}),assignVersionError:(0,a.assign)({_internalState:({context:e})=>({...e._internalState,error:new A.ContactsVersionRequirementError})}),assignErrorFromEvent:(0,a.assign)({_internalState:({context:e,event:t})=>({...e._internalState,error:new i.UnknownDAError(t.error instanceof Error?t.error.message:String(t.error))})})}}).createMachine({id:"EditExternalAddressScopeDeviceAction",initial:"InitialState",context:({input:e})=>({input:e,intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.None},_internalState:{error:null,appAndVersion:null,hmacRest:null}}),states:{InitialState:{always:[{target:"ValidateInput",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:r}),onSnapshot:{actions:(0,a.assign)({intermediateValue:({event:e})=>e.snapshot.context.intermediateValue})},onDone:{target:"CheckOpenAppResult",actions:(0,a.assign)({_internalState:({event:e,context:t})=>e.output.caseOf({Right:()=>t._internalState,Left:p=>({...t._internalState,error:p})})})}}},CheckOpenAppResult:{always:[{target:"ValidateInput",guard:"noInternalError"},{target:"Error"}]},ValidateInput:{entry:"assignValidationError",always:[{target:"WaitForAppAndVersion",guard:"noInternalError"},{target:"Error"}]},WaitForAppAndVersion:{entry:(0,a.assign)({intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.None}}),invoke:{id:"waitForAppAndVersion",src:"waitForAppAndVersionStateMachine",input:()=>({}),onSnapshot:{actions:(0,a.assign)({intermediateValue:({event:e})=>e.snapshot.context.intermediateValue})},onDone:{target:"CheckAppAndVersion",actions:(0,a.assign)({_internalState:({event:e,context:t})=>e.output.caseOf({Right:p=>({...t._internalState,appAndVersion:{name:p.name,version:p.version}}),Left:p=>({...t._internalState,error:p})})})}}},CheckAppAndVersion:{always:[{target:"VersionGuard",guard:"noInternalError"},{target:"Error"}]},VersionGuard:{always:[{target:"EditScope",guard:"contactsSupported"},{target:"Error",actions:"assignVersionError"}]},EditScope:{entry:(0,a.assign)({intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.RegisterWallet}}),exit:(0,a.assign)({intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.None}}),invoke:{id:"editScope",src:"editScope",input:({context:e})=>e.input,onDone:{target:"EditScopeResultCheck",actions:(0,a.assign)({_internalState:({event:e,context:t})=>(0,i.isSuccessCommandResult)(e.output)?{...t._internalState,hmacRest:e.output.data.hmacRest}:{...t._internalState,error:e.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},EditScopeResultCheck:{always:[{target:"Success",guard:"noInternalError"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:e})=>{const{hmacRest:t,error:p}=e._internalState;if(t){const{input:s}=e;return(0,l.Right)({contactName:s.contactName,previousScope:s.previousScope,scope:s.newScope,identifier:s.identifier,blockchainFamily:s.blockchainFamily,chainId:s.chainId,groupHandle:s.groupHandle,hmacProof:s.hmacProof,hmacRest:t})}return(0,l.Left)(p??new i.UnknownDAError("No error in final state"))}})}extractDependencies(n){return{isSupported:r=>(0,S.isContactsAppVersionSupportedForSession)(n,r),editScope:r=>new E.SendEditExternalAddressScopeTask(n,{contactName:r.contactName,previousScope:r.previousScope,newScope:r.newScope,identifier:r.identifier,blockchainFamily:r.blockchainFamily,chainId:r.chainId,groupHandle:r.groupHandle,hmacProof:r.hmacProof,hmacRest:r.hmacRest}).run()}}}0&&(module.exports={EditExternalAddressScopeDeviceAction});
2
+ //# sourceMappingURL=EditExternalAddressScopeDeviceAction.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.ts"],
4
+ "sourcesContent": ["import {\n type DeviceActionStateMachine,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n WaitForAppAndVersionDeviceAction,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type EditExternalAddressScopeDAError,\n type EditExternalAddressScopeDAInput,\n type EditExternalAddressScopeDAIntermediateValue,\n type EditExternalAddressScopeDAInternalState,\n type EditExternalAddressScopeDAOutput,\n} from \"@api/app-binder/EditExternalAddressScopeDeviceActionTypes\";\nimport {\n isContactsAppVersionSupportedForSession,\n type RunningApp,\n} from \"@internal/app-binder/contactsVersionGuards\";\nimport { ContactsVersionRequirementError } from \"@internal/app-binder/model/contactsErrors\";\nimport {\n type EditScopeProof,\n SendEditExternalAddressScopeTask,\n} from \"@internal/app-binder/task/SendEditExternalAddressScopeTask\";\n\nimport { validateEditExternalAddressScopeInput } from \"./validateEditExternalAddressScopeInput\";\n\nexport type EditExternalAddressScopeMachineDependencies = {\n readonly isSupported: (app: RunningApp) => boolean;\n readonly editScope: (\n input: EditExternalAddressScopeDAInput,\n ) => Promise<Awaited<ReturnType<SendEditExternalAddressScopeTask[\"run\"]>>>;\n};\n\nexport class EditExternalAddressScopeDeviceAction extends XStateDeviceAction<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAInput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue,\n EditExternalAddressScopeDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAInput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue,\n EditExternalAddressScopeDAInternalState\n > {\n type types = StateMachineTypes<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAInput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue,\n EditExternalAddressScopeDAInternalState\n >;\n\n const { isSupported, editScope } = this.extractDependencies(internalApi);\n const appName = this.input.appName;\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName },\n }).makeStateMachine(internalApi),\n waitForAppAndVersionStateMachine: new WaitForAppAndVersionDeviceAction({\n input: {},\n }).makeStateMachine(internalApi),\n editScope: fromPromise(\n ({ input }: { input: EditExternalAddressScopeDAInput }) =>\n editScope(input),\n ),\n },\n guards: {\n skipOpenApp: ({ context }) => context.input.skipOpenApp === true,\n noInternalError: ({ context }) => context._internalState.error === null,\n contactsSupported: ({ context }) => {\n const { appAndVersion } = context._internalState;\n return appAndVersion !== null && isSupported(appAndVersion);\n },\n },\n actions: {\n assignValidationError: assign({\n _internalState: ({ context }) => {\n const error = validateEditExternalAddressScopeInput(context.input);\n return error\n ? { ...context._internalState, error }\n : context._internalState;\n },\n }),\n assignVersionError: assign({\n _internalState: ({ context }) => ({\n ...context._internalState,\n error: new ContactsVersionRequirementError(),\n }),\n }),\n assignErrorFromEvent: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n error: new UnknownDAError(\n event[\"error\"] instanceof Error\n ? event[\"error\"].message\n : String(event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n id: \"EditExternalAddressScopeDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n appAndVersion: null,\n hmacRest: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"ValidateInput\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf<EditExternalAddressScopeDAInternalState>({\n Right: () => context._internalState,\n Left: (error) => ({ ...context._internalState, error }),\n }),\n }),\n },\n },\n },\n CheckOpenAppResult: {\n always: [\n { target: \"ValidateInput\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n // Input validation runs inside the device action (after the app is\n // opened) so invalid caller input surfaces as a typed terminal error\n // state on the observable instead of a synchronous throw. Runs on both\n // the open-app and skip-open-app paths.\n ValidateInput: {\n entry: \"assignValidationError\",\n always: [\n { target: \"WaitForAppAndVersion\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n // Read the running app + version freshly from the device (rather than\n // the possibly-stale session state) so the version guard evaluates the\n // app that is actually running \u2014 e.g. when open-app is skipped and the\n // app was changed outside DMK. Runs on both paths.\n WaitForAppAndVersion: {\n // Start the phase from a clean value, clearing any interaction left\n // over from the OpenApp phase (e.g. ConfirmOpenApp).\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"waitForAppAndVersion\",\n src: \"waitForAppAndVersionStateMachine\",\n input: () => ({}),\n // Propagate the child DA's intermediate value so a consuming client\n // can render, e.g., a \"please unlock your device\" prompt when the\n // device is locked. Mirrors the OpenAppDeviceAction invoke above.\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckAppAndVersion\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf<EditExternalAddressScopeDAInternalState>({\n Right: (appAndVersion) => ({\n ...context._internalState,\n appAndVersion: {\n name: appAndVersion.name,\n version: appAndVersion.version,\n },\n }),\n Left: (error) => ({ ...context._internalState, error }),\n }),\n }),\n },\n },\n },\n CheckAppAndVersion: {\n always: [\n { target: \"VersionGuard\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n // Version guard evaluates support from the fresh WaitForAppAndVersion\n // result. Runs on both the open-app and skip-open-app paths.\n VersionGuard: {\n always: [\n { target: \"EditScope\", guard: \"contactsSupported\" },\n { target: \"Error\", actions: \"assignVersionError\" },\n ],\n },\n EditScope: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"editScope\",\n src: \"editScope\",\n input: ({ context }) => context.input,\n onDone: {\n target: \"EditScopeResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n hmacRest: event.output.data.hmacRest,\n }\n : {\n ...context._internalState,\n error: event.output.error,\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n EditScopeResultCheck: {\n always: [\n { target: \"Success\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) => {\n const { hmacRest, error } = context._internalState;\n if (hmacRest) {\n const { input } = context;\n return Right({\n contactName: input.contactName,\n previousScope: input.previousScope,\n scope: input.newScope,\n identifier: input.identifier,\n blockchainFamily: input.blockchainFamily,\n chainId: input.chainId,\n groupHandle: input.groupHandle,\n // Preserved: the group-level name proof is untouched by a scope\n // edit \u2014 only `hmacRest` (the address-level proof) rotates.\n hmacProof: input.hmacProof,\n hmacRest,\n });\n }\n return Left(error ?? new UnknownDAError(\"No error in final state\"));\n },\n });\n }\n\n extractDependencies(\n internalApi: InternalApi,\n ): EditExternalAddressScopeMachineDependencies {\n const isSupported = (app: RunningApp) =>\n isContactsAppVersionSupportedForSession(internalApi, app);\n\n const editScope = (\n input: EditExternalAddressScopeDAInput,\n ): Promise<Awaited<ReturnType<SendEditExternalAddressScopeTask[\"run\"]>>> =>\n new SendEditExternalAddressScopeTask(internalApi, {\n contactName: input.contactName,\n previousScope: input.previousScope,\n newScope: input.newScope,\n identifier: input.identifier,\n blockchainFamily: input.blockchainFamily,\n chainId: input.chainId,\n groupHandle: input.groupHandle,\n hmacProof: input.hmacProof,\n hmacRest: input.hmacRest,\n }).run();\n\n return { isSupported, editScope };\n }\n}\n\nexport type { EditScopeProof };\n"],
5
+ "mappings": "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",
6
+ "names": ["EditExternalAddressScopeDeviceAction_exports", "__export", "EditExternalAddressScopeDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_contactsVersionGuards", "import_contactsErrors", "import_SendEditExternalAddressScopeTask", "import_validateEditExternalAddressScopeInput", "internalApi", "isSupported", "editScope", "appName", "input", "context", "appAndVersion", "error", "event", "hmacRest", "app"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),n=require("vitest"),h=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),d=require("../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock"),D=require("../../../app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock"),c=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),S=require("../../../app-binder/model/contactsErrors"),P=require("./EditExternalAddressScopeDeviceAction"),v=require("./validateEditExternalAddressScopeInput");n.vi.mock("@ledgerhq/device-management-kit",async a=>({...await a(),OpenAppDeviceAction:n.vi.fn(()=>({makeStateMachine:n.vi.fn()})),WaitForAppAndVersionDeviceAction:n.vi.fn(()=>({makeStateMachine:n.vi.fn()}))}));const V={name:"Ethereum",version:"1.15.0"},g=new Uint8Array(64).fill(204),x=new Uint8Array(32).fill(221),k=new Uint8Array(32).fill(170),f=new Uint8Array(32).fill(136),I=new Uint8Array(20).fill(17),O={hmacRest:f},u={contactName:"Alice",previousScope:"Eth main",newScope:"Eth cold",identifier:I,blockchainFamily:"ethereum",chainId:1n,groupHandle:g,hmacProof:x,hmacRest:k,appName:"Ethereum"},A={contactName:"Alice",previousScope:"Eth main",scope:"Eth cold",identifier:I,blockchainFamily:"ethereum",chainId:1n,groupHandle:g,hmacProof:x,hmacRest:f};(0,n.describe)("EditExternalAddressScopeDeviceAction",()=>{let a,l,E;function U(){return{isSupported:l,editScope:E}}(0,n.beforeEach)(()=>{a=(0,h.makeDeviceActionInternalApiMock)(),(0,D.setupWaitForAppAndVersionDAMock)(V),l=n.vi.fn().mockReturnValue(!0),E=n.vi.fn().mockResolvedValue((0,e.CommandResultFactory)({data:O})),a.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!0})});function p(o){const r=new P.EditExternalAddressScopeDeviceAction({input:o});return n.vi.spyOn(r,"extractDependencies").mockReturnValue(U()),r}(0,n.it)("open-app path: OpenApp -> VersionGuard -> EditScope -> Completed",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t=p({...u,skipOpenApp:!1}),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,i,a,{onDone:o,onError:r})})),(0,n.it)("skip-open-app path: VersionGuard -> EditScope -> Completed, preserving the group proof and identifier",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t=p({...u,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,i,a,{onDone:()=>{try{expect(A.hmacProof).toBe(x),expect(A.identifier).toBe(I),expect(A.hmacRest).toBe(f),expect(A.hmacRest).not.toBe(k),o()}catch(s){r(s)}},onError:r})})),(0,n.it)("version guard rejects on skip-open-app path without running EDIT SCOPE",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)(),l.mockReturnValue(!1);const t=p({...u,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:new S.ContactsVersionRequirementError,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(t,i,a,{onDone:o,onError:r}),expect(E).not.toHaveBeenCalled()})),(0,n.it)("surfaces an open-app failure as the device action error",()=>new Promise((o,r)=>{const t=new e.UnknownDAError("open app failed");(0,d.setupOpenAppDAMock)(t);const i=p({...u,skipOpenApp:!1}),s=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(i,s,a,{onDone:o,onError:r}),expect(l).not.toHaveBeenCalled()})),(0,n.it)("surfaces an Edit Scope command error",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t=new S.ContactsCommandError({errorCode:"6982",message:"seed mismatch"});E.mockResolvedValue((0,e.CommandResultFactory)({error:t}));const i=p({...u,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(i,s,a,{onDone:o,onError:r})})),(0,n.it)("surfaces invalid input as a typed error state on the skip-open-app path",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t={...u,skipOpenApp:!0,contactName:""},i=(0,v.validateEditExternalAddressScopeInput)(t),s=p(t),m=[{error:i,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(s,m,a,{onDone:o,onError:r}),expect(l).not.toHaveBeenCalled(),expect(E).not.toHaveBeenCalled()})),(0,n.it)("validates only after opening the app on the default path",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t={...u,skipOpenApp:!1,contactName:""},i=(0,v.validateEditExternalAddressScopeInput)(t),s=p(t),m=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{error:i,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(s,m,a,{onDone:o,onError:r}),expect(E).not.toHaveBeenCalled()})),(0,n.it)("evaluates support from the fresh WaitForAppAndVersion result, not stale session state",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t={name:"Ethereum",version:"9.9.9"};(0,D.setupWaitForAppAndVersionDAMock)(t);const i=p({...u,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(i,s,a,{onDone:()=>{try{expect(l).toHaveBeenCalledWith(t),o()}catch(m){r(m)}},onError:r})})),(0,n.it)("surfaces a WaitForAppAndVersion failure as the device action error",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t=new e.UnknownDAError("could not read app and version");(0,D.setupWaitForAppAndVersionDAMock)({error:t});const i=p({...u,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(i,s,a,{onDone:o,onError:r}),expect(l).not.toHaveBeenCalled(),expect(E).not.toHaveBeenCalled()})),(0,n.it)("propagates the UnlockDevice interaction emitted by WaitForAppAndVersion",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)(),(0,D.setupWaitForAppAndVersionDAMock)(V,e.UserInteractionRequired.UnlockDevice);const t=p({...u,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,i,a,{onDone:o,onError:r})}))});
2
+ //# sourceMappingURL=EditExternalAddressScopeDeviceAction.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.ts"],
4
+ "sourcesContent": ["import {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type EditExternalAddressScopeDAError,\n type EditExternalAddressScopeDAInput,\n type EditExternalAddressScopeDAIntermediateValue,\n type EditExternalAddressScopeDAOutput,\n} from \"@api/app-binder/EditExternalAddressScopeDeviceActionTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { setupWaitForAppAndVersionDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport {\n ContactsCommandError,\n ContactsVersionRequirementError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { EditExternalAddressScopeDeviceAction } from \"./EditExternalAddressScopeDeviceAction\";\nimport { validateEditExternalAddressScopeInput } from \"./validateEditExternalAddressScopeInput\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n WaitForAppAndVersionDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\nconst FRESH_APP = { name: \"Ethereum\", version: \"1.15.0\" };\n\nconst GROUP_HANDLE = new Uint8Array(64).fill(0xcc);\nconst HMAC_PROOF = new Uint8Array(32).fill(0xdd);\nconst HMAC_REST_OLD = new Uint8Array(32).fill(0xaa);\nconst HMAC_REST_NEW = new Uint8Array(32).fill(0x88);\nconst IDENTIFIER = new Uint8Array(20).fill(0x11);\n\nconst OK_PROOF = { hmacRest: HMAC_REST_NEW };\n\nconst BASE_INPUT = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n newScope: \"Eth cold\",\n identifier: IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF,\n hmacRest: HMAC_REST_OLD,\n appName: \"Ethereum\",\n};\n\nconst EXPECTED_OUTPUT = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n scope: \"Eth cold\",\n identifier: IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n // Preserved: the group-level name proof is unchanged by a scope edit.\n hmacProof: HMAC_PROOF,\n // Rotated: only the address-level proof changes.\n hmacRest: HMAC_REST_NEW,\n};\n\ndescribe(\"EditExternalAddressScopeDeviceAction\", () => {\n let apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\n let isSupportedMock: ReturnType<typeof vi.fn>;\n let editScopeMock: ReturnType<typeof vi.fn>;\n\n function extractDeps() {\n return {\n isSupported: isSupportedMock,\n editScope: editScopeMock,\n };\n }\n\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n setupWaitForAppAndVersionDAMock(FRESH_APP);\n isSupportedMock = vi.fn().mockReturnValue(true);\n editScopeMock = vi\n .fn()\n .mockResolvedValue(CommandResultFactory({ data: OK_PROOF }));\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n });\n\n function makeAction(input: EditExternalAddressScopeDAInput) {\n const action = new EditExternalAddressScopeDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n return action;\n }\n\n it(\"open-app path: OpenApp -> VersionGuard -> EditScope -> Completed\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"skip-open-app path: VersionGuard -> EditScope -> Completed, preserving the group proof and identifier\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n // The device rotates only the address-level hmac_rest; the contact\n // group's name proof and the entry's identifier pass through\n // unchanged.\n expect(EXPECTED_OUTPUT.hmacProof).toBe(HMAC_PROOF);\n expect(EXPECTED_OUTPUT.identifier).toBe(IDENTIFIER);\n expect(EXPECTED_OUTPUT.hmacRest).toBe(HMAC_REST_NEW);\n expect(EXPECTED_OUTPUT.hmacRest).not.toBe(HMAC_REST_OLD);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"version guard rejects on skip-open-app path without running EDIT SCOPE\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n isSupportedMock.mockReturnValue(false);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new ContactsVersionRequirementError(),\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an open-app failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n const openAppError = new UnknownDAError(\"open app failed\");\n setupOpenAppDAMock(openAppError);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: openAppError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an Edit Scope command error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const commandError = new ContactsCommandError({\n errorCode: \"6982\",\n message: \"seed mismatch\",\n });\n editScopeMock.mockResolvedValue(\n CommandResultFactory({ error: commandError }),\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: commandError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"surfaces invalid input as a typed error state on the skip-open-app path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: true,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressScopeInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"validates only after opening the app on the default path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: false,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressScopeInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"evaluates support from the fresh WaitForAppAndVersion result, not stale session state\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const freshApp = { name: \"Ethereum\", version: \"9.9.9\" };\n setupWaitForAppAndVersionDAMock(freshApp);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n expect(isSupportedMock).toHaveBeenCalledWith(freshApp);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a WaitForAppAndVersion failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const waitError = new UnknownDAError(\"could not read app and version\");\n setupWaitForAppAndVersionDAMock({ error: waitError });\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: waitError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"propagates the UnlockDevice interaction emitted by WaitForAppAndVersion\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupWaitForAppAndVersionDAMock(\n FRESH_APP,\n UserInteractionRequired.UnlockDevice,\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_vitest", "import_makeInternalApi", "import_setupOpenAppDAMock", "import_setupWaitForAppAndVersionDAMock", "import_testDeviceActionStates", "import_contactsErrors", "import_EditExternalAddressScopeDeviceAction", "import_validateEditExternalAddressScopeInput", "importOriginal", "FRESH_APP", "GROUP_HANDLE", "HMAC_PROOF", "HMAC_REST_OLD", "HMAC_REST_NEW", "IDENTIFIER", "OK_PROOF", "BASE_INPUT", "EXPECTED_OUTPUT", "apiMock", "isSupportedMock", "editScopeMock", "extractDeps", "makeAction", "input", "action", "resolve", "reject", "expected", "e", "openAppError", "commandError", "invalidInput", "validationError", "freshApp", "waitError"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var h=(t,r)=>{for(var o in r)a(t,o,{get:r[o],enumerable:!0})},s=(t,r,o,d)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of f(r))!l.call(t,i)&&i!==o&&a(t,i,{get:()=>r[i],enumerable:!(d=c(r,i))||d.enumerable});return t};var E=t=>s(a({},"__esModule",{value:!0}),t);var p={};h(p,{validateEditExternalAddressScopeInput:()=>_});module.exports=E(p);var n=require("../../../app-binder/model/contactsConstants"),e=require("../../../app-binder/model/contactsValidation");const m=e.HMAC_PROOF_LENGTH;function _(t){try{(0,e.validatePrintableLabel)(t.contactName,{field:"contactName",bufferLength:e.CONTACT_NAME_BUFFER_LENGTH}),(0,e.validatePrintableLabel)(t.previousScope,{field:"previousScope",bufferLength:e.SCOPE_BUFFER_LENGTH}),(0,e.validatePrintableLabel)(t.newScope,{field:"newScope",bufferLength:e.SCOPE_BUFFER_LENGTH});const r=t.blockchainFamily.toLowerCase();if(!(r in n.BLOCKCHAIN_FAMILY_BY_NAME))throw new e.ContactsValidationError(`Unsupported blockchain family: ${t.blockchainFamily}`);if(r==="ethereum"){if((0,e.validateByteLength)(t.identifier,{field:"identifier",expectedBytes:e.ETH_ADDRESS_BYTES}),t.chainId===void 0)throw new e.ContactsValidationError("chainId is required for the Ethereum blockchain family.")}else if(t.identifier.length===0)throw new e.ContactsValidationError("identifier must not be empty.");return t.chainId!==void 0&&(0,e.validateChainId)(t.chainId),(0,e.validateByteLength)(t.groupHandle,{field:"groupHandle",expectedBytes:e.GROUP_HANDLE_SIZE}),(0,e.validateByteLength)(t.hmacProof,{field:"hmacProof",expectedBytes:e.HMAC_PROOF_LENGTH}),(0,e.validateByteLength)(t.hmacRest,{field:"hmacRest",expectedBytes:m}),null}catch(r){if(r instanceof e.ContactsValidationError)return r;throw r}}0&&(module.exports={validateEditExternalAddressScopeInput});
2
+ //# sourceMappingURL=validateEditExternalAddressScopeInput.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.ts"],
4
+ "sourcesContent": ["import { type EditExternalAddressScopeInput } from \"@api/model/EditExternalAddressScope\";\nimport { BLOCKCHAIN_FAMILY_BY_NAME } from \"@internal/app-binder/model/contactsConstants\";\nimport {\n CONTACT_NAME_BUFFER_LENGTH,\n ContactsValidationError,\n ETH_ADDRESS_BYTES,\n GROUP_HANDLE_SIZE,\n HMAC_PROOF_LENGTH,\n SCOPE_BUFFER_LENGTH,\n validateByteLength,\n validateChainId,\n validatePrintableLabel,\n} from \"@internal/app-binder/model/contactsValidation\";\n\n// The address-level proof (`hmac_rest`) shares the 32-byte HMAC width.\nconst HMAC_REST_LENGTH = HMAC_PROOF_LENGTH;\n\n/**\n * Validate the caller input for Edit External Address Scope. Returns the first\n * `ContactsValidationError`, or `null` when valid. Non-throwing so the device\n * action can surface it as a typed terminal error state.\n */\nexport function validateEditExternalAddressScopeInput(\n input: EditExternalAddressScopeInput,\n): ContactsValidationError | null {\n try {\n validatePrintableLabel(input.contactName, {\n field: \"contactName\",\n bufferLength: CONTACT_NAME_BUFFER_LENGTH,\n });\n validatePrintableLabel(input.previousScope, {\n field: \"previousScope\",\n bufferLength: SCOPE_BUFFER_LENGTH,\n });\n validatePrintableLabel(input.newScope, {\n field: \"newScope\",\n bufferLength: SCOPE_BUFFER_LENGTH,\n });\n\n const family = input.blockchainFamily.toLowerCase();\n if (!(family in BLOCKCHAIN_FAMILY_BY_NAME)) {\n throw new ContactsValidationError(\n `Unsupported blockchain family: ${input.blockchainFamily}`,\n );\n }\n if (family === \"ethereum\") {\n validateByteLength(input.identifier, {\n field: \"identifier\",\n expectedBytes: ETH_ADDRESS_BYTES,\n });\n // CHAIN_ID is mandatory for the Ethereum family (multiple networks share\n // the same address format).\n if (input.chainId === undefined) {\n throw new ContactsValidationError(\n \"chainId is required for the Ethereum blockchain family.\",\n );\n }\n } else {\n if (input.identifier.length === 0) {\n throw new ContactsValidationError(\"identifier must not be empty.\");\n }\n }\n\n if (input.chainId !== undefined) {\n validateChainId(input.chainId);\n }\n\n validateByteLength(input.groupHandle, {\n field: \"groupHandle\",\n expectedBytes: GROUP_HANDLE_SIZE,\n });\n validateByteLength(input.hmacProof, {\n field: \"hmacProof\",\n expectedBytes: HMAC_PROOF_LENGTH,\n });\n validateByteLength(input.hmacRest, {\n field: \"hmacRest\",\n expectedBytes: HMAC_REST_LENGTH,\n });\n\n return null;\n } catch (error) {\n if (error instanceof ContactsValidationError) {\n return error;\n }\n throw error;\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,2CAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAA0C,wDAC1CC,EAUO,yDAGP,MAAMC,EAAmB,oBAOlB,SAASJ,EACdK,EACgC,CAChC,GAAI,IACF,0BAAuBA,EAAM,YAAa,CACxC,MAAO,cACP,aAAc,4BAChB,CAAC,KACD,0BAAuBA,EAAM,cAAe,CAC1C,MAAO,gBACP,aAAc,qBAChB,CAAC,KACD,0BAAuBA,EAAM,SAAU,CACrC,MAAO,WACP,aAAc,qBAChB,CAAC,EAED,MAAMC,EAASD,EAAM,iBAAiB,YAAY,EAClD,GAAI,EAAEC,KAAU,6BACd,MAAM,IAAI,0BACR,kCAAkCD,EAAM,gBAAgB,EAC1D,EAEF,GAAIC,IAAW,YAOb,MANA,sBAAmBD,EAAM,WAAY,CACnC,MAAO,aACP,cAAe,mBACjB,CAAC,EAGGA,EAAM,UAAY,OACpB,MAAM,IAAI,0BACR,yDACF,UAGEA,EAAM,WAAW,SAAW,EAC9B,MAAM,IAAI,0BAAwB,+BAA+B,EAIrE,OAAIA,EAAM,UAAY,WACpB,mBAAgBA,EAAM,OAAO,KAG/B,sBAAmBA,EAAM,YAAa,CACpC,MAAO,cACP,cAAe,mBACjB,CAAC,KACD,sBAAmBA,EAAM,UAAW,CAClC,MAAO,YACP,cAAe,mBACjB,CAAC,KACD,sBAAmBA,EAAM,SAAU,CACjC,MAAO,WACP,cAAeD,CACjB,CAAC,EAEM,IACT,OAASG,EAAO,CACd,GAAIA,aAAiB,0BACnB,OAAOA,EAET,MAAMA,CACR,CACF",
6
+ "names": ["validateEditExternalAddressScopeInput_exports", "__export", "validateEditExternalAddressScopeInput", "__toCommonJS", "import_contactsConstants", "import_contactsValidation", "HMAC_REST_LENGTH", "input", "family", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=require("../../../app-binder/model/contactsValidation"),t=require("./validateEditExternalAddressScopeInput");const n={contactName:"Alice",previousScope:"Eth main",newScope:"Eth cold",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n,groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)};describe("validateEditExternalAddressScopeInput",()=>{it("returns null for a valid input",()=>{expect((0,t.validateEditExternalAddressScopeInput)(n)).toBeNull()}),it("rejects an empty contactName",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...n,contactName:""});expect(e).toBeInstanceOf(r.ContactsValidationError)}),it("rejects a non-printable previousScope",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...n,previousScope:"caf\xE9"});expect(e).toBeInstanceOf(r.ContactsValidationError)}),it("rejects a non-printable newScope",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...n,newScope:"caf\xE9"});expect(e).toBeInstanceOf(r.ContactsValidationError)}),it("rejects an unsupported blockchain family",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...n,blockchainFamily:"dogecoin"});expect(e).toBeInstanceOf(r.ContactsValidationError)}),it("rejects an identifier of the wrong length for Ethereum",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...n,identifier:new Uint8Array(19).fill(17)});expect(e).toBeInstanceOf(r.ContactsValidationError)}),it("requires chainId for the Ethereum family",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...n,chainId:void 0});expect(e).toBeInstanceOf(r.ContactsValidationError)}),it("rejects a groupHandle of the wrong length",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...n,groupHandle:new Uint8Array(63).fill(204)});expect(e).toBeInstanceOf(r.ContactsValidationError)}),it("rejects an hmacProof of the wrong length",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...n,hmacProof:new Uint8Array(31).fill(221)});expect(e).toBeInstanceOf(r.ContactsValidationError)}),it("rejects an hmacRest of the wrong length",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...n,hmacRest:new Uint8Array(33).fill(170)});expect(e).toBeInstanceOf(r.ContactsValidationError)})});
2
+ //# sourceMappingURL=validateEditExternalAddressScopeInput.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.ts"],
4
+ "sourcesContent": ["import { type EditExternalAddressScopeInput } from \"@api/model/EditExternalAddressScope\";\nimport { ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\nimport { validateEditExternalAddressScopeInput } from \"./validateEditExternalAddressScopeInput\";\n\nconst VALID_INPUT: EditExternalAddressScopeInput = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n newScope: \"Eth cold\",\n identifier: new Uint8Array(20).fill(0x11),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\ndescribe(\"validateEditExternalAddressScopeInput\", () => {\n it(\"returns null for a valid input\", () => {\n expect(validateEditExternalAddressScopeInput(VALID_INPUT)).toBeNull();\n });\n\n it(\"rejects an empty contactName\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n contactName: \"\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a non-printable previousScope\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n previousScope: \"caf\u00E9\", // 0xC3 0xA9 is non-ASCII\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a non-printable newScope\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n newScope: \"caf\u00E9\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an unsupported blockchain family\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n blockchainFamily: \"dogecoin\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an identifier of the wrong length for Ethereum\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n identifier: new Uint8Array(19).fill(0x11),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"requires chainId for the Ethereum family\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n chainId: undefined,\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a groupHandle of the wrong length\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n groupHandle: new Uint8Array(63).fill(0xcc),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacProof of the wrong length\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n hmacProof: new Uint8Array(31).fill(0xdd),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacRest of the wrong length\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n hmacRest: new Uint8Array(33).fill(0xaa),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n});\n"],
5
+ "mappings": "aACA,IAAAA,EAAwC,yDAExCC,EAAsD,mDAEtD,MAAMC,EAA6C,CACjD,YAAa,QACb,cAAe,WACf,SAAU,WACV,WAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EACxC,iBAAkB,WAClB,QAAS,GACT,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACzC,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACvC,SAAU,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACxC,EAEA,SAAS,wCAAyC,IAAM,CACtD,GAAG,iCAAkC,IAAM,CACzC,UAAO,yCAAsCA,CAAW,CAAC,EAAE,SAAS,CACtE,CAAC,EAED,GAAG,+BAAgC,IAAM,CACvC,MAAMC,KAAQ,yCAAsC,CAClD,GAAGD,EACH,YAAa,EACf,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,wCAAyC,IAAM,CAChD,MAAMA,KAAQ,yCAAsC,CAClD,GAAGD,EACH,cAAe,SACjB,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,mCAAoC,IAAM,CAC3C,MAAMA,KAAQ,yCAAsC,CAClD,GAAGD,EACH,SAAU,SACZ,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMA,KAAQ,yCAAsC,CAClD,GAAGD,EACH,iBAAkB,UACpB,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,yDAA0D,IAAM,CACjE,MAAMA,KAAQ,yCAAsC,CAClD,GAAGD,EACH,WAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,CAC1C,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMA,KAAQ,yCAAsC,CAClD,GAAGD,EACH,QAAS,MACX,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,4CAA6C,IAAM,CACpD,MAAMA,KAAQ,yCAAsC,CAClD,GAAGD,EACH,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CAC3C,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMA,KAAQ,yCAAsC,CAClD,GAAGD,EACH,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACzC,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,EAED,GAAG,0CAA2C,IAAM,CAClD,MAAMA,KAAQ,yCAAsC,CAClD,GAAGD,EACH,SAAU,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACxC,CAAC,EACD,OAAOC,CAAK,EAAE,eAAe,yBAAuB,CACtD,CAAC,CACH,CAAC",
6
+ "names": ["import_contactsValidation", "import_validateEditExternalAddressScopeInput", "VALID_INPUT", "error"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var y=(s,n)=>{for(var p in n)u(s,p,{get:n[p],enumerable:!0})},h=(s,n,p,l)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of R(n))!I.call(s,r)&&r!==p&&u(s,r,{get:()=>n[r],enumerable:!(l=S(n,r))||l.enumerable});return s};var D=s=>h(u({},"__esModule",{value:!0}),s);var V={};y(V,{RegisterExternalAddressDeviceAction:()=>x});module.exports=D(V);var i=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),a=require("xstate"),A=require("../../../app-binder/isContactsSupportedForSession"),g=require("../../../app-binder/model/contactsErrors"),m=require("../../../app-binder/task/SendRegisterIdentityTask"),E=require("./validateRegisterExternalAddressInput");class x extends i.XStateDeviceAction{makeStateMachine(n){const{isSupported:p,registerIdentity:l}=this.extractDependencies(n),r=this.input.appName;return(0,a.setup)({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new i.OpenAppDeviceAction({input:{appName:r}}).makeStateMachine(n),waitForAppAndVersionStateMachine:new i.WaitForAppAndVersionDeviceAction({input:{}}).makeStateMachine(n),registerIdentity:(0,a.fromPromise)(({input:e})=>l(e))},guards:{skipOpenApp:({context:e})=>e.input.skipOpenApp===!0,noInternalError:({context:e})=>e._internalState.error===null,contactsSupported:({context:e})=>{const{appAndVersion:t}=e._internalState;return t!==null&&p(t)}},actions:{assignValidationError:(0,a.assign)({_internalState:({context:e})=>{const t=(0,E.validateRegisterExternalAddressInput)(e.input);return t?{...e._internalState,error:t}:e._internalState}}),assignVersionError:(0,a.assign)({_internalState:({context:e})=>({...e._internalState,error:new g.ContactsVersionRequirementError})}),assignErrorFromEvent:(0,a.assign)({_internalState:({context:e,event:t})=>({...e._internalState,error:new i.UnknownDAError(t.error instanceof Error?t.error.message:String(t.error))})})}}).createMachine({id:"RegisterExternalAddressDeviceAction",initial:"InitialState",context:({input:e})=>({input:e,intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.None},_internalState:{error:null,appAndVersion:null,proofs:null}}),states:{InitialState:{always:[{target:"ValidateInput",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:r}),onSnapshot:{actions:(0,a.assign)({intermediateValue:({event:e})=>e.snapshot.context.intermediateValue})},onDone:{target:"CheckOpenAppResult",actions:(0,a.assign)({_internalState:({event:e,context:t})=>e.output.caseOf({Right:()=>t._internalState,Left:o=>({...t._internalState,error:o})})})}}},CheckOpenAppResult:{always:[{target:"ValidateInput",guard:"noInternalError"},{target:"Error"}]},ValidateInput:{entry:"assignValidationError",always:[{target:"WaitForAppAndVersion",guard:"noInternalError"},{target:"Error"}]},WaitForAppAndVersion:{entry:(0,a.assign)({intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.None}}),invoke:{id:"waitForAppAndVersion",src:"waitForAppAndVersionStateMachine",input:()=>({}),onSnapshot:{actions:(0,a.assign)({intermediateValue:({event:e})=>e.snapshot.context.intermediateValue})},onDone:{target:"CheckAppAndVersion",actions:(0,a.assign)({_internalState:({event:e,context:t})=>e.output.caseOf({Right:o=>({...t._internalState,appAndVersion:{name:o.name,version:o.version}}),Left:o=>({...t._internalState,error:o})})})}}},CheckAppAndVersion:{always:[{target:"VersionGuard",guard:"noInternalError"},{target:"Error"}]},VersionGuard:{always:[{target:"RegisterIdentity",guard:"contactsSupported"},{target:"Error",actions:"assignVersionError"}]},RegisterIdentity:{entry:(0,a.assign)({intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.RegisterWallet}}),exit:(0,a.assign)({intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.None}}),invoke:{id:"registerIdentity",src:"registerIdentity",input:({context:e})=>e.input,onDone:{target:"RegisterIdentityResultCheck",actions:(0,a.assign)({_internalState:({event:e,context:t})=>(0,i.isSuccessCommandResult)(e.output)?{...t._internalState,proofs:e.output.data}:{...t._internalState,error:e.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},RegisterIdentityResultCheck:{always:[{target:"Success",guard:"noInternalError"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:e})=>{const{proofs:t,error:o}=e._internalState;if(t){const{input:d}=e;return(0,c.Right)({mode:d.existingContactGroup?"existingContactGroup":"newContactGroup",contactName:d.contactName,scope:d.scope,identifier:d.identifier,blockchainFamily:d.blockchainFamily,chainId:d.chainId,groupHandle:t.groupHandle,hmacProof:t.hmacProof,hmacRest:t.hmacRest})}return(0,c.Left)(o??new i.UnknownDAError("No error in final state"))}})}extractDependencies(n){return{isSupported:r=>(0,A.isContactsSupportedForSession)(n,r),registerIdentity:r=>new m.SendRegisterIdentityTask(n,{contactName:r.contactName,scope:r.scope,identifier:r.identifier,blockchainFamily:r.blockchainFamily,chainId:r.chainId,existingContactGroup:r.existingContactGroup}).run()}}}0&&(module.exports={RegisterExternalAddressDeviceAction});
1
+ "use strict";var u=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var y=(s,n)=>{for(var p in n)u(s,p,{get:n[p],enumerable:!0})},h=(s,n,p,l)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of R(n))!I.call(s,r)&&r!==p&&u(s,r,{get:()=>n[r],enumerable:!(l=S(n,r))||l.enumerable});return s};var D=s=>h(u({},"__esModule",{value:!0}),s);var V={};y(V,{RegisterExternalAddressDeviceAction:()=>x});module.exports=D(V);var i=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),a=require("xstate"),A=require("../../../app-binder/contactsVersionGuards"),g=require("../../../app-binder/model/contactsErrors"),m=require("../../../app-binder/task/SendRegisterIdentityTask"),E=require("./validateRegisterExternalAddressInput");class x extends i.XStateDeviceAction{makeStateMachine(n){const{isSupported:p,registerIdentity:l}=this.extractDependencies(n),r=this.input.appName;return(0,a.setup)({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new i.OpenAppDeviceAction({input:{appName:r}}).makeStateMachine(n),waitForAppAndVersionStateMachine:new i.WaitForAppAndVersionDeviceAction({input:{}}).makeStateMachine(n),registerIdentity:(0,a.fromPromise)(({input:e})=>l(e))},guards:{skipOpenApp:({context:e})=>e.input.skipOpenApp===!0,noInternalError:({context:e})=>e._internalState.error===null,contactsSupported:({context:e})=>{const{appAndVersion:t}=e._internalState;return t!==null&&p(t)}},actions:{assignValidationError:(0,a.assign)({_internalState:({context:e})=>{const t=(0,E.validateRegisterExternalAddressInput)(e.input);return t?{...e._internalState,error:t}:e._internalState}}),assignVersionError:(0,a.assign)({_internalState:({context:e})=>({...e._internalState,error:new g.ContactsVersionRequirementError})}),assignErrorFromEvent:(0,a.assign)({_internalState:({context:e,event:t})=>({...e._internalState,error:new i.UnknownDAError(t.error instanceof Error?t.error.message:String(t.error))})})}}).createMachine({id:"RegisterExternalAddressDeviceAction",initial:"InitialState",context:({input:e})=>({input:e,intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.None},_internalState:{error:null,appAndVersion:null,proofs:null}}),states:{InitialState:{always:[{target:"ValidateInput",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:r}),onSnapshot:{actions:(0,a.assign)({intermediateValue:({event:e})=>e.snapshot.context.intermediateValue})},onDone:{target:"CheckOpenAppResult",actions:(0,a.assign)({_internalState:({event:e,context:t})=>e.output.caseOf({Right:()=>t._internalState,Left:o=>({...t._internalState,error:o})})})}}},CheckOpenAppResult:{always:[{target:"ValidateInput",guard:"noInternalError"},{target:"Error"}]},ValidateInput:{entry:"assignValidationError",always:[{target:"WaitForAppAndVersion",guard:"noInternalError"},{target:"Error"}]},WaitForAppAndVersion:{entry:(0,a.assign)({intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.None}}),invoke:{id:"waitForAppAndVersion",src:"waitForAppAndVersionStateMachine",input:()=>({}),onSnapshot:{actions:(0,a.assign)({intermediateValue:({event:e})=>e.snapshot.context.intermediateValue})},onDone:{target:"CheckAppAndVersion",actions:(0,a.assign)({_internalState:({event:e,context:t})=>e.output.caseOf({Right:o=>({...t._internalState,appAndVersion:{name:o.name,version:o.version}}),Left:o=>({...t._internalState,error:o})})})}}},CheckAppAndVersion:{always:[{target:"VersionGuard",guard:"noInternalError"},{target:"Error"}]},VersionGuard:{always:[{target:"RegisterIdentity",guard:"contactsSupported"},{target:"Error",actions:"assignVersionError"}]},RegisterIdentity:{entry:(0,a.assign)({intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.RegisterWallet}}),exit:(0,a.assign)({intermediateValue:{requiredUserInteraction:i.UserInteractionRequired.None}}),invoke:{id:"registerIdentity",src:"registerIdentity",input:({context:e})=>e.input,onDone:{target:"RegisterIdentityResultCheck",actions:(0,a.assign)({_internalState:({event:e,context:t})=>(0,i.isSuccessCommandResult)(e.output)?{...t._internalState,proofs:e.output.data}:{...t._internalState,error:e.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},RegisterIdentityResultCheck:{always:[{target:"Success",guard:"noInternalError"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:e})=>{const{proofs:t,error:o}=e._internalState;if(t){const{input:d}=e;return(0,c.Right)({mode:d.existingContactGroup?"existingContactGroup":"newContactGroup",contactName:d.contactName,scope:d.scope,identifier:d.identifier,blockchainFamily:d.blockchainFamily,chainId:d.chainId,groupHandle:t.groupHandle,hmacProof:t.hmacProof,hmacRest:t.hmacRest})}return(0,c.Left)(o??new i.UnknownDAError("No error in final state"))}})}extractDependencies(n){return{isSupported:r=>(0,A.isContactsAppVersionSupportedForSession)(n,r),registerIdentity:r=>new m.SendRegisterIdentityTask(n,{contactName:r.contactName,scope:r.scope,identifier:r.identifier,blockchainFamily:r.blockchainFamily,chainId:r.chainId,existingContactGroup:r.existingContactGroup}).run()}}}0&&(module.exports={RegisterExternalAddressDeviceAction});
2
2
  //# sourceMappingURL=RegisterExternalAddressDeviceAction.js.map