@hsuite/native-connect-angular 1.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/coverage/coverage-summary.json +49 -49
  2. package/coverage/index.html +122 -122
  3. package/coverage/lcov-report/index.html +122 -122
  4. package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
  5. package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +1 -1
  6. package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
  7. package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +1 -1
  8. package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +1 -1
  9. package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +1 -1
  10. package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
  11. package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +1 -1
  12. package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1 -1
  13. package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1 -1
  14. package/coverage/lcov-report/lib/components/account-selector/index.html +1 -1
  15. package/coverage/lcov-report/lib/components/wallet-account-display/index.html +1 -1
  16. package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +1 -1
  17. package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +21 -21
  18. package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
  19. package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +1 -1
  20. package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
  21. package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +1 -1
  22. package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
  23. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
  24. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
  25. package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +21 -21
  26. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
  27. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
  28. package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
  29. package/coverage/lcov-report/lib/components/wallet-session-display/index.html +1 -1
  30. package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
  31. package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +1 -1
  32. package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
  33. package/coverage/lcov-report/lib/directives/index.html +1 -1
  34. package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +1 -1
  35. package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +1 -1
  36. package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +1 -1
  37. package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +1 -1
  38. package/coverage/lcov-report/lib/index.html +1 -1
  39. package/coverage/lcov-report/lib/models/connection-config.model.ts.html +1 -1
  40. package/coverage/lcov-report/lib/models/index.html +1 -1
  41. package/coverage/lcov-report/lib/models/provider-types.ts.html +1 -1
  42. package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +20 -20
  43. package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +637 -637
  44. package/coverage/lcov-report/lib/providers/hsuite-native/index.html +19 -19
  45. package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +1 -1
  46. package/coverage/lcov-report/lib/providers/index.html +18 -18
  47. package/coverage/lcov-report/lib/providers/p2p-native/index.html +20 -20
  48. package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
  49. package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +1 -1
  50. package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1 -1
  51. package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +65 -65
  52. package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +240 -240
  53. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
  54. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1104 -1104
  55. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
  56. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
  57. package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
  58. package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +43 -43
  59. package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
  60. package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
  61. package/coverage/lcov-report/lib/services/index.html +31 -31
  62. package/coverage/lcov-report/lib/services/logger.service.ts.html +4 -4
  63. package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  64. package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
  65. package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
  66. package/coverage/lcov-report/lib/services/transaction-builders/index.html +43 -43
  67. package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
  68. package/coverage/lcov-report/lib/services/transaction.service.ts.html +4 -7
  69. package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +7 -10
  70. package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +1 -1
  71. package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +249 -249
  72. package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +4 -7
  73. package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +1 -1
  74. package/coverage/lcov-report/lib/transports/index.html +1 -1
  75. package/coverage/lcov-report/lib/utils/index.html +1 -1
  76. package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +1 -1
  77. package/coverage/lcov.info +14420 -14977
  78. package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
  79. package/coverage/lib/components/account-selector/account-actions/index.html +1 -1
  80. package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
  81. package/coverage/lib/components/account-selector/account-filter/index.html +1 -1
  82. package/coverage/lib/components/account-selector/account-formatting.service.ts.html +1 -1
  83. package/coverage/lib/components/account-selector/account-grouping.service.ts.html +1 -1
  84. package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
  85. package/coverage/lib/components/account-selector/account-list/index.html +1 -1
  86. package/coverage/lib/components/account-selector/account-selector.component.ts.html +1 -1
  87. package/coverage/lib/components/account-selector/account-selector.service.ts.html +1 -1
  88. package/coverage/lib/components/account-selector/index.html +1 -1
  89. package/coverage/lib/components/wallet-account-display/index.html +1 -1
  90. package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +1 -1
  91. package/coverage/lib/components/wallet-connect-button/index.html +21 -21
  92. package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
  93. package/coverage/lib/components/wallet-connect-prompt/index.html +1 -1
  94. package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
  95. package/coverage/lib/components/wallet-connected-guard/index.html +1 -1
  96. package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
  97. package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
  98. package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
  99. package/coverage/lib/components/wallet-connection-modal/index.html +21 -21
  100. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
  101. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
  102. package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
  103. package/coverage/lib/components/wallet-session-display/index.html +1 -1
  104. package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
  105. package/coverage/lib/components/wallet-transaction-status/index.html +1 -1
  106. package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
  107. package/coverage/lib/directives/index.html +1 -1
  108. package/coverage/lib/directives/wallet-connected.directive.ts.html +1 -1
  109. package/coverage/lib/directives/wallet-context.directive.ts.html +1 -1
  110. package/coverage/lib/directives/wallet-events.directive.ts.html +1 -1
  111. package/coverage/lib/hsuite-wallet.module.ts.html +1 -1
  112. package/coverage/lib/index.html +1 -1
  113. package/coverage/lib/models/connection-config.model.ts.html +1 -1
  114. package/coverage/lib/models/index.html +1 -1
  115. package/coverage/lib/models/provider-types.ts.html +1 -1
  116. package/coverage/lib/providers/base-wallet-provider.ts.html +20 -20
  117. package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +637 -637
  118. package/coverage/lib/providers/hsuite-native/index.html +19 -19
  119. package/coverage/lib/providers/hsuite-native-provider.ts.html +1 -1
  120. package/coverage/lib/providers/index.html +18 -18
  121. package/coverage/lib/providers/p2p-native/index.html +20 -20
  122. package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
  123. package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +1 -1
  124. package/coverage/lib/providers/wallet-error-handler.ts.html +1 -1
  125. package/coverage/lib/providers/walletconnect/core/index.html +65 -65
  126. package/coverage/lib/providers/walletconnect/core/session-health.ts.html +240 -240
  127. package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
  128. package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1104 -1104
  129. package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
  130. package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
  131. package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
  132. package/coverage/lib/providers/walletconnect/signers/index.html +43 -43
  133. package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
  134. package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
  135. package/coverage/lib/services/index.html +31 -31
  136. package/coverage/lib/services/logger.service.ts.html +4 -4
  137. package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  138. package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
  139. package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
  140. package/coverage/lib/services/transaction-builders/index.html +43 -43
  141. package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
  142. package/coverage/lib/services/transaction.service.ts.html +4 -7
  143. package/coverage/lib/services/unified-wallet.service.ts.html +7 -10
  144. package/coverage/lib/services/wallet-context.service.ts.html +1 -1
  145. package/coverage/lib/services/wallet-event-bus.service.ts.html +249 -249
  146. package/coverage/lib/services/wallet-providers.service.ts.html +4 -7
  147. package/coverage/lib/transports/chrome-extension-transport.ts.html +1 -1
  148. package/coverage/lib/transports/index.html +1 -1
  149. package/coverage/lib/utils/index.html +1 -1
  150. package/coverage/lib/utils/ledger-icons.util.ts.html +1 -1
  151. package/dist/fesm2022/hsuite-native-connect-angular.mjs +85 -20
  152. package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -1
  153. package/dist/index.d.ts +33 -3
  154. package/package.json +4 -4
  155. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.spec.ts +89 -0
  156. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +8 -0
  157. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +1 -6
  158. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.spec.ts +173 -0
  159. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +84 -19
  160. package/src/lib/services/transaction.service.ts +0 -1
  161. package/src/lib/services/unified-wallet.service.ts +0 -1
  162. package/src/lib/services/wallet-providers.service.ts +0 -1
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">57.86% </span>
26
+ <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>353/610</span>
28
+ <span class='fraction'>0/610</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">58.53% </span>
33
+ <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>24/41</span>
35
+ <span class='fraction'>0/1</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">75% </span>
40
+ <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>6/8</span>
42
+ <span class='fraction'>0/1</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">57.86% </span>
47
+ <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>353/610</span>
49
+ <span class='fraction'>0/610</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line medium'></div>
64
+ <div class='status-line low'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -673,60 +673,8 @@
673
673
  <a name='L608'></a><a href='#L608'>608</a>
674
674
  <a name='L609'></a><a href='#L609'>609</a>
675
675
  <a name='L610'></a><a href='#L610'>610</a>
676
- <a name='L611'></a><a href='#L611'>611</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
677
- <span class="cline-any cline-yes">1x</span>
678
- <span class="cline-any cline-yes">1x</span>
679
- <span class="cline-any cline-yes">1x</span>
680
- <span class="cline-any cline-yes">1x</span>
681
- <span class="cline-any cline-yes">1x</span>
682
- <span class="cline-any cline-yes">1x</span>
683
- <span class="cline-any cline-yes">1x</span>
684
- <span class="cline-any cline-yes">1x</span>
685
- <span class="cline-any cline-yes">1x</span>
686
- <span class="cline-any cline-yes">1x</span>
687
- <span class="cline-any cline-yes">1x</span>
688
- <span class="cline-any cline-yes">1x</span>
689
- <span class="cline-any cline-yes">1x</span>
690
- <span class="cline-any cline-yes">1x</span>
691
- <span class="cline-any cline-yes">1x</span>
692
- <span class="cline-any cline-yes">1x</span>
693
- <span class="cline-any cline-yes">1x</span>
694
- <span class="cline-any cline-yes">1x</span>
695
- <span class="cline-any cline-yes">1x</span>
696
- <span class="cline-any cline-yes">1x</span>
697
- <span class="cline-any cline-yes">1x</span>
698
- <span class="cline-any cline-yes">1x</span>
699
- <span class="cline-any cline-yes">1x</span>
700
- <span class="cline-any cline-yes">1x</span>
701
- <span class="cline-any cline-yes">1x</span>
702
- <span class="cline-any cline-yes">1x</span>
703
- <span class="cline-any cline-yes">1x</span>
704
- <span class="cline-any cline-yes">1x</span>
705
- <span class="cline-any cline-yes">1x</span>
706
- <span class="cline-any cline-yes">1x</span>
707
- <span class="cline-any cline-yes">1x</span>
708
- <span class="cline-any cline-yes">1x</span>
709
- <span class="cline-any cline-yes">1x</span>
710
- <span class="cline-any cline-yes">1x</span>
711
- <span class="cline-any cline-yes">1x</span>
712
- <span class="cline-any cline-yes">1x</span>
713
- <span class="cline-any cline-yes">1x</span>
714
- <span class="cline-any cline-yes">1x</span>
715
- <span class="cline-any cline-yes">1x</span>
716
- <span class="cline-any cline-yes">2x</span>
717
- <span class="cline-any cline-yes">2x</span>
718
- <span class="cline-any cline-yes">2x</span>
719
- <span class="cline-any cline-yes">2x</span>
720
- <span class="cline-any cline-yes">2x</span>
721
- <span class="cline-any cline-yes">2x</span>
722
- <span class="cline-any cline-yes">2x</span>
723
- <span class="cline-any cline-yes">2x</span>
724
- <span class="cline-any cline-yes">2x</span>
725
- <span class="cline-any cline-yes">2x</span>
726
- <span class="cline-any cline-yes">2x</span>
727
- <span class="cline-any cline-yes">2x</span>
676
+ <a name='L611'></a><a href='#L611'>611</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
728
677
  <span class="cline-any cline-no">&nbsp;</span>
729
- <span class="cline-any cline-yes">2x</span>
730
678
  <span class="cline-any cline-no">&nbsp;</span>
731
679
  <span class="cline-any cline-no">&nbsp;</span>
732
680
  <span class="cline-any cline-no">&nbsp;</span>
@@ -893,218 +841,7 @@
893
841
  <span class="cline-any cline-no">&nbsp;</span>
894
842
  <span class="cline-any cline-no">&nbsp;</span>
895
843
  <span class="cline-any cline-no">&nbsp;</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">23x</span>
