@ledgerhq/device-contacts-kit 0.0.0-develop-20261105000842 → 0.0.0-develop-20261108000919

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 (214) hide show
  1. package/lib/cjs/package.json +1 -1
  2. package/lib/esm/package.json +1 -1
  3. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  4. package/package.json +6 -6
  5. package/lib/cjs/api/ContactsManagerBuilder.test.js +0 -2
  6. package/lib/cjs/api/ContactsManagerBuilder.test.js.map +0 -7
  7. package/lib/cjs/api/model/ContactsVersionRequirements.test.js +0 -2
  8. package/lib/cjs/api/model/ContactsVersionRequirements.test.js.map +0 -7
  9. package/lib/cjs/internal/DefaultContactsManager.test.js +0 -2
  10. package/lib/cjs/internal/DefaultContactsManager.test.js.map +0 -7
  11. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js +0 -2
  12. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js.map +0 -7
  13. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.test.js +0 -2
  14. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.test.js.map +0 -7
  15. package/lib/cjs/internal/app-binder/command/ProvideContactCommand.test.js +0 -2
  16. package/lib/cjs/internal/app-binder/command/ProvideContactCommand.test.js.map +0 -7
  17. package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.test.js +0 -2
  18. package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.test.js.map +0 -7
  19. package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js +0 -2
  20. package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js.map +0 -7
  21. package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js +0 -2
  22. package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js.map +0 -7
  23. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +0 -2
  24. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +0 -7
  25. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +0 -2
  26. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +0 -7
  27. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +0 -2
  28. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +0 -7
  29. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +0 -2
  30. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +0 -7
  31. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js +0 -2
  32. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js.map +0 -7
  33. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js +0 -2
  34. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js.map +0 -7
  35. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +0 -2
  36. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +0 -7
  37. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +0 -2
  38. package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +0 -7
  39. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +0 -2
  40. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +0 -7
  41. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +0 -2
  42. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +0 -7
  43. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +0 -2
  44. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +0 -7
  45. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js +0 -2
  46. package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js.map +0 -7
  47. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +0 -2
  48. package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +0 -7
  49. package/lib/cjs/internal/app-binder/model/contactsValidation.test.js +0 -2
  50. package/lib/cjs/internal/app-binder/model/contactsValidation.test.js.map +0 -7
  51. package/lib/cjs/internal/app-binder/services/contactsTlvSerializer.test.js +0 -2
  52. package/lib/cjs/internal/app-binder/services/contactsTlvSerializer.test.js.map +0 -7
  53. package/lib/cjs/internal/app-binder/services/provideContact.test.js +0 -2
  54. package/lib/cjs/internal/app-binder/services/provideContact.test.js.map +0 -7
  55. package/lib/cjs/internal/app-binder/services/sendFramedContactsPayload.test.js +0 -2
  56. package/lib/cjs/internal/app-binder/services/sendFramedContactsPayload.test.js.map +0 -7
  57. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +0 -2
  58. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +0 -7
  59. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +0 -2
  60. package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +0 -7
  61. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js +0 -2
  62. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +0 -7
  63. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js +0 -2
  64. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js.map +0 -7
  65. package/lib/cjs/internal/di.test.js +0 -2
  66. package/lib/cjs/internal/di.test.js.map +0 -7
  67. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +0 -2
  68. package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +0 -7
  69. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js +0 -2
  70. package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +0 -7
  71. package/lib/cjs/internal/use-cases/RegisterExternalAddressUseCase.test.js +0 -2
  72. package/lib/cjs/internal/use-cases/RegisterExternalAddressUseCase.test.js.map +0 -7
  73. package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js +0 -2
  74. package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js.map +0 -7
  75. package/lib/esm/api/ContactsManagerBuilder.test.js +0 -2
  76. package/lib/esm/api/ContactsManagerBuilder.test.js.map +0 -7
  77. package/lib/esm/api/model/ContactsVersionRequirements.test.js +0 -2
  78. package/lib/esm/api/model/ContactsVersionRequirements.test.js.map +0 -7
  79. package/lib/esm/internal/DefaultContactsManager.test.js +0 -2
  80. package/lib/esm/internal/DefaultContactsManager.test.js.map +0 -7
  81. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js +0 -2
  82. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js.map +0 -7
  83. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js +0 -2
  84. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js.map +0 -7
  85. package/lib/esm/internal/app-binder/command/ProvideContactCommand.test.js +0 -2
  86. package/lib/esm/internal/app-binder/command/ProvideContactCommand.test.js.map +0 -7
  87. package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.test.js +0 -2
  88. package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.test.js.map +0 -7
  89. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js +0 -2
  90. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js.map +0 -7
  91. package/lib/esm/internal/app-binder/contactsVersionGuards.test.js +0 -2
  92. package/lib/esm/internal/app-binder/contactsVersionGuards.test.js.map +0 -7
  93. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +0 -2
  94. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +0 -7
  95. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +0 -2
  96. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +0 -7
  97. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +0 -2
  98. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +0 -7
  99. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +0 -2
  100. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +0 -7
  101. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js +0 -2
  102. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js.map +0 -7
  103. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js +0 -2
  104. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js.map +0 -7
  105. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +0 -2
  106. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +0 -7
  107. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +0 -2
  108. package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +0 -7
  109. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +0 -2
  110. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +0 -7
  111. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +0 -2
  112. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +0 -7
  113. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +0 -2
  114. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +0 -7
  115. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js +0 -2
  116. package/lib/esm/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js.map +0 -7
  117. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +0 -2
  118. package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +0 -7
  119. package/lib/esm/internal/app-binder/model/contactsValidation.test.js +0 -2
  120. package/lib/esm/internal/app-binder/model/contactsValidation.test.js.map +0 -7
  121. package/lib/esm/internal/app-binder/services/contactsTlvSerializer.test.js +0 -2
  122. package/lib/esm/internal/app-binder/services/contactsTlvSerializer.test.js.map +0 -7
  123. package/lib/esm/internal/app-binder/services/provideContact.test.js +0 -2
  124. package/lib/esm/internal/app-binder/services/provideContact.test.js.map +0 -7
  125. package/lib/esm/internal/app-binder/services/sendFramedContactsPayload.test.js +0 -2
  126. package/lib/esm/internal/app-binder/services/sendFramedContactsPayload.test.js.map +0 -7
  127. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +0 -2
  128. package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +0 -7
  129. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +0 -2
  130. package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +0 -7
  131. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js +0 -2
  132. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +0 -7
  133. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js +0 -2
  134. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js.map +0 -7
  135. package/lib/esm/internal/di.test.js +0 -2
  136. package/lib/esm/internal/di.test.js.map +0 -7
  137. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +0 -2
  138. package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +0 -7
  139. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js +0 -2
  140. package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +0 -7
  141. package/lib/esm/internal/use-cases/RegisterExternalAddressUseCase.test.js +0 -2
  142. package/lib/esm/internal/use-cases/RegisterExternalAddressUseCase.test.js.map +0 -7
  143. package/lib/esm/internal/use-cases/RenameContactUseCase.test.js +0 -2
  144. package/lib/esm/internal/use-cases/RenameContactUseCase.test.js.map +0 -7
  145. package/lib/types/api/ContactsManagerBuilder.test.d.ts +0 -2
  146. package/lib/types/api/ContactsManagerBuilder.test.d.ts.map +0 -1
  147. package/lib/types/api/model/ContactsVersionRequirements.test.d.ts +0 -2
  148. package/lib/types/api/model/ContactsVersionRequirements.test.d.ts.map +0 -1
  149. package/lib/types/internal/DefaultContactsManager.test.d.ts +0 -2
  150. package/lib/types/internal/DefaultContactsManager.test.d.ts.map +0 -1
  151. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts +0 -2
  152. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts.map +0 -1
  153. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts +0 -2
  154. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts.map +0 -1
  155. package/lib/types/internal/app-binder/command/ProvideContactCommand.test.d.ts +0 -2
  156. package/lib/types/internal/app-binder/command/ProvideContactCommand.test.d.ts.map +0 -1
  157. package/lib/types/internal/app-binder/command/RegisterIdentityCommand.test.d.ts +0 -2
  158. package/lib/types/internal/app-binder/command/RegisterIdentityCommand.test.d.ts.map +0 -1
  159. package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts +0 -2
  160. package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts.map +0 -1
  161. package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts +0 -2
  162. package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts.map +0 -1
  163. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts +0 -2
  164. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts.map +0 -1
  165. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts +0 -2
  166. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts.map +0 -1
  167. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts +0 -2
  168. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts.map +0 -1
  169. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts +0 -2
  170. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts.map +0 -1
  171. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.d.ts +0 -2
  172. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.d.ts.map +0 -1
  173. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.d.ts +0 -2
  174. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.d.ts.map +0 -1
  175. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts +0 -2
  176. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts.map +0 -1
  177. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts +0 -2
  178. package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts.map +0 -1
  179. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts +0 -4
  180. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +0 -1
  181. package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts +0 -12
  182. package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts.map +0 -1
  183. package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts +0 -2
  184. package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +0 -1
  185. package/lib/types/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.d.ts +0 -17
  186. package/lib/types/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.d.ts.map +0 -1
  187. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts +0 -15
  188. package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts.map +0 -1
  189. package/lib/types/internal/app-binder/model/contactsValidation.test.d.ts +0 -2
  190. package/lib/types/internal/app-binder/model/contactsValidation.test.d.ts.map +0 -1
  191. package/lib/types/internal/app-binder/services/contactsTlvSerializer.test.d.ts +0 -2
  192. package/lib/types/internal/app-binder/services/contactsTlvSerializer.test.d.ts.map +0 -1
  193. package/lib/types/internal/app-binder/services/provideContact.test.d.ts +0 -2
  194. package/lib/types/internal/app-binder/services/provideContact.test.d.ts.map +0 -1
  195. package/lib/types/internal/app-binder/services/sendFramedContactsPayload.test.d.ts +0 -2
  196. package/lib/types/internal/app-binder/services/sendFramedContactsPayload.test.d.ts.map +0 -1
  197. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts +0 -2
  198. package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts.map +0 -1
  199. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts +0 -2
  200. package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts.map +0 -1
  201. package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.test.d.ts +0 -2
  202. package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.test.d.ts.map +0 -1
  203. package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts +0 -2
  204. package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts.map +0 -1
  205. package/lib/types/internal/di.test.d.ts +0 -2
  206. package/lib/types/internal/di.test.d.ts.map +0 -1
  207. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts +0 -2
  208. package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts.map +0 -1
  209. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts +0 -2
  210. package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts.map +0 -1
  211. package/lib/types/internal/use-cases/RegisterExternalAddressUseCase.test.d.ts +0 -2
  212. package/lib/types/internal/use-cases/RegisterExternalAddressUseCase.test.d.ts.map +0 -1
  213. package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts +0 -2
  214. package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts.map +0 -1
package/package.json CHANGED
@@ -5,17 +5,17 @@
5
5
  "reflect-metadata": "0.2.2",
6
6
  "semver": "7.7.2",
7
7
  "xstate": "5.19.2",
8
- "@ledgerhq/signer-utils": "0.0.0-develop-20261105000842"
8
+ "@ledgerhq/signer-utils": "0.0.0-develop-20261108000919"
9
9
  },
10
10
  "devDependencies": {
11
11
  "@types/semver": "7.7.0",
12
12
  "rxjs": "7.8.2",
13
13
  "ts-node": "10.9.2",
14
- "@ledgerhq/ldmk-tool": "0.0.1",
14
+ "@ledgerhq/device-management-kit": "0.0.0-develop-20261108000919",
15
15
  "@ledgerhq/eslint-config-dsdk": "0.0.2",
16
- "@ledgerhq/prettier-config-dsdk": "0.0.2",
17
- "@ledgerhq/device-management-kit": "0.0.0-develop-20261105000842",
16
+ "@ledgerhq/ldmk-tool": "0.0.1",
18
17
  "@ledgerhq/tsconfig-dsdk": "1.0.1",
18
+ "@ledgerhq/prettier-config-dsdk": "0.0.2",
19
19
  "@ledgerhq/vitest-config-dmk": "0.0.0"
20
20
  },
