@hsuite/native-connect-angular 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/README.md +48 -0
  2. package/USAGE_EXAMPLES.md +476 -0
  3. package/assets/wallets/extension.svg +7 -0
  4. package/assets/wallets/hashpack.svg +6 -0
  5. package/assets/wallets/hsuite.svg +11 -0
  6. package/assets/wallets/kabila.svg +11 -0
  7. package/assets/wallets/walletconnect.svg +13 -0
  8. package/coverage/base.css +224 -0
  9. package/coverage/block-navigation.js +87 -0
  10. package/coverage/coverage-summary.json +50 -0
  11. package/coverage/favicon.png +0 -0
  12. package/coverage/index.html +476 -0
  13. package/coverage/lcov-report/base.css +224 -0
  14. package/coverage/lcov-report/block-navigation.js +87 -0
  15. package/coverage/lcov-report/favicon.png +0 -0
  16. package/coverage/lcov-report/index.html +476 -0
  17. package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
  18. package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +116 -0
  19. package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
  20. package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +116 -0
  21. package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +685 -0
  22. package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +766 -0
  23. package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
  24. package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +116 -0
  25. package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1495 -0
  26. package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1588 -0
  27. package/coverage/lcov-report/lib/components/account-selector/index.html +161 -0
  28. package/coverage/lcov-report/lib/components/wallet-account-display/index.html +116 -0
  29. package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
  30. package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +116 -0
  31. package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
  32. package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +116 -0
  33. package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
  34. package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +116 -0
  35. package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
  36. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
  37. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
  38. package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +116 -0
  39. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
  40. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
  41. package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
  42. package/coverage/lcov-report/lib/components/wallet-session-display/index.html +116 -0
  43. package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
  44. package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +116 -0
  45. package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
  46. package/coverage/lcov-report/lib/directives/index.html +146 -0
  47. package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +670 -0
  48. package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +547 -0
  49. package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +781 -0
  50. package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +715 -0
  51. package/coverage/lcov-report/lib/index.html +116 -0
  52. package/coverage/lcov-report/lib/models/connection-config.model.ts.html +280 -0
  53. package/coverage/lcov-report/lib/models/index.html +131 -0
  54. package/coverage/lcov-report/lib/models/provider-types.ts.html +577 -0
  55. package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +1138 -0
  56. package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
  57. package/coverage/lcov-report/lib/providers/hsuite-native/index.html +116 -0
  58. package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +2347 -0
  59. package/coverage/lcov-report/lib/providers/index.html +146 -0
  60. package/coverage/lcov-report/lib/providers/p2p-native/index.html +131 -0
  61. package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
  62. package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
  63. package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1132 -0
  64. package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +176 -0
  65. package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +673 -0
  66. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
  67. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
  68. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
  69. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
  70. package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
  71. package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +146 -0
  72. package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
  73. package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
  74. package/coverage/lcov-report/lib/services/index.html +191 -0
  75. package/coverage/lcov-report/lib/services/logger.service.ts.html +463 -0
  76. package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
  77. package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
  78. package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
  79. package/coverage/lcov-report/lib/services/transaction-builders/index.html +161 -0
  80. package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
  81. package/coverage/lcov-report/lib/services/transaction.service.ts.html +1123 -0
  82. package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +2641 -0
  83. package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +637 -0
  84. package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +643 -0
  85. package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +496 -0
  86. package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +823 -0
  87. package/coverage/lcov-report/lib/transports/index.html +116 -0
  88. package/coverage/lcov-report/lib/utils/index.html +116 -0
  89. package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +319 -0
  90. package/coverage/lcov-report/prettify.css +1 -0
  91. package/coverage/lcov-report/prettify.js +2 -0
  92. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  93. package/coverage/lcov-report/sorter.js +210 -0
  94. package/coverage/lcov.info +19252 -0
  95. package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
  96. package/coverage/lib/components/account-selector/account-actions/index.html +116 -0
  97. package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
  98. package/coverage/lib/components/account-selector/account-filter/index.html +116 -0
  99. package/coverage/lib/components/account-selector/account-formatting.service.ts.html +685 -0
  100. package/coverage/lib/components/account-selector/account-grouping.service.ts.html +766 -0
  101. package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
  102. package/coverage/lib/components/account-selector/account-list/index.html +116 -0
  103. package/coverage/lib/components/account-selector/account-selector.component.ts.html +1495 -0
  104. package/coverage/lib/components/account-selector/account-selector.service.ts.html +1588 -0
  105. package/coverage/lib/components/account-selector/index.html +161 -0
  106. package/coverage/lib/components/wallet-account-display/index.html +116 -0
  107. package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
  108. package/coverage/lib/components/wallet-connect-button/index.html +116 -0
  109. package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
  110. package/coverage/lib/components/wallet-connect-prompt/index.html +116 -0
  111. package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
  112. package/coverage/lib/components/wallet-connected-guard/index.html +116 -0
  113. package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
  114. package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
  115. package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
  116. package/coverage/lib/components/wallet-connection-modal/index.html +116 -0
  117. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
  118. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
  119. package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
  120. package/coverage/lib/components/wallet-session-display/index.html +116 -0
  121. package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
  122. package/coverage/lib/components/wallet-transaction-status/index.html +116 -0
  123. package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
  124. package/coverage/lib/directives/index.html +146 -0
  125. package/coverage/lib/directives/wallet-connected.directive.ts.html +670 -0
  126. package/coverage/lib/directives/wallet-context.directive.ts.html +547 -0
  127. package/coverage/lib/directives/wallet-events.directive.ts.html +781 -0
  128. package/coverage/lib/hsuite-wallet.module.ts.html +715 -0
  129. package/coverage/lib/index.html +116 -0
  130. package/coverage/lib/models/connection-config.model.ts.html +280 -0
  131. package/coverage/lib/models/index.html +131 -0
  132. package/coverage/lib/models/provider-types.ts.html +577 -0
  133. package/coverage/lib/providers/base-wallet-provider.ts.html +1138 -0
  134. package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
  135. package/coverage/lib/providers/hsuite-native/index.html +116 -0
  136. package/coverage/lib/providers/hsuite-native-provider.ts.html +2347 -0
  137. package/coverage/lib/providers/index.html +146 -0
  138. package/coverage/lib/providers/p2p-native/index.html +131 -0
  139. package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
  140. package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
  141. package/coverage/lib/providers/wallet-error-handler.ts.html +1132 -0
  142. package/coverage/lib/providers/walletconnect/core/index.html +176 -0
  143. package/coverage/lib/providers/walletconnect/core/session-health.ts.html +673 -0
  144. package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
  145. package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
  146. package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
  147. package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
  148. package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
  149. package/coverage/lib/providers/walletconnect/signers/index.html +146 -0
  150. package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
  151. package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
  152. package/coverage/lib/services/index.html +191 -0
  153. package/coverage/lib/services/logger.service.ts.html +463 -0
  154. package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
  155. package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
  156. package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
  157. package/coverage/lib/services/transaction-builders/index.html +161 -0
  158. package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
  159. package/coverage/lib/services/transaction.service.ts.html +1123 -0
  160. package/coverage/lib/services/unified-wallet.service.ts.html +2641 -0
  161. package/coverage/lib/services/wallet-context.service.ts.html +637 -0
  162. package/coverage/lib/services/wallet-event-bus.service.ts.html +643 -0
  163. package/coverage/lib/services/wallet-providers.service.ts.html +496 -0
  164. package/coverage/lib/transports/chrome-extension-transport.ts.html +823 -0
  165. package/coverage/lib/transports/index.html +116 -0
  166. package/coverage/lib/utils/index.html +116 -0
  167. package/coverage/lib/utils/ledger-icons.util.ts.html +319 -0
  168. package/coverage/prettify.css +1 -0
  169. package/coverage/prettify.js +2 -0
  170. package/coverage/sort-arrow-sprite.png +0 -0
  171. package/coverage/sorter.js +210 -0
  172. package/dist/README.md +48 -0
  173. package/dist/fesm2022/hsuite-native-connect-angular.mjs +14592 -0
  174. package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -0
  175. package/dist/index.d.ts +6949 -0
  176. package/examples/minimal-connect.ts +178 -0
  177. package/examples/multi-protocol.ts +495 -0
  178. package/examples/transaction-signing.ts +361 -0
  179. package/jest.config.json +45 -0
  180. package/karma.conf.js +42 -0
  181. package/ng-package.json +20 -0
  182. package/package.json +60 -0
  183. package/src/index.ts +203 -0
  184. package/src/lib/components/account-selector/account-actions/account-actions.component.ts +261 -0
  185. package/src/lib/components/account-selector/account-filter/account-filter.component.ts +401 -0
  186. package/src/lib/components/account-selector/account-formatting.service.ts +200 -0
  187. package/src/lib/components/account-selector/account-grouping.service.ts +227 -0
  188. package/src/lib/components/account-selector/account-list/account-list.component.ts +470 -0
  189. package/src/lib/components/account-selector/account-selector.component.html +135 -0
  190. package/src/lib/components/account-selector/account-selector.component.scss +2039 -0
  191. package/src/lib/components/account-selector/account-selector.component.ts +470 -0
  192. package/src/lib/components/account-selector/account-selector.service.ts +501 -0
  193. package/src/lib/components/wallet-account-display/wallet-account-display.component.html +34 -0
  194. package/src/lib/components/wallet-account-display/wallet-account-display.component.scss +99 -0
  195. package/src/lib/components/wallet-account-display/wallet-account-display.component.ts +140 -0
  196. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.html +14 -0
  197. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.scss +272 -0
  198. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +240 -0
  199. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.html +24 -0
  200. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.scss +50 -0
  201. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts +108 -0
  202. package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.html +24 -0
  203. package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts +73 -0
  204. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.html +56 -0
  205. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.scss +218 -0
  206. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts +117 -0
  207. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.html +94 -0
  208. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.scss +272 -0
  209. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts +734 -0
  210. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +197 -0
  211. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.scss +678 -0
  212. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +730 -0
  213. package/src/lib/components/wallet-session-display/wallet-session-display.component.html +110 -0
  214. package/src/lib/components/wallet-session-display/wallet-session-display.component.scss +179 -0
  215. package/src/lib/components/wallet-session-display/wallet-session-display.component.ts +197 -0
  216. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.html +65 -0
  217. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.scss +254 -0
  218. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts +206 -0
  219. package/src/lib/directives/wallet-connected.directive.ts +195 -0
  220. package/src/lib/directives/wallet-context.directive.ts +154 -0
  221. package/src/lib/directives/wallet-events.directive.ts +232 -0
  222. package/src/lib/hsuite-wallet.module.ts +210 -0
  223. package/src/lib/models/connection-config.model.ts +65 -0
  224. package/src/lib/models/provider-types.ts +164 -0
  225. package/src/lib/models/unified-account.model.ts +76 -0
  226. package/src/lib/models/wallet-context.model.ts +121 -0
  227. package/src/lib/models/wallet-events.model.ts +158 -0
  228. package/src/lib/providers/base-wallet-provider.ts +351 -0
  229. package/src/lib/providers/hsuite-native/channel-client.service.spec.ts +73 -0
  230. package/src/lib/providers/hsuite-native/channel-client.service.ts +862 -0
  231. package/src/lib/providers/hsuite-native/index.ts +8 -0
  232. package/src/lib/providers/hsuite-native-provider.ts +754 -0
  233. package/src/lib/providers/mobile-native/mobile-native.provider.spec.ts +19 -0
  234. package/src/lib/providers/p2p-native/index.ts +30 -0
  235. package/src/lib/providers/p2p-native/p2p-native.provider.spec.ts +523 -0
  236. package/src/lib/providers/p2p-native/p2p-native.provider.ts +723 -0
  237. package/src/lib/providers/p2p-native/p2p-session-manager.ts +695 -0
  238. package/src/lib/providers/wallet-error-handler.ts +349 -0
  239. package/src/lib/providers/walletconnect/core/base-signer.interface.ts +122 -0
  240. package/src/lib/providers/walletconnect/core/session-health.ts +196 -0
  241. package/src/lib/providers/walletconnect/core/walletconnect-client-manager.ts +364 -0
  242. package/src/lib/providers/walletconnect/core/walletconnect-provider.integration.spec.ts +348 -0
  243. package/src/lib/providers/walletconnect/core/walletconnect-provider.ts +826 -0
  244. package/src/lib/providers/walletconnect/core/walletconnect-session-store.ts +273 -0
  245. package/src/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts +299 -0
  246. package/src/lib/providers/walletconnect/core/walletconnect-types.ts +48 -0
  247. package/src/lib/providers/walletconnect/index.ts +33 -0
  248. package/src/lib/providers/walletconnect/signers/hedera-signer.spec.ts +367 -0
  249. package/src/lib/providers/walletconnect/signers/hedera-signer.ts +610 -0
  250. package/src/lib/providers/walletconnect/signers/signer-factory.spec.ts +62 -0
  251. package/src/lib/providers/walletconnect/signers/signer-factory.ts +120 -0
  252. package/src/lib/providers/walletconnect/signers/xrpl-signer.spec.ts +296 -0
  253. package/src/lib/providers/walletconnect/signers/xrpl-signer.ts +478 -0
  254. package/src/lib/services/logger.service.ts +126 -0
  255. package/src/lib/services/transaction-builders/base-transaction-builder.service.ts +585 -0
  256. package/src/lib/services/transaction-builders/hedera-amount-utils.ts +84 -0
  257. package/src/lib/services/transaction-builders/hedera-transaction-builder.service.spec.ts +741 -0
  258. package/src/lib/services/transaction-builders/hedera-transaction-builder.service.ts +1285 -0
  259. package/src/lib/services/transaction-builders/index.ts +54 -0
  260. package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.spec.ts +937 -0
  261. package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.ts +832 -0
  262. package/src/lib/services/transaction.service.ts +346 -0
  263. package/src/lib/services/unified-wallet.service.spec.ts +1382 -0
  264. package/src/lib/services/unified-wallet.service.ts +852 -0
  265. package/src/lib/services/wallet-context.service.ts +184 -0
  266. package/src/lib/services/wallet-event-bus.service.ts +186 -0
  267. package/src/lib/services/wallet-providers.service.ts +137 -0
  268. package/src/lib/transports/chrome-extension-transport.ts +246 -0
  269. package/src/lib/utils/index.ts +14 -0
  270. package/src/lib/utils/ledger-icons.util.ts +78 -0
  271. package/test/test-setup.ts +21 -0
  272. package/test-setup.ts +63 -0
  273. package/tsconfig.build.json +11 -0
  274. package/tsconfig.json +29 -0
  275. package/tsconfig.spec.json +15 -0
  276. package/vitest.config.ts +48 -0
