@hsuite/native-connect-angular 1.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/coverage/coverage-summary.json +49 -49
  2. package/coverage/index.html +122 -122
  3. package/coverage/lcov-report/index.html +122 -122
  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 +1 -1
  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 +1 -1
  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 +1 -1
  17. package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +21 -21
  18. package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
  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 +148 -148
  24. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
  25. package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +21 -21
  26. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
  27. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
  28. package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
  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 +1 -1
  41. package/coverage/lcov-report/lib/models/provider-types.ts.html +1 -1
  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 +637 -637
  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 +20 -20
  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 +1 -1
  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 +1104 -1104
  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/index.html +31 -31
  62. package/coverage/lcov-report/lib/services/logger.service.ts.html +4 -4
  63. package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  64. package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
  65. package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
  66. package/coverage/lcov-report/lib/services/transaction-builders/index.html +43 -43
  67. package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
  68. package/coverage/lcov-report/lib/services/transaction.service.ts.html +4 -7
  69. package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +7 -10
  70. package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +1 -1
  71. package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +249 -249
  72. package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +4 -7
  73. package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +1 -1
  74. package/coverage/lcov-report/lib/transports/index.html +1 -1
  75. package/coverage/lcov-report/lib/utils/index.html +1 -1
  76. package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +1 -1
  77. package/coverage/lcov.info +14420 -14977
  78. package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
  79. package/coverage/lib/components/account-selector/account-actions/index.html +1 -1
  80. package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
  81. package/coverage/lib/components/account-selector/account-filter/index.html +1 -1
  82. package/coverage/lib/components/account-selector/account-formatting.service.ts.html +1 -1
  83. package/coverage/lib/components/account-selector/account-grouping.service.ts.html +1 -1
  84. package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
  85. package/coverage/lib/components/account-selector/account-list/index.html +1 -1
  86. package/coverage/lib/components/account-selector/account-selector.component.ts.html +1 -1
  87. package/coverage/lib/components/account-selector/account-selector.service.ts.html +1 -1
  88. package/coverage/lib/components/account-selector/index.html +1 -1
  89. package/coverage/lib/components/wallet-account-display/index.html +1 -1
  90. package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +1 -1
  91. package/coverage/lib/components/wallet-connect-button/index.html +21 -21
  92. package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
  93. package/coverage/lib/components/wallet-connect-prompt/index.html +1 -1
  94. package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
  95. package/coverage/lib/components/wallet-connected-guard/index.html +1 -1
  96. package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
  97. package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
  98. package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
  99. package/coverage/lib/components/wallet-connection-modal/index.html +21 -21
  100. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
  101. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
  102. package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
  103. package/coverage/lib/components/wallet-session-display/index.html +1 -1
  104. package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
  105. package/coverage/lib/components/wallet-transaction-status/index.html +1 -1
  106. package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
  107. package/coverage/lib/directives/index.html +1 -1
  108. package/coverage/lib/directives/wallet-connected.directive.ts.html +1 -1
  109. package/coverage/lib/directives/wallet-context.directive.ts.html +1 -1
  110. package/coverage/lib/directives/wallet-events.directive.ts.html +1 -1
  111. package/coverage/lib/hsuite-wallet.module.ts.html +1 -1
  112. package/coverage/lib/index.html +1 -1
  113. package/coverage/lib/models/connection-config.model.ts.html +1 -1
  114. package/coverage/lib/models/index.html +1 -1
  115. package/coverage/lib/models/provider-types.ts.html +1 -1
  116. package/coverage/lib/providers/base-wallet-provider.ts.html +20 -20
  117. package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +637 -637
  118. package/coverage/lib/providers/hsuite-native/index.html +19 -19
  119. package/coverage/lib/providers/hsuite-native-provider.ts.html +1 -1
  120. package/coverage/lib/providers/index.html +18 -18
  121. package/coverage/lib/providers/p2p-native/index.html +20 -20
  122. package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
  123. package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +1 -1
  124. package/coverage/lib/providers/wallet-error-handler.ts.html +1 -1
  125. package/coverage/lib/providers/walletconnect/core/index.html +65 -65
  126. package/coverage/lib/providers/walletconnect/core/session-health.ts.html +240 -240
  127. package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
  128. package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1104 -1104
  129. package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
  130. package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
  131. package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
  132. package/coverage/lib/providers/walletconnect/signers/index.html +43 -43
  133. package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
  134. package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
  135. package/coverage/lib/services/index.html +31 -31
  136. package/coverage/lib/services/logger.service.ts.html +4 -4
  137. package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  138. package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
  139. package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
  140. package/coverage/lib/services/transaction-builders/index.html +43 -43
  141. package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
  142. package/coverage/lib/services/transaction.service.ts.html +4 -7
  143. package/coverage/lib/services/unified-wallet.service.ts.html +7 -10
  144. package/coverage/lib/services/wallet-context.service.ts.html +1 -1
  145. package/coverage/lib/services/wallet-event-bus.service.ts.html +249 -249
  146. package/coverage/lib/services/wallet-providers.service.ts.html +4 -7
  147. package/coverage/lib/transports/chrome-extension-transport.ts.html +1 -1
  148. package/coverage/lib/transports/index.html +1 -1
  149. package/coverage/lib/utils/index.html +1 -1
  150. package/coverage/lib/utils/ledger-icons.util.ts.html +1 -1
  151. package/dist/fesm2022/hsuite-native-connect-angular.mjs +85 -20
  152. package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -1
  153. package/dist/index.d.ts +33 -3
  154. package/package.json +4 -4
  155. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.spec.ts +89 -0
  156. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +8 -0
  157. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +1 -6
  158. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.spec.ts +173 -0
  159. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +84 -19
  160. package/src/lib/services/transaction.service.ts +0 -1
  161. package/src/lib/services/unified-wallet.service.ts +0 -1
  162. package/src/lib/services/wallet-providers.service.ts +0 -1
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">64.52% </span>
26
+ <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>533/826</span>
28
+ <span class='fraction'>0/826</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">50% </span>
33
+ <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>17/34</span>
35
+ <span class='fraction'>0/1</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">52.63% </span>
40
+ <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>10/19</span>
42
+ <span class='fraction'>0/1</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">64.52% </span>
47
+ <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>533/826</span>
49
+ <span class='fraction'>0/826</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line medium'></div>
64
+ <div class='status-line low'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -889,150 +889,7 @@
889
889
  <a name='L824'></a><a href='#L824'>824</a>
890
890
  <a name='L825'></a><a href='#L825'>825</a>
891
891
  <a name='L826'></a><a href='#L826'>826</a>
892
- <a name='L827'></a><a href='#L827'>827</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
893
- <span class="cline-any cline-yes">1x</span>
894
- <span class="cline-any cline-yes">1x</span>
895
- <span class="cline-any cline-yes">1x</span>
896
- <span class="cline-any cline-yes">1x</span>
897
- <span class="cline-any cline-yes">1x</span>
898
- <span class="cline-any cline-yes">1x</span>
899
- <span class="cline-any cline-yes">1x</span>
900
- <span class="cline-any cline-yes">1x</span>
901
- <span class="cline-any cline-yes">1x</span>
902
- <span class="cline-any cline-yes">1x</span>
903
- <span class="cline-any cline-yes">1x</span>
904
- <span class="cline-any cline-yes">1x</span>
905
- <span class="cline-any cline-yes">1x</span>
906
- <span class="cline-any cline-yes">1x</span>
907
- <span class="cline-any cline-yes">1x</span>
908
- <span class="cline-any cline-yes">1x</span>
909
- <span class="cline-any cline-yes">1x</span>
910
- <span class="cline-any cline-yes">1x</span>
911
- <span class="cline-any cline-yes">1x</span>
912
- <span class="cline-any cline-yes">1x</span>
913
- <span class="cline-any cline-yes">1x</span>
914
- <span class="cline-any cline-yes">1x</span>
915
- <span class="cline-any cline-yes">1x</span>
916
- <span class="cline-any cline-yes">1x</span>
917
- <span class="cline-any cline-yes">1x</span>
918
- <span class="cline-any cline-yes">1x</span>
919
- <span class="cline-any cline-yes">1x</span>
920
- <span class="cline-any cline-yes">1x</span>
921
- <span class="cline-any cline-yes">1x</span>
922
- <span class="cline-any cline-yes">1x</span>
923
- <span class="cline-any cline-yes">1x</span>
924
- <span class="cline-any cline-yes">1x</span>
925
- <span class="cline-any cline-yes">1x</span>
926
- <span class="cline-any cline-yes">1x</span>
927
- <span class="cline-any cline-yes">1x</span>
928
- <span class="cline-any cline-yes">1x</span>
929
- <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">16x</span>
971
- <span class="cline-any cline-yes">16x</span>
972
- <span class="cline-any cline-yes">16x</span>
973
- <span class="cline-any cline-yes">16x</span>
974
- <span class="cline-any cline-yes">16x</span>
975
- <span class="cline-any cline-yes">16x</span>
976
- <span class="cline-any cline-yes">16x</span>
977
- <span class="cline-any cline-yes">16x</span>
978
- <span class="cline-any cline-yes">16x</span>
979
- <span class="cline-any cline-yes">16x</span>
980
- <span class="cline-any cline-yes">16x</span>
981
- <span class="cline-any cline-yes">16x</span>
982
- <span class="cline-any cline-yes">16x</span>
983
- <span class="cline-any cline-yes">16x</span>
984
- <span class="cline-any cline-yes">16x</span>
985
- <span class="cline-any cline-yes">16x</span>
986
- <span class="cline-any cline-yes">16x</span>
987
- <span class="cline-any cline-yes">16x</span>
988
- <span class="cline-any cline-yes">16x</span>
989
- <span class="cline-any cline-yes">16x</span>
990
- <span class="cline-any cline-yes">16x</span>
991
- <span class="cline-any cline-yes">16x</span>
992
- <span class="cline-any cline-yes">16x</span>
993
- <span class="cline-any cline-yes">16x</span>
994
- <span class="cline-any cline-yes">16x</span>
995
- <span class="cline-any cline-yes">16x</span>
996
- <span class="cline-any cline-yes">16x</span>
997
- <span class="cline-any cline-yes">16x</span>
998
- <span class="cline-any cline-yes">16x</span>
999
- <span class="cline-any cline-yes">16x</span>
1000
- <span class="cline-any cline-yes">16x</span>
1001
- <span class="cline-any cline-yes">16x</span>
1002
- <span class="cline-any cline-yes">16x</span>
1003
- <span class="cline-any cline-yes">16x</span>
1004
- <span class="cline-any cline-yes">16x</span>
1005
- <span class="cline-any cline-yes">16x</span>
1006
- <span class="cline-any cline-yes">16x</span>
1007
- <span class="cline-any cline-yes">16x</span>
1008
- <span class="cline-any cline-yes">16x</span>
1009
- <span class="cline-any cline-yes">16x</span>
1010
- <span class="cline-any cline-yes">16x</span>
1011
- <span class="cline-any cline-yes">16x</span>
1012
- <span class="cline-any cline-yes">16x</span>
1013
- <span class="cline-any cline-yes">16x</span>
1014
- <span class="cline-any cline-yes">16x</span>
1015
- <span class="cline-any cline-yes">16x</span>
1016
- <span class="cline-any cline-yes">16x</span>
1017
- <span class="cline-any cline-yes">16x</span>
1018
- <span class="cline-any cline-yes">16x</span>
1019
- <span class="cline-any cline-yes">16x</span>
1020
- <span class="cline-any cline-yes">16x</span>
1021
- <span class="cline-any cline-yes">16x</span>
1022
- <span class="cline-any cline-yes">16x</span>
1023
- <span class="cline-any cline-yes">16x</span>
1024
- <span class="cline-any cline-yes">16x</span>
1025
- <span class="cline-any cline-yes">16x</span>
1026
- <span class="cline-any cline-yes">16x</span>
1027
- <span class="cline-any cline-yes">16x</span>
1028
- <span class="cline-any cline-yes">16x</span>
1029
- <span class="cline-any cline-yes">16x</span>
1030
- <span class="cline-any cline-yes">16x</span>
1031
- <span class="cline-any cline-yes">16x</span>
1032
- <span class="cline-any cline-yes">16x</span>
1033
- <span class="cline-any cline-yes">16x</span>
1034
- <span class="cline-any cline-yes">16x</span>
1035
- <span class="cline-any cline-yes">16x</span>
892
+ <a name='L827'></a><a href='#L827'>827</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
1036
893
  <span class="cline-any cline-no">&nbsp;</span>
1037
894
  <span class="cline-any cline-no">&nbsp;</span>
1038
895
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1045,27 +902,6 @@
1045
902
  <span class="cline-any cline-no">&nbsp;</span>
1046
903
  <span class="cline-any cline-no">&nbsp;</span>
1047
904
  <span class="cline-any cline-no">&nbsp;</span>
1048
- <span class="cline-any cline-yes">16x</span>
1049
- <span class="cline-any cline-yes">16x</span>
1050
- <span class="cline-any cline-yes">16x</span>
1051
- <span class="cline-any cline-yes">16x</span>
1052
- <span class="cline-any cline-yes">16x</span>
1053
- <span class="cline-any cline-yes">16x</span>
1054
- <span class="cline-any cline-yes">16x</span>
1055
- <span class="cline-any cline-yes">16x</span>
1056
- <span class="cline-any cline-yes">16x</span>
1057
- <span class="cline-any cline-yes">16x</span>
1058
- <span class="cline-any cline-yes">16x</span>
1059
- <span class="cline-any cline-yes">16x</span>
1060
- <span class="cline-any cline-yes">16x</span>
1061
- <span class="cline-any cline-yes">16x</span>
1062
- <span class="cline-any cline-yes">16x</span>
1063
- <span class="cline-any cline-yes">16x</span>
1064
- <span class="cline-any cline-yes">16x</span>
1065
- <span class="cline-any cline-yes">16x</span>
1066
- <span class="cline-any cline-yes">16x</span>
1067
- <span class="cline-any cline-yes">16x</span>
1068
- <span class="cline-any cline-yes">16x</span>
1069
905
  <span class="cline-any cline-no">&nbsp;</span>
1070
906
  <span class="cline-any cline-no">&nbsp;</span>
1071
907
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1097,23 +933,10 @@
1097
933
  <span class="cline-any cline-no">&nbsp;</span>
1098
934
  <span class="cline-any cline-no">&nbsp;</span>
1099
935
  <span class="cline-any cline-no">&nbsp;</span>
1100
- <span class="cline-any cline-yes">16x</span>
1101
936
  <span class="cline-any cline-no">&nbsp;</span>
1102
937
  <span class="cline-any cline-no">&nbsp;</span>
1103
938
  <span class="cline-any cline-no">&nbsp;</span>
1104
939
  <span class="cline-any cline-no">&nbsp;</span>
1105
- <span class="cline-any cline-yes">16x</span>
1106
- <span class="cline-any cline-yes">16x</span>
1107
- <span class="cline-any cline-yes">16x</span>
1108
- <span class="cline-any cline-yes">16x</span>
1109
- <span class="cline-any cline-yes">16x</span>
1110
- <span class="cline-any cline-yes">16x</span>
1111
- <span class="cline-any cline-yes">16x</span>
1112
- <span class="cline-any cline-yes">16x</span>
1113
- <span class="cline-any cline-yes">16x</span>
1114
- <span class="cline-any cline-yes">16x</span>
1115
- <span class="cline-any cline-yes">16x</span>
1116
- <span class="cline-any cline-yes">16x</span>
1117
940
  <span class="cline-any cline-no">&nbsp;</span>
1118
941
  <span class="cline-any cline-no">&nbsp;</span>
1119
942
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1230,35 +1053,8 @@
1230
1053
  <span class="cline-any cline-no">&nbsp;</span>
1231
1054
  <span class="cline-any cline-no">&nbsp;</span>
1232
1055
  <span class="cline-any cline-no">&nbsp;</span>
1233
- <span class="cline-any cline-yes">16x</span>
1234
- <span class="cline-any cline-yes">16x</span>
1235
- <span class="cline-any cline-yes">16x</span>
1236
- <span class="cline-any cline-yes">16x</span>
1237
- <span class="cline-any cline-yes">16x</span>
1238
- <span class="cline-any cline-yes">16x</span>
1239
- <span class="cline-any cline-yes">16x</span>
1240
- <span class="cline-any cline-yes">16x</span>
1241
- <span class="cline-any cline-yes">16x</span>
1242
- <span class="cline-any cline-yes">16x</span>
1243
- <span class="cline-any cline-yes">16x</span>
1244
- <span class="cline-any cline-yes">12x</span>
1245
- <span class="cline-any cline-yes">12x</span>
1246
- <span class="cline-any cline-yes">12x</span>
1247
- <span class="cline-any cline-yes">12x</span>
1248
- <span class="cline-any cline-yes">12x</span>
1249
- <span class="cline-any cline-yes">12x</span>
1250
- <span class="cline-any cline-yes">12x</span>
1251
1056
  <span class="cline-any cline-no">&nbsp;</span>
1252
1057
  <span class="cline-any cline-no">&nbsp;</span>
1253
- <span class="cline-any cline-yes">12x</span>
1254
- <span class="cline-any cline-yes">16x</span>
1255
- <span class="cline-any cline-yes">16x</span>
1256
- <span class="cline-any cline-yes">16x</span>
1257
- <span class="cline-any cline-yes">16x</span>
1258
- <span class="cline-any cline-yes">16x</span>
1259
- <span class="cline-any cline-yes">16x</span>
1260
- <span class="cline-any cline-yes">16x</span>
1261
- <span class="cline-any cline-yes">16x</span>
1262
1058
  <span class="cline-any cline-no">&nbsp;</span>
1263
1059
  <span class="cline-any cline-no">&nbsp;</span>
1264
1060
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1266,239 +1062,12 @@
1266
1062
  <span class="cline-any cline-no">&nbsp;</span>
1267
1063
  <span class="cline-any cline-no">&nbsp;</span>
1268
1064
  <span class="cline-any cline-no">&nbsp;</span>
