@ledgerhq/device-contacts-kit 0.0.0-develop-20260827155839 → 0.0.0-develop-20260829001241

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 (286) hide show
  1. package/README.md +57 -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/RegisterExternalAddressDeviceActionTypes.js +2 -0
  5. package/lib/cjs/api/app-binder/RegisterExternalAddressDeviceActionTypes.js.map +7 -0
  6. package/lib/cjs/api/app-binder/RenameContactDeviceActionTypes.js +2 -0
  7. package/lib/cjs/api/app-binder/RenameContactDeviceActionTypes.js.map +7 -0
  8. package/lib/cjs/api/index.js +1 -1
  9. package/lib/cjs/api/index.js.map +2 -2
  10. package/lib/cjs/api/model/RegisterExternalAddress.js +2 -0
  11. package/lib/cjs/api/model/RegisterExternalAddress.js.map +7 -0
  12. package/lib/cjs/api/model/RenameContact.js +2 -0
  13. package/lib/cjs/api/model/RenameContact.js.map +7 -0
  14. package/lib/cjs/internal/DefaultContactsManager.js +1 -1
  15. package/lib/cjs/internal/DefaultContactsManager.js.map +3 -3
  16. package/lib/cjs/internal/DefaultContactsManager.test.js +2 -0
  17. package/lib/cjs/internal/DefaultContactsManager.test.js.map +7 -0
  18. package/lib/cjs/internal/app-binder/ContactsAppBinder.js +1 -1
  19. package/lib/cjs/internal/app-binder/ContactsAppBinder.js.map +3 -3
  20. package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.js +2 -0
  21. package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.js.map +7 -0
  22. package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.test.js +2 -0
  23. package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.test.js.map +7 -0
  24. package/lib/cjs/internal/app-binder/command/RenameContactCommand.js +2 -0
  25. package/lib/cjs/internal/app-binder/command/RenameContactCommand.js.map +7 -0
  26. package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js +2 -0
  27. package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js.map +7 -0
  28. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js +2 -0
  29. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js.map +7 -0
  30. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js +2 -0
  31. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js.map +7 -0
  32. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.js +2 -0
  33. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.js.map +7 -0
  34. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js +2 -0
  35. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js.map +7 -0
  36. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +2 -0
  37. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +7 -0
  38. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +2 -0
  39. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +7 -0
  40. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js +2 -0
  41. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js.map +7 -0
  42. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +2 -0
  43. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +7 -0
  44. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
  45. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
  46. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +2 -0
  47. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +7 -0
  48. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +2 -0
  49. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +7 -0
  50. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js +2 -0
  51. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js.map +7 -0
  52. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
  53. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
  54. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.js +1 -1
  55. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.js.map +3 -3
  56. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.test.js +1 -1
  57. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.test.js.map +3 -3
  58. package/lib/cjs/internal/app-binder/model/contactsConstants.js +2 -0
  59. package/lib/cjs/internal/app-binder/model/contactsConstants.js.map +7 -0
  60. package/lib/cjs/internal/app-binder/model/contactsErrors.js +2 -0
  61. package/lib/cjs/internal/app-binder/model/contactsErrors.js.map +7 -0
  62. package/lib/cjs/internal/app-binder/model/contactsValidation.js +2 -0
  63. package/lib/cjs/internal/app-binder/model/contactsValidation.js.map +7 -0
  64. package/lib/cjs/internal/app-binder/model/contactsValidation.test.js +2 -0
  65. package/lib/cjs/internal/app-binder/model/contactsValidation.test.js.map +7 -0
  66. package/lib/cjs/internal/app-binder/services/contactsTlvSerializer.js +2 -0
  67. package/lib/cjs/internal/app-binder/services/contactsTlvSerializer.js.map +7 -0
  68. package/lib/cjs/internal/app-binder/services/contactsTlvSerializer.test.js +2 -0
  69. package/lib/cjs/internal/app-binder/services/contactsTlvSerializer.test.js.map +7 -0
  70. package/lib/cjs/internal/app-binder/services/sendFramedContactsPayload.js +2 -0
  71. package/lib/cjs/internal/app-binder/services/sendFramedContactsPayload.js.map +7 -0
  72. package/lib/cjs/internal/app-binder/services/sendFramedContactsPayload.test.js +2 -0
  73. package/lib/cjs/internal/app-binder/services/sendFramedContactsPayload.test.js.map +7 -0
  74. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.js +2 -0
  75. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.js.map +7 -0
  76. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js +2 -0
  77. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +7 -0
  78. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js +2 -0
  79. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js.map +7 -0
  80. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js +2 -0
  81. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js.map +7 -0
  82. package/lib/cjs/internal/di.js +1 -1
  83. package/lib/cjs/internal/di.js.map +3 -3
  84. package/lib/cjs/internal/di.test.js +1 -1
  85. package/lib/cjs/internal/di.test.js.map +3 -3
  86. package/lib/cjs/internal/use-cases/RegisterExternalAddressUseCase.js +2 -0
  87. package/lib/cjs/internal/use-cases/RegisterExternalAddressUseCase.js.map +7 -0
  88. package/lib/cjs/internal/use-cases/RegisterExternalAddressUseCase.test.js +2 -0
  89. package/lib/cjs/internal/use-cases/RegisterExternalAddressUseCase.test.js.map +7 -0
  90. package/lib/cjs/internal/use-cases/RenameContactUseCase.js +2 -0
  91. package/lib/cjs/internal/use-cases/RenameContactUseCase.js.map +7 -0
  92. package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js +2 -0
  93. package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js.map +7 -0
  94. package/lib/cjs/internal/use-cases/di/useCaseModule.js +2 -0
  95. package/lib/cjs/internal/use-cases/di/useCaseModule.js.map +7 -0
  96. package/lib/cjs/internal/use-cases/di/useCaseTypes.js +2 -0
  97. package/lib/cjs/internal/use-cases/di/useCaseTypes.js.map +7 -0
  98. package/lib/cjs/package.json +2 -1
  99. package/lib/esm/api/app-binder/RegisterExternalAddressDeviceActionTypes.js +1 -0
  100. package/lib/esm/api/app-binder/RegisterExternalAddressDeviceActionTypes.js.map +7 -0
  101. package/lib/esm/api/app-binder/RenameContactDeviceActionTypes.js +1 -0
  102. package/lib/esm/api/app-binder/RenameContactDeviceActionTypes.js.map +7 -0
  103. package/lib/esm/api/index.js +1 -1
  104. package/lib/esm/api/index.js.map +2 -2
  105. package/lib/esm/api/model/RegisterExternalAddress.js +1 -0
  106. package/lib/esm/api/model/RegisterExternalAddress.js.map +7 -0
  107. package/lib/esm/api/model/RenameContact.js +1 -0
  108. package/lib/esm/api/model/RenameContact.js.map +7 -0
  109. package/lib/esm/internal/DefaultContactsManager.js +1 -1
  110. package/lib/esm/internal/DefaultContactsManager.js.map +3 -3
  111. package/lib/esm/internal/DefaultContactsManager.test.js +2 -0
  112. package/lib/esm/internal/DefaultContactsManager.test.js.map +7 -0
  113. package/lib/esm/internal/app-binder/ContactsAppBinder.js +1 -1
  114. package/lib/esm/internal/app-binder/ContactsAppBinder.js.map +3 -3
  115. package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.js +2 -0
  116. package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.js.map +7 -0
  117. package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.test.js +2 -0
  118. package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.test.js.map +7 -0
  119. package/lib/esm/internal/app-binder/command/RenameContactCommand.js +2 -0
  120. package/lib/esm/internal/app-binder/command/RenameContactCommand.js.map +7 -0
  121. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js +2 -0
  122. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js.map +7 -0
  123. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js +2 -0
  124. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js.map +7 -0
  125. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js +2 -0
  126. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js.map +7 -0
  127. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.js +2 -0
  128. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.js.map +7 -0
  129. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js +2 -0
  130. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js.map +7 -0
  131. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +2 -0
  132. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +7 -0
  133. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +2 -0
  134. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +7 -0
  135. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js +2 -0
  136. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.js.map +7 -0
  137. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +2 -0
  138. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +7 -0
  139. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
  140. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
  141. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +2 -0
  142. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +7 -0
  143. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +2 -0
  144. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +7 -0
  145. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js +2 -0
  146. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js.map +7 -0
  147. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
  148. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
  149. package/lib/esm/internal/app-binder/isContactsSupportedForSession.js +1 -1
  150. package/lib/esm/internal/app-binder/isContactsSupportedForSession.js.map +3 -3
  151. package/lib/esm/internal/app-binder/isContactsSupportedForSession.test.js +1 -1
  152. package/lib/esm/internal/app-binder/isContactsSupportedForSession.test.js.map +3 -3
  153. package/lib/esm/internal/app-binder/model/contactsConstants.js +2 -0
  154. package/lib/esm/internal/app-binder/model/contactsConstants.js.map +7 -0
  155. package/lib/esm/internal/app-binder/model/contactsErrors.js +2 -0
  156. package/lib/esm/internal/app-binder/model/contactsErrors.js.map +7 -0
  157. package/lib/esm/internal/app-binder/model/contactsValidation.js +2 -0
  158. package/lib/esm/internal/app-binder/model/contactsValidation.js.map +7 -0
  159. package/lib/esm/internal/app-binder/model/contactsValidation.test.js +2 -0
  160. package/lib/esm/internal/app-binder/model/contactsValidation.test.js.map +7 -0
  161. package/lib/esm/internal/app-binder/services/contactsTlvSerializer.js +2 -0
  162. package/lib/esm/internal/app-binder/services/contactsTlvSerializer.js.map +7 -0
  163. package/lib/esm/internal/app-binder/services/contactsTlvSerializer.test.js +2 -0
  164. package/lib/esm/internal/app-binder/services/contactsTlvSerializer.test.js.map +7 -0
  165. package/lib/esm/internal/app-binder/services/sendFramedContactsPayload.js +2 -0
  166. package/lib/esm/internal/app-binder/services/sendFramedContactsPayload.js.map +7 -0
  167. package/lib/esm/internal/app-binder/services/sendFramedContactsPayload.test.js +2 -0
  168. package/lib/esm/internal/app-binder/services/sendFramedContactsPayload.test.js.map +7 -0
  169. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.js +2 -0
  170. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.js.map +7 -0
  171. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js +2 -0
  172. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +7 -0
  173. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js +2 -0
  174. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js.map +7 -0
  175. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js +2 -0
  176. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js.map +7 -0
  177. package/lib/esm/internal/di.js +1 -1
  178. package/lib/esm/internal/di.js.map +3 -3
  179. package/lib/esm/internal/di.test.js +1 -1
  180. package/lib/esm/internal/di.test.js.map +3 -3
  181. package/lib/esm/internal/use-cases/RegisterExternalAddressUseCase.js +2 -0
  182. package/lib/esm/internal/use-cases/RegisterExternalAddressUseCase.js.map +7 -0
  183. package/lib/esm/internal/use-cases/RegisterExternalAddressUseCase.test.js +2 -0
  184. package/lib/esm/internal/use-cases/RegisterExternalAddressUseCase.test.js.map +7 -0
  185. package/lib/esm/internal/use-cases/RenameContactUseCase.js +2 -0
  186. package/lib/esm/internal/use-cases/RenameContactUseCase.js.map +7 -0
  187. package/lib/esm/internal/use-cases/RenameContactUseCase.test.js +2 -0
  188. package/lib/esm/internal/use-cases/RenameContactUseCase.test.js.map +7 -0
  189. package/lib/esm/internal/use-cases/di/useCaseModule.js +2 -0
  190. package/lib/esm/internal/use-cases/di/useCaseModule.js.map +7 -0
  191. package/lib/esm/internal/use-cases/di/useCaseTypes.js +2 -0
  192. package/lib/esm/internal/use-cases/di/useCaseTypes.js.map +7 -0
  193. package/lib/esm/package.json +2 -1
  194. package/lib/types/api/ContactsManager.d.ts +23 -5
  195. package/lib/types/api/ContactsManager.d.ts.map +1 -1
  196. package/lib/types/api/app-binder/RegisterExternalAddressDeviceActionTypes.d.ts +30 -0
  197. package/lib/types/api/app-binder/RegisterExternalAddressDeviceActionTypes.d.ts.map +1 -0
  198. package/lib/types/api/app-binder/RenameContactDeviceActionTypes.d.ts +25 -0
  199. package/lib/types/api/app-binder/RenameContactDeviceActionTypes.d.ts.map +1 -0
  200. package/lib/types/api/index.d.ts +4 -0
  201. package/lib/types/api/index.d.ts.map +1 -1
  202. package/lib/types/api/model/RegisterExternalAddress.d.ts +50 -0
  203. package/lib/types/api/model/RegisterExternalAddress.d.ts.map +1 -0
  204. package/lib/types/api/model/RenameContact.d.ts +39 -0
  205. package/lib/types/api/model/RenameContact.d.ts.map +1 -0
  206. package/lib/types/internal/DefaultContactsManager.d.ts +8 -2
  207. package/lib/types/internal/DefaultContactsManager.d.ts.map +1 -1
  208. package/lib/types/internal/DefaultContactsManager.test.d.ts +2 -0
  209. package/lib/types/internal/DefaultContactsManager.test.d.ts.map +1 -0
  210. package/lib/types/internal/app-binder/ContactsAppBinder.d.ts +7 -3
  211. package/lib/types/internal/app-binder/ContactsAppBinder.d.ts.map +1 -1
  212. package/lib/types/internal/app-binder/command/RegisterIdentityCommand.d.ts +30 -0
  213. package/lib/types/internal/app-binder/command/RegisterIdentityCommand.d.ts.map +1 -0
  214. package/lib/types/internal/app-binder/command/RegisterIdentityCommand.test.d.ts +2 -0
  215. package/lib/types/internal/app-binder/command/RegisterIdentityCommand.test.d.ts.map +1 -0
  216. package/lib/types/internal/app-binder/command/RenameContactCommand.d.ts +25 -0
  217. package/lib/types/internal/app-binder/command/RenameContactCommand.d.ts.map +1 -0
  218. package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts +2 -0
  219. package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts.map +1 -0
  220. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.d.ts +14 -0
  221. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.d.ts.map +1 -0
  222. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.d.ts +2 -0
  223. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.d.ts.map +1 -0
  224. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.d.ts +12 -0
  225. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.d.ts.map +1 -0
  226. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.d.ts +2 -0
  227. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.d.ts.map +1 -0
  228. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.d.ts +13 -0
  229. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.d.ts.map +1 -0
  230. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts +2 -0
  231. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts.map +1 -0
  232. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.d.ts +12 -0
  233. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.d.ts.map +1 -0
  234. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts +2 -0
  235. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts.map +1 -0
  236. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts +4 -0
  237. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -0
  238. package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts +12 -0
  239. package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts.map +1 -0
  240. package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts +2 -0
  241. package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +1 -0
  242. package/lib/types/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.d.ts +17 -0
  243. package/lib/types/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.d.ts.map +1 -0
  244. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts +15 -0
  245. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts.map +1 -0
  246. package/lib/types/internal/app-binder/isContactsSupportedForSession.d.ts +31 -8
  247. package/lib/types/internal/app-binder/isContactsSupportedForSession.d.ts.map +1 -1
  248. package/lib/types/internal/app-binder/model/contactsConstants.d.ts +39 -0
  249. package/lib/types/internal/app-binder/model/contactsConstants.d.ts.map +1 -0
  250. package/lib/types/internal/app-binder/model/contactsErrors.d.ts +30 -0
  251. package/lib/types/internal/app-binder/model/contactsErrors.d.ts.map +1 -0
  252. package/lib/types/internal/app-binder/model/contactsValidation.d.ts +53 -0
  253. package/lib/types/internal/app-binder/model/contactsValidation.d.ts.map +1 -0
  254. package/lib/types/internal/app-binder/model/contactsValidation.test.d.ts +2 -0
  255. package/lib/types/internal/app-binder/model/contactsValidation.test.d.ts.map +1 -0
  256. package/lib/types/internal/app-binder/services/contactsTlvSerializer.d.ts +33 -0
  257. package/lib/types/internal/app-binder/services/contactsTlvSerializer.d.ts.map +1 -0
  258. package/lib/types/internal/app-binder/services/contactsTlvSerializer.test.d.ts +2 -0
  259. package/lib/types/internal/app-binder/services/contactsTlvSerializer.test.d.ts.map +1 -0
  260. package/lib/types/internal/app-binder/services/sendFramedContactsPayload.d.ts +14 -0
  261. package/lib/types/internal/app-binder/services/sendFramedContactsPayload.d.ts.map +1 -0
  262. package/lib/types/internal/app-binder/services/sendFramedContactsPayload.test.d.ts +2 -0
  263. package/lib/types/internal/app-binder/services/sendFramedContactsPayload.test.d.ts.map +1 -0
  264. package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.d.ts +25 -0
  265. package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.d.ts.map +1 -0
  266. package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.test.d.ts +2 -0
  267. package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.test.d.ts.map +1 -0
  268. package/lib/types/internal/app-binder/task/SendRenameContactTask.d.ts +20 -0
  269. package/lib/types/internal/app-binder/task/SendRenameContactTask.d.ts.map +1 -0
  270. package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts +2 -0
  271. package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts.map +1 -0
  272. package/lib/types/internal/di.d.ts.map +1 -1
  273. package/lib/types/internal/use-cases/RegisterExternalAddressUseCase.d.ts +17 -0
  274. package/lib/types/internal/use-cases/RegisterExternalAddressUseCase.d.ts.map +1 -0
  275. package/lib/types/internal/use-cases/RegisterExternalAddressUseCase.test.d.ts +2 -0
  276. package/lib/types/internal/use-cases/RegisterExternalAddressUseCase.test.d.ts.map +1 -0
  277. package/lib/types/internal/use-cases/RenameContactUseCase.d.ts +19 -0
  278. package/lib/types/internal/use-cases/RenameContactUseCase.d.ts.map +1 -0
  279. package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts +2 -0
  280. package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts.map +1 -0
  281. package/lib/types/internal/use-cases/di/useCaseModule.d.ts +3 -0
  282. package/lib/types/internal/use-cases/di/useCaseModule.d.ts.map +1 -0
  283. package/lib/types/internal/use-cases/di/useCaseTypes.d.ts +5 -0
  284. package/lib/types/internal/use-cases/di/useCaseTypes.d.ts.map +1 -0
  285. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  286. package/package.json +7 -6
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("./contactsValidation");const i="44'/60'/0'/0/0";describe("contactsValidation",()=>{describe("validatePrintableLabel",()=>{const t={field:"name",bufferLength:e.CONTACT_NAME_BUFFER_LENGTH};it("accepts a printable ASCII label within the buffer",()=>{expect(()=>(0,e.validatePrintableLabel)("Alice",t)).not.toThrow()}),it("rejects an empty label",()=>{expect(()=>(0,e.validatePrintableLabel)("",t)).toThrow(e.ContactsValidationError)}),it("rejects a label exceeding bufferLength - 1 bytes",()=>{expect(()=>(0,e.validatePrintableLabel)("x".repeat(e.CONTACT_NAME_BUFFER_LENGTH),t)).toThrow(e.ContactsValidationError)}),it("rejects non-ASCII / accented characters (byte-level isprint)",()=>{expect(()=>(0,e.validatePrintableLabel)("Am\xE9lie",t)).toThrow(e.ContactsValidationError)})}),describe("validateByteLength",()=>{it("accepts an exact-length buffer",()=>{expect(()=>(0,e.validateByteLength)(new Uint8Array(20),{field:"identifier",expectedBytes:20})).not.toThrow()}),it("rejects a wrong-length buffer",()=>{expect(()=>(0,e.validateByteLength)(new Uint8Array(19),{field:"identifier",expectedBytes:20})).toThrow(e.ContactsValidationError)})}),describe("validateChainId",()=>{it("accepts a positive integer and bigint",()=>{expect(()=>(0,e.validateChainId)(1)).not.toThrow(),expect(()=>(0,e.validateChainId)(56n)).not.toThrow()}),it("rejects zero, negative, and non-integer",()=>{expect(()=>(0,e.validateChainId)(0)).toThrow(e.ContactsValidationError),expect(()=>(0,e.validateChainId)(-1)).toThrow(e.ContactsValidationError),expect(()=>(0,e.validateChainId)(1.5)).toThrow(e.ContactsValidationError)})}),describe("validateDerivationPath",()=>{it("accepts a representative BIP32 path",()=>{expect(()=>(0,e.validateDerivationPath)(i)).not.toThrow()}),it("accepts m-prefixed and hardened paths",()=>{expect(()=>(0,e.validateDerivationPath)("m/44'/60'/0'/0/0")).not.toThrow()}),it("rejects a non-numeric segment",()=>{expect(()=>(0,e.validateDerivationPath)("44'/x/0")).toThrow(e.ContactsValidationError)})})});
2
+ //# sourceMappingURL=contactsValidation.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/model/contactsValidation.test.ts"],
4
+ "sourcesContent": ["import {\n CONTACT_NAME_BUFFER_LENGTH,\n ContactsValidationError,\n validateByteLength,\n validateChainId,\n validateDerivationPath,\n validatePrintableLabel,\n} from \"./contactsValidation\";\n\n// A representative BIP32 path (used by Ledger-Account ops, not external\n// addresses). Kept here to exercise the shared validator.\nconst SAMPLE_DERIVATION_PATH = \"44'/60'/0'/0/0\";\n\ndescribe(\"contactsValidation\", () => {\n describe(\"validatePrintableLabel\", () => {\n const opts = { field: \"name\", bufferLength: CONTACT_NAME_BUFFER_LENGTH };\n\n it(\"accepts a printable ASCII label within the buffer\", () => {\n expect(() => validatePrintableLabel(\"Alice\", opts)).not.toThrow();\n });\n\n it(\"rejects an empty label\", () => {\n expect(() => validatePrintableLabel(\"\", opts)).toThrow(\n ContactsValidationError,\n );\n });\n\n it(\"rejects a label exceeding bufferLength - 1 bytes\", () => {\n expect(() =>\n validatePrintableLabel(\"x\".repeat(CONTACT_NAME_BUFFER_LENGTH), opts),\n ).toThrow(ContactsValidationError);\n });\n\n it(\"rejects non-ASCII / accented characters (byte-level isprint)\", () => {\n expect(() => validatePrintableLabel(\"Am\u00E9lie\", opts)).toThrow(\n ContactsValidationError,\n );\n });\n });\n\n describe(\"validateByteLength\", () => {\n it(\"accepts an exact-length buffer\", () => {\n expect(() =>\n validateByteLength(new Uint8Array(20), {\n field: \"identifier\",\n expectedBytes: 20,\n }),\n ).not.toThrow();\n });\n\n it(\"rejects a wrong-length buffer\", () => {\n expect(() =>\n validateByteLength(new Uint8Array(19), {\n field: \"identifier\",\n expectedBytes: 20,\n }),\n ).toThrow(ContactsValidationError);\n });\n });\n\n describe(\"validateChainId\", () => {\n it(\"accepts a positive integer and bigint\", () => {\n expect(() => validateChainId(1)).not.toThrow();\n expect(() => validateChainId(56n)).not.toThrow();\n });\n\n it(\"rejects zero, negative, and non-integer\", () => {\n expect(() => validateChainId(0)).toThrow(ContactsValidationError);\n expect(() => validateChainId(-1)).toThrow(ContactsValidationError);\n expect(() => validateChainId(1.5)).toThrow(ContactsValidationError);\n });\n });\n\n describe(\"validateDerivationPath\", () => {\n it(\"accepts a representative BIP32 path\", () => {\n expect(() =>\n validateDerivationPath(SAMPLE_DERIVATION_PATH),\n ).not.toThrow();\n });\n\n it(\"accepts m-prefixed and hardened paths\", () => {\n expect(() => validateDerivationPath(\"m/44'/60'/0'/0/0\")).not.toThrow();\n });\n\n it(\"rejects a non-numeric segment\", () => {\n expect(() => validateDerivationPath(\"44'/x/0\")).toThrow(\n ContactsValidationError,\n );\n });\n });\n});\n"],
5
+ "mappings": "aAAA,IAAAA,EAOO,gCAIP,MAAMC,EAAyB,iBAE/B,SAAS,qBAAsB,IAAM,CACnC,SAAS,yBAA0B,IAAM,CACvC,MAAMC,EAAO,CAAE,MAAO,OAAQ,aAAc,4BAA2B,EAEvE,GAAG,oDAAqD,IAAM,CAC5D,OAAO,OAAM,0BAAuB,QAASA,CAAI,CAAC,EAAE,IAAI,QAAQ,CAClE,CAAC,EAED,GAAG,yBAA0B,IAAM,CACjC,OAAO,OAAM,0BAAuB,GAAIA,CAAI,CAAC,EAAE,QAC7C,yBACF,CACF,CAAC,EAED,GAAG,mDAAoD,IAAM,CAC3D,OAAO,OACL,0BAAuB,IAAI,OAAO,4BAA0B,EAAGA,CAAI,CACrE,EAAE,QAAQ,yBAAuB,CACnC,CAAC,EAED,GAAG,+DAAgE,IAAM,CACvE,OAAO,OAAM,0BAAuB,YAAUA,CAAI,CAAC,EAAE,QACnD,yBACF,CACF,CAAC,CACH,CAAC,EAED,SAAS,qBAAsB,IAAM,CACnC,GAAG,iCAAkC,IAAM,CACzC,OAAO,OACL,sBAAmB,IAAI,WAAW,EAAE,EAAG,CACrC,MAAO,aACP,cAAe,EACjB,CAAC,CACH,EAAE,IAAI,QAAQ,CAChB,CAAC,EAED,GAAG,gCAAiC,IAAM,CACxC,OAAO,OACL,sBAAmB,IAAI,WAAW,EAAE,EAAG,CACrC,MAAO,aACP,cAAe,EACjB,CAAC,CACH,EAAE,QAAQ,yBAAuB,CACnC,CAAC,CACH,CAAC,EAED,SAAS,kBAAmB,IAAM,CAChC,GAAG,wCAAyC,IAAM,CAChD,OAAO,OAAM,mBAAgB,CAAC,CAAC,EAAE,IAAI,QAAQ,EAC7C,OAAO,OAAM,mBAAgB,GAAG,CAAC,EAAE,IAAI,QAAQ,CACjD,CAAC,EAED,GAAG,0CAA2C,IAAM,CAClD,OAAO,OAAM,mBAAgB,CAAC,CAAC,EAAE,QAAQ,yBAAuB,EAChE,OAAO,OAAM,mBAAgB,EAAE,CAAC,EAAE,QAAQ,yBAAuB,EACjE,OAAO,OAAM,mBAAgB,GAAG,CAAC,EAAE,QAAQ,yBAAuB,CACpE,CAAC,CACH,CAAC,EAED,SAAS,yBAA0B,IAAM,CACvC,GAAG,sCAAuC,IAAM,CAC9C,OAAO,OACL,0BAAuBD,CAAsB,CAC/C,EAAE,IAAI,QAAQ,CAChB,CAAC,EAED,GAAG,wCAAyC,IAAM,CAChD,OAAO,OAAM,0BAAuB,kBAAkB,CAAC,EAAE,IAAI,QAAQ,CACvE,CAAC,EAED,GAAG,gCAAiC,IAAM,CACxC,OAAO,OAAM,0BAAuB,SAAS,CAAC,EAAE,QAC9C,yBACF,CACF,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["import_contactsValidation", "SAMPLE_DERIVATION_PATH", "opts"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var o=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var d=(t,n)=>{for(var e in n)o(t,e,{get:n[e],enumerable:!0})},C=(t,n,e,T)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of _(n))!I.call(t,r)&&r!==e&&o(t,r,{get:()=>n[r],enumerable:!(T=x(n,r))||T.enumerable});return t};var A=t=>C(o({},"__esModule",{value:!0}),t);var V={};d(V,{CONTACTS_TLV_TAG:()=>c,STRUCT_TYPE_EDIT_CONTACT_NAME:()=>R,STRUCT_TYPE_EDIT_IDENTIFIER:()=>u,STRUCT_TYPE_EDIT_LEDGER_ACCOUNT:()=>D,STRUCT_TYPE_EDIT_SCOPE:()=>O,STRUCT_TYPE_PROVIDE_CONTACT:()=>N,STRUCT_TYPE_PROVIDE_LEDGER_ACCOUNT_CONTACT:()=>p,STRUCT_TYPE_REGISTER_IDENTITY:()=>s,STRUCT_TYPE_REGISTER_LEDGER_ACCOUNT:()=>B,STRUCT_VERSION_VALUE:()=>y,encodeTlvAscii:()=>m,encodeTlvBuffer:()=>E,encodeTlvChainId:()=>w,encodeTlvUInt8:()=>P,packDerivationPath:()=>L});module.exports=A(V);var i=require("@ledgerhq/device-management-kit");const U=33024,c={STRUCT_TYPE:1,STRUCT_VERSION:2,DERIVATION_PATH:105,CHAIN_ID:35,HMAC_PROOF:41,BLOCKCHAIN_FAMILY:81,CONTACT_NAME:240,SCOPE:241,ACCOUNT_IDENTIFIER:242,PREVIOUS_CONTACT_NAME:243,PREVIOUS_IDENTIFIER:244,PREVIOUS_SCOPE:245,GROUP_HANDLE:246,HMAC_REST:247},s=45,R=46,B=47,D=48,u=49,O=50,N=51,p=52,y=1;function f(t,n){if(n<128)t.add8BitUIntToData(n);else if(n<=255)t.add16BitUIntToData(U+n);else throw new Error(`TLV tag ${n} exceeds supported single-byte range`)}function a(t,n){if(n<128)t.add8BitUIntToData(n);else if(n<=255)t.add8BitUIntToData(129),t.add8BitUIntToData(n);else if(n<=65535)t.add8BitUIntToData(130),t.add16BitUIntToData(n);else throw new Error(`TLV length ${n} exceeds supported range`)}function S(t){const n=typeof t=="bigint"?t:BigInt(t);if(n<=0n)throw new Error(`chainId must be positive, got ${t}`);if(n>0xffffffffffffffffn)throw new Error(`chainId ${t} exceeds uint64 range`);const e=[];let T=n;for(;T>0n;)e.unshift(Number(T&0xffn)),T>>=8n;return Uint8Array.from(e)}function P(t,n,e){f(t,n),t.add8BitUIntToData(1),t.add8BitUIntToData(e)}function m(t,n,e){f(t,n);const T=new TextEncoder().encode(e);a(t,T.length),t.addBufferToData(T)}function E(t,n,e){f(t,n),a(t,e.length),t.addBufferToData(e)}function w(t,n,e){E(t,n,S(e))}function L(t){const n=new i.ByteArrayBuilder;return n.add8BitUIntToData(t.length),t.forEach(e=>n.add32BitUIntToData(e)),n.build()}0&&(module.exports={CONTACTS_TLV_TAG,STRUCT_TYPE_EDIT_CONTACT_NAME,STRUCT_TYPE_EDIT_IDENTIFIER,STRUCT_TYPE_EDIT_LEDGER_ACCOUNT,STRUCT_TYPE_EDIT_SCOPE,STRUCT_TYPE_PROVIDE_CONTACT,STRUCT_TYPE_PROVIDE_LEDGER_ACCOUNT_CONTACT,STRUCT_TYPE_REGISTER_IDENTITY,STRUCT_TYPE_REGISTER_LEDGER_ACCOUNT,STRUCT_VERSION_VALUE,encodeTlvAscii,encodeTlvBuffer,encodeTlvChainId,encodeTlvUInt8,packDerivationPath});
2
+ //# sourceMappingURL=contactsTlvSerializer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/contactsTlvSerializer.ts"],
4
+ "sourcesContent": ["// TLV encoding for the Contacts feature.\n// The SDK's TLV parser (lib_tlv/tlv_library.c, get_der_value_as_uint32) reads\n// tags as DER values: a byte with the high bit set means \"long form, low 7 bits\n// = following byte count\". So tags >= 0x80 (e.g. 0xf0) MUST be sent as the\n// 2-byte form [0x81, tag]; a bare 0xf0 is mis-read as a 112-byte tag. Lengths\n// >= 0x80 likewise use DER long form. (Verified on-device: a raw one-byte tag\n// parses as garbage and the app rejects the payload with 0x6a80.)\nimport { ByteArrayBuilder } from \"@ledgerhq/device-management-kit\";\n\nconst LONG_TAG_PREFIX_HIGH_BYTE = 0x81 << 8;\n\nexport const CONTACTS_TLV_TAG = {\n STRUCT_TYPE: 0x01,\n STRUCT_VERSION: 0x02,\n // Ledger-Account operations only; external-address ops carry no path.\n // TODO(Ledger Account ticket): spec tag registry lists 0x69 but the per-op\n // payload tables list 0x21 \u2014 confirm before the Ledger-Account op ships.\n DERIVATION_PATH: 0x69,\n CHAIN_ID: 0x23,\n HMAC_PROOF: 0x29,\n BLOCKCHAIN_FAMILY: 0x51,\n CONTACT_NAME: 0xf0,\n SCOPE: 0xf1,\n ACCOUNT_IDENTIFIER: 0xf2,\n PREVIOUS_CONTACT_NAME: 0xf3,\n PREVIOUS_IDENTIFIER: 0xf4,\n PREVIOUS_SCOPE: 0xf5,\n GROUP_HANDLE: 0xf6,\n HMAC_REST: 0xf7,\n} as const;\n\nexport const STRUCT_TYPE_REGISTER_IDENTITY = 0x2d;\nexport const STRUCT_TYPE_EDIT_CONTACT_NAME = 0x2e;\nexport const STRUCT_TYPE_REGISTER_LEDGER_ACCOUNT = 0x2f;\nexport const STRUCT_TYPE_EDIT_LEDGER_ACCOUNT = 0x30;\nexport const STRUCT_TYPE_EDIT_IDENTIFIER = 0x31;\nexport const STRUCT_TYPE_EDIT_SCOPE = 0x32;\nexport const STRUCT_TYPE_PROVIDE_CONTACT = 0x33;\nexport const STRUCT_TYPE_PROVIDE_LEDGER_ACCOUNT_CONTACT = 0x34;\nexport const STRUCT_VERSION_VALUE = 0x01;\n\nfunction writeTag(builder: ByteArrayBuilder, tag: number): void {\n if (tag < 0x80) {\n builder.add8BitUIntToData(tag);\n } else if (tag <= 0xff) {\n // DER long-form: 0x81 (1 following byte) then the tag value.\n builder.add16BitUIntToData(LONG_TAG_PREFIX_HIGH_BYTE + tag);\n } else {\n throw new Error(`TLV tag ${tag} exceeds supported single-byte range`);\n }\n}\n\nfunction writeDerLength(builder: ByteArrayBuilder, length: number): void {\n if (length < 0x80) {\n builder.add8BitUIntToData(length);\n } else if (length <= 0xff) {\n builder.add8BitUIntToData(0x81);\n builder.add8BitUIntToData(length);\n } else if (length <= 0xffff) {\n builder.add8BitUIntToData(0x82);\n builder.add16BitUIntToData(length);\n } else {\n throw new Error(`TLV length ${length} exceeds supported range`);\n }\n}\n\nfunction chainIdToMinimalBytes(chainId: number | bigint): Uint8Array {\n const big = typeof chainId === \"bigint\" ? chainId : BigInt(chainId);\n if (big <= 0n) {\n throw new Error(`chainId must be positive, got ${chainId}`);\n }\n if (big > 0xffffffffffffffffn) {\n throw new Error(`chainId ${chainId} exceeds uint64 range`);\n }\n const bytes: number[] = [];\n let n = big;\n while (n > 0n) {\n bytes.unshift(Number(n & 0xffn));\n n >>= 8n;\n }\n return Uint8Array.from(bytes);\n}\n\nexport function encodeTlvUInt8(\n builder: ByteArrayBuilder,\n tag: number,\n value: number,\n): void {\n writeTag(builder, tag);\n builder.add8BitUIntToData(1);\n builder.add8BitUIntToData(value);\n}\n\nexport function encodeTlvAscii(\n builder: ByteArrayBuilder,\n tag: number,\n value: string,\n): void {\n writeTag(builder, tag);\n const bytes = new TextEncoder().encode(value);\n writeDerLength(builder, bytes.length);\n builder.addBufferToData(bytes);\n}\n\nexport function encodeTlvBuffer(\n builder: ByteArrayBuilder,\n tag: number,\n value: Uint8Array,\n): void {\n writeTag(builder, tag);\n writeDerLength(builder, value.length);\n builder.addBufferToData(value);\n}\n\nexport function encodeTlvChainId(\n builder: ByteArrayBuilder,\n tag: number,\n chainId: number | bigint,\n): void {\n encodeTlvBuffer(builder, tag, chainIdToMinimalBytes(chainId));\n}\n\n/** Pack BIP32 segments as `count(1) || segment(4 BE)*count`. */\nexport function packDerivationPath(segments: number[]): Uint8Array {\n const builder = new ByteArrayBuilder();\n builder.add8BitUIntToData(segments.length);\n segments.forEach((segment) => builder.add32BitUIntToData(segment));\n return builder.build();\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,EAAA,kCAAAC,EAAA,gCAAAC,EAAA,oCAAAC,EAAA,2BAAAC,EAAA,gCAAAC,EAAA,+CAAAC,EAAA,kCAAAC,EAAA,wCAAAC,EAAA,yBAAAC,EAAA,mBAAAC,EAAA,oBAAAC,EAAA,qBAAAC,EAAA,mBAAAC,EAAA,uBAAAC,IAAA,eAAAC,EAAAjB,GAOA,IAAAkB,EAAiC,2CAEjC,MAAMC,EAA4B,MAErBjB,EAAmB,CAC9B,YAAa,EACb,eAAgB,EAIhB,gBAAiB,IACjB,SAAU,GACV,WAAY,GACZ,kBAAmB,GACnB,aAAc,IACd,MAAO,IACP,mBAAoB,IACpB,sBAAuB,IACvB,oBAAqB,IACrB,eAAgB,IAChB,aAAc,IACd,UAAW,GACb,EAEaO,EAAgC,GAChCN,EAAgC,GAChCO,EAAsC,GACtCL,EAAkC,GAClCD,EAA8B,GAC9BE,EAAyB,GACzBC,EAA8B,GAC9BC,EAA6C,GAC7CG,EAAuB,EAEpC,SAASS,EAASC,EAA2BC,EAAmB,CAC9D,GAAIA,EAAM,IACRD,EAAQ,kBAAkBC,CAAG,UACpBA,GAAO,IAEhBD,EAAQ,mBAAmBF,EAA4BG,CAAG,MAE1D,OAAM,IAAI,MAAM,WAAWA,CAAG,sCAAsC,CAExE,CAEA,SAASC,EAAeF,EAA2BG,EAAsB,CACvE,GAAIA,EAAS,IACXH,EAAQ,kBAAkBG,CAAM,UACvBA,GAAU,IACnBH,EAAQ,kBAAkB,GAAI,EAC9BA,EAAQ,kBAAkBG,CAAM,UACvBA,GAAU,MACnBH,EAAQ,kBAAkB,GAAI,EAC9BA,EAAQ,mBAAmBG,CAAM,MAEjC,OAAM,IAAI,MAAM,cAAcA,CAAM,0BAA0B,CAElE,CAEA,SAASC,EAAsBC,EAAsC,CACnE,MAAMC,EAAM,OAAOD,GAAY,SAAWA,EAAU,OAAOA,CAAO,EAClE,GAAIC,GAAO,GACT,MAAM,IAAI,MAAM,iCAAiCD,CAAO,EAAE,EAE5D,GAAIC,EAAM,oBACR,MAAM,IAAI,MAAM,WAAWD,CAAO,uBAAuB,EAE3D,MAAME,EAAkB,CAAC,EACzB,IAAIC,EAAIF,EACR,KAAOE,EAAI,IACTD,EAAM,QAAQ,OAAOC,EAAI,KAAK,CAAC,EAC/BA,IAAM,GAER,OAAO,WAAW,KAAKD,CAAK,CAC9B,CAEO,SAASb,EACdM,EACAC,EACAQ,EACM,CACNV,EAASC,EAASC,CAAG,EACrBD,EAAQ,kBAAkB,CAAC,EAC3BA,EAAQ,kBAAkBS,CAAK,CACjC,CAEO,SAASlB,EACdS,EACAC,EACAQ,EACM,CACNV,EAASC,EAASC,CAAG,EACrB,MAAMM,EAAQ,IAAI,YAAY,EAAE,OAAOE,CAAK,EAC5CP,EAAeF,EAASO,EAAM,MAAM,EACpCP,EAAQ,gBAAgBO,CAAK,CAC/B,CAEO,SAASf,EACdQ,EACAC,EACAQ,EACM,CACNV,EAASC,EAASC,CAAG,EACrBC,EAAeF,EAASS,EAAM,MAAM,EACpCT,EAAQ,gBAAgBS,CAAK,CAC/B,CAEO,SAAShB,EACdO,EACAC,EACAI,EACM,CACNb,EAAgBQ,EAASC,EAAKG,EAAsBC,CAAO,CAAC,CAC9D,CAGO,SAASV,EAAmBe,EAAgC,CACjE,MAAMV,EAAU,IAAI,mBACpB,OAAAA,EAAQ,kBAAkBU,EAAS,MAAM,EACzCA,EAAS,QAASC,GAAYX,EAAQ,mBAAmBW,CAAO,CAAC,EAC1DX,EAAQ,MAAM,CACvB",
6
+ "names": ["contactsTlvSerializer_exports", "__export", "CONTACTS_TLV_TAG", "STRUCT_TYPE_EDIT_CONTACT_NAME", "STRUCT_TYPE_EDIT_IDENTIFIER", "STRUCT_TYPE_EDIT_LEDGER_ACCOUNT", "STRUCT_TYPE_EDIT_SCOPE", "STRUCT_TYPE_PROVIDE_CONTACT", "STRUCT_TYPE_PROVIDE_LEDGER_ACCOUNT_CONTACT", "STRUCT_TYPE_REGISTER_IDENTITY", "STRUCT_TYPE_REGISTER_LEDGER_ACCOUNT", "STRUCT_VERSION_VALUE", "encodeTlvAscii", "encodeTlvBuffer", "encodeTlvChainId", "encodeTlvUInt8", "packDerivationPath", "__toCommonJS", "import_device_management_kit", "LONG_TAG_PREFIX_HIGH_BYTE", "writeTag", "builder", "tag", "writeDerLength", "length", "chainIdToMinimalBytes", "chainId", "big", "bytes", "n", "value", "segments", "segment"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var i=require("@ledgerhq/device-management-kit"),e=require("./contactsTlvSerializer");describe("contactsTlvSerializer",()=>{describe("DERIVATION_PATH tag",()=>{it("is 0x69 (not the pre-1.23 value 0x21)",()=>{expect(e.CONTACTS_TLV_TAG.DERIVATION_PATH).toBe(105)}),it("encodes a packed path under tag 0x69",()=>{const t=new i.ByteArrayBuilder,r=(0,e.packDerivationPath)([2147483692,2147483708,2147483648]);(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.DERIVATION_PATH,r),expect(t.build()).toStrictEqual(Uint8Array.from([105,13,3,128,0,0,44,128,0,0,60,128,0,0,0]))})}),describe("primitive encoders",()=>{it("encodes a single-byte TLV (tag < 0x80, length 1)",()=>{const t=new i.ByteArrayBuilder;(0,e.encodeTlvUInt8)(t,e.CONTACTS_TLV_TAG.STRUCT_TYPE,45),expect(t.build()).toStrictEqual(Uint8Array.from([1,1,45]))}),it("encodes tags >= 0x80 as the 2-byte DER long form [0x81, tag]",()=>{const t=new i.ByteArrayBuilder;(0,e.encodeTlvAscii)(t,e.CONTACTS_TLV_TAG.CONTACT_NAME,"AB"),expect(t.build()).toStrictEqual(Uint8Array.from([129,240,2,65,66]))}),it("encodes chainId as minimal big-endian bytes",()=>{const t=new i.ByteArrayBuilder;(0,e.encodeTlvChainId)(t,e.CONTACTS_TLV_TAG.CHAIN_ID,1n),expect(t.build()).toStrictEqual(Uint8Array.from([35,1,1]));const r=new i.ByteArrayBuilder;(0,e.encodeTlvChainId)(r,e.CONTACTS_TLV_TAG.CHAIN_ID,56),expect(r.build()).toStrictEqual(Uint8Array.from([35,1,56]))}),it("emits DER long-form length for payloads >= 0x80 bytes",()=>{const t=new i.ByteArrayBuilder,r=new Uint8Array(200).fill(171);(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER,r);const x=t.build();expect(Array.from(x.slice(0,4))).toEqual([129,242,129,200]),expect(x.length).toBe(204)}),it("rejects a non-positive chainId",()=>{const t=new i.ByteArrayBuilder;expect(()=>(0,e.encodeTlvChainId)(t,e.CONTACTS_TLV_TAG.CHAIN_ID,0)).toThrow()})})});
2
+ //# sourceMappingURL=contactsTlvSerializer.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/contactsTlvSerializer.test.ts"],
4
+ "sourcesContent": ["import { ByteArrayBuilder } from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACTS_TLV_TAG,\n encodeTlvAscii,\n encodeTlvBuffer,\n encodeTlvChainId,\n encodeTlvUInt8,\n packDerivationPath,\n} from \"./contactsTlvSerializer\";\n\ndescribe(\"contactsTlvSerializer\", () => {\n describe(\"DERIVATION_PATH tag\", () => {\n // Pins the ETH-app 1.23 / BOLOS SDK protocol change (commit 963d72b7):\n // the address-book derivation-path tag moved from 0x21 to 0x69. Sending the\n // old tag makes the on-device TLV parser reject with 0x6A80.\n it(\"is 0x69 (not the pre-1.23 value 0x21)\", () => {\n expect(CONTACTS_TLV_TAG.DERIVATION_PATH).toBe(0x69);\n });\n\n it(\"encodes a packed path under tag 0x69\", () => {\n const builder = new ByteArrayBuilder();\n const path = packDerivationPath([0x8000002c, 0x8000003c, 0x80000000]);\n\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.DERIVATION_PATH, path);\n\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([\n 0x69, // DERIVATION_PATH tag\n 0x0d, // length: 1 count byte + 3 * 4-byte segments\n 0x03, // segment count\n 0x80,\n 0x00,\n 0x00,\n 0x2c, // 44'\n 0x80,\n 0x00,\n 0x00,\n 0x3c, // 60'\n 0x80,\n 0x00,\n 0x00,\n 0x00, // 0'\n ]),\n );\n });\n });\n\n describe(\"primitive encoders\", () => {\n it(\"encodes a single-byte TLV (tag < 0x80, length 1)\", () => {\n const builder = new ByteArrayBuilder();\n encodeTlvUInt8(builder, CONTACTS_TLV_TAG.STRUCT_TYPE, 0x2d);\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([0x01, 0x01, 0x2d]),\n );\n });\n\n it(\"encodes tags >= 0x80 as the 2-byte DER long form [0x81, tag]\", () => {\n const builder = new ByteArrayBuilder();\n encodeTlvAscii(builder, CONTACTS_TLV_TAG.CONTACT_NAME, \"AB\");\n // Tag 0xf0 -> DER long form [0x81, 0xf0], length 2, ASCII \"AB\".\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([0x81, 0xf0, 0x02, 0x41, 0x42]),\n );\n });\n\n it(\"encodes chainId as minimal big-endian bytes\", () => {\n const builder = new ByteArrayBuilder();\n encodeTlvChainId(builder, CONTACTS_TLV_TAG.CHAIN_ID, 1n);\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([0x23, 0x01, 0x01]),\n );\n\n const builder2 = new ByteArrayBuilder();\n encodeTlvChainId(builder2, CONTACTS_TLV_TAG.CHAIN_ID, 56);\n expect(builder2.build()).toStrictEqual(\n Uint8Array.from([0x23, 0x01, 0x38]),\n );\n });\n\n it(\"emits DER long-form length for payloads >= 0x80 bytes\", () => {\n const builder = new ByteArrayBuilder();\n const value = new Uint8Array(200).fill(0xab);\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER, value);\n const out = builder.build();\n // tag 0xf2 -> [0x81, 0xf2], then long-form length 0x81 0xc8 (200).\n expect(Array.from(out.slice(0, 4))).toEqual([0x81, 0xf2, 0x81, 0xc8]);\n expect(out.length).toBe(4 + 200);\n });\n\n it(\"rejects a non-positive chainId\", () => {\n const builder = new ByteArrayBuilder();\n expect(() =>\n encodeTlvChainId(builder, CONTACTS_TLV_TAG.CHAIN_ID, 0),\n ).toThrow();\n });\n });\n});\n"],
5
+ "mappings": "aAAA,IAAAA,EAAiC,2CAEjCC,EAOO,mCAEP,SAAS,wBAAyB,IAAM,CACtC,SAAS,sBAAuB,IAAM,CAIpC,GAAG,wCAAyC,IAAM,CAChD,OAAO,mBAAiB,eAAe,EAAE,KAAK,GAAI,CACpD,CAAC,EAED,GAAG,uCAAwC,IAAM,CAC/C,MAAMC,EAAU,IAAI,mBACdC,KAAO,sBAAmB,CAAC,WAAY,WAAY,UAAU,CAAC,KAEpE,mBAAgBD,EAAS,mBAAiB,gBAAiBC,CAAI,EAE/D,OAAOD,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CACd,IACA,GACA,EACA,IACA,EACA,EACA,GACA,IACA,EACA,EACA,GACA,IACA,EACA,EACA,CACF,CAAC,CACH,CACF,CAAC,CACH,CAAC,EAED,SAAS,qBAAsB,IAAM,CACnC,GAAG,mDAAoD,IAAM,CAC3D,MAAMA,EAAU,IAAI,sBACpB,kBAAeA,EAAS,mBAAiB,YAAa,EAAI,EAC1D,OAAOA,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CAAC,EAAM,EAAM,EAAI,CAAC,CACpC,CACF,CAAC,EAED,GAAG,+DAAgE,IAAM,CACvE,MAAMA,EAAU,IAAI,sBACpB,kBAAeA,EAAS,mBAAiB,aAAc,IAAI,EAE3D,OAAOA,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CAAC,IAAM,IAAM,EAAM,GAAM,EAAI,CAAC,CAChD,CACF,CAAC,EAED,GAAG,8CAA+C,IAAM,CACtD,MAAMA,EAAU,IAAI,sBACpB,oBAAiBA,EAAS,mBAAiB,SAAU,EAAE,EACvD,OAAOA,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CAAC,GAAM,EAAM,CAAI,CAAC,CACpC,EAEA,MAAME,EAAW,IAAI,sBACrB,oBAAiBA,EAAU,mBAAiB,SAAU,EAAE,EACxD,OAAOA,EAAS,MAAM,CAAC,EAAE,cACvB,WAAW,KAAK,CAAC,GAAM,EAAM,EAAI,CAAC,CACpC,CACF,CAAC,EAED,GAAG,wDAAyD,IAAM,CAChE,MAAMF,EAAU,IAAI,mBACdG,EAAQ,IAAI,WAAW,GAAG,EAAE,KAAK,GAAI,KAC3C,mBAAgBH,EAAS,mBAAiB,mBAAoBG,CAAK,EACnE,MAAMC,EAAMJ,EAAQ,MAAM,EAE1B,OAAO,MAAM,KAAKI,EAAI,MAAM,EAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EACpE,OAAOA,EAAI,MAAM,EAAE,KAAK,GAAO,CACjC,CAAC,EAED,GAAG,iCAAkC,IAAM,CACzC,MAAMJ,EAAU,IAAI,mBACpB,OAAO,OACL,oBAAiBA,EAAS,mBAAiB,SAAU,CAAC,CACxD,EAAE,QAAQ,CACZ,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["import_device_management_kit", "import_contactsTlvSerializer", "builder", "path", "builder2", "value", "out"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var l=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var S=(n,e)=>{for(var t in e)l(n,t,{get:e[t],enumerable:!0})},U=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of k(e))!P.call(n,s)&&s!==t&&l(n,s,{get:()=>e[s],enumerable:!(r=R(e,s))||r.enumerable});return n};var b=n=>U(l({},"__esModule",{value:!0}),n);var I={};S(I,{sendFramedContactsPayload:()=>L});module.exports=b(I);var A=require("@ledgerhq/device-management-kit");const F=255,y=0,C=128;async function L(n,{payload:e,makeCommand:t,logger:r,commandTag:s}){const a=w(e),o=x(a,F),m=s??"framed-contacts";for(let u=0;u<o.length-1;u++){const g=u===0?y:C,h=o[u];f(r,m,u,o.length,g,h.length,a.length);const p=await n.sendCommand(t(h,g));if(!(0,A.isSuccessDmkResult)(p))return p}const c=o.length-1,d=c===0?y:C,i=o[c];return f(r,m,c,o.length,d,i.length,a.length),await n.sendCommand(t(i,d))}function f(n,e,t,r,s,a,o){n&&n.debug(`[chunk ${t+1}/${r}] sending`,{tag:e,data:{chunkIndex:t,chunkCount:r,p2:`0x${s.toString(16).padStart(2,"0")}`,chunkLen:a,framedPayloadLen:o,isFirst:t===0,isLast:t===r-1}})}function w(n){const e=n.length,t=new Uint8Array(e+2);return t[0]=e>>8&255,t[1]=e&255,t.set(n,2),t}function x(n,e){if(n.length===0)return[n];const t=[];for(let r=0;r<n.length;r+=e)t.push(n.slice(r,Math.min(r+e,n.length)));return t}0&&(module.exports={sendFramedContactsPayload});
2
+ //# sourceMappingURL=sendFramedContactsPayload.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/sendFramedContactsPayload.ts"],
4
+ "sourcesContent": ["// Chunked-framing transport for the Contacts ops. Since the BOLOS SDK\n// \"use uniform chunked transport for all sub-commands\" change, every\n// address-book sub-command frames its TLV this way.\n//\n// First chunk is dispatched with P2=0x00 and carries the 2-byte BE\n// total-payload-length prefix. Subsequent chunks use P2=0x80. The\n// caller-supplied `makeCommand` builds a Command per chunk; the helper\n// returns the final chunk's CommandResult unchanged so the caller can\n// parse the device's structured response off the last exchange.\n// Protocol: ledger-secure-sdk/app_features/address_book/doc/address_book_spec.md \u00A73\nimport {\n type Command,\n type CommandResult,\n type InternalApi,\n isSuccessDmkResult,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\n\nconst MAX_CHUNK_BYTES = 255;\nconst P2_FIRST = 0x00;\nconst P2_NEXT = 0x80;\n\nexport type SendFramedContactsPayloadArgs<Response> = {\n /** TLV payload bytes (without any header or length framing). */\n readonly payload: Uint8Array;\n /** Sub-command byte (e.g. 0x01 for REGISTER IDENTITY). */\n readonly p1: number;\n /** Per-chunk Command factory. The helper passes the chunk bytes and the P2 byte. */\n readonly makeCommand: (\n chunk: Uint8Array,\n p2: number,\n ) => Command<Response, unknown, unknown>;\n /** Optional per-chunk diagnostic logging (one `debug` entry per outgoing chunk). */\n readonly logger?: LoggerPublisherService;\n readonly commandTag?: string;\n};\n\nexport async function sendFramedContactsPayload<Response>(\n api: InternalApi,\n {\n payload,\n makeCommand,\n logger,\n commandTag,\n }: SendFramedContactsPayloadArgs<Response>,\n): Promise<CommandResult<Response>> {\n const framed = prependFrameLength(payload);\n const chunks = sliceChunks(framed, MAX_CHUNK_BYTES);\n const tag = commandTag ?? \"framed-contacts\";\n\n // Intermediate chunks: dispatch and short-circuit on error.\n for (let i = 0; i < chunks.length - 1; i++) {\n const p2 = i === 0 ? P2_FIRST : P2_NEXT;\n const chunk = chunks[i]!;\n logChunk(logger, tag, i, chunks.length, p2, chunk.length, framed.length);\n const result = (await api.sendCommand(\n makeCommand(chunk, p2),\n )) as CommandResult<Response>;\n if (!isSuccessDmkResult(result)) {\n return result;\n }\n }\n\n const lastIndex = chunks.length - 1;\n const lastP2 = lastIndex === 0 ? P2_FIRST : P2_NEXT;\n const lastChunk = chunks[lastIndex]!;\n logChunk(\n logger,\n tag,\n lastIndex,\n chunks.length,\n lastP2,\n lastChunk.length,\n framed.length,\n );\n return (await api.sendCommand(\n makeCommand(lastChunk, lastP2),\n )) as CommandResult<Response>;\n}\n\nfunction logChunk(\n logger: LoggerPublisherService | undefined,\n tag: string,\n index: number,\n total: number,\n p2: number,\n chunkLen: number,\n framedLen: number,\n): void {\n if (!logger) return;\n logger.debug(`[chunk ${index + 1}/${total}] sending`, {\n tag,\n data: {\n chunkIndex: index,\n chunkCount: total,\n p2: `0x${p2.toString(16).padStart(2, \"0\")}`,\n chunkLen,\n framedPayloadLen: framedLen,\n isFirst: index === 0,\n isLast: index === total - 1,\n },\n });\n}\n\nfunction prependFrameLength(payload: Uint8Array): Uint8Array {\n const total = payload.length;\n const framed = new Uint8Array(total + 2);\n framed[0] = (total >> 8) & 0xff;\n framed[1] = total & 0xff;\n framed.set(payload, 2);\n return framed;\n}\n\nfunction sliceChunks(buffer: Uint8Array, max: number): Uint8Array[] {\n if (buffer.length === 0) return [buffer];\n const out: Uint8Array[] = [];\n for (let offset = 0; offset < buffer.length; offset += max) {\n out.push(buffer.slice(offset, Math.min(offset + max, buffer.length)));\n }\n return out;\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,+BAAAE,IAAA,eAAAC,EAAAH,GAUA,IAAAI,EAMO,2CAEP,MAAMC,EAAkB,IAClBC,EAAW,EACXC,EAAU,IAiBhB,eAAsBL,EACpBM,EACA,CACE,QAAAC,EACA,YAAAC,EACA,OAAAC,EACA,WAAAC,CACF,EACkC,CAClC,MAAMC,EAASC,EAAmBL,CAAO,EACnCM,EAASC,EAAYH,EAAQR,CAAe,EAC5CY,EAAML,GAAc,kBAG1B,QAASM,EAAI,EAAGA,EAAIH,EAAO,OAAS,EAAGG,IAAK,CAC1C,MAAMC,EAAKD,IAAM,EAAIZ,EAAWC,EAC1Ba,EAAQL,EAAOG,CAAC,EACtBG,EAASV,EAAQM,EAAKC,EAAGH,EAAO,OAAQI,EAAIC,EAAM,OAAQP,EAAO,MAAM,EACvE,MAAMS,EAAU,MAAMd,EAAI,YACxBE,EAAYU,EAAOD,CAAE,CACvB,EACA,GAAI,IAAC,sBAAmBG,CAAM,EAC5B,OAAOA,CAEX,CAEA,MAAMC,EAAYR,EAAO,OAAS,EAC5BS,EAASD,IAAc,EAAIjB,EAAWC,EACtCkB,EAAYV,EAAOQ,CAAS,EAClC,OAAAF,EACEV,EACAM,EACAM,EACAR,EAAO,OACPS,EACAC,EAAU,OACVZ,EAAO,MACT,EACQ,MAAML,EAAI,YAChBE,EAAYe,EAAWD,CAAM,CAC/B,CACF,CAEA,SAASH,EACPV,EACAM,EACAS,EACAC,EACAR,EACAS,EACAC,EACM,CACDlB,GACLA,EAAO,MAAM,UAAUe,EAAQ,CAAC,IAAIC,CAAK,YAAa,CACpD,IAAAV,EACA,KAAM,CACJ,WAAYS,EACZ,WAAYC,EACZ,GAAI,KAAKR,EAAG,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GACzC,SAAAS,EACA,iBAAkBC,EAClB,QAASH,IAAU,EACnB,OAAQA,IAAUC,EAAQ,CAC5B,CACF,CAAC,CACH,CAEA,SAASb,EAAmBL,EAAiC,CAC3D,MAAMkB,EAAQlB,EAAQ,OAChBI,EAAS,IAAI,WAAWc,EAAQ,CAAC,EACvC,OAAAd,EAAO,CAAC,EAAKc,GAAS,EAAK,IAC3Bd,EAAO,CAAC,EAAIc,EAAQ,IACpBd,EAAO,IAAIJ,EAAS,CAAC,EACdI,CACT,CAEA,SAASG,EAAYc,EAAoBC,EAA2B,CAClE,GAAID,EAAO,SAAW,EAAG,MAAO,CAACA,CAAM,EACvC,MAAME,EAAoB,CAAC,EAC3B,QAASC,EAAS,EAAGA,EAASH,EAAO,OAAQG,GAAUF,EACrDC,EAAI,KAAKF,EAAO,MAAMG,EAAQ,KAAK,IAAIA,EAASF,EAAKD,EAAO,MAAM,CAAC,CAAC,EAEtE,OAAOE,CACT",
6
+ "names": ["sendFramedContactsPayload_exports", "__export", "sendFramedContactsPayload", "__toCommonJS", "import_device_management_kit", "MAX_CHUNK_BYTES", "P2_FIRST", "P2_NEXT", "api", "payload", "makeCommand", "logger", "commandTag", "framed", "prependFrameLength", "chunks", "sliceChunks", "tag", "i", "p2", "chunk", "logChunk", "result", "lastIndex", "lastP2", "lastChunk", "index", "total", "chunkLen", "framedLen", "buffer", "max", "out", "offset"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=require("@ledgerhq/device-management-kit"),m=require("./sendFramedContactsPayload");function l(){return{sendCommand:vi.fn()}}function r(e,n=66){return new Uint8Array(e).fill(n)}const d=()=>vi.fn((e,n)=>({name:"test",args:{chunk:e,p2:n},getApdu:vi.fn(),parseResponse:vi.fn()}));describe("sendFramedContactsPayload",()=>{it("single-chunk: prepends BE length, uses P2=0x00, returns command result",async()=>{const e=l(),n=(0,a.CommandResultFactory)({data:{ok:!0}});e.sendCommand.mockResolvedValueOnce(n);const t=d(),o=await(0,m.sendFramedContactsPayload)(e,{payload:r(100),p1:1,makeCommand:t});expect(t).toHaveBeenCalledTimes(1);const[s,c]=t.mock.calls[0];expect(c).toBe(0),expect(s[0]).toBe(0),expect(s[1]).toBe(100),expect(s.length).toBe(102),expect(o).toBe(n)}),it("multi-chunk: splits into <=255B pieces, P2 0x00 then 0x80, prefix on first only",async()=>{const e=l(),n=(0,a.CommandResultFactory)({data:{}}),t=(0,a.CommandResultFactory)({data:{ok:!0}});e.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(t);const o=d(),s=await(0,m.sendFramedContactsPayload)(e,{payload:r(600,85),p1:1,makeCommand:o});expect(o).toHaveBeenCalledTimes(3);const[c,p]=o.mock.calls[0],[i,u]=o.mock.calls[1],[k,x]=o.mock.calls[2];expect([p,u,x]).toEqual([0,128,128]),expect([c.length,i.length,k.length]).toEqual([255,255,92]),expect(c[0]).toBe(2),expect(c[1]).toBe(88),expect(i[0]).toBe(85),expect(s).toBe(t)}),it("short-circuits on intermediate-chunk error without dispatching remaining chunks",async()=>{const e=l(),n=(0,a.CommandResultFactory)({error:new a.InvalidStatusWordError("kaboom")});e.sendCommand.mockResolvedValueOnce(n);const t=d(),o=await(0,m.sendFramedContactsPayload)(e,{payload:r(600),p1:1,makeCommand:t});expect(e.sendCommand).toHaveBeenCalledTimes(1),expect(t).toHaveBeenCalledTimes(1),expect(o).toBe(n)})});
2
+ //# sourceMappingURL=sendFramedContactsPayload.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/sendFramedContactsPayload.test.ts"],
4
+ "sourcesContent": ["import {\n type Command,\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { sendFramedContactsPayload } from \"./sendFramedContactsPayload\";\n\nfunction makeApiMock(): InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n} {\n return {\n sendCommand: vi.fn(),\n } as unknown as InternalApi & { sendCommand: ReturnType<typeof vi.fn> };\n}\n\nfunction makePayload(byteCount: number, fillByte = 0x42): Uint8Array {\n return new Uint8Array(byteCount).fill(fillByte);\n}\n\nconst makeCommandFactory = () =>\n vi.fn(\n (chunk: Uint8Array, p2: number) =>\n ({\n name: \"test\",\n args: { chunk, p2 },\n getApdu: vi.fn(),\n parseResponse: vi.fn(),\n }) as unknown as Command<unknown, unknown, unknown>,\n );\n\ndescribe(\"sendFramedContactsPayload\", () => {\n it(\"single-chunk: prepends BE length, uses P2=0x00, returns command result\", async () => {\n const api = makeApiMock();\n const finalResult = CommandResultFactory({ data: { ok: true } });\n api.sendCommand.mockResolvedValueOnce(finalResult);\n const makeCommand = makeCommandFactory();\n\n const result = await sendFramedContactsPayload(api, {\n payload: makePayload(100),\n p1: 0x01,\n makeCommand,\n });\n\n expect(makeCommand).toHaveBeenCalledTimes(1);\n const [chunk, p2] = makeCommand.mock.calls[0]!;\n expect(p2).toBe(0x00);\n // 2-byte BE length prefix = 100 \u2192 0x00, 0x64.\n expect(chunk[0]).toBe(0x00);\n expect(chunk[1]).toBe(0x64);\n expect(chunk.length).toBe(102);\n expect(result).toBe(finalResult);\n });\n\n it(\"multi-chunk: splits into <=255B pieces, P2 0x00 then 0x80, prefix on first only\", async () => {\n const api = makeApiMock();\n const intermediateOk = CommandResultFactory({ data: {} });\n const finalResult = CommandResultFactory({ data: { ok: true } });\n api.sendCommand\n .mockResolvedValueOnce(intermediateOk)\n .mockResolvedValueOnce(intermediateOk)\n .mockResolvedValueOnce(finalResult);\n const makeCommand = makeCommandFactory();\n\n // 600 bytes payload \u2192 602 with frame prefix \u2192 3 chunks (255 + 255 + 92).\n const result = await sendFramedContactsPayload(api, {\n payload: makePayload(600, 0x55),\n p1: 0x01,\n makeCommand,\n });\n\n expect(makeCommand).toHaveBeenCalledTimes(3);\n const [chunk0, p20] = makeCommand.mock.calls[0]!;\n const [chunk1, p21] = makeCommand.mock.calls[1]!;\n const [chunk2, p22] = makeCommand.mock.calls[2]!;\n expect([p20, p21, p22]).toEqual([0x00, 0x80, 0x80]);\n expect([chunk0.length, chunk1.length, chunk2.length]).toEqual([\n 255, 255, 92,\n ]);\n // Frame prefix (600 = 0x0258) only on the first chunk.\n expect(chunk0[0]).toBe(0x02);\n expect(chunk0[1]).toBe(0x58);\n // Continuation chunks begin with raw payload bytes.\n expect(chunk1[0]).toBe(0x55);\n expect(result).toBe(finalResult);\n });\n\n it(\"short-circuits on intermediate-chunk error without dispatching remaining chunks\", async () => {\n const api = makeApiMock();\n const errorResult: CommandResult<unknown> = CommandResultFactory({\n error: new InvalidStatusWordError(\"kaboom\"),\n });\n api.sendCommand.mockResolvedValueOnce(errorResult);\n const makeCommand = makeCommandFactory();\n\n const result = await sendFramedContactsPayload(api, {\n payload: makePayload(600),\n p1: 0x01,\n makeCommand,\n });\n\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n expect(makeCommand).toHaveBeenCalledTimes(1);\n expect(result).toBe(errorResult);\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_sendFramedContactsPayload", "makeApiMock", "makePayload", "byteCount", "fillByte", "makeCommandFactory", "chunk", "p2", "api", "finalResult", "makeCommand", "result", "intermediateOk", "chunk0", "p20", "chunk1", "p21", "chunk2", "p22", "errorResult"]
7
+ }
@@ -0,0 +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});
2
+ //# sourceMappingURL=SendRegisterIdentityTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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",
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
+ }
@@ -0,0 +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()})});
2
+ //# sourceMappingURL=SendRegisterIdentityTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/SendRegisterIdentityTask.test.ts"],
4
+ "sourcesContent": ["// Validates that the TLV serializer + tag ordering + chunk framing produce the\n// expected wire bytes for op 1 (Register Identity): tags >= 0x80 use the 2-byte\n// DER form [0x81, tag], and Register Identity carries DERIVATION_PATH (tag 0x69,\n// m/44'/60'/0'/0/0) which the Ethereum app requires. The framed chunk = 2-byte\n// BE total length + TLV.\nimport {\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { RegisterIdentityCommand } from \"@internal/app-binder/command/RegisterIdentityCommand\";\n\nimport { SendRegisterIdentityTask } from \"./SendRegisterIdentityTask\";\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 <Lc>\" (2-byte BE total TLV length) + TLV. Tag order:\n// STRUCT_TYPE, STRUCT_VERSION, CONTACT_NAME, SCOPE, ACCOUNT_IDENTIFIER,\n// DERIVATION_PATH, CHAIN_ID, BLOCKCHAIN_FAMILY, then optional GROUP_HANDLE +\n// HMAC_PROOF. Tags >= 0x80 are encoded as [0x81, tag]; DERIVATION_PATH (0x69)\n// packs m/44'/60'/0'/0/0 as \"05 8000002c 8000003c 80000000 00000000 00000000\".\nconst FRESH_FRAMED_CHUNK = hexToBytes(\n \"004d01012d020101\" +\n \"81f005416c696365\" +\n \"81f108457468206d61696e\" +\n \"81f21400000000000000000000000000000000deadbeef\" +\n \"6915058000002c8000003c800000000000000000000000\" +\n \"230101510101\",\n);\n\nconst EXTENSION_FRAMED_CHUNK = hexToBytes(\n \"00b301012d020101\" +\n \"81f005416c696365\" +\n \"81f108417262206d61696e\" +\n \"81f2144444444444444444444444444444444444444444\" +\n \"6915058000002c8000003c800000000000000000000000\" +\n \"2302a4b1510101\" +\n \"81f640cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\" +\n \"2920dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd\",\n);\n\nconst OK_PROOFS = {\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(\"SendRegisterIdentityTask\", () => {\n it(\"assembles a fresh-register framed chunk and dispatches RegisterIdentityCommand\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOFS }),\n );\n\n const result = await new SendRegisterIdentityTask(api, {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: hexToBytes(\"00000000000000000000000000000000deadbeef\"),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n }).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new RegisterIdentityCommand({ data: FRESH_FRAMED_CHUNK, p2: 0x00 }),\n );\n expect(result).toStrictEqual(CommandResultFactory({ data: OK_PROOFS }));\n });\n\n it(\"appends GROUP_HANDLE + HMAC_PROOF on extension and frames the extension payload\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOFS }),\n );\n\n await new SendRegisterIdentityTask(api, {\n contactName: \"Alice\",\n scope: \"Arb main\",\n identifier: hexToBytes(\"44\".repeat(20)),\n blockchainFamily: \"ethereum\",\n chainId: 42161n,\n existingContactGroup: {\n groupHandle: hexToBytes(\"cc\".repeat(64)),\n hmacProof: hexToBytes(\"dd\".repeat(32)),\n },\n }).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new RegisterIdentityCommand({ data: EXTENSION_FRAMED_CHUNK, p2: 0x00 }),\n );\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_PROOFS }),\n );\n\n await new SendRegisterIdentityTask(api, {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: hexToBytes(\"00000000000000000000000000000000deadbeef\"),\n blockchainFamily: \"ethereum\",\n }).run();\n\n const command = api.sendCommand.mock\n .calls[0]![0] as RegisterIdentityCommand;\n // No `23 01 ..` CHAIN_ID TLV; BLOCKCHAIN_FAMILY 51 01 01 follows the path.\n const framedHex = Buffer.from(command.args.data).toString(\"hex\");\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 SendRegisterIdentityTask(api, {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: hexToBytes(\"00000000000000000000000000000000deadbeef\"),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n }).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n });\n\n it(\"throws on an unsupported blockchain family\", async () => {\n const api = makeApiMock();\n\n await expect(\n new SendRegisterIdentityTask(api, {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: hexToBytes(\"00000000000000000000000000000000deadbeef\"),\n blockchainFamily: \"dogecoin\",\n chainId: 1n,\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_RegisterIdentityCommand", "import_SendRegisterIdentityTask", "hexToBytes", "hex", "out", "i", "FRESH_FRAMED_CHUNK", "EXTENSION_FRAMED_CHUNK", "OK_PROOFS", "makeApiMock", "api", "result", "command", "framedHex"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var y=(t,e)=>{for(var a in e)s(t,a,{get:e[a],enumerable:!0})},u=(t,e,a,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of T(e))!p.call(t,n)&&n!==a&&s(t,n,{get:()=>e[n],enumerable:!(m=l(e,n))||m.enumerable});return t};var A=t=>u(s({},"__esModule",{value:!0}),t);var P={};y(P,{SendRenameContactTask:()=>R});module.exports=A(P);var o=require("@ledgerhq/device-management-kit"),d=require("../../app-binder/command/RenameContactCommand"),i=require("../../app-binder/model/contactsConstants"),r=require("../../app-binder/services/contactsTlvSerializer"),c=require("../../app-binder/services/sendFramedContactsPayload");class R{constructor(e,a){this.api=e;this.args=a}async run(){const e=this.buildPayload(this.args),a=await(0,c.sendFramedContactsPayload)(this.api,{payload:e,p1:i.RENAME_CONTACT_P1,makeCommand:(n,C)=>new d.RenameContactCommand({data:n,p2:C}),logger:this.args.logger,commandTag:"SendRenameContactTask"});if(!(0,o.isSuccessCommandResult)(a))return a;const{hmacProof:m}=a.data;return m?(0,o.DmkResultFactory)({data:{hmacProof:m}}):(0,o.DmkResultFactory)({error:new o.InvalidStatusWordError("RenameContact final-chunk response did not carry hmac_name")})}buildPayload(e){const a=new o.ByteArrayBuilder;return(0,r.encodeTlvUInt8)(a,r.CONTACTS_TLV_TAG.STRUCT_TYPE,r.STRUCT_TYPE_EDIT_CONTACT_NAME),(0,r.encodeTlvUInt8)(a,r.CONTACTS_TLV_TAG.STRUCT_VERSION,r.STRUCT_VERSION_VALUE),(0,r.encodeTlvAscii)(a,r.CONTACTS_TLV_TAG.CONTACT_NAME,e.newContactName),(0,r.encodeTlvAscii)(a,r.CONTACTS_TLV_TAG.PREVIOUS_CONTACT_NAME,e.previousContactName),(0,r.encodeTlvBuffer)(a,r.CONTACTS_TLV_TAG.GROUP_HANDLE,e.groupHandle),(0,r.encodeTlvBuffer)(a,r.CONTACTS_TLV_TAG.DERIVATION_PATH,(0,r.packDerivationPath)([2147483692,2147483708,2147483648,0,0])),(0,r.encodeTlvBuffer)(a,r.CONTACTS_TLV_TAG.HMAC_PROOF,e.hmacProof),a.build()}}0&&(module.exports={SendRenameContactTask});
2
+ //# sourceMappingURL=SendRenameContactTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/SendRenameContactTask.ts"],
4
+ "sourcesContent": ["// Builds the TLV payload for the Rename Contact (EDIT CONTACT NAME) op and\n// dispatches it via the chunked-framing scheme shared with the other\n// address-book ops (2-byte BE total length + <=255B chunks). Rename is an\n// OS/dashboard command (CLA 0xE0 / INS 0x2E) \u2014 the caller runs this task after\n// navigating to the dashboard (GoToDashboardDeviceAction), never inside an app.\n//\n// The device rotates the contact-level hmac_name and returns the fresh proof on\n// the final chunk; per-entry hmac_rest values are untouched (they bind\n// gid|scope|id|family|chain_id, never the name), so a single APDU regardless of\n// the contact's entry count.\n//\n// Reference: Address Book Final Specifications \u2014 Edit Contact Name. Tag order:\n// STRUCT_TYPE, STRUCT_VERSION, CONTACT_NAME (new), PREVIOUS_CONTACT_NAME\n// (old), GROUP_HANDLE, DERIVATION_PATH, HMAC_PROOF.\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 { RenameContactCommand } from \"@internal/app-binder/command/RenameContactCommand\";\nimport { RENAME_CONTACT_P1 } 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 encodeTlvUInt8,\n packDerivationPath,\n STRUCT_TYPE_EDIT_CONTACT_NAME,\n STRUCT_VERSION_VALUE,\n} from \"@internal/app-binder/services/contactsTlvSerializer\";\nimport { sendFramedContactsPayload } from \"@internal/app-binder/services/sendFramedContactsPayload\";\n\nexport type RenameContactProof = {\n readonly hmacProof: Uint8Array;\n};\n\nexport type SendRenameContactTaskArgs = {\n readonly previousContactName: string;\n readonly newContactName: string;\n readonly groupHandle: Uint8Array;\n readonly hmacProof: Uint8Array;\n readonly logger?: LoggerPublisherService;\n};\n\nexport class SendRenameContactTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: SendRenameContactTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<RenameContactProof, ContactsErrorCodes>> {\n const payload = this.buildPayload(this.args);\n\n const result = (await sendFramedContactsPayload(this.api, {\n payload,\n p1: RENAME_CONTACT_P1,\n makeCommand: (chunk, p2) => new RenameContactCommand({ data: chunk, p2 }),\n logger: this.args.logger,\n commandTag: \"SendRenameContactTask\",\n })) as CommandResult<\n { readonly hmacProof?: Uint8Array },\n ContactsErrorCodes\n >;\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n\n const { hmacProof } = result.data;\n if (!hmacProof) {\n return DmkResultFactory({\n error: new InvalidStatusWordError(\n \"RenameContact final-chunk response did not carry hmac_name\",\n ),\n });\n }\n return DmkResultFactory({ data: { hmacProof } });\n }\n\n private buildPayload(args: SendRenameContactTaskArgs): Uint8Array {\n const builder = new ByteArrayBuilder();\n encodeTlvUInt8(\n builder,\n CONTACTS_TLV_TAG.STRUCT_TYPE,\n STRUCT_TYPE_EDIT_CONTACT_NAME,\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.newContactName);\n encodeTlvAscii(\n builder,\n CONTACTS_TLV_TAG.PREVIOUS_CONTACT_NAME,\n args.previousContactName,\n );\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.GROUP_HANDLE, args.groupHandle);\n // The Ethereum app requires DERIVATION_PATH on Edit Contact Name (0x6a80\n // without it), same as Register Identity. 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 encodeTlvBuffer(builder, CONTACTS_TLV_TAG.HMAC_PROOF, args.hmacProof);\n\n return builder.build();\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,2BAAAE,IAAA,eAAAC,EAAAH,GAcA,IAAAI,EAQO,2CAEPC,EAAqC,6DACrCC,EAAkC,wDAElCC,EAQO,+DACPC,EAA0C,mEAcnC,MAAMN,CAAsB,CACjC,YACmBO,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAAsE,CAC1E,MAAMC,EAAU,KAAK,aAAa,KAAK,IAAI,EAErCC,EAAU,QAAM,6BAA0B,KAAK,IAAK,CACxD,QAAAD,EACA,GAAI,oBACJ,YAAa,CAACE,EAAOC,IAAO,IAAI,uBAAqB,CAAE,KAAMD,EAAO,GAAAC,CAAG,CAAC,EACxE,OAAQ,KAAK,KAAK,OAClB,WAAY,uBACd,CAAC,EAKD,GAAI,IAAC,0BAAuBF,CAAM,EAChC,OAAOA,EAGT,KAAM,CAAE,UAAAG,CAAU,EAAIH,EAAO,KAC7B,OAAKG,KAOE,oBAAiB,CAAE,KAAM,CAAE,UAAAA,CAAU,CAAE,CAAC,KANtC,oBAAiB,CACtB,MAAO,IAAI,yBACT,4DACF,CACF,CAAC,CAGL,CAEQ,aAAaL,EAA6C,CAChE,MAAMM,EAAU,IAAI,mBACpB,2BACEA,EACA,mBAAiB,YACjB,+BACF,KACA,kBACEA,EACA,mBAAiB,eACjB,sBACF,KACA,kBAAeA,EAAS,mBAAiB,aAAcN,EAAK,cAAc,KAC1E,kBACEM,EACA,mBAAiB,sBACjBN,EAAK,mBACP,KACA,mBAAgBM,EAAS,mBAAiB,aAAcN,EAAK,WAAW,KAGxE,mBACEM,EACA,mBAAiB,mBACjB,sBAAmB,CAAC,WAAY,WAAY,WAAY,EAAG,CAAC,CAAC,CAC/D,KACA,mBAAgBA,EAAS,mBAAiB,WAAYN,EAAK,SAAS,EAE7DM,EAAQ,MAAM,CACvB,CACF",
6
+ "names": ["SendRenameContactTask_exports", "__export", "SendRenameContactTask", "__toCommonJS", "import_device_management_kit", "import_RenameContactCommand", "import_contactsConstants", "import_contactsTlvSerializer", "import_sendFramedContactsPayload", "api", "args", "payload", "result", "chunk", "p2", "hmacProof", "builder"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=require("@ledgerhq/device-management-kit"),i=require("../../app-binder/command/RenameContactCommand"),o=require("./SendRenameContactTask");function s(e){const n=new Uint8Array(e.length/2);for(let t=0;t<e.length;t+=2)n[t/2]=parseInt(e.slice(t,t+2),16);return n}const r=s("cc".repeat(64)),c=s("dd".repeat(32)),d=s("ee".repeat(32)),l="6915058000002c8000003c800000000000000000000000",p=s("009001012e02010181f003426f6281f305416c69636581f640"+"cc".repeat(64)+l+"2920"+"dd".repeat(32));function m(){return{sendCommand:vi.fn()}}describe("SendRenameContactTask",()=>{it("assembles the rename framed chunk and dispatches RenameContactCommand",async()=>{const e=m();e.sendCommand.mockResolvedValueOnce((0,a.CommandResultFactory)({data:{hmacProof:d}}));const n=await new o.SendRenameContactTask(e,{previousContactName:"Alice",newContactName:"Bob",groupHandle:r,hmacProof:c}).run();expect(e.sendCommand.mock.calls).toHaveLength(1),expect(e.sendCommand.mock.calls[0][0]).toStrictEqual(new i.RenameContactCommand({data:p,p2:0})),expect(n).toStrictEqual((0,a.CommandResultFactory)({data:{hmacProof:d}}))}),it("emits the DERIVATION_PATH tag immediately before HMAC_PROOF",async()=>{const e=m();e.sendCommand.mockResolvedValueOnce((0,a.CommandResultFactory)({data:{hmacProof:d}})),await new o.SendRenameContactTask(e,{previousContactName:"Alice",newContactName:"Bob",groupHandle:r,hmacProof:c}).run();const n=e.sendCommand.mock.calls[0][0],t=Buffer.from(n.args.data).toString("hex");expect(t.endsWith(l+"2920"+"dd".repeat(32))).toBe(!0)}),it("propagates command-level errors",async()=>{const e=m();e.sendCommand.mockResolvedValueOnce((0,a.CommandResultFactory)({error:new a.InvalidStatusWordError("user cancelled")}));const n=await new o.SendRenameContactTask(e,{previousContactName:"Alice",newContactName:"Bob",groupHandle:r,hmacProof:c}).run();expect(n).toStrictEqual((0,a.CommandResultFactory)({error:new a.InvalidStatusWordError("user cancelled")}))}),it("returns InvalidStatusWordError when the final response carries no hmac_name",async()=>{const e=m();e.sendCommand.mockResolvedValueOnce((0,a.CommandResultFactory)({data:{}}));const n=await new o.SendRenameContactTask(e,{previousContactName:"Alice",newContactName:"Bob",groupHandle:r,hmacProof:c}).run();expect(n.status).not.toBe(void 0),"error"in n&&expect(n.error).toBeInstanceOf(a.InvalidStatusWordError)})});
2
+ //# sourceMappingURL=SendRenameContactTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/SendRenameContactTask.test.ts"],
4
+ "sourcesContent": ["// Validates that the TLV serializer + tag ordering + chunk framing produce the\n// expected wire bytes for the Rename Contact (EDIT CONTACT NAME) op. The framed\n// chunk = 2-byte BE total length + TLV. Tag order: STRUCT_TYPE, STRUCT_VERSION,\n// CONTACT_NAME (new), PREVIOUS_CONTACT_NAME (old), GROUP_HANDLE, DERIVATION_PATH,\n// HMAC_PROOF \u2014 with tags >= 0x80 (0xf0/0xf3/0xf6) encoded as the 2-byte DER form\n// [0x81, tag].\nimport {\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { RenameContactCommand } from \"@internal/app-binder/command/RenameContactCommand\";\n\nimport { SendRenameContactTask } from \"./SendRenameContactTask\";\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\nconst GROUP_HANDLE = hexToBytes(\"cc\".repeat(64));\nconst HMAC_PROOF_IN = hexToBytes(\"dd\".repeat(32));\nconst HMAC_PROOF_OUT = hexToBytes(\"ee\".repeat(32));\n\n// Framed chunk = \"00 90\" (2-byte BE total TLV length = 144) + TLV:\n// 01 01 2e STRUCT_TYPE = EDIT_CONTACT_NAME (0x2e)\n// 02 01 01 STRUCT_VERSION = 1\n// 81 f0 03 \"Bob\" CONTACT_NAME (new), tag 0xf0 -> [81 f0]\n// 81 f3 05 \"Alice\" PREVIOUS_CONTACT_NAME (old), tag 0xf3 -> [81 f3]\n// 81 f6 40 <64x cc> GROUP_HANDLE, tag 0xf6 -> [81 f6]\n// 69 15 05 <5x path> DERIVATION_PATH (0x69), m/44'/60'/0'/0/0\n// 29 20 <32x dd> HMAC_PROOF\nconst DERIVATION_PATH_TLV = \"6915058000002c8000003c800000000000000000000000\";\nconst FRAMED_CHUNK = hexToBytes(\n \"0090\" +\n \"01012e\" +\n \"020101\" +\n \"81f003426f62\" +\n \"81f305416c696365\" +\n \"81f640\" +\n \"cc\".repeat(64) +\n DERIVATION_PATH_TLV +\n \"2920\" +\n \"dd\".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(\"SendRenameContactTask\", () => {\n it(\"assembles the rename framed chunk and dispatches RenameContactCommand\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n\n const result = await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new RenameContactCommand({ data: FRAMED_CHUNK, p2: 0x00 }),\n );\n expect(result).toStrictEqual(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n });\n\n it(\"emits the DERIVATION_PATH tag immediately before HMAC_PROOF\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n\n await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n // The Ethereum app requires DERIVATION_PATH (0x69); it sits immediately\n // before HMAC_PROOF (0x29), matching Register Identity.\n const command = api.sendCommand.mock.calls[0]![0] as RenameContactCommand;\n const framedHex = Buffer.from(command.args.data).toString(\"hex\");\n expect(\n framedHex.endsWith(DERIVATION_PATH_TLV + \"2920\" + \"dd\".repeat(32)),\n ).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 SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n });\n\n it(\"returns InvalidStatusWordError when the final response carries no hmac_name\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(CommandResultFactory({ data: {} }));\n\n const result = await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(result.status).not.toBe(undefined);\n if (\"error\" in result) {\n expect(result.error).toBeInstanceOf(InvalidStatusWordError);\n }\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_RenameContactCommand", "import_SendRenameContactTask", "hexToBytes", "hex", "out", "i", "GROUP_HANDLE", "HMAC_PROOF_IN", "HMAC_PROOF_OUT", "DERIVATION_PATH_TLV", "FRAMED_CHUNK", "makeApiMock", "api", "result", "command", "framedHex"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var r=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var C=(n,e)=>{for(var o in e)r(n,o,{get:e[o],enumerable:!0})},D=(n,e,o,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of d(e))!c.call(n,i)&&i!==o&&r(n,i,{get:()=>e[i],enumerable:!(t=m(e,i))||t.enumerable});return n};var l=n=>D(r({},"__esModule",{value:!0}),n);var y={};C(y,{makeContainer:()=>v});module.exports=l(y);var s=require("inversify"),p=require("./app-binder/di/appBinderModule"),a=require("./externalTypes");const v=({dmk:n,sessionId:e,appName:o})=>{const t=new s.Container;return t.bind(a.externalTypes.Dmk).toConstantValue(n),t.bind(a.externalTypes.SessionId).toConstantValue(e),t.bind(a.externalTypes.AppName).toConstantValue(o),t.loadSync((0,p.appBinderModuleFactory)()),t};0&&(module.exports={makeContainer});
1
+ "use strict";var r=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var y=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},C=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of c(e))!l.call(n,a)&&a!==t&&r(n,a,{get:()=>e[a],enumerable:!(o=d(e,a))||o.enumerable});return n};var u=n=>C(r({},"__esModule",{value:!0}),n);var M={};y(M,{makeContainer:()=>D});module.exports=u(M);var s=require("inversify"),m=require("./app-binder/di/appBinderModule"),i=require("./externalTypes"),p=require("./use-cases/di/useCaseModule");const D=({dmk:n,sessionId:e,appName:t})=>{const o=new s.Container;return o.bind(i.externalTypes.Dmk).toConstantValue(n),o.bind(i.externalTypes.SessionId).toConstantValue(e),o.bind(i.externalTypes.AppName).toConstantValue(t),o.loadSync((0,m.appBinderModuleFactory)()),o.loadSync((0,p.useCaseModuleFactory)()),o};0&&(module.exports={makeContainer});
2
2
  //# sourceMappingURL=di.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/internal/di.ts"],
