@hsuite/native-connect-angular 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/coverage/coverage-summary.json +25 -21
  2. package/coverage/index.html +108 -108
  3. package/coverage/lcov-report/index.html +108 -108
  4. package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
  5. package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +1 -1
  6. package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
  7. package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +1 -1
  8. package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +13 -19
  9. package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +1 -1
  10. package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
  11. package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +1 -1
  12. package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1 -1
  13. package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1 -1
  14. package/coverage/lcov-report/lib/components/account-selector/index.html +5 -5
  15. package/coverage/lcov-report/lib/components/wallet-account-display/index.html +1 -1
  16. package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +10 -10
  17. package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +1 -1
  18. package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +1 -1
  19. package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +1 -1
  20. package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
  21. package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +1 -1
  22. package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
  23. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +1 -1
  24. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +1 -1
  25. package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +15 -15
  26. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +1 -1
  27. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +1 -1
  28. package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +84 -36
  29. package/coverage/lcov-report/lib/components/wallet-session-display/index.html +1 -1
  30. package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
  31. package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +1 -1
  32. package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
  33. package/coverage/lcov-report/lib/directives/index.html +1 -1
  34. package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +1 -1
  35. package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +1 -1
  36. package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +1 -1
  37. package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +1 -1
  38. package/coverage/lcov-report/lib/index.html +1 -1
  39. package/coverage/lcov-report/lib/models/connection-config.model.ts.html +1 -1
  40. package/coverage/lcov-report/lib/models/index.html +7 -7
  41. package/coverage/lcov-report/lib/models/provider-types.ts.html +11 -5
  42. package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +20 -20
  43. package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +639 -636
  44. package/coverage/lcov-report/lib/providers/hsuite-native/index.html +19 -19
  45. package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +1 -1
  46. package/coverage/lcov-report/lib/providers/index.html +18 -18
  47. package/coverage/lcov-report/lib/providers/p2p-native/index.html +22 -22
  48. package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
  49. package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +7 -4
  50. package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1 -1
  51. package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +65 -65
  52. package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +240 -240
  53. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
  54. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1108 -1105
  55. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
  56. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
  57. package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
  58. package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +43 -43
  59. package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
  60. package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
  61. package/coverage/lcov-report/lib/services/hsuite-auth.interceptor.ts.html +568 -0
  62. package/coverage/lcov-report/lib/services/index.html +50 -20
  63. package/coverage/lcov-report/lib/services/logger.service.ts.html +1 -1
  64. package/coverage/lcov-report/lib/services/smart-session.service.ts.html +1264 -0
  65. package/coverage/lcov-report/lib/services/transaction-builders/active-account-source.ts.html +250 -0
  66. package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  67. package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
  68. package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
  69. package/coverage/lcov-report/lib/services/transaction-builders/index.html +58 -43
  70. package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
  71. package/coverage/lcov-report/lib/services/transaction.service.ts.html +4 -4
  72. package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +3 -3
  73. package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +1 -1
  74. package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +249 -249
  75. package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +1 -1
  76. package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +1 -1
  77. package/coverage/lcov-report/lib/transports/index.html +1 -1
  78. package/coverage/lcov-report/lib/utils/index.html +36 -21
  79. package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +254 -161
  80. package/coverage/lcov-report/lib/utils/ledger-ui-registry.ts.html +676 -0
  81. package/coverage/lcov.info +8567 -6896
  82. package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
  83. package/coverage/lib/components/account-selector/account-actions/index.html +1 -1
  84. package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
  85. package/coverage/lib/components/account-selector/account-filter/index.html +1 -1
  86. package/coverage/lib/components/account-selector/account-formatting.service.ts.html +13 -19
  87. package/coverage/lib/components/account-selector/account-grouping.service.ts.html +1 -1
  88. package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
  89. package/coverage/lib/components/account-selector/account-list/index.html +1 -1
  90. package/coverage/lib/components/account-selector/account-selector.component.ts.html +1 -1
  91. package/coverage/lib/components/account-selector/account-selector.service.ts.html +1 -1
  92. package/coverage/lib/components/account-selector/index.html +5 -5
  93. package/coverage/lib/components/wallet-account-display/index.html +1 -1
  94. package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +10 -10
  95. package/coverage/lib/components/wallet-connect-button/index.html +1 -1
  96. package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +1 -1
  97. package/coverage/lib/components/wallet-connect-prompt/index.html +1 -1
  98. package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
  99. package/coverage/lib/components/wallet-connected-guard/index.html +1 -1
  100. package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
  101. package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +1 -1
  102. package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +1 -1
  103. package/coverage/lib/components/wallet-connection-modal/index.html +15 -15
  104. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +1 -1
  105. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +1 -1
  106. package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +84 -36
  107. package/coverage/lib/components/wallet-session-display/index.html +1 -1
  108. package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
  109. package/coverage/lib/components/wallet-transaction-status/index.html +1 -1
  110. package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
  111. package/coverage/lib/directives/index.html +1 -1
  112. package/coverage/lib/directives/wallet-connected.directive.ts.html +1 -1
  113. package/coverage/lib/directives/wallet-context.directive.ts.html +1 -1
  114. package/coverage/lib/directives/wallet-events.directive.ts.html +1 -1
  115. package/coverage/lib/hsuite-wallet.module.ts.html +1 -1
  116. package/coverage/lib/index.html +1 -1
  117. package/coverage/lib/models/connection-config.model.ts.html +1 -1
  118. package/coverage/lib/models/index.html +7 -7
  119. package/coverage/lib/models/provider-types.ts.html +11 -5
  120. package/coverage/lib/providers/base-wallet-provider.ts.html +20 -20
  121. package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +639 -636
  122. package/coverage/lib/providers/hsuite-native/index.html +19 -19
  123. package/coverage/lib/providers/hsuite-native-provider.ts.html +1 -1
  124. package/coverage/lib/providers/index.html +18 -18
  125. package/coverage/lib/providers/p2p-native/index.html +22 -22
  126. package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
  127. package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +7 -4
  128. package/coverage/lib/providers/wallet-error-handler.ts.html +1 -1
  129. package/coverage/lib/providers/walletconnect/core/index.html +65 -65
  130. package/coverage/lib/providers/walletconnect/core/session-health.ts.html +240 -240
  131. package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
  132. package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1108 -1105
  133. package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
  134. package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
  135. package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
  136. package/coverage/lib/providers/walletconnect/signers/index.html +43 -43
  137. package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
  138. package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
  139. package/coverage/lib/services/hsuite-auth.interceptor.ts.html +568 -0
  140. package/coverage/lib/services/index.html +50 -20
  141. package/coverage/lib/services/logger.service.ts.html +1 -1
  142. package/coverage/lib/services/smart-session.service.ts.html +1264 -0
  143. package/coverage/lib/services/transaction-builders/active-account-source.ts.html +250 -0
  144. package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  145. package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
  146. package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
  147. package/coverage/lib/services/transaction-builders/index.html +58 -43
  148. package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
  149. package/coverage/lib/services/transaction.service.ts.html +4 -4
  150. package/coverage/lib/services/unified-wallet.service.ts.html +3 -3
  151. package/coverage/lib/services/wallet-context.service.ts.html +1 -1
  152. package/coverage/lib/services/wallet-event-bus.service.ts.html +249 -249
  153. package/coverage/lib/services/wallet-providers.service.ts.html +1 -1
  154. package/coverage/lib/transports/chrome-extension-transport.ts.html +1 -1
  155. package/coverage/lib/transports/index.html +1 -1
  156. package/coverage/lib/utils/index.html +36 -21
  157. package/coverage/lib/utils/ledger-icons.util.ts.html +254 -161
  158. package/coverage/lib/utils/ledger-ui-registry.ts.html +676 -0
  159. package/dist/fesm2022/hsuite-native-connect-angular.mjs +854 -308
  160. package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -1
  161. package/dist/index.d.ts +456 -30
  162. package/package.json +4 -4
  163. package/src/index.ts +26 -0
  164. package/src/lib/components/account-selector/account-formatting.service.ts +8 -10
  165. package/src/lib/components/wallet-account-display/wallet-account-display.component.ts +9 -9
  166. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +34 -18
  167. package/src/lib/models/provider-types.ts +3 -1
  168. package/src/lib/models/unified-account.model.ts +4 -1
  169. package/src/lib/providers/hsuite-native/channel-client.service.ts +1 -0
  170. package/src/lib/providers/p2p-native/p2p-session-manager.ts +1 -0
  171. package/src/lib/providers/walletconnect/core/walletconnect-provider.ts +2 -1
  172. package/src/lib/services/hsuite-auth.interceptor.ts +159 -0
  173. package/src/lib/services/smart-session.service.ts +378 -0
  174. package/src/lib/services/transaction-builders/active-account-source.spec.ts +75 -0
  175. package/src/lib/services/transaction-builders/active-account-source.ts +55 -0
  176. package/src/lib/services/transaction-builders/hedera-transaction-builder.service.ts +4 -4
  177. package/src/lib/services/transaction-builders/index.ts +1 -0
  178. package/src/lib/services/transaction.service.ts +7 -3
  179. package/src/lib/services/unified-wallet.service.spec.ts +1 -1
  180. package/src/lib/services/unified-wallet.service.ts +2 -2
  181. package/src/lib/utils/index.ts +1 -0
  182. package/src/lib/utils/ledger-icons.util.ts +61 -30
  183. package/src/lib/utils/ledger-ui-registry.ts +197 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
26
+ <span class="strong">36.38% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/862</span>
28
+ <span class='fraction'>314/863</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">50% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/1</span>
35
+ <span class='fraction'>3/6</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">18.75% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/1</span>
42
+ <span class='fraction'>3/16</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">36.38% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/862</span>
49
+ <span class='fraction'>314/863</span>
50
50
  </div>
51
51
 
52
52
 
@@ -925,9 +925,170 @@
925
925
  <a name='L860'></a><a href='#L860'>860</a>
926
926
  <a name='L861'></a><a href='#L861'>861</a>
927
927
  <a name='L862'></a><a href='#L862'>862</a>
