@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,120 @@
|
|
|
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 signer-factory.ts
|
|
13
|
+
* @description Factory for creating and managing WalletConnect signers
|
|
14
|
+
*
|
|
15
|
+
* Implements the Factory Pattern for creating ledger-specific signers.
|
|
16
|
+
* Maintains a registry of available signers and provides type-safe access.
|
|
17
|
+
*
|
|
18
|
+
* This design allows easy extension - new ledgers can be added by:
|
|
19
|
+
* 1. Implementing IWalletConnectSigner interface
|
|
20
|
+
* 2. Registering the signer with SignerFactory
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { getLogger } from '@hsuite/native-connect-sdk';
|
|
24
|
+
|
|
25
|
+
import type { IWalletConnectSigner } from '../core/base-signer.interface';
|
|
26
|
+
|
|
27
|
+
import { HederaSigner } from './hedera-signer';
|
|
28
|
+
import { XrplSigner } from './xrpl-signer';
|
|
29
|
+
|
|
30
|
+
const logger = getLogger().scoped?.('SignerFactory') ?? getLogger();
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Factory class for creating and managing WalletConnect signers.
|
|
34
|
+
*
|
|
35
|
+
* Features:
|
|
36
|
+
* - Singleton signer instances for each ledger (performance optimization)
|
|
37
|
+
* - Type-safe ledger ID validation
|
|
38
|
+
* - Extensible registration system for custom signers
|
|
39
|
+
*/
|
|
40
|
+
export class SignerFactory {
|
|
41
|
+
/**
|
|
42
|
+
* Registry of available signers.
|
|
43
|
+
* Each ledger ID maps to a singleton signer instance.
|
|
44
|
+
*/
|
|
45
|
+
private static signers = new Map<string, IWalletConnectSigner>([
|
|
46
|
+
['hedera', new HederaSigner()],
|
|
47
|
+
['xrpl', new XrplSigner()],
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Get a signer for the specified ledger.
|
|
52
|
+
*
|
|
53
|
+
* @param ledgerId - Unique identifier for the ledger (e.g., 'hedera', 'xrpl')
|
|
54
|
+
* @returns The signer instance for the specified ledger
|
|
55
|
+
* @throws Error if no signer is registered for the ledger ID
|
|
56
|
+
*/
|
|
57
|
+
static getSigner(ledgerId: string): IWalletConnectSigner {
|
|
58
|
+
const signer = this.signers.get(ledgerId);
|
|
59
|
+
|
|
60
|
+
if (!signer) {
|
|
61
|
+
const available = Array.from(this.signers.keys()).join(', ');
|
|
62
|
+
throw new Error(`Unsupported ledger: ${ledgerId}. Available ledgers: ${available}`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return signer;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Register a custom signer for a ledger.
|
|
70
|
+
* Allows extending the factory with support for additional ledgers.
|
|
71
|
+
*
|
|
72
|
+
* @param ledgerId - Unique identifier for the ledger
|
|
73
|
+
* @param signer - Signer implementation for the ledger
|
|
74
|
+
*/
|
|
75
|
+
static registerSigner(ledgerId: string, signer: IWalletConnectSigner): void {
|
|
76
|
+
if (signer.ledgerId !== ledgerId) {
|
|
77
|
+
logger.warn('Signer ledgerId does not match registration key', {
|
|
78
|
+
signerLedgerId: signer.ledgerId,
|
|
79
|
+
registrationKey: ledgerId,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
this.signers.set(ledgerId, signer);
|
|
84
|
+
logger.debug('Registered signer for ledger', { ledgerId });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Check if a signer is registered for a ledger.
|
|
89
|
+
*
|
|
90
|
+
* @param ledgerId - Ledger identifier to check
|
|
91
|
+
* @returns True if a signer is registered, false otherwise
|
|
92
|
+
*/
|
|
93
|
+
static hasSigner(ledgerId: string): boolean {
|
|
94
|
+
return this.signers.has(ledgerId);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Get all registered ledger IDs.
|
|
99
|
+
*
|
|
100
|
+
* @returns Array of ledger identifiers
|
|
101
|
+
*/
|
|
102
|
+
static getAvailableLedgers(): string[] {
|
|
103
|
+
return Array.from(this.signers.keys());
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Remove a signer from the registry.
|
|
108
|
+
* Useful for testing or dynamic ledger support.
|
|
109
|
+
*
|
|
110
|
+
* @param ledgerId - Ledger identifier to remove
|
|
111
|
+
* @returns True if signer was removed, false if it didn't exist
|
|
112
|
+
*/
|
|
113
|
+
static unregisterSigner(ledgerId: string): boolean {
|
|
114
|
+
const removed = this.signers.delete(ledgerId);
|
|
115
|
+
if (removed) {
|
|
116
|
+
logger.debug('Unregistered signer for ledger', { ledgerId });
|
|
117
|
+
}
|
|
118
|
+
return removed;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file xrpl-signer.spec.ts
|
|
3
|
+
* @description Unit tests for XrplSigner
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
7
|
+
import { TestBed } from '@angular/core/testing';
|
|
8
|
+
import { XrplSigner } from './xrpl-signer';
|
|
9
|
+
import type { SignerOperationParams } from '../core/base-signer.interface';
|
|
10
|
+
|
|
11
|
+
describe('XrplSigner', () => {
|
|
12
|
+
let signer: XrplSigner;
|
|
13
|
+
let mockClient: any;
|
|
14
|
+
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
TestBed.configureTestingModule({
|
|
17
|
+
providers: [XrplSigner]
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
signer = TestBed.inject(XrplSigner);
|
|
21
|
+
|
|
22
|
+
mockClient = {
|
|
23
|
+
request: vi.fn()
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe('ledgerId', () => {
|
|
28
|
+
it('should be "xrpl"', () => {
|
|
29
|
+
expect(signer.ledgerId).toBe('xrpl');
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe('buildNamespace', () => {
|
|
34
|
+
it('should build correct namespace for testnet', () => {
|
|
35
|
+
const namespace = signer.buildNamespace('xrpl:testnet');
|
|
36
|
+
|
|
37
|
+
expect(namespace.methods).toContain('xrpl_signTransaction');
|
|
38
|
+
expect(namespace.methods).toContain('xrpl_signAndSubmit');
|
|
39
|
+
expect(namespace.methods).toContain('xrpl_signMessage');
|
|
40
|
+
expect(namespace.chains).toEqual(['xrpl:testnet']);
|
|
41
|
+
expect(namespace.events).toContain('accountsChanged');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should build correct namespace for mainnet', () => {
|
|
45
|
+
const namespace = signer.buildNamespace('xrpl:mainnet');
|
|
46
|
+
|
|
47
|
+
expect(namespace.chains).toEqual(['xrpl:mainnet']);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
describe('signTransaction', () => {
|
|
52
|
+
let mockParams: SignerOperationParams;
|
|
53
|
+
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
const mockTransaction = {
|
|
56
|
+
TransactionType: 'Payment',
|
|
57
|
+
Account: 'rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
|
|
58
|
+
Destination: 'rLHzPsX6oXkzU9qL8qWDwgNfEwgR7pqxjy',
|
|
59
|
+
Amount: '1000000',
|
|
60
|
+
Fee: '12',
|
|
61
|
+
Sequence: 1
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const payload = btoa(JSON.stringify(mockTransaction));
|
|
65
|
+
|
|
66
|
+
mockParams = {
|
|
67
|
+
client: mockClient,
|
|
68
|
+
topic: 'test-topic',
|
|
69
|
+
networkId: 'xrpl:testnet',
|
|
70
|
+
accountAddress: 'rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
|
|
71
|
+
payload
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
vi.mocked(mockClient.request).mockResolvedValue({
|
|
75
|
+
tx_blob: 'signedTransactionBlob'
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('should call xrpl_signTransaction with correct params', async () => {
|
|
80
|
+
await signer.signTransaction(mockParams);
|
|
81
|
+
|
|
82
|
+
expect(mockClient.request).toHaveBeenCalledWith(
|
|
83
|
+
expect.objectContaining({
|
|
84
|
+
topic: 'test-topic',
|
|
85
|
+
chainId: 'xrpl:testnet',
|
|
86
|
+
request: expect.objectContaining({
|
|
87
|
+
method: 'xrpl_signTransaction',
|
|
88
|
+
params: expect.objectContaining({
|
|
89
|
+
transaction: expect.any(Object)
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
})
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('should decode transaction from base64 JSON', async () => {
|
|
97
|
+
await signer.signTransaction(mockParams);
|
|
98
|
+
|
|
99
|
+
const callArgs = vi.mocked(mockClient.request).mock.calls[0][0];
|
|
100
|
+
const transaction = callArgs.request.params.transaction;
|
|
101
|
+
|
|
102
|
+
expect(transaction.TransactionType).toBe('Payment');
|
|
103
|
+
expect(transaction.Account).toBe('rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('should return signed payload', async () => {
|
|
107
|
+
const result = await signer.signTransaction(mockParams);
|
|
108
|
+
|
|
109
|
+
expect(result).toEqual({
|
|
110
|
+
signedPayload: 'signedTransactionBlob',
|
|
111
|
+
metadata: expect.objectContaining({
|
|
112
|
+
result: expect.any(Object)
|
|
113
|
+
})
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('should throw error if request fails', async () => {
|
|
118
|
+
vi.mocked(mockClient.request).mockRejectedValue(new Error('User rejected'));
|
|
119
|
+
|
|
120
|
+
await expect(signer.signTransaction(mockParams)).rejects.toThrow('XRPL sign failed');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe('submitTransaction', () => {
|
|
125
|
+
let mockParams: SignerOperationParams;
|
|
126
|
+
|
|
127
|
+
beforeEach(() => {
|
|
128
|
+
const mockTransaction = {
|
|
129
|
+
TransactionType: 'Payment',
|
|
130
|
+
Account: 'rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
|
|
131
|
+
Destination: 'rLHzPsX6oXkzU9qL8qWDwgNfEwgR7pqxjy',
|
|
132
|
+
Amount: '1000000',
|
|
133
|
+
Fee: '12',
|
|
134
|
+
Sequence: 1
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const payload = btoa(JSON.stringify(mockTransaction));
|
|
138
|
+
|
|
139
|
+
mockParams = {
|
|
140
|
+
client: mockClient,
|
|
141
|
+
topic: 'test-topic',
|
|
142
|
+
networkId: 'xrpl:testnet',
|
|
143
|
+
accountAddress: 'rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
|
|
144
|
+
payload
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
vi.mocked(mockClient.request).mockResolvedValue({
|
|
148
|
+
hash: 'ABC123DEF456',
|
|
149
|
+
id: 'tx-id-123'
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('should call xrpl_signAndSubmit with correct params', async () => {
|
|
154
|
+
await signer.submitTransaction(mockParams);
|
|
155
|
+
|
|
156
|
+
expect(mockClient.request).toHaveBeenCalledWith(
|
|
157
|
+
expect.objectContaining({
|
|
158
|
+
topic: 'test-topic',
|
|
159
|
+
chainId: 'xrpl:testnet',
|
|
160
|
+
request: expect.objectContaining({
|
|
161
|
+
method: 'xrpl_signAndSubmit',
|
|
162
|
+
params: expect.objectContaining({
|
|
163
|
+
transaction: expect.any(Object)
|
|
164
|
+
})
|
|
165
|
+
})
|
|
166
|
+
})
|
|
167
|
+
);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('should return transaction ID and hash', async () => {
|
|
171
|
+
const result = await signer.submitTransaction(mockParams);
|
|
172
|
+
|
|
173
|
+
expect(result).toEqual({
|
|
174
|
+
transactionId: 'ABC123DEF456',
|
|
175
|
+
transactionHash: 'ABC123DEF456',
|
|
176
|
+
metadata: expect.any(Object)
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('should return empty transactionId if hash missing', async () => {
|
|
181
|
+
// The implementation extracts transactionId from hash or tx_json.hash
|
|
182
|
+
// If both are missing, it returns empty string
|
|
183
|
+
vi.mocked(mockClient.request).mockResolvedValue({
|
|
184
|
+
id: 'tx-id-only' // id is not used for transactionId
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const result = await signer.submitTransaction(mockParams);
|
|
188
|
+
|
|
189
|
+
// Returns empty string when hash fields are not present
|
|
190
|
+
expect(result.transactionId).toBe('');
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('should throw error if submission fails', async () => {
|
|
194
|
+
vi.mocked(mockClient.request).mockRejectedValue(new Error('Network error'));
|
|
195
|
+
|
|
196
|
+
await expect(signer.submitTransaction(mockParams)).rejects.toThrow('XRPL submit failed');
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
describe('parseAccounts', () => {
|
|
201
|
+
it('should parse XRPL account format correctly', () => {
|
|
202
|
+
const namespace = {
|
|
203
|
+
accounts: [
|
|
204
|
+
'xrpl:testnet:rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
|
|
205
|
+
'xrpl:testnet:rLHzPsX6oXkzU9qL8qWDwgNfEwgR7pqxjy',
|
|
206
|
+
'xrpl:mainnet:rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv'
|
|
207
|
+
]
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
const accounts = signer.parseAccounts(namespace);
|
|
211
|
+
|
|
212
|
+
expect(accounts).toHaveLength(3);
|
|
213
|
+
expect(accounts[0]).toEqual({
|
|
214
|
+
address: 'rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
|
|
215
|
+
chainId: 'xrpl:testnet'
|
|
216
|
+
});
|
|
217
|
+
expect(accounts[2]).toEqual({
|
|
218
|
+
address: 'rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv',
|
|
219
|
+
chainId: 'xrpl:mainnet'
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it('should handle invalid account format gracefully', () => {
|
|
224
|
+
const namespace = {
|
|
225
|
+
accounts: ['invalid']
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
const accounts = signer.parseAccounts(namespace);
|
|
229
|
+
|
|
230
|
+
expect(accounts).toHaveLength(1);
|
|
231
|
+
expect(accounts[0]).toEqual({
|
|
232
|
+
address: 'invalid',
|
|
233
|
+
chainId: 'xrpl:testnet'
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it('should handle empty accounts', () => {
|
|
238
|
+
const namespace = {
|
|
239
|
+
accounts: []
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
const accounts = signer.parseAccounts(namespace);
|
|
243
|
+
|
|
244
|
+
expect(accounts).toHaveLength(0);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
describe('network filtering', () => {
|
|
248
|
+
const mixedNetworkNamespace = {
|
|
249
|
+
accounts: [
|
|
250
|
+
'xrpl:testnet:rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE',
|
|
251
|
+
'xrpl:testnet:rLHzPsX6oXkzU9qL8qWDwgNfEwgR7pqxjy',
|
|
252
|
+
'xrpl:mainnet:rDsbeomae4FXwgQTJp9Rs64Qg9vDiTCdBv',
|
|
253
|
+
'xrpl:mainnet:rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh',
|
|
254
|
+
'xrpl:devnet:rBKz5MC2iXdoS3XgnNSYmF69K1Yo4NS3Ws'
|
|
255
|
+
]
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
it('should filter accounts by testnet when targetNetworkId is specified', () => {
|
|
259
|
+
const accounts = signer.parseAccounts(mixedNetworkNamespace, 'xrpl:testnet');
|
|
260
|
+
|
|
261
|
+
expect(accounts).toHaveLength(2);
|
|
262
|
+
expect(accounts.every(acc => acc.chainId === 'xrpl:testnet')).toBe(true);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it('should filter accounts by mainnet when targetNetworkId is specified', () => {
|
|
266
|
+
const accounts = signer.parseAccounts(mixedNetworkNamespace, 'xrpl:mainnet');
|
|
267
|
+
|
|
268
|
+
expect(accounts).toHaveLength(2);
|
|
269
|
+
expect(accounts.every(acc => acc.chainId === 'xrpl:mainnet')).toBe(true);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it('should filter accounts by devnet when targetNetworkId is specified', () => {
|
|
273
|
+
const accounts = signer.parseAccounts(mixedNetworkNamespace, 'xrpl:devnet');
|
|
274
|
+
|
|
275
|
+
expect(accounts).toHaveLength(1);
|
|
276
|
+
expect(accounts[0].chainId).toBe('xrpl:devnet');
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
it('should return empty array if no accounts match target network', () => {
|
|
280
|
+
const testnetOnlyNamespace = {
|
|
281
|
+
accounts: ['xrpl:testnet:rN7n7otQDd6FczFgLdlqtyMVrn3HMfeeZE']
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
const accounts = signer.parseAccounts(testnetOnlyNamespace, 'xrpl:mainnet');
|
|
285
|
+
|
|
286
|
+
expect(accounts).toHaveLength(0);
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
it('should return all accounts when no targetNetworkId is provided', () => {
|
|
290
|
+
const accounts = signer.parseAccounts(mixedNetworkNamespace);
|
|
291
|
+
|
|
292
|
+
expect(accounts).toHaveLength(5);
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
});
|