4
- "sourcesContent": ["import {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { Container } from \"inversify\";\n\nimport { appBinderModuleFactory } from \"@internal/app-binder/di/appBinderModule\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\ntype MakeContainerProps = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n appName: string;\n};\n\nexport const makeContainer = ({\n dmk,\n sessionId,\n appName,\n}: MakeContainerProps) => {\n const container = new Container();\n\n container.bind<DeviceManagementKit>(externalTypes.Dmk).toConstantValue(dmk);\n container\n .bind<DeviceSessionId>(externalTypes.SessionId)\n .toConstantValue(sessionId);\n container.bind<string>(externalTypes.AppName).toConstantValue(appName);\n\n container.loadSync(appBinderModuleFactory());\n\n return container;\n};\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAA0B,qBAE1BC,EAAuC,mDACvCC,EAA8B,mCAQvB,MAAMJ,EAAgB,CAAC,CAC5B,IAAAK,EACA,UAAAC,EACA,QAAAC,CACF,IAA0B,CACxB,MAAMC,EAAY,IAAI,YAEtB,OAAAA,EAAU,KAA0B,gBAAc,GAAG,EAAE,gBAAgBH,CAAG,EAC1EG,EACG,KAAsB,gBAAc,SAAS,EAC7C,gBAAgBF,CAAS,EAC5BE,EAAU,KAAa,gBAAc,OAAO,EAAE,gBAAgBD,CAAO,EAErEC,EAAU,YAAS,0BAAuB,CAAC,EAEpCA,CACT",
6
- "names": ["di_exports", "__export", "makeContainer", "__toCommonJS", "import_inversify", "import_appBinderModule", "import_externalTypes", "dmk", "sessionId", "appName", "container"]
4
+ "sourcesContent": ["import {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { Container } from \"inversify\";\n\nimport { appBinderModuleFactory } from \"@internal/app-binder/di/appBinderModule\";\nimport { externalTypes } from \"@internal/externalTypes\";\nimport { useCaseModuleFactory } from \"@internal/use-cases/di/useCaseModule\";\n\ntype MakeContainerProps = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n appName: string;\n};\n\nexport const makeContainer = ({\n dmk,\n sessionId,\n appName,\n}: MakeContainerProps) => {\n const container = new Container();\n\n container.bind<DeviceManagementKit>(externalTypes.Dmk).toConstantValue(dmk);\n container\n .bind<DeviceSessionId>(externalTypes.SessionId)\n .toConstantValue(sessionId);\n container.bind<string>(externalTypes.AppName).toConstantValue(appName);\n\n container.loadSync(appBinderModuleFactory());\n container.loadSync(useCaseModuleFactory());\n\n return container;\n};\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAA0B,qBAE1BC,EAAuC,mDACvCC,EAA8B,mCAC9BC,EAAqC,gDAQ9B,MAAML,EAAgB,CAAC,CAC5B,IAAAM,EACA,UAAAC,EACA,QAAAC,CACF,IAA0B,CACxB,MAAMC,EAAY,IAAI,YAEtB,OAAAA,EAAU,KAA0B,gBAAc,GAAG,EAAE,gBAAgBH,CAAG,EAC1EG,EACG,KAAsB,gBAAc,SAAS,EAC7C,gBAAgBF,CAAS,EAC5BE,EAAU,KAAa,gBAAc,OAAO,EAAE,gBAAgBD,CAAO,EAErEC,EAAU,YAAS,0BAAuB,CAAC,EAC3CA,EAAU,YAAS,wBAAqB,CAAC,EAElCA,CACT",
6
+ "names": ["di_exports", "__export", "makeContainer", "__toCommonJS", "import_inversify", "import_appBinderModule", "import_externalTypes", "import_useCaseModule", "dmk", "sessionId", "appName", "container"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var p=require("./app-binder/ContactsAppBinder"),s=require("./app-binder/di/appBinderTypes"),a=require("./di"),t=require("./externalTypes");describe("makeContainer",()=>{const n={},o="session-id",i="Ethereum",e=(0,a.makeContainer)({dmk:n,sessionId:o,appName:i});it("binds dmk, sessionId and appName as external values",()=>{expect(e.get(t.externalTypes.Dmk)).toBe(n),expect(e.get(t.externalTypes.SessionId)).toBe(o),expect(e.get(t.externalTypes.AppName)).toBe(i)}),it("binds the ContactsAppBinder",()=>{expect(e.get(s.appBinderTypes.AppBinder)).toBeInstanceOf(p.ContactsAppBinder)})});
1
+ "use strict";var i=require("./app-binder/ContactsAppBinder"),r=require("./app-binder/di/appBinderTypes"),p=require("./di"),t=require("./externalTypes"),s=require("./use-cases/di/useCaseTypes"),m=require("./use-cases/RegisterExternalAddressUseCase"),c=require("./use-cases/RenameContactUseCase");describe("makeContainer",()=>{const n={},a="session-id",o="Ethereum",e=(0,p.makeContainer)({dmk:n,sessionId:a,appName:o});it("binds dmk, sessionId and appName as external values",()=>{expect(e.get(t.externalTypes.Dmk)).toBe(n),expect(e.get(t.externalTypes.SessionId)).toBe(a),expect(e.get(t.externalTypes.AppName)).toBe(o)}),it("binds the ContactsAppBinder",()=>{expect(e.get(r.appBinderTypes.AppBinder)).toBeInstanceOf(i.ContactsAppBinder)}),it("binds the RegisterExternalAddressUseCase",()=>{expect(e.get(s.useCaseTypes.RegisterExternalAddressUseCase)).toBeInstanceOf(m.RegisterExternalAddressUseCase)}),it("binds the RenameContactUseCase",()=>{expect(e.get(s.useCaseTypes.RenameContactUseCase)).toBeInstanceOf(c.RenameContactUseCase)})});
2
2
  //# sourceMappingURL=di.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/internal/di.test.ts"],
4
- "sourcesContent": ["import { type DeviceManagementKit } from \"@ledgerhq/device-management-kit\";\n\nimport { ContactsAppBinder } from \"@internal/app-binder/ContactsAppBinder\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { makeContainer } from \"@internal/di\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\ndescribe(\"makeContainer\", () => {\n const dmk = {} as DeviceManagementKit;\n const sessionId = \"session-id\";\n const appName = \"Ethereum\";\n\n const container = makeContainer({ dmk, sessionId, appName });\n\n it(\"binds dmk, sessionId and appName as external values\", () => {\n expect(container.get(externalTypes.Dmk)).toBe(dmk);\n expect(container.get(externalTypes.SessionId)).toBe(sessionId);\n expect(container.get(externalTypes.AppName)).toBe(appName);\n });\n\n it(\"binds the ContactsAppBinder\", () => {\n expect(container.get(appBinderTypes.AppBinder)).toBeInstanceOf(\n ContactsAppBinder,\n );\n });\n});\n"],
5
- "mappings": "aAEA,IAAAA,EAAkC,kDAClCC,EAA+B,kDAC/BC,EAA8B,wBAC9BC,EAA8B,mCAE9B,SAAS,gBAAiB,IAAM,CAC9B,MAAMC,EAAM,CAAC,EACPC,EAAY,aACZC,EAAU,WAEVC,KAAY,iBAAc,CAAE,IAAAH,EAAK,UAAAC,EAAW,QAAAC,CAAQ,CAAC,EAE3D,GAAG,sDAAuD,IAAM,CAC9D,OAAOC,EAAU,IAAI,gBAAc,GAAG,CAAC,EAAE,KAAKH,CAAG,EACjD,OAAOG,EAAU,IAAI,gBAAc,SAAS,CAAC,EAAE,KAAKF,CAAS,EAC7D,OAAOE,EAAU,IAAI,gBAAc,OAAO,CAAC,EAAE,KAAKD,CAAO,CAC3D,CAAC,EAED,GAAG,8BAA+B,IAAM,CACtC,OAAOC,EAAU,IAAI,iBAAe,SAAS,CAAC,EAAE,eAC9C,mBACF,CACF,CAAC,CACH,CAAC",
6
- "names": ["import_ContactsAppBinder", "import_appBinderTypes", "import_di", "import_externalTypes", "dmk", "sessionId", "appName", "container"]
4
+ "sourcesContent": ["import { type DeviceManagementKit } from \"@ledgerhq/device-management-kit\";\n\nimport { ContactsAppBinder } from \"@internal/app-binder/ContactsAppBinder\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { makeContainer } from \"@internal/di\";\nimport { externalTypes } from \"@internal/externalTypes\";\nimport { useCaseTypes } from \"@internal/use-cases/di/useCaseTypes\";\nimport { RegisterExternalAddressUseCase } from \"@internal/use-cases/RegisterExternalAddressUseCase\";\nimport { RenameContactUseCase } from \"@internal/use-cases/RenameContactUseCase\";\n\ndescribe(\"makeContainer\", () => {\n const dmk = {} as DeviceManagementKit;\n const sessionId = \"session-id\";\n const appName = \"Ethereum\";\n\n const container = makeContainer({ dmk, sessionId, appName });\n\n it(\"binds dmk, sessionId and appName as external values\", () => {\n expect(container.get(externalTypes.Dmk)).toBe(dmk);\n expect(container.get(externalTypes.SessionId)).toBe(sessionId);\n expect(container.get(externalTypes.AppName)).toBe(appName);\n });\n\n it(\"binds the ContactsAppBinder\", () => {\n expect(container.get(appBinderTypes.AppBinder)).toBeInstanceOf(\n ContactsAppBinder,\n );\n });\n\n it(\"binds the RegisterExternalAddressUseCase\", () => {\n expect(\n container.get(useCaseTypes.RegisterExternalAddressUseCase),\n ).toBeInstanceOf(RegisterExternalAddressUseCase);\n });\n\n it(\"binds the RenameContactUseCase\", () => {\n expect(container.get(useCaseTypes.RenameContactUseCase)).toBeInstanceOf(\n RenameContactUseCase,\n );\n });\n});\n"],
5
+ "mappings": "aAEA,IAAAA,EAAkC,kDAClCC,EAA+B,kDAC/BC,EAA8B,wBAC9BC,EAA8B,mCAC9BC,EAA6B,+CAC7BC,EAA+C,8DAC/CC,EAAqC,oDAErC,SAAS,gBAAiB,IAAM,CAC9B,MAAMC,EAAM,CAAC,EACPC,EAAY,aACZC,EAAU,WAEVC,KAAY,iBAAc,CAAE,IAAAH,EAAK,UAAAC,EAAW,QAAAC,CAAQ,CAAC,EAE3D,GAAG,sDAAuD,IAAM,CAC9D,OAAOC,EAAU,IAAI,gBAAc,GAAG,CAAC,EAAE,KAAKH,CAAG,EACjD,OAAOG,EAAU,IAAI,gBAAc,SAAS,CAAC,EAAE,KAAKF,CAAS,EAC7D,OAAOE,EAAU,IAAI,gBAAc,OAAO,CAAC,EAAE,KAAKD,CAAO,CAC3D,CAAC,EAED,GAAG,8BAA+B,IAAM,CACtC,OAAOC,EAAU,IAAI,iBAAe,SAAS,CAAC,EAAE,eAC9C,mBACF,CACF,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,OACEA,EAAU,IAAI,eAAa,8BAA8B,CAC3D,EAAE,eAAe,gCAA8B,CACjD,CAAC,EAED,GAAG,iCAAkC,IAAM,CACzC,OAAOA,EAAU,IAAI,eAAa,oBAAoB,CAAC,EAAE,eACvD,sBACF,CACF,CAAC,CACH,CAAC",
6
+ "names": ["import_ContactsAppBinder", "import_appBinderTypes", "import_di", "import_externalTypes", "import_useCaseTypes", "import_RegisterExternalAddressUseCase", "import_RenameContactUseCase", "dmk", "sessionId", "appName", "container"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var o=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var f=(t,r)=>{for(var e in r)o(t,e,{get:r[e],enumerable:!0})},l=(t,r,e,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let p of y(r))!B.call(t,p)&&p!==e&&o(t,p,{get:()=>r[p],enumerable:!(n=c(r,p))||n.enumerable});return t};var x=t=>l(o({},"__esModule",{value:!0}),t),s=(t,r,e,n)=>{for(var p=n>1?void 0:n?c(r,e):r,m=t.length-1,a;m>=0;m--)(a=t[m])&&(p=(n?a(r,e,p):a(p))||p);return n&&p&&o(r,e,p),p},u=(t,r)=>(e,n)=>r(e,n,t);var R={};f(R,{RegisterExternalAddressUseCase:()=>i});module.exports=x(R);var d=require("inversify"),A=require("../app-binder/di/appBinderTypes");let i=class{constructor(r){this.appBinder=r}execute(r){return this.appBinder.registerExternalAddress(r)}};i=s([(0,d.injectable)(),u(0,(0,d.inject)(A.appBinderTypes.AppBinder))],i);0&&(module.exports={RegisterExternalAddressUseCase});
2
+ //# sourceMappingURL=RegisterExternalAddressUseCase.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/internal/use-cases/RegisterExternalAddressUseCase.ts"],
4
+ "sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { type RegisterExternalAddressDAReturnType } from \"@api/app-binder/RegisterExternalAddressDeviceActionTypes\";\nimport { type RegisterExternalAddressInput } from \"@api/model/RegisterExternalAddress\";\nimport { ContactsAppBinder } from \"@internal/app-binder/ContactsAppBinder\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\n\n/**\n * Delegates to `ContactsAppBinder`, which uses its injected `dmk`, `sessionId`,\n * and `appName` to construct and execute the `RegisterExternalAddressDeviceAction`.\n *\n * Caller-input validation is intentionally NOT done here: the public API returns\n * a device action, so validation lives inside the device action and surfaces as\n * a typed terminal error state on the observable rather than a synchronous throw.\n */\n@injectable()\nexport class RegisterExternalAddressUseCase {\n constructor(\n @inject(appBinderTypes.AppBinder)\n private readonly appBinder: ContactsAppBinder,\n ) {}\n\n execute(\n input: RegisterExternalAddressInput,\n ): RegisterExternalAddressDAReturnType {\n return this.appBinder.registerExternalAddress(input);\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmC,qBAKnCC,EAA+B,kDAWxB,IAAMC,EAAN,KAAqC,CAC1C,YAEmBC,EACjB,CADiB,eAAAA,CAChB,CAEH,QACEC,EACqC,CACrC,OAAO,KAAK,UAAU,wBAAwBA,CAAK,CACrD,CACF,EAXaF,EAANG,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,iBAAe,SAAS,IAFvBJ",
6
+ "names": ["RegisterExternalAddressUseCase_exports", "__export", "RegisterExternalAddressUseCase", "__toCommonJS", "import_inversify", "import_appBinderTypes", "RegisterExternalAddressUseCase", "appBinder", "input", "__decorateClass", "__decorateParam"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=require("./RegisterExternalAddressUseCase");function r(){const e=vi.fn().mockReturnValue("DA_RETURN"),t={registerExternalAddress:e};return{useCase:new a.RegisterExternalAddressUseCase(t),registerExternalAddress:e}}const s={contactName:"Alice",scope:"Eth main",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n};describe("RegisterExternalAddressUseCase",()=>{it("delegates to the app binder",()=>{const{useCase:e,registerExternalAddress:t}=r(),n=e.execute(s);expect(t).toHaveBeenCalledWith(s),expect(n).toBe("DA_RETURN")}),it("does not validate \u2014 invalid input is forwarded, not thrown",()=>{const{useCase:e,registerExternalAddress:t}=r(),n={...s,contactName:""};expect(()=>e.execute(n)).not.toThrow(),expect(t).toHaveBeenCalledWith(n)})});
2
+ //# sourceMappingURL=RegisterExternalAddressUseCase.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/internal/use-cases/RegisterExternalAddressUseCase.test.ts"],
4
+ "sourcesContent": ["import { type RegisterExternalAddressInput } from \"@api/model/RegisterExternalAddress\";\nimport { type ContactsAppBinder } from \"@internal/app-binder/ContactsAppBinder\";\n\nimport { RegisterExternalAddressUseCase } from \"./RegisterExternalAddressUseCase\";\n\nfunction makeUseCase() {\n const registerExternalAddress = vi.fn().mockReturnValue(\"DA_RETURN\");\n const appBinder = { registerExternalAddress } as unknown as ContactsAppBinder;\n return {\n useCase: new RegisterExternalAddressUseCase(appBinder),\n registerExternalAddress,\n };\n}\n\nconst VALID_INPUT: RegisterExternalAddressInput = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: new Uint8Array(20).fill(0x11),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n};\n\ndescribe(\"RegisterExternalAddressUseCase\", () => {\n it(\"delegates to the app binder\", () => {\n const { useCase, registerExternalAddress } = makeUseCase();\n\n const result = useCase.execute(VALID_INPUT);\n\n expect(registerExternalAddress).toHaveBeenCalledWith(VALID_INPUT);\n expect(result).toBe(\"DA_RETURN\");\n });\n\n it(\"does not validate \u2014 invalid input is forwarded, not thrown\", () => {\n // Validation now lives in the device action and surfaces as a typed DA\n // error state; the use case must never throw for bad input.\n const { useCase, registerExternalAddress } = makeUseCase();\n\n const invalidInput = { ...VALID_INPUT, contactName: \"\" };\n expect(() => useCase.execute(invalidInput)).not.toThrow();\n expect(registerExternalAddress).toHaveBeenCalledWith(invalidInput);\n });\n});\n"],
5
+ "mappings": "aAGA,IAAAA,EAA+C,4CAE/C,SAASC,GAAc,CACrB,MAAMC,EAA0B,GAAG,GAAG,EAAE,gBAAgB,WAAW,EAC7DC,EAAY,CAAE,wBAAAD,CAAwB,EAC5C,MAAO,CACL,QAAS,IAAI,iCAA+BC,CAAS,EACrD,wBAAAD,CACF,CACF,CAEA,MAAME,EAA4C,CAChD,YAAa,QACb,MAAO,WACP,WAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EACxC,iBAAkB,WAClB,QAAS,EACX,EAEA,SAAS,iCAAkC,IAAM,CAC/C,GAAG,8BAA+B,IAAM,CACtC,KAAM,CAAE,QAAAC,EAAS,wBAAAH,CAAwB,EAAID,EAAY,EAEnDK,EAASD,EAAQ,QAAQD,CAAW,EAE1C,OAAOF,CAAuB,EAAE,qBAAqBE,CAAW,EAChE,OAAOE,CAAM,EAAE,KAAK,WAAW,CACjC,CAAC,EAED,GAAG,kEAA8D,IAAM,CAGrE,KAAM,CAAE,QAAAD,EAAS,wBAAAH,CAAwB,EAAID,EAAY,EAEnDM,EAAe,CAAE,GAAGH,EAAa,YAAa,EAAG,EACvD,OAAO,IAAMC,EAAQ,QAAQE,CAAY,CAAC,EAAE,IAAI,QAAQ,EACxD,OAAOL,CAAuB,EAAE,qBAAqBK,CAAY,CACnE,CAAC,CACH,CAAC",
6
+ "names": ["import_RegisterExternalAddressUseCase", "makeUseCase", "registerExternalAddress", "appBinder", "VALID_INPUT", "useCase", "result", "invalidInput"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var i=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var l=(p,t)=>{for(var e in t)i(p,e,{get:t[e],enumerable:!0})},R=(p,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of f(t))!A.call(p,r)&&r!==e&&i(p,r,{get:()=>t[r],enumerable:!(n=d(t,r))||n.enumerable});return p};var T=p=>R(i({},"__esModule",{value:!0}),p),u=(p,t,e,n)=>{for(var r=n>1?void 0:n?d(t,e):t,a=p.length-1,c;a>=0;a--)(c=p[a])&&(r=(n?c(t,e,r):c(r))||r);return n&&r&&i(t,e,r),r},y=(p,t)=>(e,n)=>t(e,n,p);var j={};l(j,{RenameContactUseCase:()=>o});module.exports=T(j);var m=require("inversify"),B=require("../app-binder/di/appBinderTypes");let o=class{constructor(t){this.appBinder=t}execute(t){return this.appBinder.renameContact(t)}};o=u([(0,m.injectable)(),y(0,(0,m.inject)(B.appBinderTypes.AppBinder))],o);0&&(module.exports={RenameContactUseCase});
2
+ //# sourceMappingURL=RenameContactUseCase.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/internal/use-cases/RenameContactUseCase.ts"],
4
+ "sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { type RenameContactDAReturnType } from \"@api/app-binder/RenameContactDeviceActionTypes\";\nimport { type RenameContactInput } from \"@api/model/RenameContact\";\nimport { ContactsAppBinder } from \"@internal/app-binder/ContactsAppBinder\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\n\n/**\n * Delegates to `ContactsAppBinder`, which uses its injected `dmk` and\n * `sessionId` to construct and execute the `RenameContactDeviceAction`. The\n * injected `appName` is not used: rename is a dashboard operation served by the\n * device OS, not the embedded app.\n *\n * Caller-input validation is intentionally NOT done here: the public API returns\n * a device action, so validation lives inside the device action and surfaces as\n * a typed terminal error state on the observable rather than a synchronous throw.\n */\n@injectable()\nexport class RenameContactUseCase {\n constructor(\n @inject(appBinderTypes.AppBinder)\n private readonly appBinder: ContactsAppBinder,\n ) {}\n\n execute(input: RenameContactInput): RenameContactDAReturnType {\n return this.appBinder.renameContact(input);\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmC,qBAKnCC,EAA+B,kDAaxB,IAAMC,EAAN,KAA2B,CAChC,YAEmBC,EACjB,CADiB,eAAAA,CAChB,CAEH,QAAQC,EAAsD,CAC5D,OAAO,KAAK,UAAU,cAAcA,CAAK,CAC3C,CACF,EATaF,EAANG,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,iBAAe,SAAS,IAFvBJ",
6
+ "names": ["RenameContactUseCase_exports", "__export", "RenameContactUseCase", "__toCommonJS", "import_inversify", "import_appBinderTypes", "RenameContactUseCase", "appBinder", "input", "__decorateClass", "__decorateParam"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var c=require("./RenameContactUseCase");function o(){const e=vi.fn().mockReturnValue("DA_RETURN"),t={renameContact:e};return{useCase:new c.RenameContactUseCase(t),renameContact:e}}const a={previousContactName:"Alice",newContactName:"Bob",groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)};describe("RenameContactUseCase",()=>{it("delegates to the app binder",()=>{const{useCase:e,renameContact:t}=o(),n=e.execute(a);expect(t).toHaveBeenCalledWith(a),expect(n).toBe("DA_RETURN")}),it("does not validate \u2014 invalid input is forwarded, not thrown",()=>{const{useCase:e,renameContact:t}=o(),n={...a,newContactName:""};expect(()=>e.execute(n)).not.toThrow(),expect(t).toHaveBeenCalledWith(n)})});
2
+ //# sourceMappingURL=RenameContactUseCase.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/internal/use-cases/RenameContactUseCase.test.ts"],
4
+ "sourcesContent": ["import { type RenameContactInput } from \"@api/model/RenameContact\";\nimport { type ContactsAppBinder } from \"@internal/app-binder/ContactsAppBinder\";\n\nimport { RenameContactUseCase } from \"./RenameContactUseCase\";\n\nfunction makeUseCase() {\n const renameContact = vi.fn().mockReturnValue(\"DA_RETURN\");\n const appBinder = { renameContact } as unknown as ContactsAppBinder;\n return {\n useCase: new RenameContactUseCase(appBinder),\n renameContact,\n };\n}\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(\"RenameContactUseCase\", () => {\n it(\"delegates to the app binder\", () => {\n const { useCase, renameContact } = makeUseCase();\n\n const result = useCase.execute(VALID_INPUT);\n\n expect(renameContact).toHaveBeenCalledWith(VALID_INPUT);\n expect(result).toBe(\"DA_RETURN\");\n });\n\n it(\"does not validate \u2014 invalid input is forwarded, not thrown\", () => {\n // Validation lives in the device action and surfaces as a typed DA error\n // state; the use case must never throw for bad input.\n const { useCase, renameContact } = makeUseCase();\n\n const invalidInput = { ...VALID_INPUT, newContactName: \"\" };\n expect(() => useCase.execute(invalidInput)).not.toThrow();\n expect(renameContact).toHaveBeenCalledWith(invalidInput);\n });\n});\n"],
5
+ "mappings": "aAGA,IAAAA,EAAqC,kCAErC,SAASC,GAAc,CACrB,MAAMC,EAAgB,GAAG,GAAG,EAAE,gBAAgB,WAAW,EACnDC,EAAY,CAAE,cAAAD,CAAc,EAClC,MAAO,CACL,QAAS,IAAI,uBAAqBC,CAAS,EAC3C,cAAAD,CACF,CACF,CAEA,MAAME,EAAkC,CACtC,oBAAqB,QACrB,eAAgB,MAChB,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACzC,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACzC,EAEA,SAAS,uBAAwB,IAAM,CACrC,GAAG,8BAA+B,IAAM,CACtC,KAAM,CAAE,QAAAC,EAAS,cAAAH,CAAc,EAAID,EAAY,EAEzCK,EAASD,EAAQ,QAAQD,CAAW,EAE1C,OAAOF,CAAa,EAAE,qBAAqBE,CAAW,EACtD,OAAOE,CAAM,EAAE,KAAK,WAAW,CACjC,CAAC,EAED,GAAG,kEAA8D,IAAM,CAGrE,KAAM,CAAE,QAAAD,EAAS,cAAAH,CAAc,EAAID,EAAY,EAEzCM,EAAe,CAAE,GAAGH,EAAa,eAAgB,EAAG,EAC1D,OAAO,IAAMC,EAAQ,QAAQE,CAAY,CAAC,EAAE,IAAI,QAAQ,EACxD,OAAOL,CAAa,EAAE,qBAAqBK,CAAY,CACzD,CAAC,CACH,CAAC",
6
+ "names": ["import_RenameContactUseCase", "makeUseCase", "renameContact", "appBinder", "VALID_INPUT", "useCase", "result", "invalidInput"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var f=(e,s)=>{for(var t in s)r(e,t,{get:s[t],enumerable:!0})},l=(e,s,t,m)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of d(s))!c.call(e,o)&&o!==t&&r(e,o,{get:()=>s[o],enumerable:!(m=p(s,o))||m.enumerable});return e};var u=e=>l(r({},"__esModule",{value:!0}),e);var U={};f(U,{useCaseModuleFactory:()=>R});module.exports=u(U);var n=require("inversify"),C=require("../../use-cases/RegisterExternalAddressUseCase"),i=require("../../use-cases/RenameContactUseCase"),a=require("./useCaseTypes");const R=()=>new n.ContainerModule(({bind:e})=>{e(a.useCaseTypes.RegisterExternalAddressUseCase).to(C.RegisterExternalAddressUseCase),e(a.useCaseTypes.RenameContactUseCase).to(i.RenameContactUseCase)});0&&(module.exports={useCaseModuleFactory});
2
+ //# sourceMappingURL=useCaseModule.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/use-cases/di/useCaseModule.ts"],
4
+ "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { RegisterExternalAddressUseCase } from \"@internal/use-cases/RegisterExternalAddressUseCase\";\nimport { RenameContactUseCase } from \"@internal/use-cases/RenameContactUseCase\";\n\nimport { useCaseTypes } from \"./useCaseTypes\";\n\nexport const useCaseModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(useCaseTypes.RegisterExternalAddressUseCase).to(\n RegisterExternalAddressUseCase,\n );\n bind(useCaseTypes.RenameContactUseCase).to(RenameContactUseCase);\n });\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAA+C,8DAC/CC,EAAqC,oDAErCC,EAA6B,0BAEtB,MAAML,EAAuB,IAClC,IAAI,kBAAgB,CAAC,CAAE,KAAAM,CAAK,IAAM,CAChCA,EAAK,eAAa,8BAA8B,EAAE,GAChD,gCACF,EACAA,EAAK,eAAa,oBAAoB,EAAE,GAAG,sBAAoB,CACjE,CAAC",
6
+ "names": ["useCaseModule_exports", "__export", "useCaseModuleFactory", "__toCommonJS", "import_inversify", "import_RegisterExternalAddressUseCase", "import_RenameContactUseCase", "import_useCaseTypes", "bind"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var o=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var d=(s,e)=>{for(var t in e)o(s,t,{get:e[t],enumerable:!0})},l=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of C(e))!c.call(s,a)&&a!==t&&o(s,a,{get:()=>e[a],enumerable:!(r=n(e,a))||r.enumerable});return s};var m=s=>l(o({},"__esModule",{value:!0}),s);var U={};d(U,{useCaseTypes:()=>R});module.exports=m(U);const R={RegisterExternalAddressUseCase:Symbol.for("RegisterExternalAddressUseCase"),RenameContactUseCase:Symbol.for("RenameContactUseCase")};0&&(module.exports={useCaseTypes});
2
+ //# sourceMappingURL=useCaseTypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/use-cases/di/useCaseTypes.ts"],
4
+ "sourcesContent": ["export const useCaseTypes = {\n RegisterExternalAddressUseCase: Symbol.for(\"RegisterExternalAddressUseCase\"),\n RenameContactUseCase: Symbol.for(\"RenameContactUseCase\"),\n} as const;\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAe,CAC1B,+BAAgC,OAAO,IAAI,gCAAgC,EAC3E,qBAAsB,OAAO,IAAI,sBAAsB,CACzD",
6
+ "names": ["useCaseTypes_exports", "__export", "useCaseTypes", "__toCommonJS"]
7
+ }
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "dependencies": {
3
+ "@ledgerhq/signer-utils": "workspace:*",
3
4
  "inversify": "catalog:",
4
5
  "purify-ts": "catalog:",
5
6
  "reflect-metadata": "catalog:",
@@ -57,5 +58,5 @@
57
58
  "watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
58
59
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
59
60
  },
60
- "version": "0.0.0-develop-20260827155839"
61
+ "version": "0.0.0-develop-20260829001241"
61
62
  }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=RegisterExternalAddressDeviceActionTypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=RenameContactDeviceActionTypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -1,2 +1,2 @@
1
- import{ContactsManagerBuilder as o}from"./ContactsManagerBuilder";import{CONTACTS_VERSION_REQUIREMENTS as s,ETHEREUM_APP_NAME as n,isContactsSupported as p,isVersionAtLeast as a,resolveContactsVersionRequirements as C}from"./model/ContactsVersionRequirements";export{s as CONTACTS_VERSION_REQUIREMENTS,o as ContactsManagerBuilder,n as ETHEREUM_APP_NAME,p as isContactsSupported,a as isVersionAtLeast,C as resolveContactsVersionRequirements};
1
+ import{ContactsManagerBuilder as r}from"./ContactsManagerBuilder";import{CONTACTS_VERSION_REQUIREMENTS as p,ETHEREUM_APP_NAME as a,isContactsSupported as o,isVersionAtLeast as s,resolveContactsVersionRequirements as d}from"./model/ContactsVersionRequirements";export{p as CONTACTS_VERSION_REQUIREMENTS,r as ContactsManagerBuilder,a as ETHEREUM_APP_NAME,o as isContactsSupported,s as isVersionAtLeast,d as resolveContactsVersionRequirements};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/index.ts"],
4
- "sourcesContent": ["export { type ContactsManager } from \"@api/ContactsManager\";\nexport { ContactsManagerBuilder } from \"@api/ContactsManagerBuilder\";\nexport {\n CONTACTS_VERSION_REQUIREMENTS,\n type ContactsModelRequirement,\n type ContactsModelSupport,\n type ContactsModelUnsupported,\n type ContactsSupportQuery,\n type ContactsVersionRequirements,\n ETHEREUM_APP_NAME,\n isContactsSupported,\n isVersionAtLeast,\n resolveContactsVersionRequirements,\n} from \"@api/model/ContactsVersionRequirements\";\n"],
5
- "mappings": "AACA,OAAS,0BAAAA,MAA8B,8BACvC,OACE,iCAAAC,EAMA,qBAAAC,EACA,uBAAAC,EACA,oBAAAC,EACA,sCAAAC,MACK",
4
+ "sourcesContent": ["export {\n type RegisterExternalAddressDAError,\n type RegisterExternalAddressDAInput,\n type RegisterExternalAddressDAIntermediateValue,\n type RegisterExternalAddressDAOutput,\n type RegisterExternalAddressDARequiredInteraction,\n type RegisterExternalAddressDAReturnType,\n type RegisterExternalAddressDAState,\n} from \"@api/app-binder/RegisterExternalAddressDeviceActionTypes\";\nexport {\n type RenameContactDAError,\n type RenameContactDAInput,\n type RenameContactDAIntermediateValue,\n type RenameContactDAOutput,\n type RenameContactDARequiredInteraction,\n type RenameContactDAReturnType,\n type RenameContactDAState,\n} from \"@api/app-binder/RenameContactDeviceActionTypes\";\nexport { type ContactsManager } from \"@api/ContactsManager\";\nexport { ContactsManagerBuilder } from \"@api/ContactsManagerBuilder\";\nexport {\n CONTACTS_VERSION_REQUIREMENTS,\n type ContactsModelRequirement,\n type ContactsModelSupport,\n type ContactsModelUnsupported,\n type ContactsSupportQuery,\n type ContactsVersionRequirements,\n ETHEREUM_APP_NAME,\n isContactsSupported,\n isVersionAtLeast,\n resolveContactsVersionRequirements,\n} from \"@api/model/ContactsVersionRequirements\";\nexport {\n type ExistingContactGroup,\n type RegisterExternalAddressInput,\n type RegisterExternalAddressMode,\n type RegisterExternalAddressOutput,\n} from \"@api/model/RegisterExternalAddress\";\nexport {\n type RenameContactInput,\n type RenameContactOutput,\n} from \"@api/model/RenameContact\";\n"],
5
+ "mappings": "AAmBA,OAAS,0BAAAA,MAA8B,8BACvC,OACE,iCAAAC,EAMA,qBAAAC,EACA,uBAAAC,EACA,oBAAAC,EACA,sCAAAC,MACK",
6
6
  "names": ["ContactsManagerBuilder", "CONTACTS_VERSION_REQUIREMENTS", "ETHEREUM_APP_NAME", "isContactsSupported", "isVersionAtLeast", "resolveContactsVersionRequirements"]
7
7
  }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=RegisterExternalAddress.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=RenameContact.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -1,2 +1,2 @@
1
- import{makeContainer as a}from"./di";class i{_container;constructor({dmk:t,sessionId:e,appName:n}){this._container=a({dmk:t,sessionId:e,appName:n})}get container(){return this._container}}export{i as DefaultContactsManager};
1
+ import{makeContainer as a}from"./di";import{useCaseTypes as t}from"./use-cases/di/useCaseTypes";class m{_container;constructor({dmk:e,sessionId:r,appName:n}){this._container=a({dmk:e,sessionId:r,appName:n})}registerExternalAddress(e){return this._container.get(t.RegisterExternalAddressUseCase).execute(e)}renameContact(e){return this._container.get(t.RenameContactUseCase).execute(e)}get container(){return this._container}}export{m as DefaultContactsManager};
2
2
  //# sourceMappingURL=DefaultContactsManager.js.map