@ledgerhq/device-contacts-kit 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) 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/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js +2 -0
  37. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js.map +7 -0
  38. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +2 -0
  39. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +7 -0
  40. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js +2 -0
  41. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js.map +7 -0
  42. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +2 -0
  43. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +7 -0
  44. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js +2 -0
  45. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js.map +7 -0
  46. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +2 -0
  47. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +7 -0
  48. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js +2 -0
  49. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js.map +7 -0
  50. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +2 -0
  51. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +7 -0
  52. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +2 -0
  53. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +7 -0
  54. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +2 -0
  55. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +7 -0
  56. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js +2 -0
  57. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js.map +7 -0
  58. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +2 -0
  59. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +7 -0
  60. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +2 -0
  61. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +7 -0
  62. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.js +1 -1
  63. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.js.map +3 -3
  64. package/lib/cjs/internal/app-binder/model/contactsConstants.js +1 -1
  65. package/lib/cjs/internal/app-binder/model/contactsConstants.js.map +3 -3
  66. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js +2 -0
  67. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js.map +7 -0
  68. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +2 -0
  69. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +7 -0
  70. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.js +2 -0
  71. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.js.map +7 -0
  72. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +2 -0
  73. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +7 -0
  74. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.js +1 -1
  75. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.js.map +2 -2
  76. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js +1 -1
  77. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +2 -2
  78. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js +2 -0
  79. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js.map +7 -0
  80. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js +2 -0
  81. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js.map +7 -0
  82. package/lib/cjs/internal/di.test.js +1 -1
  83. package/lib/cjs/internal/di.test.js.map +3 -3
  84. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.js +2 -0
  85. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.js.map +7 -0
  86. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +2 -0
  87. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +7 -0
  88. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.js +2 -0
  89. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.js.map +7 -0
  90. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js +2 -0
  91. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +7 -0
  92. package/lib/cjs/internal/use-cases/RenameContactUseCase.js +2 -0
  93. package/lib/cjs/internal/use-cases/RenameContactUseCase.js.map +7 -0
  94. package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js +2 -0
  95. package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js.map +7 -0
  96. package/lib/cjs/internal/use-cases/di/useCaseModule.js +1 -1
  97. package/lib/cjs/internal/use-cases/di/useCaseModule.js.map +3 -3
  98. package/lib/cjs/internal/use-cases/di/useCaseTypes.js +1 -1
  99. package/lib/cjs/internal/use-cases/di/useCaseTypes.js.map +2 -2
  100. package/lib/cjs/package.json +1 -1
  101. package/lib/esm/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.js +1 -0
  102. package/lib/esm/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.js.map +7 -0
  103. package/lib/esm/api/app-binder/EditExternalAddressScopeDeviceActionTypes.js +1 -0
  104. package/lib/esm/api/app-binder/EditExternalAddressScopeDeviceActionTypes.js.map +7 -0
  105. package/lib/esm/api/app-binder/RenameContactDeviceActionTypes.js +1 -0
  106. package/lib/esm/api/app-binder/RenameContactDeviceActionTypes.js.map +7 -0
  107. package/lib/esm/api/index.js +1 -1
  108. package/lib/esm/api/index.js.map +2 -2
  109. package/lib/esm/api/model/EditExternalAddressIdentifier.js +1 -0
  110. package/lib/esm/api/model/EditExternalAddressIdentifier.js.map +7 -0
  111. package/lib/esm/api/model/EditExternalAddressScope.js +1 -0
  112. package/lib/esm/api/model/EditExternalAddressScope.js.map +7 -0
  113. package/lib/esm/api/model/RenameContact.js +1 -0
  114. package/lib/esm/api/model/RenameContact.js.map +7 -0
  115. package/lib/esm/internal/DefaultContactsManager.js +1 -1
  116. package/lib/esm/internal/DefaultContactsManager.js.map +2 -2
  117. package/lib/esm/internal/DefaultContactsManager.test.js +1 -1
  118. package/lib/esm/internal/DefaultContactsManager.test.js.map +3 -3
  119. package/lib/esm/internal/app-binder/ContactsAppBinder.js +1 -1
  120. package/lib/esm/internal/app-binder/ContactsAppBinder.js.map +3 -3
  121. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.js +2 -0
  122. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.js.map +7 -0
  123. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js +2 -0
  124. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js.map +7 -0
  125. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.js +2 -0
  126. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.js.map +7 -0
  127. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js +2 -0
  128. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js.map +7 -0
  129. package/lib/esm/internal/app-binder/command/RenameContactCommand.js +2 -0
  130. package/lib/esm/internal/app-binder/command/RenameContactCommand.js.map +7 -0
  131. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js +2 -0
  132. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js.map +7 -0
  133. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js +2 -0
  134. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js.map +7 -0
  135. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +2 -0
  136. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +7 -0
  137. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js +2 -0
  138. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js.map +7 -0
  139. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +2 -0
  140. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +7 -0
  141. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js +2 -0
  142. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js.map +7 -0
  143. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +2 -0
  144. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +7 -0
  145. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js +2 -0
  146. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js.map +7 -0
  147. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +2 -0
  148. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +7 -0
  149. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +2 -0
  150. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +7 -0
  151. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +2 -0
  152. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +7 -0
  153. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js +2 -0
  154. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js.map +7 -0
  155. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +2 -0
  156. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +7 -0
  157. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +2 -0
  158. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +7 -0
  159. package/lib/esm/internal/app-binder/isContactsSupportedForSession.js +1 -1
  160. package/lib/esm/internal/app-binder/isContactsSupportedForSession.js.map +3 -3
  161. package/lib/esm/internal/app-binder/model/contactsConstants.js +1 -1
  162. package/lib/esm/internal/app-binder/model/contactsConstants.js.map +3 -3
  163. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js +2 -0
  164. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js.map +7 -0
  165. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +2 -0
  166. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +7 -0
  167. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.js +2 -0
  168. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.js.map +7 -0
  169. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +2 -0
  170. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +7 -0
  171. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.js +1 -1
  172. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.js.map +3 -3
  173. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js +1 -1
  174. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +2 -2
  175. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js +2 -0
  176. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js.map +7 -0
  177. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js +2 -0
  178. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js.map +7 -0
  179. package/lib/esm/internal/di.test.js +1 -1
  180. package/lib/esm/internal/di.test.js.map +3 -3
  181. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.js +2 -0
  182. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.js.map +7 -0
  183. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +2 -0
  184. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +7 -0
  185. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.js +2 -0
  186. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.js.map +7 -0
  187. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js +2 -0
  188. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +7 -0
  189. package/lib/esm/internal/use-cases/RenameContactUseCase.js +2 -0
  190. package/lib/esm/internal/use-cases/RenameContactUseCase.js.map +7 -0
  191. package/lib/esm/internal/use-cases/RenameContactUseCase.test.js +2 -0
  192. package/lib/esm/internal/use-cases/RenameContactUseCase.test.js.map +7 -0
  193. package/lib/esm/internal/use-cases/di/useCaseModule.js +1 -1
  194. package/lib/esm/internal/use-cases/di/useCaseModule.js.map +3 -3
  195. package/lib/esm/internal/use-cases/di/useCaseTypes.js +1 -1
  196. package/lib/esm/internal/use-cases/di/useCaseTypes.js.map +2 -2
  197. package/lib/esm/package.json +1 -1
  198. package/lib/types/api/ContactsManager.d.ts +35 -0
  199. package/lib/types/api/ContactsManager.d.ts.map +1 -1
  200. package/lib/types/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.d.ts +27 -0
  201. package/lib/types/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.d.ts.map +1 -0
  202. package/lib/types/api/app-binder/EditExternalAddressScopeDeviceActionTypes.d.ts +27 -0
  203. package/lib/types/api/app-binder/EditExternalAddressScopeDeviceActionTypes.d.ts.map +1 -0
  204. package/lib/types/api/app-binder/RenameContactDeviceActionTypes.d.ts +25 -0
  205. package/lib/types/api/app-binder/RenameContactDeviceActionTypes.d.ts.map +1 -0
  206. package/lib/types/api/index.d.ts +6 -0
  207. package/lib/types/api/index.d.ts.map +1 -1
  208. package/lib/types/api/model/EditExternalAddressIdentifier.d.ts +57 -0
  209. package/lib/types/api/model/EditExternalAddressIdentifier.d.ts.map +1 -0
  210. package/lib/types/api/model/EditExternalAddressScope.d.ts +59 -0
  211. package/lib/types/api/model/EditExternalAddressScope.d.ts.map +1 -0
  212. package/lib/types/api/model/RenameContact.d.ts +39 -0
  213. package/lib/types/api/model/RenameContact.d.ts.map +1 -0
  214. package/lib/types/internal/DefaultContactsManager.d.ts +9 -0
  215. package/lib/types/internal/DefaultContactsManager.d.ts.map +1 -1
  216. package/lib/types/internal/app-binder/ContactsAppBinder.d.ts +9 -0
  217. package/lib/types/internal/app-binder/ContactsAppBinder.d.ts.map +1 -1
  218. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.d.ts +25 -0
  219. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.d.ts.map +1 -0
  220. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts +2 -0
  221. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts.map +1 -0
  222. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.d.ts +25 -0
  223. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.d.ts.map +1 -0
  224. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts +2 -0
  225. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts.map +1 -0
  226. package/lib/types/internal/app-binder/command/RenameContactCommand.d.ts +25 -0
  227. package/lib/types/internal/app-binder/command/RenameContactCommand.d.ts.map +1 -0
  228. package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts +2 -0
  229. package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts.map +1 -0
  230. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.d.ts +14 -0
  231. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.d.ts.map +1 -0
  232. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts +2 -0
  233. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts.map +1 -0
  234. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.d.ts +9 -0
  235. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.d.ts.map +1 -0
  236. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts +2 -0
  237. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts.map +1 -0
  238. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.d.ts +14 -0
  239. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.d.ts.map +1 -0
  240. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts +2 -0
  241. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts.map +1 -0
  242. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.d.ts +9 -0
  243. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.d.ts.map +1 -0
  244. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts +2 -0
  245. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts.map +1 -0
  246. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.d.ts +13 -0
  247. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.d.ts.map +1 -0
  248. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts +2 -0
  249. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts.map +1 -0
  250. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.d.ts +12 -0
  251. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.d.ts.map +1 -0
  252. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts +2 -0
  253. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts.map +1 -0
  254. package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts +12 -0
  255. package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts.map +1 -0
  256. package/lib/types/internal/app-binder/isContactsSupportedForSession.d.ts +15 -0
  257. package/lib/types/internal/app-binder/isContactsSupportedForSession.d.ts.map +1 -1
  258. package/lib/types/internal/app-binder/model/contactsConstants.d.ts +26 -0
  259. package/lib/types/internal/app-binder/model/contactsConstants.d.ts.map +1 -1
  260. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.d.ts +25 -0
  261. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.d.ts.map +1 -0
  262. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts +2 -0
  263. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts.map +1 -0
  264. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.d.ts +25 -0
  265. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.d.ts.map +1 -0
  266. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts +2 -0
  267. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts.map +1 -0
  268. package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.d.ts.map +1 -1
  269. package/lib/types/internal/app-binder/task/SendRenameContactTask.d.ts +20 -0
  270. package/lib/types/internal/app-binder/task/SendRenameContactTask.d.ts.map +1 -0
  271. package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts +2 -0
  272. package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts.map +1 -0
  273. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.d.ts +14 -0
  274. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.d.ts.map +1 -0
  275. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts +2 -0
  276. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts.map +1 -0
  277. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.d.ts +14 -0
  278. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.d.ts.map +1 -0
  279. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts +2 -0
  280. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts.map +1 -0
  281. package/lib/types/internal/use-cases/RenameContactUseCase.d.ts +19 -0
  282. package/lib/types/internal/use-cases/RenameContactUseCase.d.ts.map +1 -0
  283. package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts +2 -0
  284. package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts.map +1 -0
  285. package/lib/types/internal/use-cases/di/useCaseModule.d.ts.map +1 -1
  286. package/lib/types/internal/use-cases/di/useCaseTypes.d.ts +3 -0
  287. package/lib/types/internal/use-cases/di/useCaseTypes.d.ts.map +1 -1
  288. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  289. package/package.json +3 -3
