@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,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HSuite Native Connect
|
|
3
|
+
* Copyright 2024-2025 HSuite (https://hsuite.finance)
|
|
4
|
+
*
|
|
5
|
+
* SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
|
|
6
|
+
*
|
|
7
|
+
* This file is part of HSuite Native Connect. For commercial licensing,
|
|
8
|
+
* visit https://hsuite.finance/licensing
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @file High-level transaction service with automatic state management.
|
|
13
|
+
*
|
|
14
|
+
* @module services/transaction
|
|
15
|
+
*
|
|
16
|
+
* @description
|
|
17
|
+
* TransactionService provides simplified methods for common transaction operations
|
|
18
|
+
* with built-in state management, error handling, and UI feedback. It wraps
|
|
19
|
+
* UnifiedWalletService operations with additional convenience features.
|
|
20
|
+
*
|
|
21
|
+
* **Key Features:**
|
|
22
|
+
* - Automatic processing state tracking via Angular signals
|
|
23
|
+
* - Toast notifications for success and error states
|
|
24
|
+
* - Error propagation with proper error types
|
|
25
|
+
* - Result and error state tracking for UI binding
|
|
26
|
+
* - Support for batch transactions
|
|
27
|
+
*
|
|
28
|
+
* **Signal-based State:**
|
|
29
|
+
* - `isProcessing()` - True while a transaction is in progress
|
|
30
|
+
* - `lastResult()` - The result of the last successful transaction
|
|
31
|
+
* - `lastError()` - The error from the last failed transaction
|
|
32
|
+
*
|
|
33
|
+
* @Component({
|
|
34
|
+
* template: `
|
|
35
|
+
* <button [disabled]="txService.isProcessing()" (click)="send()">
|
|
36
|
+
* {{ txService.isProcessing() ? 'Processing...' : 'Send' }}
|
|
37
|
+
* </button>
|
|
38
|
+
* `
|
|
39
|
+
* })
|
|
40
|
+
* export class MyComponent {
|
|
41
|
+
* txService = inject(TransactionService);
|
|
42
|
+
*
|
|
43
|
+
* async send() {
|
|
44
|
+
* const result = await this.txService.signAndSubmit(payload);
|
|
45
|
+
* console.log('Transaction ID:', result.transactionId);
|
|
46
|
+
* }
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
import { Injectable, inject, signal, type Signal, type WritableSignal } from '@angular/core';
|
|
52
|
+
import { getLogger } from '@hsuite/native-connect-sdk';
|
|
53
|
+
import { ToastController } from '@ionic/angular/standalone';
|
|
54
|
+
|
|
55
|
+
import type { SignResult, SubmitResult } from '../providers/base-wallet-provider';
|
|
56
|
+
|
|
57
|
+
import { UnifiedWalletService } from './unified-wallet.service';
|
|
58
|
+
import { WalletEventBus } from './wallet-event-bus.service';
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
const logger = getLogger().scoped?.('TransactionService') ?? getLogger();
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* High-level transaction service with automatic state management.
|
|
65
|
+
*
|
|
66
|
+
* @service TransactionService
|
|
67
|
+
*
|
|
68
|
+
* @description
|
|
69
|
+
* Simplifies common transaction operations with built-in features:
|
|
70
|
+
* - Automatic processing state management via Angular signals
|
|
71
|
+
* - Error propagation with toast notifications
|
|
72
|
+
* - Event emission for tracking and debugging
|
|
73
|
+
* - Signal-based reactive state (modern Angular pattern)
|
|
74
|
+
*
|
|
75
|
+
* This service is the recommended way to perform transactions in dApps,
|
|
76
|
+
* as it handles all the boilerplate around state management and user feedback.
|
|
77
|
+
*
|
|
78
|
+
* @providedIn root
|
|
79
|
+
*/
|
|
80
|
+
@Injectable({ providedIn: 'root' })
|
|
81
|
+
export class TransactionService {
|
|
82
|
+
private readonly walletService = inject(UnifiedWalletService);
|
|
83
|
+
private readonly eventBus = inject(WalletEventBus);
|
|
84
|
+
private readonly toastController = inject(ToastController);
|
|
85
|
+
|
|
86
|
+
// Internal writable signals for state management
|
|
87
|
+
private readonly _isProcessing: WritableSignal<boolean> = signal(false);
|
|
88
|
+
private readonly _lastResult: WritableSignal<unknown> = signal(null);
|
|
89
|
+
private readonly _lastError: WritableSignal<Error | null> = signal(null);
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Signal indicating if a transaction is currently processing
|
|
93
|
+
*/
|
|
94
|
+
readonly isProcessing: Signal<boolean> = this._isProcessing.asReadonly();
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Signal of the last transaction result
|
|
98
|
+
*/
|
|
99
|
+
readonly lastResult: Signal<unknown> = this._lastResult.asReadonly();
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Signal of the last error
|
|
103
|
+
*/
|
|
104
|
+
readonly lastError: Signal<Error | null> = this._lastError.asReadonly();
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Sign a transaction
|
|
108
|
+
*
|
|
109
|
+
* Automatically handles:
|
|
110
|
+
* - Processing state
|
|
111
|
+
* - Error propagation
|
|
112
|
+
* - Success toast notification
|
|
113
|
+
*
|
|
114
|
+
* @param payload - Transaction payload (base64 or transaction bytes)
|
|
115
|
+
* @returns Sign result
|
|
116
|
+
*/
|
|
117
|
+
async signTransaction(payload: string): Promise<SignResult> {
|
|
118
|
+
return this.executeTransaction(async () => {
|
|
119
|
+
const result = (await this.walletService.signTransaction(payload)) as SignResult;
|
|
120
|
+
logger.info('Transaction signed', {
|
|
121
|
+
hasSignature: !!(result as { signedTransaction?: string }).signedTransaction,
|
|
122
|
+
});
|
|
123
|
+
await this.showSuccessToast(
|
|
124
|
+
'Transaction Signed',
|
|
125
|
+
'Your transaction has been signed successfully.',
|
|
126
|
+
);
|
|
127
|
+
return result;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Submit a transaction
|
|
133
|
+
*
|
|
134
|
+
* Automatically handles:
|
|
135
|
+
* - Processing state
|
|
136
|
+
* - Error propagation
|
|
137
|
+
* - Success toast notification
|
|
138
|
+
*
|
|
139
|
+
* @param payload - Transaction payload (base64 or transaction bytes)
|
|
140
|
+
* @returns Submit result
|
|
141
|
+
*/
|
|
142
|
+
async submitTransaction(payload: string): Promise<SubmitResult> {
|
|
143
|
+
return this.executeTransaction(async () => {
|
|
144
|
+
const result = (await this.walletService.submitTransaction(payload)) as SubmitResult;
|
|
145
|
+
logger.info('Transaction submitted', { transactionId: result.transactionId });
|
|
146
|
+
await this.showSuccessToast(
|
|
147
|
+
'Transaction Submitted',
|
|
148
|
+
`Transaction ID: ${result.transactionId || 'Success'}`,
|
|
149
|
+
);
|
|
150
|
+
return result;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Sign and submit a transaction in one call
|
|
156
|
+
*
|
|
157
|
+
* Uses the wallet's native sign+submit method when available (e.g., WalletConnect's signAndExecuteTransaction).
|
|
158
|
+
* This prevents double prompts and provides a better UX.
|
|
159
|
+
*
|
|
160
|
+
* @param payload - Transaction payload
|
|
161
|
+
* @returns Submit result
|
|
162
|
+
*/
|
|
163
|
+
async signAndSubmit(payload: string): Promise<SubmitResult> {
|
|
164
|
+
return this.executeTransaction(async () => {
|
|
165
|
+
// Use the wallet's signAndExecuteTransaction method directly
|
|
166
|
+
// This uses hedera_signAndExecuteTransaction for WalletConnect (one prompt!)
|
|
167
|
+
const result = (await this.walletService.signAndExecuteTransaction(payload)) as SubmitResult;
|
|
168
|
+
logger.info('Transaction signed and submitted', { transactionId: result.transactionId });
|
|
169
|
+
await this.showSuccessToast(
|
|
170
|
+
'Transaction Complete',
|
|
171
|
+
`Transaction ID: ${result.transactionId || 'Success'}`,
|
|
172
|
+
);
|
|
173
|
+
return result;
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Submit a batch transaction
|
|
179
|
+
*
|
|
180
|
+
* Batch transactions require unsigned inner transactions that the wallet will sign.
|
|
181
|
+
* The wallet signs each inner transaction with the account's key, then builds and
|
|
182
|
+
* executes the BatchTransaction.
|
|
183
|
+
*
|
|
184
|
+
* @param options - Batch transaction options
|
|
185
|
+
* @param options.batchKey - Public key for batch (typically account's public key)
|
|
186
|
+
* @param options.innerTransactions - Array of unsigned inner transactions
|
|
187
|
+
* @returns Submit result
|
|
188
|
+
*/
|
|
189
|
+
async submitBatchTransaction(options: {
|
|
190
|
+
batchKey: string;
|
|
191
|
+
innerTransactions: Array<{ payload: string; description?: string }>;
|
|
192
|
+
}): Promise<SubmitResult> {
|
|
193
|
+
return this.executeTransaction(async () => {
|
|
194
|
+
const result = (await this.walletService.submitTransaction('', {
|
|
195
|
+
isBatch: true,
|
|
196
|
+
batchKey: options.batchKey,
|
|
197
|
+
innerTransactions: options.innerTransactions,
|
|
198
|
+
})) as SubmitResult;
|
|
199
|
+
logger.info('Batch transaction submitted', { transactionId: result.transactionId });
|
|
200
|
+
await this.showSuccessToast(
|
|
201
|
+
'Batch Transaction Complete',
|
|
202
|
+
`Transaction ID: ${result.transactionId || 'Success'}`,
|
|
203
|
+
);
|
|
204
|
+
return result;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Sign a message
|
|
210
|
+
*
|
|
211
|
+
* @param message - Message to sign
|
|
212
|
+
* @returns Sign result with signature
|
|
213
|
+
*/
|
|
214
|
+
async signMessage(message: string): Promise<SignResult> {
|
|
215
|
+
return this.executeTransaction(async () => {
|
|
216
|
+
const result = (await this.walletService.signMessage(message)) as SignResult;
|
|
217
|
+
logger.info('Message signed', { hasSignature: !!result.signature });
|
|
218
|
+
await this.showSuccessToast('Message Signed', 'Your message has been signed successfully.');
|
|
219
|
+
return result;
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Show a success toast notification
|
|
225
|
+
* Uses cssClass-only styling (no Ionic color property) for theme compatibility.
|
|
226
|
+
* @param header
|
|
227
|
+
* @param message
|
|
228
|
+
*/
|
|
229
|
+
private async showSuccessToast(header: string, message: string): Promise<void> {
|
|
230
|
+
const toast = await this.toastController.create({
|
|
231
|
+
header,
|
|
232
|
+
message,
|
|
233
|
+
icon: 'checkmark-circle-outline',
|
|
234
|
+
cssClass: 'toast-success toast-compact',
|
|
235
|
+
duration: 4000,
|
|
236
|
+
position: 'top',
|
|
237
|
+
buttons: [{ icon: 'close', role: 'cancel' }],
|
|
238
|
+
});
|
|
239
|
+
await toast.present();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Show an error toast notification
|
|
244
|
+
* Uses cssClass-only styling (no Ionic color property) for theme compatibility.
|
|
245
|
+
* @param header
|
|
246
|
+
* @param message
|
|
247
|
+
*/
|
|
248
|
+
private async showErrorToast(header: string, message: string): Promise<void> {
|
|
249
|
+
const toast = await this.toastController.create({
|
|
250
|
+
header,
|
|
251
|
+
message,
|
|
252
|
+
icon: 'close-circle-outline',
|
|
253
|
+
cssClass: 'toast-danger toast-compact',
|
|
254
|
+
duration: 6000,
|
|
255
|
+
position: 'top',
|
|
256
|
+
buttons: [{ icon: 'close', role: 'cancel' }],
|
|
257
|
+
});
|
|
258
|
+
await toast.present();
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Execute a transaction with automatic state management
|
|
263
|
+
*
|
|
264
|
+
* Internal helper that wraps transaction operations with:
|
|
265
|
+
* - Processing state updates
|
|
266
|
+
* - Error handling with toast notifications
|
|
267
|
+
* - Result tracking
|
|
268
|
+
* @param operation
|
|
269
|
+
*/
|
|
270
|
+
private async executeTransaction<T>(operation: () => Promise<T>): Promise<T> {
|
|
271
|
+
// Set processing state
|
|
272
|
+
this.setProcessing(true);
|
|
273
|
+
this.clearError();
|
|
274
|
+
|
|
275
|
+
try {
|
|
276
|
+
// Execute the operation
|
|
277
|
+
const result = await operation();
|
|
278
|
+
|
|
279
|
+
// Update result state
|
|
280
|
+
this.setResult(result);
|
|
281
|
+
|
|
282
|
+
return result;
|
|
283
|
+
} catch (error) {
|
|
284
|
+
// Update error state
|
|
285
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
286
|
+
this.setError(err);
|
|
287
|
+
|
|
288
|
+
// Show error toast
|
|
289
|
+
await this.showErrorToast(
|
|
290
|
+
'Transaction Failed',
|
|
291
|
+
err.message || 'An error occurred during the transaction.',
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
// Re-throw for caller to handle
|
|
295
|
+
throw err;
|
|
296
|
+
} finally {
|
|
297
|
+
// Clear processing state
|
|
298
|
+
this.setProcessing(false);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Update processing state
|
|
304
|
+
* @param processing
|
|
305
|
+
*/
|
|
306
|
+
private setProcessing(processing: boolean): void {
|
|
307
|
+
this._isProcessing.set(processing);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Update result state
|
|
312
|
+
* @param result
|
|
313
|
+
*/
|
|
314
|
+
private setResult(result: unknown): void {
|
|
315
|
+
this._lastResult.set(result);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Update error state
|
|
320
|
+
* @param error
|
|
321
|
+
*/
|
|
322
|
+
private setError(error: Error): void {
|
|
323
|
+
this._lastError.set(error);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Clear error state
|
|
328
|
+
*/
|
|
329
|
+
private clearError(): void {
|
|
330
|
+
this._lastError.set(null);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Resets all transaction state to initial values.
|
|
335
|
+
*
|
|
336
|
+
* @description
|
|
337
|
+
* Clears the processing flag, last result, and last error.
|
|
338
|
+
* Useful when navigating away from a transaction page or
|
|
339
|
+
* starting a fresh transaction flow.
|
|
340
|
+
*/
|
|
341
|
+
resetState(): void {
|
|
342
|
+
this.setProcessing(false);
|
|
343
|
+
this.setResult(null);
|
|
344
|
+
this.clearError();
|
|
345
|
+
}
|
|
346
|
+
}
|