910
- <span class="cline-any cline-yes">23x</span>
911
- <span class="cline-any cline-yes">23x</span>
912
- <span class="cline-any cline-yes">23x</span>
913
- <span class="cline-any cline-yes">23x</span>
914
- <span class="cline-any cline-yes">23x</span>
915
- <span class="cline-any cline-yes">23x</span>
916
- <span class="cline-any cline-yes">23x</span>
917
- <span class="cline-any cline-yes">23x</span>
918
- <span class="cline-any cline-yes">23x</span>
919
- <span class="cline-any cline-yes">23x</span>
920
- <span class="cline-any cline-yes">23x</span>
921
- <span class="cline-any cline-yes">23x</span>
922
- <span class="cline-any cline-yes">23x</span>
923
- <span class="cline-any cline-yes">23x</span>
924
- <span class="cline-any cline-yes">15x</span>
925
- <span class="cline-any cline-yes">15x</span>
926
- <span class="cline-any cline-yes">15x</span>
927
- <span class="cline-any cline-yes">15x</span>
928
- <span class="cline-any cline-yes">15x</span>
929
- <span class="cline-any cline-yes">15x</span>
930
- <span class="cline-any cline-yes">15x</span>
931
- <span class="cline-any cline-yes">15x</span>
932
- <span class="cline-any cline-yes">15x</span>
933
- <span class="cline-any cline-yes">15x</span>
934
- <span class="cline-any cline-yes">15x</span>
935
- <span class="cline-any cline-yes">15x</span>
936
- <span class="cline-any cline-yes">15x</span>
937
- <span class="cline-any cline-yes">15x</span>
938
- <span class="cline-any cline-yes">15x</span>
939
- <span class="cline-any cline-yes">15x</span>
940
- <span class="cline-any cline-yes">15x</span>
941
- <span class="cline-any cline-yes">15x</span>
942
- <span class="cline-any cline-yes">15x</span>
943
- <span class="cline-any cline-yes">23x</span>
944
- <span class="cline-any cline-yes">23x</span>
945
- <span class="cline-any cline-yes">23x</span>
946
- <span class="cline-any cline-yes">23x</span>
947
- <span class="cline-any cline-yes">23x</span>
948
- <span class="cline-any cline-yes">23x</span>
949
- <span class="cline-any cline-yes">23x</span>
950
- <span class="cline-any cline-yes">23x</span>
951
- <span class="cline-any cline-yes">23x</span>
952
- <span class="cline-any cline-yes">23x</span>
953
- <span class="cline-any cline-yes">23x</span>
954
- <span class="cline-any cline-yes">23x</span>
955
- <span class="cline-any cline-yes">23x</span>
956
- <span class="cline-any cline-yes">4x</span>
957
- <span class="cline-any cline-yes">4x</span>
958
- <span class="cline-any cline-yes">4x</span>
959
- <span class="cline-any cline-yes">4x</span>
960
- <span class="cline-any cline-yes">4x</span>
961
- <span class="cline-any cline-yes">4x</span>
962
- <span class="cline-any cline-yes">4x</span>
963
- <span class="cline-any cline-yes">4x</span>
964
- <span class="cline-any cline-yes">4x</span>
965
- <span class="cline-any cline-yes">4x</span>
966
- <span class="cline-any cline-yes">4x</span>
967
- <span class="cline-any cline-yes">4x</span>
968
- <span class="cline-any cline-yes">4x</span>
969
- <span class="cline-any cline-yes">4x</span>
970
- <span class="cline-any cline-yes">4x</span>
971
- <span class="cline-any cline-yes">4x</span>
972
- <span class="cline-any cline-yes">4x</span>
973
- <span class="cline-any cline-yes">4x</span>
974
- <span class="cline-any cline-yes">4x</span>
975
- <span class="cline-any cline-yes">4x</span>
976
- <span class="cline-any cline-yes">4x</span>
977
- <span class="cline-any cline-yes">4x</span>
978
- <span class="cline-any cline-yes">4x</span>
979
- <span class="cline-any cline-yes">4x</span>
980
- <span class="cline-any cline-yes">4x</span>
981
- <span class="cline-any cline-yes">4x</span>
982
- <span class="cline-any cline-yes">4x</span>
983
- <span class="cline-any cline-yes">4x</span>
984
- <span class="cline-any cline-yes">4x</span>
985
- <span class="cline-any cline-no">&nbsp;</span>
986
- <span class="cline-any cline-no">&nbsp;</span>
987
- <span class="cline-any cline-yes">4x</span>
988
- <span class="cline-any cline-yes">4x</span>
989
- <span class="cline-any cline-yes">4x</span>
990
- <span class="cline-any cline-yes">4x</span>
991
- <span class="cline-any cline-yes">1x</span>
992
- <span class="cline-any cline-yes">1x</span>
993
- <span class="cline-any cline-yes">1x</span>
994
- <span class="cline-any cline-yes">1x</span>
995
- <span class="cline-any cline-yes">1x</span>
996
- <span class="cline-any cline-yes">1x</span>
997
- <span class="cline-any cline-yes">1x</span>
998
- <span class="cline-any cline-yes">1x</span>
999
- <span class="cline-any cline-no">&nbsp;</span>
1000
- <span class="cline-any cline-no">&nbsp;</span>
1001
- <span class="cline-any cline-no">&nbsp;</span>
1002
- <span class="cline-any cline-no">&nbsp;</span>
1003
- <span class="cline-any cline-no">&nbsp;</span>
1004
- <span class="cline-any cline-yes">1x</span>
1005
- <span class="cline-any cline-yes">1x</span>
1006
- <span class="cline-any cline-yes">1x</span>
1007
- <span class="cline-any cline-yes">1x</span>
1008
- <span class="cline-any cline-yes">1x</span>
1009
- <span class="cline-any cline-yes">4x</span>
1010
- <span class="cline-any cline-yes">23x</span>
1011
- <span class="cline-any cline-yes">23x</span>
1012
- <span class="cline-any cline-yes">23x</span>
1013
- <span class="cline-any cline-yes">23x</span>
1014
- <span class="cline-any cline-yes">23x</span>
1015
- <span class="cline-any cline-yes">23x</span>
1016
- <span class="cline-any cline-yes">23x</span>
1017
- <span class="cline-any cline-yes">23x</span>
1018
- <span class="cline-any cline-yes">23x</span>
1019
- <span class="cline-any cline-yes">4x</span>
1020
- <span class="cline-any cline-yes">4x</span>
1021
- <span class="cline-any cline-yes">4x</span>
1022
- <span class="cline-any cline-yes">4x</span>
1023
- <span class="cline-any cline-yes">4x</span>
1024
- <span class="cline-any cline-yes">4x</span>
1025
- <span class="cline-any cline-yes">4x</span>
1026
- <span class="cline-any cline-yes">4x</span>
1027
- <span class="cline-any cline-yes">4x</span>
1028
- <span class="cline-any cline-yes">4x</span>
1029
- <span class="cline-any cline-yes">4x</span>
1030
- <span class="cline-any cline-yes">4x</span>
1031
- <span class="cline-any cline-yes">4x</span>
1032
- <span class="cline-any cline-yes">4x</span>
1033
- <span class="cline-any cline-yes">4x</span>
1034
- <span class="cline-any cline-yes">4x</span>
1035
- <span class="cline-any cline-yes">4x</span>
1036
- <span class="cline-any cline-yes">4x</span>
1037
- <span class="cline-any cline-yes">4x</span>
1038
- <span class="cline-any cline-yes">4x</span>
1039
- <span class="cline-any cline-yes">4x</span>
1040
- <span class="cline-any cline-yes">4x</span>
1041
- <span class="cline-any cline-yes">4x</span>
1042
- <span class="cline-any cline-yes">4x</span>
1043
- <span class="cline-any cline-yes">4x</span>
1044
- <span class="cline-any cline-yes">4x</span>
1045
- <span class="cline-any cline-yes">4x</span>
1046
- <span class="cline-any cline-yes">4x</span>
1047
- <span class="cline-any cline-yes">4x</span>
1048
- <span class="cline-any cline-yes">4x</span>
1049
- <span class="cline-any cline-yes">4x</span>
1050
- <span class="cline-any cline-no">&nbsp;</span>
1051
- <span class="cline-any cline-no">&nbsp;</span>
1052
- <span class="cline-any cline-yes">4x</span>
1053
- <span class="cline-any cline-yes">4x</span>
1054
- <span class="cline-any cline-yes">4x</span>
1055
- <span class="cline-any cline-yes">4x</span>
1056
- <span class="cline-any cline-yes">4x</span>
1057
- <span class="cline-any cline-yes">4x</span>
1058
- <span class="cline-any cline-yes">4x</span>
1059
- <span class="cline-any cline-yes">3x</span>
1060
- <span class="cline-any cline-yes">3x</span>
1061
- <span class="cline-any cline-yes">3x</span>
1062
- <span class="cline-any cline-yes">4x</span>
1063
- <span class="cline-any cline-yes">4x</span>
1064
- <span class="cline-any cline-yes">4x</span>
1065
- <span class="cline-any cline-yes">4x</span>
1066
- <span class="cline-any cline-yes">4x</span>
1067
- <span class="cline-any cline-yes">4x</span>
1068
- <span class="cline-any cline-no">&nbsp;</span>
1069
- <span class="cline-any cline-no">&nbsp;</span>
1070
- <span class="cline-any cline-yes">4x</span>
1071
- <span class="cline-any cline-yes">4x</span>
1072
- <span class="cline-any cline-yes">4x</span>
1073
- <span class="cline-any cline-yes">4x</span>
1074
- <span class="cline-any cline-yes">1x</span>
1075
- <span class="cline-any cline-yes">1x</span>
1076
- <span class="cline-any cline-yes">1x</span>
1077
- <span class="cline-any cline-yes">1x</span>
1078
- <span class="cline-any cline-yes">1x</span>
1079
- <span class="cline-any cline-yes">1x</span>
1080
- <span class="cline-any cline-yes">1x</span>
1081
- <span class="cline-any cline-yes">1x</span>
1082
- <span class="cline-any cline-yes">1x</span>
1083
- <span class="cline-any cline-yes">1x</span>
1084
- <span class="cline-any cline-yes">1x</span>
1085
- <span class="cline-any cline-yes">1x</span>
1086
- <span class="cline-any cline-yes">1x</span>
1087
- <span class="cline-any cline-yes">1x</span>
1088
- <span class="cline-any cline-yes">1x</span>
1089
- <span class="cline-any cline-yes">1x</span>
1090
- <span class="cline-any cline-yes">1x</span>
1091
- <span class="cline-any cline-yes">1x</span>
1092
844
  <span class="cline-any cline-no">&nbsp;</span>
1093
- <span class="cline-any cline-yes">1x</span>
1094
- <span class="cline-any cline-yes">1x</span>
1095
- <span class="cline-any cline-yes">1x</span>
1096
- <span class="cline-any cline-yes">1x</span>
1097
- <span class="cline-any cline-yes">1x</span>
1098
- <span class="cline-any cline-yes">1x</span>
1099
- <span class="cline-any cline-yes">1x</span>
1100
- <span class="cline-any cline-yes">1x</span>
1101
- <span class="cline-any cline-yes">1x</span>
1102
- <span class="cline-any cline-yes">1x</span>
1103
- <span class="cline-any cline-yes">1x</span>
1104
- <span class="cline-any cline-yes">1x</span>
1105
- <span class="cline-any cline-yes">1x</span>
1106
- <span class="cline-any cline-yes">1x</span>
1107
- <span class="cline-any cline-yes">1x</span>
1108
845
  <span class="cline-any cline-no">&nbsp;</span>
1109
846
  <span class="cline-any cline-no">&nbsp;</span>
1110
847
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1120,34 +857,9 @@
1120
857
  <span class="cline-any cline-no">&nbsp;</span>
1121
858
  <span class="cline-any cline-no">&nbsp;</span>
1122
859
  <span class="cline-any cline-no">&nbsp;</span>
1123
- <span class="cline-any cline-yes">1x</span>
1124
- <span class="cline-any cline-yes">1x</span>
1125
- <span class="cline-any cline-yes">1x</span>
1126
- <span class="cline-any cline-yes">1x</span>
1127
- <span class="cline-any cline-yes">1x</span>
1128
- <span class="cline-any cline-yes">4x</span>
1129
- <span class="cline-any cline-yes">23x</span>
1130
- <span class="cline-any cline-yes">23x</span>
1131
- <span class="cline-any cline-yes">23x</span>
1132
- <span class="cline-any cline-yes">23x</span>
1133
- <span class="cline-any cline-yes">23x</span>
1134
- <span class="cline-any cline-yes">23x</span>
1135
- <span class="cline-any cline-yes">23x</span>
1136
- <span class="cline-any cline-yes">23x</span>
1137
- <span class="cline-any cline-yes">23x</span>
1138
- <span class="cline-any cline-yes">23x</span>
1139
860
  <span class="cline-any cline-no">&nbsp;</span>
1140
861
  <span class="cline-any cline-no">&nbsp;</span>
1141
862
  <span class="cline-any cline-no">&nbsp;</span>
1142
- <span class="cline-any cline-yes">23x</span>
1143
- <span class="cline-any cline-yes">23x</span>
1144
- <span class="cline-any cline-yes">23x</span>
1145
- <span class="cline-any cline-yes">23x</span>
1146
- <span class="cline-any cline-yes">23x</span>
1147
- <span class="cline-any cline-yes">23x</span>
1148
- <span class="cline-any cline-yes">23x</span>
1149
- <span class="cline-any cline-yes">23x</span>
1150
- <span class="cline-any cline-yes">23x</span>
1151
863
  <span class="cline-any cline-no">&nbsp;</span>
1152
864
  <span class="cline-any cline-no">&nbsp;</span>
1153
865
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1200,143 +912,431 @@
1200
912
  <span class="cline-any cline-no">&nbsp;</span>
1201
913
  <span class="cline-any cline-no">&nbsp;</span>
1202
914
  <span class="cline-any cline-no">&nbsp;</span>
1203
- <span class="cline-any cline-yes">23x</span>
1204
- <span class="cline-any cline-yes">23x</span>
1205
- <span class="cline-any cline-yes">23x</span>
1206
- <span class="cline-any cline-yes">23x</span>
1207
- <span class="cline-any cline-yes">23x</span>
1208
- <span class="cline-any cline-yes">23x</span>
1209
- <span class="cline-any cline-yes">23x</span>
1210
- <span class="cline-any cline-yes">23x</span>
1211
- <span class="cline-any cline-yes">23x</span>
1212
- <span class="cline-any cline-yes">23x</span>
1213
- <span class="cline-any cline-yes">23x</span>
1214
- <span class="cline-any cline-yes">23x</span>
1215
- <span class="cline-any cline-yes">23x</span>
1216
- <span class="cline-any cline-yes">23x</span>
1217
- <span class="cline-any cline-yes">20x</span>
1218
- <span class="cline-any cline-yes">20x</span>
1219
- <span class="cline-any cline-yes">20x</span>
1220
- <span class="cline-any cline-yes">20x</span>
1221
915
  <span class="cline-any cline-no">&nbsp;</span>
1222
916
  <span class="cline-any cline-no">&nbsp;</span>
1223
917
  <span class="cline-any cline-no">&nbsp;</span>
1224
- <span class="cline-any cline-yes">20x</span>
1225
- <span class="cline-any cline-yes">20x</span>
1226
- <span class="cline-any cline-yes">1x</span>
1227
- <span class="cline-any cline-yes">1x</span>
1228
- <span class="cline-any cline-yes">1x</span>
1229
- <span class="cline-any cline-yes">19x</span>
1230
- <span class="cline-any cline-yes">20x</span>
1231
918
  <span class="cline-any cline-no">&nbsp;</span>
