@ledgerhq/device-contacts-kit 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/README.md +29 -2
  2. package/lib/cjs/api/ContactsManager.js +1 -1
  3. package/lib/cjs/api/ContactsManager.js.map +1 -1
  4. package/lib/cjs/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.js +2 -0
  5. package/lib/cjs/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.js.map +7 -0
  6. package/lib/cjs/api/app-binder/EditExternalAddressScopeDeviceActionTypes.js +2 -0
  7. package/lib/cjs/api/app-binder/EditExternalAddressScopeDeviceActionTypes.js.map +7 -0
  8. package/lib/cjs/api/app-binder/RenameContactDeviceActionTypes.js +2 -0
  9. package/lib/cjs/api/app-binder/RenameContactDeviceActionTypes.js.map +7 -0
  10. package/lib/cjs/api/index.js +1 -1
  11. package/lib/cjs/api/index.js.map +2 -2
  12. package/lib/cjs/api/model/EditExternalAddressIdentifier.js +2 -0
  13. package/lib/cjs/api/model/EditExternalAddressIdentifier.js.map +7 -0
  14. package/lib/cjs/api/model/EditExternalAddressScope.js +2 -0
  15. package/lib/cjs/api/model/EditExternalAddressScope.js.map +7 -0
  16. package/lib/cjs/api/model/RenameContact.js +2 -0
  17. package/lib/cjs/api/model/RenameContact.js.map +7 -0
  18. package/lib/cjs/internal/DefaultContactsManager.js +1 -1
  19. package/lib/cjs/internal/DefaultContactsManager.js.map +2 -2
  20. package/lib/cjs/internal/DefaultContactsManager.test.js +1 -1
  21. package/lib/cjs/internal/DefaultContactsManager.test.js.map +3 -3
  22. package/lib/cjs/internal/app-binder/ContactsAppBinder.js +1 -1
  23. package/lib/cjs/internal/app-binder/ContactsAppBinder.js.map +3 -3
  24. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.js +2 -0
  25. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.js.map +7 -0
  26. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js +2 -0
  27. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js.map +7 -0
  28. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.js +2 -0
  29. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.js.map +7 -0
  30. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.test.js +2 -0
  31. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.test.js.map +7 -0
  32. package/lib/cjs/internal/app-binder/command/RenameContactCommand.js +2 -0
  33. package/lib/cjs/internal/app-binder/command/RenameContactCommand.js.map +7 -0
  34. package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js +2 -0
  35. package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js.map +7 -0
  36. package/lib/cjs/internal/app-binder/contactsVersionGuards.js +2 -0
  37. package/lib/cjs/internal/app-binder/contactsVersionGuards.js.map +7 -0
  38. package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js +2 -0
  39. package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js.map +7 -0
  40. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js +2 -0
  41. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js.map +7 -0
  42. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +2 -0
  43. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +7 -0
  44. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js +2 -0
  45. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js.map +7 -0
  46. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +2 -0
  47. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +7 -0
  48. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js +2 -0
  49. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js.map +7 -0
  50. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +2 -0
  51. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +7 -0
  52. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js +2 -0
  53. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js.map +7 -0
  54. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +2 -0
  55. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +7 -0
  56. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js +1 -1
  57. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js.map +3 -3
  58. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +2 -0
  59. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +7 -0
  60. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +2 -0
  61. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +7 -0
  62. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js +2 -0
  63. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js.map +7 -0
  64. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +2 -0
  65. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +7 -0
  66. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +2 -0
  67. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +7 -0
  68. package/lib/cjs/internal/app-binder/model/contactsConstants.js +1 -1
  69. package/lib/cjs/internal/app-binder/model/contactsConstants.js.map +3 -3
  70. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js +2 -0
  71. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js.map +7 -0
  72. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +2 -0
  73. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +7 -0
  74. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.js +2 -0
  75. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.js.map +7 -0
  76. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +2 -0
  77. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +7 -0
  78. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.js +1 -1
  79. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.js.map +2 -2
  80. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js +1 -1
  81. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +2 -2
  82. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js +2 -0
  83. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js.map +7 -0
  84. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js +2 -0
  85. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js.map +7 -0
  86. package/lib/cjs/internal/di.test.js +1 -1
  87. package/lib/cjs/internal/di.test.js.map +3 -3
  88. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.js +2 -0
  89. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.js.map +7 -0
  90. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +2 -0
  91. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +7 -0
  92. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.js +2 -0
  93. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.js.map +7 -0
  94. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js +2 -0
  95. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +7 -0
  96. package/lib/cjs/internal/use-cases/RenameContactUseCase.js +2 -0
  97. package/lib/cjs/internal/use-cases/RenameContactUseCase.js.map +7 -0
  98. package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js +2 -0
  99. package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js.map +7 -0
  100. package/lib/cjs/internal/use-cases/di/useCaseModule.js +1 -1
  101. package/lib/cjs/internal/use-cases/di/useCaseModule.js.map +3 -3
  102. package/lib/cjs/internal/use-cases/di/useCaseTypes.js +1 -1
  103. package/lib/cjs/internal/use-cases/di/useCaseTypes.js.map +2 -2
  104. package/lib/cjs/package.json +1 -1
  105. package/lib/esm/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.js +1 -0
  106. package/lib/esm/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.js.map +7 -0
  107. package/lib/esm/api/app-binder/EditExternalAddressScopeDeviceActionTypes.js +1 -0
  108. package/lib/esm/api/app-binder/EditExternalAddressScopeDeviceActionTypes.js.map +7 -0
  109. package/lib/esm/api/app-binder/RenameContactDeviceActionTypes.js +1 -0
  110. package/lib/esm/api/app-binder/RenameContactDeviceActionTypes.js.map +7 -0
  111. package/lib/esm/api/index.js +1 -1
  112. package/lib/esm/api/index.js.map +2 -2
  113. package/lib/esm/api/model/EditExternalAddressIdentifier.js +1 -0
  114. package/lib/esm/api/model/EditExternalAddressIdentifier.js.map +7 -0
  115. package/lib/esm/api/model/EditExternalAddressScope.js +1 -0
  116. package/lib/esm/api/model/EditExternalAddressScope.js.map +7 -0
  117. package/lib/esm/api/model/RenameContact.js +1 -0
  118. package/lib/esm/api/model/RenameContact.js.map +7 -0
  119. package/lib/esm/internal/DefaultContactsManager.js +1 -1
  120. package/lib/esm/internal/DefaultContactsManager.js.map +2 -2
  121. package/lib/esm/internal/DefaultContactsManager.test.js +1 -1
  122. package/lib/esm/internal/DefaultContactsManager.test.js.map +3 -3
  123. package/lib/esm/internal/app-binder/ContactsAppBinder.js +1 -1
  124. package/lib/esm/internal/app-binder/ContactsAppBinder.js.map +3 -3
  125. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.js +2 -0
  126. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.js.map +7 -0
  127. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js +2 -0
  128. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js.map +7 -0
  129. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.js +2 -0
  130. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.js.map +7 -0
  131. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js +2 -0
  132. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js.map +7 -0
  133. package/lib/esm/internal/app-binder/command/RenameContactCommand.js +2 -0
  134. package/lib/esm/internal/app-binder/command/RenameContactCommand.js.map +7 -0
  135. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js +2 -0
  136. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js.map +7 -0
  137. package/lib/esm/internal/app-binder/contactsVersionGuards.js +2 -0
  138. package/lib/esm/internal/app-binder/contactsVersionGuards.js.map +7 -0
  139. package/lib/esm/internal/app-binder/contactsVersionGuards.test.js +2 -0
  140. package/lib/esm/internal/app-binder/contactsVersionGuards.test.js.map +7 -0
  141. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js +2 -0
  142. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js.map +7 -0
  143. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +2 -0
  144. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +7 -0
  145. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js +2 -0
  146. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.js.map +7 -0
  147. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +2 -0
  148. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +7 -0
  149. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js +2 -0
  150. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js.map +7 -0
  151. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +2 -0
  152. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +7 -0
  153. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js +2 -0
  154. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.js.map +7 -0
  155. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +2 -0
  156. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +7 -0
  157. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js +1 -1
  158. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js.map +3 -3
  159. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +2 -0
  160. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +7 -0
  161. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +2 -0
  162. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +7 -0
  163. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js +2 -0
  164. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js.map +7 -0
  165. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +2 -0
  166. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +7 -0
  167. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +2 -0
  168. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +7 -0
  169. package/lib/esm/internal/app-binder/model/contactsConstants.js +1 -1
  170. package/lib/esm/internal/app-binder/model/contactsConstants.js.map +3 -3
  171. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js +2 -0
  172. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.js.map +7 -0
  173. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +2 -0
  174. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +7 -0
  175. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.js +2 -0
  176. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.js.map +7 -0
  177. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +2 -0
  178. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +7 -0
  179. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.js +1 -1
  180. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.js.map +3 -3
  181. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js +1 -1
  182. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +2 -2
  183. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js +2 -0
  184. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js.map +7 -0
  185. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js +2 -0
  186. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js.map +7 -0
  187. package/lib/esm/internal/di.test.js +1 -1
  188. package/lib/esm/internal/di.test.js.map +3 -3
  189. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.js +2 -0
  190. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.js.map +7 -0
  191. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +2 -0
  192. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +7 -0
  193. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.js +2 -0
  194. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.js.map +7 -0
  195. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js +2 -0
  196. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +7 -0
  197. package/lib/esm/internal/use-cases/RenameContactUseCase.js +2 -0
  198. package/lib/esm/internal/use-cases/RenameContactUseCase.js.map +7 -0
  199. package/lib/esm/internal/use-cases/RenameContactUseCase.test.js +2 -0
  200. package/lib/esm/internal/use-cases/RenameContactUseCase.test.js.map +7 -0
  201. package/lib/esm/internal/use-cases/di/useCaseModule.js +1 -1
  202. package/lib/esm/internal/use-cases/di/useCaseModule.js.map +3 -3
  203. package/lib/esm/internal/use-cases/di/useCaseTypes.js +1 -1
  204. package/lib/esm/internal/use-cases/di/useCaseTypes.js.map +2 -2
  205. package/lib/esm/package.json +1 -1
  206. package/lib/types/api/ContactsManager.d.ts +35 -0
  207. package/lib/types/api/ContactsManager.d.ts.map +1 -1
  208. package/lib/types/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.d.ts +27 -0
  209. package/lib/types/api/app-binder/EditExternalAddressIdentifierDeviceActionTypes.d.ts.map +1 -0
  210. package/lib/types/api/app-binder/EditExternalAddressScopeDeviceActionTypes.d.ts +27 -0
  211. package/lib/types/api/app-binder/EditExternalAddressScopeDeviceActionTypes.d.ts.map +1 -0
  212. package/lib/types/api/app-binder/RenameContactDeviceActionTypes.d.ts +25 -0
  213. package/lib/types/api/app-binder/RenameContactDeviceActionTypes.d.ts.map +1 -0
  214. package/lib/types/api/index.d.ts +6 -0
  215. package/lib/types/api/index.d.ts.map +1 -1
  216. package/lib/types/api/model/EditExternalAddressIdentifier.d.ts +57 -0
  217. package/lib/types/api/model/EditExternalAddressIdentifier.d.ts.map +1 -0
  218. package/lib/types/api/model/EditExternalAddressScope.d.ts +59 -0
  219. package/lib/types/api/model/EditExternalAddressScope.d.ts.map +1 -0
  220. package/lib/types/api/model/RenameContact.d.ts +39 -0
  221. package/lib/types/api/model/RenameContact.d.ts.map +1 -0
  222. package/lib/types/internal/DefaultContactsManager.d.ts +9 -0
  223. package/lib/types/internal/DefaultContactsManager.d.ts.map +1 -1
  224. package/lib/types/internal/app-binder/ContactsAppBinder.d.ts +9 -0
  225. package/lib/types/internal/app-binder/ContactsAppBinder.d.ts.map +1 -1
  226. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.d.ts +25 -0
  227. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.d.ts.map +1 -0
  228. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts +2 -0
  229. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts.map +1 -0
  230. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.d.ts +25 -0
  231. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.d.ts.map +1 -0
  232. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts +2 -0
  233. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts.map +1 -0
  234. package/lib/types/internal/app-binder/command/RenameContactCommand.d.ts +25 -0
  235. package/lib/types/internal/app-binder/command/RenameContactCommand.d.ts.map +1 -0
  236. package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts +2 -0
  237. package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts.map +1 -0
  238. package/lib/types/internal/app-binder/contactsVersionGuards.d.ts +38 -0
  239. package/lib/types/internal/app-binder/contactsVersionGuards.d.ts.map +1 -0
  240. package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts +2 -0
  241. package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts.map +1 -0
  242. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.d.ts +14 -0
  243. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.d.ts.map +1 -0
  244. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts +2 -0
  245. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts.map +1 -0
  246. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.d.ts +9 -0
  247. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.d.ts.map +1 -0
  248. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts +2 -0
  249. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts.map +1 -0
  250. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.d.ts +14 -0
  251. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.d.ts.map +1 -0
  252. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts +2 -0
  253. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts.map +1 -0
  254. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.d.ts +9 -0
  255. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.d.ts.map +1 -0
  256. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts +2 -0
  257. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts.map +1 -0
  258. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.d.ts +1 -1
  259. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.d.ts.map +1 -1
  260. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.d.ts +13 -0
  261. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.d.ts.map +1 -0
  262. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts +2 -0
  263. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts.map +1 -0
  264. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.d.ts +12 -0
  265. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.d.ts.map +1 -0
  266. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts +2 -0
  267. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts.map +1 -0
  268. package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts +12 -0
  269. package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts.map +1 -0
  270. package/lib/types/internal/app-binder/model/contactsConstants.d.ts +26 -0
  271. package/lib/types/internal/app-binder/model/contactsConstants.d.ts.map +1 -1
  272. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.d.ts +25 -0
  273. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.d.ts.map +1 -0
  274. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts +2 -0
  275. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts.map +1 -0
  276. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.d.ts +25 -0
  277. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.d.ts.map +1 -0
  278. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts +2 -0
  279. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts.map +1 -0
  280. package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.d.ts.map +1 -1
  281. package/lib/types/internal/app-binder/task/SendRenameContactTask.d.ts +20 -0
  282. package/lib/types/internal/app-binder/task/SendRenameContactTask.d.ts.map +1 -0
  283. package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts +2 -0
  284. package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts.map +1 -0
  285. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.d.ts +14 -0
  286. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.d.ts.map +1 -0
  287. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts +2 -0
  288. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts.map +1 -0
  289. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.d.ts +14 -0
  290. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.d.ts.map +1 -0
  291. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts +2 -0
  292. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts.map +1 -0
  293. package/lib/types/internal/use-cases/RenameContactUseCase.d.ts +19 -0
  294. package/lib/types/internal/use-cases/RenameContactUseCase.d.ts.map +1 -0
  295. package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts +2 -0
  296. package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts.map +1 -0
  297. package/lib/types/internal/use-cases/di/useCaseModule.d.ts.map +1 -1
  298. package/lib/types/internal/use-cases/di/useCaseTypes.d.ts +3 -0
  299. package/lib/types/internal/use-cases/di/useCaseTypes.d.ts.map +1 -1
  300. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  301. package/package.json +4 -4
  302. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.js +0 -2
  303. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.js.map +0 -7
  304. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.test.js +0 -2
  305. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.test.js.map +0 -7
  306. package/lib/esm/internal/app-binder/isContactsSupportedForSession.js +0 -2
  307. package/lib/esm/internal/app-binder/isContactsSupportedForSession.js.map +0 -7
  308. package/lib/esm/internal/app-binder/isContactsSupportedForSession.test.js +0 -2
  309. package/lib/esm/internal/app-binder/isContactsSupportedForSession.test.js.map +0 -7
  310. package/lib/types/internal/app-binder/isContactsSupportedForSession.d.ts +0 -25
  311. package/lib/types/internal/app-binder/isContactsSupportedForSession.d.ts.map +0 -1
  312. package/lib/types/internal/app-binder/isContactsSupportedForSession.test.d.ts +0 -2
  313. package/lib/types/internal/app-binder/isContactsSupportedForSession.test.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.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 RegisterExternalAddressDAError,\n type RegisterExternalAddressDAInput,\n type RegisterExternalAddressDAIntermediateValue,\n type RegisterExternalAddressDAInternalState,\n type RegisterExternalAddressDAOutput,\n} from \"@api/app-binder/RegisterExternalAddressDeviceActionTypes\";\nimport {\n isContactsSupportedForSession,\n type RunningApp,\n} from \"@internal/app-binder/isContactsSupportedForSession\";\nimport { ContactsVersionRequirementError } from \"@internal/app-binder/model/contactsErrors\";\nimport {\n type RegisterIdentityProofs,\n SendRegisterIdentityTask,\n} from \"@internal/app-binder/task/SendRegisterIdentityTask\";\n\nimport { validateRegisterExternalAddressInput } from \"./validateRegisterExternalAddressInput\";\n\nexport type RegisterExternalAddressMachineDependencies = {\n readonly isSupported: (app: RunningApp) => boolean;\n readonly registerIdentity: (\n input: RegisterExternalAddressDAInput,\n ) => Promise<Awaited<ReturnType<SendRegisterIdentityTask[\"run\"]>>>;\n};\n\nexport class RegisterExternalAddressDeviceAction extends XStateDeviceAction<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAInput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue,\n RegisterExternalAddressDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAInput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue,\n RegisterExternalAddressDAInternalState\n > {\n type types = StateMachineTypes<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAInput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue,\n RegisterExternalAddressDAInternalState\n >;\n\n const { isSupported, registerIdentity } =\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 registerIdentity: fromPromise(\n ({ input }: { input: RegisterExternalAddressDAInput }) =>\n registerIdentity(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 = validateRegisterExternalAddressInput(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: \"RegisterExternalAddressDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n appAndVersion: null,\n proofs: 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<RegisterExternalAddressDAInternalState>({\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<RegisterExternalAddressDAInternalState>({\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: \"RegisterIdentity\", guard: \"contactsSupported\" },\n { target: \"Error\", actions: \"assignVersionError\" },\n ],\n },\n RegisterIdentity: {\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: \"registerIdentity\",\n src: \"registerIdentity\",\n input: ({ context }) => context.input,\n onDone: {\n target: \"RegisterIdentityResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? { ...context._internalState, proofs: 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 RegisterIdentityResultCheck: {\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 { proofs, error } = context._internalState;\n if (proofs) {\n const { input } = context;\n return Right({\n mode: input.existingContactGroup\n ? (\"existingContactGroup\" as const)\n : (\"newContactGroup\" as const),\n contactName: input.contactName,\n scope: input.scope,\n identifier: input.identifier,\n blockchainFamily: input.blockchainFamily,\n chainId: input.chainId,\n groupHandle: proofs.groupHandle,\n hmacProof: proofs.hmacProof,\n hmacRest: proofs.hmacRest,\n });\n }\n return Left(error ?? new UnknownDAError(\"No error in final state\"));\n },\n });\n }\n\n extractDependencies(\n internalApi: InternalApi,\n ): RegisterExternalAddressMachineDependencies {\n const isSupported = (app: RunningApp) =>\n isContactsSupportedForSession(internalApi, app);\n\n const registerIdentity = (\n input: RegisterExternalAddressDAInput,\n ): Promise<Awaited<ReturnType<SendRegisterIdentityTask[\"run\"]>>> =>\n new SendRegisterIdentityTask(internalApi, {\n contactName: input.contactName,\n scope: input.scope,\n identifier: input.identifier,\n blockchainFamily: input.blockchainFamily,\n chainId: input.chainId,\n existingContactGroup: input.existingContactGroup,\n }).run();\n\n return { isSupported, registerIdentity };\n }\n}\n\nexport type { RegisterIdentityProofs };\n"],