@@ -0,0 +1,120 @@
1
+ /**
2
+ * HSuite Native Connect
3
+ * Copyright 2024-2025 HSuite (https://hsuite.finance)
4
+ *
5
+ * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
6
+ *
7
+ * This file is part of HSuite Native Connect. For commercial licensing,
8
+ * visit https://hsuite.finance/licensing
9
+ */
10
+
11
+ /**
12
+ * @file signer-factory.ts
13
+ * @description Factory for creating and managing WalletConnect signers
14
+ *
15
+ * Implements the Factory Pattern for creating ledger-specific signers.
16
+ * Maintains a registry of available signers and provides type-safe access.
17
+ *
18
+ * This design allows easy extension - new ledgers can be added by:
19
+ * 1. Implementing IWalletConnectSigner interface
20
+ * 2. Registering the signer with SignerFactory
21
+ */
22
+
23
+ import { getLogger } from '@hsuite/native-connect-sdk';
24
+
25
+ import type { IWalletConnectSigner } from '../core/base-signer.interface';
26
+
27
+ import { HederaSigner } from './hedera-signer';
28
+ import { XrplSigner } from './xrpl-signer';
29
+
30
+ const logger = getLogger().scoped?.('SignerFactory') ?? getLogger();
31
+
32
+ /**
33
+ * Factory class for creating and managing WalletConnect signers.
34
+ *
35
+ * Features:
36
+ * - Singleton signer instances for each ledger (performance optimization)
37
+ * - Type-safe ledger ID validation
38
+ * - Extensible registration system for custom signers
39
+ */
40
+ export class SignerFactory {
41
+ /**
42
+ * Registry of available signers.
43
+ * Each ledger ID maps to a singleton signer instance.
44
+ */
45
+ private static signers = new Map<string, IWalletConnectSigner>([
46
+ ['hedera', new HederaSigner()],
47
+ ['xrpl', new XrplSigner()],
48
+ ]);
49
+
50
+ /**
51
+ * Get a signer for the specified ledger.
52
+ *
53
+ * @param ledgerId - Unique identifier for the ledger (e.g., 'hedera', 'xrpl')
54
+ * @returns The signer instance for the specified ledger
55
+ * @throws Error if no signer is registered for the ledger ID
56
+ */
57
+ static getSigner(ledgerId: string): IWalletConnectSigner {
58
+ const signer = this.signers.get(ledgerId);
59
+
60
+ if (!signer) {
61
+ const available = Array.from(this.signers.keys()).join(', ');
62
+ throw new Error(`Unsupported ledger: ${ledgerId}. Available ledgers: ${available}`);
63
+ }
64
+
65
+ return signer;
66
+ }
67
+
68
+ /**
69
+ * Register a custom signer for a ledger.
70
+ * Allows extending the factory with support for additional ledgers.
71
+ *
72
+ * @param ledgerId - Unique identifier for the ledger
73
+ * @param signer - Signer implementation for the ledger
74
+ */
75
+ static registerSigner(ledgerId: string, signer: IWalletConnectSigner): void {
76
+ if (signer.ledgerId !== ledgerId) {
77
+ logger.warn('Signer ledgerId does not match registration key', {
78
+ signerLedgerId: signer.ledgerId,
79
+ registrationKey: ledgerId,
80
+ });
81
+ }
82
+
83
+ this.signers.set(ledgerId, signer);
84
+ logger.debug('Registered signer for ledger', { ledgerId });
85
+ }
86
+
87
+ /**
88
+ * Check if a signer is registered for a ledger.
89
+ *
90
+ * @param ledgerId - Ledger identifier to check
91
+ * @returns True if a signer is registered, false otherwise
92
+ */
93
+ static hasSigner(ledgerId: string): boolean {
94
+ return this.signers.has(ledgerId);
95
+ }
96
+
97
+ /**
98
+ * Get all registered ledger IDs.
99
+ *
100
+ * @returns Array of ledger identifiers
101
+ */
102
+ static getAvailableLedgers(): string[] {
103
+ return Array.from(this.signers.keys());
104
+ }
105
+
106
+ /**
107
+ * Remove a signer from the registry.
108
+ * Useful for testing or dynamic ledger support.
109
+ *
110
+ * @param ledgerId - Ledger identifier to remove
111
+ * @returns True if signer was removed, false if it didn't exist
112
+ */
113
+ static unregisterSigner(ledgerId: string): boolean {
114
+ const removed = this.signers.delete(ledgerId);
115
+ if (removed) {
116
+ logger.debug('Unregistered signer for ledger', { ledgerId });
117
+ }
118
+ return removed;
119
+ }
120
+ }
@@ -0,0 +1,296 @@
1
+ /**
2
+ * @file xrpl-signer.spec.ts
3
+ * @description Unit tests for XrplSigner
4
+ */
5
+
6
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
7
+ import { TestBed } from '@angular/core/testing';
8
+ import { XrplSigner } from './xrpl-signer';
9
+ import type { SignerOperationParams } from '../core/base-signer.interface';
10
+
11
+ describe('XrplSigner', () => {
12
+ let signer: XrplSigner;
13
+ let mockClient: any;
14
+
15
+ beforeEach(() => {
16
+ TestBed.configureTestingModule({
17
+ providers: [XrplSigner]
18
+ });
19
+
20
+ signer = TestBed.inject(XrplSigner);
21
+
22
+ mockClient = {
23
+ request: vi.fn()
24
+ };
25
+ });
26
+
27
+ describe('ledgerId', () => {
28
+ it('should be "xrpl"', () => {
29
+ expect(signer.ledgerId).toBe('xrpl');
30
+ });
31
+ });
32
+
33
+ describe('buildNamespace', () => {
34
+ it('should build correct namespace for testnet', () => {
35
+ const namespace = signer.buildNamespace('xrpl:testnet');
36
+
37
+ expect(namespace.methods).toContain('xrpl_signTransaction');
38
+ expect(namespace.methods).toContain('xrpl_signAndSubmit');
39
+ expect(namespace.methods).toContain('xrpl_signMessage');
40
+ expect(namespace.chains).toEqual(['xrpl:testnet']);
41
+ expect(namespace.events).toContain('accountsChanged');
42
+ });
43
+
44
+ it('should build correct namespace for mainnet', () => {
45
+ const namespace = signer.buildNamespace('xrpl:mainnet');
46
+
47
+ expect(namespace.chains).toEqual(['xrpl:mainnet']);
48
+ });
49
+ });
50
+
51
+ describe('signTransaction', () => {
52
+ let mockParams: SignerOperationParams;
53
+
54
+ beforeEach(() => {
55
+ const mockTransaction = {
56
+ TransactionType: 'Payment',
57
+ Account: 'rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
58
+ Destination: 'rLHzPsX6oXkzU9qL8qWDwgNfEwgR7pqxjy',
59
+ Amount: '1000000',
60
+ Fee: '12',
61
+ Sequence: 1
62
+ };
63
+
64
+ const payload = btoa(JSON.stringify(mockTransaction));
65
+
66
+ mockParams = {
67
+ client: mockClient,
68
+ topic: 'test-topic',
69
+ networkId: 'xrpl:testnet',
70
+ accountAddress: 'rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
71
+ payload
72
+ };
73
+
74
+ vi.mocked(mockClient.request).mockResolvedValue({
75
+ tx_blob: 'signedTransactionBlob'
76
+ });
77
+ });
78
+
79
+ it('should call xrpl_signTransaction with correct params', async () => {
80
+ await signer.signTransaction(mockParams);
81
+
82
+ expect(mockClient.request).toHaveBeenCalledWith(
83
+ expect.objectContaining({
84
+ topic: 'test-topic',
85
+ chainId: 'xrpl:testnet',
86
+ request: expect.objectContaining({
87
+ method: 'xrpl_signTransaction',
88
+ params: expect.objectContaining({
89
+ transaction: expect.any(Object)
90
+ })
91
+ })
92
+ })
93
+ );
94
+ });
95
+
96
+ it('should decode transaction from base64 JSON', async () => {
97
+ await signer.signTransaction(mockParams);
98
+
99
+ const callArgs = vi.mocked(mockClient.request).mock.calls[0][0];
100
+ const transaction = callArgs.request.params.transaction;
101
+
102
+ expect(transaction.TransactionType).toBe('Payment');
103
+ expect(transaction.Account).toBe('rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE');
104
+ });
105
+
106
+ it('should return signed payload', async () => {
107
+ const result = await signer.signTransaction(mockParams);
108
+
109
+ expect(result).toEqual({
110
+ signedPayload: 'signedTransactionBlob',
111
+ metadata: expect.objectContaining({
112
+ result: expect.any(Object)
113
+ })
114
+ });
115
+ });
116
+
117
+ it('should throw error if request fails', async () => {
118
+ vi.mocked(mockClient.request).mockRejectedValue(new Error('User rejected'));
119
+
120
+ await expect(signer.signTransaction(mockParams)).rejects.toThrow('XRPL sign failed');
121
+ });
122
+ });
123
+
124
+ describe('submitTransaction', () => {
125
+ let mockParams: SignerOperationParams;
126
+
127
+ beforeEach(() => {
128
+ const mockTransaction = {
129
+ TransactionType: 'Payment',
130
+ Account: 'rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
131
+ Destination: 'rLHzPsX6oXkzU9qL8qWDwgNfEwgR7pqxjy',
132
+ Amount: '1000000',
133
+ Fee: '12',
134
+ Sequence: 1
135
+ };
136
+
137
+ const payload = btoa(JSON.stringify(mockTransaction));
138
+
139
+ mockParams = {
140
+ client: mockClient,
141
+ topic: 'test-topic',
142
+ networkId: 'xrpl:testnet',
143
+ accountAddress: 'rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
144
+ payload
145
+ };
146
+
147
+ vi.mocked(mockClient.request).mockResolvedValue({
148
+ hash: 'ABC123DEF456',
149
+ id: 'tx-id-123'
150
+ });
151
+ });
152
+
153
+ it('should call xrpl_signAndSubmit with correct params', async () => {
154
+ await signer.submitTransaction(mockParams);
155
+
156
+ expect(mockClient.request).toHaveBeenCalledWith(
157
+ expect.objectContaining({
158
+ topic: 'test-topic',
159
+ chainId: 'xrpl:testnet',
160
+ request: expect.objectContaining({
161
+ method: 'xrpl_signAndSubmit',
162
+ params: expect.objectContaining({
163
+ transaction: expect.any(Object)
164
+ })
165
+ })
166
+ })
167
+ );
168
+ });
169
+
170
+ it('should return transaction ID and hash', async () => {
171
+ const result = await signer.submitTransaction(mockParams);
172
+
173
+ expect(result).toEqual({
174
+ transactionId: 'ABC123DEF456',
175
+ transactionHash: 'ABC123DEF456',
176
+ metadata: expect.any(Object)
177
+ });
178
+ });
179
+
180
+ it('should return empty transactionId if hash missing', async () => {
181
+ // The implementation extracts transactionId from hash or tx_json.hash
182
+ // If both are missing, it returns empty string
183
+ vi.mocked(mockClient.request).mockResolvedValue({
184
+ id: 'tx-id-only' // id is not used for transactionId
185
+ });
186
+
187
+ const result = await signer.submitTransaction(mockParams);
188
+
189
+ // Returns empty string when hash fields are not present
190
+ expect(result.transactionId).toBe('');
191
+ });
192
+
193
+ it('should throw error if submission fails', async () => {
194
+ vi.mocked(mockClient.request).mockRejectedValue(new Error('Network error'));
195
+
196
+ await expect(signer.submitTransaction(mockParams)).rejects.toThrow('XRPL submit failed');
197
+ });
198
+ });
199
+
200
+ describe('parseAccounts', () => {
201
+ it('should parse XRPL account format correctly', () => {
202
+ const namespace = {
203
+ accounts: [
204
+ 'xrpl:testnet:rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
205
+ 'xrpl:testnet:rLHzPsX6oXkzU9qL8qWDwgNfEwgR7pqxjy',
206
+ 'xrpl:mainnet:rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv'
207
+ ]
208
+ };
209
+
210
+ const accounts = signer.parseAccounts(namespace);
211
+
212
+ expect(accounts).toHaveLength(3);
213
+ expect(accounts[0]).toEqual({
214
+ address: 'rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
215
+ chainId: 'xrpl:testnet'
216
+ });
217
+ expect(accounts[2]).toEqual({
218
+ address: 'rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv',
219
+ chainId: 'xrpl:mainnet'
220
+ });
221
+ });
222
+
223
+ it('should handle invalid account format gracefully', () => {
224
+ const namespace = {
225
+ accounts: ['invalid']
226
+ };
227
+
228
+ const accounts = signer.parseAccounts(namespace);
229
+
230
+ expect(accounts).toHaveLength(1);
231
+ expect(accounts[0]).toEqual({
232
+ address: 'invalid',
233
+ chainId: 'xrpl:testnet'
234
+ });
235
+ });
236
+
237
+ it('should handle empty accounts', () => {
238
+ const namespace = {
239
+ accounts: []
240
+ };
241
+
242
+ const accounts = signer.parseAccounts(namespace);
243
+
244
+ expect(accounts).toHaveLength(0);
245
+ });
246
+
247
+ describe('network filtering', () => {
248
+ const mixedNetworkNamespace = {
249
+ accounts: [
250
+ 'xrpl:testnet:rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
251
+ 'xrpl:testnet:rLHzPsX6oXkzU9qL8qWDwgNfEwgR7pqxjy',
252
+ 'xrpl:mainnet:rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv',
253
+ 'xrpl:mainnet:rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh',
254
+ 'xrpl:devnet:rBKz5MC2iXdoS3XgnNSYmF69K1Yo4NS3Ws'
255
+ ]
256
+ };
257
+
258
+ it('should filter accounts by testnet when targetNetworkId is specified', () => {
259
+ const accounts = signer.parseAccounts(mixedNetworkNamespace, 'xrpl:testnet');
260
+
261
+ expect(accounts).toHaveLength(2);
262
+ expect(accounts.every(acc => acc.chainId === 'xrpl:testnet')).toBe(true);
263
+ });
264
+
265
+ it('should filter accounts by mainnet when targetNetworkId is specified', () => {
266
+ const accounts = signer.parseAccounts(mixedNetworkNamespace, 'xrpl:mainnet');
267
+
268
+ expect(accounts).toHaveLength(2);
269
+ expect(accounts.every(acc => acc.chainId === 'xrpl:mainnet')).toBe(true);
270
+ });
271
+
272
+ it('should filter accounts by devnet when targetNetworkId is specified', () => {
273
+ const accounts = signer.parseAccounts(mixedNetworkNamespace, 'xrpl:devnet');
274
+
275
+ expect(accounts).toHaveLength(1);
276
+ expect(accounts[0].chainId).toBe('xrpl:devnet');
277
+ });
278
+
279
+ it('should return empty array if no accounts match target network', () => {
280
+ const testnetOnlyNamespace = {
281
+ accounts: ['xrpl:testnet:rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE']
282
+ };
283
+
284
+ const accounts = signer.parseAccounts(testnetOnlyNamespace, 'xrpl:mainnet');
285
+
286
+ expect(accounts).toHaveLength(0);
287
+ });
288
+
289
+ it('should return all accounts when no targetNetworkId is provided', () => {
290
+ const accounts = signer.parseAccounts(mixedNetworkNamespace);
291
+
292
+ expect(accounts).toHaveLength(5);
293
+ });
294
+ });
295
+ });
296
+ });