1269
- <span class="cline-any cline-yes">16x</span>
1270
- <span class="cline-any cline-yes">16x</span>
1271
- <span class="cline-any cline-yes">16x</span>
1272
- <span class="cline-any cline-yes">16x</span>
1273
- <span class="cline-any cline-yes">16x</span>
1274
- <span class="cline-any cline-yes">16x</span>
1275
- <span class="cline-any cline-yes">16x</span>
1276
- <span class="cline-any cline-yes">4x</span>
1277
- <span class="cline-any cline-yes">4x</span>
1278
- <span class="cline-any cline-yes">4x</span>
1279
1065
  <span class="cline-any cline-no">&nbsp;</span>
1280
1066
  <span class="cline-any cline-no">&nbsp;</span>
1281
- <span class="cline-any cline-yes">4x</span>
1282
- <span class="cline-any cline-yes">16x</span>
1283
- <span class="cline-any cline-yes">16x</span>
1284
- <span class="cline-any cline-yes">16x</span>
1285
- <span class="cline-any cline-yes">16x</span>
1286
- <span class="cline-any cline-yes">16x</span>
1287
- <span class="cline-any cline-yes">16x</span>
1288
- <span class="cline-any cline-yes">16x</span>
1289
- <span class="cline-any cline-yes">16x</span>
1290
- <span class="cline-any cline-yes">16x</span>
1291
- <span class="cline-any cline-yes">16x</span>
1292
- <span class="cline-any cline-yes">16x</span>
1293
- <span class="cline-any cline-yes">16x</span>
1294
- <span class="cline-any cline-yes">16x</span>
1295
- <span class="cline-any cline-yes">16x</span>
1296
- <span class="cline-any cline-yes">16x</span>
1297
- <span class="cline-any cline-yes">16x</span>
1298
- <span class="cline-any cline-yes">16x</span>
1299
- <span class="cline-any cline-yes">16x</span>
1300
- <span class="cline-any cline-yes">16x</span>
1301
- <span class="cline-any cline-yes">13x</span>
1302
- <span class="cline-any cline-yes">13x</span>
1303
- <span class="cline-any cline-yes">13x</span>
1304
- <span class="cline-any cline-yes">13x</span>
1305
- <span class="cline-any cline-yes">13x</span>
1306
- <span class="cline-any cline-yes">13x</span>
1307
- <span class="cline-any cline-yes">13x</span>
1308
- <span class="cline-any cline-yes">13x</span>
1309
- <span class="cline-any cline-yes">13x</span>
1310
1067
  <span class="cline-any cline-no">&nbsp;</span>
1311
1068
  <span class="cline-any cline-no">&nbsp;</span>
1312
1069
  <span class="cline-any cline-no">&nbsp;</span>
1313
1070
  <span class="cline-any cline-no">&nbsp;</span>
1314
- <span class="cline-any cline-yes">13x</span>
1315
- <span class="cline-any cline-yes">13x</span>
1316
- <span class="cline-any cline-yes">13x</span>
1317
- <span class="cline-any cline-yes">13x</span>
1318
- <span class="cline-any cline-yes">13x</span>
1319
- <span class="cline-any cline-yes">13x</span>
1320
- <span class="cline-any cline-yes">13x</span>
1321
- <span class="cline-any cline-yes">13x</span>
1322
- <span class="cline-any cline-yes">13x</span>
1323
- <span class="cline-any cline-yes">13x</span>
1324
- <span class="cline-any cline-yes">13x</span>
1325
- <span class="cline-any cline-yes">13x</span>
1326
- <span class="cline-any cline-yes">12x</span>
1327
- <span class="cline-any cline-yes">12x</span>
1328
- <span class="cline-any cline-yes">12x</span>
1329
- <span class="cline-any cline-yes">12x</span>
1330
- <span class="cline-any cline-yes">12x</span>
1331
- <span class="cline-any cline-yes">12x</span>
1332
- <span class="cline-any cline-yes">12x</span>
1333
- <span class="cline-any cline-yes">12x</span>
1334
- <span class="cline-any cline-yes">12x</span>
1335
- <span class="cline-any cline-yes">12x</span>
1336
- <span class="cline-any cline-yes">12x</span>
1337
- <span class="cline-any cline-yes">12x</span>
1338
- <span class="cline-any cline-yes">12x</span>
1339
- <span class="cline-any cline-yes">12x</span>
1340
- <span class="cline-any cline-yes">12x</span>
1341
- <span class="cline-any cline-yes">12x</span>
1342
- <span class="cline-any cline-yes">12x</span>
1343
- <span class="cline-any cline-yes">12x</span>
1344
- <span class="cline-any cline-yes">12x</span>
1345
- <span class="cline-any cline-yes">12x</span>
1346
- <span class="cline-any cline-yes">12x</span>
1347
- <span class="cline-any cline-yes">12x</span>
1348
- <span class="cline-any cline-yes">12x</span>
1349
- <span class="cline-any cline-yes">12x</span>
1350
- <span class="cline-any cline-yes">12x</span>
1351
- <span class="cline-any cline-yes">12x</span>
1352
- <span class="cline-any cline-yes">12x</span>
1353
- <span class="cline-any cline-yes">12x</span>
1354
- <span class="cline-any cline-yes">12x</span>
1355
- <span class="cline-any cline-yes">12x</span>
1356
- <span class="cline-any cline-yes">12x</span>
1357
- <span class="cline-any cline-yes">12x</span>
1358
- <span class="cline-any cline-yes">12x</span>
1359
- <span class="cline-any cline-yes">12x</span>
1360
- <span class="cline-any cline-yes">12x</span>
1361
- <span class="cline-any cline-yes">12x</span>
1362
- <span class="cline-any cline-yes">12x</span>
1363
- <span class="cline-any cline-yes">12x</span>
1364
- <span class="cline-any cline-yes">12x</span>
1365
- <span class="cline-any cline-yes">12x</span>
1366
- <span class="cline-any cline-yes">12x</span>
1367
- <span class="cline-any cline-yes">12x</span>
1368
- <span class="cline-any cline-yes">12x</span>
1369
- <span class="cline-any cline-yes">12x</span>
1370
- <span class="cline-any cline-yes">12x</span>
1371
- <span class="cline-any cline-yes">12x</span>
1372
- <span class="cline-any cline-yes">12x</span>
1373
- <span class="cline-any cline-yes">12x</span>
1374
- <span class="cline-any cline-yes">12x</span>
1375
- <span class="cline-any cline-yes">12x</span>
1376
- <span class="cline-any cline-yes">12x</span>
1377
- <span class="cline-any cline-yes">12x</span>
1378
- <span class="cline-any cline-yes">12x</span>
1379
- <span class="cline-any cline-yes">12x</span>
1380
- <span class="cline-any cline-yes">12x</span>
1381
- <span class="cline-any cline-yes">13x</span>
1382
- <span class="cline-any cline-yes">13x</span>
1383
- <span class="cline-any cline-yes">13x</span>
1384
- <span class="cline-any cline-yes">13x</span>
1385
- <span class="cline-any cline-no">&nbsp;</span>
1386
- <span class="cline-any cline-no">&nbsp;</span>
1387
- <span class="cline-any cline-no">&nbsp;</span>
1388
- <span class="cline-any cline-no">&nbsp;</span>
1389
- <span class="cline-any cline-no">&nbsp;</span>
1390
- <span class="cline-any cline-no">&nbsp;</span>
1391
- <span class="cline-any cline-no">&nbsp;</span>
1392
- <span class="cline-any cline-no">&nbsp;</span>
1393
- <span class="cline-any cline-yes">12x</span>
1394
- <span class="cline-any cline-yes">12x</span>
1395
- <span class="cline-any cline-yes">12x</span>
1396
- <span class="cline-any cline-yes">12x</span>
1397
- <span class="cline-any cline-yes">12x</span>
1398
- <span class="cline-any cline-yes">12x</span>
1399
- <span class="cline-any cline-yes">12x</span>
1400
- <span class="cline-any cline-yes">12x</span>
1401
- <span class="cline-any cline-yes">12x</span>
1402
- <span class="cline-any cline-yes">13x</span>
1403
- <span class="cline-any cline-no">&nbsp;</span>
1404
- <span class="cline-any cline-no">&nbsp;</span>
1405
- <span class="cline-any cline-no">&nbsp;</span>
1406
- <span class="cline-any cline-no">&nbsp;</span>
1407
- <span class="cline-any cline-no">&nbsp;</span>
1408
- <span class="cline-any cline-no">&nbsp;</span>
1409
- <span class="cline-any cline-no">&nbsp;</span>
1410
- <span class="cline-any cline-yes">12x</span>
1411
- <span class="cline-any cline-yes">12x</span>
1412
- <span class="cline-any cline-yes">12x</span>
1413
- <span class="cline-any cline-yes">12x</span>
1414
- <span class="cline-any cline-yes">12x</span>
1415
- <span class="cline-any cline-yes">12x</span>
1416
- <span class="cline-any cline-yes">12x</span>
1417
- <span class="cline-any cline-yes">12x</span>
1418
- <span class="cline-any cline-yes">12x</span>
1419
- <span class="cline-any cline-yes">12x</span>
1420
- <span class="cline-any cline-yes">12x</span>
1421
- <span class="cline-any cline-yes">12x</span>
1422
- <span class="cline-any cline-yes">12x</span>
1423
- <span class="cline-any cline-yes">12x</span>
1424
- <span class="cline-any cline-yes">12x</span>
1425
- <span class="cline-any cline-yes">12x</span>
1426
- <span class="cline-any cline-yes">12x</span>
1427
- <span class="cline-any cline-yes">12x</span>
1428
- <span class="cline-any cline-yes">12x</span>
1429
- <span class="cline-any cline-yes">12x</span>
1430
- <span class="cline-any cline-yes">12x</span>
1431
- <span class="cline-any cline-yes">12x</span>
1432
- <span class="cline-any cline-yes">12x</span>
1433
- <span class="cline-any cline-yes">12x</span>
1434
- <span class="cline-any cline-yes">12x</span>
1435
- <span class="cline-any cline-yes">12x</span>
1436
- <span class="cline-any cline-yes">12x</span>
1437
- <span class="cline-any cline-yes">12x</span>
1438
- <span class="cline-any cline-yes">12x</span>
1439
- <span class="cline-any cline-yes">12x</span>
1440
- <span class="cline-any cline-yes">12x</span>
1441
- <span class="cline-any cline-yes">12x</span>
1442
- <span class="cline-any cline-yes">12x</span>
1443
- <span class="cline-any cline-yes">12x</span>
1444
- <span class="cline-any cline-yes">12x</span>
1445
- <span class="cline-any cline-yes">12x</span>
1446
- <span class="cline-any cline-yes">12x</span>
1447
- <span class="cline-any cline-yes">12x</span>
1448
- <span class="cline-any cline-yes">12x</span>
1449
- <span class="cline-any cline-yes">12x</span>
1450
- <span class="cline-any cline-yes">12x</span>
1451
- <span class="cline-any cline-yes">12x</span>
1452
- <span class="cline-any cline-yes">12x</span>
1453
- <span class="cline-any cline-yes">12x</span>
1454
- <span class="cline-any cline-yes">12x</span>
1455
- <span class="cline-any cline-yes">12x</span>
1456
- <span class="cline-any cline-yes">12x</span>
1457
- <span class="cline-any cline-yes">12x</span>
1458
- <span class="cline-any cline-yes">12x</span>
1459
- <span class="cline-any cline-yes">12x</span>
1460
- <span class="cline-any cline-yes">12x</span>
1461
- <span class="cline-any cline-yes">12x</span>
1462
- <span class="cline-any cline-yes">12x</span>
1463
- <span class="cline-any cline-yes">12x</span>
1464
- <span class="cline-any cline-yes">12x</span>
1465
- <span class="cline-any cline-yes">12x</span>
1466
- <span class="cline-any cline-yes">12x</span>
1467
- <span class="cline-any cline-yes">12x</span>
1468
- <span class="cline-any cline-yes">12x</span>
1469
- <span class="cline-any cline-yes">12x</span>
1470
- <span class="cline-any cline-yes">12x</span>
1471
- <span class="cline-any cline-yes">12x</span>
1472
- <span class="cline-any cline-yes">12x</span>
1473
- <span class="cline-any cline-yes">12x</span>
1474
- <span class="cline-any cline-yes">12x</span>
1475
- <span class="cline-any cline-yes">13x</span>
1476
- <span class="cline-any cline-yes">1x</span>
1477
- <span class="cline-any cline-yes">1x</span>
1478
- <span class="cline-any cline-yes">1x</span>
1479
- <span class="cline-any cline-yes">1x</span>
1480
- <span class="cline-any cline-yes">1x</span>
1481
- <span class="cline-any cline-yes">1x</span>
1482
- <span class="cline-any cline-yes">1x</span>
1483
- <span class="cline-any cline-yes">1x</span>
1484
- <span class="cline-any cline-yes">1x</span>
1485
- <span class="cline-any cline-yes">1x</span>
1486
- <span class="cline-any cline-yes">1x</span>
1487
- <span class="cline-any cline-yes">1x</span>
1488
- <span class="cline-any cline-yes">1x</span>
1489
- <span class="cline-any cline-yes">1x</span>
1490
- <span class="cline-any cline-yes">1x</span>
1491
- <span class="cline-any cline-yes">1x</span>
1492
- <span class="cline-any cline-yes">1x</span>
1493
- <span class="cline-any cline-yes">13x</span>
1494
- <span class="cline-any cline-yes">16x</span>
1495
- <span class="cline-any cline-yes">16x</span>
1496
- <span class="cline-any cline-yes">16x</span>
1497
- <span class="cline-any cline-yes">16x</span>
1498
- <span class="cline-any cline-yes">16x</span>
1499
- <span class="cline-any cline-yes">16x</span>
1500
- <span class="cline-any cline-yes">16x</span>
1501
- <span class="cline-any cline-yes">16x</span>
1502
1071
  <span class="cline-any cline-no">&nbsp;</span>
1503
1072
  <span class="cline-any cline-no">&nbsp;</span>
1504
1073
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1534,46 +1103,15 @@
1534
1103
  <span class="cline-any cline-no">&nbsp;</span>
1535
1104
  <span class="cline-any cline-no">&nbsp;</span>
1536
1105
  <span class="cline-any cline-no">&nbsp;</span>
1537
- <span class="cline-any cline-yes">16x</span>
1538
- <span class="cline-any cline-yes">16x</span>
1539
- <span class="cline-any cline-yes">16x</span>
1540
- <span class="cline-any cline-yes">16x</span>
1541
- <span class="cline-any cline-yes">16x</span>
1542
- <span class="cline-any cline-yes">16x</span>
1543
- <span class="cline-any cline-yes">16x</span>
1544
- <span class="cline-any cline-yes">16x</span>
1545
- <span class="cline-any cline-yes">24x</span>
1546
- <span class="cline-any cline-yes">12x</span>
1547
- <span class="cline-any cline-yes">12x</span>
1548
- <span class="cline-any cline-yes">12x</span>
1549
- <span class="cline-any cline-yes">12x</span>
1550
- <span class="cline-any cline-yes">12x</span>
1551
- <span class="cline-any cline-yes">12x</span>
1552
1106
  <span class="cline-any cline-no">&nbsp;</span>
1553
1107
  <span class="cline-any cline-no">&nbsp;</span>
1554
1108
  <span class="cline-any cline-no">&nbsp;</span>
1555
1109
  <span class="cline-any cline-no">&nbsp;</span>
1556
1110
  <span class="cline-any cline-no">&nbsp;</span>
1557
1111
  <span class="cline-any cline-no">&nbsp;</span>
1558
- <span class="cline-any cline-yes">12x</span>
1559
- <span class="cline-any cline-yes">12x</span>
1560
- <span class="cline-any cline-yes">12x</span>
1561
- <span class="cline-any cline-yes">12x</span>
1562
- <span class="cline-any cline-yes">24x</span>
1563
- <span class="cline-any cline-yes">16x</span>
1564
- <span class="cline-any cline-yes">16x</span>
1565
- <span class="cline-any cline-yes">16x</span>
1566
- <span class="cline-any cline-yes">16x</span>
1567
- <span class="cline-any cline-yes">16x</span>
1568
- <span class="cline-any cline-yes">16x</span>
1569
- <span class="cline-any cline-yes">16x</span>
1570
- <span class="cline-any cline-yes">16x</span>
1571
- <span class="cline-any cline-yes">4x</span>
1572
1112
  <span class="cline-any cline-no">&nbsp;</span>
1573
1113
  <span class="cline-any cline-no">&nbsp;</span>
1574
1114
  <span class="cline-any cline-no">&nbsp;</span>
1575
- <span class="cline-any cline-yes">4x</span>
1576
- <span class="cline-any cline-yes">4x</span>
1577
1115
  <span class="cline-any cline-no">&nbsp;</span>
1578
1116
  <span class="cline-any cline-no">&nbsp;</span>
1579
1117
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1600,265 +1138,727 @@
1600
1138
  <span class="cline-any cline-no">&nbsp;</span>
1601
1139
  <span class="cline-any cline-no">&nbsp;</span>
1602
1140
  <span class="cline-any cline-no">&nbsp;</span>
1603
- <span class="cline-any cline-yes">4x</span>
1604
- <span class="cline-any cline-yes">4x</span>
1605
- <span class="cline-any cline-yes">4x</span>
1606
- <span class="cline-any cline-yes">4x</span>
1607
- <span class="cline-any cline-yes">4x</span>
1608
- <span class="cline-any cline-yes">4x</span>
1609
- <span class="cline-any cline-yes">4x</span>
1610
- <span class="cline-any cline-yes">4x</span>
1611
- <span class="cline-any cline-yes">4x</span>
1612
- <span class="cline-any cline-yes">4x</span>
1613
- <span class="cline-any cline-yes">4x</span>
1614
- <span class="cline-any cline-yes">4x</span>
1615
- <span class="cline-any cline-yes">4x</span>
1616
- <span class="cline-any cline-yes">4x</span>
1617
- <span class="cline-any cline-yes">4x</span>
1618
1141
  <span class="cline-any cline-no">&nbsp;</span>