5
- "mappings": "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",
6
- "names": ["RegisterExternalAddressDeviceAction_exports", "__export", "RegisterExternalAddressDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_isContactsSupportedForSession", "import_contactsErrors", "import_SendRegisterIdentityTask", "import_validateRegisterExternalAddressInput", "internalApi", "isSupported", "registerIdentity", "appName", "input", "context", "appAndVersion", "error", "event", "proofs", "app"]
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 RegisterExternalAddressDAError,\n type RegisterExternalAddressDAInput,\n type RegisterExternalAddressDAIntermediateValue,\n type RegisterExternalAddressDAInternalState,\n type RegisterExternalAddressDAOutput,\n} from \"@api/app-binder/RegisterExternalAddressDeviceActionTypes\";\nimport {\n isContactsAppVersionSupportedForSession,\n type RunningApp,\n} from \"@internal/app-binder/contactsVersionGuards\";\nimport { ContactsVersionRequirementError } from \"@internal/app-binder/model/contactsErrors\";\nimport {\n type RegisterIdentityProofs,\n SendRegisterIdentityTask,\n} from \"@internal/app-binder/task/SendRegisterIdentityTask\";\n\nimport { validateRegisterExternalAddressInput } from \"./validateRegisterExternalAddressInput\";\n\nexport type RegisterExternalAddressMachineDependencies = {\n readonly isSupported: (app: RunningApp) => boolean;\n readonly registerIdentity: (\n input: RegisterExternalAddressDAInput,\n ) => Promise<Awaited<ReturnType<SendRegisterIdentityTask[\"run\"]>>>;\n};\n\nexport class RegisterExternalAddressDeviceAction extends XStateDeviceAction<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAInput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue,\n RegisterExternalAddressDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAInput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue,\n RegisterExternalAddressDAInternalState\n > {\n type types = StateMachineTypes<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAInput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue,\n RegisterExternalAddressDAInternalState\n >;\n\n const { isSupported, registerIdentity } =\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 registerIdentity: fromPromise(\n ({ input }: { input: RegisterExternalAddressDAInput }) =>\n registerIdentity(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 = validateRegisterExternalAddressInput(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: \"RegisterExternalAddressDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n appAndVersion: null,\n proofs: 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<RegisterExternalAddressDAInternalState>({\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<RegisterExternalAddressDAInternalState>({\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: \"RegisterIdentity\", guard: \"contactsSupported\" },\n { target: \"Error\", actions: \"assignVersionError\" },\n ],\n },\n RegisterIdentity: {\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: \"registerIdentity\",\n src: \"registerIdentity\",\n input: ({ context }) => context.input,\n onDone: {\n target: \"RegisterIdentityResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? { ...context._internalState, proofs: 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 RegisterIdentityResultCheck: {\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 { proofs, error } = context._internalState;\n if (proofs) {\n const { input } = context;\n return Right({\n mode: input.existingContactGroup\n ? (\"existingContactGroup\" as const)\n : (\"newContactGroup\" as const),\n contactName: input.contactName,\n scope: input.scope,\n identifier: input.identifier,\n blockchainFamily: input.blockchainFamily,\n chainId: input.chainId,\n groupHandle: proofs.groupHandle,\n hmacProof: proofs.hmacProof,\n hmacRest: proofs.hmacRest,\n });\n }\n return Left(error ?? new UnknownDAError(\"No error in final state\"));\n },\n });\n }\n\n extractDependencies(\n internalApi: InternalApi,\n ): RegisterExternalAddressMachineDependencies {\n const isSupported = (app: RunningApp) =>\n isContactsAppVersionSupportedForSession(internalApi, app);\n\n const registerIdentity = (\n input: RegisterExternalAddressDAInput,\n ): Promise<Awaited<ReturnType<SendRegisterIdentityTask[\"run\"]>>> =>\n new SendRegisterIdentityTask(internalApi, {\n contactName: input.contactName,\n scope: input.scope,\n identifier: input.identifier,\n blockchainFamily: input.blockchainFamily,\n chainId: input.chainId,\n existingContactGroup: input.existingContactGroup,\n }).run();\n\n return { isSupported, registerIdentity };\n }\n}\n\nexport type { RegisterIdentityProofs };\n"],
5
+ "mappings": "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",
6
+ "names": ["RegisterExternalAddressDeviceAction_exports", "__export", "RegisterExternalAddressDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_contactsVersionGuards", "import_contactsErrors", "import_SendRegisterIdentityTask", "import_validateRegisterExternalAddressInput", "internalApi", "isSupported", "registerIdentity", "appName", "input", "context", "appAndVersion", "error", "event", "proofs", "app"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var p=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var A=(o,e)=>{for(var i in e)p(o,i,{get:e[i],enumerable:!0})},I=(o,e,i,c)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of D(e))!g.call(o,t)&&t!==i&&p(o,t,{get:()=>e[t],enumerable:!(c=S(e,t))||c.enumerable});return o};var h=o=>I(p({},"__esModule",{value:!0}),o);var E={};A(E,{RenameContactDeviceAction:()=>y});module.exports=h(E);var r=require("@ledgerhq/device-management-kit"),s=require("purify-ts"),n=require("xstate"),l=require("../../../app-binder/contactsVersionGuards"),d=require("../../../app-binder/model/contactsErrors"),C=require("../../../app-binder/task/SendRenameContactTask"),R=require("./validateRenameContactInput");class y extends r.XStateDeviceAction{makeStateMachine(e){const{isOsSupported:i,renameContact:c}=this.extractDependencies(e);return(0,n.setup)({types:{input:{},context:{},output:{}},actors:{goToDashboardStateMachine:new r.GoToDashboardDeviceAction({input:{}}).makeStateMachine(e),renameContact:(0,n.fromPromise)(({input:t})=>c(t))},guards:{noInternalError:({context:t})=>t._internalState.error===null,contactsOsSupported:()=>i()},actions:{assignValidationError:(0,n.assign)({_internalState:({context:t})=>{const a=(0,R.validateRenameContactInput)(t.input);return a?{...t._internalState,error:a}:t._internalState}}),assignVersionError:(0,n.assign)({_internalState:({context:t})=>({...t._internalState,error:new d.ContactsVersionRequirementError})}),assignErrorFromEvent:(0,n.assign)({_internalState:({context:t,event:a})=>({...t._internalState,error:new r.UnknownDAError(a.error instanceof Error?a.error.message:String(a.error))})})}}).createMachine({id:"RenameContactDeviceAction",initial:"InitialState",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:r.UserInteractionRequired.None},_internalState:{error:null,proof:null}}),states:{InitialState:{always:{target:"GoToDashboard"}},GoToDashboard:{invoke:{id:"goToDashboard",src:"goToDashboardStateMachine",input:()=>({}),onSnapshot:{actions:(0,n.assign)({intermediateValue:({event:t})=>({requiredUserInteraction:t.snapshot.context.intermediateValue.requiredUserInteraction})})},onDone:{target:"GoToDashboardCheck",actions:(0,n.assign)({_internalState:({event:t,context:a})=>t.output.caseOf({Right:()=>a._internalState,Left:u=>({...a._internalState,error:u})})})},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:(0,n.assign)({intermediateValue:{requiredUserInteraction:r.UserInteractionRequired.RegisterWallet}}),exit:(0,n.assign)({intermediateValue:{requiredUserInteraction:r.UserInteractionRequired.None}}),invoke:{id:"renameContact",src:"renameContact",input:({context:t})=>t.input,onDone:{target:"RenameContactResultCheck",actions:(0,n.assign)({_internalState:({event:t,context:a})=>(0,r.isSuccessCommandResult)(t.output)?{...a._internalState,proof:t.output.data}:{...a._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:a,error:u}=t._internalState;if(a){const{input:m}=t;return(0,s.Right)({previousContactName:m.previousContactName,contactName:m.newContactName,groupHandle:m.groupHandle,hmacProof:a.hmacProof})}return(0,s.Left)(u??new r.UnknownDAError("No error in final state"))}})}extractDependencies(e){return{isOsSupported:()=>(0,l.isContactsOsSupportedForSession)(e),renameContact:t=>new C.SendRenameContactTask(e,{previousContactName:t.previousContactName,newContactName:t.newContactName,groupHandle:t.groupHandle,hmacProof:t.hmacProof}).run()}}}0&&(module.exports={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/contactsVersionGuards\";\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": ["RenameContactDeviceAction_exports", "__export", "RenameContactDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_contactsVersionGuards", "import_contactsErrors", "import_SendRenameContactTask", "import_validateRenameContactInput", "internalApi", "isOsSupported", "renameContact", "input", "context", "error", "event", "proof"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),t=require("vitest"),v=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),d=require("../../../app-binder/device-action/__test-utils__/setupGoToDashboardDAMock"),u=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),D=require("../../../app-binder/model/contactsErrors"),A=require("./RenameContactDeviceAction"),C=require("./validateRenameContactInput");t.vi.mock("@ledgerhq/device-management-kit",async a=>({...await a(),GoToDashboardDeviceAction:t.vi.fn(()=>({makeStateMachine:t.vi.fn()})),OpenAppDeviceAction:t.vi.fn(()=>({makeStateMachine:t.vi.fn()}))}));const R={hmacProof:new Uint8Array(32).fill(238)},m={previousContactName:"Alice",newContactName:"Bob",groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)},I={previousContactName:"Alice",contactName:"Bob",groupHandle:m.groupHandle,hmacProof:R.hmacProof};(0,t.describe)("RenameContactDeviceAction",()=>{let a,c,s;function f(){return{isOsSupported:c,renameContact:s}}(0,t.beforeEach)(()=>{t.vi.clearAllMocks(),a=(0,v.makeDeviceActionInternalApiMock)(),c=t.vi.fn().mockReturnValue(!0),s=t.vi.fn().mockResolvedValue((0,e.CommandResultFactory)({data:R})),a.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"BOLOS",version:"1.7.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!0})});function l(r){const n=new A.RenameContactDeviceAction({input:r});return t.vi.spyOn(n,"extractDependencies").mockReturnValue(f()),n}(0,t.it)("navigates to the dashboard, checks the OS, renames, and completes",()=>new Promise((r,n)=>{(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice});const o=l(m),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:I,status:e.DeviceActionStatus.Completed}];(0,u.testDeviceActionStates)(o,i,a,{onDone:()=>{(0,t.expect)(e.GoToDashboardDeviceAction).toHaveBeenCalled(),(0,t.expect)(e.OpenAppDeviceAction).not.toHaveBeenCalled(),r()},onError:n})})),(0,t.it)("rejects on an unsupported OS version without sending the APDU",()=>new Promise((r,n)=>{(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice}),c.mockReturnValue(!1);const o=l(m),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{error:new D.ContactsVersionRequirementError,status:e.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(o,i,a,{onDone:()=>{(0,t.expect)(s).not.toHaveBeenCalled(),(0,t.expect)(e.OpenAppDeviceAction).not.toHaveBeenCalled(),r()},onError:n})})),(0,t.it)("surfaces a go-to-dashboard failure as the device action error",()=>new Promise((r,n)=>{const o=new e.UnknownDAError("go to dashboard failed");(0,d.setupGoToDashboardDAMock)({error:o,requiredUserInteraction:e.UserInteractionRequired.UnlockDevice});const i=l(m),p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{error:o,status:e.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(i,p,a,{onDone:()=>{(0,t.expect)(c).not.toHaveBeenCalled(),(0,t.expect)(s).not.toHaveBeenCalled(),r()},onError:n})})),(0,t.it)("surfaces a rename command error (e.g. seed mismatch)",()=>new Promise((r,n)=>{(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice});const o=new D.ContactsCommandError({errorCode:"6982",message:"wrong seed"});s.mockResolvedValue((0,e.CommandResultFactory)({error:o}));const i=l(m),p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{error:o,status:e.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(i,p,a,{onDone:r,onError:n})})),(0,t.it)("surfaces invalid input as a typed error after reaching the dashboard",()=>new Promise((r,n)=>{(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice});const o={...m,newContactName:""},i=(0,C.validateRenameContactInput)(o),p=l(o),U=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{error:i,status:e.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(p,U,a,{onDone:()=>{(0,t.expect)(c).not.toHaveBeenCalled(),(0,t.expect)(s).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": ["import_device_management_kit", "import_vitest", "import_makeInternalApi", "import_setupGoToDashboardDAMock", "import_testDeviceActionStates", "import_contactsErrors", "import_RenameContactDeviceAction", "import_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
+ "use strict";var r=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var d=(a,t)=>{for(var o in t)r(a,o,{get:t[o],enumerable:!0})},m=(a,t,o,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of i(t))!f.call(a,n)&&n!==o&&r(a,n,{get:()=>t[n],enumerable:!(c=l(t,n))||c.enumerable});return a};var C=a=>m(r({},"__esModule",{value:!0}),a);var p={};d(p,{validateRenameContactInput:()=>u});module.exports=C(p);var e=require("../../../app-binder/model/contactsValidation");function u(a){try{return(0,e.validatePrintableLabel)(a.newContactName,{field:"newContactName",bufferLength:e.CONTACT_NAME_BUFFER_LENGTH}),(0,e.validatePrintableLabel)(a.previousContactName,{field:"previousContactName",bufferLength:e.CONTACT_NAME_BUFFER_LENGTH}),(0,e.validateByteLength)(a.groupHandle,{field:"groupHandle",expectedBytes:e.GROUP_HANDLE_SIZE}),(0,e.validateByteLength)(a.hmacProof,{field:"hmacProof",expectedBytes:e.HMAC_PROOF_LENGTH}),null}catch(t){if(t instanceof e.ContactsValidationError)return t;throw t}}0&&(module.exports={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": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAOO,yDAUA,SAASF,EACdG,EACgC,CAChC,GAAI,CACF,mCAAuBA,EAAM,eAAgB,CAC3C,MAAO,iBACP,aAAc,4BAChB,CAAC,KACD,0BAAuBA,EAAM,oBAAqB,CAChD,MAAO,sBACP,aAAc,4BAChB,CAAC,KACD,sBAAmBA,EAAM,YAAa,CACpC,MAAO,cACP,cAAe,mBACjB,CAAC,KACD,sBAAmBA,EAAM,UAAW,CAClC,MAAO,YACP,cAAe,mBACjB,CAAC,EAEM,IACT,OAASC,EAAO,CACd,GAAIA,aAAiB,0BACnB,OAAOA,EAET,MAAMA,CACR,CACF",
6
+ "names": ["validateRenameContactInput_exports", "__export", "validateRenameContactInput", "__toCommonJS", "import_contactsValidation", "input", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var n=require("../../../app-binder/model/contactsValidation"),t=require("./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((0,t.validateRenameContactInput)(e)).toBeNull()}),it("returns a ContactsValidationError for a non-printable new name",()=>{expect((0,t.validateRenameContactInput)({...e,newContactName:"Am\xE9lie"})).toBeInstanceOf(n.ContactsValidationError)}),it("returns a ContactsValidationError for a non-printable previous name",()=>{expect((0,t.validateRenameContactInput)({...e,previousContactName:"Am\xE9lie"})).toBeInstanceOf(n.ContactsValidationError)}),it("returns an error for an empty new name",()=>{expect((0,t.validateRenameContactInput)({...e,newContactName:""})).toBeInstanceOf(n.ContactsValidationError)}),it("returns an error for a group handle of the wrong length",()=>{expect((0,t.validateRenameContactInput)({...e,groupHandle:new Uint8Array(63)})).toBeInstanceOf(n.ContactsValidationError)}),it("returns an error for an hmac proof of the wrong length",()=>{expect((0,t.validateRenameContactInput)({...e,hmacProof:new Uint8Array(31)})).toBeInstanceOf(n.ContactsValidationError)})});
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,IAAAA,EAAwC,yDAExCC,EAA2C,wCAE3C,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,UAAO,8BAA2BA,CAAW,CAAC,EAAE,SAAS,CAC3D,CAAC,EAED,GAAG,iEAAkE,IAAM,CACzE,UACE,8BAA2B,CAAE,GAAGA,EAAa,eAAgB,WAAS,CAAC,CACzE,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,sEAAuE,IAAM,CAC9E,UACE,8BAA2B,CACzB,GAAGA,EACH,oBAAqB,WACvB,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,yCAA0C,IAAM,CACjD,UACE,8BAA2B,CAAE,GAAGA,EAAa,eAAgB,EAAG,CAAC,CACnE,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,0DAA2D,IAAM,CAClE,UACE,8BAA2B,CACzB,GAAGA,EACH,YAAa,IAAI,WAAW,EAAE,CAChC,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,yDAA0D,IAAM,CACjE,UACE,8BAA2B,CACzB,GAAGA,EACH,UAAW,IAAI,WAAW,EAAE,CAC9B,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,CACH,CAAC",
6
+ "names": ["import_contactsValidation", "import_validateRenameContactInput", "VALID_INPUT"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var c=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var u=(e,r)=>{for(var n in r)c(e,n,{get:r[n],enumerable:!0})},f=(e,r,n,m)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of s(r))!p.call(e,t)&&t!==n&&c(e,t,{get:()=>r[t],enumerable:!(m=d(r,t))||m.enumerable});return e};var k=e=>f(c({},"__esModule",{value:!0}),e);var h={};u(h,{setupGoToDashboardDAMock:()=>I});module.exports=k(h);var o=require("@ledgerhq/device-management-kit"),i=require("purify-ts"),a=require("xstate");const I=(e={})=>{const r=e.requiredUserInteraction??o.UserInteractionRequired.None;o.GoToDashboardDeviceAction.mockImplementation(()=>({makeStateMachine:vi.fn().mockImplementation(()=>(0,a.createMachine)({initial:"pending",states:{pending:{entry:(0,a.assign)({intermediateValue:{requiredUserInteraction:r}}),after:{0:"done"}},done:{type:"final"}},output:()=>e.error?(0,i.Left)(e.error):(0,i.Right)(void 0)}))}))};0&&(module.exports={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": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,2CACPC,EAA4B,qBAE5BC,EAAsC,kBAQ/B,MAAMJ,EAA2B,CACtCK,EAGI,CAAC,IACF,CACH,MAAMC,EACJD,EAAQ,yBAA2B,0BAAwB,KAC5D,4BAAmC,mBAAmB,KAAO,CAC5D,iBAAkB,GAAG,GAAG,EAAE,mBAAmB,OAC3C,iBAAc,CACZ,QAAS,UACT,OAAQ,CACN,QAAS,CACP,SAAO,UAAO,CACZ,kBAAmB,CACjB,wBAAyBC,CAC3B,CACF,CAAC,EACD,MAAO,CACL,EAAG,MACL,CACF,EACA,KAAM,CACJ,KAAM,OACR,CACF,EACA,OAAQ,IAAOD,EAAQ,SAAQ,QAAKA,EAAQ,KAAK,KAAI,SAAM,MAAS,CACtE,CAAC,CACH,CACF,EAAE,CACJ",
6
+ "names": ["setupGoToDashboardDAMock_exports", "__export", "setupGoToDashboardDAMock", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "options", "interaction"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var e=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var A=(t,o)=>{for(var _ in o)e(t,_,{get:o[_],enumerable:!0})},T=(t,o,_,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let x of c(o))!s.call(t,x)&&x!==_&&e(t,x,{get:()=>o[x],enumerable:!(n=r(o,x))||n.enumerable});return t};var C=t=>T(e({},"__esModule",{value:!0}),t);var I={};A(I,{BLOCKCHAIN_FAMILY_BY_NAME:()=>B,CONTACTS_APDU_CLA:()=>E,CONTACTS_APDU_INS:()=>S,GROUP_HANDLE_BYTES:()=>N,HMAC_PROOF_BYTES:()=>R,HMAC_REST_BYTES:()=>a,SUB_CMD_REGISTER_IDENTITY:()=>p});module.exports=C(I);const E=176,S=16,p=1,N=64,R=32,a=32,B={bitcoin:0,ethereum:1,solana:2,polkadot:3,cosmos:4,cardano:5};0&&(module.exports={BLOCKCHAIN_FAMILY_BY_NAME,CONTACTS_APDU_CLA,CONTACTS_APDU_INS,GROUP_HANDLE_BYTES,HMAC_PROOF_BYTES,HMAC_REST_BYTES,SUB_CMD_REGISTER_IDENTITY});
1
+ "use strict";var A=Object.defineProperty;var e=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var n=(_,o)=>{for(var x in o)A(_,x,{get:o[x],enumerable:!0})},r=(_,o,x,E)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of C(o))!T.call(_,t)&&t!==x&&A(_,t,{get:()=>o[t],enumerable:!(E=e(o,t))||E.enumerable});return _};var c=_=>r(A({},"__esModule",{value:!0}),_);var a={};n(a,{BLOCKCHAIN_FAMILY_BY_NAME:()=>Y,CONTACTS_APDU_CLA:()=>s,CONTACTS_APDU_INS:()=>N,GROUP_HANDLE_BYTES:()=>O,HMAC_NAME_BYTES:()=>U,HMAC_PROOF_BYTES:()=>B,HMAC_REST_BYTES:()=>P,RENAME_CONTACT_APDU_CLA:()=>I,RENAME_CONTACT_APDU_INS:()=>M,RENAME_CONTACT_P1:()=>R,SUB_CMD_EDIT_IDENTIFIER:()=>S,SUB_CMD_EDIT_SCOPE:()=>D,SUB_CMD_REGISTER_IDENTITY:()=>p});module.exports=c(a);const s=176,N=16,p=1,S=3,D=4,I=224,M=46,R=0,O=64,B=32,P=32,U=32,Y={bitcoin:0,ethereum:1,solana:2,polkadot:3,cosmos:4,cardano:5};0&&(module.exports={BLOCKCHAIN_FAMILY_BY_NAME,CONTACTS_APDU_CLA,CONTACTS_APDU_INS,GROUP_HANDLE_BYTES,HMAC_NAME_BYTES,HMAC_PROOF_BYTES,HMAC_REST_BYTES,RENAME_CONTACT_APDU_CLA,RENAME_CONTACT_APDU_INS,RENAME_CONTACT_P1,SUB_CMD_EDIT_IDENTIFIER,SUB_CMD_EDIT_SCOPE,SUB_CMD_REGISTER_IDENTITY});
2
2
  //# sourceMappingURL=contactsConstants.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/model/contactsConstants.ts"],
4
- "sourcesContent": ["/**\n * Protocol constants shared by the Contacts (Address Book) operations.\n *\n * Wire format and values follow the BOLOS SDK Address Book specification\n * (ledger-secure-sdk/app_features/address_book). Op-specific sub-command bytes\n * and response field sizes live here; TLV tags and struct-type bytes live in\n * {@link ./../services/contactsTlvSerializer}.\n */\n\n/** APDU class/instruction shared by every Address Book sub-command. */\nexport const CONTACTS_APDU_CLA = 0xb0;\nexport const CONTACTS_APDU_INS = 0x10;\n\n/** P1 sub-command selector for REGISTER IDENTITY (register external address). */\nexport const SUB_CMD_REGISTER_IDENTITY = 0x01;\n\n/** Sizes (bytes) of the fields in the REGISTER IDENTITY final-chunk response. */\nexport const GROUP_HANDLE_BYTES = 64;\nexport const HMAC_PROOF_BYTES = 32;\nexport const HMAC_REST_BYTES = 32;\n\n/**\n * Blockchain-family byte encoded in the `BLOCKCHAIN_FAMILY` TLV, keyed by a\n * lowercase family name. v1 ships Ethereum only; the remaining families are\n * listed for completeness and will be enabled as their chains are supported.\n */\nexport const BLOCKCHAIN_FAMILY_BY_NAME: Readonly<Record<string, number>> = {\n bitcoin: 0x00,\n ethereum: 0x01,\n solana: 0x02,\n polkadot: 0x03,\n cosmos: 0x04,\n cardano: 0x05,\n};\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,+BAAAE,EAAA,sBAAAC,EAAA,sBAAAC,EAAA,uBAAAC,EAAA,qBAAAC,EAAA,oBAAAC,EAAA,8BAAAC,IAAA,eAAAC,EAAAT,GAUO,MAAMG,EAAoB,IACpBC,EAAoB,GAGpBI,EAA4B,EAG5BH,EAAqB,GACrBC,EAAmB,GACnBC,EAAkB,GAOlBL,EAA8D,CACzE,QAAS,EACT,SAAU,EACV,OAAQ,EACR,SAAU,EACV,OAAQ,EACR,QAAS,CACX",
6
- "names": ["contactsConstants_exports", "__export", "BLOCKCHAIN_FAMILY_BY_NAME", "CONTACTS_APDU_CLA", "CONTACTS_APDU_INS", "GROUP_HANDLE_BYTES", "HMAC_PROOF_BYTES", "HMAC_REST_BYTES", "SUB_CMD_REGISTER_IDENTITY", "__toCommonJS"]
4
+ "sourcesContent": ["/**\n * Protocol constants shared by the Contacts (Address Book) operations.\n *\n * Wire format and values follow the BOLOS SDK Address Book specification\n * (ledger-secure-sdk/app_features/address_book). Op-specific sub-command bytes\n * and response field sizes live here; TLV tags and struct-type bytes live in\n * {@link ./../services/contactsTlvSerializer}.\n */\n\n/** APDU class/instruction shared by every Address Book sub-command. */\nexport const CONTACTS_APDU_CLA = 0xb0;\nexport const CONTACTS_APDU_INS = 0x10;\n\n/** P1 sub-command selector for REGISTER IDENTITY (register external address). */\nexport const SUB_CMD_REGISTER_IDENTITY = 0x01;\n\n/**\n * P1 sub-command selector for EDIT IDENTIFIER \u2014 an address-book app sub-command\n * (CLA 0xB0 / INS 0x10) served by the coin app, never OS-dispatched.\n */\nexport const SUB_CMD_EDIT_IDENTIFIER = 0x03;\n\n/**\n * P1 sub-command selector for EDIT SCOPE \u2014 an address-book app sub-command\n * (CLA 0xB0 / INS 0x10) served by the coin app, never OS-dispatched. Changes an\n * entry's scope while keeping its contact name and identifier.\n */\nexport const SUB_CMD_EDIT_SCOPE = 0x04;\n\n/**\n * EDIT CONTACT NAME (rename) is a blockchain-agnostic OS/dashboard command with\n * its own CLA/INS \u2014 NOT a sub-command of the address-book app APDU (0xB0/0x10).\n * The OS serves it directly, so it must run on the dashboard. P1 is a fixed\n * 0x00 (there is no sub-command selector for this command); P2 still carries the\n * chunk-continuation flag handled by {@link ./../services/sendFramedContactsPayload}.\n */\nexport const RENAME_CONTACT_APDU_CLA = 0xe0;\nexport const RENAME_CONTACT_APDU_INS = 0x2e;\nexport const RENAME_CONTACT_P1 = 0x00;\n\n/** Sizes (bytes) of the fields in the REGISTER IDENTITY final-chunk response. */\nexport const GROUP_HANDLE_BYTES = 64;\nexport const HMAC_PROOF_BYTES = 32;\nexport const HMAC_REST_BYTES = 32;\n\n/**\n * Size (bytes) of the rotated `hmac_name` returned on the EDIT CONTACT NAME\n * final-chunk response \u2014 the replacement group-level name proof.\n */\nexport const HMAC_NAME_BYTES = 32;\n\n/**\n * Blockchain-family byte encoded in the `BLOCKCHAIN_FAMILY` TLV, keyed by a\n * lowercase family name. v1 ships Ethereum only; the remaining families are\n * listed for completeness and will be enabled as their chains are supported.\n */\nexport const BLOCKCHAIN_FAMILY_BY_NAME: Readonly<Record<string, number>> = {\n bitcoin: 0x00,\n ethereum: 0x01,\n solana: 0x02,\n polkadot: 0x03,\n cosmos: 0x04,\n cardano: 0x05,\n};\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,+BAAAE,EAAA,sBAAAC,EAAA,sBAAAC,EAAA,uBAAAC,EAAA,oBAAAC,EAAA,qBAAAC,EAAA,oBAAAC,EAAA,4BAAAC,EAAA,4BAAAC,EAAA,sBAAAC,EAAA,4BAAAC,EAAA,uBAAAC,EAAA,8BAAAC,IAAA,eAAAC,EAAAf,GAUO,MAAMG,EAAoB,IACpBC,EAAoB,GAGpBU,EAA4B,EAM5BF,EAA0B,EAO1BC,EAAqB,EASrBJ,EAA0B,IAC1BC,EAA0B,GAC1BC,EAAoB,EAGpBN,EAAqB,GACrBE,EAAmB,GACnBC,EAAkB,GAMlBF,EAAkB,GAOlBJ,EAA8D,CACzE,QAAS,EACT,SAAU,EACV,OAAQ,EACR,SAAU,EACV,OAAQ,EACR,QAAS,CACX",
6
+ "names": ["contactsConstants_exports", "__export", "BLOCKCHAIN_FAMILY_BY_NAME", "CONTACTS_APDU_CLA", "CONTACTS_APDU_INS", "GROUP_HANDLE_BYTES", "HMAC_NAME_BYTES", "HMAC_PROOF_BYTES", "HMAC_REST_BYTES", "RENAME_CONTACT_APDU_CLA", "RENAME_CONTACT_APDU_INS", "RENAME_CONTACT_P1", "SUB_CMD_EDIT_IDENTIFIER", "SUB_CMD_EDIT_SCOPE", "SUB_CMD_REGISTER_IDENTITY", "__toCommonJS"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var A=(a,r)=>{for(var n in r)s(a,n,{get:r[n],enumerable:!0})},f=(a,r,n,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of y(r))!E.call(a,o)&&o!==n&&s(a,o,{get:()=>r[o],enumerable:!(t=I(r,o))||t.enumerable});return a};var C=a=>f(s({},"__esModule",{value:!0}),a);var p={};A(p,{SendEditExternalAddressIdentifierTask:()=>T});module.exports=C(p);var i=require("@ledgerhq/device-management-kit"),l=require("../../app-binder/command/EditExternalAddressIdentifierCommand"),d=require("../../app-binder/model/contactsConstants"),e=require("../../app-binder/services/contactsTlvSerializer"),c=require("../../app-binder/services/sendFramedContactsPayload");class T{constructor(r,n){this.api=r;this.args=n}async run(){const r=this.buildPayload(this.args),n=await(0,c.sendFramedContactsPayload)(this.api,{payload:r,p1:d.SUB_CMD_EDIT_IDENTIFIER,makeCommand:(o,m)=>new l.EditExternalAddressIdentifierCommand({data:o,p2:m}),logger:this.args.logger,commandTag:"SendEditExternalAddressIdentifierTask"});if(!(0,i.isSuccessCommandResult)(n))return n;const{hmacRest:t}=n.data;return t?(0,i.DmkResultFactory)({data:{hmacRest:t}}):(0,i.DmkResultFactory)({error:new i.InvalidStatusWordError("EditIdentifier final-chunk response did not carry hmac_rest")})}buildPayload(r){const n=d.BLOCKCHAIN_FAMILY_BY_NAME[r.blockchainFamily.toLowerCase()];if(n===void 0)throw new Error(`Unsupported blockchain family: ${r.blockchainFamily}`);const t=new i.ByteArrayBuilder;return(0,e.encodeTlvUInt8)(t,e.CONTACTS_TLV_TAG.STRUCT_TYPE,e.STRUCT_TYPE_EDIT_IDENTIFIER),(0,e.encodeTlvUInt8)(t,e.CONTACTS_TLV_TAG.STRUCT_VERSION,e.STRUCT_VERSION_VALUE),(0,e.encodeTlvAscii)(t,e.CONTACTS_TLV_TAG.CONTACT_NAME,r.contactName),(0,e.encodeTlvAscii)(t,e.CONTACTS_TLV_TAG.SCOPE,r.scope),(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER,r.newIdentifier),(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.PREVIOUS_IDENTIFIER,r.previousIdentifier),(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.GROUP_HANDLE,r.groupHandle),r.chainId!==void 0&&(0,e.encodeTlvChainId)(t,e.CONTACTS_TLV_TAG.CHAIN_ID,r.chainId),(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.HMAC_PROOF,r.hmacProof),(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.HMAC_REST,r.hmacRest),(0,e.encodeTlvUInt8)(t,e.CONTACTS_TLV_TAG.BLOCKCHAIN_FAMILY,n),t.build()}}0&&(module.exports={SendEditExternalAddressIdentifierTask});
2
+ //# sourceMappingURL=SendEditExternalAddressIdentifierTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/SendEditExternalAddressIdentifierTask.ts"],
4
+ "sourcesContent": ["// Builds the op-3 (Edit Identifier) TLV and dispatches it via the shared\n// chunked framing; the device returns struct_type + hmac_rest on the final\n// chunk. Tag order: STRUCT_TYPE, STRUCT_VERSION, CONTACT_NAME, SCOPE,\n// ACCOUNT_IDENTIFIER (new), PREVIOUS_IDENTIFIER (old), GROUP_HANDLE,\n// CHAIN_ID (Ethereum only), HMAC_PROOF, HMAC_REST (old), BLOCKCHAIN_FAMILY.\n// No DERIVATION_PATH: external-address ops carry no path \u2014 the current Ethereum\n// app rejects the tag (0x6a80); it is Ledger-Account only (DSDK-1465).\n// Reference: Address Book Final Specifications \u2014 Edit Identifier.\nimport {\n ByteArrayBuilder,\n type CommandResult,\n DmkResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { EditExternalAddressIdentifierCommand } from \"@internal/app-binder/command/EditExternalAddressIdentifierCommand\";\nimport {\n BLOCKCHAIN_FAMILY_BY_NAME,\n SUB_CMD_EDIT_IDENTIFIER,\n} from \"@internal/app-binder/model/contactsConstants\";\nimport { type ContactsErrorCodes } from \"@internal/app-binder/model/contactsErrors\";\nimport {\n CONTACTS_TLV_TAG,\n encodeTlvAscii,\n encodeTlvBuffer,\n encodeTlvChainId,\n encodeTlvUInt8,\n STRUCT_TYPE_EDIT_IDENTIFIER,\n STRUCT_VERSION_VALUE,\n} from \"@internal/app-binder/services/contactsTlvSerializer\";\nimport { sendFramedContactsPayload } from \"@internal/app-binder/services/sendFramedContactsPayload\";\n\nexport type EditIdentifierProof = {\n readonly hmacRest: Uint8Array;\n};\n\nexport type SendEditExternalAddressIdentifierTaskArgs = {\n readonly contactName: string;\n readonly scope: string;\n readonly previousIdentifier: Uint8Array;\n readonly newIdentifier: Uint8Array;\n readonly blockchainFamily: string;\n readonly chainId?: bigint;\n readonly groupHandle: Uint8Array;\n readonly hmacProof: Uint8Array;\n readonly hmacRest: Uint8Array;\n readonly logger?: LoggerPublisherService;\n};\n\nexport class SendEditExternalAddressIdentifierTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: SendEditExternalAddressIdentifierTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<EditIdentifierProof, ContactsErrorCodes>> {\n const payload = this.buildPayload(this.args);\n\n const result = (await sendFramedContactsPayload(this.api, {\n payload,\n p1: SUB_CMD_EDIT_IDENTIFIER,\n makeCommand: (chunk, p2) =>\n new EditExternalAddressIdentifierCommand({ data: chunk, p2 }),\n logger: this.args.logger,\n commandTag: \"SendEditExternalAddressIdentifierTask\",\n })) as CommandResult<\n { readonly hmacRest?: Uint8Array },\n ContactsErrorCodes\n >;\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n\n const { hmacRest } = result.data;\n if (!hmacRest) {\n return DmkResultFactory({\n error: new InvalidStatusWordError(\n \"EditIdentifier final-chunk response did not carry hmac_rest\",\n ),\n });\n }\n return DmkResultFactory({ data: { hmacRest } });\n }\n\n private buildPayload(\n args: SendEditExternalAddressIdentifierTaskArgs,\n ): Uint8Array {\n const family =\n BLOCKCHAIN_FAMILY_BY_NAME[args.blockchainFamily.toLowerCase()];\n if (family === undefined) {\n throw new Error(\n `Unsupported blockchain family: ${args.blockchainFamily}`,\n );\n }\n\n const builder = new ByteArrayBuilder();\n encodeTlvUInt8(\n builder,\n CONTACTS_TLV_TAG.STRUCT_TYPE,\n STRUCT_TYPE_EDIT_IDENTIFIER,\n );\n encodeTlvUInt8(\n builder,\n CONTACTS_TLV_TAG.STRUCT_VERSION,\n STRUCT_VERSION_VALUE,\n );\n encodeTlvAscii(builder, CONTACTS_TLV_TAG.CONTACT_NAME, args.contactName);\n encodeTlvAscii(builder, CONTACTS_TLV_TAG.SCOPE, args.scope);\n encodeTlvBuffer(\n builder,\n CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER,\n args.newIdentifier,\n );\n encodeTlvBuffer(\n builder,\n CONTACTS_TLV_TAG.PREVIOUS_IDENTIFIER,\n args.previousIdentifier,\n );\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.GROUP_HANDLE, args.groupHandle);\n if (args.chainId !== undefined) {\n encodeTlvChainId(builder, CONTACTS_TLV_TAG.CHAIN_ID, args.chainId);\n }\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.HMAC_PROOF, args.hmacProof);\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.HMAC_REST, args.hmacRest);\n encodeTlvUInt8(builder, CONTACTS_TLV_TAG.BLOCKCHAIN_FAMILY, family);\n\n return builder.build();\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,2CAAAE,IAAA,eAAAC,EAAAH,GAQA,IAAAI,EAQO,2CAEPC,EAAqD,6EACrDC,EAGO,wDAEPC,EAQO,+DACPC,EAA0C,mEAmBnC,MAAMN,CAAsC,CACjD,YACmBO,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAAuE,CAC3E,MAAMC,EAAU,KAAK,aAAa,KAAK,IAAI,EAErCC,EAAU,QAAM,6BAA0B,KAAK,IAAK,CACxD,QAAAD,EACA,GAAI,0BACJ,YAAa,CAACE,EAAOC,IACnB,IAAI,uCAAqC,CAAE,KAAMD,EAAO,GAAAC,CAAG,CAAC,EAC9D,OAAQ,KAAK,KAAK,OAClB,WAAY,uCACd,CAAC,EAKD,GAAI,IAAC,0BAAuBF,CAAM,EAChC,OAAOA,EAGT,KAAM,CAAE,SAAAG,CAAS,EAAIH,EAAO,KAC5B,OAAKG,KAOE,oBAAiB,CAAE,KAAM,CAAE,SAAAA,CAAS,CAAE,CAAC,KANrC,oBAAiB,CACtB,MAAO,IAAI,yBACT,6DACF,CACF,CAAC,CAGL,CAEQ,aACNL,EACY,CACZ,MAAMM,EACJ,4BAA0BN,EAAK,iBAAiB,YAAY,CAAC,EAC/D,GAAIM,IAAW,OACb,MAAM,IAAI,MACR,kCAAkCN,EAAK,gBAAgB,EACzD,EAGF,MAAMO,EAAU,IAAI,mBACpB,2BACEA,EACA,mBAAiB,YACjB,6BACF,KACA,kBACEA,EACA,mBAAiB,eACjB,sBACF,KACA,kBAAeA,EAAS,mBAAiB,aAAcP,EAAK,WAAW,KACvE,kBAAeO,EAAS,mBAAiB,MAAOP,EAAK,KAAK,KAC1D,mBACEO,EACA,mBAAiB,mBACjBP,EAAK,aACP,KACA,mBACEO,EACA,mBAAiB,oBACjBP,EAAK,kBACP,KACA,mBAAgBO,EAAS,mBAAiB,aAAcP,EAAK,WAAW,EACpEA,EAAK,UAAY,WACnB,oBAAiBO,EAAS,mBAAiB,SAAUP,EAAK,OAAO,KAEnE,mBAAgBO,EAAS,mBAAiB,WAAYP,EAAK,SAAS,KACpE,mBAAgBO,EAAS,mBAAiB,UAAWP,EAAK,QAAQ,KAClE,kBAAeO,EAAS,mBAAiB,kBAAmBD,CAAM,EAE3DC,EAAQ,MAAM,CACvB,CACF",
6
+ "names": ["SendEditExternalAddressIdentifierTask_exports", "__export", "SendEditExternalAddressIdentifierTask", "__toCommonJS", "import_device_management_kit", "import_EditExternalAddressIdentifierCommand", "import_contactsConstants", "import_contactsTlvSerializer", "import_sendFramedContactsPayload", "api", "args", "payload", "result", "chunk", "p2", "hmacRest", "family", "builder"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var n=require("@ledgerhq/device-management-kit"),i=require("../../app-binder/command/EditExternalAddressIdentifierCommand"),o=require("./SendEditExternalAddressIdentifierTask");function r(e){const t=new Uint8Array(e.length/2);for(let a=0;a<e.length;a+=2)t[a/2]=parseInt(e.slice(a,a+2),16);return t}const m=r("00d501013102010181f005416c69636581f108457468206d61696e81f214555555555555555555555555555555555555555581f41400000000000000000000000000000000deadbeef81f640"+"cc".repeat(64)+"2301012920"+"dd".repeat(32)+"81f720"+"aa".repeat(32)+"510101"),s={hmacRest:r("88".repeat(32))},d={contactName:"Alice",scope:"Eth main",newIdentifier:r("55".repeat(20)),previousIdentifier:r("00000000000000000000000000000000deadbeef"),blockchainFamily:"ethereum",chainId:1n,groupHandle:r("cc".repeat(64)),hmacProof:r("dd".repeat(32)),hmacRest:r("aa".repeat(32))};function c(){return{sendCommand:vi.fn()}}describe("SendEditExternalAddressIdentifierTask",()=>{it("assembles the framed chunk byte-equal to the fixture and dispatches EditExternalAddressIdentifierCommand",async()=>{const e=c();e.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:s}));const t=await new o.SendEditExternalAddressIdentifierTask(e,d).run();expect(e.sendCommand.mock.calls).toHaveLength(1),expect(e.sendCommand.mock.calls[0][0]).toStrictEqual(new i.EditExternalAddressIdentifierCommand({data:m,p2:0})),expect(t).toStrictEqual((0,n.CommandResultFactory)({data:s}))}),it("omits the CHAIN_ID TLV when chainId is not provided",async()=>{const e=c();e.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:s})),await new o.SendEditExternalAddressIdentifierTask(e,{...d,chainId:void 0}).run();const t=e.sendCommand.mock.calls[0][0],a=Buffer.from(t.args.data).toString("hex");expect(a).not.toContain("230101"),expect(a.endsWith("510101")).toBe(!0)}),it("propagates command-level errors",async()=>{const e=c();e.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({error:new n.InvalidStatusWordError("user cancelled")}));const t=await new o.SendEditExternalAddressIdentifierTask(e,d).run();expect(t).toStrictEqual((0,n.CommandResultFactory)({error:new n.InvalidStatusWordError("user cancelled")}))}),it("errors when the final-chunk response does not carry hmac_rest",async()=>{const e=c();e.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:{}}));const t=await new o.SendEditExternalAddressIdentifierTask(e,d).run();expect(t).toStrictEqual((0,n.CommandResultFactory)({error:new n.InvalidStatusWordError("EditIdentifier final-chunk response did not carry hmac_rest")}))}),it("throws on an unsupported blockchain family",async()=>{const e=c();await expect(new o.SendEditExternalAddressIdentifierTask(e,{...d,blockchainFamily:"dogecoin"}).run()).rejects.toThrow(/Unsupported blockchain family/),expect(e.sendCommand).not.toHaveBeenCalled()})});
2
+ //# sourceMappingURL=SendEditExternalAddressIdentifierTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.ts"],
4
+ "sourcesContent": ["// Asserts the op-3 (Edit Identifier) framed chunk (2-byte BE length + TLV) is\n// byte-for-byte parity with the signer-eth `edit_external_address` fixture.\nimport {\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { EditExternalAddressIdentifierCommand } from \"@internal/app-binder/command/EditExternalAddressIdentifierCommand\";\n\nimport { SendEditExternalAddressIdentifierTask } from \"./SendEditExternalAddressIdentifierTask\";\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n out[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return out;\n}\n\n// Framed chunk = \"00 d5\" (2-byte BE total TLV length = 213) + TLV. No\n// DERIVATION_PATH TLV (external-address ops carry no path).\nconst FRAMED_CHUNK = hexToBytes(\n \"00d5\" +\n \"010131\" +\n \"020101\" +\n \"81f005416c696365\" +\n \"81f108457468206d61696e\" +\n \"81f2145555555555555555555555555555555555555555\" +\n \"81f41400000000000000000000000000000000deadbeef\" +\n \"81f640\" +\n \"cc\".repeat(64) +\n \"230101\" +\n \"2920\" +\n \"dd\".repeat(32) +\n \"81f720\" +\n \"aa\".repeat(32) +\n \"510101\",\n);\n\nconst OK_PROOF = { hmacRest: hexToBytes(\"88\".repeat(32)) };\n\nconst BASE_ARGS = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n newIdentifier: hexToBytes(\"55\".repeat(20)),\n previousIdentifier: hexToBytes(\"00000000000000000000000000000000deadbeef\"),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: hexToBytes(\"cc\".repeat(64)),\n hmacProof: hexToBytes(\"dd\".repeat(32)),\n hmacRest: hexToBytes(\"aa\".repeat(32)),\n};\n\nfunction makeApiMock(): InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n} {\n return { sendCommand: vi.fn() } as unknown as InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n };\n}\n\ndescribe(\"SendEditExternalAddressIdentifierTask\", () => {\n it(\"assembles the framed chunk byte-equal to the fixture and dispatches EditExternalAddressIdentifierCommand\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOF }),\n );\n\n const result = await new SendEditExternalAddressIdentifierTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new EditExternalAddressIdentifierCommand({\n data: FRAMED_CHUNK,\n p2: 0x00,\n }),\n );\n expect(result).toStrictEqual(CommandResultFactory({ data: OK_PROOF }));\n });\n\n it(\"omits the CHAIN_ID TLV when chainId is not provided\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOF }),\n );\n\n await new SendEditExternalAddressIdentifierTask(api, {\n ...BASE_ARGS,\n chainId: undefined,\n }).run();\n\n const command = api.sendCommand.mock\n .calls[0]![0] as EditExternalAddressIdentifierCommand;\n const framedHex = Buffer.from(command.args.data).toString(\"hex\");\n // No `23 01 ..` CHAIN_ID TLV; HMAC_PROOF (29 20 ..) follows the path directly.\n expect(framedHex).not.toContain(\"230101\");\n expect(framedHex.endsWith(\"510101\")).toBe(true);\n });\n\n it(\"propagates command-level errors\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n\n const result = await new SendEditExternalAddressIdentifierTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n });\n\n it(\"errors when the final-chunk response does not carry hmac_rest\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(CommandResultFactory({ data: {} }));\n\n const result = await new SendEditExternalAddressIdentifierTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\n \"EditIdentifier final-chunk response did not carry hmac_rest\",\n ),\n }),\n );\n });\n\n it(\"throws on an unsupported blockchain family\", async () => {\n const api = makeApiMock();\n\n await expect(\n new SendEditExternalAddressIdentifierTask(api, {\n ...BASE_ARGS,\n blockchainFamily: \"dogecoin\",\n }).run(),\n ).rejects.toThrow(/Unsupported blockchain family/);\n expect(api.sendCommand).not.toHaveBeenCalled();\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_EditExternalAddressIdentifierCommand", "import_SendEditExternalAddressIdentifierTask", "hexToBytes", "hex", "out", "i", "FRAMED_CHUNK", "OK_PROOF", "BASE_ARGS", "makeApiMock", "api", "result", "command", "framedHex"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var C=(a,r)=>{for(var t in r)s(a,t,{get:r[t],enumerable:!0})},S=(a,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let d of y(r))!E.call(a,d)&&d!==t&&s(a,d,{get:()=>r[d],enumerable:!(o=p(r,d))||o.enumerable});return a};var A=a=>S(s({},"__esModule",{value:!0}),a);var u={};C(u,{SendEditExternalAddressScopeTask:()=>T});module.exports=A(u);var n=require("@ledgerhq/device-management-kit"),c=require("../../app-binder/command/EditExternalAddressScopeCommand"),i=require("../../app-binder/model/contactsConstants"),e=require("../../app-binder/services/contactsTlvSerializer"),l=require("../../app-binder/services/sendFramedContactsPayload");class T{constructor(r,t){this.api=r;this.args=t}async run(){const r=this.buildPayload(this.args),t=await(0,l.sendFramedContactsPayload)(this.api,{payload:r,p1:i.SUB_CMD_EDIT_SCOPE,makeCommand:(d,m)=>new c.EditExternalAddressScopeCommand({data:d,p2:m}),logger:this.args.logger,commandTag:"SendEditExternalAddressScopeTask"});if(!(0,n.isSuccessCommandResult)(t))return t;const{hmacRest:o}=t.data;return o?(0,n.DmkResultFactory)({data:{hmacRest:o}}):(0,n.DmkResultFactory)({error:new n.InvalidStatusWordError("EditScope final-chunk response did not carry hmac_rest")})}buildPayload(r){const t=i.BLOCKCHAIN_FAMILY_BY_NAME[r.blockchainFamily.toLowerCase()];if(t===void 0)throw new Error(`Unsupported blockchain family: ${r.blockchainFamily}`);const o=new n.ByteArrayBuilder;return(0,e.encodeTlvUInt8)(o,e.CONTACTS_TLV_TAG.STRUCT_TYPE,e.STRUCT_TYPE_EDIT_SCOPE),(0,e.encodeTlvUInt8)(o,e.CONTACTS_TLV_TAG.STRUCT_VERSION,e.STRUCT_VERSION_VALUE),(0,e.encodeTlvAscii)(o,e.CONTACTS_TLV_TAG.CONTACT_NAME,r.contactName),(0,e.encodeTlvAscii)(o,e.CONTACTS_TLV_TAG.SCOPE,r.newScope),(0,e.encodeTlvBuffer)(o,e.CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER,r.identifier),(0,e.encodeTlvAscii)(o,e.CONTACTS_TLV_TAG.PREVIOUS_SCOPE,r.previousScope),(0,e.encodeTlvBuffer)(o,e.CONTACTS_TLV_TAG.GROUP_HANDLE,r.groupHandle),r.chainId!==void 0&&(0,e.encodeTlvChainId)(o,e.CONTACTS_TLV_TAG.CHAIN_ID,r.chainId),(0,e.encodeTlvBuffer)(o,e.CONTACTS_TLV_TAG.HMAC_PROOF,r.hmacProof),(0,e.encodeTlvBuffer)(o,e.CONTACTS_TLV_TAG.HMAC_REST,r.hmacRest),(0,e.encodeTlvUInt8)(o,e.CONTACTS_TLV_TAG.BLOCKCHAIN_FAMILY,t),o.build()}}0&&(module.exports={SendEditExternalAddressScopeTask});
2
+ //# sourceMappingURL=SendEditExternalAddressScopeTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/SendEditExternalAddressScopeTask.ts"],
4
+ "sourcesContent": ["// Builds the op-4 (Edit Scope) TLV and dispatches it via the shared chunked\n// framing; the device returns struct_type + hmac_rest on the final chunk. Tag\n// order: STRUCT_TYPE, STRUCT_VERSION, CONTACT_NAME, SCOPE (new), ACCOUNT_IDENTIFIER\n// (unchanged), PREVIOUS_SCOPE (old), GROUP_HANDLE, CHAIN_ID (Ethereum only),\n// HMAC_PROOF, HMAC_REST (old), BLOCKCHAIN_FAMILY.\n// No DERIVATION_PATH: external-address ops carry no path \u2014 the current Ethereum\n// app rejects the tag (0x6a80); it is Ledger-Account only (DSDK-1465).\n// Reference: Address Book Final Specifications \u2014 Edit Scope.\nimport {\n ByteArrayBuilder,\n type CommandResult,\n DmkResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { EditExternalAddressScopeCommand } from \"@internal/app-binder/command/EditExternalAddressScopeCommand\";\nimport {\n BLOCKCHAIN_FAMILY_BY_NAME,\n SUB_CMD_EDIT_SCOPE,\n} from \"@internal/app-binder/model/contactsConstants\";\nimport { type ContactsErrorCodes } from \"@internal/app-binder/model/contactsErrors\";\nimport {\n CONTACTS_TLV_TAG,\n encodeTlvAscii,\n encodeTlvBuffer,\n encodeTlvChainId,\n encodeTlvUInt8,\n STRUCT_TYPE_EDIT_SCOPE,\n STRUCT_VERSION_VALUE,\n} from \"@internal/app-binder/services/contactsTlvSerializer\";\nimport { sendFramedContactsPayload } from \"@internal/app-binder/services/sendFramedContactsPayload\";\n\nexport type EditScopeProof = {\n readonly hmacRest: Uint8Array;\n};\n\nexport type SendEditExternalAddressScopeTaskArgs = {\n readonly contactName: string;\n readonly previousScope: string;\n readonly newScope: string;\n readonly identifier: Uint8Array;\n readonly blockchainFamily: string;\n readonly chainId?: bigint;\n readonly groupHandle: Uint8Array;\n readonly hmacProof: Uint8Array;\n readonly hmacRest: Uint8Array;\n readonly logger?: LoggerPublisherService;\n};\n\nexport class SendEditExternalAddressScopeTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: SendEditExternalAddressScopeTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<EditScopeProof, ContactsErrorCodes>> {\n const payload = this.buildPayload(this.args);\n\n const result = (await sendFramedContactsPayload(this.api, {\n payload,\n p1: SUB_CMD_EDIT_SCOPE,\n makeCommand: (chunk, p2) =>\n new EditExternalAddressScopeCommand({ data: chunk, p2 }),\n logger: this.args.logger,\n commandTag: \"SendEditExternalAddressScopeTask\",\n })) as CommandResult<\n { readonly hmacRest?: Uint8Array },\n ContactsErrorCodes\n >;\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n\n const { hmacRest } = result.data;\n if (!hmacRest) {\n return DmkResultFactory({\n error: new InvalidStatusWordError(\n \"EditScope final-chunk response did not carry hmac_rest\",\n ),\n });\n }\n return DmkResultFactory({ data: { hmacRest } });\n }\n\n private buildPayload(args: SendEditExternalAddressScopeTaskArgs): Uint8Array {\n const family =\n BLOCKCHAIN_FAMILY_BY_NAME[args.blockchainFamily.toLowerCase()];\n if (family === undefined) {\n throw new Error(\n `Unsupported blockchain family: ${args.blockchainFamily}`,\n );\n }\n\n const builder = new ByteArrayBuilder();\n encodeTlvUInt8(\n builder,\n CONTACTS_TLV_TAG.STRUCT_TYPE,\n STRUCT_TYPE_EDIT_SCOPE,\n );\n encodeTlvUInt8(\n builder,\n CONTACTS_TLV_TAG.STRUCT_VERSION,\n STRUCT_VERSION_VALUE,\n );\n encodeTlvAscii(builder, CONTACTS_TLV_TAG.CONTACT_NAME, args.contactName);\n encodeTlvAscii(builder, CONTACTS_TLV_TAG.SCOPE, args.newScope);\n encodeTlvBuffer(\n builder,\n CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER,\n args.identifier,\n );\n encodeTlvAscii(\n builder,\n CONTACTS_TLV_TAG.PREVIOUS_SCOPE,\n args.previousScope,\n );\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.GROUP_HANDLE, args.groupHandle);\n if (args.chainId !== undefined) {\n encodeTlvChainId(builder, CONTACTS_TLV_TAG.CHAIN_ID, args.chainId);\n }\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.HMAC_PROOF, args.hmacProof);\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.HMAC_REST, args.hmacRest);\n encodeTlvUInt8(builder, CONTACTS_TLV_TAG.BLOCKCHAIN_FAMILY, family);\n\n return builder.build();\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sCAAAE,IAAA,eAAAC,EAAAH,GAQA,IAAAI,EAQO,2CAEPC,EAAgD,wEAChDC,EAGO,wDAEPC,EAQO,+DACPC,EAA0C,mEAmBnC,MAAMN,CAAiC,CAC5C,YACmBO,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAAkE,CACtE,MAAMC,EAAU,KAAK,aAAa,KAAK,IAAI,EAErCC,EAAU,QAAM,6BAA0B,KAAK,IAAK,CACxD,QAAAD,EACA,GAAI,qBACJ,YAAa,CAACE,EAAOC,IACnB,IAAI,kCAAgC,CAAE,KAAMD,EAAO,GAAAC,CAAG,CAAC,EACzD,OAAQ,KAAK,KAAK,OAClB,WAAY,kCACd,CAAC,EAKD,GAAI,IAAC,0BAAuBF,CAAM,EAChC,OAAOA,EAGT,KAAM,CAAE,SAAAG,CAAS,EAAIH,EAAO,KAC5B,OAAKG,KAOE,oBAAiB,CAAE,KAAM,CAAE,SAAAA,CAAS,CAAE,CAAC,KANrC,oBAAiB,CACtB,MAAO,IAAI,yBACT,wDACF,CACF,CAAC,CAGL,CAEQ,aAAaL,EAAwD,CAC3E,MAAMM,EACJ,4BAA0BN,EAAK,iBAAiB,YAAY,CAAC,EAC/D,GAAIM,IAAW,OACb,MAAM,IAAI,MACR,kCAAkCN,EAAK,gBAAgB,EACzD,EAGF,MAAMO,EAAU,IAAI,mBACpB,2BACEA,EACA,mBAAiB,YACjB,wBACF,KACA,kBACEA,EACA,mBAAiB,eACjB,sBACF,KACA,kBAAeA,EAAS,mBAAiB,aAAcP,EAAK,WAAW,KACvE,kBAAeO,EAAS,mBAAiB,MAAOP,EAAK,QAAQ,KAC7D,mBACEO,EACA,mBAAiB,mBACjBP,EAAK,UACP,KACA,kBACEO,EACA,mBAAiB,eACjBP,EAAK,aACP,KACA,mBAAgBO,EAAS,mBAAiB,aAAcP,EAAK,WAAW,EACpEA,EAAK,UAAY,WACnB,oBAAiBO,EAAS,mBAAiB,SAAUP,EAAK,OAAO,KAEnE,mBAAgBO,EAAS,mBAAiB,WAAYP,EAAK,SAAS,KACpE,mBAAgBO,EAAS,mBAAiB,UAAWP,EAAK,QAAQ,KAClE,kBAAeO,EAAS,mBAAiB,kBAAmBD,CAAM,EAE3DC,EAAQ,MAAM,CACvB,CACF",
6
+ "names": ["SendEditExternalAddressScopeTask_exports", "__export", "SendEditExternalAddressScopeTask", "__toCommonJS", "import_device_management_kit", "import_EditExternalAddressScopeCommand", "import_contactsConstants", "import_contactsTlvSerializer", "import_sendFramedContactsPayload", "api", "args", "payload", "result", "chunk", "p2", "hmacRest", "family", "builder"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var n=require("@ledgerhq/device-management-kit"),i=require("../../app-binder/command/EditExternalAddressScopeCommand"),o=require("./SendEditExternalAddressScopeTask");function r(e){const t=new Uint8Array(e.length/2);for(let a=0;a<e.length;a+=2)t[a/2]=parseInt(e.slice(a,a+2),16);return t}const m=r("00c901013202010181f005416c69636581f10845746820636f6c6481f214"+"55".repeat(20)+"81f508457468206d61696e81f640"+"cc".repeat(64)+"2301012920"+"dd".repeat(32)+"81f720"+"aa".repeat(32)+"510101"),d={hmacRest:r("88".repeat(32))},c={contactName:"Alice",previousScope:"Eth main",newScope:"Eth cold",identifier:r("55".repeat(20)),blockchainFamily:"ethereum",chainId:1n,groupHandle:r("cc".repeat(64)),hmacProof:r("dd".repeat(32)),hmacRest:r("aa".repeat(32))};function s(){return{sendCommand:vi.fn()}}describe("SendEditExternalAddressScopeTask",()=>{it("assembles the framed chunk byte-equal to the fixture and dispatches EditExternalAddressScopeCommand",async()=>{const e=s();e.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:d}));const t=await new o.SendEditExternalAddressScopeTask(e,c).run();expect(e.sendCommand.mock.calls).toHaveLength(1),expect(e.sendCommand.mock.calls[0][0]).toStrictEqual(new i.EditExternalAddressScopeCommand({data:m,p2:0})),expect(t).toStrictEqual((0,n.CommandResultFactory)({data:d}))}),it("omits the CHAIN_ID TLV when chainId is not provided",async()=>{const e=s();e.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:d})),await new o.SendEditExternalAddressScopeTask(e,{...c,chainId:void 0}).run();const t=e.sendCommand.mock.calls[0][0],a=Buffer.from(t.args.data).toString("hex");expect(a).not.toContain("230101"),expect(a.endsWith("510101")).toBe(!0)}),it("propagates command-level errors",async()=>{const e=s();e.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({error:new n.InvalidStatusWordError("user cancelled")}));const t=await new o.SendEditExternalAddressScopeTask(e,c).run();expect(t).toStrictEqual((0,n.CommandResultFactory)({error:new n.InvalidStatusWordError("user cancelled")}))}),it("errors when the final-chunk response does not carry hmac_rest",async()=>{const e=s();e.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:{}}));const t=await new o.SendEditExternalAddressScopeTask(e,c).run();expect(t).toStrictEqual((0,n.CommandResultFactory)({error:new n.InvalidStatusWordError("EditScope final-chunk response did not carry hmac_rest")}))}),it("throws on an unsupported blockchain family",async()=>{const e=s();await expect(new o.SendEditExternalAddressScopeTask(e,{...c,blockchainFamily:"dogecoin"}).run()).rejects.toThrow(/Unsupported blockchain family/),expect(e.sendCommand).not.toHaveBeenCalled()})});
2
+ //# sourceMappingURL=SendEditExternalAddressScopeTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/SendEditExternalAddressScopeTask.test.ts"],
4
+ "sourcesContent": ["// Asserts the op-4 (Edit Scope) framed chunk (2-byte BE length + TLV) is\n// byte-for-byte parity with the expected wire layout.\nimport {\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { EditExternalAddressScopeCommand } from \"@internal/app-binder/command/EditExternalAddressScopeCommand\";\n\nimport { SendEditExternalAddressScopeTask } from \"./SendEditExternalAddressScopeTask\";\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n out[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return out;\n}\n\n// Framed chunk = \"00 c9\" (2-byte BE total TLV length = 201) + TLV.\n// Tag order: STRUCT_TYPE(0x32), STRUCT_VERSION, CONTACT_NAME, SCOPE(new),\n// ACCOUNT_IDENTIFIER, PREVIOUS_SCOPE, GROUP_HANDLE, CHAIN_ID, HMAC_PROOF,\n// HMAC_REST(old), BLOCKCHAIN_FAMILY. No DERIVATION_PATH TLV.\nconst FRAMED_CHUNK = hexToBytes(\n \"00c9\" +\n \"010132\" +\n \"020101\" +\n \"81f005416c696365\" + // CONTACT_NAME \"Alice\"\n \"81f10845746820636f6c64\" + // SCOPE (new) \"Eth cold\"\n \"81f214\" +\n \"55\".repeat(20) + // ACCOUNT_IDENTIFIER (unchanged)\n \"81f508457468206d61696e\" + // PREVIOUS_SCOPE \"Eth main\"\n \"81f640\" +\n \"cc\".repeat(64) +\n \"230101\" +\n \"2920\" +\n \"dd\".repeat(32) +\n \"81f720\" +\n \"aa\".repeat(32) +\n \"510101\",\n);\n\nconst OK_PROOF = { hmacRest: hexToBytes(\"88\".repeat(32)) };\n\nconst BASE_ARGS = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n newScope: \"Eth cold\",\n identifier: hexToBytes(\"55\".repeat(20)),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: hexToBytes(\"cc\".repeat(64)),\n hmacProof: hexToBytes(\"dd\".repeat(32)),\n hmacRest: hexToBytes(\"aa\".repeat(32)),\n};\n\nfunction makeApiMock(): InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n} {\n return { sendCommand: vi.fn() } as unknown as InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n };\n}\n\ndescribe(\"SendEditExternalAddressScopeTask\", () => {\n it(\"assembles the framed chunk byte-equal to the fixture and dispatches EditExternalAddressScopeCommand\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOF }),\n );\n\n const result = await new SendEditExternalAddressScopeTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new EditExternalAddressScopeCommand({\n data: FRAMED_CHUNK,\n p2: 0x00,\n }),\n );\n expect(result).toStrictEqual(CommandResultFactory({ data: OK_PROOF }));\n });\n\n it(\"omits the CHAIN_ID TLV when chainId is not provided\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOF }),\n );\n\n await new SendEditExternalAddressScopeTask(api, {\n ...BASE_ARGS,\n chainId: undefined,\n }).run();\n\n const command = api.sendCommand.mock\n .calls[0]![0] as EditExternalAddressScopeCommand;\n const framedHex = Buffer.from(command.args.data).toString(\"hex\");\n // No `23 01 ..` CHAIN_ID TLV; HMAC_PROOF (29 20 ..) follows the path directly.\n expect(framedHex).not.toContain(\"230101\");\n expect(framedHex.endsWith(\"510101\")).toBe(true);\n });\n\n it(\"propagates command-level errors\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n\n const result = await new SendEditExternalAddressScopeTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n });\n\n it(\"errors when the final-chunk response does not carry hmac_rest\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(CommandResultFactory({ data: {} }));\n\n const result = await new SendEditExternalAddressScopeTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\n \"EditScope final-chunk response did not carry hmac_rest\",\n ),\n }),\n );\n });\n\n it(\"throws on an unsupported blockchain family\", async () => {\n const api = makeApiMock();\n\n await expect(\n new SendEditExternalAddressScopeTask(api, {\n ...BASE_ARGS,\n blockchainFamily: \"dogecoin\",\n }).run(),\n ).rejects.toThrow(/Unsupported blockchain family/);\n expect(api.sendCommand).not.toHaveBeenCalled();\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_EditExternalAddressScopeCommand", "import_SendEditExternalAddressScopeTask", "hexToBytes", "hex", "out", "i", "FRAMED_CHUNK", "OK_PROOF", "BASE_ARGS", "makeApiMock", "api", "result", "command", "framedHex"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var s=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var T=(a,r)=>{for(var o in r)s(a,o,{get:r[o],enumerable:!0})},g=(a,r,o,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of u(r))!I.call(a,i)&&i!==o&&s(a,i,{get:()=>r[i],enumerable:!(t=C(r,i))||t.enumerable});return a};var A=a=>g(s({},"__esModule",{value:!0}),a);var f={};T(f,{SendRegisterIdentityTask:()=>R});module.exports=A(f);var n=require("@ledgerhq/device-management-kit"),l=require("../../app-binder/command/RegisterIdentityCommand"),d=require("../../app-binder/model/contactsConstants"),e=require("../../app-binder/services/contactsTlvSerializer"),y=require("../../app-binder/services/sendFramedContactsPayload");class R{constructor(r,o){this.api=r;this.args=o}async run(){const r=this.buildPayload(this.args),o=await(0,y.sendFramedContactsPayload)(this.api,{payload:r,p1:d.SUB_CMD_REGISTER_IDENTITY,makeCommand:(m,p)=>new l.RegisterIdentityCommand({data:m,p2:p}),logger:this.args.logger,commandTag:"SendRegisterIdentityTask"});if(!(0,n.isSuccessCommandResult)(o))return o;const{groupHandle:t,hmacProof:i,hmacRest:c}=o.data;return!t||!i||!c?(0,n.DmkResultFactory)({error:new n.InvalidStatusWordError("RegisterIdentity final-chunk response was incomplete")}):(0,n.DmkResultFactory)({data:{groupHandle:t,hmacProof:i,hmacRest:c}})}buildPayload(r){const o=d.BLOCKCHAIN_FAMILY_BY_NAME[r.blockchainFamily.toLowerCase()];if(o===void 0)throw new Error(`Unsupported blockchain family: ${r.blockchainFamily}`);const t=new n.ByteArrayBuilder;return(0,e.encodeTlvUInt8)(t,e.CONTACTS_TLV_TAG.STRUCT_TYPE,e.STRUCT_TYPE_REGISTER_IDENTITY),(0,e.encodeTlvUInt8)(t,e.CONTACTS_TLV_TAG.STRUCT_VERSION,e.STRUCT_VERSION_VALUE),(0,e.encodeTlvAscii)(t,e.CONTACTS_TLV_TAG.CONTACT_NAME,r.contactName),(0,e.encodeTlvAscii)(t,e.CONTACTS_TLV_TAG.SCOPE,r.scope),(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER,r.identifier),(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.DERIVATION_PATH,(0,e.packDerivationPath)([2147483692,2147483708,2147483648,0,0])),r.chainId!==void 0&&(0,e.encodeTlvChainId)(t,e.CONTACTS_TLV_TAG.CHAIN_ID,r.chainId),(0,e.encodeTlvUInt8)(t,e.CONTACTS_TLV_TAG.BLOCKCHAIN_FAMILY,o),r.existingContactGroup&&((0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.GROUP_HANDLE,r.existingContactGroup.groupHandle),(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.HMAC_PROOF,r.existingContactGroup.hmacProof)),t.build()}}0&&(module.exports={SendRegisterIdentityTask});
1
+ "use strict";var s=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var T=(i,r)=>{for(var o in r)s(i,o,{get:r[o],enumerable:!0})},g=(i,r,o,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of u(r))!I.call(i,a)&&a!==o&&s(i,a,{get:()=>r[a],enumerable:!(t=C(r,a))||t.enumerable});return i};var R=i=>g(s({},"__esModule",{value:!0}),i);var f={};T(f,{SendRegisterIdentityTask:()=>A});module.exports=R(f);var n=require("@ledgerhq/device-management-kit"),c=require("../../app-binder/command/RegisterIdentityCommand"),d=require("../../app-binder/model/contactsConstants"),e=require("../../app-binder/services/contactsTlvSerializer"),y=require("../../app-binder/services/sendFramedContactsPayload");class A{constructor(r,o){this.api=r;this.args=o}async run(){const r=this.buildPayload(this.args),o=await(0,y.sendFramedContactsPayload)(this.api,{payload:r,p1:d.SUB_CMD_REGISTER_IDENTITY,makeCommand:(m,p)=>new c.RegisterIdentityCommand({data:m,p2:p}),logger:this.args.logger,commandTag:"SendRegisterIdentityTask"});if(!(0,n.isSuccessCommandResult)(o))return o;const{groupHandle:t,hmacProof:a,hmacRest:l}=o.data;return!t||!a||!l?(0,n.DmkResultFactory)({error:new n.InvalidStatusWordError("RegisterIdentity final-chunk response was incomplete")}):(0,n.DmkResultFactory)({data:{groupHandle:t,hmacProof:a,hmacRest:l}})}buildPayload(r){const o=d.BLOCKCHAIN_FAMILY_BY_NAME[r.blockchainFamily.toLowerCase()];if(o===void 0)throw new Error(`Unsupported blockchain family: ${r.blockchainFamily}`);const t=new n.ByteArrayBuilder;return(0,e.encodeTlvUInt8)(t,e.CONTACTS_TLV_TAG.STRUCT_TYPE,e.STRUCT_TYPE_REGISTER_IDENTITY),(0,e.encodeTlvUInt8)(t,e.CONTACTS_TLV_TAG.STRUCT_VERSION,e.STRUCT_VERSION_VALUE),(0,e.encodeTlvAscii)(t,e.CONTACTS_TLV_TAG.CONTACT_NAME,r.contactName),(0,e.encodeTlvAscii)(t,e.CONTACTS_TLV_TAG.SCOPE,r.scope),(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER,r.identifier),r.chainId!==void 0&&(0,e.encodeTlvChainId)(t,e.CONTACTS_TLV_TAG.CHAIN_ID,r.chainId),(0,e.encodeTlvUInt8)(t,e.CONTACTS_TLV_TAG.BLOCKCHAIN_FAMILY,o),r.existingContactGroup&&((0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.GROUP_HANDLE,r.existingContactGroup.groupHandle),(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.HMAC_PROOF,r.existingContactGroup.hmacProof)),t.build()}}0&&(module.exports={SendRegisterIdentityTask});
2
2
  //# sourceMappingURL=SendRegisterIdentityTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/SendRegisterIdentityTask.ts"],