928
- <a name='L863'></a><a href='#L863'>863</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
930
+ <span class="cline-any cline-yes">1x</span>
931
+ <span class="cline-any cline-yes">1x</span>
932
+ <span class="cline-any cline-yes">1x</span>
933
+ <span class="cline-any cline-yes">1x</span>
934
+ <span class="cline-any cline-yes">1x</span>
935
+ <span class="cline-any cline-yes">1x</span>
936
+ <span class="cline-any cline-yes">1x</span>
937
+ <span class="cline-any cline-yes">1x</span>
938
+ <span class="cline-any cline-yes">1x</span>
939
+ <span class="cline-any cline-yes">1x</span>
940
+ <span class="cline-any cline-yes">1x</span>
941
+ <span class="cline-any cline-yes">1x</span>
942
+ <span class="cline-any cline-yes">1x</span>
943
+ <span class="cline-any cline-yes">1x</span>
944
+ <span class="cline-any cline-yes">1x</span>
945
+ <span class="cline-any cline-yes">1x</span>
946
+ <span class="cline-any cline-yes">1x</span>
947
+ <span class="cline-any cline-yes">1x</span>
948
+ <span class="cline-any cline-yes">1x</span>
949
+ <span class="cline-any cline-yes">1x</span>
950
+ <span class="cline-any cline-yes">1x</span>
951
+ <span class="cline-any cline-yes">1x</span>
952
+ <span class="cline-any cline-yes">1x</span>
953
+ <span class="cline-any cline-yes">1x</span>
954
+ <span class="cline-any cline-yes">1x</span>
955
+ <span class="cline-any cline-yes">1x</span>
956
+ <span class="cline-any cline-yes">1x</span>
957
+ <span class="cline-any cline-yes">1x</span>
958
+ <span class="cline-any cline-yes">1x</span>
959
+ <span class="cline-any cline-yes">1x</span>
960
+ <span class="cline-any cline-yes">1x</span>
961
+ <span class="cline-any cline-yes">1x</span>
962
+ <span class="cline-any cline-yes">1x</span>
963
+ <span class="cline-any cline-yes">1x</span>
964
+ <span class="cline-any cline-yes">1x</span>
965
+ <span class="cline-any cline-yes">1x</span>
966
+ <span class="cline-any cline-yes">1x</span>
967
+ <span class="cline-any cline-yes">1x</span>
968
+ <span class="cline-any cline-yes">1x</span>
969
+ <span class="cline-any cline-yes">1x</span>
970
+ <span class="cline-any cline-yes">1x</span>
971
+ <span class="cline-any cline-yes">1x</span>
972
+ <span class="cline-any cline-yes">1x</span>
973
+ <span class="cline-any cline-yes">1x</span>
974
+ <span class="cline-any cline-yes">1x</span>
975
+ <span class="cline-any cline-yes">1x</span>
976
+ <span class="cline-any cline-yes">1x</span>
977
+ <span class="cline-any cline-yes">1x</span>
978
+ <span class="cline-any cline-yes">1x</span>
979
+ <span class="cline-any cline-yes">1x</span>
980
+ <span class="cline-any cline-yes">1x</span>
981
+ <span class="cline-any cline-yes">1x</span>
982
+ <span class="cline-any cline-yes">1x</span>
983
+ <span class="cline-any cline-yes">1x</span>
984
+ <span class="cline-any cline-yes">1x</span>
985
+ <span class="cline-any cline-yes">1x</span>
986
+ <span class="cline-any cline-yes">1x</span>
987
+ <span class="cline-any cline-yes">1x</span>
988
+ <span class="cline-any cline-yes">1x</span>
989
+ <span class="cline-any cline-yes">1x</span>
990
+ <span class="cline-any cline-yes">1x</span>
991
+ <span class="cline-any cline-yes">1x</span>
992
+ <span class="cline-any cline-yes">1x</span>
993
+ <span class="cline-any cline-yes">1x</span>
994
+ <span class="cline-any cline-yes">1x</span>
995
+ <span class="cline-any cline-yes">1x</span>
996
+ <span class="cline-any cline-yes">1x</span>
997
+ <span class="cline-any cline-yes">1x</span>
998
+ <span class="cline-any cline-yes">1x</span>
999
+ <span class="cline-any cline-yes">1x</span>
1000
+ <span class="cline-any cline-yes">1x</span>
1001
+ <span class="cline-any cline-yes">1x</span>
1002
+ <span class="cline-any cline-yes">1x</span>
1003
+ <span class="cline-any cline-yes">1x</span>
1004
+ <span class="cline-any cline-yes">1x</span>
1005
+ <span class="cline-any cline-yes">1x</span>
1006
+ <span class="cline-any cline-yes">1x</span>
1007
+ <span class="cline-any cline-yes">1x</span>
1008
+ <span class="cline-any cline-yes">1x</span>
1009
+ <span class="cline-any cline-yes">1x</span>
1010
+ <span class="cline-any cline-yes">1x</span>
1011
+ <span class="cline-any cline-yes">1x</span>
1012
+ <span class="cline-any cline-yes">1x</span>
1013
+ <span class="cline-any cline-yes">1x</span>
1014
+ <span class="cline-any cline-yes">1x</span>
1015
+ <span class="cline-any cline-yes">1x</span>
1016
+ <span class="cline-any cline-yes">1x</span>
1017
+ <span class="cline-any cline-yes">1x</span>
1018
+ <span class="cline-any cline-yes">1x</span>
1019
+ <span class="cline-any cline-yes">1x</span>
1020
+ <span class="cline-any cline-yes">1x</span>
1021
+ <span class="cline-any cline-yes">1x</span>
1022
+ <span class="cline-any cline-yes">1x</span>
1023
+ <span class="cline-any cline-yes">1x</span>
1024
+ <span class="cline-any cline-yes">1x</span>
1025
+ <span class="cline-any cline-yes">1x</span>
1026
+ <span class="cline-any cline-yes">1x</span>
1027
+ <span class="cline-any cline-yes">1x</span>
1028
+ <span class="cline-any cline-yes">1x</span>
1029
+ <span class="cline-any cline-yes">1x</span>
1030
+ <span class="cline-any cline-yes">1x</span>
1031
+ <span class="cline-any cline-yes">1x</span>
1032
+ <span class="cline-any cline-yes">1x</span>
1033
+ <span class="cline-any cline-yes">1x</span>
1034
+ <span class="cline-any cline-yes">1x</span>
1035
+ <span class="cline-any cline-yes">1x</span>
1036
+ <span class="cline-any cline-yes">1x</span>
1037
+ <span class="cline-any cline-yes">1x</span>
1038
+ <span class="cline-any cline-yes">1x</span>
1039
+ <span class="cline-any cline-yes">1x</span>
1040
+ <span class="cline-any cline-yes">1x</span>
1041
+ <span class="cline-any cline-yes">1x</span>
1042
+ <span class="cline-any cline-yes">1x</span>
1043
+ <span class="cline-any cline-yes">1x</span>
1044
+ <span class="cline-any cline-yes">1x</span>
1045
+ <span class="cline-any cline-yes">1x</span>
1046
+ <span class="cline-any cline-yes">1x</span>
1047
+ <span class="cline-any cline-yes">2x</span>
1048
+ <span class="cline-any cline-yes">2x</span>
1049
+ <span class="cline-any cline-yes">2x</span>
1050
+ <span class="cline-any cline-yes">2x</span>
1051
+ <span class="cline-any cline-yes">2x</span>
1052
+ <span class="cline-any cline-yes">2x</span>
1053
+ <span class="cline-any cline-yes">2x</span>
1054
+ <span class="cline-any cline-yes">2x</span>
1055
+ <span class="cline-any cline-yes">2x</span>
1056
+ <span class="cline-any cline-yes">2x</span>
1057
+ <span class="cline-any cline-yes">2x</span>
1058
+ <span class="cline-any cline-yes">2x</span>
1059
+ <span class="cline-any cline-yes">2x</span>
1060
+ <span class="cline-any cline-yes">2x</span>
1061
+ <span class="cline-any cline-yes">2x</span>
1062
+ <span class="cline-any cline-yes">2x</span>
1063
+ <span class="cline-any cline-yes">2x</span>
1064
+ <span class="cline-any cline-yes">2x</span>
1065
+ <span class="cline-any cline-yes">2x</span>
1066
+ <span class="cline-any cline-yes">2x</span>
1067
+ <span class="cline-any cline-yes">2x</span>
1068
+ <span class="cline-any cline-yes">2x</span>
1069
+ <span class="cline-any cline-yes">2x</span>
1070
+ <span class="cline-any cline-yes">2x</span>
1071
+ <span class="cline-any cline-yes">2x</span>
1072
+ <span class="cline-any cline-yes">2x</span>
1073
+ <span class="cline-any cline-yes">2x</span>
1074
+ <span class="cline-any cline-yes">2x</span>
1075
+ <span class="cline-any cline-yes">2x</span>
1076
+ <span class="cline-any cline-yes">2x</span>
1077
+ <span class="cline-any cline-yes">2x</span>
1078
+ <span class="cline-any cline-yes">2x</span>
1079
+ <span class="cline-any cline-yes">2x</span>
1080
+ <span class="cline-any cline-yes">2x</span>
1081
+ <span class="cline-any cline-yes">2x</span>
1082
+ <span class="cline-any cline-yes">2x</span>
1083
+ <span class="cline-any cline-yes">2x</span>
1084
+ <span class="cline-any cline-yes">2x</span>
1085
+ <span class="cline-any cline-yes">2x</span>
929
1086
  <span class="cline-any cline-no">&nbsp;</span>
930
1087
  <span class="cline-any cline-no">&nbsp;</span>
1088
+ <span class="cline-any cline-yes">2x</span>
1089
+ <span class="cline-any cline-yes">2x</span>
1090
+ <span class="cline-any cline-yes">2x</span>
1091
+ <span class="cline-any cline-yes">2x</span>
931
1092
  <span class="cline-any cline-no">&nbsp;</span>
932
1093
  <span class="cline-any cline-no">&nbsp;</span>
933
1094
  <span class="cline-any cline-no">&nbsp;</span>
@@ -954,6 +1115,30 @@
954
1115
  <span class="cline-any cline-no">&nbsp;</span>
955
1116
  <span class="cline-any cline-no">&nbsp;</span>
956
1117
  <span class="cline-any cline-no">&nbsp;</span>
1118
+ <span class="cline-any cline-yes">2x</span>
1119
+ <span class="cline-any cline-yes">2x</span>
1120
+ <span class="cline-any cline-yes">2x</span>
1121
+ <span class="cline-any cline-yes">2x</span>
1122
+ <span class="cline-any cline-yes">2x</span>
1123
+ <span class="cline-any cline-yes">2x</span>
1124
+ <span class="cline-any cline-yes">2x</span>
1125
+ <span class="cline-any cline-yes">2x</span>
1126
+ <span class="cline-any cline-yes">2x</span>
1127
+ <span class="cline-any cline-yes">2x</span>
1128
+ <span class="cline-any cline-yes">2x</span>
1129
+ <span class="cline-any cline-yes">2x</span>
1130
+ <span class="cline-any cline-yes">2x</span>
1131
+ <span class="cline-any cline-yes">2x</span>
1132
+ <span class="cline-any cline-yes">2x</span>
1133
+ <span class="cline-any cline-yes">2x</span>
1134
+ <span class="cline-any cline-yes">2x</span>
1135
+ <span class="cline-any cline-yes">2x</span>
1136
+ <span class="cline-any cline-yes">2x</span>
1137
+ <span class="cline-any cline-yes">2x</span>
1138
+ <span class="cline-any cline-yes">2x</span>
1139
+ <span class="cline-any cline-yes">2x</span>
1140
+ <span class="cline-any cline-yes">2x</span>
1141
+ <span class="cline-any cline-yes">2x</span>
957
1142
  <span class="cline-any cline-no">&nbsp;</span>
958
1143
  <span class="cline-any cline-no">&nbsp;</span>
959
1144
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1106,8 +1291,33 @@
1106
1291
  <span class="cline-any cline-no">&nbsp;</span>
1107
1292
  <span class="cline-any cline-no">&nbsp;</span>
1108
1293
  <span class="cline-any cline-no">&nbsp;</span>
1294
+ <span class="cline-any cline-yes">2x</span>
1295
+ <span class="cline-any cline-yes">2x</span>
1296
+ <span class="cline-any cline-yes">2x</span>
1297
+ <span class="cline-any cline-yes">2x</span>
1298
+ <span class="cline-any cline-yes">2x</span>
1299
+ <span class="cline-any cline-yes">2x</span>
1300
+ <span class="cline-any cline-yes">2x</span>
1301
+ <span class="cline-any cline-yes">2x</span>
1302
+ <span class="cline-any cline-yes">2x</span>
1303
+ <span class="cline-any cline-yes">2x</span>
1304
+ <span class="cline-any cline-yes">2x</span>
1109
1305
  <span class="cline-any cline-no">&nbsp;</span>
1110
1306
  <span class="cline-any cline-no">&nbsp;</span>
1307
+ <span class="cline-any cline-yes">2x</span>
1308
+ <span class="cline-any cline-yes">2x</span>
1309
+ <span class="cline-any cline-yes">2x</span>
1310
+ <span class="cline-any cline-yes">2x</span>
1311
+ <span class="cline-any cline-yes">2x</span>
1312
+ <span class="cline-any cline-yes">2x</span>
1313
+ <span class="cline-any cline-yes">2x</span>
1314
+ <span class="cline-any cline-yes">2x</span>
1315
+ <span class="cline-any cline-yes">2x</span>
1316
+ <span class="cline-any cline-yes">2x</span>
1317
+ <span class="cline-any cline-yes">2x</span>
1318
+ <span class="cline-any cline-yes">2x</span>
1319
+ <span class="cline-any cline-yes">2x</span>
1320
+ <span class="cline-any cline-yes">2x</span>
1111
1321
  <span class="cline-any cline-no">&nbsp;</span>
1112
1322
  <span class="cline-any cline-no">&nbsp;</span>
1113
1323
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1127,6 +1337,22 @@
1127
1337
  <span class="cline-any cline-no">&nbsp;</span>
1128
1338
  <span class="cline-any cline-no">&nbsp;</span>
1129
1339
  <span class="cline-any cline-no">&nbsp;</span>
1340
+ <span class="cline-any cline-yes">2x</span>
1341
+ <span class="cline-any cline-yes">2x</span>
1342
+ <span class="cline-any cline-yes">2x</span>
1343
+ <span class="cline-any cline-yes">2x</span>
1344
+ <span class="cline-any cline-yes">2x</span>
1345
+ <span class="cline-any cline-yes">2x</span>
1346
+ <span class="cline-any cline-yes">2x</span>
1347
+ <span class="cline-any cline-yes">2x</span>
1348
+ <span class="cline-any cline-yes">2x</span>
1349
+ <span class="cline-any cline-yes">2x</span>
1350
+ <span class="cline-any cline-yes">2x</span>
1351
+ <span class="cline-any cline-yes">2x</span>
1352
+ <span class="cline-any cline-yes">2x</span>
1353
+ <span class="cline-any cline-yes">2x</span>
1354
+ <span class="cline-any cline-yes">2x</span>
1355
+ <span class="cline-any cline-yes">2x</span>
1130
1356
  <span class="cline-any cline-no">&nbsp;</span>
1131
1357
  <span class="cline-any cline-no">&nbsp;</span>
1132
1358
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1150,6 +1376,25 @@
1150
1376
  <span class="cline-any cline-no">&nbsp;</span>
1151
1377
  <span class="cline-any cline-no">&nbsp;</span>
1152
1378
  <span class="cline-any cline-no">&nbsp;</span>
1379
+ <span class="cline-any cline-yes">2x</span>
1380
+ <span class="cline-any cline-yes">2x</span>
1381
+ <span class="cline-any cline-yes">2x</span>
1382
+ <span class="cline-any cline-yes">2x</span>
1383
+ <span class="cline-any cline-yes">2x</span>
1384
+ <span class="cline-any cline-yes">2x</span>
1385
+ <span class="cline-any cline-yes">2x</span>
1386
+ <span class="cline-any cline-yes">2x</span>
1387
+ <span class="cline-any cline-yes">2x</span>
1388
+ <span class="cline-any cline-yes">2x</span>
1389
+ <span class="cline-any cline-yes">2x</span>
1390
+ <span class="cline-any cline-yes">2x</span>
1391
+ <span class="cline-any cline-yes">2x</span>
1392
+ <span class="cline-any cline-yes">2x</span>
1393
+ <span class="cline-any cline-yes">2x</span>
1394
+ <span class="cline-any cline-yes">2x</span>
1395
+ <span class="cline-any cline-yes">2x</span>
1396
+ <span class="cline-any cline-yes">2x</span>
1397
+ <span class="cline-any cline-yes">2x</span>
1153
1398
  <span class="cline-any cline-no">&nbsp;</span>
