@sodax/wallet-sdk-react 1.5.7-beta → 2.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -145
- package/ai-exported/AGENTS.md +122 -0
- package/ai-exported/integration/README.md +102 -0
- package/ai-exported/integration/ai-rules.md +136 -0
- package/ai-exported/integration/architecture.md +181 -0
- package/ai-exported/integration/examples/01-minimal-evm.tsx +75 -0
- package/ai-exported/integration/examples/02-multi-chain-modal.tsx +169 -0
- package/ai-exported/integration/examples/03-nextjs-app-router.tsx +99 -0
- package/ai-exported/integration/examples/04-walletconnect-setup.tsx +89 -0
- package/ai-exported/integration/examples/README.md +29 -0
- package/ai-exported/integration/recipes/batch-operations.md +223 -0
- package/ai-exported/integration/recipes/bridge-to-sdk.md +164 -0
- package/ai-exported/integration/recipes/chain-detection.md +254 -0
- package/ai-exported/integration/recipes/connect-button.md +156 -0
- package/ai-exported/integration/recipes/multi-chain-modal.md +199 -0
- package/ai-exported/integration/recipes/setup.md +158 -0
- package/ai-exported/integration/recipes/sign-message.md +137 -0
- package/ai-exported/integration/recipes/sub-path-imports.md +95 -0
- package/ai-exported/integration/recipes/switch-chain.md +141 -0
- package/ai-exported/integration/recipes/walletconnect-setup.md +139 -0
- package/ai-exported/integration/reference/api-surface.md +175 -0
- package/ai-exported/integration/reference/chain-support.md +78 -0
- package/ai-exported/integration/reference/connectors.md +74 -0
- package/ai-exported/integration/reference/hooks.md +204 -0
- package/ai-exported/integration/reference/wallet-brands.md +106 -0
- package/ai-exported/migration/README.md +49 -0
- package/ai-exported/migration/ai-rules.md +144 -0
- package/ai-exported/migration/breaking-changes.md +305 -0
- package/ai-exported/migration/checklist.md +159 -0
- package/ai-exported/migration/recipes/connect-button.md +166 -0
- package/ai-exported/migration/recipes/multi-chain-modal.md +244 -0
- package/ai-exported/migration/recipes/ssr-setup.md +162 -0
- package/ai-exported/migration/recipes/walletconnect-migration.md +168 -0
- package/ai-exported/migration/reference/components.md +73 -0
- package/ai-exported/migration/reference/config.md +307 -0
- package/ai-exported/migration/reference/hooks.md +278 -0
- package/ai-exported/migration/reference/imports.md +157 -0
- package/dist/XConnector-B9YQTVJ4.d.ts +146 -0
- package/dist/chunk-2BOUGCJ7.mjs +150 -0
- package/dist/chunk-2BOUGCJ7.mjs.map +1 -0
- package/dist/chunk-66BAUK56.mjs +202 -0
- package/dist/chunk-66BAUK56.mjs.map +1 -0
- package/dist/chunk-7ULB6DW4.mjs +102 -0
- package/dist/chunk-7ULB6DW4.mjs.map +1 -0
- package/dist/chunk-BKJB527E.mjs +125 -0
- package/dist/chunk-BKJB527E.mjs.map +1 -0
- package/dist/chunk-BXJLBR4G.mjs +88 -0
- package/dist/chunk-BXJLBR4G.mjs.map +1 -0
- package/dist/chunk-E5IAZ7E6.mjs +186 -0
- package/dist/chunk-E5IAZ7E6.mjs.map +1 -0
- package/dist/chunk-MAQ47Q52.mjs +33 -0
- package/dist/chunk-MAQ47Q52.mjs.map +1 -0
- package/dist/chunk-MXZVF5HR.mjs +34 -0
- package/dist/chunk-MXZVF5HR.mjs.map +1 -0
- package/dist/chunk-N5A2TMF6.mjs +33 -0
- package/dist/chunk-N5A2TMF6.mjs.map +1 -0
- package/dist/chunk-NY7U7OJW.mjs +64 -0
- package/dist/chunk-NY7U7OJW.mjs.map +1 -0
- package/dist/chunk-PJLEJVAU.mjs +140 -0
- package/dist/chunk-PJLEJVAU.mjs.map +1 -0
- package/dist/chunk-PLCA4ZDJ.mjs +1585 -0
- package/dist/chunk-PLCA4ZDJ.mjs.map +1 -0
- package/dist/chunk-TZMKDXFA.mjs +3 -0
- package/dist/chunk-TZMKDXFA.mjs.map +1 -0
- package/dist/chunk-X2MHIWXO.mjs +100 -0
- package/dist/chunk-X2MHIWXO.mjs.map +1 -0
- package/dist/chunk-XZ7CHO2S.mjs +41 -0
- package/dist/chunk-XZ7CHO2S.mjs.map +1 -0
- package/dist/config-OlnzyEUE.d.ts +146 -0
- package/dist/index.cjs +2784 -1594
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +768 -1498
- package/dist/index.mjs +463 -2004
- package/dist/index.mjs.map +1 -1
- package/dist/xchains/bitcoin/index.cjs +1927 -0
- package/dist/xchains/bitcoin/index.cjs.map +1 -0
- package/dist/xchains/bitcoin/index.d.ts +125 -0
- package/dist/xchains/bitcoin/index.mjs +16 -0
- package/dist/xchains/bitcoin/index.mjs.map +1 -0
- package/dist/xchains/evm/index.cjs +316 -0
- package/dist/xchains/evm/index.cjs.map +1 -0
- package/dist/xchains/evm/index.d.ts +39 -0
- package/dist/xchains/evm/index.mjs +5 -0
- package/dist/xchains/evm/index.mjs.map +1 -0
- package/dist/xchains/icon/index.cjs +311 -0
- package/dist/xchains/icon/index.cjs.map +1 -0
- package/dist/xchains/icon/index.d.ts +37 -0
- package/dist/xchains/icon/index.mjs +7 -0
- package/dist/xchains/icon/index.mjs.map +1 -0
- package/dist/xchains/injective/index.cjs +223 -0
- package/dist/xchains/injective/index.cjs.map +1 -0
- package/dist/xchains/injective/index.d.ts +35 -0
- package/dist/xchains/injective/index.mjs +5 -0
- package/dist/xchains/injective/index.mjs.map +1 -0
- package/dist/xchains/near/index.cjs +190 -0
- package/dist/xchains/near/index.cjs.map +1 -0
- package/dist/xchains/near/index.d.ts +34 -0
- package/dist/xchains/near/index.mjs +6 -0
- package/dist/xchains/near/index.mjs.map +1 -0
- package/dist/xchains/solana/index.cjs +186 -0
- package/dist/xchains/solana/index.cjs.map +1 -0
- package/dist/xchains/solana/index.d.ts +26 -0
- package/dist/xchains/solana/index.mjs +7 -0
- package/dist/xchains/solana/index.mjs.map +1 -0
- package/dist/xchains/stacks/index.cjs +240 -0
- package/dist/xchains/stacks/index.cjs.map +1 -0
- package/dist/xchains/stacks/index.d.ts +36 -0
- package/dist/xchains/stacks/index.mjs +5 -0
- package/dist/xchains/stacks/index.mjs.map +1 -0
- package/dist/xchains/stellar/index.cjs +322 -0
- package/dist/xchains/stellar/index.cjs.map +1 -0
- package/dist/xchains/stellar/index.d.ts +44 -0
- package/dist/xchains/stellar/index.mjs +6 -0
- package/dist/xchains/stellar/index.mjs.map +1 -0
- package/dist/xchains/sui/index.cjs +248 -0
- package/dist/xchains/sui/index.cjs.map +1 -0
- package/dist/xchains/sui/index.d.ts +37 -0
- package/dist/xchains/sui/index.mjs +7 -0
- package/dist/xchains/sui/index.mjs.map +1 -0
- package/docs/ADDING_A_NEW_CHAIN.md +440 -0
- package/docs/ARCHITECTURE.md +291 -0
- package/docs/BATCH_OPERATIONS.md +267 -0
- package/docs/CHAIN_DETECTION.md +216 -0
- package/docs/CONFIGURE_PROVIDER.md +360 -0
- package/docs/CONNECTORS.md +247 -0
- package/docs/CONNECT_FLOW.md +276 -0
- package/docs/EVM_SWITCH_CHAIN.md +161 -0
- package/docs/SIGN_MESSAGE.md +213 -0
- package/docs/SUB_PATH_EXPORTS.md +246 -0
- package/docs/WALLETCONNECT.md +154 -0
- package/docs/WALLET_MODAL.md +331 -0
- package/docs/WALLET_PROVIDER_BRIDGE.md +226 -0
- package/package.json +34 -9
- package/skills/SKILLS.md +84 -0
- package/skills/bridge-to-sdk.md +148 -0
- package/skills/connect-button.md +116 -0
- package/skills/evm-only-walletconnect.md +111 -0
- package/skills/multi-chain-modal.md +178 -0
- package/skills/setup.md +107 -0
- package/dist/index.d.cts +0 -1579
- package/src/Hydrate.ts +0 -65
- package/src/SodaxWalletProvider.tsx +0 -97
- package/src/actions/getXChainType.ts +0 -8
- package/src/actions/getXService.ts +0 -33
- package/src/actions/index.ts +0 -2
- package/src/assets/wallets/hana.svg +0 -6
- package/src/assets/wallets/havah.svg +0 -76
- package/src/assets/wallets/keplr.svg +0 -30
- package/src/assets/wallets/metamask.svg +0 -60
- package/src/assets/wallets/phantom.svg +0 -4
- package/src/assets/wallets/sui.svg +0 -20
- package/src/core/XConnector.ts +0 -54
- package/src/core/XService.ts +0 -85
- package/src/core/index.ts +0 -2
- package/src/hooks/index.ts +0 -11
- package/src/hooks/useEthereumChainId.ts +0 -44
- package/src/hooks/useEvmSwitchChain.ts +0 -91
- package/src/hooks/useWalletProvider.ts +0 -206
- package/src/hooks/useXAccount.ts +0 -51
- package/src/hooks/useXAccounts.ts +0 -56
- package/src/hooks/useXBalances.ts +0 -65
- package/src/hooks/useXConnect.ts +0 -118
- package/src/hooks/useXConnection.ts +0 -72
- package/src/hooks/useXConnectors.ts +0 -72
- package/src/hooks/useXDisconnect.ts +0 -73
- package/src/hooks/useXService.ts +0 -8
- package/src/hooks/useXSignMessage.ts +0 -82
- package/src/index.ts +0 -19
- package/src/types/index.ts +0 -22
- package/src/useXWagmiStore.ts +0 -116
- package/src/utils/index.ts +0 -21
- package/src/xchains/bitcoin/BitcoinXConnector.ts +0 -34
- package/src/xchains/bitcoin/BitcoinXService.ts +0 -40
- package/src/xchains/bitcoin/OKXXConnector.ts +0 -117
- package/src/xchains/bitcoin/UnisatXConnector.ts +0 -117
- package/src/xchains/bitcoin/XverseXConnector.ts +0 -232
- package/src/xchains/bitcoin/index.ts +0 -7
- package/src/xchains/bitcoin/useBitcoinXConnectors.ts +0 -14
- package/src/xchains/evm/EvmXConnector.ts +0 -27
- package/src/xchains/evm/EvmXService.ts +0 -211
- package/src/xchains/evm/index.ts +0 -3
- package/src/xchains/icon/IconHanaXConnector.ts +0 -39
- package/src/xchains/icon/IconXService.ts +0 -117
- package/src/xchains/icon/actions.ts +0 -28
- package/src/xchains/icon/iconex/index.tsx +0 -46
- package/src/xchains/icon/index.ts +0 -2
- package/src/xchains/injective/InjectiveXConnector.ts +0 -60
- package/src/xchains/injective/InjectiveXService.ts +0 -62
- package/src/xchains/injective/actions.ts +0 -32
- package/src/xchains/injective/index.ts +0 -2
- package/src/xchains/near/NearXConnector.ts +0 -42
- package/src/xchains/near/NearXService.ts +0 -46
- package/src/xchains/near/useNearXConnectors.ts +0 -23
- package/src/xchains/solana/SolanaXConnector.ts +0 -26
- package/src/xchains/solana/SolanaXService.ts +0 -46
- package/src/xchains/solana/index.ts +0 -2
- package/src/xchains/stacks/StacksXConnector.ts +0 -63
- package/src/xchains/stacks/StacksXService.ts +0 -59
- package/src/xchains/stacks/constants.ts +0 -42
- package/src/xchains/stacks/index.ts +0 -4
- package/src/xchains/stacks/useStacksXConnectors.ts +0 -7
- package/src/xchains/stellar/CustomSorobanServer.ts +0 -93
- package/src/xchains/stellar/StellarWalletsKitXConnector.ts +0 -53
- package/src/xchains/stellar/StellarXService.ts +0 -93
- package/src/xchains/stellar/actions.ts +0 -24
- package/src/xchains/stellar/index.tsx +0 -2
- package/src/xchains/stellar/useStellarXConnectors.ts +0 -21
- package/src/xchains/stellar/utils.ts +0 -49
- package/src/xchains/sui/SuiXConnector.ts +0 -28
- package/src/xchains/sui/SuiXService.ts +0 -66
- package/src/xchains/sui/index.ts +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/xchains/bitcoin/BitcoinXService.ts","../src/xchains/bitcoin/BitcoinXConnector.ts","../src/xchains/bitcoin/UnisatXConnector.ts","../src/xchains/bitcoin/XverseXConnector.ts","../src/xchains/bitcoin/OKXXConnector.ts","../src/actions/getXChainType.ts","../src/xchains/bitcoin/bitcoinSignGuards.ts","../src/chainRegistry.ts","../src/useXWalletStore.ts","../src/actions/getXService.ts","../src/hooks/useXConnection.ts","../src/hooks/useXAccount.ts","../src/hooks/useEnabledChains.ts","../src/hooks/useXConnections.ts","../src/hooks/useXAccounts.ts","../src/hooks/useXConnect.ts","../src/hooks/useXConnectors.ts","../src/hooks/useXConnectorsByChain.ts","../src/utils/matchConnectorIdentifier.ts","../src/hooks/useIsWalletInstalled.ts","../src/utils/chainOrder.ts","../src/hooks/useChainGroups.ts","../src/hooks/useConnectedChains.ts","../src/hooks/useXDisconnect.ts","../src/hooks/useConnectionFlow.ts","../src/hooks/useBatchConnect.ts","../src/hooks/useBatchDisconnect.ts","../src/useWalletModalStore.ts","../src/hooks/useWalletModal.ts","../src/hooks/useXService.ts","../src/hooks/useXServices.ts","../src/context/WalletConfigContext.ts","../src/hooks/useEthereumChainId.ts","../src/hooks/useEvmSwitchChain.ts","../src/hooks/useWalletProvider.ts","../src/hooks/useXSignMessage.ts","../src/xchains/bitcoin/useBitcoinXConnectors.ts"],"names":["detectBitcoinAddressType","ChainTypeArr","useMemo","baseChainInfo","useCallback","useState","useRef","create","devtools","immer","Wallet","warnedChains","useMutation"],"mappings":"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","file":"chunk-PLCA4ZDJ.mjs","sourcesContent":["import { XService } from '@/core/XService.js';\nimport { isNativeToken } from '@/utils/index.js';\nimport type { XToken } from '@sodax/types';\nimport { BITCOIN_DEFAULT_RPC_URL } from '@/constants.js';\n\nexport class BitcoinXService extends XService {\n private static instance: BitcoinXService;\n private rpcUrl: string;\n\n private constructor(rpcUrl: string = BITCOIN_DEFAULT_RPC_URL) {\n super('BITCOIN');\n this.rpcUrl = rpcUrl;\n }\n\n public static getInstance(rpcUrl?: string): BitcoinXService {\n if (!BitcoinXService.instance) {\n BitcoinXService.instance = new BitcoinXService(rpcUrl);\n } else if (rpcUrl && rpcUrl !== BitcoinXService.instance.rpcUrl) {\n BitcoinXService.instance.rpcUrl = rpcUrl;\n }\n return BitcoinXService.instance;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return 0n;\n\n try {\n if (isNativeToken(xToken)) {\n const response = await fetch(`${this.rpcUrl}/address/${address}/utxo`);\n if (!response.ok) return 0n;\n const utxos: Array<{ value: number }> = await response.json();\n const totalBalance = utxos.reduce((sum, utxo) => sum + utxo.value, 0);\n return BigInt(totalBalance);\n }\n } catch {\n return 0n;\n }\n\n return 0n;\n }\n}\n","import { XConnector } from '@/core/index.js';\nimport type { XAccount } from '@/types/index.js';\nimport type { IBitcoinWalletProvider } from '@sodax/types';\nimport type { BitcoinWalletDefaults } from '@sodax/wallet-sdk-core';\nimport { BitcoinXService } from './BitcoinXService.js';\n\n/**\n * Abstract base class for Bitcoin wallet connectors.\n * Subclasses implement wallet-specific connection logic (Unisat, Xverse, OKX).\n *\n * `defaults` carries per-call overrides forwarded to the wallet provider built\n * by each subclass. Currently honored field: `defaultFinalize` — applied to\n * `signTransaction` when the caller omits the `finalize` argument.\n */\nexport abstract class BitcoinXConnector extends XConnector {\n protected readonly defaults: BitcoinWalletDefaults | undefined;\n\n constructor(name: string, id: string, defaults?: BitcoinWalletDefaults) {\n super('BITCOIN', name, id);\n this.defaults = defaults;\n }\n\n getXService(): BitcoinXService {\n return BitcoinXService.getInstance();\n }\n\n abstract override connect(): Promise<XAccount | undefined>;\n abstract override disconnect(): Promise<void>;\n\n /**\n * Returns an IBitcoinWalletProvider instance after connecting.\n * Used by useSpokeProvider to build BitcoinSpokeProvider.\n */\n abstract getWalletProvider(): IBitcoinWalletProvider | undefined;\n\n /**\n * Recreates a walletProvider from the browser extension window object\n * and stored xAccount data (no connect() call, no popup).\n * Used to restore provider after page reload without requiring reconnect.\n */\n abstract recreateWalletProvider(xAccount: XAccount): IBitcoinWalletProvider | undefined;\n}\n","import type { XAccount } from '@/types/index.js';\nimport { detectBitcoinAddressType, type IBitcoinWalletProvider, type BtcAddressType } from '@sodax/types';\nimport type { BitcoinWalletDefaults } from '@sodax/wallet-sdk-core';\nimport { WALLET_METADATA } from '@/constants.js';\nimport { BitcoinXConnector } from './BitcoinXConnector.js';\n\n// Minimal Unisat window API types\ninterface UnisatWallet {\n getAccounts(): Promise<string[]>;\n getPublicKey(): Promise<string>;\n signPsbt(psbtHex: string, options?: { autoFinalized?: boolean }): Promise<string>;\n signMessage(message: string, type?: 'bip322-simple' | 'ecdsa'): Promise<string>;\n requestAccounts(): Promise<string[]>;\n sendBitcoin(address: string, satoshis: number): Promise<string>;\n}\n\ndeclare global {\n interface Window {\n unisat?: UnisatWallet;\n }\n}\n\nclass UnisatWalletProvider implements IBitcoinWalletProvider {\n readonly chainType = 'BITCOIN' as const;\n private cachedAddress: string;\n private readonly defaults: BitcoinWalletDefaults | undefined;\n\n constructor(address: string, defaults?: BitcoinWalletDefaults) {\n this.cachedAddress = address;\n this.defaults = defaults;\n }\n\n // Lazy resolve so the provider can be constructed before the extension finishes injecting `window.unisat` (post-refresh rehydrate path).\n private get unisat(): UnisatWallet {\n const u = window.unisat;\n if (!u) throw new Error('Unisat wallet not available');\n return u;\n }\n\n async getWalletAddress(): Promise<string> {\n try {\n const accounts = await this.unisat.getAccounts();\n if (accounts[0]) this.cachedAddress = accounts[0];\n } catch {\n // wallet locked — fall through to cached address\n }\n return this.cachedAddress;\n }\n\n async getPublicKey(): Promise<string> {\n return this.unisat.getPublicKey();\n }\n\n async getAddressType(_address: string): Promise<BtcAddressType> {\n const address = await this.getWalletAddress();\n return detectBitcoinAddressType(address);\n }\n\n async signTransaction(psbtBase64: string, finalize?: boolean): Promise<string> {\n const effectiveFinalize = finalize ?? this.defaults?.defaultFinalize ?? false;\n // Convert base64 → hex for Unisat, then back\n const psbtHex = Buffer.from(psbtBase64, 'base64').toString('hex');\n const signedHex = await this.unisat.signPsbt(psbtHex, { autoFinalized: effectiveFinalize });\n // Return as hex (BTCWalletProvider.signTransaction expects this)\n return signedHex;\n }\n\n async signEcdsaMessage(message: string): Promise<string> {\n return this.unisat.signMessage(message, 'ecdsa');\n }\n\n async signBip322Message(message: string): Promise<string> {\n return this.unisat.signMessage(message, 'bip322-simple');\n }\n\n async sendBitcoin(toAddress: string, satoshis: bigint): Promise<string> {\n if (satoshis > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(`Amount ${satoshis} satoshis exceeds safe integer range`);\n }\n return this.unisat.sendBitcoin(toAddress, Number(satoshis));\n }\n}\n\nexport class UnisatXConnector extends BitcoinXConnector {\n private walletProvider: UnisatWalletProvider | undefined;\n\n constructor(defaults?: BitcoinWalletDefaults) {\n super('Unisat', 'unisat', defaults);\n }\n\n public static isAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.unisat;\n }\n\n public override get isInstalled(): boolean {\n return UnisatXConnector.isAvailable();\n }\n\n public override get installUrl(): string {\n return WALLET_METADATA.unisat.installUrl;\n }\n\n public override get icon(): string {\n return WALLET_METADATA.unisat.icon;\n }\n\n async connect(): Promise<XAccount | undefined> {\n if (!window.unisat) {\n throw new Error('Unisat wallet is not installed');\n }\n\n const accounts = await window.unisat.requestAccounts();\n const address = accounts[0];\n if (!address) {\n console.warn('[UnisatXConnector] connect: requestAccounts returned no address');\n return undefined;\n }\n\n this.walletProvider = new UnisatWalletProvider(address, this.defaults);\n\n return {\n address,\n xChainType: 'BITCOIN',\n };\n }\n\n async disconnect(): Promise<void> {\n this.walletProvider = undefined;\n }\n\n getWalletProvider(): IBitcoinWalletProvider | undefined {\n return this.walletProvider;\n }\n\n recreateWalletProvider(xAccount: XAccount): IBitcoinWalletProvider | undefined {\n if (!xAccount.address) return undefined;\n return new UnisatWalletProvider(xAccount.address, this.defaults);\n }\n}\n","import type { XAccount } from '@/types/index.js';\nimport { detectBitcoinAddressType, type IBitcoinWalletProvider, type BtcAddressType, type BtcWalletAddressType } from '@sodax/types';\nimport type { BitcoinWalletDefaults } from '@sodax/wallet-sdk-core';\nimport { AddressPurpose, MessageSigningProtocols } from 'sats-connect';\nimport { WALLET_METADATA } from '@/constants.js';\nimport { BitcoinXConnector } from './BitcoinXConnector.js';\n\n// sats-connect types\ninterface SignPsbtResult {\n psbt: string; // base64 signed PSBT\n}\n\ninterface GetAccountsResult {\n address: string;\n publicKey: string;\n purpose: string;\n addressType: string;\n}\n\ninterface SignMessageResult {\n signature: string;\n}\n\n\nclass XverseWalletProvider implements IBitcoinWalletProvider {\n readonly chainType = 'BITCOIN' as const;\n private address: string;\n private publicKey: string;\n private readonly defaults: BitcoinWalletDefaults | undefined;\n\n constructor(address: string, publicKey: string, defaults?: BitcoinWalletDefaults) {\n this.address = address;\n this.publicKey = publicKey;\n this.defaults = defaults;\n }\n\n async getWalletAddress(): Promise<string> {\n return this.address;\n }\n\n async getPublicKey(): Promise<string> {\n return this.publicKey;\n }\n\n async getAddressType(_address: string): Promise<BtcAddressType> {\n return detectBitcoinAddressType(this.address);\n }\n\n /**\n * Parse a base64-encoded PSBT to count the number of inputs.\n * Reads the unsigned transaction from the PSBT global section.\n */\n private countPsbtInputs(psbtBase64: string): number {\n const data = Buffer.from(psbtBase64, 'base64');\n // Skip 5-byte magic (0x70736274FF = \"psbt\" + separator)\n let offset = 5;\n\n // Global section: first key-value pair should be key 0x00 (unsigned tx)\n const keyLen = data[offset++] ?? 0;\n if (keyLen !== 1 || data[offset++] !== 0x00) {\n return 1; // fallback: assume 1 input\n }\n\n // Read value length (compact size)\n const firstByte = data[offset++] ?? 0;\n if (firstByte === 0xfd) offset += 2;\n else if (firstByte === 0xfe) offset += 4;\n else if (firstByte === 0xff) offset += 8;\n // else firstByte IS the length (< 0xfd), no extra bytes\n\n // Unsigned tx: skip 4-byte version\n offset += 4;\n\n // Read input count (varint)\n const inputByte = data[offset] ?? 0;\n if (inputByte < 0xfd) return inputByte;\n return 1; // fallback for unusual cases\n }\n\n async signTransaction(psbtBase64: string, finalize?: boolean): Promise<string> {\n const effectiveFinalize = finalize ?? this.defaults?.defaultFinalize ?? false;\n const { request } = await import('sats-connect');\n\n const inputCount = this.countPsbtInputs(psbtBase64);\n const signingIndexes = Array.from({ length: inputCount }, (_, i) => i);\n\n const response = await request('signPsbt', {\n psbt: psbtBase64,\n broadcast: false,\n signInputs: {\n [this.address]: signingIndexes,\n },\n });\n\n if (response.status === 'error') {\n throw new Error(response.error?.message || 'Xverse PSBT signing failed');\n }\n\n const result = response.result as SignPsbtResult;\n\n if (effectiveFinalize) {\n // Return hex for broadcast\n return Buffer.from(result.psbt, 'base64').toString('hex');\n }\n\n // Return base64 signed PSBT (partially signed)\n return result.psbt;\n }\n\n async signEcdsaMessage(message: string): Promise<string> {\n const { request } = await import('sats-connect');\n\n const response = await request('signMessage', {\n address: this.address,\n message,\n protocol: MessageSigningProtocols.ECDSA,\n });\n\n if (response.status === 'error') {\n throw new Error(response.error?.message || 'Xverse ECDSA signing failed');\n }\n\n return (response.result as SignMessageResult).signature;\n }\n\n async signBip322Message(message: string): Promise<string> {\n const { request } = await import('sats-connect');\n\n const response = await request('signMessage', {\n address: this.address,\n message,\n protocol: MessageSigningProtocols.BIP322,\n });\n\n if (response.status === 'error') {\n throw new Error(response.error?.message || 'Xverse BIP322 signing failed');\n }\n\n return (response.result as SignMessageResult).signature;\n }\n\n async sendBitcoin(toAddress: string, satoshis: bigint): Promise<string> {\n const { request } = await import('sats-connect');\n\n const response = await request('sendTransfer', {\n recipients: [\n {\n address: toAddress,\n amount: Number(satoshis),\n },\n ],\n });\n\n if (response.status === 'error') {\n throw new Error(response.error?.message || 'Xverse sendTransfer failed');\n }\n\n return (response.result as { txid: string }).txid;\n }\n}\n\nconst XVERSE_ADDRESS_TYPE_KEY = 'xverse-address-type';\n\nexport class XverseXConnector extends BitcoinXConnector {\n private walletProvider: XverseWalletProvider | undefined;\n\n /** Address purpose used when connecting. Taproot (Ordinals) by default to match Radfi. */\n public addressPurpose: AddressPurpose;\n\n constructor(defaults?: BitcoinWalletDefaults) {\n super('Xverse', 'xverse', defaults);\n // Restore saved preference, default to Taproot\n const saved = typeof window !== 'undefined' ? localStorage.getItem(XVERSE_ADDRESS_TYPE_KEY) : null;\n this.addressPurpose = saved === 'segwit' ? AddressPurpose.Payment : AddressPurpose.Ordinals;\n }\n\n /** Set address purpose and persist to localStorage. */\n public setAddressPurpose(type: BtcWalletAddressType): void {\n this.addressPurpose = type === 'taproot' ? AddressPurpose.Ordinals : AddressPurpose.Payment;\n if (typeof window !== 'undefined') {\n localStorage.setItem(XVERSE_ADDRESS_TYPE_KEY, type);\n }\n }\n\n public static isAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.BitcoinProvider;\n }\n\n public override get isInstalled(): boolean {\n return XverseXConnector.isAvailable();\n }\n\n public override get installUrl(): string {\n return WALLET_METADATA.xverse.installUrl;\n }\n\n public override get icon(): string {\n return WALLET_METADATA.xverse.icon;\n }\n\n async connect(): Promise<XAccount | undefined> {\n if (!XverseXConnector.isAvailable()) {\n throw new Error('Xverse wallet is not installed');\n }\n\n const { request } = await import('sats-connect');\n\n const response = await request('getAccounts', {\n purposes: [this.addressPurpose],\n message: 'Connect to Sodax',\n });\n\n if (response.status === 'error') {\n throw new Error(response.error?.message || 'Xverse connection failed');\n }\n\n const accounts = response.result as GetAccountsResult[];\n const paymentAccount = accounts.find(a => a.purpose === this.addressPurpose) || accounts[0];\n\n if (!paymentAccount) return undefined;\n\n this.walletProvider = new XverseWalletProvider(\n paymentAccount.address,\n paymentAccount.publicKey,\n this.defaults,\n );\n\n return {\n address: paymentAccount.address,\n publicKey: paymentAccount.publicKey,\n xChainType: 'BITCOIN',\n };\n }\n\n async disconnect(): Promise<void> {\n this.walletProvider = undefined;\n }\n\n getWalletProvider(): IBitcoinWalletProvider | undefined {\n return this.walletProvider;\n }\n\n recreateWalletProvider(xAccount: XAccount): IBitcoinWalletProvider | undefined {\n if (!xAccount.address || !xAccount.publicKey) return undefined;\n return new XverseWalletProvider(xAccount.address, xAccount.publicKey, this.defaults);\n }\n}\n","import type { XAccount } from '@/types/index.js';\nimport { detectBitcoinAddressType, type IBitcoinWalletProvider, type BtcAddressType } from '@sodax/types';\nimport type { BitcoinWalletDefaults } from '@sodax/wallet-sdk-core';\nimport { WALLET_METADATA } from '@/constants.js';\nimport { BitcoinXConnector } from './BitcoinXConnector.js';\n\n// OKX Bitcoin wallet window API types\ninterface OKXBitcoinWallet {\n getAccounts(): Promise<string[]>;\n getPublicKey(): Promise<string>;\n signPsbt(psbtHex: string, options?: { autoFinalized?: boolean }): Promise<string>;\n signMessage(message: string, type?: 'bip322-simple' | 'ecdsa'): Promise<string>;\n connect(): Promise<{ address: string; publicKey: string }>;\n sendBitcoin(toAddress: string, satoshis: number): Promise<string>;\n}\n\ndeclare global {\n interface Window {\n okxwallet?: {\n bitcoin?: OKXBitcoinWallet;\n };\n }\n}\n\nclass OKXWalletProvider implements IBitcoinWalletProvider {\n readonly chainType = 'BITCOIN' as const;\n private cachedAddress: string;\n private readonly defaults: BitcoinWalletDefaults | undefined;\n\n constructor(address: string, defaults?: BitcoinWalletDefaults) {\n this.cachedAddress = address;\n this.defaults = defaults;\n }\n\n // Lazy resolve so the provider can be constructed before the extension finishes injecting `window.okxwallet` (post-refresh rehydrate path).\n private get okx(): OKXBitcoinWallet {\n const o = window.okxwallet?.bitcoin;\n if (!o) throw new Error('OKX wallet not available');\n return o;\n }\n\n async getWalletAddress(): Promise<string> {\n try {\n const accounts = await this.okx.getAccounts();\n if (accounts[0]) this.cachedAddress = accounts[0];\n } catch {\n // wallet locked — fall through to cached address\n }\n return this.cachedAddress;\n }\n\n async getPublicKey(): Promise<string> {\n return this.okx.getPublicKey();\n }\n\n async getAddressType(_address: string): Promise<BtcAddressType> {\n const address = await this.getWalletAddress();\n return detectBitcoinAddressType(address);\n }\n\n async signTransaction(psbtBase64: string, finalize?: boolean): Promise<string> {\n const effectiveFinalize = finalize ?? this.defaults?.defaultFinalize ?? false;\n const psbtHex = Buffer.from(psbtBase64, 'base64').toString('hex');\n return this.okx.signPsbt(psbtHex, { autoFinalized: effectiveFinalize });\n }\n\n async signEcdsaMessage(message: string): Promise<string> {\n return this.okx.signMessage(message, 'ecdsa');\n }\n\n async signBip322Message(message: string): Promise<string> {\n return this.okx.signMessage(message, 'bip322-simple');\n }\n\n async sendBitcoin(toAddress: string, satoshis: bigint): Promise<string> {\n if (satoshis > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(`Amount ${satoshis} satoshis exceeds safe integer range`);\n }\n return this.okx.sendBitcoin(toAddress, Number(satoshis));\n }\n}\n\nexport class OKXXConnector extends BitcoinXConnector {\n private walletProvider: OKXWalletProvider | undefined;\n\n constructor(defaults?: BitcoinWalletDefaults) {\n super('OKX Wallet', 'okx-bitcoin', defaults);\n }\n\n public static isAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.okxwallet?.bitcoin;\n }\n\n public override get isInstalled(): boolean {\n return OKXXConnector.isAvailable();\n }\n\n public override get installUrl(): string {\n return WALLET_METADATA.okx.installUrl;\n }\n\n public override get icon(): string {\n return WALLET_METADATA.okx.icon;\n }\n\n async connect(): Promise<XAccount | undefined> {\n const okx = window.okxwallet?.bitcoin;\n if (!okx) {\n throw new Error('OKX wallet is not installed');\n }\n\n const { address } = await okx.connect();\n if (!address) {\n console.warn('[OKXXConnector] connect: okx.connect() returned no address');\n return undefined;\n }\n\n this.walletProvider = new OKXWalletProvider(address, this.defaults);\n\n return {\n address,\n xChainType: 'BITCOIN',\n };\n }\n\n async disconnect(): Promise<void> {\n this.walletProvider = undefined;\n }\n\n getWalletProvider(): IBitcoinWalletProvider | undefined {\n return this.walletProvider;\n }\n\n recreateWalletProvider(xAccount: XAccount): IBitcoinWalletProvider | undefined {\n if (!xAccount.address) return undefined;\n return new OKXWalletProvider(xAccount.address, this.defaults);\n }\n}\n","import { baseChainInfo, type SpokeChainKey, type GetChainType, type ChainType } from '@sodax/types';\n\n/**\n * `GetChainType` only accepts `SpokeChainKey | ChainType` — it cannot be given `undefined`.\n * When the generic may include `undefined`, narrow with `Exclude` and only union `undefined` on the result.\n */\nexport type GetXChainReturnType<K extends SpokeChainKey | undefined> = K extends SpokeChainKey\n ? GetChainType<K>\n : K extends undefined\n ? undefined\n : ChainType | undefined;\n\nexport function getXChainType<K extends SpokeChainKey>(xChainId: K | undefined): GetXChainReturnType<K | undefined> {\n if (!xChainId) {\n return undefined as GetXChainReturnType<K | undefined>;\n }\n return baseChainInfo[xChainId].type as GetXChainReturnType<K | undefined>;\n}","import type { BitcoinXConnector } from './BitcoinXConnector.js';\n\n/** Bitcoin connectors that support BIP-322 message signing (Unisat, Xverse, OKX). */\nexport function hasSignBip322(\n c: BitcoinXConnector,\n): c is BitcoinXConnector & { signBip322Message(msg: string): Promise<string> } {\n return 'signBip322Message' in c && typeof c.signBip322Message === 'function';\n}\n\n/** Bitcoin connectors that support legacy ECDSA message signing. */\nexport function hasSignEcdsa(\n c: BitcoinXConnector,\n): c is BitcoinXConnector & { signEcdsaMessage(msg: string): Promise<string> } {\n return 'signEcdsaMessage' in c && typeof c.signEcdsaMessage === 'function';\n}\n","import { type ChainType, ChainKeys, ChainTypeArr, detectBitcoinAddressType } from '@sodax/types';\nimport {\n IconWalletProvider,\n InjectiveWalletProvider,\n StellarWalletProvider,\n NearWalletProvider,\n StacksWalletProvider,\n} from '@sodax/wallet-sdk-core';\nimport { Wallet } from '@injectivelabs/wallet-base';\nimport { getEthereumAddress } from '@injectivelabs/sdk-ts';\n\nimport { XConnector, type XService } from './core/index.js';\nimport type { IWalletProvider, XConnection } from './types/index.js';\nimport type { IXConnector } from './types/interfaces.js';\nimport type { SodaxWalletConfig } from './types/config.js';\nimport type { ChainActions, ChainActionsRegistry } from './types/chainActions.js';\nimport { getEntryDefaults, getRpcUrl } from './utils/walletRpcConfig.js';\n\nimport { EvmXService } from './xchains/evm/index.js';\nimport { SolanaXService } from './xchains/solana/SolanaXService.js';\nimport { SuiXService } from './xchains/sui/index.js';\nimport { StellarXService, StellarWalletsKitXConnector } from './xchains/stellar/index.js';\nimport type { StellarWalletType } from './xchains/stellar/StellarWalletsKitXConnector.js';\nimport { IconXService, CHAIN_INFO, SupportedChainId } from './xchains/icon/index.js';\nimport { IconHanaXConnector } from './xchains/icon/IconHanaXConnector.js';\nimport { InjectiveXConnector, InjectiveXService } from './xchains/injective/index.js';\nimport { BitcoinXService } from './xchains/bitcoin/index.js';\nimport { UnisatXConnector } from './xchains/bitcoin/UnisatXConnector.js';\nimport { XverseXConnector } from './xchains/bitcoin/XverseXConnector.js';\nimport { OKXXConnector } from './xchains/bitcoin/OKXXConnector.js';\nimport { BitcoinXConnector } from './xchains/bitcoin/BitcoinXConnector.js';\nimport { hasSignBip322, hasSignEcdsa } from './xchains/bitcoin/bitcoinSignGuards.js';\nimport { NearXService } from './xchains/near/NearXService.js';\nimport { NearXConnector } from './xchains/near/NearXConnector.js';\nimport { StacksXService, StacksXConnector, STACKS_PROVIDERS } from './xchains/stacks/index.js';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\n/** Store accessor — avoids circular dependency with useXWalletStore */\nexport type StoreAccessor = () => {\n xConnections: Partial<Record<ChainType, XConnection>>;\n xConnectorsByChain: Partial<Record<ChainType, XConnector[]>>;\n xServices: Partial<Record<ChainType, XService>>;\n setXConnectors: (xChainType: ChainType, connectors: XConnector[]) => void;\n unsetXConnection: (xChainType: ChainType) => void;\n setWalletProvider: (xChainType: ChainType, provider: IWalletProvider | undefined) => void;\n /**\n * User-supplied `SodaxWalletConfig` (per-chain-type slots, each with adapter\n * settings + nested chains map). Source of `defaults` forwarded to core\n * wallet provider constructors for non-provider chains.\n */\n walletConfig: SodaxWalletConfig | undefined;\n};\n\nexport type ChainServiceFactory<S extends XService = XService> = {\n /** Create or get the XService singleton for this chain. */\n createService(walletConfig?: SodaxWalletConfig): S;\n /** Human-readable chain name for display in modal UIs. */\n displayName: string;\n /** Optional icon URL for the chain. Consumers can override when rendering. */\n iconUrl?: string;\n /**\n * Static connectors known at build time. Ignored for provider-managed chains.\n * `walletConfig` is forwarded so chains whose connectors construct wallet\n * providers eagerly (e.g. Bitcoin) can read per-chain-id `defaults` at\n * registration time.\n */\n defaultConnectors(walletConfig?: SodaxWalletConfig): XConnector[];\n /** true = needs React provider (EVM/Solana/Sui), false = browser extension APIs. */\n providerManaged: boolean;\n /** ChainActions for non-provider chains. If omitted, uses createDefaultActions(). */\n createActions?(service: S, getStore: StoreAccessor): ChainActions;\n /** Wallet provider for non-provider chains. Called on setXConnection(). */\n createWalletProvider?(service: S, getStore: StoreAccessor): IWalletProvider | undefined;\n /**\n * Async connector discovery for chains whose available wallets can only be detected at runtime\n * (e.g. browser extension scan, manifest loading). Runs once after init, updates store.xConnectorsByChain when done.\n * Use when wallet detection requires async operations — if connectors are known statically, use defaultConnectors() instead.\n *\n * Example: Stellar scans for installed browser wallets via walletsKit.getSupportedWallets(),\n * NEAR loads wallet manifest via walletSelector.whenManifestLoaded.\n */\n discoverConnectors?(service: S, getStore: StoreAccessor): Promise<void>;\n};\n\n/**\n * Define a chain service factory. Infers `S` from `createService` so all callbacks\n * (createActions, createWalletProvider, discoverConnectors) get the concrete service type,\n * then erases to the base ChainServiceFactory for storage in the registry.\n */\nfunction defineChain<S extends XService>(factory: ChainServiceFactory<S>): ChainServiceFactory {\n return factory;\n}\n\nexport type ChainServicesResult = {\n xServices: Partial<Record<ChainType, XService>>;\n xConnectorsByChain: Partial<Record<ChainType, IXConnector[]>>;\n enabledChains: ChainType[];\n chainActions: ChainActionsRegistry;\n};\n\n// ─── Connector helpers ─────────────────────────────────────────────────────\n\n/**\n * Validate that consumer-supplied connectors (typed against the public\n * `IXConnector` interface) are actual `XConnector` instances. Required at the\n * connectors override boundary because the SDK stores `XConnector[]` internally\n * — `getXConnectorById` and chain-specific subclass methods rely on the\n * abstract class default behavior.\n */\nfunction narrowConnectors(items: readonly IXConnector[], chainType: ChainType): XConnector[] {\n return items.filter((item): item is XConnector => {\n if (!(item instanceof XConnector)) {\n console.warn(\n `[chainRegistry] ${chainType} connector \"${item.id}\" must extend XConnector — skipping. Implement the abstract XConnector class instead of raw IXConnector for full SDK support.`,\n );\n return false;\n }\n return true;\n });\n}\n\n/** Read `connectors` override from the matching chain-type slot, if any. */\nfunction readConnectorsOverride(chainType: ChainType, walletConfig: SodaxWalletConfig | undefined): readonly IXConnector[] | undefined {\n return walletConfig?.[chainType]?.connectors;\n}\n\n/** Returns `true` if the chain-type slot is present in `walletConfig`. */\nfunction hasChainOfType(chainType: ChainType, walletConfig: SodaxWalletConfig): boolean {\n return walletConfig[chainType] !== undefined;\n}\n\n// ─── Default Actions Helper ─────────────────────────────────────────────────\n\nconst createDefaultActions = (chainType: ChainType, service: XService, getStore: StoreAccessor): ChainActions => ({\n connect: async (xConnectorId: string) => {\n const connector = service.getXConnectorById(xConnectorId);\n return connector?.connect();\n },\n disconnect: async () => {\n const store = getStore();\n const connectorId = store.xConnections[chainType]?.xConnectorId;\n const connector = connectorId ? service.getXConnectorById(connectorId) : undefined;\n // Clear store even if wallet.disconnect() throws — UI must not get stuck \"connected\".\n try {\n await connector?.disconnect();\n } finally {\n store.unsetXConnection(chainType);\n }\n },\n getConnectors: () => getStore().xConnectorsByChain[chainType] ?? [],\n getConnection: () => getStore().xConnections[chainType],\n});\n\n// ─── Chain Registry ──────────────────────────────────────────────────────────\n\nexport const chainRegistry: Record<string, ChainServiceFactory> = {\n EVM: defineChain({\n createService: () => EvmXService.getInstance(),\n displayName: 'EVM',\n defaultConnectors: () => [],\n providerManaged: true,\n }),\n SUI: defineChain({\n createService: () => SuiXService.getInstance(),\n displayName: 'Sui',\n defaultConnectors: () => [],\n providerManaged: true,\n }),\n SOLANA: defineChain({\n createService: () => SolanaXService.getInstance(),\n displayName: 'Solana',\n defaultConnectors: () => [],\n providerManaged: true,\n }),\n BITCOIN: defineChain({\n createService: walletConfig =>\n BitcoinXService.getInstance(getRpcUrl(walletConfig?.BITCOIN?.chains?.[ChainKeys.BITCOIN_MAINNET])),\n displayName: 'Bitcoin',\n defaultConnectors: (walletConfig?: SodaxWalletConfig) => {\n const defaults = getEntryDefaults<typeof ChainKeys.BITCOIN_MAINNET>(\n walletConfig?.BITCOIN?.chains?.[ChainKeys.BITCOIN_MAINNET],\n );\n return [new UnisatXConnector(defaults), new XverseXConnector(defaults), new OKXXConnector(defaults)];\n },\n providerManaged: false,\n createActions: (service, getStore) => ({\n ...createDefaultActions('BITCOIN', service, getStore),\n signMessage: async (message: string) => {\n const store = getStore();\n const connection = store.xConnections.BITCOIN;\n const connector = connection?.xConnectorId ? service.getXConnectorById(connection.xConnectorId) : undefined;\n if (!(connector instanceof BitcoinXConnector)) {\n throw new Error('Bitcoin wallet not connected');\n }\n const address = connection?.xAccount.address;\n if (!address) throw new Error('Bitcoin address not found');\n const addressType = detectBitcoinAddressType(address);\n\n switch (addressType) {\n case 'P2WPKH':\n case 'P2TR': {\n if (!hasSignBip322(connector)) {\n throw new Error(`${connector.id} does not support BIP-322 signing`);\n }\n return connector.signBip322Message(message);\n }\n case 'P2SH':\n case 'P2PKH': {\n if (!hasSignEcdsa(connector)) {\n throw new Error(`${connector.id} does not support ECDSA signing`);\n }\n return connector.signEcdsaMessage(message);\n }\n default: {\n const _exhaustiveCheck: never = addressType;\n throw new Error(`Unhandled Bitcoin address type: ${_exhaustiveCheck}`);\n }\n }\n },\n }),\n createWalletProvider: (service, getStore) => {\n const store = getStore();\n const connection = store.xConnections.BITCOIN;\n if (!connection?.xConnectorId) return undefined;\n const connector = service.getXConnectorById(connection.xConnectorId);\n if (!(connector instanceof BitcoinXConnector)) return undefined;\n return connector.recreateWalletProvider(connection.xAccount);\n },\n }),\n INJECTIVE: defineChain({\n createService: walletConfig =>\n InjectiveXService.getInstance(walletConfig?.INJECTIVE?.chains?.[ChainKeys.INJECTIVE_MAINNET]),\n displayName: 'Injective',\n defaultConnectors: () => [\n new InjectiveXConnector('MetaMask', Wallet.Metamask),\n new InjectiveXConnector('Keplr', Wallet.Keplr),\n new InjectiveXConnector('Leap', Wallet.Leap),\n ],\n providerManaged: false,\n createActions: (service, getStore) => ({\n ...createDefaultActions('INJECTIVE', service, getStore),\n signMessage: async (message: string) => {\n const store = getStore();\n const address = store.xConnections.INJECTIVE?.xAccount.address;\n if (!address) throw new Error('Injective address not found');\n\n const ethereumAddress = getEthereumAddress(address);\n const walletStrategy = service.walletStrategy;\n const res = await walletStrategy.signArbitrary(\n walletStrategy.getWallet() === Wallet.Metamask ? ethereumAddress : address,\n message,\n );\n if (!res) throw new Error('Injective signature not found');\n return res;\n },\n }),\n createWalletProvider: (service, getStore) => {\n if (!service) return undefined;\n const defaults = getEntryDefaults<typeof ChainKeys.INJECTIVE_MAINNET>(\n getStore().walletConfig?.INJECTIVE?.chains?.[ChainKeys.INJECTIVE_MAINNET],\n );\n return new InjectiveWalletProvider({ msgBroadcaster: service.msgBroadcaster, defaults });\n },\n }),\n STELLAR: defineChain({\n createService: walletConfig => {\n const stellarRpc = walletConfig?.STELLAR?.chains?.[ChainKeys.STELLAR_MAINNET];\n return StellarXService.getInstance(stellarRpc?.horizonRpcUrl, stellarRpc?.sorobanRpcUrl);\n },\n displayName: 'Stellar',\n defaultConnectors: () => [],\n providerManaged: false,\n discoverConnectors: async (service, getStore) => {\n // Hana Stellar injects window.hanaWallet.stellar lazily (sometimes after init).\n // The kit has no event API, so poll a few times with backoff so the connector\n // list catches up without forcing a refresh. Stop early once the id set stays\n // stable across consecutive iterations.\n const STELLAR_DISCOVER_DELAYS_MS = [0, 100, 500] as const;\n let lastIds = '';\n for (const delay of STELLAR_DISCOVER_DELAYS_MS) {\n if (delay) await new Promise(r => setTimeout(r, delay));\n const wallets = await service.walletsKit.getSupportedWallets();\n const connectors = wallets\n .filter((w: StellarWalletType) => w.isAvailable)\n .map((w: StellarWalletType) => new StellarWalletsKitXConnector(w));\n const ids = connectors\n .map(c => c.id)\n .sort()\n .join(',');\n if (ids === lastIds) break; // list stable — no new wallet inject\n lastIds = ids;\n service.setXConnectors(connectors);\n getStore().setXConnectors('STELLAR', connectors);\n }\n },\n createActions: (service, getStore) => ({\n ...createDefaultActions('STELLAR', service, getStore),\n signMessage: async (message: string) => {\n const res = await service.walletsKit.signMessage(message);\n return res.signedMessage;\n },\n }),\n createWalletProvider: (service, getStore) => {\n if (!service?.walletsKit) return undefined;\n const defaults = getEntryDefaults<typeof ChainKeys.STELLAR_MAINNET>(\n getStore().walletConfig?.STELLAR?.chains?.[ChainKeys.STELLAR_MAINNET],\n );\n return new StellarWalletProvider({\n type: 'BROWSER_EXTENSION',\n walletsKit: service.walletsKit,\n network: 'PUBLIC',\n defaults,\n });\n },\n }),\n // ICON: signMessage not implemented — Hana wallet does not expose a signing API.\n // connect/disconnect use createDefaultActions (no createActions override needed).\n ICON: defineChain({\n createService: walletConfig =>\n IconXService.getInstance(getRpcUrl(walletConfig?.ICON?.chains?.[ChainKeys.ICON_MAINNET])),\n displayName: 'ICON',\n defaultConnectors: () => [new IconHanaXConnector()],\n providerManaged: false,\n createWalletProvider: (_service, getStore) => {\n const store = getStore();\n const address = store.xConnections.ICON?.xAccount.address;\n if (!address) return undefined;\n const chainInfo = CHAIN_INFO[SupportedChainId.MAINNET];\n if (!chainInfo) throw new Error('ICON mainnet chain info not found');\n const defaults = getEntryDefaults<typeof ChainKeys.ICON_MAINNET>(\n store.walletConfig?.ICON?.chains?.[ChainKeys.ICON_MAINNET],\n );\n return new IconWalletProvider({\n walletAddress: address as `hx${string}`,\n rpcUrl: chainInfo.APIEndpoint as `http${string}`,\n defaults,\n });\n },\n }),\n NEAR: defineChain({\n createService: walletConfig =>\n NearXService.getInstance(getRpcUrl(walletConfig?.NEAR?.chains?.[ChainKeys.NEAR_MAINNET])),\n displayName: 'NEAR',\n defaultConnectors: () => [],\n providerManaged: false,\n discoverConnectors: async (service, getStore) => {\n await service.walletSelector.whenManifestLoaded;\n const connectors = service.walletSelector.availableWallets.map(w => new NearXConnector(w));\n service.setXConnectors(connectors);\n getStore().setXConnectors('NEAR', connectors);\n },\n createActions: (service, getStore) => ({\n ...createDefaultActions('NEAR', service, getStore),\n disconnect: async () => {\n try {\n service.walletSelector.disconnect();\n } finally {\n getStore().unsetXConnection('NEAR');\n }\n },\n }),\n createWalletProvider: (service, getStore) => {\n if (!service?.walletSelector) return undefined;\n const defaults = getEntryDefaults<typeof ChainKeys.NEAR_MAINNET>(\n getStore().walletConfig?.NEAR?.chains?.[ChainKeys.NEAR_MAINNET],\n );\n return new NearWalletProvider({ wallet: service.walletSelector, defaults });\n },\n }),\n STACKS: defineChain({\n createService: walletConfig => StacksXService.getInstance(walletConfig?.STACKS?.chains?.[ChainKeys.STACKS_MAINNET]),\n displayName: 'Stacks',\n defaultConnectors: () => STACKS_PROVIDERS.map(c => new StacksXConnector(c)),\n providerManaged: false,\n createWalletProvider: (service, getStore) => {\n const store = getStore();\n const connection = store.xConnections.STACKS;\n const address = connection?.xAccount.address;\n if (!address) return undefined;\n const connector = connection?.xConnectorId ? service.getXConnectorById(connection.xConnectorId) : undefined;\n const provider = connector instanceof StacksXConnector ? connector.getProvider() : undefined;\n const defaults = getEntryDefaults<typeof ChainKeys.STACKS_MAINNET>(\n store.walletConfig?.STACKS?.chains?.[ChainKeys.STACKS_MAINNET],\n );\n return new StacksWalletProvider({ address, provider, defaults });\n },\n }),\n};\n\n// ─── createChainServices ─────────────────────────────────────────────────────\n\nexport const createChainServices = (\n walletConfig: SodaxWalletConfig,\n getStore: StoreAccessor,\n): ChainServicesResult => {\n const xServices: Partial<Record<ChainType, XService>> = {};\n const xConnectorsByChain: Partial<Record<ChainType, IXConnector[]>> = {};\n const enabledChains: ChainType[] = [];\n const chainActions: ChainActionsRegistry = {};\n\n for (const chainType of ChainTypeArr) {\n if (!hasChainOfType(chainType, walletConfig)) continue;\n const factory = chainRegistry[chainType];\n if (!factory) continue;\n\n const service = factory.createService(walletConfig);\n xServices[chainType] = service;\n enabledChains.push(chainType);\n\n if (!factory.providerManaged) {\n const override = readConnectorsOverride(chainType, walletConfig);\n const connectors = override\n ? narrowConnectors(override, chainType)\n : factory.defaultConnectors(walletConfig);\n service.setXConnectors(connectors);\n xConnectorsByChain[chainType] = connectors;\n\n // Register ChainActions for non-provider chains\n chainActions[chainType] = factory.createActions\n ? factory.createActions(service, getStore)\n : createDefaultActions(chainType, service, getStore);\n\n // Async connector discovery (Stellar, NEAR) — updates store when done\n if (factory.discoverConnectors) {\n factory.discoverConnectors(service, getStore).catch(err => {\n console.warn(`[wallet-sdk-react] discoverConnectors failed for ${chainType}:`, err);\n });\n }\n }\n }\n\n return { xServices, xConnectorsByChain, enabledChains, chainActions };\n};\n","import { ChainTypeArr, type ChainType, type GetWalletProviderType } from '@sodax/types';\nimport { create } from 'zustand';\nimport { createJSONStorage, persist, devtools } from 'zustand/middleware';\nimport { immer } from 'zustand/middleware/immer';\nimport type { XService, XConnector } from './core/index.js';\nimport type { XConnection, IWalletProvider } from './types/index.js';\nimport type { ChainActions } from './types/chainActions.js';\nimport type { SodaxWalletConfig } from './types/config.js';\nimport { chainRegistry, createChainServices } from './chainRegistry.js';\n\n/** Empty slot in `walletProviders` is normal before a wallet is connected. */\nexport type GetWalletProviderReturnType<K extends ChainType | undefined> = K extends ChainType\n ? GetWalletProviderType<K> | undefined\n : undefined;\n\n// ─── Store ───────────────────────────────────────────────────────────────────\n\ntype XWalletStore = {\n xServices: Partial<Record<ChainType, XService>>;\n /** Active wallet connections. Persisted to localStorage. */\n xConnections: Partial<Record<ChainType, XConnection>>;\n xConnectorsByChain: Partial<Record<ChainType, XConnector[]>>;\n enabledChains: ChainType[];\n chainActions: Partial<Record<ChainType, ChainActions>>;\n /** Wallet providers from wallet-sdk-core. Read by useWalletProvider() hook. */\n walletProviders: Partial<Record<ChainType, IWalletProvider>>;\n /**\n * User-supplied `SodaxWalletConfig` (per-chain-type slots, each with adapter\n * settings + nested chains map). Source of `defaults` for non-provider chain\n * `createWalletProvider` callbacks. Provider-managed chains (EVM/Solana/Sui)\n * read from `WalletConfigContext` directly via Hydrators.\n */\n walletConfig: SodaxWalletConfig | undefined;\n /** Persisted user-disconnect intent. Hydrators suppress writes when set so ghost auto-reconnects don't override. Cleared by `<Chain>Actions.connect`. */\n userDisconnected: Partial<Record<ChainType, boolean>>;\n\n setXConnection: (xChainType: ChainType, xConnection: XConnection) => void;\n unsetXConnection: (xChainType: ChainType) => void;\n setXConnectors: (xChainType: ChainType, connectors: XConnector[]) => void;\n registerChainActions: (xChainType: ChainType, actions: ChainActions) => void;\n getWalletProvider: <K extends ChainType | undefined>(xChainType: K) => GetWalletProviderReturnType<K>;\n setWalletProvider: (xChainType: ChainType, provider: IWalletProvider | undefined) => void;\n /** Initialize all chain services from config. Called once by useInitChainServices. */\n initChainServices: (walletConfig: SodaxWalletConfig) => void;\n /** Remove persisted connections for chains not in enabledChains. Called after persist hydration. */\n cleanupDisabledConnections: () => void;\n markUserDisconnected: (xChainType: ChainType) => void;\n clearUserDisconnected: (xChainType: ChainType) => void;\n};\n\nexport const useXWalletStore = create<XWalletStore>()(\n devtools(\n persist(\n immer((set, get) => ({\n xServices: {},\n xConnections: {},\n xConnectorsByChain: {},\n enabledChains: [],\n chainActions: {},\n walletProviders: {},\n walletConfig: undefined,\n userDisconnected: {},\n\n setXConnection: (xChainType: ChainType, xConnection: XConnection) => {\n set(state => {\n state.xConnections[xChainType] = xConnection;\n });\n // Side-effect: recreate wallet provider for non-provider chains (Bitcoin, ICON, etc.)\n const factory = chainRegistry[xChainType]?.createWalletProvider;\n if (factory) {\n const service = get().xServices[xChainType];\n if (service) {\n const provider = factory(service, () => get());\n get().setWalletProvider(xChainType, provider);\n }\n }\n },\n\n unsetXConnection: (xChainType: ChainType) => {\n set(state => {\n delete state.xConnections[xChainType];\n delete state.walletProviders[xChainType];\n });\n },\n\n setXConnectors: (xChainType: ChainType, connectors: XConnector[]) => {\n set(state => {\n state.xConnectorsByChain[xChainType] = connectors;\n });\n },\n\n registerChainActions: (xChainType: ChainType, actions: ChainActions) => {\n set(state => {\n state.chainActions[xChainType] = actions;\n });\n },\n\n setWalletProvider: (xChainType: ChainType, provider: IWalletProvider | undefined) => {\n set(state => {\n if (provider) {\n state.walletProviders[xChainType] = provider;\n } else {\n delete state.walletProviders[xChainType];\n }\n });\n },\n\n getWalletProvider: <K extends ChainType | undefined>(xChainType: K): GetWalletProviderReturnType<K> => {\n if (!xChainType) return undefined as GetWalletProviderReturnType<K>;\n return get().walletProviders[xChainType] as GetWalletProviderReturnType<K>;\n },\n\n initChainServices: (walletConfig: SodaxWalletConfig) => {\n const result = createChainServices(walletConfig, () => get());\n set(state => {\n state.xServices = result.xServices;\n state.enabledChains = result.enabledChains;\n // Merge connectors and chainActions — provider-managed chains (EVM/Solana/Sui)\n // hydrate these via their Hydrator/Actions components, which may run before\n // or after this effect due to React's bottom-up effect ordering.\n Object.assign(state.xConnectorsByChain, result.xConnectorsByChain);\n Object.assign(state.chainActions, result.chainActions);\n });\n // Set `walletConfig` outside the immer recipe — the deep-readonly viem\n // types inside `EvmWalletDefaults.transport.rpcSchema` clash with immer's\n // WritableDraft. We never mutate this field, so a plain replace is correct.\n set({ walletConfig });\n },\n\n cleanupDisabledConnections: () => {\n set(state => {\n for (const chainType of ChainTypeArr) {\n if (state.xConnections[chainType] && !state.enabledChains.includes(chainType)) {\n delete state.xConnections[chainType];\n delete state.walletProviders[chainType];\n }\n }\n });\n },\n\n markUserDisconnected: (xChainType: ChainType) => {\n set(state => {\n state.userDisconnected[xChainType] = true;\n });\n },\n\n clearUserDisconnected: (xChainType: ChainType) => {\n set(state => {\n delete state.userDisconnected[xChainType];\n });\n },\n })),\n {\n // key kept as 'xwagmi-store' for backward compat — existing users won't lose persisted connections on upgrade\n name: 'xwagmi-store',\n storage: createJSONStorage(() => localStorage),\n partialize: state => ({\n xConnections: state.xConnections,\n userDisconnected: state.userDisconnected,\n }),\n },\n ),\n { name: 'xwagmi-store' },\n ),\n);\n","import type { ChainType } from '@sodax/types';\n\nimport type { XService } from '@/core/index.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\nexport function getXService(xChainType: ChainType): XService {\n const service = useXWalletStore.getState().xServices[xChainType];\n if (!service) {\n throw new Error(`XService for chain type \"${xChainType}\" is not initialized. Is the chain enabled in config?`);\n }\n return service;\n}\n","import type { ChainType } from '@sodax/types';\nimport type { XConnection } from '@/types/index.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\nexport type UseXConnectionOptions = {\n xChainType?: ChainType;\n};\n\n/**\n * Returns the active `XConnection` for a chain type — `{ xAccount, xConnectorId }` —\n * or `undefined` when no wallet is connected.\n *\n * Use this when you need the connector identity (e.g. to label a disconnect button\n * with the wallet name or icon). For just the address, prefer `useXAccount`, which\n * always returns a populated object and saves a null check.\n *\n * Returns `undefined` when `xChainType` is omitted — the field is optional to\n * accommodate consumers that branch on chain availability.\n */\nexport function useXConnection({ xChainType }: UseXConnectionOptions = {}): XConnection | undefined {\n return useXWalletStore(state => (xChainType ? state.xConnections?.[xChainType] : undefined));\n}\n","import { useMemo } from 'react';\n\nimport type { ChainType, SpokeChainKey } from '@sodax/types';\n\nimport type { XAccount } from '@/types/index.js';\nimport { assert } from '@/shared/guards.js';\nimport { getXChainType } from '@/actions/index.js';\nimport { useXConnection } from './useXConnection.js';\n\nexport type UseXAccountOptions =\n | { xChainId: SpokeChainKey; xChainType?: never }\n | { xChainType: ChainType; xChainId?: never };\n\n/**\n * Returns the connected `XAccount` for a chain family.\n *\n * Pass either `xChainId` (a `SpokeChainKey` — auto-resolved to its family) or\n * `xChainType` (a `ChainType` directly), never both. EVM is family-level — wagmi\n * maintains a single connection across every configured EVM network.\n *\n * Always returns a populated object, never `undefined`. When no wallet is connected,\n * `address` is `undefined` but `xChainType` is filled — consumers can render\n * `account.address ?? <ConnectCta />` without null-checking the wrapper.\n *\n * @see {@link https://github.com/icon-project/sodax-sdks/blob/main/packages/wallet-sdk-react/docs/CONNECT_FLOW.md#read-connected-account-state | Connect Flow — Read state}\n */\nexport function useXAccount({ xChainId, xChainType }: UseXAccountOptions): XAccount {\n assert(!(xChainId && xChainType), '[useXAccount] pass either xChainId or xChainType, not both');\n assert(xChainId || xChainType, '[useXAccount] pass xChainId or xChainType');\n\n const target = xChainType ?? getXChainType(xChainId);\n const xConnection = useXConnection({ xChainType: target });\n\n return useMemo(\n (): XAccount => xConnection?.xAccount ?? { address: undefined, xChainType: target },\n [target, xConnection],\n );\n}\n","import type { ChainType } from '@sodax/types';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\n/**\n * Reads the list of `ChainType`s currently enabled in `SodaxWalletProvider` config.\n *\n * Reflects which chain-type slots are present (`config.EVM`, `config.SOLANA`, …) — not\n * which chains have a wallet connected. Use `useConnectedChains` for the latter.\n *\n * @returns Stable array reference; re-renders only when `enabledChains` changes (i.e. on\n * `initChainServices` after mount, never afterwards because config is captured once).\n */\nexport function useEnabledChains(): ChainType[] {\n return useXWalletStore(state => state.enabledChains);\n}\n","import type { ChainType } from '@sodax/types';\nimport type { XConnection } from '@/types/index.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\n/**\n * Returns active wallet connections keyed by `ChainType`.\n *\n * Only chains with a connected wallet have entries — disconnected chains are absent\n * from the map (unlike `useXAccounts`, which always populates every enabled chain).\n *\n * The returned object reference is the persisted `xConnections` slice — stable\n * across re-renders that don't change connection state. Mutate via `useXConnect` /\n * `useXDisconnect`, never directly.\n */\nexport function useXConnections(): Partial<Record<ChainType, XConnection>> {\n return useXWalletStore(state => state.xConnections);\n}\n","import { useMemo } from 'react';\nimport type { ChainType } from '@sodax/types';\nimport type { XAccount } from '@/types/index.js';\nimport { useEnabledChains } from './useEnabledChains.js';\nimport { useXConnections } from './useXConnections.js';\n\n/**\n * Returns connected accounts for every enabled chain type, keyed by `ChainType`.\n *\n * Each entry is always populated — disconnected chains have `address: undefined`,\n * mirroring `useXAccount`'s shape. Iterates `enabledChains` so the result reflects\n * exactly the slots present in `SodaxWalletProvider` config.\n *\n * Useful for \"manage connections\" panels and multi-chain status badges. For an\n * enriched view with connector metadata (name, icon), use `useConnectedChains` —\n * which also exposes a hydration `status` flag to gate first-paint UI.\n *\n * @see {@link https://github.com/icon-project/sodax-sdks/blob/main/packages/wallet-sdk-react/docs/CONNECT_FLOW.md#read-connected-account-state | Connect Flow — Read state}\n */\nexport function useXAccounts() {\n const enabledChains = useEnabledChains();\n const xConnections = useXConnections();\n\n return useMemo(() => {\n const result: Partial<Record<ChainType, XAccount>> = {};\n for (const xChainType of enabledChains) {\n const xConnection = xConnections[xChainType];\n result[xChainType] = xConnection?.xAccount ?? { address: undefined, xChainType };\n }\n return result;\n }, [enabledChains, xConnections]);\n}\n","import type { XAccount } from '@/types/index.js';\nimport { useMutation, type UseMutationResult } from '@tanstack/react-query';\nimport type { IXConnector } from '@/types/interfaces.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\n/**\n * React Query mutation that connects a wallet via the supplied `IXConnector`.\n *\n * Pass an `IXConnector` (from `useXConnectors` / `useXConnectorsByChain`) to\n * `mutate` / `mutateAsync`. The hook delegates to the chain's `ChainActions.connect()`\n * and writes the resulting connection state into the store on success.\n *\n * **Provider-managed chains caveat** (EVM/Solana/Sui): the mutation resolves with\n * `undefined` because connection state is set reactively by the chain's Hydrator\n * after the native SDK reports `connected`. Read the resolved account via\n * `useXAccount` / `useXConnection`, not the mutation's return value.\n *\n * **Non-provider chains** (Bitcoin, ICON, Injective, Stellar, NEAR, Stacks) return\n * the resolved `XAccount` directly. Code defensively if your component supports\n * both — `useXAccount` works for both cases.\n *\n * Throws `Error('Chain \"<X>\" is not enabled or ChainActions not registered')` when\n * the connector's chain type isn't mounted in `SodaxWalletProvider` config.\n *\n * @see {@link https://github.com/icon-project/sodax-sdks/blob/main/packages/wallet-sdk-react/docs/CONNECT_FLOW.md#connect-a-wallet | Connect Flow — Connect}\n */\nexport function useXConnect(): UseMutationResult<XAccount | undefined, Error, IXConnector> {\n const setXConnection = useXWalletStore(state => state.setXConnection);\n const actionsRegistry = useXWalletStore(state => state.chainActions);\n\n return useMutation({\n mutationFn: async (xConnector: IXConnector) => {\n const chainActions = actionsRegistry[xConnector.xChainType];\n if (!chainActions) {\n throw new Error(`Chain \"${xConnector.xChainType}\" is not enabled or ChainActions not registered`);\n }\n\n const xAccount = await chainActions.connect(xConnector.id);\n\n if (xAccount) {\n setXConnection(xConnector.xChainType, {\n xAccount,\n xConnectorId: xConnector.id,\n });\n }\n\n return xAccount;\n },\n });\n}\n","import type { ChainType } from '@sodax/types';\nimport { useXWalletStore } from '@/useXWalletStore.js';\nimport type { IXConnector } from '@/types/interfaces.js';\n\nexport type UseXConnectorsOptions = {\n xChainType?: ChainType;\n};\n\nconst warnedChains = new Set<ChainType>();\n\n/**\n * Returns available wallet connectors for a specific chain type, with enriched\n * metadata (`isInstalled`, `installUrl`, `icon`).\n *\n * Each `connector.isInstalled` reads `window.*` at access time — no extra subscription\n * is installed. Components receive fresh values through normal React render triggers\n * (store updates, parent re-renders).\n *\n * Returns `[]` when the chain isn't enabled in `SodaxWalletProvider` config and logs a\n * one-time warning per chain to help debug missing connector lists. For multi-chain\n * pickers, prefer `useXConnectorsByChain` which avoids the warning per chain.\n *\n * Pair with `sortConnectors(connectors, { preferred })` to rank installed/preferred wallets\n * first. `preferred` matches by exact `connector.id` — for substring/case-insensitive matching,\n * use `useIsWalletInstalled`.\n *\n * @see {@link https://github.com/icon-project/sodax-sdks/blob/main/packages/wallet-sdk-react/docs/CONNECT_FLOW.md#discover-connectors | Connect Flow — Discover}\n */\nexport function useXConnectors({ xChainType }: UseXConnectorsOptions = {}): IXConnector[] {\n return useXWalletStore(state => {\n if (!xChainType) return [];\n if (!state.enabledChains.includes(xChainType) && !warnedChains.has(xChainType)) {\n warnedChains.add(xChainType);\n console.warn(\n `[useXConnectors] chain \"${xChainType}\" is not enabled in SodaxWalletProvider config.chains — returning empty list`,\n );\n }\n return state.xConnectorsByChain[xChainType] ?? [];\n });\n}\n","import type { ChainType } from '@sodax/types';\nimport type { IXConnector } from '@/types/interfaces.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\n/**\n * Returns the connector list for every enabled chain type, grouped by `ChainType`.\n *\n * Used for multi-chain wallet pickers (e.g. listing every available wallet across\n * EVM, Solana, Bitcoin in one render). For a single chain, prefer `useXConnectors`\n * which also emits a one-time warning if the chain isn't enabled.\n *\n * Each connector's `isInstalled` reads `window.*` at access time — values stay\n * fresh through normal React render triggers.\n */\nexport function useXConnectorsByChain(): Partial<Record<ChainType, IXConnector[]>> {\n return useXWalletStore(state => state.xConnectorsByChain);\n}\n","import type { IXConnector } from '@/types/interfaces.js';\n\nconst SHORT_IDENTIFIER_THRESHOLD = 3;\nconst warnedShortIdentifiers = new Set<string>();\n\n/**\n * Case-insensitive substring match of `identifier` against `connector.id` and\n * `connector.name`. Shared by `useBatchConnect`, `useBatchDisconnect`, and\n * `useIsWalletInstalled` so user-supplied wallet identifiers (e.g. `'hana'`,\n * `'phantom'`) resolve to connector instances the same way across all three.\n *\n * Intent: identifier is a **wallet brand name** — the same brand often surfaces\n * with different ids per chain (IconHanaXConnector has `id='hana'`; the EVM\n * Hana EIP-6963 connector comes through as `id='io.hana.wallet'`), and\n * substring matching is what lets `['hana']` cover both without forcing the\n * consumer to enumerate ids. For the same reason there is no `exact` mode —\n * ids are not a stable public contract (many come from upstream libs like\n * `@hot-labs/near-connect`, `@creit.tech/stellar-wallets-kit`, wagmi EIP-6963,\n * `@solana/wallet-adapter-react`), and pinning to them would be fragile.\n *\n * When the target is a **specific connector** rather than a brand, prefer the\n * explicit path:\n *\n * ```ts\n * const connectors = useXConnectors('BITCOIN');\n * const okx = connectors.find(c => c.id === 'okx-bitcoin');\n * if (okx) await disconnect('BITCOIN');\n * ```\n *\n * Short identifiers (fewer than 3 chars) emit a one-time dev-mode warning\n * because substring matching on short strings produces false positives — a\n * disconnect scoped to `'ok'` would also disconnect any connector whose name\n * happens to contain \"ok\".\n */\nexport function matchesConnectorIdentifier(connector: IXConnector, identifier: string): boolean {\n const needle = identifier.toLowerCase();\n\n if (\n needle.length > 0 &&\n needle.length < SHORT_IDENTIFIER_THRESHOLD &&\n !warnedShortIdentifiers.has(needle)\n ) {\n warnedShortIdentifiers.add(needle);\n console.warn(\n `[matchesConnectorIdentifier] identifier \"${identifier}\" is ${needle.length} chars — substring matching on short strings frequently hits unintended connectors. Use a more distinctive wallet brand name, or match a single connector via useXConnectors(chainType).find(c => c.id === '...') directly.`,\n );\n }\n\n return connector.id.toLowerCase().includes(needle) || connector.name.toLowerCase().includes(needle);\n}\n","import type { ChainType } from '@sodax/types';\nimport type { XConnector } from '@/core/XConnector.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\nimport { matchesConnectorIdentifier } from '@/utils/matchConnectorIdentifier.js';\n\n/**\n * Either `connectors`, `chainType`, or both. The union prevents an empty\n * `{}` at the type level — the hook must narrow at least one axis so the\n * return value has a meaningful interpretation (not \"is any wallet installed\n * anywhere\", which is rarely the intent).\n */\nexport type UseIsWalletInstalledOptions =\n | {\n /**\n * Wallet brand identifiers (e.g. `'hana'`, `'phantom'`). Matched via\n * case-insensitive substring against `connector.id` and `connector.name` —\n * see {@link matchesConnectorIdentifier}. Returns `true` if ANY identifier\n * matches an installed connector. Mirrors the `connectors` parameter of\n * `useBatchConnect` / `useBatchDisconnect`.\n */\n connectors: readonly string[];\n chainType?: ChainType;\n }\n | {\n connectors?: readonly string[];\n /** Restrict the scan to a single chain. */\n chainType: ChainType;\n };\n\n/**\n * True when at least one connector across the configured chains is installed\n * AND matches the supplied filters. `connectors` and `chainType` AND together;\n * at least one of them must be supplied (enforced at the type level).\n *\n * @example\n * // Single wallet across every chain\n * const isHanaInstalled = useIsWalletInstalled({ connectors: ['hana'] });\n *\n * @example\n * // Any of these wallets\n * const hasMultiChainWallet = useIsWalletInstalled({ connectors: ['hana', 'okx', 'phantom'] });\n *\n * @example\n * // Any wallet on a specific chain\n * const hasBitcoin = useIsWalletInstalled({ chainType: 'BITCOIN' });\n *\n * @example\n * // AND — Hana specifically on EVM\n * const hanaOnEvm = useIsWalletInstalled({ connectors: ['hana'], chainType: 'EVM' });\n */\nexport function useIsWalletInstalled(options: UseIsWalletInstalledOptions): boolean {\n const xConnectorsByChain = useXWalletStore(s => s.xConnectorsByChain);\n return isAnyConnectorInstalled(options, xConnectorsByChain);\n}\n\n/**\n * Pure helper backing `useIsWalletInstalled`. Extracted for testability\n * without mounting React.\n *\n * Runtime safety: callers that bypass the compile-time union (e.g. an `as`\n * cast to `{}`) get `false` plus a dev-time warning instead of a thrown\n * error — a hook crashing the render tree over a type-level misuse is\n * worse than returning a conservative default.\n */\nexport function isAnyConnectorInstalled(\n options: UseIsWalletInstalledOptions,\n xConnectorsByChain: Partial<Record<ChainType, XConnector[]>>,\n): boolean {\n const { connectors: identifiers, chainType } = options;\n\n if (identifiers === undefined && chainType === undefined) {\n console.warn(\n '[useIsWalletInstalled] called without `connectors` or `chainType` — returning `false`. ' +\n 'Supply at least one filter.',\n );\n return false;\n }\n\n // Empty identifier list = explicit \"match nothing\".\n if (identifiers && identifiers.length === 0) return false;\n\n const chainsToScan = chainType ? [xConnectorsByChain[chainType]] : Object.values(xConnectorsByChain);\n\n for (const chainConnectors of chainsToScan) {\n if (!chainConnectors) continue;\n for (const connector of chainConnectors) {\n if (!connector.isInstalled) continue;\n if (!identifiers) return true;\n if (identifiers.some(id => matchesConnectorIdentifier(connector, id))) return true;\n }\n }\n return false;\n}\n","import type { ChainType } from '@sodax/types';\n\n/**\n * Sort comparator for `ChainType` against a caller-supplied order list.\n * Chains not in `order` fall to the bottom and sort alphabetically among\n * themselves. Shared by `useChainGroups` and `useConnectedChains` so the\n * two hooks report identical orderings for the same `order` input.\n *\n * Internal — not re-exported from the package barrel.\n */\nexport function compareChainByOrder(a: ChainType, b: ChainType, order: readonly ChainType[]): number {\n const ia = order.indexOf(a);\n const ib = order.indexOf(b);\n if (ia === -1 && ib === -1) return a.localeCompare(b);\n if (ia === -1) return 1;\n if (ib === -1) return -1;\n return ia - ib;\n}\n","import { useMemo } from 'react';\nimport { baseChainInfo, CHAIN_KEYS, type SpokeChainKey, type ChainType } from '@sodax/types';\nimport type { XAccount, XConnection } from '@/types/index.js';\nimport { useEnabledChains } from './useEnabledChains.js';\nimport { useXConnections } from './useXConnections.js';\nimport { chainRegistry, type ChainServiceFactory } from '@/chainRegistry.js';\nimport { compareChainByOrder } from '@/utils/chainOrder.js';\n\nexport type ChainGroup = {\n chainType: ChainType;\n /** All SpokeChainKeys that share this ChainType — e.g. every EVM network for `chainType: 'EVM'`. */\n chainIds: readonly SpokeChainKey[];\n displayName: string;\n /** Icon URL from chainRegistry. `undefined` when SDK doesn't ship a default — consumer provides. */\n iconUrl: string | undefined;\n isConnected: boolean;\n account: XAccount | undefined;\n connectorId: string | undefined;\n};\n\nexport type UseChainGroupsOptions = {\n /**\n * Display order by `chainType`. Chains not listed fall to the bottom,\n * sorted alphabetically among themselves. Omit to follow the insertion\n * order of `enabledChains` (driven by `SodaxWalletProvider` config).\n */\n order?: readonly ChainType[];\n};\n\nfunction getSpokeChainKeysByType(chainType: ChainType): readonly SpokeChainKey[] {\n const ids: SpokeChainKey[] = [];\n for (const chainKey of CHAIN_KEYS) {\n if (baseChainInfo[chainKey].type === chainType) ids.push(chainKey);\n }\n return ids;\n}\n\n/**\n * Pure helper — extracted for testability. Same logic as `useChainGroups` but\n * without React hook bindings.\n */\nexport function buildChainGroups(\n enabledChains: readonly ChainType[],\n xConnections: Partial<Record<ChainType, XConnection>>,\n registry: Record<string, ChainServiceFactory> = chainRegistry,\n order?: readonly ChainType[],\n): ChainGroup[] {\n const chains = order\n ? [...enabledChains].sort((a, b) => compareChainByOrder(a, b, order))\n : enabledChains;\n\n return chains.map(chainType => {\n const factory = registry[chainType];\n const connection = xConnections[chainType];\n return {\n chainType,\n chainIds: getSpokeChainKeysByType(chainType),\n displayName: factory?.displayName ?? chainType,\n iconUrl: factory?.iconUrl,\n isConnected: !!connection?.xAccount.address,\n account: connection?.xAccount,\n connectorId: connection?.xConnectorId,\n };\n });\n}\n\n/**\n * Returns one `ChainGroup` per enabled chain type. EVM collapses to a single\n * group covering every EVM network via `chainIds`. Use for rendering modal\n * chain-pickers.\n *\n * @example\n * const groups = useChainGroups();\n * return groups.map(g => (\n * <button key={g.chainType}>\n * {g.iconUrl && <img src={g.iconUrl} alt=\"\" />}\n * {g.displayName}\n * {g.isConnected && <Badge>Connected</Badge>}\n * </button>\n * ));\n *\n * @example\n * // Deterministic display order — useful when the chain picker must render\n * // hub-first regardless of enabledChains insertion order.\n * const groups = useChainGroups({ order: ['EVM', 'ICON', 'SOLANA'] });\n */\nexport function useChainGroups({ order }: UseChainGroupsOptions = {}): ChainGroup[] {\n const enabledChains = useEnabledChains();\n const xConnections = useXConnections();\n\n return useMemo(\n () => buildChainGroups(enabledChains, xConnections, chainRegistry, order),\n [enabledChains, xConnections, order],\n );\n}\n","import { useMemo, useSyncExternalStore } from 'react';\nimport { ChainTypeArr, type ChainType } from '@sodax/types';\nimport type { XAccount, XConnection } from '@/types/index.js';\nimport type { IXConnector } from '@/types/interfaces.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\nimport { useXConnections } from './useXConnections.js';\nimport { useXConnectorsByChain } from './useXConnectorsByChain.js';\nimport { compareChainByOrder } from '@/utils/chainOrder.js';\n\nexport type ConnectedChain = {\n chainType: ChainType;\n account: XAccount;\n connectorId: string;\n connectorName: string | undefined;\n connectorIcon: string | undefined;\n};\n\nexport type UseConnectedChainsResult = {\n /** One entry per chain currently holding a connected account. */\n chains: ConnectedChain[];\n /** Number of connected chains. */\n total: number;\n /**\n * `'loading'` until the store rehydrates from localStorage. Gate UI that\n * switches visibly on connection state (e.g. `total >= 1 ? Connected : Cta`)\n * with this flag to avoid flicker on reload.\n */\n status: 'loading' | 'ready';\n};\n\nexport type UseConnectedChainsOptions = {\n /**\n * Display order by `chainType`. Chains not listed fall to the bottom,\n * sorted alphabetically among themselves. Omit to use the default\n * `ChainTypeArr` order from `@sodax/types` (stable across page reloads).\n */\n order?: readonly ChainType[];\n};\n\n/**\n * Pure helper — extracted for testability. Same logic as `useConnectedChains`\n * but without React hook bindings. `isReady` defaults to `true` so tests that\n * don't care about loading state don't need to pass it.\n */\nexport function buildConnectedChains(\n xConnections: Partial<Record<ChainType, XConnection>>,\n xConnectorsByChain: Partial<Record<ChainType, IXConnector[]>>,\n isReady = true,\n order?: readonly ChainType[],\n): UseConnectedChainsResult {\n const chains: ConnectedChain[] = [];\n for (const chainType of ChainTypeArr) {\n const connection = xConnections[chainType];\n if (!connection?.xAccount.address) continue;\n const connectors = xConnectorsByChain[chainType] ?? [];\n const connector = connectors.find(c => c.id === connection.xConnectorId);\n chains.push({\n chainType,\n account: connection.xAccount,\n connectorId: connection.xConnectorId,\n connectorName: connector?.name,\n connectorIcon: connector?.icon,\n });\n }\n\n if (order) {\n chains.sort((a, b) => compareChainByOrder(a.chainType, b.chainType, order));\n }\n\n return {\n chains,\n total: chains.length,\n status: isReady ? 'ready' : 'loading',\n };\n}\n\nfunction subscribeHydration(onChange: () => void): () => void {\n const unsubHydrate = useXWalletStore.persist.onHydrate(onChange);\n const unsubFinish = useXWalletStore.persist.onFinishHydration(onChange);\n return () => {\n unsubHydrate();\n unsubFinish();\n };\n}\n\n/**\n * Aggregate view of every currently-connected chain with enriched connector\n * metadata (name + icon) looked up from the store. Useful for \"Manage\n * connections\" UIs and status badges.\n *\n * Gate rendering on `status === 'ready'` to avoid the \"Connect wallet\" →\n * \"Connected\" flicker on reload while the store rehydrates from localStorage.\n *\n * @example\n * const { chains, total, status } = useConnectedChains();\n * if (status === 'loading') return <Skeleton />;\n * return total >= 1 ? <ConnectedChainsDisplay chains={chains} /> : <ConnectCta />;\n *\n * @example\n * // Deterministic display order — required if rendering a list that must\n * // be stable across page reloads (hydrator race otherwise randomizes\n * // insertion order).\n * const { chains } = useConnectedChains({ order: ['EVM', 'ICON', 'SOLANA'] });\n */\nexport function useConnectedChains({ order }: UseConnectedChainsOptions = {}): UseConnectedChainsResult {\n const xConnections = useXConnections();\n const xConnectorsByChain = useXConnectorsByChain();\n const isReady = useSyncExternalStore(\n subscribeHydration,\n () => useXWalletStore.persist.hasHydrated(),\n () => false,\n );\n\n return useMemo(\n () => buildConnectedChains(xConnections, xConnectorsByChain, isReady, order),\n [xConnections, xConnectorsByChain, isReady, order],\n );\n}\n","import type { ChainType } from '@sodax/types';\nimport { useCallback } from 'react';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\nexport type UseXDisconnectArgs = {\n xChainType: ChainType;\n};\n\n/**\n * Returns a callback that disconnects the wallet for a given chain type.\n *\n * The callback delegates to the chain's `ChainActions.disconnect()` — provider-managed\n * chains (EVM/Solana/Sui) trigger native SDK disconnect and let the Hydrator clear the\n * store; non-provider chains call `unsetXConnection` directly.\n *\n * **Never throws.** When no `ChainActions` are registered (chain not enabled in\n * `SodaxWalletProvider` config), the callback logs a warning and resolves silently.\n * Even if the wallet's native disconnect throws, the store is cleared — the UI never\n * gets stuck on \"connected\" state.\n *\n * @see {@link https://github.com/icon-project/sodax-sdks/blob/main/packages/wallet-sdk-react/docs/CONNECT_FLOW.md#disconnect | Connect Flow — Disconnect}\n */\nexport function useXDisconnect(): (args: UseXDisconnectArgs) => Promise<void> {\n const actionsRegistry = useXWalletStore(state => state.chainActions);\n\n return useCallback(\n async ({ xChainType }: UseXDisconnectArgs) => {\n const chainActions = actionsRegistry[xChainType];\n if (chainActions) {\n await chainActions.disconnect();\n } else {\n console.warn(\n `[useXDisconnect] No chain actions registered for \"${xChainType}\". Is it enabled in config.chains?`,\n );\n }\n },\n [actionsRegistry],\n );\n}\n","import { useCallback, useRef, useState } from 'react';\nimport type { ChainType } from '@sodax/types';\nimport type { XAccount } from '@/types/index.js';\nimport type { XConnector } from '@/core/XConnector.js';\nimport { useXConnect } from './useXConnect.js';\nimport { useXDisconnect, type UseXDisconnectArgs } from './useXDisconnect.js';\n\nexport type ConnectionStatus = 'idle' | 'connecting' | 'success' | 'error';\n\nexport type UseConnectionFlowResult = {\n /** `'idle' | 'connecting' | 'success' | 'error'` — reflects the last attempt. */\n status: ConnectionStatus;\n /** Raw error from the last failed attempt; null when no error. Inspect `activeConnector.isInstalled` for the install-CTA branch. */\n error: Error | null;\n /** Connector the current / last attempt targeted. */\n activeConnector: XConnector | null;\n /** Chain the current / last attempt targeted. */\n activeChainType: ChainType | null;\n /** Connect and return the resolved account. Errors populate `error` instead of throwing. */\n connect: (connector: XConnector) => Promise<XAccount | undefined>;\n /** Disconnect a specific chain. Matches `useXDisconnect` semantics. */\n disconnect: (args: UseXDisconnectArgs) => Promise<void>;\n /** Re-runs the last attempted `connect(connector)`. No-op if no prior attempt. */\n retry: () => Promise<XAccount | undefined>;\n /** Clears `status`, `error`, and `activeConnector`. */\n reset: () => void;\n};\n\n/**\n * Wrapper around `useXConnect` + `useXDisconnect` that surfaces the raw error\n * on state instead of throwing, plus tracks the active connector and exposes\n * `retry()`. Unlike calling `useXConnect` directly, `connect()` here never\n * throws — errors flow into `error` so render code stays linear.\n *\n * For the \"install CTA\" branch, read `activeConnector.isInstalled` and\n * `activeConnector.installUrl` (populated by Phase 1). No error classification\n * is done here — consumers log the raw error for unrecognized cases.\n *\n * @example\n * const { status, error, connect, retry, activeConnector } = useConnectionFlow();\n *\n * if (status === 'error' && error) {\n * if (activeConnector && !activeConnector.isInstalled) {\n * return <a href={activeConnector.installUrl}>Install →</a>;\n * }\n * return <button onClick={retry}>Failed — retry</button>;\n * }\n *\n * return (\n * <button onClick={() => connect(connector)} disabled={status === 'connecting'}>\n * {status === 'connecting' ? 'Waiting for wallet…' : 'Connect'}\n * </button>\n * );\n */\nexport function useConnectionFlow(): UseConnectionFlowResult {\n const mutation = useXConnect();\n const disconnect = useXDisconnect();\n\n const [error, setError] = useState<Error | null>(null);\n const [activeConnector, setActiveConnector] = useState<XConnector | null>(null);\n const lastConnectorRef = useRef<XConnector | null>(null);\n\n const connect = useCallback(\n async (connector: XConnector) => {\n lastConnectorRef.current = connector;\n setActiveConnector(connector);\n setError(null);\n try {\n return await mutation.mutateAsync(connector);\n } catch (raw) {\n setError(raw instanceof Error ? raw : new Error(String(raw)));\n return undefined;\n }\n },\n [mutation],\n );\n\n const retry = useCallback(async () => {\n const last = lastConnectorRef.current;\n if (!last) return undefined;\n return connect(last);\n }, [connect]);\n\n const reset = useCallback(() => {\n mutation.reset();\n setError(null);\n setActiveConnector(null);\n lastConnectorRef.current = null;\n }, [mutation]);\n\n const status: ConnectionStatus = error\n ? 'error'\n : mutation.isPending\n ? 'connecting'\n : mutation.isSuccess\n ? 'success'\n : 'idle';\n\n return {\n status,\n error,\n activeConnector,\n activeChainType: activeConnector?.xChainType ?? null,\n connect,\n disconnect,\n retry,\n reset,\n };\n}\n","import { useCallback, useRef, useState } from 'react';\nimport { ChainTypeArr, type ChainType } from '@sodax/types';\nimport type { XAccount } from '@/types/index.js';\nimport type { IXConnector } from '@/types/interfaces.js';\nimport { assert } from '@/shared/guards.js';\nimport { matchesConnectorIdentifier } from '@/utils/matchConnectorIdentifier.js';\nimport { useXConnect } from './useXConnect.js';\nimport { useXConnections } from './useXConnections.js';\nimport { useXConnectorsByChain } from './useXConnectorsByChain.js';\nimport type { BatchOperationStatus } from '@/types/batchStatus.js';\n\n/**\n * Per-target event emitted by `onProgress` as the batch advances. Lets consumers\n * render a live \"EVM: connecting… done; ICON: skipped; SUI: connecting…\" log\n * instead of waiting for the final `run()` promise.\n */\nexport type BatchConnectProgressEvent =\n | { chainType: ChainType; outcome: 'success' }\n | { chainType: ChainType; outcome: 'failure'; error: Error }\n | { chainType: ChainType; outcome: 'skipped' };\n\nexport type BatchConnectResult = {\n /** Chain types where the connect attempt succeeded. */\n successful: ChainType[];\n /** Chain types where the connect attempt threw, paired with the raw error. */\n failed: Array<{ chainType: ChainType; error: Error }>;\n /** Chain types skipped because `{ skipConnected: true }` and an account was already present. */\n skipped: ChainType[];\n};\n\nexport type UseBatchConnectOptions = {\n /**\n * Wallet brand identifiers (e.g. `'hana'`, `'phantom'`). Matched via\n * case-insensitive substring against `connector.id` and `connector.name` —\n * see {@link matchesConnectorIdentifier}.\n *\n * Resolution is **per-chain priority with fallback-on-failure**: for each\n * chain, every matching connector is queued in identifier order. The runner\n * tries them sequentially and stops at the first one that connects. If an\n * earlier identifier's connector fails (popup denied, extension error, …),\n * the next identifier's connector is tried. Subsequent identifiers are\n * silently skipped once a chain succeeds — only one popup per chain on the\n * happy path.\n *\n * To target a specific connector (not a brand), use\n * `useXConnectors(chainType).find(c => c.id === '...')` directly instead of\n * this API.\n *\n * @example ['hana'] // Hana across every chain it supports\n * @example ['hana', 'phantom'] // prefer Hana per chain; if Hana fails or\n * // is unavailable on a chain, fall back to\n * // Phantom (e.g. Solana).\n */\n connectors: readonly string[];\n /** Skip chains whose account is already connected at `run()` time. */\n skipConnected?: boolean;\n /**\n * Fires once per target as the batch progresses. Useful for live progress UI\n * (a spinner-per-chain list). Errors thrown from `onProgress` are caught and\n * logged — they do NOT fail the batch.\n */\n onProgress?: (event: BatchConnectProgressEvent) => void;\n};\n\nexport type UseBatchConnectResult = {\n run: () => Promise<BatchConnectResult>;\n status: BatchOperationStatus;\n result: BatchConnectResult | null;\n /**\n * Clears `status` and `result`. Calling `reset()` while `status === 'running'`\n * only clears the observable state — the in-flight batch is NOT aborted\n * (there is no cancellation signal). When the batch eventually resolves,\n * `status` flips to `'done'` and `result` populates again. Typical usage\n * is to call `reset()` only after `status === 'done'`.\n */\n reset: () => void;\n};\n\ntype BatchConnectTarget = {\n chainType: ChainType;\n connector: IXConnector;\n};\n\n/**\n * Pure helper — resolves user-supplied wallet identifiers to concrete\n * `{ chainType, connector }` targets across every chain the wallet is\n * available on. Emits **every matching connector per chain** in identifier\n * order — the runner uses the order as priority and only attempts later\n * targets for a chain when earlier ones fail. Extracted for testability\n * without mounting React.\n */\nexport function resolveBatchTargets(\n connectors: readonly string[],\n connectorsByChain: Partial<Record<ChainType, IXConnector[]>>,\n): BatchConnectTarget[] {\n const targets: BatchConnectTarget[] = [];\n for (const chainType of ChainTypeArr) {\n const chainConnectors = connectorsByChain[chainType];\n if (!chainConnectors?.length) continue;\n for (const identifier of connectors) {\n const match = chainConnectors.find(c => matchesConnectorIdentifier(c, identifier));\n if (match) targets.push({ chainType, connector: match });\n }\n }\n return targets;\n}\n\n/**\n * Pure helper — runs the batch sequentially over resolved `targets`. The\n * resolver may emit multiple targets per chain (one per matching identifier);\n * this runner uses priority order with fallback-on-failure:\n *\n * - Once a chain succeeds (or is skipped via `skipConnected`), any remaining\n * targets for that chain are silently dropped — only one popup per chain on\n * the happy path.\n * - If the first target for a chain throws, the next target for the same\n * chain is attempted. `result.failed` is populated only when every target\n * for a chain has been exhausted without success.\n * - `onProgress` fires per-attempt (so the consumer can render a live\n * \"EVM: Hana failed, trying Phantom…\" log). A chain may emit a `failure`\n * event followed by a `success` event — the final outcome lives in\n * `result`.\n *\n * Extracted for testability without mounting React.\n */\nexport async function runBatchConnect(\n targets: readonly BatchConnectTarget[],\n helpers: {\n connect: (connector: IXConnector) => Promise<XAccount | undefined>;\n isConnected: (chainType: ChainType) => boolean;\n skipConnected: boolean;\n onProgress?: (event: BatchConnectProgressEvent) => void;\n },\n): Promise<BatchConnectResult> {\n const successful: ChainType[] = [];\n const failed: BatchConnectResult['failed'] = [];\n const skipped: ChainType[] = [];\n // Chain has been finalized this run — further targets for it are silently dropped.\n const finalized = new Set<ChainType>();\n // Most recent error per chain, retained until every target for that chain has been\n // tried. If a later target for the same chain succeeds, the entry is cleared.\n const pendingError = new Map<ChainType, Error>();\n\n const emit = (event: BatchConnectProgressEvent): void => {\n if (!helpers.onProgress) return;\n try {\n helpers.onProgress(event);\n } catch (err) {\n console.error('[useBatchConnect] onProgress threw:', err);\n }\n };\n\n for (const target of targets) {\n if (finalized.has(target.chainType)) continue;\n\n if (helpers.skipConnected && helpers.isConnected(target.chainType)) {\n skipped.push(target.chainType);\n finalized.add(target.chainType);\n emit({ chainType: target.chainType, outcome: 'skipped' });\n continue;\n }\n\n try {\n await helpers.connect(target.connector);\n successful.push(target.chainType);\n finalized.add(target.chainType);\n pendingError.delete(target.chainType);\n emit({ chainType: target.chainType, outcome: 'success' });\n } catch (raw) {\n const error = raw instanceof Error ? raw : new Error(String(raw));\n pendingError.set(target.chainType, error);\n emit({ chainType: target.chainType, outcome: 'failure', error });\n // NOT finalized — a later target for the same chain may still recover.\n }\n }\n\n // After every target has been visited, any chain still holding an error has\n // exhausted its fallback candidates.\n for (const [chainType, error] of pendingError) {\n if (!finalized.has(chainType)) failed.push({ chainType, error });\n }\n\n return { successful, failed, skipped };\n}\n\n/**\n * Connect every chain where one of the supplied wallet identifiers matches\n * an available connector. Sequential (safe for extensions that share popup\n * singletons); errors never throw from `run()` — failures are collected into\n * `result.failed`.\n *\n * Replaces the apps/web-era per-wallet wrappers\n * (`useConnectAllWithHana`, `useConnectRestWithHana`): pass the wallet name(s)\n * and the hook discovers all compatible chains from the registry.\n *\n * @example\n * // Connect Hana on every chain it supports (EVM, ICON, Solana, Sui, Stellar...)\n * const { run, status, result } = useBatchConnect({ connectors: ['hana'] });\n * await run();\n *\n * @example\n * // Only connect chains not already connected\n * const { run } = useBatchConnect({ connectors: ['hana'], skipConnected: true });\n * await run();\n */\nexport function useBatchConnect({\n connectors,\n skipConnected = false,\n onProgress,\n}: UseBatchConnectOptions): UseBatchConnectResult {\n assert(Array.isArray(connectors), 'useBatchConnect: connectors must be an array');\n const { mutateAsync: connect } = useXConnect();\n const xConnectorsByChain = useXConnectorsByChain();\n const xConnections = useXConnections();\n\n const [status, setStatus] = useState<BatchOperationStatus>('idle');\n const [result, setResult] = useState<BatchConnectResult | null>(null);\n const inFlightRef = useRef<Promise<BatchConnectResult> | null>(null);\n\n // Keep `onProgress` in a ref so `run` doesn't need to list it as a dep —\n // consumers typically pass an inline function (new ref every render) and\n // rebuilding `run` each render would invalidate downstream `useEffect` deps.\n const onProgressRef = useRef(onProgress);\n onProgressRef.current = onProgress;\n\n const run = useCallback(async (): Promise<BatchConnectResult> => {\n // Concurrent-run guard — extensions share popup singletons, so a second\n // batch while one is in flight would race the first. Return the existing\n // promise so callers that double-click still get a result.\n if (inFlightRef.current) return inFlightRef.current;\n\n const batchPromise = (async () => {\n setStatus('running');\n const targets = resolveBatchTargets(connectors, xConnectorsByChain);\n const finalResult = await runBatchConnect(targets, {\n connect,\n isConnected: chainType => !!xConnections[chainType]?.xAccount.address,\n skipConnected,\n onProgress: event => onProgressRef.current?.(event),\n });\n setResult(finalResult);\n setStatus('done');\n return finalResult;\n })();\n\n inFlightRef.current = batchPromise;\n try {\n return await batchPromise;\n } finally {\n inFlightRef.current = null;\n }\n }, [connect, connectors, xConnectorsByChain, xConnections, skipConnected]);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setResult(null);\n }, []);\n\n return { run, status, result, reset };\n}\n","import { useCallback, useRef, useState } from 'react';\nimport { ChainTypeArr, type ChainType } from '@sodax/types';\nimport type { XConnection } from '@/types/index.js';\nimport type { IXConnector } from '@/types/interfaces.js';\nimport { matchesConnectorIdentifier } from '@/utils/matchConnectorIdentifier.js';\nimport { useXDisconnect, type UseXDisconnectArgs } from './useXDisconnect.js';\nimport { useXConnections } from './useXConnections.js';\nimport { useXConnectorsByChain } from './useXConnectorsByChain.js';\nimport type { BatchOperationStatus } from '@/types/batchStatus.js';\n\n/**\n * Per-target event emitted by `onProgress` as the batch advances.\n */\nexport type BatchDisconnectProgressEvent =\n | { chainType: ChainType; outcome: 'success' }\n | { chainType: ChainType; outcome: 'failure'; error: Error };\n\nexport type BatchDisconnectResult = {\n /** Chain types where disconnect succeeded. */\n successful: ChainType[];\n /** Chain types where disconnect threw, paired with the raw error. */\n failed: Array<{ chainType: ChainType; error: Error }>;\n};\n\nexport type UseBatchDisconnectOptions = {\n /**\n * Wallet brand identifiers to scope the disconnect (e.g. `'hana'`,\n * `'xverse'`). Matched via case-insensitive substring against\n * `connector.id` and `connector.name` — see {@link matchesConnectorIdentifier}.\n * Only chains whose *currently active* connector matches at least one\n * identifier are disconnected.\n *\n * Omit this field to disconnect every currently-connected chain regardless\n * of which wallet is active.\n *\n * To target a specific connector (not a brand), use\n * `useXConnectors(chainType).find(c => c.id === '...')` + `useXDisconnect`\n * directly instead of this API.\n *\n * @example ['hana'] // disconnect every chain Hana is connected on\n * @example ['hana', 'xverse'] // disconnect chains with Hana OR Xverse active\n */\n connectors?: readonly string[];\n /**\n * Fires once per target as the batch progresses. Errors thrown from\n * `onProgress` are caught and logged — they do NOT fail the batch.\n */\n onProgress?: (event: BatchDisconnectProgressEvent) => void;\n};\n\nexport type UseBatchDisconnectResult = {\n run: () => Promise<BatchDisconnectResult>;\n status: BatchOperationStatus;\n result: BatchDisconnectResult | null;\n /**\n * Clears `status` and `result`. Calling `reset()` while `status === 'running'`\n * only clears the observable state — the in-flight batch is NOT aborted\n * (there is no cancellation signal). When the batch eventually resolves,\n * `status` flips to `'done'` and `result` populates again. Typical usage\n * is to call `reset()` only after `status === 'done'`.\n */\n reset: () => void;\n};\n\n/**\n * Pure helper — returns the list of currently-connected chains whose active\n * connector matches at least one supplied identifier. When `connectors` is\n * `undefined`, every currently-connected chain is returned.\n * Extracted for testability without mounting React.\n */\nexport function resolveDisconnectTargets(\n connectors: readonly string[] | undefined,\n xConnections: Partial<Record<ChainType, XConnection>>,\n xConnectorsByChain: Partial<Record<ChainType, IXConnector[]>>,\n): ChainType[] {\n const targets: ChainType[] = [];\n for (const chainType of ChainTypeArr) {\n const connection = xConnections[chainType];\n if (!connection?.xAccount.address) continue;\n if (!connectors) {\n targets.push(chainType);\n continue;\n }\n const activeConnector = xConnectorsByChain[chainType]?.find(c => c.id === connection.xConnectorId);\n if (!activeConnector) continue;\n if (connectors.some(identifier => matchesConnectorIdentifier(activeConnector, identifier))) {\n targets.push(chainType);\n }\n }\n return targets;\n}\n\n/**\n * Pure helper — runs disconnect sequentially over `chainTypes`. `onProgress`\n * fires per target and is isolated from the batch result — a throwing callback\n * is logged, never propagated.\n * Extracted for testability.\n */\nexport async function runBatchDisconnect(\n chainTypes: readonly ChainType[],\n disconnect: (args: UseXDisconnectArgs) => Promise<void>,\n onProgress?: (event: BatchDisconnectProgressEvent) => void,\n): Promise<BatchDisconnectResult> {\n const successful: ChainType[] = [];\n const failed: BatchDisconnectResult['failed'] = [];\n\n const emit = (event: BatchDisconnectProgressEvent): void => {\n if (!onProgress) return;\n try {\n onProgress(event);\n } catch (err) {\n console.error('[useBatchDisconnect] onProgress threw:', err);\n }\n };\n\n for (const chainType of chainTypes) {\n try {\n await disconnect({ xChainType: chainType });\n successful.push(chainType);\n emit({ chainType, outcome: 'success' });\n } catch (raw) {\n const error = raw instanceof Error ? raw : new Error(String(raw));\n failed.push({ chainType, error });\n emit({ chainType, outcome: 'failure', error });\n }\n }\n\n return { successful, failed };\n}\n\n/**\n * Disconnect chains sequentially, optionally scoped to a specific wallet.\n * Mirrors {@link useBatchConnect}'s identifier-based API:\n *\n * @example\n * // Disconnect every chain Hana is currently connected on\n * const { run } = useBatchDisconnect({ connectors: ['hana'] });\n * await run();\n *\n * @example\n * // Disconnect every currently-connected chain regardless of wallet\n * const { run } = useBatchDisconnect();\n * await run();\n *\n * Best-effort: errors are collected, not thrown. `run()` is idempotent — a\n * double-invocation while one batch is in flight returns the same promise.\n */\nexport function useBatchDisconnect({\n connectors,\n onProgress,\n}: UseBatchDisconnectOptions = {}): UseBatchDisconnectResult {\n const disconnect = useXDisconnect();\n const xConnections = useXConnections();\n const xConnectorsByChain = useXConnectorsByChain();\n\n const [status, setStatus] = useState<BatchOperationStatus>('idle');\n const [result, setResult] = useState<BatchDisconnectResult | null>(null);\n const inFlightRef = useRef<Promise<BatchDisconnectResult> | null>(null);\n\n const onProgressRef = useRef(onProgress);\n onProgressRef.current = onProgress;\n\n const run = useCallback(async (): Promise<BatchDisconnectResult> => {\n if (inFlightRef.current) return inFlightRef.current;\n\n const batchPromise = (async () => {\n setStatus('running');\n const targets = resolveDisconnectTargets(connectors, xConnections, xConnectorsByChain);\n const finalResult = await runBatchDisconnect(targets, disconnect, event => onProgressRef.current?.(event));\n setResult(finalResult);\n setStatus('done');\n return finalResult;\n })();\n\n inFlightRef.current = batchPromise;\n try {\n return await batchPromise;\n } finally {\n inFlightRef.current = null;\n }\n }, [connectors, disconnect, xConnections, xConnectorsByChain]);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setResult(null);\n }, []);\n\n return { run, status, result, reset };\n}\n","import type { ChainType } from '@sodax/types';\nimport { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\nimport { immer } from 'zustand/middleware/immer';\nimport type { XConnector } from './core/index.js';\nimport type { XAccount } from './types/index.js';\n\n/**\n * Discriminated union for the wallet-modal flow state machine.\n * See `useWalletModal()` for transitions and consumer usage.\n */\nexport type WalletModalState =\n | { kind: 'closed' }\n | { kind: 'chainSelect' }\n | { kind: 'walletSelect'; chainType: ChainType }\n | { kind: 'connecting'; chainType: ChainType; connector: XConnector }\n | { kind: 'success'; chainType: ChainType; connector: XConnector; account: XAccount }\n | { kind: 'error'; chainType: ChainType; connector: XConnector; error: Error };\n\ntype WalletModalStore = {\n walletModal: WalletModalState;\n\n open: () => void;\n close: () => void;\n /**\n * Smart back: walletSelect → chainSelect; connecting/error → walletSelect\n * (preserve chainType so the user can pick another wallet or retry);\n * success → closed; closed/chainSelect → no-op.\n */\n back: () => void;\n selectChain: (chainType: ChainType) => void;\n setConnecting: (chainType: ChainType, connector: XConnector) => void;\n setSuccess: (chainType: ChainType, connector: XConnector, account: XAccount) => void;\n setError: (chainType: ChainType, connector: XConnector, error: Error) => void;\n};\n\n/**\n * Ephemeral UI store for the wallet-modal flow. Kept separate from\n * `useXWalletStore` because modal lifecycle is per-session UI state — it\n * has no business being co-located with persistent connection data and\n * doesn't share the persist/hydration concerns.\n *\n * Direct store access is intentionally not part of the package's public\n * surface; consumers go through `useWalletModal()`.\n */\nexport const useWalletModalStore = create<WalletModalStore>()(\n devtools(\n immer(set => ({\n walletModal: { kind: 'closed' },\n\n open: () => {\n set(state => {\n state.walletModal = { kind: 'chainSelect' };\n });\n },\n\n close: () => {\n set(state => {\n state.walletModal = { kind: 'closed' };\n });\n },\n\n back: () => {\n set(state => {\n const current = state.walletModal;\n switch (current.kind) {\n case 'walletSelect':\n state.walletModal = { kind: 'chainSelect' };\n return;\n case 'connecting':\n case 'error':\n state.walletModal = { kind: 'walletSelect', chainType: current.chainType };\n return;\n case 'success':\n state.walletModal = { kind: 'closed' };\n return;\n // 'closed' and 'chainSelect' have nowhere to go back to.\n }\n });\n },\n\n selectChain: (chainType: ChainType) => {\n set(state => {\n state.walletModal = { kind: 'walletSelect', chainType };\n });\n },\n\n setConnecting: (chainType: ChainType, connector: XConnector) => {\n set(state => {\n state.walletModal = { kind: 'connecting', chainType, connector };\n });\n },\n\n setSuccess: (chainType: ChainType, connector: XConnector, account: XAccount) => {\n set(state => {\n state.walletModal = { kind: 'success', chainType, connector, account };\n });\n },\n\n setError: (chainType: ChainType, connector: XConnector, error: Error) => {\n set(state => {\n state.walletModal = { kind: 'error', chainType, connector, error };\n });\n },\n })),\n { name: 'wallet-modal-store' },\n ),\n);\n","import { useCallback, useRef } from 'react';\nimport type { ChainType } from '@sodax/types';\nimport type { XConnector } from '@/core/XConnector.js';\nimport type { XAccount, XConnection } from '@/types/index.js';\nimport { useWalletModalStore, type WalletModalState } from '@/useWalletModalStore.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\nimport { useXConnect } from './useXConnect.js';\n\n/** Default max wait for the Hydrator to populate `xConnections` after a\n * provider-managed connect. Overridable per consumer via\n * `UseWalletModalOptions.hydrationTimeoutMs`. */\nconst DEFAULT_HYDRATION_TIMEOUT_MS = 5_000;\n\n/**\n * Subscribe to `useXWalletStore` for a connection whose `xConnectorId`\n * matches the connector we just asked to connect AND whose `xAccount` has\n * a non-empty address. Resolves with the account when it appears or\n * `undefined` when the timeout expires.\n *\n * Matching on `xConnectorId` is required — checking address alone is unsafe\n * when the chain already has a residual connection from a previous wallet\n * (e.g. user is on MetaMask for EVM and picks Rabby through the modal).\n * The existing `xConnections.EVM.xAccount.address` would otherwise satisfy\n * the wait immediately and the modal would `setSuccess(rabby, metamask_account)`\n * before the Hydrator replaces the connection.\n *\n * Provider-managed chains (EVM, Solana, Sui) populate `xConnections` via\n * their Hydrator components — `useXConnect`'s mutation resolves with\n * `undefined` because the account materializes asynchronously after wagmi\n * / wallet-adapter reports the connect as ready.\n */\nfunction waitForXConnection(\n chainType: ChainType,\n expectedConnectorId: string,\n timeoutMs = DEFAULT_HYDRATION_TIMEOUT_MS,\n): Promise<XAccount | undefined> {\n return new Promise(resolve => {\n let settled = false;\n const matches = (connection: XConnection | undefined): boolean =>\n connection?.xConnectorId === expectedConnectorId && !!connection?.xAccount?.address;\n\n const finish = (account: XAccount | undefined) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n unsubscribe();\n resolve(account);\n };\n\n const timer = setTimeout(() => finish(undefined), timeoutMs);\n\n const unsubscribe = useXWalletStore.subscribe(state => {\n const connection = state.xConnections[chainType];\n if (matches(connection)) finish(connection?.xAccount);\n });\n\n // Immediate check — Hydrator may have already populated synchronously,\n // but only accept it when the connector identity matches. A residual\n // connection from a previously-connected wallet must NOT satisfy this wait.\n const initial = useXWalletStore.getState().xConnections[chainType];\n if (matches(initial)) finish(initial?.xAccount);\n });\n}\n\nexport type { WalletModalState };\n\nexport type UseWalletModalOptions = {\n /**\n * Fires once after a successful connect attempt initiated through the modal,\n * before the consumer transitions away from the `success` state. Side-effects\n * the SDK shouldn't bake in (registration check, terms-of-service modal, app\n * routing) belong here.\n */\n onConnected?: (chainType: ChainType, account: XAccount) => void | Promise<void>;\n /**\n * How long (ms) to wait for a provider-managed chain's Hydrator to populate\n * `xConnections[chainType]` with an account whose `xConnectorId` matches the\n * connector the user picked. Defaults to 5000ms. Raise this for slow\n * networks / wallets that take a long time to surface the account after\n * the user approves the popup. Ignored for non-provider chains (Bitcoin,\n * ICON, Stellar, NEAR, Stacks, Injective) — those return the account\n * directly from `connect()`.\n */\n hydrationTimeoutMs?: number;\n};\n\n/**\n * WalletConnect UX caveat\n * -----------------------\n * When the user picks an EVM WalletConnect connector, wagmi opens its own QR\n * modal as a third-party UI. While that QR modal is visible, `useWalletModal`\n * stays in `connecting` — the consumer may prefer to auto-hide the Sodax\n * modal to avoid two dialogs stacking. Detect WC via\n * `state.kind === 'connecting' && state.connector.id === 'walletConnect'`\n * (wagmi's connector id) and conditionally render `null` until the attempt\n * resolves. Not wired into the SDK because partners integrating their own\n * dialog system decide the policy (hide, fade, keep).\n */\n\nexport type UseWalletModalResult = {\n /** Discriminated union — switch on `state.kind` for type-narrowed fields. */\n state: WalletModalState;\n /** Transition `closed → chainSelect`. No-op if already open. */\n open: () => void;\n /** Transition any → `closed`. */\n close: () => void;\n /**\n * Smart back: walletSelect → chainSelect; connecting/error → walletSelect\n * (preserve chainType so user can pick another wallet or retry); success → closed;\n * closed/chainSelect → no-op.\n */\n back: () => void;\n /** Transition `chainSelect → walletSelect(chainType)`. */\n selectChain: (chainType: ChainType) => void;\n /**\n * Transition `walletSelect → connecting → success | error`. Composes\n * `useXConnect` internally; failures populate `state.error` instead of\n * throwing.\n *\n * Concurrency:\n * - Same connector already in flight → returns the same promise (dedupes\n * double-clicks).\n * - Different connector clicked before the previous attempt settles → starts\n * a new attempt; the previous attempt's late resolution is dropped and\n * does not overwrite the current state.\n * - User calls `back()` / `close()` mid-connect → the in-flight attempt's\n * late resolution is dropped and does not transition to `success`/`error`.\n *\n * `back()` / `close()` mid-connect caveat: if the wallet already approved\n * before the transition, `xConnections` is populated by `useXConnect` /\n * the Hydrator independently of the modal state machine. Leaving the\n * `connecting` state only drops the pending `success`/`error` transition\n * — the account stays connected. Call `useXDisconnect(chainType)` from\n * the same handler that calls `back()` / `close()` if a full rollback is\n * required.\n */\n selectWallet: (connector: XConnector) => Promise<XAccount | undefined>;\n /** Re-runs the last `selectWallet` from an `error` state. No-op otherwise. */\n retry: () => Promise<XAccount | undefined>;\n};\n\n/**\n * Headless modal lifecycle for multi-chain wallet connection. Owns the flow\n * `closed → chainSelect → walletSelect → connecting → success | error` as a\n * Zustand slice so multiple components (header CTA, inline buttons, settings)\n * see the same lifecycle without prop drilling.\n *\n * The hook is render-agnostic — pair it with any dialog/drawer/inline UI:\n *\n * @example\n * const modal = useWalletModal({\n * onConnected: async (chainType, account) => {\n * // App-specific side effect (e.g. terms-of-service check)\n * await registerIfNew(chainType, account.address);\n * },\n * });\n *\n * switch (modal.state.kind) {\n * case 'closed': return <button onClick={modal.open}>Connect</button>;\n * case 'chainSelect': return <ChainList onPick={modal.selectChain} onBack={modal.close} />;\n * case 'walletSelect': return <WalletList chainType={modal.state.chainType} onPick={modal.selectWallet} onBack={modal.back} />;\n * case 'connecting': return <Spinner connector={modal.state.connector} />;\n * case 'success': return null; // onConnected fired; consumer can call modal.close()\n * case 'error': return <ErrorView error={modal.state.error} onRetry={modal.retry} onBack={modal.back} />;\n * }\n */\nexport function useWalletModal({\n onConnected,\n hydrationTimeoutMs,\n}: UseWalletModalOptions = {}): UseWalletModalResult {\n const state = useWalletModalStore(s => s.walletModal);\n const open = useWalletModalStore(s => s.open);\n const close = useWalletModalStore(s => s.close);\n const back = useWalletModalStore(s => s.back);\n const selectChain = useWalletModalStore(s => s.selectChain);\n const setConnecting = useWalletModalStore(s => s.setConnecting);\n const setSuccess = useWalletModalStore(s => s.setSuccess);\n const setError = useWalletModalStore(s => s.setError);\n\n const { mutateAsync: connect } = useXConnect();\n\n // Dedupe concurrent `selectWallet` calls for the SAME connector. Calls with\n // a DIFFERENT connector are allowed to start a new attempt — the previous\n // attempt is cancelled via the `isStillCurrent` state check below.\n const inFlightRef = useRef<{ connector: XConnector; promise: Promise<XAccount | undefined> } | null>(null);\n\n const selectWallet = useCallback(\n async (connector: XConnector): Promise<XAccount | undefined> => {\n // Same connector already in flight → return the existing promise so\n // double-clicks don't open two popups or race two state writes.\n if (inFlightRef.current?.connector === connector) {\n return inFlightRef.current.promise;\n }\n\n // Pre-check installation. Some legacy connectors (e.g. IconHanaXConnector)\n // imperatively `window.open(installUrl)` from inside `connect()` when\n // the extension isn't injected — that hides the error and leaves the\n // state machine stuck in `connecting` until the timeout. Surface it\n // up-front so the modal renders an actionable error immediately.\n if (!connector.isInstalled) {\n const installHint = connector.installUrl ? ' Install the extension and reload the page.' : '';\n setError(\n connector.xChainType,\n connector,\n new Error(`${connector.name} is not installed.${installHint}`),\n );\n return undefined;\n }\n\n // Read the store directly (not the React snapshot) so `isStillCurrent`\n // sees user-driven transitions — `back()` / `close()` / a subsequent\n // `selectWallet(otherConnector)` — that happen while the connect promise\n // is in flight. Without this, a late-resolving connect would overwrite\n // the user's cancel and the modal would jump to `success` / `error`\n // (and `onConnected` would fire) for a flow the user walked away from.\n const isStillCurrent = (): boolean => {\n const current = useWalletModalStore.getState().walletModal;\n return current.kind === 'connecting' && current.connector === connector;\n };\n\n const promise = (async (): Promise<XAccount | undefined> => {\n setConnecting(connector.xChainType, connector);\n try {\n // Non-provider-managed chains (Bitcoin, ICON, Stellar, NEAR, Stacks,\n // Injective) return the account directly. Provider-managed chains\n // (EVM, Solana, Sui) resolve with `undefined` and populate\n // xConnections via their Hydrator — wait for that, scoped to this\n // connector's id so a residual connection from a previously-connected\n // wallet on the same chain doesn't satisfy the wait.\n const direct = await connect(connector);\n if (!isStillCurrent()) return undefined;\n\n const account = direct?.address\n ? direct\n : await waitForXConnection(connector.xChainType, connector.id, hydrationTimeoutMs);\n if (!isStillCurrent()) return undefined;\n\n if (account?.address) {\n setSuccess(connector.xChainType, connector, account);\n // `onConnected` runs app-side effects (registration check, ToS,\n // routing). A throw here must NOT downgrade a successful connect\n // to `error` — the connection is already persisted in the store\n // and the user is really connected. Log and keep `success`.\n try {\n await onConnected?.(connector.xChainType, account);\n } catch (callbackError) {\n console.error('[useWalletModal] onConnected threw — connection is still successful:', callbackError);\n }\n return account;\n }\n\n // Hydrator never populated within the timeout window — most likely\n // the user closed the popup or the wallet failed silently.\n setError(\n connector.xChainType,\n connector,\n new Error('Connection did not complete. Did you close the wallet popup?'),\n );\n return undefined;\n } catch (raw) {\n if (!isStillCurrent()) return undefined;\n const error = raw instanceof Error ? raw : new Error(String(raw));\n setError(connector.xChainType, connector, error);\n return undefined;\n } finally {\n // Only clear the slot if it still holds this connector's promise —\n // a `selectWallet(otherConnector)` call mid-flight reassigns it, and\n // we mustn't clobber the new entry on our late finally.\n if (inFlightRef.current?.connector === connector) {\n inFlightRef.current = null;\n }\n }\n })();\n\n inFlightRef.current = { connector, promise };\n return promise;\n },\n [connect, onConnected, hydrationTimeoutMs, setConnecting, setError, setSuccess],\n );\n\n const retry = useCallback(async (): Promise<XAccount | undefined> => {\n if (state.kind !== 'error') return undefined;\n return selectWallet(state.connector);\n }, [state, selectWallet]);\n\n return { state, open, close, back, selectChain, selectWallet, retry };\n}\n","import type { ChainType } from '@sodax/types';\nimport type { XService } from '@/core/index.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\nexport type UseXServiceOptions = {\n xChainType?: ChainType;\n};\n\n/**\n * Returns the chain-specific `XService` instance for advanced reads — balance lookups\n * (`xService.getBalance(address, xToken)`), connector enumeration, or chain-specific\n * methods on concrete subclasses.\n *\n * Most consumers don't need this — `useWalletProvider` is the higher-level bridge to\n * `@sodax/sdk`, and `useXConnectors` returns the connector list directly. Reach for\n * `useXService` only when you need the service object itself (e.g. passing it to\n * `useXBalances` from `@sodax/dapp-kit`).\n *\n * Returns `undefined` when `xChainType` is omitted or the chain isn't enabled.\n */\nexport function useXService({ xChainType }: UseXServiceOptions = {}): XService | undefined {\n const xService = useXWalletStore(state => (xChainType ? state.xServices[xChainType] : undefined));\n return xService;\n}\n","import type { ChainType } from '@sodax/types';\nimport type { XService } from '@/core/index.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\n/**\n * Returns the `XService` instance for every enabled chain, keyed by `ChainType`.\n *\n * Each service singleton owns its connector list and exposes balance readers; concrete\n * subclasses (e.g. `EvmXService`, `BitcoinXService`) carry chain-specific methods. For\n * a single chain, prefer `useXService` which is keyed by `xChainType` directly.\n */\nexport function useXServices(): Partial<Record<ChainType, XService>> {\n return useXWalletStore(state => state.xServices);\n}\n","import { createContext, useContext } from 'react';\nimport type { ChainType } from '@sodax/types';\nimport type { SodaxWalletConfig } from '@/types/config.js';\n\n/**\n * Config-level context — answers \"what did the consumer configure?\" (before service init).\n * For service-level queries (is a chain's XService initialized?), use `state.enabledChains` from useXWalletStore.\n * Both sources agree in practice since they're populated from the same config at the same time.\n */\nconst WalletConfigContext = createContext<SodaxWalletConfig | null>(null);\n\nexport const WalletConfigProvider = WalletConfigContext.Provider;\n\nexport function useWalletConfig(): SodaxWalletConfig {\n const config = useContext(WalletConfigContext);\n if (!config) {\n throw new Error('useWalletConfig must be used within SodaxWalletProvider');\n }\n return config;\n}\n\n/** A chain type is \"enabled\" only when its slot is present in SodaxWalletConfig. */\nexport function useIsChainEnabled(chainType: ChainType): boolean {\n const config = useWalletConfig();\n return config[chainType] !== undefined;\n}\n\n/** See {@link useIsChainEnabled} for the \"enabled\" semantic. */\nexport function useEnabledChainTypes(): ChainType[] {\n const config = useWalletConfig();\n return (Object.keys(config) as ChainType[]).filter(t => config[t] !== undefined);\n}\n","import { InjectiveXService } from '@/xchains/injective/index.js';\nimport { Wallet } from '@injectivelabs/wallet-base';\nimport { useEffect, useState } from 'react';\nimport { useXService } from './useXService.js';\nimport { assert, hasFunctionProperty, isRecord } from '@/shared/guards.js';\n\n/**\n * React hook that returns the current Ethereum chain ID when using MetaMask wallet for Injective.\n * Listens for chain changes and updates the state accordingly.\n *\n * @remarks\n * This hook only works with MetaMask wallet and requires the window.ethereum provider to be available.\n * For other wallets or when MetaMask is not available, it returns null.\n *\n * @returns The current Ethereum chain ID as a number, or null if not available/connected\n */\nexport default function useEthereumChainId(): number | null {\n const xService = useXService({ xChainType: 'INJECTIVE' });\n const injectiveXService = xService instanceof InjectiveXService ? xService : undefined;\n const [ethereumChainId, setEthereumChainId] = useState<number | null>(null);\n useEffect(() => {\n if (!injectiveXService?.walletStrategy?.getWallet()) return;\n const walletStrategy = injectiveXService.walletStrategy;\n if (walletStrategy.getWallet() !== Wallet.Metamask) return;\n\n const getEthereumChainId = async () => {\n try {\n const chainId = await walletStrategy.getEthereumChainId();\n setEthereumChainId(Number.parseInt(chainId));\n } catch (error) {\n console.warn('Failed to get Ethereum chain ID:', error);\n }\n };\n getEthereumChainId();\n\n try {\n const strategy = walletStrategy.getStrategy();\n const isEvmStrategy = isRecord(strategy) && hasFunctionProperty(strategy, 'onChainIdChanged');\n assert(isEvmStrategy, '[useEthereumChainId] walletStrategy.getStrategy() is not an EvmWalletStrategy');\n strategy.onChainIdChanged(getEthereumChainId);\n } catch (error) {\n console.warn('Failed to subscribe to chain ID changes:', error);\n }\n }, [injectiveXService?.walletStrategy]);\n\n return ethereumChainId;\n}\n","import { useCallback, useMemo } from 'react';\nimport { useAccount, useSwitchChain } from 'wagmi';\nimport { baseChainInfo, type SpokeChainKey } from '@sodax/types';\nimport { getXChainType } from '@/actions/index.js';\nimport { InjectiveXService } from '@/xchains/injective/index.js';\nimport { useXService } from '@/hooks/useXService.js';\nimport { useIsChainEnabled } from '@/context/WalletConfigContext.js';\nimport useEthereumChainId from './useEthereumChainId.js';\nimport { mainnet } from 'viem/chains';\n// EIP1193Provider is the standard interface for injected ethereum providers (MetaMask, etc).\n// It types .request() for JSON-RPC calls and .on()/.removeListener() for events.\nimport type { EIP1193Provider } from 'viem';\nimport { Wallet } from '@injectivelabs/wallet-base';\nimport { assert, hasFunctionProperty, isRecord } from '@/shared/guards.js';\n\nexport type UseEvmSwitchChainOptions = {\n xChainId: SpokeChainKey;\n};\n\nexport type UseEvmSwitchChainReturn = {\n isWrongChain: boolean;\n handleSwitchChain: () => void;\n};\n\nconst EVM_DISABLED_RESULT: UseEvmSwitchChainReturn = { isWrongChain: false, handleSwitchChain: () => {} };\n\nconst isEip1193Provider = (value: unknown): value is EIP1193Provider => {\n return isRecord(value) && hasFunctionProperty(value, 'request') && hasFunctionProperty(value, 'on');\n};\n\nconst getInjectedEthereumProvider = (): EIP1193Provider => {\n const maybeEthereum = (window as unknown as Record<string, unknown>).ethereum;\n assert(isEip1193Provider(maybeEthereum), '[useEvmSwitchChain] window.ethereum is not an EIP-1193 provider');\n return maybeEthereum;\n};\n\nexport const switchEthereumChain = async (): Promise<unknown> => {\n const metamaskProvider = getInjectedEthereumProvider();\n\n return await Promise.race([\n metamaskProvider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: '0x1' }],\n }),\n new Promise<void>(resolve => {\n // EIP-1193 standard event: 'chainChanged' fires with a hex chain ID string.\n // The old code used 'change' with { chain: { id: number } } — not a real EIP-1193 event.\n const handler = (chainId: string) => {\n if (chainId === '0x1') {\n metamaskProvider.removeListener('chainChanged', handler);\n resolve();\n }\n };\n metamaskProvider.on('chainChanged', handler);\n }),\n ]);\n};\n\n/**\n * Hook to handle EVM chain switching functionality.\n * Safe to call when EVM is disabled — returns no-op values.\n *\n * Conditionally delegates to useEvmSwitchChainInner which uses wagmi hooks\n * (useAccount, useSwitchChain) that require WagmiProvider. When EVM is disabled,\n * WagmiProvider is not mounted, so we must not call those hooks.\n *\n * This technically violates Rules of Hooks (conditional hook call), but is safe\n * because `evmEnabled` is derived from config which is immutable after mount —\n * the branch never changes during the component's lifetime.\n */\nexport function useEvmSwitchChain({ xChainId }: UseEvmSwitchChainOptions): UseEvmSwitchChainReturn {\n const evmEnabled = useIsChainEnabled('EVM');\n\n if (!evmEnabled) {\n return EVM_DISABLED_RESULT;\n }\n\n return useEvmSwitchChainInner({ xChainId });\n}\n\nfunction useEvmSwitchChainInner({ xChainId }: UseEvmSwitchChainOptions): UseEvmSwitchChainReturn {\n const xChainType = getXChainType(xChainId);\n const expectedChainId = baseChainInfo[xChainId].chainId;\n // EVM chain uses expectedChainId for switchChain(); assert it's numeric.\n // Injective uses Ethereum mainnet separately. Other chain types — hook is a no-op.\n if (xChainType === 'EVM') {\n assert(typeof expectedChainId === 'number', '[useEvmSwitchChain] EVM chain must have numeric chainId');\n }\n\n const xService = useXService({ xChainType: 'INJECTIVE' });\n const injectiveXService = xService instanceof InjectiveXService ? xService : undefined;\n const ethereumChainId = useEthereumChainId();\n\n const { chainId } = useAccount();\n const isWrongChain = useMemo(() => {\n return (\n (xChainType === 'EVM' && chainId !== expectedChainId) ||\n (xChainType === 'INJECTIVE' &&\n injectiveXService !== undefined &&\n injectiveXService.walletStrategy.getWallet() === Wallet.Metamask &&\n ethereumChainId !== mainnet.id)\n );\n }, [xChainType, chainId, expectedChainId, ethereumChainId, injectiveXService]);\n\n const { switchChain } = useSwitchChain();\n\n const handleSwitchChain = useCallback(() => {\n if (xChainType === 'INJECTIVE') {\n switchEthereumChain();\n } else if (xChainType === 'EVM' && typeof expectedChainId === 'number') {\n switchChain({ chainId: expectedChainId });\n }\n }, [switchChain, expectedChainId, xChainType]);\n\n return useMemo(\n () => ({\n isWrongChain,\n handleSwitchChain,\n }),\n [isWrongChain, handleSwitchChain],\n );\n}\n","import type { ChainType, GetChainType, GetWalletProviderType, IWalletProvider, SpokeChainKey } from '@sodax/types';\nimport { assert } from '@/shared/guards.js';\nimport { getXChainType } from '@/actions/index.js';\nimport { useXWalletStore, type GetWalletProviderReturnType } from '@/useXWalletStore.js';\n\nexport type UseWalletProviderOptions = {\n xChainId?: SpokeChainKey;\n xChainType?: ChainType;\n};\n\nconst warnedChains = new Set<ChainType>();\n\n/**\n * Returns the typed `IXxxWalletProvider` instance for the requested chain — ready to plug\n * into any `@sodax/sdk` call's `walletProvider` slot.\n *\n * Pass either `xChainId` (a `SpokeChainKey`) or `xChainType` (a `ChainType` family),\n * never both. The chain key form gives the narrowest TypeScript inference (e.g.\n * `xChainId: ChainKeys.BSC_MAINNET` → `IEvmWalletProvider | undefined`).\n *\n * Returns `undefined` when:\n * - The chain isn't enabled in `SodaxWalletProvider` config (logs a one-time warning).\n * - No wallet is connected for that chain yet.\n *\n * For provider-managed chains (EVM/Solana/Sui), the returned provider is rebuilt by the\n * Hydrator whenever the underlying client changes (chain switch, wallet swap). For\n * non-provider chains, the provider is created as a side-effect of `setXConnection`.\n *\n * @see {@link https://github.com/icon-project/sodax-sdks/blob/main/packages/wallet-sdk-react/docs/WALLET_PROVIDER_BRIDGE.md | Wallet Provider Bridge}\n */\nexport function useWalletProvider<S extends SpokeChainKey>(options: { xChainId: S; xChainType?: never }):\n | GetWalletProviderType<GetChainType<S>>\n | undefined;\nexport function useWalletProvider<K extends ChainType | undefined>(options?: { xChainId?: never; xChainType?: K }):\n | GetWalletProviderReturnType<K>\n | undefined;\nexport function useWalletProvider({\n xChainId,\n xChainType,\n}: UseWalletProviderOptions = {}): IWalletProvider | undefined {\n assert(!(xChainId && xChainType), '[useWalletProvider] pass either xChainId or xChainType, not both');\n const target = xChainType ?? (xChainId ? getXChainType(xChainId) : undefined);\n\n return useXWalletStore(state => {\n if (!target) return undefined;\n if (!state.enabledChains.includes(target) && !warnedChains.has(target)) {\n warnedChains.add(target);\n console.warn(\n `[useWalletProvider] chain \"${target}\" is not enabled in SodaxWalletProvider config.chains — returning undefined`,\n );\n }\n return state.getWalletProvider(target);\n });\n}\n","import { useMutation, type UseMutationResult } from '@tanstack/react-query';\nimport type { ChainType } from '@sodax/types';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\ntype SignMessageReturnType = `0x${string}` | Uint8Array | string | undefined;\n\nexport type XSignMessageVariables = {\n xChainType: ChainType;\n message: string;\n};\n\n/**\n * React Query mutation that delegates message signing to the connected wallet via\n * `ChainActions.signMessage` — registered per chain by the `chainRegistry` (non-provider\n * chains) or by the `<Chain>Actions` component (provider-managed chains).\n *\n * The signature shape varies by chain: hex `\\`0x${string}\\`` for EVM, `Uint8Array` for\n * Solana, base64 `string` for Stellar/Sui, etc. Branch on `xChainType` when consuming.\n *\n * **Bitcoin auto-selects** between BIP-322 (P2WPKH/P2TR) and ECDSA (P2SH/P2PKH) based\n * on the connected address type — same dispatch logic as the SDK's\n * `BitcoinSpokeProvider.authenticateWithWallet`.\n *\n * **Returns `undefined`** when the chain doesn't implement `signMessage` — currently\n * only ICON (Hana wallet exposes no signing API). A one-time `console.warn` accompanies\n * the `undefined`.\n *\n * @see {@link https://github.com/icon-project/sodax-sdks/blob/main/packages/wallet-sdk-react/docs/SIGN_MESSAGE.md | Sign Message}\n */\nexport function useXSignMessage(): UseMutationResult<SignMessageReturnType, Error, XSignMessageVariables, unknown> {\n const actionsRegistry = useXWalletStore(state => state.chainActions);\n\n return useMutation({\n mutationFn: async ({ xChainType, message }: XSignMessageVariables) => {\n const chainActions = actionsRegistry[xChainType];\n if (!chainActions?.signMessage) {\n console.warn(`[useXSignMessage] signMessage not supported for chain \"${xChainType}\"`);\n return undefined;\n }\n return await chainActions.signMessage(message);\n },\n });\n}\n","import { useMemo } from 'react';\nimport { BitcoinXConnector } from './BitcoinXConnector.js';\nimport { useXService } from '@/hooks/index.js';\n\n/**\n * Hook to return available Bitcoin wallet connectors from the globally registered xService.\n */\nexport function useBitcoinXConnectors(): BitcoinXConnector[] {\n const xService = useXService({ xChainType: 'BITCOIN' });\n\n return useMemo(() => {\n const connectors = xService?.getXConnectors() ?? [];\n return connectors.filter((c): c is BitcoinXConnector => c instanceof BitcoinXConnector);\n }, [xService]);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-TZMKDXFA.mjs"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// src/core/XService.ts
|
|
2
|
+
var XService = class {
|
|
3
|
+
/** The blockchain type this service handles */
|
|
4
|
+
xChainType;
|
|
5
|
+
/** Available wallet connectors for this chain */
|
|
6
|
+
xConnectors = [];
|
|
7
|
+
constructor(xChainType) {
|
|
8
|
+
this.xChainType = xChainType;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Gets the balance of a specific token for an address
|
|
12
|
+
* @param address The wallet address to check
|
|
13
|
+
* @param xToken The token to get the balance for
|
|
14
|
+
* @returns Promise resolving to the token balance as a bigint
|
|
15
|
+
*/
|
|
16
|
+
async getBalance(address, xToken) {
|
|
17
|
+
return 0n;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Gets balances for multiple tokens for an address
|
|
21
|
+
* @param address The wallet address to check
|
|
22
|
+
* @param xTokens Array of tokens to get balances for
|
|
23
|
+
* @returns Promise resolving to object mapping token addresses to balances
|
|
24
|
+
*/
|
|
25
|
+
async getBalances(address, xTokens) {
|
|
26
|
+
if (!address) return {};
|
|
27
|
+
const balancePromises = xTokens.map(async (xToken) => {
|
|
28
|
+
const balance = await this.getBalance(address, xToken);
|
|
29
|
+
return { address: xToken.address, balance };
|
|
30
|
+
});
|
|
31
|
+
const balances = await Promise.all(balancePromises);
|
|
32
|
+
return balances.reduce((acc, { address: address2, balance }) => {
|
|
33
|
+
acc[address2] = balance;
|
|
34
|
+
return acc;
|
|
35
|
+
}, {});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Gets all available connectors for this chain
|
|
39
|
+
*/
|
|
40
|
+
getXConnectors() {
|
|
41
|
+
return this.xConnectors;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Sets the available connectors for this chain
|
|
45
|
+
*/
|
|
46
|
+
setXConnectors(xConnectors) {
|
|
47
|
+
this.xConnectors = xConnectors;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Gets a specific connector by its ID
|
|
51
|
+
* @param xConnectorId The connector ID to look up
|
|
52
|
+
* @returns The matching connector or undefined if not found
|
|
53
|
+
*/
|
|
54
|
+
getXConnectorById(xConnectorId) {
|
|
55
|
+
return this.getXConnectors().find((xConnector) => xConnector.id === xConnectorId);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// src/core/XConnector.ts
|
|
60
|
+
var XConnector = class {
|
|
61
|
+
/** The blockchain type this connector supports */
|
|
62
|
+
xChainType;
|
|
63
|
+
/** Display name of the wallet provider */
|
|
64
|
+
name;
|
|
65
|
+
/** Unique identifier for the connector */
|
|
66
|
+
_id;
|
|
67
|
+
/** Optional icon URL for the wallet provider */
|
|
68
|
+
_icon;
|
|
69
|
+
constructor(xChainType, name, id) {
|
|
70
|
+
this.xChainType = xChainType;
|
|
71
|
+
this.name = name;
|
|
72
|
+
this._id = id;
|
|
73
|
+
}
|
|
74
|
+
/** Get the unique identifier for this connector */
|
|
75
|
+
get id() {
|
|
76
|
+
return this._id;
|
|
77
|
+
}
|
|
78
|
+
/** Get the optional icon URL for this wallet provider */
|
|
79
|
+
get icon() {
|
|
80
|
+
return this._icon;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* True when the wallet extension backing this connector is installed.
|
|
84
|
+
* Default: true (for provider-managed chains where connector presence already
|
|
85
|
+
* implies install — EVM via EIP-6963, Solana/Sui via adapter discovery).
|
|
86
|
+
* Subclasses backed by extension injection (Bitcoin, ICON, Stacks) override
|
|
87
|
+
* this with a window probe.
|
|
88
|
+
*/
|
|
89
|
+
get isInstalled() {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
/** URL to install the wallet extension when missing. Subclasses override. */
|
|
93
|
+
get installUrl() {
|
|
94
|
+
return void 0;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export { XConnector, XService };
|
|
99
|
+
//# sourceMappingURL=chunk-X2MHIWXO.mjs.map
|
|
100
|
+
//# sourceMappingURL=chunk-X2MHIWXO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/XService.ts","../src/core/XConnector.ts"],"names":["address"],"mappings":";AAoBO,IAAe,WAAf,MAAiD;AAAA;AAAA,EAEtC,UAAA;AAAA;AAAA,EAGR,cAA6B,EAAC;AAAA,EAEtC,YAAY,UAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,UAAA,CAAW,OAAA,EAA6B,MAAA,EAAiC;AACpF,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,WAAA,CAAY,OAAA,EAA6B,OAAA,EAA6D;AACjH,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AAEtB,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,GAAA,CAAI,OAAM,MAAA,KAAU;AAClD,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,SAAS,MAAM,CAAA;AACrD,MAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,OAAA,EAAQ;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AAClD,IAAA,OAAO,QAAA,CAAS,OAA+B,CAAC,GAAA,EAAK,EAAE,OAAA,EAAAA,QAAAA,EAAS,SAAQ,KAAM;AAC5E,MAAA,GAAA,CAAIA,QAAO,CAAA,GAAI,OAAA;AACf,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,EAAG,EAAE,CAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKO,cAAA,GAAgC;AACrC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,eAAe,WAAA,EAAkC;AACtD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,kBAAkB,YAAA,EAA+C;AACtE,IAAA,OAAO,KAAK,cAAA,EAAe,CAAE,KAAK,CAAA,UAAA,KAAc,UAAA,CAAW,OAAO,YAAY,CAAA;AAAA,EAChF;AACF;;;ACrEO,IAAe,aAAf,MAAiD;AAAA;AAAA,EAEtC,UAAA;AAAA;AAAA,EAGA,IAAA;AAAA;AAAA,EAGA,GAAA;AAAA;AAAA,EAGA,KAAA;AAAA,EAEhB,WAAA,CAAY,UAAA,EAAuB,IAAA,EAAc,EAAA,EAAY;AAC3D,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,GAAA,GAAM,EAAA;AAAA,EACb;AAAA;AAAA,EAcA,IAAW,EAAA,GAAa;AACtB,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAW,IAAA,GAA2B;AACpC,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAW,WAAA,GAAuB;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAW,UAAA,GAAiC;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AACF","file":"chunk-X2MHIWXO.mjs","sourcesContent":["import type { ChainType, IXServiceBase, XToken } from '@sodax/types';\nimport type { IXConnector } from '@/types/interfaces.js';\n\n/**\n * Abstract base class for blockchain service implementations.\n *\n * The XService class serves as a foundation for implementing blockchain-specific services\n * in a multi-chain environment. It provides a standardized interface for:\n * 1. Managing wallet connectors for different blockchain types\n * 2. Querying token balances across different chains\n *\n * Each blockchain implementation (e.g., Solana, EVM chains) extends this class\n * to provide chain-specific functionality while maintaining a consistent interface.\n *\n * @abstract\n * @class XService\n * @property {ChainType} xChainType - The blockchain type this service handles (e.g., 'SOLANA', 'EVM')\n * @property {XConnector[]} xConnectors - Available wallet connectors for this chain\n *\n */\nexport abstract class XService implements IXServiceBase {\n /** The blockchain type this service handles */\n public readonly xChainType: ChainType;\n\n /** Available wallet connectors for this chain */\n private xConnectors: IXConnector[] = [];\n\n constructor(xChainType: ChainType) {\n this.xChainType = xChainType;\n }\n\n /**\n * Gets the balance of a specific token for an address\n * @param address The wallet address to check\n * @param xToken The token to get the balance for\n * @returns Promise resolving to the token balance as a bigint\n */\n public async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n return 0n;\n }\n\n /**\n * Gets balances for multiple tokens for an address\n * @param address The wallet address to check\n * @param xTokens Array of tokens to get balances for\n * @returns Promise resolving to object mapping token addresses to balances\n */\n public async getBalances(address: string | undefined, xTokens: readonly XToken[]): Promise<Record<string, bigint>> {\n if (!address) return {};\n\n const balancePromises = xTokens.map(async xToken => {\n const balance = await this.getBalance(address, xToken);\n return { address: xToken.address, balance };\n });\n\n const balances = await Promise.all(balancePromises);\n return balances.reduce<Record<string, bigint>>((acc, { address, balance }) => {\n acc[address] = balance;\n return acc;\n }, {});\n }\n\n /**\n * Gets all available connectors for this chain\n */\n public getXConnectors(): IXConnector[] {\n return this.xConnectors;\n }\n\n /**\n * Sets the available connectors for this chain\n */\n public setXConnectors(xConnectors: IXConnector[]): void {\n this.xConnectors = xConnectors;\n }\n\n /**\n * Gets a specific connector by its ID\n * @param xConnectorId The connector ID to look up\n * @returns The matching connector or undefined if not found\n */\n public getXConnectorById(xConnectorId: string): IXConnector | undefined {\n return this.getXConnectors().find(xConnector => xConnector.id === xConnectorId);\n }\n}\n","import type { ChainType } from '@sodax/types';\nimport type { XAccount } from '@/types/index.js';\nimport type { IXConnector } from '@/types/interfaces.js';\n\n/**\n * Base class for wallet provider connectors that handles connection management and wallet interactions\n *\n * @abstract\n * @class XConnector\n * @property {ChainType} xChainType - The blockchain type this connector supports\n * @property {string} name - Display name of the wallet provider\n * @property {string} _id - Unique identifier for the connector\n * @property {string | undefined} _icon - Optional icon URL for the wallet provider\n */\n\nexport abstract class XConnector implements IXConnector {\n /** The blockchain type this connector supports */\n public readonly xChainType: ChainType;\n\n /** Display name of the wallet provider */\n public readonly name: string;\n\n /** Unique identifier for the connector */\n public readonly _id: string;\n\n /** Optional icon URL for the wallet provider */\n public readonly _icon?: string;\n\n constructor(xChainType: ChainType, name: string, id: string) {\n this.xChainType = xChainType;\n this.name = name;\n this._id = id;\n }\n\n /**\n * Connects to the wallet provider\n * @returns Promise resolving to the connected account, or undefined if connection fails\n */\n abstract connect(): Promise<XAccount | undefined>;\n\n /**\n * Disconnects from the wallet provider\n */\n abstract disconnect(): Promise<void>;\n\n /** Get the unique identifier for this connector */\n public get id(): string {\n return this._id;\n }\n\n /** Get the optional icon URL for this wallet provider */\n public get icon(): string | undefined {\n return this._icon;\n }\n\n /**\n * True when the wallet extension backing this connector is installed.\n * Default: true (for provider-managed chains where connector presence already\n * implies install — EVM via EIP-6963, Solana/Sui via adapter discovery).\n * Subclasses backed by extension injection (Bitcoin, ICON, Stacks) override\n * this with a window probe.\n */\n public get isInstalled(): boolean {\n return true;\n }\n\n /** URL to install the wallet extension when missing. Subclasses override. */\n public get installUrl(): string | undefined {\n return undefined;\n }\n}\n"]}
|