4
- "sourcesContent": ["// Builds the TLV payload for op 1 (Register Identity / Register External\n// Address) and dispatches it via the chunked-framing scheme shared with the\n// other address-book ops (2-byte BE total length + <=255B chunks). The device\n// returns the 129-byte register response on the final chunk.\n//\n// Reference: Address Book Final Specifications \u2014 Register Identity. Tag order:\n// STRUCT_TYPE, STRUCT_VERSION, CONTACT_NAME, SCOPE, ACCOUNT_IDENTIFIER,\n// DERIVATION_PATH, CHAIN_ID (Ethereum only), BLOCKCHAIN_FAMILY, then optional\n// GROUP_HANDLE + HMAC_PROOF when extending an existing group.\n//\n// DERIVATION_PATH (tag 0x69, default m/44'/60'/0'/0/0): the Ethereum app\n// requires it on Register Identity and rejects the payload with 0x6a80 when it\n// is absent (verified on-device against the deployed dev app).\nimport {\n ByteArrayBuilder,\n type CommandResult,\n DmkResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type ExistingContactGroup } from \"@api/model/RegisterExternalAddress\";\nimport { RegisterIdentityCommand } from \"@internal/app-binder/command/RegisterIdentityCommand\";\nimport {\n BLOCKCHAIN_FAMILY_BY_NAME,\n SUB_CMD_REGISTER_IDENTITY,\n} from \"@internal/app-binder/model/contactsConstants\";\nimport { type ContactsErrorCodes } from \"@internal/app-binder/model/contactsErrors\";\nimport {\n CONTACTS_TLV_TAG,\n encodeTlvAscii,\n encodeTlvBuffer,\n encodeTlvChainId,\n encodeTlvUInt8,\n packDerivationPath,\n STRUCT_TYPE_REGISTER_IDENTITY,\n STRUCT_VERSION_VALUE,\n} from \"@internal/app-binder/services/contactsTlvSerializer\";\nimport { sendFramedContactsPayload } from \"@internal/app-binder/services/sendFramedContactsPayload\";\n\nexport type RegisterIdentityProofs = {\n readonly groupHandle: Uint8Array;\n readonly hmacProof: Uint8Array;\n readonly hmacRest: Uint8Array;\n};\n\nexport type SendRegisterIdentityTaskArgs = {\n readonly contactName: string;\n readonly scope: string;\n readonly identifier: Uint8Array;\n readonly blockchainFamily: string;\n readonly chainId?: bigint;\n readonly existingContactGroup?: ExistingContactGroup;\n readonly logger?: LoggerPublisherService;\n};\n\nexport class SendRegisterIdentityTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: SendRegisterIdentityTaskArgs,\n ) {}\n\n async run(): Promise<\n CommandResult<RegisterIdentityProofs, ContactsErrorCodes>\n > {\n const payload = this.buildPayload(this.args);\n\n const result = (await sendFramedContactsPayload(this.api, {\n payload,\n p1: SUB_CMD_REGISTER_IDENTITY,\n makeCommand: (chunk, p2) =>\n new RegisterIdentityCommand({ data: chunk, p2 }),\n logger: this.args.logger,\n commandTag: \"SendRegisterIdentityTask\",\n })) as CommandResult<\n {\n readonly groupHandle?: Uint8Array;\n readonly hmacProof?: Uint8Array;\n readonly hmacRest?: Uint8Array;\n },\n ContactsErrorCodes\n >;\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n\n const { groupHandle, hmacProof, hmacRest } = result.data;\n if (!groupHandle || !hmacProof || !hmacRest) {\n return DmkResultFactory({\n error: new InvalidStatusWordError(\n \"RegisterIdentity final-chunk response was incomplete\",\n ),\n });\n }\n return DmkResultFactory({ data: { groupHandle, hmacProof, hmacRest } });\n }\n\n private buildPayload(args: SendRegisterIdentityTaskArgs): Uint8Array {\n const family =\n BLOCKCHAIN_FAMILY_BY_NAME[args.blockchainFamily.toLowerCase()];\n if (family === undefined) {\n throw new Error(\n `Unsupported blockchain family: ${args.blockchainFamily}`,\n );\n }\n\n const builder = new ByteArrayBuilder();\n encodeTlvUInt8(\n builder,\n CONTACTS_TLV_TAG.STRUCT_TYPE,\n STRUCT_TYPE_REGISTER_IDENTITY,\n );\n encodeTlvUInt8(\n builder,\n CONTACTS_TLV_TAG.STRUCT_VERSION,\n STRUCT_VERSION_VALUE,\n );\n encodeTlvAscii(builder, CONTACTS_TLV_TAG.CONTACT_NAME, args.contactName);\n encodeTlvAscii(builder, CONTACTS_TLV_TAG.SCOPE, args.scope);\n encodeTlvBuffer(\n builder,\n CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER,\n args.identifier,\n );\n // The Ethereum app requires DERIVATION_PATH on Register Identity (0x6a80\n // without it). Default m/44'/60'/0'/0/0.\n encodeTlvBuffer(\n builder,\n CONTACTS_TLV_TAG.DERIVATION_PATH,\n packDerivationPath([0x8000002c, 0x8000003c, 0x80000000, 0, 0]),\n );\n if (args.chainId !== undefined) {\n encodeTlvChainId(builder, CONTACTS_TLV_TAG.CHAIN_ID, args.chainId);\n }\n encodeTlvUInt8(builder, CONTACTS_TLV_TAG.BLOCKCHAIN_FAMILY, family);\n\n if (args.existingContactGroup) {\n encodeTlvBuffer(\n builder,\n CONTACTS_TLV_TAG.GROUP_HANDLE,\n args.existingContactGroup.groupHandle,\n );\n encodeTlvBuffer(\n builder,\n CONTACTS_TLV_TAG.HMAC_PROOF,\n args.existingContactGroup.hmacProof,\n );\n }\n\n return builder.build();\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAaA,IAAAI,EAQO,2CAGPC,EAAwC,gEACxCC,EAGO,wDAEPC,EASO,+DACPC,EAA0C,mEAkBnC,MAAMN,CAAyB,CACpC,YACmBO,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAEJ,CACA,MAAMC,EAAU,KAAK,aAAa,KAAK,IAAI,EAErCC,EAAU,QAAM,6BAA0B,KAAK,IAAK,CACxD,QAAAD,EACA,GAAI,4BACJ,YAAa,CAACE,EAAOC,IACnB,IAAI,0BAAwB,CAAE,KAAMD,EAAO,GAAAC,CAAG,CAAC,EACjD,OAAQ,KAAK,KAAK,OAClB,WAAY,0BACd,CAAC,EASD,GAAI,IAAC,0BAAuBF,CAAM,EAChC,OAAOA,EAGT,KAAM,CAAE,YAAAG,EAAa,UAAAC,EAAW,SAAAC,CAAS,EAAIL,EAAO,KACpD,MAAI,CAACG,GAAe,CAACC,GAAa,CAACC,KAC1B,oBAAiB,CACtB,MAAO,IAAI,yBACT,sDACF,CACF,CAAC,KAEI,oBAAiB,CAAE,KAAM,CAAE,YAAAF,EAAa,UAAAC,EAAW,SAAAC,CAAS,CAAE,CAAC,CACxE,CAEQ,aAAaP,EAAgD,CACnE,MAAMQ,EACJ,4BAA0BR,EAAK,iBAAiB,YAAY,CAAC,EAC/D,GAAIQ,IAAW,OACb,MAAM,IAAI,MACR,kCAAkCR,EAAK,gBAAgB,EACzD,EAGF,MAAMS,EAAU,IAAI,mBACpB,2BACEA,EACA,mBAAiB,YACjB,+BACF,KACA,kBACEA,EACA,mBAAiB,eACjB,sBACF,KACA,kBAAeA,EAAS,mBAAiB,aAAcT,EAAK,WAAW,KACvE,kBAAeS,EAAS,mBAAiB,MAAOT,EAAK,KAAK,KAC1D,mBACES,EACA,mBAAiB,mBACjBT,EAAK,UACP,KAGA,mBACES,EACA,mBAAiB,mBACjB,sBAAmB,CAAC,WAAY,WAAY,WAAY,EAAG,CAAC,CAAC,CAC/D,EACIT,EAAK,UAAY,WACnB,oBAAiBS,EAAS,mBAAiB,SAAUT,EAAK,OAAO,KAEnE,kBAAeS,EAAS,mBAAiB,kBAAmBD,CAAM,EAE9DR,EAAK,0BACP,mBACES,EACA,mBAAiB,aACjBT,EAAK,qBAAqB,WAC5B,KACA,mBACES,EACA,mBAAiB,WACjBT,EAAK,qBAAqB,SAC5B,GAGKS,EAAQ,MAAM,CACvB,CACF",
4
+ "sourcesContent": ["// Builds the TLV payload for op 1 (Register Identity / Register External\n// Address) and dispatches it via the chunked-framing scheme shared with the\n// other address-book ops (2-byte BE total length + <=255B chunks). The device\n// returns the 129-byte register response on the final chunk.\n//\n// Reference: Address Book Final Specifications \u2014 Register Identity. Tag order:\n// STRUCT_TYPE, STRUCT_VERSION, CONTACT_NAME, SCOPE, ACCOUNT_IDENTIFIER,\n// CHAIN_ID (Ethereum only), BLOCKCHAIN_FAMILY, then optional\n// GROUP_HANDLE + HMAC_PROOF when extending an existing group.\n//\n// No DERIVATION_PATH: external-address ops carry no path. The current Ethereum\n// app rejects the tag when present (0x6a80) and no longer requires it; the tag\n// is Ledger-Account only (verified on-device, DSDK-1465).\nimport {\n ByteArrayBuilder,\n type CommandResult,\n DmkResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type ExistingContactGroup } from \"@api/model/RegisterExternalAddress\";\nimport { RegisterIdentityCommand } from \"@internal/app-binder/command/RegisterIdentityCommand\";\nimport {\n BLOCKCHAIN_FAMILY_BY_NAME,\n SUB_CMD_REGISTER_IDENTITY,\n} from \"@internal/app-binder/model/contactsConstants\";\nimport { type ContactsErrorCodes } from \"@internal/app-binder/model/contactsErrors\";\nimport {\n CONTACTS_TLV_TAG,\n encodeTlvAscii,\n encodeTlvBuffer,\n encodeTlvChainId,\n encodeTlvUInt8,\n STRUCT_TYPE_REGISTER_IDENTITY,\n STRUCT_VERSION_VALUE,\n} from \"@internal/app-binder/services/contactsTlvSerializer\";\nimport { sendFramedContactsPayload } from \"@internal/app-binder/services/sendFramedContactsPayload\";\n\nexport type RegisterIdentityProofs = {\n readonly groupHandle: Uint8Array;\n readonly hmacProof: Uint8Array;\n readonly hmacRest: Uint8Array;\n};\n\nexport type SendRegisterIdentityTaskArgs = {\n readonly contactName: string;\n readonly scope: string;\n readonly identifier: Uint8Array;\n readonly blockchainFamily: string;\n readonly chainId?: bigint;\n readonly existingContactGroup?: ExistingContactGroup;\n readonly logger?: LoggerPublisherService;\n};\n\nexport class SendRegisterIdentityTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: SendRegisterIdentityTaskArgs,\n ) {}\n\n async run(): Promise<\n CommandResult<RegisterIdentityProofs, ContactsErrorCodes>\n > {\n const payload = this.buildPayload(this.args);\n\n const result = (await sendFramedContactsPayload(this.api, {\n payload,\n p1: SUB_CMD_REGISTER_IDENTITY,\n makeCommand: (chunk, p2) =>\n new RegisterIdentityCommand({ data: chunk, p2 }),\n logger: this.args.logger,\n commandTag: \"SendRegisterIdentityTask\",\n })) as CommandResult<\n {\n readonly groupHandle?: Uint8Array;\n readonly hmacProof?: Uint8Array;\n readonly hmacRest?: Uint8Array;\n },\n ContactsErrorCodes\n >;\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n\n const { groupHandle, hmacProof, hmacRest } = result.data;\n if (!groupHandle || !hmacProof || !hmacRest) {\n return DmkResultFactory({\n error: new InvalidStatusWordError(\n \"RegisterIdentity final-chunk response was incomplete\",\n ),\n });\n }\n return DmkResultFactory({ data: { groupHandle, hmacProof, hmacRest } });\n }\n\n private buildPayload(args: SendRegisterIdentityTaskArgs): Uint8Array {\n const family =\n BLOCKCHAIN_FAMILY_BY_NAME[args.blockchainFamily.toLowerCase()];\n if (family === undefined) {\n throw new Error(\n `Unsupported blockchain family: ${args.blockchainFamily}`,\n );\n }\n\n const builder = new ByteArrayBuilder();\n encodeTlvUInt8(\n builder,\n CONTACTS_TLV_TAG.STRUCT_TYPE,\n STRUCT_TYPE_REGISTER_IDENTITY,\n );\n encodeTlvUInt8(\n builder,\n CONTACTS_TLV_TAG.STRUCT_VERSION,\n STRUCT_VERSION_VALUE,\n );\n encodeTlvAscii(builder, CONTACTS_TLV_TAG.CONTACT_NAME, args.contactName);\n encodeTlvAscii(builder, CONTACTS_TLV_TAG.SCOPE, args.scope);\n encodeTlvBuffer(\n builder,\n CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER,\n args.identifier,\n );\n if (args.chainId !== undefined) {\n encodeTlvChainId(builder, CONTACTS_TLV_TAG.CHAIN_ID, args.chainId);\n }\n encodeTlvUInt8(builder, CONTACTS_TLV_TAG.BLOCKCHAIN_FAMILY, family);\n\n if (args.existingContactGroup) {\n encodeTlvBuffer(\n builder,\n CONTACTS_TLV_TAG.GROUP_HANDLE,\n args.existingContactGroup.groupHandle,\n );\n encodeTlvBuffer(\n builder,\n CONTACTS_TLV_TAG.HMAC_PROOF,\n args.existingContactGroup.hmacProof,\n );\n }\n\n return builder.build();\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAaA,IAAAI,EAQO,2CAGPC,EAAwC,gEACxCC,EAGO,wDAEPC,EAQO,+DACPC,EAA0C,mEAkBnC,MAAMN,CAAyB,CACpC,YACmBO,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAEJ,CACA,MAAMC,EAAU,KAAK,aAAa,KAAK,IAAI,EAErCC,EAAU,QAAM,6BAA0B,KAAK,IAAK,CACxD,QAAAD,EACA,GAAI,4BACJ,YAAa,CAACE,EAAOC,IACnB,IAAI,0BAAwB,CAAE,KAAMD,EAAO,GAAAC,CAAG,CAAC,EACjD,OAAQ,KAAK,KAAK,OAClB,WAAY,0BACd,CAAC,EASD,GAAI,IAAC,0BAAuBF,CAAM,EAChC,OAAOA,EAGT,KAAM,CAAE,YAAAG,EAAa,UAAAC,EAAW,SAAAC,CAAS,EAAIL,EAAO,KACpD,MAAI,CAACG,GAAe,CAACC,GAAa,CAACC,KAC1B,oBAAiB,CACtB,MAAO,IAAI,yBACT,sDACF,CACF,CAAC,KAEI,oBAAiB,CAAE,KAAM,CAAE,YAAAF,EAAa,UAAAC,EAAW,SAAAC,CAAS,CAAE,CAAC,CACxE,CAEQ,aAAaP,EAAgD,CACnE,MAAMQ,EACJ,4BAA0BR,EAAK,iBAAiB,YAAY,CAAC,EAC/D,GAAIQ,IAAW,OACb,MAAM,IAAI,MACR,kCAAkCR,EAAK,gBAAgB,EACzD,EAGF,MAAMS,EAAU,IAAI,mBACpB,2BACEA,EACA,mBAAiB,YACjB,+BACF,KACA,kBACEA,EACA,mBAAiB,eACjB,sBACF,KACA,kBAAeA,EAAS,mBAAiB,aAAcT,EAAK,WAAW,KACvE,kBAAeS,EAAS,mBAAiB,MAAOT,EAAK,KAAK,KAC1D,mBACES,EACA,mBAAiB,mBACjBT,EAAK,UACP,EACIA,EAAK,UAAY,WACnB,oBAAiBS,EAAS,mBAAiB,SAAUT,EAAK,OAAO,KAEnE,kBAAeS,EAAS,mBAAiB,kBAAmBD,CAAM,EAE9DR,EAAK,0BACP,mBACES,EACA,mBAAiB,aACjBT,EAAK,qBAAqB,WAC5B,KACA,mBACES,EACA,mBAAiB,WACjBT,EAAK,qBAAqB,SAC5B,GAGKS,EAAQ,MAAM,CACvB,CACF",
6
6
  "names": ["SendRegisterIdentityTask_exports", "__export", "SendRegisterIdentityTask", "__toCommonJS", "import_device_management_kit", "import_RegisterIdentityCommand", "import_contactsConstants", "import_contactsTlvSerializer", "import_sendFramedContactsPayload", "api", "args", "payload", "result", "chunk", "p2", "groupHandle", "hmacProof", "hmacRest", "family", "builder"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var n=require("@ledgerhq/device-management-kit"),r=require("../../app-binder/command/RegisterIdentityCommand"),a=require("./SendRegisterIdentityTask");function e(c){const d=new Uint8Array(c.length/2);for(let t=0;t<c.length;t+=2)d[t/2]=parseInt(c.slice(t,t+2),16);return d}const s=e("004d01012d02010181f005416c69636581f108457468206d61696e81f21400000000000000000000000000000000deadbeef6915058000002c8000003c800000000000000000000000230101510101"),m=e("00b301012d02010181f005416c69636581f108417262206d61696e81f21444444444444444444444444444444444444444446915058000002c8000003c8000000000000000000000002302a4b151010181f640cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc2920dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"),i={groupHandle:e("cc".repeat(64)),hmacProof:e("dd".repeat(32)),hmacRest:e("aa".repeat(32))};function o(){return{sendCommand:vi.fn()}}describe("SendRegisterIdentityTask",()=>{it("assembles a fresh-register framed chunk and dispatches RegisterIdentityCommand",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:i}));const d=await new a.SendRegisterIdentityTask(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"ethereum",chainId:1n}).run();expect(c.sendCommand.mock.calls).toHaveLength(1),expect(c.sendCommand.mock.calls[0][0]).toStrictEqual(new r.RegisterIdentityCommand({data:s,p2:0})),expect(d).toStrictEqual((0,n.CommandResultFactory)({data:i}))}),it("appends GROUP_HANDLE + HMAC_PROOF on extension and frames the extension payload",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:i})),await new a.SendRegisterIdentityTask(c,{contactName:"Alice",scope:"Arb main",identifier:e("44".repeat(20)),blockchainFamily:"ethereum",chainId:42161n,existingContactGroup:{groupHandle:e("cc".repeat(64)),hmacProof:e("dd".repeat(32))}}).run(),expect(c.sendCommand.mock.calls).toHaveLength(1),expect(c.sendCommand.mock.calls[0][0]).toStrictEqual(new r.RegisterIdentityCommand({data:m,p2:0}))}),it("omits the CHAIN_ID TLV when chainId is not provided",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:i})),await new a.SendRegisterIdentityTask(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"ethereum"}).run();const d=c.sendCommand.mock.calls[0][0],t=Buffer.from(d.args.data).toString("hex");expect(t).not.toContain("230101"),expect(t.endsWith("510101")).toBe(!0)}),it("propagates command-level errors",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({error:new n.InvalidStatusWordError("user cancelled")}));const d=await new a.SendRegisterIdentityTask(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"ethereum",chainId:1n}).run();expect(d).toStrictEqual((0,n.CommandResultFactory)({error:new n.InvalidStatusWordError("user cancelled")}))}),it("throws on an unsupported blockchain family",async()=>{const c=o();await expect(new a.SendRegisterIdentityTask(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"dogecoin",chainId:1n}).run()).rejects.toThrow(/Unsupported blockchain family/),expect(c.sendCommand).not.toHaveBeenCalled()})});
