@hsuite/native-connect-angular 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -0
- package/USAGE_EXAMPLES.md +476 -0
- package/assets/wallets/extension.svg +7 -0
- package/assets/wallets/hashpack.svg +6 -0
- package/assets/wallets/hsuite.svg +11 -0
- package/assets/wallets/kabila.svg +11 -0
- package/assets/wallets/walletconnect.svg +13 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-summary.json +50 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +476 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +476 -0
- package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
- package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
- package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +685 -0
- package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +766 -0
- package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
- package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +116 -0
- package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1495 -0
- package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1588 -0
- package/coverage/lcov-report/lib/components/account-selector/index.html +161 -0
- package/coverage/lcov-report/lib/components/wallet-account-display/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
- package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
- package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
- package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
- package/coverage/lcov-report/lib/components/wallet-session-display/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
- package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +116 -0
- package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
- package/coverage/lcov-report/lib/directives/index.html +146 -0
- package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +670 -0
- package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +547 -0
- package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +781 -0
- package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +715 -0
- package/coverage/lcov-report/lib/index.html +116 -0
- package/coverage/lcov-report/lib/models/connection-config.model.ts.html +280 -0
- package/coverage/lcov-report/lib/models/index.html +131 -0
- package/coverage/lcov-report/lib/models/provider-types.ts.html +577 -0
- package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +1138 -0
- package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
- package/coverage/lcov-report/lib/providers/hsuite-native/index.html +116 -0
- package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +2347 -0
- package/coverage/lcov-report/lib/providers/index.html +146 -0
- package/coverage/lcov-report/lib/providers/p2p-native/index.html +131 -0
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
- package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1132 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +176 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +673 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +146 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
- package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
- package/coverage/lcov-report/lib/services/index.html +191 -0
- package/coverage/lcov-report/lib/services/logger.service.ts.html +463 -0
- package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
- package/coverage/lcov-report/lib/services/transaction-builders/index.html +161 -0
- package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
- package/coverage/lcov-report/lib/services/transaction.service.ts.html +1123 -0
- package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +2641 -0
- package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +637 -0
- package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +643 -0
- package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +496 -0
- package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +823 -0
- package/coverage/lcov-report/lib/transports/index.html +116 -0
- package/coverage/lcov-report/lib/utils/index.html +116 -0
- package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +319 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +19252 -0
- package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
- package/coverage/lib/components/account-selector/account-actions/index.html +116 -0
- package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
- package/coverage/lib/components/account-selector/account-filter/index.html +116 -0
- package/coverage/lib/components/account-selector/account-formatting.service.ts.html +685 -0
- package/coverage/lib/components/account-selector/account-grouping.service.ts.html +766 -0
- package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
- package/coverage/lib/components/account-selector/account-list/index.html +116 -0
- package/coverage/lib/components/account-selector/account-selector.component.ts.html +1495 -0
- package/coverage/lib/components/account-selector/account-selector.service.ts.html +1588 -0
- package/coverage/lib/components/account-selector/index.html +161 -0
- package/coverage/lib/components/wallet-account-display/index.html +116 -0
- package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
- package/coverage/lib/components/wallet-connect-button/index.html +116 -0
- package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
- package/coverage/lib/components/wallet-connect-prompt/index.html +116 -0
- package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
- package/coverage/lib/components/wallet-connected-guard/index.html +116 -0
- package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
- package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
- package/coverage/lib/components/wallet-session-display/index.html +116 -0
- package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
- package/coverage/lib/components/wallet-transaction-status/index.html +116 -0
- package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
- package/coverage/lib/directives/index.html +146 -0
- package/coverage/lib/directives/wallet-connected.directive.ts.html +670 -0
- package/coverage/lib/directives/wallet-context.directive.ts.html +547 -0
- package/coverage/lib/directives/wallet-events.directive.ts.html +781 -0
- package/coverage/lib/hsuite-wallet.module.ts.html +715 -0
- package/coverage/lib/index.html +116 -0
- package/coverage/lib/models/connection-config.model.ts.html +280 -0
- package/coverage/lib/models/index.html +131 -0
- package/coverage/lib/models/provider-types.ts.html +577 -0
- package/coverage/lib/providers/base-wallet-provider.ts.html +1138 -0
- package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
- package/coverage/lib/providers/hsuite-native/index.html +116 -0
- package/coverage/lib/providers/hsuite-native-provider.ts.html +2347 -0
- package/coverage/lib/providers/index.html +146 -0
- package/coverage/lib/providers/p2p-native/index.html +131 -0
- package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
- package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
- package/coverage/lib/providers/wallet-error-handler.ts.html +1132 -0
- package/coverage/lib/providers/walletconnect/core/index.html +176 -0
- package/coverage/lib/providers/walletconnect/core/session-health.ts.html +673 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
- package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
- package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
- package/coverage/lib/providers/walletconnect/signers/index.html +146 -0
- package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
- package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
- package/coverage/lib/services/index.html +191 -0
- package/coverage/lib/services/logger.service.ts.html +463 -0
- package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
- package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
- package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
- package/coverage/lib/services/transaction-builders/index.html +161 -0
- package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
- package/coverage/lib/services/transaction.service.ts.html +1123 -0
- package/coverage/lib/services/unified-wallet.service.ts.html +2641 -0
- package/coverage/lib/services/wallet-context.service.ts.html +637 -0
- package/coverage/lib/services/wallet-event-bus.service.ts.html +643 -0
- package/coverage/lib/services/wallet-providers.service.ts.html +496 -0
- package/coverage/lib/transports/chrome-extension-transport.ts.html +823 -0
- package/coverage/lib/transports/index.html +116 -0
- package/coverage/lib/utils/index.html +116 -0
- package/coverage/lib/utils/ledger-icons.util.ts.html +319 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/dist/README.md +48 -0
- package/dist/fesm2022/hsuite-native-connect-angular.mjs +14592 -0
- package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -0
- package/dist/index.d.ts +6949 -0
- package/examples/minimal-connect.ts +178 -0
- package/examples/multi-protocol.ts +495 -0
- package/examples/transaction-signing.ts +361 -0
- package/jest.config.json +45 -0
- package/karma.conf.js +42 -0
- package/ng-package.json +20 -0
- package/package.json +60 -0
- package/src/index.ts +203 -0
- package/src/lib/components/account-selector/account-actions/account-actions.component.ts +261 -0
- package/src/lib/components/account-selector/account-filter/account-filter.component.ts +401 -0
- package/src/lib/components/account-selector/account-formatting.service.ts +200 -0
- package/src/lib/components/account-selector/account-grouping.service.ts +227 -0
- package/src/lib/components/account-selector/account-list/account-list.component.ts +470 -0
- package/src/lib/components/account-selector/account-selector.component.html +135 -0
- package/src/lib/components/account-selector/account-selector.component.scss +2039 -0
- package/src/lib/components/account-selector/account-selector.component.ts +470 -0
- package/src/lib/components/account-selector/account-selector.service.ts +501 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.html +34 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.scss +99 -0
- package/src/lib/components/wallet-account-display/wallet-account-display.component.ts +140 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.html +14 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.scss +272 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +240 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.html +24 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.scss +50 -0
- package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts +108 -0
- package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.html +24 -0
- package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts +73 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.html +56 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.scss +218 -0
- package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts +117 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.html +94 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.scss +272 -0
- package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts +734 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +197 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.scss +678 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +730 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.html +110 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.scss +179 -0
- package/src/lib/components/wallet-session-display/wallet-session-display.component.ts +197 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.html +65 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.scss +254 -0
- package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts +206 -0
- package/src/lib/directives/wallet-connected.directive.ts +195 -0
- package/src/lib/directives/wallet-context.directive.ts +154 -0
- package/src/lib/directives/wallet-events.directive.ts +232 -0
- package/src/lib/hsuite-wallet.module.ts +210 -0
- package/src/lib/models/connection-config.model.ts +65 -0
- package/src/lib/models/provider-types.ts +164 -0
- package/src/lib/models/unified-account.model.ts +76 -0
- package/src/lib/models/wallet-context.model.ts +121 -0
- package/src/lib/models/wallet-events.model.ts +158 -0
- package/src/lib/providers/base-wallet-provider.ts +351 -0
- package/src/lib/providers/hsuite-native/channel-client.service.spec.ts +73 -0
- package/src/lib/providers/hsuite-native/channel-client.service.ts +862 -0
- package/src/lib/providers/hsuite-native/index.ts +8 -0
- package/src/lib/providers/hsuite-native-provider.ts +754 -0
- package/src/lib/providers/mobile-native/mobile-native.provider.spec.ts +19 -0
- package/src/lib/providers/p2p-native/index.ts +30 -0
- package/src/lib/providers/p2p-native/p2p-native.provider.spec.ts +523 -0
- package/src/lib/providers/p2p-native/p2p-native.provider.ts +723 -0
- package/src/lib/providers/p2p-native/p2p-session-manager.ts +695 -0
- package/src/lib/providers/wallet-error-handler.ts +349 -0
- package/src/lib/providers/walletconnect/core/base-signer.interface.ts +122 -0
- package/src/lib/providers/walletconnect/core/session-health.ts +196 -0
- package/src/lib/providers/walletconnect/core/walletconnect-client-manager.ts +364 -0
- package/src/lib/providers/walletconnect/core/walletconnect-provider.integration.spec.ts +348 -0
- package/src/lib/providers/walletconnect/core/walletconnect-provider.ts +826 -0
- package/src/lib/providers/walletconnect/core/walletconnect-session-store.ts +273 -0
- package/src/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts +299 -0
- package/src/lib/providers/walletconnect/core/walletconnect-types.ts +48 -0
- package/src/lib/providers/walletconnect/index.ts +33 -0
- package/src/lib/providers/walletconnect/signers/hedera-signer.spec.ts +367 -0
- package/src/lib/providers/walletconnect/signers/hedera-signer.ts +610 -0
- package/src/lib/providers/walletconnect/signers/signer-factory.spec.ts +62 -0
- package/src/lib/providers/walletconnect/signers/signer-factory.ts +120 -0
- package/src/lib/providers/walletconnect/signers/xrpl-signer.spec.ts +296 -0
- package/src/lib/providers/walletconnect/signers/xrpl-signer.ts +478 -0
- package/src/lib/services/logger.service.ts +126 -0
- package/src/lib/services/transaction-builders/base-transaction-builder.service.ts +585 -0
- package/src/lib/services/transaction-builders/hedera-amount-utils.ts +84 -0
- package/src/lib/services/transaction-builders/hedera-transaction-builder.service.spec.ts +741 -0
- package/src/lib/services/transaction-builders/hedera-transaction-builder.service.ts +1285 -0
- package/src/lib/services/transaction-builders/index.ts +54 -0
- package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.spec.ts +937 -0
- package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.ts +832 -0
- package/src/lib/services/transaction.service.ts +346 -0
- package/src/lib/services/unified-wallet.service.spec.ts +1382 -0
- package/src/lib/services/unified-wallet.service.ts +852 -0
- package/src/lib/services/wallet-context.service.ts +184 -0
- package/src/lib/services/wallet-event-bus.service.ts +186 -0
- package/src/lib/services/wallet-providers.service.ts +137 -0
- package/src/lib/transports/chrome-extension-transport.ts +246 -0
- package/src/lib/utils/index.ts +14 -0
- package/src/lib/utils/ledger-icons.util.ts +78 -0
- package/test/test-setup.ts +21 -0
- package/test-setup.ts +63 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +29 -0
- package/tsconfig.spec.json +15 -0
- package/vitest.config.ts +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hsuite-native-connect-angular.mjs","sources":["../../src/lib/components/account-selector/account-actions/account-actions.component.ts","../../src/lib/components/account-selector/account-formatting.service.ts","../../src/lib/components/account-selector/account-filter/account-filter.component.ts","../../src/lib/utils/ledger-icons.util.ts","../../src/lib/components/account-selector/account-list/account-list.component.ts","../../src/lib/services/wallet-event-bus.service.ts","../../src/lib/models/provider-types.ts","../../src/lib/providers/base-wallet-provider.ts","../../src/lib/providers/hsuite-native/channel-client.service.ts","../../src/lib/providers/hsuite-native-provider.ts","../../src/lib/providers/walletconnect/signers/hedera-signer.ts","../../src/lib/providers/walletconnect/signers/xrpl-signer.ts","../../src/lib/providers/walletconnect/signers/signer-factory.ts","../../src/lib/providers/walletconnect/core/session-health.ts","../../src/lib/providers/walletconnect/core/walletconnect-client-manager.ts","../../src/lib/providers/walletconnect/core/walletconnect-session-store.ts","../../src/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts","../../src/lib/providers/walletconnect/core/walletconnect-provider.ts","../../src/lib/providers/p2p-native/p2p-session-manager.ts","../../src/lib/providers/p2p-native/p2p-native.provider.ts","../../src/lib/services/unified-wallet.service.ts","../../src/lib/components/account-selector/account-selector.service.ts","../../src/lib/components/account-selector/account-selector.component.ts","../../src/lib/components/account-selector/account-selector.component.html","../../src/lib/services/wallet-context.service.ts","../../src/lib/components/wallet-account-display/wallet-account-display.component.ts","../../src/lib/components/wallet-account-display/wallet-account-display.component.html","../../src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts","../../src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.html","../../src/lib/services/logger.service.ts","../../src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts","../../src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts","../../src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html","../../src/lib/components/wallet-connect-button/wallet-connect-button.component.ts","../../src/lib/components/wallet-connect-button/wallet-connect-button.component.html","../../src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts","../../src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.html","../../src/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts","../../src/lib/components/wallet-connected-guard/wallet-connected-guard.component.html","../../src/lib/components/wallet-session-display/wallet-session-display.component.ts","../../src/lib/components/wallet-session-display/wallet-session-display.component.html","../../src/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts","../../src/lib/components/wallet-transaction-status/wallet-transaction-status.component.html","../../src/lib/directives/wallet-connected.directive.ts","../../src/lib/directives/wallet-context.directive.ts","../../src/lib/directives/wallet-events.directive.ts","../../src/lib/hsuite-wallet.module.ts","../../src/lib/services/transaction.service.ts","../../src/lib/services/transaction-builders/base-transaction-builder.service.ts","../../src/lib/services/transaction-builders/hedera-amount-utils.ts","../../src/lib/services/transaction-builders/hedera-transaction-builder.service.ts","../../src/lib/services/transaction-builders/xrpl-transaction-builder.service.ts","../../src/lib/services/transaction-builders/index.ts","../../src/lib/transports/chrome-extension-transport.ts","../../src/lib/components/account-selector/account-grouping.service.ts","../../src/lib/models/unified-account.model.ts","../../src/lib/models/wallet-events.model.ts","../../src/lib/models/wallet-context.model.ts","../../src/lib/models/connection-config.model.ts","../../src/lib/providers/walletconnect/core/base-signer.interface.ts","../../src/lib/providers/walletconnect/core/walletconnect-types.ts","../../src/lib/providers/walletconnect/index.ts","../../src/lib/providers/wallet-error-handler.ts","../../src/lib/providers/p2p-native/index.ts","../../src/lib/utils/index.ts","../../src/index.ts","../../src/hsuite-native-connect-angular.ts"],"sourcesContent":["/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file account-actions.component.ts\n * @description Action buttons component for account selector\n *\n * Provides action buttons for account management including disconnect all,\n * add account, and connect wallet actions.\n * Extracted from AccountSelectorComponent for better maintainability.\n *\n * **Features:**\n * - Disconnect all wallets button\n * - Add account button\n * - Connect wallet button (inline mode)\n * - Loading state support\n * - Confirmation dialogs integration\n */\n\nimport {\n Component,\n EventEmitter,\n Input,\n Output,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { linkOutline, addCircleOutline, addOutline } from 'ionicons/icons';\n\n/**\n * @component AccountActionsComponent\n * Action buttons for account management.\n */\n@Component({\n selector: 'wallet-account-actions',\n standalone: true,\n imports: [CommonModule, IonButton, IonIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <!-- Modal Footer Actions -->\n <ng-container *ngIf=\"mode === 'modal'\">\n <div class=\"modal-footer\">\n <ion-button\n class=\"footer-btn\"\n fill=\"outline\"\n color=\"danger\"\n size=\"small\"\n (click)=\"onDisconnectAll()\"\n [disabled]=\"isLoading || !hasAccounts\"\n >\n <ion-icon slot=\"start\" name=\"link-outline\" style=\"transform: rotate(45deg);\"></ion-icon>\n Disconnect All\n </ion-button>\n <ion-button\n class=\"footer-btn\"\n color=\"primary\"\n size=\"small\"\n (click)=\"onAddAccount()\"\n [disabled]=\"isLoading\"\n >\n <ion-icon slot=\"start\" name=\"add-circle-outline\"></ion-icon>\n Add Account\n </ion-button>\n </div>\n </ng-container>\n\n <!-- Inline Connect Button -->\n <ng-container *ngIf=\"mode === 'inline'\">\n <ion-button\n class=\"connect-wallet-btn\"\n expand=\"block\"\n fill=\"outline\"\n color=\"primary\"\n (click)=\"onConnectWallet()\"\n >\n <ion-icon slot=\"start\" name=\"add-outline\"></ion-icon>\n Connect wallet\n </ion-button>\n </ng-container>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n /* Modal Footer */\n .modal-footer {\n display: flex;\n gap: var(--account-selector-spacing-sm, 8px);\n padding: var(--account-selector-spacing-md, 12px) var(--account-selector-spacing-lg, 16px);\n background: var(--account-selector-footer-bg, rgba(var(--ion-color-light-rgb), 0.05));\n border-top: 1px solid\n var(--account-selector-border-color, rgba(var(--ion-color-light-rgb), 0.1));\n flex-shrink: 0;\n }\n\n .footer-btn {\n margin: 0;\n flex: 1;\n --border-radius: var(--account-selector-item-border-radius, 10px);\n font-weight: var(--account-selector-font-weight-semibold, 600);\n font-size: var(--account-selector-font-size-sm, 12px);\n height: var(--account-selector-button-height, 36px);\n cursor: pointer;\n pointer-events: auto;\n transition: all var(--account-selector-transition-fast, 0.15s) ease;\n\n ion-icon {\n font-size: var(--account-selector-spacing-lg, 16px);\n color: inherit;\n }\n\n &:hover:not(:disabled) {\n transform: translateY(-1px);\n }\n\n &:active:not(:disabled) {\n transform: translateY(0);\n }\n\n &[color='danger'] {\n --background: rgba(var(--ion-color-danger-rgb), 0.1);\n --border-color: rgba(var(--ion-color-danger-rgb), 0.3);\n --color: var(--ion-color-danger);\n\n &:hover:not(:disabled) {\n --background: rgba(var(--ion-color-danger-rgb), 0.15);\n }\n }\n }\n\n /* Connect Wallet Button (Inline) */\n .connect-wallet-btn {\n margin-top: var(--account-selector-spacing-lg, 16px);\n --border-radius: var(--account-selector-content-border-radius, 12px);\n font-weight: var(--account-selector-font-weight-semibold, 600);\n --border-width: 1px;\n --border-style: solid;\n --border-color: var(\n --account-selector-add-account-border,\n rgba(var(--ion-color-primary-rgb), 0.3)\n );\n min-height: var(--account-selector-button-height-lg, 44px);\n transition: all var(--account-selector-transition-normal, 0.2s) ease;\n\n &:hover:not(:disabled) {\n --background: var(\n --account-selector-add-account-bg-hover,\n rgba(var(--ion-color-primary-rgb), 0.1)\n );\n --border-color: rgba(var(--ion-color-primary-rgb), 0.4);\n transform: translateY(-1px);\n }\n\n &:active:not(:disabled) {\n transform: scale(0.98);\n }\n\n ion-icon {\n font-size: var(--account-selector-icon-size, 18px);\n color: inherit;\n transition: transform var(--account-selector-transition-fast, 0.15s) ease;\n }\n\n &:hover:not(:disabled) ion-icon {\n transform: scale(1.1);\n }\n }\n\n /* Responsive styles */\n @media (max-width: 480px) {\n .modal-footer {\n padding: 10px 12px;\n gap: 6px;\n\n .footer-btn {\n font-size: 11px;\n height: 32px;\n\n ion-icon {\n font-size: 14px;\n }\n }\n }\n }\n `,\n ],\n})\nexport class AccountActionsComponent {\n /**\n * Action mode: 'modal' for modal footer, 'inline' for connect button\n */\n @Input() mode: 'modal' | 'inline' = 'modal';\n\n /**\n * Loading state\n */\n @Input() isLoading = false;\n\n /**\n * Whether there are connected accounts\n */\n @Input() hasAccounts = false;\n\n /**\n * Emitted when \"Disconnect All\" is clicked\n */\n @Output() disconnectAllRequested = new EventEmitter<void>();\n\n /**\n * Emitted when \"Add Account\" is clicked\n */\n @Output() addAccountRequested = new EventEmitter<void>();\n\n /**\n * Emitted when \"Connect Wallet\" is clicked (inline mode)\n */\n @Output() connectWalletRequested = new EventEmitter<void>();\n\n constructor() {\n addIcons({\n linkOutline,\n addCircleOutline,\n addOutline,\n });\n }\n\n /**\n * Handle disconnect all button click\n */\n protected onDisconnectAll(): void {\n this.disconnectAllRequested.emit();\n }\n\n /**\n * Handle add account button click\n */\n protected onAddAccount(): void {\n this.addAccountRequested.emit();\n }\n\n /**\n * Handle connect wallet button click\n */\n protected onConnectWallet(): void {\n this.connectWalletRequested.emit();\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file account-formatting.service.ts\n * @description Account display formatting utilities\n *\n * Provides formatting utilities for displaying accounts, addresses,\n * networks, and ledgers in the AccountSelectorComponent.\n */\n\nimport { Injectable } from '@angular/core';\n\n/**\n * Account formatting service.\n *\n * Provides utilities for formatting account-related display strings.\n */\n@Injectable({ providedIn: 'root' })\nexport class AccountFormattingService {\n /**\n * Truncate address for display.\n *\n * @param address - Full address\n * @param prefixLength - Characters to show at start (default: 6)\n * @param suffixLength - Characters to show at end (default: 4)\n * @returns Truncated address with ellipsis\n */\n truncateAddress(address: string, prefixLength = 6, suffixLength = 4): string {\n if (!address) return '';\n if (address.length <= prefixLength + suffixLength + 3) return address;\n return `${address.substring(0, prefixLength)}...${address.substring(address.length - suffixLength)}`;\n }\n\n /**\n * Get display name for a ledger.\n *\n * @param ledgerId - Ledger ID\n * @returns Display name\n */\n getLedgerName(ledgerId: string): string {\n const names: Record<string, string> = {\n hedera: 'Hedera',\n xrpl: 'XRPL',\n };\n return names[ledgerId?.toLowerCase()] || ledgerId?.toUpperCase() || 'Unknown';\n }\n\n /**\n * Get color for a ledger badge.\n *\n * @param ledgerId - Ledger ID\n * @returns Ionic color name\n */\n getLedgerColor(ledgerId: string): string {\n const colors: Record<string, string> = {\n hedera: 'success',\n xrpl: 'tertiary',\n };\n return colors[ledgerId?.toLowerCase()] || 'medium';\n }\n\n /**\n * Format network display name with proper casing.\n *\n * @param networkId - Network ID (e.g., \"hedera:testnet\")\n * @returns Formatted network name (e.g., \"Testnet\")\n */\n formatNetwork(networkId: string): string {\n const network = this.extractNetwork(networkId);\n const names: Record<string, string> = {\n mainnet: 'Mainnet',\n testnet: 'Testnet',\n devnet: 'Devnet',\n };\n return names[network.toLowerCase()] || network;\n }\n\n /**\n * Extract network name from full networkId.\n *\n * @param networkId - Full network ID\n * @returns Network name only\n */\n extractNetwork(networkId?: string): string {\n if (!networkId) return 'unknown';\n const parts = networkId.split(':');\n return parts[parts.length - 1] || networkId;\n }\n\n /**\n * Get color for a network badge.\n *\n * @param networkId - Network ID\n * @returns Ionic color name\n */\n getNetworkColor(networkId: string): string {\n const network = this.extractNetwork(networkId).toLowerCase();\n const colors: Record<string, string> = {\n mainnet: 'primary',\n testnet: 'warning',\n devnet: 'secondary',\n };\n return colors[network] || 'medium';\n }\n\n /**\n * Get display name for a provider type.\n *\n * @param providerType - Provider type ID\n * @returns Display name\n */\n getProviderName(providerType: string): string {\n const names: Record<string, string> = {\n 'hsuite-native': 'HSuite Native',\n 'walletconnect-v2': 'WalletConnect',\n };\n return names[providerType] || providerType;\n }\n\n /**\n * Get provider display name from provider ID.\n *\n * @param providerId - Provider ID\n * @returns Display name\n */\n getProviderDisplayName(providerId: string): string {\n const nameMap: Record<string, string> = {\n 'walletconnect-v2': 'WalletConnect',\n 'hsuite-native': 'HSuite Wallet',\n };\n return nameMap[providerId] || providerId;\n }\n\n /**\n * Get wallet logo path based on provider type.\n *\n * @param providerType - Provider type\n * @returns Asset path for logo\n */\n getWalletLogo(providerType: string): string {\n if (providerType === 'walletconnect-v2') {\n return 'assets/wallets/walletconnect.svg';\n }\n return 'assets/wallets/hsuite.svg';\n }\n\n /**\n * Get wallet logo for provider name string.\n *\n * @param providerName - Provider display name\n * @returns Asset path for logo\n */\n getWalletLogoForProvider(providerName: string): string {\n if (providerName === 'WalletConnect') {\n return 'assets/wallets/walletconnect.svg';\n }\n return 'assets/wallets/hsuite.svg';\n }\n\n /**\n * Get protocol icon name.\n *\n * @param protocol - Protocol name\n * @returns Ionicon name\n */\n getProtocolIcon(protocol: string): string {\n return protocol === 'HSuite Native' ? 'link' : 'scan';\n }\n\n /**\n * Format account label.\n *\n * @param account - Account object\n * @returns Display label\n */\n formatAccountLabel(account: any): string {\n return account?.label || 'Account';\n }\n\n /**\n * Format full account label with ledger and address.\n *\n * @param account - Account object\n * @returns Full display label\n */\n formatAccountLabelFull(account: any): string {\n const label = account?.label || 'Account';\n const ledger = this.getLedgerName(account?.ledgerId);\n const address = this.truncateAddress(account?.address);\n return `${label} (${ledger}) - ${address}`;\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file account-filter.component.ts\n * @description Compact header and filtering component for account selector\n *\n * Provides compact header display with account preview and collapse/expand\n * functionality. Extracted from AccountSelectorComponent for better maintainability.\n *\n * **Features:**\n * - Compact header with active account preview\n * - Collapsible account list toggle\n * - Network and wallet badges\n * - Multiple size variants (default, navbar, small)\n * - Multiple format options (label-count, address-count, etc.)\n */\n\nimport {\n Component,\n EventEmitter,\n Input,\n Output,\n inject,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonBadge, IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { chevronDownOutline } from 'ionicons/icons';\nimport { AccountFormattingService } from '../account-formatting.service';\n\n/**\n * Format options for compact header display\n */\nexport type CompactHeaderFormat =\n | 'label-count'\n | 'address-count'\n | 'count-only'\n | 'label-only'\n | 'address-only';\n\n/**\n * Size variants for compact header\n */\nexport type CompactHeaderSize = 'default' | 'navbar' | 'small';\n\n/**\n * Active account data for display\n */\nexport interface ActiveAccountData {\n address: string;\n networkId: string;\n label?: string;\n providerType?: string;\n}\n\n/**\n * @component AccountFilterComponent\n * Compact header with active account preview and collapse toggle.\n */\n@Component({\n selector: 'wallet-account-filter',\n standalone: true,\n imports: [CommonModule, IonBadge, IonIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <!-- Custom Header Text (optional) -->\n <div *ngIf=\"customHeaderText\" class=\"custom-header-text\">\n {{ customHeaderText }}\n </div>\n\n <!-- Compact Header -->\n <div\n class=\"compact-header\"\n [class.navbar-size]=\"headerSize === 'navbar'\"\n [class.small-size]=\"headerSize === 'small'\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"!isCollapsed\"\n [attr.aria-label]=\"getAriaLabel()\"\n (click)=\"onToggle()\"\n (keydown.enter)=\"onToggle()\"\n (keydown.space)=\"$event.preventDefault(); onToggle()\"\n >\n <!-- Account Preview -->\n <div class=\"account-preview\">\n <span class=\"account-address-compact\">{{ getActiveAddress() }}</span>\n <ion-badge [color]=\"getActiveNetworkColor()\" size=\"small\" class=\"network-badge-compact\">\n {{ getActiveNetworkType() }}\n </ion-badge>\n <img [src]=\"walletLogoSrc\" [alt]=\"'Wallet logo'\" class=\"wallet-logo-compact\" />\n </div>\n\n <!-- Account Count Badge -->\n <ion-badge color=\"primary\" class=\"account-count-badge\">\n {{ totalAccountCount }}\n </ion-badge>\n\n <!-- Expand/Collapse Icon -->\n <ion-icon\n *ngIf=\"collapsible\"\n name=\"chevron-down-outline\"\n class=\"toggle-icon\"\n [class.expanded]=\"!isCollapsed\"\n >\n </ion-icon>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n /* Custom Header Text */\n .custom-header-text {\n font-size: var(--account-selector-font-size-sm, 12px);\n font-weight: var(--account-selector-font-weight-medium, 500);\n color: var(--account-selector-text-secondary, var(--ion-color-medium));\n margin-bottom: var(--account-selector-spacing-sm, 8px);\n padding: 0 var(--account-selector-spacing-xs, 4px);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n line-height: var(--account-selector-line-height-normal, 1.5);\n }\n\n /* Compact Header */\n .compact-header {\n display: flex;\n align-items: center;\n gap: var(--account-selector-spacing-md, 12px);\n padding: var(--account-selector-spacing-md, 12px) var(--account-selector-spacing-lg, 16px);\n background: var(--account-selector-item-bg, rgba(var(--ion-color-light-rgb), 0.05));\n border: 1px solid\n var(--account-selector-border-color, rgba(var(--ion-color-light-rgb), 0.1));\n border-radius: var(--account-selector-content-border-radius, 12px);\n cursor: pointer;\n transition: all var(--account-selector-transition-normal, 0.2s) ease;\n user-select: none;\n min-height: var(--account-selector-touch-target-min, 44px);\n margin-bottom: var(--account-selector-spacing-md, 12px);\n box-shadow:\n var(--account-selector-shadow-inset, var(--shadow-inset)),\n var(--account-selector-shadow-sm, var(--shadow-sm));\n\n &:hover {\n background: var(--account-selector-item-bg-hover, rgba(var(--ion-color-light-rgb), 0.08));\n border-color: var(\n --account-selector-border-color-hover,\n rgba(var(--ion-color-light-rgb), 0.2)\n );\n transform: translateY(-1px);\n box-shadow:\n var(--account-selector-shadow-inset, var(--shadow-inset)),\n var(--account-selector-shadow-md, var(--shadow-md));\n }\n\n &:active {\n transform: scale(0.98);\n }\n\n &:focus {\n outline: 2px solid var(--account-selector-border-color-focus, var(--ion-color-primary));\n outline-offset: 2px;\n }\n\n /* Navbar size variant */\n &.navbar-size {\n padding: 8px 12px;\n min-height: 40px;\n border-radius: 10px;\n }\n\n /* Small size variant */\n &.small-size {\n padding: 6px 10px;\n min-height: 36px;\n border-radius: 8px;\n gap: 10px;\n }\n }\n\n /* Account Preview Section */\n .account-preview {\n display: flex;\n align-items: center;\n gap: var(--account-selector-spacing-sm, 8px);\n flex: 1;\n min-width: 0;\n }\n\n .account-address-compact {\n font-size: var(--account-selector-font-size-sm, 13px);\n font-weight: var(--account-selector-font-weight-semibold, 600);\n color: var(--account-selector-text-primary, var(--ion-text-color));\n font-family: var(--ion-font-family-monospace, 'Courier New', monospace);\n line-height: var(--account-selector-line-height-normal, 1.5);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex-shrink: 1;\n transition: color var(--account-selector-transition-fast, 0.15s) ease;\n }\n\n .network-badge-compact {\n font-size: var(--account-selector-badge-font-size, 10px);\n font-weight: var(--account-selector-font-weight-semibold, 600);\n padding: var(--account-selector-badge-padding, 3px 7px);\n border-radius: var(--account-selector-badge-border-radius, 6px);\n flex-shrink: 0;\n line-height: var(--account-selector-line-height-tight, 1.2);\n transition: transform var(--account-selector-transition-fast, 0.15s) ease;\n }\n\n .wallet-logo-compact {\n width: var(--account-selector-logo-size-sm, 20px);\n height: var(--account-selector-logo-size-sm, 20px);\n border-radius: var(--account-selector-logo-border-radius, 4px);\n flex-shrink: 0;\n box-shadow: var(--account-selector-logo-shadow, var(--shadow-sm));\n transition: transform var(--account-selector-transition-fast, 0.15s) ease;\n }\n\n .account-count-badge {\n font-size: var(--account-selector-font-size-xs, 11px);\n font-weight: var(--account-selector-font-weight-semibold, 600);\n padding: var(--account-selector-badge-padding, 3px 8px);\n border-radius: var(--account-selector-badge-border-radius, 6px);\n flex-shrink: 0;\n line-height: var(--account-selector-line-height-tight, 1.2);\n }\n\n .toggle-icon {\n font-size: var(--account-selector-icon-size, 20px);\n color: var(--account-selector-text-secondary, var(--ion-color-medium));\n transition: transform var(--account-selector-transition-slow, 0.3s)\n cubic-bezier(0.4, 0, 0.2, 1);\n flex-shrink: 0;\n\n &.expanded {\n transform: rotate(180deg);\n }\n }\n\n /* Hover effects */\n .compact-header:hover {\n .network-badge-compact,\n .wallet-logo-compact {\n transform: scale(1.05);\n }\n\n .toggle-icon {\n color: var(--account-selector-text-on-primary, var(--ion-color-primary));\n }\n }\n `,\n ],\n})\nexport class AccountFilterComponent {\n protected readonly formatting = inject(AccountFormattingService);\n\n /**\n * Active account data for display\n */\n @Input() activeAccount: ActiveAccountData | null = null;\n\n /**\n * Total number of connected accounts\n */\n @Input() totalAccountCount = 0;\n\n /**\n * Whether the account list is collapsed\n */\n @Input() isCollapsed = false;\n\n /**\n * Whether collapse/expand is enabled\n */\n @Input() collapsible = true;\n\n /**\n * Custom header text (e.g., \"Connected with\", \"Using wallet\")\n */\n @Input() customHeaderText?: string;\n\n /**\n * Format for compact header display\n */\n @Input() headerFormat: CompactHeaderFormat = 'label-count';\n\n /**\n * Size variant for compact header\n */\n @Input() headerSize: CompactHeaderSize = 'default';\n\n /**\n * Wallet logo source URL\n */\n @Input() walletLogoSrc = 'assets/wallets/hsuite.svg';\n\n /**\n * Emitted when collapse toggle is clicked\n */\n @Output() toggleCollapseEvent = new EventEmitter<void>();\n\n constructor() {\n addIcons({ chevronDownOutline });\n }\n\n /**\n * Handle toggle click\n */\n protected onToggle(): void {\n if (this.collapsible) {\n this.toggleCollapseEvent.emit();\n }\n }\n\n /**\n * Get active account address (truncated)\n */\n protected getActiveAddress(): string {\n if (!this.activeAccount?.address) return 'No account';\n return this.formatting.truncateAddress(this.activeAccount.address);\n }\n\n /**\n * Get active account network type\n */\n protected getActiveNetworkType(): string {\n if (!this.activeAccount?.networkId) return '';\n return this.formatting.formatNetwork(this.activeAccount.networkId);\n }\n\n /**\n * Get active account network color\n */\n protected getActiveNetworkColor(): string {\n if (!this.activeAccount?.networkId) return 'medium';\n return this.formatting.getNetworkColor(this.activeAccount.networkId);\n }\n\n /**\n * Get primary text based on format\n */\n protected getPrimaryText(): string {\n switch (this.headerFormat) {\n case 'label-count':\n case 'label-only':\n return this.activeAccount?.label || 'No Account';\n\n case 'address-count':\n case 'address-only':\n return this.activeAccount\n ? this.formatting.truncateAddress(this.activeAccount.address)\n : 'No Account';\n\n case 'count-only': {\n const count = this.totalAccountCount;\n return count === 1 ? '1 wallet connected' : `${count} wallets connected`;\n }\n\n default:\n return 'Select Account';\n }\n }\n\n /**\n * Get secondary text based on format\n */\n protected getSecondaryText(): string | null {\n if (this.headerFormat === 'label-count' || this.headerFormat === 'address-count') {\n const count = this.totalAccountCount;\n return count === 1 ? '1 account' : `${count} accounts`;\n }\n return null;\n }\n\n /**\n * Get ARIA label for accessibility\n */\n protected getAriaLabel(): string {\n const label = this.activeAccount?.label || 'No account';\n const count = this.totalAccountCount;\n const collapsed = this.isCollapsed;\n\n return `${label}, ${count} account${count !== 1 ? 's' : ''} connected. ${collapsed ? 'Click to expand' : 'Click to collapse'} account list.`;\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @module LedgerIconsUtil\n * Utilities for getting default icon URLs for ledgers and their native tokens.\n *\n * Uses CoinGecko's public CDN for reliable, high-quality token icons.\n * Shared across wallet and dApp for consistency.\n */\n\n/**\n * Default icon URLs for native ledger tokens\n */\nexport const DEFAULT_LEDGER_ICONS: Record<string, string> = {\n hedera: 'https://assets.coingecko.com/coins/images/3688/standard/hbar.png?1696504364',\n xrpl: 'https://assets.coingecko.com/coins/images/44/standard/xrp-symbol-white-128.png?1696501442',\n};\n\n/**\n * Brand colors for each ledger\n */\nexport const LEDGER_COLORS: Record<string, string> = {\n hedera: '#8259ef',\n xrpl: '#23292f',\n};\n\n/**\n * Display names for each ledger\n */\nexport const LEDGER_NAMES: Record<string, string> = {\n hedera: 'Hedera',\n xrpl: 'XRP Ledger',\n};\n\n/**\n * Get the default icon URL for a ledger\n * @param ledgerId - Ledger identifier (e.g., 'hedera', 'xrpl')\n * @returns Icon URL or empty string if not found\n */\nexport function getLedgerIcon(ledgerId: string): string {\n return DEFAULT_LEDGER_ICONS[ledgerId?.toLowerCase()] || '';\n}\n\n/**\n * Get the brand color for a ledger\n * @param ledgerId - Ledger identifier\n * @returns Hex color string or primary color fallback\n */\nexport function getLedgerColor(ledgerId: string): string {\n return LEDGER_COLORS[ledgerId?.toLowerCase()] || 'var(--ion-color-primary)';\n}\n\n/**\n * Get the display name for a ledger\n * @param ledgerId - Ledger identifier\n * @returns Human-readable ledger name\n */\nexport function getLedgerName(ledgerId: string): string {\n return LEDGER_NAMES[ledgerId?.toLowerCase()] || ledgerId;\n}\n\n/**\n * Get token icon URL, falling back to ledger default if not provided\n * @param tokenIconUrl - Specific token icon URL (optional)\n * @param ledgerId - Ledger identifier for fallback\n * @returns Icon URL or empty string\n */\nexport function getTokenIcon(tokenIconUrl: string | undefined, ledgerId: string): string {\n return tokenIconUrl || getLedgerIcon(ledgerId);\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file account-list.component.ts\n * @description Account list rendering component\n *\n * Renders a list of wallet accounts grouped by ledger.\n * Extracted from AccountSelectorComponent for better maintainability.\n *\n * **Features:**\n * - Renders accounts grouped by ledger (Hedera, XRPL, etc.)\n * - Collapsible ledger groups\n * - Selection state management\n * - Wallet logos and network badges\n * - Accessibility support (ARIA labels, keyboard navigation)\n */\n\nimport {\n Component,\n EventEmitter,\n Input,\n Output,\n inject,\n signal,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonBadge, IonIcon, IonButton, IonSpinner } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n chevronDownOutline,\n closeOutline,\n walletOutline,\n alertCircleOutline,\n peopleOutline,\n personOutline,\n} from 'ionicons/icons';\nimport { AccountFormattingService } from '../account-formatting.service';\nimport { getLedgerIcon, getLedgerColor } from '../../../utils/ledger-icons.util';\n\n/**\n * Account item with session context\n */\nexport interface AccountItem {\n account: {\n id: string;\n address: string;\n ledgerId: string;\n networkId: string;\n label?: string;\n metadata?: {\n channelType?: string;\n isMultisig?: boolean;\n [key: string]: unknown;\n };\n };\n session: {\n providerId: string;\n providerType: string;\n metadata?: {\n sessionKey?: string;\n channelType?: string;\n isMultisig?: boolean;\n [key: string]: unknown;\n };\n };\n}\n\n/**\n * Ledger group containing accounts\n */\nexport interface LedgerGroup {\n ledgerName: string;\n ledgerId: string;\n accounts: AccountItem[];\n}\n\n/**\n * @component AccountListComponent\n * Renders a list of wallet accounts grouped by ledger.\n */\n@Component({\n selector: 'wallet-account-list',\n standalone: true,\n imports: [CommonModule, IonBadge, IonIcon, IonButton, IonSpinner],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <!-- Loading Overlay -->\n <div class=\"loading-overlay\" *ngIf=\"isLoading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <p>Processing...</p>\n </div>\n\n <!-- Account List Content -->\n <div\n *ngIf=\"ledgerGroups.length > 0\"\n class=\"account-list-content\"\n [class.inline-mode]=\"!isModal\"\n [class.modal-mode]=\"isModal\"\n >\n <!-- Description -->\n <div class=\"selector-description\" *ngIf=\"showDescription\">\n Select an account you want to use:\n </div>\n\n <!-- Ledger Groups -->\n <div class=\"sessions-groups\">\n <ng-container *ngFor=\"let ledgerGroup of ledgerGroups; trackBy: trackByLedger\">\n <div class=\"ledger-group\" [class.modal-group]=\"isModal\">\n <!-- Ledger Header -->\n <div\n class=\"ledger-header-row\"\n [class.modal-header]=\"isModal\"\n (click)=\"toggleLedger(ledgerGroup.ledgerName); $event.stopPropagation()\"\n >\n <div class=\"ledger-label\">\n <img\n *ngIf=\"getLedgerIconUrl(ledgerGroup.ledgerId)\"\n [src]=\"getLedgerIconUrl(ledgerGroup.ledgerId)\"\n [alt]=\"ledgerGroup.ledgerName + ' icon'\"\n class=\"ledger-icon-img\"\n />\n <ion-icon\n *ngIf=\"!getLedgerIconUrl(ledgerGroup.ledgerId)\"\n name=\"wallet-outline\"\n class=\"ledger-icon\"\n >\n </ion-icon>\n <span class=\"ledger-name\">{{ ledgerGroup.ledgerName }}</span>\n <ion-badge class=\"account-count-badge\" color=\"medium\">\n {{ ledgerGroup.accounts.length }}\n </ion-badge>\n </div>\n <ion-icon\n name=\"chevron-down-outline\"\n class=\"expand-icon\"\n [class.expanded]=\"isLedgerExpanded(ledgerGroup.ledgerName)\"\n >\n </ion-icon>\n </div>\n\n <!-- Accounts List -->\n <div\n class=\"accounts-list\"\n [class.modal-list]=\"isModal\"\n role=\"radiogroup\"\n [attr.aria-label]=\"'Accounts for ' + ledgerGroup.ledgerName\"\n *ngIf=\"isLedgerExpanded(ledgerGroup.ledgerName)\"\n >\n <ng-container\n *ngFor=\"let accountItem of ledgerGroup.accounts; trackBy: trackByAccount\"\n >\n <!-- Account Item - Compact Card -->\n <div\n class=\"account-card\"\n [class.modal-item]=\"isModal\"\n [class.selected]=\"isAccountSelected(accountItem.account.id)\"\n (click)=\"selectAccount(accountItem)\"\n role=\"radio\"\n tabindex=\"0\"\n [attr.aria-checked]=\"isAccountSelected(accountItem.account.id)\"\n (keydown.enter)=\"selectAccount(accountItem)\"\n (keydown.space)=\"$event.preventDefault(); selectAccount(accountItem)\"\n >\n <!-- Left: Selection Indicator + Logo -->\n <div class=\"card-left\">\n <div\n class=\"selection-indicator\"\n [class.active]=\"isAccountSelected(accountItem.account.id)\"\n >\n <div\n class=\"indicator-dot\"\n *ngIf=\"isAccountSelected(accountItem.account.id)\"\n ></div>\n </div>\n <img\n [src]=\"getWalletLogo(accountItem.session)\"\n [alt]=\"formatting.getProviderName(accountItem.session.providerType)\"\n class=\"wallet-logo-sm\"\n />\n </div>\n\n <!-- Center: Account Details -->\n <div class=\"card-center\">\n <div class=\"account-label\" *ngIf=\"accountItem.account.label\">\n {{ accountItem.account.label }}\n </div>\n <div class=\"account-address\" [class.has-label]=\"accountItem.account.label\">\n {{ formatting.truncateAddress(accountItem.account.address, 10, 8) }}\n </div>\n </div>\n\n <!-- Right: Badges + Actions -->\n <div class=\"card-right\">\n <div class=\"badge-stack\">\n <ion-badge\n [color]=\"formatting.getNetworkColor(accountItem.account.networkId)\"\n class=\"network-badge\"\n >\n {{ formatting.formatNetwork(accountItem.account.networkId) }}\n </ion-badge>\n <div class=\"provider-badge-row\">\n <ion-badge\n *ngIf=\"isMultisigSession(accountItem)\"\n class=\"signing-badge multisig\"\n color=\"tertiary\"\n >\n <ion-icon name=\"people-outline\" class=\"signing-icon\"></ion-icon>\n Multisig\n </ion-badge>\n <ion-badge class=\"provider-badge\" color=\"primary\">\n {{ formatting.getProviderName(accountItem.session.providerType) }}\n </ion-badge>\n </div>\n </div>\n <ion-button\n *ngIf=\"canDisconnectSession(accountItem.session) && isModal\"\n class=\"disconnect-btn\"\n fill=\"clear\"\n color=\"danger\"\n size=\"small\"\n (click)=\"requestDisconnect(accountItem, $event)\"\n [disabled]=\"isLoading\"\n >\n <ion-icon slot=\"icon-only\" name=\"close-outline\"></ion-icon>\n </ion-button>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- No Accounts State -->\n <div class=\"no-accounts\" *ngIf=\"ledgerGroups.length === 0 && !isModal\">\n <div class=\"empty-state-content\">\n <ion-icon name=\"wallet-outline\"></ion-icon>\n <h3>No Accounts Connected</h3>\n <p>Connect a wallet to get started with multi-chain transactions.</p>\n </div>\n </div>\n\n <!-- No Accounts State (Modal) -->\n <div class=\"no-accounts-modal\" *ngIf=\"ledgerGroups.length === 0 && isModal\">\n <ion-icon name=\"wallet-outline\"></ion-icon>\n <h3>No Accounts Connected</h3>\n <p>Connect a wallet to get started</p>\n </div>\n\n <!-- Error State -->\n <div class=\"error-state\" *ngIf=\"error\">\n <ion-icon name=\"alert-circle-outline\" color=\"danger\"></ion-icon>\n <h3>Something went wrong</h3>\n <p>{{ error }}</p>\n <ion-button expand=\"block\" fill=\"outline\" (click)=\"dismissError()\"> Dismiss </ion-button>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n /* Inherit styles from parent component's SCSS */\n `,\n ],\n})\nexport class AccountListComponent {\n protected readonly formatting = inject(AccountFormattingService);\n\n /**\n * Ledger groups containing accounts to display\n */\n @Input() ledgerGroups: LedgerGroup[] = [];\n\n /**\n * Currently selected account ID\n */\n @Input() selectedId?: string;\n\n /**\n * Whether this is displayed in modal mode\n */\n @Input() isModal = false;\n\n /**\n * Loading state\n */\n @Input() isLoading = false;\n\n /**\n * Error message to display\n */\n @Input() error: string | null = null;\n\n /**\n * Whether to show description text\n */\n @Input() showDescription = true;\n\n /**\n * Active account ID from wallet service\n */\n @Input() activeAccountId?: string;\n\n /**\n * Emitted when an account is selected\n */\n @Output() accountSelected = new EventEmitter<AccountItem>();\n\n /**\n * Emitted when disconnect is requested\n */\n @Output() disconnectRequested = new EventEmitter<{\n providerId: string;\n sessionKey?: string;\n }>();\n\n /**\n * Emitted when error is dismissed\n */\n @Output() errorDismissed = new EventEmitter<void>();\n\n /**\n * Track which ledger groups are expanded\n */\n protected readonly expandedLedgers = signal<Set<string>>(\n new Set(['Hedera', 'XRPL', 'hedera', 'xrpl']),\n );\n\n constructor() {\n addIcons({\n chevronDownOutline,\n closeOutline,\n walletOutline,\n alertCircleOutline,\n peopleOutline,\n personOutline,\n });\n }\n\n /**\n * Toggle ledger group expansion\n */\n protected toggleLedger(ledgerName: string): void {\n this.expandedLedgers.update((set) => {\n const newSet = new Set(set);\n if (newSet.has(ledgerName)) {\n newSet.delete(ledgerName);\n } else {\n newSet.add(ledgerName);\n }\n return newSet;\n });\n }\n\n /**\n * Check if ledger group is expanded\n */\n protected isLedgerExpanded(ledgerName: string): boolean {\n return this.expandedLedgers().has(ledgerName);\n }\n\n /**\n * Check if account is currently selected\n */\n protected isAccountSelected(accountId: string): boolean {\n return this.selectedId === accountId || this.activeAccountId === accountId;\n }\n\n /**\n * Check if session can be disconnected (WalletConnect sessions only)\n */\n protected canDisconnectSession(session: any): boolean {\n return session.providerType === 'walletconnect-v2';\n }\n\n /**\n * Check if this is a multisig session\n */\n protected isMultisigSession(accountItem: AccountItem): boolean {\n // Check session metadata first, then account metadata\n const sessionMeta = accountItem.session.metadata;\n const accountMeta = accountItem.account.metadata;\n return (\n sessionMeta?.isMultisig === true ||\n sessionMeta?.channelType === 'party' ||\n accountMeta?.isMultisig === true ||\n accountMeta?.channelType === 'party'\n );\n }\n\n /**\n * Get wallet logo path based on provider type\n */\n protected getWalletLogo(session: any): string {\n const providerType = session?.providerType;\n if (providerType === 'walletconnect-v2') {\n return 'assets/wallets/walletconnect.svg';\n }\n return 'assets/wallets/hsuite.svg';\n }\n\n /**\n * Handle account selection\n */\n protected selectAccount(accountItem: AccountItem): void {\n this.accountSelected.emit(accountItem);\n }\n\n /**\n * Request disconnect for a session\n */\n protected requestDisconnect(accountItem: AccountItem, event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n this.disconnectRequested.emit({\n providerId: accountItem.session.providerId,\n sessionKey: accountItem.session.metadata?.sessionKey,\n });\n }\n\n /**\n * Dismiss error state\n */\n protected dismissError(): void {\n this.errorDismissed.emit();\n }\n\n /**\n * TrackBy function for ledger groups\n */\n protected trackByLedger(_index: number, ledgerGroup: LedgerGroup): string {\n return ledgerGroup.ledgerId;\n }\n\n /**\n * TrackBy function for accounts\n */\n protected trackByAccount(_index: number, accountItem: AccountItem): string {\n return accountItem.account.id;\n }\n\n /**\n * Get icon URL for ledger type (uses CoinGecko CDN)\n */\n protected getLedgerIconUrl(ledgerId: string): string {\n return getLedgerIcon(ledgerId);\n }\n\n /**\n * Get icon color for ledger type\n */\n protected getLedgerIconColor(ledgerId: string): string {\n return getLedgerColor(ledgerId);\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file Centralized event bus for wallet-level events.\n *\n * @module services/wallet-event-bus\n *\n * @description\n * WalletEventBus provides a decoupled way for the angular-sdk to emit events\n * that dApps can subscribe to. It enables reactive handling of wallet lifecycle\n * events without tight coupling between components.\n *\n * **Supported Events:**\n * - `connected` - Provider successfully connected\n * - `disconnected` - Provider disconnected (user or wallet initiated)\n * - `accountChanged` - Active account switched\n * - `accountsUpdated` - Provider's account list changed\n * - `sessionCreated` - New session established\n * - `sessionDeleted` - Session terminated\n * - `sessionRestored` - Session restored from storage\n * - `providerStatusChanged` - Provider status changed\n * - `providerError` - Provider encountered an error\n *\n * Each event is available as both an Angular EventEmitter (for template bindings)\n * and an RxJS Observable (for advanced composition with operators).\n */\n\nimport { Injectable, EventEmitter } from '@angular/core';\nimport { getLogger } from '@hsuite/native-connect-sdk';\nimport { Observable } from 'rxjs';\n\nimport type {\n ConnectionEvent,\n DisconnectionEvent,\n AccountChangeEvent,\n AccountsUpdateEvent,\n SessionEvent,\n ProviderStatusEvent,\n ProviderErrorEvent,\n} from '../models/wallet-events.model';\n\nconst logger = getLogger().scoped?.('WalletEventBus') ?? getLogger();\n\n/**\n * Centralized event bus for wallet events.\n *\n * @service WalletEventBus\n *\n * @description\n * Provides EventEmitters for all wallet-level events that dApps might want to react to.\n * This service is automatically used by UnifiedWalletService to emit events, and dApps\n * can subscribe to these events to handle wallet state changes.\n *\n * All events include a `timestamp` field for ordering and debugging purposes.\n *\n * @providedIn root\n */\n@Injectable({ providedIn: 'root' })\nexport class WalletEventBus {\n /**\n * Emitted when a provider successfully connects\n *\n * @event connected\n */\n readonly connected = new EventEmitter<ConnectionEvent>();\n\n /**\n * Emitted when a provider disconnects\n *\n * @event disconnected\n */\n readonly disconnected = new EventEmitter<DisconnectionEvent>();\n\n /**\n * Emitted when the active account changes\n *\n * @event accountChanged\n */\n readonly accountChanged = new EventEmitter<AccountChangeEvent>();\n\n /**\n * Emitted when a provider's account list updates\n *\n * @event accountsUpdated\n */\n readonly accountsUpdated = new EventEmitter<AccountsUpdateEvent>();\n\n /**\n * Emitted when a new session is created\n *\n * @event sessionCreated\n */\n readonly sessionCreated = new EventEmitter<SessionEvent>();\n\n /**\n * Emitted when a session is deleted\n *\n * @event sessionDeleted\n */\n readonly sessionDeleted = new EventEmitter<SessionEvent>();\n\n /**\n * Emitted when a session is restored from storage\n *\n * @event sessionRestored\n */\n readonly sessionRestored = new EventEmitter<SessionEvent>();\n\n /**\n * Emitted when a provider's status changes\n *\n * @event providerStatusChanged\n */\n readonly providerStatusChanged = new EventEmitter<ProviderStatusEvent>();\n\n /**\n * Emitted when a provider encounters an error\n *\n * @event providerError\n */\n readonly providerError = new EventEmitter<ProviderErrorEvent>();\n\n // RxJS Observable streams for advanced composition\n // These allow using RxJS operators like debounceTime, switchMap, filter, etc.\n\n /**\n * Observable stream for connection events\n */\n readonly connected$: Observable<ConnectionEvent> = this.connected.asObservable();\n\n /**\n * Observable stream for disconnection events\n */\n readonly disconnected$: Observable<DisconnectionEvent> = this.disconnected.asObservable();\n\n /**\n * Observable stream for account change events\n */\n readonly accountChanged$: Observable<AccountChangeEvent> = this.accountChanged.asObservable();\n\n /**\n * Observable stream for accounts update events\n */\n readonly accountsUpdated$: Observable<AccountsUpdateEvent> = this.accountsUpdated.asObservable();\n\n /**\n * Observable stream for session creation events\n */\n readonly sessionCreated$: Observable<SessionEvent> = this.sessionCreated.asObservable();\n\n /**\n * Observable stream for session deletion events\n */\n readonly sessionDeleted$: Observable<SessionEvent> = this.sessionDeleted.asObservable();\n\n /**\n * Observable stream for session restoration events\n */\n readonly sessionRestored$: Observable<SessionEvent> = this.sessionRestored.asObservable();\n\n /**\n * Observable stream for provider status change events\n */\n readonly providerStatusChanged$: Observable<ProviderStatusEvent> =\n this.providerStatusChanged.asObservable();\n\n /**\n * Observable stream for provider error events\n */\n readonly providerError$: Observable<ProviderErrorEvent> = this.providerError.asObservable();\n\n /**\n *\n */\n constructor() {\n logger.debug('Event bus initialized');\n }\n}\n","/**\n * @file Type definitions for wallet connection providers.\n *\n * @module models/provider-types\n *\n * @description\n * Defines the core type definitions used throughout the Angular SDK for wallet\n * provider management. Includes provider types, connection status, metadata\n * interfaces, and configuration interfaces for each supported protocol.\n *\n * **Provider Types:**\n * - `hsuite-native` - HSuite Native Connect protocol\n * - `walletconnect-v2` - WalletConnect v2 protocol\n * - `mobile-native` - P2P Native mobile connections\n *\n * **Connection Status Lifecycle:**\n * ```\n * idle -> connecting -> connected -> disconnecting -> disconnected\n * \\-> error\n * ```\n */\n\n/**\n * Supported wallet connection protocol types.\n *\n * @description\n * Identifies the wallet connection protocol used by a provider.\n * Each type has different capabilities and configuration requirements.\n *\n * - `hsuite-native` - Direct HSuite wallet connections via Nostr/WebRTC\n * - `walletconnect-v2` - WalletConnect v2 protocol for mobile wallets\n * - `mobile-native` - Direct P2P connections to mobile wallets\n */\nexport type ProviderType = 'hsuite-native' | 'walletconnect-v2' | 'mobile-native';\n\n/**\n * Connection status for a provider.\n *\n * @description\n * Tracks the lifecycle state of a wallet connection. UI components can\n * use this to show appropriate feedback (loading spinners, error messages, etc.).\n *\n * **Status Values:**\n * - `idle` - Not connected, no connection attempt in progress\n * - `connecting` - Connection attempt in progress\n * - `connected` - Successfully connected to wallet\n * - `disconnecting` - Disconnection in progress\n * - `disconnected` - Previously connected, now disconnected\n * - `error` - Connection failed\n */\nexport type ConnectionStatus =\n | 'idle'\n | 'connecting'\n | 'connected'\n | 'disconnecting'\n | 'disconnected'\n | 'error';\n\n/**\n * Provider metadata for display purposes.\n *\n * @description\n * Contains display information about a wallet provider, used by UI components\n * to show provider information in connection dialogs and account selectors.\n */\nexport interface ProviderMetadata {\n id?: string;\n name: string;\n type: ProviderType;\n description: string;\n iconUrl?: string;\n icon?: string;\n supportsMultipleAccounts?: boolean;\n features?: string[];\n}\n\n/**\n * Production HSuite Wallet URL.\n *\n * @description\n * Single source of truth for the wallet origin the SDK targets when a consuming\n * dApp does not supply its own `walletUrl`. Point local development at a dev\n * server by passing an explicit `walletUrl` (e.g. `http://localhost:8100`) on the\n * connection config or UI component; the SDK default must stay production-safe so\n * published dApps never open the wallet on localhost.\n */\nexport const DEFAULT_WALLET_URL = 'https://wallet.hsuite.app';\n\n/**\n * HSuite Native Connect configuration.\n *\n * @description\n * Configuration for connecting via the HSuite Native protocol. This protocol\n * uses Nostr for discovery and WebRTC for direct P2P communication.\n *\n * **Required Fields:**\n * - `type` - Must be 'hsuite-native'\n * - `appId` - Unique identifier for your dApp\n * - `appName` - Display name for your dApp\n * - `ledgerId` - Target blockchain ('hedera' or 'xrpl')\n * - `networkId` - Target network (e.g., 'testnet', 'mainnet')\n */\nexport interface HsuiteNativeConfig {\n type: 'hsuite-native';\n appId: string;\n appName: string;\n ledgerId: string;\n networkId: string;\n appUrl?: string;\n appIconUrl?: string;\n /** Wallet origin to open. Defaults to {@link DEFAULT_WALLET_URL} (production); set to a dev server for local testing. */\n walletUrl?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * WalletConnect v2 configuration.\n *\n * @description\n * Configuration for connecting via WalletConnect v2 protocol. Requires a\n * WalletConnect Cloud project ID obtained from https://cloud.walletconnect.com.\n *\n * **Required Fields:**\n * - `type` - Must be 'walletconnect-v2'\n * - `projectId` - WalletConnect Cloud project ID\n * - `ledgerId` - Target blockchain ('hedera' or 'xrpl')\n * - `networkId` - Target network (e.g., 'hedera:testnet')\n */\nexport interface WalletConnectV2Config {\n type: 'walletconnect-v2';\n projectId: string; // WalletConnect Cloud project ID - REQUIRED\n ledgerId: 'hedera' | 'xrpl'; // Which ledger to connect to\n networkId: string; // e.g., 'hedera:testnet' or 'xrpl:testnet'\n appName?: string;\n appDescription?: string;\n appIconUrl?: string;\n}\n\n/**\n * Mobile Native P2P configuration.\n *\n * @description\n * Configuration for direct P2P connections to mobile wallets. This protocol\n * bypasses relay servers for direct device-to-device communication.\n *\n * All fields are optional as the P2P provider can operate with defaults.\n */\nexport interface MobileNativeConfig {\n type: 'mobile-native';\n appId?: string;\n appName?: string;\n ledgerId?: string;\n networkId?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Union type of all connection configurations.\n *\n * @description\n * Represents any valid connection configuration for the supported wallet providers.\n * Use type guards from connection-config.model.ts to narrow to specific config types.\n */\nexport type ConnectionConfig = HsuiteNativeConfig | WalletConnectV2Config | MobileNativeConfig;\n","/**\n * @file Abstract base class for wallet connection providers.\n * @module providers/base-wallet-provider\n *\n * @description\n * BaseWalletProvider defines the common interface that all wallet providers must implement.\n * It ensures consistency across different wallet connection protocols while allowing\n * provider-specific implementations.\n *\n * The Angular SDK includes three built-in providers:\n * - **HsuiteNativeProvider**: HSuite Native Connect protocol\n * - **WalletConnectV2Provider**: WalletConnect v2 protocol\n * - **P2PNativeProvider**: Direct P2P connections via WebRTC\n *\n * Custom providers can extend this class to integrate additional wallet types.\n *\n * @Injectable({ providedIn: 'root' })\n * export class MyCustomProvider extends BaseWalletProvider {\n * readonly id = 'my-custom-wallet';\n *\n * readonly metadata: ProviderMetadata = {\n * id: this.id,\n * name: 'My Custom Wallet',\n * type: 'custom',\n * description: 'Custom wallet integration',\n * supportsMultipleAccounts: false,\n * };\n *\n * readonly status = signal<ConnectionStatus>('disconnected');\n * readonly accounts = signal<UnifiedAccount[]>([]);\n * readonly error = signal<string | null>(null);\n *\n * async connect(config: ConnectionConfig): Promise<void> {\n * // Implementation\n * }\n *\n * async disconnect(): Promise<void> {\n * // Implementation\n * }\n *\n * // ... other abstract methods\n * }\n * ```\n */\n\nimport type { Signal } from '@angular/core';\n\nimport type { ConnectionConfig } from '../models/connection-config.model';\nimport type { ConnectionStatus, ProviderMetadata } from '../models/provider-types';\nimport type { UnifiedAccount } from '../models/unified-account.model';\n\n/**\n * Options for signing a blockchain transaction.\n *\n * @description\n * Configuration object passed to {@link BaseWalletProvider.signTransaction}.\n */\nexport interface SignTransactionOptions {\n /** The account address to sign with (e.g., '0.0.123456' for Hedera) */\n accountAddress: string;\n /** Serialized transaction payload (format depends on ledger type) */\n payload: string;\n /** Ledger identifier (e.g., 'hedera', 'xrpl') */\n ledgerId?: string;\n /** Network identifier (e.g., 'mainnet', 'testnet') */\n networkId?: string;\n}\n\n/**\n * Options for submitting a transaction to the blockchain.\n *\n * @description\n * Extends {@link SignTransactionOptions} with batch transaction support.\n * Configuration object passed to {@link BaseWalletProvider.submitTransaction}.\n */\nexport interface SubmitTransactionOptions extends SignTransactionOptions {\n /** Whether this is a batch/atomic transaction */\n isBatch?: boolean;\n /** Unique identifier for batch grouping */\n batchKey?: string;\n /** Inner transactions within the batch */\n innerTransactions?: Array<{ payload: string; description?: string }>;\n}\n\n/**\n * Result of a transaction signing operation.\n *\n * @description\n * Returned by {@link BaseWalletProvider.signTransaction} upon successful signing.\n */\nexport interface SignResult {\n /** The transaction payload with signature applied */\n signedPayload: string;\n /** Raw signature bytes (optional, format depends on ledger) */\n signature?: string;\n /** Additional metadata from the wallet */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Result of a transaction submission.\n *\n * @description\n * Returned by {@link BaseWalletProvider.submitTransaction} upon successful submission.\n */\nexport interface SubmitResult {\n /** Ledger-specific transaction identifier (e.g., '0.0.123@1234567890.123' for Hedera) */\n transactionId: string;\n /** Transaction hash/ID on the blockchain */\n transactionHash?: string;\n /** Additional metadata from the wallet */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Options for signing an arbitrary message.\n *\n * @description\n * Configuration object passed to {@link BaseWalletProvider.signMessage}.\n * Used for authentication, DAO voting, and other non-transaction signatures.\n */\nexport interface SignMessageOptions {\n /** The account address to sign with */\n accountAddress: string;\n /** The message to sign (plain text or base64 encoded) */\n message: string;\n /** Encoding of the message: 'utf-8' (default) or 'base64' */\n encoding?: 'utf-8' | 'base64';\n /** Ledger identifier (e.g., 'hedera', 'xrpl') */\n ledgerId?: string;\n /** Network identifier (e.g., 'mainnet', 'testnet') */\n networkId?: string;\n}\n\n/**\n * Result of a message signing operation.\n *\n * @description\n * Returned by {@link BaseWalletProvider.signMessage} upon successful signing.\n */\nexport interface SignMessageResult {\n /** The signature over the domain-separated message (hex, format depends on ledger). */\n signature: string;\n /** The public key used for signing (for verification). */\n publicKey?: string;\n /**\n * Algorithm label (§21.3 — added for deterministic verification across\n * chains). Absent on legacy responses from older wallets.\n */\n algorithm?: 'ed25519' | 'ecdsa_secp256k1' | 'secp256k1';\n /**\n * Echo of the request's encoding. Callers use it to decode `message`\n * back into bytes when reconstructing the signed blob for verification.\n */\n encoding?: 'utf-8' | 'base64';\n /**\n * CAIP-2 chain identifier that was embedded in the signed blob. Enables\n * third-party verifiers to reconstruct the exact signed bytes without\n * extra network context.\n */\n caipChainId?: string;\n /**\n * Decoded message byte length (NOT character count). Prevents truncation\n * ambiguity when verifying the signature.\n */\n messageLength?: number;\n /** Additional metadata from the wallet. */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Abstract base class that all wallet providers must implement.\n *\n * @description\n * BaseWalletProvider defines the contract for wallet integrations. All providers\n * (HSuite Native, WalletConnect, P2P, etc.) extend this class to ensure a\n * consistent API for dApp developers.\n *\n * Key responsibilities:\n * - Managing connection state via reactive signals\n * - Exposing connected accounts\n * - Handling transaction signing and submission\n * - Message signing for authentication\n *\n * Implementers must provide:\n * - Unique `id` and `metadata` for identification\n * - Reactive `status`, `accounts`, and `error` signals\n * - `connect()` and `disconnect()` lifecycle methods\n * - `signTransaction()`, `submitTransaction()`, and `signMessage()` for operations\n * - `isAvailable()` to check if the wallet type is available\n *\n * @publicApi\n */\nexport abstract class BaseWalletProvider {\n /**\n * Unique identifier for this provider instance.\n *\n * @description\n * Used to identify the provider in the registry. Must be unique across\n * all registered providers.\n */\n abstract readonly id: string;\n\n /**\n * Provider metadata for display and identification.\n *\n * @description\n * Contains display information (name, description, icon) and feature flags\n * for the provider.\n */\n abstract readonly metadata: ProviderMetadata;\n\n /**\n * Current connection status as a reactive Angular signal.\n *\n * @description\n * Tracks the lifecycle state of the wallet connection. UI components can\n * use this signal to reactively update based on connection state.\n *\n * Possible values:\n * - `'idle'`: Not connected, no connection attempt in progress\n * - `'connecting'`: Connection attempt in progress\n * - `'connected'`: Successfully connected to wallet\n * - `'disconnected'`: Previously connected, now disconnected\n * - `'error'`: Connection failed (check `error` signal for details)\n */\n abstract readonly status: Signal<ConnectionStatus>;\n\n /**\n * Connected accounts as a reactive Angular signal.\n *\n * @description\n * List of accounts available from the connected wallet. Empty when\n * disconnected. Updates automatically when wallet accounts change.\n */\n abstract readonly accounts: Signal<UnifiedAccount[]>;\n\n /**\n * Error message if status is 'error', as a reactive Angular signal.\n *\n * @description\n * Contains human-readable error message when connection fails.\n * Null when no error has occurred.\n */\n abstract readonly error: Signal<string | null>;\n\n /**\n * Connects to the wallet with the given configuration.\n *\n * @description\n * Initiates a connection to the wallet. The connection flow varies by\n * provider type (QR code, popup, deep link, etc.).\n *\n * @param config - Provider-specific connection configuration\n *\n * @throws {Error} If connection fails or times out\n */\n abstract connect(config: ConnectionConfig): Promise<void>;\n\n /**\n * Disconnects from the wallet.\n *\n * @description\n * Terminates the wallet connection and clears account state.\n */\n abstract disconnect(): Promise<void>;\n\n /**\n * Signs a transaction without submitting it.\n *\n * @description\n * Requests the wallet to sign the transaction payload. The signed\n * transaction can later be submitted to the network.\n *\n * @param options - Transaction signing options\n *\n * @returns Promise resolving to the signing result\n *\n * @throws {Error} If user rejects or signing fails\n */\n abstract signTransaction(options: SignTransactionOptions): Promise<SignResult>;\n\n /**\n * Signs and submits a transaction to the network.\n *\n * @description\n * Performs a complete transaction lifecycle: sign and submit to the\n * blockchain network.\n *\n * @param options - Transaction submission options\n *\n * @returns Promise resolving to the submission result\n *\n * @throws {Error} If user rejects, signing fails, or submission fails\n */\n abstract submitTransaction(options: SubmitTransactionOptions): Promise<SubmitResult>;\n\n /**\n * Signs an arbitrary message.\n *\n * @description\n * Requests the wallet to sign a non-transaction message, typically used\n * for authentication challenges, DAO voting, or proof-of-ownership.\n *\n * @param options - Message signing options\n *\n * @returns Promise resolving to the signature result\n *\n * @throws {Error} If user rejects or signing fails\n */\n abstract signMessage(options: SignMessageOptions): Promise<SignMessageResult>;\n\n /**\n * Checks if this provider is available in the current environment.\n *\n * @description\n * Determines if the wallet type can be used. For example:\n * - Browser extension providers check if the extension is installed\n * - WebRTC providers check for RTCPeerConnection support\n * - Native providers typically return true\n *\n * @returns Promise resolving to true if provider can be used\n */\n abstract isAvailable(): Promise<boolean>;\n\n /**\n * Gets the primary (first) connected account.\n *\n * @description\n * Convenience method to retrieve the first account from the connected\n * wallet. Returns null if no accounts are connected.\n *\n * @returns The first connected account, or null if none\n */\n getPrimaryAccount(): UnifiedAccount | null {\n const accts = this.accounts();\n return accts.length > 0 ? accts[0] : null;\n }\n\n /**\n * Checks if the provider is currently connected.\n *\n * @description\n * Convenience method that checks if `status()` equals `'connected'`.\n *\n * @returns true if provider is connected, false otherwise\n */\n isConnected(): boolean {\n return this.status() === 'connected';\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file channel-client.service.ts\n * @description Angular wrapper for the unified ChannelClient.\n *\n * ChannelClientService\n *\n * Angular service that wraps the ChannelClient from native-wallet-sdk,\n * providing reactive signals and Angular-friendly APIs for dApp-wallet\n * communication using the new unified channel protocol.\n *\n * Key features:\n * - Reactive state via Angular signals\n * - NgZone integration for proper change detection\n * - Automatic session persistence\n * - Support for both session (1:1) and party (N:N) channels\n *\n * This service is designed to replace the existing NostrSessionClient\n * as part of the protocol simplification effort. It can coexist with\n * the legacy implementation during migration.\n *\n * @Component({ ... })\n * export class AppComponent {\n * private channelService = inject(ChannelClientService);\n *\n * readonly state = this.channelService.state;\n * readonly accounts = this.channelService.accounts;\n *\n * async connect() {\n * const invite = await this.channelService.connect({\n * type: 'session',\n * appId: 'my-dapp',\n * appName: 'My dApp',\n * ledgerId: 'hedera',\n * networkId: 'mainnet',\n * });\n * // Open wallet with invite URL\n * window.open(this.channelService.getWalletInviteUrl(invite, walletUrl));\n * }\n * }\n * ```\n */\n\nimport {\n Injectable,\n inject,\n signal,\n computed,\n NgZone,\n type Signal,\n type WritableSignal,\n} from '@angular/core';\nimport {\n ChannelClient,\n type ChannelInvite,\n type ChannelState,\n type ChannelType,\n type ChannelAccount,\n type TransportState,\n type PersistedChannel,\n encodeChannelInvite,\n getLogger,\n} from '@hsuite/native-connect-sdk';\n\nimport { DEFAULT_WALLET_URL } from '../../models/provider-types';\nimport type { UnifiedAccount } from '../../models/unified-account.model';\n\nconst logger = getLogger().scoped?.('ChannelClientService') ?? getLogger();\n\n/**\n * ChannelConnectConfig\n *\n * Configuration for establishing a new channel.\n */\nexport interface ChannelConnectConfig {\n /** Channel type: 'session' for 1:1, 'party' for multisig */\n type: ChannelType;\n /** dApp identifier */\n appId: string;\n /** dApp display name */\n appName: string;\n /** dApp icon URL (optional) */\n appIcon?: string;\n /**\n * dApp origin URL (optional). When omitted, the SDK falls back to\n * `window.location.origin` so the wallet can always show the user where the\n * connection request is coming from. Override this only if your dApp serves\n * the wallet integration from a different origin than the page hosting it.\n */\n appOrigin?: string;\n /** Target ledger (e.g., 'hedera', 'xrpl') */\n ledgerId: string;\n /** Target network (e.g., 'mainnet', 'testnet') */\n networkId: string;\n /** Requested permissions */\n permissions?: string[];\n /** Nostr relay URLs (optional, uses defaults) */\n relays?: string[];\n /** Wallet URL for generating invite links */\n walletUrl?: string;\n}\n\n/**\n * ChannelClientService\n *\n * Angular service for unified channel-based dApp-wallet communication.\n */\n@Injectable({ providedIn: 'root' })\nexport class ChannelClientService {\n private readonly zone = inject(NgZone);\n private client: ChannelClient | null = null;\n\n // ============================================================================\n // Reactive State\n // ============================================================================\n\n /** Current channel state */\n private readonly _state: WritableSignal<ChannelState> = signal('idle');\n readonly state: Signal<ChannelState> = this._state.asReadonly();\n\n /** Current transport state (nostr-only, p2p-connected, etc.) */\n private readonly _transportState: WritableSignal<TransportState> = signal('nostr-only');\n readonly transportState: Signal<TransportState> = this._transportState.asReadonly();\n\n /** Approved accounts from the wallet */\n private readonly _accounts: WritableSignal<ChannelAccount[]> = signal([]);\n readonly accounts: Signal<ChannelAccount[]> = this._accounts.asReadonly();\n\n /** Current channel invite (if connected) */\n private readonly _currentInvite: WritableSignal<ChannelInvite | null> = signal(null);\n readonly currentInvite: Signal<ChannelInvite | null> = this._currentInvite.asReadonly();\n\n /** Error message (if any) */\n private readonly _error: WritableSignal<string | null> = signal(null);\n readonly error: Signal<string | null> = this._error.asReadonly();\n\n /** Flag to prevent auto-restore from interfering with new connections */\n private connectingNewSession = false;\n\n // ============================================================================\n // Computed State\n // ============================================================================\n\n /** Whether the channel is currently connected and active */\n readonly isConnected = computed(() => this._state() === 'active');\n\n /** Whether we're currently connecting */\n readonly isConnecting = computed(() => {\n const s = this._state();\n return s === 'connecting' || s === 'pending';\n });\n\n /** Accounts formatted as UnifiedAccount for compatibility */\n readonly unifiedAccounts = computed<UnifiedAccount[]>(() => {\n const accounts = this._accounts();\n const invite = this._currentInvite();\n if (!invite) return [];\n\n return accounts.map((account, index) => {\n const accountMetadata = (account as { metadata?: Record<string, unknown> }).metadata;\n return {\n id: `channel-${account.address}`,\n address: account.address,\n label: account.alias ?? `Account ${index + 1}`,\n ledgerId: account.ledgerId,\n networkId: account.networkId,\n providerId: 'hsuite-native',\n providerType: 'hsuite-native' as const,\n metadata: {\n ...(accountMetadata ?? {}),\n channelId: invite.id,\n channelType: invite.type,\n isMultisig: account.isMultisig === true,\n multisigThreshold: account.multisigThreshold,\n multisigTotal: account.multisigTotal,\n publicKey: account.publicKey ?? '',\n },\n };\n });\n });\n\n /**\n *\n */\n constructor() {\n // Note: Auto-restore is intentionally NOT called here.\n // Session lifecycle (connect/disconnect/restore) is controlled by\n // HsuiteNativeProvider, which calls attemptRestore() as needed.\n // This keeps ChannelClientService as a passive wrapper.\n }\n\n // ============================================================================\n // Public API\n // ============================================================================\n\n /**\n * Establish a new channel connection.\n * Returns the invite to share with the wallet (via QR code or deep link).\n *\n * @param config - Channel configuration\n * @returns The channel invite for wallet scanning\n */\n async connect(config: ChannelConnectConfig): Promise<ChannelInvite> {\n if (this._state() === 'connecting' || this._state() === 'pending') {\n logger.warn('Connection already in progress');\n const existing = this._currentInvite();\n if (existing) return existing;\n throw new Error('Connection already in progress');\n }\n\n // Mark that we're initiating a new session to prevent auto-restore interference\n this.connectingNewSession = true;\n\n // CRITICAL: Disconnect any existing client before creating a new one\n // This prevents the old client from interfering with the new connection\n if (this.client) {\n try {\n await this.client.disconnect();\n } catch {\n // Ignore disconnect errors\n }\n this.client = null;\n }\n\n // Clear any old stored session before starting a new connection\n // This prevents restoration of old sessions during the connection process\n this.clearStoredChannel();\n\n this.runInZone(() => {\n this._state.set('connecting');\n this._error.set(null);\n this._currentInvite.set(null);\n this._accounts.set([]);\n });\n\n try {\n // Create new client with callbacks for immediate state updates\n // This ensures rejection/disconnection is detected immediately, not just via polling\n this.client = new ChannelClient({\n onStateChange: (state) => {\n // Log immediately before runInZone for debugging\n console.log('[ChannelClientService] onStateChange callback received:', {\n newState: state,\n previousState: this._state(),\n timestamp: Date.now(),\n });\n\n this.runInZone(() => {\n const previousState = this._state();\n if (state !== previousState) {\n logger.debug('State change via callback', { from: previousState, to: state });\n this._state.set(state);\n\n // Handle error state - this is triggered on rejection\n if (state === 'error') {\n console.log(\n '[ChannelClientService] Error state detected - connection rejected or failed',\n );\n const errorMsg = 'Connection rejected or failed';\n this._error.set(errorMsg);\n }\n\n // Handle disconnected state explicitly\n if (state === 'disconnected') {\n console.log('[ChannelClientService] Disconnected state detected');\n }\n\n // Reset connecting flag when connection is complete or failed\n if (state === 'active' || state === 'error' || state === 'disconnected') {\n this.connectingNewSession = false;\n }\n\n // Persist when active\n if (state === 'active' && previousState !== 'active') {\n this.persistCurrentState();\n }\n }\n });\n },\n onAccountsChange: (accounts) => {\n this.runInZone(() => {\n logger.debug('Accounts change via callback', { count: accounts.length });\n this._accounts.set(accounts);\n // Re-persist when accounts change\n if (this._state() === 'active') {\n this.persistCurrentState();\n }\n });\n },\n onTransportChange: (transport) => {\n this.runInZone(() => {\n if (transport !== this._transportState()) {\n logger.debug('Transport change via callback', { state: transport });\n this._transportState.set(transport);\n }\n });\n },\n });\n\n // Connect using proper ChannelConfig format. Default `origin` to\n // `window.location.origin` so wallets always have a URL to display in\n // the approval prompt — without this, dApps that forget to pass an\n // origin show up as anonymous, hurting trust signals.\n const resolvedOrigin =\n config.appOrigin ??\n (typeof window !== 'undefined' && window.location ? window.location.origin : undefined);\n\n const invite = await this.client.connect({\n type: config.type,\n app: {\n id: config.appId,\n name: config.appName,\n icon: config.appIcon,\n origin: resolvedOrigin,\n },\n context: {\n ledgerId: config.ledgerId,\n networkId: config.networkId,\n },\n permissions: config.permissions,\n relays: config.relays,\n });\n\n // Set up state synchronization\n this.setupStateSync();\n\n this.runInZone(() => {\n this._currentInvite.set(invite);\n this._state.set('pending');\n });\n\n // Store invite for reconnection\n this.storeInvite(invite);\n\n logger.info('Channel connection initiated', {\n channelId: invite.id.slice(0, 8),\n type: invite.type,\n });\n\n return invite;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('Connection failed', { error: message });\n\n // Reset connecting flag on error\n this.connectingNewSession = false;\n\n this.runInZone(() => {\n this._state.set('error');\n this._error.set(message);\n });\n\n throw error;\n }\n }\n\n /**\n * Generate a wallet invite URL for the current channel.\n *\n * @param invite - The channel invite (defaults to current)\n * @param walletUrl - Base URL of the wallet\n * @returns Full URL with invite parameter\n */\n getWalletInviteUrl(invite?: ChannelInvite, walletUrl = DEFAULT_WALLET_URL): string {\n const inv = invite ?? this._currentInvite();\n if (!inv) {\n throw new Error('No active invite');\n }\n\n const encoded = encodeChannelInvite(inv);\n return `${walletUrl}?hsuite_invite=${encodeURIComponent(encoded)}`;\n }\n\n /**\n * Send an RPC request to the wallet.\n *\n * @param method - RPC method name\n * @param params - Method parameters\n * @param timeoutMs - Request timeout (default: 60s)\n * @returns The RPC response\n */\n async request<T = unknown>(\n method: string,\n params: Record<string, unknown>,\n timeoutMs = 60000,\n ): Promise<T> {\n if (!this.client) {\n throw new Error('Not connected - no active channel client. Please reconnect to the wallet.');\n }\n\n const state = this._state();\n if (state !== 'active' && state !== 'approved') {\n throw new Error(\n `Not connected - channel state is '${state}'. Please reconnect to the wallet.`,\n );\n }\n\n logger.debug('Sending RPC request', { method, state });\n\n return this.client.request<T>(method, params, timeoutMs);\n }\n\n /**\n * Sign a transaction via the wallet.\n *\n * @param options\n * @param accountAddress - Signer account address\n * @param options.accountAddress\n * @param options.payload\n * @param options.ledgerId\n * @param options.networkId\n * @param payload - Transaction payload (base64 or hex)\n * @param ledgerId - Optional ledger override\n * @param networkId - Optional network override\n * @returns Sign result with signature\n */\n async signTransaction(options: {\n accountAddress: string;\n payload: string;\n ledgerId?: string;\n networkId?: string;\n }): Promise<{ signature: string; signedPayload?: string; metadata?: Record<string, unknown> }> {\n const response = await this.request<{\n signature?: string;\n signedPayload?: string;\n signedTransaction?: string;\n metadata?: Record<string, unknown>;\n }>('ledger/sign', {\n accountAddress: options.accountAddress,\n payload: options.payload,\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n });\n\n return {\n signature: response.signature ?? '',\n signedPayload: response.signedPayload ?? response.signedTransaction,\n metadata: response.metadata,\n };\n }\n\n /**\n * Sign and submit a transaction in one call (single prompt).\n *\n * @param options\n * @param accountAddress - Signer account address\n * @param options.accountAddress\n * @param options.payload\n * @param options.ledgerId\n * @param options.networkId\n * @param options.isBatch\n * @param options.batchKey\n * @param options.innerTransactions\n * @param payload - Transaction payload\n * @param ledgerId - Optional ledger override\n * @param networkId - Optional network override\n * @returns Submit result with transaction ID\n */\n async signAndSubmitTransaction(options: {\n accountAddress: string;\n payload: string;\n ledgerId?: string;\n networkId?: string;\n // Batch transaction fields\n isBatch?: boolean;\n batchKey?: string;\n innerTransactions?: Array<{ payload: string; description?: string }>;\n }): Promise<{\n transactionId: string;\n transactionHash?: string;\n metadata?: Record<string, unknown>;\n }> {\n const response = await this.request<{\n transactionId?: string;\n transactionHash?: string;\n metadata?: Record<string, unknown>;\n }>('ledger/signAndSubmit', {\n accountAddress: options.accountAddress,\n payload: options.payload,\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n // Pass batch transaction fields if present\n ...(options.isBatch && {\n isBatch: options.isBatch,\n batchKey: options.batchKey,\n innerTransactions: options.innerTransactions,\n }),\n });\n\n return {\n transactionId: response.transactionId ?? '',\n transactionHash: response.transactionHash,\n metadata: response.metadata,\n };\n }\n\n /**\n * Disconnect from the wallet.\n */\n async disconnect(): Promise<void> {\n // Stop state polling first\n this.stopStateSync();\n\n if (this.client) {\n try {\n await this.client.disconnect();\n } catch (error) {\n logger.warn('Disconnect error', { error });\n }\n this.client = null;\n }\n\n this.clearStoredChannel();\n\n this.runInZone(() => {\n this._state.set('disconnected');\n this._transportState.set('nostr-only');\n this._accounts.set([]);\n this._currentInvite.set(null);\n this._error.set(null);\n });\n\n logger.info('Disconnected from channel');\n }\n\n /**\n * Attempt to restore a previous session.\n *\n * Note: This method is called by HsuiteNativeProvider as the single point\n * of session lifecycle control. Do not call from multiple places.\n *\n * @returns True if restoration was successful\n */\n async attemptRestore(): Promise<boolean> {\n // Skip restore if a new connection is being initiated\n if (this.connectingNewSession) {\n logger.debug('Skipping restore - new connection in progress');\n return false;\n }\n\n const stored = this.getStoredChannel();\n if (!stored) {\n return false;\n }\n\n // §21.1 Option A: legacy persisted channels (pre-localContext-persistence)\n // cannot be safely restored — reconnecting re-derives the Ed25519 signing\n // keypair with empty context, producing a different pubKey than the one\n // the peer TOFU-bound at initial connect, and the next signed message\n // floods HWA-04 impersonation errors. Rather than silently fall through\n // to that broken path, clear the stored channel and force a fresh scan.\n // Safe to do unconditionally at this point in the project's lifecycle:\n // no dApp sessions are live in production yet.\n if (stored.localContext === undefined) {\n logger.warn(\n 'Clearing legacy persisted channel without localContext — user must re-approve the dApp connection (§21.1)',\n { channelId: stored.id.slice(0, 8) },\n );\n this.clearStoredChannel();\n return false;\n }\n\n logger.info('Attempting session restore', {\n channelId: stored.id.slice(0, 8),\n });\n\n this.runInZone(() => {\n this._state.set('connecting');\n });\n\n try {\n // Create client with callbacks for immediate state updates\n this.client = new ChannelClient({\n onStateChange: (state) => {\n this.runInZone(() => {\n const previousState = this._state();\n if (state !== previousState) {\n logger.debug('State change via callback (reconnect)', {\n from: previousState,\n to: state,\n });\n this._state.set(state);\n if (state === 'error') {\n const errorMsg =\n this.client?.state === 'error' ? 'Connection rejected or failed' : null;\n this._error.set(errorMsg);\n }\n if (state === 'active' || state === 'error' || state === 'disconnected') {\n this.connectingNewSession = false;\n }\n if (state === 'active' && previousState !== 'active') {\n this.persistCurrentState();\n }\n }\n });\n },\n onAccountsChange: (accounts) => {\n this.runInZone(() => {\n logger.debug('Accounts change via callback (reconnect)', { count: accounts.length });\n this._accounts.set(accounts);\n if (this._state() === 'active') {\n this.persistCurrentState();\n }\n });\n },\n onTransportChange: (transport) => {\n this.runInZone(() => {\n if (transport !== this._transportState()) {\n logger.debug('Transport change via callback (reconnect)', { state: transport });\n this._transportState.set(transport);\n }\n });\n },\n });\n // Pass the known remote peer fingerprint for P2P restoration\n const remotePeer = stored.knownPeers?.[0];\n await this.client.reconnect(stored, remotePeer);\n\n this.setupStateSync();\n\n // Restore invite and accounts from persisted/client data\n const restoredInvite = this.client.currentInvite;\n const restoredAccounts = this.client.accounts;\n this.runInZone(() => {\n if (restoredInvite) {\n this._currentInvite.set(restoredInvite);\n }\n // Immediately sync accounts from the client\n if (restoredAccounts.length > 0) {\n this._accounts.set(restoredAccounts);\n }\n this._state.set('active');\n });\n\n logger.info('Session restored successfully', {\n channelId: stored.id.slice(0, 8),\n accounts: restoredAccounts.length,\n });\n return true;\n } catch (error) {\n logger.warn('Session restore failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Clean up the partially initialized client\n this.client = null;\n\n this.runInZone(() => {\n this._state.set('disconnected');\n });\n\n this.clearStoredChannel();\n return false;\n }\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Run a function inside NgZone for proper change detection.\n * @param fn\n */\n private runInZone(fn: () => void): void {\n if (this.zone) {\n this.zone.run(fn);\n } else {\n fn();\n }\n }\n\n /** Current polling timeout ID for cleanup */\n private pollingTimeoutId?: ReturnType<typeof setTimeout>;\n\n /**\n * Set up state synchronization from the underlying client.\n * Polling continues as long as the client exists - it doesn't stop on disconnect/error\n * to properly track state changes during reconnection.\n */\n private setupStateSync(): void {\n if (!this.client) return;\n\n // Clear any existing polling\n this.stopStateSync();\n\n // Poll for state changes (ChannelClient uses getters, not signals)\n const checkState = () => {\n if (!this.client) {\n this.pollingTimeoutId = undefined;\n return;\n }\n\n // Use getters directly (not function calls)\n const clientState = this.client.state;\n const clientAccounts = this.client.accounts;\n const clientTransport = this.client.transportState;\n\n this.runInZone(() => {\n const previousState = this._state();\n if (clientState !== previousState) {\n this._state.set(clientState);\n // Reset the connecting flag when connection is complete (active) or failed (error, disconnected)\n if (\n clientState === 'active' ||\n clientState === 'error' ||\n clientState === 'disconnected'\n ) {\n this.connectingNewSession = false;\n }\n // Re-store session when it becomes active (after approval with accounts)\n if (clientState === 'active' && previousState !== 'active') {\n this.persistCurrentState();\n }\n }\n // Deep compare accounts array\n const currentAccounts = this._accounts();\n if (\n clientAccounts.length !== currentAccounts.length ||\n clientAccounts.some((acc, i) => acc.address !== currentAccounts[i]?.address)\n ) {\n this._accounts.set(clientAccounts);\n // Re-persist when accounts change\n if (clientState === 'active') {\n this.persistCurrentState();\n }\n }\n if (clientTransport !== this._transportState()) {\n this._transportState.set(clientTransport);\n logger.debug('Transport state updated', { state: clientTransport });\n }\n });\n\n // Continue polling as long as client exists\n // Use faster polling for active states, slower for idle/disconnected\n if (this.client) {\n const pollInterval =\n clientState === 'active' ||\n clientState === 'pending' ||\n clientState === 'connecting' ||\n clientState === 'approved'\n ? 100 // Fast polling during active states\n : 500; // Slower polling during idle/disconnected (save CPU)\n this.pollingTimeoutId = setTimeout(checkState, pollInterval);\n } else {\n this.pollingTimeoutId = undefined;\n }\n };\n\n this.pollingTimeoutId = setTimeout(checkState, 100);\n }\n\n /**\n * Stop state synchronization polling.\n */\n private stopStateSync(): void {\n if (this.pollingTimeoutId) {\n clearTimeout(this.pollingTimeoutId);\n this.pollingTimeoutId = undefined;\n }\n }\n\n // ============================================================================\n // Storage\n // ============================================================================\n\n private static readonly STORAGE_KEY = 'hsuite_channel_persisted';\n\n /**\n * Persist current state for reconnection after approval.\n */\n private persistCurrentState(): void {\n if (!this.client) return;\n try {\n const persisted = this.client.exportState();\n if (persisted) {\n localStorage.setItem(ChannelClientService.STORAGE_KEY, JSON.stringify(persisted));\n logger.debug('Channel state persisted', {\n channelId: persisted.id.slice(0, 8),\n accounts: persisted.accounts?.length ?? 0,\n });\n }\n } catch (error) {\n logger.warn('Failed to persist channel state', { error });\n }\n }\n\n /**\n * Store channel state for reconnection.\n * Uses client's exportState() to get proper PersistedChannel format.\n * @param invite\n */\n private storeInvite(invite: ChannelInvite): void {\n try {\n // Use the client's exportState if available, otherwise create minimal persisted data\n const persisted = this.client?.exportState();\n if (persisted) {\n localStorage.setItem(ChannelClientService.STORAGE_KEY, JSON.stringify(persisted));\n } else {\n // Fallback: create minimal persisted channel.\n // C-1 / SOC2 CC6.6 — `createdAt` is required on PersistedChannel\n // so the absolute-lifetime reaper can survive a reconnect. In\n // this fallback path we don't know the original creation time\n // (the client didn't expose its exportState), so seed it to\n // \"now\" — the worst case is the reaper waits a full lifetime\n // from this point, which is no weaker than the previous\n // behaviour where it had no anchor at all.\n const now = Date.now();\n const minimal: PersistedChannel = {\n version: 1,\n id: invite.id,\n type: invite.type,\n invitation: encodeChannelInvite(invite),\n fingerprint: 'unknown',\n accounts: this._accounts(),\n knownPeers: [],\n createdAt: now,\n lastActivity: now,\n isHost: false,\n };\n localStorage.setItem(ChannelClientService.STORAGE_KEY, JSON.stringify(minimal));\n }\n } catch {\n logger.warn('Failed to store channel');\n }\n }\n\n /**\n * Retrieve stored channel for reconnection.\n */\n private getStoredChannel(): PersistedChannel | null {\n try {\n const stored = localStorage.getItem(ChannelClientService.STORAGE_KEY);\n if (stored) {\n return JSON.parse(stored) as PersistedChannel;\n }\n } catch {\n logger.warn('Failed to retrieve stored channel');\n }\n return null;\n }\n\n /**\n * Clear stored channel data.\n */\n private clearStoredChannel(): void {\n try {\n localStorage.removeItem(ChannelClientService.STORAGE_KEY);\n } catch {\n // Ignore\n }\n }\n}\n","/**\n * @file Provider implementation for HSuite Native Connect protocol.\n * @module providers/hsuite-native-provider\n *\n * @description\n * HsuiteNativeProvider implements the {@link BaseWalletProvider} interface for the\n * HSuite Native Connect protocol. This provider enables secure communication between\n * dApps and HSuite Wallet using the `hsc:` protocol over Nostr relays with automatic\n * WebRTC P2P upgrade.\n *\n * Key Features:\n * - **Local-First Discovery**: Uses BroadcastChannel for instant same-browser wallet detection\n * - **Nostr Communication**: Uses Nostr relays for encrypted channel messaging\n * - **Automatic P2P Upgrade**: Upgrades to direct WebRTC when possible for lower latency\n * - **Session Persistence**: Supports automatic reconnection after page reload\n * - **Cross-Platform**: Works with desktop browsers, mobile browsers, and native apps\n *\n * Connection Flow:\n * ```\n * 1. dApp calls connect() with configuration\n * 2. Provider checks local discovery for same-browser wallets (instant!)\n * 3. If wallet found -> sends invite via BroadcastChannel (<1ms)\n * 4. If not found -> opens wallet tab/window with invite URL\n * 5. Wallet receives invite and establishes channel via Nostr relay\n * 6. User approves connection in wallet\n * 7. Channel becomes active, accounts are available\n * 8. P2P upgrade happens automatically in background\n * ```\n */\n\nimport { Injectable, signal, computed, inject, effect, NgZone } from '@angular/core';\nimport { getLogger, LocalDiscoveryService } from '@hsuite/native-connect-sdk';\n\nimport type {\n ConnectionStatus,\n ProviderMetadata,\n ConnectionConfig,\n HsuiteNativeConfig,\n} from '../models/provider-types';\nimport { DEFAULT_WALLET_URL } from '../models/provider-types';\nimport type { UnifiedAccount } from '../models/unified-account.model';\nimport { WalletEventBus } from '../services/wallet-event-bus.service';\n\nimport {\n BaseWalletProvider,\n SignTransactionOptions,\n SubmitTransactionOptions,\n SignResult,\n SubmitResult,\n SignMessageOptions,\n SignMessageResult,\n} from './base-wallet-provider';\nimport { ChannelClientService } from './hsuite-native/channel-client.service';\n\nconst logger = getLogger().scoped?.('HsuiteNativeProvider') ?? getLogger();\n\n/**\n * HSuite Native Connect Provider.\n *\n * @description\n * Angular injectable service that manages wallet connections via the HSuite Native\n * Connect protocol. This provider uses the unified channel system for secure,\n * encrypted communication between dApps and the HSuite Wallet.\n *\n * Architecture:\n * - Uses {@link ChannelClientService} for unified channel-based communication\n * - Implements {@link BaseWalletProvider} interface for integration with {@link UnifiedWalletService}\n * - Supports both session (1:1 dApp-wallet) and party (N:N multisig) channels\n * - Auto-registers with UnifiedWalletService on injection\n *\n * Transport States (exposed via `transportState` signal):\n * - `'idle'` - No active connection\n * - `'nostr-only'` - Connected via Nostr relay only\n * - `'upgrading'` - P2P upgrade in progress\n * - `'p2p-connected'` - Direct P2P connection established\n * - `'p2p-failed'` - P2P upgrade failed, using Nostr fallback\n *\n * @Component({\n * template: `\n * <ion-badge [color]=\"transportColor()\">\n * {{ transportState() }}\n * </ion-badge>\n * `\n * })\n * export class ConnectionStatus {\n * private provider = inject(HsuiteNativeProvider);\n *\n * transportState = this.provider.transportState;\n *\n * transportColor = computed(() => {\n * const state = this.transportState();\n * return state === 'p2p-connected' ? 'success' : 'warning';\n * });\n * }\n * ```\n *\n * @publicApi\n */\n@Injectable({ providedIn: 'root' })\nexport class HsuiteNativeProvider extends BaseWalletProvider {\n private readonly eventBus = inject(WalletEventBus);\n private readonly zone = inject(NgZone);\n private readonly channelService = inject(ChannelClientService);\n\n readonly id = 'hsuite-native';\n\n readonly metadata: ProviderMetadata = {\n id: this.id,\n name: 'HSuite Native',\n type: 'hsuite-native',\n description: 'Connect via HSuite Native Connect protocol',\n supportsMultipleAccounts: true,\n };\n\n /**\n * Error signal (reactive)\n */\n readonly error = signal<string | null>(null);\n\n // Track previous connection state for disconnect detection\n private previouslyConnected = false;\n\n /**\n * Local discovery service instance.\n * Uses BroadcastChannel for instant, private, same-browser wallet discovery.\n */\n private localDiscoveryService: LocalDiscoveryService | null = null;\n\n /**\n *\n */\n constructor() {\n super();\n\n // Initialize local discovery service for same-browser wallet detection\n this.initializeLocalDiscovery();\n\n // Synchronize error state from channel service\n effect(() => {\n const channelError = this.channelService.error();\n if (channelError) {\n this.error.set(channelError);\n }\n });\n\n // Listen to channel state changes to detect wallet-initiated disconnects\n effect(() => {\n const status = this.status();\n const isConnected = this.channelService.isConnected();\n\n // If we were connected but now disconnected, emit disconnect event\n if (this.previouslyConnected && !isConnected && status === 'disconnected') {\n logger.info('[HsuiteNativeProvider] Channel terminated');\n this.eventBus.disconnected.emit({\n providerId: this.id,\n providerType: 'hsuite-native',\n reason: 'session_terminated',\n timestamp: Date.now(),\n });\n }\n\n // Update tracking state\n this.previouslyConnected = isConnected;\n });\n\n // Attempt automatic reconnect when session exists after reload\n void this.attemptReconnect().catch((error) => {\n logger.debug('[HsuiteNativeProvider] Auto-reconnect skipped', { error });\n });\n }\n\n /**\n * Initialize local discovery for same-browser wallet detection.\n * Uses BroadcastChannel for instant, private discovery.\n * Cross-device connections use QR/URL flow (no discovery needed).\n */\n private initializeLocalDiscovery(): void {\n this.localDiscoveryService = LocalDiscoveryService.getDAppInstance();\n this.localDiscoveryService.start();\n }\n\n /**\n * Maps the internal channel state to the provider connection status.\n *\n * @description\n * Computed signal that translates ChannelClientService states to\n * standard ConnectionStatus values for UI binding.\n *\n * @returns Current connection status\n */\n readonly status = computed<ConnectionStatus>(() => {\n const state = this.channelService.state();\n\n switch (state) {\n case 'idle':\n return 'idle';\n case 'connecting':\n case 'pending':\n return 'connecting';\n case 'active':\n case 'approved':\n return 'connected';\n case 'disconnected':\n return 'disconnected';\n case 'error':\n return 'error';\n default:\n return 'idle';\n }\n });\n\n /**\n * Current transport state (nostr-only, upgrading, p2p-connected, p2p-failed).\n * Use this to show users whether they're connected via Nostr relay or P2P.\n */\n readonly transportState = computed(() => this.channelService.transportState());\n\n /**\n * Connected accounts from the wallet in UnifiedAccount format.\n *\n * @description\n * Computed signal that exposes wallet accounts from the channel service\n * in the standard UnifiedAccount format for UI binding.\n *\n * @returns Array of connected accounts (empty when disconnected)\n */\n readonly accounts = computed<UnifiedAccount[]>(() => {\n return this.channelService.unifiedAccounts();\n });\n\n /**\n * Check if provider is connected\n */\n override isConnected(): boolean {\n return this.channelService.isConnected();\n }\n\n /**\n * Connects to HSuite Wallet via the Native Connect protocol.\n *\n * @description\n * Initiates a connection to HSuite Wallet using the optimal method for the\n * current platform:\n *\n * **Desktop Browsers**:\n * 1. Checks if wallet is already online via Nostr discovery (instant!)\n * 2. If found, sends invite directly via relay\n * 3. If not found, opens wallet in new tab/window\n *\n * **Mobile Browsers**:\n * 1. Tries hsuite: deep link to open native wallet app\n * 2. Falls back to opening wallet in same tab (PWA) or new tab\n *\n * The connection completes when the wallet user approves the session.\n *\n * @param config - HSuite Native connection configuration\n *\n * @throws {Error} If configuration is invalid\n * @throws {Error} If connection times out (default 120 seconds)\n * @throws {Error} If popup is blocked and wallet cannot be opened\n */\n override async connect(config: ConnectionConfig): Promise<void> {\n if (!this.isHsuiteNativeConfig(config)) {\n throw new Error('Invalid HSuite Native configuration');\n }\n\n // Guard: Don't start a new connection if already connecting\n const currentStatus = this.status();\n if (currentStatus === 'connecting') {\n logger.warn('Connection already in progress, ignoring duplicate request');\n return;\n }\n\n logger.info('Connecting to HSuite Wallet via unified channel protocol', { config });\n\n try {\n const invite = await this.channelService.connect({\n type: 'session',\n appId: config.appId || 'hsuite-dapp',\n appName: config.appName || 'HSuite dApp',\n ledgerId: config.ledgerId,\n networkId: config.networkId,\n walletUrl: config.walletUrl || DEFAULT_WALLET_URL,\n });\n\n // Open wallet with invite URL\n const walletUrl = config.walletUrl || DEFAULT_WALLET_URL;\n const inviteUrl = this.channelService.getWalletInviteUrl(invite, walletUrl);\n\n // Open wallet using Nostr-based discovery (works cross-origin, cross-port)\n await this.openWalletWindow(inviteUrl, walletUrl, config);\n\n // Wait for connection to be established\n await this.waitForConnection();\n\n // Run in NgZone to trigger Angular change detection\n this.zone.run(() => {\n const accounts = this.accounts();\n this.eventBus.connected.emit({\n providerId: this.id,\n providerType: 'hsuite-native',\n accounts,\n timestamp: Date.now(),\n });\n\n logger.info('Connected successfully via unified channel', {\n channelId: invite.id.slice(0, 8),\n accountCount: accounts.length,\n });\n });\n } catch (error) {\n logger.error('Connection failed', { error });\n throw error;\n }\n }\n\n /**\n * Open wallet window with LOCAL-FIRST discovery.\n *\n * LOCAL DISCOVERY MODEL:\n * 1. Check if wallet is online in same browser via BroadcastChannel (instant!)\n * 2. If not immediately found, wait briefly (500ms) for wallet heartbeat\n * 3. If wallet found → send invite via BroadcastChannel (<1ms), focus existing tab\n * 4. If not found → open wallet tab or use QR/deep link\n *\n * Cross-device connections use QR/URL flow - the invite is self-contained,\n * no discovery needed.\n *\n * @param inviteUrl - Full URL with invite parameter\n * @param walletBaseUrl - Base URL of the wallet\n * @param config - Connection configuration with app metadata\n */\n private async openWalletWindow(\n inviteUrl: string,\n walletBaseUrl: string,\n config?: HsuiteNativeConfig,\n ): Promise<void> {\n const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\n\n // LOCAL-FIRST DISCOVERY\n // Wait briefly for wallet heartbeat before opening new tab\n if (this.localDiscoveryService?.active) {\n // Wait up to 500ms for a wallet to announce itself\n const wallet = await this.localDiscoveryService.waitForWallet({\n timeoutMs: 500,\n ledgerId: config?.ledgerId,\n });\n\n if (wallet) {\n // Send invite directly via BroadcastChannel - instant, no network!\n this.localDiscoveryService.sendInvite(\n wallet.fingerprint,\n inviteUrl,\n config?.appId,\n config?.appName,\n );\n logger.info('[HsuiteNativeProvider] Sent invite via local discovery', {\n wallet: wallet.fingerprint.slice(0, 8),\n });\n return;\n }\n }\n\n // MOBILE: Prefer same-tab navigation for PWA wallet\n if (isMobile) {\n const isSameOrigin = this.isSameOrigin(walletBaseUrl);\n\n if (isSameOrigin) {\n window.location.href = inviteUrl;\n return;\n } else {\n // Try deep link first\n const deepLinkUrl = inviteUrl.replace(/^https?:/, 'hsuite:');\n try {\n window.location.href = deepLinkUrl;\n await new Promise((resolve) => setTimeout(resolve, 500));\n } catch {\n // Deep link failed, continue to open tab\n }\n }\n }\n\n // FALLBACK: Open wallet in a new tab (for same-browser) or show QR (cross-device)\n // §29.8 SOC2 CC6.1: noopener,noreferrer prevents a compromised dApp-supplied\n // inviteUrl from hijacking the dApp tab via window.opener. A side effect is\n // that window.open() returns null, so we can no longer use the return value\n // to detect popup-blocked; modern browsers surface that via their own UI\n // and the caller's waitForConnection() timeout will error out if the user\n // dismissed the popup dialog without allowing.\n const walletWindow = window.open(inviteUrl, 'hsuite-wallet', 'noopener,noreferrer');\n // .focus() is a no-op with noopener (walletWindow === null); fresh tabs\n // are already focused in every mainstream browser.\n void walletWindow;\n }\n\n /**\n * Check if a URL is same origin as current page.\n * @param url\n */\n private isSameOrigin(url: string): boolean {\n try {\n const walletOrigin = new URL(url).origin;\n return walletOrigin === window.location.origin;\n } catch {\n return false;\n }\n }\n\n /**\n * Wait for channel connection to be established\n * @param timeoutMs\n */\n private async waitForConnection(timeoutMs = 120000): Promise<void> {\n const startTime = Date.now();\n\n return new Promise((resolve, reject) => {\n const checkConnection = () => {\n if (this.channelService.isConnected()) {\n resolve();\n return;\n }\n\n const state = this.channelService.state();\n if (state === 'error') {\n reject(new Error(this.channelService.error() || 'Connection failed'));\n return;\n }\n\n // Also handle disconnected state (wallet rejected or terminated)\n if (state === 'disconnected') {\n reject(new Error(this.channelService.error() || 'Connection rejected by wallet'));\n return;\n }\n\n if (Date.now() - startTime > timeoutMs) {\n reject(new Error('Connection timeout'));\n return;\n }\n\n setTimeout(checkConnection, 100);\n };\n\n checkConnection();\n });\n }\n\n /**\n * Disconnects from the HSuite Wallet.\n *\n * @description\n * Terminates the channel connection and clears session state. The wallet\n * is notified of the disconnection. Emits a 'disconnected' event via\n * WalletEventBus regardless of success or failure.\n *\n * @throws {Error} If disconnection fails (event still emitted)\n */\n override async disconnect(): Promise<void> {\n logger.info('Disconnecting from HSuite Wallet');\n\n try {\n await this.channelService.disconnect();\n\n // Emit disconnection event\n this.eventBus.disconnected.emit({\n providerId: this.id,\n providerType: 'hsuite-native',\n reason: 'user_initiated',\n timestamp: Date.now(),\n });\n\n logger.info('Disconnected successfully');\n } catch (error) {\n logger.error('Disconnection failed', { error });\n // Still emit event even if disconnect fails\n this.eventBus.disconnected.emit({\n providerId: this.id,\n providerType: 'hsuite-native',\n reason: 'error',\n timestamp: Date.now(),\n });\n throw error;\n }\n }\n\n /**\n * Signs a transaction without submitting it to the network.\n *\n * @description\n * Sends the transaction payload to the wallet for signing. The wallet\n * displays the transaction details and prompts the user for approval.\n * If approved, the signed transaction is returned.\n *\n * @param options - Transaction signing options\n *\n * @returns Promise resolving to the signing result with signed payload\n *\n * @throws {Error} If user rejects the signing request\n * @throws {Error} If wallet is not connected\n * @throws {Error} If channel communication fails\n */\n override async signTransaction(options: SignTransactionOptions): Promise<SignResult> {\n logger.info('Signing transaction', { options });\n\n try {\n const response = await this.channelService.signTransaction({\n accountAddress: options.accountAddress,\n payload: options.payload,\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n });\n\n logger.info('Transaction signed');\n\n return {\n signedPayload: response.signedPayload || '',\n signature: response.signature,\n metadata: response.metadata,\n };\n } catch (error) {\n logger.error('Transaction signing failed', { error });\n throw error;\n }\n }\n\n /**\n * Signs and executes a transaction atomically in a single prompt.\n *\n * @description\n * Performs sign and submit as a single atomic operation with one user\n * approval prompt. This is the recommended method for transaction submission\n * as it provides better UX and matches WalletConnect's behavior.\n *\n * Called by {@link UnifiedWalletService.signAndExecuteTransaction} to ensure\n * consistent single-prompt behavior across all provider types.\n *\n * @param options - Transaction submission options\n *\n * @returns Promise resolving to submission result with transaction ID\n *\n * @throws {Error} If user rejects the transaction\n * @throws {Error} If wallet is not connected\n * @throws {Error} If transaction submission fails\n */\n async signAndExecuteTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {\n logger.info('signAndExecuteTransaction called (single prompt)', {\n accountAddress: options.accountAddress,\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n });\n\n return this.submitTransactionInternal(options);\n }\n\n /**\n * Signs and submits a transaction to the blockchain.\n *\n * @description\n * The **preferred method** for submitting transactions. Performs sign and\n * submit as a single atomic operation requiring only ONE user approval.\n *\n * Advantages over separate sign/submit:\n * - Single wallet prompt (better UX)\n * - Matches WalletConnect's `hedera_signAndExecuteTransaction` behavior\n * - Atomic operation (no partial state)\n *\n * @param options - Transaction submission options\n *\n * @returns Promise resolving to submission result with transaction ID\n *\n * @throws {Error} If user rejects the transaction\n * @throws {Error} If wallet is not connected\n * @throws {Error} If transaction submission fails\n */\n override async submitTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {\n return this.submitTransactionInternal(options);\n }\n\n /**\n * Internal implementation of sign and submit.\n * Both submitTransaction() and signAndExecuteTransaction() delegate here.\n *\n * @param options\n */\n private async submitTransactionInternal(\n options: SubmitTransactionOptions,\n ): Promise<SubmitResult> {\n logger.info('Signing and submitting transaction (single prompt)', {\n accountAddress: options.accountAddress,\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n });\n\n try {\n const response = await this.channelService.signAndSubmitTransaction({\n accountAddress: options.accountAddress,\n payload: options.payload,\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n // Pass batch transaction fields if present\n ...(options.isBatch && {\n isBatch: options.isBatch,\n batchKey: options.batchKey,\n innerTransactions: options.innerTransactions,\n }),\n });\n\n logger.info('Transaction signed and submitted successfully', {\n transactionId: response.transactionId,\n transactionHash: response.transactionHash?.substring(0, 16),\n });\n\n return {\n transactionId: response.transactionId,\n transactionHash: response.transactionHash,\n metadata: response.metadata,\n };\n } catch (error) {\n logger.error('Transaction sign+submit failed', { error });\n throw error;\n }\n }\n\n /**\n * Signs an arbitrary message for authentication or verification.\n *\n * @description\n * Requests the wallet to sign a non-transaction message. Common use cases:\n * - Authentication challenges (prove account ownership)\n * - DAO voting\n * - Off-chain signatures\n * - Message verification\n *\n * @param options - Message signing options\n *\n * @returns Promise resolving to signature result\n *\n * @throws {Error} If user rejects the signing request\n * @throws {Error} If wallet is not connected\n */\n override async signMessage(options: SignMessageOptions): Promise<SignMessageResult> {\n logger.info('Signing message', {\n accountAddress: options.accountAddress,\n encoding: options.encoding,\n messageLength: options.message?.length,\n });\n\n try {\n const response = await this.channelService.request<{\n signature?: string;\n publicKey?: string;\n // §21.3 extended shape — new wallets include these fields.\n // Older wallets (pre-§21.3) omit them; the optional chain below\n // keeps us backwards-compatible with both.\n algorithm?: 'ed25519' | 'ecdsa_secp256k1' | 'secp256k1';\n encoding?: 'utf-8' | 'base64';\n caipChainId?: string;\n messageLength?: number;\n metadata?: Record<string, unknown>;\n }>('ledger/signMessage', {\n accountAddress: options.accountAddress,\n message: options.message,\n encoding: options.encoding || 'utf-8',\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n });\n\n logger.info('Message signed successfully', {\n algorithm: response.algorithm,\n caipChainId: response.caipChainId,\n });\n\n // Pass ALL fields through so the dApp's TransactionService sees the\n // full MessageSignResult shape (§21.3 strict end-to-end contract).\n return {\n signature: response.signature || '',\n publicKey: response.publicKey,\n algorithm: response.algorithm,\n encoding: response.encoding,\n caipChainId: response.caipChainId,\n messageLength: response.messageLength,\n metadata: response.metadata,\n };\n } catch (error) {\n logger.error('Message signing failed', { error });\n throw error;\n }\n }\n\n /**\n * Checks if HSuite Native provider is available.\n *\n * @description\n * HSuite Native is always available because it can use either:\n * - Direct Nostr relay connection (if wallet is online)\n * - Opening wallet in a new browser tab/window\n * - Deep linking to native app on mobile\n *\n * @returns Promise always resolving to true\n */\n override async isAvailable(): Promise<boolean> {\n // HSuite Native is always available (can open wallet window or use extension)\n return true;\n }\n\n /**\n * Attempts to restore a previous session and reconnect automatically.\n *\n * @description\n * Checks for stored session data and attempts to re-establish the wallet\n * connection without requiring user interaction. This is called automatically\n * on provider initialization.\n *\n * If successful, emits a 'sessionRestored' event via WalletEventBus.\n *\n * @returns Promise resolving to true if reconnection succeeded, false otherwise\n */\n async attemptReconnect(): Promise<boolean> {\n logger.info('Attempting reconnect via unified channel');\n\n try {\n const success = await this.channelService.attemptRestore();\n\n if (success) {\n const accounts = this.accounts();\n const invite = this.channelService.currentInvite();\n\n this.eventBus.sessionRestored.emit({\n providerId: this.id,\n sessionKey: invite?.id || '',\n accounts,\n metadata: { autoReconnected: true },\n timestamp: Date.now(),\n });\n\n logger.info('Reconnect successful');\n } else {\n logger.warn('Reconnect failed - no session or unable to connect');\n }\n\n return success;\n } catch (error) {\n logger.error('Reconnect failed', { error });\n return false;\n }\n }\n\n /**\n * Type guard for HSuite Native config\n * @param config\n */\n private isHsuiteNativeConfig(config: ConnectionConfig): config is HsuiteNativeConfig {\n return config.type === 'hsuite-native';\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file hedera-signer.ts\n * @description Hedera-specific WalletConnect signer implementation\n *\n * Implements the IWalletConnectSigner interface for Hedera ledger.\n * Handles Hedera-specific JSON-RPC methods and transaction formats.\n */\n\nimport { getLogger } from '@hsuite/native-connect-sdk';\n\nimport type { SignResult, SubmitResult } from '../../base-wallet-provider';\nimport type { IWalletConnectSigner, SignerOperationParams } from '../core/base-signer.interface';\n\nconst logger = getLogger().scoped?.('HederaSigner') ?? getLogger();\n\n/**\n * Extract a meaningful error message from various error shapes.\n * WalletConnect SDK throws errors that are not standard Error instances.\n *\n * Handles:\n * - Standard Error objects\n * - WalletConnect SDK errors: { code, message }\n * - Nested errors: { error: { message } }\n * - PIN_REQUIRED errors from wallet\n * - DOMException objects\n * - Objects that stringify to {} (enumerable property check)\n *\n * @param error - Error from WalletConnect SDK (can be Error, object, or string)\n * @returns Human-readable error message\n */\nfunction extractErrorMessage(error: unknown): string {\n // Log the raw error for debugging\n logger.debug('Extracting error message', {\n errorType: typeof error,\n isError: error instanceof Error,\n constructorName: error?.constructor?.name,\n protoName: Object.getPrototypeOf(error)?.constructor?.name,\n });\n\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'object' && error !== null) {\n const errorObj = error as Record<string, unknown>;\n\n // Try to get all properties including non-enumerable and from prototype\n const allProps = Object.getOwnPropertyNames(error).concat(\n Object.getOwnPropertyNames(Object.getPrototypeOf(error) || {}),\n );\n\n // Log ALL property values for debugging\n const propDebug: Record<string, string> = {};\n for (const prop of allProps.slice(0, 15)) {\n try {\n const val = (error as any)[prop];\n if (typeof val === 'function') {\n propDebug[prop] = '[fn]';\n } else if (val === undefined) {\n propDebug[prop] = 'undef';\n } else if (val === null) {\n propDebug[prop] = 'null';\n } else if (typeof val === 'object') {\n propDebug[prop] = JSON.stringify(val)?.substring(0, 60) || '[obj]';\n } else {\n propDebug[prop] = String(val).substring(0, 60);\n }\n } catch (_e) {\n propDebug[prop] = '[err]';\n }\n }\n logger.error('WC Error object dump', propDebug);\n\n // Check for code property first (common in SDK errors like PIN_REQUIRED)\n if (typeof errorObj['code'] === 'string') {\n const codeMsg = errorObj['message']\n ? `${errorObj['code']}: ${errorObj['message']}`\n : errorObj['code'];\n return codeMsg as string;\n }\n\n // WalletConnect error format: { code, message }\n if ('message' in errorObj && typeof errorObj['message'] === 'string') {\n return errorObj['message'];\n }\n\n // Nested error: { error: { message } }\n if (\n 'error' in errorObj &&\n typeof errorObj['error'] === 'object' &&\n errorObj['error'] !== null\n ) {\n const nested = errorObj['error'] as Record<string, unknown>;\n if ('message' in nested && typeof nested['message'] === 'string') {\n return nested['message'];\n }\n if ('code' in nested && typeof nested['code'] === 'string') {\n return nested['code'];\n }\n }\n\n // Check for DOMException\n if (error instanceof DOMException) {\n return error.message || error.name;\n }\n\n // Check for reason/cause properties (common in rejected promises)\n if ('reason' in errorObj && typeof errorObj['reason'] === 'string') {\n return errorObj['reason'];\n }\n if ('cause' in errorObj) {\n const cause = errorObj['cause'];\n if (typeof cause === 'string') return cause;\n if (cause instanceof Error) return cause.message;\n if (typeof cause === 'object' && cause !== null && 'message' in (cause as any)) {\n return String((cause as any).message);\n }\n }\n\n // WalletConnect SDK specific error formats\n if ('context' in errorObj && typeof errorObj['context'] === 'string') {\n return errorObj['context'];\n }\n if ('data' in errorObj && typeof errorObj['data'] === 'object' && errorObj['data'] !== null) {\n const data = errorObj['data'] as Record<string, unknown>;\n if ('message' in data && typeof data['message'] === 'string') {\n return data['message'];\n }\n }\n\n // WalletConnect JSON-RPC error format: { code: number, message: string }\n if ('code' in errorObj && 'message' in errorObj) {\n const code = errorObj['code'];\n const msg = errorObj['message'];\n if (typeof msg === 'string') {\n return typeof code === 'number' ? `[${code}] ${msg}` : msg;\n }\n }\n\n // Error with 'name' property (common for built-in errors)\n if ('name' in errorObj && typeof errorObj['name'] === 'string') {\n const name = errorObj['name'];\n if (name && name !== 'Error' && name !== 'Object') {\n return name;\n }\n }\n\n // Try to stringify, but check if result is empty object\n try {\n const jsonStr = JSON.stringify(error);\n // Don't return empty objects as error messages\n if (jsonStr && jsonStr !== '{}' && jsonStr !== '[]') {\n return jsonStr;\n }\n\n // If stringify returned {}, try Object.keys to get property names\n const keys = Object.keys(errorObj);\n if (keys.length > 0) {\n return `Error object with keys: ${keys.join(', ')}`;\n }\n\n // Try getting own property names (includes non-enumerable)\n const ownProps = Object.getOwnPropertyNames(errorObj);\n logger.debug('Error object properties', { props: ownProps });\n\n if (ownProps.length > 0) {\n // Try to read ALL properties for better debugging\n const propValues: string[] = [];\n for (const k of ownProps) {\n try {\n const val = errorObj[k];\n const valStr = typeof val === 'object' ? JSON.stringify(val) : String(val);\n propValues.push(`${k}=${valStr?.substring(0, 100)}`);\n\n // Check if any property contains error info\n if (typeof val === 'object' && val !== null) {\n if ('message' in val) return String((val as any).message);\n if ('error' in val) return String((val as any).error);\n }\n } catch {\n propValues.push(k);\n }\n }\n logger.debug('Error property values', { values: propValues });\n\n // Return a more informative error\n return `Error with properties: ${propValues.slice(0, 5).join(', ')}`;\n }\n } catch (_e) {\n // If stringify fails, try toString\n const str = String(error);\n if (str !== '[object Object]') {\n return str;\n }\n }\n\n // Last resort - log what we know about the object\n logger.warn('Could not extract error message', {\n constructor: error?.constructor?.name,\n prototype: Object.getPrototypeOf(error)?.constructor?.name,\n });\n return `Unknown error (type: ${error?.constructor?.name || 'object'})`;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n return 'Unknown error';\n}\n\n/**\n * Signer implementation for Hedera ledger.\n *\n * Supports Hedera-specific WalletConnect methods:\n * - hedera_signTransaction (sign-only, returns signature map)\n * - hedera_signAndExecuteTransaction (sign + submit, returns transaction ID)\n * - hedera_executeTransaction\n * - hedera_signMessage (arbitrary message signing)\n *\n * Uses HIP-30 account format: hedera:<network>:<accountId>\n */\nexport class HederaSigner implements IWalletConnectSigner {\n readonly ledgerId = 'hedera';\n\n /**\n * Build Hedera namespace configuration for WalletConnect.\n * Defines the JSON-RPC methods and chains this signer supports.\n *\n * IMPORTANT: We request ALL Hedera networks (testnet, mainnet)\n * to ensure wallets like Kabila can show accounts from unknown network.\n * The wallet will return all accounts it has across all networks.\n *\n * @param networkId - Network identifier (e.g., 'hedera:testnet', 'hedera:mainnet')\n * @param _networkId\n * @returns Namespace configuration object\n */\n buildNamespace(_networkId: string): {\n methods: string[];\n chains: string[];\n events: string[];\n } {\n // Request ALL Hedera networks to allow wallets to show all their accounts\n // Wallets like Kabila may have accounts on multiple networks\n\n return {\n methods: [\n 'hedera_signTransaction',\n 'hedera_signAndExecuteTransaction',\n 'hedera_executeTransaction',\n 'hedera_signMessage',\n ],\n // Request all Hedera networks so wallet can show all accounts\n chains: ['hedera:testnet', 'hedera:mainnet'],\n events: ['chainChanged', 'accountsChanged'],\n };\n }\n\n /**\n * Sign a Hedera transaction without submitting to network.\n * Uses hedera_signTransaction method with TransactionList format.\n *\n * The payload comes as TransactionList (base64 frozen transaction bytes).\n * We send the full TransactionList to preserve canonical bytes for signing.\n * The wallet will sign and return the signature map without executing.\n *\n * @param params - Signing parameters (payload is TransactionList base64)\n * @returns Promise resolving to signed transaction with signature map\n */\n async signTransaction(params: SignerOperationParams): Promise<SignResult> {\n // Extract network name from networkId (mainnet or testnet)\n const network = params.networkId.includes('mainnet') ? 'mainnet' : 'testnet';\n\n // Format account ID in HIP-30 format\n const signerAccountId = `hedera:${network}:${params.accountAddress}`;\n\n try {\n // Send the full TransactionList (frozen transaction bytes) to preserve canonical bytes.\n // The wallet needs the complete transaction structure to sign correctly.\n // Previously we converted to TransactionBody which caused INVALID_SIGNATURE errors\n // because the signature was computed over different bytes than the network expected.\n\n // Use 5-minute expiry to give users time to review and approve\n const result = await params.client.request({\n topic: params.topic,\n chainId: `hedera:${network}`,\n request: {\n method: 'hedera_signTransaction',\n params: {\n signerAccountId,\n transactionList: params.payload, // Send full TransactionList for correct signing\n },\n },\n expiry: 300, // 5 minutes in seconds\n });\n\n return {\n signedPayload: String(\n (result as { signatureMap?: any }).signatureMap ||\n (result as { signedTransaction?: any }).signedTransaction ||\n JSON.stringify(result),\n ),\n metadata: { result },\n };\n } catch (error) {\n // Check if this is an empty error object (WalletConnect SDK bug)\n const isEmptyError =\n typeof error === 'object' &&\n error !== null &&\n Object.keys(error).length === 0 &&\n !(error instanceof Error);\n\n if (isEmptyError) {\n logger.warn('WalletConnect SDK empty error - relay subscription may have been stale', {\n topic: params.topic?.substring(0, 16) + '...',\n });\n throw new Error('WalletConnect connection issue - please try again');\n }\n\n const errorMsg = extractErrorMessage(error);\n logger.error('Sign failed', { error: errorMsg });\n throw new Error(`Hedera sign failed: ${errorMsg}`);\n }\n }\n\n /**\n * Sign and submit a Hedera transaction to the network.\n * Uses hedera_signAndExecuteTransaction method with TransactionList format.\n *\n * @param params - Submission parameters\n * @returns Promise resolving to transaction ID and metadata\n */\n async submitTransaction(params: SignerOperationParams): Promise<SubmitResult> {\n // Extract network name from networkId (mainnet or testnet)\n const network = params.networkId.includes('mainnet') ? 'mainnet' : 'testnet';\n\n // Format account ID in HIP-30 format\n const signerAccountId = `hedera:${network}:${params.accountAddress}`;\n\n logger.debug('Sending hedera_signAndExecuteTransaction request', {\n topic: params.topic?.substring(0, 16) + '...',\n chainId: `hedera:${network}`,\n signerAccountId,\n payloadLength: params.payload?.length,\n });\n\n // Create the request promise - keep-alive pings are handled by WalletConnectClientManager\n const requestPromise = params.client.request({\n topic: params.topic,\n chainId: `hedera:${network}`,\n request: {\n method: 'hedera_signAndExecuteTransaction',\n params: {\n signerAccountId,\n transactionList: params.payload, // TransactionList protobuf (base64)\n },\n },\n expiry: 300, // 5 minutes in seconds\n });\n\n // Create a 5-minute timeout to override any internal SDK timeouts\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => {\n reject(new Error('Transaction approval timed out after 5 minutes'));\n },\n 5 * 60 * 1000,\n ); // 5 minutes\n });\n\n try {\n // Race between the request and our timeout\n const result = await Promise.race([requestPromise, timeoutPromise]);\n\n logger.debug('Received hedera_signAndExecuteTransaction response', {\n hasResult: !!result,\n resultKeys: result ? Object.keys(result as object) : [],\n });\n\n return {\n transactionId:\n (result as { transactionId?: string }).transactionId ||\n (result as { response?: { transactionId?: string } }).response?.transactionId ||\n '',\n transactionHash: (result as { transactionHash?: string }).transactionHash,\n metadata: { result },\n };\n } catch (error) {\n // Log full error for debugging - try to get more info from WalletConnect error\n const wcError = error as any;\n\n // Try to extract all available error info\n const errorInfo = {\n errorType: typeof error,\n errorConstructor: error?.constructor?.name,\n errorKeys: error && typeof error === 'object' ? Object.keys(error) : [],\n errorString: String(error),\n // WalletConnect specific error properties\n wcCode: wcError?.code,\n wcMessage: wcError?.message,\n wcContext: wcError?.context,\n wcData: wcError?.data,\n // Try Symbol properties\n symbols:\n error && typeof error === 'object'\n ? Object.getOwnPropertySymbols(error).map((s) => s.toString())\n : [],\n // Get all own property names\n ownProps: error && typeof error === 'object' ? Object.getOwnPropertyNames(error) : [],\n };\n\n logger.error('Submit failed - full error analysis', errorInfo);\n\n // Check if this is an empty error object (WalletConnect SDK bug)\n // This typically happens when relay subscription is stale\n const isEmptyError =\n typeof error === 'object' &&\n error !== null &&\n Object.keys(error).length === 0 &&\n !(error instanceof Error);\n\n if (isEmptyError) {\n // Empty error object is a known WalletConnect SDK issue\n // It usually means the relay subscription was stale\n // The SessionHealthManager should have pinged before the request,\n // but if we still get this error, the subscription dropped after the ping\n logger.warn('WalletConnect SDK empty error - relay subscription may have been stale', {\n topic: params.topic?.substring(0, 16) + '...',\n hint: 'This can happen when the relay WebSocket connection drops',\n });\n // NOTE: We can't retry because the wallet may have already executed the transaction.\n // A retry could cause a duplicate transaction on Hedera.\n throw new Error(\n 'WalletConnect connection dropped - if you approved the transaction in your wallet, ' +\n 'please check your transaction history as it may have been executed successfully.',\n );\n }\n\n const errorMsg = extractErrorMessage(error);\n logger.error('Submit failed', { error: errorMsg });\n throw new Error(`Hedera submit failed: ${errorMsg}`);\n }\n }\n\n /**\n * Sign and execute a transaction in one call (alias for submitTransaction).\n * Uses hedera_signAndExecuteTransaction WalletConnect RPC method.\n * This prevents double prompts by using the native WalletConnect method.\n *\n * @param params - Transaction parameters\n * @returns Promise resolving to transaction ID and metadata\n */\n async signAndExecuteTransaction(params: SignerOperationParams): Promise<SubmitResult> {\n // Simply delegate to submitTransaction which already uses hedera_signAndExecuteTransaction\n return this.submitTransaction(params);\n }\n\n /**\n * Sign an arbitrary message using hedera_signMessage method.\n * Used for DAO votes, authentication proofs, and other non-transaction signing.\n *\n * @param params - Signing parameters with message string\n * @returns Promise resolving to signature and metadata\n */\n async signMessage(\n params: SignerOperationParams & { message: string; encoding?: 'utf-8' | 'base64' },\n ): Promise<import('../../base-wallet-provider').SignMessageResult> {\n // Extract network name from networkId (mainnet or testnet)\n const network = params.networkId.includes('mainnet') ? 'mainnet' : 'testnet';\n\n // Format account ID in HIP-30 format\n const signerAccountId = `hedera:${network}:${params.accountAddress}`;\n\n try {\n // Use 5-minute expiry to give users time to review and approve\n const result = await params.client.request({\n topic: params.topic,\n chainId: `hedera:${network}`,\n request: {\n method: 'hedera_signMessage',\n params: {\n signerAccountId,\n message: params.message, // Can be base64 or utf-8\n },\n },\n expiry: 300, // 5 minutes in seconds\n });\n\n return {\n signature: String(\n (result as { signatureMap?: any }).signatureMap ||\n (result as { signature?: any }).signature ||\n JSON.stringify(result),\n ),\n publicKey: (result as { publicKey?: string }).publicKey,\n metadata: { result },\n };\n } catch (error) {\n // Check if this is an empty error object (WalletConnect SDK bug)\n const isEmptyError =\n typeof error === 'object' &&\n error !== null &&\n Object.keys(error).length === 0 &&\n !(error instanceof Error);\n\n if (isEmptyError) {\n logger.warn('WalletConnect SDK empty error - relay subscription may have been stale', {\n topic: params.topic?.substring(0, 16) + '...',\n });\n throw new Error('WalletConnect connection issue - please try again');\n }\n\n const errorMsg = extractErrorMessage(error);\n logger.error('Sign message failed', { error: errorMsg });\n throw new Error(`Hedera sign message failed: ${errorMsg}`);\n }\n }\n\n /**\n * Parse accounts from Hedera namespace in WalletConnect session.\n * Extracts account IDs from HIP-30 format: hedera:<network>:<accountId>\n *\n * Optionally filters accounts to only include those matching a target network.\n * This is important for respecting the user's network selection in the dApp,\n * since wallets may return accounts from multiple networks.\n *\n * @param namespace - Hedera namespace object from session\n * @param targetNetworkId - Optional network ID to filter accounts (e.g., 'hedera:mainnet')\n * @returns Array of parsed account objects, filtered by target network if specified\n */\n parseAccounts(\n namespace: any,\n targetNetworkId?: string,\n ): Array<{ address: string; chainId: string }> {\n if (!namespace) {\n logger.warn('Namespace is null or undefined');\n return [];\n }\n\n if (!(namespace as { accounts?: string[] }).accounts) {\n logger.warn('Namespace has no accounts property');\n return [];\n }\n\n if (!Array.isArray((namespace as { accounts?: string[] }).accounts)) {\n logger.warn('Namespace accounts is not an array', {\n type: typeof (namespace as { accounts?: string[] }).accounts,\n });\n return [];\n }\n\n // Parse all accounts from namespace\n const allAccounts = ((namespace as { accounts?: string[] }).accounts || []).map(\n (account: string) => {\n // HIP-30 format: hedera:testnet:0.0.12345\n const parts = account.split(':');\n\n if (parts.length < 3) {\n logger.warn('Invalid account format', { account, partsLength: parts.length });\n return { address: account, chainId: 'hedera:testnet' };\n }\n\n return {\n address: parts[parts.length - 1], // Account ID (0.0.12345)\n chainId: `${parts[0]}:${parts[1]}`, // hedera:testnet\n };\n },\n );\n\n // If target network specified, filter accounts to only that network\n if (targetNetworkId) {\n const targetNetwork = targetNetworkId.split(':')[1]?.toLowerCase(); // e.g., 'mainnet'\n\n if (targetNetwork) {\n const filteredAccounts = allAccounts.filter((acc) =>\n acc.chainId.toLowerCase().includes(targetNetwork),\n );\n\n logger.debug('Filtered accounts by target network', {\n targetNetworkId,\n targetNetwork,\n totalAccounts: allAccounts.length,\n filteredCount: filteredAccounts.length,\n });\n\n // If no accounts match the target network, log a warning\n if (filteredAccounts.length === 0 && allAccounts.length > 0) {\n logger.warn('No accounts found for target network', {\n targetNetwork,\n availableNetworks: [...new Set(allAccounts.map((a) => a.chainId))],\n });\n }\n\n return filteredAccounts;\n }\n }\n\n return allAccounts;\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file xrpl-signer.ts\n * @description XRPL-specific WalletConnect signer implementation\n *\n * Implements the IWalletConnectSigner interface for XRPL ledger.\n * Handles XRPL-specific JSON-RPC methods and transaction formats.\n */\n\nimport { XrplTransactionEncoder } from '@hsuite/native-connect-sdk';\nimport { getLogger } from '@hsuite/native-connect-sdk';\n\nimport type { SignResult, SubmitResult } from '../../base-wallet-provider';\nimport type { IWalletConnectSigner, SignerOperationParams } from '../core/base-signer.interface';\n\nconst logger = getLogger().scoped?.('XrplSigner') ?? getLogger();\n\n/**\n * Extract a meaningful error message from various error shapes.\n * WalletConnect SDK throws errors that are not standard Error instances.\n *\n * Handles:\n * - Standard Error objects\n * - WalletConnect SDK errors: { code, message }\n * - Nested errors: { error: { message } }\n * - PIN_REQUIRED errors from wallet\n * - DOMException objects\n * - Objects that stringify to {} (enumerable property check)\n *\n * @param error - Error from WalletConnect SDK (can be Error, object, or string)\n * @returns Human-readable error message\n */\nfunction extractErrorMessage(error: unknown): string {\n // Log raw error for debugging\n logger.debug('Raw error object', {\n errorType: typeof error,\n isError: error instanceof Error,\n errorKeys: typeof error === 'object' && error !== null ? Object.keys(error) : [],\n errorProto:\n typeof error === 'object' && error !== null\n ? Object.getPrototypeOf(error)?.constructor?.name\n : 'N/A',\n rawError: error,\n });\n\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'object' && error !== null) {\n const errorObj = error as Record<string, unknown>;\n\n // Check for code property first (common in SDK errors like PIN_REQUIRED)\n if (typeof errorObj['code'] === 'string') {\n const codeMsg = errorObj['message']\n ? `${errorObj['code']}: ${errorObj['message']}`\n : errorObj['code'];\n return codeMsg as string;\n }\n\n // WalletConnect error format: { code, message }\n if ('message' in errorObj && typeof errorObj['message'] === 'string') {\n return errorObj['message'];\n }\n\n // Nested error: { error: { message } }\n if (\n 'error' in errorObj &&\n typeof errorObj['error'] === 'object' &&\n errorObj['error'] !== null\n ) {\n const nested = errorObj['error'] as Record<string, unknown>;\n if ('message' in nested && typeof nested['message'] === 'string') {\n return nested['message'];\n }\n if ('code' in nested && typeof nested['code'] === 'string') {\n return nested['code'];\n }\n }\n\n // Check for 'context' property which WalletConnect sometimes uses\n if ('context' in errorObj && typeof errorObj['context'] === 'string') {\n return errorObj['context'];\n }\n\n // Check for DOMException\n if (error instanceof DOMException) {\n return error.message || error.name;\n }\n\n // Check for reason/cause properties (common in rejected promises)\n if ('reason' in errorObj && typeof errorObj['reason'] === 'string') {\n return errorObj['reason'];\n }\n if ('cause' in errorObj && typeof errorObj['cause'] === 'string') {\n return errorObj['cause'];\n }\n\n // WalletConnect JSON-RPC error format: { code: number, message: string }\n if ('code' in errorObj && 'message' in errorObj) {\n const code = errorObj['code'];\n const msg = errorObj['message'];\n if (typeof msg === 'string') {\n return typeof code === 'number' ? `[${code}] ${msg}` : msg;\n }\n }\n\n // Error with 'name' property (common for built-in errors)\n if ('name' in errorObj && typeof errorObj['name'] === 'string') {\n const name = errorObj['name'];\n if (name && name !== 'Error' && name !== 'Object') {\n return name;\n }\n }\n\n // Try to stringify, but check if result is empty object\n try {\n const jsonStr = JSON.stringify(error);\n // Don't return empty objects as error messages\n if (jsonStr && jsonStr !== '{}' && jsonStr !== '[]') {\n return jsonStr;\n }\n\n // If stringify returned {}, try Object.keys to get property names\n const keys = Object.keys(errorObj);\n if (keys.length > 0) {\n return `Error object with keys: ${keys.join(', ')}`;\n }\n } catch {\n // If stringify fails, try toString\n const str = String(error);\n if (str !== '[object Object]') {\n return str;\n }\n }\n\n return 'Unknown error object';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n return 'Unknown error';\n}\n\n/**\n * Signer implementation for XRPL ledger.\n *\n * Supports XRPL-specific WalletConnect methods:\n * - xrpl_signTransaction (sign-only, returns signed blob)\n * - xrpl_signAndSubmit (sign + submit, returns transaction hash)\n * - xrpl_submit (submit pre-signed transaction)\n * - xrpl_signMessage (arbitrary message signing)\n *\n * Uses XRPL address format: xrpl:<network>:rAddress...\n */\nexport class XrplSigner implements IWalletConnectSigner {\n readonly ledgerId = 'xrpl';\n\n /**\n * Build XRPL namespace configuration for WalletConnect.\n * Defines the JSON-RPC methods and chains this signer supports.\n *\n * @param networkId - Network identifier (e.g., 'xrpl:testnet', 'xrpl:mainnet')\n * @returns Namespace configuration object\n */\n buildNamespace(networkId: string): {\n methods: string[];\n chains: string[];\n events: string[];\n } {\n // Extract network name (testnet, mainnet, devnet)\n const network = networkId.includes('mainnet')\n ? 'mainnet'\n : networkId.includes('devnet')\n ? 'devnet'\n : 'testnet';\n\n return {\n methods: ['xrpl_signTransaction', 'xrpl_submit', 'xrpl_signAndSubmit', 'xrpl_signMessage'],\n chains: [`xrpl:${network}`],\n events: ['chainChanged', 'accountsChanged'],\n };\n }\n\n /**\n * Sign an XRPL transaction without submitting to network.\n * Uses xrpl_signTransaction method with JSON transaction object.\n *\n * @param params - Signing parameters\n * @returns Promise resolving to signed transaction blob (hex-encoded)\n */\n async signTransaction(params: SignerOperationParams): Promise<SignResult> {\n // Decode base64 payload to JSON transaction\n logger.debug('Decoding XRPL transaction payload', {\n payloadLength: params.payload?.length,\n networkId: params.networkId,\n topic: params.topic?.substring(0, 16) + '...',\n });\n\n let transaction: any;\n try {\n transaction = XrplTransactionEncoder.decodeTransaction(params.payload);\n logger.debug('Transaction decoded successfully', {\n transactionType: transaction?.TransactionType,\n account: transaction?.Account,\n });\n } catch (decodeError) {\n logger.error('Failed to decode transaction payload', {\n error: decodeError instanceof Error ? decodeError.message : String(decodeError),\n });\n throw decodeError;\n }\n\n try {\n logger.debug('Sending xrpl_signTransaction request to wallet', {\n method: 'xrpl_signTransaction',\n chainId: params.networkId,\n topic: params.topic?.substring(0, 16) + '...',\n });\n\n // Use 5-minute expiry to give users time to review and approve\n const result = await params.client.request({\n topic: params.topic,\n chainId: params.networkId,\n request: {\n method: 'xrpl_signTransaction',\n params: {\n transaction, // Native JSON object\n },\n },\n expiry: 300, // 5 minutes in seconds\n });\n\n logger.debug('Received response from wallet', {\n hasResult: !!result,\n resultKeys: result ? Object.keys(result as object) : [],\n });\n\n return {\n signedPayload:\n (result as { tx_blob?: string; tx_json?: any }).tx_blob || JSON.stringify(result),\n metadata: { result },\n };\n } catch (error) {\n // Check if this is an empty error object (WalletConnect SDK bug)\n const isEmptyError =\n typeof error === 'object' &&\n error !== null &&\n Object.keys(error).length === 0 &&\n !(error instanceof Error);\n\n if (isEmptyError) {\n logger.warn('WalletConnect SDK empty error - relay subscription may have been stale', {\n topic: params.topic?.substring(0, 16) + '...',\n });\n throw new Error('WalletConnect connection issue - please try again');\n }\n\n const errorMsg = extractErrorMessage(error);\n logger.error('Sign failed', { error: errorMsg });\n throw new Error(`XRPL sign failed: ${errorMsg}`);\n }\n }\n\n /**\n * Sign and submit an XRPL transaction to the network.\n * Uses xrpl_signAndSubmit method with JSON transaction object.\n *\n * @param params - Submission parameters\n * @returns Promise resolving to transaction hash and metadata\n */\n async submitTransaction(params: SignerOperationParams): Promise<SubmitResult> {\n // Decode base64 payload to JSON transaction\n const transaction = XrplTransactionEncoder.decodeTransaction(params.payload);\n\n try {\n logger.debug('Sending xrpl_signAndSubmit request to wallet', {\n method: 'xrpl_signAndSubmit',\n chainId: params.networkId,\n topic: params.topic?.substring(0, 16) + '...',\n });\n\n // Use 5-minute expiry to give users time to review and approve\n const result = await params.client.request({\n topic: params.topic,\n chainId: params.networkId,\n request: {\n method: 'xrpl_signAndSubmit',\n params: {\n transaction, // Native JSON object\n },\n },\n expiry: 300, // 5 minutes in seconds\n });\n\n logger.debug('Received xrpl_signAndSubmit response', {\n hasResult: !!result,\n resultKeys: result ? Object.keys(result as object) : [],\n });\n\n return {\n transactionId:\n (result as { hash?: string }).hash ||\n (result as { tx_json?: { hash?: string } }).tx_json?.hash ||\n '',\n transactionHash: (result as { hash?: string }).hash,\n metadata: { result },\n };\n } catch (error) {\n // Check if this is an empty error object (WalletConnect SDK bug)\n // This typically happens when relay subscription is stale\n const isEmptyError =\n typeof error === 'object' &&\n error !== null &&\n Object.keys(error).length === 0 &&\n !(error instanceof Error);\n\n if (isEmptyError) {\n // Empty error object is a known WalletConnect SDK issue\n // It usually means the relay subscription was stale\n logger.warn('WalletConnect SDK empty error - relay subscription may have been stale', {\n topic: params.topic?.substring(0, 16) + '...',\n hint: 'This can happen when the relay WebSocket connection drops',\n });\n throw new Error('WalletConnect connection issue - please try again');\n }\n\n const errorMsg = extractErrorMessage(error);\n logger.error('Submit failed', { error: errorMsg });\n throw new Error(`XRPL submit failed: ${errorMsg}`);\n }\n }\n\n /**\n * Sign and execute a transaction in one call (preferred method to avoid double prompts).\n * Uses xrpl_signAndSubmit method directly instead of sign-then-submit.\n *\n * @param params - Transaction parameters\n * @returns Promise resolving to transaction hash and metadata\n */\n async signAndExecuteTransaction(params: SignerOperationParams): Promise<SubmitResult> {\n // XRPL's xrpl_signAndSubmit method handles both signing and submission\n // This is the preferred method for XRPL transactions\n return this.submitTransaction(params);\n }\n\n /**\n * Sign an arbitrary message using xrpl_signMessage method.\n * Used for DAO votes, authentication proofs, and other non-transaction signing.\n *\n * @param params - Signing parameters with message string\n * @returns Promise resolving to signature and metadata\n */\n async signMessage(\n params: SignerOperationParams & { message: string; encoding?: 'utf-8' | 'base64' },\n ): Promise<import('../../base-wallet-provider').SignMessageResult> {\n try {\n // Use 5-minute expiry to give users time to review and approve\n const result = await params.client.request({\n topic: params.topic,\n chainId: params.networkId,\n request: {\n method: 'xrpl_signMessage',\n params: {\n message: params.message, // Can be base64 or utf-8\n },\n },\n expiry: 300, // 5 minutes in seconds\n });\n\n return {\n signature: (result as { signature?: string }).signature || JSON.stringify(result),\n publicKey: (result as { publicKey?: string }).publicKey,\n metadata: { result },\n };\n } catch (error) {\n // Check if this is an empty error object (WalletConnect SDK bug)\n const isEmptyError =\n typeof error === 'object' &&\n error !== null &&\n Object.keys(error).length === 0 &&\n !(error instanceof Error);\n\n if (isEmptyError) {\n logger.warn('WalletConnect SDK empty error - relay subscription may have been stale', {\n topic: params.topic?.substring(0, 16) + '...',\n });\n throw new Error('WalletConnect connection issue - please try again');\n }\n\n const errorMsg = extractErrorMessage(error);\n logger.error('Sign message failed', { error: errorMsg });\n throw new Error(`XRPL sign message failed: ${errorMsg}`);\n }\n }\n\n /**\n * Parse accounts from XRPL namespace in WalletConnect session.\n * Extracts addresses from XRPL format: xrpl:<network>:rAddress...\n *\n * Optionally filters accounts to only include those matching a target network.\n * This is important for respecting the user's network selection in the dApp.\n *\n * @param namespace - XRPL namespace object from session\n * @param targetNetworkId - Optional network ID to filter accounts (e.g., 'xrpl:mainnet')\n * @returns Array of parsed account objects, filtered by target network if specified\n */\n parseAccounts(\n namespace: any,\n targetNetworkId?: string,\n ): Array<{ address: string; chainId: string }> {\n if (\n !(namespace as { accounts?: string[] })?.accounts ||\n !Array.isArray((namespace as { accounts?: string[] }).accounts)\n ) {\n return [];\n }\n\n // Parse all accounts from namespace\n const allAccounts = ((namespace as { accounts?: string[] }).accounts || []).map(\n (account: string) => {\n // XRPL format: xrpl:testnet:rN7n7otQDd6FczFgLdlqtyMVrn3WnFBrDB\n const parts = account.split(':');\n\n if (parts.length < 3) {\n logger.warn('Invalid account format', { account });\n return { address: account, chainId: 'xrpl:testnet' };\n }\n\n return {\n address: parts[parts.length - 1], // rAddress\n chainId: `${parts[0]}:${parts[1]}`, // xrpl:testnet\n };\n },\n );\n\n // If target network specified, filter accounts to only that network\n if (targetNetworkId) {\n const targetNetwork = targetNetworkId.split(':')[1]?.toLowerCase(); // e.g., 'mainnet'\n\n if (targetNetwork) {\n const filteredAccounts = allAccounts.filter((acc) =>\n acc.chainId.toLowerCase().includes(targetNetwork),\n );\n\n logger.debug('Filtered accounts by target network', {\n targetNetworkId,\n targetNetwork,\n totalAccounts: allAccounts.length,\n filteredCount: filteredAccounts.length,\n });\n\n // If no accounts match the target network, log a warning\n if (filteredAccounts.length === 0 && allAccounts.length > 0) {\n logger.warn('No accounts found for target network', {\n targetNetwork,\n availableNetworks: [...new Set(allAccounts.map((a) => a.chainId))],\n });\n }\n\n return filteredAccounts;\n }\n }\n\n return allAccounts;\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file signer-factory.ts\n * @description Factory for creating and managing WalletConnect signers\n *\n * Implements the Factory Pattern for creating ledger-specific signers.\n * Maintains a registry of available signers and provides type-safe access.\n *\n * This design allows easy extension - new ledgers can be added by:\n * 1. Implementing IWalletConnectSigner interface\n * 2. Registering the signer with SignerFactory\n */\n\nimport { getLogger } from '@hsuite/native-connect-sdk';\n\nimport type { IWalletConnectSigner } from '../core/base-signer.interface';\n\nimport { HederaSigner } from './hedera-signer';\nimport { XrplSigner } from './xrpl-signer';\n\nconst logger = getLogger().scoped?.('SignerFactory') ?? getLogger();\n\n/**\n * Factory class for creating and managing WalletConnect signers.\n *\n * Features:\n * - Singleton signer instances for each ledger (performance optimization)\n * - Type-safe ledger ID validation\n * - Extensible registration system for custom signers\n */\nexport class SignerFactory {\n /**\n * Registry of available signers.\n * Each ledger ID maps to a singleton signer instance.\n */\n private static signers = new Map<string, IWalletConnectSigner>([\n ['hedera', new HederaSigner()],\n ['xrpl', new XrplSigner()],\n ]);\n\n /**\n * Get a signer for the specified ledger.\n *\n * @param ledgerId - Unique identifier for the ledger (e.g., 'hedera', 'xrpl')\n * @returns The signer instance for the specified ledger\n * @throws Error if no signer is registered for the ledger ID\n */\n static getSigner(ledgerId: string): IWalletConnectSigner {\n const signer = this.signers.get(ledgerId);\n\n if (!signer) {\n const available = Array.from(this.signers.keys()).join(', ');\n throw new Error(`Unsupported ledger: ${ledgerId}. Available ledgers: ${available}`);\n }\n\n return signer;\n }\n\n /**\n * Register a custom signer for a ledger.\n * Allows extending the factory with support for additional ledgers.\n *\n * @param ledgerId - Unique identifier for the ledger\n * @param signer - Signer implementation for the ledger\n */\n static registerSigner(ledgerId: string, signer: IWalletConnectSigner): void {\n if (signer.ledgerId !== ledgerId) {\n logger.warn('Signer ledgerId does not match registration key', {\n signerLedgerId: signer.ledgerId,\n registrationKey: ledgerId,\n });\n }\n\n this.signers.set(ledgerId, signer);\n logger.debug('Registered signer for ledger', { ledgerId });\n }\n\n /**\n * Check if a signer is registered for a ledger.\n *\n * @param ledgerId - Ledger identifier to check\n * @returns True if a signer is registered, false otherwise\n */\n static hasSigner(ledgerId: string): boolean {\n return this.signers.has(ledgerId);\n }\n\n /**\n * Get all registered ledger IDs.\n *\n * @returns Array of ledger identifiers\n */\n static getAvailableLedgers(): string[] {\n return Array.from(this.signers.keys());\n }\n\n /**\n * Remove a signer from the registry.\n * Useful for testing or dynamic ledger support.\n *\n * @param ledgerId - Ledger identifier to remove\n * @returns True if signer was removed, false if it didn't exist\n */\n static unregisterSigner(ledgerId: string): boolean {\n const removed = this.signers.delete(ledgerId);\n if (removed) {\n logger.debug('Unregistered signer for ledger', { ledgerId });\n }\n return removed;\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file session-health.ts\n * @description Manages WalletConnect session health - ensures relay subscriptions\n * are active before making requests. Transparent to dApp developers.\n *\n * This class handles the common WalletConnect issue where relay subscriptions\n * become stale, causing requests to fail with empty error objects.\n *\n * Features:\n * - Pre-request session ping to ensure relay subscription is active\n * - Relay connection monitoring (connect/disconnect/error events)\n * - Automatic ping cache management\n * - Subscription refresh capability\n */\n\nimport { getLogger } from '@hsuite/native-connect-sdk';\nimport type SignClient from '@walletconnect/sign-client';\n\nconst logger = getLogger().scoped?.('WCSessionHealth') ?? getLogger();\n\n/**\n * Manages WalletConnect session health to prevent stale relay subscription issues.\n *\n * The WalletConnect relay uses WebSocket connections that can become stale,\n * causing push events to stop arriving. This manager:\n * - Pings sessions before requests to ensure subscriptions are active\n * - Monitors relay connection state\n * - Clears ping cache on disconnect to force re-ping\n */\nexport class SessionHealthManager {\n private client: SignClient;\n private lastPingTime = new Map<string, number>();\n\n /**\n * Minimum interval between pings for the same topic (30 seconds).\n * Pinging too frequently is unnecessary and adds latency.\n */\n private readonly PING_INTERVAL_MS = 30000;\n\n /**\n * Maximum time to wait for a ping response (5 seconds).\n * If ping times out, we proceed anyway but log a warning.\n */\n private readonly PING_TIMEOUT_MS = 5000;\n\n /**\n * Create a new SessionHealthManager.\n *\n * @param client - Initialized WalletConnect SignClient instance\n */\n constructor(client: SignClient) {\n this.client = client;\n this.setupRelayMonitoring();\n logger.info('SessionHealthManager initialized');\n }\n\n /**\n * Ensure session is healthy before making a request.\n *\n * Pings the session if the last ping was more than 30 seconds ago.\n * This refreshes the relay subscription and helps prevent the\n * empty error object issue.\n *\n * Called automatically by WalletConnectClientManager before requests.\n *\n * @param topic - Session topic to verify\n */\n async ensureSessionHealth(topic: string): Promise<void> {\n const lastPing = this.lastPingTime.get(topic) || 0;\n const now = Date.now();\n\n // Skip if we pinged recently\n if (now - lastPing <= this.PING_INTERVAL_MS) {\n logger.debug('Skipping ping - recent ping exists', {\n topic: topic.substring(0, 16) + '...',\n lastPingAge: now - lastPing,\n });\n return;\n }\n\n try {\n logger.debug('Pinging session to ensure relay subscription', {\n topic: topic.substring(0, 16) + '...',\n });\n\n // Race ping against timeout\n await Promise.race([\n this.client.ping({ topic }),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Ping timeout')), this.PING_TIMEOUT_MS),\n ),\n ]);\n\n this.lastPingTime.set(topic, now);\n logger.debug('Session ping successful', {\n topic: topic.substring(0, 16) + '...',\n });\n } catch (err) {\n // Log warning but don't throw - let the request attempt proceed\n // The request might still succeed if the subscription is actually active\n logger.warn('Session ping failed - relay subscription may be stale', {\n topic: topic.substring(0, 16) + '...',\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n /**\n * Force refresh relay subscription for a topic.\n *\n * Use this when you suspect the subscription is stale and want\n * to explicitly re-subscribe rather than relying on ping.\n *\n * @param topic - Session topic to refresh subscription for\n */\n async refreshSubscription(topic: string): Promise<void> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- WalletConnect internal API not typed\n const relayer = (this.client as any).core?.relayer;\n if (relayer?.subscribe) {\n await relayer.subscribe(topic);\n // Clear ping cache so next ensureSessionHealth will ping\n this.lastPingTime.delete(topic);\n logger.info('Refreshed relay subscription', {\n topic: topic.substring(0, 16) + '...',\n });\n } else {\n logger.warn('Relayer.subscribe not available');\n }\n } catch (err) {\n logger.warn('Failed to refresh subscription', {\n topic: topic.substring(0, 16) + '...',\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n /**\n * Clear ping cache for a specific topic or all topics.\n *\n * @param topic - Optional topic to clear. If not provided, clears all.\n */\n clearPingCache(topic?: string): void {\n if (topic) {\n this.lastPingTime.delete(topic);\n } else {\n this.lastPingTime.clear();\n }\n }\n\n /**\n * Setup relay connection monitoring.\n *\n * Listens for:\n * - connect: Logs when WebSocket connects\n * - disconnect: Clears ping cache to force re-ping on next request\n * - error: Logs relay errors\n *\n * @private\n */\n private setupRelayMonitoring(): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- WalletConnect internal API not typed\n const relayer = (this.client as any).core?.relayer;\n if (!relayer) {\n logger.warn('Could not access relayer for monitoring');\n return;\n }\n\n relayer.on('connect', () => {\n logger.info('Relay WebSocket connected');\n });\n\n relayer.on('disconnect', () => {\n logger.warn('Relay WebSocket disconnected - clearing ping cache');\n this.lastPingTime.clear();\n });\n\n relayer.on('error', (err: Error) => {\n logger.error('Relay error', {\n error: err?.message || String(err),\n });\n });\n\n logger.debug('Relay monitoring setup complete');\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file walletconnect-client-manager.ts\n * @description WalletConnect SignClient lifecycle management\n *\n * Handles:\n * - SignClient initialization with projectId\n * - Client reuse across multiple connections\n * - Session restoration from IndexedDB\n * - Event listener registration\n *\n * Extracted from WalletConnectV2Provider to reduce file size.\n */\n\nimport { getLogger } from '@hsuite/native-connect-sdk';\nimport { WalletConnectModal } from '@walletconnect/modal';\nimport SignClient from '@walletconnect/sign-client';\n\nimport { SessionHealthManager } from './session-health';\n\nconst logger = getLogger().scoped?.('WCClientManager') ?? getLogger();\n\n/**\n * Storage key for persisted projectId\n */\nconst STORAGE_KEY_PROJECT_ID = 'hsuite.walletconnect.projectId';\n\n/**\n * WalletConnect app metadata\n */\nexport interface WCAppMetadata {\n name: string;\n description: string;\n url: string;\n icons: string[];\n}\n\n/**\n * WalletConnect Client Manager\n *\n * Manages the SignClient instance lifecycle.\n * Handles initialization, session restoration, and cleanup.\n */\nexport class WalletConnectClientManager {\n private client?: SignClient;\n private modal?: WalletConnectModal;\n private projectId?: string;\n private sessionHealth?: SessionHealthManager;\n\n /**\n * Initialize or return existing SignClient.\n *\n * @param projectId - WalletConnect Cloud project ID\n * @param metadata - App metadata for wallet display\n * @returns Initialized SignClient instance\n */\n async initialize(projectId: string, metadata: WCAppMetadata): Promise<SignClient> {\n if (this.client && this.projectId === projectId) {\n return this.client;\n }\n\n logger.debug('Initializing SignClient', { projectId: projectId.substring(0, 8) });\n\n // Store projectId for session restoration\n this.projectId = projectId;\n this.persistProjectId(projectId);\n\n // Use 'fatal' logger to suppress pino noise from WalletConnect SDK\n this.client = await SignClient.init({\n projectId,\n logger: 'fatal',\n metadata,\n });\n\n // Initialize session health manager for relay subscription management\n this.sessionHealth = new SessionHealthManager(this.client);\n\n logger.info('SignClient initialized with session health manager');\n return this.client;\n }\n\n /**\n * Get the current client instance.\n * @throws Error if not initialized\n */\n getClient(): SignClient {\n if (!this.client) {\n throw new Error('WalletConnect client not initialized');\n }\n return this.client;\n }\n\n /**\n * Check if client is initialized.\n */\n isInitialized(): boolean {\n return !!this.client;\n }\n\n /**\n * Restore client from stored projectId.\n * Used for session restoration on page reload.\n *\n * @param metadata - App metadata\n * @returns Client if restoration succeeded, undefined otherwise\n */\n async restoreClient(metadata: WCAppMetadata): Promise<SignClient | undefined> {\n const storedProjectId = this.getStoredProjectId();\n if (!storedProjectId) {\n logger.debug('No stored projectId, skipping client restoration');\n return undefined;\n }\n\n try {\n return await this.initialize(storedProjectId, metadata);\n } catch (error) {\n logger.error('Failed to restore client', {\n error: error instanceof Error ? error.message : String(error),\n });\n return undefined;\n }\n }\n\n /**\n * Get all active sessions from the client.\n */\n getActiveSessions(): any[] {\n if (!this.client) {\n return [];\n }\n return this.client.session.getAll();\n }\n\n /**\n * Get a specific session by topic.\n * @param topic\n */\n getSession(topic: string): any | undefined {\n if (!this.client) {\n return undefined;\n }\n try {\n return this.client.session.get(topic);\n } catch {\n return undefined;\n }\n }\n\n /**\n * Create and return a modal for QR code display.\n * @param projectId\n * @param chains\n */\n createModal(projectId: string, chains: string[]): WalletConnectModal {\n this.modal = new WalletConnectModal({\n projectId,\n chains,\n });\n return this.modal;\n }\n\n /**\n * Close the modal if open.\n */\n closeModal(): void {\n if (this.modal) {\n this.modal.closeModal();\n }\n }\n\n /**\n * Connect to wallet and get session.\n *\n * @param optionalNamespaces - Namespace configuration\n * @param sessionProperties - Optional session properties (e.g., preferredNetwork)\n * @returns URI and approval promise\n */\n async connect(\n optionalNamespaces: Record<string, any>,\n sessionProperties?: Record<string, string>,\n ): Promise<{\n uri?: string;\n approval: () => Promise<any>;\n }> {\n if (!this.client) {\n throw new Error('Client not initialized');\n }\n\n const connectParams: any = { optionalNamespaces };\n\n // Add session properties if provided\n // This allows passing metadata like preferredNetwork to the wallet\n if (sessionProperties) {\n connectParams.sessionProperties = sessionProperties;\n }\n\n logger.debug('Connecting with params', {\n namespaces: Object.keys(optionalNamespaces),\n hasSessionProperties: !!sessionProperties,\n });\n\n return this.client.connect(connectParams);\n }\n\n /**\n * Disconnect a session.\n * @param topic\n * @param reason\n * @param reason.code\n * @param reason.message\n */\n async disconnect(topic: string, reason?: { code: number; message: string }): Promise<void> {\n if (!this.client) {\n return;\n }\n await this.client.disconnect({\n topic,\n reason: reason || { code: 6000, message: 'User disconnected' },\n });\n }\n\n /**\n * Register event listener on the client.\n * @param event\n * @param handler\n */\n on(event: string, handler: (event: any) => void): void {\n if (!this.client) {\n return;\n }\n (this.client as any).on(event, handler);\n }\n\n /**\n * Send a request to a session.\n *\n * Features:\n * - Automatically ensures session health by pinging before the request\n * - Runs keep-alive pings during long-running requests (e.g., transaction approval)\n * - Prevents stale relay subscription issues that cause empty error objects\n *\n * @param params - Request parameters including topic, chainId, and request data\n * @param params.expiry - Optional expiry time in seconds (default: 300)\n * @param params.topic\n * @param params.chainId\n * @param params.request\n * @param params.request.method\n * @param params.request.params\n * @returns Promise resolving to the request result\n */\n async request<T = unknown>(params: {\n topic: string;\n chainId: string;\n request: { method: string; params: unknown };\n expiry?: number;\n }): Promise<T> {\n if (!this.client) {\n throw new Error('Client not initialized');\n }\n\n // Ensure session health before request (transparent to caller)\n // This pings the session if needed to refresh relay subscription\n if (this.sessionHealth) {\n await this.sessionHealth.ensureSessionHealth(params.topic);\n }\n\n // Keep-alive pings during long-running requests (e.g., transaction approval)\n // WC relay has ~30s subscription timeout, so we ping every 20s to keep it alive\n const KEEP_ALIVE_INTERVAL_MS = 20000;\n let keepAliveInterval: ReturnType<typeof setInterval> | undefined;\n\n const startKeepAlive = () => {\n keepAliveInterval = setInterval(async () => {\n try {\n logger.debug('Keep-alive ping during request', {\n topic: params.topic?.substring(0, 16) + '...',\n method: params.request.method,\n });\n if (this.client) {\n await Promise.race([\n this.client.ping({ topic: params.topic }),\n new Promise((_, reject) => setTimeout(() => reject(new Error('Ping timeout')), 5000)),\n ]);\n }\n } catch (err) {\n // Log but don't throw - ping failure during wait is not critical\n logger.debug('Keep-alive ping failed (non-critical)', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }, KEEP_ALIVE_INTERVAL_MS);\n };\n\n const stopKeepAlive = () => {\n if (keepAliveInterval) {\n clearInterval(keepAliveInterval);\n keepAliveInterval = undefined;\n }\n };\n\n // Start keep-alive pings\n startKeepAlive();\n\n try {\n const result = await this.client.request<T>(params);\n return result;\n } finally {\n // Always stop keep-alive, whether success or error\n stopKeepAlive();\n }\n }\n\n /**\n * Get the session health manager for advanced operations.\n *\n * Use this if you need to:\n * - Force refresh a subscription\n * - Clear ping cache\n * - Access health manager directly\n *\n * @returns SessionHealthManager instance or undefined if not initialized\n */\n getSessionHealthManager(): SessionHealthManager | undefined {\n return this.sessionHealth;\n }\n\n // ========== STORAGE ==========\n\n private persistProjectId(projectId: string): void {\n try {\n window.localStorage?.setItem(STORAGE_KEY_PROJECT_ID, projectId);\n } catch {\n logger.warn('Failed to persist projectId');\n }\n }\n\n private getStoredProjectId(): string | null {\n try {\n return window.localStorage?.getItem(STORAGE_KEY_PROJECT_ID) ?? null;\n } catch {\n return null;\n }\n }\n\n /**\n * Clear stored projectId.\n */\n clearStoredProjectId(): void {\n try {\n window.localStorage?.removeItem(STORAGE_KEY_PROJECT_ID);\n } catch {\n // Ignore\n }\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file walletconnect-session-store.ts\n * @description Session storage and management for WalletConnect provider\n *\n * Extracted from WalletConnectV2Provider to reduce file size and improve maintainability.\n *\n * Responsibilities:\n * - Store and retrieve WalletConnect sessions\n * - Generate unique session keys\n * - Aggregate accounts across sessions\n * - Find sessions by account address\n */\n\nimport { signal } from '@angular/core';\nimport { getLogger } from '@hsuite/native-connect-sdk';\n\nimport type { UnifiedAccount } from '../../../models/unified-account.model';\n\nimport type { IWalletConnectSigner } from './base-signer.interface';\n\nconst logger = getLogger().scoped?.('WCSessionStore') ?? getLogger();\n\n/**\n * Session data structure stored in the session store.\n */\nexport interface StoredSessionData {\n /** Raw WalletConnect session object */\n session: any;\n /** Ledger identifier (hedera, xrpl) */\n ledgerId: string;\n /** Network identifier (hedera:testnet, xrpl:mainnet) */\n networkId: string;\n /**\n * User's selected network from the connection modal.\n * This is critical for respecting user intent - wallets may return accounts\n * from multiple networks, but we should use the network the user selected.\n *\n * This value is set when connecting and persisted for session restoration.\n * It takes precedence over the wallet-reported networkId for signing operations.\n */\n userSelectedNetwork: string;\n /** Signer instance for this ledger */\n signer: IWalletConnectSigner;\n /** Unified accounts parsed from session */\n accounts: UnifiedAccount[];\n}\n\n/**\n * WalletConnect Session Store\n *\n * Manages the in-memory storage of WalletConnect sessions.\n * Provides utility methods for session lookup and aggregation.\n */\nexport class WalletConnectSessionStore {\n /**\n * Map of session key to session data.\n * Session key format: wc-{ledger}-{network}-{topicPrefix}\n */\n private readonly sessions = new Map<string, StoredSessionData>();\n\n /**\n * Aggregated accounts signal for reactive UI binding.\n */\n private readonly _accounts = signal<UnifiedAccount[]>([]);\n\n /**\n * Read-only accounts signal.\n */\n readonly accounts = this._accounts.asReadonly();\n\n /**\n * Get a session by key.\n *\n * @param sessionKey - Unique session key\n * @returns Session data or undefined\n */\n getSession(sessionKey: string): StoredSessionData | undefined {\n return this.sessions.get(sessionKey);\n }\n\n /**\n * Store a session.\n *\n * @param sessionKey - Unique session key\n * @param data - Session data to store\n */\n setSession(sessionKey: string, data: StoredSessionData): void {\n this.sessions.set(sessionKey, data);\n logger.debug('Session stored', { sessionKey, accountCount: data.accounts.length });\n }\n\n /**\n * Delete a session by key.\n *\n * @param sessionKey - Session key to delete\n * @returns true if session was deleted\n */\n deleteSession(sessionKey: string): boolean {\n const deleted = this.sessions.delete(sessionKey);\n if (deleted) {\n logger.debug('Session deleted', { sessionKey });\n }\n return deleted;\n }\n\n /**\n * Check if a session exists.\n *\n * @param sessionKey - Session key to check\n */\n hasSession(sessionKey: string): boolean {\n return this.sessions.has(sessionKey);\n }\n\n /**\n * Get the number of stored sessions.\n */\n get size(): number {\n return this.sessions.size;\n }\n\n /**\n * Clear all sessions.\n */\n clear(): void {\n this.sessions.clear();\n this._accounts.set([]);\n logger.debug('All sessions cleared');\n }\n\n /**\n * Get all session entries.\n *\n * @returns Iterator of [sessionKey, sessionData] pairs\n */\n entries(): IterableIterator<[string, StoredSessionData]> {\n return this.sessions.entries();\n }\n\n /**\n * Get all session values.\n *\n * @returns Iterator of session data\n */\n values(): IterableIterator<StoredSessionData> {\n return this.sessions.values();\n }\n\n /**\n * Generate a unique session key for tracking multiple sessions.\n * Format: wc-{ledger}-{network}-{topicPrefix}\n *\n * @param ledgerId - Ledger identifier (hedera, xrpl)\n * @param networkId - Network identifier (hedera:testnet, xrpl:mainnet)\n * @param topic - WalletConnect session topic (optional)\n * @returns Unique session key\n */\n generateSessionKey(ledgerId: string, networkId: string, topic?: string): string {\n const topicPrefix = topic ? topic.substring(0, 8) : Date.now().toString();\n const networkPart = networkId.split(':')[1] || 'unknown';\n return `wc-${ledgerId}-${networkPart}-${topicPrefix}`;\n }\n\n /**\n * Update the aggregated accounts signal from all sessions.\n * Call this after session changes to keep accounts in sync.\n */\n updateAggregatedAccounts(): void {\n const allAccounts: UnifiedAccount[] = [];\n\n for (const sessionData of this.sessions.values()) {\n allAccounts.push(...sessionData.accounts);\n }\n\n logger.debug('Aggregated accounts', {\n sessionCount: this.sessions.size,\n totalAccounts: allAccounts.length,\n });\n this._accounts.set(allAccounts);\n }\n\n /**\n * Find the session containing a specific account address.\n *\n * @param accountAddress - Account address to find\n * @returns Session, signer, and network info, or undefined if not found\n */\n findSessionByAccount(accountAddress: string):\n | {\n session: any;\n signer: IWalletConnectSigner;\n networkId: string;\n userSelectedNetwork: string;\n }\n | undefined {\n for (const sessionData of this.sessions.values()) {\n const accountExists = sessionData.accounts.some((acc) => acc.address === accountAddress);\n if (accountExists) {\n return {\n session: sessionData.session,\n signer: sessionData.signer,\n networkId: sessionData.networkId,\n userSelectedNetwork: sessionData.userSelectedNetwork,\n };\n }\n }\n return undefined;\n }\n\n /**\n * Find and remove a session by its WalletConnect topic.\n *\n * @param topic - WalletConnect session topic\n * @returns Removed session data, or undefined if not found\n */\n removeSessionByTopic(topic: string): { sessionKey: string; data: StoredSessionData } | undefined {\n for (const [sessionKey, sessionData] of this.sessions.entries()) {\n if (sessionData.session.topic === topic) {\n this.sessions.delete(sessionKey);\n logger.info('Session removed by topic', { sessionKey, topic: topic.substring(0, 16) });\n return { sessionKey, data: sessionData };\n }\n }\n return undefined;\n }\n\n /**\n * Get all active sessions as an array.\n * Useful for UI display.\n *\n * @returns Array of session information\n */\n getActiveSessions(): Array<{\n sessionKey: string;\n ledgerId: string;\n networkId: string;\n userSelectedNetwork: string;\n accounts: UnifiedAccount[];\n topic: string;\n }> {\n const sessions: Array<{\n sessionKey: string;\n ledgerId: string;\n networkId: string;\n userSelectedNetwork: string;\n accounts: UnifiedAccount[];\n topic: string;\n }> = [];\n\n for (const [sessionKey, sessionData] of this.sessions.entries()) {\n sessions.push({\n sessionKey,\n ledgerId: sessionData.ledgerId,\n networkId: sessionData.networkId,\n userSelectedNetwork: sessionData.userSelectedNetwork,\n accounts: sessionData.accounts,\n topic: sessionData.session.topic,\n });\n }\n\n return sessions;\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file walletconnect-signing-orchestrator.ts\n * @description Signing orchestration for WalletConnect provider\n *\n * Handles:\n * - Finding sessions for accounts\n * - Session validation in WC SDK\n * - Routing sign/submit requests to appropriate signers\n *\n * Extracted from WalletConnectV2Provider to reduce file size.\n */\n\nimport { getLogger } from '@hsuite/native-connect-sdk';\n\nimport type { WalletEventBus } from '../../../services/wallet-event-bus.service';\nimport type {\n SignTransactionOptions,\n SubmitTransactionOptions,\n SignResult,\n SubmitResult,\n SignMessageOptions,\n SignMessageResult,\n} from '../../base-wallet-provider';\n\nimport type { WalletConnectClientManager } from './walletconnect-client-manager';\nimport type { WalletConnectSessionStore } from './walletconnect-session-store';\n\nconst logger = getLogger().scoped?.('WCSigningOrchestrator') ?? getLogger();\n\n/**\n * Signing orchestration configuration\n */\nexport interface SigningOrchestratorConfig {\n providerId: string;\n sessionStore: WalletConnectSessionStore;\n clientManager: WalletConnectClientManager;\n eventBus: WalletEventBus;\n}\n\n/**\n * Signing Orchestrator\n *\n * Routes signing requests to the appropriate session and signer.\n * Handles session validation and error emission.\n */\nexport class WalletConnectSigningOrchestrator {\n private readonly providerId: string;\n private readonly sessionStore: WalletConnectSessionStore;\n private readonly clientManager: WalletConnectClientManager;\n private readonly eventBus: WalletEventBus;\n\n /**\n *\n * @param config\n */\n constructor(config: SigningOrchestratorConfig) {\n this.providerId = config.providerId;\n this.sessionStore = config.sessionStore;\n this.clientManager = config.clientManager;\n this.eventBus = config.eventBus;\n }\n\n /**\n * Sign a transaction without submitting.\n * Uses the user's selected network from the session for the signing request.\n * @param options\n */\n async signTransaction(options: SignTransactionOptions): Promise<SignResult> {\n const sessionInfo = this.findAndValidateSession(options.accountAddress, 'signTransaction');\n\n // Use user's selected network from session, with fallback to options.networkId\n const networkId = this.resolveNetworkId(sessionInfo, options.networkId);\n\n logger.debug('Routing sign to signer', {\n ledgerId: sessionInfo.signer.ledgerId,\n topic: sessionInfo.session.topic.substring(0, 16) + '...',\n networkId,\n userSelectedNetwork: sessionInfo.userSelectedNetwork,\n });\n\n return sessionInfo.signer.signTransaction({\n client: this.clientManager.getClient(),\n topic: sessionInfo.session.topic,\n accountAddress: options.accountAddress,\n payload: options.payload,\n networkId,\n });\n }\n\n /**\n * Sign and submit a transaction.\n * Uses the user's selected network from the session for the signing request.\n * @param options\n */\n async submitTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {\n const sessionInfo = this.findAndValidateSession(options.accountAddress, 'submitTransaction');\n\n // Use user's selected network from session, with fallback to options.networkId\n const networkId = this.resolveNetworkId(sessionInfo, options.networkId);\n\n logger.debug('Routing submit to signer', {\n ledgerId: sessionInfo.signer.ledgerId,\n topic: sessionInfo.session.topic.substring(0, 16) + '...',\n networkId,\n userSelectedNetwork: sessionInfo.userSelectedNetwork,\n });\n\n return sessionInfo.signer.submitTransaction({\n client: this.clientManager.getClient(),\n topic: sessionInfo.session.topic,\n accountAddress: options.accountAddress,\n payload: options.payload,\n networkId,\n });\n }\n\n /**\n * Sign and execute a transaction (single wallet prompt).\n * Uses the user's selected network from the session for the signing request.\n * @param options\n */\n async signAndExecuteTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {\n const sessionInfo = this.findAndValidateSession(\n options.accountAddress,\n 'signAndExecuteTransaction',\n );\n\n // Use user's selected network from session, with fallback to options.networkId\n const networkId = this.resolveNetworkId(sessionInfo, options.networkId);\n\n logger.debug('Routing signAndExecute to signer', {\n ledgerId: sessionInfo.signer.ledgerId,\n topic: sessionInfo.session.topic.substring(0, 16) + '...',\n networkId,\n userSelectedNetwork: sessionInfo.userSelectedNetwork,\n });\n\n // Check if signer supports native signAndExecute\n if (typeof sessionInfo.signer.signAndExecuteTransaction === 'function') {\n return sessionInfo.signer.signAndExecuteTransaction({\n client: this.clientManager.getClient(),\n topic: sessionInfo.session.topic,\n accountAddress: options.accountAddress,\n payload: options.payload,\n networkId,\n });\n }\n\n // Fallback: sign then submit\n const signResult = await sessionInfo.signer.signTransaction({\n client: this.clientManager.getClient(),\n topic: sessionInfo.session.topic,\n accountAddress: options.accountAddress,\n payload: options.payload,\n networkId,\n });\n\n return sessionInfo.signer.submitTransaction({\n client: this.clientManager.getClient(),\n topic: sessionInfo.session.topic,\n accountAddress: options.accountAddress,\n payload: signResult.signedPayload || options.payload,\n networkId,\n });\n }\n\n /**\n * Sign a message.\n * Uses the user's selected network from the session for the signing request.\n * @param options\n */\n async signMessage(options: SignMessageOptions): Promise<SignMessageResult> {\n const sessionInfo = this.findAndValidateSession(options.accountAddress, 'signMessage');\n\n // Use user's selected network from session, with fallback to options.networkId\n const networkId = this.resolveNetworkId(sessionInfo, options.networkId);\n\n logger.debug('Routing signMessage to signer', {\n ledgerId: sessionInfo.signer.ledgerId,\n topic: sessionInfo.session.topic.substring(0, 16) + '...',\n networkId,\n userSelectedNetwork: sessionInfo.userSelectedNetwork,\n });\n\n return sessionInfo.signer.signMessage({\n client: this.clientManager.getClient(),\n topic: sessionInfo.session.topic,\n accountAddress: options.accountAddress,\n payload: '',\n networkId,\n message: options.message,\n encoding: options.encoding,\n });\n }\n\n /**\n * Resolve the network ID to use for signing.\n *\n * Priority:\n * 1. User's selected network from session (userSelectedNetwork)\n * 2. Session's networkId\n * 3. options.networkId from the caller\n * 4. Empty string (let signer handle default)\n *\n * This ensures we always use the network the user selected when connecting,\n * regardless of what the caller passes in.\n *\n * @param sessionInfo - Session info containing network selections\n * @param sessionInfo.userSelectedNetwork\n * @param optionsNetworkId - Network ID from caller options\n * @param sessionInfo.networkId\n * @returns Resolved network ID to use\n */\n private resolveNetworkId(\n sessionInfo: { userSelectedNetwork: string; networkId: string },\n optionsNetworkId?: string,\n ): string {\n // Prefer user's selected network, then session network, then options\n const resolvedNetwork =\n sessionInfo.userSelectedNetwork || sessionInfo.networkId || optionsNetworkId || '';\n\n // Log if there's a mismatch between options and session network\n if (\n optionsNetworkId &&\n sessionInfo.userSelectedNetwork &&\n optionsNetworkId !== sessionInfo.userSelectedNetwork\n ) {\n logger.warn('Network mismatch: using session network over caller-provided network', {\n callerNetwork: optionsNetworkId,\n sessionNetwork: sessionInfo.userSelectedNetwork,\n using: resolvedNetwork,\n });\n }\n\n return resolvedNetwork;\n }\n\n /**\n * Find session for account and validate it exists in SDK.\n * @param accountAddress\n * @param context\n */\n private findAndValidateSession(accountAddress: string, context: string) {\n const sessionInfo = this.sessionStore.findSessionByAccount(accountAddress);\n if (!sessionInfo) {\n throw new Error(`No WalletConnect session found for account: ${accountAddress}`);\n }\n\n // Validate session exists in WC SDK\n if (!this.validateSessionInSdk(sessionInfo.session.topic)) {\n logger.error('Session not found in WC SDK', {\n topic: sessionInfo.session.topic.substring(0, 16) + '...',\n account: accountAddress,\n });\n this.eventBus.providerError.emit({\n providerId: this.providerId,\n error: new Error('WalletConnect session expired or disconnected. Please reconnect.'),\n context,\n timestamp: Date.now(),\n });\n throw new Error(\n 'WalletConnect session expired or disconnected. Please reconnect your wallet.',\n );\n }\n\n return sessionInfo;\n }\n\n /**\n * Validate session exists in WC SDK storage.\n * @param topic\n */\n private validateSessionInSdk(topic: string): boolean {\n if (!this.clientManager.isInitialized()) {\n return false;\n }\n\n try {\n const session = this.clientManager.getSession(topic);\n return !!session;\n } catch (error) {\n logger.warn('Session validation failed', {\n topic: topic.substring(0, 16) + '...',\n error: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file walletconnect-provider.ts\n * @description Refactored WalletConnect v2 provider using Strategy Pattern\n *\n * Multi-chain WalletConnect v2 provider that delegates ledger-specific logic\n * to specialized signer implementations.\n *\n * Architecture:\n * - Provider: Orchestrates connection, session management, and UI\n * - Signers: Handle ledger-specific transaction signing and formatting\n * - Encoders: Convert between SDK formats and WalletConnect formats\n *\n * Benefits:\n * - Clean separation of concerns\n * - Easy to add new ledgers (just implement IWalletConnectSigner)\n * - Testable (mock signers for unit tests)\n * - Maintainable (ledger logic is isolated)\n */\n\nimport { Injectable, signal, inject, NgZone } from '@angular/core';\nimport { getLogger } from '@hsuite/native-connect-sdk';\n\nimport type {\n ConnectionStatus,\n ProviderMetadata,\n ConnectionConfig,\n WalletConnectV2Config,\n} from '../../../models/provider-types';\nimport type { UnifiedAccount } from '../../../models/unified-account.model';\nimport { WalletEventBus } from '../../../services/wallet-event-bus.service';\nimport { BaseWalletProvider } from '../../base-wallet-provider';\nimport type {\n SignTransactionOptions,\n SubmitTransactionOptions,\n SignResult,\n SubmitResult,\n SignMessageOptions,\n SignMessageResult,\n} from '../../base-wallet-provider';\nimport { SignerFactory } from '../signers/signer-factory';\n\nimport { WalletConnectClientManager } from './walletconnect-client-manager';\nimport { WalletConnectSessionStore } from './walletconnect-session-store';\nimport { WalletConnectSigningOrchestrator } from './walletconnect-signing-orchestrator';\n\nconst logger = getLogger().scoped?.('WalletConnectV2Provider') ?? getLogger();\n\n/**\n * Storage key prefix for persisting user's network selection per session topic.\n * This is critical for proper session restoration after page reload.\n */\nconst NETWORK_SELECTION_STORAGE_KEY = 'wc_user_network_selection_';\n\n/**\n * WalletConnect v2 provider with multi-chain support.\n *\n * Uses Strategy Pattern to delegate ledger-specific operations to\n * specialized signer implementations (HederaSigner, XrplSigner, etc.).\n *\n * Features:\n * - Automatic session restoration from IndexedDB\n * - QR code modal for wallet connection\n * - Support for multiple ledgers (Hedera, XRPL, extensible)\n * - Clean separation of orchestration vs ledger logic\n * - **Multi-session support**: Connect multiple wallets across different ledgers/networks\n */\n@Injectable({ providedIn: 'root' })\nexport class WalletConnectV2Provider extends BaseWalletProvider {\n override readonly id = 'walletconnect-v2';\n\n override readonly metadata: ProviderMetadata = {\n id: 'walletconnect-v2',\n name: 'WalletConnect',\n type: 'walletconnect-v2',\n description: 'Connect via QR code to Hedera, XRPL, and other wallets',\n supportsMultipleAccounts: true, // Changed to true for multi-session\n };\n\n /**\n * Client manager - handles SignClient lifecycle.\n */\n private readonly clientManager = new WalletConnectClientManager();\n\n /**\n * Session store - handles session Map and account aggregation.\n */\n private readonly sessionStore = new WalletConnectSessionStore();\n\n /**\n * Signing orchestrator - handles transaction signing routing.\n */\n private signingOrchestrator!: WalletConnectSigningOrchestrator;\n\n // Track session_delete listener registration\n private sessionDeleteListenerRegistered = false;\n\n // Reactive state\n private _status = signal<ConnectionStatus>('disconnected');\n private _error = signal<string | null>(null);\n\n override readonly status = this._status.asReadonly();\n override readonly accounts = this.sessionStore.accounts;\n override readonly error = this._error.asReadonly();\n\n // Event bus for emitting wallet events\n private readonly eventBus = inject(WalletEventBus);\n\n // NgZone for ensuring change detection runs after WalletConnect events\n private readonly zone = inject(NgZone);\n\n /**\n *\n */\n constructor() {\n super();\n\n // Initialize signing orchestrator\n this.signingOrchestrator = new WalletConnectSigningOrchestrator({\n providerId: this.id,\n sessionStore: this.sessionStore,\n clientManager: this.clientManager,\n eventBus: this.eventBus,\n });\n\n logger.info('Initializing - will attempt session restoration');\n void this.restoreSession();\n }\n\n /**\n * Ensure that a previously restored WalletConnect session is present in memory.\n * Useful for UI flows that want to re-select a session after reload without forcing a new pairing flow.\n * @param sessionKey\n */\n async resumeSession(sessionKey: string): Promise<boolean> {\n if (this.sessionStore.hasSession(sessionKey)) {\n this.sessionStore.updateAggregatedAccounts();\n return true;\n }\n\n await this.restoreSession();\n const exists = this.sessionStore.hasSession(sessionKey);\n if (exists) {\n this.sessionStore.updateAggregatedAccounts();\n }\n return exists;\n }\n\n /**\n * Restore existing WalletConnect sessions from IndexedDB.\n * Automatically called during provider initialization.\n * Uses clientManager for client lifecycle.\n */\n private async restoreSession(): Promise<void> {\n try {\n logger.debug('Attempting to restore sessions...');\n\n // Restore client from stored projectId\n const client = await this.clientManager.restoreClient({\n name: 'HSuite Demo',\n description: 'Multi-chain wallet connection',\n url: window.location.origin,\n icons: [],\n });\n\n if (!client) {\n return;\n }\n\n // Register session_delete listener\n this.registerSessionDeleteListener();\n\n // Get all active sessions\n const activeSessions = this.clientManager.getActiveSessions();\n logger.info('Found active sessions', { count: activeSessions.length });\n\n if (activeSessions.length === 0) {\n return;\n }\n\n // Restore each session\n for (const session of activeSessions) {\n try {\n await this.restoreSingleSession(session);\n } catch (error) {\n logger.error('Failed to restore session', {\n topic: session.topic,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Update aggregated accounts\n this.sessionStore.updateAggregatedAccounts();\n\n if (this.sessionStore.size > 0) {\n this._status.set('connected');\n logger.info('Restored sessions', { count: this.sessionStore.size });\n }\n } catch (error) {\n logger.error('Failed to restore sessions', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Restore a single WalletConnect session.\n * Internal helper for multi-session restoration.\n *\n * IMPORTANT: Reads user's network selection from localStorage to ensure\n * restored sessions use the correct network the user originally selected.\n *\n * @param session - WalletConnect session object from IndexedDB\n */\n private async restoreSingleSession(session: any): Promise<void> {\n logger.debug('Restoring session', { topic: session.topic });\n logger.debug('Session namespaces', { namespaces: Object.keys(session.namespaces) });\n\n // Determine ledger from session namespaces\n let ledgerId: string | undefined;\n let walletReportedNetwork: string | undefined;\n\n if (session.namespaces.hedera) {\n ledgerId = 'hedera';\n walletReportedNetwork = session.namespaces.hedera.chains?.[0] || 'hedera:testnet';\n logger.debug('Found Hedera namespace', { chains: session.namespaces.hedera.chains });\n } else if (session.namespaces.xrpl) {\n ledgerId = 'xrpl';\n walletReportedNetwork = session.namespaces.xrpl.chains?.[0] || 'xrpl:testnet';\n logger.debug('Found XRPL namespace', { chains: session.namespaces.xrpl.chains });\n }\n\n if (!ledgerId || !walletReportedNetwork) {\n logger.warn('Could not determine ledger for session', {\n topic: session.topic,\n availableNamespaces: Object.keys(session.namespaces),\n });\n return;\n }\n\n // CRITICAL: Retrieve user's original network selection from localStorage\n // This ensures we restore the session with the network the user actually selected\n const userSelectedNetwork = this.getUserNetworkSelection(session.topic);\n const networkId = userSelectedNetwork || walletReportedNetwork;\n\n if (userSelectedNetwork) {\n logger.debug('Restored user network selection', {\n userSelectedNetwork,\n walletReportedNetwork,\n topic: session.topic.substring(0, 16),\n });\n } else {\n logger.warn('No stored network selection found, using wallet-reported network', {\n walletReportedNetwork,\n topic: session.topic.substring(0, 16),\n });\n }\n\n // Get the appropriate signer\n const signer = SignerFactory.getSigner(ledgerId);\n\n // Generate session key using the user's selected network\n const sessionKey = this.sessionStore.generateSessionKey(ledgerId, networkId, session.topic);\n\n // Parse accounts from session, filtering by user's selected network\n const namespace = session.namespaces[ledgerId];\n logger.debug('Namespace for restoration', {\n ledgerId,\n accountCount: (namespace as { accounts?: any[] })?.accounts?.length || 0,\n });\n\n // Pass the user's selected network to filter accounts appropriately\n const parsedAccounts = signer.parseAccounts(namespace, userSelectedNetwork);\n logger.debug('Parsed accounts from restored session', {\n count: parsedAccounts.length,\n userSelectedNetwork,\n });\n\n if (parsedAccounts.length === 0) {\n logger.warn('Restored session has no accounts for selected network', {\n userSelectedNetwork,\n walletReportedNetwork,\n });\n }\n\n // Create UnifiedAccount objects with user's selected network\n const accounts: UnifiedAccount[] = parsedAccounts.map((acc, index) => ({\n id: `${this.id}-${ledgerId}-${acc.address}`,\n address: acc.address,\n label: `Account ${index + 1}`,\n ledgerId: ledgerId as 'hedera' | 'xrpl',\n networkId: networkId, // Use user's selected network\n providerId: this.id,\n providerType: 'walletconnect-v2',\n metadata: {\n topic: session.topic,\n ledger: ledgerId,\n sessionKey,\n peer: session.peer?.metadata,\n walletReportedChainId: acc.chainId, // Keep original for debugging\n userSelectedNetwork: networkId,\n },\n }));\n\n // Store session data with user's network selection\n this.sessionStore.setSession(sessionKey, {\n session,\n ledgerId,\n networkId,\n userSelectedNetwork: networkId,\n signer,\n accounts,\n });\n\n logger.info('Restored session', {\n sessionKey,\n ledgerId,\n networkId,\n userSelectedNetwork: networkId,\n accountCount: accounts.length,\n });\n\n // Emit session restored event\n this.eventBus.sessionRestored.emit({\n providerId: this.id,\n sessionKey,\n accounts,\n metadata: { topic: session.topic, ledgerId, networkId, userSelectedNetwork: networkId },\n timestamp: Date.now(),\n });\n }\n\n // NOTE: generateSessionKey and updateAggregatedAccounts have been moved to WalletConnectSessionStore\n\n /**\n * Store user's network selection in localStorage for session restoration.\n * This ensures the user's network choice persists across page reloads.\n *\n * @param sessionTopic - WalletConnect session topic\n * @param networkId - User's selected network (e.g., 'hedera:mainnet')\n */\n private storeUserNetworkSelection(sessionTopic: string, networkId: string): void {\n try {\n localStorage.setItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`, networkId);\n logger.debug('Stored user network selection', {\n topic: sessionTopic.substring(0, 16),\n networkId,\n });\n } catch (e) {\n logger.warn('Failed to store network selection', { error: (e as Error).message });\n }\n }\n\n /**\n * Retrieve user's network selection from localStorage for session restoration.\n *\n * @param sessionTopic - WalletConnect session topic\n * @returns User's selected network, or undefined if not found\n */\n private getUserNetworkSelection(sessionTopic: string): string | undefined {\n try {\n return localStorage.getItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`) || undefined;\n } catch (e) {\n logger.warn('Failed to retrieve network selection', { error: (e as Error).message });\n return undefined;\n }\n }\n\n /**\n * Clean up stored network selection for a session.\n *\n * @param sessionTopic - WalletConnect session topic\n */\n private clearUserNetworkSelection(sessionTopic: string): void {\n try {\n localStorage.removeItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`);\n } catch (_e) {\n // Ignore cleanup errors\n }\n }\n\n /**\n * Connect to a wallet via WalletConnect QR code.\n *\n * Multi-session support:\n * - Each connect() call creates a NEW session\n * - Sessions are tracked separately in the sessions Map\n * - Multiple sessions can coexist for different ledgers/networks\n *\n * Process:\n * 1. Get appropriate signer for the ledger\n * 2. Initialize WalletConnect client and modal\n * 3. Build namespace configuration using signer\n * 4. Generate QR code and wait for wallet approval\n * 5. Store session and update aggregated accounts\n *\n * @param config - Connection configuration including ledger and network\n */\n async connect(config: ConnectionConfig): Promise<void> {\n const wcConfig = config as WalletConnectV2Config;\n\n try {\n this._status.set('connecting');\n this._error.set(null);\n\n // Validate configuration\n const projectId = wcConfig.projectId;\n if (!projectId) {\n throw new Error(\n 'WalletConnect projectId is required. Get one from https://cloud.walletconnect.com',\n );\n }\n\n // Get the appropriate signer for this ledger (Strategy Pattern)\n const signer = SignerFactory.getSigner(wcConfig.ledgerId);\n logger.debug('Using signer for ledger', { ledgerId: wcConfig.ledgerId });\n\n // Initialize client via manager\n await this.clientManager.initialize(projectId, {\n name: wcConfig.appName || 'HSuite Demo',\n description: wcConfig.appDescription || 'Multi-chain wallet connection',\n url: window.location.origin,\n icons: wcConfig.appIconUrl ? [wcConfig.appIconUrl] : [],\n });\n this.registerSessionDeleteListener();\n\n // Create modal for QR code display\n const modal = this.clientManager.createModal(projectId, [wcConfig.networkId]);\n\n // Build namespace configuration using signer\n const namespaceConfig = signer.buildNamespace(wcConfig.networkId);\n const optionalNamespaces = { [wcConfig.ledgerId]: namespaceConfig };\n logger.debug('Namespace config', { ledgerId: wcConfig.ledgerId });\n\n // Build session properties to pass user's preferred network to wallet\n // This tells the wallet which network accounts to show in the picker\n const sessionProperties = {\n preferredNetwork: wcConfig.networkId,\n preferredLedger: wcConfig.ledgerId,\n };\n\n logger.info('Connecting with preferred network', {\n preferredNetwork: wcConfig.networkId,\n preferredLedger: wcConfig.ledgerId,\n });\n\n // Connect and show QR code\n const { uri, approval } = await this.clientManager.connect(\n optionalNamespaces,\n sessionProperties,\n );\n\n if (uri) {\n await modal.openModal({ uri });\n }\n\n // Wait for wallet approval\n logger.info('Waiting for wallet approval...');\n const session = await approval();\n this.clientManager.closeModal();\n\n logger.info('[WC:DAPP:APPROVED] Session approved by wallet', {\n topic: session.topic.substring(0, 16) + '...',\n fullTopic: session.topic,\n namespaces: Object.keys(session.namespaces),\n expiry: session.expiry,\n });\n\n // Generate session key\n const sessionKey = this.sessionStore.generateSessionKey(\n wcConfig.ledgerId,\n wcConfig.networkId,\n session.topic,\n );\n\n // Parse accounts from session\n const sessionNamespace = session.namespaces[wcConfig.ledgerId];\n logger.debug('Session namespace for ledger', {\n ledgerId: wcConfig.ledgerId,\n accountCount: (sessionNamespace as { accounts?: any[] })?.accounts?.length || 0,\n });\n\n if (!sessionNamespace) {\n logger.error('No namespace found for ledger', {\n ledgerId: wcConfig.ledgerId,\n availableNamespaces: Object.keys(session.namespaces),\n });\n throw new Error(\n `Wallet did not approve ${wcConfig.ledgerId} namespace. Available: ${Object.keys(session.namespaces).join(', ')}`,\n );\n }\n\n // Parse accounts from session namespace, filtering by user's selected network\n // This ensures we only show accounts that match the network the user selected\n const parsedAccounts = signer.parseAccounts(sessionNamespace, wcConfig.networkId);\n logger.debug('Parsed accounts', {\n count: parsedAccounts.length,\n userSelectedNetwork: wcConfig.networkId,\n });\n\n if (parsedAccounts.length === 0) {\n logger.warn('No accounts returned from wallet - possible causes:', {\n reason1: 'Wallet has no accounts for the requested network',\n reason2: 'Wallet denied account sharing',\n reason3: 'Wallet returned accounts in unexpected format',\n userSelectedNetwork: wcConfig.networkId,\n });\n }\n\n // Create UnifiedAccount objects\n // IMPORTANT: Use wcConfig.networkId (user's selection) for account networkId\n // This respects user intent rather than relying on wallet-reported chain\n const accounts: UnifiedAccount[] = parsedAccounts.map((acc, index) => ({\n id: `${this.id}-${wcConfig.ledgerId}-${acc.address}`,\n address: acc.address,\n label: `Account ${index + 1}`,\n ledgerId: wcConfig.ledgerId,\n networkId: wcConfig.networkId, // Use user's selected network, not wallet-reported\n providerId: this.id,\n providerType: 'walletconnect-v2',\n metadata: {\n topic: session.topic,\n ledger: wcConfig.ledgerId,\n sessionKey,\n walletReportedChainId: acc.chainId, // Keep original for debugging\n userSelectedNetwork: wcConfig.networkId, // Store for session restoration\n },\n }));\n\n // Store session data with user's selected network\n this.sessionStore.setSession(sessionKey, {\n session,\n ledgerId: wcConfig.ledgerId,\n networkId: wcConfig.networkId,\n userSelectedNetwork: wcConfig.networkId, // Store user's selection for restoration\n signer,\n accounts,\n });\n\n // Persist user's network selection for session restoration after page reload\n this.storeUserNetworkSelection(session.topic, wcConfig.networkId);\n\n // Verify session exists in WC SDK after storing\n const sdkSession = this.clientManager.getSession(session.topic);\n\n logger.info('[WC:DAPP:STORED] Session stored locally', {\n sessionKey,\n topic: session.topic.substring(0, 16) + '...',\n fullTopic: session.topic,\n accountCount: accounts.length,\n totalSessions: this.sessionStore.size,\n existsInSdkSession: !!sdkSession,\n });\n\n // Update aggregated accounts\n this.sessionStore.updateAggregatedAccounts();\n this._status.set('connected');\n\n // Emit session created event\n this.eventBus.sessionCreated.emit({\n providerId: this.id,\n sessionKey,\n accounts,\n metadata: {\n topic: session.topic,\n ledgerId: wcConfig.ledgerId,\n networkId: wcConfig.networkId,\n },\n timestamp: Date.now(),\n });\n\n // Register session_delete listener (idempotent)\n this.registerSessionDeleteListener();\n } catch (error) {\n this._status.set('error');\n this._error.set(error instanceof Error ? error.message : 'Connection failed');\n logger.error('Connection failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Emit provider error event\n this.eventBus.providerError.emit({\n providerId: this.id,\n error: error instanceof Error ? error : String(error),\n context: 'connection',\n timestamp: Date.now(),\n });\n\n this.clientManager.closeModal();\n throw error;\n }\n }\n\n /**\n * Remove a session by its WalletConnect topic.\n * Internal helper for session_delete event handling.\n *\n * @param topic - WalletConnect session topic\n */\n private removeSessionByTopic(topic: string): void {\n // Find and remove the session using session store\n const removed = this.sessionStore.removeSessionByTopic(topic);\n\n // Clean up stored network selection\n this.clearUserNetworkSelection(topic);\n\n // Update aggregated accounts\n this.sessionStore.updateAggregatedAccounts();\n\n // Update status\n if (this.sessionStore.size === 0) {\n this._status.set('disconnected');\n }\n\n // Emit events if session was found\n if (removed) {\n // Emit session deleted event\n this.eventBus.sessionDeleted.emit({\n providerId: this.id,\n sessionKey: removed.sessionKey,\n accounts: removed.data.accounts,\n metadata: { topic, reason: 'wallet_initiated' },\n timestamp: Date.now(),\n });\n\n // Emit disconnection event\n this.eventBus.disconnected.emit({\n providerId: this.id,\n providerType: 'walletconnect-v2',\n sessionKey: removed.sessionKey,\n reason: 'wallet_initiated_disconnect',\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Register session_delete event listener to handle wallet-initiated disconnects.\n * Idempotent - only registers once even if called multiple times.\n *\n * @private\n */\n private registerSessionDeleteListener(): void {\n if (!this.clientManager.isInitialized() || this.sessionDeleteListenerRegistered) {\n return;\n }\n\n // ✅ CRITICAL: Run inside NgZone to trigger Angular's change detection\n // WalletConnect events arrive outside Angular's zone\n this.clientManager.on('session_delete', (event: any) => {\n this.zone.run(() => {\n logger.info('� Session deleted by wallet (session_delete event)', {\n topic: (event as { topic: string }).topic,\n });\n this.removeSessionByTopic((event as { topic: string }).topic);\n });\n });\n\n this.sessionDeleteListenerRegistered = true;\n logger.debug('session_delete listener registered');\n }\n\n /**\n * Disconnect from WalletConnect sessions.\n * Supports disconnecting all sessions or a specific session.\n *\n * @param sessionKey - Optional session key to disconnect specific session\n */\n async disconnect(sessionKey?: string): Promise<void> {\n if (!this.clientManager.isInitialized()) {\n logger.warn('No client to disconnect');\n return;\n }\n\n if (sessionKey) {\n // Disconnect specific session\n const sessionData = this.sessionStore.getSession(sessionKey);\n if (sessionData) {\n try {\n await this.clientManager.disconnect(sessionData.session.topic, {\n code: 6000,\n message: 'User disconnected session',\n });\n logger.info('Disconnected session', { sessionKey });\n } catch (e) {\n logger.error('Disconnect error for session', {\n sessionKey,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n\n // Clean up stored network selection\n this.clearUserNetworkSelection(sessionData.session.topic);\n\n this.sessionStore.deleteSession(sessionKey);\n this.sessionStore.updateAggregatedAccounts();\n\n if (this.sessionStore.size === 0) {\n this._status.set('disconnected');\n }\n }\n } else {\n // Disconnect all sessions\n const disconnectPromises: Promise<void>[] = [];\n\n for (const [_key, sessionData] of this.sessionStore.entries()) {\n // Clean up stored network selection for each session\n this.clearUserNetworkSelection(sessionData.session.topic);\n\n disconnectPromises.push(\n this.clientManager\n .disconnect(sessionData.session.topic, {\n code: 6000,\n message: 'User disconnected all sessions',\n })\n .catch((err: Error) =>\n logger.error('Disconnect error', {\n error: err.message,\n }),\n ),\n );\n }\n\n await Promise.all(disconnectPromises);\n\n this.sessionStore.clear();\n this._status.set('disconnected');\n\n logger.info('Disconnected all sessions');\n }\n\n this.clientManager.closeModal();\n }\n\n // NOTE: findSessionForAccount and validateSessionInSdk moved to WalletConnectSigningOrchestrator\n\n /**\n * Sign a transaction without submitting (delegates to SigningOrchestrator).\n * @param options\n */\n async signTransaction(options: SignTransactionOptions): Promise<SignResult> {\n if (!this.clientManager.isInitialized()) {\n throw new Error('Not connected to WalletConnect');\n }\n return this.signingOrchestrator.signTransaction(options);\n }\n\n /**\n * Sign and submit a transaction (delegates to SigningOrchestrator).\n * @param options\n */\n async submitTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {\n if (!this.clientManager.isInitialized()) {\n throw new Error('Not connected to WalletConnect');\n }\n return this.signingOrchestrator.submitTransaction(options);\n }\n\n /**\n * Sign and execute transaction in one call (delegates to SigningOrchestrator).\n * @param options\n */\n async signAndExecuteTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {\n if (!this.clientManager.isInitialized()) {\n throw new Error('Not connected to WalletConnect');\n }\n return this.signingOrchestrator.signAndExecuteTransaction(options);\n }\n\n /**\n * Sign an arbitrary message (delegates to SigningOrchestrator).\n * @param options\n */\n async signMessage(options: SignMessageOptions): Promise<SignMessageResult> {\n if (!this.clientManager.isInitialized()) {\n throw new Error('Not connected to WalletConnect');\n }\n return this.signingOrchestrator.signMessage(options);\n }\n\n /**\n * Check if WalletConnect is available.\n * Always returns true as WalletConnect is browser-based.\n */\n async isAvailable(): Promise<boolean> {\n return true;\n }\n\n /**\n * Get all active WalletConnect sessions.\n * Useful for displaying session information in UI and managing multiple connections.\n * Delegates to session store.\n *\n * @returns Array of session information objects\n */\n getActiveSessions(): Array<{\n sessionKey: string;\n ledgerId: string;\n networkId: string;\n userSelectedNetwork: string;\n accounts: UnifiedAccount[];\n topic: string;\n }> {\n return this.sessionStore.getActiveSessions();\n }\n\n /**\n * Disconnect a specific session by session key.\n * Public wrapper for the private disconnect method.\n *\n * @param sessionKey - The session key to disconnect\n */\n async disconnectSession(sessionKey: string): Promise<void> {\n await this.disconnect(sessionKey);\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file p2p-session-manager.ts\n * @description Session management for P2P Native connections (dApp-side)\n *\n * Manages Nostr-first P2P connections for wallet pairing (both mobile and desktop).\n * The dApp creates a session invite QR code that the wallet scans.\n * Communication starts via Nostr relays and upgrades to WebRTC P2P when possible.\n *\n * **Architecture Notes:**\n * - Uses the unified ChannelClient for Nostr/P2P communication\n * - Single QR code scanning (no 2-phase exchange)\n * - Session negotiation via Nostr, then P2P upgrade\n * - RPC communication over best available transport\n * - Session ownership remains with the wallet\n */\n\nimport { Injectable, signal, type Signal, NgZone } from '@angular/core';\nimport {\n ChannelClient,\n type ChannelInvite,\n type ChannelState,\n type TransportState,\n type ChannelAccount,\n encodeChannelInvite,\n getLogger,\n} from '@hsuite/native-connect-sdk';\n\nimport type { UnifiedAccount } from '../../models/unified-account.model';\n\nconst logger = getLogger().scoped?.('P2PSessionManager') ?? getLogger();\n\n/**\n * Connection state for P2P native sessions.\n *\n * States:\n * - idle: No connection attempt in progress\n * - creating_offer: Generating session invite for QR code\n * - awaiting_connection: QR displayed, waiting for wallet to scan and connect\n * - pending_approval: Wallet connected, waiting for user to approve session\n * - connected: Session approved and fully connected\n * - disconnected: Previously connected, now disconnected\n * - error: Connection or handshake error occurred\n */\nexport type P2PConnectionState =\n | 'idle'\n | 'creating_offer'\n | 'awaiting_connection'\n | 'pending_approval'\n | 'connected'\n | 'disconnected'\n | 'error';\n\n/**\n * Options for creating a pairing offer\n */\nexport interface CreateOfferOptions {\n appId: string;\n appName: string;\n ledgerId: string;\n networkId: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Result of creating a pairing offer\n */\nexport interface CreateOfferResult {\n /** Encoded QR data (nostr+p2p://...) */\n qrData: string;\n /** Channel ID for this connection attempt */\n sessionId: string;\n}\n\n/**\n * Managed session data\n */\nexport interface P2PSession {\n id: string;\n sessionId: string;\n appId: string;\n appName: string;\n ledgerId: string;\n networkId: string;\n accounts: UnifiedAccount[];\n permissions: string[];\n connectedAt: number;\n}\n\n/**\n * Transaction options for RPC calls\n */\nexport interface TransactionOptions {\n accountAddress: string;\n payload: string;\n ledgerId?: string;\n networkId?: string;\n isBatch?: boolean;\n batchKey?: string;\n innerTransactions?: Array<{ payload: string; description?: string }>;\n}\n\n/**\n * Message signing options\n */\nexport interface MessageSigningOptions {\n accountAddress: string;\n message: string;\n encoding?: 'utf-8' | 'base64';\n ledgerId?: string;\n networkId?: string;\n}\n\n/**\n * Mobile Native Session Manager\n *\n * Manages Nostr-first P2P connections for mobile wallet pairing.\n * Creates and displays QR codes that mobile wallets can scan\n * to establish a direct, end-to-end encrypted connection.\n *\n * Uses single QR code scanning with Nostr for initial signaling\n * and automatic P2P upgrade when possible.\n *\n * This implementation uses the unified ChannelClient from the new channel protocol.\n */\n@Injectable({ providedIn: 'root' })\nexport class P2PSessionManager {\n // Private state\n private readonly _connectionState = signal<P2PConnectionState>('idle');\n private readonly _currentSession = signal<P2PSession | null>(null);\n private readonly _p2pState = signal<TransportState>('nostr-only');\n\n // Channel client\n private client?: ChannelClient;\n private currentInvite?: ChannelInvite;\n\n // Callbacks\n private connectedCallbacks: Array<(session: P2PSession) => void> = [];\n private disconnectedCallbacks: Array<() => void> = [];\n private errorCallbacks: Array<(error: Error) => void> = [];\n private accountsChangedCallbacks: Array<(accounts: UnifiedAccount[]) => void> = [];\n\n // NgZone for change detection\n private zone?: NgZone;\n\n // Session negotiation state\n private sessionApprovalPromise?: {\n resolve: (session: P2PSession) => void;\n reject: (error: Error) => void;\n };\n\n /**\n *\n */\n constructor() {}\n\n /**\n * Set NgZone for Angular change detection\n * @param zone\n */\n setNgZone(zone: NgZone): void {\n this.zone = zone;\n }\n\n /**\n * Current connection state\n */\n get connectionState(): Signal<P2PConnectionState> {\n return this._connectionState.asReadonly();\n }\n\n /**\n * Current session\n */\n get currentSession(): Signal<P2PSession | null> {\n return this._currentSession.asReadonly();\n }\n\n /**\n * Current P2P upgrade state\n */\n get p2pState(): Signal<TransportState> {\n return this._p2pState.asReadonly();\n }\n\n /**\n * Create a pairing offer for QR code display.\n *\n * Generates a compact session invite encoded for QR code display.\n * The invite contains the channel ID, encryption key, and Nostr relays.\n *\n * @param options - Offer creation options\n * @returns Promise resolving to offer result with QR data\n */\n async createPairingOffer(options: CreateOfferOptions): Promise<CreateOfferResult> {\n logger.info('Creating pairing offer (Nostr-first)', { options });\n\n try {\n this.runInZone(() => this._connectionState.set('creating_offer'));\n\n // Clean up any existing client\n await this.cleanup(false);\n\n // Create new channel client with state/account callbacks.\n // The polling in startStateSync() also reads client.state, but these\n // callbacks ensure immediate handling of state transitions — critical\n // when the wallet approves via Nostr and the approval event arrives\n // between poll ticks.\n this.client = new ChannelClient({\n p2p: { enabled: true },\n onStateChange: (state: ChannelState) => {\n logger.debug('ChannelClient state callback', { state });\n const accounts = this.client?.accounts ?? [];\n this.handleStateChange(state, accounts);\n },\n onAccountsChange: (accounts: ChannelAccount[]) => {\n logger.debug('ChannelClient accounts callback', { count: accounts.length });\n const state = this.client?.state ?? 'idle';\n this.handleStateChange(state, accounts);\n },\n });\n\n // Connect and get invite. Always include the dApp's origin so the\n // wallet can show the user where the request is coming from.\n const resolvedOrigin =\n typeof window !== 'undefined' && window.location ? window.location.origin : undefined;\n\n const invite = await this.client.connect({\n type: 'session',\n app: {\n id: options.appId,\n name: options.appName,\n origin: resolvedOrigin,\n },\n context: {\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n },\n permissions: ['sign', 'submit'],\n });\n\n this.currentInvite = invite;\n\n // Encode invite for QR code\n const qrData = encodeChannelInvite(invite);\n\n this.runInZone(() => this._connectionState.set('awaiting_connection'));\n\n logger.info('Pairing offer created', {\n sessionId: invite.id.slice(0, 8),\n qrDataLength: qrData.length,\n });\n\n // Start polling for state changes\n this.startStateSync();\n\n return { qrData, sessionId: invite.id };\n } catch (error) {\n logger.error('Failed to create pairing offer', { error });\n this.runInZone(() => this._connectionState.set('error'));\n this.notifyError(error instanceof Error ? error : new Error('Failed to create offer'));\n throw error;\n }\n }\n\n /**\n * Wait for wallet to connect and approve the session.\n *\n * This method blocks until the wallet scans the QR, connects via Nostr,\n * and the user approves the session.\n *\n * @returns Promise resolving to the approved session\n */\n async waitForSessionApproval(): Promise<P2PSession> {\n if (!this.client || !this.currentInvite) {\n throw new Error('No active pairing offer - call createPairingOffer first');\n }\n\n logger.info('Waiting for wallet to connect and approve session...');\n\n return new Promise<P2PSession>((resolve, reject) => {\n this.sessionApprovalPromise = { resolve, reject };\n });\n }\n\n /**\n * Cancel the current pairing offer.\n *\n * Cleans up the transport without fully disconnecting.\n */\n async cancelPairingOffer(): Promise<void> {\n logger.debug('Cancelling pairing offer');\n\n if (this.sessionApprovalPromise) {\n this.sessionApprovalPromise.reject(new Error('Pairing cancelled'));\n this.sessionApprovalPromise = undefined;\n }\n\n await this.cleanup();\n this.runInZone(() => this._connectionState.set('idle'));\n }\n\n /**\n * @param callback\n * Register callback for when peer connects\n */\n onConnected(callback: (session: P2PSession) => void): void {\n this.connectedCallbacks.push(callback);\n }\n\n /**\n * @param callback\n * Register callback for disconnection\n */\n onDisconnected(callback: () => void): void {\n this.disconnectedCallbacks.push(callback);\n }\n\n /**\n * @param callback\n * Register callback for errors\n */\n onError(callback: (error: Error) => void): void {\n this.errorCallbacks.push(callback);\n }\n\n /**\n * @param callback\n * Register callback for accounts changes\n */\n onAccountsChanged(callback: (accounts: UnifiedAccount[]) => void): void {\n this.accountsChangedCallbacks.push(callback);\n }\n\n /**\n * @param options\n * Sign a transaction via RPC\n */\n async signTransaction(options: TransactionOptions): Promise<{\n signedPayload: string;\n signature?: string;\n metadata?: Record<string, unknown>;\n }> {\n this.requireSession();\n\n logger.info('Signing transaction', { account: options.accountAddress });\n\n if (!this.client) {\n throw new Error('Not connected');\n }\n\n const response = await this.client.request<{\n signedPayload?: string;\n signedTransaction?: string;\n signature?: string;\n metadata?: Record<string, unknown>;\n }>('ledger/sign', {\n accountAddress: options.accountAddress,\n payload: options.payload,\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n });\n\n return {\n signedPayload: response.signedPayload || response.signedTransaction || '',\n signature: response.signature,\n metadata: response.metadata,\n };\n }\n\n /**\n * @param options\n * Submit a transaction via RPC\n */\n async submitTransaction(options: TransactionOptions): Promise<{\n transactionId: string;\n transactionHash?: string;\n metadata?: Record<string, unknown>;\n }> {\n this.requireSession();\n\n logger.info('Submitting transaction', { account: options.accountAddress });\n\n if (!this.client) {\n throw new Error('Not connected');\n }\n\n const response = await this.client.request<{\n transactionId?: string;\n transactionHash?: string;\n metadata?: Record<string, unknown>;\n }>('ledger/signAndSubmit', {\n accountAddress: options.accountAddress,\n payload: options.payload,\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n isBatch: options.isBatch,\n batchKey: options.batchKey,\n innerTransactions: options.innerTransactions,\n });\n\n return {\n transactionId: response.transactionId || '',\n transactionHash: response.transactionHash,\n metadata: response.metadata,\n };\n }\n\n /**\n * @param options\n * Sign an arbitrary message via RPC\n */\n async signMessage(options: MessageSigningOptions): Promise<{\n signature: string;\n publicKey?: string;\n // §21.3 extended shape — passes the adapter's full MessageSignResult\n // through to the dApp. Optional for backwards compatibility with\n // pre-§21.3 wallets that only return signature + publicKey.\n algorithm?: 'ed25519' | 'ecdsa_secp256k1' | 'secp256k1';\n encoding?: 'utf-8' | 'base64';\n caipChainId?: string;\n messageLength?: number;\n metadata?: Record<string, unknown>;\n }> {\n this.requireSession();\n\n logger.info('Signing message', { account: options.accountAddress });\n\n if (!this.client) {\n throw new Error('Not connected');\n }\n\n const response = await this.client.request<{\n signature?: string;\n publicKey?: string;\n algorithm?: 'ed25519' | 'ecdsa_secp256k1' | 'secp256k1';\n encoding?: 'utf-8' | 'base64';\n caipChainId?: string;\n messageLength?: number;\n metadata?: Record<string, unknown>;\n }>('ledger/signMessage', {\n accountAddress: options.accountAddress,\n message: options.message,\n encoding: options.encoding || 'utf-8',\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n });\n\n return {\n signature: response.signature || '',\n publicKey: response.publicKey,\n algorithm: response.algorithm,\n encoding: response.encoding,\n caipChainId: response.caipChainId,\n messageLength: response.messageLength,\n metadata: response.metadata,\n };\n }\n\n /**\n * Terminate the current session\n */\n async terminateSession(): Promise<void> {\n logger.info('Terminating session');\n\n if (this.client) {\n await this.client.disconnect();\n }\n\n await this.cleanup();\n this.runInZone(() => {\n this._currentSession.set(null);\n this._connectionState.set('disconnected');\n });\n this.notifyDisconnected();\n }\n\n // ========== Private Methods ==========\n\n /**\n * Run function in NgZone if available\n * @param fn\n */\n private runInZone(fn: () => void): void {\n if (this.zone) {\n this.zone.run(fn);\n } else {\n fn();\n }\n }\n\n /**\n * Start polling for state changes from the channel client\n */\n private startStateSync(): void {\n const checkState = () => {\n if (!this.client) return;\n\n const clientState = this.client.state;\n const clientAccounts = this.client.accounts;\n const clientTransport = this.client.transportState;\n\n // Update transport state\n this.runInZone(() => this._p2pState.set(clientTransport));\n\n // Map channel state to P2P connection state\n this.handleStateChange(clientState, clientAccounts);\n\n // Continue polling while not disconnected\n if (this.client && clientState !== 'disconnected' && clientState !== 'error') {\n setTimeout(checkState, 100);\n }\n };\n\n setTimeout(checkState, 100);\n }\n\n /**\n * Handle channel state changes\n * @param state\n * @param accounts\n */\n private handleStateChange(state: ChannelState, accounts: ChannelAccount[]): void {\n switch (state) {\n case 'pending':\n if (this._connectionState() === 'awaiting_connection') {\n this.runInZone(() => this._connectionState.set('pending_approval'));\n }\n break;\n\n case 'active':\n case 'approved':\n if (this._connectionState() !== 'connected') {\n const session = this.createSession(accounts);\n this.runInZone(() => {\n this._currentSession.set(session);\n this._connectionState.set('connected');\n });\n\n // Resolve the approval promise\n if (this.sessionApprovalPromise) {\n this.sessionApprovalPromise.resolve(session);\n this.sessionApprovalPromise = undefined;\n }\n\n this.notifyConnected(session);\n }\n break;\n\n case 'disconnected':\n this.handleDisconnection('Wallet disconnected');\n break;\n\n case 'error':\n this.runInZone(() => this._connectionState.set('error'));\n if (this.sessionApprovalPromise) {\n this.sessionApprovalPromise.reject(new Error('Connection error'));\n this.sessionApprovalPromise = undefined;\n }\n break;\n }\n }\n\n /**\n * Create a P2PSession from channel accounts\n * @param accounts\n */\n private createSession(accounts: ChannelAccount[]): P2PSession {\n const invite = this.currentInvite;\n\n return {\n id: crypto.randomUUID(),\n sessionId: invite?.id || crypto.randomUUID(),\n appId: invite?.app.id || 'hsuite-dapp',\n appName: invite?.app.name || 'HSuite dApp',\n ledgerId: invite?.context.ledgerId || 'hedera',\n networkId: invite?.context.networkId || 'testnet',\n accounts: accounts.map((acc, index) => ({\n id: `p2p-${acc.address}`,\n address: acc.address,\n label: acc.alias || `Account ${index + 1}`,\n ledgerId: acc.ledgerId,\n networkId: acc.networkId,\n providerId: 'p2p-native',\n providerType: 'hsuite-native' as const,\n metadata: {\n publicKey: acc.publicKey,\n },\n })),\n permissions: this.client?.permissions || [],\n connectedAt: Date.now(),\n };\n }\n\n /**\n * Handle disconnection\n * @param reason\n */\n private handleDisconnection(reason: string): void {\n logger.info('Handling disconnection', { reason });\n this.cleanup();\n this.runInZone(() => {\n this._currentSession.set(null);\n this._connectionState.set('disconnected');\n });\n this.notifyDisconnected();\n }\n\n /**\n * Require active session or throw\n */\n private requireSession(): P2PSession {\n const session = this._currentSession();\n if (!session) {\n throw new Error('No active session');\n }\n return session;\n }\n\n /**\n * Clean up resources.\n *\n * @param rejectPending - If true, reject pending promises with error.\n * If false, clear them silently (for new session creation).\n */\n private async cleanup(rejectPending = true): Promise<void> {\n // Reject pending approval if requested\n if (this.sessionApprovalPromise && rejectPending) {\n this.sessionApprovalPromise.reject(new Error('Connection closed'));\n }\n this.sessionApprovalPromise = undefined;\n\n if (this.client) {\n try {\n await this.client.disconnect();\n } catch {\n // Ignore disconnect errors during cleanup\n }\n this.client = undefined;\n }\n\n this.currentInvite = undefined;\n this.runInZone(() => this._p2pState.set('nostr-only'));\n }\n\n /**\n * Notify connected callbacks\n * @param session\n */\n private notifyConnected(session: P2PSession): void {\n for (const callback of this.connectedCallbacks) {\n try {\n callback(session);\n } catch (error) {\n logger.error('Connected callback error', { error });\n }\n }\n }\n\n /**\n * Notify disconnected callbacks\n */\n private notifyDisconnected(): void {\n for (const callback of this.disconnectedCallbacks) {\n try {\n callback();\n } catch (error) {\n logger.error('Disconnected callback error', { error });\n }\n }\n }\n\n /**\n * Notify error callbacks\n * @param error\n */\n private notifyError(error: Error): void {\n for (const callback of this.errorCallbacks) {\n try {\n callback(error);\n } catch (err) {\n logger.error('Error callback error', { err });\n }\n }\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file p2p-native.provider.ts\n * @description P2P Native Provider for wallet connections (Nostr-first with P2P upgrade)\n *\n * Implements BaseWalletProvider for P2P connections using the Nostr-first protocol.\n * Enables single-QR scanning for cross-device wallet connections (both mobile and desktop).\n *\n * **Key Features:**\n * - Single QR code scanning (no answer QR needed!)\n * - Nostr-first communication with automatic P2P upgrade\n * - End-to-end encrypted (AES-GCM over Nostr, DTLS over WebRTC)\n * - No intermediary servers required\n * - Works on any network (WiFi, cellular, etc.)\n *\n * **Connection Flow:**\n * 1. dApp generates compact channel invite (hsc:connect?i=...)\n * 2. User scans QR with wallet (or clicks hsc: link on desktop)\n * 3. Wallet connects via Nostr relays\n * 4. User approves session in wallet\n * 5. P2P upgrade happens automatically in background\n */\n\nimport { Injectable, NgZone, signal, computed, type Signal } from '@angular/core';\nimport { getLogger } from '@hsuite/native-connect-sdk';\n\nimport type { ConnectionStatus, ProviderMetadata, ProviderType } from '../../models/provider-types';\nimport type { ConnectionConfig } from '../../models/provider-types';\nimport type { UnifiedAccount } from '../../models/unified-account.model';\nimport {\n BaseWalletProvider,\n type SignTransactionOptions,\n type SubmitTransactionOptions,\n type SignResult,\n type SubmitResult,\n type SignMessageOptions,\n type SignMessageResult,\n} from '../base-wallet-provider';\n\nimport { P2PSessionManager, type P2PSession } from './p2p-session-manager';\n\nconst logger = getLogger().scoped?.('P2PNativeProvider') ?? getLogger();\n\n/**\n * Storage key for mobile session metadata (separate from hsuite-native)\n */\nconst P2P_SESSION_STORAGE_KEY = 'hsuite.p2p.session';\n\n/**\n * Mobile Session Persistence\n *\n * Stores mobile P2P session metadata to localStorage for dApp reconnection.\n * Uses a separate key from hsuite-native to avoid conflicts.\n */\nclass P2PSessionPersistence {\n /**\n * @param session\n * Persist mobile session to localStorage.\n */\n save(session: P2PSession): void {\n try {\n if (typeof window === 'undefined') return;\n const payload = {\n ...session,\n timestamp: Date.now(),\n };\n window.localStorage.setItem(P2P_SESSION_STORAGE_KEY, JSON.stringify(payload));\n logger.debug('Mobile session persisted', { sessionId: session.sessionId });\n } catch (error) {\n logger.warn('Failed to persist mobile session', { error });\n }\n }\n\n /**\n * Restore mobile session from localStorage.\n */\n restore(): (P2PSession & { timestamp: number }) | null {\n try {\n if (typeof window === 'undefined') return null;\n const raw = window.localStorage.getItem(P2P_SESSION_STORAGE_KEY);\n if (!raw) return null;\n const stored = JSON.parse(raw) as P2PSession & { timestamp: number };\n if (!stored?.sessionId) {\n this.clear();\n return null;\n }\n logger.info('Restored mobile session metadata', { sessionId: stored.sessionId });\n return stored;\n } catch (error) {\n logger.warn('Failed to restore mobile session', { error });\n return null;\n }\n }\n\n /**\n * Clear persisted mobile session.\n */\n clear(): void {\n try {\n if (typeof window === 'undefined') return;\n window.localStorage.removeItem(P2P_SESSION_STORAGE_KEY);\n logger.debug('Mobile session cleared');\n } catch (error) {\n logger.warn('Failed to clear mobile session', { error });\n }\n }\n\n /**\n * Check if a mobile session is stored.\n */\n hasStoredSession(): boolean {\n try {\n if (typeof window === 'undefined') return false;\n return !!window.localStorage.getItem(P2P_SESSION_STORAGE_KEY);\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Connection state for the mobile native provider.\n *\n * States:\n * - disconnected: No connection\n * - generating_offer: Creating WebRTC offer for QR display\n * - awaiting_scan: QR displayed, waiting for wallet to scan\n * - connecting: WebRTC handshake in progress\n * - pending_approval: WebRTC connected, waiting for wallet user to approve\n * - connected: Session approved and fully connected\n * - error: An error occurred\n */\nexport type P2PNativeConnectionState =\n | 'disconnected'\n | 'generating_offer'\n | 'awaiting_scan'\n | 'connecting'\n | 'pending_approval'\n | 'connected'\n | 'error';\n\n/**\n * Pairing offer result containing QR data\n */\nexport interface PairingOfferResult {\n /** Encoded channel invite for QR code display (hsc:connect?i=...) */\n qrData: string;\n /** Session ID for this connection */\n sessionId?: string;\n /** Expiry timestamp */\n expiresAt: number;\n}\n\n/**\n * P2P Native Provider for cross-device wallet connections.\n *\n * @description\n * Enables secure P2P wallet connections via WebRTC for mobile and cross-device\n * scenarios. The dApp generates a QR code containing a channel invite, which\n * the mobile wallet scans to establish a direct encrypted connection.\n *\n * Key Features:\n * - **Single QR Code Flow**: No answer QR needed - just scan and connect\n * - **Nostr-First**: Uses Nostr relays for signaling and fallback\n * - **Automatic P2P Upgrade**: Upgrades to WebRTC for lower latency\n * - **End-to-End Encrypted**: AES-GCM over Nostr, DTLS over WebRTC\n * - **Session Persistence**: Supports reconnection after page reload\n *\n * Transport States (via `transportState` signal):\n * - `'nostr-only'` - Connected via Nostr relay only\n * - `'upgrading'` - P2P upgrade in progress\n * - `'p2p-connected'` - Direct P2P connection established\n * - `'p2p-failed'` - P2P upgrade failed, using Nostr fallback\n *\n * @publicApi\n */\n@Injectable({ providedIn: 'root' })\nexport class P2PNativeProvider extends BaseWalletProvider {\n readonly id = 'mobile-native';\n\n readonly metadata: ProviderMetadata = {\n name: 'HSuite Mobile',\n type: 'mobile-native' as ProviderType,\n icon: 'phone-portrait-outline',\n description: 'Connect via QR code (P2P)',\n features: [\n 'Direct P2P connection',\n 'End-to-end encrypted',\n 'No server required',\n 'Works on any network',\n ],\n };\n\n // Internal state signals\n private readonly _status = signal<ConnectionStatus>('disconnected');\n private readonly _accounts = signal<UnifiedAccount[]>([]);\n private readonly _error = signal<string | null>(null);\n private readonly _connectionState = signal<P2PNativeConnectionState>('disconnected');\n private readonly _pairingOffer = signal<PairingOfferResult | null>(null);\n\n /** Session persistence for page reload recovery */\n private readonly sessionPersistence = new P2PSessionPersistence();\n\n // Public readonly signals\n readonly status: Signal<ConnectionStatus> = this._status.asReadonly();\n readonly accounts: Signal<UnifiedAccount[]> = this._accounts.asReadonly();\n readonly error: Signal<string | null> = this._error.asReadonly();\n\n /**\n * Current detailed connection state\n */\n readonly connectionState: Signal<P2PNativeConnectionState> = this._connectionState.asReadonly();\n\n /**\n * Current pairing offer (if awaiting scan)\n */\n readonly pairingOffer: Signal<PairingOfferResult | null> = this._pairingOffer.asReadonly();\n\n /**\n * Whether currently awaiting wallet to scan QR\n */\n readonly isAwaitingScan = computed(() => this._connectionState() === 'awaiting_scan');\n\n /**\n * Whether a pairing offer is available\n */\n readonly hasPairingOffer = computed(() => this._pairingOffer() !== null);\n\n /**\n * Whether a persisted session exists\n */\n readonly hasPersistedSession = computed(() => this.sessionPersistence.hasStoredSession());\n\n /**\n * Transport state for the P2P connection.\n * Values: 'nostr-only' | 'upgrading' | 'p2p-connected' | 'p2p-failed'\n *\n * This allows the UI to show the current transport layer being used.\n */\n readonly transportState = computed(() => this.sessionManager.p2pState());\n\n /**\n * @param sessionManager\n * @param ngZone\n */\n constructor(\n private readonly sessionManager: P2PSessionManager,\n private readonly ngZone: NgZone,\n ) {\n super();\n // CRITICAL: Pass NgZone to session manager so signal updates from\n // Nostr/WebSocket callbacks (which fire outside Angular zone) trigger\n // Angular change detection. Without this, walletContext.activeAccount\n // stays null after session approval.\n this.sessionManager.setNgZone(this.ngZone);\n this.setupSessionManagerListeners();\n this.restorePersistedSession();\n }\n\n /**\n * Restore session from localStorage on page load.\n * Sets accounts and status from persisted data.\n * Note: This only restores metadata - the actual WebRTC connection\n * will need to be re-established via QR pairing.\n */\n private restorePersistedSession(): void {\n const stored = this.sessionPersistence.restore();\n if (stored) {\n logger.info('Restoring persisted mobile session', {\n sessionId: stored.sessionId,\n accountCount: stored.accounts?.length ?? 0,\n });\n\n // Restore accounts with proper providerId\n if (stored.accounts?.length) {\n const accountsWithProvider = this.ensureProviderIdOnAccounts(stored.accounts);\n this._accounts.set(accountsWithProvider);\n }\n\n // Note: We don't set connected status because WebRTC needs re-pairing\n // The persisted data is for account info only\n logger.debug('Mobile session metadata restored (requires re-pairing for connection)');\n }\n }\n\n /**\n * Creates a pairing offer for QR code display.\n *\n * @description\n * Generates a channel invite encoded for QR display. The mobile wallet\n * scans this QR code to establish a connection via Nostr relays with\n * automatic P2P upgrade.\n *\n * The returned `qrData` is a compact `hsc:connect?i=...` URL that contains:\n * - Channel ID and encryption keys\n * - App metadata (name, ID)\n * - Relay endpoints for communication\n *\n * @param config - Connection configuration specifying ledger and network\n *\n * @returns Promise resolving to pairing offer containing QR data and expiry\n *\n * @throws {Error} If offer generation fails\n */\n async createPairingOffer(config: ConnectionConfig): Promise<PairingOfferResult> {\n logger.info('Creating pairing offer', { config });\n\n try {\n this._connectionState.set('generating_offer');\n this._error.set(null);\n\n // Extract common properties based on config type\n const appId = 'appId' in config ? (config.appId ?? 'hsuite-dapp') : 'hsuite-dapp';\n const appName = 'appName' in config ? (config.appName ?? 'HSuite dApp') : 'HSuite dApp';\n const ledgerId = 'ledgerId' in config ? (config.ledgerId ?? 'hedera') : 'hedera';\n const networkId = config.networkId ?? 'testnet';\n\n const result = await this.sessionManager.createPairingOffer({\n appId,\n appName,\n ledgerId,\n networkId,\n });\n\n const offerResult: PairingOfferResult = {\n qrData: result.qrData,\n sessionId: result.sessionId,\n expiresAt: Date.now() + 120 * 1000, // 2 minutes\n };\n\n this._pairingOffer.set(offerResult);\n this._connectionState.set('awaiting_scan');\n this._status.set('connecting');\n\n logger.info('Pairing offer created', {\n qrDataLength: result.qrData.length,\n expiresAt: offerResult.expiresAt,\n });\n\n return offerResult;\n } catch (error) {\n logger.error('Failed to create pairing offer', { error });\n this._connectionState.set('error');\n this._status.set('error');\n this._error.set(error instanceof Error ? error.message : 'Failed to create pairing offer');\n throw error;\n }\n }\n\n /**\n * Refresh the pairing offer (e.g., when expired).\n *\n * @param config - Connection configuration\n * @returns Promise resolving to new pairing offer\n */\n async refreshPairingOffer(config: ConnectionConfig): Promise<PairingOfferResult> {\n logger.debug('Refreshing pairing offer');\n\n // Cancel any existing offer\n await this.sessionManager.cancelPairingOffer();\n\n return this.createPairingOffer(config);\n }\n\n /**\n * Register callback for when peer connects.\n *\n * @param callback - Function to call when connection is established\n */\n onPeerConnected(callback: () => void): void {\n this.sessionManager.onConnected(() => {\n callback();\n });\n }\n\n /**\n * Waits for the wallet to connect and approve the session.\n *\n * @description\n * Call this after {@link createPairingOffer} to block until the wallet user\n * completes the connection flow. This is the single-QR flow - no answer\n * scanning is required.\n *\n * The method resolves when all of the following occur:\n * 1. Wallet scans the QR code\n * 2. Wallet connects via Nostr relay\n * 3. User approves the session in the wallet\n *\n * Upon success, the session is automatically persisted for reconnection.\n *\n * @returns Promise resolving to the approved session with account information\n *\n * @throws {Error} If connection fails or is rejected\n * @throws {Error} If no pairing offer was created\n */\n async waitForSessionApproval(): Promise<P2PSession> {\n logger.info('Waiting for wallet to connect and approve session');\n this._connectionState.set('pending_approval');\n\n try {\n // This blocks until wallet connects via Nostr and user approves\n const session = await this.sessionManager.waitForSessionApproval();\n\n // Connection state will be updated by sessionManager callbacks, but also set here for immediate update\n this._connectionState.set('connected');\n this._status.set('connected');\n\n // Ensure accounts have providerId set correctly\n if (session?.accounts) {\n const accountsWithProvider = this.ensureProviderIdOnAccounts(session.accounts);\n this._accounts.set(accountsWithProvider);\n }\n\n // Persist session for page reload recovery\n this.sessionPersistence.save(session);\n\n return session;\n } catch (error) {\n logger.error('Session approval failed', { error });\n this._connectionState.set('error');\n throw error;\n }\n }\n\n // ========== BaseWalletProvider Implementation ==========\n\n /**\n * Connects to a wallet via the P2P pairing flow.\n *\n * @description\n * Initiates the pairing offer flow and waits for connection. For more\n * control over QR display timing, use {@link createPairingOffer} and\n * {@link waitForSessionApproval} separately.\n *\n * This method:\n * 1. Creates a pairing offer\n * 2. Updates `pairingOffer` signal with QR data\n * 3. Waits up to 2 minutes for wallet to connect\n *\n * @param config - Connection configuration\n *\n * @throws {Error} If already connected (no-op)\n * @throws {Error} If connection times out (2 minutes)\n */\n async connect(config: ConnectionConfig): Promise<void> {\n logger.info('Connect called', { config });\n\n // If already connected, no-op\n if (this._status() === 'connected') {\n logger.debug('Already connected');\n return;\n }\n\n // Create pairing offer and wait for connection\n await this.createPairingOffer(config);\n\n // Wait for connection to complete\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('Connection timeout'));\n }, 120000); // 2 minute timeout\n\n this.sessionManager.onConnected(() => {\n clearTimeout(timeout);\n resolve();\n });\n\n this.sessionManager.onError((error: Error) => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n }\n\n /**\n * Disconnects from the wallet and clears session.\n *\n * @description\n * Terminates the P2P session, clears all state signals, and removes\n * persisted session data. The wallet is notified of the disconnection.\n */\n async disconnect(): Promise<void> {\n logger.info('Disconnecting');\n\n try {\n await this.sessionManager.terminateSession();\n } finally {\n this._status.set('disconnected');\n this._connectionState.set('disconnected');\n this._accounts.set([]);\n this._pairingOffer.set(null);\n this._error.set(null);\n\n // Clear persisted session\n this.sessionPersistence.clear();\n }\n }\n\n /**\n * Signs a transaction without submitting it.\n *\n * @description\n * Sends the transaction to the connected wallet for signing. The wallet\n * displays transaction details and prompts the user for approval.\n *\n * @param options - Transaction signing options\n *\n * @returns Promise resolving to signed payload and signature\n *\n * @throws {Error} If not connected to wallet\n * @throws {Error} If user rejects signing\n */\n async signTransaction(options: SignTransactionOptions): Promise<SignResult> {\n if (this._status() !== 'connected') {\n throw new Error('Not connected to wallet');\n }\n\n logger.info('Signing transaction', { account: options.accountAddress });\n\n const result = await this.sessionManager.signTransaction({\n accountAddress: options.accountAddress,\n payload: options.payload,\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n });\n\n return {\n signedPayload: result.signedPayload,\n signature: result.signature,\n metadata: result.metadata,\n };\n }\n\n /**\n * Signs and submits a transaction to the blockchain.\n *\n * @description\n * Performs atomic sign and submit in a single operation. Supports batch\n * transactions when isBatch is true.\n *\n * @param options - Transaction submission options\n *\n * @returns Promise resolving to transaction ID and hash\n *\n * @throws {Error} If not connected to wallet\n * @throws {Error} If user rejects or transaction fails\n */\n async submitTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {\n if (this._status() !== 'connected') {\n throw new Error('Not connected to wallet');\n }\n\n logger.info('Submitting transaction', { account: options.accountAddress });\n\n const result = await this.sessionManager.submitTransaction({\n accountAddress: options.accountAddress,\n payload: options.payload,\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n isBatch: options.isBatch,\n batchKey: options.batchKey,\n innerTransactions: options.innerTransactions,\n });\n\n return {\n transactionId: result.transactionId,\n transactionHash: result.transactionHash,\n metadata: result.metadata,\n };\n }\n\n /**\n * Signs and executes a transaction atomically in a single prompt.\n *\n * @description\n * Delegates to {@link submitTransaction}. This method exists so that\n * {@link UnifiedWalletService.signAndExecuteTransaction} can detect native\n * atomic sign+submit support on the provider (via duck-typing) and avoid\n * its fallback path that chains separate signTransaction + submitTransaction\n * calls. Mirrors the pattern used by HsuiteNativeProvider and the\n * WalletConnect signers.\n *\n * @param options - Transaction submission options\n *\n * @returns Promise resolving to submission result with transaction ID\n */\n async signAndExecuteTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {\n return this.submitTransaction(options);\n }\n\n /**\n * Signs an arbitrary message for authentication or verification.\n *\n * @description\n * Requests the wallet to sign a non-transaction message. Used for\n * authentication challenges, DAO voting, or off-chain signatures.\n *\n * @param options - Message signing options\n *\n * @returns Promise resolving to signature and public key\n *\n * @throws {Error} If not connected to wallet\n * @throws {Error} If user rejects signing\n */\n async signMessage(options: SignMessageOptions): Promise<SignMessageResult> {\n if (this._status() !== 'connected') {\n throw new Error('Not connected to wallet');\n }\n\n logger.info('Signing message', { account: options.accountAddress });\n\n const result = await this.sessionManager.signMessage({\n accountAddress: options.accountAddress,\n message: options.message,\n encoding: options.encoding,\n ledgerId: options.ledgerId,\n networkId: options.networkId,\n });\n\n return {\n signature: result.signature,\n publicKey: result.publicKey,\n metadata: result.metadata,\n };\n }\n\n /**\n * Checks if P2P provider is available in the current environment.\n *\n * @description\n * P2P Native requires WebRTC support (RTCPeerConnection). This is available\n * in all modern browsers and most mobile WebViews.\n *\n * @returns Promise resolving to true if WebRTC is available\n */\n async isAvailable(): Promise<boolean> {\n // Check for WebRTC support\n return typeof RTCPeerConnection !== 'undefined';\n }\n\n // ========== Private Methods ==========\n\n /**\n * Set up listeners for session manager events\n */\n private setupSessionManagerListeners(): void {\n // Connection established — wrap in NgZone to ensure Angular change\n // detection picks up signal updates from Nostr/WebSocket callbacks\n this.sessionManager.onConnected((session) => {\n logger.info('Session connected', { sessionId: session?.id });\n this.ngZone.run(() => {\n this._connectionState.set('connected');\n this._status.set('connected');\n this._pairingOffer.set(null);\n\n // Update accounts from session - ensure providerId is set\n if (session?.accounts) {\n const accountsWithProvider = this.ensureProviderIdOnAccounts(session.accounts);\n this._accounts.set(accountsWithProvider);\n }\n });\n\n // Persist session for page reload recovery\n if (session) {\n this.sessionPersistence.save(session);\n }\n });\n\n // Session terminated\n this.sessionManager.onDisconnected(() => {\n logger.info('Session disconnected');\n this.ngZone.run(() => {\n this._connectionState.set('disconnected');\n this._status.set('disconnected');\n this._accounts.set([]);\n });\n\n // Clear persisted session\n this.sessionPersistence.clear();\n });\n\n // Error occurred\n this.sessionManager.onError((error: Error) => {\n logger.error('Session error', { error });\n this.ngZone.run(() => {\n this._connectionState.set('error');\n this._status.set('error');\n this._error.set(error.message);\n });\n });\n\n // Accounts updated\n this.sessionManager.onAccountsChanged((accounts) => {\n logger.debug('Accounts updated', { count: accounts.length });\n this.ngZone.run(() => {\n const accountsWithProvider = this.ensureProviderIdOnAccounts(accounts);\n this._accounts.set(accountsWithProvider);\n });\n });\n }\n\n /**\n * Ensure all accounts have providerId and providerType set correctly\n * @param accounts\n */\n private ensureProviderIdOnAccounts(accounts: UnifiedAccount[]): UnifiedAccount[] {\n return accounts.map((account) => ({\n ...account,\n id: account.id || `${this.id}-${account.address}`,\n providerId: this.id,\n providerType: this.metadata.type,\n }));\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file Central service for managing multiple wallet providers in Angular applications.\n * @module services/unified-wallet\n *\n * @description\n * UnifiedWalletService is the primary entry point for dApp developers to interact with\n * blockchain wallets. It provides a unified API that abstracts the differences between\n * various wallet connection protocols (HSuite Native, WalletConnect, P2P).\n *\n * Key Capabilities:\n * - **Multi-Provider Management**: Register and manage multiple wallet providers\n * - **Unified Account Access**: Aggregate accounts from all connected providers\n * - **Active Account Tracking**: Maintain and switch the currently active account\n * - **Transaction Operations**: Sign and submit transactions through any connected wallet\n * - **Session Management**: Handle wallet sessions with automatic reconnection\n *\n * Architecture:\n * ```\n * +-------------------------------------------------------------------+\n * | UnifiedWalletService |\n * +-------------------------------------------------------------------+\n * | |\n * | +-------------------+ +-------------------+ +----------------+ |\n * | | HsuiteNative | | WalletConnect | | P2PNative | |\n * | | Provider | | V2Provider | | Provider | |\n * | +-------------------+ +-------------------+ +----------------+ |\n * | | | | |\n * | +----------------------+----------------------+ |\n * | | |\n * | BaseWalletProvider |\n * | (common interface) |\n * +-------------------------------------------------------------------+\n * ```\n */\n\nimport { Injectable, signal, computed, inject, effect } from '@angular/core';\nimport { getLogger } from '@hsuite/native-connect-sdk';\n\nimport type { ConnectionConfig } from '../models/connection-config.model';\nimport type { ProviderType, ConnectionStatus } from '../models/provider-types';\nimport type { UnifiedAccount } from '../models/unified-account.model';\nimport { BaseWalletProvider } from '../providers/base-wallet-provider';\nimport { HsuiteNativeProvider } from '../providers/hsuite-native-provider';\nimport { P2PNativeProvider } from '../providers/p2p-native/p2p-native.provider';\nimport { WalletConnectV2Provider } from '../providers/walletconnect/core/walletconnect-provider';\n\nimport { WalletEventBus } from './wallet-event-bus.service';\n\n\nconst logger = getLogger().scoped?.('UnifiedWalletService') ?? getLogger();\n\ninterface ProviderSummary {\n id: string;\n name: string;\n providerType: string;\n status: ConnectionStatus;\n accounts: UnifiedAccount[];\n supportsReconnect: boolean;\n}\n\n/**\n * Central service for managing wallet connections across multiple protocols.\n *\n * @description\n * UnifiedWalletService provides a unified interface for interacting with blockchain wallets\n * regardless of the underlying connection protocol. It manages multiple provider instances,\n * aggregates accounts, and provides transaction signing/submission capabilities.\n *\n * The service automatically registers built-in providers (HSuite Native, WalletConnect, P2P)\n * and supports session restoration across page reloads.\n *\n * @Component({\n * template: `\n * <div *ngIf=\"wallet.activeAccount() as account\">\n * Connected: {{ account.address }}\n * </div>\n * <button (click)=\"connectWallet()\">Connect</button>\n * `\n * })\n * export class MyComponent {\n * wallet = inject(UnifiedWalletService);\n *\n * async connectWallet() {\n * await this.wallet.connect('hsuite-native', {\n * type: 'hsuite-native',\n * appId: 'my-dapp',\n * appName: 'My dApp',\n * ledgerId: 'hedera',\n * networkId: 'testnet',\n * });\n * }\n * }\n * ```\n *\n * @publicApi\n */\n@Injectable({ providedIn: 'root' })\nexport class UnifiedWalletService {\n /**\n * Map of registered providers\n */\n private readonly providers = new Map<string, BaseWalletProvider>();\n\n /**\n * Signal tracking all registered provider IDs\n */\n private readonly _providerIds = signal<string[]>([]);\n\n /**\n * Signal for the active account (across all providers)\n */\n private readonly _activeAccount = signal<UnifiedAccount | null>(null);\n\n /**\n * Event bus for emitting wallet events\n */\n private readonly eventBus = inject(WalletEventBus);\n\n /**\n *\n * @param hsuiteProvider\n * @param walletConnectProvider\n * @param p2pNativeProvider\n */\n constructor(\n hsuiteProvider: HsuiteNativeProvider,\n walletConnectProvider: WalletConnectV2Provider,\n p2pNativeProvider: P2PNativeProvider,\n ) {\n // Auto-register built-in providers (injected as constructor params)\n this.registerProvider(hsuiteProvider);\n this.registerProvider(walletConnectProvider);\n this.registerProvider(p2pNativeProvider);\n\n // Auto-select first account from unknown restored session (after a delay to let providers restore)\n setTimeout(() => {\n const allAccounts = this.allAccounts();\n if (!this._activeAccount() && allAccounts.length > 0) {\n this.setActiveAccount(allAccounts[0]);\n\n // Emit session restored event\n this.eventBus.sessionRestored.emit({\n providerId: allAccounts[0].providerId,\n sessionKey: allAccounts[0].id,\n accounts: allAccounts,\n metadata: { autoRestored: true },\n timestamp: Date.now(),\n });\n }\n }, 100);\n\n effect(() => {\n const accounts = this.allAccounts();\n const active = this._activeAccount();\n\n if (accounts.length === 0) {\n if (active) {\n this.setActiveAccount(null);\n }\n return;\n }\n\n const activeStillPresent = active ? accounts.some((acct) => acct.id === active.id) : false;\n if (!activeStillPresent) {\n this.setActiveAccount(accounts[0]);\n }\n });\n }\n\n /**\n * Gets summaries of all registered providers including status and accounts.\n *\n * @description\n * Returns metadata about each registered provider, useful for building\n * wallet selection UI or debugging connection states.\n *\n * @returns Array of provider summaries with status and account information\n */\n getProviderSummaries(): ProviderSummary[] {\n return Array.from(this.providers.values()).map((provider) => ({\n id: provider.id,\n name: provider.metadata.name,\n providerType: provider.metadata.type,\n status: provider.status(),\n accounts: provider.accounts(),\n supportsReconnect: typeof (provider as any).attemptReconnect === 'function',\n }));\n }\n\n /**\n * Attempts to reconnect a provider using stored session data.\n *\n * @description\n * Some providers (like HSuite Native) support session persistence and can\n * automatically reconnect after page reload without user interaction.\n * This method triggers the reconnection attempt.\n *\n * @param providerId - The provider ID to reconnect (e.g., 'hsuite-native')\n *\n * @returns Promise resolving to true if reconnection succeeded, false otherwise\n */\n async reconnectProvider(providerId: string): Promise<boolean> {\n const provider = this.providers.get(providerId);\n if (!provider) {\n return false;\n }\n const reconnect = (provider as unknown as { attemptReconnect?: () => Promise<boolean> })\n .attemptReconnect;\n if (typeof reconnect === 'function') {\n try {\n return await reconnect.call(provider);\n } catch (error) {\n logger.warn('Provider reconnect failed', { providerId, error });\n return false;\n }\n }\n return false;\n }\n\n /**\n * All accounts from all connected providers (reactive)\n */\n readonly allAccounts = computed<UnifiedAccount[]>(() => {\n const providers = Array.from(this.providers.values());\n return providers.flatMap((p) => p.accounts());\n });\n\n /**\n * Currently active account (reactive)\n */\n readonly activeAccount = computed(() => this._activeAccount());\n\n /**\n * List of connected providers (reactive)\n */\n readonly connectedProviders = computed<BaseWalletProvider[]>(() => {\n return Array.from(this.providers.values()).filter((p) => p.isConnected());\n });\n\n /**\n * Transport state for HSuite Native and P2P Native connections.\n * Values: 'idle' | 'nostr-only' | 'upgrading' | 'p2p-connected' | 'p2p-failed'\n *\n * Checks both HSuite Native and P2P Native providers.\n * Returns 'idle' for non-HSuite connections (WalletConnect, etc.)\n */\n readonly transportState = computed<string>(() => {\n // Check HSuite Native provider first\n const hsuiteProvider = this.providers.get('hsuite-native') as HsuiteNativeProvider | undefined;\n if (hsuiteProvider) {\n const status = hsuiteProvider.status();\n if (status === 'connecting' || status === 'connected') {\n return hsuiteProvider.transportState();\n }\n }\n\n // Check P2P Native provider (mobile-native)\n const p2pProvider = this.providers.get('mobile-native') as P2PNativeProvider | undefined;\n if (p2pProvider) {\n const status = p2pProvider.status();\n if (status === 'connecting' || status === 'connected') {\n return p2pProvider.transportState();\n }\n }\n\n return 'idle';\n });\n\n /**\n * Registers a wallet provider instance.\n *\n * @description\n * Adds a provider to the service's internal registry. Once registered,\n * the provider's accounts will be included in {@link allAccounts} and\n * can be used for wallet operations.\n *\n * Built-in providers (HSuite Native, WalletConnect, P2P) are auto-registered.\n * Use this method only for custom provider implementations.\n *\n * @param provider - The provider instance to register\n */\n registerProvider(provider: BaseWalletProvider): void {\n if (this.providers.has(provider.id)) {\n logger.warn('Provider already registered', { providerId: provider.id });\n return;\n }\n\n this.providers.set(provider.id, provider);\n this._providerIds.set(Array.from(this.providers.keys()));\n }\n\n /**\n * Unregisters a wallet provider.\n *\n * @description\n * Removes a provider from the service's registry. The provider's accounts\n * will no longer be included in {@link allAccounts}.\n *\n * @param providerId - The provider ID to unregister\n */\n unregisterProvider(providerId: string): void {\n this.providers.delete(providerId);\n this._providerIds.set(Array.from(this.providers.keys()));\n }\n\n /**\n * Gets a specific provider by ID.\n *\n * @description\n * Retrieves a registered provider instance for direct interaction.\n * Useful for accessing provider-specific features not exposed through\n * the unified interface.\n *\n * @param providerId - The provider ID (e.g., 'hsuite-native', 'walletconnect-v2')\n *\n * @returns The provider instance or undefined if not found\n */\n getProvider(providerId: string): BaseWalletProvider | undefined {\n return this.providers.get(providerId);\n }\n\n /**\n * Gets all providers of a specific type.\n *\n * @description\n * Filters providers by their type, useful when you need to work with\n * a specific category of wallets.\n *\n * @param type - Provider type to filter by (e.g., 'hsuite-native', 'walletconnect-v2')\n *\n * @returns Array of providers matching the specified type\n */\n getProvidersByType(type: ProviderType): BaseWalletProvider[] {\n return Array.from(this.providers.values()).filter((p) => p.metadata.type === type);\n }\n\n /**\n * Connects to a wallet using a specific provider.\n *\n * @description\n * Initiates a wallet connection through the specified provider. The connection\n * flow varies by provider type:\n * - **HSuite Native**: Opens wallet window/tab or uses Nostr discovery\n * - **WalletConnect**: Displays QR code for mobile wallet scanning\n * - **P2P Native**: Displays QR code for direct P2P connection\n *\n * Upon successful connection, emits 'connected' and 'accountsUpdated' events\n * via WalletEventBus.\n *\n * @param providerId - The provider ID to use for connection\n * @param config - Connection configuration (varies by provider type)\n *\n * @throws {Error} If provider is not found\n * @throws {Error} If connection fails or times out\n */\n async connect(providerId: string, config: ConnectionConfig): Promise<void> {\n const provider = this.providers.get(providerId);\n if (!provider) {\n throw new Error(`Provider ${providerId} not found`);\n }\n\n await provider.connect(config);\n\n const accounts = provider.accounts();\n\n // Emit connection event\n this.eventBus.connected.emit({\n providerId,\n providerType: provider.metadata.type as 'hsuite-native' | 'walletconnect-v2',\n accounts,\n timestamp: Date.now(),\n });\n\n // Emit accounts updated\n this.eventBus.accountsUpdated.emit({\n providerId,\n accounts,\n totalAccounts: this.allAccounts().length,\n timestamp: Date.now(),\n });\n\n // Auto-select first account if none is active\n if (!this._activeAccount() && provider.accounts().length > 0) {\n this.setActiveAccount(provider.accounts()[0]);\n }\n }\n\n /**\n * Disconnects a specific provider.\n *\n * @description\n * Terminates the wallet connection for the specified provider. If the active\n * account belonged to this provider, automatically selects another available\n * account or clears the active account.\n *\n * @param providerId - The provider ID to disconnect\n *\n * @throws {Error} If provider is not found\n */\n async disconnect(providerId: string): Promise<void> {\n const provider = this.providers.get(providerId);\n if (!provider) {\n throw new Error(`Provider ${providerId} not found`);\n }\n\n await provider.disconnect();\n\n // If the active account belonged to this provider, clear it\n const active = this._activeAccount();\n if (active && active.providerId === providerId) {\n // Try to select another account from a different provider\n const accounts = this.allAccounts();\n const nextAccount = accounts.find((a) => a.providerId !== providerId);\n this.setActiveAccount(nextAccount || null);\n }\n }\n\n /**\n * Disconnects all connected providers.\n *\n * @description\n * Terminates all wallet connections and clears the active account.\n * Useful for logout flows or cleanup operations.\n */\n async disconnectAll(): Promise<void> {\n const disconnectPromises = Array.from(this.providers.values())\n .filter((p) => p.isConnected())\n .map((p) => p.disconnect());\n\n await Promise.all(disconnectPromises);\n this.setActiveAccount(null);\n }\n\n /**\n * Sets the active account for wallet operations.\n *\n * @description\n * Changes the currently active account. All subsequent signing and transaction\n * operations will use this account. Emits an 'accountChanged' event via\n * WalletEventBus.\n *\n * @param account - The account to set as active, or null to clear\n */\n setActiveAccount(account: UnifiedAccount | null): void {\n const previous = this._activeAccount();\n this._activeAccount.set(account);\n\n // Emit account change event\n this.eventBus.accountChanged.emit({\n previousAccount: previous,\n newAccount: account,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Signs a transaction using the active account.\n *\n * @description\n * Requests the wallet to sign the provided transaction payload using the\n * active account's private key. The transaction is not submitted to the\n * network.\n *\n * @param payload - Serialized transaction payload to sign (format depends on ledger)\n *\n * @returns Promise resolving to sign result with signed payload and signature\n *\n * @throws {Error} If no active account is set\n * @throws {Error} If provider is not found\n * @throws {Error} If user rejects the signing request\n */\n async signTransaction(payload: string): Promise<unknown> {\n const account = this._activeAccount();\n if (!account) {\n throw new Error('No active account');\n }\n\n const provider = this.providers.get(account.providerId);\n if (!provider) {\n throw new Error(`Provider ${account.providerId} not found`);\n }\n\n return await provider.signTransaction({\n accountAddress: account.address,\n payload,\n ledgerId: account.ledgerId,\n networkId: account.networkId,\n });\n }\n\n /**\n * Submits a transaction using the active account.\n *\n * @description\n * Signs and submits a transaction to the blockchain network. This is a two-step\n * operation: sign then submit. For a single-prompt flow, use\n * {@link signAndExecuteTransaction} instead.\n *\n * Supports batch transactions when isBatch is true.\n *\n * @param payload - Serialized transaction payload to submit\n * @param options - Optional submission options\n * @param options.isBatch - Whether this is a batch transaction\n * @param options.batchKey - Unique key for batch grouping\n * @param options.innerTransactions - Individual transactions within the batch\n *\n * @returns Promise resolving to submit result with transaction ID and hash\n *\n * @throws {Error} If no active account is set\n * @throws {Error} If provider is not found\n * @throws {Error} If user rejects or transaction fails\n */\n async submitTransaction(\n payload: string,\n options?: {\n isBatch?: boolean;\n batchKey?: string;\n innerTransactions?: Array<{ payload: string; description?: string }>;\n },\n ): Promise<unknown> {\n const account = this._activeAccount();\n if (!account) {\n throw new Error('No active account');\n }\n\n const provider = this.providers.get(account.providerId);\n if (!provider) {\n throw new Error(`Provider ${account.providerId} not found`);\n }\n\n return await provider.submitTransaction({\n accountAddress: account.address,\n payload,\n ledgerId: account.ledgerId,\n networkId: account.networkId,\n ...options,\n });\n }\n\n /**\n * Signs an arbitrary message using the active account.\n *\n * @description\n * Requests the wallet to sign a message for authentication or verification\n * purposes (e.g., DAO votes, login challenges). The message is not a\n * blockchain transaction.\n *\n * @param message - The message to sign (plain text or base64 encoded)\n * @param encoding - Message encoding: 'utf-8' (default) or 'base64'\n *\n * @returns Promise resolving to sign result with signature and public key\n *\n * @throws {Error} If no active account is set\n * @throws {Error} If provider is not found\n * @throws {Error} If user rejects the signing request\n */\n async signMessage(message: string, encoding?: 'utf-8' | 'base64'): Promise<unknown> {\n const account = this._activeAccount();\n if (!account) {\n throw new Error('No active account');\n }\n\n const provider = this.providers.get(account.providerId);\n if (!provider) {\n throw new Error(`Provider ${account.providerId} not found`);\n }\n\n return await provider.signMessage({\n accountAddress: account.address,\n message,\n encoding,\n ledgerId: account.ledgerId,\n networkId: account.networkId,\n });\n }\n\n /**\n * Signs and executes a transaction in a single prompt.\n *\n * @description\n * Performs atomic sign-and-submit in a single wallet prompt. This is the\n * **recommended method** for most transaction submissions as it:\n * - Only requires one user approval (better UX)\n * - Matches WalletConnect's `hedera_signAndExecuteTransaction` behavior\n * - Provides atomic operation (sign+submit happen together)\n *\n * For providers that don't support native signAndExecute, this method\n * falls back to separate sign and submit calls.\n *\n * @param payload - Serialized transaction payload\n * @param options - Optional provider-specific options\n *\n * @returns Promise resolving to execution result with transaction ID and hash\n *\n * @throws {Error} If no active account is set\n * @throws {Error} If provider is not found\n * @throws {Error} If user rejects or transaction fails\n */\n async signAndExecuteTransaction(\n payload: string,\n options?: Record<string, unknown>,\n ): Promise<unknown> {\n const account = this._activeAccount();\n if (!account) {\n throw new Error('No active account');\n }\n\n const provider = this.providers.get(account.providerId);\n if (!provider) {\n throw new Error(`Provider ${account.providerId} not found`);\n }\n\n // Check if provider has native signAndExecute support\n if (\n typeof (provider as any as { signAndExecuteTransaction: (payload: any) => Promise<any> })\n .signAndExecuteTransaction === 'function'\n ) {\n return await (\n provider as any as { signAndExecuteTransaction: (payload: any) => Promise<any> }\n ).signAndExecuteTransaction({\n accountAddress: account.address,\n payload,\n ledgerId: account.ledgerId,\n networkId: account.networkId,\n ...options,\n });\n }\n\n // Fallback: sign then submit\n const signResult = await provider.signTransaction({\n accountAddress: account.address,\n payload,\n ledgerId: account.ledgerId,\n networkId: account.networkId,\n ...options,\n });\n\n return await provider.submitTransaction({\n accountAddress: account.address,\n payload: signResult.signedPayload || payload,\n ledgerId: account.ledgerId,\n networkId: account.networkId,\n ...options,\n });\n }\n\n /**\n * Gets all active sessions across all providers.\n *\n * @description\n * Returns detailed session information for all connected providers. For\n * WalletConnect, each session is returned separately. For other providers,\n * a single session entry represents the connection.\n *\n * @returns Array of session objects with provider and account information\n */\n getActiveSessions(): Array<{\n providerId: string;\n providerType: string;\n providerName: string;\n accounts: import('../models/unified-account.model').UnifiedAccount[];\n metadata: any;\n }> {\n const sessions: Array<{\n providerId: string;\n providerType: string;\n providerName: string;\n accounts: import('../models/unified-account.model').UnifiedAccount[];\n metadata: any;\n }> = [];\n\n for (const provider of this.providers.values()) {\n const accounts = provider.accounts();\n\n if (accounts.length > 0) {\n // For WalletConnect, get detailed session info\n if (provider.id === 'walletconnect-v2' && 'getActiveSessions' in provider) {\n const wcProvider = provider as any;\n const wcSessions = (\n wcProvider as { getActiveSessions: () => unknown[] }\n ).getActiveSessions();\n\n for (const wcSession of wcSessions) {\n sessions.push({\n providerId: provider.id,\n providerType: provider.metadata.type,\n providerName: provider.metadata.name,\n accounts: (wcSession as { accounts?: any[] }).accounts || [],\n metadata: {\n sessionKey: (wcSession as { sessionKey?: string }).sessionKey,\n ledgerId: (wcSession as { ledgerId?: string }).ledgerId,\n networkId: (wcSession as { networkId?: string }).networkId,\n topic: (wcSession as { topic?: string }).topic,\n },\n });\n }\n } else {\n // For HSuite Native and other providers, create a single session entry\n sessions.push({\n providerId: provider.id,\n providerType: provider.metadata.type,\n providerName: provider.metadata.name,\n accounts,\n metadata: {\n type: provider.metadata.type,\n },\n });\n }\n }\n }\n\n return sessions;\n }\n\n /**\n * Disconnects a specific session from a provider.\n *\n * @description\n * For WalletConnect which supports multiple concurrent sessions, this allows\n * disconnecting a specific session without affecting others. For other\n * providers, this is equivalent to calling {@link disconnect}.\n *\n * @param providerId - The provider ID\n * @param sessionKey - Optional session key (required for WalletConnect multi-session)\n *\n * @throws {Error} If provider is not found\n */\n async disconnectSession(providerId: string, sessionKey?: string): Promise<void> {\n const provider = this.providers.get(providerId);\n if (!provider) {\n throw new Error(`Provider ${providerId} not found`);\n }\n\n // If provider supports session-level disconnect (WalletConnect), use it\n if ('disconnectSession' in provider && sessionKey) {\n const wcProvider = provider as any;\n await (wcProvider as { disconnectSession: (key: string) => Promise<void> }).disconnectSession(\n sessionKey,\n );\n } else {\n // Otherwise, disconnect the entire provider\n await provider.disconnect();\n }\n\n // Emit disconnection event\n this.eventBus.disconnected.emit({\n providerId,\n providerType: provider.metadata.type,\n sessionKey,\n reason: 'user_initiated',\n timestamp: Date.now(),\n });\n\n // Update active account if needed\n const active = this._activeAccount();\n if (active && active.providerId === providerId) {\n const accounts = this.allAccounts();\n const nextAccount = accounts.find(\n (a) =>\n a.providerId !== providerId ||\n (sessionKey && (a.metadata as { sessionKey?: string })?.sessionKey !== sessionKey),\n );\n this.setActiveAccount(nextAccount || null);\n }\n }\n\n /**\n * Check if any provider is connected\n */\n isAnyConnected(): boolean {\n return this.connectedProviders().length > 0;\n }\n\n /**\n * Alias for isAnyConnected() - convenience method\n */\n isConnected(): boolean {\n return this.isAnyConnected();\n }\n\n /**\n * Get account by ID\n * @param accountId\n */\n getAccountById(accountId: string): UnifiedAccount | undefined {\n return this.allAccounts().find((a) => a.id === accountId);\n }\n\n /**\n * Get list of unique ledger IDs from connected accounts\n * @returns Array of ledger IDs (e.g., ['hedera', 'xrpl'])\n */\n getConnectedLedgers(): string[] {\n const accounts = this.allAccounts();\n const ledgerIds = new Set(accounts.map((a) => a.ledgerId).filter(Boolean));\n return Array.from(ledgerIds);\n }\n\n /**\n * Get accounts filtered by ledger ID\n * @param ledgerId - Ledger identifier (e.g., 'hedera', 'xrpl')\n * @returns Array of accounts for the specified ledger\n */\n getAccountsByLedger(ledgerId: string): UnifiedAccount[] {\n return this.allAccounts().filter((a) => a.ledgerId === ledgerId);\n }\n\n /**\n * Switch to an account by its ID\n * @param accountId - The account ID to switch to\n * @returns true if account was found and switched, false otherwise\n */\n switchAccount(accountId: string): boolean {\n const account = this.getAccountById(accountId);\n if (!account) {\n logger.warn('Account not found', { accountId });\n return false;\n }\n\n this.setActiveAccount(account);\n return true;\n }\n\n /**\n * Get the primary account for a specific ledger\n * Returns the first account found for the specified ledger\n * @param ledgerId - Ledger identifier (e.g., 'hedera', 'xrpl')\n * @returns The first account for the ledger, or undefined\n */\n getPrimaryAccountForLedger(ledgerId: string): UnifiedAccount | undefined {\n return this.allAccounts().find((a) => a.ledgerId === ledgerId);\n }\n\n /**\n * Check if a specific ledger has connected accounts\n * @param ledgerId - Ledger identifier (e.g., 'hedera', 'xrpl')\n * @returns true if at least one account exists for the ledger\n */\n hasAccountsForLedger(ledgerId: string): boolean {\n return this.getAccountsByLedger(ledgerId).length > 0;\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file account-selector.service.ts\n * @description Business logic service for account selector\n *\n * Encapsulates the core business logic for the AccountSelectorComponent.\n * Handles account selection, session management, and data transformations.\n * Extracted from AccountSelectorComponent for better testability and maintainability.\n *\n * **Features:**\n * - Account selection and switching\n * - Session disconnect logic\n * - Account grouping by ledger\n * - Keyboard navigation support\n * - Toast/alert integration\n */\n\nimport { Injectable, inject, signal, computed } from '@angular/core';\nimport { getLogger } from '@hsuite/native-connect-sdk';\nimport { AlertController, ToastController, ModalController } from '@ionic/angular/standalone';\n\nimport { UnifiedWalletService } from '../../services/unified-wallet.service';\n\nimport { AccountFormattingService } from './account-formatting.service';\nimport type { LedgerGroup, AccountItem } from './account-list/account-list.component';\n\nconst logger = getLogger().scoped?.('AccountSelectorService') ?? getLogger();\n\n/**\n * Account data emitted on selection change\n */\nexport interface SelectedAccountData {\n id: string;\n address: string;\n ledgerId: string;\n networkId: string;\n label?: string;\n providerId?: string;\n providerType?: string;\n}\n\n/**\n * @service AccountSelectorService\n * Business logic service for account selector component.\n */\n@Injectable({ providedIn: 'root' })\nexport class AccountSelectorService {\n protected readonly wallet = inject(UnifiedWalletService);\n protected readonly formatting = inject(AccountFormattingService);\n\n // Controllers - optional for different contexts\n protected alertController = inject(AlertController, { optional: true });\n protected toastController = inject(ToastController, { optional: true });\n protected modalController = inject(ModalController, { optional: true });\n\n /**\n * Loading state signal\n */\n readonly isLoading = signal<boolean>(false);\n\n /**\n * Error state signal\n */\n readonly error = signal<string | null>(null);\n\n /**\n * Get all active sessions from wallet\n */\n get activeSessions() {\n return this.wallet.getActiveSessions();\n }\n\n /**\n * Get all accounts as a computed value\n */\n readonly allAccounts = computed(() => {\n const accounts = this.wallet.allAccounts();\n return accounts.map((acc) => ({\n id: acc.id,\n address: acc.address,\n ledgerId: acc.ledgerId,\n networkId: acc.networkId,\n label: acc.label,\n publicKey: (acc.metadata as any)?.publicKey,\n providerId: acc.providerId,\n providerType: acc.providerType,\n sessionKey: (acc.metadata as any)?.sessionKey,\n }));\n });\n\n /**\n * Get currently active account\n */\n readonly activeAccount = computed(() => this.wallet.activeAccount());\n\n /**\n * Get total account count\n */\n readonly totalAccountCount = computed(() => this.wallet.allAccounts().length);\n\n /**\n * Get all accounts grouped by ledger\n */\n readonly groupedByLedger = computed<LedgerGroup[]>(() => {\n const sessions = this.wallet.getActiveSessions();\n const items: Array<{ account: any; session: any }> = [];\n\n for (const session of sessions) {\n if (!session.accounts || !Array.isArray(session.accounts)) continue;\n for (const account of session.accounts) {\n if (account) items.push({ account, session });\n }\n }\n\n return this.groupAccountsByLedger(items);\n });\n\n /**\n * Get currently connected account with session\n */\n readonly currentlyConnectedAccount = computed<{\n session: any;\n account: any;\n } | null>(() => {\n try {\n const activeAccount = this.wallet.activeAccount();\n if (!activeAccount) return null;\n\n const sessions = this.wallet.getActiveSessions();\n if (!sessions || !Array.isArray(sessions)) return null;\n\n for (const session of sessions) {\n if (!session || !session.accounts || !Array.isArray(session.accounts)) continue;\n\n const account = session.accounts.find((a) => a && a.address === activeAccount.address);\n if (account) {\n return { session, account };\n }\n }\n return null;\n } catch (error) {\n logger.error('Error getting currently connected account', { error });\n return null;\n }\n });\n\n /**\n * Get other accounts (not currently connected)\n */\n readonly otherAccounts = computed<\n Array<{\n session: any;\n account: any;\n }>\n >(() => {\n try {\n const activeAccount = this.wallet.activeAccount();\n const sessions = this.wallet.getActiveSessions();\n const others: Array<{ session: any; account: any }> = [];\n\n if (!sessions || !Array.isArray(sessions)) return others;\n\n for (const session of sessions) {\n if (!session || !session.accounts || !Array.isArray(session.accounts)) continue;\n\n for (const account of session.accounts) {\n if (!account) continue;\n\n if (!activeAccount || account.address !== activeAccount.address) {\n others.push({ session, account });\n }\n }\n }\n\n return others;\n } catch (error) {\n logger.error('Error getting other accounts', { error });\n return [];\n }\n });\n\n /**\n * Select an account\n * @param accountItem\n * @param mode\n */\n async selectAccount(\n accountItem: AccountItem,\n mode: 'inline' | 'modal',\n ): Promise<SelectedAccountData | null> {\n const account = accountItem.account;\n const selectedId = account.id;\n\n // Update UnifiedWalletService active account\n const unifiedAccount = this.wallet.allAccounts().find((a) => a.id === selectedId);\n if (unifiedAccount) {\n this.wallet.setActiveAccount(unifiedAccount);\n }\n\n const accountData: SelectedAccountData = {\n id: account.id || '',\n address: account.address || '',\n ledgerId: account.ledgerId || '',\n networkId: account.networkId || '',\n label: account.label,\n providerId: accountItem.session.providerId,\n providerType: accountItem.session.providerType,\n };\n\n // Modal mode: show toast and dismiss\n if (mode === 'modal') {\n await this.showSuccessToast(`Switched to ${account.label || 'Account'}`);\n logger.info('[Modal] Account changed and modal dismissed', { ...accountData });\n } else {\n logger.info('[Inline] Account changed', { ...accountData });\n }\n\n return accountData;\n }\n\n /**\n * Disconnect a session with confirmation\n * @param providerId\n * @param sessionKey\n * @param mode\n * @param skipConfirmation\n */\n async disconnectSession(\n providerId: string,\n sessionKey: string | undefined,\n mode: 'inline' | 'modal',\n skipConfirmation = false,\n ): Promise<boolean> {\n // Modal mode: use AlertController for confirmation\n if (!skipConfirmation) {\n if (mode === 'modal' && this.alertController) {\n return new Promise((resolve) => {\n this.alertController!.create({\n header: 'Disconnect Session',\n message: 'Are you sure you want to disconnect this wallet session?',\n buttons: [\n {\n text: 'Cancel',\n role: 'cancel',\n handler: () => resolve(false),\n },\n {\n text: 'Disconnect',\n role: 'destructive',\n handler: async () => {\n const success = await this.performDisconnect(providerId, sessionKey, mode);\n resolve(success);\n },\n },\n ],\n }).then((alert) => alert.present());\n });\n }\n\n // Inline mode: use browser confirm\n if (mode === 'inline') {\n const confirmed = confirm('Are you sure you want to disconnect this wallet session?');\n if (!confirmed) return false;\n }\n }\n\n return this.performDisconnect(providerId, sessionKey, mode);\n }\n\n /**\n * Disconnect all sessions with confirmation\n * @param _mode\n */\n async disconnectAll(_mode: 'inline' | 'modal'): Promise<boolean> {\n if (!this.alertController) {\n logger.warn('AlertController not available for disconnect confirmation');\n return false;\n }\n\n return new Promise((resolve) => {\n this.alertController!.create({\n header: 'Disconnect All Wallets',\n message: 'Are you sure you want to disconnect all connected wallets?',\n buttons: [\n {\n text: 'Cancel',\n role: 'cancel',\n handler: () => resolve(false),\n },\n {\n text: 'Disconnect All',\n role: 'destructive',\n handler: async () => {\n this.isLoading.set(true);\n try {\n const sessions = this.wallet.getActiveSessions();\n for (const session of sessions) {\n try {\n await this.wallet.disconnectSession(\n session.providerId,\n session.metadata?.sessionKey,\n );\n } catch (error) {\n logger.error('Failed to disconnect session', {\n providerId: session.providerId,\n error,\n });\n }\n }\n\n await this.showSuccessToast('All wallets disconnected');\n resolve(true);\n } catch (error) {\n logger.error('Failed to disconnect all sessions', { error });\n this.error.set('Failed to disconnect all wallets');\n resolve(false);\n } finally {\n this.isLoading.set(false);\n }\n },\n },\n ],\n }).then((alert) => alert.present());\n });\n }\n\n /**\n * Navigate accounts using keyboard\n * @param direction\n * @param selectedId\n */\n navigateAccounts(direction: 1 | -1, selectedId?: string): string | null {\n const accounts = this.allAccounts();\n if (accounts.length === 0) return null;\n\n const currentIndex = accounts.findIndex((acc) => acc.id === selectedId);\n let nextIndex = currentIndex + direction;\n\n // Wrap around\n if (nextIndex < 0) {\n nextIndex = accounts.length - 1;\n } else if (nextIndex >= accounts.length) {\n nextIndex = 0;\n }\n\n const nextAccount = accounts[nextIndex];\n return nextAccount?.id ?? null;\n }\n\n /**\n * Navigate to first or last account\n * @param toFirst\n */\n navigateToEdge(toFirst: boolean): string | null {\n const accounts = this.allAccounts();\n if (accounts.length === 0) return null;\n\n const targetAccount = toFirst ? accounts[0] : accounts[accounts.length - 1];\n return targetAccount?.id ?? null;\n }\n\n /**\n * Get wallet logo for active account\n */\n getActiveWalletLogo(): string {\n const sessions = this.wallet.getActiveSessions();\n const activeAccount = this.wallet.activeAccount();\n\n if (!activeAccount) return 'assets/wallets/hsuite.svg';\n\n const session = sessions.find((s) =>\n s.accounts?.some((acc) => acc.address === activeAccount.address),\n );\n\n if (!session) return 'assets/wallets/hsuite.svg';\n\n return this.formatting.getWalletLogo(session.providerType);\n }\n\n /**\n * Clear error state\n */\n clearError(): void {\n this.error.set(null);\n }\n\n /**\n * Set modal controller instance (for modal context)\n * @param controller\n */\n setModalController(controller: ModalController): void {\n this.modalController = controller;\n }\n\n /**\n * Perform the actual disconnect operation\n * @param providerId\n * @param sessionKey\n * @param mode\n */\n private async performDisconnect(\n providerId: string,\n sessionKey: string | undefined,\n mode: 'inline' | 'modal',\n ): Promise<boolean> {\n this.isLoading.set(true);\n this.error.set(null);\n\n try {\n await this.wallet.disconnectSession(providerId, sessionKey);\n\n if (mode === 'modal') {\n await this.showSuccessToast('Wallet disconnected successfully');\n }\n\n logger.info('Session disconnected', { providerId, sessionKey, mode });\n return true;\n } catch (error) {\n logger.error('Failed to disconnect session', { providerId, error });\n\n if (mode === 'modal') {\n await this.showErrorToast('Failed to disconnect wallet. Please try again.');\n }\n\n this.error.set(error instanceof Error ? error.message : 'Failed to disconnect');\n return false;\n } finally {\n this.isLoading.set(false);\n }\n }\n\n /**\n * Group accounts by ledger\n * @param items\n */\n private groupAccountsByLedger(items: Array<{ account: any; session: any }>): LedgerGroup[] {\n const ledgerMap = new Map<string, Array<{ account: any; session: any }>>();\n\n for (const item of items) {\n const { account } = item;\n if (!account?.ledgerId) continue;\n\n const ledgerId = account.ledgerId;\n if (!ledgerMap.has(ledgerId)) {\n ledgerMap.set(ledgerId, []);\n }\n ledgerMap.get(ledgerId)!.push(item);\n }\n\n return Array.from(ledgerMap.entries()).map(([ledgerId, accounts]) => ({\n ledgerName: this.formatting.getLedgerName(ledgerId),\n ledgerId,\n accounts,\n }));\n }\n\n /**\n * Show success toast\n * @param message\n */\n private async showSuccessToast(message: string): Promise<void> {\n if (this.toastController) {\n const toast = await this.toastController.create({\n message,\n duration: 2000,\n cssClass: 'toast-success toast-compact',\n position: 'top',\n icon: 'checkmark-circle',\n buttons: [{ icon: 'close', role: 'cancel' }],\n });\n await toast.present();\n }\n }\n\n /**\n * Show error toast\n * @param message\n */\n private async showErrorToast(message: string): Promise<void> {\n if (this.toastController) {\n const toast = await this.toastController.create({\n message,\n duration: 3000,\n cssClass: 'toast-danger toast-compact',\n position: 'top',\n icon: 'alert-circle-outline',\n buttons: [{ icon: 'close', role: 'cancel' }],\n });\n await toast.present();\n }\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file account-selector.component.ts\n * @description Flexible account selector with both inline and modal presentation modes\n *\n * Orchestrator component for account selection functionality.\n * Delegates to child components for rendering and service for business logic.\n *\n * **Features:**\n * - Dual presentation: inline (default) or modal\n * - Collapsible groups by Protocol / Network / Accounts\n * - Full keyboard navigation and accessibility support\n * - Shows all accounts from all sessions (multi-session WalletConnect support)\n * - Displays session metadata (sessionKey, topic for WalletConnect)\n * - Disconnect button per WalletConnect session with confirmation\n * - Optional balance and metadata display\n * - Theme-aware styling with dark mode support\n *\n * **Architecture:**\n * This component acts as an orchestrator, delegating to:\n * - `AccountListComponent` - List rendering\n * - `AccountFilterComponent` - Compact header and filtering\n * - `AccountActionsComponent` - Action buttons\n * - `AccountSelectorService` - Business logic\n */\n\nimport {\n Component,\n EventEmitter,\n Input,\n Output,\n inject,\n OnInit,\n HostBinding,\n computed,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonContent, IonButton, IonIcon, ModalController } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { closeOutline, walletOutline } from 'ionicons/icons';\n\n// Child components\nimport {\n AccountListComponent,\n AccountItem,\n LedgerGroup,\n} from './account-list/account-list.component';\nimport {\n AccountFilterComponent,\n CompactHeaderFormat,\n CompactHeaderSize,\n} from './account-filter/account-filter.component';\nimport { AccountActionsComponent } from './account-actions/account-actions.component';\n\n// Services\nimport { AccountSelectorService, SelectedAccountData } from './account-selector.service';\nimport { AccountFormattingService } from './account-formatting.service';\nimport { UnifiedWalletService } from '../../services/unified-wallet.service';\n\n/**\n * Presentation mode for the Account Selector\n */\nexport type AccountSelectorPresentationMode = 'inline' | 'modal';\n\n/**\n * Grouping mode for account display\n */\nexport type AccountGroupingMode = 'nested' | 'flat' | 'none';\n\n/**\n * Configuration options for the Account Selector\n */\nexport interface AccountSelectorConfig {\n /** Presentation mode: 'inline' (default) or 'modal' */\n presentationMode?: AccountSelectorPresentationMode;\n /** Display account balances (if available) */\n showBalances?: boolean;\n /** Display last activity timestamp */\n showLastActivity?: boolean;\n /** Display online/offline network status */\n showNetworkStatus?: boolean;\n /** Enable search/filter functionality */\n enableSearch?: boolean;\n /** Default expansion state for groups */\n defaultExpanded?: 'all' | 'first' | 'none';\n /** Show compact header with wallet info and count */\n showCompactHeader?: boolean;\n /** Format for compact header display */\n compactHeaderFormat?: CompactHeaderFormat;\n /** Size variant for compact header */\n compactHeaderSize?: CompactHeaderSize;\n /** Allow collapse/expand via compact header (inline mode) */\n collapsible?: boolean;\n /** Grouping mode: 'nested' | 'flat' | 'none' */\n groupingMode?: AccountGroupingMode;\n}\n\n/**\n * @component AccountSelectorComponent\n * Flexible account selector with both inline and modal presentation modes.\n */\n@Component({\n selector: 'wallet-account-selector',\n standalone: true,\n imports: [\n CommonModule,\n IonContent,\n IonButton,\n IonIcon,\n AccountListComponent,\n AccountFilterComponent,\n AccountActionsComponent,\n ],\n templateUrl: './account-selector.component.html',\n styleUrls: ['./account-selector.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class AccountSelectorComponent implements OnInit {\n /**\n * Presentation mode: 'inline' (default) or 'modal'\n */\n @Input() presentationMode: AccountSelectorPresentationMode = 'inline';\n\n /**\n * Configuration options for the component\n */\n @Input() config: AccountSelectorConfig = {\n presentationMode: 'inline',\n showBalances: false,\n showLastActivity: false,\n showNetworkStatus: false,\n enableSearch: false,\n defaultExpanded: 'none',\n showCompactHeader: false,\n compactHeaderFormat: 'label-count',\n compactHeaderSize: 'default',\n collapsible: true,\n groupingMode: 'nested',\n };\n\n /**\n * Currently selected account ID (optional, for highlighting)\n */\n @Input() selectedId?: string;\n\n /**\n * Address-based selection (legacy support)\n */\n @Input() selectedAddress?: string;\n\n /**\n * Header title text\n */\n @Input() headerTitle = 'Select Account';\n\n /**\n * Custom header text for inline expandable mode\n */\n @Input() customHeaderText?: string;\n\n /**\n * Optional: Manually provide ModalController instance\n */\n @Input() set modalControllerInstance(controller: ModalController | undefined) {\n if (controller) {\n this.modalController = controller;\n this.selectorService.setModalController(controller);\n }\n }\n\n /**\n * Emitted when user selects a different account (inline mode)\n */\n @Output() accountChanged = new EventEmitter<SelectedAccountData>();\n\n /**\n * Emitted when user disconnects a session (inline mode)\n */\n @Output() sessionDisconnected = new EventEmitter<{\n providerId: string;\n sessionKey?: string;\n }>();\n\n /**\n * Emitted when user clicks the Connect Wallet button (inline mode)\n */\n @Output() connectWalletRequested = new EventEmitter<void>();\n\n /**\n * Host binding for presentation mode styling\n */\n @HostBinding('attr.data-presentation-mode')\n get hostPresentationMode(): string {\n return this.effectivePresentationMode;\n }\n\n // Injected services\n protected readonly selectorService = inject(AccountSelectorService);\n protected readonly formatting = inject(AccountFormattingService);\n protected readonly wallet = inject(UnifiedWalletService);\n protected modalController = inject(ModalController, { optional: true });\n\n /**\n * Track if the account list is collapsed (inline mode with compact header)\n */\n protected readonly isCollapsed = signal<boolean>(false);\n\n /**\n * Computed: ledger groups from service\n */\n protected readonly groupedByLedger = computed<LedgerGroup[]>(() =>\n this.selectorService.groupedByLedger(),\n );\n\n /**\n * Computed: active account for filter component\n */\n protected readonly activeAccountData = computed(() => {\n const active = this.selectorService.activeAccount();\n if (!active) return null;\n return {\n address: active.address,\n networkId: active.networkId,\n label: active.label,\n providerType: active.providerType,\n };\n });\n\n /**\n * Computed: currently connected account with session\n */\n protected readonly currentlyConnectedAccount = computed(() =>\n this.selectorService.currentlyConnectedAccount(),\n );\n\n /**\n * Computed: total account count\n */\n protected readonly totalAccountCount = computed(() => this.selectorService.totalAccountCount());\n\n /**\n * Computed: wallet logo for active account\n */\n protected readonly activeWalletLogo = computed(() => this.selectorService.getActiveWalletLogo());\n\n /**\n * Computed: loading state from service\n */\n protected readonly isLoading = computed(() => this.selectorService.isLoading());\n\n /**\n * Computed: error state from service\n */\n protected readonly error = computed(() => this.selectorService.error());\n\n /**\n * Computed: has connected sessions\n */\n protected readonly hasAccounts = computed(() => this.wallet.getActiveSessions().length > 0);\n\n constructor() {\n addIcons({ closeOutline, walletOutline });\n }\n\n /**\n * Get effective presentation mode\n */\n protected get effectivePresentationMode(): AccountSelectorPresentationMode {\n return this.presentationMode || this.config.presentationMode || 'inline';\n }\n\n /**\n * Check if we're in modal mode\n */\n protected get isModalMode(): boolean {\n return this.effectivePresentationMode === 'modal';\n }\n\n /**\n * Check if we're in inline mode\n */\n protected get isInlineMode(): boolean {\n return this.effectivePresentationMode === 'inline';\n }\n\n /**\n * Initialize component state\n */\n ngOnInit(): void {\n this.initializeCollapsedState();\n }\n\n /**\n * Initialize collapsed state for compact header\n */\n private initializeCollapsedState(): void {\n if (this.config.showCompactHeader && this.config.defaultExpanded === 'none') {\n this.isCollapsed.set(true);\n }\n }\n\n /**\n * Toggle collapse/expand of account list\n */\n protected toggleCollapse(): void {\n if (this.config.collapsible && this.isInlineMode && this.config.showCompactHeader) {\n this.isCollapsed.update((value) => !value);\n }\n }\n\n /**\n * Handle account selection from list component\n */\n protected async onAccountSelected(accountItem: AccountItem): Promise<void> {\n const accountData = await this.selectorService.selectAccount(\n accountItem,\n this.effectivePresentationMode,\n );\n\n if (accountData) {\n if (this.isInlineMode) {\n this.accountChanged.emit(accountData);\n } else if (this.isModalMode && this.modalController) {\n await this.modalController.dismiss({ account: accountData });\n }\n }\n }\n\n /**\n * Handle disconnect request from list component\n */\n protected async onDisconnectRequested(event: {\n providerId: string;\n sessionKey?: string;\n }): Promise<void> {\n const success = await this.selectorService.disconnectSession(\n event.providerId,\n event.sessionKey,\n this.effectivePresentationMode,\n );\n\n if (success && this.isInlineMode) {\n this.sessionDisconnected.emit(event);\n }\n }\n\n /**\n * Handle disconnect all action\n */\n protected async onDisconnectAll(): Promise<void> {\n const success = await this.selectorService.disconnectAll(this.effectivePresentationMode);\n if (success && this.isModalMode && this.modalController) {\n await this.modalController.dismiss({ disconnectedAll: true });\n }\n }\n\n /**\n * Handle add account action\n */\n protected async onAddAccount(): Promise<void> {\n if (this.isModalMode && this.modalController) {\n await this.modalController.dismiss({ action: 'add-account' });\n }\n }\n\n /**\n * Handle connect wallet button click\n */\n protected onConnectWalletClick(): void {\n this.connectWalletRequested.emit();\n }\n\n /**\n * Dismiss error state\n */\n protected onErrorDismissed(): void {\n this.selectorService.clearError();\n }\n\n /**\n * Close the modal (modal mode only)\n */\n protected async dismiss(): Promise<void> {\n if (this.isModalMode && this.modalController) {\n await this.modalController.dismiss({ cancelled: true });\n }\n }\n\n /**\n * Handle keyboard events for accessibility\n */\n protected handleKeyDown(event: KeyboardEvent): void {\n if (this.isModalMode && event.key === 'Escape') {\n event.preventDefault();\n this.dismiss();\n return;\n }\n\n // Arrow key navigation\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n const direction = event.key === 'ArrowDown' ? 1 : -1;\n const nextId = this.selectorService.navigateAccounts(\n direction,\n this.selectedId || this.selectorService.activeAccount()?.id,\n );\n if (nextId) {\n // Find and select the account\n const accounts = this.selectorService.allAccounts();\n const account = accounts.find((a) => a.id === nextId);\n if (account) {\n const sessions = this.wallet.getActiveSessions();\n for (const session of sessions) {\n const matchedAccount = session.accounts?.find((a) => a.id === nextId);\n if (matchedAccount) {\n this.onAccountSelected({\n account: matchedAccount,\n session: {\n providerId: session.providerId,\n providerType: session.providerType,\n metadata: session.metadata,\n },\n });\n break;\n }\n }\n }\n }\n return;\n }\n\n // Home/End keys\n if (event.key === 'Home' || event.key === 'End') {\n event.preventDefault();\n const targetId = this.selectorService.navigateToEdge(event.key === 'Home');\n if (targetId) {\n const accounts = this.selectorService.allAccounts();\n const account = accounts.find((a) => a.id === targetId);\n if (account) {\n const sessions = this.wallet.getActiveSessions();\n for (const session of sessions) {\n const matchedAccount = session.accounts?.find((a) => a.id === targetId);\n if (matchedAccount) {\n this.onAccountSelected({\n account: matchedAccount,\n session: {\n providerId: session.providerId,\n providerType: session.providerType,\n metadata: session.metadata,\n },\n });\n break;\n }\n }\n }\n }\n }\n }\n}\n","<!-- Modal Mode: Full modal wrapper -->\n<ng-container *ngIf=\"isModalMode\">\n <ion-content (keydown)=\"handleKeyDown($event)\" [attr.aria-label]=\"'Account Selection Modal'\">\n <div\n class=\"modal-inner-content account-selector-modal\"\n role=\"dialog\"\n aria-labelledby=\"modal-title\"\n aria-modal=\"true\"\n aria-describedby=\"modal-description\"\n >\n <!-- Modal Header -->\n <div class=\"header\">\n <div class=\"title\">\n <h2 id=\"modal-title\">{{ headerTitle }}</h2>\n <p id=\"modal-description\" class=\"subtitle\">Select the account you want to use:</p>\n </div>\n <ion-button class=\"close-modal\" (click)=\"dismiss()\" fill=\"clear\" [disabled]=\"isLoading()\">\n <ion-icon slot=\"icon-only\" name=\"close-outline\"></ion-icon>\n </ion-button>\n </div>\n\n <!-- Modal Content -->\n <div class=\"form\">\n <!-- Currently Connected Section -->\n <div class=\"modal-section\" *ngIf=\"currentlyConnectedAccount() as current\">\n <h3 class=\"section-title\">Currently Connected</h3>\n <wallet-account-list\n [ledgerGroups]=\"[\n {\n ledgerName: formatting.getLedgerName(current.account.ledgerId),\n ledgerId: current.account.ledgerId,\n accounts: [{ account: current.account, session: current.session }],\n },\n ]\"\n [selectedId]=\"selectedId\"\n [activeAccountId]=\"selectorService.activeAccount()?.id\"\n [isModal]=\"true\"\n [isLoading]=\"isLoading()\"\n [showDescription]=\"false\"\n (accountSelected)=\"onAccountSelected($event)\"\n (disconnectRequested)=\"onDisconnectRequested($event)\"\n >\n </wallet-account-list>\n </div>\n\n <!-- All Accounts Section -->\n <div class=\"modal-section\" *ngIf=\"groupedByLedger().length > 0\">\n <h3 class=\"section-title\">All accounts</h3>\n <wallet-account-list\n [ledgerGroups]=\"groupedByLedger()\"\n [selectedId]=\"selectedId\"\n [activeAccountId]=\"selectorService.activeAccount()?.id\"\n [isModal]=\"true\"\n [isLoading]=\"isLoading()\"\n [error]=\"error()\"\n [showDescription]=\"false\"\n (accountSelected)=\"onAccountSelected($event)\"\n (disconnectRequested)=\"onDisconnectRequested($event)\"\n (errorDismissed)=\"onErrorDismissed()\"\n >\n </wallet-account-list>\n </div>\n\n <!-- No Accounts State (Modal) -->\n <div class=\"no-accounts-modal\" *ngIf=\"!hasAccounts()\">\n <ion-icon name=\"wallet-outline\"></ion-icon>\n <h3>No Accounts Connected</h3>\n <p>Connect a wallet to get started</p>\n </div>\n </div>\n\n <!-- Modal Footer -->\n <wallet-account-actions\n [mode]=\"'modal'\"\n [isLoading]=\"isLoading()\"\n [hasAccounts]=\"hasAccounts()\"\n (disconnectAllRequested)=\"onDisconnectAll()\"\n (addAccountRequested)=\"onAddAccount()\"\n >\n </wallet-account-actions>\n </div>\n </ion-content>\n</ng-container>\n\n<!-- Inline Mode: Direct content -->\n<ng-container *ngIf=\"isInlineMode\">\n <!-- Compact Header (if enabled) -->\n <wallet-account-filter\n *ngIf=\"config.showCompactHeader\"\n [activeAccount]=\"activeAccountData()\"\n [totalAccountCount]=\"totalAccountCount()\"\n [isCollapsed]=\"isCollapsed()\"\n [collapsible]=\"config.collapsible ?? true\"\n [customHeaderText]=\"customHeaderText\"\n [headerFormat]=\"config.compactHeaderFormat ?? 'label-count'\"\n [headerSize]=\"config.compactHeaderSize ?? 'default'\"\n [walletLogoSrc]=\"activeWalletLogo()\"\n (toggleCollapseEvent)=\"toggleCollapse()\"\n >\n </wallet-account-filter>\n\n <!-- Account List (show if not collapsed or compact header disabled) -->\n <div\n class=\"account-list-wrapper\"\n [class.collapsed]=\"config.showCompactHeader && isCollapsed()\"\n [class.expanded]=\"!config.showCompactHeader || !isCollapsed()\"\n >\n <ng-container *ngIf=\"!config.showCompactHeader || !isCollapsed()\">\n <!-- Card wrapper for expanded content -->\n <div class=\"expanded-content-card\">\n <wallet-account-list\n [ledgerGroups]=\"groupedByLedger()\"\n [selectedId]=\"selectedId\"\n [activeAccountId]=\"selectorService.activeAccount()?.id\"\n [isModal]=\"false\"\n [isLoading]=\"isLoading()\"\n [error]=\"error()\"\n [showDescription]=\"true\"\n (accountSelected)=\"onAccountSelected($event)\"\n (disconnectRequested)=\"onDisconnectRequested($event)\"\n (errorDismissed)=\"onErrorDismissed()\"\n >\n </wallet-account-list>\n\n <!-- Connect Wallet Button (shown in inline mode when expanded) -->\n <wallet-account-actions\n *ngIf=\"config.showCompactHeader\"\n [mode]=\"'inline'\"\n (connectWalletRequested)=\"onConnectWalletClick()\"\n >\n </wallet-account-actions>\n </div>\n </ng-container>\n </div>\n</ng-container>\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @fileoverview Centralized wallet context aggregation service.\n *\n * @module services/wallet-context\n *\n * @description\n * WalletContextService computes and exposes a unified, reactive wallet context by aggregating\n * state from UnifiedWalletService. It provides a single computed signal containing all\n * wallet state, eliminating the need to manually track multiple signals across different services.\n *\n * This service is the primary data source for the structural directives (`*walletContext`\n * and `*walletConnected`) that enable declarative wallet state access in templates.\n *\n * **Key Capabilities:**\n * - Aggregates connection status, accounts, sessions, and providers into a single context\n * - Provides both signal-based (modern) and Observable-based (RxJS) access patterns\n * - Automatically recomputes when any underlying state changes\n * - Handles edge cases like P2P sessions with restored accounts\n *\n * @Component({ template: `...` })\n * export class MyComponent {\n * private contextService = inject(WalletContextService);\n *\n * constructor() {\n * effect(() => {\n * const context = this.contextService.context();\n * console.log('Connected:', context.isConnected);\n * console.log('Active:', context.activeAccount?.address);\n * });\n * }\n * }\n * ```\n */\n\nimport { Injectable, computed, inject } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\nimport { UnifiedWalletService } from './unified-wallet.service';\nimport type { WalletContext } from '../models/wallet-context.model';\n\n/**\n * Angular service that aggregates wallet state into a unified context.\n *\n * @service WalletContextService\n *\n * @description\n * Provides a single reactive context object that combines all wallet state:\n * - Connection status (computed from provider states and account availability)\n * - Active account (currently selected account across all providers)\n * - All accounts (aggregated from all connected providers)\n * - Active sessions (with metadata for each provider)\n * - Provider instances (both connected and disconnected)\n *\n * This service is used internally by `*walletContext` and `*walletConnected` directives\n * to provide declarative state access in templates.\n *\n * @providedIn root\n *\n * @Component({\n * template: `\n * @if (isConnected()) {\n * <p>Connected as {{ activeAccount()?.address }}</p>\n * }\n * `\n * })\n * export class MyComponent {\n * private contextService = inject(WalletContextService);\n *\n * isConnected = () => this.contextService.isConnected();\n * activeAccount = () => this.contextService.getActiveAccount();\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class WalletContextService {\n private readonly walletService = inject(UnifiedWalletService);\n\n /**\n * Computed wallet context signal\n *\n * Automatically recomputes when unknown underlying state changes.\n *\n * **Connection Status Logic:**\n * - `isConnected = true` if:\n * - Any provider is actively connected AND has accounts, OR\n * - Any provider has restored accounts (e.g., P2P session metadata from localStorage)\n *\n * This ensures P2P sessions with restored accounts show as \"connected\" in the UI,\n * even though WebRTC needs re-pairing for actual operations. Operations will fail\n * gracefully if the transport isn't connected.\n */\n readonly context = computed<WalletContext>(() => {\n const activeAccount = this.walletService.activeAccount();\n const allAccounts = this.walletService.allAccounts();\n const connectedProviders = this.walletService.connectedProviders();\n const sessions = this.walletService.getActiveSessions();\n\n // Compute connection status:\n // Consider \"connected\" if we have accounts available (even from restored sessions)\n // This allows P2P sessions with persisted accounts to show in the UI\n const isConnected = allAccounts.length > 0;\n\n return {\n isConnected,\n activeAccount,\n allAccounts,\n sessions,\n providers: Array.from(this.getAllProviders()),\n connectedProviders,\n };\n });\n\n /**\n * Observable stream of wallet context for RxJS composition\n */\n readonly context$: Observable<WalletContext> = toObservable(this.context);\n\n /**\n * Checks if any wallet provider is currently connected.\n *\n * @description\n * Convenience method that returns the isConnected property from the context.\n * Connection is determined by account availability, not just provider state.\n *\n * @returns True if at least one account is available\n */\n isConnected(): boolean {\n return this.context().isConnected;\n }\n\n /**\n * Gets the currently active account.\n *\n * @description\n * Convenience method that returns the activeAccount property from the context.\n * The active account is the one currently selected for wallet operations.\n *\n * @returns The active account, or null if no account is selected\n */\n getActiveAccount() {\n return this.context().activeAccount;\n }\n\n /**\n * Gets all accounts from all connected providers.\n *\n * @description\n * Convenience method that returns the allAccounts array from the context.\n * Includes accounts from all providers (HSuite Native, WalletConnect, P2P).\n *\n * @returns Array of all connected accounts, empty if none\n */\n getAllAccounts() {\n return this.context().allAccounts;\n }\n\n /**\n * Get all providers from UnifiedWalletService\n * Private helper to access providers map\n */\n private getAllProviders() {\n // Access through public methods since providers map is private\n const hsuite = this.walletService.getProvider('hsuite-native');\n const walletconnect = this.walletService.getProvider('walletconnect-v2');\n const mobileNative = this.walletService.getProvider('mobile-native');\n\n const providers = [];\n if (hsuite) providers.push(hsuite);\n if (walletconnect) providers.push(walletconnect);\n if (mobileNative) providers.push(mobileNative);\n\n return providers;\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file wallet-account-display.component.ts\n * @description Pre-built component for displaying active account information\n *\n * Automatically displays the active account with badges, formatted address,\n * and responsive styling. Eliminates repetitive account display boilerplate.\n */\n\nimport { Component, Input, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonText, IonBadge, IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { walletOutline, personOutline, peopleOutline } from 'ionicons/icons';\nimport { WalletContextService } from '../../services/wallet-context.service';\n\n/**\n * Pre-built component for displaying active account\n *\n * Features:\n * - Auto-syncs with active account\n * - Optional badges for ledger and network\n * - Optional address truncation\n * - Responsive styling\n * - Customizable colors\n */\n@Component({\n selector: 'wallet-account-display',\n standalone: true,\n imports: [CommonModule, IonText, IonBadge, IonIcon],\n templateUrl: './wallet-account-display.component.html',\n styleUrls: ['./wallet-account-display.component.scss'],\n})\nexport class WalletAccountDisplayComponent {\n private readonly contextService = inject(WalletContextService);\n\n /**\n * Whether to show ledger and network badges\n */\n @Input() showBadges = true;\n\n /**\n * Whether to show account label\n */\n @Input() showLabel = true;\n\n /**\n * Whether to truncate long addresses\n */\n @Input() truncateAddress = true;\n\n /**\n * Color for the address text\n */\n @Input() addressColor: 'primary' | 'secondary' | 'tertiary' | 'medium' | 'dark' = 'medium';\n\n /**\n * Text to show when no account is selected\n */\n @Input() emptyText = 'No account selected';\n\n /**\n * Active account from context\n */\n protected readonly account = computed(() => this.contextService.context().activeAccount);\n\n /**\n * Computed display address (truncated or full)\n */\n protected readonly displayAddress = computed(() => {\n const acc = this.account();\n if (!acc) return '';\n\n if (this.truncateAddress && acc.address.length > 20) {\n return `${acc.address.substring(0, 10)}...${acc.address.substring(acc.address.length - 8)}`;\n }\n\n return acc.address;\n });\n\n /**\n * Computed check if account is multisig\n */\n protected readonly isMultisig = computed(() => {\n const acc = this.account();\n if (!acc) return false;\n const metadata = acc.metadata as Record<string, unknown> | undefined;\n return metadata?.['isMultisig'] === true || metadata?.['accountType'] === 'multisig';\n });\n\n /**\n * Get multisig threshold info (e.g., \"2/3\")\n */\n protected readonly multisigInfo = computed(() => {\n const acc = this.account();\n if (!acc) return null;\n const metadata = acc.metadata as Record<string, unknown> | undefined;\n const threshold = metadata?.['multisigThreshold'] as number | undefined;\n const total = metadata?.['multisigTotal'] as number | undefined;\n if (threshold && total) {\n return `${threshold}/${total}`;\n }\n return null;\n });\n\n constructor() {\n addIcons({ walletOutline, personOutline, peopleOutline });\n }\n\n /**\n * Get color for ledger badge\n */\n protected getLedgerColor(ledgerId: string): string {\n switch (ledgerId.toLowerCase()) {\n case 'hedera':\n return 'success';\n case 'xrpl':\n return 'tertiary';\n default:\n return 'primary';\n }\n }\n\n /**\n * Format network ID for display\n */\n protected formatNetwork(networkId: string): string {\n const parts = networkId.split(':');\n return parts[parts.length - 1] || networkId;\n }\n}\n","<div class=\"wallet-account-display\" *ngIf=\"account()\">\n <div class=\"account-header\">\n <ion-icon [name]=\"showLabel ? 'person-outline' : 'wallet-outline'\"></ion-icon>\n <div class=\"account-info\">\n <div class=\"account-label\" *ngIf=\"showLabel\">\n <strong>{{ account()!.label || 'Account' }}</strong>\n </div>\n <div class=\"account-address\">\n <ion-text [color]=\"addressColor\">\n <small>{{ displayAddress() }}</small>\n </ion-text>\n </div>\n </div>\n </div>\n\n <div class=\"account-badges\" *ngIf=\"showBadges\">\n <ion-badge *ngIf=\"isMultisig()\" color=\"tertiary\" class=\"multisig-badge\">\n <ion-icon name=\"people-outline\"></ion-icon>\n Multisig{{ multisigInfo() ? ' (' + multisigInfo() + ')' : '' }}\n </ion-badge>\n <ion-badge [color]=\"getLedgerColor(account()!.ledgerId)\">\n {{ account()!.ledgerId.toUpperCase() }}\n </ion-badge>\n <ion-badge>\n {{ formatNetwork(account()!.networkId) }}\n </ion-badge>\n </div>\n</div>\n\n<div class=\"wallet-account-display empty\" *ngIf=\"!account()\">\n <ion-text>\n <small>{{ emptyText }}</small>\n </ion-text>\n</div>\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file connection-method-step.component.ts\n * @description Connection method selection step for wallet connection wizard\n *\n * Displays connection method options based on platform:\n * - Desktop: Extension (if available), PWA/Tab, QR Code (mobile)\n * - Mobile: QR Code recommended\n *\n * This step appears after protocol selection when HSuite Native is chosen.\n */\n\nimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n extensionPuzzleOutline,\n openOutline,\n qrCodeOutline,\n checkmarkCircle,\n phonePortraitOutline,\n} from 'ionicons/icons';\n\n/**\n * Connection method option interface\n */\nexport interface ConnectionMethodOption {\n /** Unique identifier */\n id: string;\n /** Display name */\n name: string;\n /** Short description */\n description: string;\n /** Ionicon name */\n icon: string;\n /** Whether this method is available */\n available: boolean;\n /** Whether this method is recommended for current platform */\n recommended: boolean;\n /** Optional features list */\n features?: string[];\n}\n\n/**\n * Connection Method Step Component\n *\n * Allows users to select how they want to connect their wallet:\n * - Browser Extension: Direct connection via installed extension\n * - Web Wallet: Opens wallet in new tab/window\n * - Mobile QR: Displays QR code for mobile wallet scanning\n */\n@Component({\n selector: 'hsuite-connection-method-step',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, IonIcon],\n templateUrl: './connection-method-step.component.html',\n styleUrls: ['./connection-method-step.component.scss'],\n})\nexport class ConnectionMethodStepComponent {\n /**\n * Available connection method options\n */\n @Input() methods: ConnectionMethodOption[] = [];\n\n /**\n * Whether current device is mobile\n */\n @Input() isMobile = false;\n\n /**\n * Currently selected method ID (for highlighting)\n */\n @Input() selectedMethod: string | null = null;\n\n /**\n * Emitted when a method is selected\n */\n @Output() methodSelected = new EventEmitter<string>();\n\n constructor() {\n addIcons({\n extensionPuzzleOutline,\n openOutline,\n qrCodeOutline,\n checkmarkCircle,\n phonePortraitOutline,\n });\n }\n\n /**\n * Handle method selection\n */\n selectMethod(method: ConnectionMethodOption): void {\n if (!method.available) {\n return;\n }\n this.methodSelected.emit(method.id);\n }\n\n /**\n * Track methods by ID for ngFor\n */\n trackByMethodId(_index: number, method: ConnectionMethodOption): string {\n return method.id;\n }\n}\n","<!-- Connection Method Step -->\n<div class=\"connection-method-step\">\n <div class=\"step-header\">\n <h3 class=\"step-title\">Choose Connection Method</h3>\n <p class=\"step-description\">Select how you'd like to connect to HSuite Wallet</p>\n </div>\n\n <div class=\"method-list\">\n <button\n *ngFor=\"let method of methods; trackBy: trackByMethodId\"\n type=\"button\"\n class=\"method-card\"\n [class.selected]=\"selectedMethod === method.id\"\n [class.recommended]=\"method.recommended\"\n [class.disabled]=\"!method.available\"\n [disabled]=\"!method.available\"\n (click)=\"selectMethod(method)\"\n >\n <!-- Recommended badge -->\n <div class=\"recommended-badge\" *ngIf=\"method.recommended\">\n <ion-icon name=\"checkmark-circle\"></ion-icon>\n <span>Recommended</span>\n </div>\n\n <!-- Icon -->\n <div class=\"method-icon\">\n <ion-icon [name]=\"method.icon\"></ion-icon>\n </div>\n\n <!-- Content -->\n <div class=\"method-content\">\n <h4 class=\"method-name\">{{ method.name }}</h4>\n <p class=\"method-description\">{{ method.description }}</p>\n\n <!-- Features list -->\n <ul class=\"method-features\" *ngIf=\"method.features?.length\">\n <li *ngFor=\"let feature of method.features\">\n <ion-icon name=\"checkmark-circle\"></ion-icon>\n <span>{{ feature }}</span>\n </li>\n </ul>\n </div>\n\n <!-- Not available message -->\n <div class=\"not-available\" *ngIf=\"!method.available\">\n <span>Not available</span>\n </div>\n </button>\n </div>\n\n <!-- Mobile hint -->\n <p class=\"mobile-hint\" *ngIf=\"isMobile\">\n <ion-icon name=\"phone-portrait-outline\"></ion-icon>\n <span>Scan QR code with the HSuite Wallet app on your mobile device</span>\n </p>\n</div>\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file Angular Logger Service for dependency injection.\n *\n * @module services/logger\n *\n * @description\n * LoggerService wraps the SDK's logger for Angular dependency injection, providing\n * a consistent logging interface throughout Angular applications. It enables\n * scoped logging with component/service names, production mode filtering, and\n * consistent log formatting.\n *\n * **Key Features:**\n * - Scoped loggers for easy filtering and tracing\n * - Production-aware log level filtering\n * - Consistent formatting across all components\n * - Context objects for structured logging\n *\n * **Log Levels:**\n * - `debug` - Detailed debugging information (filtered in production)\n * - `info` - General informational messages\n * - `warn` - Warning conditions that may need attention\n * - `error` - Error conditions requiring action\n */\n\nimport { Injectable } from '@angular/core';\nimport { getLogger, Logger } from '@hsuite/native-connect-sdk';\n\n/**\n * Angular Logger Service that wraps the SDK's logger for dependency injection.\n *\n * @service LoggerService\n *\n * @description\n * Provides scoped logger instances for components and services. All logs go through\n * the SDK's configurable logging infrastructure, which supports production mode\n * filtering and scope-based log levels.\n *\n * **Best Practices:**\n * - Create scoped loggers at the class level for consistent scope names\n * - Use structured context objects for machine-readable logs\n * - Use appropriate log levels (debug for dev, info for operations, error for failures)\n *\n * @providedIn root\n */\n@Injectable({ providedIn: 'root' })\nexport class LoggerService {\n private readonly rootLogger: Logger = getLogger();\n\n /**\n * Returns a scoped logger instance.\n *\n * Scoped loggers prefix all messages with the scope name,\n * making it easier to filter and trace logs.\n *\n * @param scope The scope for the logger (e.g., 'AppComponent', 'WalletService').\n * @returns A scoped Logger instance\n */\n scoped(scope: string): Logger {\n return this.rootLogger.scoped?.(scope) ?? this.rootLogger;\n }\n\n /**\n * Returns the root logger instance.\n *\n * Use sparingly - prefer scoped() for component/service logging.\n *\n * @returns The root Logger instance\n */\n getRootLogger(): Logger {\n return this.rootLogger;\n }\n\n /**\n * Log a debug message using the root logger.\n * Convenience method for one-off logs.\n *\n * @param message Log message\n * @param context Optional context object\n */\n debug(message: string, context?: Record<string, unknown>): void {\n this.rootLogger.debug(message, context);\n }\n\n /**\n * Log an info message using the root logger.\n * Convenience method for one-off logs.\n *\n * @param message Log message\n * @param context Optional context object\n */\n info(message: string, context?: Record<string, unknown>): void {\n this.rootLogger.info(message, context);\n }\n\n /**\n * Log a warning message using the root logger.\n * Convenience method for one-off logs.\n *\n * @param message Log message\n * @param context Optional context object\n */\n warn(message: string, context?: Record<string, unknown>): void {\n this.rootLogger.warn(message, context);\n }\n\n /**\n * Log an error message using the root logger.\n * Convenience method for one-off logs.\n *\n * @param message Log message\n * @param context Optional context object\n */\n error(message: string, context?: Record<string, unknown>): void {\n this.rootLogger.error(message, context);\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file qr-pairing-step.component.ts\n * @description QR code pairing step for mobile wallet connection\n *\n * Implements single-QR Nostr-first pairing flow:\n * 1. Display compact QR code with session invite\n * 2. Wait for wallet to scan and connect via Nostr\n * 3. Wait for user approval in wallet\n * 4. Connection established (P2P upgrade happens automatically)\n *\n * This enables fully decentralized cross-device connections with only\n * a single QR scan - much simpler than the previous 2-QR WebRTC flow.\n *\n * Features:\n * - Single QR code display (no answer scanning needed)\n * - QR code with HSuite logo in center\n * - Countdown timer with expiry handling\n * - Refresh capability for expired offers\n * - Waiting for approval state\n */\n\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n signal,\n OnChanges,\n SimpleChanges,\n OnDestroy,\n AfterViewInit,\n ElementRef,\n ViewChild,\n inject,\n} from '@angular/core';\nimport { copyToClipboard } from '@hsuite/native-connect-ui';\nimport { IonIcon, IonSpinner, IonButton } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n qrCodeOutline,\n refreshOutline,\n checkmarkCircleOutline,\n closeCircleOutline,\n phonePortraitOutline,\n arrowBackOutline,\n timeOutline,\n copyOutline,\n checkmarkOutline,\n} from 'ionicons/icons';\nimport * as QRCode from 'qrcode'; // qrcode has no default export; use namespace import for toCanvas\n\nimport { LoggerService } from '../../../services/logger.service';\n\n/**\n * Connection state for the QR pairing step.\n *\n * States:\n * - loading: Generating session invite\n * - displaying: Showing QR code for wallet to scan\n * - waiting_wallet: QR scanned, waiting for wallet to connect via Nostr\n * - waiting_approval: Wallet connected, waiting for user to approve\n * - connected: Session approved and connected\n * - expired: QR code expired\n * - error: An error occurred\n */\nexport type QrPairingState =\n | 'loading'\n | 'displaying'\n | 'waiting_wallet'\n | 'waiting_approval'\n | 'connected'\n | 'expired'\n | 'error';\n\n/**\n * QR Pairing Step Component\n *\n * Implements single-QR Nostr-first pairing for cross-device P2P connections.\n * Much simpler than the previous 2-QR WebRTC approach.\n */\n@Component({\n selector: 'hsuite-qr-pairing-step',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, IonIcon, IonSpinner, IonButton],\n template: `\n <div class=\"qr-pairing-container\">\n <!-- Hidden canvas for QR generation - always rendered -->\n <canvas #qrCanvas width=\"300\" height=\"300\" class=\"hidden-canvas\"></canvas>\n\n <!-- Loading State -->\n <div *ngIf=\"pairingState() === 'loading'\" class=\"state-panel loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <p>Generating secure connection...</p>\n </div>\n\n <!-- QR Display State -->\n <div *ngIf=\"pairingState() === 'displaying'\" class=\"qr-display\">\n <div class=\"qr-header\">\n <h3>Scan with Your Wallet</h3>\n <p class=\"qr-subtitle\">Open HSuite Wallet and scan this QR code</p>\n </div>\n\n <div class=\"qr-wrapper\">\n <canvas #qrCanvasDisplay width=\"300\" height=\"300\"></canvas>\n </div>\n\n <div class=\"qr-meta\">\n <div class=\"countdown\" [class.warning]=\"countdown() < 30\">\n <ion-icon name=\"time-outline\"></ion-icon>\n <span>{{ formatCountdown() }}</span>\n </div>\n <ion-button fill=\"clear\" size=\"small\" (click)=\"copyUri()\">\n <ion-icon\n slot=\"icon-only\"\n [name]=\"copied() ? 'checkmark-outline' : 'copy-outline'\"\n ></ion-icon>\n </ion-button>\n </div>\n\n <div class=\"instructions\">\n <ol>\n <li>Open HSuite Wallet on your phone</li>\n <li>Go to Sessions tab</li>\n <li>Tap \"Scan QR\" and scan this code</li>\n </ol>\n </div>\n </div>\n\n <!-- Waiting for Wallet State -->\n <div *ngIf=\"pairingState() === 'waiting_wallet'\" class=\"state-panel waiting\">\n <div class=\"waiting-icon-wrapper\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n <h3>Waiting for Wallet</h3>\n <p class=\"waiting-description\">Scan the QR code with your wallet app to connect.</p>\n </div>\n\n <!-- Waiting for Approval State -->\n <div *ngIf=\"pairingState() === 'waiting_approval'\" class=\"state-panel waiting-approval\">\n <div class=\"waiting-icon-wrapper\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n <h3>Waiting for Wallet Approval</h3>\n <p class=\"waiting-description\">\n The wallet is connected. Please approve the session in your wallet app.\n </p>\n <div class=\"waiting-steps\">\n <div class=\"waiting-step\">\n <span class=\"step-check\">✓</span>\n <span>QR code scanned</span>\n </div>\n <div class=\"waiting-step\">\n <span class=\"step-check\">✓</span>\n <span>Wallet connected</span>\n </div>\n <div class=\"waiting-step active\">\n <ion-spinner name=\"dots\"></ion-spinner>\n <span>Awaiting approval in wallet...</span>\n </div>\n </div>\n </div>\n\n <!-- Connected State -->\n <div *ngIf=\"pairingState() === 'connected'\" class=\"state-panel connected\">\n <ion-icon name=\"checkmark-circle-outline\" color=\"success\"></ion-icon>\n <p>Connected successfully!</p>\n </div>\n\n <!-- Error State -->\n <div *ngIf=\"pairingState() === 'error'\" class=\"state-panel error\">\n <ion-icon name=\"close-circle-outline\" color=\"danger\"></ion-icon>\n <p>{{ errorMessage || 'Connection failed' }}</p>\n <ion-button fill=\"outline\" (click)=\"refresh()\">\n <ion-icon slot=\"start\" name=\"refresh-outline\"></ion-icon>\n Try Again\n </ion-button>\n </div>\n\n <!-- Expired State -->\n <div *ngIf=\"pairingState() === 'expired'\" class=\"state-panel expired\">\n <ion-icon name=\"time-outline\" color=\"warning\"></ion-icon>\n <p>QR code expired</p>\n <ion-button fill=\"outline\" (click)=\"refresh()\">\n <ion-icon slot=\"start\" name=\"refresh-outline\"></ion-icon>\n Generate New\n </ion-button>\n </div>\n\n <!-- Footer Actions (cancel) - hidden during waiting/connected -->\n <div\n class=\"footer-actions\"\n *ngIf=\"!['waiting_wallet', 'waiting_approval', 'connected'].includes(pairingState())\"\n >\n <ion-button fill=\"clear\" (click)=\"cancel()\">\n <ion-icon slot=\"start\" name=\"arrow-back-outline\"></ion-icon>\n Cancel\n </ion-button>\n </div>\n </div>\n `,\n styles: [\n `\n .qr-pairing-container {\n display: flex;\n flex-direction: column;\n padding: 1rem;\n min-height: 400px;\n }\n\n .hidden-canvas {\n position: absolute;\n left: -9999px;\n top: -9999px;\n visibility: hidden;\n }\n\n .qr-display {\n display: flex;\n flex-direction: column;\n align-items: center;\n flex: 1;\n }\n\n .qr-header {\n text-align: center;\n margin-bottom: 1.5rem;\n }\n\n .qr-header h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n .qr-subtitle {\n margin: 0;\n color: var(--ion-color-medium-shade);\n font-size: 0.875rem;\n }\n\n .qr-wrapper {\n display: flex;\n justify-content: center;\n padding: 1rem;\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n margin-bottom: 1rem;\n }\n\n .qr-meta {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 1rem;\n margin-bottom: 1rem;\n }\n\n .countdown {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.75rem;\n background: var(--ion-color-light);\n border-radius: 1rem;\n font-size: 0.875rem;\n }\n\n .countdown.warning {\n background: var(--ion-color-warning-tint);\n color: var(--ion-color-warning-shade);\n }\n\n .instructions {\n margin-bottom: 1rem;\n width: 100%;\n max-width: 300px;\n }\n\n .instructions ol {\n text-align: left;\n padding-left: 1.25rem;\n margin: 0;\n }\n\n .instructions li {\n margin-bottom: 0.5rem;\n color: var(--ion-color-medium-shade);\n font-size: 0.875rem;\n }\n\n .state-panel {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n flex: 1;\n text-align: center;\n }\n\n .state-panel ion-spinner {\n width: 48px;\n height: 48px;\n }\n\n .state-panel ion-icon {\n font-size: 64px;\n }\n\n /* Waiting States */\n .waiting,\n .waiting-approval {\n padding: 1.5rem;\n }\n\n .waiting h3,\n .waiting-approval h3 {\n margin: 0 0 0.5rem 0;\n font-size: 1.25rem;\n font-weight: 600;\n color: var(--ion-color-primary);\n }\n\n .waiting-description {\n color: var(--ion-color-medium-shade);\n font-size: 0.9rem;\n margin-bottom: 1.5rem;\n max-width: 280px;\n }\n\n .waiting-icon-wrapper {\n width: 80px;\n height: 80px;\n border-radius: 50%;\n background: var(--ion-color-primary-tint);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 1rem;\n }\n\n .waiting-icon-wrapper ion-spinner {\n width: 40px;\n height: 40px;\n --color: var(--ion-color-primary);\n }\n\n .waiting-steps {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 1rem;\n background: var(--ion-color-light);\n border-radius: 12px;\n width: 100%;\n max-width: 280px;\n }\n\n .waiting-step {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 0.875rem;\n color: var(--ion-color-medium-shade);\n }\n\n .waiting-step .step-check {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--ion-color-success);\n color: white;\n font-size: 0.75rem;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .waiting-step.active {\n color: var(--ion-color-primary);\n font-weight: 500;\n }\n\n .waiting-step.active ion-spinner {\n width: 20px;\n height: 20px;\n --color: var(--ion-color-primary);\n }\n\n .footer-actions {\n margin-top: auto;\n padding-top: 1rem;\n border-top: 1px solid var(--ion-color-light);\n display: flex;\n justify-content: center;\n }\n `,\n ],\n})\nexport class QrPairingStepComponent implements AfterViewInit, OnChanges, OnDestroy {\n private readonly logger = inject(LoggerService).scoped('QrPairingStep');\n\n /**\n * The encoded offer data to display as QR code (hsc:connect?i=...)\n */\n @Input() offerData: string = '';\n\n /**\n * App name to display in instructions\n */\n @Input() appName: string = 'This app';\n\n /**\n * Whether currently loading/generating the offer\n */\n @Input() isLoading: boolean = false;\n\n /**\n * Whether waiting for wallet to connect via Nostr\n */\n @Input() isWaitingForWallet: boolean = false;\n\n /**\n * Whether waiting for wallet user to approve the session\n */\n @Input() isWaitingForApproval: boolean = false;\n\n /**\n * Error message if any\n */\n @Input() errorMessage: string | null = null;\n\n /**\n * Expiry time in seconds for the QR code\n */\n @Input() expirySeconds: number = 120;\n\n /**\n * Emitted when QR code expires\n */\n @Output() expired = new EventEmitter<void>();\n\n /**\n * Emitted when connection is established\n */\n @Output() connected = new EventEmitter<void>();\n\n /**\n * Emitted when user cancels/goes back\n */\n @Output() cancelled = new EventEmitter<void>();\n\n /**\n * Emitted when user requests refresh\n */\n @Output() refreshRequested = new EventEmitter<void>();\n\n @ViewChild('qrCanvas') qrCanvas?: ElementRef<HTMLCanvasElement>;\n @ViewChild('qrCanvasDisplay') qrCanvasDisplay?: ElementRef<HTMLCanvasElement>;\n\n // Internal state\n readonly pairingState = signal<QrPairingState>('loading');\n readonly countdown = signal<number>(120);\n readonly copied = signal<boolean>(false);\n\n private countdownInterval?: ReturnType<typeof setInterval>;\n private viewReady = false;\n private pendingQrGeneration = false;\n\n /**\n *\n */\n constructor() {\n addIcons({\n qrCodeOutline,\n refreshOutline,\n checkmarkCircleOutline,\n closeCircleOutline,\n phonePortraitOutline,\n arrowBackOutline,\n timeOutline,\n copyOutline,\n checkmarkOutline,\n });\n }\n\n /**\n *\n */\n ngAfterViewInit(): void {\n this.viewReady = true;\n // Generate QR if we have pending data\n if (this.pendingQrGeneration && this.offerData) {\n void this.generateQRCode(this.offerData);\n }\n }\n\n /**\n *\n * @param changes\n */\n ngOnChanges(changes: SimpleChanges): void {\n // Update state based on inputs\n if (\n changes['isLoading'] ||\n changes['isWaitingForWallet'] ||\n changes['isWaitingForApproval'] ||\n changes['offerData'] ||\n changes['errorMessage']\n ) {\n this.updateState();\n }\n\n if (changes['offerData'] && this.offerData) {\n if (this.viewReady) {\n void this.generateQRCode(this.offerData);\n } else {\n this.pendingQrGeneration = true;\n }\n }\n\n if (changes['expirySeconds']) {\n this.countdown.set(this.expirySeconds);\n }\n }\n\n /**\n *\n */\n ngOnDestroy(): void {\n this.stopCountdown();\n }\n\n /**\n * Format countdown for display (MM:SS)\n */\n formatCountdown(): string {\n const seconds = this.countdown();\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n }\n\n /**\n * Handle QR code expiry\n */\n onQrExpired(): void {\n this.pairingState.set('expired');\n this.expired.emit();\n }\n\n /**\n * Request a new QR code\n */\n refresh(): void {\n this.pairingState.set('loading');\n this.refreshRequested.emit();\n }\n\n /**\n * Go back / cancel\n */\n cancel(): void {\n this.cancelled.emit();\n }\n\n /**\n * Copy the offer URI to clipboard\n */\n async copyUri(): Promise<void> {\n if (!this.offerData) return;\n\n const success = await copyToClipboard(this.offerData);\n\n if (success) {\n this.copied.set(true);\n\n // Reset after 2 seconds\n setTimeout(() => {\n this.copied.set(false);\n }, 2000);\n } else {\n this.logger.error('Failed to copy URI');\n }\n }\n\n // ========== Private Methods ==========\n\n /**\n * Generate QR code with HSuite logo overlay\n * @param data\n */\n private async generateQRCode(data: string): Promise<void> {\n const canvas = this.qrCanvas?.nativeElement;\n if (!canvas) {\n this.logger.warn('Canvas not available for QR generation');\n return;\n }\n\n try {\n // Generate QR code - session invites are small (~300 bytes), so we can use higher error correction\n await QRCode.toCanvas(canvas, data, {\n width: 300,\n margin: 2,\n color: {\n dark: '#000000',\n light: '#ffffff',\n },\n errorCorrectionLevel: 'M', // Medium error correction\n });\n\n // Add HSuite logo in center\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n // Load logo\n const logo = new Image();\n logo.crossOrigin = 'anonymous';\n logo.onload = () => {\n // Logo size is 20% of QR code\n const logoSize = Math.floor(canvas.width * 0.2);\n const logoX = (canvas.width - logoSize) / 2;\n const logoY = (canvas.height - logoSize) / 2;\n\n // Draw white background circle for logo\n const circlePadding = 4;\n ctx.fillStyle = '#ffffff';\n ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, logoSize / 2 + circlePadding, 0, 2 * Math.PI);\n ctx.fill();\n\n // Draw logo\n ctx.drawImage(logo, logoX, logoY, logoSize, logoSize);\n\n // Show the QR display and copy to visible canvas\n this.pairingState.set('displaying');\n this.startCountdown();\n\n // Copy to display canvas after a tick\n setTimeout(() => this.copyToDisplayCanvas(), 0);\n };\n logo.onerror = () => {\n // Still show QR even without logo\n this.pairingState.set('displaying');\n this.startCountdown();\n setTimeout(() => this.copyToDisplayCanvas(), 0);\n };\n logo.src = '/assets/hsuite_icon.png';\n } catch (error) {\n this.logger.error('Failed to generate QR code', {\n error: error instanceof Error ? error.message : String(error),\n });\n this.pairingState.set('error');\n }\n }\n\n /**\n * Copy the generated QR from hidden canvas to display canvas\n */\n private copyToDisplayCanvas(): void {\n const srcCanvas = this.qrCanvas?.nativeElement;\n const destCanvas = this.qrCanvasDisplay?.nativeElement;\n\n if (!srcCanvas || !destCanvas) {\n this.logger.warn('Cannot copy to display canvas - missing canvas elements');\n return;\n }\n\n const destCtx = destCanvas.getContext('2d');\n if (!destCtx) return;\n\n destCtx.drawImage(srcCanvas, 0, 0);\n }\n\n /**\n * Start countdown timer\n */\n private startCountdown(): void {\n this.stopCountdown();\n this.countdown.set(this.expirySeconds);\n\n this.countdownInterval = setInterval(() => {\n const current = this.countdown();\n if (current <= 1) {\n this.stopCountdown();\n this.onQrExpired();\n } else {\n this.countdown.set(current - 1);\n }\n }, 1000);\n }\n\n /**\n * Stop countdown timer\n */\n private stopCountdown(): void {\n if (this.countdownInterval) {\n clearInterval(this.countdownInterval);\n this.countdownInterval = undefined;\n }\n }\n\n /**\n * Update internal state based on inputs.\n * Priority: error > waiting_approval > waiting_wallet > loading\n */\n private updateState(): void {\n if (this.errorMessage) {\n this.pairingState.set('error');\n } else if (this.isWaitingForApproval) {\n this.pairingState.set('waiting_approval');\n } else if (this.isWaitingForWallet) {\n this.pairingState.set('waiting_wallet');\n } else if (this.isLoading && !this.offerData) {\n this.pairingState.set('loading');\n }\n // Note: 'displaying' is set after QR generation completes\n }\n}\n","/**\n * @file wallet-connection-modal.component.ts\n * @description Multi-protocol wallet connection modal with step-by-step flow\n *\n * Provides a beautiful, user-friendly interface for connecting wallets across\n * multiple protocols (HSuite Native, WalletConnect) and ledgers (Hedera, XRPL).\n *\n * Features:\n * - Step-by-step connection wizard with direct selection (no Next button)\n * - Dynamic step indicator showing only relevant steps per protocol path\n * - Network selection (Mainnet, Testnet)\n * - Protocol selection (HSuite Native vs WalletConnect)\n * - Connection method selection (Desktop or Mobile QR)\n * - Ledger selection (Hedera, XRPL) for WalletConnect\n * - QR code display for mobile P2P connections\n * - Beautiful animations and loading states\n *\n * Step Paths:\n * - HSuite Native + Desktop: Network → Protocol → Method (3 steps)\n * - HSuite Native + Mobile QR: Network → Protocol → Method → QR Pairing (4 steps)\n * - WalletConnect: Network → Protocol → Ledger → Connect (4 steps)\n */\n\nimport { CommonModule } from '@angular/common';\nimport { Component, Input, Output, EventEmitter, signal, computed, inject } from '@angular/core';\nimport { getLogger } from '@hsuite/native-connect-sdk';\nimport { IonicModule, ModalController, Platform } from '@ionic/angular';\n\nimport type { WalletConnectV2Config } from '../../models/provider-types';\nimport { DEFAULT_WALLET_URL } from '../../models/provider-types';\nimport { P2PNativeProvider } from '../../providers/p2p-native/p2p-native.provider';\nimport { UnifiedWalletService } from '../../services/unified-wallet.service';\n\nimport {\n ConnectionMethodStepComponent,\n type ConnectionMethodOption,\n} from './connection-method-step/connection-method-step.component';\nimport { QrPairingStepComponent } from './qr-pairing-step/qr-pairing-step.component';\n\nconst logger = getLogger().scoped?.('WalletConnectionModal') ?? getLogger();\n\n/**\n * Connection step enumeration for the wizard flow\n */\nenum ConnectionStep {\n NetworkSelection = 1,\n ProtocolSelection = 2,\n ConnectionMethodSelection = 3,\n LedgerSelection = 4,\n QrPairing = 5,\n ConnectionProgress = 6,\n}\n\n/**\n * Connection method type.\n * - desktop: Uses extension if available, otherwise opens PWA in new tab (SDK auto-selects)\n * - mobile-qr: Two-way QR scan for cross-device P2P connection\n */\ntype ConnectionMethod = 'desktop' | 'mobile-qr';\n\n/**\n * Network configuration options\n */\ninterface NetworkOption {\n id: string;\n name: string;\n description: string;\n icon?: string;\n recommended?: boolean;\n}\n\n/**\n * Protocol configuration options\n */\ninterface ProtocolOption {\n id: 'hsuite-native' | 'walletconnect';\n name: string;\n description: string;\n icon: string;\n features: string[];\n}\n\n/**\n * Ledger configuration options\n */\ninterface LedgerOption {\n id: 'hedera' | 'xrpl';\n name: string;\n description: string;\n icon: string;\n}\n\n/**\n * Step configuration for dynamic step indicator.\n * Defines the total steps and labels based on selected protocol path.\n */\ninterface StepConfig {\n /** Total number of steps in the current path */\n total: number;\n /** Labels for each step in the progress indicator */\n labels: string[];\n}\n\n/**\n * Main wallet connection modal component.\n * Orchestrates the multi-step connection flow.\n */\n@Component({\n selector: 'hsuite-wallet-connection-modal',\n standalone: true,\n imports: [CommonModule, IonicModule, ConnectionMethodStepComponent, QrPairingStepComponent],\n templateUrl: './wallet-connection-modal.component.html',\n styleUrls: ['./wallet-connection-modal.component.scss'],\n})\nexport class WalletConnectionModalComponent {\n /**\n * WalletConnect project ID (required for WalletConnect)\n */\n @Input() projectId?: string;\n\n /**\n * App name for WalletConnect metadata\n */\n @Input() appName: string = 'HSuite Demo';\n\n /**\n * App description for WalletConnect metadata\n */\n @Input() appDescription: string = 'Multi-chain wallet connection';\n\n /**\n * Wallet URL for HSuite Native connection\n */\n @Input() walletUrl: string = DEFAULT_WALLET_URL;\n\n /**\n * Event emitted when connection is successful\n */\n @Output() connected = new EventEmitter<unknown>();\n\n // Note: answerScannerRequested removed - new Nostr-first flow doesn't need answer scanning\n\n private readonly platform = inject(Platform);\n private readonly p2pNativeProvider = inject(P2PNativeProvider);\n\n // Step management\n readonly currentStep = signal<ConnectionStep>(ConnectionStep.NetworkSelection);\n readonly ConnectionStep = ConnectionStep;\n\n // Selection state\n readonly selectedNetwork = signal<string>('testnet');\n readonly selectedProtocol = signal<'hsuite-native' | 'walletconnect' | null>(null);\n readonly selectedConnectionMethod = signal<ConnectionMethod | null>(null);\n readonly selectedLedger = signal<'hedera' | 'xrpl' | null>(null);\n\n // Loading state\n readonly isConnecting = signal<boolean>(false);\n readonly connectionError = signal<string | null>(null);\n\n // QR Pairing state\n readonly pairingOffer = signal<string>('');\n readonly isGeneratingOffer = signal<boolean>(false);\n\n /**\n * Indicates we're waiting for the wallet to scan the QR and connect via Nostr.\n */\n readonly isWaitingForWallet = signal<boolean>(false);\n\n /**\n * Indicates we're waiting for the wallet user to approve the session.\n * Nostr connection is established, but session approval is pending.\n */\n readonly isWaitingForApproval = signal<boolean>(false);\n\n // Platform detection\n readonly isMobile = signal<boolean>(this.detectMobile());\n readonly isExtensionAvailable = signal<boolean>(this.detectExtension());\n\n // Configuration options\n readonly networkOptions: NetworkOption[] = [\n {\n id: 'mainnet',\n name: 'Mainnet',\n description: 'Production network with real assets',\n icon: 'shield-checkmark',\n },\n {\n id: 'testnet',\n name: 'Testnet',\n description: 'Test network for development',\n icon: 'flask',\n recommended: true,\n },\n ];\n\n readonly protocolOptions = computed<ProtocolOption[]>(() => {\n const options: ProtocolOption[] = [\n {\n id: 'hsuite-native',\n name: 'HSuite Native Connect',\n description: 'Direct connection to HSuite Wallet',\n icon: 'link',\n features: [\n 'Multiple chains in one session',\n 'Multiple wallets per session',\n 'Seamless multi-chain operations',\n 'Best for HSuite Wallet users',\n ],\n },\n ];\n\n // Only show WalletConnect if projectId is provided\n if (this.projectId) {\n options.push({\n id: 'walletconnect',\n name: 'WalletConnect',\n description: 'Universal wallet connection protocol',\n icon: 'scan',\n features: [\n 'Connect via QR code or extension',\n 'Compatible with HashPack, Kabila, and more',\n 'Industry-standard protocol',\n 'One wallet per session',\n ],\n });\n }\n\n return options;\n });\n\n readonly ledgerOptions: LedgerOption[] = [\n {\n id: 'hedera',\n name: 'Hedera',\n description: 'Hedera Hashgraph network',\n icon: 'logo-bitcoin', // Placeholder, use actual Hedera icon\n },\n {\n id: 'xrpl',\n name: 'XRP Ledger',\n description: 'XRP Ledger network',\n icon: 'logo-usd', // Placeholder, use actual XRPL icon\n },\n ];\n\n /**\n * Connection method options for HSuite Native.\n * Simplified to two options:\n * - HSuite Wallet (desktop): SDK auto-selects extension or PWA\n * - Mobile Wallet (QR): Cross-device P2P connection\n */\n readonly connectionMethodOptions = computed<ConnectionMethodOption[]>(() => [\n {\n id: 'desktop',\n name: 'HSuite Wallet',\n description: this.isExtensionAvailable()\n ? 'Connect via browser extension'\n : 'Open HSuite Wallet in new tab',\n icon: this.isExtensionAvailable() ? 'extension-puzzle-outline' : 'open-outline',\n available: true,\n recommended: !this.isMobile(),\n features: this.isExtensionAvailable()\n ? ['Extension detected', 'Fastest connection']\n : ['Opens in new tab', 'Works everywhere'],\n },\n {\n id: 'mobile-qr',\n name: 'Mobile Wallet (QR)',\n description: 'Two-way QR scan for cross-device connection',\n icon: 'qr-code-outline',\n available: true,\n recommended: this.isMobile(),\n features: ['Cross-device', 'P2P', 'No server needed'],\n },\n ]);\n\n // Computed properties\n readonly canProceed = computed(() => {\n const step = this.currentStep();\n switch (step) {\n case ConnectionStep.NetworkSelection:\n return !!this.selectedNetwork();\n case ConnectionStep.ProtocolSelection:\n return !!this.selectedProtocol();\n case ConnectionStep.ConnectionMethodSelection:\n return !!this.selectedConnectionMethod();\n case ConnectionStep.LedgerSelection:\n return !!this.selectedLedger();\n default:\n return false;\n }\n });\n\n readonly stepTitle = computed(() => {\n const step = this.currentStep();\n switch (step) {\n case ConnectionStep.NetworkSelection:\n return 'Select Network';\n case ConnectionStep.ProtocolSelection:\n return 'Choose Connection Protocol';\n case ConnectionStep.ConnectionMethodSelection:\n return 'Choose Connection Method';\n case ConnectionStep.LedgerSelection:\n return 'Select Ledger';\n case ConnectionStep.QrPairing:\n return 'Connect Mobile Wallet';\n case ConnectionStep.ConnectionProgress:\n return 'Connecting...';\n default:\n return '';\n }\n });\n\n /**\n * Dynamic step configuration based on selected protocol and connection method.\n * Returns the total number of steps and labels for the progress indicator.\n *\n * Step Paths:\n * - Initial (no protocol): 3 placeholder steps\n * - HSuite Native + Desktop: 3 steps (Network, Protocol, Method)\n * - HSuite Native + Mobile QR: 4 steps (Network, Protocol, Method, Pair)\n * - WalletConnect: 4 steps (Network, Protocol, Ledger, Connect)\n */\n readonly stepConfig = computed<StepConfig>(() => {\n const protocol = this.selectedProtocol();\n const method = this.selectedConnectionMethod();\n\n // Initial state: show 3 placeholder steps until protocol is selected\n if (!protocol) {\n return { total: 3, labels: ['Network', 'Protocol', '...'] };\n }\n\n // HSuite Native path\n if (protocol === 'hsuite-native') {\n // If mobile QR is selected, we need 4 steps\n if (method === 'mobile-qr') {\n return { total: 4, labels: ['Network', 'Protocol', 'Method', 'Pair'] };\n }\n // Desktop connection is 3 steps (connects immediately after method selection)\n return { total: 3, labels: ['Network', 'Protocol', 'Method'] };\n }\n\n // WalletConnect path: 4 steps\n return { total: 4, labels: ['Network', 'Protocol', 'Ledger', 'Connect'] };\n });\n\n /**\n * Maps the internal ConnectionStep enum to display position (1-based).\n * Different protocol paths have different step mappings.\n */\n readonly displayStep = computed<number>(() => {\n const step = this.currentStep();\n // Protocol could be used for protocol-specific step mapping in the future\n const _protocol = this.selectedProtocol();\n\n // Map internal step to display position based on protocol path\n switch (step) {\n case ConnectionStep.NetworkSelection:\n return 1;\n case ConnectionStep.ProtocolSelection:\n return 2;\n case ConnectionStep.ConnectionMethodSelection:\n return 3;\n case ConnectionStep.LedgerSelection:\n // WalletConnect ledger selection is step 3\n return 3;\n case ConnectionStep.QrPairing:\n // QR pairing is step 4 for both paths that use it\n return 4;\n case ConnectionStep.ConnectionProgress:\n // Connection progress is always the last step\n return this.stepConfig().total;\n default:\n return 1;\n }\n });\n\n /**\n *\n * @param modalController\n * @param unifiedWalletService\n */\n constructor(\n private modalController: ModalController,\n private unifiedWalletService: UnifiedWalletService,\n ) {\n // Set up mobile provider connection callback\n this.p2pNativeProvider.onPeerConnected(() => {\n this.onMobileConnected();\n });\n }\n\n /**\n * Select a network option (internal, use selectNetworkAndProceed for UI)\n * @param networkId\n */\n selectNetwork(networkId: string): void {\n this.selectedNetwork.set(networkId);\n }\n\n /**\n * Select a network and automatically proceed to the next step.\n * This enables direct selection behavior without requiring a \"Next\" button.\n * @param networkId - The network ID to select ('mainnet' or 'testnet')\n */\n selectNetworkAndProceed(networkId: string): void {\n this.selectedNetwork.set(networkId);\n // Auto-advance to protocol selection\n this.currentStep.set(ConnectionStep.ProtocolSelection);\n }\n\n /**\n * Select a protocol option (internal, use selectProtocolAndProceed for UI)\n * @param protocolId\n */\n selectProtocol(protocolId: 'hsuite-native' | 'walletconnect'): void {\n this.selectedProtocol.set(protocolId);\n }\n\n /**\n * Select a protocol and automatically proceed to the appropriate next step.\n * - HSuite Native → Connection Method Selection\n * - WalletConnect → Ledger Selection\n * @param protocolId - The protocol ID to select\n */\n selectProtocolAndProceed(protocolId: 'hsuite-native' | 'walletconnect'): void {\n this.selectedProtocol.set(protocolId);\n\n if (protocolId === 'hsuite-native') {\n // HSuite Native: Go to connection method selection\n this.currentStep.set(ConnectionStep.ConnectionMethodSelection);\n } else {\n // WalletConnect: Go to ledger selection\n this.currentStep.set(ConnectionStep.LedgerSelection);\n }\n }\n\n /**\n * Select a connection method (internal)\n * @param methodId\n */\n selectConnectionMethod(methodId: string): void {\n this.selectedConnectionMethod.set(methodId as ConnectionMethod);\n }\n\n /**\n * Handle connection method selection from step component.\n * Automatically proceeds to connect or QR pairing based on method.\n * @param methodId\n */\n onConnectionMethodSelected(methodId: string): void {\n this.selectConnectionMethod(methodId);\n void this.next();\n }\n\n /**\n * Select a ledger option (internal, use selectLedgerAndConnect for UI)\n * @param ledgerId\n */\n selectLedger(ledgerId: 'hedera' | 'xrpl'): void {\n this.selectedLedger.set(ledgerId);\n }\n\n /**\n * Select a ledger and automatically initiate connection.\n * This enables direct selection behavior for WalletConnect ledger step.\n * @param ledgerId - The ledger ID to select ('hedera' or 'xrpl')\n */\n selectLedgerAndConnect(ledgerId: 'hedera' | 'xrpl'): void {\n this.selectedLedger.set(ledgerId);\n // Auto-connect with the selected ledger\n void this.connect();\n }\n\n /**\n * Proceed to the next step in the wizard\n */\n async next(): Promise<void> {\n const currentStep = this.currentStep();\n\n if (currentStep === ConnectionStep.NetworkSelection) {\n this.currentStep.set(ConnectionStep.ProtocolSelection);\n } else if (currentStep === ConnectionStep.ProtocolSelection) {\n const protocol = this.selectedProtocol();\n if (protocol === 'hsuite-native') {\n // HSuite Native: Show connection method selection\n this.currentStep.set(ConnectionStep.ConnectionMethodSelection);\n } else {\n // WalletConnect: Show ledger selection\n this.currentStep.set(ConnectionStep.LedgerSelection);\n }\n } else if (currentStep === ConnectionStep.ConnectionMethodSelection) {\n const method = this.selectedConnectionMethod();\n if (method === 'mobile-qr') {\n // Mobile QR: Show QR pairing step\n await this.initiateQrPairing();\n } else {\n // Desktop: Connect directly (SDK auto-selects extension or PWA)\n await this.connect();\n }\n } else if (currentStep === ConnectionStep.LedgerSelection) {\n // Connect with selected ledger\n await this.connect();\n }\n }\n\n /**\n * Go back to the previous step\n */\n back(): void {\n const currentStep = this.currentStep();\n if (currentStep === ConnectionStep.ProtocolSelection) {\n this.currentStep.set(ConnectionStep.NetworkSelection);\n } else if (currentStep === ConnectionStep.ConnectionMethodSelection) {\n this.currentStep.set(ConnectionStep.ProtocolSelection);\n } else if (currentStep === ConnectionStep.LedgerSelection) {\n this.currentStep.set(ConnectionStep.ProtocolSelection);\n } else if (currentStep === ConnectionStep.QrPairing) {\n this.currentStep.set(ConnectionStep.ConnectionMethodSelection);\n this.pairingOffer.set('');\n this.connectionError.set(null);\n } else if (currentStep === ConnectionStep.ConnectionProgress) {\n // Go back to appropriate step based on protocol and method\n const protocol = this.selectedProtocol();\n const method = this.selectedConnectionMethod();\n if (protocol === 'walletconnect') {\n this.currentStep.set(ConnectionStep.LedgerSelection);\n } else if (method === 'mobile-qr') {\n this.currentStep.set(ConnectionStep.QrPairing);\n } else {\n this.currentStep.set(ConnectionStep.ConnectionMethodSelection);\n }\n // Clear error state\n this.connectionError.set(null);\n this.isConnecting.set(false);\n }\n }\n\n /**\n * Connect to the selected protocol and ledger\n */\n private async connect(): Promise<void> {\n this.currentStep.set(ConnectionStep.ConnectionProgress);\n this.isConnecting.set(true);\n this.connectionError.set(null);\n\n try {\n const protocol = this.selectedProtocol();\n const network = this.selectedNetwork();\n\n if (protocol === 'hsuite-native') {\n // Connect to HSuite Native (multi-chain by default)\n // Use the input walletUrl and pass targetWindow metadata for consistent window naming\n await this.unifiedWalletService.connect('hsuite-native', {\n type: 'hsuite-native',\n appId: 'hsuite-demo',\n appName: this.appName,\n ledgerId: 'multi-chain',\n networkId: network || 'testnet',\n walletUrl: this.walletUrl,\n metadata: {\n targetWindow: 'hsuite-wallet',\n },\n });\n } else if (protocol === 'walletconnect') {\n // Connect to WalletConnect (ledger-specific)\n const ledger = this.selectedLedger();\n if (!ledger) {\n throw new Error('No ledger selected');\n }\n\n if (!this.projectId) {\n throw new Error(\n 'WalletConnect projectId is required. Get one from https://cloud.walletconnect.com',\n );\n }\n\n const config: WalletConnectV2Config = {\n type: 'walletconnect-v2',\n projectId: this.projectId,\n ledgerId: ledger,\n networkId: `${ledger}:${network}`,\n appName: this.appName,\n appDescription: this.appDescription,\n };\n\n await this.unifiedWalletService.connect('walletconnect-v2', config);\n }\n\n // Success! Emit event and close modal\n this.connected.emit({ protocol, network });\n await this.modalController.dismiss({ connected: true });\n } catch (error) {\n logger.error('Connection failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n this.connectionError.set(\n error instanceof Error ? error.message : 'Connection failed. Please try again.',\n );\n this.isConnecting.set(false);\n // Stay on ConnectionProgress to show the error and \"Try Again\" button\n // Don't auto-navigate away - let user click \"Try Again\" which calls back()\n }\n }\n\n /**\n * Close the modal without connecting\n */\n async dismiss(): Promise<void> {\n await this.modalController.dismiss({ connected: false });\n }\n\n // ========== QR Pairing Methods ==========\n\n /**\n * Initiate QR pairing flow for mobile connection (Nostr-first protocol).\n *\n * Flow:\n * 1. Generate session invite QR code\n * 2. Wait for wallet to scan and connect via Nostr\n * 3. Wait for wallet user to approve session\n * 4. P2P upgrade happens automatically in background\n */\n private async initiateQrPairing(): Promise<void> {\n this.currentStep.set(ConnectionStep.QrPairing);\n this.isGeneratingOffer.set(true);\n this.connectionError.set(null);\n\n try {\n const network = this.selectedNetwork();\n const result = await this.p2pNativeProvider.createPairingOffer({\n type: 'mobile-native',\n appId: 'hsuite-dapp',\n appName: this.appName,\n ledgerId: 'multi-chain',\n networkId: network || 'testnet',\n });\n\n this.pairingOffer.set(result.qrData);\n this.isGeneratingOffer.set(false);\n this.isWaitingForWallet.set(true);\n\n // Start waiting for wallet to connect and approve\n this.waitForWalletApproval();\n } catch (error) {\n logger.error('Failed to create pairing offer', { error });\n this.connectionError.set(\n error instanceof Error ? error.message : 'Failed to generate QR code',\n );\n this.isGeneratingOffer.set(false);\n }\n }\n\n /**\n * Wait for wallet to connect via Nostr and approve the session.\n * This is the new single-QR flow - no answer scanning needed.\n */\n private async waitForWalletApproval(): Promise<void> {\n try {\n // This blocks until wallet scans QR, connects via Nostr, and user approves\n const session = await this.p2pNativeProvider.waitForSessionApproval();\n\n logger.info('Session approved by wallet', {\n sessionId: session?.sessionId,\n accounts: session?.accounts?.length,\n });\n\n this.onMobileConnected();\n } catch (error) {\n // Only show error if we're still on the QR pairing step (not cancelled)\n if (this.currentStep() === ConnectionStep.QrPairing) {\n logger.error('Session approval failed', { error });\n this.connectionError.set(\n error instanceof Error ? error.message : 'Session approval failed or rejected',\n );\n }\n this.isWaitingForWallet.set(false);\n this.isWaitingForApproval.set(false);\n }\n }\n\n /**\n * Handle QR code expiry\n */\n onQrExpired(): void {\n logger.debug('QR code expired');\n this.pairingOffer.set('');\n this.isWaitingForWallet.set(false);\n }\n\n /**\n * Refresh the QR pairing offer\n */\n async onQrRefresh(): Promise<void> {\n this.isWaitingForWallet.set(false);\n this.isWaitingForApproval.set(false);\n await this.initiateQrPairing();\n }\n\n /**\n * Handle successful mobile connection\n */\n private onMobileConnected(): void {\n logger.info('Mobile wallet connected');\n this.connected.emit({ protocol: 'mobile-native', method: 'qr' });\n void this.modalController.dismiss({ connected: true });\n }\n\n // ========== Platform Detection ==========\n\n /**\n * Detect if running on mobile device\n */\n private detectMobile(): boolean {\n return this.platform.is('mobile') || this.platform.is('android') || this.platform.is('ios');\n }\n\n /**\n * Detect if HSuite extension is available.\n * Checks for the flag injected by the extension's content script.\n */\n private detectExtension(): boolean {\n if (typeof window === 'undefined') return false;\n // Check for HSuite extension marker (injected by extension's inject-flags.ts)\n return (\n (window as unknown as { __HSUITE_WALLET_EXTENSION__?: boolean })\n .__HSUITE_WALLET_EXTENSION__ === true\n );\n }\n}\n","<ion-content>\n <div class=\"modal-inner-content wallet-connection-modal\">\n <div class=\"header\">\n <div class=\"title\">\n <ion-button\n *ngIf=\"currentStep() > 1 && currentStep() !== ConnectionStep.ConnectionProgress\"\n (click)=\"back()\"\n fill=\"clear\"\n class=\"back-btn\"\n >\n <ion-icon slot=\"icon-only\" name=\"arrow-back-outline\"></ion-icon>\n </ion-button>\n <p>{{ stepTitle() }}</p>\n </div>\n <ion-button class=\"close-modal\" (click)=\"dismiss()\" fill=\"clear\" [disabled]=\"isConnecting()\">\n <ion-icon slot=\"icon-only\" name=\"close-outline\"></ion-icon>\n </ion-button>\n </div>\n\n <!-- Dynamic Step Progress Indicator -->\n <div class=\"dao-header\">\n <div class=\"step-progress\">\n <!-- Dynamic steps based on selected protocol path -->\n <ng-container *ngFor=\"let label of stepConfig().labels; let i = index\">\n <div class=\"step-indicator\">\n <div\n class=\"step-circle\"\n [class.active]=\"displayStep() === i + 1\"\n [class.completed]=\"displayStep() > i + 1\"\n [attr.title]=\"label\"\n >\n <ion-icon *ngIf=\"displayStep() > i + 1\" name=\"checkmark\"></ion-icon>\n <span *ngIf=\"displayStep() <= i + 1\">{{ i + 1 }}</span>\n </div>\n <!-- Step line between circles (not after the last one) -->\n <div\n class=\"step-line\"\n *ngIf=\"i < stepConfig().labels.length - 1\"\n [class.active]=\"displayStep() > i + 1\"\n ></div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div class=\"form\">\n <!-- Step 1: Network Selection (Direct Selection - click advances to next step) -->\n <div *ngIf=\"currentStep() === ConnectionStep.NetworkSelection\" class=\"step-content\">\n <div class=\"membership-section\">\n <div class=\"explanation\">\n <h3>Choose Network</h3>\n <p>Select the network you want to connect to.</p>\n </div>\n\n <div class=\"options-grid direct-select\">\n <ion-card\n *ngFor=\"let network of networkOptions\"\n (click)=\"selectNetworkAndProceed(network.id)\"\n [class.selected]=\"selectedNetwork() === network.id\"\n button\n >\n <ion-card-content>\n <div class=\"option-icon\">\n <ion-icon [name]=\"network.icon\"></ion-icon>\n </div>\n <h3>{{ network.name }}</h3>\n <p>{{ network.description }}</p>\n <ion-badge *ngIf=\"network.recommended\" color=\"success\">Recommended</ion-badge>\n </ion-card-content>\n </ion-card>\n </div>\n </div>\n </div>\n\n <!-- Step 2: Protocol Selection (Direct Selection - click advances to next step) -->\n <div *ngIf=\"currentStep() === ConnectionStep.ProtocolSelection\" class=\"step-content\">\n <div class=\"membership-section\">\n <div class=\"explanation\">\n <h3>Connection Protocol</h3>\n <p>Choose how you want to connect your wallet.</p>\n </div>\n\n <div class=\"options-list direct-select\">\n <ion-card\n *ngFor=\"let protocol of protocolOptions()\"\n (click)=\"selectProtocolAndProceed(protocol.id)\"\n [class.selected]=\"selectedProtocol() === protocol.id\"\n button\n >\n <ion-card-content>\n <div class=\"protocol-header\">\n <div class=\"option-icon\">\n <ion-icon [name]=\"protocol.icon\"></ion-icon>\n </div>\n <div class=\"protocol-info\">\n <h3>{{ protocol.name }}</h3>\n <p>{{ protocol.description }}</p>\n </div>\n </div>\n\n <ul class=\"feature-list\">\n <li *ngFor=\"let feature of protocol.features\">\n <ion-icon name=\"checkmark-circle\" color=\"success\"></ion-icon>\n <span>{{ feature }}</span>\n </li>\n </ul>\n </ion-card-content>\n </ion-card>\n </div>\n </div>\n </div>\n\n <!-- Step 3: Connection Method Selection (HSuite Native only) -->\n <div *ngIf=\"currentStep() === ConnectionStep.ConnectionMethodSelection\" class=\"step-content\">\n <hsuite-connection-method-step\n [methods]=\"connectionMethodOptions()\"\n [isMobile]=\"isMobile()\"\n [selectedMethod]=\"selectedConnectionMethod()\"\n (methodSelected)=\"onConnectionMethodSelected($event)\"\n ></hsuite-connection-method-step>\n </div>\n\n <!-- Step 3 (WalletConnect path): Ledger Selection (Direct Selection - click initiates connection) -->\n <div *ngIf=\"currentStep() === ConnectionStep.LedgerSelection\" class=\"step-content\">\n <div class=\"membership-section\">\n <div class=\"explanation\">\n <h3>Choose Blockchain</h3>\n <p>Select the blockchain ledger to connect with.</p>\n </div>\n\n <div class=\"options-grid direct-select\">\n <ion-card\n *ngFor=\"let ledger of ledgerOptions\"\n (click)=\"selectLedgerAndConnect(ledger.id)\"\n [class.selected]=\"selectedLedger() === ledger.id\"\n button\n >\n <ion-card-content>\n <div class=\"option-icon\">\n <ion-icon [name]=\"ledger.icon\"></ion-icon>\n </div>\n <h3>{{ ledger.name }}</h3>\n <p>{{ ledger.description }}</p>\n </ion-card-content>\n </ion-card>\n </div>\n </div>\n </div>\n\n <!-- Step 5: QR Pairing (Mobile P2P - Nostr-first, single QR) -->\n <div *ngIf=\"currentStep() === ConnectionStep.QrPairing\" class=\"step-content\">\n <hsuite-qr-pairing-step\n [offerData]=\"pairingOffer()\"\n [appName]=\"appName\"\n [isLoading]=\"isGeneratingOffer()\"\n [isWaitingForWallet]=\"isWaitingForWallet()\"\n [isWaitingForApproval]=\"isWaitingForApproval()\"\n [errorMessage]=\"connectionError()\"\n (expired)=\"onQrExpired()\"\n (refreshRequested)=\"onQrRefresh()\"\n (cancelled)=\"back()\"\n ></hsuite-qr-pairing-step>\n </div>\n\n <!-- Step 6: Connection Progress -->\n <div *ngIf=\"currentStep() === ConnectionStep.ConnectionProgress\" class=\"step-content\">\n <div class=\"membership-section connection-progress\">\n <div *ngIf=\"isConnecting()\" class=\"status-info\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n <h3>Connecting...</h3>\n <p *ngIf=\"selectedProtocol() === 'walletconnect'\">\n Please approve the connection in your wallet app or scan the QR code.\n </p>\n <p *ngIf=\"selectedProtocol() === 'hsuite-native'\">Opening HSuite Wallet...</p>\n </div>\n\n <div *ngIf=\"connectionError()\" class=\"membership-section\">\n <div class=\"error-section\">\n <ion-item lines=\"none\">\n <ion-icon slot=\"start\" name=\"alert-circle-outline\" color=\"danger\"></ion-icon>\n <ion-label>\n <h3>Connection Failed</h3>\n <p>{{ connectionError() }}</p>\n </ion-label>\n </ion-item>\n </div>\n <ion-button expand=\"block\" fill=\"outline\" (click)=\"back()\" class=\"ion-margin-top\">\n Try Again\n </ion-button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer removed: All steps now use direct selection (click to proceed) -->\n </div>\n</ion-content>\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\nimport { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, inject } from '@angular/core';\nimport { getLogger } from '@hsuite/native-connect-sdk';\nimport { IonButton, IonIcon, IonSpinner, ModalController } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { walletOutline, linkOutline, checkmarkCircleOutline } from 'ionicons/icons';\n\nimport { DEFAULT_WALLET_URL } from '../../models/provider-types';\nimport { UnifiedWalletService } from '../../services/unified-wallet.service';\nimport { WalletConnectionModalComponent } from '../wallet-connection-modal/wallet-connection-modal.component';\n\nconst logger = getLogger().scoped?.('WalletConnectButton') ?? getLogger();\n\n/**\n * @component WalletConnectButtonComponent\n * Ready-to-use wallet connection button for dApps with multi-protocol support.\n *\n * **Features:**\n * - Beautiful connection modal with protocol/network selection\n * - Support for HSuite Native and WalletConnect\n * - Automatic connection state management\n * - Loading states\n * - Session display\n * - One-click connect/disconnect\n * - Theme-aware styling\n *\n * **Design Principles:**\n * - Easy configuration\n * - Fully customizable appearance\n * - Accessible\n * - Responsive\n */\n@Component({\n selector: 'wallet-connect-button',\n standalone: true,\n imports: [CommonModule, IonButton, IonIcon, IonSpinner],\n providers: [ModalController],\n templateUrl: './wallet-connect-button.component.html',\n styleUrls: ['./wallet-connect-button.component.scss'],\n})\nexport class WalletConnectButtonComponent {\n /**\n * WalletConnect project ID (required for WalletConnect)\n */\n @Input() walletConnectProjectId?: string;\n\n /**\n * App name for wallet metadata\n */\n @Input() appName: string = 'HSuite Demo';\n\n /**\n * App description for wallet metadata\n */\n @Input() appDescription: string = 'Multi-chain wallet connection';\n\n /**\n * Wallet URL for targeting the wallet window\n */\n @Input() walletUrl = DEFAULT_WALLET_URL;\n\n /**\n * Whether to show session information when connected\n * @default true\n */\n @Input() showSessionInfo = true;\n\n /**\n * Button color (Ionic color)\n * @default 'primary'\n */\n @Input() buttonColor: string = 'primary';\n\n /**\n * Button size\n * @default 'default'\n */\n @Input() size: 'small' | 'default' | 'large' = 'default';\n\n /**\n * Custom button text for connect state\n */\n @Input() connectText = 'Connect Wallet';\n\n /**\n * Custom button text for when wallets are connected (multi-session mode)\n */\n @Input() connectedText = 'Add Another Wallet';\n\n /**\n * Enable multi-session mode (allows multiple connections)\n * @default true\n */\n @Input() multiSessionMode = true;\n\n /**\n * Emitted when wallet successfully connects\n */\n @Output() connected = new EventEmitter<unknown>();\n\n /**\n * Emitted when wallet disconnects\n */\n @Output() disconnected = new EventEmitter<void>();\n\n /**\n * Emitted when connection fails\n */\n @Output() error = new EventEmitter<Error>();\n\n protected readonly wallet = inject(UnifiedWalletService);\n protected readonly modalController = inject(ModalController);\n\n protected isConnecting = false;\n\n /**\n *\n */\n constructor() {\n addIcons({ walletOutline, linkOutline, checkmarkCircleOutline });\n }\n\n /**\n * Connect to wallet (opens modal - supports multi-session)\n */\n async connect(): Promise<void> {\n if (this.isConnecting) return;\n\n this.isConnecting = true;\n try {\n await this.openConnectionModal();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.error.emit(error);\n logger.error('Connection failed', { error: error.message });\n } finally {\n this.isConnecting = false;\n }\n }\n\n /**\n * Open the new multi-protocol connection modal\n * Passes wallet configuration including walletUrl and metadata for proper window targeting.\n */\n private async openConnectionModal(): Promise<void> {\n const modal = await this.modalController.create({\n component: WalletConnectionModalComponent,\n componentProps: {\n projectId: this.walletConnectProjectId,\n appName: this.appName,\n appDescription: this.appDescription,\n walletUrl: this.walletUrl,\n },\n });\n\n await modal.present();\n\n const { data } = await modal.onDidDismiss();\n\n if (data?.connected) {\n // Emit connected event with unified accounts\n const accounts = this.wallet.allAccounts();\n this.connected.emit({\n protocol: data.protocol,\n network: data.network,\n accounts,\n });\n }\n }\n\n /**\n * Disconnect from wallet\n * In multi-session mode, this disconnects ALL sessions\n */\n async disconnect(): Promise<void> {\n try {\n // Disconnect all sessions via UnifiedWalletService\n await this.wallet.disconnectAll();\n\n this.disconnected.emit();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.error.emit(error);\n logger.error('Disconnect failed', { error: error.message });\n }\n }\n\n /**\n * Check if unknown wallet is connected\n */\n isConnected(): boolean {\n return this.wallet.isAnyConnected();\n }\n\n /**\n * Get display text for connection state\n */\n getButtonText(): string {\n if (this.isConnecting) return 'Connecting...';\n\n if (this.multiSessionMode) {\n return this.isConnected() ? this.connectedText : this.connectText;\n }\n return this.isConnected() ? 'Disconnect' : this.connectText;\n }\n\n /**\n * Get icon name for current state\n */\n getIconName(): string {\n if (this.isConnected()) return 'checkmark-circle-outline';\n return 'wallet-outline';\n }\n\n /**\n * Truncate address for display\n * @param address\n */\n truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.substring(0, 6)}...${address.substring(address.length - 4)}`;\n }\n\n /**\n * Get connected accounts (unified)\n */\n getConnectedAccounts(): any[] {\n return this.wallet.allAccounts();\n }\n}\n","<div class=\"wallet-connect-container\" [class]=\"'size-' + size\">\n <!-- Connect Button (Multi-Session Support) -->\n <ion-button\n [color]=\"buttonColor\"\n [size]=\"size\"\n [disabled]=\"isConnecting\"\n (click)=\"connect()\"\n class=\"wallet-button\">\n <ion-spinner *ngIf=\"isConnecting\" slot=\"start\" name=\"crescent\"></ion-spinner>\n <ion-icon *ngIf=\"!isConnecting\" [name]=\"getIconName()\" slot=\"start\"></ion-icon>\n {{ getButtonText() }}\n </ion-button>\n</div>\n\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file wallet-connect-prompt.component.ts\n * @description Beautiful empty state component with connect button\n *\n * Pre-built component for showing a professional \"connect wallet\" prompt.\n * Eliminates repetitive empty state boilerplate.\n */\n\nimport { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n IonCard,\n IonCardHeader,\n IonCardTitle,\n IonCardSubtitle,\n IonCardContent,\n IonIcon,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { walletOutline } from 'ionicons/icons';\nimport { WalletConnectButtonComponent } from '../wallet-connect-button/wallet-connect-button.component';\n\n/**\n * Pre-built component for \"connect wallet\" empty state\n *\n * Features:\n * - Beautiful, professional design\n * - Integrated connect button\n * - Customizable message\n * - Responsive styling\n * - Optional icon\n */\n@Component({\n selector: 'wallet-connect-prompt',\n standalone: true,\n imports: [\n CommonModule,\n IonCard,\n IonCardHeader,\n IonCardTitle,\n IonCardSubtitle,\n IonCardContent,\n IonIcon,\n WalletConnectButtonComponent,\n ],\n templateUrl: './wallet-connect-prompt.component.html',\n styleUrls: ['./wallet-connect-prompt.component.scss'],\n})\nexport class WalletConnectPromptComponent {\n /**\n * Main title text\n */\n @Input() title = 'Connect Your Wallet';\n\n /**\n * Subtitle text (optional)\n */\n @Input() subtitle = '';\n\n /**\n * Message explaining why connection is needed\n */\n @Input() message = 'Connect your wallet to continue';\n\n /**\n * Whether to show the wallet icon\n */\n @Input() showIcon = true;\n\n /**\n * Text for the connect button\n */\n @Input() buttonText = 'Connect Wallet';\n\n /**\n * Button size\n */\n @Input() buttonSize: 'small' | 'default' | 'large' = 'default';\n\n /**\n * Button color\n */\n @Input() buttonColor = 'primary';\n\n /**\n * Card background color\n */\n @Input() cardColor: string | undefined = undefined;\n\n /**\n * WalletConnect Project ID (optional)\n */\n @Input() walletConnectProjectId: string | undefined = undefined;\n\n constructor() {\n addIcons({ walletOutline });\n }\n}\n","<ion-card class=\"wallet-connect-prompt\" [color]=\"cardColor\">\n <ion-card-header>\n <div class=\"prompt-header\">\n <ion-icon *ngIf=\"showIcon\" name=\"wallet-outline\" class=\"prompt-icon\"></ion-icon>\n <div>\n <ion-card-title>{{ title }}</ion-card-title>\n <ion-card-subtitle *ngIf=\"subtitle\">{{ subtitle }}</ion-card-subtitle>\n </div>\n </div>\n </ion-card-header>\n \n <ion-card-content>\n <p class=\"prompt-message\">{{ message }}</p>\n \n <wallet-connect-button\n [walletConnectProjectId]=\"walletConnectProjectId\"\n [connectText]=\"buttonText\"\n [size]=\"buttonSize\"\n [buttonColor]=\"buttonColor\"\n class=\"prompt-button\"\n />\n </ion-card-content>\n</ion-card>\n\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file wallet-connected-guard.component.ts\n * @description Component-based guard for wallet connection status\n *\n * Alternative to `*walletConnected` directive. Shows content only when connected,\n * with customizable empty state.\n */\n\nimport { Component, Input, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WalletContextService } from '../../services/wallet-context.service';\nimport { WalletConnectPromptComponent } from '../wallet-connect-prompt/wallet-connect-prompt.component';\n\n/**\n * Component-based guard for wallet connection\n *\n * Shows projected content when wallet is connected, otherwise shows\n * a customizable empty state (default: connect prompt).\n */\n@Component({\n selector: 'wallet-connected-guard',\n standalone: true,\n imports: [CommonModule, WalletConnectPromptComponent],\n templateUrl: './wallet-connected-guard.component.html',\n})\nexport class WalletConnectedGuardComponent {\n private readonly contextService = inject(WalletContextService);\n\n /**\n * Custom empty state template\n */\n @Input() emptyTemplate?: any;\n\n /**\n * Title for default empty state\n */\n @Input() emptyTitle = 'Connect Your Wallet';\n\n /**\n * Subtitle for default empty state\n */\n @Input() emptySubtitle = '';\n\n /**\n * Message for default empty state\n */\n @Input() emptyMessage = 'Please connect your wallet to continue';\n\n /**\n * Whether to show icon in default empty state\n */\n @Input() showIcon = true;\n\n /**\n * WalletConnect Project ID\n */\n @Input() walletConnectProjectId: string | undefined = undefined;\n\n /**\n * Computed connection status\n */\n protected readonly isConnected = computed(() => this.contextService.context().isConnected);\n}\n","<!-- Show content when connected -->\n<ng-container *ngIf=\"isConnected()\">\n <ng-content></ng-content>\n</ng-container>\n\n<!-- Show empty state when not connected -->\n<ng-container *ngIf=\"!isConnected()\">\n <!-- Custom empty template if provided -->\n <ng-container *ngIf=\"emptyTemplate; else defaultEmpty\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n </ng-container>\n \n <!-- Default empty state: connect prompt -->\n <ng-template #defaultEmpty>\n <wallet-connect-prompt\n [title]=\"emptyTitle\"\n [subtitle]=\"emptySubtitle\"\n [message]=\"emptyMessage\"\n [showIcon]=\"showIcon\"\n [walletConnectProjectId]=\"walletConnectProjectId\"\n />\n </ng-template>\n</ng-container>\n\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\nimport { Component, Input, inject, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n IonCard,\n IonCardHeader,\n IonCardTitle,\n IonCardContent,\n IonList,\n IonItem,\n IonLabel,\n IonText,\n IonBadge,\n IonIcon,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n timeOutline,\n linkOutline,\n personOutline,\n globeOutline,\n fingerPrintOutline,\n wifiOutline,\n cloudOutline,\n flashOutline,\n syncOutline,\n closeCircleOutline,\n} from 'ionicons/icons';\nimport { UnifiedWalletService } from '../../services/unified-wallet.service';\n\n/**\n * @component WalletSessionDisplayComponent\n * Displays detailed session information for connected wallet.\n *\n * **Features:**\n * - Session ID and timestamps\n * - Connected accounts list\n * - Ledger and network information\n * - dApp metadata\n * - Theme-aware styling\n *\n * **Usage:**\n * Uses UnifiedWalletService for multi-protocol support (HSuite Native + WalletConnect).\n */\n@Component({\n selector: 'wallet-session-display',\n standalone: true,\n imports: [\n CommonModule,\n IonCard,\n IonCardHeader,\n IonCardTitle,\n IonCardContent,\n IonList,\n IonItem,\n IonLabel,\n IonText,\n IonBadge,\n IonIcon,\n ],\n templateUrl: './wallet-session-display.component.html',\n styleUrls: ['./wallet-session-display.component.scss'],\n})\nexport class WalletSessionDisplayComponent {\n /**\n * Whether to show session metadata\n * @default false\n */\n @Input() showMetadata = false;\n\n /**\n * Whether to show timestamps\n * @default false\n */\n @Input() showTimestamps = false;\n\n /**\n * Whether to show full addresses (not truncated)\n * @default false\n */\n @Input() showFullAddresses = false;\n\n protected readonly wallet = inject(UnifiedWalletService);\n\n /**\n * Get session from UnifiedWalletService (supports all protocols)\n */\n protected readonly session = computed(() => {\n const activeAccount = this.wallet.activeAccount();\n\n if (!activeAccount) {\n return null;\n }\n\n // Create session display data from active account\n return {\n sessionId: activeAccount.id,\n accounts: [\n {\n address: activeAccount.address,\n ledgerId: activeAccount.ledgerId,\n networkId: activeAccount.networkId,\n label: activeAccount.label,\n publicKey: (activeAccount.metadata as any)?.publicKey,\n },\n ],\n ledgerId: activeAccount.ledgerId,\n networkId: activeAccount.networkId,\n metadata: {\n createdAt: Date.now(),\n providerType: activeAccount.providerType,\n },\n } as any;\n });\n\n /**\n * Transport state for the connection (nostr-only, upgrading, p2p-connected, etc.)\n */\n readonly transportState = computed(() => this.wallet.transportState());\n\n constructor() {\n addIcons({\n timeOutline,\n linkOutline,\n personOutline,\n globeOutline,\n fingerPrintOutline,\n wifiOutline,\n cloudOutline,\n flashOutline,\n syncOutline,\n closeCircleOutline,\n });\n }\n\n /**\n * Get transport state display info (icon, color, label)\n */\n getTransportDisplay(): { icon: string; color: string; label: string } {\n const state = this.transportState();\n switch (state) {\n case 'nostr-only':\n return { icon: 'cloud-outline', color: 'warning', label: 'Nostr Relay' };\n case 'upgrading':\n return { icon: 'sync-outline', color: 'tertiary', label: 'Upgrading to P2P...' };\n case 'p2p-connected':\n return { icon: 'flash-outline', color: 'success', label: 'P2P Connected' };\n case 'p2p-failed':\n return { icon: 'close-circle-outline', color: 'danger', label: 'P2P Failed (using Nostr)' };\n default:\n return { icon: 'wifi-outline', color: 'medium', label: 'Connecting...' };\n }\n }\n\n /**\n * Truncate address for display\n */\n formatAddress(address: string): string {\n if (this.showFullAddresses || address.length <= 16) return address;\n return `${address.substring(0, 8)}...${address.substring(address.length - 6)}`;\n }\n\n /**\n * Format timestamp\n */\n formatTimestamp(timestamp: number): string {\n return new Date(timestamp).toLocaleString();\n }\n\n /**\n * Check if session has createdAt timestamp\n */\n hasCreatedAt(): boolean {\n const sess = this.session();\n return !!(sess?.metadata && typeof sess.metadata['createdAt'] === 'number');\n }\n\n /**\n * Get formatted createdAt timestamp\n */\n getCreatedAtFormatted(): string {\n const sess = this.session();\n if (sess?.metadata && typeof sess.metadata['createdAt'] === 'number') {\n return this.formatTimestamp(sess.metadata['createdAt']);\n }\n return '';\n }\n}\n","<ion-card *ngIf=\"session()\" class=\"session-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"link-outline\" class=\"title-icon\"></ion-icon>\n Active Session\n </ion-card-title>\n </ion-card-header>\n\n <ion-card-content>\n <ion-list lines=\"none\">\n <!-- Session ID -->\n <ion-item>\n <ion-icon name=\"fingerprint-outline\" slot=\"start\" color=\"primary\"></ion-icon>\n <ion-label>\n <p>Session ID</p>\n <ion-text class=\"session-id\">\n {{ formatAddress(session()!.sessionId) }}\n </ion-text>\n </ion-label>\n </ion-item>\n\n <!-- Transport Status -->\n <ion-item *ngIf=\"transportState() !== 'idle'\">\n <ion-icon [name]=\"getTransportDisplay().icon\" slot=\"start\" [color]=\"getTransportDisplay().color\"></ion-icon>\n <ion-label>\n <p>Transport</p>\n <div class=\"badges\">\n <ion-badge [color]=\"getTransportDisplay().color\">{{ getTransportDisplay().label }}</ion-badge>\n </div>\n </ion-label>\n </ion-item>\n \n <!-- Ledger & Network -->\n <ion-item>\n <ion-icon name=\"globe-outline\" slot=\"start\" color=\"primary\"></ion-icon>\n <ion-label>\n <p>Network</p>\n <div class=\"badges\">\n <ion-badge color=\"success\">{{ session()!.ledgerId }}</ion-badge>\n <ion-badge>{{ session()!.networkId }}</ion-badge>\n </div>\n </ion-label>\n </ion-item>\n\n <!-- dApp Info -->\n <ion-item *ngIf=\"session()!.appName || session()!.appId\">\n <ion-icon name=\"globe-outline\" slot=\"start\" color=\"secondary\"></ion-icon>\n <ion-label>\n <p>dApp</p>\n <ion-text>\n <strong>{{ session()!.appName || session()!.appId }}</strong>\n </ion-text>\n </ion-label>\n </ion-item>\n\n <!-- Connected Accounts -->\n <ion-item *ngIf=\"session()?.accounts && session()!.accounts!.length > 0\" class=\"accounts-section\">\n <ion-icon name=\"person-outline\" slot=\"start\" color=\"tertiary\"></ion-icon>\n <ion-label>\n <p>Connected Accounts ({{ session()!.accounts!.length }})</p>\n <div class=\"account-list\">\n <div *ngFor=\"let account of session()!.accounts\" class=\"account-item\">\n <ion-text class=\"account-address\">\n {{ formatAddress(account.address || '') }}\n </ion-text>\n <div class=\"account-badges\">\n <ion-badge color=\"tertiary\" size=\"small\">{{ account.ledgerId }}</ion-badge>\n <ion-badge size=\"small\">{{ account.networkId }}</ion-badge>\n </div>\n </div>\n </div>\n </ion-label>\n </ion-item>\n\n <!-- Timestamps -->\n <ng-container *ngIf=\"showTimestamps && hasCreatedAt()\">\n <ion-item>\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n <ion-label>\n <p>Created</p>\n <ion-text class=\"timestamp\">\n {{ getCreatedAtFormatted() }}\n </ion-text>\n </ion-label>\n </ion-item>\n </ng-container>\n\n <!-- Metadata -->\n <ng-container *ngIf=\"showMetadata && session()!.metadata\">\n <ion-item>\n <ion-label>\n <p>Metadata</p>\n <ion-text class=\"metadata-json\">\n <code>{{ session()!.metadata | json }}</code>\n </ion-text>\n </ion-label>\n </ion-item>\n </ng-container>\n </ion-list>\n </ion-card-content>\n</ion-card>\n\n<ion-card *ngIf=\"!session()\" class=\"no-session-card\">\n <ion-card-content>\n <ion-text>\n <p class=\"text-center\">No active session</p>\n </ion-text>\n </ion-card-content>\n</ion-card>\n\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n IonCard,\n IonCardHeader,\n IonCardTitle,\n IonCardContent,\n IonText,\n IonIcon,\n IonSpinner,\n IonButton,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n checkmarkCircleOutline,\n closeCircleOutline,\n timeOutline,\n alertCircleOutline,\n hourglassOutline,\n openOutline,\n refreshOutline,\n} from 'ionicons/icons';\n\n/**\n * @component WalletTransactionStatusComponent\n * Displays transaction status with user-friendly messaging.\n *\n * **Features:**\n * - Visual status indicators\n * - Status-specific colors and icons\n * - Transaction hash/ID display\n * - Error messages\n * - Loading states\n * - Action buttons (view explorer, retry)\n * - Theme-aware styling\n *\n * **Status Types:**\n * - `pending` - Transaction submitted, awaiting confirmation\n * - `processing` - Being processed by wallet\n * - `success` - Transaction confirmed\n * - `failed` - Transaction failed\n * - `rejected` - User rejected transaction\n * - `timeout` - Transaction timed out\n */\n@Component({\n selector: 'wallet-transaction-status',\n standalone: true,\n imports: [\n CommonModule,\n IonCard,\n IonCardHeader,\n IonCardTitle,\n IonCardContent,\n IonText,\n IonIcon,\n IonSpinner,\n IonButton,\n ],\n templateUrl: './wallet-transaction-status.component.html',\n styleUrls: ['./wallet-transaction-status.component.scss'],\n})\nexport class WalletTransactionStatusComponent {\n /**\n * Transaction status\n */\n @Input({ required: true }) status!:\n | 'pending'\n | 'processing'\n | 'success'\n | 'failed'\n | 'rejected'\n | 'timeout';\n\n /**\n * Transaction ID/hash (for success state)\n */\n @Input() transactionId?: string;\n\n /**\n * Error message (for failed state)\n */\n @Input() error?: string;\n\n /**\n * Link to blockchain explorer\n */\n @Input() explorerUrl?: string;\n\n /**\n * Custom message to display\n */\n @Input() message?: string;\n\n /**\n * Whether to show retry button (for failed state)\n * @default false\n */\n @Input() showRetry = false;\n\n /**\n * Emitted when retry button is clicked\n */\n @Output() retry = new EventEmitter<void>();\n\n constructor() {\n addIcons({\n checkmarkCircleOutline,\n closeCircleOutline,\n timeOutline,\n alertCircleOutline,\n hourglassOutline,\n openOutline,\n refreshOutline,\n });\n }\n\n /**\n * Get status config (color, icon, message)\n */\n getStatusConfig(): {\n color: string;\n icon: string;\n title: string;\n description: string;\n } {\n switch (this.status) {\n case 'success':\n return {\n color: 'success',\n icon: 'checkmark-circle-outline',\n title: 'Transaction Successful',\n description: this.message || 'Your transaction has been confirmed on the blockchain.',\n };\n case 'failed':\n return {\n color: 'danger',\n icon: 'close-circle-outline',\n title: 'Transaction Failed',\n description: this.message || this.error || 'Transaction failed. Please try again.',\n };\n case 'rejected':\n return {\n color: 'warning',\n icon: 'close-circle-outline',\n title: 'Transaction Rejected',\n description: this.message || 'You rejected the transaction in your wallet.',\n };\n case 'timeout':\n return {\n color: 'warning',\n icon: 'time-outline',\n title: 'Transaction Timeout',\n description: this.message || 'Transaction timed out. Please try again.',\n };\n case 'processing':\n return {\n color: 'primary',\n icon: 'hourglass-outline',\n title: 'Processing Transaction',\n description: this.message || 'Please confirm the transaction in your wallet...',\n };\n case 'pending':\n default:\n return {\n color: 'medium',\n icon: 'hourglass-outline',\n title: 'Transaction Pending',\n description: this.message || 'Waiting for confirmation...',\n };\n }\n }\n\n /**\n * Truncate transaction ID for display\n */\n formatTransactionId(id: string): string {\n if (id.length <= 20) return id;\n return `${id.substring(0, 10)}...${id.substring(id.length - 8)}`;\n }\n\n /**\n * Open transaction in explorer\n */\n openExplorer(): void {\n if (this.explorerUrl) {\n window.open(this.explorerUrl, '_blank', 'noopener,noreferrer');\n }\n }\n\n /**\n * Handle retry click\n */\n onRetry(): void {\n this.retry.emit();\n }\n}\n","<ion-card [class]=\"'status-card status-' + status\">\n <ion-card-header>\n <div class=\"status-header\">\n <ion-spinner *ngIf=\"status === 'processing' || status === 'pending'\" \n [name]=\"'crescent'\" \n [color]=\"getStatusConfig().color\"\n class=\"status-spinner\">\n </ion-spinner>\n <ion-icon *ngIf=\"status !== 'processing' && status !== 'pending'\" \n [name]=\"getStatusConfig().icon\" \n [color]=\"getStatusConfig().color\"\n class=\"status-icon\">\n </ion-icon>\n <ion-card-title [color]=\"getStatusConfig().color\">\n {{ getStatusConfig().title }}\n </ion-card-title>\n </div>\n </ion-card-header>\n\n <ion-card-content>\n <!-- Description -->\n <ion-text class=\"status-description\">\n <p>{{ getStatusConfig().description }}</p>\n </ion-text>\n\n <!-- Transaction ID (for success) -->\n <div *ngIf=\"status === 'success' && transactionId\" class=\"transaction-id-section\">\n <ion-text>\n <p class=\"section-label\">Transaction ID</p>\n <p class=\"transaction-id\">{{ formatTransactionId(transactionId) }}</p>\n </ion-text>\n </div>\n\n <!-- Error Details (for failed) -->\n <div *ngIf=\"status === 'failed' && error\" class=\"error-section\">\n <ion-text color=\"danger\">\n <p class=\"section-label\">Error Details</p>\n <p class=\"error-message\">{{ error }}</p>\n </ion-text>\n </div>\n\n <!-- Actions -->\n <div class=\"actions\" *ngIf=\"explorerUrl || showRetry\">\n <ion-button\n *ngIf=\"explorerUrl && status === 'success'\"\n expand=\"block\"\n fill=\"outline\"\n [color]=\"'primary'\"\n (click)=\"openExplorer()\">\n <ion-icon name=\"open-outline\" slot=\"start\"></ion-icon>\n View in Explorer\n </ion-button>\n\n <ion-button\n *ngIf=\"showRetry && (status === 'failed' || status === 'timeout' || status === 'rejected')\"\n expand=\"block\"\n [color]=\"'primary'\"\n (click)=\"onRetry()\">\n <ion-icon name=\"refresh-outline\" slot=\"start\"></ion-icon>\n Retry Transaction\n </ion-button>\n </div>\n </ion-card-content>\n</ion-card>\n\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @fileoverview Structural directive that guards content based on wallet connection status.\n *\n * @module directives/wallet-connected\n *\n * @description\n * WalletConnectedDirective is a structural directive that conditionally renders content\n * based on wallet connection status. It acts as a guard, showing the main template when\n * a wallet is connected and optionally showing an alternate template when not connected.\n *\n * **Key Features:**\n * - Conditional rendering based on connection status\n * - Provides wallet context to the connected template\n * - Supports `else` template for disconnected state\n * - Automatically updates when connection status changes\n *\n * **Selector:** `*walletConnected`\n */\n\nimport {\n Directive,\n Input,\n TemplateRef,\n ViewContainerRef,\n inject,\n effect,\n EmbeddedViewRef,\n} from '@angular/core';\nimport { WalletContextService } from '../services/wallet-context.service';\nimport type { WalletContext } from '../models/wallet-context.model';\n\n/**\n * Context object passed to the connected template.\n *\n * @description\n * Contains the wallet context that is exposed to the template when using\n * the `*walletConnected` structural directive. Both `$implicit` and\n * `walletConnected` contain the same context for flexible access.\n */\nexport class WalletConnectedDirectiveContext {\n constructor(\n public $implicit: WalletContext,\n public walletConnected: WalletContext,\n ) {}\n}\n\n/**\n * Structural directive that conditionally shows content when wallet is connected.\n *\n * @directive WalletConnectedDirective\n * @selector [walletConnected]\n *\n * @description\n * Acts as a guard - shows main template when connected, else template when not.\n * Also provides wallet context to the main template for convenience, allowing\n * access to active account, all accounts, sessions, and providers.\n *\n * The directive uses Angular's effect() to reactively update the view when\n * the wallet connection status changes.\n */\n@Directive({\n selector: '[walletConnected]',\n standalone: true,\n})\nexport class WalletConnectedDirective {\n private readonly contextService = inject(WalletContextService);\n private readonly templateRef = inject(TemplateRef<WalletConnectedDirectiveContext>);\n private readonly viewContainer = inject(ViewContainerRef);\n\n private connectedViewRef: EmbeddedViewRef<WalletConnectedDirectiveContext> | null = null;\n private elseViewRef: EmbeddedViewRef<void> | null = null;\n private _elseTemplateRef: TemplateRef<void> | null = null;\n\n /**\n * Template to show when wallet is NOT connected.\n *\n * @description\n * Reference to an ng-template that will be rendered when no wallet is connected.\n * Use this to show a login prompt, connect button, or informational message.\n *\n * @param templateRef - Reference to the else template, or null to clear\n */\n @Input()\n set walletConnectedElse(templateRef: TemplateRef<void> | null) {\n this._elseTemplateRef = templateRef;\n this.updateView();\n }\n\n constructor() {\n // React to connection status changes\n effect(() => {\n const context = this.contextService.context();\n this.updateView(context);\n });\n }\n\n /**\n * Updates the view based on connection status.\n *\n * @description\n * Determines whether to show the connected template or the else template\n * based on the current wallet context. Called automatically when the\n * context signal changes.\n *\n * @param context - Optional wallet context, fetched from service if not provided\n */\n private updateView(context?: WalletContext): void {\n const walletContext = context || this.contextService.context();\n\n if (walletContext.isConnected) {\n // Show connected template\n this.showConnectedTemplate(walletContext);\n } else {\n // Show else template if provided\n this.showElseTemplate();\n }\n }\n\n /**\n * Shows the main template when wallet is connected.\n *\n * @description\n * Creates or updates the connected template view, providing the wallet\n * context as both the implicit variable and the named `walletConnected` property.\n *\n * @param walletContext - The current wallet context to expose to the template\n */\n private showConnectedTemplate(walletContext: WalletContext): void {\n // Clear else template if shown\n if (this.elseViewRef) {\n this.elseViewRef.destroy();\n this.elseViewRef = null;\n }\n\n // Create or update connected template\n if (!this.connectedViewRef) {\n const context = new WalletConnectedDirectiveContext(walletContext, walletContext);\n this.connectedViewRef = this.viewContainer.createEmbeddedView(this.templateRef, context);\n } else {\n // Update existing context\n this.connectedViewRef.context.$implicit = walletContext;\n this.connectedViewRef.context.walletConnected = walletContext;\n this.connectedViewRef.markForCheck();\n }\n }\n\n /**\n * Shows the else template when wallet is NOT connected.\n *\n * @description\n * Clears the connected template and renders the else template if one\n * was provided via the `walletConnectedElse` input.\n */\n private showElseTemplate(): void {\n // Clear connected template if shown\n if (this.connectedViewRef) {\n this.connectedViewRef.destroy();\n this.connectedViewRef = null;\n }\n\n // Show else template if provided\n if (this._elseTemplateRef && !this.elseViewRef) {\n this.elseViewRef = this.viewContainer.createEmbeddedView(this._elseTemplateRef);\n }\n }\n\n /**\n * Static type guard for Angular template type checking.\n *\n * @description\n * Enables TypeScript type inference in templates when using the directive.\n * This allows the template to have proper types for the context variable.\n *\n * @param dir - The directive instance\n * @param ctx - The context to type-guard\n *\n * @returns True, asserting that ctx is WalletConnectedDirectiveContext\n */\n static ngTemplateContextGuard(\n dir: WalletConnectedDirective,\n ctx: any,\n ): ctx is WalletConnectedDirectiveContext {\n return true;\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @fileoverview Structural directive that provides unified wallet context to templates.\n *\n * @module directives/wallet-context\n *\n * @description\n * WalletContextDirective is a structural directive that provides a unified wallet context\n * to templates, eliminating the need to manually inject services and track multiple signals.\n * It provides a single context variable with all wallet state.\n *\n * Unlike `*walletConnected`, this directive always renders its template and provides\n * context regardless of connection status. Use this when you need access to wallet state\n * but want to handle the connected/disconnected logic yourself.\n *\n * **Key Features:**\n * - Provides complete wallet context (isConnected, accounts, sessions, providers)\n * - Always renders (use *walletConnected for conditional rendering)\n * - Automatically updates when any wallet state changes\n * - Type-safe template context with full IDE support\n *\n * **Selector:** `*walletContext`\n */\n\nimport {\n Directive,\n TemplateRef,\n ViewContainerRef,\n inject,\n effect,\n EmbeddedViewRef,\n} from '@angular/core';\nimport { WalletContextService } from '../services/wallet-context.service';\nimport type { WalletContext } from '../models/wallet-context.model';\n\n/**\n * Context object passed to the template.\n *\n * @description\n * Contains the wallet context that is exposed to the template when using\n * the `*walletContext` structural directive. Both `$implicit` and\n * `walletContext` contain the same context for flexible access.\n */\nexport class WalletContextDirectiveContext {\n constructor(\n public $implicit: WalletContext,\n public walletContext: WalletContext,\n ) {}\n}\n\n/**\n * Structural directive that provides unified wallet context.\n *\n * @directive WalletContextDirective\n * @selector [walletContext]\n *\n * @description\n * Automatically updates the view when wallet state changes, exposing a single\n * `WalletContext` object with all wallet state. Unlike `*walletConnected`,\n * this directive always renders its template.\n *\n * The directive uses Angular's effect() to reactively update the context\n * whenever any underlying wallet state changes.\n *\n * @if (w.isConnected) {\n * <account-selector [accounts]=\"w.allAccounts\" />\n * } @else {\n * <wallet-connect-button />\n * }\n * </div>\n * ```\n */\n@Directive({\n selector: '[walletContext]',\n standalone: true,\n})\nexport class WalletContextDirective {\n private readonly contextService = inject(WalletContextService);\n private readonly templateRef = inject(TemplateRef<WalletContextDirectiveContext>);\n private readonly viewContainer = inject(ViewContainerRef);\n\n private viewRef: EmbeddedViewRef<WalletContextDirectiveContext> | null = null;\n\n constructor() {\n // Create the view immediately\n this.createView();\n\n // Update context reactively when wallet state changes\n effect(() => {\n const context = this.contextService.context();\n this.updateContext(context);\n });\n }\n\n /**\n * Creates the embedded view with initial context.\n *\n * @description\n * Called once during directive construction to create the view.\n * The view is created immediately and then updated reactively.\n */\n private createView(): void {\n if (!this.viewRef) {\n const initialContext = this.contextService.context();\n const context = new WalletContextDirectiveContext(initialContext, initialContext);\n this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef, context);\n }\n }\n\n /**\n * Updates the context when wallet state changes.\n *\n * @description\n * Called reactively by Angular's effect() whenever the wallet context\n * signal changes. Updates both the implicit and named context properties.\n *\n * @param walletContext - The new wallet context\n */\n private updateContext(walletContext: WalletContext): void {\n if (this.viewRef) {\n this.viewRef.context.$implicit = walletContext;\n this.viewRef.context.walletContext = walletContext;\n this.viewRef.markForCheck();\n }\n }\n\n /**\n * Static type guard for Angular template type checking.\n *\n * @description\n * Enables TypeScript type inference in templates when using the directive.\n * This allows the template to have proper types for the context variable.\n *\n * @param dir - The directive instance\n * @param ctx - The context to type-guard\n *\n * @returns True, asserting that ctx is WalletContextDirectiveContext\n */\n static ngTemplateContextGuard(\n dir: WalletContextDirective,\n ctx: any,\n ): ctx is WalletContextDirectiveContext {\n return true;\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @fileoverview Attribute directive for declarative wallet event subscriptions.\n *\n * @module directives/wallet-events\n *\n * @description\n * WalletEventsDirective is an attribute directive that provides declarative event\n * subscriptions for wallet lifecycle events. It automatically subscribes to wallet\n * events and unsubscribes on directive destruction, eliminating manual subscription\n * management boilerplate.\n *\n * **Key Features:**\n * - Automatic subscription management (subscribe on init, unsubscribe on destroy)\n * - All wallet events exposed as Angular @Output() bindings\n * - Works with any element or component\n * - Type-safe event payloads\n *\n * **Available Events:**\n * - `connected` - Provider successfully connected\n * - `disconnected` - Provider disconnected\n * - `accountChanged` - Active account switched\n * - `accountsUpdated` - Provider's account list changed\n * - `sessionCreated` - New session established\n * - `sessionDeleted` - Session terminated\n * - `sessionRestored` - Session restored from storage\n * - `providerStatusChanged` - Provider status changed\n * - `providerError` - Provider encountered an error\n *\n * **Selector:** `[walletEvents]`\n */\n\nimport { Directive, Output, EventEmitter, inject, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { WalletEventBus } from '../services/wallet-event-bus.service';\nimport type {\n ConnectionEvent,\n DisconnectionEvent,\n AccountChangeEvent,\n AccountsUpdateEvent,\n SessionEvent,\n ProviderStatusEvent,\n ProviderErrorEvent,\n} from '../models/wallet-events.model';\n\n/**\n * Attribute directive that provides declarative event subscriptions.\n *\n * @directive WalletEventsDirective\n * @selector [walletEvents]\n *\n * @description\n * Automatically manages subscriptions and cleanup - no manual ngOnDestroy needed.\n * Simply declare which events you want to handle in your template using Angular's\n * output binding syntax.\n *\n * All subscriptions are collected in a single Subscription object and cleaned up\n * together when the directive is destroyed.\n *\n * @Component({\n * template: `\n * <div walletEvents\n * (disconnected)=\"handleDisconnect($event)\"\n * (providerError)=\"handleError($event)\">\n * </div>\n * `\n * })\n * export class MyComponent {\n * handleDisconnect(event: DisconnectionEvent) {\n * if (event.reason === 'wallet_initiated_disconnect') {\n * this.toast.warning('Wallet disconnected by remote');\n * }\n * }\n *\n * handleError(event: ProviderErrorEvent) {\n * this.toast.error('Error: ' + event.error);\n * }\n * }\n * ```\n */\n@Directive({\n selector: '[walletEvents]',\n standalone: true,\n})\nexport class WalletEventsDirective implements OnDestroy {\n private readonly eventBus = inject(WalletEventBus);\n private readonly subscriptions = new Subscription();\n\n /**\n * Emitted when a provider successfully connects.\n *\n * @description\n * Fired after a wallet connection is established. The event includes\n * the provider ID, type, and the list of accounts that are now available.\n */\n @Output() connected = new EventEmitter<ConnectionEvent>();\n\n /**\n * Emitted when a provider disconnects.\n *\n * @description\n * Fired when a wallet connection is terminated. The event includes\n * the reason for disconnection (user-initiated, wallet-initiated, expired).\n */\n @Output() disconnected = new EventEmitter<DisconnectionEvent>();\n\n /**\n * Emitted when the active account changes.\n *\n * @description\n * Fired when the user switches between accounts. Includes both the\n * previous account and the newly selected account.\n */\n @Output() accountChanged = new EventEmitter<AccountChangeEvent>();\n\n /**\n * Emitted when a provider's account list updates.\n *\n * @description\n * Fired when accounts are added or removed from a provider. Includes\n * the updated account list and total count.\n */\n @Output() accountsUpdated = new EventEmitter<AccountsUpdateEvent>();\n\n /**\n * Emitted when a new session is created.\n *\n * @description\n * Fired when a new wallet session is established. Includes session\n * key, accounts, and metadata.\n */\n @Output() sessionCreated = new EventEmitter<SessionEvent>();\n\n /**\n * Emitted when a session is deleted.\n *\n * @description\n * Fired when a wallet session is terminated. Includes session key\n * and optional reason metadata.\n */\n @Output() sessionDeleted = new EventEmitter<SessionEvent>();\n\n /**\n * Emitted when a session is restored from storage.\n *\n * @description\n * Fired when a previously saved session is restored (e.g., after page reload).\n * Includes the restored accounts and session metadata.\n */\n @Output() sessionRestored = new EventEmitter<SessionEvent>();\n\n /**\n * Emitted when a provider's status changes.\n *\n * @description\n * Fired when a provider transitions between states (connecting, connected,\n * disconnected, error).\n */\n @Output() providerStatusChanged = new EventEmitter<ProviderStatusEvent>();\n\n /**\n * Emitted when a provider encounters an error.\n *\n * @description\n * Fired when a wallet operation fails. Includes the error message\n * and optional context about what operation failed.\n */\n @Output() providerError = new EventEmitter<ProviderErrorEvent>();\n\n constructor() {\n // Auto-subscribe to all events and forward to outputs\n // Subscriptions are automatically cleaned up in ngOnDestroy\n\n this.subscriptions.add(\n this.eventBus.connected.subscribe((event) => this.connected.emit(event)),\n );\n\n this.subscriptions.add(\n this.eventBus.disconnected.subscribe((event) => this.disconnected.emit(event)),\n );\n\n this.subscriptions.add(\n this.eventBus.accountChanged.subscribe((event) => this.accountChanged.emit(event)),\n );\n\n this.subscriptions.add(\n this.eventBus.accountsUpdated.subscribe((event) => this.accountsUpdated.emit(event)),\n );\n\n this.subscriptions.add(\n this.eventBus.sessionCreated.subscribe((event) => this.sessionCreated.emit(event)),\n );\n\n this.subscriptions.add(\n this.eventBus.sessionDeleted.subscribe((event) => this.sessionDeleted.emit(event)),\n );\n\n this.subscriptions.add(\n this.eventBus.sessionRestored.subscribe((event) => this.sessionRestored.emit(event)),\n );\n\n this.subscriptions.add(\n this.eventBus.providerStatusChanged.subscribe((event) =>\n this.providerStatusChanged.emit(event),\n ),\n );\n\n this.subscriptions.add(\n this.eventBus.providerError.subscribe((event) => this.providerError.emit(event)),\n );\n }\n\n /**\n * Cleans up all subscriptions on directive destruction.\n *\n * @description\n * Called automatically by Angular when the directive is destroyed.\n * Unsubscribes from all wallet events to prevent memory leaks.\n */\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file NgModule wrapper for HSuite Wallet Angular SDK.\n *\n * @module HsuiteWalletModule\n *\n * @description\n * Provides a traditional NgModule for module-based Angular/Ionic applications.\n * All components internally use @ionic/angular/standalone imports but are re-exported\n * through this module for compatibility with module-based apps.\n *\n * **When to Use This Module:**\n * - Your Angular application uses NgModule-based architecture\n * - You're migrating an existing Ionic/Angular app to use wallet features\n * - You prefer importing a single module over individual components\n *\n * **When to Use Standalone Components Instead:**\n * - New Angular 17+ applications using standalone components\n * - You only need a few components and want tree-shaking benefits\n * - Following modern Angular best practices\n *\n * **Included Components:**\n * - WalletConnectButtonComponent - Ready-to-use connection button\n * - WalletSessionDisplayComponent - Session information display\n * - WalletTransactionStatusComponent - Transaction status indicator\n * - AccountSelectorComponent - Multi-account dropdown\n * - WalletAccountDisplayComponent - Account details display\n * - WalletConnectPromptComponent - Connection prompt UI\n * - WalletConnectedGuardComponent - Protected route guard\n * - WalletConnectionModalComponent - Multi-protocol connection modal\n *\n * **Included Directives:**\n * - WalletContextDirective (*walletContext) - Unified context access\n * - WalletConnectedDirective (*walletConnected) - Conditional rendering\n * - WalletEventsDirective (walletEvents) - Event subscriptions\n *\n * **Note:** Services (UnifiedWalletService, WalletEventBus, etc.) are NOT provided\n * by this module because they use `providedIn: 'root'`. They're automatically\n * available throughout your application.\n *\n * @NgModule({\n * imports: [HsuiteWalletModule],\n * })\n * export class AppModule {}\n * ```\n *\n * @Component({\n * standalone: true,\n * imports: [WalletConnectButtonComponent],\n * })\n * export class MyComponent {}\n * ```\n */\n\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { IonicModule } from '@ionic/angular';\n\n// Components\nimport { AccountActionsComponent } from './components/account-selector/account-actions/account-actions.component';\nimport { AccountFilterComponent } from './components/account-selector/account-filter/account-filter.component';\nimport { AccountListComponent } from './components/account-selector/account-list/account-list.component';\nimport { AccountSelectorComponent } from './components/account-selector/account-selector.component';\nimport { WalletAccountDisplayComponent } from './components/wallet-account-display/wallet-account-display.component';\nimport { WalletConnectButtonComponent } from './components/wallet-connect-button/wallet-connect-button.component';\nimport { WalletConnectPromptComponent } from './components/wallet-connect-prompt/wallet-connect-prompt.component';\nimport { WalletConnectedGuardComponent } from './components/wallet-connected-guard/wallet-connected-guard.component';\nimport { WalletConnectionModalComponent } from './components/wallet-connection-modal/wallet-connection-modal.component';\nimport { WalletSessionDisplayComponent } from './components/wallet-session-display/wallet-session-display.component';\nimport { WalletTransactionStatusComponent } from './components/wallet-transaction-status/wallet-transaction-status.component';\n\n// Directives\nimport { WalletConnectedDirective } from './directives/wallet-connected.directive';\nimport { WalletContextDirective } from './directives/wallet-context.directive';\nimport { WalletEventsDirective } from './directives/wallet-events.directive';\n\n/**\n * @module HsuiteWalletModule\n *\n * NgModule wrapper for HSuite Wallet Angular SDK components, directives, and services.\n *\n * **What's Included:**\n *\n * **Components:**\n * - `WalletConnectButtonComponent` - Ready-to-use wallet connection button\n * - `WalletSessionDisplayComponent` - Display connected session information\n * - `WalletTransactionStatusComponent` - Transaction status indicator\n * - `AccountSelectorComponent` - Multi-account dropdown selector\n * - `WalletAccountDisplayComponent` - Display account details\n * - `WalletConnectPromptComponent` - Connection prompt UI\n * - `WalletConnectedGuardComponent` - Guard component for protected routes\n * - `WalletConnectionModalComponent` - Multi-protocol connection modal\n *\n * **Directives:**\n * - `WalletContextDirective` (*walletContext) - Structural directive for wallet context\n * - `WalletConnectedDirective` (*walletConnected) - Conditional rendering based on connection\n * - `WalletEventsDirective` (walletEvents) - Listen to wallet events\n *\n * **Services:**\n * - `UnifiedWalletService` - Multi-protocol wallet service (recommended)\n * - `WalletEventBus` - Event system for wallet lifecycle\n * - `WalletContextService` - Centralized wallet context\n * - `TransactionService` - Transaction helper utilities\n *\n * **Usage:**\n *\n * Import this module in your app's main module:\n *\n * ```typescript\n * import { NgModule } from '@angular/core';\n * import { BrowserModule } from '@angular/platform-browser';\n * import { IonicModule } from '@ionic/angular';\n * import { HsuiteWalletModule } from '@hsuite/native-connect-angular';\n * import { AppComponent } from './app.component';\n *\n * @NgModule({\n * declarations: [AppComponent],\n * imports: [\n * BrowserModule,\n * IonicModule.forRoot(),\n * HsuiteWalletModule, // Add this\n * ],\n * bootstrap: [AppComponent],\n * })\n * export class AppModule {}\n * ```\n *\n * Then use components in your templates:\n *\n * ```html\n * <wallet-connect-button\n * [walletConnectProjectId]=\"'YOUR_PROJECT_ID'\"\n * [showSessionInfo]=\"true\">\n * </wallet-connect-button>\n *\n * <wallet-session-display></wallet-session-display>\n *\n * <wallet-account-selector\n * [selectedAddress]=\"currentAccount\"\n * (accountChanged)=\"onAccountChange($event)\">\n * </wallet-account-selector>\n * ```\n *\n * **Note:** This module is designed for module-based Angular apps. If you're using\n * Angular standalone components (recommended for new projects), you can import\n * components individually instead:\n *\n * ```typescript\n * import { WalletConnectButtonComponent } from '@hsuite/native-connect-angular';\n *\n * @Component({\n * standalone: true,\n * imports: [WalletConnectButtonComponent],\n * // ...\n * })\n * export class MyComponent {}\n * ```\n */\n@NgModule({\n imports: [\n CommonModule,\n IonicModule,\n // Import all standalone components\n WalletConnectButtonComponent,\n WalletSessionDisplayComponent,\n WalletTransactionStatusComponent,\n AccountSelectorComponent,\n AccountListComponent,\n AccountFilterComponent,\n AccountActionsComponent,\n WalletAccountDisplayComponent,\n WalletConnectPromptComponent,\n WalletConnectedGuardComponent,\n WalletConnectionModalComponent,\n // Import all standalone directives\n WalletContextDirective,\n WalletConnectedDirective,\n WalletEventsDirective,\n ],\n exports: [\n // Export all components for use in module-based apps\n WalletConnectButtonComponent,\n WalletSessionDisplayComponent,\n WalletTransactionStatusComponent,\n AccountSelectorComponent,\n AccountListComponent,\n AccountFilterComponent,\n AccountActionsComponent,\n WalletAccountDisplayComponent,\n WalletConnectPromptComponent,\n WalletConnectedGuardComponent,\n WalletConnectionModalComponent,\n // Export all directives\n WalletContextDirective,\n WalletConnectedDirective,\n WalletEventsDirective,\n ],\n // NOTE: Services are NOT provided here because they already have providedIn: 'root'\n // Providing them here would cause a double-provider error\n})\nexport class HsuiteWalletModule {}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file High-level transaction service with automatic state management.\n *\n * @module services/transaction\n *\n * @description\n * TransactionService provides simplified methods for common transaction operations\n * with built-in state management, error handling, and UI feedback. It wraps\n * UnifiedWalletService operations with additional convenience features.\n *\n * **Key Features:**\n * - Automatic processing state tracking via Angular signals\n * - Toast notifications for success and error states\n * - Error propagation with proper error types\n * - Result and error state tracking for UI binding\n * - Support for batch transactions\n *\n * **Signal-based State:**\n * - `isProcessing()` - True while a transaction is in progress\n * - `lastResult()` - The result of the last successful transaction\n * - `lastError()` - The error from the last failed transaction\n *\n * @Component({\n * template: `\n * <button [disabled]=\"txService.isProcessing()\" (click)=\"send()\">\n * {{ txService.isProcessing() ? 'Processing...' : 'Send' }}\n * </button>\n * `\n * })\n * export class MyComponent {\n * txService = inject(TransactionService);\n *\n * async send() {\n * const result = await this.txService.signAndSubmit(payload);\n * console.log('Transaction ID:', result.transactionId);\n * }\n * }\n * ```\n */\n\nimport { Injectable, inject, signal, type Signal, type WritableSignal } from '@angular/core';\nimport { getLogger } from '@hsuite/native-connect-sdk';\nimport { ToastController } from '@ionic/angular/standalone';\n\nimport type { SignResult, SubmitResult } from '../providers/base-wallet-provider';\n\nimport { UnifiedWalletService } from './unified-wallet.service';\nimport { WalletEventBus } from './wallet-event-bus.service';\n\n\nconst logger = getLogger().scoped?.('TransactionService') ?? getLogger();\n\n/**\n * High-level transaction service with automatic state management.\n *\n * @service TransactionService\n *\n * @description\n * Simplifies common transaction operations with built-in features:\n * - Automatic processing state management via Angular signals\n * - Error propagation with toast notifications\n * - Event emission for tracking and debugging\n * - Signal-based reactive state (modern Angular pattern)\n *\n * This service is the recommended way to perform transactions in dApps,\n * as it handles all the boilerplate around state management and user feedback.\n *\n * @providedIn root\n */\n@Injectable({ providedIn: 'root' })\nexport class TransactionService {\n private readonly walletService = inject(UnifiedWalletService);\n private readonly eventBus = inject(WalletEventBus);\n private readonly toastController = inject(ToastController);\n\n // Internal writable signals for state management\n private readonly _isProcessing: WritableSignal<boolean> = signal(false);\n private readonly _lastResult: WritableSignal<unknown> = signal(null);\n private readonly _lastError: WritableSignal<Error | null> = signal(null);\n\n /**\n * Signal indicating if a transaction is currently processing\n */\n readonly isProcessing: Signal<boolean> = this._isProcessing.asReadonly();\n\n /**\n * Signal of the last transaction result\n */\n readonly lastResult: Signal<unknown> = this._lastResult.asReadonly();\n\n /**\n * Signal of the last error\n */\n readonly lastError: Signal<Error | null> = this._lastError.asReadonly();\n\n /**\n * Sign a transaction\n *\n * Automatically handles:\n * - Processing state\n * - Error propagation\n * - Success toast notification\n *\n * @param payload - Transaction payload (base64 or transaction bytes)\n * @returns Sign result\n */\n async signTransaction(payload: string): Promise<SignResult> {\n return this.executeTransaction(async () => {\n const result = (await this.walletService.signTransaction(payload)) as SignResult;\n logger.info('Transaction signed', {\n hasSignature: !!(result as { signedTransaction?: string }).signedTransaction,\n });\n await this.showSuccessToast(\n 'Transaction Signed',\n 'Your transaction has been signed successfully.',\n );\n return result;\n });\n }\n\n /**\n * Submit a transaction\n *\n * Automatically handles:\n * - Processing state\n * - Error propagation\n * - Success toast notification\n *\n * @param payload - Transaction payload (base64 or transaction bytes)\n * @returns Submit result\n */\n async submitTransaction(payload: string): Promise<SubmitResult> {\n return this.executeTransaction(async () => {\n const result = (await this.walletService.submitTransaction(payload)) as SubmitResult;\n logger.info('Transaction submitted', { transactionId: result.transactionId });\n await this.showSuccessToast(\n 'Transaction Submitted',\n `Transaction ID: ${result.transactionId || 'Success'}`,\n );\n return result;\n });\n }\n\n /**\n * Sign and submit a transaction in one call\n *\n * Uses the wallet's native sign+submit method when available (e.g., WalletConnect's signAndExecuteTransaction).\n * This prevents double prompts and provides a better UX.\n *\n * @param payload - Transaction payload\n * @returns Submit result\n */\n async signAndSubmit(payload: string): Promise<SubmitResult> {\n return this.executeTransaction(async () => {\n // Use the wallet's signAndExecuteTransaction method directly\n // This uses hedera_signAndExecuteTransaction for WalletConnect (one prompt!)\n const result = (await this.walletService.signAndExecuteTransaction(payload)) as SubmitResult;\n logger.info('Transaction signed and submitted', { transactionId: result.transactionId });\n await this.showSuccessToast(\n 'Transaction Complete',\n `Transaction ID: ${result.transactionId || 'Success'}`,\n );\n return result;\n });\n }\n\n /**\n * Submit a batch transaction\n *\n * Batch transactions require unsigned inner transactions that the wallet will sign.\n * The wallet signs each inner transaction with the account's key, then builds and\n * executes the BatchTransaction.\n *\n * @param options - Batch transaction options\n * @param options.batchKey - Public key for batch (typically account's public key)\n * @param options.innerTransactions - Array of unsigned inner transactions\n * @returns Submit result\n */\n async submitBatchTransaction(options: {\n batchKey: string;\n innerTransactions: Array<{ payload: string; description?: string }>;\n }): Promise<SubmitResult> {\n return this.executeTransaction(async () => {\n const result = (await this.walletService.submitTransaction('', {\n isBatch: true,\n batchKey: options.batchKey,\n innerTransactions: options.innerTransactions,\n })) as SubmitResult;\n logger.info('Batch transaction submitted', { transactionId: result.transactionId });\n await this.showSuccessToast(\n 'Batch Transaction Complete',\n `Transaction ID: ${result.transactionId || 'Success'}`,\n );\n return result;\n });\n }\n\n /**\n * Sign a message\n *\n * @param message - Message to sign\n * @returns Sign result with signature\n */\n async signMessage(message: string): Promise<SignResult> {\n return this.executeTransaction(async () => {\n const result = (await this.walletService.signMessage(message)) as SignResult;\n logger.info('Message signed', { hasSignature: !!result.signature });\n await this.showSuccessToast('Message Signed', 'Your message has been signed successfully.');\n return result;\n });\n }\n\n /**\n * Show a success toast notification\n * Uses cssClass-only styling (no Ionic color property) for theme compatibility.\n * @param header\n * @param message\n */\n private async showSuccessToast(header: string, message: string): Promise<void> {\n const toast = await this.toastController.create({\n header,\n message,\n icon: 'checkmark-circle-outline',\n cssClass: 'toast-success toast-compact',\n duration: 4000,\n position: 'top',\n buttons: [{ icon: 'close', role: 'cancel' }],\n });\n await toast.present();\n }\n\n /**\n * Show an error toast notification\n * Uses cssClass-only styling (no Ionic color property) for theme compatibility.\n * @param header\n * @param message\n */\n private async showErrorToast(header: string, message: string): Promise<void> {\n const toast = await this.toastController.create({\n header,\n message,\n icon: 'close-circle-outline',\n cssClass: 'toast-danger toast-compact',\n duration: 6000,\n position: 'top',\n buttons: [{ icon: 'close', role: 'cancel' }],\n });\n await toast.present();\n }\n\n /**\n * Execute a transaction with automatic state management\n *\n * Internal helper that wraps transaction operations with:\n * - Processing state updates\n * - Error handling with toast notifications\n * - Result tracking\n * @param operation\n */\n private async executeTransaction<T>(operation: () => Promise<T>): Promise<T> {\n // Set processing state\n this.setProcessing(true);\n this.clearError();\n\n try {\n // Execute the operation\n const result = await operation();\n\n // Update result state\n this.setResult(result);\n\n return result;\n } catch (error) {\n // Update error state\n const err = error instanceof Error ? error : new Error(String(error));\n this.setError(err);\n\n // Show error toast\n await this.showErrorToast(\n 'Transaction Failed',\n err.message || 'An error occurred during the transaction.',\n );\n\n // Re-throw for caller to handle\n throw err;\n } finally {\n // Clear processing state\n this.setProcessing(false);\n }\n }\n\n /**\n * Update processing state\n * @param processing\n */\n private setProcessing(processing: boolean): void {\n this._isProcessing.set(processing);\n }\n\n /**\n * Update result state\n * @param result\n */\n private setResult(result: unknown): void {\n this._lastResult.set(result);\n }\n\n /**\n * Update error state\n * @param error\n */\n private setError(error: Error): void {\n this._lastError.set(error);\n }\n\n /**\n * Clear error state\n */\n private clearError(): void {\n this._lastError.set(null);\n }\n\n /**\n * Resets all transaction state to initial values.\n *\n * @description\n * Clears the processing flag, last result, and last error.\n * Useful when navigating away from a transaction page or\n * starting a fresh transaction flow.\n */\n resetState(): void {\n this.setProcessing(false);\n this.setResult(null);\n this.clearError();\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file Abstract base class for transaction builder services.\n *\n * @file base-transaction-builder.service.ts\n * @description Provides common functionality for building blockchain transactions\n * across different ledger types (Hedera, XRPL, etc.).\n *\n * This abstract base class extracts shared patterns from ledger-specific\n * transaction builders, including:\n * - Common validation logic for accounts, amounts, and parameters\n * - Error handling patterns with standardized error types\n * - Amount parsing utilities for different decimal formats\n * - Base64/hex encoding utilities\n *\n * Ledger-specific builders should extend this class and implement\n * the abstract methods for their specific blockchain.\n *\n * @Injectable({ providedIn: 'root' })\n * export class MyLedgerTransactionBuilderService extends BaseTransactionBuilderService {\n * protected readonly ledgerType = 'my-ledger';\n *\n * protected async serializeTransactionImpl(tx: unknown): Promise<string> {\n * // Ledger-specific serialization\n * return btoa(JSON.stringify(tx));\n * }\n * }\n * ```\n */\n\nimport { inject } from '@angular/core';\nimport type { Logger } from '@hsuite/native-connect-sdk';\n\nimport { LoggerService } from '../logger.service';\n\n/**\n * Error codes for transaction builder errors.\n *\n * Standardized error codes for identifying specific error conditions\n * in transaction building operations.\n */\nexport enum TransactionBuilderErrorCode {\n /** Invalid account ID format */\n INVALID_ACCOUNT = 'INVALID_ACCOUNT',\n /** Invalid amount (negative, NaN, or exceeds limits) */\n INVALID_AMOUNT = 'INVALID_AMOUNT',\n /** Invalid token ID format */\n INVALID_TOKEN_ID = 'INVALID_TOKEN_ID',\n /** Missing required parameter */\n MISSING_PARAMETER = 'MISSING_PARAMETER',\n /** No active wallet session */\n NO_ACTIVE_SESSION = 'NO_ACTIVE_SESSION',\n /** Transaction serialization failed */\n SERIALIZATION_FAILED = 'SERIALIZATION_FAILED',\n /** Network-related error */\n NETWORK_ERROR = 'NETWORK_ERROR',\n /** General validation error */\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n}\n\n/**\n * Structured error for transaction builder operations.\n *\n * Provides detailed error information including error code, message,\n * and optional context for debugging.\n */\nexport class TransactionBuilderError extends Error {\n /**\n * Creates a new TransactionBuilderError.\n *\n * @param code - The error code identifying the error type\n * @param message - Human-readable error message\n * @param context - Optional context object with additional details\n */\n constructor(\n public readonly code: TransactionBuilderErrorCode,\n message: string,\n public readonly context?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'TransactionBuilderError';\n\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, TransactionBuilderError);\n }\n }\n\n /**\n * Creates an error for invalid account format.\n * @param account\n * @param ledgerType\n */\n static invalidAccount(account: string, ledgerType: string): TransactionBuilderError {\n return new TransactionBuilderError(\n TransactionBuilderErrorCode.INVALID_ACCOUNT,\n `Invalid ${ledgerType} account format: ${account}`,\n { account, ledgerType },\n );\n }\n\n /**\n * Creates an error for invalid amount.\n * @param amount\n * @param reason\n */\n static invalidAmount(amount: unknown, reason: string): TransactionBuilderError {\n return new TransactionBuilderError(\n TransactionBuilderErrorCode.INVALID_AMOUNT,\n `Invalid amount: ${reason}`,\n { amount, reason },\n );\n }\n\n /**\n * Creates an error for invalid token ID.\n * @param tokenId\n * @param ledgerType\n */\n static invalidTokenId(tokenId: string, ledgerType: string): TransactionBuilderError {\n return new TransactionBuilderError(\n TransactionBuilderErrorCode.INVALID_TOKEN_ID,\n `Invalid ${ledgerType} token ID format: ${tokenId}`,\n { tokenId, ledgerType },\n );\n }\n\n /**\n * Creates an error for missing required parameter.\n * @param paramName\n * @param operation\n */\n static missingParameter(paramName: string, operation: string): TransactionBuilderError {\n return new TransactionBuilderError(\n TransactionBuilderErrorCode.MISSING_PARAMETER,\n `Missing required parameter '${paramName}' for ${operation}`,\n { paramName, operation },\n );\n }\n\n /**\n * Creates an error for no active session.\n */\n static noActiveSession(): TransactionBuilderError {\n return new TransactionBuilderError(\n TransactionBuilderErrorCode.NO_ACTIVE_SESSION,\n 'No active wallet session. Please connect your wallet first.',\n );\n }\n\n /**\n * Creates an error for serialization failure.\n * @param reason\n * @param cause\n */\n static serializationFailed(reason: string, cause?: unknown): TransactionBuilderError {\n return new TransactionBuilderError(\n TransactionBuilderErrorCode.SERIALIZATION_FAILED,\n `Transaction serialization failed: ${reason}`,\n { reason, cause: cause instanceof Error ? cause.message : String(cause) },\n );\n }\n}\n\n/**\n * Result of amount parsing with normalized values.\n *\n * Contains the parsed amount in different formats for flexibility\n * in different ledger transaction requirements.\n */\nexport interface ParsedAmount {\n /** Original input value */\n original: number | string;\n /** Amount as a floating-point number */\n asNumber: number;\n /** Amount as a string (for precision-sensitive operations) */\n asString: string;\n /** Amount in smallest unit (e.g., tinybars, drops) */\n inSmallestUnit: bigint;\n /** Number of decimals used */\n decimals: number;\n}\n\n/**\n * Configuration for amount parsing.\n */\nexport interface AmountParseOptions {\n /** Number of decimal places for the asset (default: 0) */\n decimals?: number;\n /** Whether to allow negative amounts (default: false) */\n allowNegative?: boolean;\n /** Maximum allowed amount (optional) */\n maxAmount?: number | bigint;\n /** Minimum allowed amount (optional, default: 0 unless allowNegative) */\n minAmount?: number | bigint;\n}\n\n/**\n * Abstract base class for transaction builder services.\n *\n * Provides common functionality for building blockchain transactions\n * including validation, error handling, and amount parsing utilities.\n *\n * Ledger-specific builders (Hedera, XRPL, etc.) should extend this class\n * and implement the abstract methods for their specific requirements.\n */\nexport abstract class BaseTransactionBuilderService {\n /**\n * Logger instance for this service.\n * Injected via Angular DI and scoped to the ledger type.\n */\n protected readonly logger: Logger;\n\n /**\n * The type of ledger this builder supports (e.g., 'hedera', 'xrpl').\n * Used for error messages and logging context.\n */\n protected abstract readonly ledgerType: string;\n\n /**\n *\n */\n constructor() {\n // Inject LoggerService and create scoped logger\n // Note: Subclasses should call super() and the logger will be set up\n const loggerService = inject(LoggerService);\n this.logger = loggerService.scoped(this.constructor.name);\n }\n\n // ============================================================================\n // Validation Methods\n // ============================================================================\n\n /**\n * Validates that a string is a non-empty, valid account identifier.\n *\n * Override in subclasses for ledger-specific account format validation.\n *\n * @param account - The account identifier to validate\n * @param paramName - Parameter name for error messages\n * @throws TransactionBuilderError if validation fails\n */\n protected validateAccount(account: string, paramName = 'account'): void {\n if (!account || typeof account !== 'string') {\n throw TransactionBuilderError.missingParameter(paramName, 'transaction');\n }\n\n const trimmed = account.trim();\n if (trimmed.length === 0) {\n throw TransactionBuilderError.invalidAccount(account, this.ledgerType);\n }\n\n // Subclasses should override for specific format validation\n this.validateAccountFormat(trimmed);\n }\n\n /**\n * Validates the account format specific to the ledger type.\n * Override in subclasses for ledger-specific validation.\n *\n * @param account - The trimmed account identifier\n * @throws TransactionBuilderError if format is invalid\n */\n protected validateAccountFormat(account: string): void {\n // Default implementation - subclasses should override\n this.logger.debug('Using default account format validation', { account });\n }\n\n /**\n * Validates that an amount is a valid positive number.\n *\n * Checks for NaN, Infinity, and negative values (unless allowed).\n *\n * @param amount - The amount to validate\n * @param options - Validation options\n * @throws TransactionBuilderError if validation fails\n */\n protected validateAmount(amount: number | string, options: AmountParseOptions = {}): void {\n const { allowNegative = false, maxAmount, minAmount } = options;\n\n const numAmount = typeof amount === 'string' ? parseFloat(amount) : amount;\n\n if (typeof numAmount !== 'number' || isNaN(numAmount)) {\n throw TransactionBuilderError.invalidAmount(amount, 'must be a valid number');\n }\n\n if (!isFinite(numAmount)) {\n throw TransactionBuilderError.invalidAmount(amount, 'must be a finite number');\n }\n\n if (!allowNegative && numAmount < 0) {\n throw TransactionBuilderError.invalidAmount(amount, 'must be non-negative');\n }\n\n const effectiveMin =\n minAmount !== undefined ? Number(minAmount) : allowNegative ? -Infinity : 0;\n if (numAmount < effectiveMin) {\n throw TransactionBuilderError.invalidAmount(amount, `must be at least ${effectiveMin}`);\n }\n\n if (maxAmount !== undefined && numAmount > Number(maxAmount)) {\n throw TransactionBuilderError.invalidAmount(amount, `must not exceed ${maxAmount}`);\n }\n }\n\n /**\n * Validates that a token ID is valid for the ledger type.\n *\n * @param tokenId - The token identifier to validate\n * @throws TransactionBuilderError if validation fails\n */\n protected validateTokenId(tokenId: string): void {\n if (!tokenId || typeof tokenId !== 'string') {\n throw TransactionBuilderError.missingParameter('tokenId', 'token transaction');\n }\n\n const trimmed = tokenId.trim();\n if (trimmed.length === 0) {\n throw TransactionBuilderError.invalidTokenId(tokenId, this.ledgerType);\n }\n\n // Subclasses should override for specific format validation\n this.validateTokenIdFormat(trimmed);\n }\n\n /**\n * Validates the token ID format specific to the ledger type.\n * Override in subclasses for ledger-specific validation.\n *\n * @param tokenId - The trimmed token identifier\n * @throws TransactionBuilderError if format is invalid\n */\n protected validateTokenIdFormat(tokenId: string): void {\n // Default implementation - subclasses should override\n this.logger.debug('Using default token ID format validation', { tokenId });\n }\n\n /**\n * Validates that a required parameter is present.\n *\n * @param value - The value to check\n * @param paramName - The parameter name for error messages\n * @param operation - The operation name for error messages\n * @throws TransactionBuilderError if the value is null/undefined\n */\n protected requireParam<T>(\n value: T | null | undefined,\n paramName: string,\n operation: string,\n ): asserts value is T {\n if (value === null || value === undefined) {\n throw TransactionBuilderError.missingParameter(paramName, operation);\n }\n }\n\n // ============================================================================\n // Amount Parsing Utilities\n // ============================================================================\n\n /**\n * Parses an amount into various formats needed for transactions.\n *\n * Converts amounts between display format and smallest unit format,\n * handling decimal precision correctly to avoid floating-point errors.\n *\n * @param amount - The amount to parse (number or string)\n * @param options - Parsing options including decimals\n * @returns Parsed amount in multiple formats\n * @throws TransactionBuilderError if amount is invalid\n */\n protected parseAmount(amount: number | string, options: AmountParseOptions = {}): ParsedAmount {\n const { decimals = 0 } = options;\n\n // Validate the amount first\n this.validateAmount(amount, options);\n\n const numAmount = typeof amount === 'string' ? parseFloat(amount) : amount;\n const strAmount = String(amount);\n\n // Calculate smallest unit using precise arithmetic\n // Multiply by 10^decimals to get smallest unit\n const _multiplier = BigInt(Math.pow(10, decimals));\n\n // Handle the conversion carefully to avoid precision issues\n // Split the number into integer and fractional parts\n const [intPart, fracPart = ''] = strAmount.split('.');\n const paddedFrac = fracPart.padEnd(decimals, '0').slice(0, decimals);\n const combinedStr = intPart + paddedFrac;\n\n // Remove leading zeros but keep at least one digit\n const normalizedStr = combinedStr.replace(/^0+/, '') || '0';\n const inSmallestUnit = BigInt(normalizedStr);\n\n return {\n original: amount,\n asNumber: numAmount,\n asString: strAmount,\n inSmallestUnit,\n decimals,\n };\n }\n\n /**\n * Converts an amount from smallest unit to display format.\n *\n * @param smallestUnit - Amount in smallest unit (bigint or number)\n * @param decimals - Number of decimal places\n * @returns Formatted string with proper decimal places\n */\n protected formatFromSmallestUnit(smallestUnit: bigint | number, decimals: number): string {\n const bigVal =\n typeof smallestUnit === 'number' ? BigInt(Math.floor(smallestUnit)) : smallestUnit;\n\n if (decimals === 0) {\n return bigVal.toString();\n }\n\n const divisor = BigInt(Math.pow(10, decimals));\n const intPart = bigVal / divisor;\n const fracPart = bigVal % divisor;\n\n if (fracPart === 0n) {\n return intPart.toString();\n }\n\n const fracStr = fracPart.toString().padStart(decimals, '0');\n // Trim trailing zeros from fraction\n const trimmedFrac = fracStr.replace(/0+$/, '');\n\n return `${intPart}.${trimmedFrac}`;\n }\n\n // ============================================================================\n // Encoding Utilities\n // ============================================================================\n\n /**\n * Converts a Uint8Array to a base64 string.\n *\n * @param bytes - The byte array to encode\n * @returns Base64 encoded string\n */\n protected uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n\n /**\n * Converts a base64 string to a Uint8Array.\n *\n * @param base64 - The base64 string to decode\n * @returns Decoded byte array\n */\n protected base64ToUint8Array(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n\n /**\n * Converts a Uint8Array to a hex string.\n *\n * @param bytes - The byte array to encode\n * @returns Hex encoded string (lowercase, no prefix)\n */\n protected uint8ArrayToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n /**\n * Converts a hex string to a Uint8Array.\n *\n * @param hex - The hex string to decode (with or without 0x prefix)\n * @returns Decoded byte array\n */\n protected hexToUint8Array(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.substr(i * 2, 2), 16);\n }\n return bytes;\n }\n\n /**\n * Converts a string to a hex-encoded string.\n *\n * @param str - The string to encode\n * @returns Hex encoded string\n */\n protected stringToHex(str: string): string {\n const encoder = new TextEncoder();\n return this.uint8ArrayToHex(encoder.encode(str));\n }\n\n /**\n * Converts a hex-encoded string back to a regular string.\n *\n * @param hex - The hex string to decode\n * @returns Decoded string\n */\n protected hexToString(hex: string): string {\n const bytes = this.hexToUint8Array(hex);\n const decoder = new TextDecoder();\n return decoder.decode(bytes);\n }\n\n // ============================================================================\n // Error Handling\n // ============================================================================\n\n /**\n * Wraps an async operation with standardized error handling.\n *\n * Catches errors from the operation and wraps them in\n * TransactionBuilderError with appropriate context.\n *\n * @param operation - Name of the operation for error context\n * @param fn - The async function to execute\n * @returns The result of the function\n * @throws TransactionBuilderError with context if operation fails\n */\n protected async withErrorHandling<T>(operation: string, fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n // If it's already a TransactionBuilderError, re-throw\n if (error instanceof TransactionBuilderError) {\n this.logger.error(`${operation} failed`, {\n code: error.code,\n message: error.message,\n context: error.context,\n });\n throw error;\n }\n\n // Wrap other errors\n const message = error instanceof Error ? error.message : String(error);\n this.logger.error(`${operation} failed with unexpected error`, {\n operation,\n error: message,\n });\n\n throw new TransactionBuilderError(\n TransactionBuilderErrorCode.VALIDATION_ERROR,\n `${operation} failed: ${message}`,\n { operation, originalError: message },\n );\n }\n }\n\n // ============================================================================\n // Abstract Methods (to be implemented by subclasses)\n // ============================================================================\n\n /**\n * Serializes a transaction to a base64-encoded string.\n * Must be implemented by ledger-specific subclasses.\n *\n * @param transaction - The transaction object to serialize\n * @param payerAccount - The account paying for the transaction\n * @returns Base64 encoded transaction bytes\n */\n protected abstract serializeTransaction(\n transaction: unknown,\n payerAccount: string,\n ): Promise<string>;\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * Scale a whole-token amount up to base units using the token's decimals\n * value, with bigint arithmetic so 10^decimals never overflows JS number\n * precision.\n *\n * Mirror of the canonical helper at\n * `packages/transaction-builders/src/lib/hedera-amount-utils.ts`. Kept in\n * sync deliberately — the angular-sdk does not depend on the\n * transaction-builders package (each maintains its own builder copy), so a\n * shared re-export is not currently possible without introducing a new\n * workspace dep. The canonical file carries the vitest spec; this copy\n * exists solely so consumers importing from `@hsuite/native-connect-angular`\n * have a single import surface.\n *\n * @param amount\n * @param decimals\n * @see packages/transaction-builders/src/lib/hedera-amount-utils.ts\n */\n// SYNC-START: scaleHederaAmountToBaseUnits — see __tests__/sync.spec.ts\nexport function scaleHederaAmountToBaseUnits(amount: number, decimals: number): bigint {\n if (!Number.isFinite(amount)) {\n throw new RangeError(\n `scaleHederaAmountToBaseUnits: amount must be a finite number, got ${amount}`,\n );\n }\n if (amount < 0) {\n throw new RangeError(\n `scaleHederaAmountToBaseUnits: amount must be non-negative, got ${amount}`,\n );\n }\n if (!Number.isInteger(decimals)) {\n throw new RangeError(\n `scaleHederaAmountToBaseUnits: decimals must be an integer, got ${decimals}`,\n );\n }\n if (decimals < 0) {\n throw new RangeError(\n `scaleHederaAmountToBaseUnits: decimals must be non-negative, got ${decimals}`,\n );\n }\n if (amount === 0) return 0n;\n const whole = Math.trunc(amount);\n const fraction = amount - whole;\n const scale = 10n ** BigInt(decimals);\n const wholePart = BigInt(whole) * scale;\n if (fraction === 0) return wholePart;\n const fractionalPart = BigInt(Math.round(fraction * Number(scale)));\n return wholePart + fractionalPart;\n}\n// SYNC-END: scaleHederaAmountToBaseUnits\n\n/**\n * Narrow a `bigint` to a JS `number` after asserting it fits within\n * `Number.MAX_SAFE_INTEGER`. Throws `RangeError` with the supplied context\n * on overflow.\n *\n * Mirror of the canonical helper at\n * `packages/transaction-builders/src/lib/hedera-amount-utils.ts`. Kept in\n * sync deliberately — see the SYNC note above.\n * @param value\n * @param context\n */\n// SYNC-START: assertSafeInteger — see __tests__/sync.spec.ts\nexport function assertSafeInteger(value: bigint, context: string): number {\n const max = BigInt(Number.MAX_SAFE_INTEGER);\n const min = BigInt(Number.MIN_SAFE_INTEGER);\n if (value > max || value < min) {\n throw new RangeError(\n `${context}: value ${value.toString()} exceeds JS safe-integer range (${Number.MIN_SAFE_INTEGER}..${Number.MAX_SAFE_INTEGER}). The Hedera SDK accepts Long for larger values; if you need >2^53 base units, the builder signature must widen to accept Long/bigint.`,\n );\n }\n return Number(value);\n}\n// SYNC-END: assertSafeInteger\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file Service for building Hedera transactions using the Hashgraph SDK.\n *\n * @module services/transaction-builders/hedera\n *\n * @description\n * HederaTransactionBuilderService provides methods to construct various Hedera transaction\n * types and serialize them to base64 payloads ready for signing. It uses the @hashgraph/sdk\n * library for proper transaction construction and automatically freezes transactions with\n * the correct network client.\n *\n * **Supported Transaction Types:**\n * - HBAR transfers (single and atomic multi-transfer)\n * - Fungible token transfers\n * - NFT transfers\n * - Token association/dissociation\n * - Token creation (with auto key configuration)\n * - Token minting/burning\n * - Topic creation (with auto key configuration)\n * - Topic message submission\n * - Account creation (with multisig support)\n * - Account updates\n * - Batch transactions\n *\n * **Auto-Key Configuration:**\n * When creating entities (topics, tokens, accounts), the builder automatically\n * inherits the key structure from the active account:\n * - Single-sig accounts -> entity uses account's public key\n * - Multisig accounts -> entity uses threshold key with all signers\n */\n\nimport { Injectable, inject } from '@angular/core';\nimport {\n TransferTransaction,\n TokenAssociateTransaction,\n TokenDissociateTransaction,\n TokenCreateTransaction,\n TokenMintTransaction,\n TokenBurnTransaction,\n TopicCreateTransaction,\n TopicMessageSubmitTransaction,\n AccountCreateTransaction,\n AccountUpdateTransaction,\n ScheduleCreateTransaction,\n BatchTransaction,\n Transaction,\n Hbar,\n AccountId,\n TokenId,\n NftId,\n TransactionId,\n Client,\n PrivateKey,\n PublicKey,\n TokenType,\n TokenSupplyType,\n KeyList,\n Key,\n} from '@hashgraph/sdk';\n\nimport { LoggerService } from '../logger.service';\nimport { UnifiedWalletService } from '../unified-wallet.service';\n\nimport { scaleHederaAmountToBaseUnits, assertSafeInteger } from './hedera-amount-utils';\n\n/**\n * Supported inner transaction types for batch transactions.\n * Excludes 'batch-transaction' since batches cannot be nested.\n */\nexport type BatchInnerTransactionType =\n | 'send-hbar'\n | 'send-token'\n | 'send-nft'\n | 'token-associate'\n | 'token-dissociate'\n | 'token-create'\n | 'token-mint'\n | 'token-burn'\n | 'topic-create'\n | 'topic-message'\n | 'account-create'\n | 'account-update';\n\n/**\n * Inner transaction descriptor for batch transactions.\n * Contains all possible fields for different transaction types.\n */\nexport interface BatchInnerTransaction {\n /** Type of transaction */\n type: BatchInnerTransactionType;\n\n // Transfer fields (send-hbar, send-token, send-nft)\n /** Recipient account */\n toAccount?: string;\n /** Amount for HBAR (tinybars) or token transfers */\n amount?: number;\n /** Token ID for token operations */\n tokenId?: string;\n /** Serial number for NFT transfers */\n serialNumber?: number;\n\n // Token create fields\n /** Token name for creation */\n tokenName?: string;\n /** Token symbol for creation */\n tokenSymbol?: string;\n /** Token decimals for creation */\n decimals?: number;\n /** Initial supply for fungible tokens */\n initialSupply?: number;\n /** Max supply (0 = infinite) */\n maxSupply?: number;\n /** Whether supply is finite or infinite */\n supplyType?: 'finite' | 'infinite';\n\n // Token mint/burn fields\n /** Metadata for NFT minting (array for multiple NFTs) */\n metadata?: string | string[];\n\n // Topic fields\n /** Topic ID for message submission */\n topicId?: string;\n /** Message content for topic submission */\n message?: string;\n /** Topic memo for creation */\n topicMemo?: string;\n\n // Account fields\n /** Initial balance for account creation (tinybars) */\n initialBalance?: number;\n /** Memo for account update */\n memo?: string;\n /** Max auto associations for account */\n maxAutoAssociations?: number;\n}\n\n/**\n * Key configuration for entity creation transactions.\n *\n * For single-sig accounts: provide a single publicKey string\n * For multisig accounts: provide signerPublicKeys array + threshold\n */\nexport interface HederaKeyConfig {\n /**\n * Single public key (hex/DER encoded) for single-sig accounts.\n * If provided alone, this key is used directly.\n */\n publicKey?: string;\n\n /**\n * Array of public keys for multisig (threshold key) configuration.\n * Requires threshold to be set.\n */\n signerPublicKeys?: string[];\n\n /**\n * Threshold for multisig - number of signatures required.\n * Only used when signerPublicKeys is provided.\n */\n threshold?: number;\n}\n\n/**\n * Extended options for topic creation with key configuration.\n */\nexport interface TopicCreateOptions {\n /** Topic memo/description */\n memo?: string;\n /** Admin key - can update/delete the topic. Uses creator's key if not specified. */\n adminKey?: HederaKeyConfig;\n /** Submit key - required to submit messages. If not set, anyone can submit. */\n submitKey?: HederaKeyConfig;\n /** Auto-renew account for fees */\n autoRenewAccountId?: string;\n}\n\n/**\n * Extended options for token creation with key configuration.\n */\nexport interface TokenCreateOptions {\n /** Token name */\n name: string;\n /** Token symbol */\n symbol: string;\n /** Decimal places (0 for NFTs) */\n decimals: number;\n /** Initial supply (0 for NFTs) */\n initialSupply: number;\n /** Token type: FUNGIBLE or NFT */\n tokenType?: 'FUNGIBLE' | 'NFT';\n /** Admin key - can update/delete token */\n adminKey?: HederaKeyConfig;\n /** Supply key - can mint/burn tokens */\n supplyKey?: HederaKeyConfig;\n /** Freeze key - can freeze/unfreeze accounts */\n freezeKey?: HederaKeyConfig;\n /** Wipe key - can wipe token balance from accounts */\n wipeKey?: HederaKeyConfig;\n /** Pause key - can pause/unpause token operations */\n pauseKey?: HederaKeyConfig;\n /** KYC key - can grant/revoke KYC */\n kycKey?: HederaKeyConfig;\n /** Fee schedule key - can update custom fees */\n feeScheduleKey?: HederaKeyConfig;\n /** Token memo */\n memo?: string;\n /** Max supply (for finite tokens) */\n maxSupply?: number;\n}\n\n/**\n * Extended options for account creation with key configuration.\n */\nexport interface AccountCreateOptions {\n /** Initial HBAR balance */\n initialBalance: number;\n /**\n * Key configuration for the new account.\n * For single-sig: provide publicKey\n * For multisig: provide signerPublicKeys + threshold\n */\n key?: HederaKeyConfig;\n /** Account memo */\n memo?: string;\n /** Max automatic token associations */\n maxAutomaticTokenAssociations?: number;\n /** Receiver signature required */\n receiverSignatureRequired?: boolean;\n}\n\n/**\n * Service for building Hedera transactions using the Hashgraph SDK.\n *\n * @service HederaTransactionBuilderService\n *\n * @description\n * Provides methods to construct various Hedera transaction types and serialize them\n * to base64 payloads ready for signing. Transactions are automatically frozen with\n * the correct network client (mainnet/testnet) based on the active wallet session.\n *\n * All build methods return a base64-encoded string that can be passed to\n * UnifiedWalletService.signTransaction() or submitTransaction().\n *\n * @providedIn root\n *\n * @Component({ ... })\n * export class SendPage {\n * private builder = inject(HederaTransactionBuilderService);\n * private wallet = inject(UnifiedWalletService);\n *\n * async sendHbar(to: string, amount: number) {\n * const from = this.wallet.activeAccount()?.address;\n * const payload = await this.builder.buildSendHbar(from!, to, amount);\n * return this.wallet.submitTransaction({ payload });\n * }\n * }\n * ```\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class HederaTransactionBuilderService {\n private readonly wallet = inject(UnifiedWalletService);\n private readonly logger = inject(LoggerService).scoped('HederaTransactionBuilder');\n\n /**\n * Gets the network ID from the active wallet account.\n *\n * @description\n * Extracts the network identifier (e.g., 'hedera:mainnet', 'hedera:testnet')\n * from the currently active account. Used to create the appropriate Hedera\n * client for transaction freezing.\n *\n * @returns Network ID string, or undefined if no active account\n *\n * @throws {Error} When used in methods that require a network, if no account is active\n */\n private getNetworkId(): string | undefined {\n const activeAccount = this.wallet.activeAccount();\n return activeAccount?.networkId;\n }\n\n /**\n * Build a Hedera Key from configuration.\n *\n * For single-sig: returns PublicKey directly\n * For multisig: returns KeyList (threshold key) with all signer public keys\n *\n * @param config - Key configuration (single key or threshold key)\n * @returns Hedera Key object or undefined if config is empty\n */\n private buildKeyFromConfig(config?: HederaKeyConfig): Key | undefined {\n if (!config) {\n return undefined;\n }\n\n // Multisig: threshold key with multiple signers\n if (config.signerPublicKeys && config.signerPublicKeys.length > 0 && config.threshold) {\n const publicKeys = config.signerPublicKeys.map((pk) => PublicKey.fromString(pk));\n const keyList = new KeyList(publicKeys, config.threshold);\n this.logger.debug('Built threshold key', {\n signerCount: publicKeys.length,\n threshold: config.threshold,\n });\n return keyList;\n }\n\n // Single-sig: direct public key\n if (config.publicKey) {\n const key = PublicKey.fromString(config.publicKey);\n this.logger.debug('Built single public key');\n return key;\n }\n\n return undefined;\n }\n\n /**\n * Get the key configuration for the active account.\n *\n * For single-sig: returns { publicKey: '...' }\n * For multisig: returns { signerPublicKeys: [...], threshold: N }\n *\n * This allows automatic key configuration for entity creation (topics, tokens, etc.)\n * so that entities inherit the same key structure as the creating account.\n *\n * @returns Key configuration or undefined if no active account\n */\n private getActiveAccountKeyConfig(): HederaKeyConfig | undefined {\n const activeAccount = this.wallet.activeAccount();\n if (!activeAccount) {\n this.logger.debug('No active account for key config');\n return undefined;\n }\n\n const metadata = activeAccount.metadata;\n\n // Check if this is a multisig account\n if (metadata?.['isMultisig'] === true) {\n const signerPublicKeys = metadata['signerPublicKeys'] as string[] | undefined;\n const threshold = metadata['threshold'] as number | undefined;\n\n if (signerPublicKeys && signerPublicKeys.length > 0 && threshold) {\n this.logger.debug('Active account is multisig', {\n threshold,\n signerCount: signerPublicKeys.length,\n });\n return { signerPublicKeys, threshold };\n }\n\n this.logger.warn('Multisig account missing signer keys or threshold in metadata');\n return undefined;\n }\n\n // Single-sig account - get public key from metadata\n const publicKey = metadata?.['publicKey'] as string | undefined;\n if (publicKey) {\n this.logger.debug('Active account is single-sig');\n return { publicKey };\n }\n\n this.logger.debug('No public key in active account metadata');\n return undefined;\n }\n\n /**\n * Builds a simple HBAR transfer transaction.\n *\n * @description\n * Creates a TransferTransaction that moves HBAR from one account to another.\n * The transaction is automatically frozen with the appropriate network client.\n *\n * @param fromAccount - Sender account ID (e.g., \"0.0.12345\")\n * @param toAccount - Recipient account ID\n * @param amount - Amount in HBAR (e.g., 1.5 for 1.5 HBAR)\n *\n * @returns Base64 encoded transaction bytes\n *\n * @throws {Error} If no active wallet session\n */\n async buildSendHbar(fromAccount: string, toAccount: string, amount: number): Promise<string> {\n const transaction = new TransferTransaction()\n .addHbarTransfer(AccountId.fromString(fromAccount), new Hbar(-amount))\n .addHbarTransfer(AccountId.fromString(toAccount), new Hbar(amount));\n\n return this.serializeTransaction(transaction, fromAccount);\n }\n\n /**\n * Builds a fungible token transfer transaction.\n *\n * @description\n * Creates a TransferTransaction that moves fungible tokens between accounts.\n * The amount is automatically converted to the smallest unit based on decimals.\n *\n * @param fromAccount - Sender account ID\n * @param toAccount - Recipient account ID\n * @param tokenId - Token ID (e.g., \"0.0.98765\")\n * @param amount - Token amount in display units (e.g., 100 tokens)\n * @param decimals - Token decimals for conversion (default 0)\n *\n * @returns Base64 encoded transaction bytes\n *\n * @throws {Error} If no active wallet session\n */\n async buildSendToken(\n fromAccount: string,\n toAccount: string,\n tokenId: string,\n amount: number,\n decimals = 0,\n ): Promise<string> {\n const token = TokenId.fromString(tokenId);\n // bigint scaling avoids the silent precision loss that\n // `amount * Math.pow(10, decimals)` exhibits past Number.MAX_SAFE_INTEGER\n // (Hedera supports up to 18 decimals). Narrow once at the SDK boundary\n // with an explicit overflow assertion.\n const scaled = scaleHederaAmountToBaseUnits(amount, decimals);\n const actualAmount = assertSafeInteger(scaled, `buildSendToken tokenId=${tokenId}`);\n\n const transaction = new TransferTransaction()\n .addTokenTransfer(token, AccountId.fromString(fromAccount), -actualAmount)\n .addTokenTransfer(token, AccountId.fromString(toAccount), actualAmount);\n\n return this.serializeTransaction(transaction, fromAccount);\n }\n\n /**\n * Builds an NFT transfer transaction.\n *\n * @description\n * Creates a TransferTransaction that moves an NFT (identified by token ID\n * and serial number) from one account to another.\n *\n * @param fromAccount - Sender account ID\n * @param toAccount - Recipient account ID\n * @param tokenId - NFT token ID (e.g., \"0.0.98765\")\n * @param serialNumber - NFT serial number (e.g., 1, 2, 3)\n *\n * @returns Base64 encoded transaction bytes\n *\n * @throws {Error} If no active wallet session\n */\n async buildSendNft(\n fromAccount: string,\n toAccount: string,\n tokenId: string,\n serialNumber: number,\n ): Promise<string> {\n const nftId = new NftId(TokenId.fromString(tokenId), serialNumber);\n\n const transaction = new TransferTransaction().addNftTransfer(\n nftId,\n AccountId.fromString(fromAccount),\n AccountId.fromString(toAccount),\n );\n\n return this.serializeTransaction(transaction, fromAccount);\n }\n\n /**\n * Builds a token association transaction.\n *\n * @description\n * Creates a TokenAssociateTransaction that associates one or more tokens\n * with an account. This is required before an account can receive tokens\n * on Hedera.\n *\n * @param account - Account to associate tokens with\n * @param tokenIds - Array of token IDs to associate\n *\n * @returns Base64 encoded transaction bytes\n *\n * @throws {Error} If no active wallet session\n */\n async buildAssociateToken(account: string, tokenIds: string[]): Promise<string> {\n const tokens = tokenIds.map((id) => TokenId.fromString(id));\n\n const transaction = new TokenAssociateTransaction()\n .setAccountId(AccountId.fromString(account))\n .setTokenIds(tokens);\n\n return this.serializeTransaction(transaction, account);\n }\n\n /**\n * Builds a token dissociation transaction.\n *\n * @description\n * Creates a TokenDissociateTransaction that removes the association between\n * an account and one or more tokens. The account must have zero balance of\n * each token before dissociating.\n *\n * @param account - Account to dissociate tokens from\n * @param tokenIds - Array of token IDs to dissociate\n *\n * @returns Base64 encoded transaction bytes\n *\n * @throws {Error} If no active wallet session\n */\n async buildDissociateToken(account: string, tokenIds: string[]): Promise<string> {\n const tokens = tokenIds.map((id) => TokenId.fromString(id));\n\n const transaction = new TokenDissociateTransaction()\n .setAccountId(AccountId.fromString(account))\n .setTokenIds(tokens);\n\n return this.serializeTransaction(transaction, account);\n }\n\n /**\n * Build a scheduled transaction\n * @param innerTransactionBytes - Base64 encoded inner transaction\n * @param payerAccount - Payer account for the scheduled transaction (required)\n * @param memo - Optional memo\n * @returns Base64 encoded scheduled transaction bytes\n */\n async buildScheduledTransaction(\n innerTransactionBytes: string,\n payerAccount: string,\n memo?: string,\n ): Promise<string> {\n const exampleInnerTx = new TransferTransaction()\n .addHbarTransfer(AccountId.fromString(payerAccount), new Hbar(-1))\n .addHbarTransfer(AccountId.fromString('0.0.3'), new Hbar(1));\n\n const transaction = new ScheduleCreateTransaction()\n .setScheduledTransaction(exampleInnerTx)\n .setPayerAccountId(AccountId.fromString(payerAccount));\n\n if (memo) {\n transaction.setScheduleMemo(memo);\n }\n\n return this.serializeTransaction(transaction, payerAccount);\n }\n\n /**\n * Build a batch of transactions with the same payer\n * @param transactions - Array of base64 encoded transactions\n * @returns Array of base64 encoded transactions (ready for batch submission)\n */\n async buildBatchTransactions(transactions: string[]): Promise<string[]> {\n return transactions;\n }\n\n /**\n * Build a complex atomic transaction (multiple transfers in one transaction)\n * @param transfers - Array of transfer operations\n * @returns Base64 encoded transaction bytes\n */\n async buildAtomicTransaction(\n transfers: Array<{\n type: 'hbar' | 'token';\n fromAccount: string;\n toAccount: string;\n amount: number;\n tokenId?: string;\n decimals?: number;\n }>,\n ): Promise<string> {\n if (transfers.length === 0) {\n throw new Error('At least one transfer is required for an atomic transaction');\n }\n\n const transaction = new TransferTransaction();\n const payerAccount = transfers[0].fromAccount;\n\n for (const transfer of transfers) {\n if (transfer.type === 'hbar') {\n transaction\n .addHbarTransfer(AccountId.fromString(transfer.fromAccount), new Hbar(-transfer.amount))\n .addHbarTransfer(AccountId.fromString(transfer.toAccount), new Hbar(transfer.amount));\n } else if (transfer.type === 'token' && transfer.tokenId) {\n const token = TokenId.fromString(transfer.tokenId);\n const decimals = transfer.decimals || 0;\n const scaled = scaleHederaAmountToBaseUnits(transfer.amount, decimals);\n const actualAmount = assertSafeInteger(\n scaled,\n `atomicTransaction token=${transfer.tokenId}`,\n );\n\n transaction\n .addTokenTransfer(token, AccountId.fromString(transfer.fromAccount), -actualAmount)\n .addTokenTransfer(token, AccountId.fromString(transfer.toAccount), actualAmount);\n }\n }\n\n return this.serializeTransaction(transaction, payerAccount);\n }\n\n /**\n * Build a token creation transaction with automatic key configuration.\n *\n * **Auto-key behavior**: If no adminKey/supplyKey is provided, the token will automatically\n * inherit the creating account's key structure:\n * - Single-sig account → token keys = account's public key\n * - Multisig account → token keys = threshold key with all signers\n *\n * This ensures tokens created from multisig accounts are also controlled by the multisig.\n *\n * @param treasuryAccount - Account that will hold the tokens\n * @param options - Token creation options (keys auto-detected if not provided)\n * @param optionsOrName\n * @param symbol\n * @param decimals\n * @param initialSupply\n * @param tokenType\n * @returns Base64 encoded transaction bytes\n */\n async buildTokenCreate(\n treasuryAccount: string,\n optionsOrName: TokenCreateOptions | string,\n symbol?: string,\n decimals?: number,\n initialSupply?: number,\n tokenType: 'FUNGIBLE' | 'NFT' = 'FUNGIBLE',\n ): Promise<string> {\n // Support both object and positional arguments\n const opts: TokenCreateOptions =\n typeof optionsOrName === 'string'\n ? {\n name: optionsOrName,\n symbol: symbol!,\n decimals: decimals!,\n initialSupply: initialSupply!,\n tokenType,\n }\n : optionsOrName;\n\n const transaction = new TokenCreateTransaction()\n .setTokenName(opts.name)\n .setTokenSymbol(opts.symbol)\n .setDecimals(opts.decimals)\n .setInitialSupply(opts.initialSupply)\n .setTreasuryAccountId(AccountId.fromString(treasuryAccount))\n .setTokenType(\n opts.tokenType === 'NFT' ? TokenType.NonFungibleUnique : TokenType.FungibleCommon,\n )\n .setSupplyType(opts.maxSupply ? TokenSupplyType.Finite : TokenSupplyType.Infinite);\n\n // Set max supply if finite\n if (opts.maxSupply) {\n transaction.setMaxSupply(opts.maxSupply);\n }\n\n // Set memo if provided\n if (opts.memo) {\n transaction.setTokenMemo(opts.memo);\n }\n\n // Auto-detect key config from active account if not explicitly provided\n const autoKeyConfig = this.getActiveAccountKeyConfig();\n const isAutoDetected = !!autoKeyConfig;\n\n // Set admin key - use provided or auto-detected\n const adminKeyConfig = opts.adminKey ?? autoKeyConfig;\n const adminKey = this.buildKeyFromConfig(adminKeyConfig);\n if (adminKey) {\n transaction.setAdminKey(adminKey);\n this.logger.debug('Token admin key set', { autoDetected: !opts.adminKey && isAutoDetected });\n }\n\n // Set supply key - use provided or auto-detected\n const supplyKeyConfig = opts.supplyKey ?? autoKeyConfig;\n const supplyKey = this.buildKeyFromConfig(supplyKeyConfig);\n if (supplyKey) {\n transaction.setSupplyKey(supplyKey);\n this.logger.debug('Token supply key set', {\n autoDetected: !opts.supplyKey && isAutoDetected,\n });\n }\n\n // Set freeze key - only if explicitly provided (not auto-set)\n const freezeKey = this.buildKeyFromConfig(opts.freezeKey);\n if (freezeKey) {\n transaction.setFreezeKey(freezeKey);\n this.logger.debug('Token freeze key set');\n }\n\n // Set wipe key - only if explicitly provided (not auto-set)\n const wipeKey = this.buildKeyFromConfig(opts.wipeKey);\n if (wipeKey) {\n transaction.setWipeKey(wipeKey);\n this.logger.debug('Token wipe key set');\n }\n\n // Set pause key - only if explicitly provided (not auto-set)\n const pauseKey = this.buildKeyFromConfig(opts.pauseKey);\n if (pauseKey) {\n transaction.setPauseKey(pauseKey);\n this.logger.debug('Token pause key set');\n }\n\n // Set KYC key - only if explicitly provided (not auto-set)\n const kycKey = this.buildKeyFromConfig(opts.kycKey);\n if (kycKey) {\n transaction.setKycKey(kycKey);\n this.logger.debug('Token KYC key set');\n }\n\n // Set fee schedule key - only if explicitly provided (not auto-set)\n const feeScheduleKey = this.buildKeyFromConfig(opts.feeScheduleKey);\n if (feeScheduleKey) {\n transaction.setFeeScheduleKey(feeScheduleKey);\n this.logger.debug('Token fee schedule key set');\n }\n\n return this.serializeTransaction(transaction, treasuryAccount);\n }\n\n /**\n * Build a token mint transaction\n * @param tokenId - Token ID to mint\n * @param amount - Amount to mint\n * @param account - Account performing the mint\n * @returns Base64 encoded transaction bytes\n */\n async buildTokenMint(tokenId: string, amount: number, account: string): Promise<string> {\n const transaction = new TokenMintTransaction()\n .setTokenId(TokenId.fromString(tokenId))\n .setAmount(amount);\n\n return this.serializeTransaction(transaction, account);\n }\n\n /**\n * Build a token burn transaction\n * @param tokenId - Token ID to burn\n * @param amount - Amount to burn\n * @param account - Account performing the burn\n * @returns Base64 encoded transaction bytes\n */\n async buildTokenBurn(tokenId: string, amount: number, account: string): Promise<string> {\n const transaction = new TokenBurnTransaction()\n .setTokenId(TokenId.fromString(tokenId))\n .setAmount(amount);\n\n return this.serializeTransaction(transaction, account);\n }\n\n /**\n * Build a topic creation transaction with automatic key configuration.\n *\n * **Auto-key behavior**: If no adminKey is provided, the topic will automatically\n * inherit the creating account's key structure:\n * - Single-sig account → topic adminKey = account's public key\n * - Multisig account → topic adminKey = threshold key with all signers\n *\n * This ensures topics created from multisig accounts are also controlled by the multisig.\n *\n * @param account - Account creating the topic\n * @param options - Topic creation options (keys auto-detected if not provided)\n * @returns Base64 encoded transaction bytes\n */\n async buildTopicCreate(\n account: string,\n options?: TopicCreateOptions | string, // string treated as memo\n ): Promise<string> {\n const transaction = new TopicCreateTransaction();\n\n // Support both object and string (memo shorthand)\n const opts: TopicCreateOptions =\n typeof options === 'string' ? { memo: options } : (options ?? {});\n\n if (opts.memo) {\n transaction.setTopicMemo(opts.memo);\n }\n\n // Auto-detect key config from active account if not explicitly provided\n const autoKeyConfig = this.getActiveAccountKeyConfig();\n\n // Set admin key - use provided or auto-detected\n const adminKeyConfig = opts.adminKey ?? autoKeyConfig;\n const adminKey = this.buildKeyFromConfig(adminKeyConfig);\n if (adminKey) {\n transaction.setAdminKey(adminKey);\n this.logger.debug('Topic admin key set', {\n isThreshold: adminKeyConfig?.signerPublicKeys ? true : false,\n autoDetected: !opts.adminKey && !!autoKeyConfig,\n });\n }\n\n // Set submit key - use provided or auto-detected (same as admin by default)\n const submitKeyConfig = opts.submitKey ?? autoKeyConfig;\n const submitKey = this.buildKeyFromConfig(submitKeyConfig);\n if (submitKey) {\n transaction.setSubmitKey(submitKey);\n this.logger.debug('Topic submit key set', {\n isThreshold: submitKeyConfig?.signerPublicKeys ? true : false,\n autoDetected: !opts.submitKey && !!autoKeyConfig,\n });\n }\n\n // Set auto-renew account if provided\n if (opts.autoRenewAccountId) {\n transaction.setAutoRenewAccountId(AccountId.fromString(opts.autoRenewAccountId));\n }\n\n return this.serializeTransaction(transaction, account);\n }\n\n /**\n * Build a topic message submit transaction\n * @param topicId - Topic ID (e.g., \"0.0.12345\")\n * @param message - Message to submit\n * @param account - Account submitting the message\n * @returns Base64 encoded transaction bytes\n */\n async buildTopicMessageSubmit(\n topicId: string,\n message: string,\n account: string,\n ): Promise<string> {\n const transaction = new TopicMessageSubmitTransaction().setTopicId(topicId).setMessage(message);\n\n return this.serializeTransaction(transaction, account);\n }\n\n /**\n * Build an account creation transaction with key configuration.\n *\n * For single-sig accounts: pass { publicKey: '...' }\n * For multisig accounts: pass { signerPublicKeys: [...], threshold: N }\n *\n * If no key is provided, a random key is generated (NOT RECOMMENDED for production).\n *\n * @param creatorAccount - Account creating the new account\n * @param options - Account creation options including key config\n * @param optionsOrBalance\n * @returns Base64 encoded transaction bytes\n */\n async buildAccountCreate(\n creatorAccount: string,\n optionsOrBalance: AccountCreateOptions | number,\n ): Promise<string> {\n // Support both object and number (initial balance shorthand)\n const opts: AccountCreateOptions =\n typeof optionsOrBalance === 'number'\n ? { initialBalance: optionsOrBalance }\n : optionsOrBalance;\n\n const transaction = new AccountCreateTransaction().setInitialBalance(\n new Hbar(opts.initialBalance),\n );\n\n // Auto-detect key config from active account if not explicitly provided\n // This ensures accounts created from multisig wallets inherit the multisig key structure\n const autoKeyConfig = this.getActiveAccountKeyConfig();\n const keyConfig = opts.key ?? autoKeyConfig;\n\n // Set account key - use provided or auto-detected\n const accountKey = this.buildKeyFromConfig(keyConfig);\n if (accountKey) {\n transaction.setKey(accountKey);\n this.logger.debug('Account key set', {\n isThreshold: keyConfig?.signerPublicKeys ? true : false,\n autoDetected: !opts.key && !!autoKeyConfig,\n });\n } else {\n // Fallback: generate random key (not recommended for production)\n const newKey = PrivateKey.generateED25519();\n transaction.setKey(newKey.publicKey);\n this.logger.warn(\n 'Generated random key for new account - provide key config for production use',\n );\n }\n\n // Set memo if provided\n if (opts.memo) {\n transaction.setAccountMemo(opts.memo);\n }\n\n // Set max automatic token associations\n if (opts.maxAutomaticTokenAssociations !== undefined) {\n transaction.setMaxAutomaticTokenAssociations(opts.maxAutomaticTokenAssociations);\n }\n\n // Set receiver signature required\n if (opts.receiverSignatureRequired !== undefined) {\n transaction.setReceiverSignatureRequired(opts.receiverSignatureRequired);\n }\n\n return this.serializeTransaction(transaction, creatorAccount);\n }\n\n /**\n * Build an account update transaction\n * @param accountId - Account to update\n * @param memo - New account memo\n * @returns Base64 encoded transaction bytes\n */\n async buildAccountUpdate(accountId: string, memo: string): Promise<string> {\n const transaction = new AccountUpdateTransaction()\n .setAccountId(AccountId.fromString(accountId))\n .setAccountMemo(memo);\n\n return this.serializeTransaction(transaction, accountId);\n }\n\n /**\n * Build a batch transaction with multiple inner transactions\n * @param innerTransactions - Array of transaction descriptors\n * @param payerAccount - Account paying for the batch transaction\n * @returns Base64 encoded batch transaction bytes\n */\n async buildBatchTransaction(\n innerTransactions: Array<{\n type: 'send-hbar' | 'send-token' | 'token-mint';\n toAccount?: string;\n amount: number;\n tokenId?: string;\n }>,\n payerAccount: string,\n ): Promise<string> {\n const networkId = this.getNetworkId();\n\n if (!networkId) {\n throw new Error('No active wallet session. Please connect your wallet first.');\n }\n\n const client = this.createClientForNetwork(networkId);\n const batchKey = PrivateKey.generateED25519();\n const batchPublicKey = batchKey.publicKey;\n const preparedTransactions = [];\n\n for (const tx of innerTransactions) {\n let transaction;\n\n switch (tx.type) {\n case 'send-hbar':\n transaction = new TransferTransaction()\n .addHbarTransfer(AccountId.fromString(payerAccount), new Hbar(-tx.amount))\n .addHbarTransfer(AccountId.fromString(tx.toAccount!), new Hbar(tx.amount))\n .setTransactionId(TransactionId.generate(AccountId.fromString(payerAccount)))\n .setBatchKey(batchPublicKey);\n break;\n\n case 'send-token':\n transaction = new TransferTransaction()\n .addTokenTransfer(\n TokenId.fromString(tx.tokenId!),\n AccountId.fromString(payerAccount),\n -tx.amount,\n )\n .addTokenTransfer(\n TokenId.fromString(tx.tokenId!),\n AccountId.fromString(tx.toAccount!),\n tx.amount,\n )\n .setTransactionId(TransactionId.generate(AccountId.fromString(payerAccount)))\n .setBatchKey(batchPublicKey);\n break;\n\n case 'token-mint':\n transaction = new TokenMintTransaction()\n .setTokenId(TokenId.fromString(tx.tokenId!))\n .setAmount(tx.amount)\n .setTransactionId(TransactionId.generate(AccountId.fromString(payerAccount)))\n .setBatchKey(batchPublicKey);\n break;\n\n default:\n continue;\n }\n\n if (transaction) {\n const frozen = await transaction.freezeWith(client);\n preparedTransactions.push(frozen);\n }\n }\n\n const batchTransaction = new BatchTransaction().setTransactionId(\n TransactionId.generate(AccountId.fromString(payerAccount)),\n );\n\n for (const tx of preparedTransactions) {\n batchTransaction.addInnerTransaction(tx);\n }\n\n const frozenBatch = await batchTransaction.freezeWith(client);\n const signedBatch = await frozenBatch.sign(batchKey);\n const bytes = signedBatch.toBytes();\n\n return this.uint8ArrayToBase64(bytes);\n }\n\n /**\n * Build inner transactions for batch (unsigned, with batchKey set)\n * @param account - Account executing the batch\n * @param batchKey - Public key for batch transactions\n * @param innerTransactions - Array of transaction descriptors\n * @returns Array of base64 encoded unsigned inner transactions\n */\n async buildBatchInnerTransactions(\n account: string,\n batchKey: string,\n innerTransactions: Array<BatchInnerTransaction>,\n ): Promise<Array<{ payload: string; description: string }>> {\n const accountId = AccountId.fromString(account);\n const batchPublicKey = PublicKey.fromString(batchKey);\n\n const networkId = this.getNetworkId();\n\n if (!networkId) {\n throw new Error('No active wallet session. Please connect your wallet first.');\n }\n\n const client = this.createClientForNetwork(networkId);\n const results: Array<{ payload: string; description: string }> = [];\n\n for (const tx of innerTransactions) {\n let transaction: Transaction;\n let description: string;\n\n try {\n switch (tx.type) {\n case 'send-hbar':\n transaction = new TransferTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .addHbarTransfer(accountId, Hbar.fromTinybars(-(tx.amount || 0)))\n .addHbarTransfer(\n AccountId.fromString(tx.toAccount!),\n Hbar.fromTinybars(tx.amount || 0),\n )\n .setBatchKey(batchPublicKey);\n description = `Send ${tx.amount} tinybar to ${tx.toAccount}`;\n break;\n\n case 'send-token':\n transaction = new TransferTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .addTokenTransfer(TokenId.fromString(tx.tokenId!), accountId, -(tx.amount || 0))\n .addTokenTransfer(\n TokenId.fromString(tx.tokenId!),\n AccountId.fromString(tx.toAccount!),\n tx.amount || 0,\n )\n .setBatchKey(batchPublicKey);\n description = `Send ${tx.amount} of token ${tx.tokenId} to ${tx.toAccount}`;\n break;\n\n case 'send-nft':\n transaction = new TransferTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .addNftTransfer(\n new NftId(TokenId.fromString(tx.tokenId!), tx.serialNumber || 1),\n accountId,\n AccountId.fromString(tx.toAccount!),\n )\n .setBatchKey(batchPublicKey);\n description = `Send NFT ${tx.tokenId}#${tx.serialNumber} to ${tx.toAccount}`;\n break;\n\n case 'token-associate':\n transaction = new TokenAssociateTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .setAccountId(accountId)\n .setTokenIds([TokenId.fromString(tx.tokenId!)])\n .setBatchKey(batchPublicKey);\n description = `Associate token ${tx.tokenId}`;\n break;\n\n case 'token-dissociate':\n transaction = new TokenDissociateTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .setAccountId(accountId)\n .setTokenIds([TokenId.fromString(tx.tokenId!)])\n .setBatchKey(batchPublicKey);\n description = `Dissociate token ${tx.tokenId}`;\n break;\n\n case 'token-create': {\n const createTx = new TokenCreateTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .setTokenName(tx.tokenName || 'Token')\n .setTokenSymbol(tx.tokenSymbol || 'TKN')\n .setDecimals(tx.decimals ?? 0)\n .setInitialSupply(tx.initialSupply ?? 0)\n .setTreasuryAccountId(accountId)\n .setTokenType(\n tx.decimals === 0 ? TokenType.NonFungibleUnique : TokenType.FungibleCommon,\n )\n .setSupplyType(\n tx.supplyType === 'finite' ? TokenSupplyType.Finite : TokenSupplyType.Infinite,\n )\n .setBatchKey(batchPublicKey);\n if (tx.maxSupply && tx.supplyType === 'finite') {\n createTx.setMaxSupply(tx.maxSupply);\n }\n transaction = createTx;\n description = `Create token ${tx.tokenName} (${tx.tokenSymbol})`;\n break;\n }\n\n case 'token-mint': {\n const mintTx = new TokenMintTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .setTokenId(TokenId.fromString(tx.tokenId!))\n .setBatchKey(batchPublicKey);\n // Handle NFT metadata (array) vs fungible amount\n if (tx.metadata) {\n const encoder = new TextEncoder();\n if (Array.isArray(tx.metadata)) {\n mintTx.setMetadata(tx.metadata.map((m) => encoder.encode(m)));\n } else {\n mintTx.setMetadata([encoder.encode(tx.metadata)]);\n }\n } else {\n mintTx.setAmount(tx.amount || 1);\n }\n transaction = mintTx;\n description = tx.metadata\n ? `Mint NFT for token ${tx.tokenId}`\n : `Mint ${tx.amount} of token ${tx.tokenId}`;\n break;\n }\n\n case 'token-burn': {\n const burnTx = new TokenBurnTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .setTokenId(TokenId.fromString(tx.tokenId!))\n .setBatchKey(batchPublicKey);\n if (tx.serialNumber) {\n burnTx.setSerials([tx.serialNumber]);\n } else {\n burnTx.setAmount(tx.amount || 1);\n }\n transaction = burnTx;\n description = tx.serialNumber\n ? `Burn NFT ${tx.tokenId}#${tx.serialNumber}`\n : `Burn ${tx.amount} of token ${tx.tokenId}`;\n break;\n }\n\n case 'topic-create': {\n const topicTx = new TopicCreateTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .setBatchKey(batchPublicKey);\n if (tx.topicMemo) {\n topicTx.setTopicMemo(tx.topicMemo);\n }\n transaction = topicTx;\n description = tx.topicMemo ? `Create topic: ${tx.topicMemo}` : 'Create topic';\n break;\n }\n\n case 'topic-message':\n transaction = new TopicMessageSubmitTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .setTopicId(tx.topicId!)\n .setMessage(tx.message || '')\n .setBatchKey(batchPublicKey);\n description = `Submit message to topic ${tx.topicId}`;\n break;\n\n case 'account-create': {\n const acctTx = new AccountCreateTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .setInitialBalance(Hbar.fromTinybars(tx.initialBalance || 0))\n .setBatchKey(batchPublicKey);\n if (tx.maxAutoAssociations !== undefined) {\n acctTx.setMaxAutomaticTokenAssociations(tx.maxAutoAssociations);\n }\n transaction = acctTx;\n description = `Create account with ${tx.initialBalance} tinybar`;\n break;\n }\n\n case 'account-update': {\n const updateTx = new AccountUpdateTransaction()\n .setTransactionId(TransactionId.generate(accountId))\n .setAccountId(accountId)\n .setBatchKey(batchPublicKey);\n if (tx.memo !== undefined) {\n updateTx.setAccountMemo(tx.memo);\n }\n if (tx.maxAutoAssociations !== undefined) {\n updateTx.setMaxAutomaticTokenAssociations(tx.maxAutoAssociations);\n }\n transaction = updateTx;\n description = `Update account ${account}`;\n break;\n }\n\n default:\n throw new Error(`Unknown transaction type: ${(tx as any).type}`);\n }\n\n this.logger.debug('Freezing transaction', { type: tx.type });\n const frozen = await transaction.freezeWith(client);\n\n this.logger.debug('Frozen transaction, serializing', { type: tx.type });\n const bytes = frozen.toBytes();\n\n this.logger.debug('Serialized transaction', { type: tx.type, length: bytes.length });\n\n results.push({\n payload: this.uint8ArrayToBase64(bytes),\n description,\n });\n\n this.logger.debug('Successfully processed transaction', { type: tx.type });\n } catch (error) {\n this.logger.error('Failed to process transaction', { type: tx.type, error });\n throw new Error(`Failed to build ${tx.type} transaction: ${error}`);\n }\n }\n\n return results;\n }\n\n /**\n * Serialize a transaction to base64 encoded bytes\n * @param transaction\n * @param payerAccountId\n */\n private async serializeTransaction(transaction: any, payerAccountId: string): Promise<string> {\n const networkId = this.getNetworkId();\n\n if (!networkId) {\n throw new Error('No active wallet session. Please connect your wallet first.');\n }\n\n transaction.setTransactionId(TransactionId.generate(AccountId.fromString(payerAccountId)));\n const client = this.createClientForNetwork(networkId);\n const frozen = await transaction.freezeWith(client);\n const bytes = frozen.toBytes();\n\n return this.uint8ArrayToBase64(bytes);\n }\n\n /**\n * Create a Hedera client for the specified network\n * @param networkId\n */\n private createClientForNetwork(networkId: string): Client {\n const network = networkId.split(':')[1]?.toLowerCase();\n\n switch (network) {\n case 'mainnet':\n return Client.forMainnet();\n case 'testnet':\n return Client.forTestnet();\n default:\n this.logger.warn('Unknown Hedera network, defaulting to testnet', { network });\n return Client.forTestnet();\n }\n }\n\n /**\n * Convert Uint8Array to base64 string\n * @param bytes\n */\n private uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n\n /**\n * Convert base64 string to Uint8Array\n * @param base64\n */\n private base64ToUint8Array(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file Service for building XRPL (Ripple) transactions using the xrpl package.\n *\n * @module services/transaction-builders/xrpl\n *\n * @description\n * XrplTransactionBuilderService provides methods to construct various XRPL transaction\n * types and serialize them to base64 payloads ready for signing. It supports all major\n * XRPL transaction types including payments, trust lines, DEX orders, escrows, payment\n * channels, checks, and NFTs.\n *\n * **Supported Transaction Types:**\n * - Payment - XRP and token transfers\n * - TrustSet - Trust line creation/modification\n * - OfferCreate/Cancel - DEX order management\n * - AccountSet - Account configuration\n * - EscrowCreate/Finish/Cancel - Escrow operations\n * - PaymentChannel operations - Payment channels\n * - Check operations - XRPL checks\n * - DepositPreauth - Deposit preauthorization\n * - SignerListSet - Multi-signature configuration\n * - TicketCreate - Ticket creation\n * - NFT operations - NFTokenMint, Burn, CreateOffer, etc.\n * - Batch transactions - Multiple operations atomically\n *\n * **Amount Format:**\n * - XRP amounts are in \"drops\" (1 XRP = 1,000,000 drops)\n * - Token amounts use the IssuedCurrency format { currency, issuer, value }\n */\n\nimport { Injectable } from '@angular/core';\nimport type {\n Payment,\n TrustSet,\n OfferCreate,\n OfferCancel,\n AccountSet,\n EscrowCreate,\n EscrowFinish,\n EscrowCancel,\n PaymentChannelCreate,\n PaymentChannelFund,\n PaymentChannelClaim,\n CheckCreate,\n CheckCash,\n CheckCancel,\n DepositPreauth,\n SignerListSet,\n TicketCreate,\n NFTokenMint,\n NFTokenBurn,\n NFTokenCreateOffer,\n NFTokenAcceptOffer,\n NFTokenCancelOffer,\n Transaction,\n} from 'xrpl';\n\n/**\n * Service for building XRPL (Ripple) transactions using the xrpl package.\n *\n * @service XrplTransactionBuilderService\n *\n * @description\n * Provides methods to construct various XRPL transaction types and serialize them\n * to base64 payloads ready for signing. All build methods return a base64-encoded\n * JSON representation of the transaction.\n *\n * Unlike Hedera transactions which are frozen with a client, XRPL transactions\n * are serialized as JSON and can be signed without network connection.\n *\n * @providedIn root\n *\n * @Component({ ... })\n * export class SendPage {\n * private builder = inject(XrplTransactionBuilderService);\n * private wallet = inject(UnifiedWalletService);\n *\n * async sendXrp(to: string, drops: string) {\n * const from = this.wallet.activeAccount()?.address;\n * const payload = await this.builder.buildPayment(from!, to, drops);\n * return this.wallet.submitTransaction({ payload });\n * }\n * }\n * ```\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class XrplTransactionBuilderService {\n /**\n * Builds a Payment transaction (XRP or token).\n *\n * @description\n * Creates a Payment transaction that sends XRP or issued currency tokens\n * from one account to another. For XRP, the amount is in drops (1 XRP = 1,000,000 drops).\n *\n * @param account - Source account address (r...)\n * @param destination - Destination account address (r...)\n * @param amount - Amount (XRP in drops, or token value string)\n * @param isToken - Whether this is a token payment (default: false)\n * @param currency - Token currency code (required if isToken)\n * @param issuer - Token issuer address (required if isToken)\n *\n * @returns Base64 encoded transaction JSON\n */\n async buildPayment(\n account: string,\n destination: string,\n amount: string,\n isToken = false,\n currency?: string,\n issuer?: string,\n ): Promise<string> {\n const tx: Payment = {\n TransactionType: 'Payment',\n Account: account,\n Destination: destination,\n Amount:\n isToken && currency && issuer\n ? {\n currency,\n issuer,\n value: amount,\n }\n : amount,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Builds a TrustSet transaction to establish or modify a trust line.\n *\n * @description\n * Creates a TrustSet transaction that establishes a trust line between\n * your account and a token issuer. Trust lines are required before you\n * can hold issued currency tokens on XRPL.\n *\n * @param account - Your account address (r...)\n * @param currency - Currency code (e.g., 'USD', 'EUR', or hex code)\n * @param issuer - Token issuer address (r...)\n * @param limit - Maximum amount willing to hold (e.g., '1000000')\n *\n * @returns Base64 encoded transaction JSON\n */\n async buildTrustSet(\n account: string,\n currency: string,\n issuer: string,\n limit: string,\n ): Promise<string> {\n const tx: TrustSet = {\n TransactionType: 'TrustSet',\n Account: account,\n LimitAmount: {\n currency,\n issuer,\n value: limit,\n },\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build an OfferCreate transaction (DEX order)\n * @param account - Account address\n * @param takerPays - What taker pays (amount object or XRP drops)\n * @param takerGets - What taker gets (amount object or XRP drops)\n * @returns Base64 encoded transaction\n */\n async buildOfferCreate(\n account: string,\n takerPays: string | { currency: string; issuer: string; value: string },\n takerGets: string | { currency: string; issuer: string; value: string },\n ): Promise<string> {\n const tx: OfferCreate = {\n TransactionType: 'OfferCreate',\n Account: account,\n TakerPays: takerPays,\n TakerGets: takerGets,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build an OfferCancel transaction\n * @param account - Account address\n * @param offerSequence - Sequence number of the offer to cancel\n * @returns Base64 encoded transaction\n */\n async buildOfferCancel(account: string, offerSequence: number): Promise<string> {\n const tx: OfferCancel = {\n TransactionType: 'OfferCancel',\n Account: account,\n OfferSequence: offerSequence,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build an AccountSet transaction\n * @param account - Account address\n * @param options - Account set options (domain, emailHash, flags, etc.)\n * @param options.domain\n * @param options.emailHash\n * @param options.messageKey\n * @param options.transferRate\n * @param options.tickSize\n * @param options.setFlag\n * @param options.clearFlag\n * @returns Base64 encoded transaction\n */\n async buildAccountSet(\n account: string,\n options: {\n domain?: string;\n emailHash?: string;\n messageKey?: string;\n transferRate?: number;\n tickSize?: number;\n setFlag?: number;\n clearFlag?: number;\n },\n ): Promise<string> {\n const tx: AccountSet = {\n TransactionType: 'AccountSet',\n Account: account,\n ...options,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build an EscrowCreate transaction\n * @param account - Account address\n * @param destination - Destination account\n * @param amount - Amount in drops\n * @param finishAfter - Ripple Epoch (seconds since 2000-01-01 UTC). Callers\n * that hold Unix timestamps must convert first; an unmodified Unix value\n * would put the escrow ~30 years in the future. The XRPL Time Utilities\n * in `xrpl.js` expose helpers, or compute as `unixSeconds - 946684800`.\n * @param cancelAfter - Optional. Same Ripple Epoch contract as finishAfter.\n * @returns Base64 encoded transaction\n */\n async buildEscrowCreate(\n account: string,\n destination: string,\n amount: string,\n finishAfter: number,\n cancelAfter?: number,\n ): Promise<string> {\n const tx: EscrowCreate = {\n TransactionType: 'EscrowCreate',\n Account: account,\n Destination: destination,\n Amount: amount,\n FinishAfter: finishAfter,\n ...(cancelAfter && { CancelAfter: cancelAfter }),\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build an EscrowFinish transaction\n * @param account - Account address\n * @param owner - Escrow owner account\n * @param offerSequence - Sequence number of EscrowCreate transaction\n * @returns Base64 encoded transaction\n */\n async buildEscrowFinish(account: string, owner: string, offerSequence: number): Promise<string> {\n const tx: EscrowFinish = {\n TransactionType: 'EscrowFinish',\n Account: account,\n Owner: owner,\n OfferSequence: offerSequence,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build an EscrowCancel transaction\n * @param account - Account address\n * @param owner - Escrow owner account\n * @param offerSequence - Sequence number of EscrowCreate transaction\n * @returns Base64 encoded transaction\n */\n async buildEscrowCancel(account: string, owner: string, offerSequence: number): Promise<string> {\n const tx: EscrowCancel = {\n TransactionType: 'EscrowCancel',\n Account: account,\n Owner: owner,\n OfferSequence: offerSequence,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build a PaymentChannelCreate transaction\n * @param account - Account address\n * @param destination - Destination account\n * @param amount - Amount in drops\n * @param settleDelay - Settle delay in seconds\n * @param publicKey - Public key for channel\n * @returns Base64 encoded transaction\n */\n async buildPaymentChannelCreate(\n account: string,\n destination: string,\n amount: string,\n settleDelay: number,\n publicKey: string,\n ): Promise<string> {\n const tx: PaymentChannelCreate = {\n TransactionType: 'PaymentChannelCreate',\n Account: account,\n Destination: destination,\n Amount: amount,\n SettleDelay: settleDelay,\n PublicKey: publicKey,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build a PaymentChannelFund transaction\n * @param account - Account address\n * @param channel - Channel ID\n * @param amount - Amount in drops to add\n * @returns Base64 encoded transaction\n */\n async buildPaymentChannelFund(account: string, channel: string, amount: string): Promise<string> {\n const tx: PaymentChannelFund = {\n TransactionType: 'PaymentChannelFund',\n Account: account,\n Channel: channel,\n Amount: amount,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build a PaymentChannelClaim transaction\n * @param account - Account address\n * @param channel - Channel ID\n * @param amount - Amount in drops to claim\n * @returns Base64 encoded transaction\n */\n async buildPaymentChannelClaim(\n account: string,\n channel: string,\n amount?: string,\n ): Promise<string> {\n const tx: PaymentChannelClaim = {\n TransactionType: 'PaymentChannelClaim',\n Account: account,\n Channel: channel,\n ...(amount && { Amount: amount }),\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build a CheckCreate transaction\n * @param account - Account address\n * @param destination - Destination account\n * @param sendMax - Maximum amount that can be cashed\n * @returns Base64 encoded transaction\n */\n async buildCheckCreate(account: string, destination: string, sendMax: string): Promise<string> {\n const tx: CheckCreate = {\n TransactionType: 'CheckCreate',\n Account: account,\n Destination: destination,\n SendMax: sendMax,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build a CheckCash transaction\n * @param account - Account address\n * @param checkID - Check ID to cash\n * @param amount - Amount to cash (optional, uses DeliverMin if not provided)\n * @param deliverMin - Minimum amount to deliver (optional)\n * @returns Base64 encoded transaction\n */\n async buildCheckCash(\n account: string,\n checkID: string,\n amount?: string,\n deliverMin?: string,\n ): Promise<string> {\n const tx: CheckCash = {\n TransactionType: 'CheckCash',\n Account: account,\n CheckID: checkID,\n ...(amount && { Amount: amount }),\n ...(deliverMin && { DeliverMin: deliverMin }),\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build a CheckCancel transaction\n * @param account - Account address\n * @param checkID - Check ID to cancel\n * @returns Base64 encoded transaction\n */\n async buildCheckCancel(account: string, checkID: string): Promise<string> {\n const tx: CheckCancel = {\n TransactionType: 'CheckCancel',\n Account: account,\n CheckID: checkID,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build a DepositPreauth transaction\n * @param account - Account address\n * @param authorize - Account to preauthorize (optional)\n * @param unauthorize - Account to remove authorization (optional)\n * @returns Base64 encoded transaction\n */\n async buildDepositPreauth(\n account: string,\n authorize?: string,\n unauthorize?: string,\n ): Promise<string> {\n const tx: DepositPreauth = {\n TransactionType: 'DepositPreauth',\n Account: account,\n ...(authorize && { Authorize: authorize }),\n ...(unauthorize && { Unauthorize: unauthorize }),\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build a SignerListSet transaction\n * @param account - Account address\n * @param signerQuorum - Required signature weight\n * @param signerEntries - Array of signer entries\n * @returns Base64 encoded transaction\n */\n async buildSignerListSet(\n account: string,\n signerQuorum: number,\n signerEntries: Array<{ account: string; weight: number }>,\n ): Promise<string> {\n const tx: SignerListSet = {\n TransactionType: 'SignerListSet',\n Account: account,\n SignerQuorum: signerQuorum,\n SignerEntries: signerEntries.map((entry) => ({\n SignerEntry: {\n Account: entry.account,\n SignerWeight: entry.weight,\n },\n })),\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build a TicketCreate transaction\n * @param account - Account address\n * @param ticketCount - Number of tickets to create\n * @returns Base64 encoded transaction\n */\n async buildTicketCreate(account: string, ticketCount: number): Promise<string> {\n const tx: TicketCreate = {\n TransactionType: 'TicketCreate',\n Account: account,\n TicketCount: ticketCount,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build an NFTokenMint transaction\n * @param account - Account address\n * @param uri - NFT URI (hex encoded)\n * @param flags - NFT flags\n * @param transferFee - Transfer fee in basis points\n * @param taxon - NFT taxon\n * @returns Base64 encoded transaction\n */\n async buildNFTMint(\n account: string,\n uri: string,\n flags: number,\n transferFee: number,\n taxon: number,\n ): Promise<string> {\n const tx: NFTokenMint = {\n TransactionType: 'NFTokenMint',\n Account: account,\n URI: uri,\n Flags: flags,\n TransferFee: transferFee,\n NFTokenTaxon: taxon,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build an NFTokenBurn transaction\n * @param account - Account address\n * @param nftokenID - NFT ID to burn\n * @returns Base64 encoded transaction\n */\n async buildNFTBurn(account: string, nftokenID: string): Promise<string> {\n const tx: NFTokenBurn = {\n TransactionType: 'NFTokenBurn',\n Account: account,\n NFTokenID: nftokenID,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build an NFTokenCreateOffer transaction\n * @param account - Account address\n * @param nftokenID - NFT ID\n * @param amount - Offer amount\n * @param flags - Offer flags (1=sell, 0=buy)\n * @param destination - Optional destination account\n * @returns Base64 encoded transaction\n */\n async buildNFTCreateOffer(\n account: string,\n nftokenID: string,\n amount: string,\n flags: number,\n destination?: string,\n ): Promise<string> {\n const tx: NFTokenCreateOffer = {\n TransactionType: 'NFTokenCreateOffer',\n Account: account,\n NFTokenID: nftokenID,\n Amount: amount,\n Flags: flags,\n ...(destination && { Destination: destination }),\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build an NFTokenAcceptOffer transaction\n * @param account - Account address\n * @param nftokenSellOffer - Sell offer ID (optional)\n * @param nftokenBuyOffer - Buy offer ID (optional)\n * @returns Base64 encoded transaction\n */\n async buildNFTAcceptOffer(\n account: string,\n nftokenSellOffer?: string,\n nftokenBuyOffer?: string,\n ): Promise<string> {\n const tx: NFTokenAcceptOffer = {\n TransactionType: 'NFTokenAcceptOffer',\n Account: account,\n ...(nftokenSellOffer && { NFTokenSellOffer: nftokenSellOffer }),\n ...(nftokenBuyOffer && { NFTokenBuyOffer: nftokenBuyOffer }),\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build an NFTokenCancelOffer transaction\n * @param account - Account address\n * @param nftokenOffers - Array of offer IDs to cancel\n * @returns Base64 encoded transaction\n */\n async buildNFTCancelOffer(account: string, nftokenOffers: string[]): Promise<string> {\n const tx: NFTokenCancelOffer = {\n TransactionType: 'NFTokenCancelOffer',\n Account: account,\n NFTokenOffers: nftokenOffers,\n };\n\n return this.serializeTransaction(tx);\n }\n\n /**\n * Build a Batch transaction with multiple inner transactions\n * @param account - Account executing the batch\n * @param innerTransactions - Array of transaction descriptors\n * @returns Base64 encoded batch transaction JSON\n */\n async buildBatchTransaction(\n account: string,\n innerTransactions: Array<{\n type: 'payment' | 'trust-set' | 'nft-mint';\n destination?: string;\n amount?: string;\n currency?: string;\n issuer?: string;\n }>,\n ): Promise<string> {\n const tfInnerBatchTxn = 1073741824;\n const tfAllOrNothing = 65536;\n\n const rawTransactions = innerTransactions.map((tx, index) => {\n let innerTx: any;\n\n switch (tx.type) {\n case 'payment':\n innerTx = {\n TransactionType: 'Payment',\n Flags: tfInnerBatchTxn,\n Account: account,\n Destination: tx.destination || '',\n Amount: tx.amount || '1000000',\n Fee: '0',\n Sequence: index + 1,\n SigningPubKey: '',\n };\n\n if (tx.currency && tx.issuer) {\n innerTx.Amount = {\n currency: tx.currency,\n issuer: tx.issuer,\n value: tx.amount || '1',\n };\n }\n break;\n\n case 'trust-set':\n innerTx = {\n TransactionType: 'TrustSet',\n Flags: tfInnerBatchTxn,\n Account: account,\n LimitAmount: {\n currency: tx.currency || 'USD',\n issuer: tx.issuer || '',\n value: tx.amount || '1000000',\n },\n Fee: '0',\n Sequence: index + 1,\n SigningPubKey: '',\n };\n break;\n\n case 'nft-mint':\n innerTx = {\n TransactionType: 'NFTokenMint',\n Flags: tfInnerBatchTxn,\n Account: account,\n NFTokenTaxon: 0,\n Fee: '0',\n Sequence: index + 1,\n SigningPubKey: '',\n };\n break;\n\n default:\n innerTx = {\n TransactionType: 'Payment',\n Flags: tfInnerBatchTxn,\n Account: account,\n Destination: account,\n Amount: '1',\n Fee: '0',\n Sequence: index + 1,\n SigningPubKey: '',\n };\n }\n\n return { RawTransaction: innerTx };\n });\n\n const batchTx = {\n TransactionType: 'Batch',\n Account: account,\n Flags: tfAllOrNothing,\n RawTransactions: rawTransactions,\n };\n\n return this.serializeTransaction(batchTx as any);\n }\n\n /**\n * Build inner transactions for batch (unsigned, with batch flags set)\n * @param account - Account executing the batch\n * @param innerTransactions - Array of transaction descriptors\n * @returns Array of base64 encoded unsigned inner transactions\n */\n async buildBatchInnerTransactions(\n account: string,\n innerTransactions: Array<{\n type: 'payment' | 'trust-set' | 'nft-mint';\n destination?: string;\n amount?: string;\n currency?: string;\n issuer?: string;\n uri?: string;\n taxon?: number;\n }>,\n ): Promise<Array<{ payload: string; description: string }>> {\n const tfInnerBatchTxn = 1073741824;\n const results: Array<{ payload: string; description: string }> = [];\n\n for (let index = 0; index < innerTransactions.length; index++) {\n const tx = innerTransactions[index];\n let innerTx: any;\n let description: string;\n\n switch (tx.type) {\n case 'payment':\n if (tx.currency && tx.issuer) {\n innerTx = {\n TransactionType: 'Payment',\n Flags: tfInnerBatchTxn,\n Account: account,\n Destination: tx.destination || '',\n Amount: {\n currency: tx.currency,\n issuer: tx.issuer,\n value: tx.amount || '1',\n },\n Fee: '0',\n Sequence: index + 1,\n SigningPubKey: '',\n };\n description = `Send ${tx.amount} ${tx.currency} to ${tx.destination}`;\n } else {\n innerTx = {\n TransactionType: 'Payment',\n Flags: tfInnerBatchTxn,\n Account: account,\n Destination: tx.destination || '',\n Amount: tx.amount || '1000000',\n Fee: '0',\n Sequence: index + 1,\n SigningPubKey: '',\n };\n description = `Send ${Number(tx.amount || '1000000') / 1000000} XRP to ${tx.destination}`;\n }\n break;\n\n case 'trust-set':\n innerTx = {\n TransactionType: 'TrustSet',\n Flags: tfInnerBatchTxn,\n Account: account,\n LimitAmount: {\n currency: tx.currency || 'USD',\n issuer: tx.issuer || '',\n value: tx.amount || '1000000',\n },\n Fee: '0',\n Sequence: index + 1,\n SigningPubKey: '',\n };\n description = `Set trust line for ${tx.currency} (${tx.amount})`;\n break;\n\n case 'nft-mint':\n innerTx = {\n TransactionType: 'NFTokenMint',\n Flags: tfInnerBatchTxn,\n Account: account,\n URI: tx.uri || '',\n NFTokenTaxon: tx.taxon || 0,\n Fee: '0',\n Sequence: index + 1,\n SigningPubKey: '',\n };\n description = `Mint NFT (taxon: ${tx.taxon})`;\n break;\n\n default:\n throw new Error(`Unknown transaction type: ${(tx as any).type}`);\n }\n\n results.push({\n payload: btoa(JSON.stringify(innerTx)),\n description,\n });\n }\n\n return results;\n }\n\n /**\n * Serializes a transaction to base64 encoded JSON.\n *\n * @description\n * Converts the transaction object to a JSON string and encodes it as base64.\n * This format is used for transport to the wallet for signing.\n *\n * @param transaction - The XRPL transaction object\n *\n * @returns Base64 encoded JSON string\n */\n private async serializeTransaction(transaction: Transaction): Promise<string> {\n const jsonString = JSON.stringify(transaction);\n return btoa(jsonString);\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file Transaction builder services for Hedera and XRPL.\n *\n * @module services/transaction-builders\n *\n * @description\n * This module exports transaction builder services that can be used by dApps\n * to construct blockchain transactions for signing via the wallet. Each builder\n * is designed for a specific ledger type and handles the complexities of\n * transaction construction, serialization, and validation.\n *\n * **Included Builders:**\n * - {@link HederaTransactionBuilderService} - Builds Hedera transactions using @hashgraph/sdk\n * - {@link XrplTransactionBuilderService} - Builds XRPL transactions using xrpl library\n * - {@link BaseTransactionBuilderService} - Abstract base class with shared utilities\n *\n * **Common Features:**\n * - Validation logic for accounts, amounts, and parameters\n * - Error handling patterns with standardized {@link TransactionBuilderError}\n * - Amount parsing utilities for different decimal formats\n * - Base64/hex encoding utilities for transaction serialization\n */\n\n// Base transaction builder (abstract class and utilities)\nexport {\n BaseTransactionBuilderService,\n TransactionBuilderError,\n TransactionBuilderErrorCode,\n type ParsedAmount,\n type AmountParseOptions,\n} from './base-transaction-builder.service';\n\n// Ledger-specific transaction builders\nexport {\n HederaTransactionBuilderService,\n type BatchInnerTransactionType,\n type BatchInnerTransaction,\n type HederaKeyConfig,\n type TopicCreateOptions,\n type TokenCreateOptions,\n type AccountCreateOptions,\n} from './hedera-transaction-builder.service';\nexport { XrplTransactionBuilderService } from './xrpl-transaction-builder.service';\nexport { scaleHederaAmountToBaseUnits, assertSafeInteger } from './hedera-amount-utils';\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file chrome-extension-transport.ts\n * @description\n * Transport implementation for communicating with HSuite Wallet Chrome Extension.\n *\n * This transport uses chrome.runtime.sendMessage() to communicate with the\n * extension's background service worker, which then routes messages to the wallet.\n */\n\nimport { getLogger } from '@hsuite/native-connect-sdk';\nimport type { TransportProvider } from '@hsuite/native-connect-sdk';\nimport type { MessageEnvelope } from '@hsuite/native-connect-types';\n\nconst logger = getLogger().scoped?.('ChromeExtensionTransport') ?? getLogger();\n\n/**\n * @interface ChromeExtensionTransportOptions\n * Configuration options for Chrome Extension transport\n */\nexport interface ChromeExtensionTransportOptions {\n /**\n * Unique identifier for this transport instance\n */\n id: string;\n}\n\n/**\n * @class ChromeExtensionTransport\n *\n * Transport layer for dApps to communicate with HSuite Wallet Chrome Extension.\n *\n * **How it works:**\n * 1. dApp sends message via window.postMessage() to same-origin\n * 2. Extension's content script listens and forwards to background via chrome.runtime\n * 3. Background processes request and sends response back\n * 4. Response flows back: background → content script → dApp\n *\n * **Important**: The dApp NEVER directly accesses chrome.runtime. Only the\n * extension's content script has chrome.runtime access.\n *\n * **Advantages over window-based transport:**\n * - No popup windows required\n * - Faster communication (no cross-window messaging)\n * - Better UX (uses extension popup/sidebar)\n * - Works across all tabs\n *\n * **Detection:**\n * The extension injects `window.__HSUITE_WALLET_EXTENSION__` flag that dApps\n * can check before attempting to use this transport.\n */\nexport class ChromeExtensionTransport implements TransportProvider {\n private readonly transportId: string;\n private listeners = new Set<(message: MessageEnvelope<unknown>) => void>();\n private disconnectHandler?: (reason?: any) => void;\n private isConnected = false;\n private messageHandler?: (event: MessageEvent) => void;\n\n /**\n *\n * @param options\n */\n constructor(private readonly options: ChromeExtensionTransportOptions) {\n this.transportId = options.id;\n }\n\n /**\n *\n */\n get id(): string {\n return this.transportId;\n }\n\n /**\n * Connect to the extension. Sets up message listeners.\n *\n * NOTE: dApps communicate with extensions via window.postMessage() to the\n * content script. The dApp NEVER directly accesses chrome.runtime - only\n * the extension's content script has access to chrome.runtime.\n *\n * Flow: dApp (window.postMessage) → Content Script (chrome.runtime) → Background\n */\n async connect(): Promise<void> {\n if (this.isConnected) {\n logger.warn('Already connected', { id: this.transportId });\n return;\n }\n\n // Set up window.postMessage listener for content script communication\n logger.info('Connecting to extension via window.postMessage', { id: this.transportId });\n this.setupWindowListener();\n\n this.isConnected = true;\n logger.info('Connected to extension', { id: this.transportId });\n }\n\n /**\n * Send a message to the extension via window.postMessage\n * @param message\n */\n async send(message: MessageEnvelope<unknown>): Promise<void> {\n if (!this.isConnected) {\n throw new Error('Transport not connected');\n }\n\n logger.debug('Sending message to extension via postMessage', {\n id: this.transportId,\n topic: message.topic,\n method: (message.payload as { method?: string })?.method,\n });\n\n // Send to content script via postMessage\n window.postMessage(message, window.location.origin);\n logger.debug('Message posted to content script', { id: this.transportId });\n }\n\n /**\n * Register a message listener\n * @param listener\n */\n onMessage<TPayload = unknown>(listener: (message: MessageEnvelope<TPayload>) => void): void {\n this.listeners.add(listener as (message: MessageEnvelope<unknown>) => void);\n }\n\n /**\n * Register a disconnect listener\n * @param handler\n */\n onDisconnect(handler: (reason?: any) => void): void {\n this.disconnectHandler = handler;\n }\n\n /**\n * Disconnect from the extension\n */\n async disconnect(): Promise<void> {\n if (!this.isConnected) {\n return;\n }\n\n // Remove window message listener\n if (this.messageHandler) {\n window.removeEventListener('message', this.messageHandler);\n this.messageHandler = undefined;\n }\n\n this.listeners.clear();\n this.isConnected = false;\n\n logger.info('Disconnected from extension', { id: this.transportId });\n this.disconnectHandler?.();\n }\n\n // ========== PRIVATE METHODS ==========\n\n /**\n * Set up listener for messages from content script via window.postMessage\n */\n private setupWindowListener(): void {\n this.messageHandler = (event: MessageEvent) => {\n if (!this.isConnected) {\n return;\n }\n\n // Only process messages from same origin\n if (event.origin !== window.location.origin) {\n return;\n }\n\n // Only process RPC envelopes\n const message = event.data;\n if (!message || typeof message !== 'object' || message.topic !== 'rpc') {\n return;\n }\n\n logger.debug('Received message from content script', {\n id: this.transportId,\n method: message.payload?.method,\n });\n\n // Deliver to all listeners\n for (const listener of this.listeners) {\n try {\n listener(message);\n } catch (error) {\n logger.error('Listener failed', { error });\n }\n }\n };\n\n window.addEventListener('message', this.messageHandler);\n }\n}\n\n/**\n * @function isExtensionInstalled\n *\n * Check if HSuite Wallet extension is installed.\n *\n * The extension's content script injects a flag into the page that can be\n * checked to determine if the extension is available.\n *\n * **IMPORTANT**: The dApp (web page) does NOT have access to chrome.runtime -\n * only the extension's content script does. The dApp communicates with the\n * extension via window.postMessage() → content script → chrome.runtime.\n *\n * @returns true if extension is installed and active\n */\nexport function isExtensionInstalled(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n\n // Simply check if the extension injected its flag\n // The flag is set by inject-flags.ts which runs in MAIN world\n return (\n (window as any as { __HSUITE_WALLET_EXTENSION__?: boolean }).__HSUITE_WALLET_EXTENSION__ ===\n true\n );\n}\n\n/**\n * @function getExtensionVersion\n *\n * Get the version of the installed HSuite Wallet extension.\n *\n * @returns Extension version string, or null if not installed\n */\nexport function getExtensionVersion(): string | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n return (\n (window as any as { __HSUITE_WALLET_VERSION__?: string }).__HSUITE_WALLET_VERSION__ || null\n );\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file account-grouping.service.ts\n * @description Account grouping and organization logic\n *\n * Provides account grouping utilities for the AccountSelectorComponent.\n * Extracted to reduce component size and enable reuse.\n *\n * Supports three grouping modes:\n * - 'nested': Protocol → Network → Accounts (2 clicks)\n * - 'flat': Network → Accounts (1 click)\n * - 'none': All accounts flat (0 clicks)\n */\n\nimport { Injectable } from '@angular/core';\n\n/**\n * Grouping mode for account display.\n */\nexport type AccountGroupingMode = 'nested' | 'flat' | 'none';\n\n/**\n * Network group containing sessions and account count.\n */\nexport interface NetworkGroup {\n network: string;\n sessions: unknown[];\n accountCount: number;\n}\n\n/**\n * Protocol group containing networks.\n */\nexport interface ProtocolGroup {\n protocol: string;\n networks: NetworkGroup[];\n}\n\n/**\n * Ledger group containing accounts with session info.\n */\nexport interface LedgerGroup {\n ledgerName: string;\n ledgerId: string;\n accounts: Array<{ account: any; session: any }>;\n}\n\n/**\n * Account grouping service.\n *\n * Provides utilities for organizing accounts into hierarchical groups\n * for display in account selector components.\n */\n@Injectable({ providedIn: 'root' })\nexport class AccountGroupingService {\n /**\n * Group sessions by protocol and network.\n *\n * @param sessions - Array of session objects\n * @param mode - Grouping mode\n * @returns Grouped sessions\n */\n groupSessions(sessions: any[], mode: AccountGroupingMode): ProtocolGroup[] {\n if (mode === 'none') {\n return this.groupFlat(sessions);\n }\n\n if (mode === 'flat') {\n return this.groupByNetwork(sessions);\n }\n\n return this.groupNested(sessions);\n }\n\n /**\n * Group accounts by ledger (Hedera, XRPL, etc.).\n *\n * @param items - Array of account items with session info\n * @param getLedgerName - Function to get display name for ledger\n * @returns Grouped accounts by ledger\n */\n groupByLedger(\n items: Array<{ account: any; session: any }>,\n getLedgerName: (ledgerId: string) => string,\n ): LedgerGroup[] {\n const ledgerMap = new Map<string, Array<{ account: any; session: any }>>();\n\n for (const item of items) {\n const { account } = item;\n if (!account?.ledgerId) continue;\n\n const ledgerId = account.ledgerId;\n if (!ledgerMap.has(ledgerId)) {\n ledgerMap.set(ledgerId, []);\n }\n ledgerMap.get(ledgerId)!.push(item);\n }\n\n return Array.from(ledgerMap.entries()).map(([ledgerId, accounts]) => ({\n ledgerName: getLedgerName(ledgerId),\n ledgerId,\n accounts,\n }));\n }\n\n /**\n * Create flat grouping (no hierarchy).\n * @private\n */\n private groupFlat(sessions: any[]): ProtocolGroup[] {\n return [\n {\n protocol: 'All Accounts',\n networks: [\n {\n network: 'all',\n sessions,\n accountCount: sessions.reduce((sum: number, s) => sum + (s?.accounts?.length || 0), 0),\n },\n ],\n },\n ];\n }\n\n /**\n * Group by network only (flat mode).\n * @private\n */\n private groupByNetwork(sessions: any[]): ProtocolGroup[] {\n const networkGroups = new Map<string, unknown[]>();\n\n for (const session of sessions) {\n const network = this.extractNetwork(\n session.metadata?.networkId || session.accounts?.[0]?.networkId,\n );\n\n if (!networkGroups.has(network)) {\n networkGroups.set(network, []);\n }\n\n networkGroups.get(network)!.push(session);\n }\n\n return [\n {\n protocol: 'Wallets',\n networks: Array.from(networkGroups.entries()).map(([network, netSessions]) => ({\n network,\n sessions: netSessions,\n accountCount: netSessions.reduce(\n (sum: number, s: any) => sum + (s?.accounts?.length || 0),\n 0,\n ) as number,\n })),\n },\n ];\n }\n\n /**\n * Group by network then protocol (nested mode).\n * @private\n */\n private groupNested(sessions: any[]): ProtocolGroup[] {\n const grouped = new Map<string, Map<string, any[]>>();\n\n for (const session of sessions) {\n const network = this.extractNetwork(\n session.metadata?.networkId || session.accounts?.[0]?.networkId,\n );\n const protocol = session.providerType === 'hsuite-native' ? 'HSuite Native' : 'WalletConnect';\n\n if (!grouped.has(network)) {\n grouped.set(network, new Map());\n }\n\n const networkGroup = grouped.get(network)!;\n if (!networkGroup.has(protocol)) {\n networkGroup.set(protocol, []);\n }\n\n networkGroup.get(protocol)!.push(session);\n }\n\n return Array.from(grouped.entries()).map(([network, protocols]) => ({\n protocol: network,\n networks: Array.from(protocols.entries()).map(([proto, protoSessions]) => ({\n network: proto,\n sessions: protoSessions,\n accountCount: protoSessions.reduce(\n (sum: number, s: any) => sum + (s?.accounts?.length || 0),\n 0,\n ) as number,\n })),\n }));\n }\n\n /**\n * Extract network name from networkId.\n *\n * @param networkId - Full network ID (e.g., \"hedera:testnet\")\n * @returns Network name (e.g., \"testnet\")\n */\n extractNetwork(networkId?: string): string {\n if (!networkId) return 'unknown';\n const parts = networkId.split(':');\n return parts[parts.length - 1] || networkId;\n }\n\n /**\n * Get total account count for a protocol group.\n *\n * @param protocolGroup - Protocol group\n * @returns Total account count\n */\n getTotalAccounts(protocolGroup: ProtocolGroup): number {\n return protocolGroup.networks.reduce((sum, network) => sum + network.accountCount, 0);\n }\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @fileoverview Unified account model that works across all wallet providers.\n *\n * @module models/unified-account\n *\n * @description\n * Defines the UnifiedAccount interface that provides a consistent representation\n * of blockchain accounts regardless of the underlying wallet provider or ledger type.\n * This normalization allows dApps to work with accounts uniformly whether they come\n * from HSuite Native, WalletConnect, or P2P Native connections.\n *\n * **Key Properties:**\n * - `id` - Unique identifier combining provider and address\n * - `address` - Blockchain-specific account identifier\n * - `ledgerId` - Which blockchain ('hedera', 'xrpl')\n * - `networkId` - Which network ('testnet', 'mainnet')\n * - `providerId` - Which provider manages this account\n * - `metadata` - Provider-specific additional data\n */\n\nimport type { ProviderType } from './provider-types';\n\n/**\n * Unified account representation across all wallet providers.\n *\n * @description\n * A normalized account interface that provides consistent access to account\n * properties regardless of the underlying wallet type. All connected accounts\n * from all providers are represented using this interface.\n */\nexport interface UnifiedAccount {\n /** Unique identifier for this account */\n id: string;\n\n /** Account address/public key */\n address: string;\n\n /** Human-readable label */\n label?: string;\n\n /** Ledger ID (e.g., 'hedera', 'xrpl') */\n ledgerId: string;\n\n /** Network ID (e.g., 'hedera:testnet', 'xrpl:mainnet') */\n networkId: string;\n\n /** Provider that manages this account */\n providerId: string;\n providerType: ProviderType;\n\n /** Optional metadata from the provider */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Account with balance information.\n *\n * @description\n * Extension of UnifiedAccount that includes balance data for display purposes.\n * Used by UI components that need to show account balances.\n */\nexport interface AccountWithBalance extends UnifiedAccount {\n balance?: string;\n balanceFormatted?: string;\n currencySymbol?: string;\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @fileoverview Event types for the WalletEventBus system.\n *\n * @module models/wallet-events\n *\n * @description\n * Defines the event interfaces used by the WalletEventBus system. These events\n * allow dApps to react to wallet-level changes that happen outside direct user\n * interaction, such as wallet-initiated disconnects, session restorations,\n * and account switches.\n *\n * **Event Types:**\n * - {@link ConnectionEvent} - Provider connected\n * - {@link DisconnectionEvent} - Provider disconnected\n * - {@link AccountChangeEvent} - Active account changed\n * - {@link AccountsUpdateEvent} - Account list updated\n * - {@link SessionEvent} - Session created/deleted/restored\n * - {@link ProviderStatusEvent} - Provider status changed\n * - {@link ProviderErrorEvent} - Provider error occurred\n *\n * All events include a `timestamp` field (Unix milliseconds) for ordering\n * and debugging purposes.\n */\n\nimport type { UnifiedAccount } from './unified-account.model';\n\n/**\n * Emitted when a provider successfully connects.\n *\n * @description\n * Fired after a wallet connection is established and accounts are available.\n * Use this event to update UI, fetch balances, or perform post-connection logic.\n */\nexport interface ConnectionEvent {\n providerId: string;\n providerType: 'hsuite-native' | 'walletconnect-v2';\n accounts: UnifiedAccount[];\n timestamp: number;\n}\n\n/**\n * Emitted when a provider disconnects.\n *\n * @description\n * Fired when a wallet connection is terminated. Can be user-initiated\n * (via disconnect button) or wallet-initiated (remote disconnect).\n *\n * **Reason Values:**\n * - `'user_initiated'` - User clicked disconnect in dApp\n * - `'wallet_initiated_disconnect'` - Wallet app terminated session\n * - `'session_terminated'` - Session ended by protocol\n * - `'session_expired'` - Session timed out\n */\nexport interface DisconnectionEvent {\n providerId: string;\n providerType: string;\n sessionKey?: string;\n reason?:\n | 'user_initiated'\n | 'wallet_initiated_disconnect'\n | 'session_terminated'\n | 'session_expired'\n | string;\n timestamp: number;\n}\n\n/**\n * Emitted when the active account changes.\n *\n * @description\n * Fired when the user switches between accounts via setActiveAccount() or\n * account selector UI. Includes both the previous and new account for\n * comparison and transition logic.\n */\nexport interface AccountChangeEvent {\n previousAccount: UnifiedAccount | null;\n newAccount: UnifiedAccount | null;\n timestamp: number;\n}\n\n/**\n * Emitted when a provider's account list updates.\n *\n * @description\n * Fired when accounts are added or removed from a provider. This can happen\n * when the wallet adds new accounts or when the user grants access to\n * additional accounts.\n */\nexport interface AccountsUpdateEvent {\n providerId: string;\n accounts: UnifiedAccount[];\n totalAccounts: number;\n timestamp: number;\n}\n\n/**\n * Emitted for session lifecycle events (created, deleted, restored).\n *\n * @description\n * Fired when a session is created, deleted, or restored. Sessions represent\n * a logical connection to a wallet, which may contain multiple accounts.\n *\n * This same interface is used for:\n * - `sessionCreated` - New session established\n * - `sessionDeleted` - Session terminated\n * - `sessionRestored` - Session restored from storage\n */\nexport interface SessionEvent {\n providerId: string;\n sessionKey: string;\n accounts: UnifiedAccount[];\n metadata?: Record<string, unknown>;\n timestamp: number;\n}\n\n/**\n * Emitted when a provider's status changes.\n *\n * @description\n * Fired when a provider transitions between connection states. Useful for\n * showing loading indicators or status badges.\n *\n * **Status Values:**\n * - `'connecting'` - Connection attempt in progress\n * - `'connected'` - Successfully connected\n * - `'disconnected'` - Not connected\n * - `'error'` - Connection failed\n */\nexport interface ProviderStatusEvent {\n providerId: string;\n status: 'connecting' | 'connected' | 'disconnected' | 'error';\n timestamp: number;\n}\n\n/**\n * Emitted when a provider encounters an error.\n *\n * @description\n * Fired when a wallet operation fails. Includes the error details and\n * optional context about what operation failed. Use this to display\n * error messages to users or for debugging.\n */\nexport interface ProviderErrorEvent {\n providerId: string;\n error: Error | string;\n context?: string;\n timestamp: number;\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @fileoverview Unified wallet context model for declarative state access.\n *\n * @module models/wallet-context\n *\n * @description\n * Defines the WalletContext interface that provides a single, cohesive interface\n * for all wallet state. This model eliminates the need to manually track multiple\n * signals across different services by aggregating all wallet information.\n *\n * The WalletContext is the primary data structure used by:\n * - {@link WalletContextService} to compute and expose wallet state\n * - {@link WalletContextDirective} to provide context to templates\n * - {@link WalletConnectedDirective} for conditional rendering\n */\n\nimport type { UnifiedAccount } from './unified-account.model';\nimport type { BaseWalletProvider } from '../providers/base-wallet-provider';\n\n/**\n * Unified wallet context interface.\n *\n * @description\n * Aggregates all wallet state into a single, reactive context object.\n * Used by `*walletContext` and `*walletConnected` directives to provide\n * declarative state access in templates.\n *\n * **Properties:**\n * - `isConnected` - True if any account is available\n * - `activeAccount` - Currently selected account (null if none)\n * - `allAccounts` - All accounts from all providers\n * - `sessions` - Active sessions with metadata\n * - `providers` - All registered providers\n * - `connectedProviders` - Only providers with active connections\n */\nexport interface WalletContext {\n /**\n * Whether unknown wallet provider is currently connected\n */\n isConnected: boolean;\n\n /**\n * The currently active account across all providers\n * Null if no account is selected\n */\n activeAccount: UnifiedAccount | null;\n\n /**\n * All accounts from all connected providers\n * Empty array if no providers are connected\n */\n allAccounts: UnifiedAccount[];\n\n /**\n * All active sessions across providers\n * For HSuite Native: single session with multiple accounts\n * For WalletConnect: multiple sessions, one per wallet\n */\n sessions: WalletSession[];\n\n /**\n * All registered wallet providers\n * Includes both connected and disconnected providers\n */\n providers: BaseWalletProvider[];\n\n /**\n * Only the currently connected providers\n */\n connectedProviders: BaseWalletProvider[];\n}\n\n/**\n * Session information for display and management.\n *\n * @description\n * Represents a single wallet session, which may contain multiple accounts.\n * For HSuite Native, there's typically one session with multiple accounts.\n * For WalletConnect, there may be multiple sessions (one per paired wallet).\n */\nexport interface WalletSession {\n /**\n * Unique provider identifier\n */\n providerId: string;\n\n /**\n * Provider type (hsuite-native, walletconnect-v2)\n */\n providerType: string;\n\n /**\n * Human-readable provider name\n */\n providerName: string;\n\n /**\n * Accounts in this session\n */\n accounts: UnifiedAccount[];\n\n /**\n * Additional session metadata\n */\n metadata?: {\n sessionKey?: string;\n topic?: string;\n networkId?: string;\n [key: string]: any;\n };\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @fileoverview Configuration models for different connection protocols.\n *\n * @module models/connection-config\n *\n * @description\n * Defines configuration types and type guards for wallet connection protocols.\n * Each provider type has its own configuration interface with protocol-specific\n * options. The ConnectionConfig union type allows type-safe handling of\n * different provider configurations.\n *\n * **Configuration Types:**\n * - {@link HsuiteNativeConfig} - HSuite Native Connect protocol\n * - {@link WalletConnectV2Config} - WalletConnect v2 protocol\n * - {@link MobileNativeConfig} - P2P Native mobile connections\n */\n\nimport type { HsuiteNativeConfig, WalletConnectV2Config } from './provider-types';\n\n/**\n * Union type of all connection configurations.\n *\n * @description\n * Represents any valid connection configuration for the supported wallet providers.\n * Use type guards to narrow to specific config types when needed.\n */\nexport type ConnectionConfig = HsuiteNativeConfig | WalletConnectV2Config;\n\n/**\n * Type guard for HSuite Native configuration.\n *\n * @description\n * Narrows a ConnectionConfig to HsuiteNativeConfig based on the type property.\n *\n * @param config - Configuration to check\n *\n * @returns True if config is HsuiteNativeConfig\n */\nexport function isHsuiteNativeConfig(config: ConnectionConfig): config is HsuiteNativeConfig {\n return config.type === 'hsuite-native';\n}\n\n/**\n * Type guard for WalletConnect v2 configuration.\n *\n * @description\n * Narrows a ConnectionConfig to WalletConnectV2Config based on the type property.\n *\n * @param config - Configuration to check\n *\n * @returns True if config is WalletConnectV2Config\n */\nexport function isWalletConnectV2Config(config: ConnectionConfig): config is WalletConnectV2Config {\n return config.type === 'walletconnect-v2';\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file base-signer.interface.ts\n * @description Abstract signer interface for WalletConnect multi-chain support\n *\n * Defines the contract that all ledger-specific signers must implement.\n * This enables the Strategy Pattern for clean separation of ledger logic.\n */\n\nimport type { SignResult, SubmitResult, SignMessageResult } from '../../base-wallet-provider';\nimport type SignClient from '@walletconnect/sign-client';\n\n/**\n * Configuration for initializing a WalletConnect signer\n */\nexport interface WalletConnectSignerConfig {\n ledgerId: string;\n networkId: string;\n chainId: string; // e.g., 'hedera:testnet', 'xrpl:testnet'\n}\n\n/**\n * Parameters for signing operations\n */\nexport interface SignerOperationParams {\n client: SignClient;\n topic: string;\n accountAddress: string;\n payload: string;\n networkId: string;\n}\n\n/**\n * Interface that all WalletConnect signers must implement.\n * Each ledger (Hedera, XRPL, etc.) provides its own implementation.\n *\n * This follows the Strategy Pattern, allowing the WalletConnect provider\n * to delegate ledger-specific logic to the appropriate signer.\n */\nexport interface IWalletConnectSigner {\n /**\n * Unique identifier for this ledger (e.g., 'hedera', 'xrpl')\n */\n readonly ledgerId: string;\n\n /**\n * Build WalletConnect namespace configuration for this ledger.\n * Defines the JSON-RPC methods, chains, and events supported.\n *\n * @param networkId - The network identifier (e.g., 'hedera:testnet')\n * @returns Namespace configuration object\n */\n buildNamespace(networkId: string): {\n methods: string[];\n chains: string[];\n events: string[];\n };\n\n /**\n * Sign a transaction without submitting to the network.\n * Used for multi-sig workflows or when the dApp handles submission.\n *\n * @param params - Signing parameters including client, topic, account, and payload\n * @returns Promise resolving to signed transaction data\n */\n signTransaction(params: SignerOperationParams): Promise<SignResult>;\n\n /**\n * Sign and submit a transaction to the network.\n * The wallet handles both signing and network submission.\n *\n * @param params - Submission parameters including client, topic, account, and payload\n * @returns Promise resolving to transaction ID and metadata\n */\n submitTransaction(params: SignerOperationParams): Promise<SubmitResult>;\n\n /**\n * Sign and execute a transaction in one call (preferred method to avoid double prompts).\n * This uses the wallet's native sign+execute method when available (e.g., hedera_signAndExecuteTransaction).\n * Falls back to sign then submit for wallets that don't support it.\n *\n * @param params - Transaction parameters including client, topic, account, and payload\n * @returns Promise resolving to transaction ID and metadata\n */\n signAndExecuteTransaction?(params: SignerOperationParams): Promise<SubmitResult>;\n\n /**\n * Sign an arbitrary message (e.g., for DAO votes, authentication, proofs).\n * The message can be plain text or base64 encoded.\n *\n * @param params - Signing parameters with message string\n * @returns Promise resolving to signature and optional public key\n */\n signMessage(\n params: SignerOperationParams & { message: string; encoding?: 'utf-8' | 'base64' },\n ): Promise<SignMessageResult>;\n\n /**\n * Parse accounts from WalletConnect session namespace.\n * Extracts account addresses and chain IDs from the session data.\n *\n * Optionally filters accounts to only include those matching a target network.\n * This is important for respecting the user's network selection in the dApp.\n *\n * @param namespace - The WalletConnect namespace object for this ledger\n * @param targetNetworkId - Optional network ID to filter accounts (e.g., 'hedera:mainnet')\n * @returns Array of parsed account objects, filtered by target network if specified\n */\n parseAccounts(\n namespace: any,\n targetNetworkId?: string,\n ): Array<{ address: string; chainId: string }>;\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file walletconnect-types.ts\n * @description Shared types for WalletConnect integration\n *\n * Common types used across the WalletConnect provider and signers\n */\n\nimport type { ISignClient } from '@walletconnect/types';\nimport type { WalletConnectModal } from '@walletconnect/modal';\n\n/**\n * Represents an active WalletConnect session\n */\nexport interface WalletConnectSession {\n topic: string;\n namespaces: Record<string, unknown>;\n ledgerId: string;\n}\n\n/**\n * Context object containing all necessary WalletConnect instances\n */\nexport interface SignerContext {\n client: ISignClient;\n session: WalletConnectSession;\n modal?: WalletConnectModal;\n}\n\n/**\n * Metadata about a WalletConnect session for storage/restoration\n */\nexport interface SessionMetadata {\n projectId: string;\n ledgerId: string;\n networkId: string;\n topic: string;\n connectedAt: number;\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file index.ts\n * @description Barrel export for WalletConnect module\n *\n * Provides a clean public API for the WalletConnect integration.\n * Exports all necessary types, classes, and utilities.\n */\n\n// Core\nexport * from './core/walletconnect-provider';\nexport * from './core/walletconnect-session-store';\nexport * from './core/walletconnect-client-manager';\nexport * from './core/walletconnect-signing-orchestrator';\nexport * from './core/base-signer.interface';\nexport * from './core/walletconnect-types';\n\n// Signers\nexport * from './signers/hedera-signer';\nexport * from './signers/xrpl-signer';\nexport * from './signers/signer-factory';\n\n// Encoders - re-export from native-wallet-sdk for convenience\nexport { HederaTransactionEncoder, XrplTransactionEncoder } from '@hsuite/native-connect-sdk';\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file wallet-error-handler.ts\n * @description Configurable error handler with automatic toast notifications\n *\n * Provides automatic error handling for wallet operations with beautiful\n * Ionic toast notifications. Fully customizable per error type.\n */\n\nimport { Injectable, Provider, inject, InjectionToken } from '@angular/core';\nimport { getLogger } from '@hsuite/native-connect-sdk';\nimport { ToastController } from '@ionic/angular/standalone';\n\nimport { WalletEventBus } from '../services/wallet-event-bus.service';\n\nconst logger = getLogger().scoped?.('WalletErrorHandler') ?? getLogger();\n\n/**\n * Error category for categorizing wallet errors\n */\nexport type WalletErrorCategory =\n | 'network' // Network connectivity issues\n | 'auth' // Authentication failures (PIN, biometric)\n | 'user_cancelled' // User cancelled the operation\n | 'provider' // Provider-specific errors\n | 'transaction' // Transaction failures\n | 'validation' // Input validation errors\n | 'unknown'; // Uncategorized errors\n\n/**\n * Categorized wallet error with user-friendly message\n */\nexport interface CategorizedError {\n /** Original error */\n original: Error;\n /** Error category */\n category: WalletErrorCategory;\n /** User-friendly message */\n userMessage: string;\n /** Whether this error is recoverable */\n recoverable: boolean;\n}\n\n/**\n * Configuration for the wallet error handler\n */\nexport interface WalletErrorHandlerConfig {\n /**\n * Whether to show toast notifications for errors (default: true)\n */\n showToasts?: boolean;\n\n /**\n * Custom handler for connection errors\n */\n onConnectionError?: (error: Error) => void;\n\n /**\n * Custom handler for transaction errors\n */\n onTransactionError?: (error: Error) => void;\n\n /**\n * Custom handler for provider errors\n */\n onProviderError?: (error: Error) => void;\n\n /**\n * Toast duration in milliseconds (default: 4000)\n */\n toastDuration?: number;\n\n /**\n * Toast position (default: 'top')\n */\n toastPosition?: 'top' | 'bottom' | 'middle';\n}\n\n/**\n * Injection token for error handler config\n */\nexport const WALLET_ERROR_HANDLER_CONFIG = new InjectionToken<WalletErrorHandlerConfig>(\n 'WALLET_ERROR_HANDLER_CONFIG',\n);\n\n/**\n * Wallet error handler service\n *\n * Automatically subscribes to wallet events and shows error toasts.\n * Can be customized via configuration.\n */\n@Injectable()\nexport class WalletErrorHandler {\n private readonly config = inject(WALLET_ERROR_HANDLER_CONFIG, { optional: true });\n private readonly eventBus = inject(WalletEventBus);\n private readonly toastController = inject(ToastController);\n\n /**\n *\n */\n constructor() {\n // Setup error listeners\n this.setupErrorListeners();\n logger.debug('Initialized with config', { config: this.config });\n }\n\n /**\n * Setup listeners for wallet errors\n */\n private setupErrorListeners(): void {\n // Listen to provider errors\n this.eventBus.providerError.subscribe((event) => {\n logger.error('Provider error', { event });\n\n // Custom handler\n if (this.config?.onProviderError) {\n this.config.onProviderError(\n event.error instanceof Error ? event.error : new Error(String(event.error)),\n );\n }\n\n // Show toast if enabled (default: true)\n if (this.config?.showToasts !== false) {\n void this.showErrorToast(\n 'Wallet Error',\n event.error instanceof Error ? event.error.message : String(event.error),\n );\n }\n });\n\n // Listen to disconnections for unexpected disconnects\n this.eventBus.disconnected.subscribe((event) => {\n if (event.reason === 'wallet_initiated_disconnect' || event.reason === 'session_terminated') {\n logger.warn('Unexpected disconnect', { event });\n\n // Show toast if enabled\n if (this.config?.showToasts !== false) {\n void this.showWarningToast(\n 'Wallet Disconnected',\n `${event.providerType === 'hsuite-native' ? 'HSuite Wallet' : 'WalletConnect'} session ended`,\n );\n }\n }\n });\n }\n\n /**\n * Show error toast\n * Uses cssClass-only styling (no Ionic color property) for theme compatibility.\n * @param header\n * @param message\n */\n private async showErrorToast(header: string, message: string): Promise<void> {\n const toast = await this.toastController.create({\n header,\n message,\n duration: this.config?.toastDuration || 4000,\n position: this.config?.toastPosition || 'top',\n cssClass: 'toast-danger toast-compact',\n buttons: [{ icon: 'close', role: 'cancel' }],\n });\n\n await toast.present();\n }\n\n /**\n * Show warning toast\n * Uses cssClass-only styling (no Ionic color property) for theme compatibility.\n * @param header\n * @param message\n */\n private async showWarningToast(header: string, message: string): Promise<void> {\n const toast = await this.toastController.create({\n header,\n message,\n duration: this.config?.toastDuration || 4000,\n position: this.config?.toastPosition || 'top',\n cssClass: 'toast-warning toast-compact',\n buttons: [{ icon: 'close', role: 'cancel' }],\n });\n\n await toast.present();\n }\n\n /**\n * Manually handle an error (for use in components)\n * @param title\n * @param error\n */\n async handleError(title: string, error: Error | string): Promise<void> {\n const message = error instanceof Error ? error.message : String(error);\n\n if (this.config?.showToasts !== false) {\n await this.showErrorToast(title, message);\n }\n }\n\n /**\n * Manually show success toast (convenience method)\n * Uses cssClass-only styling (no Ionic color property) for theme compatibility.\n * @param header\n * @param message\n */\n async showSuccess(header: string, message: string): Promise<void> {\n const toast = await this.toastController.create({\n header,\n message,\n duration: this.config?.toastDuration || 3000,\n position: this.config?.toastPosition || 'top',\n cssClass: 'toast-success toast-compact',\n buttons: [{ icon: 'close', role: 'cancel' }],\n });\n\n await toast.present();\n }\n\n /**\n * Categorize an error for better handling\n * @param error - The error to categorize\n * @returns Categorized error with user-friendly message\n */\n categorizeError(error: Error | string): CategorizedError {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const lowerMessage = errorMessage.toLowerCase();\n\n // Network errors\n if (\n lowerMessage.includes('network') ||\n lowerMessage.includes('timeout') ||\n lowerMessage.includes('fetch') ||\n lowerMessage.includes('connection')\n ) {\n return {\n original: error instanceof Error ? error : new Error(errorMessage),\n category: 'network',\n userMessage: 'Network connection issue. Please check your internet connection.',\n recoverable: true,\n };\n }\n\n // User cancelled\n if (\n lowerMessage.includes('cancel') ||\n lowerMessage.includes('rejected') ||\n lowerMessage.includes('denied') ||\n lowerMessage.includes('user rejected')\n ) {\n return {\n original: error instanceof Error ? error : new Error(errorMessage),\n category: 'user_cancelled',\n userMessage: 'Operation cancelled.',\n recoverable: true,\n };\n }\n\n // Authentication errors\n if (\n lowerMessage.includes('pin') ||\n lowerMessage.includes('biometric') ||\n lowerMessage.includes('auth') ||\n lowerMessage.includes('unlock')\n ) {\n return {\n original: error instanceof Error ? error : new Error(errorMessage),\n category: 'auth',\n userMessage: 'Authentication failed. Please try again.',\n recoverable: true,\n };\n }\n\n // Transaction errors\n if (\n lowerMessage.includes('transaction') ||\n lowerMessage.includes('insufficient') ||\n lowerMessage.includes('balance') ||\n lowerMessage.includes('sign')\n ) {\n return {\n original: error instanceof Error ? error : new Error(errorMessage),\n category: 'transaction',\n userMessage: 'Transaction failed. Please check the details and try again.',\n recoverable: true,\n };\n }\n\n // Validation errors\n if (\n lowerMessage.includes('invalid') ||\n lowerMessage.includes('required') ||\n lowerMessage.includes('format')\n ) {\n return {\n original: error instanceof Error ? error : new Error(errorMessage),\n category: 'validation',\n userMessage: errorMessage,\n recoverable: true,\n };\n }\n\n // Provider errors\n if (\n lowerMessage.includes('provider') ||\n lowerMessage.includes('wallet') ||\n lowerMessage.includes('session')\n ) {\n return {\n original: error instanceof Error ? error : new Error(errorMessage),\n category: 'provider',\n userMessage: 'Wallet connection issue. Please reconnect.',\n recoverable: true,\n };\n }\n\n // Unknown\n return {\n original: error instanceof Error ? error : new Error(errorMessage),\n category: 'unknown',\n userMessage: 'An unexpected error occurred.',\n recoverable: false,\n };\n }\n}\n\n/**\n * Provider function for WalletErrorHandler\n *\n * Call this in your app configuration to enable automatic error handling.\n *\n * @param config - Optional configuration\n * @returns Angular providers\n */\nexport function provideWalletErrorHandler(config?: WalletErrorHandlerConfig): Provider[] {\n return [\n {\n provide: WALLET_ERROR_HANDLER_CONFIG,\n useValue: config || { showToasts: true },\n },\n WalletErrorHandler,\n ];\n}\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file index.ts\n * @description P2P Native Provider exports\n *\n * Exports for P2P Native connection components.\n */\n\nexport {\n P2PNativeProvider,\n type PairingOfferResult,\n type P2PNativeConnectionState,\n} from './p2p-native.provider';\n\nexport {\n P2PSessionManager,\n type P2PSession,\n type CreateOfferOptions,\n type CreateOfferResult,\n type P2PConnectionState,\n} from './p2p-session-manager';\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * Utility exports for @hsuite/native-connect-angular\n */\nexport * from './ledger-icons.util';\n","/**\n * HSuite Native Connect\n * Copyright 2024-2025 HSuite (https://hsuite.finance)\n *\n * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0\n *\n * This file is part of HSuite Native Connect. For commercial licensing,\n * visit https://hsuite.finance/licensing\n */\n\n/**\n * @file Public API surface of @hsuite/native-connect-angular package.\n *\n * @module @hsuite/native-connect-angular\n *\n * @description\n * Angular integration SDK for HSuite Wallet. This package provides a complete\n * solution for integrating wallet connectivity into Angular applications, supporting\n * multiple blockchain protocols including Hedera and XRPL.\n *\n * **Key Features:**\n * - Multi-protocol wallet support (HSuite Native, WalletConnect v2, P2P Native)\n * - Reactive Angular signals for state management\n * - Pre-built UI components for common wallet interactions\n * - Transaction builders for Hedera and XRPL\n * - Structural directives for declarative wallet state access\n * - Event bus for wallet lifecycle events\n *\n * **Architecture:**\n * ```\n * ┌─────────────────────────────────────────────────────────────┐\n * │ UnifiedWalletService │\n * │ (Central orchestrator for multi-protocol wallet access) │\n * └────────────────────────────┬────────────────────────────────┘\n * │\n * ┌──────────────────┬┴────────────────────┐\n * │ │ │\n * HsuiteNativeProvider WalletConnectV2Provider P2PNativeProvider\n * │ │ │\n * └──────────────────┴──────────────────────┘\n * │\n * BaseWalletProvider\n * (common interface)\n * ```\n *\n * @Component({\n * standalone: true,\n * imports: [WalletConnectButtonComponent],\n * template: `\n * <wallet-connect-button\n * [walletConnectProjectId]=\"'your-project-id'\"\n * (connected)=\"onConnect($event)\">\n * </wallet-connect-button>\n * `\n * })\n * export class MyComponent {\n * wallet = inject(UnifiedWalletService);\n *\n * onConnect(event: any) {\n * console.log('Connected:', this.wallet.activeAccount());\n * }\n * }\n * ```\n *\n * @NgModule({\n * imports: [HsuiteWalletModule],\n * })\n * export class AppModule {}\n * ```\n */\n\n// NgModule (for module-based apps)\nexport { HsuiteWalletModule } from './lib/hsuite-wallet.module';\n\n// Services\nexport * from './lib/services/unified-wallet.service';\nexport { WalletEventBus } from './lib/services/wallet-event-bus.service';\nexport { WalletContextService } from './lib/services/wallet-context.service';\nexport { TransactionService } from './lib/services/transaction.service';\nexport { LoggerService } from './lib/services/logger.service';\n\n// Transaction Builders (for dApps to construct transactions)\nexport {\n HederaTransactionBuilderService,\n XrplTransactionBuilderService,\n scaleHederaAmountToBaseUnits,\n} from './lib/services/transaction-builders';\n\n// Transaction builder types (for dApps)\nexport type {\n BatchInnerTransactionType,\n BatchInnerTransaction,\n HederaKeyConfig,\n TopicCreateOptions,\n TokenCreateOptions,\n AccountCreateOptions,\n} from './lib/services/transaction-builders';\n\n// Transports\nexport {\n ChromeExtensionTransport,\n isExtensionInstalled,\n getExtensionVersion,\n} from './lib/transports/chrome-extension-transport';\nexport type { ChromeExtensionTransportOptions } from './lib/transports/chrome-extension-transport';\n\n// UI Components\nexport * from './lib/components/wallet-connect-button/wallet-connect-button.component';\nexport * from './lib/components/wallet-session-display/wallet-session-display.component';\nexport * from './lib/components/wallet-transaction-status/wallet-transaction-status.component';\nexport * from './lib/components/account-selector/account-selector.component';\nexport {\n AccountListComponent,\n AccountItem,\n LedgerGroup,\n} from './lib/components/account-selector/account-list/account-list.component';\nexport {\n AccountFilterComponent,\n CompactHeaderFormat,\n CompactHeaderSize,\n ActiveAccountData,\n} from './lib/components/account-selector/account-filter/account-filter.component';\nexport { AccountActionsComponent } from './lib/components/account-selector/account-actions/account-actions.component';\nexport {\n AccountSelectorService,\n SelectedAccountData,\n} from './lib/components/account-selector/account-selector.service';\nexport { AccountFormattingService } from './lib/components/account-selector/account-formatting.service';\nexport {\n AccountGroupingService,\n AccountGroupingMode,\n NetworkGroup,\n ProtocolGroup,\n} from './lib/components/account-selector/account-grouping.service';\nexport { WalletConnectionModalComponent } from './lib/components/wallet-connection-modal/wallet-connection-modal.component';\nexport { WalletAccountDisplayComponent } from './lib/components/wallet-account-display/wallet-account-display.component';\nexport { WalletConnectPromptComponent } from './lib/components/wallet-connect-prompt/wallet-connect-prompt.component';\nexport { WalletConnectedGuardComponent } from './lib/components/wallet-connected-guard/wallet-connected-guard.component';\n\n// Directives\nexport { WalletContextDirective } from './lib/directives/wallet-context.directive';\nexport { WalletConnectedDirective } from './lib/directives/wallet-connected.directive';\nexport { WalletEventsDirective } from './lib/directives/wallet-events.directive';\n\n// Multi-Protocol Support - Models\nexport * from './lib/models/provider-types';\nexport * from './lib/models/unified-account.model';\nexport * from './lib/models/wallet-events.model';\nexport * from './lib/models/wallet-context.model';\nexport type { ConnectionConfig } from './lib/models/connection-config.model';\nexport {\n isHsuiteNativeConfig,\n isWalletConnectV2Config,\n} from './lib/models/connection-config.model';\n\n// Multi-Protocol Support - Providers\nexport * from './lib/providers/base-wallet-provider';\nexport * from './lib/providers/hsuite-native-provider';\nexport * from './lib/providers/walletconnect';\nexport { WalletConnectV2Provider } from './lib/providers/walletconnect/core/walletconnect-provider';\nexport {\n provideWalletErrorHandler,\n WalletErrorHandler,\n} from './lib/providers/wallet-error-handler';\nexport type { WalletErrorHandlerConfig } from './lib/providers/wallet-error-handler';\n\n// P2P Native Provider (for QR code pairing)\nexport * from './lib/providers/p2p-native';\n\n// === Unified Channel Protocol (v2) ===\n// New simplified protocol replacing the session/transport stack\nexport { ChannelClientService } from './lib/providers/hsuite-native/channel-client.service';\nexport type { ChannelConnectConfig } from './lib/providers/hsuite-native/channel-client.service';\n\n// Re-export channel types from native-wallet-sdk for convenience\nexport type {\n ChannelInvite,\n ChannelMessage,\n ChannelState,\n ChannelType,\n ChannelAccount,\n TransportState,\n MessageType,\n} from '@hsuite/native-connect-sdk';\n\n// Re-export types from native-wallet-sdk for convenience\nexport type {\n RpcRequest,\n RpcResponse,\n RpcEnvelope,\n SessionApproval,\n} from '@hsuite/native-connect-types';\n\n// Utilities\nexport {\n getLedgerIcon,\n getLedgerColor,\n getLedgerName,\n getTokenIcon,\n DEFAULT_LEDGER_ICONS,\n LEDGER_COLORS,\n LEDGER_NAMES,\n} from './lib/utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["logger","extractErrorMessage","i1.P2PSessionManager","i1.HsuiteNativeProvider","i2.WalletConnectV2Provider","i3.P2PNativeProvider","i1","i2.UnifiedWalletService"],"mappings":"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"}
|