21
21
  "exports": {
@@ -36,14 +36,14 @@
36
36
  "license": "Apache-2.0",
37
37
  "name": "@ledgerhq/device-contacts-kit",
38
38
  "peerDependencies": {
39
- "@ledgerhq/device-management-kit": "0.0.0-develop-20261105000842"
39
+ "@ledgerhq/device-management-kit": "0.0.0-develop-20261108000919"
40
40
  },
41
41
  "private": false,
42
42
  "repository": {
43
43
  "type": "git",
44
44
  "url": "https://github.com/LedgerHQ/device-sdk-ts.git"
45
45
  },
46
- "version": "0.0.0-develop-20261105000842",
46
+ "version": "0.0.0-develop-20261108000919",
47
47
  "scripts": {
48
48
  "build": "pnpm ldmk-tool build --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
49
49
  "dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
@@ -1,2 +0,0 @@
1
- "use strict";var e=require("./ContactsManagerBuilder"),n=require("../internal/DefaultContactsManager");describe("ContactsManagerBuilder",()=>{const t={dmk:{},sessionId:"session-id",appName:"Ethereum"};test("should be an instance of ContactsManagerBuilder",()=>{const a=new e.ContactsManagerBuilder(t);expect(a).toBeInstanceOf(e.ContactsManagerBuilder)}),test("should build a DefaultContactsManager",()=>{const s=new e.ContactsManagerBuilder(t).build();expect(s).toBeInstanceOf(n.DefaultContactsManager)})});
2
- //# sourceMappingURL=ContactsManagerBuilder.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/api/ContactsManagerBuilder.test.ts"],
4
- "sourcesContent": ["import { type DeviceManagementKit } from \"@ledgerhq/device-management-kit\";\n\nimport { ContactsManagerBuilder } from \"@api/ContactsManagerBuilder\";\nimport { DefaultContactsManager } from \"@internal/DefaultContactsManager\";\n\ndescribe(\"ContactsManagerBuilder\", () => {\n const dmk = {} as DeviceManagementKit;\n const defaultConstructorArgs = {\n dmk,\n sessionId: \"session-id\",\n appName: \"Ethereum\",\n };\n\n test(\"should be an instance of ContactsManagerBuilder\", () => {\n const builder = new ContactsManagerBuilder(defaultConstructorArgs);\n\n expect(builder).toBeInstanceOf(ContactsManagerBuilder);\n });\n\n test(\"should build a DefaultContactsManager\", () => {\n const builder = new ContactsManagerBuilder(defaultConstructorArgs);\n\n const contactsManager = builder.build();\n\n expect(contactsManager).toBeInstanceOf(DefaultContactsManager);\n });\n});\n"],
5
- "mappings": "aAEA,IAAAA,EAAuC,uCACvCC,EAAuC,4CAEvC,SAAS,yBAA0B,IAAM,CAEvC,MAAMC,EAAyB,CAC7B,IAFU,CAAC,EAGX,UAAW,aACX,QAAS,UACX,EAEA,KAAK,kDAAmD,IAAM,CAC5D,MAAMC,EAAU,IAAI,yBAAuBD,CAAsB,EAEjE,OAAOC,CAAO,EAAE,eAAe,wBAAsB,CACvD,CAAC,EAED,KAAK,wCAAyC,IAAM,CAGlD,MAAMC,EAFU,IAAI,yBAAuBF,CAAsB,EAEjC,MAAM,EAEtC,OAAOE,CAAe,EAAE,eAAe,wBAAsB,CAC/D,CAAC,CACH,CAAC",
6
- "names": ["import_ContactsManagerBuilder", "import_DefaultContactsManager", "defaultConstructorArgs", "builder", "contactsManager"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var t=require("@ledgerhq/device-management-kit"),e=require("./ContactsVersionRequirements");describe("ContactsVersionRequirements",()=>{describe("resolveContactsVersionRequirements",()=>{it("marks every device model, supported or not",()=>{for(const r of Object.values(t.DeviceModelId))expect(e.CONTACTS_VERSION_REQUIREMENTS[r]).toBeDefined()}),it("reports Nano S as unsupported",()=>{expect((0,e.resolveContactsVersionRequirements)(t.DeviceModelId.NANO_S)).toEqual({supported:!1})}),it("pins the minimum OS and app versions of every supported model",()=>{const r={[e.ETHEREUM_APP_NAME]:"1.23.0",[e.TRON_APP_NAME]:"0.8.0",[e.SOLANA_APP_NAME]:"10.0.0"};expect(e.CONTACTS_VERSION_REQUIREMENTS).toEqual({[t.DeviceModelId.NANO_S]:{supported:!1},[t.DeviceModelId.NANO_SP]:{supported:!0,minOsVersion:"1.7.0",minAppVersion:r,renameDerivationPathRequiredBelowOsVersion:"1.7.0-rc3"},[t.DeviceModelId.NANO_X]:{supported:!0,minOsVersion:"2.8.0",minAppVersion:r,renameDerivationPathRequiredBelowOsVersion:"2.8.0-rc3"},[t.DeviceModelId.STAX]:{supported:!0,minOsVersion:"1.11.0",minAppVersion:r,renameDerivationPathRequiredBelowOsVersion:"1.11.0-rc3"},[t.DeviceModelId.FLEX]:{supported:!0,minOsVersion:"1.7.0",minAppVersion:r,renameDerivationPathRequiredBelowOsVersion:"1.7.0-rc3"},[t.DeviceModelId.APEX]:{supported:!0,minOsVersion:"1.2.0",minAppVersion:r,renameDerivationPathRequiredBelowOsVersion:"1.2.0-rc3"}})})}),describe("isVersionAtLeast",()=>{it("compares versions as semver, inclusive of equality",()=>{expect((0,e.isVersionAtLeast)("1.2.0","1.2.0")).toBe(!0),expect((0,e.isVersionAtLeast)("1.3.0","1.2.0")).toBe(!0),expect((0,e.isVersionAtLeast)("1.1.9","1.2.0")).toBe(!1)}),it("coerces non-strict version strings",()=>{expect((0,e.isVersionAtLeast)("1.2","1.2.0")).toBe(!0)}),it("returns false when a version cannot be parsed",()=>{expect((0,e.isVersionAtLeast)("not-a-version","1.2.0")).toBe(!1),expect((0,e.isVersionAtLeast)("1.2.0","not-a-version")).toBe(!1)}),it("ignores prerelease and build tags when comparing to the minimum",()=>{expect((0,e.isVersionAtLeast)("1.7.0-rc2","1.7.0")).toBe(!0),expect((0,e.isVersionAtLeast)("1.23.0-dev","1.23.0")).toBe(!0)}),it("still fails a minimum strictly above the tagged version's core",()=>{expect((0,e.isVersionAtLeast)("1.6.9-rc5","1.7.0")).toBe(!1)})}),describe("isVersionBelow",()=>{it("orders release candidates of the same core (unlike isVersionAtLeast)",()=>{expect((0,e.isVersionBelow)("1.7.0-rc2","1.7.0-rc3")).toBe(!0),expect((0,e.isVersionBelow)("1.7.0-rc3","1.7.0-rc3")).toBe(!1),expect((0,e.isVersionBelow)("1.7.0-rc4","1.7.0-rc3")).toBe(!1)}),it("treats the final release as newer than any of its prereleases",()=>{expect((0,e.isVersionBelow)("1.7.0","1.7.0-rc3")).toBe(!1)}),it("compares the release core when it differs",()=>{expect((0,e.isVersionBelow)("1.6.9","1.7.0-rc3")).toBe(!0),expect((0,e.isVersionBelow)("1.8.0","1.7.0-rc3")).toBe(!1)}),it("does not coerce, so a non-strict version is unparseable and returns false",()=>{expect((0,e.isVersionBelow)("1.7","1.7.0-rc3")).toBe(!1),expect((0,e.isVersionBelow)("not-a-version","1.7.0-rc3")).toBe(!1),expect((0,e.isVersionBelow)("1.7.0-rc2","not-a-version")).toBe(!1)})}),describe("renameRequiresDerivationPath",()=>{it("requires the path below the model's cutoff (rc2) and not at/after it",()=>{expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.FLEX,"1.7.0-rc2")).toBe(!0),expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.FLEX,"1.7.0-rc3")).toBe(!1),expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.FLEX,"1.7.0")).toBe(!1),expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.FLEX,"1.8.0")).toBe(!1)}),it("applies the same rc2/rc3 split to the other supported models",()=>{expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.STAX,"1.11.0-rc2")).toBe(!0),expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.STAX,"1.11.0-rc3")).toBe(!1),expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.NANO_SP,"1.7.0-rc2")).toBe(!0)}),it("returns false for an unsupported model",()=>{expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.NANO_S,"1.7.0-rc2")).toBe(!1)}),it("returns false (no path) when the OS version is unparseable",()=>{expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.FLEX,"")).toBe(!1)})})});
2
- //# sourceMappingURL=ContactsVersionRequirements.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/api/model/ContactsVersionRequirements.test.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACTS_VERSION_REQUIREMENTS,\n ETHEREUM_APP_NAME,\n isVersionAtLeast,\n isVersionBelow,\n renameRequiresDerivationPath,\n resolveContactsVersionRequirements,\n SOLANA_APP_NAME,\n TRON_APP_NAME,\n} from \"./ContactsVersionRequirements\";\n\ndescribe(\"ContactsVersionRequirements\", () => {\n describe(\"resolveContactsVersionRequirements\", () => {\n it(\"marks every device model, supported or not\", () => {\n for (const modelId of Object.values(DeviceModelId)) {\n expect(CONTACTS_VERSION_REQUIREMENTS[modelId]).toBeDefined();\n }\n });\n\n it(\"reports Nano S as unsupported\", () => {\n expect(resolveContactsVersionRequirements(DeviceModelId.NANO_S)).toEqual({\n supported: false,\n });\n });\n\n // Pins the minimums themselves, not just their shape: each OS version is\n // the release whose changelog introduces the Address Book feature, so a\n // change here has to be a deliberate one, reviewed against that release.\n it(\"pins the minimum OS and app versions of every supported model\", () => {\n const appVersions = {\n [ETHEREUM_APP_NAME]: \"1.23.0\",\n [TRON_APP_NAME]: \"0.8.0\",\n [SOLANA_APP_NAME]: \"10.0.0\",\n };\n\n expect(CONTACTS_VERSION_REQUIREMENTS).toEqual({\n [DeviceModelId.NANO_S]: { supported: false },\n [DeviceModelId.NANO_SP]: {\n supported: true,\n minOsVersion: \"1.7.0\",\n minAppVersion: appVersions,\n renameDerivationPathRequiredBelowOsVersion: \"1.7.0-rc3\",\n },\n [DeviceModelId.NANO_X]: {\n supported: true,\n minOsVersion: \"2.8.0\",\n minAppVersion: appVersions,\n renameDerivationPathRequiredBelowOsVersion: \"2.8.0-rc3\",\n },\n [DeviceModelId.STAX]: {\n supported: true,\n minOsVersion: \"1.11.0\",\n minAppVersion: appVersions,\n renameDerivationPathRequiredBelowOsVersion: \"1.11.0-rc3\",\n },\n [DeviceModelId.FLEX]: {\n supported: true,\n minOsVersion: \"1.7.0\",\n minAppVersion: appVersions,\n renameDerivationPathRequiredBelowOsVersion: \"1.7.0-rc3\",\n },\n [DeviceModelId.APEX]: {\n supported: true,\n minOsVersion: \"1.2.0\",\n minAppVersion: appVersions,\n renameDerivationPathRequiredBelowOsVersion: \"1.2.0-rc3\",\n },\n });\n });\n });\n\n describe(\"isVersionAtLeast\", () => {\n it(\"compares versions as semver, inclusive of equality\", () => {\n expect(isVersionAtLeast(\"1.2.0\", \"1.2.0\")).toBe(true);\n expect(isVersionAtLeast(\"1.3.0\", \"1.2.0\")).toBe(true);\n expect(isVersionAtLeast(\"1.1.9\", \"1.2.0\")).toBe(false);\n });\n\n it(\"coerces non-strict version strings\", () => {\n expect(isVersionAtLeast(\"1.2\", \"1.2.0\")).toBe(true);\n });\n\n it(\"returns false when a version cannot be parsed\", () => {\n expect(isVersionAtLeast(\"not-a-version\", \"1.2.0\")).toBe(false);\n expect(isVersionAtLeast(\"1.2.0\", \"not-a-version\")).toBe(false);\n });\n\n it(\"ignores prerelease and build tags when comparing to the minimum\", () => {\n expect(isVersionAtLeast(\"1.7.0-rc2\", \"1.7.0\")).toBe(true);\n expect(isVersionAtLeast(\"1.23.0-dev\", \"1.23.0\")).toBe(true);\n });\n\n it(\"still fails a minimum strictly above the tagged version's core\", () => {\n expect(isVersionAtLeast(\"1.6.9-rc5\", \"1.7.0\")).toBe(false);\n });\n });\n\n describe(\"isVersionBelow\", () => {\n it(\"orders release candidates of the same core (unlike isVersionAtLeast)\", () => {\n // The whole reason this helper exists: rc2 must sort below rc3.\n expect(isVersionBelow(\"1.7.0-rc2\", \"1.7.0-rc3\")).toBe(true);\n expect(isVersionBelow(\"1.7.0-rc3\", \"1.7.0-rc3\")).toBe(false);\n expect(isVersionBelow(\"1.7.0-rc4\", \"1.7.0-rc3\")).toBe(false);\n });\n\n it(\"treats the final release as newer than any of its prereleases\", () => {\n expect(isVersionBelow(\"1.7.0\", \"1.7.0-rc3\")).toBe(false);\n });\n\n it(\"compares the release core when it differs\", () => {\n expect(isVersionBelow(\"1.6.9\", \"1.7.0-rc3\")).toBe(true);\n expect(isVersionBelow(\"1.8.0\", \"1.7.0-rc3\")).toBe(false);\n });\n\n it(\"does not coerce, so a non-strict version is unparseable and returns false\", () => {\n expect(isVersionBelow(\"1.7\", \"1.7.0-rc3\")).toBe(false);\n expect(isVersionBelow(\"not-a-version\", \"1.7.0-rc3\")).toBe(false);\n expect(isVersionBelow(\"1.7.0-rc2\", \"not-a-version\")).toBe(false);\n });\n });\n\n describe(\"renameRequiresDerivationPath\", () => {\n it(\"requires the path below the model's cutoff (rc2) and not at/after it\", () => {\n expect(\n renameRequiresDerivationPath(DeviceModelId.FLEX, \"1.7.0-rc2\"),\n ).toBe(true);\n expect(\n renameRequiresDerivationPath(DeviceModelId.FLEX, \"1.7.0-rc3\"),\n ).toBe(false);\n // GA and later never want the path.\n expect(renameRequiresDerivationPath(DeviceModelId.FLEX, \"1.7.0\")).toBe(\n false,\n );\n expect(renameRequiresDerivationPath(DeviceModelId.FLEX, \"1.8.0\")).toBe(\n false,\n );\n });\n\n it(\"applies the same rc2/rc3 split to the other supported models\", () => {\n expect(\n renameRequiresDerivationPath(DeviceModelId.STAX, \"1.11.0-rc2\"),\n ).toBe(true);\n expect(\n renameRequiresDerivationPath(DeviceModelId.STAX, \"1.11.0-rc3\"),\n ).toBe(false);\n expect(\n renameRequiresDerivationPath(DeviceModelId.NANO_SP, \"1.7.0-rc2\"),\n ).toBe(true);\n });\n\n it(\"returns false for an unsupported model\", () => {\n expect(\n renameRequiresDerivationPath(DeviceModelId.NANO_S, \"1.7.0-rc2\"),\n ).toBe(false);\n });\n\n it(\"returns false (no path) when the OS version is unparseable\", () => {\n expect(renameRequiresDerivationPath(DeviceModelId.FLEX, \"\")).toBe(false);\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_ContactsVersionRequirements", "modelId", "appVersions"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var s=require("./DefaultContactsManager");const c={contactName:"Alice",scope:"Eth main",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n},o={previousContactName:"Alice",newContactName:"Bob",groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)},r={contactName:"Alice",scope:"Eth main",previousIdentifier:new Uint8Array(20).fill(17),newIdentifier:new Uint8Array(20).fill(34),blockchainFamily:"ethereum",chainId:1n,groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)},d={contactName:"Alice",previousScope:"Eth main",newScope:"Eth cold",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n,groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)};describe("DefaultContactsManager",()=>{it("registerExternalAddress flows manager -> use-case -> binder -> dmk.executeDeviceAction",()=>{const e=vi.fn().mockReturnValue("DA_RETURN"),t={executeDeviceAction:e},i=new s.DefaultContactsManager({dmk:t,sessionId:"session-id",appName:"Ethereum"}).registerExternalAddress(c);expect(e).toHaveBeenCalledTimes(1);const n=e.mock.calls[0][0];expect(n.sessionId).toBe("session-id"),expect(n.deviceAction).toBeDefined(),expect(i).toBe("DA_RETURN")}),it("does not throw on invalid input \u2014 it dispatches the device action, which surfaces the error",()=>{const e=vi.fn().mockReturnValue("DA_RETURN"),t={executeDeviceAction:e},a=new s.DefaultContactsManager({dmk:t,sessionId:"session-id",appName:"Ethereum"});expect(()=>a.registerExternalAddress({...c,contactName:""})).not.toThrow(),expect(e).toHaveBeenCalledTimes(1)}),it("renameContact flows manager -> use-case -> binder -> dmk.executeDeviceAction",()=>{const e=vi.fn().mockReturnValue("DA_RETURN"),t={executeDeviceAction:e},i=new s.DefaultContactsManager({dmk:t,sessionId:"session-id",appName:"Ethereum"}).renameContact(o);expect(e).toHaveBeenCalledTimes(1);const n=e.mock.calls[0][0];expect(n.sessionId).toBe("session-id"),expect(n.deviceAction).toBeDefined(),expect(i).toBe("DA_RETURN")}),it("editExternalAddressIdentifier flows manager -> use-case -> binder -> dmk.executeDeviceAction",()=>{const e=vi.fn().mockReturnValue("DA_RETURN"),t={executeDeviceAction:e},i=new s.DefaultContactsManager({dmk:t,sessionId:"session-id",appName:"Ethereum"}).editExternalAddressIdentifier(r);expect(e).toHaveBeenCalledTimes(1);const n=e.mock.calls[0][0];expect(n.sessionId).toBe("session-id"),expect(n.deviceAction).toBeDefined(),expect(i).toBe("DA_RETURN")}),it("editExternalAddressScope flows manager -> use-case -> binder -> dmk.executeDeviceAction",()=>{const e=vi.fn().mockReturnValue("DA_RETURN"),t={executeDeviceAction:e},i=new s.DefaultContactsManager({dmk:t,sessionId:"session-id",appName:"Ethereum"}).editExternalAddressScope(d);expect(e).toHaveBeenCalledTimes(1);const n=e.mock.calls[0][0];expect(n.sessionId).toBe("session-id"),expect(n.deviceAction).toBeDefined(),expect(i).toBe("DA_RETURN")})});
2
- //# sourceMappingURL=DefaultContactsManager.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/internal/DefaultContactsManager.test.ts"],
4
- "sourcesContent": ["import { type DeviceManagementKit } from \"@ledgerhq/device-management-kit\";\n\nimport { type EditExternalAddressIdentifierInput } from \"@api/model/EditExternalAddressIdentifier\";\nimport { type EditExternalAddressScopeInput } from \"@api/model/EditExternalAddressScope\";\nimport { type RegisterExternalAddressInput } from \"@api/model/RegisterExternalAddress\";\nimport { type RenameContactInput } from \"@api/model/RenameContact\";\n\nimport { DefaultContactsManager } from \"./DefaultContactsManager\";\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\nconst VALID_RENAME_INPUT: RenameContactInput = {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n};\n\nconst VALID_EDIT_INPUT: EditExternalAddressIdentifierInput = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n previousIdentifier: new Uint8Array(20).fill(0x11),\n newIdentifier: new Uint8Array(20).fill(0x22),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\nconst VALID_EDIT_SCOPE_INPUT: EditExternalAddressScopeInput = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n newScope: \"Eth cold\",\n identifier: new Uint8Array(20).fill(0x11),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\ndescribe(\"DefaultContactsManager\", () => {\n it(\"registerExternalAddress flows manager -> use-case -> binder -> dmk.executeDeviceAction\", () => {\n const executeDeviceAction = vi.fn().mockReturnValue(\"DA_RETURN\");\n const dmk = { executeDeviceAction } as unknown as DeviceManagementKit;\n\n const manager = new DefaultContactsManager({\n dmk,\n sessionId: \"session-id\",\n appName: \"Ethereum\",\n });\n\n const result = manager.registerExternalAddress(VALID_INPUT);\n\n expect(executeDeviceAction).toHaveBeenCalledTimes(1);\n const call = executeDeviceAction.mock.calls[0]![0] as {\n sessionId: string;\n deviceAction: unknown;\n };\n expect(call.sessionId).toBe(\"session-id\");\n expect(call.deviceAction).toBeDefined();\n expect(result).toBe(\"DA_RETURN\");\n });\n\n it(\"does not throw on invalid input \u2014 it dispatches the device action, which surfaces the error\", () => {\n // The public API returns a device action; invalid caller input must reach\n // the observable as a typed error state rather than throwing synchronously.\n const executeDeviceAction = vi.fn().mockReturnValue(\"DA_RETURN\");\n const dmk = { executeDeviceAction } as unknown as DeviceManagementKit;\n\n const manager = new DefaultContactsManager({\n dmk,\n sessionId: \"session-id\",\n appName: \"Ethereum\",\n });\n\n expect(() =>\n manager.registerExternalAddress({\n ...VALID_INPUT,\n contactName: \"\",\n }),\n ).not.toThrow();\n expect(executeDeviceAction).toHaveBeenCalledTimes(1);\n });\n\n it(\"renameContact flows manager -> use-case -> binder -> dmk.executeDeviceAction\", () => {\n const executeDeviceAction = vi.fn().mockReturnValue(\"DA_RETURN\");\n const dmk = { executeDeviceAction } as unknown as DeviceManagementKit;\n\n const manager = new DefaultContactsManager({\n dmk,\n sessionId: \"session-id\",\n appName: \"Ethereum\",\n });\n\n const result = manager.renameContact(VALID_RENAME_INPUT);\n\n expect(executeDeviceAction).toHaveBeenCalledTimes(1);\n const call = executeDeviceAction.mock.calls[0]![0] as {\n sessionId: string;\n deviceAction: unknown;\n };\n expect(call.sessionId).toBe(\"session-id\");\n expect(call.deviceAction).toBeDefined();\n expect(result).toBe(\"DA_RETURN\");\n });\n\n it(\"editExternalAddressIdentifier flows manager -> use-case -> binder -> dmk.executeDeviceAction\", () => {\n const executeDeviceAction = vi.fn().mockReturnValue(\"DA_RETURN\");\n const dmk = { executeDeviceAction } as unknown as DeviceManagementKit;\n\n const manager = new DefaultContactsManager({\n dmk,\n sessionId: \"session-id\",\n appName: \"Ethereum\",\n });\n\n const result = manager.editExternalAddressIdentifier(VALID_EDIT_INPUT);\n\n expect(executeDeviceAction).toHaveBeenCalledTimes(1);\n const call = executeDeviceAction.mock.calls[0]![0] as {\n sessionId: string;\n deviceAction: unknown;\n };\n expect(call.sessionId).toBe(\"session-id\");\n expect(call.deviceAction).toBeDefined();\n expect(result).toBe(\"DA_RETURN\");\n });\n\n it(\"editExternalAddressScope flows manager -> use-case -> binder -> dmk.executeDeviceAction\", () => {\n const executeDeviceAction = vi.fn().mockReturnValue(\"DA_RETURN\");\n const dmk = { executeDeviceAction } as unknown as DeviceManagementKit;\n\n const manager = new DefaultContactsManager({\n dmk,\n sessionId: \"session-id\",\n appName: \"Ethereum\",\n });\n\n const result = manager.editExternalAddressScope(VALID_EDIT_SCOPE_INPUT);\n\n expect(executeDeviceAction).toHaveBeenCalledTimes(1);\n const call = executeDeviceAction.mock.calls[0]![0] as {\n sessionId: string;\n deviceAction: unknown;\n };\n expect(call.sessionId).toBe(\"session-id\");\n expect(call.deviceAction).toBeDefined();\n expect(result).toBe(\"DA_RETURN\");\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_DefaultContactsManager", "VALID_INPUT", "VALID_RENAME_INPUT", "VALID_EDIT_INPUT", "VALID_EDIT_SCOPE_INPUT", "executeDeviceAction", "dmk", "result", "call", "manager"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var a=require("@ledgerhq/device-management-kit"),n=require("../../app-binder/model/contactsErrors"),o=require("./EditExternalAddressIdentifierCommand");function d(e){const t=new Uint8Array(e.length/2);for(let r=0;r<e.length;r+=2)t[r/2]=parseInt(e.slice(r,r+2),16);return t}const m=d("88".repeat(32)),c="31"+"88".repeat(32);function s(e){return{data:Buffer.from(d(e)),statusCode:Buffer.from([144,0])}}describe("EditExternalAddressIdentifierCommand",()=>{describe("getApdu",()=>{it("wraps the framed chunk under B0 10 03 with P2=0x00 for the first/only chunk",()=>{const e=Uint8Array.from([0,3,170,187,204]),t=new o.EditExternalAddressIdentifierCommand({data:e,p2:0}).getApdu();expect(t.getRawApdu()).toStrictEqual(Uint8Array.from([176,16,3,0,5,0,3,170,187,204]))}),it("uses P2=0x80 for continuation chunks",()=>{const e=Uint8Array.from([170,187]),t=new o.EditExternalAddressIdentifierCommand({data:e,p2:128}).getApdu();expect(t.getRawApdu()).toStrictEqual(Uint8Array.from([176,16,3,128,2,170,187]))})}),describe("parseResponse",()=>{it("returns an empty payload for an intermediate chunk (SW=0x9000, no data)",()=>{const e=new o.EditExternalAddressIdentifierCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([144,0])});expect(e).toStrictEqual({status:a.CommandResultStatus.Success,data:{}})}),it("extracts the rotated hmac_rest from the final-chunk response",()=>{const t=new o.EditExternalAddressIdentifierCommand({data:new Uint8Array,p2:0}).parseResponse(s(c));expect(t).toStrictEqual({status:a.CommandResultStatus.Success,data:{hmacRest:m}})}),it("returns InvalidStatusWordError when struct_type is wrong",()=>{const e="ee"+c.slice(2),r=new o.EditExternalAddressIdentifierCommand({data:new Uint8Array,p2:0}).parseResponse(s(e));expect(r.status).toBe(a.CommandResultStatus.Error)}),it("returns InvalidStatusWordError when hmac_rest is truncated",()=>{const e="31"+"88".repeat(16),r=new o.EditExternalAddressIdentifierCommand({data:new Uint8Array,p2:0}).parseResponse(s(e));expect(r.status).toBe(a.CommandResultStatus.Error)}),it("maps a known SW (0x6985) to a ContactsCommandError",()=>{const t=new o.EditExternalAddressIdentifierCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([105,133])});expect(t.status).toBe(a.CommandResultStatus.Error),t.status===a.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(n.ContactsCommandError),expect(t.error.errorCode).toBe("6985"))}),it("maps SW=0x6982 to a seed-mismatch ContactsCommandError",()=>{const t=new o.EditExternalAddressIdentifierCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([105,130])});expect(t.status).toBe(a.CommandResultStatus.Error),t.status===a.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(n.ContactsCommandError),expect(t.error.errorCode).toBe(n.CONTACT_SEED_MISMATCH_ERROR_CODE))})})});
2
- //# sourceMappingURL=EditExternalAddressIdentifierCommand.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.ts"],
4
- "sourcesContent": ["// Thin chunk-framer: wraps a pre-framed chunk under B0 10 03 <P2> and parses\n// the 33-byte edit response (struct_type 0x31 + hmac_rest) on the final chunk.\n// TLV byte-parity is asserted in SendEditExternalAddressIdentifierTask.test.ts.\nimport {\n type ApduResponse,\n CommandResultStatus,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n ContactsCommandError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { EditExternalAddressIdentifierCommand } from \"./EditExternalAddressIdentifierCommand\";\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// Device response: struct_type(0x31) + rotated hmac_rest(32).\nconst HMAC_REST = hexToBytes(\"88\".repeat(32));\nconst RESPONSE_HEX = \"31\" + \"88\".repeat(32);\n\nfunction makeResponse(hex: string): ApduResponse {\n return {\n data: Buffer.from(hexToBytes(hex)),\n statusCode: Buffer.from([0x90, 0x00]),\n };\n}\n\ndescribe(\"EditExternalAddressIdentifierCommand\", () => {\n describe(\"getApdu\", () => {\n it(\"wraps the framed chunk under B0 10 03 with P2=0x00 for the first/only chunk\", () => {\n const data = Uint8Array.from([0x00, 0x03, 0xaa, 0xbb, 0xcc]);\n\n const apdu = new EditExternalAddressIdentifierCommand({\n data,\n p2: 0x00,\n }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([\n 0xb0, 0x10, 0x03, 0x00, 0x05, 0x00, 0x03, 0xaa, 0xbb, 0xcc,\n ]),\n );\n });\n\n it(\"uses P2=0x80 for continuation chunks\", () => {\n const data = Uint8Array.from([0xaa, 0xbb]);\n\n const apdu = new EditExternalAddressIdentifierCommand({\n data,\n p2: 0x80,\n }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([0xb0, 0x10, 0x03, 0x80, 0x02, 0xaa, 0xbb]),\n );\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"returns an empty payload for an intermediate chunk (SW=0x9000, no data)\", () => {\n const result = new EditExternalAddressIdentifierCommand({\n data: new Uint8Array(),\n p2: 0x00,\n }).parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x90, 0x00]),\n });\n\n expect(result).toStrictEqual({\n status: CommandResultStatus.Success,\n data: {},\n });\n });\n\n it(\"extracts the rotated hmac_rest from the final-chunk response\", () => {\n const command = new EditExternalAddressIdentifierCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse(makeResponse(RESPONSE_HEX));\n\n expect(result).toStrictEqual({\n status: CommandResultStatus.Success,\n data: { hmacRest: HMAC_REST },\n });\n });\n\n it(\"returns InvalidStatusWordError when struct_type is wrong\", () => {\n const wrongType = \"ee\" + RESPONSE_HEX.slice(2); // replace 0x31 with 0xee\n const command = new EditExternalAddressIdentifierCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse(makeResponse(wrongType));\n\n expect(result.status).toBe(CommandResultStatus.Error);\n });\n\n it(\"returns InvalidStatusWordError when hmac_rest is truncated\", () => {\n const truncated = \"31\" + \"88\".repeat(16); // only 16 of 32 bytes\n const command = new EditExternalAddressIdentifierCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse(makeResponse(truncated));\n\n expect(result.status).toBe(CommandResultStatus.Error);\n });\n\n it(\"maps a known SW (0x6985) to a ContactsCommandError\", () => {\n const command = new EditExternalAddressIdentifierCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x69, 0x85]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(ContactsCommandError);\n expect((result.error as ContactsCommandError).errorCode).toBe(\"6985\");\n }\n });\n\n it(\"maps SW=0x6982 to a seed-mismatch ContactsCommandError\", () => {\n // The device returns 0x6982 when the seed-bound HMAC / group-handle\n // verification fails \u2014 i.e. the entry was registered with another seed.\n const command = new EditExternalAddressIdentifierCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x69, 0x82]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(ContactsCommandError);\n expect((result.error as ContactsCommandError).errorCode).toBe(\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n );\n }\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_contactsErrors", "import_EditExternalAddressIdentifierCommand", "hexToBytes", "hex", "out", "i", "HMAC_REST", "RESPONSE_HEX", "makeResponse", "data", "apdu", "result", "wrongType", "truncated"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var a=require("@ledgerhq/device-management-kit"),s=require("../../app-binder/model/contactsErrors"),o=require("./EditExternalAddressScopeCommand");function d(e){const t=new Uint8Array(e.length/2);for(let r=0;r<e.length;r+=2)t[r/2]=parseInt(e.slice(r,r+2),16);return t}const m=d("88".repeat(32)),c="32"+"88".repeat(32);function n(e){return{data:Buffer.from(d(e)),statusCode:Buffer.from([144,0])}}describe("EditExternalAddressScopeCommand",()=>{describe("getApdu",()=>{it("wraps the framed chunk under B0 10 04 with P2=0x00 for the first/only chunk",()=>{const e=Uint8Array.from([0,3,170,187,204]),t=new o.EditExternalAddressScopeCommand({data:e,p2:0}).getApdu();expect(t.getRawApdu()).toStrictEqual(Uint8Array.from([176,16,4,0,5,0,3,170,187,204]))}),it("uses P2=0x80 for continuation chunks",()=>{const e=Uint8Array.from([170,187]),t=new o.EditExternalAddressScopeCommand({data:e,p2:128}).getApdu();expect(t.getRawApdu()).toStrictEqual(Uint8Array.from([176,16,4,128,2,170,187]))})}),describe("parseResponse",()=>{it("returns an empty payload for an intermediate chunk (SW=0x9000, no data)",()=>{const e=new o.EditExternalAddressScopeCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([144,0])});expect(e).toStrictEqual({status:a.CommandResultStatus.Success,data:{}})}),it("extracts the rotated hmac_rest from the final-chunk response",()=>{const t=new o.EditExternalAddressScopeCommand({data:new Uint8Array,p2:0}).parseResponse(n(c));expect(t).toStrictEqual({status:a.CommandResultStatus.Success,data:{hmacRest:m}})}),it("returns InvalidStatusWordError when struct_type is wrong",()=>{const e="ee"+c.slice(2),r=new o.EditExternalAddressScopeCommand({data:new Uint8Array,p2:0}).parseResponse(n(e));expect(r.status).toBe(a.CommandResultStatus.Error)}),it("returns InvalidStatusWordError when hmac_rest is truncated",()=>{const e="32"+"88".repeat(16),r=new o.EditExternalAddressScopeCommand({data:new Uint8Array,p2:0}).parseResponse(n(e));expect(r.status).toBe(a.CommandResultStatus.Error)}),it("maps a known SW (0x6985) to a ContactsCommandError",()=>{const t=new o.EditExternalAddressScopeCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([105,133])});expect(t.status).toBe(a.CommandResultStatus.Error),t.status===a.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(s.ContactsCommandError),expect(t.error.errorCode).toBe("6985"))}),it("maps SW=0x6982 to a seed-mismatch ContactsCommandError",()=>{const t=new o.EditExternalAddressScopeCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([105,130])});expect(t.status).toBe(a.CommandResultStatus.Error),t.status===a.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(s.ContactsCommandError),expect(t.error.errorCode).toBe(s.CONTACT_SEED_MISMATCH_ERROR_CODE))})})});
2
- //# sourceMappingURL=EditExternalAddressScopeCommand.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/app-binder/command/EditExternalAddressScopeCommand.test.ts"],
4
- "sourcesContent": ["// Thin chunk-framer: wraps a pre-framed chunk under B0 10 04 <P2> and parses\n// the 33-byte edit response (struct_type 0x32 + hmac_rest) on the final chunk.\n// TLV byte-parity is asserted in SendEditExternalAddressScopeTask.test.ts.\nimport {\n type ApduResponse,\n CommandResultStatus,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n ContactsCommandError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { EditExternalAddressScopeCommand } from \"./EditExternalAddressScopeCommand\";\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// Device response: struct_type(0x32) + rotated hmac_rest(32).\nconst HMAC_REST = hexToBytes(\"88\".repeat(32));\nconst RESPONSE_HEX = \"32\" + \"88\".repeat(32);\n\nfunction makeResponse(hex: string): ApduResponse {\n return {\n data: Buffer.from(hexToBytes(hex)),\n statusCode: Buffer.from([0x90, 0x00]),\n };\n}\n\ndescribe(\"EditExternalAddressScopeCommand\", () => {\n describe(\"getApdu\", () => {\n it(\"wraps the framed chunk under B0 10 04 with P2=0x00 for the first/only chunk\", () => {\n const data = Uint8Array.from([0x00, 0x03, 0xaa, 0xbb, 0xcc]);\n\n const apdu = new EditExternalAddressScopeCommand({\n data,\n p2: 0x00,\n }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([\n 0xb0, 0x10, 0x04, 0x00, 0x05, 0x00, 0x03, 0xaa, 0xbb, 0xcc,\n ]),\n );\n });\n\n it(\"uses P2=0x80 for continuation chunks\", () => {\n const data = Uint8Array.from([0xaa, 0xbb]);\n\n const apdu = new EditExternalAddressScopeCommand({\n data,\n p2: 0x80,\n }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([0xb0, 0x10, 0x04, 0x80, 0x02, 0xaa, 0xbb]),\n );\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"returns an empty payload for an intermediate chunk (SW=0x9000, no data)\", () => {\n const result = new EditExternalAddressScopeCommand({\n data: new Uint8Array(),\n p2: 0x00,\n }).parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x90, 0x00]),\n });\n\n expect(result).toStrictEqual({\n status: CommandResultStatus.Success,\n data: {},\n });\n });\n\n it(\"extracts the rotated hmac_rest from the final-chunk response\", () => {\n const command = new EditExternalAddressScopeCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse(makeResponse(RESPONSE_HEX));\n\n expect(result).toStrictEqual({\n status: CommandResultStatus.Success,\n data: { hmacRest: HMAC_REST },\n });\n });\n\n it(\"returns InvalidStatusWordError when struct_type is wrong\", () => {\n const wrongType = \"ee\" + RESPONSE_HEX.slice(2); // replace 0x32 with 0xee\n const command = new EditExternalAddressScopeCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse(makeResponse(wrongType));\n\n expect(result.status).toBe(CommandResultStatus.Error);\n });\n\n it(\"returns InvalidStatusWordError when hmac_rest is truncated\", () => {\n const truncated = \"32\" + \"88\".repeat(16); // only 16 of 32 bytes\n const command = new EditExternalAddressScopeCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse(makeResponse(truncated));\n\n expect(result.status).toBe(CommandResultStatus.Error);\n });\n\n it(\"maps a known SW (0x6985) to a ContactsCommandError\", () => {\n const command = new EditExternalAddressScopeCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x69, 0x85]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(ContactsCommandError);\n expect((result.error as ContactsCommandError).errorCode).toBe(\"6985\");\n }\n });\n\n it(\"maps SW=0x6982 to a seed-mismatch ContactsCommandError\", () => {\n // The device returns 0x6982 when the seed-bound HMAC / group-handle\n // verification fails \u2014 i.e. the entry was registered with another seed.\n const command = new EditExternalAddressScopeCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x69, 0x82]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(ContactsCommandError);\n expect((result.error as ContactsCommandError).errorCode).toBe(\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n );\n }\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_contactsErrors", "import_EditExternalAddressScopeCommand", "hexToBytes", "hex", "out", "i", "HMAC_REST", "RESPONSE_HEX", "makeResponse", "data", "apdu", "result", "wrongType", "truncated"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var r=require("@ledgerhq/device-management-kit"),a=require("../../app-binder/model/contactsErrors"),e=require("./ProvideContactCommand");describe("ProvideContactCommand",()=>{describe("getApdu",()=>{it("wraps the framed chunk under B0 10 20 with P2=0x00 for the first/only chunk",()=>{const t=Uint8Array.from([0,3,170,187,204]),o=new e.ProvideContactCommand({data:t,p2:0}).getApdu();expect(o.getRawApdu()).toStrictEqual(Uint8Array.from([176,16,32,0,5,0,3,170,187,204]))}),it("uses P2=0x80 for continuation chunks",()=>{const t=Uint8Array.from([170,187]),o=new e.ProvideContactCommand({data:t,p2:128}).getApdu();expect(o.getRawApdu()).toStrictEqual(Uint8Array.from([176,16,32,128,2,170,187]))})}),describe("parseResponse",()=>{it("succeeds with no data on SW=0x9000",()=>{const t=new e.ProvideContactCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([144,0])});expect(t).toStrictEqual({status:r.CommandResultStatus.Success,data:void 0})}),it("maps SW=0x6982 to a seed-mismatch ContactsCommandError",()=>{const t=new e.ProvideContactCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([105,130])});expect(t.status).toBe(r.CommandResultStatus.Error),t.status===r.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(a.ContactsCommandError),expect(t.error.errorCode).toBe(a.CONTACT_SEED_MISMATCH_ERROR_CODE))}),it("maps SW=0x6a80 to a ContactsCommandError",()=>{const t=new e.ProvideContactCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([106,128])});expect(t.status).toBe(r.CommandResultStatus.Error),t.status===r.CommandResultStatus.Error&&expect(t.error.errorCode).toBe("6a80")})})});
2
- //# sourceMappingURL=ProvideContactCommand.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/app-binder/command/ProvideContactCommand.test.ts"],
4
- "sourcesContent": ["import { CommandResultStatus } from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n ContactsCommandError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { ProvideContactCommand } from \"./ProvideContactCommand\";\n\ndescribe(\"ProvideContactCommand\", () => {\n describe(\"getApdu\", () => {\n it(\"wraps the framed chunk under B0 10 20 with P2=0x00 for the first/only chunk\", () => {\n const data = Uint8Array.from([0x00, 0x03, 0xaa, 0xbb, 0xcc]);\n\n const apdu = new ProvideContactCommand({ data, p2: 0x00 }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([\n 0xb0, 0x10, 0x20, 0x00, 0x05, 0x00, 0x03, 0xaa, 0xbb, 0xcc,\n ]),\n );\n });\n\n it(\"uses P2=0x80 for continuation chunks\", () => {\n const data = Uint8Array.from([0xaa, 0xbb]);\n\n const apdu = new ProvideContactCommand({ data, p2: 0x80 }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([0xb0, 0x10, 0x20, 0x80, 0x02, 0xaa, 0xbb]),\n );\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"succeeds with no data on SW=0x9000\", () => {\n const result = new ProvideContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n }).parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x90, 0x00]),\n });\n\n expect(result).toStrictEqual({\n status: CommandResultStatus.Success,\n data: undefined,\n });\n });\n\n it(\"maps SW=0x6982 to a seed-mismatch ContactsCommandError\", () => {\n const result = new ProvideContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n }).parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x69, 0x82]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(ContactsCommandError);\n expect((result.error as ContactsCommandError).errorCode).toBe(\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n );\n }\n });\n\n it(\"maps SW=0x6a80 to a ContactsCommandError\", () => {\n const result = new ProvideContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n }).parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x6a, 0x80]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect((result.error as ContactsCommandError).errorCode).toBe(\"6a80\");\n }\n });\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAAoC,2CAEpCC,EAGO,qDAEPC,EAAsC,mCAEtC,SAAS,wBAAyB,IAAM,CACtC,SAAS,UAAW,IAAM,CACxB,GAAG,8EAA+E,IAAM,CACtF,MAAMC,EAAO,WAAW,KAAK,CAAC,EAAM,EAAM,IAAM,IAAM,GAAI,CAAC,EAErDC,EAAO,IAAI,wBAAsB,CAAE,KAAAD,EAAM,GAAI,CAAK,CAAC,EAAE,QAAQ,EAEnE,OAAOC,EAAK,WAAW,CAAC,EAAE,cACxB,WAAW,KAAK,CACd,IAAM,GAAM,GAAM,EAAM,EAAM,EAAM,EAAM,IAAM,IAAM,GACxD,CAAC,CACH,CACF,CAAC,EAED,GAAG,uCAAwC,IAAM,CAC/C,MAAMD,EAAO,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EAEnCC,EAAO,IAAI,wBAAsB,CAAE,KAAAD,EAAM,GAAI,GAAK,CAAC,EAAE,QAAQ,EAEnE,OAAOC,EAAK,WAAW,CAAC,EAAE,cACxB,WAAW,KAAK,CAAC,IAAM,GAAM,GAAM,IAAM,EAAM,IAAM,GAAI,CAAC,CAC5D,CACF,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,qCAAsC,IAAM,CAC7C,MAAMC,EAAS,IAAI,wBAAsB,CACvC,KAAM,IAAI,WACV,GAAI,CACN,CAAC,EAAE,cAAc,CACf,KAAM,OAAO,KAAK,CAAC,CAAC,EACpB,WAAY,OAAO,KAAK,CAAC,IAAM,CAAI,CAAC,CACtC,CAAC,EAED,OAAOA,CAAM,EAAE,cAAc,CAC3B,OAAQ,sBAAoB,QAC5B,KAAM,MACR,CAAC,CACH,CAAC,EAED,GAAG,yDAA0D,IAAM,CACjE,MAAMA,EAAS,IAAI,wBAAsB,CACvC,KAAM,IAAI,WACV,GAAI,CACN,CAAC,EAAE,cAAc,CACf,KAAM,OAAO,KAAK,CAAC,CAAC,EACpB,WAAY,OAAO,KAAK,CAAC,IAAM,GAAI,CAAC,CACtC,CAAC,EAED,OAAOA,EAAO,MAAM,EAAE,KAAK,sBAAoB,KAAK,EAChDA,EAAO,SAAW,sBAAoB,QACxC,OAAOA,EAAO,KAAK,EAAE,eAAe,sBAAoB,EACxD,OAAQA,EAAO,MAA+B,SAAS,EAAE,KACvD,kCACF,EAEJ,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMA,EAAS,IAAI,wBAAsB,CACvC,KAAM,IAAI,WACV,GAAI,CACN,CAAC,EAAE,cAAc,CACf,KAAM,OAAO,KAAK,CAAC,CAAC,EACpB,WAAY,OAAO,KAAK,CAAC,IAAM,GAAI,CAAC,CACtC,CAAC,EAED,OAAOA,EAAO,MAAM,EAAE,KAAK,sBAAoB,KAAK,EAChDA,EAAO,SAAW,sBAAoB,OACxC,OAAQA,EAAO,MAA+B,SAAS,EAAE,KAAK,MAAM,CAExE,CAAC,CACH,CAAC,CACH,CAAC",
6
- "names": ["import_device_management_kit", "import_contactsErrors", "import_ProvideContactCommand", "data", "apdu", "result"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var r=require("@ledgerhq/device-management-kit"),s=require("../../app-binder/model/contactsErrors"),a=require("./RegisterIdentityCommand");function n(e){const t=new Uint8Array(e.length/2);for(let o=0;o<e.length;o+=2)t[o/2]=parseInt(e.slice(o,o+2),16);return t}const m=n("cc".repeat(64)),p=n("dd".repeat(32)),u=n("aa".repeat(32)),c="2d"+"cc".repeat(64)+"dd".repeat(32)+"aa".repeat(32);function d(e){return{data:Buffer.from(n(e)),statusCode:Buffer.from([144,0])}}describe("RegisterIdentityCommand",()=>{describe("getApdu",()=>{it("wraps the framed chunk under B0 10 01 with P2=0x00 for the first/only chunk",()=>{const e=Uint8Array.from([0,3,170,187,204]),t=new a.RegisterIdentityCommand({data:e,p2:0}).getApdu();expect(t.getRawApdu()).toStrictEqual(Uint8Array.from([176,16,1,0,5,0,3,170,187,204]))}),it("uses P2=0x80 for continuation chunks",()=>{const e=Uint8Array.from([170,187]),t=new a.RegisterIdentityCommand({data:e,p2:128}).getApdu();expect(t.getRawApdu()).toStrictEqual(Uint8Array.from([176,16,1,128,2,170,187]))})}),describe("parseResponse",()=>{it("returns an empty payload for an intermediate chunk (SW=0x9000, no data)",()=>{const e=new a.RegisterIdentityCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([144,0])});expect(e).toStrictEqual({status:r.CommandResultStatus.Success,data:{}})}),it("extracts group_handle / hmac_name / hmac_rest from a register response",()=>{const t=new a.RegisterIdentityCommand({data:new Uint8Array,p2:0}).parseResponse(d(c));expect(t).toStrictEqual({status:r.CommandResultStatus.Success,data:{groupHandle:m,hmacProof:p,hmacRest:u}})}),it("returns InvalidStatusWordError when struct_type is wrong",()=>{const e="ee"+c.slice(2),o=new a.RegisterIdentityCommand({data:new Uint8Array,p2:0}).parseResponse(d(e));expect(o.status).toBe(r.CommandResultStatus.Error)}),it("maps a known SW (0x6985) to a ContactsCommandError",()=>{const t=new a.RegisterIdentityCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([105,133])});expect(t.status).toBe(r.CommandResultStatus.Error),t.status===r.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(s.ContactsCommandError),expect(t.error.errorCode).toBe("6985"))}),it("maps SW=0x6982 to a seed-mismatch ContactsCommandError",()=>{const t=new a.RegisterIdentityCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([105,130])});expect(t.status).toBe(r.CommandResultStatus.Error),t.status===r.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(s.ContactsCommandError),expect(t.error.errorCode).toBe(s.CONTACT_SEED_MISMATCH_ERROR_CODE))})})});
2
- //# sourceMappingURL=RegisterIdentityCommand.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/app-binder/command/RegisterIdentityCommand.test.ts"],
4
- "sourcesContent": ["// RegisterIdentityCommand is a thin chunk-framer: it wraps a pre-framed chunk\n// (2-byte BE length prefix + TLV, assembled by SendRegisterIdentityTask +\n// sendFramedContactsPayload) under B0 10 01 <P2>, and parses the 129-byte\n// register response on the final chunk. TLV byte-parity is asserted in\n// SendRegisterIdentityTask.test.ts.\nimport {\n type ApduResponse,\n CommandResultStatus,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n ContactsCommandError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { RegisterIdentityCommand } from \"./RegisterIdentityCommand\";\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// Device response: struct_type(0x2d) + group_handle(64) + hmac_name(32) +\n// hmac_rest(32).\nconst GROUP_HANDLE = hexToBytes(\"cc\".repeat(64));\nconst HMAC_PROOF = hexToBytes(\"dd\".repeat(32));\nconst HMAC_REST = hexToBytes(\"aa\".repeat(32));\nconst RESPONSE_HEX = \"2d\" + \"cc\".repeat(64) + \"dd\".repeat(32) + \"aa\".repeat(32);\n\nfunction makeResponse(hex: string): ApduResponse {\n return {\n data: Buffer.from(hexToBytes(hex)),\n statusCode: Buffer.from([0x90, 0x00]),\n };\n}\n\ndescribe(\"RegisterIdentityCommand\", () => {\n describe(\"getApdu\", () => {\n it(\"wraps the framed chunk under B0 10 01 with P2=0x00 for the first/only chunk\", () => {\n const data = Uint8Array.from([0x00, 0x03, 0xaa, 0xbb, 0xcc]);\n\n const apdu = new RegisterIdentityCommand({ data, p2: 0x00 }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([\n 0xb0, 0x10, 0x01, 0x00, 0x05, 0x00, 0x03, 0xaa, 0xbb, 0xcc,\n ]),\n );\n });\n\n it(\"uses P2=0x80 for continuation chunks\", () => {\n const data = Uint8Array.from([0xaa, 0xbb]);\n\n const apdu = new RegisterIdentityCommand({ data, p2: 0x80 }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([0xb0, 0x10, 0x01, 0x80, 0x02, 0xaa, 0xbb]),\n );\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"returns an empty payload for an intermediate chunk (SW=0x9000, no data)\", () => {\n const result = new RegisterIdentityCommand({\n data: new Uint8Array(),\n p2: 0x00,\n }).parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x90, 0x00]),\n });\n\n expect(result).toStrictEqual({\n status: CommandResultStatus.Success,\n data: {},\n });\n });\n\n it(\"extracts group_handle / hmac_name / hmac_rest from a register response\", () => {\n const command = new RegisterIdentityCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse(makeResponse(RESPONSE_HEX));\n\n expect(result).toStrictEqual({\n status: CommandResultStatus.Success,\n data: {\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF,\n hmacRest: HMAC_REST,\n },\n });\n });\n\n it(\"returns InvalidStatusWordError when struct_type is wrong\", () => {\n const wrongType = \"ee\" + RESPONSE_HEX.slice(2); // replace 0x2d with 0xee\n const command = new RegisterIdentityCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse(makeResponse(wrongType));\n\n expect(result.status).toBe(CommandResultStatus.Error);\n });\n\n it(\"maps a known SW (0x6985) to a ContactsCommandError\", () => {\n const command = new RegisterIdentityCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x69, 0x85]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(ContactsCommandError);\n expect((result.error as ContactsCommandError).errorCode).toBe(\"6985\");\n }\n });\n\n it(\"maps SW=0x6982 to a seed-mismatch ContactsCommandError\", () => {\n // Reached when extending an existing contact whose group handle was\n // registered with another seed (once the app verifies before the UI).\n const command = new RegisterIdentityCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x69, 0x82]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(ContactsCommandError);\n expect((result.error as ContactsCommandError).errorCode).toBe(\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n );\n }\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_contactsErrors", "import_RegisterIdentityCommand", "hexToBytes", "hex", "out", "i", "GROUP_HANDLE", "HMAC_PROOF", "HMAC_REST", "RESPONSE_HEX", "makeResponse", "data", "apdu", "result", "wrongType"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var r=require("@ledgerhq/device-management-kit"),n=require("../../app-binder/model/contactsErrors"),a=require("./RenameContactCommand");function d(e){const t=new Uint8Array(e.length/2);for(let o=0;o<e.length;o+=2)t[o/2]=parseInt(e.slice(o,o+2),16);return t}const m=d("dd".repeat(32)),c="2e"+"dd".repeat(32);function s(e){return{data:Buffer.from(d(e)),statusCode:Buffer.from([144,0])}}describe("RenameContactCommand",()=>{describe("getApdu",()=>{it("wraps the framed chunk under E0 2E 00 with P2=0x00 for the first/only chunk",()=>{const e=Uint8Array.from([0,3,170,187,204]),t=new a.RenameContactCommand({data:e,p2:0}).getApdu();expect(t.getRawApdu()).toStrictEqual(Uint8Array.from([224,46,0,0,5,0,3,170,187,204]))}),it("uses P2=0x80 for continuation chunks",()=>{const e=Uint8Array.from([170,187]),t=new a.RenameContactCommand({data:e,p2:128}).getApdu();expect(t.getRawApdu()).toStrictEqual(Uint8Array.from([224,46,0,128,2,170,187]))})}),describe("parseResponse",()=>{it("returns an empty payload for an intermediate chunk (SW=0x9000, no data)",()=>{const e=new a.RenameContactCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([144,0])});expect(e).toStrictEqual({status:r.CommandResultStatus.Success,data:{}})}),it("extracts the rotated hmac_name from an edit-contact-name response",()=>{const t=new a.RenameContactCommand({data:new Uint8Array,p2:0}).parseResponse(s(c));expect(t).toStrictEqual({status:r.CommandResultStatus.Success,data:{hmacProof:m}})}),it("returns InvalidStatusWordError when struct_type is wrong",()=>{const e="ee"+c.slice(2),o=new a.RenameContactCommand({data:new Uint8Array,p2:0}).parseResponse(s(e));expect(o.status).toBe(r.CommandResultStatus.Error)}),it("returns InvalidStatusWordError when hmac_name is truncated",()=>{const e="2e"+"dd".repeat(16),o=new a.RenameContactCommand({data:new Uint8Array,p2:0}).parseResponse(s(e));expect(o.status).toBe(r.CommandResultStatus.Error)}),it("maps a known SW (0x6985) to a ContactsCommandError",()=>{const t=new a.RenameContactCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([105,133])});expect(t.status).toBe(r.CommandResultStatus.Error),t.status===r.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(n.ContactsCommandError),expect(t.error.errorCode).toBe("6985"))}),it("maps SW=0x686A (OS still mandates the derivation path) to a ContactsCommandError",()=>{const t=new a.RenameContactCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([104,106])});expect(t.status).toBe(r.CommandResultStatus.Error),t.status===r.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(n.ContactsCommandError),expect(t.error.errorCode).toBe("686a"))}),it("gives an unmapped status word an actionable message instead of UnknownDeviceExchangeError",()=>{const t=new a.RenameContactCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([109,1])});expect(t.status).toBe(r.CommandResultStatus.Error),t.status===r.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(r.InvalidStatusWordError),expect(t.error.originalError?.message).toContain("0x6d01"))}),it("maps SW=0x6982 to a seed-mismatch ContactsCommandError",()=>{const t=new a.RenameContactCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([105,130])});expect(t.status).toBe(r.CommandResultStatus.Error),t.status===r.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(n.ContactsCommandError),expect(t.error.errorCode).toBe(n.CONTACT_SEED_MISMATCH_ERROR_CODE))})})});
2
- //# sourceMappingURL=RenameContactCommand.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/app-binder/command/RenameContactCommand.test.ts"],
4
- "sourcesContent": ["// RenameContactCommand is a thin chunk-framer for the OS/dashboard EDIT CONTACT\n// NAME command: it wraps a pre-framed chunk (2-byte BE length prefix + TLV,\n// assembled by SendRenameContactTask + sendFramedContactsPayload) under\n// E0 2E 00 <P2>, and parses the 33-byte response on the final chunk. TLV\n// byte-parity is asserted in SendRenameContactTask.test.ts.\nimport {\n type ApduResponse,\n CommandResultStatus,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n ContactsCommandError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { RenameContactCommand } from \"./RenameContactCommand\";\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// Device response: struct_type(0x2e) + rotated hmac_name(32).\nconst HMAC_PROOF = hexToBytes(\"dd\".repeat(32));\nconst RESPONSE_HEX = \"2e\" + \"dd\".repeat(32);\n\nfunction makeResponse(hex: string): ApduResponse {\n return {\n data: Buffer.from(hexToBytes(hex)),\n statusCode: Buffer.from([0x90, 0x00]),\n };\n}\n\ndescribe(\"RenameContactCommand\", () => {\n describe(\"getApdu\", () => {\n it(\"wraps the framed chunk under E0 2E 00 with P2=0x00 for the first/only chunk\", () => {\n const data = Uint8Array.from([0x00, 0x03, 0xaa, 0xbb, 0xcc]);\n\n const apdu = new RenameContactCommand({ data, p2: 0x00 }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([\n 0xe0, 0x2e, 0x00, 0x00, 0x05, 0x00, 0x03, 0xaa, 0xbb, 0xcc,\n ]),\n );\n });\n\n it(\"uses P2=0x80 for continuation chunks\", () => {\n const data = Uint8Array.from([0xaa, 0xbb]);\n\n const apdu = new RenameContactCommand({ data, p2: 0x80 }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([0xe0, 0x2e, 0x00, 0x80, 0x02, 0xaa, 0xbb]),\n );\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"returns an empty payload for an intermediate chunk (SW=0x9000, no data)\", () => {\n const result = new RenameContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n }).parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x90, 0x00]),\n });\n\n expect(result).toStrictEqual({\n status: CommandResultStatus.Success,\n data: {},\n });\n });\n\n it(\"extracts the rotated hmac_name from an edit-contact-name response\", () => {\n const command = new RenameContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse(makeResponse(RESPONSE_HEX));\n\n expect(result).toStrictEqual({\n status: CommandResultStatus.Success,\n data: { hmacProof: HMAC_PROOF },\n });\n });\n\n it(\"returns InvalidStatusWordError when struct_type is wrong\", () => {\n const wrongType = \"ee\" + RESPONSE_HEX.slice(2); // replace 0x2e with 0xee\n const command = new RenameContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse(makeResponse(wrongType));\n\n expect(result.status).toBe(CommandResultStatus.Error);\n });\n\n it(\"returns InvalidStatusWordError when hmac_name is truncated\", () => {\n const truncated = \"2e\" + \"dd\".repeat(16); // only 16 of 32 bytes\n const command = new RenameContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse(makeResponse(truncated));\n\n expect(result.status).toBe(CommandResultStatus.Error);\n });\n\n it(\"maps a known SW (0x6985) to a ContactsCommandError\", () => {\n const command = new RenameContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x69, 0x85]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(ContactsCommandError);\n expect((result.error as ContactsCommandError).errorCode).toBe(\"6985\");\n }\n });\n\n it(\"maps SW=0x686A (OS still mandates the derivation path) to a ContactsCommandError\", () => {\n const command = new RenameContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x68, 0x6a]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(ContactsCommandError);\n expect((result.error as ContactsCommandError).errorCode).toBe(\"686a\");\n }\n });\n\n it(\"gives an unmapped status word an actionable message instead of UnknownDeviceExchangeError\", () => {\n // 0x6D01 is in neither the Contacts nor the global error dictionary, so\n // the base helper would yield a bare UnknownDeviceExchangeError. The\n // Contacts helper upgrades it to an InvalidStatusWordError naming the SW.\n const command = new RenameContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x6d, 0x01]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(InvalidStatusWordError);\n expect(\n (result.error as InvalidStatusWordError).originalError?.message,\n ).toContain(\"0x6d01\");\n }\n });\n\n it(\"maps SW=0x6982 to a seed-mismatch ContactsCommandError\", () => {\n // The device verifies the supplied group handle + old-name proof against\n // the seed-derived key before any UI, and returns 0x6982 on a mismatch.\n const command = new RenameContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n });\n\n const result = command.parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x69, 0x82]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(ContactsCommandError);\n expect((result.error as ContactsCommandError).errorCode).toBe(\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n );\n }\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_contactsErrors", "import_RenameContactCommand", "hexToBytes", "hex", "out", "i", "HMAC_PROOF", "RESPONSE_HEX", "makeResponse", "data", "apdu", "result", "wrongType", "truncated"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var s=require("@ledgerhq/device-management-kit"),i=require("../../api/model/ContactsVersionRequirements"),t=require("./contactsVersionGuards");const u=(()=>{const e=(0,i.resolveContactsVersionRequirements)(s.DeviceModelId.FLEX);if(!e.supported)throw new Error("Flex must be supported");return e})(),p=u.minOsVersion,d=(()=>{const e=u.minAppVersion[i.ETHEREUM_APP_NAME];if(e===void 0)throw new Error("Ethereum min version required");return e})(),c="0.0.1";function o({osVersion:e=p,modelId:a=s.DeviceModelId.FLEX}={}){return{sessionStateType:s.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:s.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:i.ETHEREUM_APP_NAME,version:"0.0.0"},deviceModelId:a,firmwareVersion:{mcu:"1.0.0",bootloader:"1.0.0",os:e},isSecureConnectionAllowed:!1}}function n(e){return{getDeviceSessionState:()=>e}}function r(e=i.ETHEREUM_APP_NAME,a=d){return{name:e,version:a}}describe("isContactsAppVersionSupportedForSession",()=>{it("returns true when the model and app version meet the minimums",()=>{const e=n(o());expect((0,t.isContactsAppVersionSupportedForSession)(e,r())).toBe(!0)}),it("returns true regardless of OS version, since app-owned operations are not gated by it",()=>{const e=n(o({osVersion:c}));expect((0,t.isContactsAppVersionSupportedForSession)(e,r())).toBe(!0)}),it("returns false on an unsupported device model",()=>{const e=n(o({modelId:s.DeviceModelId.NANO_S}));expect((0,t.isContactsAppVersionSupportedForSession)(e,r())).toBe(!1)}),it("returns false when the app version is below the minimum",()=>{const e=n(o());expect((0,t.isContactsAppVersionSupportedForSession)(e,r(i.ETHEREUM_APP_NAME,c))).toBe(!1)}),it("returns false when the running app is unknown to Contacts",()=>{const e=n(o());expect((0,t.isContactsAppVersionSupportedForSession)(e,r("Bitcoin"))).toBe(!1)}),it.each([i.TRON_APP_NAME,i.SOLANA_APP_NAME])("returns true for the %s app at its minimum version",e=>{const a=u.minAppVersion[e];if(a===void 0)throw new Error(`${e} min version`);const l=n(o());expect((0,t.isContactsAppVersionSupportedForSession)(l,r(e,a))).toBe(!0)}),it("returns false for a Solana app below its minimum version",()=>{const e=n(o());expect((0,t.isContactsAppVersionSupportedForSession)(e,r(i.SOLANA_APP_NAME,"1.16.0"))).toBe(!1)}),it("returns true for a prerelease build of the minimum app version",()=>{const e=n(o());expect((0,t.isContactsAppVersionSupportedForSession)(e,r(i.ETHEREUM_APP_NAME,`${d}-rc2`))).toBe(!0)}),it("returns false when the device session has no running app",()=>{const e=n({sessionStateType:s.DeviceSessionStateType.Connected,deviceStatus:s.DeviceStatus.CONNECTED,deviceModelId:s.DeviceModelId.FLEX});expect((0,t.isContactsAppVersionSupportedForSession)(e,r())).toBe(!1)})});describe("isContactsOsVersionSupportedForSession",()=>{it("returns true when the model and the caller's OS version meet the minimums",()=>{const e=n(o());expect((0,t.isContactsOsVersionSupportedForSession)(e,p)).toBe(!0)}),it("returns false on an unsupported device model",()=>{const e=n(o({modelId:s.DeviceModelId.NANO_S}));expect((0,t.isContactsOsVersionSupportedForSession)(e,p)).toBe(!1)}),it("returns false when the caller's OS version is below the minimum",()=>{const e=n(o());expect((0,t.isContactsOsVersionSupportedForSession)(e,c)).toBe(!1)}),it("returns true for a release candidate of the minimum OS version",()=>{const e=n(o());expect((0,t.isContactsOsVersionSupportedForSession)(e,`${p}-rc2`)).toBe(!0)}),it("returns false for a release candidate below the minimum OS version",()=>{const e=n(o());expect((0,t.isContactsOsVersionSupportedForSession)(e,`${c}-rc2`)).toBe(!1)}),it("never reads the OS version from the device session state",()=>{const e=n({sessionStateType:s.DeviceSessionStateType.Connected,deviceStatus:s.DeviceStatus.CONNECTED,deviceModelId:s.DeviceModelId.FLEX});expect((0,t.isContactsOsVersionSupportedForSession)(e,p)).toBe(!0),expect((0,t.isContactsOsVersionSupportedForSession)(e,c)).toBe(!1)})});
2
- //# sourceMappingURL=contactsVersionGuards.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/internal/app-binder/contactsVersionGuards.test.ts"],
4
- "sourcesContent": ["import {\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n ETHEREUM_APP_NAME,\n resolveContactsVersionRequirements,\n SOLANA_APP_NAME,\n TRON_APP_NAME,\n} from \"@api/model/ContactsVersionRequirements\";\n\nimport {\n isContactsAppVersionSupportedForSession,\n isContactsOsVersionSupportedForSession,\n type RunningApp,\n} from \"./contactsVersionGuards\";\n\nconst flexSupport = (() => {\n const requirement = resolveContactsVersionRequirements(DeviceModelId.FLEX);\n if (!requirement.supported) throw new Error(\"Flex must be supported\");\n return requirement;\n})();\n\nconst MIN_OS_VERSION = flexSupport.minOsVersion;\nconst MIN_APP_VERSION = (() => {\n const version = flexSupport.minAppVersion[ETHEREUM_APP_NAME];\n if (version === undefined) throw new Error(\"Ethereum min version required\");\n return version;\n})();\nconst BELOW_ANY_VERSION = \"0.0.1\";\n\ntype ReadyStateOptions = {\n osVersion?: string;\n modelId?: DeviceModelId;\n};\n\nfunction createReadyState({\n osVersion = MIN_OS_VERSION,\n modelId = DeviceModelId.FLEX,\n}: ReadyStateOptions = {}) {\n return {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: ETHEREUM_APP_NAME, version: \"0.0.0\" },\n deviceModelId: modelId,\n firmwareVersion: { mcu: \"1.0.0\", bootloader: \"1.0.0\", os: osVersion },\n isSecureConnectionAllowed: false,\n };\n}\n\nfunction createInternalApi(deviceState: object): InternalApi {\n return {\n getDeviceSessionState: () => deviceState,\n } as unknown as InternalApi;\n}\n\n// The running app identity now comes from the caller (a fresh\n// WaitForAppAndVersion result), not the device session state.\nfunction runningApp(\n name = ETHEREUM_APP_NAME,\n version = MIN_APP_VERSION,\n): RunningApp {\n return { name, version };\n}\n\ndescribe(\"isContactsAppVersionSupportedForSession\", () => {\n it(\"returns true when the model and app version meet the minimums\", () => {\n const api = createInternalApi(createReadyState());\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n true,\n );\n });\n\n it(\"returns true regardless of OS version, since app-owned operations are not gated by it\", () => {\n const api = createInternalApi(\n createReadyState({ osVersion: BELOW_ANY_VERSION }),\n );\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n true,\n );\n });\n\n it(\"returns false on an unsupported device model\", () => {\n const api = createInternalApi(\n createReadyState({ modelId: DeviceModelId.NANO_S }),\n );\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n false,\n );\n });\n\n it(\"returns false when the app version is below the minimum\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(\n api,\n runningApp(ETHEREUM_APP_NAME, BELOW_ANY_VERSION),\n ),\n ).toBe(false);\n });\n\n it(\"returns false when the running app is unknown to Contacts\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(api, runningApp(\"Bitcoin\")),\n ).toBe(false);\n });\n\n it.each([TRON_APP_NAME, SOLANA_APP_NAME])(\n \"returns true for the %s app at its minimum version\",\n (appName) => {\n const version = flexSupport.minAppVersion[appName];\n if (version === undefined) throw new Error(`${appName} min version`);\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(\n api,\n runningApp(appName, version),\n ),\n ).toBe(true);\n },\n );\n\n it(\"returns false for a Solana app below its minimum version\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(\n api,\n runningApp(SOLANA_APP_NAME, \"1.16.0\"),\n ),\n ).toBe(false);\n });\n\n it(\"returns true for a prerelease build of the minimum app version\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(\n api,\n runningApp(ETHEREUM_APP_NAME, `${MIN_APP_VERSION}-rc2`),\n ),\n ).toBe(true);\n });\n\n it(\"returns false when the device session has no running app\", () => {\n const api = createInternalApi({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.FLEX,\n });\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n false,\n );\n });\n});\n\ndescribe(\"isContactsOsVersionSupportedForSession\", () => {\n it(\"returns true when the model and the caller's OS version meet the minimums\", () => {\n const api = createInternalApi(createReadyState());\n expect(isContactsOsVersionSupportedForSession(api, MIN_OS_VERSION)).toBe(\n true,\n );\n });\n\n it(\"returns false on an unsupported device model\", () => {\n const api = createInternalApi(\n createReadyState({ modelId: DeviceModelId.NANO_S }),\n );\n expect(isContactsOsVersionSupportedForSession(api, MIN_OS_VERSION)).toBe(\n false,\n );\n });\n\n it(\"returns false when the caller's OS version is below the minimum\", () => {\n const api = createInternalApi(createReadyState());\n expect(isContactsOsVersionSupportedForSession(api, BELOW_ANY_VERSION)).toBe(\n false,\n );\n });\n\n it(\"returns true for a release candidate of the minimum OS version\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsOsVersionSupportedForSession(api, `${MIN_OS_VERSION}-rc2`),\n ).toBe(true);\n });\n\n it(\"returns false for a release candidate below the minimum OS version\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsOsVersionSupportedForSession(api, `${BELOW_ANY_VERSION}-rc2`),\n ).toBe(false);\n });\n\n it(\"never reads the OS version from the device session state\", () => {\n // A session with no firmwareVersion at all: the guard must rely solely on\n // the caller-supplied version and still resolve support.\n const api = createInternalApi({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.FLEX,\n });\n expect(isContactsOsVersionSupportedForSession(api, MIN_OS_VERSION)).toBe(\n true,\n );\n expect(isContactsOsVersionSupportedForSession(api, BELOW_ANY_VERSION)).toBe(\n false,\n );\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_ContactsVersionRequirements", "import_contactsVersionGuards", "flexSupport", "requirement", "MIN_OS_VERSION", "MIN_APP_VERSION", "version", "BELOW_ANY_VERSION", "createReadyState", "osVersion", "modelId", "createInternalApi", "deviceState", "runningApp", "name", "api", "appName"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var e=require("@ledgerhq/device-management-kit"),n=require("vitest"),h=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),s=require("../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock"),I=require("../../../app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock"),c=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),f=require("../../../app-binder/model/contactsErrors"),P=require("./EditExternalAddressIdentifierDeviceAction"),D=require("./validateEditExternalAddressIdentifierInput");n.vi.mock("@ledgerhq/device-management-kit",async o=>({...await o(),OpenAppDeviceAction:n.vi.fn(()=>({makeStateMachine:n.vi.fn()})),WaitForAppAndVersionDeviceAction:n.vi.fn(()=>({makeStateMachine:n.vi.fn()}))}));const V={name:"Ethereum",version:"1.15.0"},g=new Uint8Array(64).fill(204),v=new Uint8Array(32).fill(221),U=new Uint8Array(32).fill(170),x=new Uint8Array(32).fill(136),k=new Uint8Array(20).fill(17),O=new Uint8Array(20).fill(34),y={hmacRest:x},u={contactName:"Alice",scope:"Eth main",previousIdentifier:k,newIdentifier:O,blockchainFamily:"ethereum",chainId:1n,groupHandle:g,hmacProof:v,hmacRest:U,appName:"Ethereum"},A={contactName:"Alice",scope:"Eth main",previousIdentifier:k,identifier:O,blockchainFamily:"ethereum",chainId:1n,groupHandle:g,hmacProof:v,hmacRest:x};(0,n.describe)("EditExternalAddressIdentifierDeviceAction",()=>{let o,l,E;function R(){return{isSupported:l,editIdentifier:E}}(0,n.beforeEach)(()=>{o=(0,h.makeDeviceActionInternalApiMock)(),(0,I.setupWaitForAppAndVersionDAMock)(V),l=n.vi.fn().mockReturnValue(!0),E=n.vi.fn().mockResolvedValue((0,e.CommandResultFactory)({data:y})),o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!0})});function p(i){const r=new P.EditExternalAddressIdentifierDeviceAction({input:i});return n.vi.spyOn(r,"extractDependencies").mockReturnValue(R()),r}(0,n.it)("open-app path: OpenApp -> VersionGuard -> EditIdentifier -> Completed",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t=p({...u,skipOpenApp:!1}),a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,a,o,{onDone:i,onError:r})})),(0,n.it)("skip-open-app path: VersionGuard -> EditIdentifier -> Completed, preserving the group proof",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t=p({...u,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,a,o,{onDone:()=>{try{expect(A.hmacProof).toBe(v),expect(A.hmacRest).toBe(x),expect(A.hmacRest).not.toBe(U),i()}catch(d){r(d)}},onError:r})})),(0,n.it)("version guard rejects on skip-open-app path without running EDIT IDENTIFIER",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)(),l.mockReturnValue(!1);const t=p({...u,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:new f.ContactsVersionRequirementError,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(t,a,o,{onDone:i,onError:r}),expect(E).not.toHaveBeenCalled()})),(0,n.it)("surfaces an open-app failure as the device action error",()=>new Promise((i,r)=>{const t=new e.UnknownDAError("open app failed");(0,s.setupOpenAppDAMock)(t);const a=p({...u,skipOpenApp:!1}),d=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(a,d,o,{onDone:i,onError:r}),expect(l).not.toHaveBeenCalled()})),(0,n.it)("surfaces an Edit Identifier command error",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t=new f.ContactsCommandError({errorCode:"6982",message:"seed mismatch"});E.mockResolvedValue((0,e.CommandResultFactory)({error:t}));const a=p({...u,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(a,d,o,{onDone:i,onError:r})})),(0,n.it)("surfaces invalid input as a typed error state on the skip-open-app path",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t={...u,skipOpenApp:!0,contactName:""},a=(0,D.validateEditExternalAddressIdentifierInput)(t),d=p(t),m=[{error:a,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(d,m,o,{onDone:i,onError:r}),expect(l).not.toHaveBeenCalled(),expect(E).not.toHaveBeenCalled()})),(0,n.it)("validates only after opening the app on the default path",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t={...u,skipOpenApp:!1,contactName:""},a=(0,D.validateEditExternalAddressIdentifierInput)(t),d=p(t),m=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{error:a,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(d,m,o,{onDone:i,onError:r}),expect(E).not.toHaveBeenCalled()})),(0,n.it)("evaluates support from the fresh WaitForAppAndVersion result, not stale session state",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t={name:"Ethereum",version:"9.9.9"};(0,I.setupWaitForAppAndVersionDAMock)(t);const a=p({...u,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(a,d,o,{onDone:()=>{try{expect(l).toHaveBeenCalledWith(t),i()}catch(m){r(m)}},onError:r})})),(0,n.it)("surfaces a WaitForAppAndVersion failure as the device action error",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)();const t=new e.UnknownDAError("could not read app and version");(0,I.setupWaitForAppAndVersionDAMock)({error:t});const a=p({...u,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(a,d,o,{onDone:i,onError:r}),expect(l).not.toHaveBeenCalled(),expect(E).not.toHaveBeenCalled()})),(0,n.it)("propagates the UnlockDevice interaction emitted by WaitForAppAndVersion",()=>new Promise((i,r)=>{(0,s.setupOpenAppDAMock)(),(0,I.setupWaitForAppAndVersionDAMock)(V,e.UserInteractionRequired.UnlockDevice);const t=p({...u,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,a,o,{onDone:i,onError:r})}))});
2
- //# sourceMappingURL=EditExternalAddressIdentifierDeviceAction.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.ts"],
4
- "sourcesContent": ["import {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type EditExternalAddressIdentifierDAError,\n type EditExternalAddressIdentifierDAInput,\n type EditExternalAddressIdentifierDAIntermediateValue,\n type EditExternalAddressIdentifierDAOutput,\n} from \"@api/app-binder/EditExternalAddressIdentifierDeviceActionTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { setupWaitForAppAndVersionDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport {\n ContactsCommandError,\n ContactsVersionRequirementError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { EditExternalAddressIdentifierDeviceAction } from \"./EditExternalAddressIdentifierDeviceAction\";\nimport { validateEditExternalAddressIdentifierInput } from \"./validateEditExternalAddressIdentifierInput\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n WaitForAppAndVersionDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\nconst FRESH_APP = { name: \"Ethereum\", version: \"1.15.0\" };\n\nconst GROUP_HANDLE = new Uint8Array(64).fill(0xcc);\nconst HMAC_PROOF = new Uint8Array(32).fill(0xdd);\nconst HMAC_REST_OLD = new Uint8Array(32).fill(0xaa);\nconst HMAC_REST_NEW = new Uint8Array(32).fill(0x88);\nconst PREVIOUS_IDENTIFIER = new Uint8Array(20).fill(0x11);\nconst NEW_IDENTIFIER = new Uint8Array(20).fill(0x22);\n\nconst OK_PROOF = { hmacRest: HMAC_REST_NEW };\n\nconst BASE_INPUT = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n previousIdentifier: PREVIOUS_IDENTIFIER,\n newIdentifier: NEW_IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF,\n hmacRest: HMAC_REST_OLD,\n appName: \"Ethereum\",\n};\n\nconst EXPECTED_OUTPUT = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n previousIdentifier: PREVIOUS_IDENTIFIER,\n identifier: NEW_IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n // Preserved: the group-level name proof is unchanged by an identifier edit.\n hmacProof: HMAC_PROOF,\n // Rotated: only the address-level proof changes.\n hmacRest: HMAC_REST_NEW,\n};\n\ndescribe(\"EditExternalAddressIdentifierDeviceAction\", () => {\n let apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\n let isSupportedMock: ReturnType<typeof vi.fn>;\n let editIdentifierMock: ReturnType<typeof vi.fn>;\n\n function extractDeps() {\n return {\n isSupported: isSupportedMock,\n editIdentifier: editIdentifierMock,\n };\n }\n\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n setupWaitForAppAndVersionDAMock(FRESH_APP);\n isSupportedMock = vi.fn().mockReturnValue(true);\n editIdentifierMock = vi\n .fn()\n .mockResolvedValue(CommandResultFactory({ data: OK_PROOF }));\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n });\n\n function makeAction(input: EditExternalAddressIdentifierDAInput) {\n const action = new EditExternalAddressIdentifierDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n return action;\n }\n\n it(\"open-app path: OpenApp -> VersionGuard -> EditIdentifier -> Completed\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"skip-open-app path: VersionGuard -> EditIdentifier -> Completed, preserving the group proof\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n // The device rotates only the address-level hmac_rest; the contact\n // group's name proof passes through unchanged.\n expect(EXPECTED_OUTPUT.hmacProof).toBe(HMAC_PROOF);\n expect(EXPECTED_OUTPUT.hmacRest).toBe(HMAC_REST_NEW);\n expect(EXPECTED_OUTPUT.hmacRest).not.toBe(HMAC_REST_OLD);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"version guard rejects on skip-open-app path without running EDIT IDENTIFIER\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n isSupportedMock.mockReturnValue(false);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new ContactsVersionRequirementError(),\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an open-app failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n const openAppError = new UnknownDAError(\"open app failed\");\n setupOpenAppDAMock(openAppError);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: openAppError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an Edit Identifier command error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const commandError = new ContactsCommandError({\n errorCode: \"6982\",\n message: \"seed mismatch\",\n });\n editIdentifierMock.mockResolvedValue(\n CommandResultFactory({ error: commandError }),\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: commandError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"surfaces invalid input as a typed error state on the skip-open-app path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: true,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressIdentifierInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"validates only after opening the app on the default path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: false,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressIdentifierInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"evaluates support from the fresh WaitForAppAndVersion result, not stale session state\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const freshApp = { name: \"Ethereum\", version: \"9.9.9\" };\n setupWaitForAppAndVersionDAMock(freshApp);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n expect(isSupportedMock).toHaveBeenCalledWith(freshApp);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a WaitForAppAndVersion failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const waitError = new UnknownDAError(\"could not read app and version\");\n setupWaitForAppAndVersionDAMock({ error: waitError });\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: waitError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"propagates the UnlockDevice interaction emitted by WaitForAppAndVersion\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupWaitForAppAndVersionDAMock(\n FRESH_APP,\n UserInteractionRequired.UnlockDevice,\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_vitest", "import_makeInternalApi", "import_setupOpenAppDAMock", "import_setupWaitForAppAndVersionDAMock", "import_testDeviceActionStates", "import_contactsErrors", "import_EditExternalAddressIdentifierDeviceAction", "import_validateEditExternalAddressIdentifierInput", "importOriginal", "FRESH_APP", "GROUP_HANDLE", "HMAC_PROOF", "HMAC_REST_OLD", "HMAC_REST_NEW", "PREVIOUS_IDENTIFIER", "NEW_IDENTIFIER", "OK_PROOF", "BASE_INPUT", "EXPECTED_OUTPUT", "apiMock", "isSupportedMock", "editIdentifierMock", "extractDeps", "makeAction", "input", "action", "resolve", "reject", "expected", "e", "openAppError", "commandError", "invalidInput", "validationError", "freshApp", "waitError"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var n=require("../../../app-binder/model/contactsValidation"),t=require("./validateEditExternalAddressIdentifierInput");const r={contactName:"Alice",scope:"Eth main",previousIdentifier:new Uint8Array(20).fill(17),newIdentifier:new Uint8Array(20).fill(34),blockchainFamily:"ethereum",chainId:1n,groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)};describe("validateEditExternalAddressIdentifierInput",()=>{it("returns null for a valid input",()=>{expect((0,t.validateEditExternalAddressIdentifierInput)(r)).toBeNull()}),it("rejects an empty contactName",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,contactName:""});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects a non-printable scope",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,scope:"caf\xE9"});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects an unsupported blockchain family",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,blockchainFamily:"dogecoin"});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects a previousIdentifier of the wrong length for Ethereum",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,previousIdentifier:new Uint8Array(19).fill(17)});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects a newIdentifier of the wrong length for Ethereum",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,newIdentifier:new Uint8Array(21).fill(34)});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("requires chainId for the Ethereum family",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,chainId:void 0});expect(e).toBeInstanceOf(n.ContactsValidationError)}),describe("Solana",()=>{const e={...r,previousIdentifier:new Uint8Array(32).fill(17),newIdentifier:new Uint8Array(32).fill(34),blockchainFamily:"solana",chainId:void 0};it("accepts 32-byte public keys without chainId",()=>{expect((0,t.validateEditExternalAddressIdentifierInput)(e)).toBeNull()}),it.each(["previousIdentifier","newIdentifier"])("rejects a %s that is not 32 bytes",i=>{const a=(0,t.validateEditExternalAddressIdentifierInput)({...e,[i]:new Uint8Array(20)});expect(a).toBeInstanceOf(n.ContactsValidationError),expect(a?.message).toContain(i)}),it("rejects a chainId",()=>{expect((0,t.validateEditExternalAddressIdentifierInput)({...e,chainId:1n})).toBeInstanceOf(n.ContactsValidationError)})}),it("rejects a groupHandle of the wrong length",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,groupHandle:new Uint8Array(63).fill(204)});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects an hmacProof of the wrong length",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,hmacProof:new Uint8Array(31).fill(221)});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects an hmacRest of the wrong length",()=>{const e=(0,t.validateEditExternalAddressIdentifierInput)({...r,hmacRest:new Uint8Array(33).fill(170)});expect(e).toBeInstanceOf(n.ContactsValidationError)})});
2
- //# sourceMappingURL=validateEditExternalAddressIdentifierInput.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.ts"],
4
- "sourcesContent": ["import { type EditExternalAddressIdentifierInput } from \"@api/model/EditExternalAddressIdentifier\";\nimport { ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\nimport { validateEditExternalAddressIdentifierInput } from \"./validateEditExternalAddressIdentifierInput\";\n\nconst VALID_INPUT: EditExternalAddressIdentifierInput = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n previousIdentifier: new Uint8Array(20).fill(0x11),\n newIdentifier: new Uint8Array(20).fill(0x22),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\ndescribe(\"validateEditExternalAddressIdentifierInput\", () => {\n it(\"returns null for a valid input\", () => {\n expect(validateEditExternalAddressIdentifierInput(VALID_INPUT)).toBeNull();\n });\n\n it(\"rejects an empty contactName\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n contactName: \"\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a non-printable scope\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n scope: \"caf\u00E9\", // 0xC3 0xA9 is non-ASCII\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an unsupported blockchain family\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n blockchainFamily: \"dogecoin\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a previousIdentifier of the wrong length for Ethereum\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n previousIdentifier: new Uint8Array(19).fill(0x11),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a newIdentifier of the wrong length for Ethereum\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n newIdentifier: new Uint8Array(21).fill(0x22),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"requires chainId for the Ethereum family\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n chainId: undefined,\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n describe(\"Solana\", () => {\n const SOLANA_INPUT: EditExternalAddressIdentifierInput = {\n ...VALID_INPUT,\n previousIdentifier: new Uint8Array(32).fill(0x11),\n newIdentifier: new Uint8Array(32).fill(0x22),\n blockchainFamily: \"solana\",\n chainId: undefined,\n };\n\n it(\"accepts 32-byte public keys without chainId\", () => {\n expect(\n validateEditExternalAddressIdentifierInput(SOLANA_INPUT),\n ).toBeNull();\n });\n\n it.each([\"previousIdentifier\", \"newIdentifier\"] as const)(\n \"rejects a %s that is not 32 bytes\",\n (field) => {\n const error = validateEditExternalAddressIdentifierInput({\n ...SOLANA_INPUT,\n [field]: new Uint8Array(20),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n expect(error?.message).toContain(field);\n },\n );\n\n it(\"rejects a chainId\", () => {\n expect(\n validateEditExternalAddressIdentifierInput({\n ...SOLANA_INPUT,\n chainId: 1n,\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n });\n\n it(\"rejects a groupHandle of the wrong length\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n groupHandle: new Uint8Array(63).fill(0xcc),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacProof of the wrong length\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n hmacProof: new Uint8Array(31).fill(0xdd),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacRest of the wrong length\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n hmacRest: new Uint8Array(33).fill(0xaa),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_contactsValidation", "import_validateEditExternalAddressIdentifierInput", "VALID_INPUT", "error", "SOLANA_INPUT", "field"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var e=require("@ledgerhq/device-management-kit"),n=require("vitest"),h=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),d=require("../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock"),D=require("../../../app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock"),c=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),S=require("../../../app-binder/model/contactsErrors"),P=require("./EditExternalAddressScopeDeviceAction"),v=require("./validateEditExternalAddressScopeInput");n.vi.mock("@ledgerhq/device-management-kit",async a=>({...await a(),OpenAppDeviceAction:n.vi.fn(()=>({makeStateMachine:n.vi.fn()})),WaitForAppAndVersionDeviceAction:n.vi.fn(()=>({makeStateMachine:n.vi.fn()}))}));const V={name:"Ethereum",version:"1.15.0"},g=new Uint8Array(64).fill(204),x=new Uint8Array(32).fill(221),k=new Uint8Array(32).fill(170),f=new Uint8Array(32).fill(136),I=new Uint8Array(20).fill(17),O={hmacRest:f},u={contactName:"Alice",previousScope:"Eth main",newScope:"Eth cold",identifier:I,blockchainFamily:"ethereum",chainId:1n,groupHandle:g,hmacProof:x,hmacRest:k,appName:"Ethereum"},A={contactName:"Alice",previousScope:"Eth main",scope:"Eth cold",identifier:I,blockchainFamily:"ethereum",chainId:1n,groupHandle:g,hmacProof:x,hmacRest:f};(0,n.describe)("EditExternalAddressScopeDeviceAction",()=>{let a,l,E;function U(){return{isSupported:l,editScope:E}}(0,n.beforeEach)(()=>{a=(0,h.makeDeviceActionInternalApiMock)(),(0,D.setupWaitForAppAndVersionDAMock)(V),l=n.vi.fn().mockReturnValue(!0),E=n.vi.fn().mockResolvedValue((0,e.CommandResultFactory)({data:O})),a.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!0})});function p(o){const r=new P.EditExternalAddressScopeDeviceAction({input:o});return n.vi.spyOn(r,"extractDependencies").mockReturnValue(U()),r}(0,n.it)("open-app path: OpenApp -> VersionGuard -> EditScope -> Completed",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t=p({...u,skipOpenApp:!1}),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,i,a,{onDone:o,onError:r})})),(0,n.it)("skip-open-app path: VersionGuard -> EditScope -> Completed, preserving the group proof and identifier",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t=p({...u,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,i,a,{onDone:()=>{try{expect(A.hmacProof).toBe(x),expect(A.identifier).toBe(I),expect(A.hmacRest).toBe(f),expect(A.hmacRest).not.toBe(k),o()}catch(s){r(s)}},onError:r})})),(0,n.it)("version guard rejects on skip-open-app path without running EDIT SCOPE",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)(),l.mockReturnValue(!1);const t=p({...u,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:new S.ContactsVersionRequirementError,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(t,i,a,{onDone:o,onError:r}),expect(E).not.toHaveBeenCalled()})),(0,n.it)("surfaces an open-app failure as the device action error",()=>new Promise((o,r)=>{const t=new e.UnknownDAError("open app failed");(0,d.setupOpenAppDAMock)(t);const i=p({...u,skipOpenApp:!1}),s=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(i,s,a,{onDone:o,onError:r}),expect(l).not.toHaveBeenCalled()})),(0,n.it)("surfaces an Edit Scope command error",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t=new S.ContactsCommandError({errorCode:"6982",message:"seed mismatch"});E.mockResolvedValue((0,e.CommandResultFactory)({error:t}));const i=p({...u,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(i,s,a,{onDone:o,onError:r})})),(0,n.it)("surfaces invalid input as a typed error state on the skip-open-app path",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t={...u,skipOpenApp:!0,contactName:""},i=(0,v.validateEditExternalAddressScopeInput)(t),s=p(t),m=[{error:i,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(s,m,a,{onDone:o,onError:r}),expect(l).not.toHaveBeenCalled(),expect(E).not.toHaveBeenCalled()})),(0,n.it)("validates only after opening the app on the default path",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t={...u,skipOpenApp:!1,contactName:""},i=(0,v.validateEditExternalAddressScopeInput)(t),s=p(t),m=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.ConfirmOpenApp},status:e.DeviceActionStatus.Pending},{error:i,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(s,m,a,{onDone:o,onError:r}),expect(E).not.toHaveBeenCalled()})),(0,n.it)("evaluates support from the fresh WaitForAppAndVersion result, not stale session state",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t={name:"Ethereum",version:"9.9.9"};(0,D.setupWaitForAppAndVersionDAMock)(t);const i=p({...u,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(i,s,a,{onDone:()=>{try{expect(l).toHaveBeenCalledWith(t),o()}catch(m){r(m)}},onError:r})})),(0,n.it)("surfaces a WaitForAppAndVersion failure as the device action error",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)();const t=new e.UnknownDAError("could not read app and version");(0,D.setupWaitForAppAndVersionDAMock)({error:t});const i=p({...u,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:t,status:e.DeviceActionStatus.Error}];(0,c.testDeviceActionStates)(i,s,a,{onDone:o,onError:r}),expect(l).not.toHaveBeenCalled(),expect(E).not.toHaveBeenCalled()})),(0,n.it)("propagates the UnlockDevice interaction emitted by WaitForAppAndVersion",()=>new Promise((o,r)=>{(0,d.setupOpenAppDAMock)(),(0,D.setupWaitForAppAndVersionDAMock)(V,e.UserInteractionRequired.UnlockDevice);const t=p({...u,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{output:A,status:e.DeviceActionStatus.Completed}];(0,c.testDeviceActionStates)(t,i,a,{onDone:o,onError:r})}))});
2
- //# sourceMappingURL=EditExternalAddressScopeDeviceAction.test.js.map