1
+ "use strict";var n=require("@ledgerhq/device-management-kit"),r=require("../../app-binder/command/RegisterIdentityCommand"),a=require("./SendRegisterIdentityTask");function e(c){const d=new Uint8Array(c.length/2);for(let t=0;t<c.length;t+=2)d[t/2]=parseInt(c.slice(t,t+2),16);return d}const s=e("003601012d02010181f005416c69636581f108457468206d61696e81f21400000000000000000000000000000000deadbeef230101510101"),m=e("009c01012d02010181f005416c69636581f108417262206d61696e81f21444444444444444444444444444444444444444442302a4b151010181f640cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc2920dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"),i={groupHandle:e("cc".repeat(64)),hmacProof:e("dd".repeat(32)),hmacRest:e("aa".repeat(32))};function o(){return{sendCommand:vi.fn()}}describe("SendRegisterIdentityTask",()=>{it("assembles a fresh-register framed chunk and dispatches RegisterIdentityCommand",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:i}));const d=await new a.SendRegisterIdentityTask(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"ethereum",chainId:1n}).run();expect(c.sendCommand.mock.calls).toHaveLength(1),expect(c.sendCommand.mock.calls[0][0]).toStrictEqual(new r.RegisterIdentityCommand({data:s,p2:0})),expect(d).toStrictEqual((0,n.CommandResultFactory)({data:i}))}),it("appends GROUP_HANDLE + HMAC_PROOF on extension and frames the extension payload",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:i})),await new a.SendRegisterIdentityTask(c,{contactName:"Alice",scope:"Arb main",identifier:e("44".repeat(20)),blockchainFamily:"ethereum",chainId:42161n,existingContactGroup:{groupHandle:e("cc".repeat(64)),hmacProof:e("dd".repeat(32))}}).run(),expect(c.sendCommand.mock.calls).toHaveLength(1),expect(c.sendCommand.mock.calls[0][0]).toStrictEqual(new r.RegisterIdentityCommand({data:m,p2:0}))}),it("omits the CHAIN_ID TLV when chainId is not provided",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({data:i})),await new a.SendRegisterIdentityTask(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"ethereum"}).run();const d=c.sendCommand.mock.calls[0][0],t=Buffer.from(d.args.data).toString("hex");expect(t).not.toContain("230101"),expect(t.endsWith("510101")).toBe(!0)}),it("propagates command-level errors",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce((0,n.CommandResultFactory)({error:new n.InvalidStatusWordError("user cancelled")}));const d=await new a.SendRegisterIdentityTask(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"ethereum",chainId:1n}).run();expect(d).toStrictEqual((0,n.CommandResultFactory)({error:new n.InvalidStatusWordError("user cancelled")}))}),it("throws on an unsupported blockchain family",async()=>{const c=o();await expect(new a.SendRegisterIdentityTask(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"dogecoin",chainId:1n}).run()).rejects.toThrow(/Unsupported blockchain family/),expect(c.sendCommand).not.toHaveBeenCalled()})});
2
2
  //# sourceMappingURL=SendRegisterIdentityTask.test.js.map