1154
1399
  <span class="cline-any cline-no">&nbsp;</span>
1155
1400
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1186,6 +1431,11 @@
1186
1431
  <span class="cline-any cline-no">&nbsp;</span>
1187
1432
  <span class="cline-any cline-no">&nbsp;</span>
1188
1433
  <span class="cline-any cline-no">&nbsp;</span>
1434
+ <span class="cline-any cline-yes">2x</span>
1435
+ <span class="cline-any cline-yes">2x</span>
1436
+ <span class="cline-any cline-yes">2x</span>
1437
+ <span class="cline-any cline-yes">2x</span>
1438
+ <span class="cline-any cline-yes">2x</span>
1189
1439
  <span class="cline-any cline-no">&nbsp;</span>
1190
1440
  <span class="cline-any cline-no">&nbsp;</span>
1191
1441
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1210,6 +1460,16 @@
1210
1460
  <span class="cline-any cline-no">&nbsp;</span>
1211
1461
  <span class="cline-any cline-no">&nbsp;</span>
1212
1462
  <span class="cline-any cline-no">&nbsp;</span>
1463
+ <span class="cline-any cline-yes">2x</span>
1464
+ <span class="cline-any cline-yes">2x</span>
1465
+ <span class="cline-any cline-yes">2x</span>
1466
+ <span class="cline-any cline-yes">2x</span>
1467
+ <span class="cline-any cline-yes">2x</span>
1468
+ <span class="cline-any cline-yes">2x</span>
1469
+ <span class="cline-any cline-yes">2x</span>
1470
+ <span class="cline-any cline-yes">2x</span>
1471
+ <span class="cline-any cline-yes">2x</span>
1472
+ <span class="cline-any cline-yes">2x</span>
1213
1473
  <span class="cline-any cline-no">&nbsp;</span>
1214
1474
  <span class="cline-any cline-no">&nbsp;</span>
1215
1475
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1331,12 +1591,32 @@
1331
1591
  <span class="cline-any cline-no">&nbsp;</span>
1332
1592
  <span class="cline-any cline-no">&nbsp;</span>
1333
1593
  <span class="cline-any cline-no">&nbsp;</span>
1594
+ <span class="cline-any cline-yes">2x</span>
1595
+ <span class="cline-any cline-yes">2x</span>
1596
+ <span class="cline-any cline-yes">2x</span>
1597
+ <span class="cline-any cline-yes">2x</span>
1598
+ <span class="cline-any cline-yes">2x</span>
1599
+ <span class="cline-any cline-yes">2x</span>
1600
+ <span class="cline-any cline-yes">2x</span>
1601
+ <span class="cline-any cline-yes">2x</span>
1602
+ <span class="cline-any cline-yes">2x</span>
1603
+ <span class="cline-any cline-yes">2x</span>
1334
1604
  <span class="cline-any cline-no">&nbsp;</span>
1335
1605
  <span class="cline-any cline-no">&nbsp;</span>
1336
1606
  <span class="cline-any cline-no">&nbsp;</span>
1337
1607
  <span class="cline-any cline-no">&nbsp;</span>
1338
1608
  <span class="cline-any cline-no">&nbsp;</span>
1339
1609
  <span class="cline-any cline-no">&nbsp;</span>
1610
+ <span class="cline-any cline-yes">2x</span>
1611
+ <span class="cline-any cline-yes">2x</span>
1612
+ <span class="cline-any cline-yes">2x</span>
1613
+ <span class="cline-any cline-yes">2x</span>
1614
+ <span class="cline-any cline-yes">2x</span>
1615
+ <span class="cline-any cline-yes">2x</span>
1616
+ <span class="cline-any cline-yes">2x</span>
1617
+ <span class="cline-any cline-yes">2x</span>
1618
+ <span class="cline-any cline-yes">2x</span>
1619
+ <span class="cline-any cline-yes">2x</span>
1340
1620
  <span class="cline-any cline-no">&nbsp;</span>
1341
1621
  <span class="cline-any cline-no">&nbsp;</span>
1342
1622
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1407,11 +1687,27 @@
1407
1687
  <span class="cline-any cline-no">&nbsp;</span>
1408
1688
  <span class="cline-any cline-no">&nbsp;</span>
1409
1689
  <span class="cline-any cline-no">&nbsp;</span>
1690
+ <span class="cline-any cline-yes">2x</span>
1691
+ <span class="cline-any cline-yes">2x</span>
1692
+ <span class="cline-any cline-yes">2x</span>
1693
+ <span class="cline-any cline-yes">2x</span>
1694
+ <span class="cline-any cline-yes">2x</span>
1410
1695
  <span class="cline-any cline-no">&nbsp;</span>
1411
1696
  <span class="cline-any cline-no">&nbsp;</span>
1412
1697
  <span class="cline-any cline-no">&nbsp;</span>
1413
1698
  <span class="cline-any cline-no">&nbsp;</span>
1414
1699
  <span class="cline-any cline-no">&nbsp;</span>
1700
+ <span class="cline-any cline-yes">2x</span>
1701
+ <span class="cline-any cline-yes">2x</span>
1702
+ <span class="cline-any cline-yes">2x</span>
1703
+ <span class="cline-any cline-yes">2x</span>
1704
+ <span class="cline-any cline-yes">2x</span>
1705
+ <span class="cline-any cline-yes">2x</span>
1706
+ <span class="cline-any cline-yes">2x</span>
1707
+ <span class="cline-any cline-yes">2x</span>
1708
+ <span class="cline-any cline-yes">2x</span>
1709
+ <span class="cline-any cline-yes">2x</span>
1710
+ <span class="cline-any cline-yes">2x</span>
1415
1711
  <span class="cline-any cline-no">&nbsp;</span>
1416
1712
  <span class="cline-any cline-no">&nbsp;</span>
1417
1713
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1426,6 +1722,13 @@
1426
1722
  <span class="cline-any cline-no">&nbsp;</span>
1427
1723
  <span class="cline-any cline-no">&nbsp;</span>
1428
1724
  <span class="cline-any cline-no">&nbsp;</span>
1725
+ <span class="cline-any cline-yes">2x</span>
1726
+ <span class="cline-any cline-yes">2x</span>
1727
+ <span class="cline-any cline-yes">2x</span>
1728
+ <span class="cline-any cline-yes">2x</span>
1729
+ <span class="cline-any cline-yes">2x</span>
1730
+ <span class="cline-any cline-yes">2x</span>
1731
+ <span class="cline-any cline-yes">2x</span>
1429
1732
  <span class="cline-any cline-no">&nbsp;</span>
1430
1733
  <span class="cline-any cline-no">&nbsp;</span>
1431
1734
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1459,6 +1762,11 @@
1459
1762
  <span class="cline-any cline-no">&nbsp;</span>
1460
1763
  <span class="cline-any cline-no">&nbsp;</span>
1461
1764
  <span class="cline-any cline-no">&nbsp;</span>
1765
+ <span class="cline-any cline-yes">2x</span>
1766
+ <span class="cline-any cline-yes">2x</span>
1767
+ <span class="cline-any cline-yes">2x</span>
1768
+ <span class="cline-any cline-yes">2x</span>
1769
+ <span class="cline-any cline-yes">2x</span>
1462
1770
  <span class="cline-any cline-no">&nbsp;</span>
1463
1771
  <span class="cline-any cline-no">&nbsp;</span>
1464
1772
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1469,487 +1777,181 @@
1469
1777
  <span class="cline-any cline-no">&nbsp;</span>
1470
1778
  <span class="cline-any cline-no">&nbsp;</span>
1471
1779
  <span class="cline-any cline-no">&nbsp;</span>
1780
+ <span class="cline-any cline-yes">2x</span>
1781
+ <span class="cline-any cline-yes">2x</span>
1782
+ <span class="cline-any cline-yes">2x</span>
1783
+ <span class="cline-any cline-yes">2x</span>
1784
+ <span class="cline-any cline-yes">2x</span>
1472
1785
  <span class="cline-any cline-no">&nbsp;</span>
1473
1786
  <span class="cline-any cline-no">&nbsp;</span>
1474
1787
  <span class="cline-any cline-no">&nbsp;</span>
1475
1788
  <span class="cline-any cline-no">&nbsp;</span>
1476
1789
  <span class="cline-any cline-no">&nbsp;</span>
1477
1790
  <span class="cline-any cline-no">&nbsp;</span>