1619
1142
  <span class="cline-any cline-no">&nbsp;</span>
1620
1143
  <span class="cline-any cline-no">&nbsp;</span>
1621
- <span class="cline-any cline-yes">4x</span>
1622
- <span class="cline-any cline-yes">4x</span>
1623
- <span class="cline-any cline-yes">4x</span>
1624
- <span class="cline-any cline-yes">4x</span>
1625
- <span class="cline-any cline-yes">4x</span>
1626
- <span class="cline-any cline-yes">4x</span>
1627
- <span class="cline-any cline-yes">4x</span>
1628
- <span class="cline-any cline-yes">4x</span>
1629
- <span class="cline-any cline-yes">4x</span>
1630
- <span class="cline-any cline-yes">4x</span>
1631
- <span class="cline-any cline-yes">4x</span>
1632
- <span class="cline-any cline-yes">4x</span>
1633
- <span class="cline-any cline-yes">4x</span>
1634
- <span class="cline-any cline-yes">4x</span>
1635
- <span class="cline-any cline-yes">16x</span>
1636
- <span class="cline-any cline-yes">16x</span>
1637
- <span class="cline-any cline-yes">16x</span>
1638
- <span class="cline-any cline-yes">16x</span>
1639
- <span class="cline-any cline-yes">16x</span>
1640
- <span class="cline-any cline-yes">16x</span>
1641
- <span class="cline-any cline-yes">16x</span>
1642
- <span class="cline-any cline-yes">16x</span>
1643
- <span class="cline-any cline-yes">2x</span>
1644
1144
  <span class="cline-any cline-no">&nbsp;</span>
1645
1145
  <span class="cline-any cline-no">&nbsp;</span>
1646
- <span class="cline-any cline-yes">2x</span>
1647
- <span class="cline-any cline-yes">2x</span>
1648
- <span class="cline-any cline-yes">16x</span>
1649
- <span class="cline-any cline-yes">16x</span>
1650
- <span class="cline-any cline-yes">16x</span>
1651
- <span class="cline-any cline-yes">16x</span>
1652
- <span class="cline-any cline-yes">16x</span>
1653
- <span class="cline-any cline-yes">16x</span>
1654
- <span class="cline-any cline-yes">2x</span>
1655
1146
  <span class="cline-any cline-no">&nbsp;</span>
1656
1147
  <span class="cline-any cline-no">&nbsp;</span>
1657
- <span class="cline-any cline-yes">2x</span>
1658
- <span class="cline-any cline-yes">2x</span>
1659
- <span class="cline-any cline-yes">16x</span>
1660
- <span class="cline-any cline-yes">16x</span>
1661
- <span class="cline-any cline-yes">16x</span>
1662
- <span class="cline-any cline-yes">16x</span>
1663
- <span class="cline-any cline-yes">16x</span>
1664
- <span class="cline-any cline-yes">16x</span>
1665
1148
  <span class="cline-any cline-no">&nbsp;</span>
1666
1149
  <span class="cline-any cline-no">&nbsp;</span>
1667
1150
  <span class="cline-any cline-no">&nbsp;</span>
1668
1151
  <span class="cline-any cline-no">&nbsp;</span>
1669
1152
  <span class="cline-any cline-no">&nbsp;</span>
1670
- <span class="cline-any cline-yes">16x</span>
1671
- <span class="cline-any cline-yes">16x</span>
1672
- <span class="cline-any cline-yes">16x</span>
1673
- <span class="cline-any cline-yes">16x</span>
1674
- <span class="cline-any cline-yes">16x</span>
1675
- <span class="cline-any cline-yes">16x</span>
1676
1153
  <span class="cline-any cline-no">&nbsp;</span>
1677
1154
  <span class="cline-any cline-no">&nbsp;</span>
1678
1155
  <span class="cline-any cline-no">&nbsp;</span>
1679
1156
  <span class="cline-any cline-no">&nbsp;</span>
1680
1157
  <span class="cline-any cline-no">&nbsp;</span>