@@ -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 isContactsSupportedForSession,\n type RunningApp,\n} from \"@internal/app-binder/isContactsSupportedForSession\";\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 isContactsSupportedForSession(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": ["isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "WaitForAppAndVersionDeviceAction", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "isContactsSupportedForSession", "ContactsVersionRequirementError", "SendEditExternalAddressIdentifierTask", "validateEditExternalAddressIdentifierInput", "EditExternalAddressIdentifierDeviceAction", "internalApi", "isSupported", "editIdentifier", "appName", "input", "context", "appAndVersion", "error", "event", "hmacRest", "app"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{CommandResultFactory as V,DeviceActionStatus as e,DeviceModelId as S,DeviceSessionStateType as C,DeviceStatus as N,UnknownDAError as h,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{beforeEach as q,describe as w,it as c,vi as A}from"vitest";import{makeDeviceActionInternalApiMock as T}from"../../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupOpenAppDAMock as p}from"../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock";import{setupWaitForAppAndVersionDAMock as D}from"../../../app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock";import{testDeviceActionStates as u}from"../../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{ContactsCommandError as F,ContactsVersionRequirementError as H}from"../../../app-binder/model/contactsErrors";import{EditExternalAddressIdentifierDeviceAction as M}from"./EditExternalAddressIdentifierDeviceAction";import{validateEditExternalAddressIdentifierInput as P}from"./validateEditExternalAddressIdentifierInput";A.mock("@ledgerhq/device-management-kit",async o=>({...await o(),OpenAppDeviceAction:A.fn(()=>({makeStateMachine:A.fn()})),WaitForAppAndVersionDeviceAction:A.fn(()=>({makeStateMachine:A.fn()}))}));const g={name:"Ethereum",version:"1.15.0"},U=new Uint8Array(64).fill(204),v=new Uint8Array(32).fill(221),k=new Uint8Array(32).fill(170),x=new Uint8Array(32).fill(136),O=new Uint8Array(20).fill(17),R=new Uint8Array(20).fill(34),W={hmacRest:x},l={contactName:"Alice",scope:"Eth main",previousIdentifier:O,newIdentifier:R,blockchainFamily:"ethereum",chainId:1n,groupHandle:U,hmacProof:v,hmacRest:k,appName:"Ethereum"},I={contactName:"Alice",scope:"Eth main",previousIdentifier:O,identifier:R,blockchainFamily:"ethereum",chainId:1n,groupHandle:U,hmacProof:v,hmacRest:x};w("EditExternalAddressIdentifierDeviceAction",()=>{let o,E,m;function y(){return{isSupported:E,editIdentifier:m}}q(()=>{o=T(),D(g),E=A.fn().mockReturnValue(!0),m=A.fn().mockResolvedValue(V({data:W})),o.getDeviceSessionState.mockReturnValue({sessionStateType:C.ReadyWithoutSecureChannel,deviceStatus:N.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:S.FLEX,isSecureConnectionAllowed:!0})});function s(i){const n=new M({input:i});return A.spyOn(n,"extractDependencies").mockReturnValue(y()),n}c("open-app path: OpenApp -> VersionGuard -> EditIdentifier -> Completed",()=>new Promise((i,n)=>{p();const r=s({...l,skipOpenApp:!1}),a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:I,status:e.Completed}];u(r,a,o,{onDone:i,onError:n})})),c("skip-open-app path: VersionGuard -> EditIdentifier -> Completed, preserving the group proof",()=>new Promise((i,n)=>{p();const r=s({...l,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:I,status:e.Completed}];u(r,a,o,{onDone:()=>{try{expect(I.hmacProof).toBe(v),expect(I.hmacRest).toBe(x),expect(I.hmacRest).not.toBe(k),i()}catch(d){n(d)}},onError:n})})),c("version guard rejects on skip-open-app path without running EDIT IDENTIFIER",()=>new Promise((i,n)=>{p(),E.mockReturnValue(!1);const r=s({...l,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:new H,status:e.Error}];u(r,a,o,{onDone:i,onError:n}),expect(m).not.toHaveBeenCalled()})),c("surfaces an open-app failure as the device action error",()=>new Promise((i,n)=>{const r=new h("open app failed");p(r);const a=s({...l,skipOpenApp:!1}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{error:r,status:e.Error}];u(a,d,o,{onDone:i,onError:n}),expect(E).not.toHaveBeenCalled()})),c("surfaces an Edit Identifier command error",()=>new Promise((i,n)=>{p();const r=new F({errorCode:"6982",message:"seed mismatch"});m.mockResolvedValue(V({error:r}));const a=s({...l,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{error:r,status:e.Error}];u(a,d,o,{onDone:i,onError:n})})),c("surfaces invalid input as a typed error state on the skip-open-app path",()=>new Promise((i,n)=>{p();const r={...l,skipOpenApp:!0,contactName:""},a=P(r),d=s(r),f=[{error:a,status:e.Error}];u(d,f,o,{onDone:i,onError:n}),expect(E).not.toHaveBeenCalled(),expect(m).not.toHaveBeenCalled()})),c("validates only after opening the app on the default path",()=>new Promise((i,n)=>{p();const r={...l,skipOpenApp:!1,contactName:""},a=P(r),d=s(r),f=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{error:a,status:e.Error}];u(d,f,o,{onDone:i,onError:n}),expect(m).not.toHaveBeenCalled()})),c("evaluates support from the fresh WaitForAppAndVersion result, not stale session state",()=>new Promise((i,n)=>{p();const r={name:"Ethereum",version:"9.9.9"};D(r);const a=s({...l,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:I,status:e.Completed}];u(a,d,o,{onDone:()=>{try{expect(E).toHaveBeenCalledWith(r),i()}catch(f){n(f)}},onError:n})})),c("surfaces a WaitForAppAndVersion failure as the device action error",()=>new Promise((i,n)=>{p();const r=new h("could not read app and version");D({error:r});const a=s({...l,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:r,status:e.Error}];u(a,d,o,{onDone:i,onError:n}),expect(E).not.toHaveBeenCalled(),expect(m).not.toHaveBeenCalled()})),c("propagates the UnlockDevice interaction emitted by WaitForAppAndVersion",()=>new Promise((i,n)=>{p(),D(g,t.UnlockDevice);const r=s({...l,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.UnlockDevice},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:I,status:e.Completed}];u(r,a,o,{onDone:i,onError:n})}))});
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": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "UnknownDAError", "UserInteractionRequired", "beforeEach", "describe", "it", "vi", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "setupWaitForAppAndVersionDAMock", "testDeviceActionStates", "ContactsCommandError", "ContactsVersionRequirementError", "EditExternalAddressIdentifierDeviceAction", "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
+ import{BLOCKCHAIN_FAMILY_BY_NAME as a}from"../../../app-binder/model/contactsConstants";import{CONTACT_NAME_BUFFER_LENGTH as f,ContactsValidationError as i,ETH_ADDRESS_BYTES as n,GROUP_HANDLE_SIZE as l,HMAC_PROOF_LENGTH as o,SCOPE_BUFFER_LENGTH as c,validateByteLength as r,validateChainId as s,validatePrintableLabel as d}from"../../../app-binder/model/contactsValidation";const h=o;function I(e){try{d(e.contactName,{field:"contactName",bufferLength:f}),d(e.scope,{field:"scope",bufferLength:c});const t=e.blockchainFamily.toLowerCase();if(!(t in a))throw new i(`Unsupported blockchain family: ${e.blockchainFamily}`);if(t==="ethereum"){if(r(e.previousIdentifier,{field:"previousIdentifier",expectedBytes:n}),r(e.newIdentifier,{field:"newIdentifier",expectedBytes:n}),e.chainId===void 0)throw new i("chainId is required for the Ethereum blockchain family.")}else{if(e.previousIdentifier.length===0)throw new i("previousIdentifier must not be empty.");if(e.newIdentifier.length===0)throw new i("newIdentifier must not be empty.")}return e.chainId!==void 0&&s(e.chainId),r(e.groupHandle,{field:"groupHandle",expectedBytes:l}),r(e.hmacProof,{field:"hmacProof",expectedBytes:o}),r(e.hmacRest,{field:"hmacRest",expectedBytes:h}),null}catch(t){if(t instanceof i)return t;throw t}}export{I as 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": "AACA,OAAS,6BAAAA,MAAiC,+CAC1C,OACE,8BAAAC,EACA,2BAAAC,EACA,qBAAAC,EACA,qBAAAC,EACA,qBAAAC,EACA,uBAAAC,EACA,sBAAAC,EACA,mBAAAC,EACA,0BAAAC,MACK,gDAGP,MAAMC,EAAmBL,EAOlB,SAASM,EACdC,EACgC,CAChC,GAAI,CACFH,EAAuBG,EAAM,YAAa,CACxC,MAAO,cACP,aAAcX,CAChB,CAAC,EACDQ,EAAuBG,EAAM,MAAO,CAClC,MAAO,QACP,aAAcN,CAChB,CAAC,EAED,MAAMO,EAASD,EAAM,iBAAiB,YAAY,EAClD,GAAI,EAAEC,KAAUb,GACd,MAAM,IAAIE,EACR,kCAAkCU,EAAM,gBAAgB,EAC1D,EAEF,GAAIC,IAAW,YAWb,GAVAN,EAAmBK,EAAM,mBAAoB,CAC3C,MAAO,qBACP,cAAeT,CACjB,CAAC,EACDI,EAAmBK,EAAM,cAAe,CACtC,MAAO,gBACP,cAAeT,CACjB,CAAC,EAGGS,EAAM,UAAY,OACpB,MAAM,IAAIV,EACR,yDACF,MAEG,CACL,GAAIU,EAAM,mBAAmB,SAAW,EACtC,MAAM,IAAIV,EACR,uCACF,EAEF,GAAIU,EAAM,cAAc,SAAW,EACjC,MAAM,IAAIV,EAAwB,kCAAkC,CAExE,CAEA,OAAIU,EAAM,UAAY,QACpBJ,EAAgBI,EAAM,OAAO,EAG/BL,EAAmBK,EAAM,YAAa,CACpC,MAAO,cACP,cAAeR,CACjB,CAAC,EACDG,EAAmBK,EAAM,UAAW,CAClC,MAAO,YACP,cAAeP,CACjB,CAAC,EACDE,EAAmBK,EAAM,SAAU,CACjC,MAAO,WACP,cAAeF,CACjB,CAAC,EAEM,IACT,OAASI,EAAO,CACd,GAAIA,aAAiBZ,EACnB,OAAOY,EAET,MAAMA,CACR,CACF",
6
+ "names": ["BLOCKCHAIN_FAMILY_BY_NAME", "CONTACT_NAME_BUFFER_LENGTH", "ContactsValidationError", "ETH_ADDRESS_BYTES", "GROUP_HANDLE_SIZE", "HMAC_PROOF_LENGTH", "SCOPE_BUFFER_LENGTH", "validateByteLength", "validateChainId", "validatePrintableLabel", "HMAC_REST_LENGTH", "validateEditExternalAddressIdentifierInput", "input", "family", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ContactsValidationError as n}from"../../../app-binder/model/contactsValidation";import{validateEditExternalAddressIdentifierInput as t}from"./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(t(r)).toBeNull()}),it("rejects an empty contactName",()=>{const e=t({...r,contactName:""});expect(e).toBeInstanceOf(n)}),it("rejects a non-printable scope",()=>{const e=t({...r,scope:"caf\xE9"});expect(e).toBeInstanceOf(n)}),it("rejects an unsupported blockchain family",()=>{const e=t({...r,blockchainFamily:"dogecoin"});expect(e).toBeInstanceOf(n)}),it("rejects a previousIdentifier of the wrong length for Ethereum",()=>{const e=t({...r,previousIdentifier:new Uint8Array(19).fill(17)});expect(e).toBeInstanceOf(n)}),it("rejects a newIdentifier of the wrong length for Ethereum",()=>{const e=t({...r,newIdentifier:new Uint8Array(21).fill(34)});expect(e).toBeInstanceOf(n)}),it("requires chainId for the Ethereum family",()=>{const e=t({...r,chainId:void 0});expect(e).toBeInstanceOf(n)}),it("rejects a groupHandle of the wrong length",()=>{const e=t({...r,groupHandle:new Uint8Array(63).fill(204)});expect(e).toBeInstanceOf(n)}),it("rejects an hmacProof of the wrong length",()=>{const e=t({...r,hmacProof:new Uint8Array(31).fill(221)});expect(e).toBeInstanceOf(n)}),it("rejects an hmacRest of the wrong length",()=>{const e=t({...r,hmacRest:new Uint8Array(33).fill(170)});expect(e).toBeInstanceOf(n)})});
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,OAAS,2BAAAA,MAA+B,gDAExC,OAAS,8CAAAC,MAAkD,+CAE3D,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,OAAOD,EAA2CC,CAAW,CAAC,EAAE,SAAS,CAC3E,CAAC,EAED,GAAG,+BAAgC,IAAM,CACvC,MAAMC,EAAQF,EAA2C,CACvD,GAAGC,EACH,YAAa,EACf,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,gCAAiC,IAAM,CACxC,MAAMG,EAAQF,EAA2C,CACvD,GAAGC,EACH,MAAO,SACT,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMG,EAAQF,EAA2C,CACvD,GAAGC,EACH,iBAAkB,UACpB,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,gEAAiE,IAAM,CACxE,MAAMG,EAAQF,EAA2C,CACvD,GAAGC,EACH,mBAAoB,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,CAClD,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,2DAA4D,IAAM,CACnE,MAAMG,EAAQF,EAA2C,CACvD,GAAGC,EACH,cAAe,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,CAC7C,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMG,EAAQF,EAA2C,CACvD,GAAGC,EACH,QAAS,MACX,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,4CAA6C,IAAM,CACpD,MAAMG,EAAQF,EAA2C,CACvD,GAAGC,EACH,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CAC3C,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMG,EAAQF,EAA2C,CACvD,GAAGC,EACH,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACzC,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,0CAA2C,IAAM,CAClD,MAAMG,EAAQF,EAA2C,CACvD,GAAGC,EACH,SAAU,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACxC,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,CACH,CAAC",
6
+ "names": ["ContactsValidationError", "validateEditExternalAddressIdentifierInput", "VALID_INPUT", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{isSuccessCommandResult as l,OpenAppDeviceAction as u,UnknownDAError as c,UserInteractionRequired as p,WaitForAppAndVersionDeviceAction as S,XStateDeviceAction as A}from"@ledgerhq/device-management-kit";import{Left as E,Right as m}from"purify-ts";import{assign as n,fromPromise as h,setup as g}from"xstate";import{isContactsSupportedForSession as D}from"../../../app-binder/isContactsSupportedForSession";import{ContactsVersionRequirementError as I}from"../../../app-binder/model/contactsErrors";import{SendEditExternalAddressScopeTask as x}from"../../../app-binder/task/SendEditExternalAddressScopeTask";import{validateEditExternalAddressScopeInput as y}from"./validateEditExternalAddressScopeInput";class O extends A{makeStateMachine(o){const{isSupported:s,editScope:d}=this.extractDependencies(o),r=this.input.appName;return g({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new u({input:{appName:r}}).makeStateMachine(o),waitForAppAndVersionStateMachine:new S({input:{}}).makeStateMachine(o),editScope:h(({input:e})=>d(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&&s(t)}},actions:{assignValidationError:n({_internalState:({context:e})=>{const t=y(e.input);return t?{...e._internalState,error:t}:e._internalState}}),assignVersionError:n({_internalState:({context:e})=>({...e._internalState,error:new I})}),assignErrorFromEvent:n({_internalState:({context:e,event:t})=>({...e._internalState,error:new c(t.error instanceof Error?t.error.message:String(t.error))})})}}).createMachine({id:"EditExternalAddressScopeDeviceAction",initial:"InitialState",context:({input:e})=>({input:e,intermediateValue:{requiredUserInteraction:p.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:n({intermediateValue:({event:e})=>e.snapshot.context.intermediateValue})},onDone:{target:"CheckOpenAppResult",actions:n({_internalState:({event:e,context:t})=>e.output.caseOf({Right:()=>t._internalState,Left:a=>({...t._internalState,error:a})})})}}},CheckOpenAppResult:{always:[{target:"ValidateInput",guard:"noInternalError"},{target:"Error"}]},ValidateInput:{entry:"assignValidationError",always:[{target:"WaitForAppAndVersion",guard:"noInternalError"},{target:"Error"}]},WaitForAppAndVersion:{entry:n({intermediateValue:{requiredUserInteraction:p.None}}),invoke:{id:"waitForAppAndVersion",src:"waitForAppAndVersionStateMachine",input:()=>({}),onSnapshot:{actions:n({intermediateValue:({event:e})=>e.snapshot.context.intermediateValue})},onDone:{target:"CheckAppAndVersion",actions:n({_internalState:({event:e,context:t})=>e.output.caseOf({Right:a=>({...t._internalState,appAndVersion:{name:a.name,version:a.version}}),Left:a=>({...t._internalState,error:a})})})}}},CheckAppAndVersion:{always:[{target:"VersionGuard",guard:"noInternalError"},{target:"Error"}]},VersionGuard:{always:[{target:"EditScope",guard:"contactsSupported"},{target:"Error",actions:"assignVersionError"}]},EditScope:{entry:n({intermediateValue:{requiredUserInteraction:p.RegisterWallet}}),exit:n({intermediateValue:{requiredUserInteraction:p.None}}),invoke:{id:"editScope",src:"editScope",input:({context:e})=>e.input,onDone:{target:"EditScopeResultCheck",actions:n({_internalState:({event:e,context:t})=>l(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:a}=e._internalState;if(t){const{input:i}=e;return m({contactName:i.contactName,previousScope:i.previousScope,scope:i.newScope,identifier:i.identifier,blockchainFamily:i.blockchainFamily,chainId:i.chainId,groupHandle:i.groupHandle,hmacProof:i.hmacProof,hmacRest:t})}return E(a??new c("No error in final state"))}})}extractDependencies(o){return{isSupported:r=>D(o,r),editScope:r=>new x(o,{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()}}}export{O as 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 isContactsSupportedForSession,\n type RunningApp,\n} from \"@internal/app-binder/isContactsSupportedForSession\";\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 isContactsSupportedForSession(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": "AAAA,OAGE,0BAAAA,EACA,uBAAAC,EAEA,kBAAAC,EACA,2BAAAC,EACA,oCAAAC,EACA,sBAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAC5B,OAAS,UAAAC,EAAQ,eAAAC,EAAa,SAAAC,MAAa,SAS3C,OACE,iCAAAC,MAEK,qDACP,OAAS,mCAAAC,MAAuC,4CAChD,OAEE,oCAAAC,MACK,6DAEP,OAAS,yCAAAC,MAA6C,0CAS/C,MAAMC,UAA6CV,CAMxD,CACA,iBACEW,EAOA,CASA,KAAM,CAAE,YAAAC,EAAa,UAAAC,CAAU,EAAI,KAAK,oBAAoBF,CAAW,EACjEG,EAAU,KAAK,MAAM,QAE3B,OAAOT,EAAM,CACX,MAAO,CACL,MAAO,CAAC,EACR,QAAS,CAAC,EACV,OAAQ,CAAC,CACX,EACA,OAAQ,CACN,oBAAqB,IAAIT,EAAoB,CAC3C,MAAO,CAAE,QAAAkB,CAAQ,CACnB,CAAC,EAAE,iBAAiBH,CAAW,EAC/B,iCAAkC,IAAIZ,EAAiC,CACrE,MAAO,CAAC,CACV,CAAC,EAAE,iBAAiBY,CAAW,EAC/B,UAAWP,EACT,CAAC,CAAE,MAAAW,CAAM,IACPF,EAAUE,CAAK,CACnB,CACF,EACA,OAAQ,CACN,YAAa,CAAC,CAAE,QAAAC,CAAQ,IAAMA,EAAQ,MAAM,cAAgB,GAC5D,gBAAiB,CAAC,CAAE,QAAAA,CAAQ,IAAMA,EAAQ,eAAe,QAAU,KACnE,kBAAmB,CAAC,CAAE,QAAAA,CAAQ,IAAM,CAClC,KAAM,CAAE,cAAAC,CAAc,EAAID,EAAQ,eAClC,OAAOC,IAAkB,MAAQL,EAAYK,CAAa,CAC5D,CACF,EACA,QAAS,CACP,sBAAuBd,EAAO,CAC5B,eAAgB,CAAC,CAAE,QAAAa,CAAQ,IAAM,CAC/B,MAAME,EAAQT,EAAsCO,EAAQ,KAAK,EACjE,OAAOE,EACH,CAAE,GAAGF,EAAQ,eAAgB,MAAAE,CAAM,EACnCF,EAAQ,cACd,CACF,CAAC,EACD,mBAAoBb,EAAO,CACzB,eAAgB,CAAC,CAAE,QAAAa,CAAQ,KAAO,CAChC,GAAGA,EAAQ,eACX,MAAO,IAAIT,CACb,EACF,CAAC,EACD,qBAAsBJ,EAAO,CAC3B,eAAgB,CAAC,CAAE,QAAAa,EAAS,MAAAG,CAAM,KAAO,CACvC,GAAGH,EAAQ,eACX,MAAO,IAAInB,EACTsB,EAAM,iBAAoB,MACtBA,EAAM,MAAS,QACf,OAAOA,EAAM,KAAQ,CAC3B,CACF,EACF,CAAC,CACH,CACF,CAAC,EAAE,cAAc,CACf,GAAI,uCACJ,QAAS,eACT,QAAS,CAAC,CAAE,MAAAJ,CAAM,KAAO,CACvB,MAAAA,EACA,kBAAmB,CACjB,wBAAyBjB,EAAwB,IACnD,EACA,eAAgB,CACd,MAAO,KACP,cAAe,KACf,SAAU,IACZ,CACF,GACA,OAAQ,CACN,aAAc,CACZ,OAAQ,CACN,CAAE,OAAQ,gBAAiB,MAAO,aAAc,EAChD,CAAE,OAAQ,qBAAsB,CAClC,CACF,EACA,oBAAqB,CACnB,OAAQ,CACN,GAAI,sBACJ,IAAK,sBACL,MAAO,KAAO,CAAE,QAAAgB,CAAQ,GACxB,WAAY,CACV,QAASX,EAAO,CACd,kBAAmB,CAAC,CAAE,MAAAgB,CAAM,IAC1BA,EAAM,SAAS,QAAQ,iBAC3B,CAAC,CACH,EACA,OAAQ,CACN,OAAQ,qBACR,QAAShB,EAAO,CACd,eAAgB,CAAC,CAAE,MAAAgB,EAAO,QAAAH,CAAQ,IAChCG,EAAM,OAAO,OAAgD,CAC3D,MAAO,IAAMH,EAAQ,eACrB,KAAOE,IAAW,CAAE,GAAGF,EAAQ,eAAgB,MAAAE,CAAM,EACvD,CAAC,CACL,CAAC,CACH,CACF,CACF,EACA,mBAAoB,CAClB,OAAQ,CACN,CAAE,OAAQ,gBAAiB,MAAO,iBAAkB,EACpD,CAAE,OAAQ,OAAQ,CACpB,CACF,EAKA,cAAe,CACb,MAAO,wBACP,OAAQ,CACN,CAAE,OAAQ,uBAAwB,MAAO,iBAAkB,EAC3D,CAAE,OAAQ,OAAQ,CACpB,CACF,EAKA,qBAAsB,CAGpB,MAAOf,EAAO,CACZ,kBAAmB,CACjB,wBAAyBL,EAAwB,IACnD,CACF,CAAC,EACD,OAAQ,CACN,GAAI,uBACJ,IAAK,mCACL,MAAO,KAAO,CAAC,GAIf,WAAY,CACV,QAASK,EAAO,CACd,kBAAmB,CAAC,CAAE,MAAAgB,CAAM,IAC1BA,EAAM,SAAS,QAAQ,iBAC3B,CAAC,CACH,EACA,OAAQ,CACN,OAAQ,qBACR,QAAShB,EAAO,CACd,eAAgB,CAAC,CAAE,MAAAgB,EAAO,QAAAH,CAAQ,IAChCG,EAAM,OAAO,OAAgD,CAC3D,MAAQF,IAAmB,CACzB,GAAGD,EAAQ,eACX,cAAe,CACb,KAAMC,EAAc,KACpB,QAASA,EAAc,OACzB,CACF,GACA,KAAOC,IAAW,CAAE,GAAGF,EAAQ,eAAgB,MAAAE,CAAM,EACvD,CAAC,CACL,CAAC,CACH,CACF,CACF,EACA,mBAAoB,CAClB,OAAQ,CACN,CAAE,OAAQ,eAAgB,MAAO,iBAAkB,EACnD,CAAE,OAAQ,OAAQ,CACpB,CACF,EAGA,aAAc,CACZ,OAAQ,CACN,CAAE,OAAQ,YAAa,MAAO,mBAAoB,EAClD,CAAE,OAAQ,QAAS,QAAS,oBAAqB,CACnD,CACF,EACA,UAAW,CACT,MAAOf,EAAO,CACZ,kBAAmB,CACjB,wBAAyBL,EAAwB,cACnD,CACF,CAAC,EACD,KAAMK,EAAO,CACX,kBAAmB,CACjB,wBAAyBL,EAAwB,IACnD,CACF,CAAC,EACD,OAAQ,CACN,GAAI,YACJ,IAAK,YACL,MAAO,CAAC,CAAE,QAAAkB,CAAQ,IAAMA,EAAQ,MAChC,OAAQ,CACN,OAAQ,uBACR,QAASb,EAAO,CACd,eAAgB,CAAC,CAAE,MAAAgB,EAAO,QAAAH,CAAQ,IAChCrB,EAAuBwB,EAAM,MAAM,EAC/B,CACE,GAAGH,EAAQ,eACX,SAAUG,EAAM,OAAO,KAAK,QAC9B,EACA,CACE,GAAGH,EAAQ,eACX,MAAOG,EAAM,OAAO,KACtB,CACR,CAAC,CACH,EACA,QAAS,CACP,OAAQ,QACR,QAAS,sBACX,CACF,CACF,EACA,qBAAsB,CACpB,OAAQ,CACN,CAAE,OAAQ,UAAW,MAAO,iBAAkB,EAC9C,CAAE,OAAQ,OAAQ,CACpB,CACF,EACA,QAAS,CAAE,KAAM,OAAQ,EACzB,MAAO,CAAE,KAAM,OAAQ,CACzB,EACA,OAAQ,CAAC,CAAE,QAAAH,CAAQ,IAAM,CACvB,KAAM,CAAE,SAAAI,EAAU,MAAAF,CAAM,EAAIF,EAAQ,eACpC,GAAII,EAAU,CACZ,KAAM,CAAE,MAAAL,CAAM,EAAIC,EAClB,OAAOd,EAAM,CACX,YAAaa,EAAM,YACnB,cAAeA,EAAM,cACrB,MAAOA,EAAM,SACb,WAAYA,EAAM,WAClB,iBAAkBA,EAAM,iBACxB,QAASA,EAAM,QACf,YAAaA,EAAM,YAGnB,UAAWA,EAAM,UACjB,SAAAK,CACF,CAAC,CACH,CACA,OAAOnB,EAAKiB,GAAS,IAAIrB,EAAe,yBAAyB,CAAC,CACpE,CACF,CAAC,CACH,CAEA,oBACEc,EAC6C,CAmB7C,MAAO,CAAE,YAlBYU,GACnBf,EAA8BK,EAAaU,CAAG,EAiB1B,UAdpBN,GAEA,IAAIP,EAAiCG,EAAa,CAChD,YAAaI,EAAM,YACnB,cAAeA,EAAM,cACrB,SAAUA,EAAM,SAChB,WAAYA,EAAM,WAClB,iBAAkBA,EAAM,iBACxB,QAASA,EAAM,QACf,YAAaA,EAAM,YACnB,UAAWA,EAAM,UACjB,SAAUA,EAAM,QAClB,CAAC,EAAE,IAAI,CAEuB,CAClC,CACF",
6
+ "names": ["isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "WaitForAppAndVersionDeviceAction", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "isContactsSupportedForSession", "ContactsVersionRequirementError", "SendEditExternalAddressScopeTask", "validateEditExternalAddressScopeInput", "EditExternalAddressScopeDeviceAction", "internalApi", "isSupported", "editScope", "appName", "input", "context", "appAndVersion", "error", "event", "hmacRest", "app"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{CommandResultFactory as V,DeviceActionStatus as e,DeviceModelId as C,DeviceSessionStateType as y,DeviceStatus as R,UnknownDAError as h,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{beforeEach as q,describe as N,it as c,vi as m}from"vitest";import{makeDeviceActionInternalApiMock as w}from"../../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupOpenAppDAMock as p}from"../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock";import{setupWaitForAppAndVersionDAMock as v}from"../../../app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock";import{testDeviceActionStates as u}from"../../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{ContactsCommandError as H,ContactsVersionRequirementError as M}from"../../../app-binder/model/contactsErrors";import{EditExternalAddressScopeDeviceAction as T}from"./EditExternalAddressScopeDeviceAction";import{validateEditExternalAddressScopeInput as P}from"./validateEditExternalAddressScopeInput";m.mock("@ledgerhq/device-management-kit",async a=>({...await a(),OpenAppDeviceAction:m.fn(()=>({makeStateMachine:m.fn()})),WaitForAppAndVersionDeviceAction:m.fn(()=>({makeStateMachine:m.fn()}))}));const g={name:"Ethereum",version:"1.15.0"},k=new Uint8Array(64).fill(204),x=new Uint8Array(32).fill(221),U=new Uint8Array(32).fill(170),f=new Uint8Array(32).fill(136),I=new Uint8Array(20).fill(17),B={hmacRest:f},l={contactName:"Alice",previousScope:"Eth main",newScope:"Eth cold",identifier:I,blockchainFamily:"ethereum",chainId:1n,groupHandle:k,hmacProof:x,hmacRest:U,appName:"Ethereum"},E={contactName:"Alice",previousScope:"Eth main",scope:"Eth cold",identifier:I,blockchainFamily:"ethereum",chainId:1n,groupHandle:k,hmacProof:x,hmacRest:f};N("EditExternalAddressScopeDeviceAction",()=>{let a,A,D;function O(){return{isSupported:A,editScope:D}}q(()=>{a=w(),v(g),A=m.fn().mockReturnValue(!0),D=m.fn().mockResolvedValue(V({data:B})),a.getDeviceSessionState.mockReturnValue({sessionStateType:y.ReadyWithoutSecureChannel,deviceStatus:R.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:C.FLEX,isSecureConnectionAllowed:!0})});function d(o){const n=new T({input:o});return m.spyOn(n,"extractDependencies").mockReturnValue(O()),n}c("open-app path: OpenApp -> VersionGuard -> EditScope -> Completed",()=>new Promise((o,n)=>{p();const r=d({...l,skipOpenApp:!1}),i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:E,status:e.Completed}];u(r,i,a,{onDone:o,onError:n})})),c("skip-open-app path: VersionGuard -> EditScope -> Completed, preserving the group proof and identifier",()=>new Promise((o,n)=>{p();const r=d({...l,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:E,status:e.Completed}];u(r,i,a,{onDone:()=>{try{expect(E.hmacProof).toBe(x),expect(E.identifier).toBe(I),expect(E.hmacRest).toBe(f),expect(E.hmacRest).not.toBe(U),o()}catch(s){n(s)}},onError:n})})),c("version guard rejects on skip-open-app path without running EDIT SCOPE",()=>new Promise((o,n)=>{p(),A.mockReturnValue(!1);const r=d({...l,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:new M,status:e.Error}];u(r,i,a,{onDone:o,onError:n}),expect(D).not.toHaveBeenCalled()})),c("surfaces an open-app failure as the device action error",()=>new Promise((o,n)=>{const r=new h("open app failed");p(r);const i=d({...l,skipOpenApp:!1}),s=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{error:r,status:e.Error}];u(i,s,a,{onDone:o,onError:n}),expect(A).not.toHaveBeenCalled()})),c("surfaces an Edit Scope command error",()=>new Promise((o,n)=>{p();const r=new H({errorCode:"6982",message:"seed mismatch"});D.mockResolvedValue(V({error:r}));const i=d({...l,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{error:r,status:e.Error}];u(i,s,a,{onDone:o,onError:n})})),c("surfaces invalid input as a typed error state on the skip-open-app path",()=>new Promise((o,n)=>{p();const r={...l,skipOpenApp:!0,contactName:""},i=P(r),s=d(r),S=[{error:i,status:e.Error}];u(s,S,a,{onDone:o,onError:n}),expect(A).not.toHaveBeenCalled(),expect(D).not.toHaveBeenCalled()})),c("validates only after opening the app on the default path",()=>new Promise((o,n)=>{p();const r={...l,skipOpenApp:!1,contactName:""},i=P(r),s=d(r),S=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{error:i,status:e.Error}];u(s,S,a,{onDone:o,onError:n}),expect(D).not.toHaveBeenCalled()})),c("evaluates support from the fresh WaitForAppAndVersion result, not stale session state",()=>new Promise((o,n)=>{p();const r={name:"Ethereum",version:"9.9.9"};v(r);const i=d({...l,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:E,status:e.Completed}];u(i,s,a,{onDone:()=>{try{expect(A).toHaveBeenCalledWith(r),o()}catch(S){n(S)}},onError:n})})),c("surfaces a WaitForAppAndVersion failure as the device action error",()=>new Promise((o,n)=>{p();const r=new h("could not read app and version");v({error:r});const i=d({...l,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:r,status:e.Error}];u(i,s,a,{onDone:o,onError:n}),expect(A).not.toHaveBeenCalled(),expect(D).not.toHaveBeenCalled()})),c("propagates the UnlockDevice interaction emitted by WaitForAppAndVersion",()=>new Promise((o,n)=>{p(),v(g,t.UnlockDevice);const r=d({...l,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.UnlockDevice},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:E,status:e.Completed}];u(r,i,a,{onDone:o,onError:n})}))});
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": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "UnknownDAError", "UserInteractionRequired", "beforeEach", "describe", "it", "vi", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "setupWaitForAppAndVersionDAMock", "testDeviceActionStates", "ContactsCommandError", "ContactsVersionRequirementError", "EditExternalAddressScopeDeviceAction", "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
+ import{BLOCKCHAIN_FAMILY_BY_NAME as n}from"../../../app-binder/model/contactsConstants";import{CONTACT_NAME_BUFFER_LENGTH as c,ContactsValidationError as r,ETH_ADDRESS_BYTES as f,GROUP_HANDLE_SIZE as l,HMAC_PROOF_LENGTH as d,SCOPE_BUFFER_LENGTH as a,validateByteLength as i,validateChainId as h,validatePrintableLabel as o}from"../../../app-binder/model/contactsValidation";const s=d;function _(e){try{o(e.contactName,{field:"contactName",bufferLength:c}),o(e.previousScope,{field:"previousScope",bufferLength:a}),o(e.newScope,{field:"newScope",bufferLength:a});const t=e.blockchainFamily.toLowerCase();if(!(t in n))throw new r(`Unsupported blockchain family: ${e.blockchainFamily}`);if(t==="ethereum"){if(i(e.identifier,{field:"identifier",expectedBytes:f}),e.chainId===void 0)throw new r("chainId is required for the Ethereum blockchain family.")}else if(e.identifier.length===0)throw new r("identifier must not be empty.");return e.chainId!==void 0&&h(e.chainId),i(e.groupHandle,{field:"groupHandle",expectedBytes:l}),i(e.hmacProof,{field:"hmacProof",expectedBytes:d}),i(e.hmacRest,{field:"hmacRest",expectedBytes:s}),null}catch(t){if(t instanceof r)return t;throw t}}export{_ as 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": "AACA,OAAS,6BAAAA,MAAiC,+CAC1C,OACE,8BAAAC,EACA,2BAAAC,EACA,qBAAAC,EACA,qBAAAC,EACA,qBAAAC,EACA,uBAAAC,EACA,sBAAAC,EACA,mBAAAC,EACA,0BAAAC,MACK,gDAGP,MAAMC,EAAmBL,EAOlB,SAASM,EACdC,EACgC,CAChC,GAAI,CACFH,EAAuBG,EAAM,YAAa,CACxC,MAAO,cACP,aAAcX,CAChB,CAAC,EACDQ,EAAuBG,EAAM,cAAe,CAC1C,MAAO,gBACP,aAAcN,CAChB,CAAC,EACDG,EAAuBG,EAAM,SAAU,CACrC,MAAO,WACP,aAAcN,CAChB,CAAC,EAED,MAAMO,EAASD,EAAM,iBAAiB,YAAY,EAClD,GAAI,EAAEC,KAAUb,GACd,MAAM,IAAIE,EACR,kCAAkCU,EAAM,gBAAgB,EAC1D,EAEF,GAAIC,IAAW,YAOb,GANAN,EAAmBK,EAAM,WAAY,CACnC,MAAO,aACP,cAAeT,CACjB,CAAC,EAGGS,EAAM,UAAY,OACpB,MAAM,IAAIV,EACR,yDACF,UAGEU,EAAM,WAAW,SAAW,EAC9B,MAAM,IAAIV,EAAwB,+BAA+B,EAIrE,OAAIU,EAAM,UAAY,QACpBJ,EAAgBI,EAAM,OAAO,EAG/BL,EAAmBK,EAAM,YAAa,CACpC,MAAO,cACP,cAAeR,CACjB,CAAC,EACDG,EAAmBK,EAAM,UAAW,CAClC,MAAO,YACP,cAAeP,CACjB,CAAC,EACDE,EAAmBK,EAAM,SAAU,CACjC,MAAO,WACP,cAAeF,CACjB,CAAC,EAEM,IACT,OAASI,EAAO,CACd,GAAIA,aAAiBZ,EACnB,OAAOY,EAET,MAAMA,CACR,CACF",
6
+ "names": ["BLOCKCHAIN_FAMILY_BY_NAME", "CONTACT_NAME_BUFFER_LENGTH", "ContactsValidationError", "ETH_ADDRESS_BYTES", "GROUP_HANDLE_SIZE", "HMAC_PROOF_LENGTH", "SCOPE_BUFFER_LENGTH", "validateByteLength", "validateChainId", "validatePrintableLabel", "HMAC_REST_LENGTH", "validateEditExternalAddressScopeInput", "input", "family", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ContactsValidationError as r}from"../../../app-binder/model/contactsValidation";import{validateEditExternalAddressScopeInput as t}from"./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(t(n)).toBeNull()}),it("rejects an empty contactName",()=>{const e=t({...n,contactName:""});expect(e).toBeInstanceOf(r)}),it("rejects a non-printable previousScope",()=>{const e=t({...n,previousScope:"caf\xE9"});expect(e).toBeInstanceOf(r)}),it("rejects a non-printable newScope",()=>{const e=t({...n,newScope:"caf\xE9"});expect(e).toBeInstanceOf(r)}),it("rejects an unsupported blockchain family",()=>{const e=t({...n,blockchainFamily:"dogecoin"});expect(e).toBeInstanceOf(r)}),it("rejects an identifier of the wrong length for Ethereum",()=>{const e=t({...n,identifier:new Uint8Array(19).fill(17)});expect(e).toBeInstanceOf(r)}),it("requires chainId for the Ethereum family",()=>{const e=t({...n,chainId:void 0});expect(e).toBeInstanceOf(r)}),it("rejects a groupHandle of the wrong length",()=>{const e=t({...n,groupHandle:new Uint8Array(63).fill(204)});expect(e).toBeInstanceOf(r)}),it("rejects an hmacProof of the wrong length",()=>{const e=t({...n,hmacProof:new Uint8Array(31).fill(221)});expect(e).toBeInstanceOf(r)}),it("rejects an hmacRest of the wrong length",()=>{const e=t({...n,hmacRest:new Uint8Array(33).fill(170)});expect(e).toBeInstanceOf(r)})});
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,OAAS,2BAAAA,MAA+B,gDAExC,OAAS,yCAAAC,MAA6C,0CAEtD,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,OAAOD,EAAsCC,CAAW,CAAC,EAAE,SAAS,CACtE,CAAC,EAED,GAAG,+BAAgC,IAAM,CACvC,MAAMC,EAAQF,EAAsC,CAClD,GAAGC,EACH,YAAa,EACf,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,wCAAyC,IAAM,CAChD,MAAMG,EAAQF,EAAsC,CAClD,GAAGC,EACH,cAAe,SACjB,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,mCAAoC,IAAM,CAC3C,MAAMG,EAAQF,EAAsC,CAClD,GAAGC,EACH,SAAU,SACZ,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMG,EAAQF,EAAsC,CAClD,GAAGC,EACH,iBAAkB,UACpB,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,yDAA0D,IAAM,CACjE,MAAMG,EAAQF,EAAsC,CAClD,GAAGC,EACH,WAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,CAC1C,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMG,EAAQF,EAAsC,CAClD,GAAGC,EACH,QAAS,MACX,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,4CAA6C,IAAM,CACpD,MAAMG,EAAQF,EAAsC,CAClD,GAAGC,EACH,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CAC3C,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMG,EAAQF,EAAsC,CAClD,GAAGC,EACH,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACzC,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,EAED,GAAG,0CAA2C,IAAM,CAClD,MAAMG,EAAQF,EAAsC,CAClD,GAAGC,EACH,SAAU,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACxC,CAAC,EACD,OAAOC,CAAK,EAAE,eAAeH,CAAuB,CACtD,CAAC,CACH,CAAC",
6
+ "names": ["ContactsValidationError", "validateEditExternalAddressScopeInput", "VALID_INPUT", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{GoToDashboardDeviceAction as m,isSuccessCommandResult as p,UnknownDAError as u,UserInteractionRequired as i,XStateDeviceAction as l}from"@ledgerhq/device-management-kit";import{Left as d,Right as C}from"purify-ts";import{assign as a,fromPromise as R,setup as S}from"xstate";import{isContactsOsSupportedForSession as D}from"../../../app-binder/isContactsSupportedForSession";import{ContactsVersionRequirementError as g}from"../../../app-binder/model/contactsErrors";import{SendRenameContactTask as A}from"../../../app-binder/task/SendRenameContactTask";import{validateRenameContactInput as I}from"./validateRenameContactInput";class k extends l{makeStateMachine(n){const{isOsSupported:c,renameContact:s}=this.extractDependencies(n);return S({types:{input:{},context:{},output:{}},actors:{goToDashboardStateMachine:new m({input:{}}).makeStateMachine(n),renameContact:R(({input:t})=>s(t))},guards:{noInternalError:({context:t})=>t._internalState.error===null,contactsOsSupported:()=>c()},actions:{assignValidationError:a({_internalState:({context:t})=>{const e=I(t.input);return e?{...t._internalState,error:e}:t._internalState}}),assignVersionError:a({_internalState:({context:t})=>({...t._internalState,error:new g})}),assignErrorFromEvent:a({_internalState:({context:t,event:e})=>({...t._internalState,error:new u(e.error instanceof Error?e.error.message:String(e.error))})})}}).createMachine({id:"RenameContactDeviceAction",initial:"InitialState",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:i.None},_internalState:{error:null,proof:null}}),states:{InitialState:{always:{target:"GoToDashboard"}},GoToDashboard:{invoke:{id:"goToDashboard",src:"goToDashboardStateMachine",input:()=>({}),onSnapshot:{actions:a({intermediateValue:({event:t})=>({requiredUserInteraction:t.snapshot.context.intermediateValue.requiredUserInteraction})})},onDone:{target:"GoToDashboardCheck",actions:a({_internalState:({event:t,context:e})=>t.output.caseOf({Right:()=>e._internalState,Left:r=>({...e._internalState,error:r})})})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},GoToDashboardCheck:{always:[{target:"ValidateInput",guard:"noInternalError"},{target:"Error"}]},ValidateInput:{entry:"assignValidationError",always:[{target:"VersionGuard",guard:"noInternalError"},{target:"Error"}]},VersionGuard:{always:[{target:"RenameContact",guard:"contactsOsSupported"},{target:"Error",actions:"assignVersionError"}]},RenameContact:{entry:a({intermediateValue:{requiredUserInteraction:i.RegisterWallet}}),exit:a({intermediateValue:{requiredUserInteraction:i.None}}),invoke:{id:"renameContact",src:"renameContact",input:({context:t})=>t.input,onDone:{target:"RenameContactResultCheck",actions:a({_internalState:({event:t,context:e})=>p(t.output)?{...e._internalState,proof:t.output.data}:{...e._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},RenameContactResultCheck:{always:[{target:"Success",guard:"noInternalError"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>{const{proof:e,error:r}=t._internalState;if(e){const{input:o}=t;return C({previousContactName:o.previousContactName,contactName:o.newContactName,groupHandle:o.groupHandle,hmacProof:e.hmacProof})}return d(r??new u("No error in final state"))}})}extractDependencies(n){return{isOsSupported:()=>D(n),renameContact:t=>new A(n,{previousContactName:t.previousContactName,newContactName:t.newContactName,groupHandle:t.groupHandle,hmacProof:t.hmacProof}).run()}}}export{k as RenameContactDeviceAction};
2
+ //# sourceMappingURL=RenameContactDeviceAction.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.ts"],
4
+ "sourcesContent": ["import {\n type DeviceActionStateMachine,\n GoToDashboardDeviceAction,\n type InternalApi,\n isSuccessCommandResult,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type RenameContactDAError,\n type RenameContactDAInput,\n type RenameContactDAIntermediateValue,\n type RenameContactDAInternalState,\n type RenameContactDAOutput,\n} from \"@api/app-binder/RenameContactDeviceActionTypes\";\nimport { isContactsOsSupportedForSession } from \"@internal/app-binder/isContactsSupportedForSession\";\nimport { ContactsVersionRequirementError } from \"@internal/app-binder/model/contactsErrors\";\nimport {\n type RenameContactProof,\n SendRenameContactTask,\n} from \"@internal/app-binder/task/SendRenameContactTask\";\n\nimport { validateRenameContactInput } from \"./validateRenameContactInput\";\n\nexport type RenameContactMachineDependencies = {\n readonly isOsSupported: () => boolean;\n readonly renameContact: (\n input: RenameContactDAInput,\n ) => Promise<Awaited<ReturnType<SendRenameContactTask[\"run\"]>>>;\n};\n\nexport class RenameContactDeviceAction extends XStateDeviceAction<\n RenameContactDAOutput,\n RenameContactDAInput,\n RenameContactDAError,\n RenameContactDAIntermediateValue,\n RenameContactDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n RenameContactDAOutput,\n RenameContactDAInput,\n RenameContactDAError,\n RenameContactDAIntermediateValue,\n RenameContactDAInternalState\n > {\n type types = StateMachineTypes<\n RenameContactDAOutput,\n RenameContactDAInput,\n RenameContactDAError,\n RenameContactDAIntermediateValue,\n RenameContactDAInternalState\n >;\n\n const { isOsSupported, renameContact } =\n this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n // Rename is an OS/dashboard command: navigate to the dashboard (which\n // closes any running app) instead of opening an embedded app. There is\n // no OpenAppDeviceAction here by design.\n goToDashboardStateMachine: new GoToDashboardDeviceAction({\n input: {},\n }).makeStateMachine(internalApi),\n renameContact: fromPromise(\n ({ input }: { input: RenameContactDAInput }) => renameContact(input),\n ),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n contactsOsSupported: () => isOsSupported(),\n },\n actions: {\n assignValidationError: assign({\n _internalState: ({ context }) => {\n const error = validateRenameContactInput(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: \"RenameContactDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n proof: null,\n },\n }),\n states: {\n InitialState: {\n always: { target: \"GoToDashboard\" },\n },\n // Always navigate to the dashboard first \u2014 rename is an OS command and\n // must not run inside an app. Closing any running app happens here.\n GoToDashboard: {\n invoke: {\n id: \"goToDashboard\",\n src: \"goToDashboardStateMachine\",\n input: () => ({}),\n onSnapshot: {\n actions: assign({\n // The child surfaces both requiredUserInteraction and a step;\n // only the interaction is part of this action's contract.\n intermediateValue: ({ event }) => ({\n requiredUserInteraction:\n event.snapshot.context.intermediateValue\n .requiredUserInteraction,\n }),\n }),\n },\n onDone: {\n target: \"GoToDashboardCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf<RenameContactDAInternalState>({\n Right: () => context._internalState,\n Left: (error) => ({ ...context._internalState, error }),\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GoToDashboardCheck: {\n always: [\n { target: \"ValidateInput\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n // Input validation runs inside the device action so invalid caller input\n // surfaces as a typed terminal error state on the observable instead of\n // a synchronous throw.\n ValidateInput: {\n entry: \"assignValidationError\",\n always: [\n { target: \"VersionGuard\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n // OS-only version guard: rename is served by the device OS, so only the\n // device model and OS version are checked (no embedded-app version).\n VersionGuard: {\n always: [\n { target: \"RenameContact\", guard: \"contactsOsSupported\" },\n { target: \"Error\", actions: \"assignVersionError\" },\n ],\n },\n RenameContact: {\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: \"renameContact\",\n src: \"renameContact\",\n input: ({ context }) => context.input,\n onDone: {\n target: \"RenameContactResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? { ...context._internalState, proof: event.output.data }\n : {\n ...context._internalState,\n error: event.output.error,\n },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n RenameContactResultCheck: {\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 { proof, error } = context._internalState;\n if (proof) {\n const { input } = context;\n return Right({\n previousContactName: input.previousContactName,\n contactName: input.newContactName,\n groupHandle: input.groupHandle,\n hmacProof: proof.hmacProof,\n });\n }\n return Left(error ?? new UnknownDAError(\"No error in final state\"));\n },\n });\n }\n\n extractDependencies(\n internalApi: InternalApi,\n ): RenameContactMachineDependencies {\n const isOsSupported = () => isContactsOsSupportedForSession(internalApi);\n\n const renameContact = (\n input: RenameContactDAInput,\n ): Promise<Awaited<ReturnType<SendRenameContactTask[\"run\"]>>> =>\n new SendRenameContactTask(internalApi, {\n previousContactName: input.previousContactName,\n newContactName: input.newContactName,\n groupHandle: input.groupHandle,\n hmacProof: input.hmacProof,\n }).run();\n\n return { isOsSupported, renameContact };\n }\n}\n\nexport type { RenameContactProof };\n"],
5
+ "mappings": "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",
6
+ "names": ["GoToDashboardDeviceAction", "isSuccessCommandResult", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "isContactsOsSupportedForSession", "ContactsVersionRequirementError", "SendRenameContactTask", "validateRenameContactInput", "RenameContactDeviceAction", "internalApi", "isOsSupported", "renameContact", "input", "context", "error", "event", "proof"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{CommandResultFactory as C,DeviceActionStatus as e,DeviceModelId as k,DeviceSessionStateType as g,DeviceStatus as E,GoToDashboardDeviceAction as h,OpenAppDeviceAction as R,UnknownDAError as P,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{beforeEach as S,describe as V,expect as s,it as D,vi as c}from"vitest";import{makeDeviceActionInternalApiMock as y}from"../../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupGoToDashboardDAMock as v}from"../../../app-binder/device-action/__test-utils__/setupGoToDashboardDAMock";import{testDeviceActionStates as A}from"../../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{ContactsCommandError as q,ContactsVersionRequirementError as O}from"../../../app-binder/model/contactsErrors";import{RenameContactDeviceAction as w}from"./RenameContactDeviceAction";import{validateRenameContactInput as N}from"./validateRenameContactInput";c.mock("@ledgerhq/device-management-kit",async a=>({...await a(),GoToDashboardDeviceAction:c.fn(()=>({makeStateMachine:c.fn()})),OpenAppDeviceAction:c.fn(()=>({makeStateMachine:c.fn()}))}));const f={hmacProof:new Uint8Array(32).fill(238)},m={previousContactName:"Alice",newContactName:"Bob",groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)},T={previousContactName:"Alice",contactName:"Bob",groupHandle:m.groupHandle,hmacProof:f.hmacProof};V("RenameContactDeviceAction",()=>{let a,d,u;function U(){return{isOsSupported:d,renameContact:u}}S(()=>{c.clearAllMocks(),a=y(),d=c.fn().mockReturnValue(!0),u=c.fn().mockResolvedValue(C({data:f})),a.getDeviceSessionState.mockReturnValue({sessionStateType:g.ReadyWithoutSecureChannel,deviceStatus:E.CONNECTED,installedApps:[],currentApp:{name:"BOLOS",version:"1.7.0"},deviceModelId:k.FLEX,isSecureConnectionAllowed:!0})});function l(r){const n=new w({input:r});return c.spyOn(n,"extractDependencies").mockReturnValue(U()),n}D("navigates to the dashboard, checks the OS, renames, and completes",()=>new Promise((r,n)=>{v({requiredUserInteraction:t.UnlockDevice});const o=l(m),i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.UnlockDevice},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:T,status:e.Completed}];A(o,i,a,{onDone:()=>{s(h).toHaveBeenCalled(),s(R).not.toHaveBeenCalled(),r()},onError:n})})),D("rejects on an unsupported OS version without sending the APDU",()=>new Promise((r,n)=>{v({requiredUserInteraction:t.UnlockDevice}),d.mockReturnValue(!1);const o=l(m),i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.UnlockDevice},status:e.Pending},{error:new O,status:e.Error}];A(o,i,a,{onDone:()=>{s(u).not.toHaveBeenCalled(),s(R).not.toHaveBeenCalled(),r()},onError:n})})),D("surfaces a go-to-dashboard failure as the device action error",()=>new Promise((r,n)=>{const o=new P("go to dashboard failed");v({error:o,requiredUserInteraction:t.UnlockDevice});const i=l(m),p=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.UnlockDevice},status:e.Pending},{error:o,status:e.Error}];A(i,p,a,{onDone:()=>{s(d).not.toHaveBeenCalled(),s(u).not.toHaveBeenCalled(),r()},onError:n})})),D("surfaces a rename command error (e.g. seed mismatch)",()=>new Promise((r,n)=>{v({requiredUserInteraction:t.UnlockDevice});const o=new q({errorCode:"6982",message:"wrong seed"});u.mockResolvedValue(C({error:o}));const i=l(m),p=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.UnlockDevice},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{error:o,status:e.Error}];A(i,p,a,{onDone:r,onError:n})})),D("surfaces invalid input as a typed error after reaching the dashboard",()=>new Promise((r,n)=>{v({requiredUserInteraction:t.UnlockDevice});const o={...m,newContactName:""},i=N(o),p=l(o),I=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.UnlockDevice},status:e.Pending},{error:i,status:e.Error}];A(p,I,a,{onDone:()=>{s(d).not.toHaveBeenCalled(),s(u).not.toHaveBeenCalled(),r()},onError:n})}))});
2
+ //# sourceMappingURL=RenameContactDeviceAction.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.ts"],
4
+ "sourcesContent": ["import {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n GoToDashboardDeviceAction,\n OpenAppDeviceAction,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport {\n type RenameContactDAError,\n type RenameContactDAInput,\n type RenameContactDAIntermediateValue,\n type RenameContactDAOutput,\n} from \"@api/app-binder/RenameContactDeviceActionTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupGoToDashboardDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock\";\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 { RenameContactDeviceAction } from \"./RenameContactDeviceAction\";\nimport { validateRenameContactInput } from \"./validateRenameContactInput\";\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 GoToDashboardDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\nconst OK_PROOF = { hmacProof: new Uint8Array(32).fill(0xee) };\n\nconst BASE_INPUT: RenameContactDAInput = {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n};\n\nconst EXPECTED_OUTPUT: RenameContactDAOutput = {\n previousContactName: \"Alice\",\n contactName: \"Bob\",\n groupHandle: BASE_INPUT.groupHandle,\n hmacProof: OK_PROOF.hmacProof,\n};\n\ndescribe(\"RenameContactDeviceAction\", () => {\n let apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\n let isOsSupportedMock: ReturnType<typeof vi.fn>;\n let renameContactMock: ReturnType<typeof vi.fn>;\n\n function extractDeps() {\n return {\n isOsSupported: isOsSupportedMock,\n renameContact: renameContactMock,\n };\n }\n\n beforeEach(() => {\n vi.clearAllMocks();\n apiMock = makeDeviceActionInternalApiMock();\n isOsSupportedMock = vi.fn().mockReturnValue(true);\n renameContactMock = 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: \"BOLOS\", version: \"1.7.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n });\n\n function makeAction(input: RenameContactDAInput) {\n const action = new RenameContactDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n return action;\n }\n\n it(\"navigates to the dashboard, checks the OS, renames, and completes\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const action = makeAction(BASE_INPUT);\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 RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n // Rename is a dashboard op: it navigates to the dashboard and never\n // opens an app.\n expect(GoToDashboardDeviceAction).toHaveBeenCalled();\n expect(OpenAppDeviceAction).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"rejects on an unsupported OS version without sending the APDU\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n isOsSupportedMock.mockReturnValue(false);\n const action = makeAction(BASE_INPUT);\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 error: new ContactsVersionRequirementError(),\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n expect(renameContactMock).not.toHaveBeenCalled();\n expect(OpenAppDeviceAction).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a go-to-dashboard failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n const dashboardError = new UnknownDAError(\"go to dashboard failed\");\n setupGoToDashboardDAMock({\n error: dashboardError,\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const action = makeAction(BASE_INPUT);\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 error: dashboardError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n expect(isOsSupportedMock).not.toHaveBeenCalled();\n expect(renameContactMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a rename command error (e.g. seed mismatch)\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const commandError = new ContactsCommandError({\n errorCode: \"6982\",\n message: \"wrong seed\",\n });\n renameContactMock.mockResolvedValue(\n CommandResultFactory({ error: commandError }),\n );\n const action = makeAction(BASE_INPUT);\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 error: commandError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\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 after reaching the dashboard\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const invalidInput = { ...BASE_INPUT, newContactName: \"\" };\n const validationError = validateRenameContactInput(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.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n // Validation fails before the version guard and before any APDU.\n expect(isOsSupportedMock).not.toHaveBeenCalled();\n expect(renameContactMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "GoToDashboardDeviceAction", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "beforeEach", "describe", "expect", "it", "vi", "makeDeviceActionInternalApiMock", "setupGoToDashboardDAMock", "testDeviceActionStates", "ContactsCommandError", "ContactsVersionRequirementError", "RenameContactDeviceAction", "validateRenameContactInput", "importOriginal", "OK_PROOF", "BASE_INPUT", "EXPECTED_OUTPUT", "apiMock", "isOsSupportedMock", "renameContactMock", "extractDeps", "makeAction", "input", "action", "resolve", "reject", "expected", "dashboardError", "commandError", "invalidInput", "validationError"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{CONTACT_NAME_BUFFER_LENGTH as a,ContactsValidationError as r,GROUP_HANDLE_SIZE as c,HMAC_PROOF_LENGTH as l,validateByteLength as n,validatePrintableLabel as o}from"../../../app-binder/model/contactsValidation";function f(e){try{return o(e.newContactName,{field:"newContactName",bufferLength:a}),o(e.previousContactName,{field:"previousContactName",bufferLength:a}),n(e.groupHandle,{field:"groupHandle",expectedBytes:c}),n(e.hmacProof,{field:"hmacProof",expectedBytes:l}),null}catch(t){if(t instanceof r)return t;throw t}}export{f as validateRenameContactInput};
2
+ //# sourceMappingURL=validateRenameContactInput.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/RenameContact/validateRenameContactInput.ts"],
4
+ "sourcesContent": ["import { type RenameContactInput } from \"@api/model/RenameContact\";\nimport {\n CONTACT_NAME_BUFFER_LENGTH,\n ContactsValidationError,\n GROUP_HANDLE_SIZE,\n HMAC_PROOF_LENGTH,\n validateByteLength,\n validatePrintableLabel,\n} from \"@internal/app-binder/model/contactsValidation\";\n\n/**\n * Validate the caller input for Rename Contact. Returns the first\n * `ContactsValidationError` found, or `null` when the input is valid.\n *\n * Non-throwing by design: the device action calls this so an invalid input is\n * surfaced as a typed terminal error state on the observable, keeping the public\n * `ContactsManager.renameContact` free of synchronous throws.\n */\nexport function validateRenameContactInput(\n input: RenameContactInput,\n): ContactsValidationError | null {\n try {\n validatePrintableLabel(input.newContactName, {\n field: \"newContactName\",\n bufferLength: CONTACT_NAME_BUFFER_LENGTH,\n });\n validatePrintableLabel(input.previousContactName, {\n field: \"previousContactName\",\n bufferLength: CONTACT_NAME_BUFFER_LENGTH,\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\n return null;\n } catch (error) {\n if (error instanceof ContactsValidationError) {\n return error;\n }\n throw error;\n }\n}\n"],
5
+ "mappings": "AACA,OACE,8BAAAA,EACA,2BAAAC,EACA,qBAAAC,EACA,qBAAAC,EACA,sBAAAC,EACA,0BAAAC,MACK,gDAUA,SAASC,EACdC,EACgC,CAChC,GAAI,CACF,OAAAF,EAAuBE,EAAM,eAAgB,CAC3C,MAAO,iBACP,aAAcP,CAChB,CAAC,EACDK,EAAuBE,EAAM,oBAAqB,CAChD,MAAO,sBACP,aAAcP,CAChB,CAAC,EACDI,EAAmBG,EAAM,YAAa,CACpC,MAAO,cACP,cAAeL,CACjB,CAAC,EACDE,EAAmBG,EAAM,UAAW,CAClC,MAAO,YACP,cAAeJ,CACjB,CAAC,EAEM,IACT,OAASK,EAAO,CACd,GAAIA,aAAiBP,EACnB,OAAOO,EAET,MAAMA,CACR,CACF",
6
+ "names": ["CONTACT_NAME_BUFFER_LENGTH", "ContactsValidationError", "GROUP_HANDLE_SIZE", "HMAC_PROOF_LENGTH", "validateByteLength", "validatePrintableLabel", "validateRenameContactInput", "input", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ContactsValidationError as n}from"../../../app-binder/model/contactsValidation";import{validateRenameContactInput as t}from"./validateRenameContactInput";const e={previousContactName:"Alice",newContactName:"Bob",groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)};describe("validateRenameContactInput",()=>{it("returns null for valid input",()=>{expect(t(e)).toBeNull()}),it("returns a ContactsValidationError for a non-printable new name",()=>{expect(t({...e,newContactName:"Am\xE9lie"})).toBeInstanceOf(n)}),it("returns a ContactsValidationError for a non-printable previous name",()=>{expect(t({...e,previousContactName:"Am\xE9lie"})).toBeInstanceOf(n)}),it("returns an error for an empty new name",()=>{expect(t({...e,newContactName:""})).toBeInstanceOf(n)}),it("returns an error for a group handle of the wrong length",()=>{expect(t({...e,groupHandle:new Uint8Array(63)})).toBeInstanceOf(n)}),it("returns an error for an hmac proof of the wrong length",()=>{expect(t({...e,hmacProof:new Uint8Array(31)})).toBeInstanceOf(n)})});
2
+ //# sourceMappingURL=validateRenameContactInput.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.ts"],
4
+ "sourcesContent": ["import { type RenameContactInput } from \"@api/model/RenameContact\";\nimport { ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\nimport { validateRenameContactInput } from \"./validateRenameContactInput\";\n\nconst VALID_INPUT: RenameContactInput = {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n};\n\ndescribe(\"validateRenameContactInput\", () => {\n it(\"returns null for valid input\", () => {\n expect(validateRenameContactInput(VALID_INPUT)).toBeNull();\n });\n\n it(\"returns a ContactsValidationError for a non-printable new name\", () => {\n expect(\n validateRenameContactInput({ ...VALID_INPUT, newContactName: \"Am\u00E9lie\" }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns a ContactsValidationError for a non-printable previous name\", () => {\n expect(\n validateRenameContactInput({\n ...VALID_INPUT,\n previousContactName: \"Am\u00E9lie\",\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for an empty new name\", () => {\n expect(\n validateRenameContactInput({ ...VALID_INPUT, newContactName: \"\" }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for a group handle of the wrong length\", () => {\n expect(\n validateRenameContactInput({\n ...VALID_INPUT,\n groupHandle: new Uint8Array(63),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for an hmac proof of the wrong length\", () => {\n expect(\n validateRenameContactInput({\n ...VALID_INPUT,\n hmacProof: new Uint8Array(31),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n});\n"],
5
+ "mappings": "AACA,OAAS,2BAAAA,MAA+B,gDAExC,OAAS,8BAAAC,MAAkC,+BAE3C,MAAMC,EAAkC,CACtC,oBAAqB,QACrB,eAAgB,MAChB,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACzC,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACzC,EAEA,SAAS,6BAA8B,IAAM,CAC3C,GAAG,+BAAgC,IAAM,CACvC,OAAOD,EAA2BC,CAAW,CAAC,EAAE,SAAS,CAC3D,CAAC,EAED,GAAG,iEAAkE,IAAM,CACzE,OACED,EAA2B,CAAE,GAAGC,EAAa,eAAgB,WAAS,CAAC,CACzE,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,GAAG,sEAAuE,IAAM,CAC9E,OACEC,EAA2B,CACzB,GAAGC,EACH,oBAAqB,WACvB,CAAC,CACH,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,GAAG,yCAA0C,IAAM,CACjD,OACEC,EAA2B,CAAE,GAAGC,EAAa,eAAgB,EAAG,CAAC,CACnE,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,GAAG,0DAA2D,IAAM,CAClE,OACEC,EAA2B,CACzB,GAAGC,EACH,YAAa,IAAI,WAAW,EAAE,CAChC,CAAC,CACH,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,GAAG,yDAA0D,IAAM,CACjE,OACEC,EAA2B,CACzB,GAAGC,EACH,UAAW,IAAI,WAAW,EAAE,CAC9B,CAAC,CACH,EAAE,eAAeF,CAAuB,CAC1C,CAAC,CACH,CAAC",
6
+ "names": ["ContactsValidationError", "validateRenameContactInput", "VALID_INPUT"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{GoToDashboardDeviceAction as t,UserInteractionRequired as n}from"@ledgerhq/device-management-kit";import{Left as o,Right as i}from"purify-ts";import{assign as a,createMachine as c}from"xstate";const p=(e={})=>{const r=e.requiredUserInteraction??n.None;t.mockImplementation(()=>({makeStateMachine:vi.fn().mockImplementation(()=>c({initial:"pending",states:{pending:{entry:a({intermediateValue:{requiredUserInteraction:r}}),after:{0:"done"}},done:{type:"final"}},output:()=>e.error?o(e.error):i(void 0)}))}))};export{p as setupGoToDashboardDAMock};
2
+ //# sourceMappingURL=setupGoToDashboardDAMock.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.ts"],
4
+ "sourcesContent": ["import {\n GoToDashboardDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { type Mock } from \"vitest\";\nimport { assign, createMachine } from \"xstate\";\n\n/**\n * Mock GoToDashboardDeviceAction to resolve immediately with either success\n * (default) or an error. Emits a single `requiredUserInteraction` snapshot\n * (default `None` \u2014 device assumed unlocked and already ready) so the parent\n * action can surface it, mirroring the real nested device action.\n */\nexport const setupGoToDashboardDAMock = (\n options: {\n error?: unknown;\n requiredUserInteraction?: UserInteractionRequired;\n } = {},\n) => {\n const interaction =\n options.requiredUserInteraction ?? UserInteractionRequired.None;\n (GoToDashboardDeviceAction as Mock).mockImplementation(() => ({\n makeStateMachine: vi.fn().mockImplementation(() =>\n createMachine({\n initial: \"pending\",\n states: {\n pending: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: interaction,\n },\n }),\n after: {\n 0: \"done\",\n },\n },\n done: {\n type: \"final\",\n },\n },\n output: () => (options.error ? Left(options.error) : Right(undefined)),\n }),\n ),\n }));\n};\n"],
5
+ "mappings": "AAAA,OACE,6BAAAA,EACA,2BAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAE5B,OAAS,UAAAC,EAAQ,iBAAAC,MAAqB,SAQ/B,MAAMC,EAA2B,CACtCC,EAGI,CAAC,IACF,CACH,MAAMC,EACJD,EAAQ,yBAA2BN,EAAwB,KAC5DD,EAAmC,mBAAmB,KAAO,CAC5D,iBAAkB,GAAG,GAAG,EAAE,mBAAmB,IAC3CK,EAAc,CACZ,QAAS,UACT,OAAQ,CACN,QAAS,CACP,MAAOD,EAAO,CACZ,kBAAmB,CACjB,wBAAyBI,CAC3B,CACF,CAAC,EACD,MAAO,CACL,EAAG,MACL,CACF,EACA,KAAM,CACJ,KAAM,OACR,CACF,EACA,OAAQ,IAAOD,EAAQ,MAAQL,EAAKK,EAAQ,KAAK,EAAIJ,EAAM,MAAS,CACtE,CAAC,CACH,CACF,EAAE,CACJ",
6
+ "names": ["GoToDashboardDeviceAction", "UserInteractionRequired", "Left", "Right", "assign", "createMachine", "setupGoToDashboardDAMock", "options", "interaction"]
7
+ }