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

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 +5 -5
  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
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.ts"],
4
- "sourcesContent": ["import {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type EditExternalAddressScopeDAError,\n type EditExternalAddressScopeDAInput,\n type EditExternalAddressScopeDAIntermediateValue,\n type EditExternalAddressScopeDAOutput,\n} from \"@api/app-binder/EditExternalAddressScopeDeviceActionTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { setupWaitForAppAndVersionDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport {\n ContactsCommandError,\n ContactsVersionRequirementError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { EditExternalAddressScopeDeviceAction } from \"./EditExternalAddressScopeDeviceAction\";\nimport { validateEditExternalAddressScopeInput } from \"./validateEditExternalAddressScopeInput\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n WaitForAppAndVersionDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\nconst FRESH_APP = { name: \"Ethereum\", version: \"1.15.0\" };\n\nconst GROUP_HANDLE = new Uint8Array(64).fill(0xcc);\nconst HMAC_PROOF = new Uint8Array(32).fill(0xdd);\nconst HMAC_REST_OLD = new Uint8Array(32).fill(0xaa);\nconst HMAC_REST_NEW = new Uint8Array(32).fill(0x88);\nconst IDENTIFIER = new Uint8Array(20).fill(0x11);\n\nconst OK_PROOF = { hmacRest: HMAC_REST_NEW };\n\nconst BASE_INPUT = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n newScope: \"Eth cold\",\n identifier: IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF,\n hmacRest: HMAC_REST_OLD,\n appName: \"Ethereum\",\n};\n\nconst EXPECTED_OUTPUT = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n scope: \"Eth cold\",\n identifier: IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n // Preserved: the group-level name proof is unchanged by a scope edit.\n hmacProof: HMAC_PROOF,\n // Rotated: only the address-level proof changes.\n hmacRest: HMAC_REST_NEW,\n};\n\ndescribe(\"EditExternalAddressScopeDeviceAction\", () => {\n let apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\n let isSupportedMock: ReturnType<typeof vi.fn>;\n let editScopeMock: ReturnType<typeof vi.fn>;\n\n function extractDeps() {\n return {\n isSupported: isSupportedMock,\n editScope: editScopeMock,\n };\n }\n\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n setupWaitForAppAndVersionDAMock(FRESH_APP);\n isSupportedMock = vi.fn().mockReturnValue(true);\n editScopeMock = vi\n .fn()\n .mockResolvedValue(CommandResultFactory({ data: OK_PROOF }));\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n });\n\n function makeAction(input: EditExternalAddressScopeDAInput) {\n const action = new EditExternalAddressScopeDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n return action;\n }\n\n it(\"open-app path: OpenApp -> VersionGuard -> EditScope -> Completed\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"skip-open-app path: VersionGuard -> EditScope -> Completed, preserving the group proof and identifier\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n // The device rotates only the address-level hmac_rest; the contact\n // group's name proof and the entry's identifier pass through\n // unchanged.\n expect(EXPECTED_OUTPUT.hmacProof).toBe(HMAC_PROOF);\n expect(EXPECTED_OUTPUT.identifier).toBe(IDENTIFIER);\n expect(EXPECTED_OUTPUT.hmacRest).toBe(HMAC_REST_NEW);\n expect(EXPECTED_OUTPUT.hmacRest).not.toBe(HMAC_REST_OLD);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"version guard rejects on skip-open-app path without running EDIT SCOPE\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n isSupportedMock.mockReturnValue(false);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new ContactsVersionRequirementError(),\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an open-app failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n const openAppError = new UnknownDAError(\"open app failed\");\n setupOpenAppDAMock(openAppError);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: openAppError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an Edit Scope command error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const commandError = new ContactsCommandError({\n errorCode: \"6982\",\n message: \"seed mismatch\",\n });\n editScopeMock.mockResolvedValue(\n CommandResultFactory({ error: commandError }),\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: commandError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"surfaces invalid input as a typed error state on the skip-open-app path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: true,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressScopeInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"validates only after opening the app on the default path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: false,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressScopeInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"evaluates support from the fresh WaitForAppAndVersion result, not stale session state\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const freshApp = { name: \"Ethereum\", version: \"9.9.9\" };\n setupWaitForAppAndVersionDAMock(freshApp);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n expect(isSupportedMock).toHaveBeenCalledWith(freshApp);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a WaitForAppAndVersion failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const waitError = new UnknownDAError(\"could not read app and version\");\n setupWaitForAppAndVersionDAMock({ error: waitError });\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: waitError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"propagates the UnlockDevice interaction emitted by WaitForAppAndVersion\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupWaitForAppAndVersionDAMock(\n FRESH_APP,\n UserInteractionRequired.UnlockDevice,\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_vitest", "import_makeInternalApi", "import_setupOpenAppDAMock", "import_setupWaitForAppAndVersionDAMock", "import_testDeviceActionStates", "import_contactsErrors", "import_EditExternalAddressScopeDeviceAction", "import_validateEditExternalAddressScopeInput", "importOriginal", "FRESH_APP", "GROUP_HANDLE", "HMAC_PROOF", "HMAC_REST_OLD", "HMAC_REST_NEW", "IDENTIFIER", "OK_PROOF", "BASE_INPUT", "EXPECTED_OUTPUT", "apiMock", "isSupportedMock", "editScopeMock", "extractDeps", "makeAction", "input", "action", "resolve", "reject", "expected", "e", "openAppError", "commandError", "invalidInput", "validationError", "freshApp", "waitError"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var n=require("../../../app-binder/model/contactsValidation"),t=require("./validateEditExternalAddressScopeInput");const r={contactName:"Alice",previousScope:"Eth main",newScope:"Eth cold",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n,groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)};describe("validateEditExternalAddressScopeInput",()=>{it("returns null for a valid input",()=>{expect((0,t.validateEditExternalAddressScopeInput)(r)).toBeNull()}),it("rejects an empty contactName",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...r,contactName:""});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects a non-printable previousScope",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...r,previousScope:"caf\xE9"});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects a non-printable newScope",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...r,newScope:"caf\xE9"});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects an unsupported blockchain family",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...r,blockchainFamily:"dogecoin"});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects an identifier of the wrong length for Ethereum",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...r,identifier:new Uint8Array(19).fill(17)});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("requires chainId for the Ethereum family",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...r,chainId:void 0});expect(e).toBeInstanceOf(n.ContactsValidationError)}),describe("Solana",()=>{const e={...r,identifier:new Uint8Array(32).fill(17),blockchainFamily:"solana",chainId:void 0};it("accepts a 32-byte public key without chainId",()=>{expect((0,t.validateEditExternalAddressScopeInput)(e)).toBeNull()}),it("rejects an identifier that is not 32 bytes",()=>{expect((0,t.validateEditExternalAddressScopeInput)({...e,identifier:new Uint8Array(20)})).toBeInstanceOf(n.ContactsValidationError)}),it("rejects a chainId",()=>{expect((0,t.validateEditExternalAddressScopeInput)({...e,chainId:1n})).toBeInstanceOf(n.ContactsValidationError)})}),it("rejects a groupHandle of the wrong length",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...r,groupHandle:new Uint8Array(63).fill(204)});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects an hmacProof of the wrong length",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...r,hmacProof:new Uint8Array(31).fill(221)});expect(e).toBeInstanceOf(n.ContactsValidationError)}),it("rejects an hmacRest of the wrong length",()=>{const e=(0,t.validateEditExternalAddressScopeInput)({...r,hmacRest:new Uint8Array(33).fill(170)});expect(e).toBeInstanceOf(n.ContactsValidationError)})});
2
- //# sourceMappingURL=validateEditExternalAddressScopeInput.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.ts"],
4
- "sourcesContent": ["import { type EditExternalAddressScopeInput } from \"@api/model/EditExternalAddressScope\";\nimport { ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\nimport { validateEditExternalAddressScopeInput } from \"./validateEditExternalAddressScopeInput\";\n\nconst VALID_INPUT: EditExternalAddressScopeInput = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n newScope: \"Eth cold\",\n identifier: new Uint8Array(20).fill(0x11),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\ndescribe(\"validateEditExternalAddressScopeInput\", () => {\n it(\"returns null for a valid input\", () => {\n expect(validateEditExternalAddressScopeInput(VALID_INPUT)).toBeNull();\n });\n\n it(\"rejects an empty contactName\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n contactName: \"\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a non-printable previousScope\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n previousScope: \"caf\u00E9\", // 0xC3 0xA9 is non-ASCII\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a non-printable newScope\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n newScope: \"caf\u00E9\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an unsupported blockchain family\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n blockchainFamily: \"dogecoin\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an identifier of the wrong length for Ethereum\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n identifier: new Uint8Array(19).fill(0x11),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"requires chainId for the Ethereum family\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n chainId: undefined,\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n describe(\"Solana\", () => {\n const SOLANA_INPUT: EditExternalAddressScopeInput = {\n ...VALID_INPUT,\n identifier: new Uint8Array(32).fill(0x11),\n blockchainFamily: \"solana\",\n chainId: undefined,\n };\n\n it(\"accepts a 32-byte public key without chainId\", () => {\n expect(validateEditExternalAddressScopeInput(SOLANA_INPUT)).toBeNull();\n });\n\n it(\"rejects an identifier that is not 32 bytes\", () => {\n expect(\n validateEditExternalAddressScopeInput({\n ...SOLANA_INPUT,\n identifier: new Uint8Array(20),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a chainId\", () => {\n expect(\n validateEditExternalAddressScopeInput({ ...SOLANA_INPUT, chainId: 1n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n });\n\n it(\"rejects a groupHandle of the wrong length\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n groupHandle: new Uint8Array(63).fill(0xcc),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacProof of the wrong length\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n hmacProof: new Uint8Array(31).fill(0xdd),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacRest of the wrong length\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n hmacRest: new Uint8Array(33).fill(0xaa),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_contactsValidation", "import_validateEditExternalAddressScopeInput", "VALID_INPUT", "error", "SOLANA_INPUT"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var e=require("@ledgerhq/device-management-kit"),r=require("vitest"),R=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),c=require("../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock"),E=require("../../../app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock"),p=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),D=require("../../../app-binder/model/contactsErrors"),f=require("./RegisterExternalAddressDeviceAction"),v=require("./validateRegisterExternalAddressInput");r.vi.mock("@ledgerhq/device-management-kit",async o=>({...await o(),OpenAppDeviceAction:r.vi.fn(()=>({makeStateMachine:r.vi.fn()})),WaitForAppAndVersionDeviceAction:r.vi.fn(()=>({makeStateMachine:r.vi.fn()}))}));const x={name:"Ethereum",version:"1.15.0"},g={groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)},s={contactName:"Alice",scope:"Eth main",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n,appName:"Ethereum"};(0,r.describe)("RegisterExternalAddressDeviceAction",()=>{let o,l,A;function I(){return{isSupported:l,registerIdentity:A}}(0,r.beforeEach)(()=>{o=(0,R.makeDeviceActionInternalApiMock)(),(0,E.setupWaitForAppAndVersionDAMock)(x),l=r.vi.fn().mockReturnValue(!0),A=r.vi.fn().mockResolvedValue((0,e.CommandResultFactory)({data:g})),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 u(i){const n=new f.RegisterExternalAddressDeviceAction({input:i});return r.vi.spyOn(n,"extractDependencies").mockReturnValue(I()),n}(0,r.it)("open-app path, new contact group: OpenApp -> VersionGuard -> RegisterIdentity -> Completed",()=>new Promise((i,n)=>{(0,c.setupOpenAppDAMock)();const t=u({...s,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:{mode:"newContactGroup",contactName:"Alice",scope:"Eth main",identifier:s.identifier,blockchainFamily:"ethereum",chainId:1n,...g},status:e.DeviceActionStatus.Completed}];(0,p.testDeviceActionStates)(t,a,o,{onDone:i,onError:n})})),(0,r.it)("skip-open-app path, existing contact group: VersionGuard -> RegisterIdentity -> Completed",()=>new Promise((i,n)=>{(0,c.setupOpenAppDAMock)();const t={groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)},a=u({...s,skipOpenApp:!0,existingContactGroup:t}),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:{mode:"existingContactGroup",contactName:"Alice",scope:"Eth main",identifier:s.identifier,blockchainFamily:"ethereum",chainId:1n,...g},status:e.DeviceActionStatus.Completed}];(0,p.testDeviceActionStates)(a,d,o,{onDone:i,onError:n})})),(0,r.it)("version guard rejects on skip-open-app path without opening the app",()=>new Promise((i,n)=>{(0,c.setupOpenAppDAMock)(),l.mockReturnValue(!1);const t=u({...s,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:new D.ContactsVersionRequirementError,status:e.DeviceActionStatus.Error}];(0,p.testDeviceActionStates)(t,a,o,{onDone:i,onError:n}),expect(A).not.toHaveBeenCalled()})),(0,r.it)("surfaces an open-app failure as the device action error",()=>new Promise((i,n)=>{const t=new e.UnknownDAError("open app failed");(0,c.setupOpenAppDAMock)(t);const a=u({...s,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,p.testDeviceActionStates)(a,d,o,{onDone:i,onError:n}),expect(l).not.toHaveBeenCalled()})),(0,r.it)("surfaces a Register Identity command error",()=>new Promise((i,n)=>{(0,c.setupOpenAppDAMock)();const t=new D.ContactsCommandError({errorCode:"6a80",message:"device rejected"});A.mockResolvedValue((0,e.CommandResultFactory)({error:t}));const a=u({...s,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,p.testDeviceActionStates)(a,d,o,{onDone:i,onError:n})})),(0,r.it)("surfaces invalid input as a typed error state on the skip-open-app path",()=>new Promise((i,n)=>{(0,c.setupOpenAppDAMock)();const t={...s,skipOpenApp:!0,contactName:""},a=(0,v.validateRegisterExternalAddressInput)(t),d=u(t),m=[{error:a,status:e.DeviceActionStatus.Error}];(0,p.testDeviceActionStates)(d,m,o,{onDone:i,onError:n}),expect(l).not.toHaveBeenCalled(),expect(A).not.toHaveBeenCalled()})),(0,r.it)("validates only after opening the app on the default path",()=>new Promise((i,n)=>{(0,c.setupOpenAppDAMock)();const t={...s,skipOpenApp:!1,contactName:""},a=(0,v.validateRegisterExternalAddressInput)(t),d=u(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,p.testDeviceActionStates)(d,m,o,{onDone:i,onError:n}),expect(A).not.toHaveBeenCalled()})),(0,r.it)("evaluates support from the fresh WaitForAppAndVersion result, not stale session state",()=>new Promise((i,n)=>{(0,c.setupOpenAppDAMock)();const t={name:"Ethereum",version:"9.9.9"};(0,E.setupWaitForAppAndVersionDAMock)(t);const a=u({...s,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:{mode:"newContactGroup",contactName:"Alice",scope:"Eth main",identifier:s.identifier,blockchainFamily:"ethereum",chainId:1n,...g},status:e.DeviceActionStatus.Completed}];(0,p.testDeviceActionStates)(a,d,o,{onDone:()=>{try{expect(l).toHaveBeenCalledWith(t),i()}catch(m){n(m)}},onError:n})})),(0,r.it)("surfaces a WaitForAppAndVersion failure as the device action error",()=>new Promise((i,n)=>{(0,c.setupOpenAppDAMock)();const t=new e.UnknownDAError("could not read app and version");(0,E.setupWaitForAppAndVersionDAMock)({error:t});const a=u({...s,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,p.testDeviceActionStates)(a,d,o,{onDone:i,onError:n}),expect(l).not.toHaveBeenCalled(),expect(A).not.toHaveBeenCalled()})),(0,r.it)("propagates the UnlockDevice interaction emitted by WaitForAppAndVersion",()=>new Promise((i,n)=>{(0,c.setupOpenAppDAMock)(),(0,E.setupWaitForAppAndVersionDAMock)(x,e.UserInteractionRequired.UnlockDevice);const t=u({...s,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:{mode:"newContactGroup",contactName:"Alice",scope:"Eth main",identifier:s.identifier,blockchainFamily:"ethereum",chainId:1n,...g},status:e.DeviceActionStatus.Completed}];(0,p.testDeviceActionStates)(t,a,o,{onDone:i,onError:n})}))});
2
- //# sourceMappingURL=RegisterExternalAddressDeviceAction.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.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 RegisterExternalAddressDAError,\n type RegisterExternalAddressDAInput,\n type RegisterExternalAddressDAIntermediateValue,\n type RegisterExternalAddressDAOutput,\n} from \"@api/app-binder/RegisterExternalAddressDeviceActionTypes\";\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 { RegisterExternalAddressDeviceAction } from \"./RegisterExternalAddressDeviceAction\";\nimport { validateRegisterExternalAddressInput } from \"./validateRegisterExternalAddressInput\";\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 OK_PROOFS = {\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\nconst BASE_INPUT = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: new Uint8Array(20).fill(0x11),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n appName: \"Ethereum\",\n};\n\ndescribe(\"RegisterExternalAddressDeviceAction\", () => {\n let apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\n let isSupportedMock: ReturnType<typeof vi.fn>;\n let registerIdentityMock: ReturnType<typeof vi.fn>;\n\n function extractDeps() {\n return {\n isSupported: isSupportedMock,\n registerIdentity: registerIdentityMock,\n };\n }\n\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n setupWaitForAppAndVersionDAMock(FRESH_APP);\n isSupportedMock = vi.fn().mockReturnValue(true);\n registerIdentityMock = vi\n .fn()\n .mockResolvedValue(CommandResultFactory({ data: OK_PROOFS }));\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: RegisterExternalAddressDAInput) {\n const action = new RegisterExternalAddressDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n return action;\n }\n\n it(\"open-app path, new contact group: OpenApp -> VersionGuard -> RegisterIdentity -> 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 // WaitForAppAndVersion phase: entry reset, then the child's silent read\n // re-emits None through onSnapshot propagation.\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: {\n mode: \"newContactGroup\",\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: BASE_INPUT.identifier,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n ...OK_PROOFS,\n },\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"skip-open-app path, existing contact group: VersionGuard -> RegisterIdentity -> Completed\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const existingContactGroup = {\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n };\n const action = makeAction({\n ...BASE_INPUT,\n skipOpenApp: true,\n existingContactGroup,\n });\n\n const expected = [\n // WaitForAppAndVersion phase: entry reset, then the child's silent read\n // re-emits None through onSnapshot propagation.\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: {\n mode: \"existingContactGroup\",\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: BASE_INPUT.identifier,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n ...OK_PROOFS,\n },\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"version guard rejects on skip-open-app path without opening the app\", () =>\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 // WaitForAppAndVersion phase (entry reset + child read) runs before the\n // guard; both reads emit None.\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 RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(registerIdentityMock).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 RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces a Register Identity command error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const commandError = new ContactsCommandError({\n errorCode: \"6a80\",\n message: \"device rejected\",\n });\n registerIdentityMock.mockResolvedValue(\n CommandResultFactory({ error: commandError }),\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n // WaitForAppAndVersion phase: entry reset, then the child's silent read\n // re-emits None through onSnapshot propagation.\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 RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\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 validateRegisterExternalAddressInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n // Validation fails before the version guard and before any APDU.\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(registerIdentityMock).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 validateRegisterExternalAddressInput(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 RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(registerIdentityMock).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 // Session state (from beforeEach) reports version 1.15.0; the fresh read\n // reports a different version, which is what the guard must use.\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 // WaitForAppAndVersion phase: entry reset + child read, both None.\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: {\n mode: \"newContactGroup\",\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: BASE_INPUT.identifier,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n ...OK_PROOFS,\n },\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\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 // WaitForAppAndVersion phase: entry reset + child read, both None,\n // before the child DA surfaces its failure.\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 RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n // The version guard and the APDU are never reached.\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(registerIdentityMock).not.toHaveBeenCalled();\n }));\n\n it(\"propagates the UnlockDevice interaction emitted by WaitForAppAndVersion\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n // Locked device: the child WaitForAppAndVersion DA requests an unlock\n // before it can read the app/version. The parent must surface it so a\n // consuming client can show a \"please unlock your device\" prompt.\n setupWaitForAppAndVersionDAMock(\n FRESH_APP,\n UserInteractionRequired.UnlockDevice,\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n // Entry reset before the child DA runs.\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // Propagated from the child DA: the device needs to be unlocked.\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: {\n mode: \"newContactGroup\",\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: BASE_INPUT.identifier,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n ...OK_PROOFS,\n },\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\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_RegisterExternalAddressDeviceAction", "import_validateRegisterExternalAddressInput", "importOriginal", "FRESH_APP", "OK_PROOFS", "BASE_INPUT", "apiMock", "isSupportedMock", "registerIdentityMock", "extractDeps", "makeAction", "input", "action", "resolve", "reject", "expected", "existingContactGroup", "openAppError", "commandError", "invalidInput", "validationError", "freshApp", "e", "waitError"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var t=require("../../../app-binder/model/contactsValidation"),e=require("./validateRegisterExternalAddressInput");const n={contactName:"Alice",scope:"Eth main",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n};describe("validateRegisterExternalAddressInput",()=>{it("returns null for valid input",()=>{expect((0,e.validateRegisterExternalAddressInput)(n)).toBeNull()}),it("returns null for a valid existing-contact-group input",()=>{expect((0,e.validateRegisterExternalAddressInput)({...n,existingContactGroup:{groupHandle:new Uint8Array(64),hmacProof:new Uint8Array(32)}})).toBeNull()}),it("returns a ContactsValidationError for a non-printable contact name",()=>{expect((0,e.validateRegisterExternalAddressInput)({...n,contactName:"Am\xE9lie"})).toBeInstanceOf(t.ContactsValidationError)}),it("returns an error for an Ethereum identifier of the wrong length",()=>{expect((0,e.validateRegisterExternalAddressInput)({...n,identifier:new Uint8Array(19)})).toBeInstanceOf(t.ContactsValidationError)}),it("returns an error for an unsupported blockchain family",()=>{expect((0,e.validateRegisterExternalAddressInput)({...n,blockchainFamily:"dogecoin"})).toBeInstanceOf(t.ContactsValidationError)}),it("returns an error when chainId is missing for the Ethereum family",()=>{expect((0,e.validateRegisterExternalAddressInput)({...n,chainId:void 0})).toBeInstanceOf(t.ContactsValidationError)}),describe("Solana",()=>{const r={...n,identifier:new Uint8Array(32).fill(17),blockchainFamily:"solana",chainId:void 0};it("returns null for a 32-byte public key without chainId",()=>{expect((0,e.validateRegisterExternalAddressInput)(r)).toBeNull()}),it.each([31,33])("returns an error for a %i-byte identifier",i=>{expect((0,e.validateRegisterExternalAddressInput)({...r,identifier:new Uint8Array(i)})).toBeInstanceOf(t.ContactsValidationError)}),it("returns an error when a chainId is given",()=>{expect((0,e.validateRegisterExternalAddressInput)({...r,chainId:1n})).toBeInstanceOf(t.ContactsValidationError)})}),it("returns an error for a wrong-sized existing group handle",()=>{expect((0,e.validateRegisterExternalAddressInput)({...n,existingContactGroup:{groupHandle:new Uint8Array(32),hmacProof:new Uint8Array(32)}})).toBeInstanceOf(t.ContactsValidationError)})});
2
- //# sourceMappingURL=validateRegisterExternalAddressInput.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.ts"],
4
- "sourcesContent": ["import { type RegisterExternalAddressInput } from \"@api/model/RegisterExternalAddress\";\nimport { ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\nimport { validateRegisterExternalAddressInput } from \"./validateRegisterExternalAddressInput\";\n\nconst VALID_INPUT: RegisterExternalAddressInput = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: new Uint8Array(20).fill(0x11),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n};\n\ndescribe(\"validateRegisterExternalAddressInput\", () => {\n it(\"returns null for valid input\", () => {\n expect(validateRegisterExternalAddressInput(VALID_INPUT)).toBeNull();\n });\n\n it(\"returns null for a valid existing-contact-group input\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n existingContactGroup: {\n groupHandle: new Uint8Array(64),\n hmacProof: new Uint8Array(32),\n },\n }),\n ).toBeNull();\n });\n\n it(\"returns a ContactsValidationError for a non-printable contact name\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n contactName: \"Am\u00E9lie\",\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for an Ethereum identifier of the wrong length\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n identifier: new Uint8Array(19),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for an unsupported blockchain family\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n blockchainFamily: \"dogecoin\",\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error when chainId is missing for the Ethereum family\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n chainId: undefined,\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n describe(\"Solana\", () => {\n const SOLANA_INPUT: RegisterExternalAddressInput = {\n ...VALID_INPUT,\n identifier: new Uint8Array(32).fill(0x11),\n blockchainFamily: \"solana\",\n chainId: undefined,\n };\n\n it(\"returns null for a 32-byte public key without chainId\", () => {\n expect(validateRegisterExternalAddressInput(SOLANA_INPUT)).toBeNull();\n });\n\n it.each([31, 33])(\"returns an error for a %i-byte identifier\", (length) => {\n expect(\n validateRegisterExternalAddressInput({\n ...SOLANA_INPUT,\n identifier: new Uint8Array(length),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error when a chainId is given\", () => {\n expect(\n validateRegisterExternalAddressInput({ ...SOLANA_INPUT, chainId: 1n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n });\n\n it(\"returns an error for a wrong-sized existing group handle\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n existingContactGroup: {\n groupHandle: new Uint8Array(32),\n hmacProof: new Uint8Array(32),\n },\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n});\n"],
5
- "mappings": "aACA,IAAAA,EAAwC,yDAExCC,EAAqD,kDAErD,MAAMC,EAA4C,CAChD,YAAa,QACb,MAAO,WACP,WAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EACxC,iBAAkB,WAClB,QAAS,EACX,EAEA,SAAS,uCAAwC,IAAM,CACrD,GAAG,+BAAgC,IAAM,CACvC,UAAO,wCAAqCA,CAAW,CAAC,EAAE,SAAS,CACrE,CAAC,EAED,GAAG,wDAAyD,IAAM,CAChE,UACE,wCAAqC,CACnC,GAAGA,EACH,qBAAsB,CACpB,YAAa,IAAI,WAAW,EAAE,EAC9B,UAAW,IAAI,WAAW,EAAE,CAC9B,CACF,CAAC,CACH,EAAE,SAAS,CACb,CAAC,EAED,GAAG,qEAAsE,IAAM,CAC7E,UACE,wCAAqC,CACnC,GAAGA,EACH,YAAa,WACf,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,kEAAmE,IAAM,CAC1E,UACE,wCAAqC,CACnC,GAAGA,EACH,WAAY,IAAI,WAAW,EAAE,CAC/B,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,wDAAyD,IAAM,CAChE,UACE,wCAAqC,CACnC,GAAGA,EACH,iBAAkB,UACpB,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,mEAAoE,IAAM,CAC3E,UACE,wCAAqC,CACnC,GAAGA,EACH,QAAS,MACX,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,SAAS,SAAU,IAAM,CACvB,MAAMC,EAA6C,CACjD,GAAGD,EACH,WAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EACxC,iBAAkB,SAClB,QAAS,MACX,EAEA,GAAG,wDAAyD,IAAM,CAChE,UAAO,wCAAqCC,CAAY,CAAC,EAAE,SAAS,CACtE,CAAC,EAED,GAAG,KAAK,CAAC,GAAI,EAAE,CAAC,EAAE,4CAA8CC,GAAW,CACzE,UACE,wCAAqC,CACnC,GAAGD,EACH,WAAY,IAAI,WAAWC,CAAM,CACnC,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,UACE,wCAAqC,CAAE,GAAGD,EAAc,QAAS,EAAG,CAAC,CACvE,EAAE,eAAe,yBAAuB,CAC1C,CAAC,CACH,CAAC,EAED,GAAG,2DAA4D,IAAM,CACnE,UACE,wCAAqC,CACnC,GAAGD,EACH,qBAAsB,CACpB,YAAa,IAAI,WAAW,EAAE,EAC9B,UAAW,IAAI,WAAW,EAAE,CAC9B,CACF,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,CACH,CAAC",
6
- "names": ["import_contactsValidation", "import_validateRegisterExternalAddressInput", "VALID_INPUT", "SOLANA_INPUT", "length"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var e=require("@ledgerhq/device-management-kit"),t=require("vitest"),R=require("../../../app-binder/device-action/__test-utils__/makeInternalApi"),d=require("../../../app-binder/device-action/__test-utils__/setupGoToDashboardDAMock"),u=require("../../../app-binder/device-action/__test-utils__/testDeviceActionStates"),D=require("../../../app-binder/model/contactsErrors"),V=require("./RenameContactDeviceAction"),I=require("./validateRenameContactInput");t.vi.mock("@ledgerhq/device-management-kit",async a=>({...await a(),GoToDashboardDeviceAction:t.vi.fn(()=>({makeStateMachine:t.vi.fn()})),OpenAppDeviceAction:t.vi.fn(()=>({makeStateMachine:t.vi.fn()}))}));const f={hmacProof:new Uint8Array(32).fill(238)},C="1.7.0",c={previousContactName:"Alice",newContactName:"Bob",groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)},A={previousContactName:"Alice",contactName:"Bob",groupHandle:c.groupHandle,hmacProof:f.hmacProof};(0,t.describe)("RenameContactDeviceAction",()=>{let a,s,l,m;function g(){return{getOsVersion:s,isOsVersionSupported:l,renameContact:m}}(0,t.beforeEach)(()=>{t.vi.clearAllMocks(),a=(0,R.makeDeviceActionInternalApiMock)(),s=t.vi.fn().mockResolvedValue((0,e.CommandResultFactory)({data:{seVersion:C}})),l=t.vi.fn().mockReturnValue(!0),m=t.vi.fn().mockResolvedValue((0,e.CommandResultFactory)({data:f})),a.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"BOLOS",version:"1.7.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!0})});function v(o){const r=new V.RenameContactDeviceAction({input:o});return t.vi.spyOn(r,"extractDependencies").mockReturnValue(g()),r}(0,t.it)("navigates to the dashboard, reads the OS freshly, renames, and completes",()=>new Promise((o,r)=>{(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice});const n=v(c),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},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,u.testDeviceActionStates)(n,i,a,{onDone:()=>{(0,t.expect)(e.GoToDashboardDeviceAction).toHaveBeenCalled(),(0,t.expect)(e.OpenAppDeviceAction).not.toHaveBeenCalled(),(0,t.expect)(s).toHaveBeenCalled(),(0,t.expect)(l).toHaveBeenCalledWith(C),o()},onError:r})})),(0,t.it)("succeeds when an app was open at start, gating on the freshly-read OS",()=>new Promise((o,r)=>{a.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.23.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!0}),(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice});const n=v(c),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},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,u.testDeviceActionStates)(n,i,a,{onDone:()=>{(0,t.expect)(s).toHaveBeenCalled(),(0,t.expect)(l).toHaveBeenCalledWith(C),o()},onError:r})})),(0,t.it)("rejects on an unsupported OS version without sending the APDU",()=>new Promise((o,r)=>{(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice}),l.mockReturnValue(!1);const n=v(c),i=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:new D.ContactsVersionRequirementError,status:e.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(n,i,a,{onDone:()=>{(0,t.expect)(s).toHaveBeenCalled(),(0,t.expect)(l).toHaveBeenCalledWith(C),(0,t.expect)(m).not.toHaveBeenCalled(),(0,t.expect)(e.OpenAppDeviceAction).not.toHaveBeenCalled(),o()},onError:r})})),(0,t.it)("surfaces a go-to-dashboard failure as the device action error",()=>new Promise((o,r)=>{const n=new e.UnknownDAError("go to dashboard failed");(0,d.setupGoToDashboardDAMock)({error:n,requiredUserInteraction:e.UserInteractionRequired.UnlockDevice});const i=v(c),p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{error:n,status:e.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(i,p,a,{onDone:()=>{(0,t.expect)(s).not.toHaveBeenCalled(),(0,t.expect)(l).not.toHaveBeenCalled(),(0,t.expect)(m).not.toHaveBeenCalled(),o()},onError:r})})),(0,t.it)("surfaces a rename command error (e.g. seed mismatch)",()=>new Promise((o,r)=>{(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice});const n=new D.ContactsCommandError({errorCode:"6982",message:"wrong seed"});m.mockResolvedValue((0,e.CommandResultFactory)({error:n}));const i=v(c),p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.RegisterWallet},status:e.DeviceActionStatus.Pending},{error:n,status:e.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(i,p,a,{onDone:o,onError:r})})),(0,t.it)("surfaces invalid input as a typed error after reaching the dashboard",()=>new Promise((o,r)=>{(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice});const n={...c,newContactName:""},i=(0,I.validateRenameContactInput)(n),p=v(n),h=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{error:i,status:e.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(p,h,a,{onDone:()=>{(0,t.expect)(s).not.toHaveBeenCalled(),(0,t.expect)(l).not.toHaveBeenCalled(),(0,t.expect)(m).not.toHaveBeenCalled(),o()},onError:r})})),(0,t.it)("surfaces a GetOsVersion failure as the command error, not a version error",()=>new Promise((o,r)=>{(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice});const n=new D.ContactsCommandError({errorCode:"6f00",message:"GetOsVersion failed"});s.mockResolvedValue((0,e.CommandResultFactory)({error:n}));const i=v(c),p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:n,status:e.DeviceActionStatus.Error}];(0,u.testDeviceActionStates)(i,p,a,{onDone:()=>{(0,t.expect)(l).not.toHaveBeenCalled(),(0,t.expect)(m).not.toHaveBeenCalled(),o()},onError:r})}));const U=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.UnlockDevice},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,t.it)("sends the derivation path when the fresh OS is below the model cutoff (rc2)",()=>new Promise((o,r)=>{(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice}),s.mockResolvedValue((0,e.CommandResultFactory)({data:{seVersion:"1.7.0-rc2"}}));const n=v(c);(0,u.testDeviceActionStates)(n,U,a,{onDone:()=>{(0,t.expect)(m).toHaveBeenCalledWith(c,!0),o()},onError:r})})),(0,t.it)("omits the derivation path when the fresh OS is at/after the cutoff (rc3/GA)",()=>new Promise((o,r)=>{(0,d.setupGoToDashboardDAMock)({requiredUserInteraction:e.UserInteractionRequired.UnlockDevice}),s.mockResolvedValue((0,e.CommandResultFactory)({data:{seVersion:"1.7.0-rc3"}}));const n=v(c);(0,u.testDeviceActionStates)(n,U,a,{onDone:()=>{(0,t.expect)(m).toHaveBeenCalledWith(c,!1),o()},onError:r})}))});
2
- //# sourceMappingURL=RenameContactDeviceAction.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.ts"],
4
- "sourcesContent": ["import {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n GoToDashboardDeviceAction,\n OpenAppDeviceAction,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport {\n type RenameContactDAError,\n type RenameContactDAInput,\n type RenameContactDAIntermediateValue,\n type RenameContactDAOutput,\n} from \"@api/app-binder/RenameContactDeviceActionTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupGoToDashboardDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport {\n ContactsCommandError,\n ContactsVersionRequirementError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { RenameContactDeviceAction } from \"./RenameContactDeviceAction\";\nimport { validateRenameContactInput } from \"./validateRenameContactInput\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n GoToDashboardDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\nconst OK_PROOF = { hmacProof: new Uint8Array(32).fill(0xee) };\n\n// The OS version the device returns freshly via GetOsVersion after the\n// dashboard is reached. The version guard must be fed *this*, not session state.\nconst FRESH_OS_VERSION = \"1.7.0\";\n\nconst BASE_INPUT: RenameContactDAInput = {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n};\n\nconst EXPECTED_OUTPUT: RenameContactDAOutput = {\n previousContactName: \"Alice\",\n contactName: \"Bob\",\n groupHandle: BASE_INPUT.groupHandle,\n hmacProof: OK_PROOF.hmacProof,\n};\n\ndescribe(\"RenameContactDeviceAction\", () => {\n let apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\n let getOsVersionMock: ReturnType<typeof vi.fn>;\n let isOsVersionSupportedMock: ReturnType<typeof vi.fn>;\n let renameContactMock: ReturnType<typeof vi.fn>;\n\n function extractDeps() {\n return {\n getOsVersion: getOsVersionMock,\n isOsVersionSupported: isOsVersionSupportedMock,\n renameContact: renameContactMock,\n };\n }\n\n beforeEach(() => {\n vi.clearAllMocks();\n apiMock = makeDeviceActionInternalApiMock();\n getOsVersionMock = vi\n .fn()\n .mockResolvedValue(\n CommandResultFactory({ data: { seVersion: FRESH_OS_VERSION } }),\n );\n isOsVersionSupportedMock = vi.fn().mockReturnValue(true);\n renameContactMock = vi\n .fn()\n .mockResolvedValue(CommandResultFactory({ data: OK_PROOF }));\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"BOLOS\", version: \"1.7.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n });\n\n function makeAction(input: RenameContactDAInput) {\n const action = new RenameContactDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n return action;\n }\n\n it(\"navigates to the dashboard, reads the OS freshly, renames, and completes\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetOsVersion clears the stale UnlockDevice interaction: one\n // `pending / none` step before the rename prompt.\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 RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n // Rename is a dashboard op: it navigates to the dashboard and never\n // opens an app.\n expect(GoToDashboardDeviceAction).toHaveBeenCalled();\n expect(OpenAppDeviceAction).not.toHaveBeenCalled();\n // The OS version is read freshly and fed to the guard \u2014 not the\n // session state.\n expect(getOsVersionMock).toHaveBeenCalled();\n expect(isOsVersionSupportedMock).toHaveBeenCalledWith(\n FRESH_OS_VERSION,\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"succeeds when an app was open at start, gating on the freshly-read OS\", () =>\n new Promise<void>((resolve, reject) => {\n // An app (Ethereum) is running when rename begins \u2014 the scenario that\n // left firmwareVersion absent and made the bug look intermittent. Rename\n // must still succeed by reading the OS version fresh after the dashboard.\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.23.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.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 RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n expect(getOsVersionMock).toHaveBeenCalled();\n expect(isOsVersionSupportedMock).toHaveBeenCalledWith(\n FRESH_OS_VERSION,\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"rejects on an unsupported OS version without sending the APDU\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n isOsVersionSupportedMock.mockReturnValue(false);\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n 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 RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n // The fresh OS version was read and gated on.\n expect(getOsVersionMock).toHaveBeenCalled();\n expect(isOsVersionSupportedMock).toHaveBeenCalledWith(\n FRESH_OS_VERSION,\n );\n expect(renameContactMock).not.toHaveBeenCalled();\n expect(OpenAppDeviceAction).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a go-to-dashboard failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n const dashboardError = new UnknownDAError(\"go to dashboard failed\");\n setupGoToDashboardDAMock({\n error: dashboardError,\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: dashboardError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n expect(getOsVersionMock).not.toHaveBeenCalled();\n expect(isOsVersionSupportedMock).not.toHaveBeenCalled();\n expect(renameContactMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a rename command error (e.g. seed mismatch)\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const commandError = new ContactsCommandError({\n errorCode: \"6982\",\n message: \"wrong seed\",\n });\n renameContactMock.mockResolvedValue(\n CommandResultFactory({ error: commandError }),\n );\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.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 RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"surfaces invalid input as a typed error after reaching the dashboard\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const invalidInput = { ...BASE_INPUT, newContactName: \"\" };\n const validationError = validateRenameContactInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n // Validation fails before the OS is read, the version guard, and any\n // APDU.\n expect(getOsVersionMock).not.toHaveBeenCalled();\n expect(isOsVersionSupportedMock).not.toHaveBeenCalled();\n expect(renameContactMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a GetOsVersion failure as the command error, not a version error\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const osVersionError = new ContactsCommandError({\n errorCode: \"6f00\",\n message: \"GetOsVersion failed\",\n });\n getOsVersionMock.mockResolvedValue(\n CommandResultFactory({ error: osVersionError }),\n );\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: osVersionError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n // The version guard is never consulted, and the rename APDU is never\n // sent: the raw command error propagates instead of a\n // ContactsVersionRequirementError.\n expect(isOsVersionSupportedMock).not.toHaveBeenCalled();\n expect(renameContactMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n // DSDK-1481: the derivation-path flag is derived from the fresh OS version +\n // the (real) requirements table. deviceModelId is FLEX (cutoff 1.7.0-rc3).\n const SUCCESS_STATES = [\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.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n { output: EXPECTED_OUTPUT, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n it(\"sends the derivation path when the fresh OS is below the model cutoff (rc2)\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n getOsVersionMock.mockResolvedValue(\n CommandResultFactory({ data: { seVersion: \"1.7.0-rc2\" } }),\n );\n const action = makeAction(BASE_INPUT);\n\n testDeviceActionStates(action, SUCCESS_STATES, apiMock, {\n onDone: () => {\n expect(renameContactMock).toHaveBeenCalledWith(BASE_INPUT, true);\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"omits the derivation path when the fresh OS is at/after the cutoff (rc3/GA)\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n getOsVersionMock.mockResolvedValue(\n CommandResultFactory({ data: { seVersion: \"1.7.0-rc3\" } }),\n );\n const action = makeAction(BASE_INPUT);\n\n testDeviceActionStates(action, SUCCESS_STATES, apiMock, {\n onDone: () => {\n expect(renameContactMock).toHaveBeenCalledWith(BASE_INPUT, false);\n resolve();\n },\n onError: reject,\n });\n }));\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_vitest", "import_makeInternalApi", "import_setupGoToDashboardDAMock", "import_testDeviceActionStates", "import_contactsErrors", "import_RenameContactDeviceAction", "import_validateRenameContactInput", "importOriginal", "OK_PROOF", "FRESH_OS_VERSION", "BASE_INPUT", "EXPECTED_OUTPUT", "apiMock", "getOsVersionMock", "isOsVersionSupportedMock", "renameContactMock", "extractDeps", "makeAction", "input", "action", "resolve", "reject", "expected", "dashboardError", "commandError", "invalidInput", "validationError", "osVersionError", "SUCCESS_STATES"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var n=require("../../../app-binder/model/contactsValidation"),t=require("./validateRenameContactInput");const e={previousContactName:"Alice",newContactName:"Bob",groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)};describe("validateRenameContactInput",()=>{it("returns null for valid input",()=>{expect((0,t.validateRenameContactInput)(e)).toBeNull()}),it("returns a ContactsValidationError for a non-printable new name",()=>{expect((0,t.validateRenameContactInput)({...e,newContactName:"Am\xE9lie"})).toBeInstanceOf(n.ContactsValidationError)}),it("returns a ContactsValidationError for a non-printable previous name",()=>{expect((0,t.validateRenameContactInput)({...e,previousContactName:"Am\xE9lie"})).toBeInstanceOf(n.ContactsValidationError)}),it("returns an error for an empty new name",()=>{expect((0,t.validateRenameContactInput)({...e,newContactName:""})).toBeInstanceOf(n.ContactsValidationError)}),it("returns an error for a group handle of the wrong length",()=>{expect((0,t.validateRenameContactInput)({...e,groupHandle:new Uint8Array(63)})).toBeInstanceOf(n.ContactsValidationError)}),it("returns an error for an hmac proof of the wrong length",()=>{expect((0,t.validateRenameContactInput)({...e,hmacProof:new Uint8Array(31)})).toBeInstanceOf(n.ContactsValidationError)})});
2
- //# sourceMappingURL=validateRenameContactInput.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.ts"],
4
- "sourcesContent": ["import { type RenameContactInput } from \"@api/model/RenameContact\";\nimport { ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\nimport { validateRenameContactInput } from \"./validateRenameContactInput\";\n\nconst VALID_INPUT: RenameContactInput = {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n};\n\ndescribe(\"validateRenameContactInput\", () => {\n it(\"returns null for valid input\", () => {\n expect(validateRenameContactInput(VALID_INPUT)).toBeNull();\n });\n\n it(\"returns a ContactsValidationError for a non-printable new name\", () => {\n expect(\n validateRenameContactInput({ ...VALID_INPUT, newContactName: \"Am\u00E9lie\" }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns a ContactsValidationError for a non-printable previous name\", () => {\n expect(\n validateRenameContactInput({\n ...VALID_INPUT,\n previousContactName: \"Am\u00E9lie\",\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for an empty new name\", () => {\n expect(\n validateRenameContactInput({ ...VALID_INPUT, newContactName: \"\" }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for a group handle of the wrong length\", () => {\n expect(\n validateRenameContactInput({\n ...VALID_INPUT,\n groupHandle: new Uint8Array(63),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for an hmac proof of the wrong length\", () => {\n expect(\n validateRenameContactInput({\n ...VALID_INPUT,\n hmacProof: new Uint8Array(31),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n});\n"],
5
- "mappings": "aACA,IAAAA,EAAwC,yDAExCC,EAA2C,wCAE3C,MAAMC,EAAkC,CACtC,oBAAqB,QACrB,eAAgB,MAChB,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACzC,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACzC,EAEA,SAAS,6BAA8B,IAAM,CAC3C,GAAG,+BAAgC,IAAM,CACvC,UAAO,8BAA2BA,CAAW,CAAC,EAAE,SAAS,CAC3D,CAAC,EAED,GAAG,iEAAkE,IAAM,CACzE,UACE,8BAA2B,CAAE,GAAGA,EAAa,eAAgB,WAAS,CAAC,CACzE,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,sEAAuE,IAAM,CAC9E,UACE,8BAA2B,CACzB,GAAGA,EACH,oBAAqB,WACvB,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,yCAA0C,IAAM,CACjD,UACE,8BAA2B,CAAE,GAAGA,EAAa,eAAgB,EAAG,CAAC,CACnE,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,0DAA2D,IAAM,CAClE,UACE,8BAA2B,CACzB,GAAGA,EACH,YAAa,IAAI,WAAW,EAAE,CAChC,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,EAED,GAAG,yDAA0D,IAAM,CACjE,UACE,8BAA2B,CACzB,GAAGA,EACH,UAAW,IAAI,WAAW,EAAE,CAC9B,CAAC,CACH,EAAE,eAAe,yBAAuB,CAC1C,CAAC,CACH,CAAC",
6
- "names": ["import_contactsValidation", "import_validateRenameContactInput", "VALID_INPUT"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var r=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},s=(n,e,t,v)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of f(e))!a.call(n,i)&&i!==t&&r(n,i,{get:()=>e[i],enumerable:!(v=o(e,i))||v.enumerable});return n};var d=n=>s(r({},"__esModule",{value:!0}),n);var p={};c(p,{makeDeviceActionInternalApiMock:()=>g});module.exports=d(p);function g(){return{sendApdu:vi.fn(),sendCommand:vi.fn().mockResolvedValue(void 0),getDeviceModel:vi.fn(),getDeviceSessionState:vi.fn(),getDeviceSessionStateObservable:vi.fn(),setDeviceSessionState:vi.fn(),getManagerApiService:vi.fn(),getSecureChannelService:vi.fn(),loggerFactory:vi.fn(n=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]}))}}0&&(module.exports={makeDeviceActionInternalApiMock});
2
- //# sourceMappingURL=makeInternalApi.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/makeInternalApi.ts"],
4
- "sourcesContent": ["import { type InternalApi } from \"@ledgerhq/device-management-kit\";\nimport { type Mocked } from \"vitest\";\n\nexport function makeDeviceActionInternalApiMock(): Mocked<InternalApi> {\n return {\n sendApdu: vi.fn(),\n sendCommand: vi.fn().mockResolvedValue(undefined),\n getDeviceModel: vi.fn(),\n getDeviceSessionState: vi.fn(),\n getDeviceSessionStateObservable: vi.fn(),\n setDeviceSessionState: vi.fn(),\n getManagerApiService: vi.fn(),\n getSecureChannelService: vi.fn(),\n loggerFactory: vi.fn((_tag: string) => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n })),\n };\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GAGO,SAASE,GAAuD,CACrE,MAAO,CACL,SAAU,GAAG,GAAG,EAChB,YAAa,GAAG,GAAG,EAAE,kBAAkB,MAAS,EAChD,eAAgB,GAAG,GAAG,EACtB,sBAAuB,GAAG,GAAG,EAC7B,gCAAiC,GAAG,GAAG,EACvC,sBAAuB,GAAG,GAAG,EAC7B,qBAAsB,GAAG,GAAG,EAC5B,wBAAyB,GAAG,GAAG,EAC/B,cAAe,GAAG,GAAIE,IAAkB,CACtC,MAAO,GAAG,GAAG,EACb,KAAM,GAAG,GAAG,EACZ,KAAM,GAAG,GAAG,EACZ,MAAO,GAAG,GAAG,EACb,YAAa,CAAC,CAChB,EAAE,CACJ,CACF",
6
- "names": ["makeInternalApi_exports", "__export", "makeDeviceActionInternalApiMock", "__toCommonJS", "_tag"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var c=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var u=(e,r)=>{for(var n in r)c(e,n,{get:r[n],enumerable:!0})},f=(e,r,n,m)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of s(r))!p.call(e,t)&&t!==n&&c(e,t,{get:()=>r[t],enumerable:!(m=d(r,t))||m.enumerable});return e};var k=e=>f(c({},"__esModule",{value:!0}),e);var h={};u(h,{setupGoToDashboardDAMock:()=>I});module.exports=k(h);var o=require("@ledgerhq/device-management-kit"),i=require("purify-ts"),a=require("xstate");const I=(e={})=>{const r=e.requiredUserInteraction??o.UserInteractionRequired.None;o.GoToDashboardDeviceAction.mockImplementation(()=>({makeStateMachine:vi.fn().mockImplementation(()=>(0,a.createMachine)({initial:"pending",states:{pending:{entry:(0,a.assign)({intermediateValue:{requiredUserInteraction:r}}),after:{0:"done"}},done:{type:"final"}},output:()=>e.error?(0,i.Left)(e.error):(0,i.Right)(void 0)}))}))};0&&(module.exports={setupGoToDashboardDAMock});
2
- //# sourceMappingURL=setupGoToDashboardDAMock.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.ts"],
4
- "sourcesContent": ["import {\n GoToDashboardDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { type Mock } from \"vitest\";\nimport { assign, createMachine } from \"xstate\";\n\n/**\n * Mock GoToDashboardDeviceAction to resolve immediately with either success\n * (default) or an error. Emits a single `requiredUserInteraction` snapshot\n * (default `None` \u2014 device assumed unlocked and already ready) so the parent\n * action can surface it, mirroring the real nested device action.\n */\nexport const setupGoToDashboardDAMock = (\n options: {\n error?: unknown;\n requiredUserInteraction?: UserInteractionRequired;\n } = {},\n) => {\n const interaction =\n options.requiredUserInteraction ?? UserInteractionRequired.None;\n (GoToDashboardDeviceAction as Mock).mockImplementation(() => ({\n makeStateMachine: vi.fn().mockImplementation(() =>\n createMachine({\n initial: \"pending\",\n states: {\n pending: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: interaction,\n },\n }),\n after: {\n 0: \"done\",\n },\n },\n done: {\n type: \"final\",\n },\n },\n output: () => (options.error ? Left(options.error) : Right(undefined)),\n }),\n ),\n }));\n};\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,2CACPC,EAA4B,qBAE5BC,EAAsC,kBAQ/B,MAAMJ,EAA2B,CACtCK,EAGI,CAAC,IACF,CACH,MAAMC,EACJD,EAAQ,yBAA2B,0BAAwB,KAC5D,4BAAmC,mBAAmB,KAAO,CAC5D,iBAAkB,GAAG,GAAG,EAAE,mBAAmB,OAC3C,iBAAc,CACZ,QAAS,UACT,OAAQ,CACN,QAAS,CACP,SAAO,UAAO,CACZ,kBAAmB,CACjB,wBAAyBC,CAC3B,CACF,CAAC,EACD,MAAO,CACL,EAAG,MACL,CACF,EACA,KAAM,CACJ,KAAM,OACR,CACF,EACA,OAAQ,IAAOD,EAAQ,SAAQ,QAAKA,EAAQ,KAAK,KAAI,SAAM,MAAS,CACtE,CAAC,CACH,CACF,EAAE,CACJ",
6
- "names": ["setupGoToDashboardDAMock_exports", "__export", "setupGoToDashboardDAMock", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "options", "interaction"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var a=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var s=(e,n)=>{for(var i in n)a(e,i,{get:n[i],enumerable:!0})},u=(e,n,i,m)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of f(n))!d.call(e,t)&&t!==i&&a(e,t,{get:()=>n[t],enumerable:!(m=c(n,t))||m.enumerable});return e};var k=e=>u(a({},"__esModule",{value:!0}),e);var A={};s(A,{setupOpenAppDAMock:()=>l});module.exports=k(A);var o=require("@ledgerhq/device-management-kit"),p=require("purify-ts"),r=require("xstate");const l=e=>{o.OpenAppDeviceAction.mockImplementation(()=>({makeStateMachine:vi.fn().mockImplementation(()=>(0,r.createMachine)({initial:"pending",states:{pending:{entry:(0,r.assign)({intermediateValue:{requiredUserInteraction:o.UserInteractionRequired.ConfirmOpenApp}}),after:{0:"done"}},done:{type:"final"}},output:()=>e?(0,p.Left)(e):(0,p.Right)(void 0)}))}))};0&&(module.exports={setupOpenAppDAMock});
2
- //# sourceMappingURL=setupOpenAppDAMock.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.ts"],
4
- "sourcesContent": ["import {\n OpenAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { type Mock } from \"vitest\";\nimport { assign, createMachine } from \"xstate\";\n\nexport const setupOpenAppDAMock = (error?: unknown) => {\n (OpenAppDeviceAction as Mock).mockImplementation(() => ({\n makeStateMachine: vi.fn().mockImplementation(() =>\n createMachine({\n initial: \"pending\",\n states: {\n pending: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n }),\n after: {\n 0: \"done\",\n },\n },\n done: {\n type: \"final\",\n },\n },\n output: () => (error ? Left(error) : Right(undefined)),\n }),\n ),\n }));\n};\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,2CACPC,EAA4B,qBAE5BC,EAAsC,kBAE/B,MAAMJ,EAAsBK,GAAoB,CACpD,sBAA6B,mBAAmB,KAAO,CACtD,iBAAkB,GAAG,GAAG,EAAE,mBAAmB,OAC3C,iBAAc,CACZ,QAAS,UACT,OAAQ,CACN,QAAS,CACP,SAAO,UAAO,CACZ,kBAAmB,CACjB,wBAAyB,0BAAwB,cACnD,CACF,CAAC,EACD,MAAO,CACL,EAAG,MACL,CACF,EACA,KAAM,CACJ,KAAM,OACR,CACF,EACA,OAAQ,IAAOA,KAAQ,QAAKA,CAAK,KAAI,SAAM,MAAS,CACtD,CAAC,CACH,CACF,EAAE,CACJ",
6
- "names": ["setupOpenAppDAMock_exports", "__export", "setupOpenAppDAMock", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "error"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var a=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var f=(e,n)=>{for(var o in n)a(e,o,{get:n[o],enumerable:!0})},k=(e,n,o,m)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of s(n))!d.call(e,t)&&t!==o&&a(e,t,{get:()=>n[t],enumerable:!(m=c(n,t))||m.enumerable});return e};var u=e=>k(a({},"__esModule",{value:!0}),e);var g={};f(g,{setupWaitForAppAndVersionDAMock:()=>A});module.exports=u(g);var r=require("@ledgerhq/device-management-kit"),i=require("purify-ts"),p=require("xstate");const A=(e={name:"Ethereum",version:"1.15.0"},n=r.UserInteractionRequired.None)=>{r.WaitForAppAndVersionDeviceAction.mockImplementation(()=>({makeStateMachine:vi.fn().mockImplementation(()=>(0,p.createMachine)({initial:"pending",context:{intermediateValue:{requiredUserInteraction:n}},states:{pending:{after:{0:"done"}},done:{type:"final"}},output:()=>"error"in e?(0,i.Left)(e.error):(0,i.Right)(e)}))}))};0&&(module.exports={setupWaitForAppAndVersionDAMock});
2
- //# sourceMappingURL=setupWaitForAppAndVersionDAMock.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.ts"],
4
- "sourcesContent": ["import {\n UserInteractionRequired,\n WaitForAppAndVersionDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { type Mock } from \"vitest\";\nimport { createMachine } from \"xstate\";\n\n/**\n * Mock WaitForAppAndVersionDeviceAction to resolve immediately with either a\n * fresh `{ name, version }` (default) or an error.\n *\n * The mock machine carries an `intermediateValue` in its context (matching the\n * real DA) so the parent's onSnapshot propagation has a defined value to read.\n * Pass `requiredUserInteraction` to have the child emit an interaction (e.g.\n * UnlockDevice for a locked device) before completing.\n */\nexport const setupWaitForAppAndVersionDAMock = (\n result: { name: string; version: string } | { error: unknown } = {\n name: \"Ethereum\",\n version: \"1.15.0\",\n },\n requiredUserInteraction: UserInteractionRequired = UserInteractionRequired.None,\n) => {\n (WaitForAppAndVersionDeviceAction as Mock).mockImplementation(() => ({\n makeStateMachine: vi.fn().mockImplementation(() =>\n createMachine({\n initial: \"pending\",\n context: {\n intermediateValue: { requiredUserInteraction },\n },\n states: {\n pending: {\n after: {\n 0: \"done\",\n },\n },\n done: {\n type: \"final\",\n },\n },\n output: () => (\"error\" in result ? Left(result.error) : Right(result)),\n }),\n ),\n }));\n};\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,2CACPC,EAA4B,qBAE5BC,EAA8B,kBAWvB,MAAMJ,EAAkC,CAC7CK,EAAiE,CAC/D,KAAM,WACN,QAAS,QACX,EACAC,EAAmD,0BAAwB,OACxE,CACF,mCAA0C,mBAAmB,KAAO,CACnE,iBAAkB,GAAG,GAAG,EAAE,mBAAmB,OAC3C,iBAAc,CACZ,QAAS,UACT,QAAS,CACP,kBAAmB,CAAE,wBAAAA,CAAwB,CAC/C,EACA,OAAQ,CACN,QAAS,CACP,MAAO,CACL,EAAG,MACL,CACF,EACA,KAAM,CACJ,KAAM,OACR,CACF,EACA,OAAQ,IAAO,UAAWD,KAAS,QAAKA,EAAO,KAAK,KAAI,SAAMA,CAAM,CACtE,CAAC,CACH,CACF,EAAE,CACJ",
6
- "names": ["setupWaitForAppAndVersionDAMock_exports", "__export", "setupWaitForAppAndVersionDAMock", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "result", "requiredUserInteraction"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var c=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var A=(t,e)=>{for(var o in e)c(t,o,{get:e[o],enumerable:!0})},d=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of l(e))!v.call(t,r)&&r!==o&&c(t,r,{get:()=>e[r],enumerable:!(i=s(e,r))||i.enumerable});return t};var m=t=>d(c({},"__esModule",{value:!0}),t);var I={};A(I,{testDeviceActionStates:()=>D});module.exports=m(I);function D(t,e,o,{onDone:i,onError:r}){const a=[],{observable:u,cancel:p}=t._execute(o);return u.subscribe({next:n=>{a.push(n)},error:n=>{r(n)},complete:()=>{try{expect(a).toEqual(e),i()}catch(n){r(n)}}}),{observable:u,cancel:p}}0&&(module.exports={testDeviceActionStates});
2
- //# sourceMappingURL=testDeviceActionStates.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.ts"],
4
- "sourcesContent": ["import {\n type DeviceAction,\n type DeviceActionIntermediateValue,\n type DeviceActionState,\n type DmkError,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\n\n/**\n * Test that the states emitted by a device action match the expected states.\n * @param deviceAction The device action to test.\n * @param expectedStates The expected states.\n * @param callbacks { onDone, onError } The callbacks to call when the test is done or an error occurs.\n */\nexport function testDeviceActionStates<\n Output,\n Input,\n Error extends DmkError,\n IntermediateValue extends DeviceActionIntermediateValue,\n>(\n deviceAction: DeviceAction<Output, Input, Error, IntermediateValue>,\n expectedStates: Array<DeviceActionState<Output, Error, IntermediateValue>>,\n internalApi: InternalApi,\n {\n onDone,\n onError,\n }: {\n onDone: () => void;\n onError: (error: Error) => void;\n },\n) {\n const observedStates: Array<\n DeviceActionState<Output, Error, IntermediateValue>\n > = [];\n\n const { observable, cancel } = deviceAction._execute(internalApi);\n observable.subscribe({\n next: (state) => {\n observedStates.push(state);\n },\n error: (error) => {\n onError(error);\n },\n complete: () => {\n try {\n expect(observedStates).toEqual(expectedStates);\n onDone();\n } catch (e) {\n onError(e as Error);\n }\n },\n });\n return { observable, cancel };\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAcO,SAASE,EAMdE,EACAC,EACAC,EACA,CACE,OAAAC,EACA,QAAAC,CACF,EAIA,CACA,MAAMC,EAEF,CAAC,EAEC,CAAE,WAAAC,EAAY,OAAAC,CAAO,EAAIP,EAAa,SAASE,CAAW,EAChE,OAAAI,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfH,EAAe,KAAKG,CAAK,CAC3B,EACA,MAAQC,GAAU,CAChBL,EAAQK,CAAK,CACf,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOJ,CAAc,EAAE,QAAQJ,CAAc,EAC7CE,EAAO,CACT,OAASO,EAAG,CACVN,EAAQM,CAAU,CACpB,CACF,CACF,CAAC,EACM,CAAE,WAAAJ,EAAY,OAAAC,CAAO,CAC9B",
6
- "names": ["testDeviceActionStates_exports", "__export", "testDeviceActionStates", "__toCommonJS", "deviceAction", "expectedStates", "internalApi", "onDone", "onError", "observedStates", "observable", "cancel", "state", "error", "e"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var e=require("./contactsValidation");const n="44'/60'/0'/0/0";describe("contactsValidation",()=>{describe("validatePrintableLabel",()=>{const t={field:"name",bufferLength:e.CONTACT_NAME_BUFFER_LENGTH};it("accepts a printable ASCII label within the buffer",()=>{expect(()=>(0,e.validatePrintableLabel)("Alice",t)).not.toThrow()}),it("rejects an empty label",()=>{expect(()=>(0,e.validatePrintableLabel)("",t)).toThrow(e.ContactsValidationError)}),it("rejects a label exceeding bufferLength - 1 bytes",()=>{expect(()=>(0,e.validatePrintableLabel)("x".repeat(e.CONTACT_NAME_BUFFER_LENGTH),t)).toThrow(e.ContactsValidationError)}),it("rejects non-ASCII / accented characters (byte-level isprint)",()=>{expect(()=>(0,e.validatePrintableLabel)("Am\xE9lie",t)).toThrow(e.ContactsValidationError)})}),describe("validateByteLength",()=>{it("accepts an exact-length buffer",()=>{expect(()=>(0,e.validateByteLength)(new Uint8Array(20),{field:"identifier",expectedBytes:20})).not.toThrow()}),it("rejects a wrong-length buffer",()=>{expect(()=>(0,e.validateByteLength)(new Uint8Array(19),{field:"identifier",expectedBytes:20})).toThrow(e.ContactsValidationError)})}),describe("validateChainId",()=>{it("accepts a positive integer and bigint",()=>{expect(()=>(0,e.validateChainId)(1)).not.toThrow(),expect(()=>(0,e.validateChainId)(56n)).not.toThrow()}),it("rejects zero, negative, and non-integer",()=>{expect(()=>(0,e.validateChainId)(0)).toThrow(e.ContactsValidationError),expect(()=>(0,e.validateChainId)(-1)).toThrow(e.ContactsValidationError),expect(()=>(0,e.validateChainId)(1.5)).toThrow(e.ContactsValidationError)})}),describe("validateDerivationPath",()=>{it("accepts a representative BIP32 path",()=>{expect(()=>(0,e.validateDerivationPath)(n)).not.toThrow()}),it("accepts m-prefixed and hardened paths",()=>{expect(()=>(0,e.validateDerivationPath)("m/44'/60'/0'/0/0")).not.toThrow()}),it("rejects a non-numeric segment",()=>{expect(()=>(0,e.validateDerivationPath)("44'/x/0")).toThrow(e.ContactsValidationError)})}),describe("validateFamilyIdentifiers",()=>{const t=i=>[{field:"identifier",value:new Uint8Array(i).fill(17)}];it("returns the BLOCKCHAIN_FAMILY byte, case-insensitively",()=>{expect((0,e.validateFamilyIdentifiers)({blockchainFamily:"Ethereum",identifiers:t(20),chainId:1n})).toBe(1),expect((0,e.validateFamilyIdentifiers)({blockchainFamily:"solana",identifiers:t(32)})).toBe(2),expect((0,e.validateFamilyIdentifiers)({blockchainFamily:"tron",identifiers:t(21)})).toBe(6)}),it("rejects an unknown family",()=>{expect(()=>(0,e.validateFamilyIdentifiers)({blockchainFamily:"dogecoin",identifiers:t(20)})).toThrow("Unsupported blockchain family: dogecoin")}),it("requires 20-byte identifiers and a chainId for Ethereum",()=>{expect(()=>(0,e.validateFamilyIdentifiers)({blockchainFamily:"ethereum",identifiers:t(32),chainId:1n})).toThrow("identifier is 32 bytes, expected 20."),expect(()=>(0,e.validateFamilyIdentifiers)({blockchainFamily:"ethereum",identifiers:t(20)})).toThrow("chainId is required for the Ethereum blockchain family.")}),it("requires 32-byte identifiers and no chainId for Solana",()=>{expect(()=>(0,e.validateFamilyIdentifiers)({blockchainFamily:"solana",identifiers:t(20)})).toThrow("identifier is 20 bytes, expected 32."),expect(()=>(0,e.validateFamilyIdentifiers)({blockchainFamily:"solana",identifiers:t(32),chainId:101n})).toThrow("chainId is not allowed for the Solana blockchain family.")}),it("only requires non-empty identifiers for other families",()=>{expect(()=>(0,e.validateFamilyIdentifiers)({blockchainFamily:"tron",identifiers:t(0)})).toThrow("identifier must not be empty.")}),it("range-checks a chainId",()=>{expect(()=>(0,e.validateFamilyIdentifiers)({blockchainFamily:"ethereum",identifiers:t(20),chainId:0n})).toThrow(e.ContactsValidationError)})})});
2
- //# sourceMappingURL=contactsValidation.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/app-binder/model/contactsValidation.test.ts"],
4
- "sourcesContent": ["import {\n CONTACT_NAME_BUFFER_LENGTH,\n ContactsValidationError,\n validateByteLength,\n validateChainId,\n validateDerivationPath,\n validateFamilyIdentifiers,\n validatePrintableLabel,\n} from \"./contactsValidation\";\n\n// A representative BIP32 path (used by Ledger-Account ops, not external\n// addresses). Kept here to exercise the shared validator.\nconst SAMPLE_DERIVATION_PATH = \"44'/60'/0'/0/0\";\n\ndescribe(\"contactsValidation\", () => {\n describe(\"validatePrintableLabel\", () => {\n const opts = { field: \"name\", bufferLength: CONTACT_NAME_BUFFER_LENGTH };\n\n it(\"accepts a printable ASCII label within the buffer\", () => {\n expect(() => validatePrintableLabel(\"Alice\", opts)).not.toThrow();\n });\n\n it(\"rejects an empty label\", () => {\n expect(() => validatePrintableLabel(\"\", opts)).toThrow(\n ContactsValidationError,\n );\n });\n\n it(\"rejects a label exceeding bufferLength - 1 bytes\", () => {\n expect(() =>\n validatePrintableLabel(\"x\".repeat(CONTACT_NAME_BUFFER_LENGTH), opts),\n ).toThrow(ContactsValidationError);\n });\n\n it(\"rejects non-ASCII / accented characters (byte-level isprint)\", () => {\n expect(() => validatePrintableLabel(\"Am\u00E9lie\", opts)).toThrow(\n ContactsValidationError,\n );\n });\n });\n\n describe(\"validateByteLength\", () => {\n it(\"accepts an exact-length buffer\", () => {\n expect(() =>\n validateByteLength(new Uint8Array(20), {\n field: \"identifier\",\n expectedBytes: 20,\n }),\n ).not.toThrow();\n });\n\n it(\"rejects a wrong-length buffer\", () => {\n expect(() =>\n validateByteLength(new Uint8Array(19), {\n field: \"identifier\",\n expectedBytes: 20,\n }),\n ).toThrow(ContactsValidationError);\n });\n });\n\n describe(\"validateChainId\", () => {\n it(\"accepts a positive integer and bigint\", () => {\n expect(() => validateChainId(1)).not.toThrow();\n expect(() => validateChainId(56n)).not.toThrow();\n });\n\n it(\"rejects zero, negative, and non-integer\", () => {\n expect(() => validateChainId(0)).toThrow(ContactsValidationError);\n expect(() => validateChainId(-1)).toThrow(ContactsValidationError);\n expect(() => validateChainId(1.5)).toThrow(ContactsValidationError);\n });\n });\n\n describe(\"validateDerivationPath\", () => {\n it(\"accepts a representative BIP32 path\", () => {\n expect(() =>\n validateDerivationPath(SAMPLE_DERIVATION_PATH),\n ).not.toThrow();\n });\n\n it(\"accepts m-prefixed and hardened paths\", () => {\n expect(() => validateDerivationPath(\"m/44'/60'/0'/0/0\")).not.toThrow();\n });\n\n it(\"rejects a non-numeric segment\", () => {\n expect(() => validateDerivationPath(\"44'/x/0\")).toThrow(\n ContactsValidationError,\n );\n });\n });\n describe(\"validateFamilyIdentifiers\", () => {\n const identifier = (length: number) => [\n { field: \"identifier\", value: new Uint8Array(length).fill(0x11) },\n ];\n\n it(\"returns the BLOCKCHAIN_FAMILY byte, case-insensitively\", () => {\n expect(\n validateFamilyIdentifiers({\n blockchainFamily: \"Ethereum\",\n identifiers: identifier(20),\n chainId: 1n,\n }),\n ).toBe(0x01);\n expect(\n validateFamilyIdentifiers({\n blockchainFamily: \"solana\",\n identifiers: identifier(32),\n }),\n ).toBe(0x02);\n expect(\n validateFamilyIdentifiers({\n blockchainFamily: \"tron\",\n identifiers: identifier(21),\n }),\n ).toBe(0x06);\n });\n\n it(\"rejects an unknown family\", () => {\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"dogecoin\",\n identifiers: identifier(20),\n }),\n ).toThrow(\"Unsupported blockchain family: dogecoin\");\n });\n\n it(\"requires 20-byte identifiers and a chainId for Ethereum\", () => {\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"ethereum\",\n identifiers: identifier(32),\n chainId: 1n,\n }),\n ).toThrow(\"identifier is 32 bytes, expected 20.\");\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"ethereum\",\n identifiers: identifier(20),\n }),\n ).toThrow(\"chainId is required for the Ethereum blockchain family.\");\n });\n\n it(\"requires 32-byte identifiers and no chainId for Solana\", () => {\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"solana\",\n identifiers: identifier(20),\n }),\n ).toThrow(\"identifier is 20 bytes, expected 32.\");\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"solana\",\n identifiers: identifier(32),\n chainId: 101n,\n }),\n ).toThrow(\"chainId is not allowed for the Solana blockchain family.\");\n });\n\n it(\"only requires non-empty identifiers for other families\", () => {\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"tron\",\n identifiers: identifier(0),\n }),\n ).toThrow(\"identifier must not be empty.\");\n });\n\n it(\"range-checks a chainId\", () => {\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"ethereum\",\n identifiers: identifier(20),\n chainId: 0n,\n }),\n ).toThrow(ContactsValidationError);\n });\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAQO,gCAIP,MAAMC,EAAyB,iBAE/B,SAAS,qBAAsB,IAAM,CACnC,SAAS,yBAA0B,IAAM,CACvC,MAAMC,EAAO,CAAE,MAAO,OAAQ,aAAc,4BAA2B,EAEvE,GAAG,oDAAqD,IAAM,CAC5D,OAAO,OAAM,0BAAuB,QAASA,CAAI,CAAC,EAAE,IAAI,QAAQ,CAClE,CAAC,EAED,GAAG,yBAA0B,IAAM,CACjC,OAAO,OAAM,0BAAuB,GAAIA,CAAI,CAAC,EAAE,QAC7C,yBACF,CACF,CAAC,EAED,GAAG,mDAAoD,IAAM,CAC3D,OAAO,OACL,0BAAuB,IAAI,OAAO,4BAA0B,EAAGA,CAAI,CACrE,EAAE,QAAQ,yBAAuB,CACnC,CAAC,EAED,GAAG,+DAAgE,IAAM,CACvE,OAAO,OAAM,0BAAuB,YAAUA,CAAI,CAAC,EAAE,QACnD,yBACF,CACF,CAAC,CACH,CAAC,EAED,SAAS,qBAAsB,IAAM,CACnC,GAAG,iCAAkC,IAAM,CACzC,OAAO,OACL,sBAAmB,IAAI,WAAW,EAAE,EAAG,CACrC,MAAO,aACP,cAAe,EACjB,CAAC,CACH,EAAE,IAAI,QAAQ,CAChB,CAAC,EAED,GAAG,gCAAiC,IAAM,CACxC,OAAO,OACL,sBAAmB,IAAI,WAAW,EAAE,EAAG,CACrC,MAAO,aACP,cAAe,EACjB,CAAC,CACH,EAAE,QAAQ,yBAAuB,CACnC,CAAC,CACH,CAAC,EAED,SAAS,kBAAmB,IAAM,CAChC,GAAG,wCAAyC,IAAM,CAChD,OAAO,OAAM,mBAAgB,CAAC,CAAC,EAAE,IAAI,QAAQ,EAC7C,OAAO,OAAM,mBAAgB,GAAG,CAAC,EAAE,IAAI,QAAQ,CACjD,CAAC,EAED,GAAG,0CAA2C,IAAM,CAClD,OAAO,OAAM,mBAAgB,CAAC,CAAC,EAAE,QAAQ,yBAAuB,EAChE,OAAO,OAAM,mBAAgB,EAAE,CAAC,EAAE,QAAQ,yBAAuB,EACjE,OAAO,OAAM,mBAAgB,GAAG,CAAC,EAAE,QAAQ,yBAAuB,CACpE,CAAC,CACH,CAAC,EAED,SAAS,yBAA0B,IAAM,CACvC,GAAG,sCAAuC,IAAM,CAC9C,OAAO,OACL,0BAAuBD,CAAsB,CAC/C,EAAE,IAAI,QAAQ,CAChB,CAAC,EAED,GAAG,wCAAyC,IAAM,CAChD,OAAO,OAAM,0BAAuB,kBAAkB,CAAC,EAAE,IAAI,QAAQ,CACvE,CAAC,EAED,GAAG,gCAAiC,IAAM,CACxC,OAAO,OAAM,0BAAuB,SAAS,CAAC,EAAE,QAC9C,yBACF,CACF,CAAC,CACH,CAAC,EACD,SAAS,4BAA6B,IAAM,CAC1C,MAAME,EAAcC,GAAmB,CACrC,CAAE,MAAO,aAAc,MAAO,IAAI,WAAWA,CAAM,EAAE,KAAK,EAAI,CAAE,CAClE,EAEA,GAAG,yDAA0D,IAAM,CACjE,UACE,6BAA0B,CACxB,iBAAkB,WAClB,YAAaD,EAAW,EAAE,EAC1B,QAAS,EACX,CAAC,CACH,EAAE,KAAK,CAAI,EACX,UACE,6BAA0B,CACxB,iBAAkB,SAClB,YAAaA,EAAW,EAAE,CAC5B,CAAC,CACH,EAAE,KAAK,CAAI,EACX,UACE,6BAA0B,CACxB,iBAAkB,OAClB,YAAaA,EAAW,EAAE,CAC5B,CAAC,CACH,EAAE,KAAK,CAAI,CACb,CAAC,EAED,GAAG,4BAA6B,IAAM,CACpC,OAAO,OACL,6BAA0B,CACxB,iBAAkB,WAClB,YAAaA,EAAW,EAAE,CAC5B,CAAC,CACH,EAAE,QAAQ,yCAAyC,CACrD,CAAC,EAED,GAAG,0DAA2D,IAAM,CAClE,OAAO,OACL,6BAA0B,CACxB,iBAAkB,WAClB,YAAaA,EAAW,EAAE,EAC1B,QAAS,EACX,CAAC,CACH,EAAE,QAAQ,sCAAsC,EAChD,OAAO,OACL,6BAA0B,CACxB,iBAAkB,WAClB,YAAaA,EAAW,EAAE,CAC5B,CAAC,CACH,EAAE,QAAQ,yDAAyD,CACrE,CAAC,EAED,GAAG,yDAA0D,IAAM,CACjE,OAAO,OACL,6BAA0B,CACxB,iBAAkB,SAClB,YAAaA,EAAW,EAAE,CAC5B,CAAC,CACH,EAAE,QAAQ,sCAAsC,EAChD,OAAO,OACL,6BAA0B,CACxB,iBAAkB,SAClB,YAAaA,EAAW,EAAE,EAC1B,QAAS,IACX,CAAC,CACH,EAAE,QAAQ,0DAA0D,CACtE,CAAC,EAED,GAAG,yDAA0D,IAAM,CACjE,OAAO,OACL,6BAA0B,CACxB,iBAAkB,OAClB,YAAaA,EAAW,CAAC,CAC3B,CAAC,CACH,EAAE,QAAQ,+BAA+B,CAC3C,CAAC,EAED,GAAG,yBAA0B,IAAM,CACjC,OAAO,OACL,6BAA0B,CACxB,iBAAkB,WAClB,YAAaA,EAAW,EAAE,EAC1B,QAAS,EACX,CAAC,CACH,EAAE,QAAQ,yBAAuB,CACnC,CAAC,CACH,CAAC,CACH,CAAC",
6
- "names": ["import_contactsValidation", "SAMPLE_DERIVATION_PATH", "opts", "identifier", "length"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var i=require("@ledgerhq/device-management-kit"),e=require("./contactsTlvSerializer");describe("contactsTlvSerializer",()=>{describe("DERIVATION_PATH tag",()=>{it("is 0x69 (not the pre-1.23 value 0x21)",()=>{expect(e.CONTACTS_TLV_TAG.DERIVATION_PATH).toBe(105)}),it("encodes a packed path under tag 0x69",()=>{const t=new i.ByteArrayBuilder,r=(0,e.packDerivationPath)([2147483692,2147483708,2147483648]);(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.DERIVATION_PATH,r),expect(t.build()).toStrictEqual(Uint8Array.from([105,13,3,128,0,0,44,128,0,0,60,128,0,0,0]))})}),describe("primitive encoders",()=>{it("encodes a single-byte TLV (tag < 0x80, length 1)",()=>{const t=new i.ByteArrayBuilder;(0,e.encodeTlvUInt8)(t,e.CONTACTS_TLV_TAG.STRUCT_TYPE,45),expect(t.build()).toStrictEqual(Uint8Array.from([1,1,45]))}),it("encodes tags >= 0x80 as the 2-byte DER long form [0x81, tag]",()=>{const t=new i.ByteArrayBuilder;(0,e.encodeTlvAscii)(t,e.CONTACTS_TLV_TAG.CONTACT_NAME,"AB"),expect(t.build()).toStrictEqual(Uint8Array.from([129,240,2,65,66]))}),it("encodes chainId as minimal big-endian bytes",()=>{const t=new i.ByteArrayBuilder;(0,e.encodeTlvChainId)(t,e.CONTACTS_TLV_TAG.CHAIN_ID,1n),expect(t.build()).toStrictEqual(Uint8Array.from([35,1,1]));const r=new i.ByteArrayBuilder;(0,e.encodeTlvChainId)(r,e.CONTACTS_TLV_TAG.CHAIN_ID,56),expect(r.build()).toStrictEqual(Uint8Array.from([35,1,56]))}),it("emits DER long-form length for payloads >= 0x80 bytes",()=>{const t=new i.ByteArrayBuilder,r=new Uint8Array(200).fill(171);(0,e.encodeTlvBuffer)(t,e.CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER,r);const x=t.build();expect(Array.from(x.slice(0,4))).toEqual([129,242,129,200]),expect(x.length).toBe(204)}),it("rejects a non-positive chainId",()=>{const t=new i.ByteArrayBuilder;expect(()=>(0,e.encodeTlvChainId)(t,e.CONTACTS_TLV_TAG.CHAIN_ID,0)).toThrow()})})});
2
- //# sourceMappingURL=contactsTlvSerializer.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/app-binder/services/contactsTlvSerializer.test.ts"],
4
- "sourcesContent": ["import { ByteArrayBuilder } from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACTS_TLV_TAG,\n encodeTlvAscii,\n encodeTlvBuffer,\n encodeTlvChainId,\n encodeTlvUInt8,\n packDerivationPath,\n} from \"./contactsTlvSerializer\";\n\ndescribe(\"contactsTlvSerializer\", () => {\n describe(\"DERIVATION_PATH tag\", () => {\n // Pins the ETH-app 1.23 / BOLOS SDK protocol change (commit 963d72b7):\n // the address-book derivation-path tag moved from 0x21 to 0x69. Sending the\n // old tag makes the on-device TLV parser reject with 0x6A80.\n it(\"is 0x69 (not the pre-1.23 value 0x21)\", () => {\n expect(CONTACTS_TLV_TAG.DERIVATION_PATH).toBe(0x69);\n });\n\n it(\"encodes a packed path under tag 0x69\", () => {\n const builder = new ByteArrayBuilder();\n const path = packDerivationPath([0x8000002c, 0x8000003c, 0x80000000]);\n\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.DERIVATION_PATH, path);\n\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([\n 0x69, // DERIVATION_PATH tag\n 0x0d, // length: 1 count byte + 3 * 4-byte segments\n 0x03, // segment count\n 0x80,\n 0x00,\n 0x00,\n 0x2c, // 44'\n 0x80,\n 0x00,\n 0x00,\n 0x3c, // 60'\n 0x80,\n 0x00,\n 0x00,\n 0x00, // 0'\n ]),\n );\n });\n });\n\n describe(\"primitive encoders\", () => {\n it(\"encodes a single-byte TLV (tag < 0x80, length 1)\", () => {\n const builder = new ByteArrayBuilder();\n encodeTlvUInt8(builder, CONTACTS_TLV_TAG.STRUCT_TYPE, 0x2d);\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([0x01, 0x01, 0x2d]),\n );\n });\n\n it(\"encodes tags >= 0x80 as the 2-byte DER long form [0x81, tag]\", () => {\n const builder = new ByteArrayBuilder();\n encodeTlvAscii(builder, CONTACTS_TLV_TAG.CONTACT_NAME, \"AB\");\n // Tag 0xf0 -> DER long form [0x81, 0xf0], length 2, ASCII \"AB\".\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([0x81, 0xf0, 0x02, 0x41, 0x42]),\n );\n });\n\n it(\"encodes chainId as minimal big-endian bytes\", () => {\n const builder = new ByteArrayBuilder();\n encodeTlvChainId(builder, CONTACTS_TLV_TAG.CHAIN_ID, 1n);\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([0x23, 0x01, 0x01]),\n );\n\n const builder2 = new ByteArrayBuilder();\n encodeTlvChainId(builder2, CONTACTS_TLV_TAG.CHAIN_ID, 56);\n expect(builder2.build()).toStrictEqual(\n Uint8Array.from([0x23, 0x01, 0x38]),\n );\n });\n\n it(\"emits DER long-form length for payloads >= 0x80 bytes\", () => {\n const builder = new ByteArrayBuilder();\n const value = new Uint8Array(200).fill(0xab);\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER, value);\n const out = builder.build();\n // tag 0xf2 -> [0x81, 0xf2], then long-form length 0x81 0xc8 (200).\n expect(Array.from(out.slice(0, 4))).toEqual([0x81, 0xf2, 0x81, 0xc8]);\n expect(out.length).toBe(4 + 200);\n });\n\n it(\"rejects a non-positive chainId\", () => {\n const builder = new ByteArrayBuilder();\n expect(() =>\n encodeTlvChainId(builder, CONTACTS_TLV_TAG.CHAIN_ID, 0),\n ).toThrow();\n });\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAAiC,2CAEjCC,EAOO,mCAEP,SAAS,wBAAyB,IAAM,CACtC,SAAS,sBAAuB,IAAM,CAIpC,GAAG,wCAAyC,IAAM,CAChD,OAAO,mBAAiB,eAAe,EAAE,KAAK,GAAI,CACpD,CAAC,EAED,GAAG,uCAAwC,IAAM,CAC/C,MAAMC,EAAU,IAAI,mBACdC,KAAO,sBAAmB,CAAC,WAAY,WAAY,UAAU,CAAC,KAEpE,mBAAgBD,EAAS,mBAAiB,gBAAiBC,CAAI,EAE/D,OAAOD,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CACd,IACA,GACA,EACA,IACA,EACA,EACA,GACA,IACA,EACA,EACA,GACA,IACA,EACA,EACA,CACF,CAAC,CACH,CACF,CAAC,CACH,CAAC,EAED,SAAS,qBAAsB,IAAM,CACnC,GAAG,mDAAoD,IAAM,CAC3D,MAAMA,EAAU,IAAI,sBACpB,kBAAeA,EAAS,mBAAiB,YAAa,EAAI,EAC1D,OAAOA,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CAAC,EAAM,EAAM,EAAI,CAAC,CACpC,CACF,CAAC,EAED,GAAG,+DAAgE,IAAM,CACvE,MAAMA,EAAU,IAAI,sBACpB,kBAAeA,EAAS,mBAAiB,aAAc,IAAI,EAE3D,OAAOA,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CAAC,IAAM,IAAM,EAAM,GAAM,EAAI,CAAC,CAChD,CACF,CAAC,EAED,GAAG,8CAA+C,IAAM,CACtD,MAAMA,EAAU,IAAI,sBACpB,oBAAiBA,EAAS,mBAAiB,SAAU,EAAE,EACvD,OAAOA,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CAAC,GAAM,EAAM,CAAI,CAAC,CACpC,EAEA,MAAME,EAAW,IAAI,sBACrB,oBAAiBA,EAAU,mBAAiB,SAAU,EAAE,EACxD,OAAOA,EAAS,MAAM,CAAC,EAAE,cACvB,WAAW,KAAK,CAAC,GAAM,EAAM,EAAI,CAAC,CACpC,CACF,CAAC,EAED,GAAG,wDAAyD,IAAM,CAChE,MAAMF,EAAU,IAAI,mBACdG,EAAQ,IAAI,WAAW,GAAG,EAAE,KAAK,GAAI,KAC3C,mBAAgBH,EAAS,mBAAiB,mBAAoBG,CAAK,EACnE,MAAMC,EAAMJ,EAAQ,MAAM,EAE1B,OAAO,MAAM,KAAKI,EAAI,MAAM,EAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EACpE,OAAOA,EAAI,MAAM,EAAE,KAAK,GAAO,CACjC,CAAC,EAED,GAAG,iCAAkC,IAAM,CACzC,MAAMJ,EAAU,IAAI,mBACpB,OAAO,OACL,oBAAiBA,EAAS,mBAAiB,SAAU,CAAC,CACxD,EAAE,QAAQ,CACZ,CAAC,CACH,CAAC,CACH,CAAC",
6
- "names": ["import_device_management_kit", "import_contactsTlvSerializer", "builder", "path", "builder2", "value", "out"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var n=require("@ledgerhq/device-management-kit"),r=require("../../app-binder/command/ProvideContactCommand"),s=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),d=require("../../app-binder/model/contactsErrors"),t=require("./provideContact");const m=new Uint8Array(20).fill(17),p=new Uint8Array(64).fill(34),f=new Uint8Array(32).fill(51),h=new Uint8Array(32).fill(68),o={contactName:"Alice",scope:"Ethereum",identifier:m,groupHandle:p,hmacProof:f,hmacRest:h,blockchainFamily:"ethereum",chainId:1n},y="010133",C="020101",u="81f005416c696365",x="81f108457468657265756d",T="81f214"+"11".repeat(20),c="81f640"+"22".repeat(64),I="230101",E="510101",_="2920"+"33".repeat(32),A="81f720"+"44".repeat(32);describe("buildProvideContactPayload",()=>{it("encodes every tag in the order the spec lists",()=>{const e=(0,t.buildProvideContactPayload)(o);expect((0,n.bufferToHexaString)(e,!1)).toBe(y+C+u+x+T+c+I+E+_+A)}),it("fits an Ethereum contact in a single 255-byte chunk",()=>{expect((0,t.buildProvideContactPayload)(o).length).toBeLessThanOrEqual(253)}),it("omits CHAIN_ID for a family that does not carry one",()=>{const e=(0,t.buildProvideContactPayload)({...o,blockchainFamily:"tron",chainId:void 0});expect((0,n.bufferToHexaString)(e,!1)).toContain(c+"510106")}),it("encodes a multi-byte chain id big-endian with no leading zeroes",()=>{const e=(0,t.buildProvideContactPayload)({...o,chainId:8453n});expect((0,n.bufferToHexaString)(e,!1)).toContain("23022105")}),it("accepts the family name case-insensitively",()=>{expect((0,t.buildProvideContactPayload)({...o,blockchainFamily:"Ethereum"})).toStrictEqual((0,t.buildProvideContactPayload)(o))}),it("encodes a Solana contact with its family byte and no CHAIN_ID",()=>{const e=(0,t.buildProvideContactPayload)({...o,identifier:new Uint8Array(32).fill(17),blockchainFamily:"solana",chainId:void 0});expect((0,n.bufferToHexaString)(e,!1)).toContain("81f220"+"11".repeat(32)+c+"510102")}),it("throws on a Solana identifier that is not 32 bytes",()=>{expect(()=>(0,t.buildProvideContactPayload)({...o,blockchainFamily:"solana",chainId:void 0})).toThrow("identifier is 20 bytes, expected 32.")}),it("throws on an unknown blockchain family",()=>{expect(()=>(0,t.buildProvideContactPayload)({...o,blockchainFamily:"dogecoin"})).toThrow("Unsupported blockchain family: dogecoin")})});describe("sendProvideContactPayload",()=>{it("sends one chunk under P2=0x00, prefixed with the 2-byte BE total length",async()=>{const e=(0,s.makeDeviceActionInternalApiMock)();e.sendCommand.mockResolvedValue((0,n.CommandResultFactory)({data:void 0}));const a=(0,t.buildProvideContactPayload)(o),l=await(0,t.sendProvideContactPayload)(e,{payload:a});expect(e.sendCommand).toHaveBeenCalledTimes(1);const i=e.sendCommand.mock.calls[0][0];expect(i).toBeInstanceOf(r.ProvideContactCommand),expect(i.args.p2).toBe(0),expect(i.args.data.slice(0,2)).toStrictEqual(Uint8Array.from([a.length>>8&255,a.length&255])),expect(i.args.data.slice(2)).toStrictEqual(a),expect(l.status).toBe(n.CommandResultStatus.Success)}),it("propagates a device rejection instead of throwing",async()=>{const e=(0,s.makeDeviceActionInternalApiMock)();e.sendCommand.mockResolvedValue((0,n.CommandResultFactory)({error:new d.ContactsCommandError({errorCode:"6982",message:"wrong seed"})}));const a=await(0,t.sendProvideContactPayload)(e,{payload:(0,t.buildProvideContactPayload)(o)});expect(a.status).toBe(n.CommandResultStatus.Error)})});
2
- //# sourceMappingURL=provideContact.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/app-binder/services/provideContact.test.ts"],
4
- "sourcesContent": ["import {\n bufferToHexaString,\n CommandResultFactory,\n CommandResultStatus,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type ProvideContactInput } from \"@api/model/ProvideContact\";\nimport { ProvideContactCommand } from \"@internal/app-binder/command/ProvideContactCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { ContactsCommandError } from \"@internal/app-binder/model/contactsErrors\";\n\nimport {\n buildProvideContactPayload,\n sendProvideContactPayload,\n} from \"./provideContact\";\n\nconst IDENTIFIER = new Uint8Array(20).fill(0x11);\nconst GROUP_HANDLE = new Uint8Array(64).fill(0x22);\nconst HMAC_PROOF = new Uint8Array(32).fill(0x33);\nconst HMAC_REST = new Uint8Array(32).fill(0x44);\n\nconst INPUT: ProvideContactInput = {\n contactName: \"Alice\",\n scope: \"Ethereum\",\n identifier: IDENTIFIER,\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF,\n hmacRest: HMAC_REST,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n};\n\n// Tags >= 0x80 use the DER long form (0x81 then the tag), hence the \"81\" prefix\n// on CONTACT_NAME (0xf0), SCOPE (0xf1), ACCOUNT_IDENTIFIER (0xf2),\n// GROUP_HANDLE (0xf6) and HMAC_REST (0xf7).\nconst STRUCT_TYPE_TLV = \"010133\";\nconst STRUCT_VERSION_TLV = \"020101\";\nconst CONTACT_NAME_TLV = \"81f005\" + \"416c696365\"; // \"Alice\"\nconst SCOPE_TLV = \"81f108\" + \"457468657265756d\"; // \"Ethereum\"\nconst IDENTIFIER_TLV = \"81f214\" + \"11\".repeat(20);\nconst GROUP_HANDLE_TLV = \"81f640\" + \"22\".repeat(64);\nconst CHAIN_ID_TLV = \"230101\";\nconst FAMILY_TLV = \"510101\";\nconst HMAC_PROOF_TLV = \"2920\" + \"33\".repeat(32);\nconst HMAC_REST_TLV = \"81f720\" + \"44\".repeat(32);\n\ndescribe(\"buildProvideContactPayload\", () => {\n it(\"encodes every tag in the order the spec lists\", () => {\n const payload = buildProvideContactPayload(INPUT);\n\n expect(bufferToHexaString(payload, false)).toBe(\n STRUCT_TYPE_TLV +\n STRUCT_VERSION_TLV +\n CONTACT_NAME_TLV +\n SCOPE_TLV +\n IDENTIFIER_TLV +\n GROUP_HANDLE_TLV +\n CHAIN_ID_TLV +\n FAMILY_TLV +\n HMAC_PROOF_TLV +\n HMAC_REST_TLV,\n );\n });\n\n it(\"fits an Ethereum contact in a single 255-byte chunk\", () => {\n expect(buildProvideContactPayload(INPUT).length).toBeLessThanOrEqual(253);\n });\n\n it(\"omits CHAIN_ID for a family that does not carry one\", () => {\n const payload = buildProvideContactPayload({\n ...INPUT,\n blockchainFamily: \"tron\",\n chainId: undefined,\n });\n\n expect(bufferToHexaString(payload, false)).toContain(\n GROUP_HANDLE_TLV + \"510106\",\n );\n });\n\n it(\"encodes a multi-byte chain id big-endian with no leading zeroes\", () => {\n const payload = buildProvideContactPayload({ ...INPUT, chainId: 8453n });\n\n expect(bufferToHexaString(payload, false)).toContain(\"2302\" + \"2105\");\n });\n\n it(\"accepts the family name case-insensitively\", () => {\n expect(\n buildProvideContactPayload({ ...INPUT, blockchainFamily: \"Ethereum\" }),\n ).toStrictEqual(buildProvideContactPayload(INPUT));\n });\n\n it(\"encodes a Solana contact with its family byte and no CHAIN_ID\", () => {\n const payload = buildProvideContactPayload({\n ...INPUT,\n identifier: new Uint8Array(32).fill(0x11),\n blockchainFamily: \"solana\",\n chainId: undefined,\n });\n\n expect(bufferToHexaString(payload, false)).toContain(\n \"81f220\" + \"11\".repeat(32) + GROUP_HANDLE_TLV + \"510102\",\n );\n });\n\n it(\"throws on a Solana identifier that is not 32 bytes\", () => {\n expect(() =>\n buildProvideContactPayload({\n ...INPUT,\n blockchainFamily: \"solana\",\n chainId: undefined,\n }),\n ).toThrow(\"identifier is 20 bytes, expected 32.\");\n });\n\n it(\"throws on an unknown blockchain family\", () => {\n expect(() =>\n buildProvideContactPayload({ ...INPUT, blockchainFamily: \"dogecoin\" }),\n ).toThrow(\"Unsupported blockchain family: dogecoin\");\n });\n});\n\ndescribe(\"sendProvideContactPayload\", () => {\n it(\"sends one chunk under P2=0x00, prefixed with the 2-byte BE total length\", async () => {\n const api = makeDeviceActionInternalApiMock();\n api.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n const payload = buildProvideContactPayload(INPUT);\n\n const result = await sendProvideContactPayload(api, { payload });\n\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n const command = api.sendCommand.mock.calls[0]![0] as ProvideContactCommand;\n expect(command).toBeInstanceOf(ProvideContactCommand);\n expect(command.args.p2).toBe(0x00);\n expect(command.args.data.slice(0, 2)).toStrictEqual(\n Uint8Array.from([(payload.length >> 8) & 0xff, payload.length & 0xff]),\n );\n expect(command.args.data.slice(2)).toStrictEqual(payload);\n expect(result.status).toBe(CommandResultStatus.Success);\n });\n\n it(\"propagates a device rejection instead of throwing\", async () => {\n const api = makeDeviceActionInternalApiMock();\n api.sendCommand.mockResolvedValue(\n CommandResultFactory({\n error: new ContactsCommandError({\n errorCode: \"6982\",\n message: \"wrong seed\",\n }),\n }),\n );\n\n const result = await sendProvideContactPayload(api, {\n payload: buildProvideContactPayload(INPUT),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_ProvideContactCommand", "import_makeInternalApi", "import_contactsErrors", "import_provideContact", "IDENTIFIER", "GROUP_HANDLE", "HMAC_PROOF", "HMAC_REST", "INPUT", "STRUCT_TYPE_TLV", "STRUCT_VERSION_TLV", "CONTACT_NAME_TLV", "SCOPE_TLV", "IDENTIFIER_TLV", "GROUP_HANDLE_TLV", "CHAIN_ID_TLV", "FAMILY_TLV", "HMAC_PROOF_TLV", "HMAC_REST_TLV", "payload", "api", "result", "command"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var a=require("@ledgerhq/device-management-kit"),m=require("./sendFramedContactsPayload");function l(){return{sendCommand:vi.fn()}}function r(e,n=66){return new Uint8Array(e).fill(n)}const d=()=>vi.fn((e,n)=>({name:"test",args:{chunk:e,p2:n},getApdu:vi.fn(),parseResponse:vi.fn()}));describe("sendFramedContactsPayload",()=>{it("single-chunk: prepends BE length, uses P2=0x00, returns command result",async()=>{const e=l(),n=(0,a.CommandResultFactory)({data:{ok:!0}});e.sendCommand.mockResolvedValueOnce(n);const t=d(),o=await(0,m.sendFramedContactsPayload)(e,{payload:r(100),p1:1,makeCommand:t});expect(t).toHaveBeenCalledTimes(1);const[s,c]=t.mock.calls[0];expect(c).toBe(0),expect(s[0]).toBe(0),expect(s[1]).toBe(100),expect(s.length).toBe(102),expect(o).toBe(n)}),it("multi-chunk: splits into <=255B pieces, P2 0x00 then 0x80, prefix on first only",async()=>{const e=l(),n=(0,a.CommandResultFactory)({data:{}}),t=(0,a.CommandResultFactory)({data:{ok:!0}});e.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(t);const o=d(),s=await(0,m.sendFramedContactsPayload)(e,{payload:r(600,85),p1:1,makeCommand:o});expect(o).toHaveBeenCalledTimes(3);const[c,p]=o.mock.calls[0],[i,u]=o.mock.calls[1],[k,x]=o.mock.calls[2];expect([p,u,x]).toEqual([0,128,128]),expect([c.length,i.length,k.length]).toEqual([255,255,92]),expect(c[0]).toBe(2),expect(c[1]).toBe(88),expect(i[0]).toBe(85),expect(s).toBe(t)}),it("short-circuits on intermediate-chunk error without dispatching remaining chunks",async()=>{const e=l(),n=(0,a.CommandResultFactory)({error:new a.InvalidStatusWordError("kaboom")});e.sendCommand.mockResolvedValueOnce(n);const t=d(),o=await(0,m.sendFramedContactsPayload)(e,{payload:r(600),p1:1,makeCommand:t});expect(e.sendCommand).toHaveBeenCalledTimes(1),expect(t).toHaveBeenCalledTimes(1),expect(o).toBe(n)})});
2
- //# sourceMappingURL=sendFramedContactsPayload.test.js.map