1478
- <span class="cline-any cline-no">&nbsp;</span>
1479
- <span class="cline-any cline-no">&nbsp;</span>
1480
- <span class="cline-any cline-no">&nbsp;</span>
1481
- <span class="cline-any cline-no">&nbsp;</span>
1482
- <span class="cline-any cline-no">&nbsp;</span>
1483
- <span class="cline-any cline-no">&nbsp;</span>
1484
- <span class="cline-any cline-no">&nbsp;</span>
1485
- <span class="cline-any cline-no">&nbsp;</span>
1486
- <span class="cline-any cline-no">&nbsp;</span>
1487
- <span class="cline-any cline-no">&nbsp;</span>
1488
- <span class="cline-any cline-no">&nbsp;</span>
1489
- <span class="cline-any cline-no">&nbsp;</span>
1490
- <span class="cline-any cline-no">&nbsp;</span>
1491
- <span class="cline-any cline-no">&nbsp;</span>
1492
- <span class="cline-any cline-no">&nbsp;</span>
1493
- <span class="cline-any cline-no">&nbsp;</span>
1494
- <span class="cline-any cline-no">&nbsp;</span>
1495
- <span class="cline-any cline-no">&nbsp;</span>
1496
- <span class="cline-any cline-no">&nbsp;</span>
1497
- <span class="cline-any cline-no">&nbsp;</span>
1498
- <span class="cline-any cline-no">&nbsp;</span>
1499
- <span class="cline-any cline-no">&nbsp;</span>
1500
- <span class="cline-any cline-no">&nbsp;</span>
1501
- <span class="cline-any cline-no">&nbsp;</span>
1502
- <span class="cline-any cline-no">&nbsp;</span>
1503
- <span class="cline-any cline-no">&nbsp;</span>
1504
- <span class="cline-any cline-no">&nbsp;</span>
1505
- <span class="cline-any cline-no">&nbsp;</span>
1506
- <span class="cline-any cline-no">&nbsp;</span>
1507
- <span class="cline-any cline-no">&nbsp;</span>
1508
- <span class="cline-any cline-no">&nbsp;</span>
1509
- <span class="cline-any cline-no">&nbsp;</span>
1510
- <span class="cline-any cline-no">&nbsp;</span>
1511
- <span class="cline-any cline-no">&nbsp;</span>
1512
- <span class="cline-any cline-no">&nbsp;</span>
1513
- <span class="cline-any cline-no">&nbsp;</span>
1514
- <span class="cline-any cline-no">&nbsp;</span>
1515
- <span class="cline-any cline-no">&nbsp;</span>
1516
- <span class="cline-any cline-no">&nbsp;</span>
1517
- <span class="cline-any cline-no">&nbsp;</span>
1518
- <span class="cline-any cline-no">&nbsp;</span>
1519
- <span class="cline-any cline-no">&nbsp;</span>
1520
- <span class="cline-any cline-no">&nbsp;</span>
1521
- <span class="cline-any cline-no">&nbsp;</span>
1522
- <span class="cline-any cline-no">&nbsp;</span>
1523
- <span class="cline-any cline-no">&nbsp;</span>
1524
- <span class="cline-any cline-no">&nbsp;</span>
1525
- <span class="cline-any cline-no">&nbsp;</span>
1526
- <span class="cline-any cline-no">&nbsp;</span>
1527
- <span class="cline-any cline-no">&nbsp;</span>
1528
- <span class="cline-any cline-no">&nbsp;</span>
1529
- <span class="cline-any cline-no">&nbsp;</span>
1530
- <span class="cline-any cline-no">&nbsp;</span>
1531
- <span class="cline-any cline-no">&nbsp;</span>
1532
- <span class="cline-any cline-no">&nbsp;</span>
1533
- <span class="cline-any cline-no">&nbsp;</span>
1534
- <span class="cline-any cline-no">&nbsp;</span>
1535
- <span class="cline-any cline-no">&nbsp;</span>
1536
- <span class="cline-any cline-no">&nbsp;</span>
1537
- <span class="cline-any cline-no">&nbsp;</span>
1538
- <span class="cline-any cline-no">&nbsp;</span>
1539
- <span class="cline-any cline-no">&nbsp;</span>
1540
- <span class="cline-any cline-no">&nbsp;</span>
1541
- <span class="cline-any cline-no">&nbsp;</span>
1542
- <span class="cline-any cline-no">&nbsp;</span>
1543
- <span class="cline-any cline-no">&nbsp;</span>
1544
- <span class="cline-any cline-no">&nbsp;</span>
1545
- <span class="cline-any cline-no">&nbsp;</span>
1546
- <span class="cline-any cline-no">&nbsp;</span>
1547
- <span class="cline-any cline-no">&nbsp;</span>
1548
- <span class="cline-any cline-no">&nbsp;</span>
1549
- <span class="cline-any cline-no">&nbsp;</span>
1550
- <span class="cline-any cline-no">&nbsp;</span>
1551
- <span class="cline-any cline-no">&nbsp;</span>
1552
- <span class="cline-any cline-no">&nbsp;</span>
1553
- <span class="cline-any cline-no">&nbsp;</span>
1554
- <span class="cline-any cline-no">&nbsp;</span>
1555
- <span class="cline-any cline-no">&nbsp;</span>
1556
- <span class="cline-any cline-no">&nbsp;</span>
1557
- <span class="cline-any cline-no">&nbsp;</span>
1558
- <span class="cline-any cline-no">&nbsp;</span>
1559
- <span class="cline-any cline-no">&nbsp;</span>
1560
- <span class="cline-any cline-no">&nbsp;</span>
1561
- <span class="cline-any cline-no">&nbsp;</span>
1562
- <span class="cline-any cline-no">&nbsp;</span>
1563
- <span class="cline-any cline-no">&nbsp;</span>
1564
- <span class="cline-any cline-no">&nbsp;</span>
1565
- <span class="cline-any cline-no">&nbsp;</span>
1566
- <span class="cline-any cline-no">&nbsp;</span>
1567
- <span class="cline-any cline-no">&nbsp;</span>
1568
- <span class="cline-any cline-no">&nbsp;</span>
1569
- <span class="cline-any cline-no">&nbsp;</span>
1570
- <span class="cline-any cline-no">&nbsp;</span>
1571
- <span class="cline-any cline-no">&nbsp;</span>
1572
- <span class="cline-any cline-no">&nbsp;</span>
1573
- <span class="cline-any cline-no">&nbsp;</span>
1574
- <span class="cline-any cline-no">&nbsp;</span>
1575
- <span class="cline-any cline-no">&nbsp;</span>
1576
- <span class="cline-any cline-no">&nbsp;</span>
1577
- <span class="cline-any cline-no">&nbsp;</span>
1578
- <span class="cline-any cline-no">&nbsp;</span>
1579
- <span class="cline-any cline-no">&nbsp;</span>
1580
- <span class="cline-any cline-no">&nbsp;</span>
1581
- <span class="cline-any cline-no">&nbsp;</span>
1582
- <span class="cline-any cline-no">&nbsp;</span>
1583
- <span class="cline-any cline-no">&nbsp;</span>
1584
- <span class="cline-any cline-no">&nbsp;</span>
1585
- <span class="cline-any cline-no">&nbsp;</span>
1586
- <span class="cline-any cline-no">&nbsp;</span>
1587
- <span class="cline-any cline-no">&nbsp;</span>
1588
- <span class="cline-any cline-no">&nbsp;</span>
1589
- <span class="cline-any cline-no">&nbsp;</span>
1590
- <span class="cline-any cline-no">&nbsp;</span>
1591
- <span class="cline-any cline-no">&nbsp;</span>
1592
- <span class="cline-any cline-no">&nbsp;</span>
1593
- <span class="cline-any cline-no">&nbsp;</span>
1594
- <span class="cline-any cline-no">&nbsp;</span>
1595
- <span class="cline-any cline-no">&nbsp;</span>
1596
- <span class="cline-any cline-no">&nbsp;</span>
1597
- <span class="cline-any cline-no">&nbsp;</span>
1598
- <span class="cline-any cline-no">&nbsp;</span>
1599
- <span class="cline-any cline-no">&nbsp;</span>
1600
- <span class="cline-any cline-no">&nbsp;</span>
1601
- <span class="cline-any cline-no">&nbsp;</span>
1602
- <span class="cline-any cline-no">&nbsp;</span>
1603
- <span class="cline-any cline-no">&nbsp;</span>
1604
- <span class="cline-any cline-no">&nbsp;</span>
1605
- <span class="cline-any cline-no">&nbsp;</span>
1606
- <span class="cline-any cline-no">&nbsp;</span>
1607
- <span class="cline-any cline-no">&nbsp;</span>
1608
- <span class="cline-any cline-no">&nbsp;</span>
1609
- <span class="cline-any cline-no">&nbsp;</span>
1610
- <span class="cline-any cline-no">&nbsp;</span>
1611
- <span class="cline-any cline-no">&nbsp;</span>
1612
- <span class="cline-any cline-no">&nbsp;</span>
1613
- <span class="cline-any cline-no">&nbsp;</span>
1614
- <span class="cline-any cline-no">&nbsp;</span>
1615
- <span class="cline-any cline-no">&nbsp;</span>
1616
- <span class="cline-any cline-no">&nbsp;</span>
1617
- <span class="cline-any cline-no">&nbsp;</span>
1618
- <span class="cline-any cline-no">&nbsp;</span>
1619
- <span class="cline-any cline-no">&nbsp;</span>
1620
- <span class="cline-any cline-no">&nbsp;</span>
1621
- <span class="cline-any cline-no">&nbsp;</span>
1622
- <span class="cline-any cline-no">&nbsp;</span>
1623
- <span class="cline-any cline-no">&nbsp;</span>
1624
- <span class="cline-any cline-no">&nbsp;</span>
1625
- <span class="cline-any cline-no">&nbsp;</span>
1626
- <span class="cline-any cline-no">&nbsp;</span>
1627
- <span class="cline-any cline-no">&nbsp;</span>
1628
- <span class="cline-any cline-no">&nbsp;</span>
1629
- <span class="cline-any cline-no">&nbsp;</span>
1630
- <span class="cline-any cline-no">&nbsp;</span>
1631
- <span class="cline-any cline-no">&nbsp;</span>
1632
- <span class="cline-any cline-no">&nbsp;</span>
1633
- <span class="cline-any cline-no">&nbsp;</span>
1634
- <span class="cline-any cline-no">&nbsp;</span>
1635
- <span class="cline-any cline-no">&nbsp;</span>
1636
- <span class="cline-any cline-no">&nbsp;</span>
1637
- <span class="cline-any cline-no">&nbsp;</span>
1638
- <span class="cline-any cline-no">&nbsp;</span>
1639
- <span class="cline-any cline-no">&nbsp;</span>
1640
- <span class="cline-any cline-no">&nbsp;</span>
1641
- <span class="cline-any cline-no">&nbsp;</span>
1642
- <span class="cline-any cline-no">&nbsp;</span>
1643
- <span class="cline-any cline-no">&nbsp;</span>
1644
- <span class="cline-any cline-no">&nbsp;</span>
1645
- <span class="cline-any cline-no">&nbsp;</span>
1646
- <span class="cline-any cline-no">&nbsp;</span>
1647
- <span class="cline-any cline-no">&nbsp;</span>
1648
- <span class="cline-any cline-no">&nbsp;</span>
1649
- <span class="cline-any cline-no">&nbsp;</span>
1650
- <span class="cline-any cline-no">&nbsp;</span>
1651
- <span class="cline-any cline-no">&nbsp;</span>
1652
- <span class="cline-any cline-no">&nbsp;</span>
1653
- <span class="cline-any cline-no">&nbsp;</span>
1654
- <span class="cline-any cline-no">&nbsp;</span>
1655
- <span class="cline-any cline-no">&nbsp;</span>
1656
- <span class="cline-any cline-no">&nbsp;</span>
1657
- <span class="cline-any cline-no">&nbsp;</span>
1658
- <span class="cline-any cline-no">&nbsp;</span>
1659
- <span class="cline-any cline-no">&nbsp;</span>
1660
- <span class="cline-any cline-no">&nbsp;</span>
1661
- <span class="cline-any cline-no">&nbsp;</span>
1662
- <span class="cline-any cline-no">&nbsp;</span>
1663
- <span class="cline-any cline-no">&nbsp;</span>
1664
- <span class="cline-any cline-no">&nbsp;</span>
1665
- <span class="cline-any cline-no">&nbsp;</span>
1666
- <span class="cline-any cline-no">&nbsp;</span>
1667
- <span class="cline-any cline-no">&nbsp;</span>
1668
- <span class="cline-any cline-no">&nbsp;</span>
1669
- <span class="cline-any cline-no">&nbsp;</span>
1670
- <span class="cline-any cline-no">&nbsp;</span>
1671
- <span class="cline-any cline-no">&nbsp;</span>
1672
- <span class="cline-any cline-no">&nbsp;</span>
1673
- <span class="cline-any cline-no">&nbsp;</span>
1674
- <span class="cline-any cline-no">&nbsp;</span>
1675
- <span class="cline-any cline-no">&nbsp;</span>
1676
- <span class="cline-any cline-no">&nbsp;</span>
1677
- <span class="cline-any cline-no">&nbsp;</span>
1678
- <span class="cline-any cline-no">&nbsp;</span>
1679
- <span class="cline-any cline-no">&nbsp;</span>
1680
- <span class="cline-any cline-no">&nbsp;</span>
1681
- <span class="cline-any cline-no">&nbsp;</span>
1682
- <span class="cline-any cline-no">&nbsp;</span>
1683
- <span class="cline-any cline-no">&nbsp;</span>
1684
- <span class="cline-any cline-no">&nbsp;</span>
1685
- <span class="cline-any cline-no">&nbsp;</span>
1686
- <span class="cline-any cline-no">&nbsp;</span>
1687
- <span class="cline-any cline-no">&nbsp;</span>
1688
- <span class="cline-any cline-no">&nbsp;</span>
1689
- <span class="cline-any cline-no">&nbsp;</span>
1690
- <span class="cline-any cline-no">&nbsp;</span>
1691
- <span class="cline-any cline-no">&nbsp;</span>
1692
- <span class="cline-any cline-no">&nbsp;</span>
1693
- <span class="cline-any cline-no">&nbsp;</span>
1694
- <span class="cline-any cline-no">&nbsp;</span>
1695
- <span class="cline-any cline-no">&nbsp;</span>
1696
- <span class="cline-any cline-no">&nbsp;</span>
1697
- <span class="cline-any cline-no">&nbsp;</span>
1698
- <span class="cline-any cline-no">&nbsp;</span>
1699
- <span class="cline-any cline-no">&nbsp;</span>
1700
- <span class="cline-any cline-no">&nbsp;</span>
1701
- <span class="cline-any cline-no">&nbsp;</span>
1702
- <span class="cline-any cline-no">&nbsp;</span>
1703
- <span class="cline-any cline-no">&nbsp;</span>
1704
- <span class="cline-any cline-no">&nbsp;</span>
1705
- <span class="cline-any cline-no">&nbsp;</span>
1706
- <span class="cline-any cline-no">&nbsp;</span>
1707
- <span class="cline-any cline-no">&nbsp;</span>
1708
- <span class="cline-any cline-no">&nbsp;</span>
1709
- <span class="cline-any cline-no">&nbsp;</span>
1710
- <span class="cline-any cline-no">&nbsp;</span>
1711
- <span class="cline-any cline-no">&nbsp;</span>
1712
- <span class="cline-any cline-no">&nbsp;</span>
1713
- <span class="cline-any cline-no">&nbsp;</span>
1714
- <span class="cline-any cline-no">&nbsp;</span>
1715
- <span class="cline-any cline-no">&nbsp;</span>
1716
- <span class="cline-any cline-no">&nbsp;</span>
1717
- <span class="cline-any cline-no">&nbsp;</span>
1718
- <span class="cline-any cline-no">&nbsp;</span>
1719
- <span class="cline-any cline-no">&nbsp;</span>
1720
- <span class="cline-any cline-no">&nbsp;</span>
1721
- <span class="cline-any cline-no">&nbsp;</span>
1722
- <span class="cline-any cline-no">&nbsp;</span>
1723
- <span class="cline-any cline-no">&nbsp;</span>
1724
- <span class="cline-any cline-no">&nbsp;</span>
1725
- <span class="cline-any cline-no">&nbsp;</span>
1726
- <span class="cline-any cline-no">&nbsp;</span>
1727
- <span class="cline-any cline-no">&nbsp;</span>
1728
- <span class="cline-any cline-no">&nbsp;</span>
1729
- <span class="cline-any cline-no">&nbsp;</span>
1730
- <span class="cline-any cline-no">&nbsp;</span>
1731
- <span class="cline-any cline-no">&nbsp;</span>
1732
- <span class="cline-any cline-no">&nbsp;</span>
1733
- <span class="cline-any cline-no">&nbsp;</span>
1734
- <span class="cline-any cline-no">&nbsp;</span>
1735
- <span class="cline-any cline-no">&nbsp;</span>
1736
- <span class="cline-any cline-no">&nbsp;</span>
1737
- <span class="cline-any cline-no">&nbsp;</span>
1738
- <span class="cline-any cline-no">&nbsp;</span>
1739
- <span class="cline-any cline-no">&nbsp;</span>
1740
- <span class="cline-any cline-no">&nbsp;</span>
1741
- <span class="cline-any cline-no">&nbsp;</span>
1742
- <span class="cline-any cline-no">&nbsp;</span>
1743
- <span class="cline-any cline-no">&nbsp;</span>
1744
- <span class="cline-any cline-no">&nbsp;</span>
1745
- <span class="cline-any cline-no">&nbsp;</span>
1746
- <span class="cline-any cline-no">&nbsp;</span>
1747
- <span class="cline-any cline-no">&nbsp;</span>
1748
- <span class="cline-any cline-no">&nbsp;</span>
1749
- <span class="cline-any cline-no">&nbsp;</span>
1750
- <span class="cline-any cline-no">&nbsp;</span>
1751
- <span class="cline-any cline-no">&nbsp;</span>
1752
- <span class="cline-any cline-no">&nbsp;</span>
1753
- <span class="cline-any cline-no">&nbsp;</span>
1754
- <span class="cline-any cline-no">&nbsp;</span>
1755
- <span class="cline-any cline-no">&nbsp;</span>
1756
- <span class="cline-any cline-no">&nbsp;</span>
1757
- <span class="cline-any cline-no">&nbsp;</span>
1758
- <span class="cline-any cline-no">&nbsp;</span>
1759
- <span class="cline-any cline-no">&nbsp;</span>
1760
- <span class="cline-any cline-no">&nbsp;</span>
1761
- <span class="cline-any cline-no">&nbsp;</span>
1762
- <span class="cline-any cline-no">&nbsp;</span>
1763
- <span class="cline-any cline-no">&nbsp;</span>
1764
- <span class="cline-any cline-no">&nbsp;</span>
1765
- <span class="cline-any cline-no">&nbsp;</span>
1766
- <span class="cline-any cline-no">&nbsp;</span>
1767
- <span class="cline-any cline-no">&nbsp;</span>
1768
- <span class="cline-any cline-no">&nbsp;</span>
1769
- <span class="cline-any cline-no">&nbsp;</span>
1770
- <span class="cline-any cline-no">&nbsp;</span>
1771
- <span class="cline-any cline-no">&nbsp;</span>
1772
- <span class="cline-any cline-no">&nbsp;</span>
1773
- <span class="cline-any cline-no">&nbsp;</span>
1774
- <span class="cline-any cline-no">&nbsp;</span>
1775
- <span class="cline-any cline-no">&nbsp;</span>
1776
- <span class="cline-any cline-no">&nbsp;</span>
1777
- <span class="cline-any cline-no">&nbsp;</span>
1778
- <span class="cline-any cline-no">&nbsp;</span>
1779
- <span class="cline-any cline-no">&nbsp;</span>
1780
- <span class="cline-any cline-no">&nbsp;</span>
1781
- <span class="cline-any cline-no">&nbsp;</span>
1782
- <span class="cline-any cline-no">&nbsp;</span>
1783
- <span class="cline-any cline-no">&nbsp;</span>
1784
- <span class="cline-any cline-no">&nbsp;</span>
1785
- <span class="cline-any cline-no">&nbsp;</span>
1786
- <span class="cline-any cline-no">&nbsp;</span>
1787
- <span class="cline-any cline-no">&nbsp;</span>
1788
- <span class="cline-any cline-no">&nbsp;</span>
1789
- <span class="cline-any cline-no">&nbsp;</span>
1790
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
1791
- <span class="cstat-no" title="statement not covered" > * HSuite Native Connect</span>
1792
- <span class="cstat-no" title="statement not covered" > * Copyright 2024-2025 HSuite (https://hsuite.finance)</span>
1793
- <span class="cstat-no" title="statement not covered" > *</span>
1794
- <span class="cstat-no" title="statement not covered" > * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0</span>
1795
- <span class="cstat-no" title="statement not covered" > *</span>
1796
- <span class="cstat-no" title="statement not covered" > * This file is part of HSuite Native Connect. For commercial licensing,</span>
1797
- <span class="cstat-no" title="statement not covered" > * visit https://hsuite.finance/licensing</span>
1798
- <span class="cstat-no" title="statement not covered" > */</span>
1799
- <span class="cstat-no" title="statement not covered" ></span>
1800
- <span class="cstat-no" title="statement not covered" >/**</span>
1801
- <span class="cstat-no" title="statement not covered" > * @file channel-client.service.ts</span>
1802
- <span class="cstat-no" title="statement not covered" > * @description Angular wrapper for the unified ChannelClient.</span>
1803
- <span class="cstat-no" title="statement not covered" > *</span>
1804
- <span class="cstat-no" title="statement not covered" > * ChannelClientService</span>
1805
- <span class="cstat-no" title="statement not covered" > *</span>
1806
- <span class="cstat-no" title="statement not covered" > * Angular service that wraps the ChannelClient from native-wallet-sdk,</span>
1807
- <span class="cstat-no" title="statement not covered" > * providing reactive signals and Angular-friendly APIs for dApp-wallet</span>
1808
- <span class="cstat-no" title="statement not covered" > * communication using the new unified channel protocol.</span>
1809
- <span class="cstat-no" title="statement not covered" > *</span>
1810
- <span class="cstat-no" title="statement not covered" > * Key features:</span>
1811
- <span class="cstat-no" title="statement not covered" > * - Reactive state via Angular signals</span>
1812
- <span class="cstat-no" title="statement not covered" > * - NgZone integration for proper change detection</span>
1813
- <span class="cstat-no" title="statement not covered" > * - Automatic session persistence</span>
1814
- <span class="cstat-no" title="statement not covered" > * - Support for both session (1:1) and party (N:N) channels</span>
1815
- <span class="cstat-no" title="statement not covered" > *</span>
1816
- <span class="cstat-no" title="statement not covered" > * This service is designed to replace the existing NostrSessionClient</span>
1817
- <span class="cstat-no" title="statement not covered" > * as part of the protocol simplification effort. It can coexist with</span>
1818
- <span class="cstat-no" title="statement not covered" > * the legacy implementation during migration.</span>
1819
- <span class="cstat-no" title="statement not covered" > *</span>
1820
- <span class="cstat-no" title="statement not covered" > * @Component({ ... })</span>
1821
- <span class="cstat-no" title="statement not covered" > * export class AppComponent {</span>
1822
- <span class="cstat-no" title="statement not covered" > * private channelService = inject(ChannelClientService);</span>
1823
- <span class="cstat-no" title="statement not covered" > *</span>
1824
- <span class="cstat-no" title="statement not covered" > * readonly state = this.channelService.state;</span>
1825
- <span class="cstat-no" title="statement not covered" > * readonly accounts = this.channelService.accounts;</span>
1826
- <span class="cstat-no" title="statement not covered" > *</span>
1827
- <span class="cstat-no" title="statement not covered" > * async connect() {</span>
1828
- <span class="cstat-no" title="statement not covered" > * const invite = await this.channelService.connect({</span>
1829
- <span class="cstat-no" title="statement not covered" > * type: 'session',</span>
1830
- <span class="cstat-no" title="statement not covered" > * appId: 'my-dapp',</span>
1831
- <span class="cstat-no" title="statement not covered" > * appName: 'My dApp',</span>
1832
- <span class="cstat-no" title="statement not covered" > * ledgerId: 'hedera',</span>
1833
- <span class="cstat-no" title="statement not covered" > * networkId: 'mainnet',</span>
1834
- <span class="cstat-no" title="statement not covered" > * });</span>
1835
- <span class="cstat-no" title="statement not covered" > * // Open wallet with invite URL</span>
1836
- <span class="cstat-no" title="statement not covered" > * window.open(this.channelService.getWalletInviteUrl(invite, walletUrl));</span>
1837
- <span class="cstat-no" title="statement not covered" > * }</span>
1838
- <span class="cstat-no" title="statement not covered" > * }</span>
1839
- <span class="cstat-no" title="statement not covered" > * ```</span>
1840
- <span class="cstat-no" title="statement not covered" > */</span>
1841
- <span class="cstat-no" title="statement not covered" ></span>
1842
- <span class="cstat-no" title="statement not covered" >import {</span>
1843
- <span class="cstat-no" title="statement not covered" > Injectable,</span>
1844
- <span class="cstat-no" title="statement not covered" > inject,</span>
1845
- <span class="cstat-no" title="statement not covered" > signal,</span>
1846
- <span class="cstat-no" title="statement not covered" > computed,</span>
1847
- <span class="cstat-no" title="statement not covered" > NgZone,</span>
1848
- <span class="cstat-no" title="statement not covered" > type Signal,</span>
1849
- <span class="cstat-no" title="statement not covered" > type WritableSignal,</span>
1850
- <span class="cstat-no" title="statement not covered" >} from '@angular/core';</span>
1851
- <span class="cstat-no" title="statement not covered" >import {</span>
1852
- <span class="cstat-no" title="statement not covered" > ChannelClient,</span>
1853
- <span class="cstat-no" title="statement not covered" > type ChannelInvite,</span>
1854
- <span class="cstat-no" title="statement not covered" > type ChannelState,</span>
1855
- <span class="cstat-no" title="statement not covered" > type ChannelType,</span>
1856
- <span class="cstat-no" title="statement not covered" > type ChannelAccount,</span>
1857
- <span class="cstat-no" title="statement not covered" > type TransportState,</span>
1858
- <span class="cstat-no" title="statement not covered" > type PersistedChannel,</span>
1859
- <span class="cstat-no" title="statement not covered" > encodeChannelInvite,</span>
1860
- <span class="cstat-no" title="statement not covered" > getLogger,</span>
1861
- <span class="cstat-no" title="statement not covered" >} from '@hsuite/native-connect-sdk';</span>
1862
- <span class="cstat-no" title="statement not covered" ></span>
1863
- <span class="cstat-no" title="statement not covered" >import { DEFAULT_WALLET_URL } from '../../models/provider-types';</span>
1864
- <span class="cstat-no" title="statement not covered" >import type { UnifiedAccount } from '../../models/unified-account.model';</span>
1865
- <span class="cstat-no" title="statement not covered" ></span>
1866
- <span class="cstat-no" title="statement not covered" >const logger = getLogger().scoped?.('ChannelClientService') ?? getLogger();</span>
1867
- <span class="cstat-no" title="statement not covered" ></span>
1868
- <span class="cstat-no" title="statement not covered" >/**</span>
1869
- <span class="cstat-no" title="statement not covered" > * ChannelConnectConfig</span>
1870
- <span class="cstat-no" title="statement not covered" > *</span>
1871
- <span class="cstat-no" title="statement not covered" > * Configuration for establishing a new channel.</span>
1872
- <span class="cstat-no" title="statement not covered" > */</span>
1873
- <span class="cstat-no" title="statement not covered" >export interface ChannelConnectConfig {</span>
1874
- <span class="cstat-no" title="statement not covered" > /** Channel type: 'session' for 1:1, 'party' for multisig */</span>
1875
- <span class="cstat-no" title="statement not covered" > type: ChannelType;</span>
1876
- <span class="cstat-no" title="statement not covered" > /** dApp identifier */</span>
1877
- <span class="cstat-no" title="statement not covered" > appId: string;</span>
1878
- <span class="cstat-no" title="statement not covered" > /** dApp display name */</span>
1879
- <span class="cstat-no" title="statement not covered" > appName: string;</span>
1880
- <span class="cstat-no" title="statement not covered" > /** dApp icon URL (optional) */</span>
1881
- <span class="cstat-no" title="statement not covered" > appIcon?: string;</span>
1882
- <span class="cstat-no" title="statement not covered" > /**</span>
1883
- <span class="cstat-no" title="statement not covered" > * dApp origin URL (optional). When omitted, the SDK falls back to</span>
1884
- <span class="cstat-no" title="statement not covered" > * `window.location.origin` so the wallet can always show the user where the</span>
1885
- <span class="cstat-no" title="statement not covered" > * connection request is coming from. Override this only if your dApp serves</span>
1886
- <span class="cstat-no" title="statement not covered" > * the wallet integration from a different origin than the page hosting it.</span>
1887
- <span class="cstat-no" title="statement not covered" > */</span>
1888
- <span class="cstat-no" title="statement not covered" > appOrigin?: string;</span>
1889
- <span class="cstat-no" title="statement not covered" > /** Target ledger (e.g., 'hedera', 'xrpl') */</span>
1890
- <span class="cstat-no" title="statement not covered" > ledgerId: string;</span>
1891
- <span class="cstat-no" title="statement not covered" > /** Target network (e.g., 'mainnet', 'testnet') */</span>
1892
- <span class="cstat-no" title="statement not covered" > networkId: string;</span>
1893
- <span class="cstat-no" title="statement not covered" > /** Requested permissions */</span>
1894
- <span class="cstat-no" title="statement not covered" > permissions?: string[];</span>
1895
- <span class="cstat-no" title="statement not covered" > /** Nostr relay URLs (optional, uses defaults) */</span>
1896
- <span class="cstat-no" title="statement not covered" > relays?: string[];</span>
1897
- <span class="cstat-no" title="statement not covered" > /** Wallet URL for generating invite links */</span>
1898
- <span class="cstat-no" title="statement not covered" > walletUrl?: string;</span>
1899
- <span class="cstat-no" title="statement not covered" >}</span>
1900
- <span class="cstat-no" title="statement not covered" ></span>
1901
- <span class="cstat-no" title="statement not covered" >/**</span>
1902
- <span class="cstat-no" title="statement not covered" > * ChannelClientService</span>
1903
- <span class="cstat-no" title="statement not covered" > *</span>
1904
- <span class="cstat-no" title="statement not covered" > * Angular service for unified channel-based dApp-wallet communication.</span>
1905
- <span class="cstat-no" title="statement not covered" > */</span>
1906
- <span class="cstat-no" title="statement not covered" >@Injectable({ providedIn: 'root' })</span>
1907
- <span class="cstat-no" title="statement not covered" >export class ChannelClientService {</span>
1908
- <span class="cstat-no" title="statement not covered" > private readonly zone = inject(NgZone);</span>
1909
- <span class="cstat-no" title="statement not covered" > private client: ChannelClient | null = null;</span>
1910
- <span class="cstat-no" title="statement not covered" ></span>
1911
- <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1912
- <span class="cstat-no" title="statement not covered" > // Reactive State</span>
1913
- <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1914
- <span class="cstat-no" title="statement not covered" ></span>
1915
- <span class="cstat-no" title="statement not covered" > /** Current channel state */</span>
1916
- <span class="cstat-no" title="statement not covered" > private readonly _state: WritableSignal&lt;ChannelState&gt; = signal('idle');</span>
1917
- <span class="cstat-no" title="statement not covered" > readonly state: Signal&lt;ChannelState&gt; = this._state.asReadonly();</span>
1918
- <span class="cstat-no" title="statement not covered" ></span>
1919
- <span class="cstat-no" title="statement not covered" > /** Current transport state (nostr-only, p2p-connected, etc.) */</span>
1920
- <span class="cstat-no" title="statement not covered" > private readonly _transportState: WritableSignal&lt;TransportState&gt; = signal('nostr-only');</span>
1921
- <span class="cstat-no" title="statement not covered" > readonly transportState: Signal&lt;TransportState&gt; = this._transportState.asReadonly();</span>
1922
- <span class="cstat-no" title="statement not covered" ></span>
1923
- <span class="cstat-no" title="statement not covered" > /** Approved accounts from the wallet */</span>
1924
- <span class="cstat-no" title="statement not covered" > private readonly _accounts: WritableSignal&lt;ChannelAccount[]&gt; = signal([]);</span>
1925
- <span class="cstat-no" title="statement not covered" > readonly accounts: Signal&lt;ChannelAccount[]&gt; = this._accounts.asReadonly();</span>
1926
- <span class="cstat-no" title="statement not covered" ></span>
1927
- <span class="cstat-no" title="statement not covered" > /** Current channel invite (if connected) */</span>
1928
- <span class="cstat-no" title="statement not covered" > private readonly _currentInvite: WritableSignal&lt;ChannelInvite | null&gt; = signal(null);</span>
1929
- <span class="cstat-no" title="statement not covered" > readonly currentInvite: Signal&lt;ChannelInvite | null&gt; = this._currentInvite.asReadonly();</span>
1930
- <span class="cstat-no" title="statement not covered" ></span>
1931
- <span class="cstat-no" title="statement not covered" > /** Error message (if any) */</span>
1932
- <span class="cstat-no" title="statement not covered" > private readonly _error: WritableSignal&lt;string | null&gt; = signal(null);</span>
1933
- <span class="cstat-no" title="statement not covered" > readonly error: Signal&lt;string | null&gt; = this._error.asReadonly();</span>
1934
- <span class="cstat-no" title="statement not covered" ></span>
1935
- <span class="cstat-no" title="statement not covered" > /** Flag to prevent auto-restore from interfering with new connections */</span>
1936
- <span class="cstat-no" title="statement not covered" > private connectingNewSession = false;</span>
1937
- <span class="cstat-no" title="statement not covered" ></span>
1938
- <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1939
- <span class="cstat-no" title="statement not covered" > // Computed State</span>
1940
- <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1941
- <span class="cstat-no" title="statement not covered" ></span>
1942
- <span class="cstat-no" title="statement not covered" > /** Whether the channel is currently connected and active */</span>
1943
- <span class="cstat-no" title="statement not covered" > readonly isConnected = computed(() =&gt; this._state() === 'active');</span>
1944
- <span class="cstat-no" title="statement not covered" ></span>
1945
- <span class="cstat-no" title="statement not covered" > /** Whether we're currently connecting */</span>
1946
- <span class="cstat-no" title="statement not covered" > readonly isConnecting = computed(() =&gt; {</span>
1791
+ <span class="cline-any cline-yes">2x</span>
1792
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1793
+ * HSuite Native Connect
1794
+ * Copyright 2024-2025 HSuite (https://hsuite.finance)
1795
+ *
1796
+ * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
1797
+ *
1798
+ * This file is part of HSuite Native Connect. For commercial licensing,
1799
+ * visit https://hsuite.finance/licensing
1800
+ */
1801
+ &nbsp;
1802
+ /**
1803
+ * @file channel-client.service.ts
1804
+ * @description Angular wrapper for the unified ChannelClient.
1805
+ *
1806
+ * ChannelClientService
1807
+ *
1808
+ * Angular service that wraps the ChannelClient from native-wallet-sdk,
1809
+ * providing reactive signals and Angular-friendly APIs for dApp-wallet
1810
+ * communication using the new unified channel protocol.
1811
+ *
1812
+ * Key features:
1813
+ * - Reactive state via Angular signals
1814
+ * - NgZone integration for proper change detection
1815
+ * - Automatic session persistence
1816
+ * - Support for both session (1:1) and party (N:N) channels
1817
+ *
1818
+ * This service is designed to replace the existing NostrSessionClient
1819
+ * as part of the protocol simplification effort. It can coexist with
1820
+ * the legacy implementation during migration.
1821
+ *
1822
+ * @Component({ ... })
1823
+ * export class AppComponent {
1824
+ * private channelService = inject(ChannelClientService);
1825
+ *
1826
+ * readonly state = this.channelService.state;
1827
+ * readonly accounts = this.channelService.accounts;
1828
+ *
1829
+ * async connect() {
1830
+ * const invite = await this.channelService.connect({
1831
+ * type: 'session',
1832
+ * appId: 'my-dapp',
1833
+ * appName: 'My dApp',
1834
+ * ledgerId: 'hedera',
1835
+ * networkId: 'mainnet',
1836
+ * });
1837
+ * // Open wallet with invite URL
1838
+ * window.open(this.channelService.getWalletInviteUrl(invite, walletUrl));
1839
+ * }
1840
+ * }
1841
+ * ```
1842
+ */
1843
+ &nbsp;
1844
+ import {
1845
+ Injectable,
1846
+ inject,
1847
+ signal,
1848
+ computed,
1849
+ NgZone,
1850
+ type Signal,
1851
+ type WritableSignal,
1852
+ } from '@angular/core';
1853
+ import {
1854
+ ChannelClient,
1855
+ type ChannelInvite,
1856
+ type ChannelState,
1857
+ type ChannelType,
1858
+ type ChannelAccount,
1859
+ type TransportState,
1860
+ type PersistedChannel,
1861
+ encodeChannelInvite,
1862
+ getLogger,
1863
+ } from '@hsuite/native-connect-sdk';
1864
+ &nbsp;
1865
+ import { DEFAULT_WALLET_URL } from '../../models/provider-types';
1866
+ import type { UnifiedAccount } from '../../models/unified-account.model';
1867
+ &nbsp;
1868
+ const logger = getLogger().scoped?.('ChannelClientService'<span class="branch-0 cbranch-no" title="branch not covered" >) ?? getLogger();</span>
1869
+ &nbsp;
1870
+ /**
1871
+ * ChannelConnectConfig
1872
+ *
1873
+ * Configuration for establishing a new channel.
1874
+ */
1875
+ export interface ChannelConnectConfig {
1876
+ /** Channel type: 'session' for 1:1, 'party' for multisig */
1877
+ type: ChannelType;
1878
+ /** dApp identifier */
1879
+ appId: string;
1880
+ /** dApp display name */
1881
+ appName: string;
1882
+ /** dApp icon URL (optional) */
1883
+ appIcon?: string;
1884
+ /**
1885
+ * dApp origin URL (optional). When omitted, the SDK falls back to
1886
+ * `window.location.origin` so the wallet can always show the user where the
1887
+ * connection request is coming from. Override this only if your dApp serves
1888
+ * the wallet integration from a different origin than the page hosting it.
1889
+ */
1890
+ appOrigin?: string;
1891
+ /** Target ledger (e.g., 'hedera', 'xrpl') */
1892
+ ledgerId: string;
1893
+ /** Target network (e.g., 'mainnet', 'testnet') */
1894
+ networkId: string;
1895
+ /** Requested permissions */
1896
+ permissions?: string[];
1897
+ /** Nostr relay URLs (optional, uses defaults) */
1898
+ relays?: string[];
1899
+ /** Wallet URL for generating invite links */
1900
+ walletUrl?: string;
1901
+ }
1902
+ &nbsp;
1903
+ /**
1904
+ * ChannelClientService
1905
+ *
1906
+ * Angular service for unified channel-based dApp-wallet communication.
1907
+ */
1908
+ @Injectable({ providedIn: 'root' })
1909
+ export class ChannelClientService {
1910
+ private readonly zone = inject(NgZone);
1911
+ private client: ChannelClient | null = null;
1912
+ &nbsp;
1913
+ // ============================================================================
1914
+ // Reactive State
1915
+ // ============================================================================
1916
+ &nbsp;
1917
+ /** Current channel state */
1918
+ private readonly _state: WritableSignal&lt;ChannelState&gt; = signal('idle');
1919
+ readonly state: Signal&lt;ChannelState&gt; = this._state.asReadonly();
1920
+ &nbsp;
1921
+ /** Current transport state (nostr-only, p2p-connected, etc.) */
1922
+ private readonly _transportState: WritableSignal&lt;TransportState&gt; = signal('nostr-only');
1923
+ readonly transportState: Signal&lt;TransportState&gt; = this._transportState.asReadonly();
1924
+ &nbsp;
1925
+ /** Approved accounts from the wallet */
1926
+ private readonly _accounts: WritableSignal&lt;ChannelAccount[]&gt; = signal([]);
1927
+ readonly accounts: Signal&lt;ChannelAccount[]&gt; = this._accounts.asReadonly();
1928
+ &nbsp;
1929
+ /** Current channel invite (if connected) */
1930
+ private readonly _currentInvite: WritableSignal&lt;ChannelInvite | null&gt; = signal(null);
1931
+ readonly currentInvite: Signal&lt;ChannelInvite | null&gt; = this._currentInvite.asReadonly();
1932
+ &nbsp;
1933
+ /** Error message (if any) */
1934
+ private readonly _error: WritableSignal&lt;string | null&gt; = signal(null);
1935
+ readonly error: Signal&lt;string | null&gt; = this._error.asReadonly();
1936
+ &nbsp;
1937
+ /** Flag to prevent auto-restore from interfering with new connections */
1938
+ private connectingNewSession = false;
1939
+ &nbsp;
1940
+ // ============================================================================
1941
+ // Computed State
1942
+ // ============================================================================
1943
+ &nbsp;
1944
+ /** Whether the channel is currently connected and active */
1945
+ readonly isConnected = computed(() =&gt; this._state() === 'active');
1946
+ &nbsp;
1947
+ /** Whether we're currently connecting */
1948
+ readonly isConnecting = computed(() =&gt; {
1947
1949
  <span class="cstat-no" title="statement not covered" > const s = this._state();</span>
1948
1950
  <span class="cstat-no" title="statement not covered" > return s === 'connecting' || s === 'pending';</span>
1949
- <span class="cstat-no" title="statement not covered" > });</span>
1950
- <span class="cstat-no" title="statement not covered" ></span>
1951
- <span class="cstat-no" title="statement not covered" > /** Accounts formatted as UnifiedAccount for compatibility */</span>
1952
- <span class="cstat-no" title="statement not covered" > readonly unifiedAccounts = computed&lt;UnifiedAccount[]&gt;(() =&gt; {</span>
1951
+ });
1952
+ &nbsp;
1953
+ /** Accounts formatted as UnifiedAccount for compatibility */
1954
+ readonly unifiedAccounts = computed&lt;UnifiedAccount[]&gt;(() =&gt; {
1953
1955
  <span class="cstat-no" title="statement not covered" > const accounts = this._accounts();</span>
1954
1956
  <span class="cstat-no" title="statement not covered" > const invite = this._currentInvite();</span>
1955
1957
  <span class="cstat-no" title="statement not covered" > if (!invite) return [];</span>
@@ -1959,6 +1961,7 @@
1959
1961
  <span class="cstat-no" title="statement not covered" > return {</span>
1960
1962
  <span class="cstat-no" title="statement not covered" > id: `channel-${account.address}`,</span>
1961
1963
  <span class="cstat-no" title="statement not covered" > address: account.address,</span>
1964
+ <span class="cstat-no" title="statement not covered" > publicKey: account.publicKey,</span>
1962
1965
  <span class="cstat-no" title="statement not covered" > label: account.alias ?? `Account ${index + 1}`,</span>
1963
1966
  <span class="cstat-no" title="statement not covered" > ledgerId: account.ledgerId,</span>
1964
1967
  <span class="cstat-no" title="statement not covered" > networkId: account.networkId,</span>
@@ -1975,30 +1978,30 @@
1975
1978
  <span class="cstat-no" title="statement not covered" > },</span>
1976
1979
  <span class="cstat-no" title="statement not covered" > };</span>
1977
1980
  <span class="cstat-no" title="statement not covered" > });</span>
1978
- <span class="cstat-no" title="statement not covered" > });</span>
1979
- <span class="cstat-no" title="statement not covered" ></span>
1980
- <span class="cstat-no" title="statement not covered" > /**</span>
1981
- <span class="cstat-no" title="statement not covered" > *</span>
1982
- <span class="cstat-no" title="statement not covered" > */</span>
1983
- <span class="cstat-no" title="statement not covered" > constructor() {</span>
1984
- <span class="cstat-no" title="statement not covered" > // Note: Auto-restore is intentionally NOT called here.</span>
1985
- <span class="cstat-no" title="statement not covered" > // Session lifecycle (connect/disconnect/restore) is controlled by</span>
1986
- <span class="cstat-no" title="statement not covered" > // HsuiteNativeProvider, which calls attemptRestore() as needed.</span>
1987
- <span class="cstat-no" title="statement not covered" > // This keeps ChannelClientService as a passive wrapper.</span>
1988
- <span class="cstat-no" title="statement not covered" > }</span>
1989
- <span class="cstat-no" title="statement not covered" ></span>
1990
- <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1991
- <span class="cstat-no" title="statement not covered" > // Public API</span>
1992
- <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
1993
- <span class="cstat-no" title="statement not covered" ></span>
1994
- <span class="cstat-no" title="statement not covered" > /**</span>
1995
- <span class="cstat-no" title="statement not covered" > * Establish a new channel connection.</span>
1996
- <span class="cstat-no" title="statement not covered" > * Returns the invite to share with the wallet (via QR code or deep link).</span>
1997
- <span class="cstat-no" title="statement not covered" > *</span>
1998
- <span class="cstat-no" title="statement not covered" > * @param config - Channel configuration</span>
1999
- <span class="cstat-no" title="statement not covered" > * @returns The channel invite for wallet scanning</span>
2000
- <span class="cstat-no" title="statement not covered" > */</span>
2001
- <span class="cstat-no" title="statement not covered" > async connect(config: ChannelConnectConfig): Promise&lt;ChannelInvite&gt; {</span>
1981
+ });
1982
+ &nbsp;
1983
+ /**
1984
+ *
1985
+ */
1986
+ constructor() {
1987
+ // Note: Auto-restore is intentionally NOT called here.
1988
+ // Session lifecycle (connect/disconnect/restore) is controlled by
1989
+ // HsuiteNativeProvider, which calls attemptRestore() as needed.
1990
+ // This keeps ChannelClientService as a passive wrapper.
1991
+ }
1992
+ &nbsp;
1993
+ // ============================================================================
1994
+ // Public API
1995
+ // ============================================================================
1996
+ &nbsp;
1997
+ /**
1998
+ * Establish a new channel connection.
1999
+ * Returns the invite to share with the wallet (via QR code or deep link).
2000
+ *
2001
+ * @param config - Channel configuration
2002
+ * @returns The channel invite for wallet scanning
2003
+ */
2004
+ <span class="fstat-no" title="function not covered" > async connect(config: ChannelConnectConfig): Promise&lt;ChannelInvite&gt; {</span>
2002
2005
  <span class="cstat-no" title="statement not covered" > if (this._state() === 'connecting' || this._state() === 'pending') {</span>
2003
2006
  <span class="cstat-no" title="statement not covered" > logger.warn('Connection already in progress');</span>
2004
2007
  <span class="cstat-no" title="statement not covered" > const existing = this._currentInvite();</span>
@@ -2151,33 +2154,33 @@
2151
2154
  <span class="cstat-no" title="statement not covered" > throw error;</span>
2152
2155
  <span class="cstat-no" title="statement not covered" > }</span>
2153
2156
  <span class="cstat-no" title="statement not covered" > }</span>
2154
- <span class="cstat-no" title="statement not covered" ></span>
2155
- <span class="cstat-no" title="statement not covered" > /**</span>
2156
- <span class="cstat-no" title="statement not covered" > * Generate a wallet invite URL for the current channel.</span>
2157
- <span class="cstat-no" title="statement not covered" > *</span>
2158
- <span class="cstat-no" title="statement not covered" > * @param invite - The channel invite (defaults to current)</span>
2159
- <span class="cstat-no" title="statement not covered" > * @param walletUrl - Base URL of the wallet</span>
2160
- <span class="cstat-no" title="statement not covered" > * @returns Full URL with invite parameter</span>
2161
- <span class="cstat-no" title="statement not covered" > */</span>
2162
- <span class="cstat-no" title="statement not covered" > getWalletInviteUrl(invite?: ChannelInvite, walletUrl = DEFAULT_WALLET_URL): string {</span>
2163
- <span class="cstat-no" title="statement not covered" > const inv = invite ?? this._currentInvite();</span>
2164
- <span class="cstat-no" title="statement not covered" > if (!inv) {</span>
2157
+ &nbsp;
2158
+ /**
2159
+ * Generate a wallet invite URL for the current channel.
2160
+ *
2161
+ * @param invite - The channel invite (defaults to current)
2162
+ * @param walletUrl - Base URL of the wallet
2163
+ * @returns Full URL with invite parameter
2164
+ */
2165
+ getWalletInviteUrl(invite?: ChannelInvite, walletUrl = DEFAULT_WALLET_URL): string {
2166
+ const inv = <span class="branch-0 cbranch-no" title="branch not covered" >invite ?? this._currentInvite();</span>
2167
+ if (!inv) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2165
2168
  <span class="cstat-no" title="statement not covered" > throw new Error('No active invite');</span>
2166
2169
  <span class="cstat-no" title="statement not covered" > }</span>
2167
- <span class="cstat-no" title="statement not covered" ></span>
2168
- <span class="cstat-no" title="statement not covered" > const encoded = encodeChannelInvite(inv);</span>
2169
- <span class="cstat-no" title="statement not covered" > return `${walletUrl}?hsuite_invite=${encodeURIComponent(encoded)}`;</span>
2170
- <span class="cstat-no" title="statement not covered" > }</span>
2171
- <span class="cstat-no" title="statement not covered" ></span>
2172
- <span class="cstat-no" title="statement not covered" > /**</span>
2173
- <span class="cstat-no" title="statement not covered" > * Send an RPC request to the wallet.</span>
2174
- <span class="cstat-no" title="statement not covered" > *</span>
2175
- <span class="cstat-no" title="statement not covered" > * @param method - RPC method name</span>
2176
- <span class="cstat-no" title="statement not covered" > * @param params - Method parameters</span>
2177
- <span class="cstat-no" title="statement not covered" > * @param timeoutMs - Request timeout (default: 60s)</span>
2178
- <span class="cstat-no" title="statement not covered" > * @returns The RPC response</span>
2179
- <span class="cstat-no" title="statement not covered" > */</span>
2180
- <span class="cstat-no" title="statement not covered" > async request&lt;T = unknown&gt;(</span>
2170
+ &nbsp;
2171
+ const encoded = encodeChannelInvite(inv);
2172
+ return `${walletUrl}?hsuite_invite=${encodeURIComponent(encoded)}`;
2173
+ }
2174
+ &nbsp;
2175
+ /**
2176
+ * Send an RPC request to the wallet.
2177
+ *
2178
+ * @param method - RPC method name
2179
+ * @param params - Method parameters
2180
+ * @param timeoutMs - Request timeout (default: 60s)
2181
+ * @returns The RPC response
2182
+ */
2183
+ <span class="fstat-no" title="function not covered" > async request&lt;T = unknown&gt;(</span>
2181
2184
  <span class="cstat-no" title="statement not covered" > method: string,</span>
2182
2185
  <span class="cstat-no" title="statement not covered" > params: Record&lt;string, unknown&gt;,</span>
2183
2186
  <span class="cstat-no" title="statement not covered" > timeoutMs = 60000,</span>
@@ -2197,22 +2200,22 @@
2197
2200
  <span class="cstat-no" title="statement not covered" ></span>
2198
2201
  <span class="cstat-no" title="statement not covered" > return this.client.request&lt;T&gt;(method, params, timeoutMs);</span>
2199
2202
  <span class="cstat-no" title="statement not covered" > }</span>
2200
- <span class="cstat-no" title="statement not covered" ></span>
2201
- <span class="cstat-no" title="statement not covered" > /**</span>
2202
- <span class="cstat-no" title="statement not covered" > * Sign a transaction via the wallet.</span>
2203
- <span class="cstat-no" title="statement not covered" > *</span>
2204
- <span class="cstat-no" title="statement not covered" > * @param options</span>
2205
- <span class="cstat-no" title="statement not covered" > * @param accountAddress - Signer account address</span>
2206
- <span class="cstat-no" title="statement not covered" > * @param options.accountAddress</span>
2207
- <span class="cstat-no" title="statement not covered" > * @param options.payload</span>
2208
- <span class="cstat-no" title="statement not covered" > * @param options.ledgerId</span>
2209
- <span class="cstat-no" title="statement not covered" > * @param options.networkId</span>
2210
- <span class="cstat-no" title="statement not covered" > * @param payload - Transaction payload (base64 or hex)</span>
2211
- <span class="cstat-no" title="statement not covered" > * @param ledgerId - Optional ledger override</span>
2212
- <span class="cstat-no" title="statement not covered" > * @param networkId - Optional network override</span>
2213
- <span class="cstat-no" title="statement not covered" > * @returns Sign result with signature</span>
2214
- <span class="cstat-no" title="statement not covered" > */</span>
2215
- <span class="cstat-no" title="statement not covered" > async signTransaction(options: {</span>
2203
+ &nbsp;
2204
+ /**
2205
+ * Sign a transaction via the wallet.
2206
+ *
2207
+ * @param options
2208
+ * @param accountAddress - Signer account address
2209
+ * @param options.accountAddress
2210
+ * @param options.payload
2211
+ * @param options.ledgerId
2212
+ * @param options.networkId
2213
+ * @param payload - Transaction payload (base64 or hex)
2214
+ * @param ledgerId - Optional ledger override
2215
+ * @param networkId - Optional network override
2216
+ * @returns Sign result with signature
2217
+ */
2218
+ <span class="fstat-no" title="function not covered" > async signTransaction(options: {</span>
2216
2219
  <span class="cstat-no" title="statement not covered" > accountAddress: string;</span>
2217
2220
  <span class="cstat-no" title="statement not covered" > payload: string;</span>
2218
2221
  <span class="cstat-no" title="statement not covered" > ledgerId?: string;</span>
@@ -2236,25 +2239,25 @@
2236
2239
  <span class="cstat-no" title="statement not covered" > metadata: response.metadata,</span>
2237
2240
  <span class="cstat-no" title="statement not covered" > };</span>
2238
2241
  <span class="cstat-no" title="statement not covered" > }</span>
2239
- <span class="cstat-no" title="statement not covered" ></span>
2240
- <span class="cstat-no" title="statement not covered" > /**</span>
2241
- <span class="cstat-no" title="statement not covered" > * Sign and submit a transaction in one call (single prompt).</span>
2242
- <span class="cstat-no" title="statement not covered" > *</span>
2243
- <span class="cstat-no" title="statement not covered" > * @param options</span>
2244
- <span class="cstat-no" title="statement not covered" > * @param accountAddress - Signer account address</span>
2245
- <span class="cstat-no" title="statement not covered" > * @param options.accountAddress</span>
2246
- <span class="cstat-no" title="statement not covered" > * @param options.payload</span>
2247
- <span class="cstat-no" title="statement not covered" > * @param options.ledgerId</span>
2248
- <span class="cstat-no" title="statement not covered" > * @param options.networkId</span>
2249
- <span class="cstat-no" title="statement not covered" > * @param options.isBatch</span>
2250
- <span class="cstat-no" title="statement not covered" > * @param options.batchKey</span>
2251
- <span class="cstat-no" title="statement not covered" > * @param options.innerTransactions</span>
2252
- <span class="cstat-no" title="statement not covered" > * @param payload - Transaction payload</span>
2253
- <span class="cstat-no" title="statement not covered" > * @param ledgerId - Optional ledger override</span>
2254
- <span class="cstat-no" title="statement not covered" > * @param networkId - Optional network override</span>
2255
- <span class="cstat-no" title="statement not covered" > * @returns Submit result with transaction ID</span>
2256
- <span class="cstat-no" title="statement not covered" > */</span>
2257
- <span class="cstat-no" title="statement not covered" > async signAndSubmitTransaction(options: {</span>
2242
+ &nbsp;
2243
+ /**
2244
+ * Sign and submit a transaction in one call (single prompt).
2245
+ *
2246
+ * @param options
2247
+ * @param accountAddress - Signer account address
2248
+ * @param options.accountAddress
2249
+ * @param options.payload
2250
+ * @param options.ledgerId
2251
+ * @param options.networkId
2252
+ * @param options.isBatch
2253
+ * @param options.batchKey
2254
+ * @param options.innerTransactions
2255
+ * @param payload - Transaction payload
2256
+ * @param ledgerId - Optional ledger override
2257
+ * @param networkId - Optional network override
2258
+ * @returns Submit result with transaction ID
2259
+ */
2260
+ <span class="fstat-no" title="function not covered" > async signAndSubmitTransaction(options: {</span>
2258
2261
  <span class="cstat-no" title="statement not covered" > accountAddress: string;</span>
2259
2262
  <span class="cstat-no" title="statement not covered" > payload: string;</span>
2260
2263
  <span class="cstat-no" title="statement not covered" > ledgerId?: string;</span>
@@ -2291,11 +2294,11 @@
2291
2294
  <span class="cstat-no" title="statement not covered" > metadata: response.metadata,</span>
2292
2295
  <span class="cstat-no" title="statement not covered" > };</span>
2293
2296
  <span class="cstat-no" title="statement not covered" > }</span>
2294
- <span class="cstat-no" title="statement not covered" ></span>
2295
- <span class="cstat-no" title="statement not covered" > /**</span>
2296
- <span class="cstat-no" title="statement not covered" > * Disconnect from the wallet.</span>
2297
- <span class="cstat-no" title="statement not covered" > */</span>
2298
- <span class="cstat-no" title="statement not covered" > async disconnect(): Promise&lt;void&gt; {</span>
2297
+ &nbsp;
2298
+ /**
2299
+ * Disconnect from the wallet.
2300
+ */
2301
+ <span class="fstat-no" title="function not covered" > async disconnect(): Promise&lt;void&gt; {</span>
2299
2302
  <span class="cstat-no" title="statement not covered" > // Stop state polling first</span>
2300
2303
  <span class="cstat-no" title="statement not covered" > this.stopStateSync();</span>
2301
2304
  <span class="cstat-no" title="statement not covered" ></span>
@@ -2320,16 +2323,16 @@
2320
2323
  <span class="cstat-no" title="statement not covered" ></span>
2321
2324
  <span class="cstat-no" title="statement not covered" > logger.info('Disconnected from channel');</span>
2322
2325
  <span class="cstat-no" title="statement not covered" > }</span>
2323
- <span class="cstat-no" title="statement not covered" ></span>
2324
- <span class="cstat-no" title="statement not covered" > /**</span>
2325
- <span class="cstat-no" title="statement not covered" > * Attempt to restore a previous session.</span>
2326
- <span class="cstat-no" title="statement not covered" > *</span>
2327
- <span class="cstat-no" title="statement not covered" > * Note: This method is called by HsuiteNativeProvider as the single point</span>
2328
- <span class="cstat-no" title="statement not covered" > * of session lifecycle control. Do not call from multiple places.</span>
2329
- <span class="cstat-no" title="statement not covered" > *</span>
2330
- <span class="cstat-no" title="statement not covered" > * @returns True if restoration was successful</span>
2331
- <span class="cstat-no" title="statement not covered" > */</span>
2332
- <span class="cstat-no" title="statement not covered" > async attemptRestore(): Promise&lt;boolean&gt; {</span>
2326
+ &nbsp;
2327
+ /**
2328
+ * Attempt to restore a previous session.
2329
+ *
2330
+ * Note: This method is called by HsuiteNativeProvider as the single point
2331
+ * of session lifecycle control. Do not call from multiple places.
2332
+ *
2333
+ * @returns True if restoration was successful
2334
+ */
2335
+ <span class="fstat-no" title="function not covered" > async attemptRestore(): Promise&lt;boolean&gt; {</span>
2333
2336
  <span class="cstat-no" title="statement not covered" > // Skip restore if a new connection is being initiated</span>
2334
2337
  <span class="cstat-no" title="statement not covered" > if (this.connectingNewSession) {</span>
2335
2338
  <span class="cstat-no" title="statement not covered" > logger.debug('Skipping restore - new connection in progress');</span>
@@ -2451,32 +2454,32 @@
2451
2454
  <span class="cstat-no" title="statement not covered" > return false;</span>
2452
2455
  <span class="cstat-no" title="statement not covered" > }</span>
2453
2456
  <span class="cstat-no" title="statement not covered" > }</span>
2454
- <span class="cstat-no" title="statement not covered" ></span>
2455
- <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
2456
- <span class="cstat-no" title="statement not covered" > // Private Methods</span>
2457
- <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
2458
- <span class="cstat-no" title="statement not covered" ></span>
2459
- <span class="cstat-no" title="statement not covered" > /**</span>
2460
- <span class="cstat-no" title="statement not covered" > * Run a function inside NgZone for proper change detection.</span>
2461
- <span class="cstat-no" title="statement not covered" > * @param fn</span>
2462
- <span class="cstat-no" title="statement not covered" > */</span>
2463
- <span class="cstat-no" title="statement not covered" > private runInZone(fn: () =&gt; void): void {</span>
2457
+ &nbsp;
2458
+ // ============================================================================
2459
+ // Private Methods
2460
+ // ============================================================================
2461
+ &nbsp;
2462
+ /**
2463
+ * Run a function inside NgZone for proper change detection.
2464
+ * @param fn
2465
+ */
2466
+ private <span class="fstat-no" title="function not covered" >runInZone(fn: () =&gt; void): void {</span>
2464
2467
  <span class="cstat-no" title="statement not covered" > if (this.zone) {</span>
2465
2468
  <span class="cstat-no" title="statement not covered" > this.zone.run(fn);</span>
2466
2469
  <span class="cstat-no" title="statement not covered" > } else {</span>
2467
2470
  <span class="cstat-no" title="statement not covered" > fn();</span>
2468
2471
  <span class="cstat-no" title="statement not covered" > }</span>
2469
2472
  <span class="cstat-no" title="statement not covered" > }</span>
2470
- <span class="cstat-no" title="statement not covered" ></span>
2471
- <span class="cstat-no" title="statement not covered" > /** Current polling timeout ID for cleanup */</span>
2472
- <span class="cstat-no" title="statement not covered" > private pollingTimeoutId?: ReturnType&lt;typeof setTimeout&gt;;</span>
2473
- <span class="cstat-no" title="statement not covered" ></span>
2474
- <span class="cstat-no" title="statement not covered" > /**</span>
2475
- <span class="cstat-no" title="statement not covered" > * Set up state synchronization from the underlying client.</span>
2476
- <span class="cstat-no" title="statement not covered" > * Polling continues as long as the client exists - it doesn't stop on disconnect/error</span>
2477
- <span class="cstat-no" title="statement not covered" > * to properly track state changes during reconnection.</span>
2478
- <span class="cstat-no" title="statement not covered" > */</span>
2479
- <span class="cstat-no" title="statement not covered" > private setupStateSync(): void {</span>
2473
+ &nbsp;
2474
+ /** Current polling timeout ID for cleanup */
2475
+ private pollingTimeoutId?: ReturnType&lt;typeof setTimeout&gt;;
2476
+ &nbsp;
2477
+ /**
2478
+ * Set up state synchronization from the underlying client.
2479
+ * Polling continues as long as the client exists - it doesn't stop on disconnect/error
2480
+ * to properly track state changes during reconnection.
2481
+ */
2482
+ private <span class="fstat-no" title="function not covered" >setupStateSync(): void {</span>
2480
2483
  <span class="cstat-no" title="statement not covered" > if (!this.client) return;</span>
2481
2484
  <span class="cstat-no" title="statement not covered" ></span>
2482
2485
  <span class="cstat-no" title="statement not covered" > // Clear any existing polling</span>
@@ -2547,27 +2550,27 @@
2547
2550
  <span class="cstat-no" title="statement not covered" ></span>
2548
2551
  <span class="cstat-no" title="statement not covered" > this.pollingTimeoutId = setTimeout(checkState, 100);</span>
2549
2552
  <span class="cstat-no" title="statement not covered" > }</span>
2550
- <span class="cstat-no" title="statement not covered" ></span>
2551
- <span class="cstat-no" title="statement not covered" > /**</span>
2552
- <span class="cstat-no" title="statement not covered" > * Stop state synchronization polling.</span>
2553
- <span class="cstat-no" title="statement not covered" > */</span>
2554
- <span class="cstat-no" title="statement not covered" > private stopStateSync(): void {</span>
2553
+ &nbsp;
2554
+ /**
2555
+ * Stop state synchronization polling.
2556
+ */
2557
+ private <span class="fstat-no" title="function not covered" >stopStateSync(): void {</span>
2555
2558
  <span class="cstat-no" title="statement not covered" > if (this.pollingTimeoutId) {</span>
2556
2559
  <span class="cstat-no" title="statement not covered" > clearTimeout(this.pollingTimeoutId);</span>
2557
2560
  <span class="cstat-no" title="statement not covered" > this.pollingTimeoutId = undefined;</span>
2558
2561
  <span class="cstat-no" title="statement not covered" > }</span>
2559
2562
  <span class="cstat-no" title="statement not covered" > }</span>
2560
- <span class="cstat-no" title="statement not covered" ></span>
2561
- <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
2562
- <span class="cstat-no" title="statement not covered" > // Storage</span>
2563
- <span class="cstat-no" title="statement not covered" > // ============================================================================</span>
2564
- <span class="cstat-no" title="statement not covered" ></span>
2565
- <span class="cstat-no" title="statement not covered" > private static readonly STORAGE_KEY = 'hsuite_channel_persisted';</span>
2566
- <span class="cstat-no" title="statement not covered" ></span>
2567
- <span class="cstat-no" title="statement not covered" > /**</span>
2568
- <span class="cstat-no" title="statement not covered" > * Persist current state for reconnection after approval.</span>
2569
- <span class="cstat-no" title="statement not covered" > */</span>
2570
- <span class="cstat-no" title="statement not covered" > private persistCurrentState(): void {</span>
2563
+ &nbsp;
2564
+ // ============================================================================
2565
+ // Storage
2566
+ // ============================================================================
2567
+ &nbsp;
2568
+ private static readonly STORAGE_KEY = 'hsuite_channel_persisted';
2569
+ &nbsp;
2570
+ /**
2571
+ * Persist current state for reconnection after approval.
2572
+ */
2573
+ private <span class="fstat-no" title="function not covered" >persistCurrentState(): void {</span>
2571
2574
  <span class="cstat-no" title="statement not covered" > if (!this.client) return;</span>
2572
2575
  <span class="cstat-no" title="statement not covered" > try {</span>
2573
2576
  <span class="cstat-no" title="statement not covered" > const persisted = this.client.exportState();</span>
@@ -2582,13 +2585,13 @@
2582
2585
  <span class="cstat-no" title="statement not covered" > logger.warn('Failed to persist channel state', { error });</span>
2583
2586
  <span class="cstat-no" title="statement not covered" > }</span>
2584
2587
  <span class="cstat-no" title="statement not covered" > }</span>
2585
- <span class="cstat-no" title="statement not covered" ></span>
2586
- <span class="cstat-no" title="statement not covered" > /**</span>
2587
- <span class="cstat-no" title="statement not covered" > * Store channel state for reconnection.</span>
2588
- <span class="cstat-no" title="statement not covered" > * Uses client's exportState() to get proper PersistedChannel format.</span>
2589
- <span class="cstat-no" title="statement not covered" > * @param invite</span>
2590
- <span class="cstat-no" title="statement not covered" > */</span>
2591
- <span class="cstat-no" title="statement not covered" > private storeInvite(invite: ChannelInvite): void {</span>
2588
+ &nbsp;
2589
+ /**
2590
+ * Store channel state for reconnection.
2591
+ * Uses client's exportState() to get proper PersistedChannel format.
2592
+ * @param invite
2593
+ */
2594
+ private <span class="fstat-no" title="function not covered" >storeInvite(invite: ChannelInvite): void {</span>
2592
2595
  <span class="cstat-no" title="statement not covered" > try {</span>
2593
2596
  <span class="cstat-no" title="statement not covered" > // Use the client's exportState if available, otherwise create minimal persisted data</span>
2594
2597
  <span class="cstat-no" title="statement not covered" > const persisted = this.client?.exportState();</span>
@@ -2622,11 +2625,11 @@
2622
2625
  <span class="cstat-no" title="statement not covered" > logger.warn('Failed to store channel');</span>
2623
2626
  <span class="cstat-no" title="statement not covered" > }</span>
2624
2627
  <span class="cstat-no" title="statement not covered" > }</span>
2625
- <span class="cstat-no" title="statement not covered" ></span>
2626
- <span class="cstat-no" title="statement not covered" > /**</span>
2627
- <span class="cstat-no" title="statement not covered" > * Retrieve stored channel for reconnection.</span>
2628
- <span class="cstat-no" title="statement not covered" > */</span>
2629
- <span class="cstat-no" title="statement not covered" > private getStoredChannel(): PersistedChannel | null {</span>
2628
+ &nbsp;
2629
+ /**
2630
+ * Retrieve stored channel for reconnection.
2631
+ */
2632
+ private <span class="fstat-no" title="function not covered" >getStoredChannel(): PersistedChannel | null {</span>
2630
2633
  <span class="cstat-no" title="statement not covered" > try {</span>
2631
2634
  <span class="cstat-no" title="statement not covered" > const stored = localStorage.getItem(ChannelClientService.STORAGE_KEY);</span>
2632
2635
  <span class="cstat-no" title="statement not covered" > if (stored) {</span>
@@ -2637,18 +2640,18 @@
2637
2640
  <span class="cstat-no" title="statement not covered" > }</span>
2638
2641
  <span class="cstat-no" title="statement not covered" > return null;</span>
2639
2642
  <span class="cstat-no" title="statement not covered" > }</span>
2640
- <span class="cstat-no" title="statement not covered" ></span>
2641
- <span class="cstat-no" title="statement not covered" > /**</span>
2642
- <span class="cstat-no" title="statement not covered" > * Clear stored channel data.</span>
2643
- <span class="cstat-no" title="statement not covered" > */</span>
2644
- <span class="cstat-no" title="statement not covered" > private clearStoredChannel(): void {</span>
2643
+ &nbsp;
2644
+ /**
2645
+ * Clear stored channel data.
2646
+ */
2647
+ private <span class="fstat-no" title="function not covered" >clearStoredChannel(): void {</span>
2645
2648
  <span class="cstat-no" title="statement not covered" > try {</span>
2646
2649
  <span class="cstat-no" title="statement not covered" > localStorage.removeItem(ChannelClientService.STORAGE_KEY);</span>
2647
2650
  <span class="cstat-no" title="statement not covered" > } catch {</span>
2648
2651
  <span class="cstat-no" title="statement not covered" > // Ignore</span>
2649
2652
  <span class="cstat-no" title="statement not covered" > }</span>
2650
2653
  <span class="cstat-no" title="statement not covered" > }</span>
2651
- <span class="cstat-no" title="statement not covered" >}</span>
2654
+ }
2652
2655
  &nbsp;</pre></td></tr></table></pre>
2653
2656
 
2654
2657
  <div class='push'></div><!-- for sticky footer -->
@@ -2656,7 +2659,7 @@
2656
2659
  <div class='footer quiet pad2 space-top1 center small'>
2657
2660
  Code coverage generated by
2658
2661
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2659
- at 2026-06-10T09:00:36.727Z
2662
+ at 2026-06-27T21:00:37.138Z
2660
2663
  </div>
2661
2664
  <script src="../../../prettify.js"></script>
2662
2665
  <script>