1681
- <span class="cline-any cline-yes">16x</span>
1682
- <span class="cline-any cline-yes">16x</span>
1683
- <span class="cline-any cline-yes">16x</span>
1684
- <span class="cline-any cline-yes">16x</span>
1685
- <span class="cline-any cline-yes">16x</span>
1686
- <span class="cline-any cline-yes">16x</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-yes">16x</span>
1690
- <span class="cline-any cline-yes">16x</span>
1691
- <span class="cline-any cline-yes">16x</span>
1692
- <span class="cline-any cline-yes">16x</span>
1693
- <span class="cline-any cline-yes">16x</span>
1694
- <span class="cline-any cline-yes">16x</span>
1695
- <span class="cline-any cline-yes">16x</span>
1696
- <span class="cline-any cline-yes">16x</span>
1697
- <span class="cline-any cline-yes">16x</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-yes">16x</span>
1708
- <span class="cline-any cline-yes">16x</span>
1709
- <span class="cline-any cline-yes">16x</span>
1710
- <span class="cline-any cline-yes">16x</span>
1711
- <span class="cline-any cline-yes">16x</span>
1712
- <span class="cline-any cline-yes">16x</span>
1713
- <span class="cline-any cline-yes">16x</span>
1714
- <span class="cline-any cline-yes">16x</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-yes">16x</span>
1718
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1719
- * HSuite Native Connect
1720
- * Copyright 2024-2025 HSuite (https://hsuite.finance)
1721
- *
1722
- * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
1723
- *
1724
- * This file is part of HSuite Native Connect. For commercial licensing,
1725
- * visit https://hsuite.finance/licensing
1726
- */
1727
- &nbsp;
1728
- /**
1729
- * @file walletconnect-provider.ts
1730
- * @description Refactored WalletConnect v2 provider using Strategy Pattern
1731
- *
1732
- * Multi-chain WalletConnect v2 provider that delegates ledger-specific logic
1733
- * to specialized signer implementations.
1734
- *
1735
- * Architecture:
1736
- * - Provider: Orchestrates connection, session management, and UI
1737
- * - Signers: Handle ledger-specific transaction signing and formatting
1738
- * - Encoders: Convert between SDK formats and WalletConnect formats
1739
- *
1740
- * Benefits:
1741
- * - Clean separation of concerns
1742
- * - Easy to add new ledgers (just implement IWalletConnectSigner)
1743
- * - Testable (mock signers for unit tests)
1744
- * - Maintainable (ledger logic is isolated)
1745
- */
1746
- &nbsp;
1747
- import { Injectable, signal, inject, NgZone } from '@angular/core';
1748
- import { getLogger } from '@hsuite/native-connect-sdk';
1749
- &nbsp;
1750
- import type {
1751
- ConnectionStatus,
1752
- ProviderMetadata,
1753
- ConnectionConfig,
1754
- WalletConnectV2Config,
1755
- } from '../../../models/provider-types';
1756
- import type { UnifiedAccount } from '../../../models/unified-account.model';
1757
- import { WalletEventBus } from '../../../services/wallet-event-bus.service';
1758
- import { BaseWalletProvider } from '../../base-wallet-provider';
1759
- import type {
1760
- SignTransactionOptions,
1761
- SubmitTransactionOptions,
1762
- SignResult,
1763
- SubmitResult,
1764
- SignMessageOptions,
1765
- SignMessageResult,
1766
- } from '../../base-wallet-provider';
1767
- import { SignerFactory } from '../signers/signer-factory';
1768
- &nbsp;
1769
- import { WalletConnectClientManager } from './walletconnect-client-manager';
1770
- import { WalletConnectSessionStore } from './walletconnect-session-store';
1771
- import { WalletConnectSigningOrchestrator } from './walletconnect-signing-orchestrator';
1772
- &nbsp;
1773
- const logger = getLogger().scoped?.('WalletConnectV2Provider'<span class="branch-0 cbranch-no" title="branch not covered" >) ?? getLogger();</span>
1774
- &nbsp;
1775
- /**
1776
- * Storage key prefix for persisting user's network selection per session topic.
1777
- * This is critical for proper session restoration after page reload.
1778
- */
1779
- const NETWORK_SELECTION_STORAGE_KEY = 'wc_user_network_selection_';
1780
- &nbsp;
1781
- /**
1782
- * WalletConnect v2 provider with multi-chain support.
1783
- *
1784
- * Uses Strategy Pattern to delegate ledger-specific operations to
1785
- * specialized signer implementations (HederaSigner, XrplSigner, etc.).
1786
- *
1787
- * Features:
1788
- * - Automatic session restoration from IndexedDB
1789
- * - QR code modal for wallet connection
1790
- * - Support for multiple ledgers (Hedera, XRPL, extensible)
1791
- * - Clean separation of orchestration vs ledger logic
1792
- * - **Multi-session support**: Connect multiple wallets across different ledgers/networks
1793
- */
1794
- @Injectable({ providedIn: 'root' })
1795
- export class WalletConnectV2Provider extends BaseWalletProvider {
1796
- override readonly id = 'walletconnect-v2';
1797
- &nbsp;
1798
- override readonly metadata: ProviderMetadata = {
1799
- id: 'walletconnect-v2',
1800
- name: 'WalletConnect',
1801
- type: 'walletconnect-v2',
1802
- description: 'Connect via QR code to Hedera, XRPL, and other wallets',
1803
- supportsMultipleAccounts: true, // Changed to true for multi-session
1804
- };
1805
- &nbsp;
1806
- /**
1807
- * Client manager - handles SignClient lifecycle.
1808
- */
1809
- private readonly clientManager = new WalletConnectClientManager();
1810
- &nbsp;
1811
- /**
1812
- * Session store - handles session Map and account aggregation.
1813
- */
1814
- private readonly sessionStore = new WalletConnectSessionStore();
1815
- &nbsp;
1816
- /**
1817
- * Signing orchestrator - handles transaction signing routing.
1818
- */
1819
- private signingOrchestrator!: WalletConnectSigningOrchestrator;
1820
- &nbsp;
1821
- // Track session_delete listener registration
1822
- private sessionDeleteListenerRegistered = false;
1823
- &nbsp;
1824
- // Reactive state
1825
- private _status = signal&lt;ConnectionStatus&gt;('disconnected');
1826
- private _error = signal&lt;string | null&gt;(null);
1827
- &nbsp;
1828
- override readonly status = this._status.asReadonly();
1829
- override readonly accounts = this.sessionStore.accounts;
1830
- override readonly error = this._error.asReadonly();
1831
- &nbsp;
1832
- // Event bus for emitting wallet events
1833
- private readonly eventBus = inject(WalletEventBus);
1834
- &nbsp;
1835
- // NgZone for ensuring change detection runs after WalletConnect events
1836
- private readonly zone = inject(NgZone);
1837
- &nbsp;
1838
- /**
1839
- *
1840
- */
1841
- constructor() {
1842
- super();
1843
- &nbsp;
1844
- // Initialize signing orchestrator
1845
- this.signingOrchestrator = new WalletConnectSigningOrchestrator({
1846
- providerId: this.id,
1847
- sessionStore: this.sessionStore,
1848
- clientManager: this.clientManager,
1849
- eventBus: this.eventBus,
1850
- });
1851
- &nbsp;
1852
- logger.info('Initializing - will attempt session restoration');
1853
- void this.restoreSession();
1854
- }
1855
- &nbsp;
1856
- /**
1857
- * Ensure that a previously restored WalletConnect session is present in memory.
1858
- * Useful for UI flows that want to re-select a session after reload without forcing a new pairing flow.
1859
- * @param sessionKey
1860
- */
1861
- <span class="fstat-no" title="function not covered" > async resumeSession(sessionKey: string): Promise&lt;boolean&gt; {</span>
1158
+ <span class="cline-any cline-no">&nbsp;</span>
1159
+ <span class="cline-any cline-no">&nbsp;</span>
1160
+ <span class="cline-any cline-no">&nbsp;</span>
1161
+ <span class="cline-any cline-no">&nbsp;</span>
1162
+ <span class="cline-any cline-no">&nbsp;</span>
1163
+ <span class="cline-any cline-no">&nbsp;</span>
1164
+ <span class="cline-any cline-no">&nbsp;</span>
1165
+ <span class="cline-any cline-no">&nbsp;</span>
1166
+ <span class="cline-any cline-no">&nbsp;</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-no">&nbsp;</span>
1170
+ <span class="cline-any cline-no">&nbsp;</span>
1171
+ <span class="cline-any cline-no">&nbsp;</span>
1172
+ <span class="cline-any cline-no">&nbsp;</span>
1173
+ <span class="cline-any cline-no">&nbsp;</span>
1174
+ <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-no">&nbsp;</span>
1176
+ <span class="cline-any cline-no">&nbsp;</span>
1177
+ <span class="cline-any cline-no">&nbsp;</span>
1178
+ <span class="cline-any cline-no">&nbsp;</span>
1179
+ <span class="cline-any cline-no">&nbsp;</span>
1180
+ <span class="cline-any cline-no">&nbsp;</span>
1181
+ <span class="cline-any cline-no">&nbsp;</span>
1182
+ <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-no">&nbsp;</span>
1184
+ <span class="cline-any cline-no">&nbsp;</span>
1185
+ <span class="cline-any cline-no">&nbsp;</span>
1186
+ <span class="cline-any cline-no">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-no">&nbsp;</span>
1189
+ <span class="cline-any cline-no">&nbsp;</span>
1190
+ <span class="cline-any cline-no">&nbsp;</span>
1191
+ <span class="cline-any cline-no">&nbsp;</span>
1192
+ <span class="cline-any cline-no">&nbsp;</span>
1193
+ <span class="cline-any cline-no">&nbsp;</span>
1194
+ <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-no">&nbsp;</span>
1196
+ <span class="cline-any cline-no">&nbsp;</span>
1197
+ <span class="cline-any cline-no">&nbsp;</span>
1198
+ <span class="cline-any cline-no">&nbsp;</span>
1199
+ <span class="cline-any cline-no">&nbsp;</span>
1200
+ <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1203
+ <span class="cline-any cline-no">&nbsp;</span>
1204
+ <span class="cline-any cline-no">&nbsp;</span>
1205
+ <span class="cline-any cline-no">&nbsp;</span>
1206
+ <span class="cline-any cline-no">&nbsp;</span>
1207
+ <span class="cline-any cline-no">&nbsp;</span>
1208
+ <span class="cline-any cline-no">&nbsp;</span>
1209
+ <span class="cline-any cline-no">&nbsp;</span>
1210
+ <span class="cline-any cline-no">&nbsp;</span>
1211
+ <span class="cline-any cline-no">&nbsp;</span>
1212
+ <span class="cline-any cline-no">&nbsp;</span>
1213
+ <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-no">&nbsp;</span>
1215
+ <span class="cline-any cline-no">&nbsp;</span>
1216
+ <span class="cline-any cline-no">&nbsp;</span>
1217
+ <span class="cline-any cline-no">&nbsp;</span>
1218
+ <span class="cline-any cline-no">&nbsp;</span>
1219
+ <span class="cline-any cline-no">&nbsp;</span>
1220
+ <span class="cline-any cline-no">&nbsp;</span>
1221
+ <span class="cline-any cline-no">&nbsp;</span>
1222
+ <span class="cline-any cline-no">&nbsp;</span>
1223
+ <span class="cline-any cline-no">&nbsp;</span>
1224
+ <span class="cline-any cline-no">&nbsp;</span>
1225
+ <span class="cline-any cline-no">&nbsp;</span>
1226
+ <span class="cline-any cline-no">&nbsp;</span>
1227
+ <span class="cline-any cline-no">&nbsp;</span>
1228
+ <span class="cline-any cline-no">&nbsp;</span>
1229
+ <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-no">&nbsp;</span>
1231
+ <span class="cline-any cline-no">&nbsp;</span>
1232
+ <span class="cline-any cline-no">&nbsp;</span>
1233
+ <span class="cline-any cline-no">&nbsp;</span>
1234
+ <span class="cline-any cline-no">&nbsp;</span>
1235
+ <span class="cline-any cline-no">&nbsp;</span>
1236
+ <span class="cline-any cline-no">&nbsp;</span>
1237
+ <span class="cline-any cline-no">&nbsp;</span>
1238
+ <span class="cline-any cline-no">&nbsp;</span>
1239
+ <span class="cline-any cline-no">&nbsp;</span>
1240
+ <span class="cline-any cline-no">&nbsp;</span>
1241
+ <span class="cline-any cline-no">&nbsp;</span>
1242
+ <span class="cline-any cline-no">&nbsp;</span>
1243
+ <span class="cline-any cline-no">&nbsp;</span>
1244
+ <span class="cline-any cline-no">&nbsp;</span>
1245
+ <span class="cline-any cline-no">&nbsp;</span>
1246
+ <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-no">&nbsp;</span>
1248
+ <span class="cline-any cline-no">&nbsp;</span>
1249
+ <span class="cline-any cline-no">&nbsp;</span>
1250
+ <span class="cline-any cline-no">&nbsp;</span>
1251
+ <span class="cline-any cline-no">&nbsp;</span>
1252
+ <span class="cline-any cline-no">&nbsp;</span>
1253
+ <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-no">&nbsp;</span>
1255
+ <span class="cline-any cline-no">&nbsp;</span>
1256
+ <span class="cline-any cline-no">&nbsp;</span>
1257
+ <span class="cline-any cline-no">&nbsp;</span>
1258
+ <span class="cline-any cline-no">&nbsp;</span>
1259
+ <span class="cline-any cline-no">&nbsp;</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-no">&nbsp;</span>
1262
+ <span class="cline-any cline-no">&nbsp;</span>
1263
+ <span class="cline-any cline-no">&nbsp;</span>
1264
+ <span class="cline-any cline-no">&nbsp;</span>
1265
+ <span class="cline-any cline-no">&nbsp;</span>
1266
+ <span class="cline-any cline-no">&nbsp;</span>
1267
+ <span class="cline-any cline-no">&nbsp;</span>
1268
+ <span class="cline-any cline-no">&nbsp;</span>
1269
+ <span class="cline-any cline-no">&nbsp;</span>
1270
+ <span class="cline-any cline-no">&nbsp;</span>
1271
+ <span class="cline-any cline-no">&nbsp;</span>
1272
+ <span class="cline-any cline-no">&nbsp;</span>
1273
+ <span class="cline-any cline-no">&nbsp;</span>
1274
+ <span class="cline-any cline-no">&nbsp;</span>
1275
+ <span class="cline-any cline-no">&nbsp;</span>
1276
+ <span class="cline-any cline-no">&nbsp;</span>
1277
+ <span class="cline-any cline-no">&nbsp;</span>
1278
+ <span class="cline-any cline-no">&nbsp;</span>
1279
+ <span class="cline-any cline-no">&nbsp;</span>
1280
+ <span class="cline-any cline-no">&nbsp;</span>
1281
+ <span class="cline-any cline-no">&nbsp;</span>
1282
+ <span class="cline-any cline-no">&nbsp;</span>
1283
+ <span class="cline-any cline-no">&nbsp;</span>
1284
+ <span class="cline-any cline-no">&nbsp;</span>
1285
+ <span class="cline-any cline-no">&nbsp;</span>
1286
+ <span class="cline-any cline-no">&nbsp;</span>
1287
+ <span class="cline-any cline-no">&nbsp;</span>
1288
+ <span class="cline-any cline-no">&nbsp;</span>
1289
+ <span class="cline-any cline-no">&nbsp;</span>
1290
+ <span class="cline-any cline-no">&nbsp;</span>
1291
+ <span class="cline-any cline-no">&nbsp;</span>
1292
+ <span class="cline-any cline-no">&nbsp;</span>
1293
+ <span class="cline-any cline-no">&nbsp;</span>
1294
+ <span class="cline-any cline-no">&nbsp;</span>
1295
+ <span class="cline-any cline-no">&nbsp;</span>
1296
+ <span class="cline-any cline-no">&nbsp;</span>
1297
+ <span class="cline-any cline-no">&nbsp;</span>
1298
+ <span class="cline-any cline-no">&nbsp;</span>
1299
+ <span class="cline-any cline-no">&nbsp;</span>
1300
+ <span class="cline-any cline-no">&nbsp;</span>
1301
+ <span class="cline-any cline-no">&nbsp;</span>
1302
+ <span class="cline-any cline-no">&nbsp;</span>
1303
+ <span class="cline-any cline-no">&nbsp;</span>
1304
+ <span class="cline-any cline-no">&nbsp;</span>
1305
+ <span class="cline-any cline-no">&nbsp;</span>
1306
+ <span class="cline-any cline-no">&nbsp;</span>
1307
+ <span class="cline-any cline-no">&nbsp;</span>
1308
+ <span class="cline-any cline-no">&nbsp;</span>
1309
+ <span class="cline-any cline-no">&nbsp;</span>
1310
+ <span class="cline-any cline-no">&nbsp;</span>
1311
+ <span class="cline-any cline-no">&nbsp;</span>
1312
+ <span class="cline-any cline-no">&nbsp;</span>
1313
+ <span class="cline-any cline-no">&nbsp;</span>
1314
+ <span class="cline-any cline-no">&nbsp;</span>
1315
+ <span class="cline-any cline-no">&nbsp;</span>
1316
+ <span class="cline-any cline-no">&nbsp;</span>
1317
+ <span class="cline-any cline-no">&nbsp;</span>
1318
+ <span class="cline-any cline-no">&nbsp;</span>
1319
+ <span class="cline-any cline-no">&nbsp;</span>
1320
+ <span class="cline-any cline-no">&nbsp;</span>
1321
+ <span class="cline-any cline-no">&nbsp;</span>
1322
+ <span class="cline-any cline-no">&nbsp;</span>
1323
+ <span class="cline-any cline-no">&nbsp;</span>
1324
+ <span class="cline-any cline-no">&nbsp;</span>
1325
+ <span class="cline-any cline-no">&nbsp;</span>
1326
+ <span class="cline-any cline-no">&nbsp;</span>
1327
+ <span class="cline-any cline-no">&nbsp;</span>
1328
+ <span class="cline-any cline-no">&nbsp;</span>
1329
+ <span class="cline-any cline-no">&nbsp;</span>
1330
+ <span class="cline-any cline-no">&nbsp;</span>
1331
+ <span class="cline-any cline-no">&nbsp;</span>
1332
+ <span class="cline-any cline-no">&nbsp;</span>
1333
+ <span class="cline-any cline-no">&nbsp;</span>
1334
+ <span class="cline-any cline-no">&nbsp;</span>
1335
+ <span class="cline-any cline-no">&nbsp;</span>
1336
+ <span class="cline-any cline-no">&nbsp;</span>
1337
+ <span class="cline-any cline-no">&nbsp;</span>
1338
+ <span class="cline-any cline-no">&nbsp;</span>
1339
+ <span class="cline-any cline-no">&nbsp;</span>
1340
+ <span class="cline-any cline-no">&nbsp;</span>
1341
+ <span class="cline-any cline-no">&nbsp;</span>
1342
+ <span class="cline-any cline-no">&nbsp;</span>
1343
+ <span class="cline-any cline-no">&nbsp;</span>
1344
+ <span class="cline-any cline-no">&nbsp;</span>
1345
+ <span class="cline-any cline-no">&nbsp;</span>
1346
+ <span class="cline-any cline-no">&nbsp;</span>
1347
+ <span class="cline-any cline-no">&nbsp;</span>
1348
+ <span class="cline-any cline-no">&nbsp;</span>
1349
+ <span class="cline-any cline-no">&nbsp;</span>
1350
+ <span class="cline-any cline-no">&nbsp;</span>
1351
+ <span class="cline-any cline-no">&nbsp;</span>
1352
+ <span class="cline-any cline-no">&nbsp;</span>
1353
+ <span class="cline-any cline-no">&nbsp;</span>
1354
+ <span class="cline-any cline-no">&nbsp;</span>
1355
+ <span class="cline-any cline-no">&nbsp;</span>
1356
+ <span class="cline-any cline-no">&nbsp;</span>
1357
+ <span class="cline-any cline-no">&nbsp;</span>
1358
+ <span class="cline-any cline-no">&nbsp;</span>
1359
+ <span class="cline-any cline-no">&nbsp;</span>
1360
+ <span class="cline-any cline-no">&nbsp;</span>
1361
+ <span class="cline-any cline-no">&nbsp;</span>
1362
+ <span class="cline-any cline-no">&nbsp;</span>
1363
+ <span class="cline-any cline-no">&nbsp;</span>
1364
+ <span class="cline-any cline-no">&nbsp;</span>
1365
+ <span class="cline-any cline-no">&nbsp;</span>
1366
+ <span class="cline-any cline-no">&nbsp;</span>
1367
+ <span class="cline-any cline-no">&nbsp;</span>
1368
+ <span class="cline-any cline-no">&nbsp;</span>
1369
+ <span class="cline-any cline-no">&nbsp;</span>
1370
+ <span class="cline-any cline-no">&nbsp;</span>
1371
+ <span class="cline-any cline-no">&nbsp;</span>
1372
+ <span class="cline-any cline-no">&nbsp;</span>
1373
+ <span class="cline-any cline-no">&nbsp;</span>
1374
+ <span class="cline-any cline-no">&nbsp;</span>
1375
+ <span class="cline-any cline-no">&nbsp;</span>
1376
+ <span class="cline-any cline-no">&nbsp;</span>
1377
+ <span class="cline-any cline-no">&nbsp;</span>
1378
+ <span class="cline-any cline-no">&nbsp;</span>
1379
+ <span class="cline-any cline-no">&nbsp;</span>
1380
+ <span class="cline-any cline-no">&nbsp;</span>
1381
+ <span class="cline-any cline-no">&nbsp;</span>
1382
+ <span class="cline-any cline-no">&nbsp;</span>
1383
+ <span class="cline-any cline-no">&nbsp;</span>
1384
+ <span class="cline-any cline-no">&nbsp;</span>
1385
+ <span class="cline-any cline-no">&nbsp;</span>
1386
+ <span class="cline-any cline-no">&nbsp;</span>
1387
+ <span class="cline-any cline-no">&nbsp;</span>
1388
+ <span class="cline-any cline-no">&nbsp;</span>
1389
+ <span class="cline-any cline-no">&nbsp;</span>
1390
+ <span class="cline-any cline-no">&nbsp;</span>
1391
+ <span class="cline-any cline-no">&nbsp;</span>
1392
+ <span class="cline-any cline-no">&nbsp;</span>
1393
+ <span class="cline-any cline-no">&nbsp;</span>
1394
+ <span class="cline-any cline-no">&nbsp;</span>
1395
+ <span class="cline-any cline-no">&nbsp;</span>
1396
+ <span class="cline-any cline-no">&nbsp;</span>
1397
+ <span class="cline-any cline-no">&nbsp;</span>
1398
+ <span class="cline-any cline-no">&nbsp;</span>
1399
+ <span class="cline-any cline-no">&nbsp;</span>
1400
+ <span class="cline-any cline-no">&nbsp;</span>
1401
+ <span class="cline-any cline-no">&nbsp;</span>
1402
+ <span class="cline-any cline-no">&nbsp;</span>
1403
+ <span class="cline-any cline-no">&nbsp;</span>
1404
+ <span class="cline-any cline-no">&nbsp;</span>
1405
+ <span class="cline-any cline-no">&nbsp;</span>
1406
+ <span class="cline-any cline-no">&nbsp;</span>
1407
+ <span class="cline-any cline-no">&nbsp;</span>
1408
+ <span class="cline-any cline-no">&nbsp;</span>
1409
+ <span class="cline-any cline-no">&nbsp;</span>
1410
+ <span class="cline-any cline-no">&nbsp;</span>
1411
+ <span class="cline-any cline-no">&nbsp;</span>
1412
+ <span class="cline-any cline-no">&nbsp;</span>
1413
+ <span class="cline-any cline-no">&nbsp;</span>
1414
+ <span class="cline-any cline-no">&nbsp;</span>
1415
+ <span class="cline-any cline-no">&nbsp;</span>
1416
+ <span class="cline-any cline-no">&nbsp;</span>
1417
+ <span class="cline-any cline-no">&nbsp;</span>
1418
+ <span class="cline-any cline-no">&nbsp;</span>
1419
+ <span class="cline-any cline-no">&nbsp;</span>
1420
+ <span class="cline-any cline-no">&nbsp;</span>
1421
+ <span class="cline-any cline-no">&nbsp;</span>
1422
+ <span class="cline-any cline-no">&nbsp;</span>
1423
+ <span class="cline-any cline-no">&nbsp;</span>
1424
+ <span class="cline-any cline-no">&nbsp;</span>
1425
+ <span class="cline-any cline-no">&nbsp;</span>
1426
+ <span class="cline-any cline-no">&nbsp;</span>
1427
+ <span class="cline-any cline-no">&nbsp;</span>
1428
+ <span class="cline-any cline-no">&nbsp;</span>
1429
+ <span class="cline-any cline-no">&nbsp;</span>
1430
+ <span class="cline-any cline-no">&nbsp;</span>
1431
+ <span class="cline-any cline-no">&nbsp;</span>
1432
+ <span class="cline-any cline-no">&nbsp;</span>
1433
+ <span class="cline-any cline-no">&nbsp;</span>
1434
+ <span class="cline-any cline-no">&nbsp;</span>
1435
+ <span class="cline-any cline-no">&nbsp;</span>
1436
+ <span class="cline-any cline-no">&nbsp;</span>
1437
+ <span class="cline-any cline-no">&nbsp;</span>
1438
+ <span class="cline-any cline-no">&nbsp;</span>
1439
+ <span class="cline-any cline-no">&nbsp;</span>
1440
+ <span class="cline-any cline-no">&nbsp;</span>
1441
+ <span class="cline-any cline-no">&nbsp;</span>
1442
+ <span class="cline-any cline-no">&nbsp;</span>
1443
+ <span class="cline-any cline-no">&nbsp;</span>
1444
+ <span class="cline-any cline-no">&nbsp;</span>
1445
+ <span class="cline-any cline-no">&nbsp;</span>
1446
+ <span class="cline-any cline-no">&nbsp;</span>
1447
+ <span class="cline-any cline-no">&nbsp;</span>
1448
+ <span class="cline-any cline-no">&nbsp;</span>
1449
+ <span class="cline-any cline-no">&nbsp;</span>
1450
+ <span class="cline-any cline-no">&nbsp;</span>
1451
+ <span class="cline-any cline-no">&nbsp;</span>
1452
+ <span class="cline-any cline-no">&nbsp;</span>
1453
+ <span class="cline-any cline-no">&nbsp;</span>
1454
+ <span class="cline-any cline-no">&nbsp;</span>
1455
+ <span class="cline-any cline-no">&nbsp;</span>
1456
+ <span class="cline-any cline-no">&nbsp;</span>
1457
+ <span class="cline-any cline-no">&nbsp;</span>
1458
+ <span class="cline-any cline-no">&nbsp;</span>
1459
+ <span class="cline-any cline-no">&nbsp;</span>
1460
+ <span class="cline-any cline-no">&nbsp;</span>
1461
+ <span class="cline-any cline-no">&nbsp;</span>
1462
+ <span class="cline-any cline-no">&nbsp;</span>
1463
+ <span class="cline-any cline-no">&nbsp;</span>
1464
+ <span class="cline-any cline-no">&nbsp;</span>
1465
+ <span class="cline-any cline-no">&nbsp;</span>
1466
+ <span class="cline-any cline-no">&nbsp;</span>
1467
+ <span class="cline-any cline-no">&nbsp;</span>
1468
+ <span class="cline-any cline-no">&nbsp;</span>
1469
+ <span class="cline-any cline-no">&nbsp;</span>
1470
+ <span class="cline-any cline-no">&nbsp;</span>
1471
+ <span class="cline-any cline-no">&nbsp;</span>
1472
+ <span class="cline-any cline-no">&nbsp;</span>
1473
+ <span class="cline-any cline-no">&nbsp;</span>
1474
+ <span class="cline-any cline-no">&nbsp;</span>
1475
+ <span class="cline-any cline-no">&nbsp;</span>
1476
+ <span class="cline-any cline-no">&nbsp;</span>
1477
+ <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-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>
1719
+ <span class="cstat-no" title="statement not covered" > * HSuite Native Connect</span>
1720
+ <span class="cstat-no" title="statement not covered" > * Copyright 2024-2025 HSuite (https://hsuite.finance)</span>
1721
+ <span class="cstat-no" title="statement not covered" > *</span>
1722
+ <span class="cstat-no" title="statement not covered" > * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0</span>
1723
+ <span class="cstat-no" title="statement not covered" > *</span>
1724
+ <span class="cstat-no" title="statement not covered" > * This file is part of HSuite Native Connect. For commercial licensing,</span>
1725
+ <span class="cstat-no" title="statement not covered" > * visit https://hsuite.finance/licensing</span>
1726
+ <span class="cstat-no" title="statement not covered" > */</span>
1727
+ <span class="cstat-no" title="statement not covered" ></span>
1728
+ <span class="cstat-no" title="statement not covered" >/**</span>
1729
+ <span class="cstat-no" title="statement not covered" > * @file walletconnect-provider.ts</span>
1730
+ <span class="cstat-no" title="statement not covered" > * @description Refactored WalletConnect v2 provider using Strategy Pattern</span>
1731
+ <span class="cstat-no" title="statement not covered" > *</span>
1732
+ <span class="cstat-no" title="statement not covered" > * Multi-chain WalletConnect v2 provider that delegates ledger-specific logic</span>
1733
+ <span class="cstat-no" title="statement not covered" > * to specialized signer implementations.</span>
1734
+ <span class="cstat-no" title="statement not covered" > *</span>
1735
+ <span class="cstat-no" title="statement not covered" > * Architecture:</span>
1736
+ <span class="cstat-no" title="statement not covered" > * - Provider: Orchestrates connection, session management, and UI</span>
1737
+ <span class="cstat-no" title="statement not covered" > * - Signers: Handle ledger-specific transaction signing and formatting</span>
1738
+ <span class="cstat-no" title="statement not covered" > * - Encoders: Convert between SDK formats and WalletConnect formats</span>
1739
+ <span class="cstat-no" title="statement not covered" > *</span>
1740
+ <span class="cstat-no" title="statement not covered" > * Benefits:</span>
1741
+ <span class="cstat-no" title="statement not covered" > * - Clean separation of concerns</span>
1742
+ <span class="cstat-no" title="statement not covered" > * - Easy to add new ledgers (just implement IWalletConnectSigner)</span>
1743
+ <span class="cstat-no" title="statement not covered" > * - Testable (mock signers for unit tests)</span>
1744
+ <span class="cstat-no" title="statement not covered" > * - Maintainable (ledger logic is isolated)</span>
1745
+ <span class="cstat-no" title="statement not covered" > */</span>
1746
+ <span class="cstat-no" title="statement not covered" ></span>
1747
+ <span class="cstat-no" title="statement not covered" >import { Injectable, signal, inject, NgZone } from '@angular/core';</span>
1748
+ <span class="cstat-no" title="statement not covered" >import { getLogger } from '@hsuite/native-connect-sdk';</span>
1749
+ <span class="cstat-no" title="statement not covered" ></span>
1750
+ <span class="cstat-no" title="statement not covered" >import type {</span>
1751
+ <span class="cstat-no" title="statement not covered" > ConnectionStatus,</span>
1752
+ <span class="cstat-no" title="statement not covered" > ProviderMetadata,</span>
1753
+ <span class="cstat-no" title="statement not covered" > ConnectionConfig,</span>
1754
+ <span class="cstat-no" title="statement not covered" > WalletConnectV2Config,</span>
1755
+ <span class="cstat-no" title="statement not covered" >} from '../../../models/provider-types';</span>
1756
+ <span class="cstat-no" title="statement not covered" >import type { UnifiedAccount } from '../../../models/unified-account.model';</span>
1757
+ <span class="cstat-no" title="statement not covered" >import { WalletEventBus } from '../../../services/wallet-event-bus.service';</span>
1758
+ <span class="cstat-no" title="statement not covered" >import { BaseWalletProvider } from '../../base-wallet-provider';</span>
1759
+ <span class="cstat-no" title="statement not covered" >import type {</span>
1760
+ <span class="cstat-no" title="statement not covered" > SignTransactionOptions,</span>
1761
+ <span class="cstat-no" title="statement not covered" > SubmitTransactionOptions,</span>
1762
+ <span class="cstat-no" title="statement not covered" > SignResult,</span>
1763
+ <span class="cstat-no" title="statement not covered" > SubmitResult,</span>
1764
+ <span class="cstat-no" title="statement not covered" > SignMessageOptions,</span>
1765
+ <span class="cstat-no" title="statement not covered" > SignMessageResult,</span>
1766
+ <span class="cstat-no" title="statement not covered" >} from '../../base-wallet-provider';</span>
1767
+ <span class="cstat-no" title="statement not covered" >import { SignerFactory } from '../signers/signer-factory';</span>
1768
+ <span class="cstat-no" title="statement not covered" ></span>
1769
+ <span class="cstat-no" title="statement not covered" >import { WalletConnectClientManager } from './walletconnect-client-manager';</span>
1770
+ <span class="cstat-no" title="statement not covered" >import { WalletConnectSessionStore } from './walletconnect-session-store';</span>
1771
+ <span class="cstat-no" title="statement not covered" >import { WalletConnectSigningOrchestrator } from './walletconnect-signing-orchestrator';</span>
1772
+ <span class="cstat-no" title="statement not covered" ></span>
1773
+ <span class="cstat-no" title="statement not covered" >const logger = getLogger().scoped?.('WalletConnectV2Provider') ?? getLogger();</span>
1774
+ <span class="cstat-no" title="statement not covered" ></span>
1775
+ <span class="cstat-no" title="statement not covered" >/**</span>
1776
+ <span class="cstat-no" title="statement not covered" > * Storage key prefix for persisting user's network selection per session topic.</span>
1777
+ <span class="cstat-no" title="statement not covered" > * This is critical for proper session restoration after page reload.</span>
1778
+ <span class="cstat-no" title="statement not covered" > */</span>
1779
+ <span class="cstat-no" title="statement not covered" >const NETWORK_SELECTION_STORAGE_KEY = 'wc_user_network_selection_';</span>
1780
+ <span class="cstat-no" title="statement not covered" ></span>
1781
+ <span class="cstat-no" title="statement not covered" >/**</span>
1782
+ <span class="cstat-no" title="statement not covered" > * WalletConnect v2 provider with multi-chain support.</span>
1783
+ <span class="cstat-no" title="statement not covered" > *</span>
1784
+ <span class="cstat-no" title="statement not covered" > * Uses Strategy Pattern to delegate ledger-specific operations to</span>
1785
+ <span class="cstat-no" title="statement not covered" > * specialized signer implementations (HederaSigner, XrplSigner, etc.).</span>
1786
+ <span class="cstat-no" title="statement not covered" > *</span>
1787
+ <span class="cstat-no" title="statement not covered" > * Features:</span>
1788
+ <span class="cstat-no" title="statement not covered" > * - Automatic session restoration from IndexedDB</span>
1789
+ <span class="cstat-no" title="statement not covered" > * - QR code modal for wallet connection</span>
1790
+ <span class="cstat-no" title="statement not covered" > * - Support for multiple ledgers (Hedera, XRPL, extensible)</span>
1791
+ <span class="cstat-no" title="statement not covered" > * - Clean separation of orchestration vs ledger logic</span>
1792
+ <span class="cstat-no" title="statement not covered" > * - **Multi-session support**: Connect multiple wallets across different ledgers/networks</span>
1793
+ <span class="cstat-no" title="statement not covered" > */</span>
1794
+ <span class="cstat-no" title="statement not covered" >@Injectable({ providedIn: 'root' })</span>
1795
+ <span class="cstat-no" title="statement not covered" >export class WalletConnectV2Provider extends BaseWalletProvider {</span>
1796
+ <span class="cstat-no" title="statement not covered" > override readonly id = 'walletconnect-v2';</span>
1797
+ <span class="cstat-no" title="statement not covered" ></span>
1798
+ <span class="cstat-no" title="statement not covered" > override readonly metadata: ProviderMetadata = {</span>
1799
+ <span class="cstat-no" title="statement not covered" > id: 'walletconnect-v2',</span>
1800
+ <span class="cstat-no" title="statement not covered" > name: 'WalletConnect',</span>
1801
+ <span class="cstat-no" title="statement not covered" > type: 'walletconnect-v2',</span>
1802
+ <span class="cstat-no" title="statement not covered" > description: 'Connect via QR code to Hedera, XRPL, and other wallets',</span>
1803
+ <span class="cstat-no" title="statement not covered" > supportsMultipleAccounts: true, // Changed to true for multi-session</span>
1804
+ <span class="cstat-no" title="statement not covered" > };</span>
1805
+ <span class="cstat-no" title="statement not covered" ></span>
1806
+ <span class="cstat-no" title="statement not covered" > /**</span>
1807
+ <span class="cstat-no" title="statement not covered" > * Client manager - handles SignClient lifecycle.</span>
1808
+ <span class="cstat-no" title="statement not covered" > */</span>
1809
+ <span class="cstat-no" title="statement not covered" > private readonly clientManager = new WalletConnectClientManager();</span>
1810
+ <span class="cstat-no" title="statement not covered" ></span>
1811
+ <span class="cstat-no" title="statement not covered" > /**</span>
1812
+ <span class="cstat-no" title="statement not covered" > * Session store - handles session Map and account aggregation.</span>
1813
+ <span class="cstat-no" title="statement not covered" > */</span>
1814
+ <span class="cstat-no" title="statement not covered" > private readonly sessionStore = new WalletConnectSessionStore();</span>
1815
+ <span class="cstat-no" title="statement not covered" ></span>
1816
+ <span class="cstat-no" title="statement not covered" > /**</span>
1817
+ <span class="cstat-no" title="statement not covered" > * Signing orchestrator - handles transaction signing routing.</span>
1818
+ <span class="cstat-no" title="statement not covered" > */</span>
1819
+ <span class="cstat-no" title="statement not covered" > private signingOrchestrator!: WalletConnectSigningOrchestrator;</span>
1820
+ <span class="cstat-no" title="statement not covered" ></span>
1821
+ <span class="cstat-no" title="statement not covered" > // Track session_delete listener registration</span>
1822
+ <span class="cstat-no" title="statement not covered" > private sessionDeleteListenerRegistered = false;</span>
1823
+ <span class="cstat-no" title="statement not covered" ></span>
1824
+ <span class="cstat-no" title="statement not covered" > // Reactive state</span>
1825
+ <span class="cstat-no" title="statement not covered" > private _status = signal&lt;ConnectionStatus&gt;('disconnected');</span>
1826
+ <span class="cstat-no" title="statement not covered" > private _error = signal&lt;string | null&gt;(null);</span>
1827
+ <span class="cstat-no" title="statement not covered" ></span>
1828
+ <span class="cstat-no" title="statement not covered" > override readonly status = this._status.asReadonly();</span>
1829
+ <span class="cstat-no" title="statement not covered" > override readonly accounts = this.sessionStore.accounts;</span>
1830
+ <span class="cstat-no" title="statement not covered" > override readonly error = this._error.asReadonly();</span>
1831
+ <span class="cstat-no" title="statement not covered" ></span>
1832
+ <span class="cstat-no" title="statement not covered" > // Event bus for emitting wallet events</span>
1833
+ <span class="cstat-no" title="statement not covered" > private readonly eventBus = inject(WalletEventBus);</span>
1834
+ <span class="cstat-no" title="statement not covered" ></span>
1835
+ <span class="cstat-no" title="statement not covered" > // NgZone for ensuring change detection runs after WalletConnect events</span>
1836
+ <span class="cstat-no" title="statement not covered" > private readonly zone = inject(NgZone);</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" > constructor() {</span>
1842
+ <span class="cstat-no" title="statement not covered" > super();</span>
1843
+ <span class="cstat-no" title="statement not covered" ></span>
1844
+ <span class="cstat-no" title="statement not covered" > // Initialize signing orchestrator</span>
1845
+ <span class="cstat-no" title="statement not covered" > this.signingOrchestrator = new WalletConnectSigningOrchestrator({</span>
1846
+ <span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
1847
+ <span class="cstat-no" title="statement not covered" > sessionStore: this.sessionStore,</span>
1848
+ <span class="cstat-no" title="statement not covered" > clientManager: this.clientManager,</span>
1849
+ <span class="cstat-no" title="statement not covered" > eventBus: this.eventBus,</span>
1850
+ <span class="cstat-no" title="statement not covered" > });</span>
1851
+ <span class="cstat-no" title="statement not covered" ></span>
1852
+ <span class="cstat-no" title="statement not covered" > logger.info('Initializing - will attempt session restoration');</span>
1853
+ <span class="cstat-no" title="statement not covered" > void this.restoreSession();</span>
1854
+ <span class="cstat-no" title="statement not covered" > }</span>
1855
+ <span class="cstat-no" title="statement not covered" ></span>
1856
+ <span class="cstat-no" title="statement not covered" > /**</span>
1857
+ <span class="cstat-no" title="statement not covered" > * Ensure that a previously restored WalletConnect session is present in memory.</span>
1858
+ <span class="cstat-no" title="statement not covered" > * Useful for UI flows that want to re-select a session after reload without forcing a new pairing flow.</span>
1859
+ <span class="cstat-no" title="statement not covered" > * @param sessionKey</span>
1860
+ <span class="cstat-no" title="statement not covered" > */</span>
1861
+ <span class="cstat-no" title="statement not covered" > async resumeSession(sessionKey: string): Promise&lt;boolean&gt; {</span>
1862
1862
  <span class="cstat-no" title="statement not covered" > if (this.sessionStore.hasSession(sessionKey)) {</span>
1863
1863
  <span class="cstat-no" title="statement not covered" > this.sessionStore.updateAggregatedAccounts();</span>
1864
1864
  <span class="cstat-no" title="statement not covered" > return true;</span>
@@ -1871,27 +1871,27 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
1871
1871
  <span class="cstat-no" title="statement not covered" > }</span>
1872
1872
  <span class="cstat-no" title="statement not covered" > return exists;</span>
1873
1873
  <span class="cstat-no" title="statement not covered" > }</span>
1874
- &nbsp;
1875
- /**
1876
- * Restore existing WalletConnect sessions from IndexedDB.
1877
- * Automatically called during provider initialization.
1878
- * Uses clientManager for client lifecycle.
1879
- */
1880
- private async restoreSession(): Promise&lt;void&gt; {
1881
- try {
1882
- logger.debug('Attempting to restore sessions...');
1883
- &nbsp;
1884
- // Restore client from stored projectId
1885
- const client = await this.clientManager.restoreClient({
1886
- name: 'HSuite Demo',
1887
- description: 'Multi-chain wallet connection',
1888
- url: window.location.origin,
1889
- icons: [],
1890
- });
1891
- &nbsp;
1892
- if (!client) {
1893
- return;
1894
- <span class="branch-0 cbranch-no" title="branch not covered" > }</span>
1874
+ <span class="cstat-no" title="statement not covered" ></span>
1875
+ <span class="cstat-no" title="statement not covered" > /**</span>
1876
+ <span class="cstat-no" title="statement not covered" > * Restore existing WalletConnect sessions from IndexedDB.</span>
1877
+ <span class="cstat-no" title="statement not covered" > * Automatically called during provider initialization.</span>
1878
+ <span class="cstat-no" title="statement not covered" > * Uses clientManager for client lifecycle.</span>
1879
+ <span class="cstat-no" title="statement not covered" > */</span>
1880
+ <span class="cstat-no" title="statement not covered" > private async restoreSession(): Promise&lt;void&gt; {</span>
1881
+ <span class="cstat-no" title="statement not covered" > try {</span>
1882
+ <span class="cstat-no" title="statement not covered" > logger.debug('Attempting to restore sessions...');</span>
1883
+ <span class="cstat-no" title="statement not covered" ></span>
1884
+ <span class="cstat-no" title="statement not covered" > // Restore client from stored projectId</span>
1885
+ <span class="cstat-no" title="statement not covered" > const client = await this.clientManager.restoreClient({</span>
1886
+ <span class="cstat-no" title="statement not covered" > name: 'HSuite Demo',</span>
1887
+ <span class="cstat-no" title="statement not covered" > description: 'Multi-chain wallet connection',</span>
1888
+ <span class="cstat-no" title="statement not covered" > url: window.location.origin,</span>
1889
+ <span class="cstat-no" title="statement not covered" > icons: [],</span>
1890
+ <span class="cstat-no" title="statement not covered" > });</span>
1891
+ <span class="cstat-no" title="statement not covered" ></span>
1892
+ <span class="cstat-no" title="statement not covered" > if (!client) {</span>
1893
+ <span class="cstat-no" title="statement not covered" > return;</span>
1894
+ <span class="cstat-no" title="statement not covered" > }</span>
1895
1895
  <span class="cstat-no" title="statement not covered" ></span>
1896
1896
  <span class="cstat-no" title="statement not covered" > // Register session_delete listener</span>
1897
1897
  <span class="cstat-no" title="statement not covered" > this.registerSessionDeleteListener();</span>
@@ -1923,23 +1923,23 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
1923
1923
  <span class="cstat-no" title="statement not covered" > this._status.set('connected');</span>
1924
1924
  <span class="cstat-no" title="statement not covered" > logger.info('Restored sessions', { count: this.sessionStore.size });</span>
1925
1925
  <span class="cstat-no" title="statement not covered" > }</span>
1926
- <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
1926
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1927
1927
  <span class="cstat-no" title="statement not covered" > logger.error('Failed to restore sessions', {</span>
1928
1928
  <span class="cstat-no" title="statement not covered" > error: error instanceof Error ? error.message : String(error),</span>
1929
1929
  <span class="cstat-no" title="statement not covered" > });</span>
1930
1930
  <span class="cstat-no" title="statement not covered" > }</span>
1931
- }
1932
- &nbsp;
1933
- /**
1934
- * Restore a single WalletConnect session.
1935
- * Internal helper for multi-session restoration.
1936
- *
1937
- * IMPORTANT: Reads user's network selection from localStorage to ensure
1938
- * restored sessions use the correct network the user originally selected.
1939
- *
1940
- * @param session - WalletConnect session object from IndexedDB
1941
- */
1942
- <span class="fstat-no" title="function not covered" > private async restoreSingleSession(session: any): Promise&lt;void&gt; {</span>
1931
+ <span class="cstat-no" title="statement not covered" > }</span>
1932
+ <span class="cstat-no" title="statement not covered" ></span>
1933
+ <span class="cstat-no" title="statement not covered" > /**</span>
1934
+ <span class="cstat-no" title="statement not covered" > * Restore a single WalletConnect session.</span>
1935
+ <span class="cstat-no" title="statement not covered" > * Internal helper for multi-session restoration.</span>
1936
+ <span class="cstat-no" title="statement not covered" > *</span>
1937
+ <span class="cstat-no" title="statement not covered" > * IMPORTANT: Reads user's network selection from localStorage to ensure</span>
1938
+ <span class="cstat-no" title="statement not covered" > * restored sessions use the correct network the user originally selected.</span>
1939
+ <span class="cstat-no" title="statement not covered" > *</span>
1940
+ <span class="cstat-no" title="statement not covered" > * @param session - WalletConnect session object from IndexedDB</span>
1941
+ <span class="cstat-no" title="statement not covered" > */</span>
1942
+ <span class="cstat-no" title="statement not covered" > private async restoreSingleSession(session: any): Promise&lt;void&gt; {</span>
1943
1943
  <span class="cstat-no" title="statement not covered" > logger.debug('Restoring session', { topic: session.topic });</span>
1944
1944
  <span class="cstat-no" title="statement not covered" > logger.debug('Session namespaces', { namespaces: Object.keys(session.namespaces) });</span>
1945
1945
  <span class="cstat-no" title="statement not covered" ></span>
@@ -2056,35 +2056,35 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
2056
2056
  <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
2057
2057
  <span class="cstat-no" title="statement not covered" > });</span>
2058
2058
  <span class="cstat-no" title="statement not covered" > }</span>
2059
- &nbsp;
2060
- // NOTE: generateSessionKey and updateAggregatedAccounts have been moved to WalletConnectSessionStore
2061
- &nbsp;
2062
- /**
2063
- * Store user's network selection in localStorage for session restoration.
2064
- * This ensures the user's network choice persists across page reloads.
2065
- *
2066
- * @param sessionTopic - WalletConnect session topic
2067
- * @param networkId - User's selected network (e.g., 'hedera:mainnet')
2068
- */
2069
- private storeUserNetworkSelection(sessionTopic: string, networkId: string): void {
2070
- try {
2071
- localStorage.setItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`, networkId);
2072
- logger.debug('Stored user network selection', {
2073
- topic: sessionTopic.substring(0, 16),
2074
- networkId,
2075
- });
2076
- <span class="branch-0 cbranch-no" title="branch not covered" > } catch (e) {</span>
2059
+ <span class="cstat-no" title="statement not covered" ></span>
2060
+ <span class="cstat-no" title="statement not covered" > // NOTE: generateSessionKey and updateAggregatedAccounts have been moved to WalletConnectSessionStore</span>
2061
+ <span class="cstat-no" title="statement not covered" ></span>
2062
+ <span class="cstat-no" title="statement not covered" > /**</span>
2063
+ <span class="cstat-no" title="statement not covered" > * Store user's network selection in localStorage for session restoration.</span>
2064
+ <span class="cstat-no" title="statement not covered" > * This ensures the user's network choice persists across page reloads.</span>
2065
+ <span class="cstat-no" title="statement not covered" > *</span>
2066
+ <span class="cstat-no" title="statement not covered" > * @param sessionTopic - WalletConnect session topic</span>
2067
+ <span class="cstat-no" title="statement not covered" > * @param networkId - User's selected network (e.g., 'hedera:mainnet')</span>
2068
+ <span class="cstat-no" title="statement not covered" > */</span>
2069
+ <span class="cstat-no" title="statement not covered" > private storeUserNetworkSelection(sessionTopic: string, networkId: string): void {</span>
2070
+ <span class="cstat-no" title="statement not covered" > try {</span>
2071
+ <span class="cstat-no" title="statement not covered" > localStorage.setItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`, networkId);</span>
2072
+ <span class="cstat-no" title="statement not covered" > logger.debug('Stored user network selection', {</span>
2073
+ <span class="cstat-no" title="statement not covered" > topic: sessionTopic.substring(0, 16),</span>
2074
+ <span class="cstat-no" title="statement not covered" > networkId,</span>
2075
+ <span class="cstat-no" title="statement not covered" > });</span>
2076
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
2077
2077
  <span class="cstat-no" title="statement not covered" > logger.warn('Failed to store network selection', { error: (e as Error).message });</span>
2078
2078
  <span class="cstat-no" title="statement not covered" > }</span>
2079
- }
2080
- &nbsp;
2081
- /**
2082
- * Retrieve user's network selection from localStorage for session restoration.
2083
- *
2084
- * @param sessionTopic - WalletConnect session topic
2085
- * @returns User's selected network, or undefined if not found
2086
- */
2087
- private <span class="fstat-no" title="function not covered" >getUserNetworkSelection(sessionTopic: string): string | undefined {</span>
2079
+ <span class="cstat-no" title="statement not covered" > }</span>
2080
+ <span class="cstat-no" title="statement not covered" ></span>
2081
+ <span class="cstat-no" title="statement not covered" > /**</span>
2082
+ <span class="cstat-no" title="statement not covered" > * Retrieve user's network selection from localStorage for session restoration.</span>
2083
+ <span class="cstat-no" title="statement not covered" > *</span>
2084
+ <span class="cstat-no" title="statement not covered" > * @param sessionTopic - WalletConnect session topic</span>
2085
+ <span class="cstat-no" title="statement not covered" > * @returns User's selected network, or undefined if not found</span>
2086
+ <span class="cstat-no" title="statement not covered" > */</span>
2087
+ <span class="cstat-no" title="statement not covered" > private getUserNetworkSelection(sessionTopic: string): string | undefined {</span>
2088
2088
  <span class="cstat-no" title="statement not covered" > try {</span>
2089
2089
  <span class="cstat-no" title="statement not covered" > return localStorage.getItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`) || undefined;</span>
2090
2090
  <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
@@ -2092,122 +2092,122 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
2092
2092
  <span class="cstat-no" title="statement not covered" > return undefined;</span>
2093
2093
  <span class="cstat-no" title="statement not covered" > }</span>
2094
2094
  <span class="cstat-no" title="statement not covered" > }</span>
2095
- &nbsp;
2096
- /**
2097
- * Clean up stored network selection for a session.
2098
- *
2099
- * @param sessionTopic - WalletConnect session topic
2100
- */
2101
- private clearUserNetworkSelection(sessionTopic: string): void {
2102
- try {
2103
- localStorage.removeItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`);
2104
- <span class="branch-0 cbranch-no" title="branch not covered" > } catch (_e) {</span>
2095
+ <span class="cstat-no" title="statement not covered" ></span>
2096
+ <span class="cstat-no" title="statement not covered" > /**</span>
2097
+ <span class="cstat-no" title="statement not covered" > * Clean up stored network selection for a session.</span>
2098
+ <span class="cstat-no" title="statement not covered" > *</span>
2099
+ <span class="cstat-no" title="statement not covered" > * @param sessionTopic - WalletConnect session topic</span>
2100
+ <span class="cstat-no" title="statement not covered" > */</span>
2101
+ <span class="cstat-no" title="statement not covered" > private clearUserNetworkSelection(sessionTopic: string): void {</span>
2102
+ <span class="cstat-no" title="statement not covered" > try {</span>
2103
+ <span class="cstat-no" title="statement not covered" > localStorage.removeItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`);</span>
2104
+ <span class="cstat-no" title="statement not covered" > } catch (_e) {</span>
2105
2105
  <span class="cstat-no" title="statement not covered" > // Ignore cleanup errors</span>
2106
2106
  <span class="cstat-no" title="statement not covered" > }</span>
2107
- }
2108
- &nbsp;
2109
- /**
2110
- * Connect to a wallet via WalletConnect QR code.
2111
- *
2112
- * Multi-session support:
2113
- * - Each connect() call creates a NEW session
2114
- * - Sessions are tracked separately in the sessions Map
2115
- * - Multiple sessions can coexist for different ledgers/networks
2116
- *
2117
- * Process:
2118
- * 1. Get appropriate signer for the ledger
2119
- * 2. Initialize WalletConnect client and modal
2120
- * 3. Build namespace configuration using signer
2121
- * 4. Generate QR code and wait for wallet approval
2122
- * 5. Store session and update aggregated accounts
2123
- *
2124
- * @param config - Connection configuration including ledger and network
2125
- */
2126
- async connect(config: ConnectionConfig): Promise&lt;void&gt; {
2127
- const wcConfig = config as WalletConnectV2Config;
2128
- &nbsp;
2129
- try {
2130
- this._status.set('connecting');
2131
- this._error.set(null);
2132
- &nbsp;
2133
- // Validate configuration
2134
- const projectId = wcConfig.projectId;
2135
- if (!projectId) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2107
+ <span class="cstat-no" title="statement not covered" > }</span>
2108
+ <span class="cstat-no" title="statement not covered" ></span>
2109
+ <span class="cstat-no" title="statement not covered" > /**</span>
2110
+ <span class="cstat-no" title="statement not covered" > * Connect to a wallet via WalletConnect QR code.</span>
2111
+ <span class="cstat-no" title="statement not covered" > *</span>
2112
+ <span class="cstat-no" title="statement not covered" > * Multi-session support:</span>
2113
+ <span class="cstat-no" title="statement not covered" > * - Each connect() call creates a NEW session</span>
2114
+ <span class="cstat-no" title="statement not covered" > * - Sessions are tracked separately in the sessions Map</span>
2115
+ <span class="cstat-no" title="statement not covered" > * - Multiple sessions can coexist for different ledgers/networks</span>
2116
+ <span class="cstat-no" title="statement not covered" > *</span>
2117
+ <span class="cstat-no" title="statement not covered" > * Process:</span>
2118
+ <span class="cstat-no" title="statement not covered" > * 1. Get appropriate signer for the ledger</span>
2119
+ <span class="cstat-no" title="statement not covered" > * 2. Initialize WalletConnect client and modal</span>
2120
+ <span class="cstat-no" title="statement not covered" > * 3. Build namespace configuration using signer</span>
2121
+ <span class="cstat-no" title="statement not covered" > * 4. Generate QR code and wait for wallet approval</span>
2122
+ <span class="cstat-no" title="statement not covered" > * 5. Store session and update aggregated accounts</span>
2123
+ <span class="cstat-no" title="statement not covered" > *</span>
2124
+ <span class="cstat-no" title="statement not covered" > * @param config - Connection configuration including ledger and network</span>
2125
+ <span class="cstat-no" title="statement not covered" > */</span>
2126
+ <span class="cstat-no" title="statement not covered" > async connect(config: ConnectionConfig): Promise&lt;void&gt; {</span>
2127
+ <span class="cstat-no" title="statement not covered" > const wcConfig = config as WalletConnectV2Config;</span>
2128
+ <span class="cstat-no" title="statement not covered" ></span>
2129
+ <span class="cstat-no" title="statement not covered" > try {</span>
2130
+ <span class="cstat-no" title="statement not covered" > this._status.set('connecting');</span>
2131
+ <span class="cstat-no" title="statement not covered" > this._error.set(null);</span>
2132
+ <span class="cstat-no" title="statement not covered" ></span>
2133
+ <span class="cstat-no" title="statement not covered" > // Validate configuration</span>
2134
+ <span class="cstat-no" title="statement not covered" > const projectId = wcConfig.projectId;</span>
2135
+ <span class="cstat-no" title="statement not covered" > if (!projectId) {</span>
2136
2136
  <span class="cstat-no" title="statement not covered" > throw new Error(</span>
2137
2137
  <span class="cstat-no" title="statement not covered" > 'WalletConnect projectId is required. Get one from https://cloud.walletconnect.com',</span>
2138
2138
  <span class="cstat-no" title="statement not covered" > );</span>
2139
2139
  <span class="cstat-no" title="statement not covered" > }</span>
2140
- &nbsp;
2141
- // Get the appropriate signer for this ledger (Strategy Pattern)
2142
- const signer = SignerFactory.getSigner(wcConfig.ledgerId);
2143
- logger.debug('Using signer for ledger', { ledgerId: wcConfig.ledgerId });
2144
- &nbsp;
2145
- // Initialize client via manager
2146
- await this.clientManager.initialize(projectId, {
2147
- name: wcConfig.appName || 'HSuite Demo',
2148
- description: wcConfig.appDescription || 'Multi-chain wallet connection',
2149
- url: window.location.origin,
2150
- icons: wcConfig.<span class="branch-0 cbranch-no" title="branch not covered" >appIconUrl ? [wcConfig.appIconUrl] : [</span>],
2151
- });
2152
- this.registerSessionDeleteListener();
2153
- &nbsp;
2154
- // Create modal for QR code display
2155
- const modal = this.clientManager.createModal(projectId, [wcConfig.networkId]);
2156
- &nbsp;
2157
- // Build namespace configuration using signer
2158
- const namespaceConfig = signer.buildNamespace(wcConfig.networkId);
2159
- const optionalNamespaces = { [wcConfig.ledgerId]: namespaceConfig };
2160
- logger.debug('Namespace config', { ledgerId: wcConfig.ledgerId });
2161
- &nbsp;
2162
- // Build session properties to pass user's preferred network to wallet
2163
- // This tells the wallet which network accounts to show in the picker
2164
- const sessionProperties = {
2165
- preferredNetwork: wcConfig.networkId,
2166
- preferredLedger: wcConfig.ledgerId,
2167
- };
2168
- &nbsp;
2169
- logger.info('Connecting with preferred network', {
2170
- preferredNetwork: wcConfig.networkId,
2171
- preferredLedger: wcConfig.ledgerId,
2172
- });
2173
- &nbsp;
2174
- // Connect and show QR code
2175
- const { uri, approval } = await this.clientManager.connect(
2176
- optionalNamespaces,
2177
- sessionProperties,
2178
- );
2179
- &nbsp;
2180
- if (uri) {
2181
- await modal.openModal({ uri });
2182
- }
2183
- &nbsp;
2184
- // Wait for wallet approval
2185
- logger.info('Waiting for wallet approval...');
2186
- const session = await approval();
2187
- this.clientManager.closeModal();
2188
- &nbsp;
2189
- logger.info('[WC:DAPP:APPROVED] Session approved by wallet', {
2190
- topic: session.topic.substring(0, 16) + '...',
2191
- fullTopic: session.topic,
2192
- namespaces: Object.keys(session.namespaces),
2193
- expiry: session.expiry,
2194
- });
2195
- &nbsp;
2196
- // Generate session key
2197
- const sessionKey = this.sessionStore.generateSessionKey(
2198
- wcConfig.ledgerId,
2199
- wcConfig.networkId,
2200
- session.topic,
2201
- );
2202
- &nbsp;
2203
- // Parse accounts from session
2204
- const sessionNamespace = session.namespaces[wcConfig.ledgerId];
2205
- logger.debug('Session namespace for ledger', {
2206
- ledgerId: wcConfig.ledgerId,
2207
- accountCount: (sessionNamespace as { accounts?: any[] })?.accounts?.<span class="branch-0 cbranch-no" title="branch not covered" >length || 0,</span>
2208
- });
2209
- &nbsp;
2210
- if (!sessionNamespace) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2140
+ <span class="cstat-no" title="statement not covered" ></span>
2141
+ <span class="cstat-no" title="statement not covered" > // Get the appropriate signer for this ledger (Strategy Pattern)</span>
2142
+ <span class="cstat-no" title="statement not covered" > const signer = SignerFactory.getSigner(wcConfig.ledgerId);</span>
2143
+ <span class="cstat-no" title="statement not covered" > logger.debug('Using signer for ledger', { ledgerId: wcConfig.ledgerId });</span>
2144
+ <span class="cstat-no" title="statement not covered" ></span>
2145
+ <span class="cstat-no" title="statement not covered" > // Initialize client via manager</span>
2146
+ <span class="cstat-no" title="statement not covered" > await this.clientManager.initialize(projectId, {</span>
2147
+ <span class="cstat-no" title="statement not covered" > name: wcConfig.appName || 'HSuite Demo',</span>
2148
+ <span class="cstat-no" title="statement not covered" > description: wcConfig.appDescription || 'Multi-chain wallet connection',</span>
2149
+ <span class="cstat-no" title="statement not covered" > url: window.location.origin,</span>
2150
+ <span class="cstat-no" title="statement not covered" > icons: wcConfig.appIconUrl ? [wcConfig.appIconUrl] : [],</span>
2151
+ <span class="cstat-no" title="statement not covered" > });</span>
2152
+ <span class="cstat-no" title="statement not covered" > this.registerSessionDeleteListener();</span>
2153
+ <span class="cstat-no" title="statement not covered" ></span>
2154
+ <span class="cstat-no" title="statement not covered" > // Create modal for QR code display</span>
2155
+ <span class="cstat-no" title="statement not covered" > const modal = this.clientManager.createModal(projectId, [wcConfig.networkId]);</span>
2156
+ <span class="cstat-no" title="statement not covered" ></span>
2157
+ <span class="cstat-no" title="statement not covered" > // Build namespace configuration using signer</span>
2158
+ <span class="cstat-no" title="statement not covered" > const namespaceConfig = signer.buildNamespace(wcConfig.networkId);</span>
2159
+ <span class="cstat-no" title="statement not covered" > const optionalNamespaces = { [wcConfig.ledgerId]: namespaceConfig };</span>
2160
+ <span class="cstat-no" title="statement not covered" > logger.debug('Namespace config', { ledgerId: wcConfig.ledgerId });</span>
2161
+ <span class="cstat-no" title="statement not covered" ></span>
2162
+ <span class="cstat-no" title="statement not covered" > // Build session properties to pass user's preferred network to wallet</span>
2163
+ <span class="cstat-no" title="statement not covered" > // This tells the wallet which network accounts to show in the picker</span>
2164
+ <span class="cstat-no" title="statement not covered" > const sessionProperties = {</span>
2165
+ <span class="cstat-no" title="statement not covered" > preferredNetwork: wcConfig.networkId,</span>
2166
+ <span class="cstat-no" title="statement not covered" > preferredLedger: wcConfig.ledgerId,</span>
2167
+ <span class="cstat-no" title="statement not covered" > };</span>
2168
+ <span class="cstat-no" title="statement not covered" ></span>
2169
+ <span class="cstat-no" title="statement not covered" > logger.info('Connecting with preferred network', {</span>
2170
+ <span class="cstat-no" title="statement not covered" > preferredNetwork: wcConfig.networkId,</span>
2171
+ <span class="cstat-no" title="statement not covered" > preferredLedger: wcConfig.ledgerId,</span>
2172
+ <span class="cstat-no" title="statement not covered" > });</span>
2173
+ <span class="cstat-no" title="statement not covered" ></span>
2174
+ <span class="cstat-no" title="statement not covered" > // Connect and show QR code</span>
2175
+ <span class="cstat-no" title="statement not covered" > const { uri, approval } = await this.clientManager.connect(</span>
2176
+ <span class="cstat-no" title="statement not covered" > optionalNamespaces,</span>
2177
+ <span class="cstat-no" title="statement not covered" > sessionProperties,</span>
2178
+ <span class="cstat-no" title="statement not covered" > );</span>
2179
+ <span class="cstat-no" title="statement not covered" ></span>
2180
+ <span class="cstat-no" title="statement not covered" > if (uri) {</span>
2181
+ <span class="cstat-no" title="statement not covered" > await modal.openModal({ uri });</span>
2182
+ <span class="cstat-no" title="statement not covered" > }</span>
2183
+ <span class="cstat-no" title="statement not covered" ></span>
2184
+ <span class="cstat-no" title="statement not covered" > // Wait for wallet approval</span>
2185
+ <span class="cstat-no" title="statement not covered" > logger.info('Waiting for wallet approval...');</span>
2186
+ <span class="cstat-no" title="statement not covered" > const session = await approval();</span>
2187
+ <span class="cstat-no" title="statement not covered" > this.clientManager.closeModal();</span>
2188
+ <span class="cstat-no" title="statement not covered" ></span>
2189
+ <span class="cstat-no" title="statement not covered" > logger.info('[WC:DAPP:APPROVED] Session approved by wallet', {</span>
2190
+ <span class="cstat-no" title="statement not covered" > topic: session.topic.substring(0, 16) + '...',</span>
2191
+ <span class="cstat-no" title="statement not covered" > fullTopic: session.topic,</span>
2192
+ <span class="cstat-no" title="statement not covered" > namespaces: Object.keys(session.namespaces),</span>
2193
+ <span class="cstat-no" title="statement not covered" > expiry: session.expiry,</span>
2194
+ <span class="cstat-no" title="statement not covered" > });</span>
2195
+ <span class="cstat-no" title="statement not covered" ></span>
2196
+ <span class="cstat-no" title="statement not covered" > // Generate session key</span>
2197
+ <span class="cstat-no" title="statement not covered" > const sessionKey = this.sessionStore.generateSessionKey(</span>
2198
+ <span class="cstat-no" title="statement not covered" > wcConfig.ledgerId,</span>
2199
+ <span class="cstat-no" title="statement not covered" > wcConfig.networkId,</span>
2200
+ <span class="cstat-no" title="statement not covered" > session.topic,</span>
2201
+ <span class="cstat-no" title="statement not covered" > );</span>
2202
+ <span class="cstat-no" title="statement not covered" ></span>
2203
+ <span class="cstat-no" title="statement not covered" > // Parse accounts from session</span>
2204
+ <span class="cstat-no" title="statement not covered" > const sessionNamespace = session.namespaces[wcConfig.ledgerId];</span>
2205
+ <span class="cstat-no" title="statement not covered" > logger.debug('Session namespace for ledger', {</span>
2206
+ <span class="cstat-no" title="statement not covered" > ledgerId: wcConfig.ledgerId,</span>
2207
+ <span class="cstat-no" title="statement not covered" > accountCount: (sessionNamespace as { accounts?: any[] })?.accounts?.length || 0,</span>
2208
+ <span class="cstat-no" title="statement not covered" > });</span>
2209
+ <span class="cstat-no" title="statement not covered" ></span>
2210
+ <span class="cstat-no" title="statement not covered" > if (!sessionNamespace) {</span>
2211
2211
  <span class="cstat-no" title="statement not covered" > logger.error('No namespace found for ledger', {</span>
2212
2212
  <span class="cstat-no" title="statement not covered" > ledgerId: wcConfig.ledgerId,</span>
2213
2213
  <span class="cstat-no" title="statement not covered" > availableNamespaces: Object.keys(session.namespaces),</span>
@@ -2216,16 +2216,16 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
2216
2216
  <span class="cstat-no" title="statement not covered" > `Wallet did not approve ${wcConfig.ledgerId} namespace. Available: ${Object.keys(session.namespaces).join(', ')}`,</span>
2217
2217
  <span class="cstat-no" title="statement not covered" > );</span>
2218
2218
  <span class="cstat-no" title="statement not covered" > }</span>
2219
- &nbsp;
2220
- // Parse accounts from session namespace, filtering by user's selected network
2221
- // This ensures we only show accounts that match the network the user selected
2222
- const parsedAccounts = signer.parseAccounts(sessionNamespace, wcConfig.networkId);
2223
- logger.debug('Parsed accounts', {
2224
- count: parsedAccounts.length,
2225
- userSelectedNetwork: wcConfig.networkId,
2226
- });
2227
- &nbsp;
2228
- if (parsedAccounts.length === 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2219
+ <span class="cstat-no" title="statement not covered" ></span>
2220
+ <span class="cstat-no" title="statement not covered" > // Parse accounts from session namespace, filtering by user's selected network</span>
2221
+ <span class="cstat-no" title="statement not covered" > // This ensures we only show accounts that match the network the user selected</span>
2222
+ <span class="cstat-no" title="statement not covered" > const parsedAccounts = signer.parseAccounts(sessionNamespace, wcConfig.networkId);</span>
2223
+ <span class="cstat-no" title="statement not covered" > logger.debug('Parsed accounts', {</span>
2224
+ <span class="cstat-no" title="statement not covered" > count: parsedAccounts.length,</span>
2225
+ <span class="cstat-no" title="statement not covered" > userSelectedNetwork: wcConfig.networkId,</span>
2226
+ <span class="cstat-no" title="statement not covered" > });</span>
2227
+ <span class="cstat-no" title="statement not covered" ></span>
2228
+ <span class="cstat-no" title="statement not covered" > if (parsedAccounts.length === 0) {</span>
2229
2229
  <span class="cstat-no" title="statement not covered" > logger.warn('No accounts returned from wallet - possible causes:', {</span>
2230
2230
  <span class="cstat-no" title="statement not covered" > reason1: 'Wallet has no accounts for the requested network',</span>
2231
2231
  <span class="cstat-no" title="statement not covered" > reason2: 'Wallet denied account sharing',</span>
@@ -2233,98 +2233,98 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
2233
2233
  <span class="cstat-no" title="statement not covered" > userSelectedNetwork: wcConfig.networkId,</span>
2234
2234
  <span class="cstat-no" title="statement not covered" > });</span>
2235
2235
  <span class="cstat-no" title="statement not covered" > }</span>
2236
- &nbsp;
2237
- // Create UnifiedAccount objects
2238
- // IMPORTANT: Use wcConfig.networkId (user's selection) for account networkId
2239
- // This respects user intent rather than relying on wallet-reported chain
2240
- const accounts: UnifiedAccount[] = parsedAccounts.map((acc, index) =&gt; ({
2241
- id: `${this.id}-${wcConfig.ledgerId}-${acc.address}`,
2242
- address: acc.address,
2243
- label: `Account ${index + 1}`,
2244
- ledgerId: wcConfig.ledgerId,
2245
- networkId: wcConfig.networkId, // Use user's selected network, not wallet-reported
2246
- providerId: this.id,
2247
- providerType: 'walletconnect-v2',
2248
- metadata: {
2249
- topic: session.topic,
2250
- ledger: wcConfig.ledgerId,
2251
- sessionKey,
2252
- walletReportedChainId: acc.chainId, // Keep original for debugging
2253
- userSelectedNetwork: wcConfig.networkId, // Store for session restoration
2254
- },
2255
- }));
2256
- &nbsp;
2257
- // Store session data with user's selected network
2258
- this.sessionStore.setSession(sessionKey, {
2259
- session,
2260
- ledgerId: wcConfig.ledgerId,
2261
- networkId: wcConfig.networkId,
2262
- userSelectedNetwork: wcConfig.networkId, // Store user's selection for restoration
2263
- signer,
2264
- accounts,
2265
- });
2266
- &nbsp;
2267
- // Persist user's network selection for session restoration after page reload
2268
- this.storeUserNetworkSelection(session.topic, wcConfig.networkId);
2269
- &nbsp;
2270
- // Verify session exists in WC SDK after storing
2271
- const sdkSession = this.clientManager.getSession(session.topic);
2272
- &nbsp;
2273
- logger.info('[WC:DAPP:STORED] Session stored locally', {
2274
- sessionKey,
2275
- topic: session.topic.substring(0, 16) + '...',
2276
- fullTopic: session.topic,
2277
- accountCount: accounts.length,
2278
- totalSessions: this.sessionStore.size,
2279
- existsInSdkSession: !!sdkSession,
2280
- });
2281
- &nbsp;
2282
- // Update aggregated accounts
2283
- this.sessionStore.updateAggregatedAccounts();
2284
- this._status.set('connected');
2285
- &nbsp;
2286
- // Emit session created event
2287
- this.eventBus.sessionCreated.emit({
2288
- providerId: this.id,
2289
- sessionKey,
2290
- accounts,
2291
- metadata: {
2292
- topic: session.topic,
2293
- ledgerId: wcConfig.ledgerId,
2294
- networkId: wcConfig.networkId,
2295
- },
2296
- timestamp: Date.now(),
2297
- });
2298
- &nbsp;
2299
- // Register session_delete listener (idempotent)
2300
- this.registerSessionDeleteListener();
2301
- } catch (error) {
2302
- this._status.set('error');
2303
- this._error.set(error instanceof Error ? error.<span class="branch-0 cbranch-no" title="branch not covered" >message : 'Connection failed')</span>;
2304
- logger.error('Connection failed', {
2305
- error: error instanceof Error ? error.<span class="branch-0 cbranch-no" title="branch not covered" >message : String(error),</span>
2306
- });
2307
- &nbsp;
2308
- // Emit provider error event
2309
- this.eventBus.providerError.emit({
2310
- providerId: this.id,
2311
- error: error instanceof Error ? <span class="branch-0 cbranch-no" title="branch not covered" >error : String(error),</span>
2312
- context: 'connection',
2313
- timestamp: Date.now(),
2314
- });
2315
- &nbsp;
2316
- this.clientManager.closeModal();
2317
- throw error;
2318
- }
2319
- }
2320
- &nbsp;
2321
- /**
2322
- * Remove a session by its WalletConnect topic.
2323
- * Internal helper for session_delete event handling.
2324
- *
2325
- * @param topic - WalletConnect session topic
2326
- */
2327
- private <span class="fstat-no" title="function not covered" >removeSessionByTopic(topic: string): void {</span>
2236
+ <span class="cstat-no" title="statement not covered" ></span>
2237
+ <span class="cstat-no" title="statement not covered" > // Create UnifiedAccount objects</span>
2238
+ <span class="cstat-no" title="statement not covered" > // IMPORTANT: Use wcConfig.networkId (user's selection) for account networkId</span>
2239
+ <span class="cstat-no" title="statement not covered" > // This respects user intent rather than relying on wallet-reported chain</span>
2240
+ <span class="cstat-no" title="statement not covered" > const accounts: UnifiedAccount[] = parsedAccounts.map((acc, index) =&gt; ({</span>
2241
+ <span class="cstat-no" title="statement not covered" > id: `${this.id}-${wcConfig.ledgerId}-${acc.address}`,</span>
2242
+ <span class="cstat-no" title="statement not covered" > address: acc.address,</span>
2243
+ <span class="cstat-no" title="statement not covered" > label: `Account ${index + 1}`,</span>
2244
+ <span class="cstat-no" title="statement not covered" > ledgerId: wcConfig.ledgerId,</span>
2245
+ <span class="cstat-no" title="statement not covered" > networkId: wcConfig.networkId, // Use user's selected network, not wallet-reported</span>
2246
+ <span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
2247
+ <span class="cstat-no" title="statement not covered" > providerType: 'walletconnect-v2',</span>
2248
+ <span class="cstat-no" title="statement not covered" > metadata: {</span>
2249
+ <span class="cstat-no" title="statement not covered" > topic: session.topic,</span>
2250
+ <span class="cstat-no" title="statement not covered" > ledger: wcConfig.ledgerId,</span>
2251
+ <span class="cstat-no" title="statement not covered" > sessionKey,</span>
2252
+ <span class="cstat-no" title="statement not covered" > walletReportedChainId: acc.chainId, // Keep original for debugging</span>
2253
+ <span class="cstat-no" title="statement not covered" > userSelectedNetwork: wcConfig.networkId, // Store for session restoration</span>
2254
+ <span class="cstat-no" title="statement not covered" > },</span>
2255
+ <span class="cstat-no" title="statement not covered" > }));</span>
2256
+ <span class="cstat-no" title="statement not covered" ></span>
2257
+ <span class="cstat-no" title="statement not covered" > // Store session data with user's selected network</span>
2258
+ <span class="cstat-no" title="statement not covered" > this.sessionStore.setSession(sessionKey, {</span>
2259
+ <span class="cstat-no" title="statement not covered" > session,</span>
2260
+ <span class="cstat-no" title="statement not covered" > ledgerId: wcConfig.ledgerId,</span>
2261
+ <span class="cstat-no" title="statement not covered" > networkId: wcConfig.networkId,</span>
2262
+ <span class="cstat-no" title="statement not covered" > userSelectedNetwork: wcConfig.networkId, // Store user's selection for restoration</span>
2263
+ <span class="cstat-no" title="statement not covered" > signer,</span>
2264
+ <span class="cstat-no" title="statement not covered" > accounts,</span>
2265
+ <span class="cstat-no" title="statement not covered" > });</span>
2266
+ <span class="cstat-no" title="statement not covered" ></span>
2267
+ <span class="cstat-no" title="statement not covered" > // Persist user's network selection for session restoration after page reload</span>
2268
+ <span class="cstat-no" title="statement not covered" > this.storeUserNetworkSelection(session.topic, wcConfig.networkId);</span>
2269
+ <span class="cstat-no" title="statement not covered" ></span>
2270
+ <span class="cstat-no" title="statement not covered" > // Verify session exists in WC SDK after storing</span>
2271
+ <span class="cstat-no" title="statement not covered" > const sdkSession = this.clientManager.getSession(session.topic);</span>
2272
+ <span class="cstat-no" title="statement not covered" ></span>
2273
+ <span class="cstat-no" title="statement not covered" > logger.info('[WC:DAPP:STORED] Session stored locally', {</span>
2274
+ <span class="cstat-no" title="statement not covered" > sessionKey,</span>
2275
+ <span class="cstat-no" title="statement not covered" > topic: session.topic.substring(0, 16) + '...',</span>
2276
+ <span class="cstat-no" title="statement not covered" > fullTopic: session.topic,</span>
2277
+ <span class="cstat-no" title="statement not covered" > accountCount: accounts.length,</span>
2278
+ <span class="cstat-no" title="statement not covered" > totalSessions: this.sessionStore.size,</span>
2279
+ <span class="cstat-no" title="statement not covered" > existsInSdkSession: !!sdkSession,</span>
2280
+ <span class="cstat-no" title="statement not covered" > });</span>
2281
+ <span class="cstat-no" title="statement not covered" ></span>
2282
+ <span class="cstat-no" title="statement not covered" > // Update aggregated accounts</span>
2283
+ <span class="cstat-no" title="statement not covered" > this.sessionStore.updateAggregatedAccounts();</span>
2284
+ <span class="cstat-no" title="statement not covered" > this._status.set('connected');</span>
2285
+ <span class="cstat-no" title="statement not covered" ></span>
2286
+ <span class="cstat-no" title="statement not covered" > // Emit session created event</span>
2287
+ <span class="cstat-no" title="statement not covered" > this.eventBus.sessionCreated.emit({</span>
2288
+ <span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
2289
+ <span class="cstat-no" title="statement not covered" > sessionKey,</span>
2290
+ <span class="cstat-no" title="statement not covered" > accounts,</span>
2291
+ <span class="cstat-no" title="statement not covered" > metadata: {</span>
2292
+ <span class="cstat-no" title="statement not covered" > topic: session.topic,</span>
2293
+ <span class="cstat-no" title="statement not covered" > ledgerId: wcConfig.ledgerId,</span>
2294
+ <span class="cstat-no" title="statement not covered" > networkId: wcConfig.networkId,</span>
2295
+ <span class="cstat-no" title="statement not covered" > },</span>
2296
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
2297
+ <span class="cstat-no" title="statement not covered" > });</span>
2298
+ <span class="cstat-no" title="statement not covered" ></span>
2299
+ <span class="cstat-no" title="statement not covered" > // Register session_delete listener (idempotent)</span>
2300
+ <span class="cstat-no" title="statement not covered" > this.registerSessionDeleteListener();</span>
2301
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
2302
+ <span class="cstat-no" title="statement not covered" > this._status.set('error');</span>
2303
+ <span class="cstat-no" title="statement not covered" > this._error.set(error instanceof Error ? error.message : 'Connection failed');</span>
2304
+ <span class="cstat-no" title="statement not covered" > logger.error('Connection failed', {</span>
2305
+ <span class="cstat-no" title="statement not covered" > error: error instanceof Error ? error.message : String(error),</span>
2306
+ <span class="cstat-no" title="statement not covered" > });</span>
2307
+ <span class="cstat-no" title="statement not covered" ></span>
2308
+ <span class="cstat-no" title="statement not covered" > // Emit provider error event</span>
2309
+ <span class="cstat-no" title="statement not covered" > this.eventBus.providerError.emit({</span>
2310
+ <span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
2311
+ <span class="cstat-no" title="statement not covered" > error: error instanceof Error ? error : String(error),</span>
2312
+ <span class="cstat-no" title="statement not covered" > context: 'connection',</span>
2313
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
2314
+ <span class="cstat-no" title="statement not covered" > });</span>
2315
+ <span class="cstat-no" title="statement not covered" ></span>
2316
+ <span class="cstat-no" title="statement not covered" > this.clientManager.closeModal();</span>
2317
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
2318
+ <span class="cstat-no" title="statement not covered" > }</span>
2319
+ <span class="cstat-no" title="statement not covered" > }</span>
2320
+ <span class="cstat-no" title="statement not covered" ></span>
2321
+ <span class="cstat-no" title="statement not covered" > /**</span>
2322
+ <span class="cstat-no" title="statement not covered" > * Remove a session by its WalletConnect topic.</span>
2323
+ <span class="cstat-no" title="statement not covered" > * Internal helper for session_delete event handling.</span>
2324
+ <span class="cstat-no" title="statement not covered" > *</span>
2325
+ <span class="cstat-no" title="statement not covered" > * @param topic - WalletConnect session topic</span>
2326
+ <span class="cstat-no" title="statement not covered" > */</span>
2327
+ <span class="cstat-no" title="statement not covered" > private removeSessionByTopic(topic: string): void {</span>
2328
2328
  <span class="cstat-no" title="statement not covered" > // Find and remove the session using session store</span>
2329
2329
  <span class="cstat-no" title="statement not covered" > const removed = this.sessionStore.removeSessionByTopic(topic);</span>
2330
2330
  <span class="cstat-no" title="statement not covered" ></span>
@@ -2360,46 +2360,46 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
2360
2360
  <span class="cstat-no" title="statement not covered" > });</span>
2361
2361
  <span class="cstat-no" title="statement not covered" > }</span>
2362
2362
  <span class="cstat-no" title="statement not covered" > }</span>
2363
- &nbsp;
2364
- /**
2365
- * Register session_delete event listener to handle wallet-initiated disconnects.
2366
- * Idempotent - only registers once even if called multiple times.
2367
- *
2368
- * @private
2369
- */
2370
- private registerSessionDeleteListener(): void {
2371
- if (!this.clientManager.isInitialized() || this.sessionDeleteListenerRegistered) {
2372
- return;
2373
- }
2374
- &nbsp;
2375
- // ✅ CRITICAL: Run inside NgZone to trigger Angular's change detection
2376
- // WalletConnect events arrive outside Angular's zone
2377
- this.clientManager.on('session_delete', (event: any) =&gt; {
2363
+ <span class="cstat-no" title="statement not covered" ></span>
2364
+ <span class="cstat-no" title="statement not covered" > /**</span>
2365
+ <span class="cstat-no" title="statement not covered" > * Register session_delete event listener to handle wallet-initiated disconnects.</span>
2366
+ <span class="cstat-no" title="statement not covered" > * Idempotent - only registers once even if called multiple times.</span>
2367
+ <span class="cstat-no" title="statement not covered" > *</span>
2368
+ <span class="cstat-no" title="statement not covered" > * @private</span>
2369
+ <span class="cstat-no" title="statement not covered" > */</span>
2370
+ <span class="cstat-no" title="statement not covered" > private registerSessionDeleteListener(): void {</span>
2371
+ <span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized() || this.sessionDeleteListenerRegistered) {</span>
2372
+ <span class="cstat-no" title="statement not covered" > return;</span>
2373
+ <span class="cstat-no" title="statement not covered" > }</span>
2374
+ <span class="cstat-no" title="statement not covered" ></span>
2375
+ <span class="cstat-no" title="statement not covered" > // ✅ CRITICAL: Run inside NgZone to trigger Angular's change detection</span>
2376
+ <span class="cstat-no" title="statement not covered" > // WalletConnect events arrive outside Angular's zone</span>
2377
+ <span class="cstat-no" title="statement not covered" > this.clientManager.on('session_delete', (event: any) =&gt; {</span>
2378
2378
  <span class="cstat-no" title="statement not covered" > this.zone.run(() =&gt; {</span>
2379
2379
  <span class="cstat-no" title="statement not covered" > logger.info('� Session deleted by wallet (session_delete event)', {</span>
2380
2380
  <span class="cstat-no" title="statement not covered" > topic: (event as { topic: string }).topic,</span>
2381
2381
  <span class="cstat-no" title="statement not covered" > });</span>
2382
2382
  <span class="cstat-no" title="statement not covered" > this.removeSessionByTopic((event as { topic: string }).topic);</span>
2383
2383
  <span class="cstat-no" title="statement not covered" > });</span>
2384
- });
2385
- &nbsp;
2386
- this.sessionDeleteListenerRegistered = true;
2387
- logger.debug('session_delete listener registered');
2388
- }
2389
- &nbsp;
2390
- /**
2391
- * Disconnect from WalletConnect sessions.
2392
- * Supports disconnecting all sessions or a specific session.
2393
- *
2394
- * @param sessionKey - Optional session key to disconnect specific session
2395
- */
2396
- async disconnect(sessionKey?: string): Promise&lt;void&gt; {
2397
- if (!this.clientManager.isInitialized()) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2384
+ <span class="cstat-no" title="statement not covered" > });</span>
2385
+ <span class="cstat-no" title="statement not covered" ></span>
2386
+ <span class="cstat-no" title="statement not covered" > this.sessionDeleteListenerRegistered = true;</span>
2387
+ <span class="cstat-no" title="statement not covered" > logger.debug('session_delete listener registered');</span>
2388
+ <span class="cstat-no" title="statement not covered" > }</span>
2389
+ <span class="cstat-no" title="statement not covered" ></span>
2390
+ <span class="cstat-no" title="statement not covered" > /**</span>
2391
+ <span class="cstat-no" title="statement not covered" > * Disconnect from WalletConnect sessions.</span>
2392
+ <span class="cstat-no" title="statement not covered" > * Supports disconnecting all sessions or a specific session.</span>
2393
+ <span class="cstat-no" title="statement not covered" > *</span>
2394
+ <span class="cstat-no" title="statement not covered" > * @param sessionKey - Optional session key to disconnect specific session</span>
2395
+ <span class="cstat-no" title="statement not covered" > */</span>
2396
+ <span class="cstat-no" title="statement not covered" > async disconnect(sessionKey?: string): Promise&lt;void&gt; {</span>
2397
+ <span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
2398
2398
  <span class="cstat-no" title="statement not covered" > logger.warn('No client to disconnect');</span>
2399
2399
  <span class="cstat-no" title="statement not covered" > return;</span>
2400
2400
  <span class="cstat-no" title="statement not covered" > }</span>
2401
- &nbsp;
2402
- if (sessionKey) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2401
+ <span class="cstat-no" title="statement not covered" ></span>
2402
+ <span class="cstat-no" title="statement not covered" > if (sessionKey) {</span>
2403
2403
  <span class="cstat-no" title="statement not covered" > // Disconnect specific session</span>
2404
2404
  <span class="cstat-no" title="statement not covered" > const sessionData = this.sessionStore.getSession(sessionKey);</span>
2405
2405
  <span class="cstat-no" title="statement not covered" > if (sessionData) {</span>
@@ -2426,101 +2426,101 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
2426
2426
  <span class="cstat-no" title="statement not covered" > this._status.set('disconnected');</span>
2427
2427
  <span class="cstat-no" title="statement not covered" > }</span>
2428
2428
  <span class="cstat-no" title="statement not covered" > }</span>
2429
- } else {
2430
- // Disconnect all sessions
2431
- const disconnectPromises: Promise&lt;void&gt;[] = [];
2432
- &nbsp;
2433
- for (const [_key, sessionData] of this.sessionStore.entries()) {
2434
- // Clean up stored network selection for each session
2435
- this.clearUserNetworkSelection(sessionData.session.topic);
2436
- &nbsp;
2437
- disconnectPromises.push(
2438
- this.clientManager
2439
- .disconnect(sessionData.session.topic, {
2440
- code: 6000,
2441
- message: 'User disconnected all sessions',
2442
- })
2443
- .catch((err: Error) =&gt;
2429
+ <span class="cstat-no" title="statement not covered" > } else {</span>
2430
+ <span class="cstat-no" title="statement not covered" > // Disconnect all sessions</span>
2431
+ <span class="cstat-no" title="statement not covered" > const disconnectPromises: Promise&lt;void&gt;[] = [];</span>
2432
+ <span class="cstat-no" title="statement not covered" ></span>
2433
+ <span class="cstat-no" title="statement not covered" > for (const [_key, sessionData] of this.sessionStore.entries()) {</span>
2434
+ <span class="cstat-no" title="statement not covered" > // Clean up stored network selection for each session</span>
2435
+ <span class="cstat-no" title="statement not covered" > this.clearUserNetworkSelection(sessionData.session.topic);</span>
2436
+ <span class="cstat-no" title="statement not covered" ></span>
2437
+ <span class="cstat-no" title="statement not covered" > disconnectPromises.push(</span>
2438
+ <span class="cstat-no" title="statement not covered" > this.clientManager</span>
2439
+ <span class="cstat-no" title="statement not covered" > .disconnect(sessionData.session.topic, {</span>
2440
+ <span class="cstat-no" title="statement not covered" > code: 6000,</span>
2441
+ <span class="cstat-no" title="statement not covered" > message: 'User disconnected all sessions',</span>
2442
+ <span class="cstat-no" title="statement not covered" > })</span>
2443
+ <span class="cstat-no" title="statement not covered" > .catch((err: Error) =&gt;</span>
2444
2444
  <span class="cstat-no" title="statement not covered" > logger.error('Disconnect error', {</span>
2445
2445
  <span class="cstat-no" title="statement not covered" > error: err.message,</span>
2446
2446
  <span class="cstat-no" title="statement not covered" > }),</span>
2447
- ),
2448
- );
2449
- }
2450
- &nbsp;
2451
- await Promise.all(disconnectPromises);
2452
- &nbsp;
2453
- this.sessionStore.clear();
2454
- this._status.set('disconnected');
2455
- &nbsp;
2456
- logger.info('Disconnected all sessions');
2457
- }
2458
- &nbsp;
2459
- this.clientManager.closeModal();
2460
- }
2461
- &nbsp;
2462
- // NOTE: findSessionForAccount and validateSessionInSdk moved to WalletConnectSigningOrchestrator
2463
- &nbsp;
2464
- /**
2465
- * Sign a transaction without submitting (delegates to SigningOrchestrator).
2466
- * @param options
2467
- */
2468
- async signTransaction(options: SignTransactionOptions): Promise&lt;SignResult&gt; {
2469
- if (!this.clientManager.isInitialized()) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2447
+ <span class="cstat-no" title="statement not covered" > ),</span>
2448
+ <span class="cstat-no" title="statement not covered" > );</span>
2449
+ <span class="cstat-no" title="statement not covered" > }</span>
2450
+ <span class="cstat-no" title="statement not covered" ></span>
2451
+ <span class="cstat-no" title="statement not covered" > await Promise.all(disconnectPromises);</span>
2452
+ <span class="cstat-no" title="statement not covered" ></span>
2453
+ <span class="cstat-no" title="statement not covered" > this.sessionStore.clear();</span>
2454
+ <span class="cstat-no" title="statement not covered" > this._status.set('disconnected');</span>
2455
+ <span class="cstat-no" title="statement not covered" ></span>
2456
+ <span class="cstat-no" title="statement not covered" > logger.info('Disconnected all sessions');</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" > this.clientManager.closeModal();</span>
2460
+ <span class="cstat-no" title="statement not covered" > }</span>
2461
+ <span class="cstat-no" title="statement not covered" ></span>
2462
+ <span class="cstat-no" title="statement not covered" > // NOTE: findSessionForAccount and validateSessionInSdk moved to WalletConnectSigningOrchestrator</span>
2463
+ <span class="cstat-no" title="statement not covered" ></span>
2464
+ <span class="cstat-no" title="statement not covered" > /**</span>
2465
+ <span class="cstat-no" title="statement not covered" > * Sign a transaction without submitting (delegates to SigningOrchestrator).</span>
2466
+ <span class="cstat-no" title="statement not covered" > * @param options</span>
2467
+ <span class="cstat-no" title="statement not covered" > */</span>
2468
+ <span class="cstat-no" title="statement not covered" > async signTransaction(options: SignTransactionOptions): Promise&lt;SignResult&gt; {</span>
2469
+ <span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
2470
2470
  <span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
2471
2471
  <span class="cstat-no" title="statement not covered" > }</span>
2472
- return this.signingOrchestrator.signTransaction(options);
2473
- }
2474
- &nbsp;
2475
- /**
2476
- * Sign and submit a transaction (delegates to SigningOrchestrator).
2477
- * @param options
2478
- */
2479
- async submitTransaction(options: SubmitTransactionOptions): Promise&lt;SubmitResult&gt; {
2480
- if (!this.clientManager.isInitialized()) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2472
+ <span class="cstat-no" title="statement not covered" > return this.signingOrchestrator.signTransaction(options);</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" > /**</span>
2476
+ <span class="cstat-no" title="statement not covered" > * Sign and submit a transaction (delegates to SigningOrchestrator).</span>
2477
+ <span class="cstat-no" title="statement not covered" > * @param options</span>
2478
+ <span class="cstat-no" title="statement not covered" > */</span>
2479
+ <span class="cstat-no" title="statement not covered" > async submitTransaction(options: SubmitTransactionOptions): Promise&lt;SubmitResult&gt; {</span>
2480
+ <span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
2481
2481
  <span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
2482
2482
  <span class="cstat-no" title="statement not covered" > }</span>
2483
- return this.signingOrchestrator.submitTransaction(options);
2484
- }
2485
- &nbsp;
2486
- /**
2487
- * Sign and execute transaction in one call (delegates to SigningOrchestrator).
2488
- * @param options
2489
- */
2490
- <span class="fstat-no" title="function not covered" > async signAndExecuteTransaction(options: SubmitTransactionOptions): Promise&lt;SubmitResult&gt; {</span>
2483
+ <span class="cstat-no" title="statement not covered" > return this.signingOrchestrator.submitTransaction(options);</span>
2484
+ <span class="cstat-no" title="statement not covered" > }</span>
2485
+ <span class="cstat-no" title="statement not covered" ></span>
2486
+ <span class="cstat-no" title="statement not covered" > /**</span>
2487
+ <span class="cstat-no" title="statement not covered" > * Sign and execute transaction in one call (delegates to SigningOrchestrator).</span>
2488
+ <span class="cstat-no" title="statement not covered" > * @param options</span>
2489
+ <span class="cstat-no" title="statement not covered" > */</span>
2490
+ <span class="cstat-no" title="statement not covered" > async signAndExecuteTransaction(options: SubmitTransactionOptions): Promise&lt;SubmitResult&gt; {</span>
2491
2491
  <span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
2492
2492
  <span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
2493
2493
  <span class="cstat-no" title="statement not covered" > }</span>
2494
2494
  <span class="cstat-no" title="statement not covered" > return this.signingOrchestrator.signAndExecuteTransaction(options);</span>
2495
2495
  <span class="cstat-no" title="statement not covered" > }</span>
2496
- &nbsp;
2497
- /**
2498
- * Sign an arbitrary message (delegates to SigningOrchestrator).
2499
- * @param options
2500
- */
2501
- <span class="fstat-no" title="function not covered" > async signMessage(options: SignMessageOptions): Promise&lt;SignMessageResult&gt; {</span>
2496
+ <span class="cstat-no" title="statement not covered" ></span>
2497
+ <span class="cstat-no" title="statement not covered" > /**</span>
2498
+ <span class="cstat-no" title="statement not covered" > * Sign an arbitrary message (delegates to SigningOrchestrator).</span>
2499
+ <span class="cstat-no" title="statement not covered" > * @param options</span>
2500
+ <span class="cstat-no" title="statement not covered" > */</span>
2501
+ <span class="cstat-no" title="statement not covered" > async signMessage(options: SignMessageOptions): Promise&lt;SignMessageResult&gt; {</span>
2502
2502
  <span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
2503
2503
  <span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
2504
2504
  <span class="cstat-no" title="statement not covered" > }</span>
2505
2505
  <span class="cstat-no" title="statement not covered" > return this.signingOrchestrator.signMessage(options);</span>
2506
2506
  <span class="cstat-no" title="statement not covered" > }</span>
2507
- &nbsp;
2508
- /**
2509
- * Check if WalletConnect is available.
2510
- * Always returns true as WalletConnect is browser-based.
2511
- */
2512
- <span class="fstat-no" title="function not covered" > async isAvailable(): Promise&lt;boolean&gt; {</span>
2507
+ <span class="cstat-no" title="statement not covered" ></span>
2508
+ <span class="cstat-no" title="statement not covered" > /**</span>
2509
+ <span class="cstat-no" title="statement not covered" > * Check if WalletConnect is available.</span>
2510
+ <span class="cstat-no" title="statement not covered" > * Always returns true as WalletConnect is browser-based.</span>
2511
+ <span class="cstat-no" title="statement not covered" > */</span>
2512
+ <span class="cstat-no" title="statement not covered" > async isAvailable(): Promise&lt;boolean&gt; {</span>
2513
2513
  <span class="cstat-no" title="statement not covered" > return true;</span>
2514
2514
  <span class="cstat-no" title="statement not covered" > }</span>
2515
- &nbsp;
2516
- /**
2517
- * Get all active WalletConnect sessions.
2518
- * Useful for displaying session information in UI and managing multiple connections.
2519
- * Delegates to session store.
2520
- *
2521
- * @returns Array of session information objects
2522
- */
2523
- <span class="fstat-no" title="function not covered" > getActiveSessions(): Array&lt;{</span>
2515
+ <span class="cstat-no" title="statement not covered" ></span>
2516
+ <span class="cstat-no" title="statement not covered" > /**</span>
2517
+ <span class="cstat-no" title="statement not covered" > * Get all active WalletConnect sessions.</span>
2518
+ <span class="cstat-no" title="statement not covered" > * Useful for displaying session information in UI and managing multiple connections.</span>
2519
+ <span class="cstat-no" title="statement not covered" > * Delegates to session store.</span>
2520
+ <span class="cstat-no" title="statement not covered" > *</span>
2521
+ <span class="cstat-no" title="statement not covered" > * @returns Array of session information objects</span>
2522
+ <span class="cstat-no" title="statement not covered" > */</span>
2523
+ <span class="cstat-no" title="statement not covered" > getActiveSessions(): Array&lt;{</span>
2524
2524
  <span class="cstat-no" title="statement not covered" > sessionKey: string;</span>
2525
2525
  <span class="cstat-no" title="statement not covered" > ledgerId: string;</span>
2526
2526
  <span class="cstat-no" title="statement not covered" > networkId: string;</span>
@@ -2530,17 +2530,17 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
2530
2530
  <span class="cstat-no" title="statement not covered" > }&gt; {</span>
2531
2531
  <span class="cstat-no" title="statement not covered" > return this.sessionStore.getActiveSessions();</span>
2532
2532
  <span class="cstat-no" title="statement not covered" > }</span>
2533
- &nbsp;
2534
- /**
2535
- * Disconnect a specific session by session key.
2536
- * Public wrapper for the private disconnect method.
2537
- *
2538
- * @param sessionKey - The session key to disconnect
2539
- */
2540
- <span class="fstat-no" title="function not covered" > async disconnectSession(sessionKey: string): Promise&lt;void&gt; {</span>
2533
+ <span class="cstat-no" title="statement not covered" ></span>
2534
+ <span class="cstat-no" title="statement not covered" > /**</span>
2535
+ <span class="cstat-no" title="statement not covered" > * Disconnect a specific session by session key.</span>
2536
+ <span class="cstat-no" title="statement not covered" > * Public wrapper for the private disconnect method.</span>
2537
+ <span class="cstat-no" title="statement not covered" > *</span>
2538
+ <span class="cstat-no" title="statement not covered" > * @param sessionKey - The session key to disconnect</span>
2539
+ <span class="cstat-no" title="statement not covered" > */</span>
2540
+ <span class="cstat-no" title="statement not covered" > async disconnectSession(sessionKey: string): Promise&lt;void&gt; {</span>
2541
2541
  <span class="cstat-no" title="statement not covered" > await this.disconnect(sessionKey);</span>
2542
2542
  <span class="cstat-no" title="statement not covered" > }</span>
2543
- }
2543
+ <span class="cstat-no" title="statement not covered" >}</span>
2544
2544
  &nbsp;</pre></td></tr></table></pre>
2545
2545
 
2546
2546
  <div class='push'></div><!-- for sticky footer -->
@@ -2548,7 +2548,7 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
2548
2548
  <div class='footer quiet pad2 space-top1 center small'>
2549
2549
  Code coverage generated by
2550
2550
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2551
- at 2026-06-02T14:30:38.372Z
2551
+ at 2026-06-10T09:00:36.812Z
2552
2552
  </div>
2553
2553
  <script src="../../../../prettify.js"></script>
2554
2554
  <script>