1232
919
  <span class="cline-any cline-no">&nbsp;</span>
1233
920
  <span class="cline-any cline-no">&nbsp;</span>
1234
921
  <span class="cline-any cline-no">&nbsp;</span>
1235
922
  <span class="cline-any cline-no">&nbsp;</span>
1236
- <span class="cline-any cline-yes">19x</span>
1237
- <span class="cline-any cline-yes">19x</span>
1238
- <span class="cline-any cline-yes">20x</span>
1239
- <span class="cline-any cline-yes">20x</span>
1240
- <span class="cline-any cline-yes">32x</span>
1241
- <span class="cline-any cline-yes">32x</span>
1242
- <span class="cline-any cline-yes">32x</span>
1243
- <span class="cline-any cline-yes">32x</span>
1244
- <span class="cline-any cline-yes">1x</span>
1245
- <span class="cline-any cline-yes">1x</span>
1246
- <span class="cline-any cline-yes">1x</span>
1247
- <span class="cline-any cline-yes">31x</span>
1248
- <span class="cline-any cline-yes">31x</span>
1249
- <span class="cline-any cline-yes">31x</span>
1250
- <span class="cline-any cline-yes">31x</span>
1251
- <span class="cline-any cline-yes">31x</span>
1252
- <span class="cline-any cline-yes">32x</span>
1253
- <span class="cline-any cline-yes">20x</span>
1254
- <span class="cline-any cline-yes">20x</span>
1255
- <span class="cline-any cline-yes">20x</span>
1256
- <span class="cline-any cline-yes">20x</span>
1257
- <span class="cline-any cline-yes">14x</span>
1258
- <span class="cline-any cline-yes">14x</span>
1259
- <span class="cline-any cline-yes">14x</span>
1260
- <span class="cline-any cline-yes">14x</span>
1261
- <span class="cline-any cline-yes">20x</span>
1262
- <span class="cline-any cline-yes">14x</span>
1263
- <span class="cline-any cline-yes">14x</span>
1264
- <span class="cline-any cline-yes">14x</span>
1265
- <span class="cline-any cline-yes">14x</span>
1266
- <span class="cline-any cline-yes">14x</span>
1267
- <span class="cline-any cline-yes">14x</span>
1268
- <span class="cline-any cline-yes">14x</span>
1269
- <span class="cline-any cline-yes">14x</span>
1270
- <span class="cline-any cline-yes">14x</span>
1271
- <span class="cline-any cline-yes">14x</span>
1272
- <span class="cline-any cline-yes">14x</span>
1273
- <span class="cline-any cline-yes">1x</span>
1274
- <span class="cline-any cline-yes">1x</span>
1275
- <span class="cline-any cline-yes">1x</span>
1276
- <span class="cline-any cline-yes">1x</span>
1277
- <span class="cline-any cline-yes">1x</span>
1278
- <span class="cline-any cline-yes">14x</span>
1279
- <span class="cline-any cline-yes">14x</span>
1280
- <span class="cline-any cline-yes">14x</span>
1281
- <span class="cline-any cline-yes">14x</span>
1282
- <span class="cline-any cline-yes">5x</span>
1283
- <span class="cline-any cline-yes">5x</span>
1284
- <span class="cline-any cline-yes">20x</span>
1285
- <span class="cline-any cline-yes">23x</span>
1286
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1287
- * HSuite Native Connect
1288
- * Copyright 2024-2025 HSuite (https://hsuite.finance)
1289
- *
1290
- * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
1291
- *
1292
- * This file is part of HSuite Native Connect. For commercial licensing,
1293
- * visit https://hsuite.finance/licensing
1294
- */
1295
- &nbsp;
1296
- /**
1297
- * @file hedera-signer.ts
1298
- * @description Hedera-specific WalletConnect signer implementation
1299
- *
1300
- * Implements the IWalletConnectSigner interface for Hedera ledger.
1301
- * Handles Hedera-specific JSON-RPC methods and transaction formats.
1302
- */
1303
- &nbsp;
1304
- import { getLogger } from '@hsuite/native-connect-sdk';
1305
- &nbsp;
1306
- import type { SignResult, SubmitResult } from '../../base-wallet-provider';
1307
- import type { IWalletConnectSigner, SignerOperationParams } from '../core/base-signer.interface';
1308
- &nbsp;
1309
- const logger = getLogger().scoped?.('HederaSigner'<span class="branch-0 cbranch-no" title="branch not covered" >) ?? getLogger();</span>
1310
- &nbsp;
1311
- /**
1312
- * Extract a meaningful error message from various error shapes.
1313
- * WalletConnect SDK throws errors that are not standard Error instances.
1314
- *
1315
- * Handles:
1316
- * - Standard Error objects
1317
- * - WalletConnect SDK errors: { code, message }
1318
- * - Nested errors: { error: { message } }
1319
- * - PIN_REQUIRED errors from wallet
1320
- * - DOMException objects
1321
- * - Objects that stringify to {} (enumerable property check)
1322
- *
1323
- * @param error - Error from WalletConnect SDK (can be Error, object, or string)
1324
- * @returns Human-readable error message
1325
- */
1326
- function extractErrorMessage(error: unknown): string {
1327
- // Log the raw error for debugging
1328
- logger.debug('Extracting error message', {
1329
- errorType: typeof error,
1330
- isError: error instanceof Error,
1331
- constructorName: error?.constructor?.name,
1332
- protoName: Object.getPrototypeOf(error)?.constructor?.name,
1333
- });
1334
- &nbsp;
1335
- if (error instanceof Error) {
1336
- return error.message;
1337
- <span class="branch-0 cbranch-no" title="branch not covered" > }</span>
1338
- <span class="cstat-no" title="statement not covered" ></span>
1339
- if (typeof error === 'object' &amp;&amp; error !== null) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
923
+ <span class="cline-any cline-no">&nbsp;</span>
924
+ <span class="cline-any cline-no">&nbsp;</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-no">&nbsp;</span>
927
+ <span class="cline-any cline-no">&nbsp;</span>
928
+ <span class="cline-any cline-no">&nbsp;</span>
929
+ <span class="cline-any cline-no">&nbsp;</span>
930
+ <span class="cline-any cline-no">&nbsp;</span>
931
+ <span class="cline-any cline-no">&nbsp;</span>
932
+ <span class="cline-any cline-no">&nbsp;</span>
933
+ <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-no">&nbsp;</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-no">&nbsp;</span>
937
+ <span class="cline-any cline-no">&nbsp;</span>
938
+ <span class="cline-any cline-no">&nbsp;</span>
939
+ <span class="cline-any cline-no">&nbsp;</span>
940
+ <span class="cline-any cline-no">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-no">&nbsp;</span>
945
+ <span class="cline-any cline-no">&nbsp;</span>
946
+ <span class="cline-any cline-no">&nbsp;</span>
947
+ <span class="cline-any cline-no">&nbsp;</span>
948
+ <span class="cline-any cline-no">&nbsp;</span>
949
+ <span class="cline-any cline-no">&nbsp;</span>
950
+ <span class="cline-any cline-no">&nbsp;</span>
951
+ <span class="cline-any cline-no">&nbsp;</span>
952
+ <span class="cline-any cline-no">&nbsp;</span>
953
+ <span class="cline-any cline-no">&nbsp;</span>
954
+ <span class="cline-any cline-no">&nbsp;</span>
955
+ <span class="cline-any cline-no">&nbsp;</span>
956
+ <span class="cline-any cline-no">&nbsp;</span>
957
+ <span class="cline-any cline-no">&nbsp;</span>
958
+ <span class="cline-any cline-no">&nbsp;</span>
959
+ <span class="cline-any cline-no">&nbsp;</span>
960
+ <span class="cline-any cline-no">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-no">&nbsp;</span>
964
+ <span class="cline-any cline-no">&nbsp;</span>
965
+ <span class="cline-any cline-no">&nbsp;</span>
966
+ <span class="cline-any cline-no">&nbsp;</span>
967
+ <span class="cline-any cline-no">&nbsp;</span>
968
+ <span class="cline-any cline-no">&nbsp;</span>
969
+ <span class="cline-any cline-no">&nbsp;</span>
970
+ <span class="cline-any cline-no">&nbsp;</span>
971
+ <span class="cline-any cline-no">&nbsp;</span>
972
+ <span class="cline-any cline-no">&nbsp;</span>
973
+ <span class="cline-any cline-no">&nbsp;</span>
974
+ <span class="cline-any cline-no">&nbsp;</span>
975
+ <span class="cline-any cline-no">&nbsp;</span>
976
+ <span class="cline-any cline-no">&nbsp;</span>
977
+ <span class="cline-any cline-no">&nbsp;</span>
978
+ <span class="cline-any cline-no">&nbsp;</span>
979
+ <span class="cline-any cline-no">&nbsp;</span>
980
+ <span class="cline-any cline-no">&nbsp;</span>
981
+ <span class="cline-any cline-no">&nbsp;</span>
982
+ <span class="cline-any cline-no">&nbsp;</span>
983
+ <span class="cline-any cline-no">&nbsp;</span>
984
+ <span class="cline-any cline-no">&nbsp;</span>
985
+ <span class="cline-any cline-no">&nbsp;</span>
986
+ <span class="cline-any cline-no">&nbsp;</span>
987
+ <span class="cline-any cline-no">&nbsp;</span>
988
+ <span class="cline-any cline-no">&nbsp;</span>
989
+ <span class="cline-any cline-no">&nbsp;</span>
990
+ <span class="cline-any cline-no">&nbsp;</span>
991
+ <span class="cline-any cline-no">&nbsp;</span>
992
+ <span class="cline-any cline-no">&nbsp;</span>
993
+ <span class="cline-any cline-no">&nbsp;</span>
994
+ <span class="cline-any cline-no">&nbsp;</span>
995
+ <span class="cline-any cline-no">&nbsp;</span>
996
+ <span class="cline-any cline-no">&nbsp;</span>
997
+ <span class="cline-any cline-no">&nbsp;</span>
998
+ <span class="cline-any cline-no">&nbsp;</span>
999
+ <span class="cline-any cline-no">&nbsp;</span>
1000
+ <span class="cline-any cline-no">&nbsp;</span>
1001
+ <span class="cline-any cline-no">&nbsp;</span>
1002
+ <span class="cline-any cline-no">&nbsp;</span>
1003
+ <span class="cline-any cline-no">&nbsp;</span>
1004
+ <span class="cline-any cline-no">&nbsp;</span>
1005
+ <span class="cline-any cline-no">&nbsp;</span>
1006
+ <span class="cline-any cline-no">&nbsp;</span>
1007
+ <span class="cline-any cline-no">&nbsp;</span>
1008
+ <span class="cline-any cline-no">&nbsp;</span>
1009
+ <span class="cline-any cline-no">&nbsp;</span>
1010
+ <span class="cline-any cline-no">&nbsp;</span>
1011
+ <span class="cline-any cline-no">&nbsp;</span>
1012
+ <span class="cline-any cline-no">&nbsp;</span>
1013
+ <span class="cline-any cline-no">&nbsp;</span>
1014
+ <span class="cline-any cline-no">&nbsp;</span>
1015
+ <span class="cline-any cline-no">&nbsp;</span>
1016
+ <span class="cline-any cline-no">&nbsp;</span>
1017
+ <span class="cline-any cline-no">&nbsp;</span>
1018
+ <span class="cline-any cline-no">&nbsp;</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-no">&nbsp;</span>
1021
+ <span class="cline-any cline-no">&nbsp;</span>
1022
+ <span class="cline-any cline-no">&nbsp;</span>
1023
+ <span class="cline-any cline-no">&nbsp;</span>
1024
+ <span class="cline-any cline-no">&nbsp;</span>
1025
+ <span class="cline-any cline-no">&nbsp;</span>
1026
+ <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-no">&nbsp;</span>
1028
+ <span class="cline-any cline-no">&nbsp;</span>
1029
+ <span class="cline-any cline-no">&nbsp;</span>
1030
+ <span class="cline-any cline-no">&nbsp;</span>
1031
+ <span class="cline-any cline-no">&nbsp;</span>
1032
+ <span class="cline-any cline-no">&nbsp;</span>
1033
+ <span class="cline-any cline-no">&nbsp;</span>
1034
+ <span class="cline-any cline-no">&nbsp;</span>
1035
+ <span class="cline-any cline-no">&nbsp;</span>
1036
+ <span class="cline-any cline-no">&nbsp;</span>
1037
+ <span class="cline-any cline-no">&nbsp;</span>
1038
+ <span class="cline-any cline-no">&nbsp;</span>
1039
+ <span class="cline-any cline-no">&nbsp;</span>
1040
+ <span class="cline-any cline-no">&nbsp;</span>
1041
+ <span class="cline-any cline-no">&nbsp;</span>
1042
+ <span class="cline-any cline-no">&nbsp;</span>
1043
+ <span class="cline-any cline-no">&nbsp;</span>
1044
+ <span class="cline-any cline-no">&nbsp;</span>
1045
+ <span class="cline-any cline-no">&nbsp;</span>
1046
+ <span class="cline-any cline-no">&nbsp;</span>
1047
+ <span class="cline-any cline-no">&nbsp;</span>
1048
+ <span class="cline-any cline-no">&nbsp;</span>
1049
+ <span class="cline-any cline-no">&nbsp;</span>
1050
+ <span class="cline-any cline-no">&nbsp;</span>
1051
+ <span class="cline-any cline-no">&nbsp;</span>
1052
+ <span class="cline-any cline-no">&nbsp;</span>
1053
+ <span class="cline-any cline-no">&nbsp;</span>
1054
+ <span class="cline-any cline-no">&nbsp;</span>
1055
+ <span class="cline-any cline-no">&nbsp;</span>
1056
+ <span class="cline-any cline-no">&nbsp;</span>
1057
+ <span class="cline-any cline-no">&nbsp;</span>
1058
+ <span class="cline-any cline-no">&nbsp;</span>
1059
+ <span class="cline-any cline-no">&nbsp;</span>
1060
+ <span class="cline-any cline-no">&nbsp;</span>
1061
+ <span class="cline-any cline-no">&nbsp;</span>
1062
+ <span class="cline-any cline-no">&nbsp;</span>
1063
+ <span class="cline-any cline-no">&nbsp;</span>
1064
+ <span class="cline-any cline-no">&nbsp;</span>
1065
+ <span class="cline-any cline-no">&nbsp;</span>
1066
+ <span class="cline-any cline-no">&nbsp;</span>
1067
+ <span class="cline-any cline-no">&nbsp;</span>
1068
+ <span class="cline-any cline-no">&nbsp;</span>
1069
+ <span class="cline-any cline-no">&nbsp;</span>
1070
+ <span class="cline-any cline-no">&nbsp;</span>
1071
+ <span class="cline-any cline-no">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&nbsp;</span>
1073
+ <span class="cline-any cline-no">&nbsp;</span>
1074
+ <span class="cline-any cline-no">&nbsp;</span>
1075
+ <span class="cline-any cline-no">&nbsp;</span>
1076
+ <span class="cline-any cline-no">&nbsp;</span>
1077
+ <span class="cline-any cline-no">&nbsp;</span>
1078
+ <span class="cline-any cline-no">&nbsp;</span>
1079
+ <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-no">&nbsp;</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-no">&nbsp;</span>
1083
+ <span class="cline-any cline-no">&nbsp;</span>
1084
+ <span class="cline-any cline-no">&nbsp;</span>
1085
+ <span class="cline-any cline-no">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-no">&nbsp;</span>
1088
+ <span class="cline-any cline-no">&nbsp;</span>
1089
+ <span class="cline-any cline-no">&nbsp;</span>
1090
+ <span class="cline-any cline-no">&nbsp;</span>
1091
+ <span class="cline-any cline-no">&nbsp;</span>
1092
+ <span class="cline-any cline-no">&nbsp;</span>
1093
+ <span class="cline-any cline-no">&nbsp;</span>
1094
+ <span class="cline-any cline-no">&nbsp;</span>
1095
+ <span class="cline-any cline-no">&nbsp;</span>
1096
+ <span class="cline-any cline-no">&nbsp;</span>
1097
+ <span class="cline-any cline-no">&nbsp;</span>
1098
+ <span class="cline-any cline-no">&nbsp;</span>
1099
+ <span class="cline-any cline-no">&nbsp;</span>
1100
+ <span class="cline-any cline-no">&nbsp;</span>
1101
+ <span class="cline-any cline-no">&nbsp;</span>
1102
+ <span class="cline-any cline-no">&nbsp;</span>
1103
+ <span class="cline-any cline-no">&nbsp;</span>
1104
+ <span class="cline-any cline-no">&nbsp;</span>
1105
+ <span class="cline-any cline-no">&nbsp;</span>
1106
+ <span class="cline-any cline-no">&nbsp;</span>
1107
+ <span class="cline-any cline-no">&nbsp;</span>
1108
+ <span class="cline-any cline-no">&nbsp;</span>
1109
+ <span class="cline-any cline-no">&nbsp;</span>
1110
+ <span class="cline-any cline-no">&nbsp;</span>
1111
+ <span class="cline-any cline-no">&nbsp;</span>
1112
+ <span class="cline-any cline-no">&nbsp;</span>
1113
+ <span class="cline-any cline-no">&nbsp;</span>
1114
+ <span class="cline-any cline-no">&nbsp;</span>
1115
+ <span class="cline-any cline-no">&nbsp;</span>
1116
+ <span class="cline-any cline-no">&nbsp;</span>
1117
+ <span class="cline-any cline-no">&nbsp;</span>
1118
+ <span class="cline-any cline-no">&nbsp;</span>
1119
+ <span class="cline-any cline-no">&nbsp;</span>
1120
+ <span class="cline-any cline-no">&nbsp;</span>
1121
+ <span class="cline-any cline-no">&nbsp;</span>
1122
+ <span class="cline-any cline-no">&nbsp;</span>
1123
+ <span class="cline-any cline-no">&nbsp;</span>
1124
+ <span class="cline-any cline-no">&nbsp;</span>
1125
+ <span class="cline-any cline-no">&nbsp;</span>
1126
+ <span class="cline-any cline-no">&nbsp;</span>
1127
+ <span class="cline-any cline-no">&nbsp;</span>
1128
+ <span class="cline-any cline-no">&nbsp;</span>
1129
+ <span class="cline-any cline-no">&nbsp;</span>
1130
+ <span class="cline-any cline-no">&nbsp;</span>
1131
+ <span class="cline-any cline-no">&nbsp;</span>
1132
+ <span class="cline-any cline-no">&nbsp;</span>
1133
+ <span class="cline-any cline-no">&nbsp;</span>
1134
+ <span class="cline-any cline-no">&nbsp;</span>
1135
+ <span class="cline-any cline-no">&nbsp;</span>
1136
+ <span class="cline-any cline-no">&nbsp;</span>
1137
+ <span class="cline-any cline-no">&nbsp;</span>
1138
+ <span class="cline-any cline-no">&nbsp;</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-no">&nbsp;</span>
1141
+ <span class="cline-any cline-no">&nbsp;</span>
1142
+ <span class="cline-any cline-no">&nbsp;</span>
1143
+ <span class="cline-any cline-no">&nbsp;</span>
1144
+ <span class="cline-any cline-no">&nbsp;</span>
1145
+ <span class="cline-any cline-no">&nbsp;</span>
1146
+ <span class="cline-any cline-no">&nbsp;</span>
1147
+ <span class="cline-any cline-no">&nbsp;</span>
1148
+ <span class="cline-any cline-no">&nbsp;</span>
1149
+ <span class="cline-any cline-no">&nbsp;</span>
1150
+ <span class="cline-any cline-no">&nbsp;</span>
1151
+ <span class="cline-any cline-no">&nbsp;</span>
1152
+ <span class="cline-any cline-no">&nbsp;</span>
1153
+ <span class="cline-any cline-no">&nbsp;</span>
1154
+ <span class="cline-any cline-no">&nbsp;</span>
1155
+ <span class="cline-any cline-no">&nbsp;</span>
1156
+ <span class="cline-any cline-no">&nbsp;</span>
1157
+ <span class="cline-any cline-no">&nbsp;</span>
1158
+ <span class="cline-any cline-no">&nbsp;</span>
1159
+ <span class="cline-any cline-no">&nbsp;</span>
1160
+ <span class="cline-any cline-no">&nbsp;</span>
1161
+ <span class="cline-any cline-no">&nbsp;</span>
1162
+ <span class="cline-any cline-no">&nbsp;</span>
1163
+ <span class="cline-any cline-no">&nbsp;</span>
1164
+ <span class="cline-any cline-no">&nbsp;</span>
1165
+ <span class="cline-any cline-no">&nbsp;</span>
1166
+ <span class="cline-any cline-no">&nbsp;</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-no">&nbsp;</span>
1170
+ <span class="cline-any cline-no">&nbsp;</span>
1171
+ <span class="cline-any cline-no">&nbsp;</span>
1172
+ <span class="cline-any cline-no">&nbsp;</span>
1173
+ <span class="cline-any cline-no">&nbsp;</span>
1174
+ <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-no">&nbsp;</span>
1176
+ <span class="cline-any cline-no">&nbsp;</span>
1177
+ <span class="cline-any cline-no">&nbsp;</span>
1178
+ <span class="cline-any cline-no">&nbsp;</span>
1179
+ <span class="cline-any cline-no">&nbsp;</span>
1180
+ <span class="cline-any cline-no">&nbsp;</span>
1181
+ <span class="cline-any cline-no">&nbsp;</span>
1182
+ <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-no">&nbsp;</span>
1184
+ <span class="cline-any cline-no">&nbsp;</span>
1185
+ <span class="cline-any cline-no">&nbsp;</span>
1186
+ <span class="cline-any cline-no">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-no">&nbsp;</span>
1189
+ <span class="cline-any cline-no">&nbsp;</span>
1190
+ <span class="cline-any cline-no">&nbsp;</span>
1191
+ <span class="cline-any cline-no">&nbsp;</span>
1192
+ <span class="cline-any cline-no">&nbsp;</span>
1193
+ <span class="cline-any cline-no">&nbsp;</span>
1194
+ <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-no">&nbsp;</span>
1196
+ <span class="cline-any cline-no">&nbsp;</span>
1197
+ <span class="cline-any cline-no">&nbsp;</span>
1198
+ <span class="cline-any cline-no">&nbsp;</span>
1199
+ <span class="cline-any cline-no">&nbsp;</span>
1200
+ <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1203
+ <span class="cline-any cline-no">&nbsp;</span>
1204
+ <span class="cline-any cline-no">&nbsp;</span>
1205
+ <span class="cline-any cline-no">&nbsp;</span>
1206
+ <span class="cline-any cline-no">&nbsp;</span>
1207
+ <span class="cline-any cline-no">&nbsp;</span>
1208
+ <span class="cline-any cline-no">&nbsp;</span>
1209
+ <span class="cline-any cline-no">&nbsp;</span>
1210
+ <span class="cline-any cline-no">&nbsp;</span>
1211
+ <span class="cline-any cline-no">&nbsp;</span>
1212
+ <span class="cline-any cline-no">&nbsp;</span>
1213
+ <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-no">&nbsp;</span>
1215
+ <span class="cline-any cline-no">&nbsp;</span>
1216
+ <span class="cline-any cline-no">&nbsp;</span>
1217
+ <span class="cline-any cline-no">&nbsp;</span>
1218
+ <span class="cline-any cline-no">&nbsp;</span>
1219
+ <span class="cline-any cline-no">&nbsp;</span>
1220
+ <span class="cline-any cline-no">&nbsp;</span>
1221
+ <span class="cline-any cline-no">&nbsp;</span>
1222
+ <span class="cline-any cline-no">&nbsp;</span>
1223
+ <span class="cline-any cline-no">&nbsp;</span>
1224
+ <span class="cline-any cline-no">&nbsp;</span>
1225
+ <span class="cline-any cline-no">&nbsp;</span>
1226
+ <span class="cline-any cline-no">&nbsp;</span>
1227
+ <span class="cline-any cline-no">&nbsp;</span>
1228
+ <span class="cline-any cline-no">&nbsp;</span>
1229
+ <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-no">&nbsp;</span>
1231
+ <span class="cline-any cline-no">&nbsp;</span>
1232
+ <span class="cline-any cline-no">&nbsp;</span>
1233
+ <span class="cline-any cline-no">&nbsp;</span>
1234
+ <span class="cline-any cline-no">&nbsp;</span>
1235
+ <span class="cline-any cline-no">&nbsp;</span>
1236
+ <span class="cline-any cline-no">&nbsp;</span>
1237
+ <span class="cline-any cline-no">&nbsp;</span>
1238
+ <span class="cline-any cline-no">&nbsp;</span>
1239
+ <span class="cline-any cline-no">&nbsp;</span>
1240
+ <span class="cline-any cline-no">&nbsp;</span>
1241
+ <span class="cline-any cline-no">&nbsp;</span>
1242
+ <span class="cline-any cline-no">&nbsp;</span>
1243
+ <span class="cline-any cline-no">&nbsp;</span>
1244
+ <span class="cline-any cline-no">&nbsp;</span>
1245
+ <span class="cline-any cline-no">&nbsp;</span>
1246
+ <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-no">&nbsp;</span>
1248
+ <span class="cline-any cline-no">&nbsp;</span>
1249
+ <span class="cline-any cline-no">&nbsp;</span>
1250
+ <span class="cline-any cline-no">&nbsp;</span>
1251
+ <span class="cline-any cline-no">&nbsp;</span>
1252
+ <span class="cline-any cline-no">&nbsp;</span>
1253
+ <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-no">&nbsp;</span>
1255
+ <span class="cline-any cline-no">&nbsp;</span>
1256
+ <span class="cline-any cline-no">&nbsp;</span>
1257
+ <span class="cline-any cline-no">&nbsp;</span>
1258
+ <span class="cline-any cline-no">&nbsp;</span>
1259
+ <span class="cline-any cline-no">&nbsp;</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-no">&nbsp;</span>
1262
+ <span class="cline-any cline-no">&nbsp;</span>
1263
+ <span class="cline-any cline-no">&nbsp;</span>
1264
+ <span class="cline-any cline-no">&nbsp;</span>
1265
+ <span class="cline-any cline-no">&nbsp;</span>
1266
+ <span class="cline-any cline-no">&nbsp;</span>
1267
+ <span class="cline-any cline-no">&nbsp;</span>
1268
+ <span class="cline-any cline-no">&nbsp;</span>
1269
+ <span class="cline-any cline-no">&nbsp;</span>
1270
+ <span class="cline-any cline-no">&nbsp;</span>
1271
+ <span class="cline-any cline-no">&nbsp;</span>
1272
+ <span class="cline-any cline-no">&nbsp;</span>
1273
+ <span class="cline-any cline-no">&nbsp;</span>
1274
+ <span class="cline-any cline-no">&nbsp;</span>
1275
+ <span class="cline-any cline-no">&nbsp;</span>
1276
+ <span class="cline-any cline-no">&nbsp;</span>
1277
+ <span class="cline-any cline-no">&nbsp;</span>
1278
+ <span class="cline-any cline-no">&nbsp;</span>
1279
+ <span class="cline-any cline-no">&nbsp;</span>
1280
+ <span class="cline-any cline-no">&nbsp;</span>
1281
+ <span class="cline-any cline-no">&nbsp;</span>
1282
+ <span class="cline-any cline-no">&nbsp;</span>
1283
+ <span class="cline-any cline-no">&nbsp;</span>
1284
+ <span class="cline-any cline-no">&nbsp;</span>
1285
+ <span class="cline-any cline-no">&nbsp;</span>
1286
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
1287
+ <span class="cstat-no" title="statement not covered" > * HSuite Native Connect</span>
1288
+ <span class="cstat-no" title="statement not covered" > * Copyright 2024-2025 HSuite (https://hsuite.finance)</span>
1289
+ <span class="cstat-no" title="statement not covered" > *</span>
1290
+ <span class="cstat-no" title="statement not covered" > * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0</span>
1291
+ <span class="cstat-no" title="statement not covered" > *</span>
1292
+ <span class="cstat-no" title="statement not covered" > * This file is part of HSuite Native Connect. For commercial licensing,</span>
1293
+ <span class="cstat-no" title="statement not covered" > * visit https://hsuite.finance/licensing</span>
1294
+ <span class="cstat-no" title="statement not covered" > */</span>
1295
+ <span class="cstat-no" title="statement not covered" ></span>
1296
+ <span class="cstat-no" title="statement not covered" >/**</span>
1297
+ <span class="cstat-no" title="statement not covered" > * @file hedera-signer.ts</span>
1298
+ <span class="cstat-no" title="statement not covered" > * @description Hedera-specific WalletConnect signer implementation</span>
1299
+ <span class="cstat-no" title="statement not covered" > *</span>
1300
+ <span class="cstat-no" title="statement not covered" > * Implements the IWalletConnectSigner interface for Hedera ledger.</span>
1301
+ <span class="cstat-no" title="statement not covered" > * Handles Hedera-specific JSON-RPC methods and transaction formats.</span>
1302
+ <span class="cstat-no" title="statement not covered" > */</span>
1303
+ <span class="cstat-no" title="statement not covered" ></span>
1304
+ <span class="cstat-no" title="statement not covered" >import { getLogger } from '@hsuite/native-connect-sdk';</span>
1305
+ <span class="cstat-no" title="statement not covered" ></span>
1306
+ <span class="cstat-no" title="statement not covered" >import type { SignResult, SubmitResult } from '../../base-wallet-provider';</span>
1307
+ <span class="cstat-no" title="statement not covered" >import type { IWalletConnectSigner, SignerOperationParams } from '../core/base-signer.interface';</span>
1308
+ <span class="cstat-no" title="statement not covered" ></span>
1309
+ <span class="cstat-no" title="statement not covered" >const logger = getLogger().scoped?.('HederaSigner') ?? getLogger();</span>
1310
+ <span class="cstat-no" title="statement not covered" ></span>
1311
+ <span class="cstat-no" title="statement not covered" >/**</span>
1312
+ <span class="cstat-no" title="statement not covered" > * Extract a meaningful error message from various error shapes.</span>
1313
+ <span class="cstat-no" title="statement not covered" > * WalletConnect SDK throws errors that are not standard Error instances.</span>
1314
+ <span class="cstat-no" title="statement not covered" > *</span>
1315
+ <span class="cstat-no" title="statement not covered" > * Handles:</span>
1316
+ <span class="cstat-no" title="statement not covered" > * - Standard Error objects</span>
1317
+ <span class="cstat-no" title="statement not covered" > * - WalletConnect SDK errors: { code, message }</span>
1318
+ <span class="cstat-no" title="statement not covered" > * - Nested errors: { error: { message } }</span>
1319
+ <span class="cstat-no" title="statement not covered" > * - PIN_REQUIRED errors from wallet</span>
1320
+ <span class="cstat-no" title="statement not covered" > * - DOMException objects</span>
1321
+ <span class="cstat-no" title="statement not covered" > * - Objects that stringify to {} (enumerable property check)</span>
1322
+ <span class="cstat-no" title="statement not covered" > *</span>
1323
+ <span class="cstat-no" title="statement not covered" > * @param error - Error from WalletConnect SDK (can be Error, object, or string)</span>
1324
+ <span class="cstat-no" title="statement not covered" > * @returns Human-readable error message</span>
1325
+ <span class="cstat-no" title="statement not covered" > */</span>
1326
+ <span class="cstat-no" title="statement not covered" >function extractErrorMessage(error: unknown): string {</span>
1327
+ <span class="cstat-no" title="statement not covered" > // Log the raw error for debugging</span>
1328
+ <span class="cstat-no" title="statement not covered" > logger.debug('Extracting error message', {</span>
1329
+ <span class="cstat-no" title="statement not covered" > errorType: typeof error,</span>
1330
+ <span class="cstat-no" title="statement not covered" > isError: error instanceof Error,</span>
1331
+ <span class="cstat-no" title="statement not covered" > constructorName: error?.constructor?.name,</span>
1332
+ <span class="cstat-no" title="statement not covered" > protoName: Object.getPrototypeOf(error)?.constructor?.name,</span>
1333
+ <span class="cstat-no" title="statement not covered" > });</span>
1334
+ <span class="cstat-no" title="statement not covered" ></span>
1335
+ <span class="cstat-no" title="statement not covered" > if (error instanceof Error) {</span>
1336
+ <span class="cstat-no" title="statement not covered" > return error.message;</span>
1337
+ <span class="cstat-no" title="statement not covered" > }</span>
1338
+ <span class="cstat-no" title="statement not covered" ></span>
1339
+ <span class="cstat-no" title="statement not covered" > if (typeof error === 'object' &amp;&amp; error !== null) {</span>
1340
1340
  <span class="cstat-no" title="statement not covered" > const errorObj = error as Record&lt;string, unknown&gt;;</span>
1341
1341
  <span class="cstat-no" title="statement not covered" ></span>
1342
1342
  <span class="cstat-no" title="statement not covered" > // Try to get all properties including non-enumerable and from prototype</span>
@@ -1503,218 +1503,218 @@ function extractErrorMessage(error: unknown): string {
1503
1503
  <span class="cstat-no" title="statement not covered" ></span>
1504
1504
  <span class="cstat-no" title="statement not covered" > return 'Unknown error';</span>
1505
1505
  <span class="cstat-no" title="statement not covered" >}</span>
1506
- &nbsp;
1507
- /**
1508
- * Signer implementation for Hedera ledger.
1509
- *
1510
- * Supports Hedera-specific WalletConnect methods:
1511
- * - hedera_signTransaction (sign-only, returns signature map)
1512
- * - hedera_signAndExecuteTransaction (sign + submit, returns transaction ID)
1513
- * - hedera_executeTransaction
1514
- * - hedera_signMessage (arbitrary message signing)
1515
- *
1516
- * Uses HIP-30 account format: hedera:&lt;network&gt;:&lt;accountId&gt;
1517
- */
1518
- export class HederaSigner implements IWalletConnectSigner {
1519
- readonly ledgerId = 'hedera';
1520
- &nbsp;
1521
- /**
1522
- * Build Hedera namespace configuration for WalletConnect.
1523
- * Defines the JSON-RPC methods and chains this signer supports.
1524
- *
1525
- * IMPORTANT: We request ALL Hedera networks (testnet, mainnet)
1526
- * to ensure wallets like Kabila can show accounts from unknown network.
1527
- * The wallet will return all accounts it has across all networks.
1528
- *
1529
- * @param networkId - Network identifier (e.g., 'hedera:testnet', 'hedera:mainnet')
1530
- * @param _networkId
1531
- * @returns Namespace configuration object
1532
- */
1533
- buildNamespace(_networkId: string): {
1534
- methods: string[];
1535
- chains: string[];
1536
- events: string[];
1537
- } {
1538
- // Request ALL Hedera networks to allow wallets to show all their accounts
1539
- // Wallets like Kabila may have accounts on multiple networks
1540
- &nbsp;
1541
- return {
1542
- methods: [
1543
- 'hedera_signTransaction',
1544
- 'hedera_signAndExecuteTransaction',
1545
- 'hedera_executeTransaction',
1546
- 'hedera_signMessage',
1547
- ],
1548
- // Request all Hedera networks so wallet can show all accounts
1549
- chains: ['hedera:testnet', 'hedera:mainnet'],
1550
- events: ['chainChanged', 'accountsChanged'],
1551
- };
1552
- }
1553
- &nbsp;
1554
- /**
1555
- * Sign a Hedera transaction without submitting to network.
1556
- * Uses hedera_signTransaction method with TransactionList format.
1557
- *
1558
- * The payload comes as TransactionList (base64 frozen transaction bytes).
1559
- * We send the full TransactionList to preserve canonical bytes for signing.
1560
- * The wallet will sign and return the signature map without executing.
1561
- *
1562
- * @param params - Signing parameters (payload is TransactionList base64)
1563
- * @returns Promise resolving to signed transaction with signature map
1564
- */
1565
- async signTransaction(params: SignerOperationParams): Promise&lt;SignResult&gt; {
1566
- // Extract network name from networkId (mainnet or testnet)
1567
- const network = params.networkId.includes('mainnet') ? 'mainnet' : 'testnet';
1568
- &nbsp;
1569
- // Format account ID in HIP-30 format
1570
- const signerAccountId = `hedera:${network}:${params.accountAddress}`;
1571
- &nbsp;
1572
- try {
1573
- // Send the full TransactionList (frozen transaction bytes) to preserve canonical bytes.
1574
- // The wallet needs the complete transaction structure to sign correctly.
1575
- // Previously we converted to TransactionBody which caused INVALID_SIGNATURE errors
1576
- // because the signature was computed over different bytes than the network expected.
1577
- &nbsp;
1578
- // Use 5-minute expiry to give users time to review and approve
1579
- const result = await params.client.request({
1580
- topic: params.topic,
1581
- chainId: `hedera:${network}`,
1582
- request: {
1583
- method: 'hedera_signTransaction',
1584
- params: {
1585
- signerAccountId,
1586
- transactionList: params.payload, // Send full TransactionList for correct signing
1587
- },
1588
- },
1589
- expiry: 300, // 5 minutes in seconds
1590
- });
1591
- &nbsp;
1592
- return {
1593
- signedPayload: String(
1594
- (result as { signatureMap?: any }).<span class="branch-0 cbranch-no" title="branch not covered" >signatureMap ||</span>
1595
- <span class="cstat-no" title="statement not covered" > (result as { signedTransaction?: any }).<span class="branch-0 cbranch-no" title="branch not covered" >signedTransaction ||</span></span>
1506
+ <span class="cstat-no" title="statement not covered" ></span>
1507
+ <span class="cstat-no" title="statement not covered" >/**</span>
1508
+ <span class="cstat-no" title="statement not covered" > * Signer implementation for Hedera ledger.</span>
1509
+ <span class="cstat-no" title="statement not covered" > *</span>
1510
+ <span class="cstat-no" title="statement not covered" > * Supports Hedera-specific WalletConnect methods:</span>
1511
+ <span class="cstat-no" title="statement not covered" > * - hedera_signTransaction (sign-only, returns signature map)</span>
1512
+ <span class="cstat-no" title="statement not covered" > * - hedera_signAndExecuteTransaction (sign + submit, returns transaction ID)</span>
1513
+ <span class="cstat-no" title="statement not covered" > * - hedera_executeTransaction</span>
1514
+ <span class="cstat-no" title="statement not covered" > * - hedera_signMessage (arbitrary message signing)</span>
1515
+ <span class="cstat-no" title="statement not covered" > *</span>
1516
+ <span class="cstat-no" title="statement not covered" > * Uses HIP-30 account format: hedera:&lt;network&gt;:&lt;accountId&gt;</span>
1517
+ <span class="cstat-no" title="statement not covered" > */</span>
1518
+ <span class="cstat-no" title="statement not covered" >export class HederaSigner implements IWalletConnectSigner {</span>
1519
+ <span class="cstat-no" title="statement not covered" > readonly ledgerId = 'hedera';</span>
1520
+ <span class="cstat-no" title="statement not covered" ></span>
1521
+ <span class="cstat-no" title="statement not covered" > /**</span>
1522
+ <span class="cstat-no" title="statement not covered" > * Build Hedera namespace configuration for WalletConnect.</span>
1523
+ <span class="cstat-no" title="statement not covered" > * Defines the JSON-RPC methods and chains this signer supports.</span>
1524
+ <span class="cstat-no" title="statement not covered" > *</span>
1525
+ <span class="cstat-no" title="statement not covered" > * IMPORTANT: We request ALL Hedera networks (testnet, mainnet)</span>
1526
+ <span class="cstat-no" title="statement not covered" > * to ensure wallets like Kabila can show accounts from unknown network.</span>
1527
+ <span class="cstat-no" title="statement not covered" > * The wallet will return all accounts it has across all networks.</span>
1528
+ <span class="cstat-no" title="statement not covered" > *</span>
1529
+ <span class="cstat-no" title="statement not covered" > * @param networkId - Network identifier (e.g., 'hedera:testnet', 'hedera:mainnet')</span>
1530
+ <span class="cstat-no" title="statement not covered" > * @param _networkId</span>
1531
+ <span class="cstat-no" title="statement not covered" > * @returns Namespace configuration object</span>
1532
+ <span class="cstat-no" title="statement not covered" > */</span>
1533
+ <span class="cstat-no" title="statement not covered" > buildNamespace(_networkId: string): {</span>
1534
+ <span class="cstat-no" title="statement not covered" > methods: string[];</span>
1535
+ <span class="cstat-no" title="statement not covered" > chains: string[];</span>
1536
+ <span class="cstat-no" title="statement not covered" > events: string[];</span>
1537
+ <span class="cstat-no" title="statement not covered" > } {</span>
1538
+ <span class="cstat-no" title="statement not covered" > // Request ALL Hedera networks to allow wallets to show all their accounts</span>
1539
+ <span class="cstat-no" title="statement not covered" > // Wallets like Kabila may have accounts on multiple networks</span>
1540
+ <span class="cstat-no" title="statement not covered" ></span>
1541
+ <span class="cstat-no" title="statement not covered" > return {</span>
1542
+ <span class="cstat-no" title="statement not covered" > methods: [</span>
1543
+ <span class="cstat-no" title="statement not covered" > 'hedera_signTransaction',</span>
1544
+ <span class="cstat-no" title="statement not covered" > 'hedera_signAndExecuteTransaction',</span>
1545
+ <span class="cstat-no" title="statement not covered" > 'hedera_executeTransaction',</span>
1546
+ <span class="cstat-no" title="statement not covered" > 'hedera_signMessage',</span>
1547
+ <span class="cstat-no" title="statement not covered" > ],</span>
1548
+ <span class="cstat-no" title="statement not covered" > // Request all Hedera networks so wallet can show all accounts</span>
1549
+ <span class="cstat-no" title="statement not covered" > chains: ['hedera:testnet', 'hedera:mainnet'],</span>
1550
+ <span class="cstat-no" title="statement not covered" > events: ['chainChanged', 'accountsChanged'],</span>
1551
+ <span class="cstat-no" title="statement not covered" > };</span>
1552
+ <span class="cstat-no" title="statement not covered" > }</span>
1553
+ <span class="cstat-no" title="statement not covered" ></span>
1554
+ <span class="cstat-no" title="statement not covered" > /**</span>
1555
+ <span class="cstat-no" title="statement not covered" > * Sign a Hedera transaction without submitting to network.</span>
1556
+ <span class="cstat-no" title="statement not covered" > * Uses hedera_signTransaction method with TransactionList format.</span>
1557
+ <span class="cstat-no" title="statement not covered" > *</span>
1558
+ <span class="cstat-no" title="statement not covered" > * The payload comes as TransactionList (base64 frozen transaction bytes).</span>
1559
+ <span class="cstat-no" title="statement not covered" > * We send the full TransactionList to preserve canonical bytes for signing.</span>
1560
+ <span class="cstat-no" title="statement not covered" > * The wallet will sign and return the signature map without executing.</span>
1561
+ <span class="cstat-no" title="statement not covered" > *</span>
1562
+ <span class="cstat-no" title="statement not covered" > * @param params - Signing parameters (payload is TransactionList base64)</span>
1563
+ <span class="cstat-no" title="statement not covered" > * @returns Promise resolving to signed transaction with signature map</span>
1564
+ <span class="cstat-no" title="statement not covered" > */</span>
1565
+ <span class="cstat-no" title="statement not covered" > async signTransaction(params: SignerOperationParams): Promise&lt;SignResult&gt; {</span>
1566
+ <span class="cstat-no" title="statement not covered" > // Extract network name from networkId (mainnet or testnet)</span>
1567
+ <span class="cstat-no" title="statement not covered" > const network = params.networkId.includes('mainnet') ? 'mainnet' : 'testnet';</span>
1568
+ <span class="cstat-no" title="statement not covered" ></span>
1569
+ <span class="cstat-no" title="statement not covered" > // Format account ID in HIP-30 format</span>
1570
+ <span class="cstat-no" title="statement not covered" > const signerAccountId = `hedera:${network}:${params.accountAddress}`;</span>
1571
+ <span class="cstat-no" title="statement not covered" ></span>
1572
+ <span class="cstat-no" title="statement not covered" > try {</span>
1573
+ <span class="cstat-no" title="statement not covered" > // Send the full TransactionList (frozen transaction bytes) to preserve canonical bytes.</span>
1574
+ <span class="cstat-no" title="statement not covered" > // The wallet needs the complete transaction structure to sign correctly.</span>
1575
+ <span class="cstat-no" title="statement not covered" > // Previously we converted to TransactionBody which caused INVALID_SIGNATURE errors</span>
1576
+ <span class="cstat-no" title="statement not covered" > // because the signature was computed over different bytes than the network expected.</span>
1577
+ <span class="cstat-no" title="statement not covered" ></span>
1578
+ <span class="cstat-no" title="statement not covered" > // Use 5-minute expiry to give users time to review and approve</span>
1579
+ <span class="cstat-no" title="statement not covered" > const result = await params.client.request({</span>
1580
+ <span class="cstat-no" title="statement not covered" > topic: params.topic,</span>
1581
+ <span class="cstat-no" title="statement not covered" > chainId: `hedera:${network}`,</span>
1582
+ <span class="cstat-no" title="statement not covered" > request: {</span>
1583
+ <span class="cstat-no" title="statement not covered" > method: 'hedera_signTransaction',</span>
1584
+ <span class="cstat-no" title="statement not covered" > params: {</span>
1585
+ <span class="cstat-no" title="statement not covered" > signerAccountId,</span>
1586
+ <span class="cstat-no" title="statement not covered" > transactionList: params.payload, // Send full TransactionList for correct signing</span>
1587
+ <span class="cstat-no" title="statement not covered" > },</span>
1588
+ <span class="cstat-no" title="statement not covered" > },</span>
1589
+ <span class="cstat-no" title="statement not covered" > expiry: 300, // 5 minutes in seconds</span>
1590
+ <span class="cstat-no" title="statement not covered" > });</span>
1591
+ <span class="cstat-no" title="statement not covered" ></span>
1592
+ <span class="cstat-no" title="statement not covered" > return {</span>
1593
+ <span class="cstat-no" title="statement not covered" > signedPayload: String(</span>
1594
+ <span class="cstat-no" title="statement not covered" > (result as { signatureMap?: any }).signatureMap ||</span>
1595
+ <span class="cstat-no" title="statement not covered" > (result as { signedTransaction?: any }).signedTransaction ||</span>
1596
1596
  <span class="cstat-no" title="statement not covered" > JSON.stringify(result),</span>
1597
- ),
1598
- metadata: { result },
1599
- };
1600
- } catch (error) {
1601
- // Check if this is an empty error object (WalletConnect SDK bug)
1602
- const isEmptyError =
1603
- typeof error === 'object' &amp;&amp;
1604
- error !== null &amp;&amp;
1605
- Object.keys(error).length === 0 &amp;&amp;
1606
- !(error instanceof Error);
1607
- &nbsp;
1608
- if (isEmptyError) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1597
+ <span class="cstat-no" title="statement not covered" > ),</span>
1598
+ <span class="cstat-no" title="statement not covered" > metadata: { result },</span>
1599
+ <span class="cstat-no" title="statement not covered" > };</span>
1600
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1601
+ <span class="cstat-no" title="statement not covered" > // Check if this is an empty error object (WalletConnect SDK bug)</span>
1602
+ <span class="cstat-no" title="statement not covered" > const isEmptyError =</span>
1603
+ <span class="cstat-no" title="statement not covered" > typeof error === 'object' &amp;&amp;</span>
1604
+ <span class="cstat-no" title="statement not covered" > error !== null &amp;&amp;</span>
1605
+ <span class="cstat-no" title="statement not covered" > Object.keys(error).length === 0 &amp;&amp;</span>
1606
+ <span class="cstat-no" title="statement not covered" > !(error instanceof Error);</span>
1607
+ <span class="cstat-no" title="statement not covered" ></span>
1608
+ <span class="cstat-no" title="statement not covered" > if (isEmptyError) {</span>
1609
1609
  <span class="cstat-no" title="statement not covered" > logger.warn('WalletConnect SDK empty error - relay subscription may have been stale', {</span>
1610
1610
  <span class="cstat-no" title="statement not covered" > topic: params.topic?.substring(0, 16) + '...',</span>
1611
1611
  <span class="cstat-no" title="statement not covered" > });</span>
1612
1612
  <span class="cstat-no" title="statement not covered" > throw new Error('WalletConnect connection issue - please try again');</span>
1613
1613
  <span class="cstat-no" title="statement not covered" > }</span>
1614
- &nbsp;
1615
- const errorMsg = extractErrorMessage(error);
1616
- logger.error('Sign failed', { error: errorMsg });
1617
- throw new Error(`Hedera sign failed: ${errorMsg}`);
1618
- }
1619
- }
1620
- &nbsp;
1621
- /**
1622
- * Sign and submit a Hedera transaction to the network.
1623
- * Uses hedera_signAndExecuteTransaction method with TransactionList format.
1624
- *
1625
- * @param params - Submission parameters
1626
- * @returns Promise resolving to transaction ID and metadata
1627
- */
1628
- async submitTransaction(params: SignerOperationParams): Promise&lt;SubmitResult&gt; {
1629
- // Extract network name from networkId (mainnet or testnet)
1630
- const network = params.networkId.includes('mainnet'<span class="branch-0 cbranch-no" title="branch not covered" >) ? 'mainnet' : '</span>testnet';
1631
- &nbsp;
1632
- // Format account ID in HIP-30 format
1633
- const signerAccountId = `hedera:${network}:${params.accountAddress}`;
1634
- &nbsp;
1635
- logger.debug('Sending hedera_signAndExecuteTransaction request', {
1636
- topic: params.topic?.substring(0, 16) + '...',
1637
- chainId: `hedera:${network}`,
1638
- signerAccountId,
1639
- payloadLength: params.payload?.length,
1640
- });
1641
- &nbsp;
1642
- // Create the request promise - keep-alive pings are handled by WalletConnectClientManager
1643
- const requestPromise = params.client.request({
1644
- topic: params.topic,
1645
- chainId: `hedera:${network}`,
1646
- request: {
1647
- method: 'hedera_signAndExecuteTransaction',
1648
- params: {
1649
- signerAccountId,
1650
- transactionList: params.payload, // TransactionList protobuf (base64)
1651
- },
1652
- },
1653
- expiry: 300, // 5 minutes in seconds
1654
- });
1655
- &nbsp;
1656
- // Create a 5-minute timeout to override any internal SDK timeouts
1657
- const timeoutPromise = new Promise&lt;never&gt;((_, reject) =&gt; {
1658
- setTimeout(
1659
- () =&gt; {
1614
+ <span class="cstat-no" title="statement not covered" ></span>
1615
+ <span class="cstat-no" title="statement not covered" > const errorMsg = extractErrorMessage(error);</span>
1616
+ <span class="cstat-no" title="statement not covered" > logger.error('Sign failed', { error: errorMsg });</span>
1617
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Hedera sign failed: ${errorMsg}`);</span>
1618
+ <span class="cstat-no" title="statement not covered" > }</span>
1619
+ <span class="cstat-no" title="statement not covered" > }</span>
1620
+ <span class="cstat-no" title="statement not covered" ></span>
1621
+ <span class="cstat-no" title="statement not covered" > /**</span>
1622
+ <span class="cstat-no" title="statement not covered" > * Sign and submit a Hedera transaction to the network.</span>
1623
+ <span class="cstat-no" title="statement not covered" > * Uses hedera_signAndExecuteTransaction method with TransactionList format.</span>
1624
+ <span class="cstat-no" title="statement not covered" > *</span>
1625
+ <span class="cstat-no" title="statement not covered" > * @param params - Submission parameters</span>
1626
+ <span class="cstat-no" title="statement not covered" > * @returns Promise resolving to transaction ID and metadata</span>
1627
+ <span class="cstat-no" title="statement not covered" > */</span>
1628
+ <span class="cstat-no" title="statement not covered" > async submitTransaction(params: SignerOperationParams): Promise&lt;SubmitResult&gt; {</span>
1629
+ <span class="cstat-no" title="statement not covered" > // Extract network name from networkId (mainnet or testnet)</span>
1630
+ <span class="cstat-no" title="statement not covered" > const network = params.networkId.includes('mainnet') ? 'mainnet' : 'testnet';</span>
1631
+ <span class="cstat-no" title="statement not covered" ></span>
1632
+ <span class="cstat-no" title="statement not covered" > // Format account ID in HIP-30 format</span>
1633
+ <span class="cstat-no" title="statement not covered" > const signerAccountId = `hedera:${network}:${params.accountAddress}`;</span>
1634
+ <span class="cstat-no" title="statement not covered" ></span>
1635
+ <span class="cstat-no" title="statement not covered" > logger.debug('Sending hedera_signAndExecuteTransaction request', {</span>
1636
+ <span class="cstat-no" title="statement not covered" > topic: params.topic?.substring(0, 16) + '...',</span>
1637
+ <span class="cstat-no" title="statement not covered" > chainId: `hedera:${network}`,</span>
1638
+ <span class="cstat-no" title="statement not covered" > signerAccountId,</span>
1639
+ <span class="cstat-no" title="statement not covered" > payloadLength: params.payload?.length,</span>
1640
+ <span class="cstat-no" title="statement not covered" > });</span>
1641
+ <span class="cstat-no" title="statement not covered" ></span>
1642
+ <span class="cstat-no" title="statement not covered" > // Create the request promise - keep-alive pings are handled by WalletConnectClientManager</span>
1643
+ <span class="cstat-no" title="statement not covered" > const requestPromise = params.client.request({</span>
1644
+ <span class="cstat-no" title="statement not covered" > topic: params.topic,</span>
1645
+ <span class="cstat-no" title="statement not covered" > chainId: `hedera:${network}`,</span>
1646
+ <span class="cstat-no" title="statement not covered" > request: {</span>
1647
+ <span class="cstat-no" title="statement not covered" > method: 'hedera_signAndExecuteTransaction',</span>
1648
+ <span class="cstat-no" title="statement not covered" > params: {</span>
1649
+ <span class="cstat-no" title="statement not covered" > signerAccountId,</span>
1650
+ <span class="cstat-no" title="statement not covered" > transactionList: params.payload, // TransactionList protobuf (base64)</span>
1651
+ <span class="cstat-no" title="statement not covered" > },</span>
1652
+ <span class="cstat-no" title="statement not covered" > },</span>
1653
+ <span class="cstat-no" title="statement not covered" > expiry: 300, // 5 minutes in seconds</span>
1654
+ <span class="cstat-no" title="statement not covered" > });</span>
1655
+ <span class="cstat-no" title="statement not covered" ></span>
1656
+ <span class="cstat-no" title="statement not covered" > // Create a 5-minute timeout to override any internal SDK timeouts</span>
1657
+ <span class="cstat-no" title="statement not covered" > const timeoutPromise = new Promise&lt;never&gt;((_, reject) =&gt; {</span>
1658
+ <span class="cstat-no" title="statement not covered" > setTimeout(</span>
1659
+ <span class="cstat-no" title="statement not covered" > () =&gt; {</span>
1660
1660
  <span class="cstat-no" title="statement not covered" > reject(new Error('Transaction approval timed out after 5 minutes'));</span>
1661
1661
  <span class="cstat-no" title="statement not covered" > },</span>
1662
- 5 * 60 * 1000,
1663
- ); // 5 minutes
1664
- });
1665
- &nbsp;
1666
- try {
1667
- // Race between the request and our timeout
1668
- const result = await Promise.race([requestPromise, timeoutPromise]);
1669
- &nbsp;
1670
- logger.debug('Received hedera_signAndExecuteTransaction response', {
1671
- hasResult: !!result,
1672
- resultKeys: result ? Object.keys(result as object<span class="branch-0 cbranch-no" title="branch not covered" >) : [],</span>
1673
- });
1674
- &nbsp;
1675
- return {
1676
- transactionId:
1677
- (result as { transactionId?: string }).<span class="branch-0 cbranch-no" title="branch not covered" >transactionId ||</span>
1678
- <span class="cstat-no" title="statement not covered" > (result as { response?: { transactionId?: string } }).response?.<span class="branch-0 cbranch-no" title="branch not covered" >transactionId ||</span></span>
1662
+ <span class="cstat-no" title="statement not covered" > 5 * 60 * 1000,</span>
1663
+ <span class="cstat-no" title="statement not covered" > ); // 5 minutes</span>
1664
+ <span class="cstat-no" title="statement not covered" > });</span>
1665
+ <span class="cstat-no" title="statement not covered" ></span>
1666
+ <span class="cstat-no" title="statement not covered" > try {</span>
1667
+ <span class="cstat-no" title="statement not covered" > // Race between the request and our timeout</span>
1668
+ <span class="cstat-no" title="statement not covered" > const result = await Promise.race([requestPromise, timeoutPromise]);</span>
1669
+ <span class="cstat-no" title="statement not covered" ></span>
1670
+ <span class="cstat-no" title="statement not covered" > logger.debug('Received hedera_signAndExecuteTransaction response', {</span>
1671
+ <span class="cstat-no" title="statement not covered" > hasResult: !!result,</span>
1672
+ <span class="cstat-no" title="statement not covered" > resultKeys: result ? Object.keys(result as object) : [],</span>
1673
+ <span class="cstat-no" title="statement not covered" > });</span>
1674
+ <span class="cstat-no" title="statement not covered" ></span>
1675
+ <span class="cstat-no" title="statement not covered" > return {</span>
1676
+ <span class="cstat-no" title="statement not covered" > transactionId:</span>
1677
+ <span class="cstat-no" title="statement not covered" > (result as { transactionId?: string }).transactionId ||</span>
1678
+ <span class="cstat-no" title="statement not covered" > (result as { response?: { transactionId?: string } }).response?.transactionId ||</span>
1679
1679
  <span class="cstat-no" title="statement not covered" > '',</span>
1680
- transactionHash: (result as { transactionHash?: string }).transactionHash,
1681
- metadata: { result },
1682
- };
1683
- } catch (error) {
1684
- // Log full error for debugging - try to get more info from WalletConnect error
1685
- const wcError = error as any;
1686
- &nbsp;
1687
- // Try to extract all available error info
1688
- const errorInfo = {
1689
- errorType: typeof error,
1690
- errorConstructor: error?.constructor?.name,
1691
- errorKeys: error &amp;&amp; typeof error === 'object' ? Object.keys(error<span class="branch-0 cbranch-no" title="branch not covered" >) : [],</span>
1692
- errorString: String(error),
1693
- // WalletConnect specific error properties
1694
- wcCode: wcError?.code,
1695
- wcMessage: wcError?.message,
1696
- wcContext: wcError?.context,
1697
- wcData: wcError?.data,
1698
- // Try Symbol properties
1699
- symbols:
1700
- error &amp;&amp; typeof error === 'object'
1701
- ? Object.getOwnPropertySymbols(error).map((s) =&gt; s.toString()<span class="branch-0 cbranch-no" title="branch not covered" >)</span>
1680
+ <span class="cstat-no" title="statement not covered" > transactionHash: (result as { transactionHash?: string }).transactionHash,</span>
1681
+ <span class="cstat-no" title="statement not covered" > metadata: { result },</span>
1682
+ <span class="cstat-no" title="statement not covered" > };</span>
1683
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1684
+ <span class="cstat-no" title="statement not covered" > // Log full error for debugging - try to get more info from WalletConnect error</span>
1685
+ <span class="cstat-no" title="statement not covered" > const wcError = error as any;</span>
1686
+ <span class="cstat-no" title="statement not covered" ></span>
1687
+ <span class="cstat-no" title="statement not covered" > // Try to extract all available error info</span>
1688
+ <span class="cstat-no" title="statement not covered" > const errorInfo = {</span>
1689
+ <span class="cstat-no" title="statement not covered" > errorType: typeof error,</span>
1690
+ <span class="cstat-no" title="statement not covered" > errorConstructor: error?.constructor?.name,</span>
1691
+ <span class="cstat-no" title="statement not covered" > errorKeys: error &amp;&amp; typeof error === 'object' ? Object.keys(error) : [],</span>
1692
+ <span class="cstat-no" title="statement not covered" > errorString: String(error),</span>
1693
+ <span class="cstat-no" title="statement not covered" > // WalletConnect specific error properties</span>
1694
+ <span class="cstat-no" title="statement not covered" > wcCode: wcError?.code,</span>
1695
+ <span class="cstat-no" title="statement not covered" > wcMessage: wcError?.message,</span>
1696
+ <span class="cstat-no" title="statement not covered" > wcContext: wcError?.context,</span>
1697
+ <span class="cstat-no" title="statement not covered" > wcData: wcError?.data,</span>
1698
+ <span class="cstat-no" title="statement not covered" > // Try Symbol properties</span>
1699
+ <span class="cstat-no" title="statement not covered" > symbols:</span>
1700
+ <span class="cstat-no" title="statement not covered" > error &amp;&amp; typeof error === 'object'</span>
1701
+ <span class="cstat-no" title="statement not covered" > ? Object.getOwnPropertySymbols(error).map((s) =&gt; s.toString())</span>
1702
1702
  <span class="cstat-no" title="statement not covered" > : [],</span>
1703
- // Get all own property names
1704
- ownProps: error &amp;&amp; typeof error === 'object' ? Object.getOwnPropertyNames(error<span class="branch-0 cbranch-no" title="branch not covered" >) : [],</span>
1705
- };
1706
- &nbsp;
1707
- logger.error('Submit failed - full error analysis', errorInfo);
1708
- &nbsp;
1709
- // Check if this is an empty error object (WalletConnect SDK bug)
1710
- // This typically happens when relay subscription is stale
1711
- const isEmptyError =
1712
- typeof error === 'object' &amp;&amp;
1713
- error !== null &amp;&amp;
1714
- Object.keys(error).length === 0 &amp;&amp;
1715
- !(error instanceof Error);
1716
- &nbsp;
1717
- if (isEmptyError) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1703
+ <span class="cstat-no" title="statement not covered" > // Get all own property names</span>
1704
+ <span class="cstat-no" title="statement not covered" > ownProps: error &amp;&amp; typeof error === 'object' ? Object.getOwnPropertyNames(error) : [],</span>
1705
+ <span class="cstat-no" title="statement not covered" > };</span>
1706
+ <span class="cstat-no" title="statement not covered" ></span>
1707
+ <span class="cstat-no" title="statement not covered" > logger.error('Submit failed - full error analysis', errorInfo);</span>
1708
+ <span class="cstat-no" title="statement not covered" ></span>
1709
+ <span class="cstat-no" title="statement not covered" > // Check if this is an empty error object (WalletConnect SDK bug)</span>
1710
+ <span class="cstat-no" title="statement not covered" > // This typically happens when relay subscription is stale</span>
1711
+ <span class="cstat-no" title="statement not covered" > const isEmptyError =</span>
1712
+ <span class="cstat-no" title="statement not covered" > typeof error === 'object' &amp;&amp;</span>
1713
+ <span class="cstat-no" title="statement not covered" > error !== null &amp;&amp;</span>
1714
+ <span class="cstat-no" title="statement not covered" > Object.keys(error).length === 0 &amp;&amp;</span>
1715
+ <span class="cstat-no" title="statement not covered" > !(error instanceof Error);</span>
1716
+ <span class="cstat-no" title="statement not covered" ></span>
1717
+ <span class="cstat-no" title="statement not covered" > if (isEmptyError) {</span>
1718
1718
  <span class="cstat-no" title="statement not covered" > // Empty error object is a known WalletConnect SDK issue</span>
1719
1719
  <span class="cstat-no" title="statement not covered" > // It usually means the relay subscription was stale</span>
1720
1720
  <span class="cstat-no" title="statement not covered" > // The SessionHealthManager should have pinged before the request,</span>
@@ -1730,34 +1730,34 @@ export class HederaSigner implements IWalletConnectSigner {
1730
1730
  <span class="cstat-no" title="statement not covered" > 'please check your transaction history as it may have been executed successfully.',</span>
1731
1731
  <span class="cstat-no" title="statement not covered" > );</span>
1732
1732
  <span class="cstat-no" title="statement not covered" > }</span>
1733
- &nbsp;
1734
- const errorMsg = extractErrorMessage(error);
1735
- logger.error('Submit failed', { error: errorMsg });
1736
- throw new Error(`Hedera submit failed: ${errorMsg}`);
1737
- }
1738
- }
1739
- &nbsp;
1740
- /**
1741
- * Sign and execute a transaction in one call (alias for submitTransaction).
1742
- * Uses hedera_signAndExecuteTransaction WalletConnect RPC method.
1743
- * This prevents double prompts by using the native WalletConnect method.
1744
- *
1745
- * @param params - Transaction parameters
1746
- * @returns Promise resolving to transaction ID and metadata
1747
- */
1748
- <span class="fstat-no" title="function not covered" > async signAndExecuteTransaction(params: SignerOperationParams): Promise&lt;SubmitResult&gt; {</span>
1733
+ <span class="cstat-no" title="statement not covered" ></span>
1734
+ <span class="cstat-no" title="statement not covered" > const errorMsg = extractErrorMessage(error);</span>
1735
+ <span class="cstat-no" title="statement not covered" > logger.error('Submit failed', { error: errorMsg });</span>
1736
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Hedera submit failed: ${errorMsg}`);</span>
1737
+ <span class="cstat-no" title="statement not covered" > }</span>
1738
+ <span class="cstat-no" title="statement not covered" > }</span>
1739
+ <span class="cstat-no" title="statement not covered" ></span>
1740
+ <span class="cstat-no" title="statement not covered" > /**</span>
1741
+ <span class="cstat-no" title="statement not covered" > * Sign and execute a transaction in one call (alias for submitTransaction).</span>
1742
+ <span class="cstat-no" title="statement not covered" > * Uses hedera_signAndExecuteTransaction WalletConnect RPC method.</span>
1743
+ <span class="cstat-no" title="statement not covered" > * This prevents double prompts by using the native WalletConnect method.</span>
1744
+ <span class="cstat-no" title="statement not covered" > *</span>
1745
+ <span class="cstat-no" title="statement not covered" > * @param params - Transaction parameters</span>
1746
+ <span class="cstat-no" title="statement not covered" > * @returns Promise resolving to transaction ID and metadata</span>
1747
+ <span class="cstat-no" title="statement not covered" > */</span>
1748
+ <span class="cstat-no" title="statement not covered" > async signAndExecuteTransaction(params: SignerOperationParams): Promise&lt;SubmitResult&gt; {</span>
1749
1749
  <span class="cstat-no" title="statement not covered" > // Simply delegate to submitTransaction which already uses hedera_signAndExecuteTransaction</span>
1750
1750
  <span class="cstat-no" title="statement not covered" > return this.submitTransaction(params);</span>
1751
1751
  <span class="cstat-no" title="statement not covered" > }</span>
1752
- &nbsp;
1753
- /**
1754
- * Sign an arbitrary message using hedera_signMessage method.
1755
- * Used for DAO votes, authentication proofs, and other non-transaction signing.
1756
- *
1757
- * @param params - Signing parameters with message string
1758
- * @returns Promise resolving to signature and metadata
1759
- */
1760
- <span class="fstat-no" title="function not covered" > async signMessage(</span>
1752
+ <span class="cstat-no" title="statement not covered" ></span>
1753
+ <span class="cstat-no" title="statement not covered" > /**</span>
1754
+ <span class="cstat-no" title="statement not covered" > * Sign an arbitrary message using hedera_signMessage method.</span>
1755
+ <span class="cstat-no" title="statement not covered" > * Used for DAO votes, authentication proofs, and other non-transaction signing.</span>
1756
+ <span class="cstat-no" title="statement not covered" > *</span>
1757
+ <span class="cstat-no" title="statement not covered" > * @param params - Signing parameters with message string</span>
1758
+ <span class="cstat-no" title="statement not covered" > * @returns Promise resolving to signature and metadata</span>
1759
+ <span class="cstat-no" title="statement not covered" > */</span>
1760
+ <span class="cstat-no" title="statement not covered" > async signMessage(</span>
1761
1761
  <span class="cstat-no" title="statement not covered" > params: SignerOperationParams &amp; { message: string; encoding?: 'utf-8' | 'base64' },</span>
1762
1762
  <span class="cstat-no" title="statement not covered" > ): Promise&lt;import('../../base-wallet-provider').SignMessageResult&gt; {</span>
1763
1763
  <span class="cstat-no" title="statement not covered" > // Extract network name from networkId (mainnet or testnet)</span>
@@ -1810,89 +1810,89 @@ export class HederaSigner implements IWalletConnectSigner {
1810
1810
  <span class="cstat-no" title="statement not covered" > throw new Error(`Hedera sign message failed: ${errorMsg}`);</span>
1811
1811
  <span class="cstat-no" title="statement not covered" > }</span>
1812
1812
  <span class="cstat-no" title="statement not covered" > }</span>
1813
- &nbsp;
1814
- /**
1815
- * Parse accounts from Hedera namespace in WalletConnect session.
1816
- * Extracts account IDs from HIP-30 format: hedera:&lt;network&gt;:&lt;accountId&gt;
1817
- *
1818
- * Optionally filters accounts to only include those matching a target network.
1819
- * This is important for respecting the user's network selection in the dApp,
1820
- * since wallets may return accounts from multiple networks.
1821
- *
1822
- * @param namespace - Hedera namespace object from session
1823
- * @param targetNetworkId - Optional network ID to filter accounts (e.g., 'hedera:mainnet')
1824
- * @returns Array of parsed account objects, filtered by target network if specified
1825
- */
1826
- parseAccounts(
1827
- namespace: any,
1828
- targetNetworkId?: string,
1829
- ): Array&lt;{ address: string; chainId: string }&gt; {
1830
- if (!namespace) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1813
+ <span class="cstat-no" title="statement not covered" ></span>
1814
+ <span class="cstat-no" title="statement not covered" > /**</span>
1815
+ <span class="cstat-no" title="statement not covered" > * Parse accounts from Hedera namespace in WalletConnect session.</span>
1816
+ <span class="cstat-no" title="statement not covered" > * Extracts account IDs from HIP-30 format: hedera:&lt;network&gt;:&lt;accountId&gt;</span>
1817
+ <span class="cstat-no" title="statement not covered" > *</span>
1818
+ <span class="cstat-no" title="statement not covered" > * Optionally filters accounts to only include those matching a target network.</span>
1819
+ <span class="cstat-no" title="statement not covered" > * This is important for respecting the user's network selection in the dApp,</span>
1820
+ <span class="cstat-no" title="statement not covered" > * since wallets may return accounts from multiple networks.</span>
1821
+ <span class="cstat-no" title="statement not covered" > *</span>
1822
+ <span class="cstat-no" title="statement not covered" > * @param namespace - Hedera namespace object from session</span>
1823
+ <span class="cstat-no" title="statement not covered" > * @param targetNetworkId - Optional network ID to filter accounts (e.g., 'hedera:mainnet')</span>
1824
+ <span class="cstat-no" title="statement not covered" > * @returns Array of parsed account objects, filtered by target network if specified</span>
1825
+ <span class="cstat-no" title="statement not covered" > */</span>
1826
+ <span class="cstat-no" title="statement not covered" > parseAccounts(</span>
1827
+ <span class="cstat-no" title="statement not covered" > namespace: any,</span>
1828
+ <span class="cstat-no" title="statement not covered" > targetNetworkId?: string,</span>
1829
+ <span class="cstat-no" title="statement not covered" > ): Array&lt;{ address: string; chainId: string }&gt; {</span>
1830
+ <span class="cstat-no" title="statement not covered" > if (!namespace) {</span>
1831
1831
  <span class="cstat-no" title="statement not covered" > logger.warn('Namespace is null or undefined');</span>
1832
1832
  <span class="cstat-no" title="statement not covered" > return [];</span>
1833
1833
  <span class="cstat-no" title="statement not covered" > }</span>
1834
- &nbsp;
1835
- if (!(namespace as { accounts?: string[] }).accounts) {
1836
- logger.warn('Namespace has no accounts property');
1837
- return [];
1838
- }
1839
- &nbsp;
1840
- if (!Array.isArray((namespace as { accounts?: string[] }).accounts)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1834
+ <span class="cstat-no" title="statement not covered" ></span>
1835
+ <span class="cstat-no" title="statement not covered" > if (!(namespace as { accounts?: string[] }).accounts) {</span>
1836
+ <span class="cstat-no" title="statement not covered" > logger.warn('Namespace has no accounts property');</span>
1837
+ <span class="cstat-no" title="statement not covered" > return [];</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" > if (!Array.isArray((namespace as { accounts?: string[] }).accounts)) {</span>
1841
1841
  <span class="cstat-no" title="statement not covered" > logger.warn('Namespace accounts is not an array', {</span>
1842
1842
  <span class="cstat-no" title="statement not covered" > type: typeof (namespace as { accounts?: string[] }).accounts,</span>
1843
1843
  <span class="cstat-no" title="statement not covered" > });</span>
1844
1844
  <span class="cstat-no" title="statement not covered" > return [];</span>
1845
1845
  <span class="cstat-no" title="statement not covered" > }</span>
1846
- &nbsp;
1847
- // Parse all accounts from namespace
1848
- const allAccounts = ((namespace as { accounts?: string[] }).<span class="branch-0 cbranch-no" title="branch not covered" >accounts || []).m</span>ap(
1849
- (account: string) =&gt; {
1850
- // HIP-30 format: hedera:testnet:0.0.12345
1851
- const parts = account.split(':');
1852
- &nbsp;
1853
- if (parts.length &lt; 3) {
1854
- logger.warn('Invalid account format', { account, partsLength: parts.length });
1855
- return { address: account, chainId: 'hedera:testnet' };
1856
- }
1857
- &nbsp;
1858
- return {
1859
- address: parts[parts.length - 1], // Account ID (0.0.12345)
1860
- chainId: `${parts[0]}:${parts[1]}`, // hedera:testnet
1861
- };
1862
- },
1863
- );
1864
- &nbsp;
1865
- // If target network specified, filter accounts to only that network
1866
- if (targetNetworkId) {
1867
- const targetNetwork = targetNetworkId.split(':')[1]?.toLowerCase(); // e.g., 'mainnet'
1868
- &nbsp;
1869
- if (targetNetwork) {
1870
- const filteredAccounts = allAccounts.filter((acc) =&gt;
1871
- acc.chainId.toLowerCase().includes(targetNetwork),
1872
- );
1873
- &nbsp;
1874
- logger.debug('Filtered accounts by target network', {
1875
- targetNetworkId,
1876
- targetNetwork,
1877
- totalAccounts: allAccounts.length,
1878
- filteredCount: filteredAccounts.length,
1879
- });
1880
- &nbsp;
1881
- // If no accounts match the target network, log a warning
1882
- if (filteredAccounts.length === 0 &amp;&amp; allAccounts.length &gt; 0) {
1883
- logger.warn('No accounts found for target network', {
1884
- targetNetwork,
1885
- availableNetworks: [...new Set(allAccounts.map((a) =&gt; a.chainId))],
1886
- });
1887
- }
1888
- &nbsp;
1889
- return filteredAccounts;
1890
- }
1891
- }
1892
- &nbsp;
1893
- return allAccounts;
1894
- }
1895
- }
1846
+ <span class="cstat-no" title="statement not covered" ></span>
1847
+ <span class="cstat-no" title="statement not covered" > // Parse all accounts from namespace</span>
1848
+ <span class="cstat-no" title="statement not covered" > const allAccounts = ((namespace as { accounts?: string[] }).accounts || []).map(</span>
1849
+ <span class="cstat-no" title="statement not covered" > (account: string) =&gt; {</span>
1850
+ <span class="cstat-no" title="statement not covered" > // HIP-30 format: hedera:testnet:0.0.12345</span>
1851
+ <span class="cstat-no" title="statement not covered" > const parts = account.split(':');</span>
1852
+ <span class="cstat-no" title="statement not covered" ></span>
1853
+ <span class="cstat-no" title="statement not covered" > if (parts.length &lt; 3) {</span>
1854
+ <span class="cstat-no" title="statement not covered" > logger.warn('Invalid account format', { account, partsLength: parts.length });</span>
1855
+ <span class="cstat-no" title="statement not covered" > return { address: account, chainId: 'hedera:testnet' };</span>
1856
+ <span class="cstat-no" title="statement not covered" > }</span>
1857
+ <span class="cstat-no" title="statement not covered" ></span>
1858
+ <span class="cstat-no" title="statement not covered" > return {</span>
1859
+ <span class="cstat-no" title="statement not covered" > address: parts[parts.length - 1], // Account ID (0.0.12345)</span>
1860
+ <span class="cstat-no" title="statement not covered" > chainId: `${parts[0]}:${parts[1]}`, // hedera:testnet</span>
1861
+ <span class="cstat-no" title="statement not covered" > };</span>
1862
+ <span class="cstat-no" title="statement not covered" > },</span>
1863
+ <span class="cstat-no" title="statement not covered" > );</span>
1864
+ <span class="cstat-no" title="statement not covered" ></span>
1865
+ <span class="cstat-no" title="statement not covered" > // If target network specified, filter accounts to only that network</span>
1866
+ <span class="cstat-no" title="statement not covered" > if (targetNetworkId) {</span>
1867
+ <span class="cstat-no" title="statement not covered" > const targetNetwork = targetNetworkId.split(':')[1]?.toLowerCase(); // e.g., 'mainnet'</span>
1868
+ <span class="cstat-no" title="statement not covered" ></span>
1869
+ <span class="cstat-no" title="statement not covered" > if (targetNetwork) {</span>
1870
+ <span class="cstat-no" title="statement not covered" > const filteredAccounts = allAccounts.filter((acc) =&gt;</span>
1871
+ <span class="cstat-no" title="statement not covered" > acc.chainId.toLowerCase().includes(targetNetwork),</span>
1872
+ <span class="cstat-no" title="statement not covered" > );</span>
1873
+ <span class="cstat-no" title="statement not covered" ></span>
1874
+ <span class="cstat-no" title="statement not covered" > logger.debug('Filtered accounts by target network', {</span>
1875
+ <span class="cstat-no" title="statement not covered" > targetNetworkId,</span>
1876
+ <span class="cstat-no" title="statement not covered" > targetNetwork,</span>
1877
+ <span class="cstat-no" title="statement not covered" > totalAccounts: allAccounts.length,</span>
1878
+ <span class="cstat-no" title="statement not covered" > filteredCount: filteredAccounts.length,</span>
1879
+ <span class="cstat-no" title="statement not covered" > });</span>
1880
+ <span class="cstat-no" title="statement not covered" ></span>
1881
+ <span class="cstat-no" title="statement not covered" > // If no accounts match the target network, log a warning</span>
1882
+ <span class="cstat-no" title="statement not covered" > if (filteredAccounts.length === 0 &amp;&amp; allAccounts.length &gt; 0) {</span>
1883
+ <span class="cstat-no" title="statement not covered" > logger.warn('No accounts found for target network', {</span>
1884
+ <span class="cstat-no" title="statement not covered" > targetNetwork,</span>
1885
+ <span class="cstat-no" title="statement not covered" > availableNetworks: [...new Set(allAccounts.map((a) =&gt; a.chainId))],</span>
1886
+ <span class="cstat-no" title="statement not covered" > });</span>
1887
+ <span class="cstat-no" title="statement not covered" > }</span>
1888
+ <span class="cstat-no" title="statement not covered" ></span>
1889
+ <span class="cstat-no" title="statement not covered" > return filteredAccounts;</span>
1890
+ <span class="cstat-no" title="statement not covered" > }</span>
1891
+ <span class="cstat-no" title="statement not covered" > }</span>
1892
+ <span class="cstat-no" title="statement not covered" ></span>
1893
+ <span class="cstat-no" title="statement not covered" > return allAccounts;</span>
1894
+ <span class="cstat-no" title="statement not covered" > }</span>
1895
+ <span class="cstat-no" title="statement not covered" >}</span>
1896
1896
  &nbsp;</pre></td></tr></table></pre>
1897
1897
 
1898
1898
  <div class='push'></div><!-- for sticky footer -->
@@ -1900,7 +1900,7 @@ export class HederaSigner implements IWalletConnectSigner {
1900
1900
  <div class='footer quiet pad2 space-top1 center small'>
1901
1901
  Code coverage generated by
1902
1902
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1903
- at 2026-06-02T14:30:38.372Z
1903
+ at 2026-06-10T09:00:36.812Z
1904
1904
  </div>
1905
1905
  <script src="../../../../prettify.js"></script>
1906
1906
  <script>