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