@sodax/wallet-sdk-react 1.5.6-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.
Files changed (211) hide show
  1. package/README.md +103 -145
  2. package/ai-exported/AGENTS.md +122 -0
  3. package/ai-exported/integration/README.md +102 -0
  4. package/ai-exported/integration/ai-rules.md +136 -0
  5. package/ai-exported/integration/architecture.md +181 -0
  6. package/ai-exported/integration/examples/01-minimal-evm.tsx +75 -0
  7. package/ai-exported/integration/examples/02-multi-chain-modal.tsx +169 -0
  8. package/ai-exported/integration/examples/03-nextjs-app-router.tsx +99 -0
  9. package/ai-exported/integration/examples/04-walletconnect-setup.tsx +89 -0
  10. package/ai-exported/integration/examples/README.md +29 -0
  11. package/ai-exported/integration/recipes/batch-operations.md +223 -0
  12. package/ai-exported/integration/recipes/bridge-to-sdk.md +164 -0
  13. package/ai-exported/integration/recipes/chain-detection.md +254 -0
  14. package/ai-exported/integration/recipes/connect-button.md +156 -0
  15. package/ai-exported/integration/recipes/multi-chain-modal.md +199 -0
  16. package/ai-exported/integration/recipes/setup.md +158 -0
  17. package/ai-exported/integration/recipes/sign-message.md +137 -0
  18. package/ai-exported/integration/recipes/sub-path-imports.md +95 -0
  19. package/ai-exported/integration/recipes/switch-chain.md +141 -0
  20. package/ai-exported/integration/recipes/walletconnect-setup.md +139 -0
  21. package/ai-exported/integration/reference/api-surface.md +175 -0
  22. package/ai-exported/integration/reference/chain-support.md +78 -0
  23. package/ai-exported/integration/reference/connectors.md +74 -0
  24. package/ai-exported/integration/reference/hooks.md +204 -0
  25. package/ai-exported/integration/reference/wallet-brands.md +106 -0
  26. package/ai-exported/migration/README.md +49 -0
  27. package/ai-exported/migration/ai-rules.md +144 -0
  28. package/ai-exported/migration/breaking-changes.md +305 -0
  29. package/ai-exported/migration/checklist.md +159 -0
  30. package/ai-exported/migration/recipes/connect-button.md +166 -0
  31. package/ai-exported/migration/recipes/multi-chain-modal.md +244 -0
  32. package/ai-exported/migration/recipes/ssr-setup.md +162 -0
  33. package/ai-exported/migration/recipes/walletconnect-migration.md +168 -0
  34. package/ai-exported/migration/reference/components.md +73 -0
  35. package/ai-exported/migration/reference/config.md +307 -0
  36. package/ai-exported/migration/reference/hooks.md +278 -0
  37. package/ai-exported/migration/reference/imports.md +157 -0
  38. package/dist/XConnector-B9YQTVJ4.d.ts +146 -0
  39. package/dist/chunk-2BOUGCJ7.mjs +150 -0
  40. package/dist/chunk-2BOUGCJ7.mjs.map +1 -0
  41. package/dist/chunk-66BAUK56.mjs +202 -0
  42. package/dist/chunk-66BAUK56.mjs.map +1 -0
  43. package/dist/chunk-7ULB6DW4.mjs +102 -0
  44. package/dist/chunk-7ULB6DW4.mjs.map +1 -0
  45. package/dist/chunk-BKJB527E.mjs +125 -0
  46. package/dist/chunk-BKJB527E.mjs.map +1 -0
  47. package/dist/chunk-BXJLBR4G.mjs +88 -0
  48. package/dist/chunk-BXJLBR4G.mjs.map +1 -0
  49. package/dist/chunk-E5IAZ7E6.mjs +186 -0
  50. package/dist/chunk-E5IAZ7E6.mjs.map +1 -0
  51. package/dist/chunk-MAQ47Q52.mjs +33 -0
  52. package/dist/chunk-MAQ47Q52.mjs.map +1 -0
  53. package/dist/chunk-MXZVF5HR.mjs +34 -0
  54. package/dist/chunk-MXZVF5HR.mjs.map +1 -0
  55. package/dist/chunk-N5A2TMF6.mjs +33 -0
  56. package/dist/chunk-N5A2TMF6.mjs.map +1 -0
  57. package/dist/chunk-NY7U7OJW.mjs +64 -0
  58. package/dist/chunk-NY7U7OJW.mjs.map +1 -0
  59. package/dist/chunk-PJLEJVAU.mjs +140 -0
  60. package/dist/chunk-PJLEJVAU.mjs.map +1 -0
  61. package/dist/chunk-PLCA4ZDJ.mjs +1585 -0
  62. package/dist/chunk-PLCA4ZDJ.mjs.map +1 -0
  63. package/dist/chunk-TZMKDXFA.mjs +3 -0
  64. package/dist/chunk-TZMKDXFA.mjs.map +1 -0
  65. package/dist/chunk-X2MHIWXO.mjs +100 -0
  66. package/dist/chunk-X2MHIWXO.mjs.map +1 -0
  67. package/dist/chunk-XZ7CHO2S.mjs +41 -0
  68. package/dist/chunk-XZ7CHO2S.mjs.map +1 -0
  69. package/dist/config-OlnzyEUE.d.ts +146 -0
  70. package/dist/index.cjs +2784 -1594
  71. package/dist/index.cjs.map +1 -1
  72. package/dist/index.d.ts +768 -1498
  73. package/dist/index.mjs +463 -2004
  74. package/dist/index.mjs.map +1 -1
  75. package/dist/xchains/bitcoin/index.cjs +1927 -0
  76. package/dist/xchains/bitcoin/index.cjs.map +1 -0
  77. package/dist/xchains/bitcoin/index.d.ts +125 -0
  78. package/dist/xchains/bitcoin/index.mjs +16 -0
  79. package/dist/xchains/bitcoin/index.mjs.map +1 -0
  80. package/dist/xchains/evm/index.cjs +316 -0
  81. package/dist/xchains/evm/index.cjs.map +1 -0
  82. package/dist/xchains/evm/index.d.ts +39 -0
  83. package/dist/xchains/evm/index.mjs +5 -0
  84. package/dist/xchains/evm/index.mjs.map +1 -0
  85. package/dist/xchains/icon/index.cjs +311 -0
  86. package/dist/xchains/icon/index.cjs.map +1 -0
  87. package/dist/xchains/icon/index.d.ts +37 -0
  88. package/dist/xchains/icon/index.mjs +7 -0
  89. package/dist/xchains/icon/index.mjs.map +1 -0
  90. package/dist/xchains/injective/index.cjs +223 -0
  91. package/dist/xchains/injective/index.cjs.map +1 -0
  92. package/dist/xchains/injective/index.d.ts +35 -0
  93. package/dist/xchains/injective/index.mjs +5 -0
  94. package/dist/xchains/injective/index.mjs.map +1 -0
  95. package/dist/xchains/near/index.cjs +190 -0
  96. package/dist/xchains/near/index.cjs.map +1 -0
  97. package/dist/xchains/near/index.d.ts +34 -0
  98. package/dist/xchains/near/index.mjs +6 -0
  99. package/dist/xchains/near/index.mjs.map +1 -0
  100. package/dist/xchains/solana/index.cjs +186 -0
  101. package/dist/xchains/solana/index.cjs.map +1 -0
  102. package/dist/xchains/solana/index.d.ts +26 -0
  103. package/dist/xchains/solana/index.mjs +7 -0
  104. package/dist/xchains/solana/index.mjs.map +1 -0
  105. package/dist/xchains/stacks/index.cjs +240 -0
  106. package/dist/xchains/stacks/index.cjs.map +1 -0
  107. package/dist/xchains/stacks/index.d.ts +36 -0
  108. package/dist/xchains/stacks/index.mjs +5 -0
  109. package/dist/xchains/stacks/index.mjs.map +1 -0
  110. package/dist/xchains/stellar/index.cjs +322 -0
  111. package/dist/xchains/stellar/index.cjs.map +1 -0
  112. package/dist/xchains/stellar/index.d.ts +44 -0
  113. package/dist/xchains/stellar/index.mjs +6 -0
  114. package/dist/xchains/stellar/index.mjs.map +1 -0
  115. package/dist/xchains/sui/index.cjs +248 -0
  116. package/dist/xchains/sui/index.cjs.map +1 -0
  117. package/dist/xchains/sui/index.d.ts +37 -0
  118. package/dist/xchains/sui/index.mjs +7 -0
  119. package/dist/xchains/sui/index.mjs.map +1 -0
  120. package/docs/ADDING_A_NEW_CHAIN.md +440 -0
  121. package/docs/ARCHITECTURE.md +291 -0
  122. package/docs/BATCH_OPERATIONS.md +267 -0
  123. package/docs/CHAIN_DETECTION.md +216 -0
  124. package/docs/CONFIGURE_PROVIDER.md +360 -0
  125. package/docs/CONNECTORS.md +247 -0
  126. package/docs/CONNECT_FLOW.md +276 -0
  127. package/docs/EVM_SWITCH_CHAIN.md +161 -0
  128. package/docs/SIGN_MESSAGE.md +213 -0
  129. package/docs/SUB_PATH_EXPORTS.md +246 -0
  130. package/docs/WALLETCONNECT.md +154 -0
  131. package/docs/WALLET_MODAL.md +331 -0
  132. package/docs/WALLET_PROVIDER_BRIDGE.md +226 -0
  133. package/package.json +34 -9
  134. package/skills/SKILLS.md +84 -0
  135. package/skills/bridge-to-sdk.md +148 -0
  136. package/skills/connect-button.md +116 -0
  137. package/skills/evm-only-walletconnect.md +111 -0
  138. package/skills/multi-chain-modal.md +178 -0
  139. package/skills/setup.md +107 -0
  140. package/dist/index.d.cts +0 -1579
  141. package/src/Hydrate.ts +0 -65
  142. package/src/SodaxWalletProvider.tsx +0 -97
  143. package/src/actions/getXChainType.ts +0 -8
  144. package/src/actions/getXService.ts +0 -33
  145. package/src/actions/index.ts +0 -2
  146. package/src/assets/wallets/hana.svg +0 -6
  147. package/src/assets/wallets/havah.svg +0 -76
  148. package/src/assets/wallets/keplr.svg +0 -30
  149. package/src/assets/wallets/metamask.svg +0 -60
  150. package/src/assets/wallets/phantom.svg +0 -4
  151. package/src/assets/wallets/sui.svg +0 -20
  152. package/src/core/XConnector.ts +0 -54
  153. package/src/core/XService.ts +0 -85
  154. package/src/core/index.ts +0 -2
  155. package/src/hooks/index.ts +0 -11
  156. package/src/hooks/useEthereumChainId.ts +0 -44
  157. package/src/hooks/useEvmSwitchChain.ts +0 -91
  158. package/src/hooks/useWalletProvider.ts +0 -206
  159. package/src/hooks/useXAccount.ts +0 -51
  160. package/src/hooks/useXAccounts.ts +0 -56
  161. package/src/hooks/useXBalances.ts +0 -65
  162. package/src/hooks/useXConnect.ts +0 -118
  163. package/src/hooks/useXConnection.ts +0 -72
  164. package/src/hooks/useXConnectors.ts +0 -72
  165. package/src/hooks/useXDisconnect.ts +0 -73
  166. package/src/hooks/useXService.ts +0 -8
  167. package/src/hooks/useXSignMessage.ts +0 -82
  168. package/src/index.ts +0 -19
  169. package/src/types/index.ts +0 -22
  170. package/src/useXWagmiStore.ts +0 -116
  171. package/src/utils/index.ts +0 -21
  172. package/src/xchains/bitcoin/BitcoinXConnector.ts +0 -34
  173. package/src/xchains/bitcoin/BitcoinXService.ts +0 -40
  174. package/src/xchains/bitcoin/OKXXConnector.ts +0 -117
  175. package/src/xchains/bitcoin/UnisatXConnector.ts +0 -117
  176. package/src/xchains/bitcoin/XverseXConnector.ts +0 -232
  177. package/src/xchains/bitcoin/index.ts +0 -7
  178. package/src/xchains/bitcoin/useBitcoinXConnectors.ts +0 -14
  179. package/src/xchains/evm/EvmXConnector.ts +0 -27
  180. package/src/xchains/evm/EvmXService.ts +0 -211
  181. package/src/xchains/evm/index.ts +0 -3
  182. package/src/xchains/icon/IconHanaXConnector.ts +0 -39
  183. package/src/xchains/icon/IconXService.ts +0 -117
  184. package/src/xchains/icon/actions.ts +0 -28
  185. package/src/xchains/icon/iconex/index.tsx +0 -46
  186. package/src/xchains/icon/index.ts +0 -2
  187. package/src/xchains/injective/InjectiveXConnector.ts +0 -60
  188. package/src/xchains/injective/InjectiveXService.ts +0 -62
  189. package/src/xchains/injective/actions.ts +0 -32
  190. package/src/xchains/injective/index.ts +0 -2
  191. package/src/xchains/near/NearXConnector.ts +0 -42
  192. package/src/xchains/near/NearXService.ts +0 -46
  193. package/src/xchains/near/useNearXConnectors.ts +0 -23
  194. package/src/xchains/solana/SolanaXConnector.ts +0 -26
  195. package/src/xchains/solana/SolanaXService.ts +0 -46
  196. package/src/xchains/solana/index.ts +0 -2
  197. package/src/xchains/stacks/StacksXConnector.ts +0 -63
  198. package/src/xchains/stacks/StacksXService.ts +0 -59
  199. package/src/xchains/stacks/constants.ts +0 -42
  200. package/src/xchains/stacks/index.ts +0 -4
  201. package/src/xchains/stacks/useStacksXConnectors.ts +0 -7
  202. package/src/xchains/stellar/CustomSorobanServer.ts +0 -93
  203. package/src/xchains/stellar/StellarWalletsKitXConnector.ts +0 -53
  204. package/src/xchains/stellar/StellarXService.ts +0 -93
  205. package/src/xchains/stellar/actions.ts +0 -24
  206. package/src/xchains/stellar/index.tsx +0 -2
  207. package/src/xchains/stellar/useStellarXConnectors.ts +0 -21
  208. package/src/xchains/stellar/utils.ts +0 -49
  209. package/src/xchains/sui/SuiXConnector.ts +0 -28
  210. package/src/xchains/sui/SuiXService.ts +0 -66
  211. package/src/xchains/sui/index.ts +0 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/actions/getXChainType.ts","../src/core/XService.ts","../src/xchains/near/NearXService.ts","../src/xchains/stacks/StacksXService.ts","../src/actions/getXService.ts","../src/core/XConnector.ts","../src/utils/index.ts","../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/xchains/evm/EvmXService.ts","../src/xchains/evm/EvmXConnector.ts","../src/xchains/injective/InjectiveXService.ts","../src/xchains/injective/InjectiveXConnector.ts","../src/xchains/solana/SolanaXService.ts","../src/xchains/stellar/CustomSorobanServer.ts","../src/xchains/stellar/utils.ts","../src/xchains/stellar/StellarXService.ts","../src/xchains/stellar/StellarWalletsKitXConnector.ts","../src/xchains/sui/SuiXService.ts","../src/xchains/sui/SuiXConnector.ts","../src/xchains/icon/IconXService.ts","../src/xchains/icon/iconex/index.tsx","../src/xchains/icon/IconHanaXConnector.ts","../src/xchains/stacks/StacksXConnector.ts","../src/xchains/stacks/constants.ts","../src/xchains/stacks/useStacksXConnectors.ts","../src/useXWagmiStore.ts","../src/hooks/useXConnection.ts","../src/hooks/useXAccount.ts","../src/hooks/useXAccounts.ts","../src/hooks/useXConnect.ts","../src/xchains/solana/SolanaXConnector.ts","../src/xchains/stellar/useStellarXConnectors.ts","../src/hooks/useXService.ts","../src/xchains/near/NearXConnector.ts","../src/xchains/near/useNearXConnectors.ts","../src/hooks/useXConnectors.ts","../src/hooks/useXDisconnect.ts","../src/hooks/useXBalances.ts","../src/hooks/useEthereumChainId.ts","../src/hooks/useEvmSwitchChain.ts","../src/hooks/useWalletProvider.ts","../src/hooks/useXSignMessage.ts","../src/xchains/bitcoin/useBitcoinXConnectors.ts","../src/Hydrate.ts","../src/xchains/icon/actions.ts","../src/xchains/injective/actions.ts","../src/xchains/stellar/actions.ts","../src/SodaxWalletProvider.tsx","../src/types/index.ts"],"names":["baseChainInfo","address","NearConnector","JsonRpcProvider","networkFrom","fetchCallReadOnlyFunction","Cl","detectBitcoinAddressType","request","MessageSigningProtocols","AddressPurpose","defineChain","createConfig","mainnet","avalanche","arbitrum","base","bsc","sonic","optimism","polygon","lightlinkPhoenix","kaia","redbellyMainnet","http","ETHEREUM_MAINNET_CHAIN_ID","AVALANCHE_MAINNET_CHAIN_ID","ARBITRUM_MAINNET_CHAIN_ID","BASE_MAINNET_CHAIN_ID","BSC_MAINNET_CHAIN_ID","SONIC_MAINNET_CHAIN_ID","OPTIMISM_MAINNET_CHAIN_ID","POLYGON_MAINNET_CHAIN_ID","HYPEREVM_MAINNET_CHAIN_ID","LIGHTLINK_MAINNET_CHAIN_ID","REDBELLY_MAINNET_CHAIN_ID","KAIA_MAINNET_CHAIN_ID","createStorage","cookieStorage","getPublicClient","erc20Abi","getNetworkEndpoints","Network","WalletStrategy","InjectiveChainId","IndexerGrpcAccountPortfolioApi","ChainGrpcWasmApi","MsgBroadcaster","isCosmosBrowserWallet","isCosmosWalletInstalled","isEvmBrowserWallet","getInjectiveAddress","PublicKey","getAssociatedTokenAddressSync","getAccount","SorobanRpc","Address","Contract","TimeoutInfinite","scValToBigInt","xdr","StellarWalletsKit","WalletNetwork","allowAllModules","StellarSdk","IconSdkRaw","disconnect","useMemo","Wallet","create","devtools","persist","immer","createJSONStorage","useConnections","useAccount","useCurrentAccount","useCurrentWallet","useWallet","ChainTypeArr","useConnect","useConnectWallet","useMutation","useQuery","useConnectors","useWallets","useDisconnect","useDisconnectWallet","useCallback","React","useEffect","useSwitchChain","usePublicClient","useWalletClient","EvmWalletProvider","SuiWalletProvider","IconWalletProvider","InjectiveWalletProvider","StellarWalletProvider","SolanaWalletProvider","NearWalletProvider","StacksWalletProvider","useSignMessage","useSignPersonalMessage","getEthereumAddress","useSuiClient","useConnection","useConfig","createNetwork","QueryClient","wagmi","UnsafeBurnerWalletAdapter","QueryClientProvider","WagmiProvider","SuiClientProvider","getFullnodeUrl","SolanaConnectionProvider","WalletId"],"mappings":"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","file":"index.cjs","sourcesContent":["import { baseChainInfo, type ChainId, type ChainType } from '@sodax/types';\n\nexport function getXChainType(xChainId: ChainId | undefined): ChainType | undefined {\n if (!xChainId) {\n return undefined;\n }\n return baseChainInfo[xChainId].type;\n}\n","import type { ChainType, XToken } from '@sodax/types';\nimport type { XConnector } from './XConnector';\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 {\n /** The blockchain type this service handles */\n public readonly xChainType: ChainType;\n\n /** Available wallet connectors for this chain */\n private xConnectors: XConnector[] = [];\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(): XConnector[] {\n return this.xConnectors;\n }\n\n /**\n * Sets the available connectors for this chain\n */\n public setXConnectors(xConnectors: XConnector[]): 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): XConnector | undefined {\n return this.getXConnectors().find(xConnector => xConnector.id === xConnectorId);\n }\n}\n","import { XService } from '@/core/XService';\nimport type { XToken } from '@sodax/types';\nimport { NearConnector } from '@hot-labs/near-connect';\nimport { JsonRpcProvider } from 'near-api-js';\n\nexport class NearXService extends XService {\n private static instance: NearXService;\n\n public walletSelector: NearConnector;\n\n private constructor() {\n super('NEAR');\n\n this.walletSelector = new NearConnector({\n network: 'mainnet',\n logger: console,\n autoConnect: true,\n excludedWallets: ['okx-wallet'],\n });\n }\n\n public static getInstance(): NearXService {\n if (!NearXService.instance) {\n NearXService.instance = new NearXService();\n }\n return NearXService.instance;\n }\n\n async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n const url = 'https://1rpc.io/near';\n // reference: https://near.github.io/near-api-js/classes/_near-js_providers.json-rpc-provider.JsonRpcProvider.html\n const provider = new JsonRpcProvider({ url });\n\n // get native balance\n if (xToken.symbol === 'NEAR') {\n const account = await provider.viewAccount({ accountId: address ?? '' });\n return BigInt(account.amount);\n }\n\n // Near Fungible Token Standard(https://github.com/near/NEPs/blob/master/neps/nep-0141.md)\n // get balance of the token\n\n const res = await provider.callFunction<number>({ contractId: xToken.address, method: 'ft_balance_of', args: { account_id: address } });\n return BigInt(res ?? 0);\n }\n}\n","import { XService } from '@/core/XService';\nimport type { XToken } from '@sodax/types';\nimport { fetchCallReadOnlyFunction, Cl, type UIntCV, type ResponseOkCV } from '@stacks/transactions';\nimport { networkFrom, type StacksNetwork } from '@stacks/network';\n\nexport class StacksXService extends XService {\n private static instance: StacksXService;\n\n public network: StacksNetwork | undefined;\n\n private constructor() {\n super('STACKS');\n this.network = networkFrom('mainnet');\n }\n\n public static getInstance(): StacksXService {\n if (!StacksXService.instance) {\n StacksXService.instance = new StacksXService();\n }\n return StacksXService.instance;\n }\n\n async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return 0n;\n\n // native STX balance\n if (xToken.symbol === 'STX') {\n const url = `${this.network?.client.baseUrl}/extended/v1/address/${address}/balances`;\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Error fetching data: ${response.statusText}`);\n }\n const data = await response.json();\n return BigInt(data.stx.balance);\n } catch (error) {\n console.error('Error fetching STX balance:', error);\n return 0n;\n }\n }\n\n // SIP-010 fungible token balance via read-only contract call\n const [contractAddress, contractName] = xToken.address.split('.');\n try {\n const result = (await fetchCallReadOnlyFunction({\n contractAddress,\n contractName,\n functionName: 'get-balance',\n functionArgs: [Cl.principal(address)],\n network: this.network,\n senderAddress: address,\n })) as ResponseOkCV<UIntCV>;\n return result.value.value as bigint;\n } catch (error) {\n console.error('Error fetching token balance:', error);\n return 0n;\n }\n }\n}\n","import type { ChainType } from '@sodax/types';\n\nimport { BitcoinXService, IconXService, InjectiveXService, SolanaXService, StellarXService } from '..';\nimport { SuiXService } from '..';\nimport { EvmXService } from '..';\nimport type { XService } from '../core';\nimport { NearXService } from '../xchains/near/NearXService';\nimport { StacksXService } from '../xchains/stacks/StacksXService';\n\nexport function getXService(xChainType: ChainType): XService {\n switch (xChainType) {\n case 'BITCOIN':\n return BitcoinXService.getInstance();\n case 'EVM':\n return EvmXService.getInstance();\n case 'SUI':\n return SuiXService.getInstance();\n case 'SOLANA':\n return SolanaXService.getInstance();\n case 'ICON':\n return IconXService.getInstance();\n case 'INJECTIVE':\n return InjectiveXService.getInstance();\n case 'STELLAR':\n return StellarXService.getInstance();\n case 'NEAR':\n return NearXService.getInstance();\n case 'STACKS':\n return StacksXService.getInstance();\n default:\n throw new Error(`Unsupported chain type: ${xChainType}`);\n }\n}\n","import type { ChainType } from '@sodax/types';\nimport type { XAccount } from '../types';\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 {\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 private readonly _id: string;\n\n /** Optional icon URL for the wallet provider */\n private 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","import { baseChainInfo, type ChainId, type XToken } from '@sodax/types';\n\nexport const isNativeToken = (xToken: XToken) => {\n const nativeAddresses = [\n 'cx0000000000000000000000000000000000000000',\n '0x0000000000000000000000000000000000000000',\n 'inj',\n '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n 'hx0000000000000000000000000000000000000000',\n '11111111111111111111111111111111', // solana\n 'CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA', // stellar\n 'ST000000000000000000002AMW42H.nativetoken', // stacks\n '0:0', // bitcoin\n ];\n\n return nativeAddresses.includes(xToken.address);\n};\n\nexport const getWagmiChainId = (xChainId: ChainId): number => {\n return baseChainInfo[xChainId].chainId as number;\n};\n","import { XService } from '@/core/XService';\nimport { isNativeToken } from '@/utils';\nimport type { XToken } from '@sodax/types';\n\nexport class BitcoinXService extends XService {\n private static instance: BitcoinXService;\n private rpcUrl: string;\n\n private constructor(rpcUrl = 'https://mempool.space/api') {\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 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';\nimport type { XAccount } from '@/types';\nimport type { IBitcoinWalletProvider } from '@sodax/types';\nimport { BitcoinXService } from './BitcoinXService';\n\n/**\n * Abstract base class for Bitcoin wallet connectors.\n * Subclasses implement wallet-specific connection logic (Unisat, Xverse, OKX).\n */\nexport abstract class BitcoinXConnector extends XConnector {\n constructor(name: string, id: string) {\n super('BITCOIN', name, id);\n }\n\n getXService(): BitcoinXService {\n return BitcoinXService.getInstance();\n }\n\n abstract connect(): Promise<XAccount | undefined>;\n abstract 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';\nimport { detectBitcoinAddressType, type IBitcoinWalletProvider, type AddressType } from '@sodax/types';\nimport { BitcoinXConnector } from './BitcoinXConnector';\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 private unisat: UnisatWallet;\n private cachedAddress: string;\n\n constructor(unisat: UnisatWallet, address: string) {\n this.unisat = unisat;\n this.cachedAddress = address;\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<AddressType> {\n const address = await this.getWalletAddress();\n return detectBitcoinAddressType(address);\n }\n\n async signTransaction(psbtBase64: string, finalize = false): Promise<string> {\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: finalize });\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() {\n super('Unisat', 'unisat');\n }\n\n public static isAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.unisat;\n }\n\n public get icon(): string {\n return 'https://avatars.githubusercontent.com/u/125119198?s=200&v=4';\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) return undefined;\n\n this.walletProvider = new UnisatWalletProvider(window.unisat, address);\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 (!window.unisat || !xAccount.address) return undefined;\n return new UnisatWalletProvider(window.unisat, xAccount.address);\n }\n}\n","import type { XAccount } from '@/types';\nimport { detectBitcoinAddressType, type IBitcoinWalletProvider, type AddressType, type BtcWalletAddressType } from '@sodax/types';\nimport { AddressPurpose, MessageSigningProtocols } from 'sats-connect';\nimport { BitcoinXConnector } from './BitcoinXConnector';\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 private address: string;\n private publicKey: string;\n\n constructor(address: string, publicKey: string) {\n this.address = address;\n this.publicKey = publicKey;\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<AddressType> {\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 = false): Promise<string> {\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 (finalize) {\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() {\n super('Xverse', 'xverse');\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 get icon(): string {\n return 'https://cdn.brandfetch.io/iddzGN5Rcv/w/400/h/400/theme/dark/icon.jpeg?c=1bxid64Mup7aczewSAYMX&t=1771902357797';\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 );\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);\n }\n}\n","import type { XAccount } from '@/types';\nimport { detectBitcoinAddressType, type IBitcoinWalletProvider, type AddressType } from '@sodax/types';\nimport { BitcoinXConnector } from './BitcoinXConnector';\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 private okx: OKXBitcoinWallet;\n private cachedAddress: string;\n\n constructor(okx: OKXBitcoinWallet, address: string) {\n this.okx = okx;\n this.cachedAddress = address;\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<AddressType> {\n const address = await this.getWalletAddress();\n return detectBitcoinAddressType(address);\n }\n\n async signTransaction(psbtBase64: string, finalize = false): Promise<string> {\n const psbtHex = Buffer.from(psbtBase64, 'base64').toString('hex');\n return this.okx.signPsbt(psbtHex, { autoFinalized: finalize });\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() {\n super('OKX Wallet', 'okx-bitcoin');\n }\n\n public static isAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.okxwallet?.bitcoin;\n }\n\n public get icon(): string {\n return 'https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png';\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) return undefined;\n\n this.walletProvider = new OKXWalletProvider(okx, address);\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 const okx = window.okxwallet?.bitcoin;\n if (!okx || !xAccount.address) return undefined;\n return new OKXWalletProvider(okx, xAccount.address);\n }\n}\n","import { XService } from '@/core/XService';\nimport {\n ARBITRUM_MAINNET_CHAIN_ID,\n AVALANCHE_MAINNET_CHAIN_ID,\n BASE_MAINNET_CHAIN_ID,\n BSC_MAINNET_CHAIN_ID,\n ETHEREUM_MAINNET_CHAIN_ID,\n HYPEREVM_MAINNET_CHAIN_ID,\n KAIA_MAINNET_CHAIN_ID,\n LIGHTLINK_MAINNET_CHAIN_ID,\n OPTIMISM_MAINNET_CHAIN_ID,\n POLYGON_MAINNET_CHAIN_ID,\n REDBELLY_MAINNET_CHAIN_ID,\n SONIC_MAINNET_CHAIN_ID,\n type RpcConfig,\n type XToken,\n} from '@sodax/types';\nimport { getWagmiChainId, isNativeToken } from '@/utils';\n\nimport { type Address, type Chain, defineChain, erc20Abi } from 'viem';\nimport { getPublicClient } from 'wagmi/actions';\nimport { type Config, createConfig, http, createStorage, cookieStorage } from 'wagmi';\nimport {\n mainnet,\n avalanche,\n base,\n optimism,\n polygon,\n arbitrum,\n bsc,\n sonic,\n lightlinkPhoenix,\n redbellyMainnet,\n kaia,\n} from 'wagmi/chains';\nimport type { WagmiOptions } from '@/SodaxWalletProvider';\n\n// HyperEVM chain is not supported by viem, so we need to define it manually\nexport const hyper = /*#__PURE__*/ defineChain({\n id: 999,\n name: 'HyperEVM',\n nativeCurrency: {\n decimals: 18,\n name: 'HYPE',\n symbol: 'HYPE',\n },\n rpcUrls: {\n default: { http: ['https://rpc.hyperliquid.xyz/evm'] },\n },\n blockExplorers: {\n default: {\n name: 'HyperEVMScan',\n url: 'https://hyperevmscan.io/',\n },\n },\n contracts: {\n multicall3: {\n address: '0xcA11bde05977b3631167028862bE2a173976CA11',\n blockCreated: 13051,\n },\n },\n});\n\nexport const createWagmiConfig = (config: RpcConfig, options?: WagmiOptions) => {\n return createConfig({\n chains: [\n mainnet,\n avalanche,\n arbitrum,\n base,\n bsc,\n sonic,\n optimism,\n polygon,\n hyper,\n lightlinkPhoenix,\n kaia,\n redbellyMainnet,\n ],\n ssr: options?.ssr,\n transports: {\n [mainnet.id]: http(config[ETHEREUM_MAINNET_CHAIN_ID]),\n [avalanche.id]: http(config[AVALANCHE_MAINNET_CHAIN_ID]),\n [arbitrum.id]: http(config[ARBITRUM_MAINNET_CHAIN_ID]),\n [base.id]: http(config[BASE_MAINNET_CHAIN_ID]),\n [bsc.id]: http(config[BSC_MAINNET_CHAIN_ID]),\n [sonic.id]: http(config[SONIC_MAINNET_CHAIN_ID]),\n [optimism.id]: http(config[OPTIMISM_MAINNET_CHAIN_ID]),\n [polygon.id]: http(config[POLYGON_MAINNET_CHAIN_ID]),\n [hyper.id]: http(config[HYPEREVM_MAINNET_CHAIN_ID]),\n [lightlinkPhoenix.id]: http(config[LIGHTLINK_MAINNET_CHAIN_ID]),\n [redbellyMainnet.id]: http(config[REDBELLY_MAINNET_CHAIN_ID]),\n [kaia.id]: http(config[KAIA_MAINNET_CHAIN_ID]),\n },\n storage: createStorage({\n storage: cookieStorage,\n key: 'sodax',\n }),\n });\n};\n\n/**\n * Service class for handling EVM chain interactions.\n * Implements singleton pattern and provides methods for wallet/chain operations.\n */\n\nexport class EvmXService extends XService {\n private static instance: EvmXService;\n public wagmiConfig: Config | undefined;\n\n private constructor() {\n super('EVM');\n }\n\n getXConnectors() {\n return [];\n }\n\n public static getInstance(): EvmXService {\n if (!EvmXService.instance) {\n EvmXService.instance = new EvmXService();\n }\n return EvmXService.instance;\n }\n\n // get erc20 token balance in a chain (evm chain only)\n async _getTokenBalance(address: string | undefined, chainId: number, tokenAddress: string): Promise<bigint> {\n const publicClient = getPublicClient(this.wagmiConfig as Config, { chainId: chainId });\n if (!publicClient) throw new Error('Public client not found');\n const balance = await publicClient.readContract({\n abi: erc20Abi,\n address: tokenAddress as `0x${string}`,\n functionName: 'balanceOf',\n args: [address as `0x${string}`],\n });\n return balance || 0n;\n }\n\n //get native balance of the chain (evm chain only)\n async _getChainBalance(address: string | undefined, chainId: number) {\n const balance = await getPublicClient(this.wagmiConfig as Config, { chainId: chainId })?.getBalance({\n address: address as Address,\n });\n return balance || 0n;\n }\n\n async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return 0n;\n if (!this.wagmiConfig) return 0n;\n\n const chainId = getWagmiChainId(xToken.xChainId);\n\n if (isNativeToken(xToken)) {\n return this._getChainBalance(address, chainId);\n }\n\n throw new Error(`Unsupported token: ${xToken.symbol}`);\n }\n\n async getBalances(address: string | undefined, xTokens: XToken[]) {\n if (!address) return {};\n if (!this.wagmiConfig) return {};\n\n const nativeTokenBalancePromises = xTokens\n .filter(xToken => isNativeToken(xToken))\n .map(async xToken => {\n const balance = await this.getBalance(address, xToken);\n return { symbol: xToken.symbol, address: xToken.address, balance };\n });\n\n const nativeTokenBalances = await Promise.all(nativeTokenBalancePromises);\n const tokenMap = nativeTokenBalances.reduce((map, { address, balance }) => {\n if (balance) map[address] = balance;\n return map;\n }, {});\n\n const nonNativeXTokens = xTokens.filter(xToken => !isNativeToken(xToken));\n const xChainId = xTokens[0].xChainId;\n const viemChain: Chain = this.wagmiConfig.chains.find(chain => chain.id === getWagmiChainId(xChainId)) as Chain;\n const chainId = getWagmiChainId(xChainId);\n\n const publicClient = getPublicClient(this.wagmiConfig, { chainId: chainId });\n if (!publicClient) throw new Error('Public client not found');\n\n if (viemChain?.contracts?.multicall3) {\n //multicall supports\n const result = await publicClient.multicall({\n contracts: nonNativeXTokens.map(token => ({\n abi: erc20Abi,\n address: token.address as `0x${string}`,\n functionName: 'balanceOf',\n args: [address],\n })),\n });\n\n return nonNativeXTokens.reduce((acc, token, index) => {\n acc[token.address] = result?.[index]?.result?.toString() || '0';\n return acc;\n }, tokenMap);\n }\n\n const nonNativeTokenBalances: bigint[] = await Promise.all(\n nonNativeXTokens.map(token => this._getTokenBalance(address, chainId, token.address)),\n );\n\n return nonNativeXTokens.reduce((acc, token, idx) => {\n acc[token.address] = nonNativeTokenBalances[idx] || '0';\n return acc;\n }, tokenMap);\n }\n}\n","import { XConnector } from '@/core/XConnector';\nimport type { XAccount } from '@/types';\nimport type { Connector } from 'wagmi';\n\nexport class EvmXConnector extends XConnector {\n connector: Connector;\n\n constructor(connector: Connector) {\n super('EVM', connector.name, connector.id);\n this.connector = connector;\n }\n\n async connect(): Promise<XAccount | undefined> {\n return;\n }\n\n async disconnect(): Promise<void> {\n return;\n }\n\n public get id() {\n return this.connector.id;\n }\n public get icon() {\n return this.connector.icon;\n }\n}\n","import { XService } from '@/core/XService';\nimport { Network, getNetworkEndpoints } from '@injectivelabs/networks';\nimport { ChainGrpcWasmApi, IndexerGrpcAccountPortfolioApi } from '@injectivelabs/sdk-ts';\nimport { ChainId as InjectiveChainId } from '@injectivelabs/ts-types';\nimport { MsgBroadcaster } from '@injectivelabs/wallet-core';\nimport type { XToken } from '@sodax/types';\nimport { mainnet } from 'wagmi/chains';\nimport { WalletStrategy } from '@injectivelabs/wallet-strategy';\n\nexport class InjectiveXService extends XService {\n private static instance: InjectiveXService;\n\n public walletStrategy: WalletStrategy;\n public indexerGrpcAccountPortfolioApi: IndexerGrpcAccountPortfolioApi;\n public chainGrpcWasmApi: ChainGrpcWasmApi;\n public msgBroadcaster: MsgBroadcaster;\n\n private constructor() {\n super('INJECTIVE');\n\n const endpoints = getNetworkEndpoints(Network.Mainnet);\n\n this.walletStrategy = new WalletStrategy({\n chainId: InjectiveChainId.Mainnet,\n strategies: {},\n evmOptions: {\n evmChainId: mainnet.id,\n rpcUrl: mainnet.rpcUrls.default.http[0],\n },\n });\n\n this.indexerGrpcAccountPortfolioApi = new IndexerGrpcAccountPortfolioApi(endpoints.indexer);\n this.chainGrpcWasmApi = new ChainGrpcWasmApi(endpoints.grpc);\n this.msgBroadcaster = new MsgBroadcaster({\n walletStrategy: this.walletStrategy,\n network: Network.Mainnet,\n endpoints,\n });\n }\n\n public static getInstance(): InjectiveXService {\n if (!InjectiveXService.instance) {\n InjectiveXService.instance = new InjectiveXService();\n }\n return InjectiveXService.instance;\n }\n\n async getBalance(address: string | undefined, xToken: XToken) {\n if (!address) return 0n;\n\n const portfolio = await this.indexerGrpcAccountPortfolioApi.fetchAccountPortfolioBalances(address);\n\n const xTokenAddress = xToken.address;\n\n const balance = portfolio.bankBalancesList.find(_balance => _balance.denom === xTokenAddress);\n if (balance) {\n return BigInt(balance.amount);\n }\n\n return 0n;\n }\n}\n","import type { XAccount } from '@/types';\nimport { XConnector } from '@/core';\nimport { getInjectiveAddress } from '@injectivelabs/sdk-ts';\nimport { type Wallet, isEvmBrowserWallet, isCosmosBrowserWallet } from '@injectivelabs/wallet-base';\nimport { isCosmosWalletInstalled } from '@injectivelabs/wallet-cosmos';\nimport { InjectiveXService } from './InjectiveXService';\n\nconst WALLET_ICONS: Partial<Record<Wallet, string>> = {\n metamask: 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/metamask.svg',\n keplr: 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/keplr.svg',\n leap: 'https://assets.leapwallet.io/logos/leap-cosmos-logo.svg',\n rabby: 'https://raw.githubusercontent.com/RabbyHub/logo/master/symbol.svg',\n phantom: 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/phantom.svg',\n 'okx-wallet': 'https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png',\n 'trust-wallet': 'https://trustwallet.com/assets/images/media/assets/twLogo.svg',\n};\n\nexport class InjectiveXConnector extends XConnector {\n private wallet: Wallet;\n\n constructor(name: string, wallet: Wallet) {\n super('INJECTIVE', name, wallet);\n this.wallet = wallet;\n }\n\n getXService(): InjectiveXService {\n return InjectiveXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n if (isCosmosBrowserWallet(this.wallet) && !isCosmosWalletInstalled(this.wallet)) {\n return undefined;\n }\n\n const walletStrategy = this.getXService().walletStrategy;\n await walletStrategy.setWallet(this.wallet);\n const addresses = await walletStrategy.getAddresses();\n\n if (!addresses?.length) return undefined;\n\n const address = isEvmBrowserWallet(this.wallet) ? getInjectiveAddress(addresses[0]) : addresses[0];\n\n return {\n address,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {\n if (isEvmBrowserWallet(this.wallet)) {\n const walletStrategy = this.getXService().walletStrategy;\n await walletStrategy.setWallet(this.wallet);\n await walletStrategy.disconnect();\n }\n }\n\n public get icon(): string | undefined {\n return WALLET_ICONS[this.wallet];\n }\n}\n","import { XService } from '@/core/XService';\nimport { isNativeToken } from '@/utils';\nimport type { XToken } from '@sodax/types';\nimport { type Connection, PublicKey } from '@solana/web3.js';\nimport { getAccount, getAssociatedTokenAddressSync } from '@solana/spl-token';\nimport type { WalletContextState } from '@solana/wallet-adapter-react';\n\nexport class SolanaXService extends XService {\n private static instance: SolanaXService;\n\n public connection: Connection | undefined;\n public wallet: WalletContextState | undefined;\n\n private constructor() {\n super('SOLANA');\n }\n\n public static getInstance(): SolanaXService {\n if (!SolanaXService.instance) {\n SolanaXService.instance = new SolanaXService();\n }\n return SolanaXService.instance;\n }\n\n async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return BigInt(0);\n\n const connection = this.connection;\n if (!connection) {\n return BigInt(0);\n }\n\n try {\n if (isNativeToken(xToken)) {\n const newBalance = await connection.getBalance(new PublicKey(address));\n return BigInt(newBalance);\n }\n\n const tokenAccountPubkey = getAssociatedTokenAddressSync(new PublicKey(xToken.address), new PublicKey(address));\n const tokenAccount = await getAccount(connection, tokenAccountPubkey);\n return BigInt(tokenAccount.amount);\n } catch {\n return BigInt(0);\n }\n }\n}\n","import {\n type FeeBumpTransaction,\n type Memo,\n type MemoType,\n type Operation,\n SorobanRpc,\n type Transaction,\n} from '@stellar/stellar-sdk';\n\nclass CustomSorobanServer extends SorobanRpc.Server {\n private readonly customHeaders: Record<string, string>;\n\n constructor(serverUrl: string, customHeaders: Record<string, string>) {\n super(serverUrl, {\n allowHttp: true,\n });\n this.customHeaders = customHeaders;\n }\n\n async simulateTransaction(\n tx: Transaction<Memo<MemoType>, Operation[]>,\n ): Promise<SorobanRpc.Api.SimulateTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'simulateTransaction',\n params: {\n transaction: tx.toXDR(),\n },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error simulating TX! status: ${response.status}`);\n }\n return response.json().then(json => json.result);\n }\n\n async sendTransaction(tx: Transaction | FeeBumpTransaction): Promise<SorobanRpc.Api.SendTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'sendTransaction',\n params: {\n transaction: tx.toXDR(),\n },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error submitting TX! status: ${response.status}`);\n }\n return response.json().then(json => json.result);\n }\n\n async getTransaction(hash: string): Promise<SorobanRpc.Api.GetTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'getTransaction',\n params: { hash },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error getting TX! status: ${response.status}`);\n }\n return response.json().then(json => json.result);\n }\n}\n\nexport default CustomSorobanServer;\n","import {\n Address,\n Contract,\n type Memo,\n type MemoType,\n type Operation,\n TimeoutInfinite,\n type Transaction,\n type TransactionBuilder,\n scValToBigInt,\n xdr,\n} from '@stellar/stellar-sdk';\nimport type CustomSorobanServer from './CustomSorobanServer';\n\nexport const STELLAR_RLP_MSG_TYPE = { type: 'symbol' };\n\n// Can be used whenever you need an Address argument for a contract method\nexport const accountToScVal = (account: string) => new Address(account).toScVal();\n\nexport const simulateTx = async (\n tx: Transaction<Memo<MemoType>, Operation[]>,\n server: CustomSorobanServer,\n): Promise<any> => {\n const response = await server.simulateTransaction(tx);\n\n if (response !== undefined) {\n return response;\n }\n\n throw new Error('cannot simulate transaction');\n};\n\nexport const getTokenBalance = async (\n address: string,\n tokenId: string,\n txBuilder: TransactionBuilder,\n server: CustomSorobanServer,\n) => {\n const params = [accountToScVal(address)];\n const contract = new Contract(tokenId);\n const tx = txBuilder\n .addOperation(contract.call('balance', ...params))\n .setTimeout(TimeoutInfinite)\n .build();\n\n const result = await simulateTx(tx, server);\n\n return result.results ? scValToBigInt(xdr.ScVal.fromXDR(result.results[0].xdr, 'base64')) : 0n;\n};\n","import { XService } from '@/core/XService';\nimport { StellarWalletsKit, WalletNetwork, allowAllModules } from '@creit.tech/stellar-wallets-kit';\nimport * as StellarSdk from '@stellar/stellar-sdk';\nimport CustomSorobanServer from './CustomSorobanServer';\nimport { getTokenBalance } from './utils';\nimport type { XToken } from '@sodax/types';\n\n/** Base reserve in stroops (0.5 XLM). Each subentry (trustline, signer, data entry, offer) adds one base reserve. */\nconst STELLAR_BASE_RESERVE_STROOPS = 5_000_000;\n\n/** Horizon account fields used for minimum balance. Minimum = (2 + subentry_count + num_sponsoring - num_sponsored) * base_reserve + selling_liabilities. */\ninterface StellarAccountReserveFields {\n subentry_count?: number;\n num_sponsoring?: number;\n num_sponsored?: number;\n}\n\n/** Parse XLM balance string (e.g. \"198.8944970\") to stroops (1 XLM = 10^7 stroops). */\nfunction parseXlmBalanceToStroops(balanceStr: string): bigint {\n const parts = balanceStr.split('.');\n const whole = parts[0] ?? '0';\n const frac = (parts[1] ?? '').padEnd(7, '0').slice(0, 7);\n return BigInt(whole + frac);\n}\n\nexport class StellarXService extends XService {\n private static instance: StellarXService;\n\n public walletsKit: StellarWalletsKit;\n public server: StellarSdk.Horizon.Server;\n public sorobanServer: CustomSorobanServer;\n\n private constructor() {\n super('STELLAR');\n\n this.walletsKit = new StellarWalletsKit({\n network: WalletNetwork.PUBLIC,\n modules: allowAllModules(),\n });\n\n this.server = new StellarSdk.Horizon.Server('https://horizon.stellar.org', { allowHttp: true });\n this.sorobanServer = new CustomSorobanServer('https://rpc.ankr.com/stellar_soroban', {});\n }\n\n public static getInstance(): StellarXService {\n if (!StellarXService.instance) {\n StellarXService.instance = new StellarXService();\n }\n return StellarXService.instance;\n }\n\n async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return BigInt(0);\n\n const stellarAccount = await this.server.loadAccount(address);\n\n if (xToken.symbol === 'XLM') {\n const xlmBalance = stellarAccount.balances.find(balance => balance.asset_type === 'native');\n if (xlmBalance) {\n const rawBalanceStroops = parseXlmBalanceToStroops(xlmBalance.balance);\n const sellingLiabilitiesStroops = (xlmBalance as { selling_liabilities?: string }).selling_liabilities\n ? parseXlmBalanceToStroops((xlmBalance as { selling_liabilities: string }).selling_liabilities)\n : BigInt(0);\n const reserveFields = stellarAccount as unknown as StellarAccountReserveFields;\n const subentryCount = reserveFields.subentry_count ?? 0;\n const numSponsoring = reserveFields.num_sponsoring ?? 0;\n const numSponsored = reserveFields.num_sponsored ?? 0;\n // Minimum balance = (2 + subentry_count + num_sponsoring - num_sponsored) * base_reserve + selling_liabilities.\n // When account has sponsored reserves (num_sponsored > 0), those reserves are paid by the sponsor, so we don't subtract them.\n const reserveCount = Math.max(0, 2 + subentryCount + numSponsoring - numSponsored);\n const minBalanceStroops =\n BigInt(reserveCount) * BigInt(STELLAR_BASE_RESERVE_STROOPS) + sellingLiabilitiesStroops;\n const availableStroops =\n rawBalanceStroops > minBalanceStroops ? rawBalanceStroops - minBalanceStroops : BigInt(0);\n return availableStroops;\n }\n } else {\n try {\n const txBuilder = new StellarSdk.TransactionBuilder(stellarAccount, {\n fee: StellarSdk.BASE_FEE,\n networkPassphrase: StellarSdk.Networks.PUBLIC,\n });\n\n const balance = await getTokenBalance(address, xToken.address, txBuilder, this.sorobanServer);\n return balance;\n } catch (e) {\n console.error(`Error while fetching token on Stellar: ${xToken.symbol}, Error: ${e}`);\n }\n }\n\n return BigInt(0);\n }\n}\n","import type { XAccount } from '@/types';\n\nimport { XConnector } from '@/core';\nimport { StellarXService } from './StellarXService';\n\nexport type StellarWalletType = {\n icon: string;\n id: string;\n isAvailable: boolean;\n name: string;\n type: string;\n url: string;\n};\n\nexport class StellarWalletsKitXConnector extends XConnector {\n _wallet: StellarWalletType;\n\n constructor(wallet: StellarWalletType) {\n super('STELLAR', wallet.name, wallet.id);\n this._wallet = wallet;\n }\n\n getXService(): StellarXService {\n return StellarXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n const kit = this.getXService().walletsKit;\n\n if (!this._wallet) {\n return;\n }\n\n if (!this._wallet.isAvailable && this._wallet.url) {\n window.open(this._wallet.url, '_blank');\n return;\n }\n\n kit.setWallet(this._wallet.id);\n const { address } = await kit.getAddress();\n\n return {\n address: address,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {}\n\n public get icon() {\n return this._wallet.icon;\n }\n}\n","import { XService } from '@/core/XService';\nimport type { XToken } from '@sodax/types';\nimport { isNativeToken } from '@/utils';\n\nexport class SuiXService extends XService {\n private static instance: SuiXService;\n\n public suiClient: any; // TODO: define suiClient type\n public suiWallet: any; // TODO: define suiWallet type\n public suiAccount: any; // TODO: define suiAccount type\n\n private constructor() {\n super('SUI');\n }\n\n public static getInstance(): SuiXService {\n if (!SuiXService.instance) {\n SuiXService.instance = new SuiXService();\n }\n return SuiXService.instance;\n }\n\n // getBalance is not used because getBalances uses getAllBalances which returns all balances\n\n async getBalances(address: string | undefined, xTokens: readonly XToken[]): Promise<Record<string, bigint>> {\n if (!address) return {};\n try {\n const balancePromises = xTokens.map(async xToken => {\n let coinType = isNativeToken(xToken) ? '0x2::sui::SUI' : xToken.address;\n\n // TODO: hard coded for getting legacy bnUSD balance\n if (\n coinType ===\n '0x03917a812fe4a6d6bc779c5ab53f8a80ba741f8af04121193fc44e0f662e2ceb::balanced_dollar::BALANCED_DOLLAR'\n ) {\n coinType =\n '0x3917a812fe4a6d6bc779c5ab53f8a80ba741f8af04121193fc44e0f662e2ceb::balanced_dollar::BALANCED_DOLLAR';\n }\n\n const balance = await this.suiClient.getBalance({\n owner: address,\n coinType: coinType,\n });\n\n return {\n address: xToken.address,\n balance: balance ? BigInt(balance.totalBalance) : undefined,\n };\n });\n\n const results = await Promise.all(balancePromises);\n\n const tokenMap: Record<string, bigint> = {};\n results.forEach(result => {\n if (result.balance !== undefined) {\n tokenMap[result.address] = result.balance;\n }\n });\n\n return tokenMap;\n } catch (e) {\n console.log('error', e);\n return {};\n }\n }\n}\n","import type { XAccount } from '@/types';\n\nimport { XConnector } from '@/core';\nimport { SuiXService } from './SuiXService';\n\nexport class SuiXConnector extends XConnector {\n wallet: any;\n\n constructor(wallet: any) {\n // super('SUI', wallet.name, wallet.id);\n super('SUI', wallet?.name, wallet?.name);\n this.wallet = wallet;\n }\n\n getXService(): SuiXService {\n return SuiXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n return;\n }\n\n async disconnect(): Promise<void> {}\n\n public get icon() {\n return this.wallet?.icon;\n }\n}\n","import { XService } from '@/core/XService';\nimport type { IconService } from 'icon-sdk-js';\nimport * as IconSdkRaw from 'icon-sdk-js';\nimport type { XToken } from '@sodax/types';\nimport { isNativeToken } from '@/utils';\n\nconst IconSdk = ('default' in IconSdkRaw.default ? IconSdkRaw.default : IconSdkRaw) as typeof IconSdkRaw;\nconst { IconService: IconServiceConstructor, Builder: IconBuilder, Converter: IconConverter } = IconSdk;\nexport interface CallData {\n target: string;\n method: string;\n params: string[];\n}\n\nexport enum SupportedChainId {\n MAINNET = 1,\n}\n\ninterface ChainInfo {\n readonly name: string;\n readonly node: string;\n readonly APIEndpoint: string;\n readonly debugAPIEndpoint: string;\n readonly chainId: number;\n readonly tracker: string;\n}\n\nexport const CHAIN_INFO: { readonly [chainId: number]: ChainInfo } = {\n [SupportedChainId.MAINNET]: {\n name: 'ICON Mainnet',\n node: 'https://ctz.solidwallet.io',\n APIEndpoint: 'https://ctz.solidwallet.io/api/v3',\n debugAPIEndpoint: 'https://api.icon.community/api/v3d',\n chainId: 1,\n tracker: 'https://tracker.icon.community',\n },\n};\n\nexport class IconXService extends XService {\n private static instance: IconXService;\n\n public iconService: IconService;\n\n private constructor() {\n super('ICON');\n this.iconService = new IconServiceConstructor(\n new IconServiceConstructor.HttpProvider(CHAIN_INFO[SupportedChainId.MAINNET].APIEndpoint),\n );\n }\n\n public static getInstance(): IconXService {\n if (!IconXService.instance) {\n IconXService.instance = new IconXService();\n }\n return IconXService.instance;\n }\n\n private async getAggregateData(requireSuccess: boolean, calls: CallData[]) {\n const rawTx = new IconBuilder.CallBuilder()\n // muticall address on mainnet\n .to('cxa4aa9185e23558cff990f494c1fd2845f6cbf741')\n .method('tryAggregate')\n .params({ requireSuccess: IconConverter.toHex(requireSuccess ? 1 : 0), calls })\n .build();\n\n try {\n const result = await this.iconService.call(rawTx).execute();\n const aggs = result['returnData'];\n\n const data = aggs.map(agg => {\n if (agg['success'] === '0x0') {\n return null;\n }\n return agg['returnData'];\n });\n\n return data;\n } catch (err) {\n console.error(err);\n return Array(calls.length).fill(null);\n }\n }\n\n async getBalances(address: string | undefined, xTokens: XToken[]) {\n if (!address) return {};\n\n const balances = {};\n\n const nativeXToken = xTokens.find(xToken => isNativeToken(xToken));\n const nonNativeXTokens = xTokens.filter(xToken => !isNativeToken(xToken));\n\n if (nativeXToken) {\n const balance = await this.iconService.getBalance(address).execute();\n balances[nativeXToken.address] = BigInt(balance.toFixed());\n }\n\n const cds: CallData[] = nonNativeXTokens.map(token => {\n return {\n target: token.address,\n method: 'balanceOf',\n params: [address],\n };\n });\n\n const data: string[] = await this.getAggregateData(\n false,\n cds.filter(cd => cd.target.startsWith('cx')),\n );\n\n return nonNativeXTokens.reduce((agg, token, idx) => {\n const balance = data[idx];\n balances[token.address] = BigInt(balance);\n\n return agg;\n }, balances);\n }\n}\n","const ICONEX_RELAY_RESPONSE = 'ICONEX_RELAY_RESPONSE';\nconst ICONEX_RELAY_REQUEST = 'ICONEX_RELAY_REQUEST';\n\nexport enum ICONexRequestEventType {\n REQUEST_HAS_ACCOUNT = 'REQUEST_HAS_ACCOUNT',\n REQUEST_HAS_ADDRESS = 'REQUEST_HAS_ADDRESS',\n REQUEST_ADDRESS = 'REQUEST_ADDRESS',\n REQUEST_JSON = 'REQUEST_JSON',\n REQUEST_SIGNING = 'REQUEST_SIGNING',\n}\n\nexport enum ICONexResponseEventType {\n RESPONSE_HAS_ACCOUNT = 'RESPONSE_HAS_ACCOUNT',\n RESPONSE_HAS_ADDRESS = 'RESPONSE_HAS_ADDRESS',\n RESPONSE_ADDRESS = 'RESPONSE_ADDRESS',\n RESPONSE_JSON = 'RESPONSE_JSON',\n RESPONSE_SIGNING = 'RESPONSE_SIGNING',\n}\n\nexport interface ICONexRequestEvent {\n type: ICONexRequestEventType;\n payload?: any;\n}\n\nexport interface ICONexResponseEvent {\n type: ICONexResponseEventType;\n payload?: any;\n}\n\nexport type ICONexEvent = ICONexRequestEvent | ICONexResponseEvent;\n\nexport const request = (event: ICONexRequestEvent): Promise<ICONexResponseEvent> => {\n return new Promise((resolve, reject) => {\n const handler = evt => {\n window.removeEventListener(ICONEX_RELAY_RESPONSE, handler);\n resolve(evt.detail);\n };\n\n window.addEventListener(ICONEX_RELAY_RESPONSE, handler);\n window.dispatchEvent(\n new CustomEvent(ICONEX_RELAY_REQUEST, {\n detail: event,\n }),\n );\n });\n};\n","import type { XAccount } from '@/types';\nimport { ICONexRequestEventType, ICONexResponseEventType, request } from './iconex';\n\nimport { XConnector } from '@/core/XConnector';\n\nexport class IconHanaXConnector extends XConnector {\n constructor() {\n super('ICON', 'Hana Wallet', 'hana');\n }\n\n async connect(): Promise<XAccount | undefined> {\n const { hanaWallet } = window as any;\n if (window && !hanaWallet && !hanaWallet?.isAvailable) {\n window.open('https://chromewebstore.google.com/detail/hana-wallet/jfdlamikmbghhapbgfoogdffldioobgl', '_blank');\n return;\n }\n\n const detail = await request({\n type: ICONexRequestEventType.REQUEST_ADDRESS,\n });\n\n if (detail?.type === ICONexResponseEventType.RESPONSE_ADDRESS) {\n return {\n address: detail?.payload,\n xChainType: this.xChainType,\n };\n }\n\n return undefined;\n }\n\n async disconnect(): Promise<void> {\n console.log('HanaIconXConnector disconnected');\n }\n\n public get icon() {\n return 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/hana.svg';\n }\n}\n","import type { XAccount } from '@/types';\nimport { XConnector } from '@/core';\nimport type { StacksProvider } from '@stacks/connect';\nimport { request, disconnect } from '@stacks/connect';\n\nexport interface StacksProviderConfig {\n /** The provider ID matching the window path, e.g. 'LeatherProvider' or 'XverseProviders.BitcoinProvider' */\n id: string;\n name: string;\n icon: string;\n installUrl?: string;\n}\n\n/** Resolves a provider from `window` by dot-separated ID, matching @stacks/connect-ui's getProviderFromId */\nfunction getProviderFromId(id: string): StacksProvider | undefined {\n // biome-ignore lint/suspicious/noExplicitAny: window property traversal requires any\n return id.split('.').reduce<any>((acc, part) => acc?.[part], window) as StacksProvider | undefined;\n}\n\nexport class StacksXConnector extends XConnector {\n private readonly config: StacksProviderConfig;\n\n constructor(config: StacksProviderConfig) {\n super('STACKS', config.name, config.id);\n this.config = config;\n }\n\n async connect(): Promise<XAccount | undefined> {\n const provider = this.getProvider();\n\n if (!provider) {\n if (this.config.installUrl) {\n window.open(this.config.installUrl, '_blank');\n }\n return undefined;\n }\n\n const response = await request({ provider }, 'stx_getAddresses');\n // @ts-ignore\n const stxAddress = response.addresses.find(a => a.purpose === 'stacks');\n\n if (!stxAddress) {\n return undefined;\n }\n\n return {\n address: stxAddress.address,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {\n disconnect();\n }\n\n public get icon(): string {\n return this.config.icon;\n }\n\n public getProvider(): StacksProvider | undefined {\n return getProviderFromId(this.config.id);\n }\n}\n","import type { StacksProviderConfig } from './StacksXConnector';\n\n// Icons sourced from @stacks/connect DEFAULT_PROVIDERS\n// https://github.com/stx-labs/connect/blob/main/packages/connect/src/providers.ts\nconst LEATHER_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYuODM4NyIgZmlsbD0iIzEyMTAwRiIvPgo8cGF0aCBkPSJNNzQuOTE3MSA1Mi43MTE0QzgyLjQ3NjYgNTEuNTQwOCA5My40MDg3IDQzLjU4MDQgOTMuNDA4NyAzNy4zNzYxQzkzLjQwODcgMzUuNTAzMSA5MS44OTY4IDM0LjIxNTQgODkuNjg3MSAzNC4yMTU0Qzg1LjUwMDQgMzQuMjE1NCA3OC40MDYxIDQwLjUzNjggNzQuOTE3MSA1Mi43MTE0Wk0zOS45MTEgODMuNDk5MUMzMC4wMjU2IDgzLjQ5OTEgMjkuMjExNSA5My4zMzI0IDM5LjA5NjkgOTMuMzMyNEM0My41MTYzIDkzLjMzMjQgNDguODY2MSA5MS41NzY0IDUxLjY1NzMgODguNDE1N0M0Ny41ODY4IDg0LjkwMzggNDQuMjE0MSA4My40OTkxIDM5LjkxMSA4My40OTkxWk0xMDIuODI5IDc5LjI4NDhDMTAzLjQxIDk1Ljc5MDcgOTUuMDM2OSAxMDUuMDM5IDgwLjg0ODQgMTA1LjAzOUM3Mi40NzQ4IDEwNS4wMzkgNjguMjg4MSAxMDEuODc4IDU5LjMzMyA5Ni4wMjQ5QzU0LjY4MSAxMDEuMTc2IDQ1Ljg0MjMgMTA1LjAzOSAzOC41MTU0IDEwNS4wMzlDMTMuMjc4NSAxMDUuMDM5IDE0LjMyNTIgNzIuODQ2MyA0MC4wMjczIDcyLjg0NjNDNDUuMzc3MSA3Mi44NDYzIDQ5LjkxMjggNzQuMjUxMSA1NS43Mjc3IDc3Ljg4TDU5LjU2NTYgNjQuNDE3N0M0My43NDg5IDYwLjA4NjQgMzUuODQwNSA0Ny45MTE4IDQzLjYzMjYgMzAuNDY5M0g1Ni4xOTI5QzQ5LjIxNSA0Mi4wNTg2IDUzLjk4MzIgNTEuNjU3OCA2Mi44MjIgNTIuNzExNEM2Ny41OTAzIDM1LjczNzIgNzcuODI0NiAyMi41MDkgOTEuNDMxNiAyMi41MDlDOTkuMTA3NCAyMi41MDkgMTA1LjE1NSAyNy41NDI4IDEwNS4xNTUgMzYuNjczN0MxMDUuMTU1IDUxLjMwNjYgODYuMDgxOSA2My4yNDcxIDcxLjY2MDcgNjQuNDE3N0w2NS43Mjk1IDg1LjM3MjFDNzIuNDc0OCA5My4yMTUzIDkxLjE5OSAxMDAuODI0IDkxLjE5OSA3OS4yODQ4SDEwMi44MjlaIiBmaWxsPSIjRjVGMUVEIi8+Cjwvc3ZnPgo=';\n\nconst XVERSE_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MDAiIGhlaWdodD0iNjAwIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGZpbGw9IiMxNzE3MTciIGQ9Ik0wIDBoNjAwdjYwMEgweiIvPjxwYXRoIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgZD0iTTQ0MCA0MzUuNHYtNTFjMC0yLS44LTMuOS0yLjItNS4zTDIyMCAxNjIuMmE3LjYgNy42IDAgMCAwLTUuNC0yLjJoLTUxLjFjLTIuNSAwLTQuNiAyLTQuNiA0LjZ2NDcuM2MwIDIgLjggNCAyLjIgNS40bDc4LjIgNzcuOGE0LjYgNC42IDAgMCAxIDAgNi41bC03OSA3OC43Yy0xIC45LTEuNCAyLTEuNCAzLjJ2NTJjMCAyLjQgMiA0LjUgNC42IDQuNUgyNDljMi42IDAgNC42LTIgNC42LTQuNlY0MDVjMC0xLjIuNS0yLjQgMS40LTMuM2w0Mi40LTQyLjJhNC42IDQuNiAwIDAgMSA2LjQgMGw3OC43IDc4LjRhNy42IDcuNiAwIDAgMCA1LjQgMi4yaDQ3LjVjMi41IDAgNC42LTIgNC42LTQuNloiLz48cGF0aCBmaWxsPSIjRUU3QTMwIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGQ9Ik0zMjUuNiAyMjcuMmg0Mi44YzIuNiAwIDQuNiAyLjEgNC42IDQuNnY0Mi42YzAgNCA1IDYuMSA4IDMuMmw1OC43LTU4LjVjLjgtLjggMS4zLTIgMS4zLTMuMnYtNTEuMmMwLTIuNi0yLTQuNi00LjYtNC42TDM4NCAxNjBjLTEuMiAwLTIuNC41LTMuMyAxLjNsLTU4LjQgNTguMWE0LjYgNC42IDAgMCAwIDMuMiA3LjhaIi8+PC9nPjwvc3ZnPg==';\n\nconst ASIGNA_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMDEwMCIgZD0iTTAgMGgzMnYzMkgweiIvPjxwYXRoIGZpbGw9InVybCgjYSkiIGQ9Ik0xNS4xMSA1LjU1YTMgMyAwIDAgMC0xLjgyIDEuM2wtLjA1LjA4LS40My43Mi0uMDcuMTEtLjUuODUtLjA1LjA5LTEuMjkgMi4xOC0uMDQuMDctLjQ3LjgtLjA2LjEtLjQ2Ljc4LS4wNy4xMS0xLjYzIDIuNzYtLjA3LjExLS4zOC42Ni0uMDUuMDgtLjczIDEuMjQtLjM1LjYtLjQuNjctLjA1LjA5TDUuMSAyMC43bC0uMTEuMTgtLjE0LjIzLS4wNy4xMy0uMzMuNTUtLjA0LjA3di4wMWExLjI2IDEuMjYgMCAwIDAtLjE0LjQ3IDEuMzEgMS4zMSAwIDAgMCAxLjI0IDEuNGgxLjVsLjA1LS4wNi4wNC0uMDYuODctMS4yMS4wNS0uMDguNzctMS4wNy4wNS0uMDcuNC0uNTcuMDUtLjA2LjI0LS4zNGExLjUyIDEuNTIgMCAwIDEgMS4zOS0uNjIgMS41IDEuNSAwIDAgMSAuNjQuMiAxLjQ3IDEuNDcgMCAwIDEgLjczIDEuMjcgMS40NCAxLjQ0IDAgMCAxLS4yNy44NGwtLjYzLjg4LS4wNS4wNy0uMzIuNDUtLjA2LjA4LS4wOC4xMi0uMTIuMTYtLjA1LjA4aDIuMTNhMi4zMiAyLjMyIDAgMCAwIDEuNzctLjk2bDEuMTgtMS42My43Ny0xLjA4IDEuMy0xLjhhMS4yNCAxLjI0IDAgMCAxIC41NS0uNDNsLjA4LS4wM2ExLjMgMS4zIDAgMCAxIC4zLS4wNiAxLjI4IDEuMjggMCAwIDEgMS4xNS41NGwuMTEuMmExLjEzIDEuMTMgMCAwIDEgLjEuNDEgMS4xOSAxLjE5IDAgMCAxLS4yMy43N2wtLjAzLjA1LS41Ny44LS43Ljk4LS4yNy4zN2ExLjIyIDEuMjIgMCAwIDAtLjIuNSAxLjA1IDEuMDUgMCAwIDAtLjAyLjIzdi4wNmExLjE3IDEuMTcgMCAwIDAgLjE0LjQzbC4wMi4wNS4wNy4xYTEuNDQgMS40NCAwIDAgMCAuMS4xMWwuMDUuMDYuMDEuMDFhMS44IDEuOCAwIDAgMCAuMTQuMWMwIC4wMi4wMi4wMy4wNC4wM2ExIDEgMCAwIDAgLjA4LjA1bC4wNy4wNGExLjI1IDEuMjUgMCAwIDAgLjUuMWg2LjljLjEgMCAuMi0uMDEuMjktLjAzbC4wNi0uMDJhMS4yNyAxLjI3IDAgMCAwIC4yNy0uMS41Ny41NyAwIDAgMCAuMDctLjAzIDEuMjEgMS4yMSAwIDAgMCAuMjYtLjE5bC4wOC0uMDdhLjkyLjkyIDAgMCAwIC4xNS0uMTkgMS41NSAxLjU1IDAgMCAwIC4wOS0uMTdsLjAyLS4wNWExLjIyIDEuMjIgMCAwIDAgLjA4LS4yNnYtLjA0bC4wMi0uMDh2LS4wOGExLjMyIDEuMzIgMCAwIDAtLjItLjc0bC0xLjYtMi42NC0uMDYtLjEtLjItLjMyLS4zMy0uNTR2LS4wMWwtLjA1LS4wOC0xLjMtMi4xNS0uMDctLjEtLjA0LS4wNi0uOC0xLjMyLS4wNC0uMDctLjItLjM0LS4xLS4xNC0uMS0uMTYtLjUzLS45LS4xMy0uMi0uMDktLjE0LTIuMTctMy41Ny0uMDQtLjA3LS43Mi0xLjE5LS4wNS0uMDctLjQtLjY1YTIuNjUgMi42NSAwIDAgMC0uMy0uNCAyLjk2IDIuOTYgMCAwIDAtLjk3LS43NCAzLjA0IDMuMDQgMCAwIDAtMS4zLS4zYy0uMjUgMC0uNS4wNC0uNzQuMVoiLz48cGF0aCBmaWxsPSJ1cmwoI2IpIiBkPSJNMTkgMTYuM2E1LjQ1IDUuNDUgMCAwIDAtLjgzIDEuNTZsLS4wNC4xNWExLjM2IDEuMzYgMCAwIDEgLjI4LS4xNiAxLjI0IDEuMjQgMCAwIDEgLjM4LS4wOGguMWExLjI4IDEuMjggMCAwIDEgMS4wNS41NGMuMDQuMDYuMDguMTMuMS4yYTEuMjQgMS4yNCAwIDAgMSAuMDkuMjcgMS4xOSAxLjE5IDAgMCAxLS4yLjkxbC0uMDQuMDUtLjU3Ljc5LS43Ljk5LS4yNy4zN2ExLjIzIDEuMjMgMCAwIDAtLjIuNDIgMS4wNiAxLjA2IDAgMCAwLS4wMi4zMXYuMDZhMS4xNyAxLjE3IDAgMCAwIC4xNi40Ny45My45MyAwIDAgMCAuMDcuMSAxLjUgMS41IDAgMCAwIC4xLjEybC4wNS4wNmguMDFhMS45NCAxLjk0IDAgMCAwIC4wOS4wOCAxIDEgMCAwIDAgLjE3LjFsLjA3LjA0YTEuMjUgMS4yNSAwIDAgMCAuNS4xaDYuOWMuMSAwIC4yIDAgLjI4LS4wMmwuMDctLjAyYTEuMzIgMS4zMiAwIDAgMCAuMzQtLjEzbC4xNi0uMS4wMy0uMDNhMS4yOSAxLjI5IDAgMCAwIC4yLS4yIDIuNDMgMi40MyAwIDAgMCAuMTItLjE3Yy4wMy0uMDMuMDUtLjA4LjA3LS4xMmwuMDItLjA1YTEuMjEgMS4yMSAwIDAgMCAuMDktLjN2LS4wOGwuMDEtLjA5YTEuMzIgMS4zMiAwIDAgMC0uMi0uNzNsLTEuNi0yLjY0LS4wNi0uMS0uMi0uMzItLjMzLS41NHYtLjAybC0uMDUtLjA3LTEuMy0yLjE1LS4xMi0uMDctLjA3LS4wNGE0Ljk0IDQuOTQgMCAwIDAtMi40Ni0uNjdjLTEuMDMgMC0xLjc2LjU3LTIuMjYgMS4yWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMi4yOSAyMS4wOGMwIC4yOS0uMDkuNTgtLjI3Ljg0bC0xLjMxIDEuODRIN2wyLjUyLTMuNTNhMS41NCAxLjU0IDAgMCAxIDIuMS0uMzZjLjQzLjI4LjY2Ljc0LjY2IDEuMloiLz48cGF0aCBmaWxsPSIjMDAwIiBkPSJNMTEuMTYgMjEuMjVhLjU2LjU2IDAgMCAxLS41Ny41NS41Ni41NiAwIDAgMS0uNTctLjU2LjU2LjU2IDAgMCAxIC41Ny0uNTUuNTYuNTYgMCAwIDEgLjU3LjU2WiIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjE1LjIzIiB4Mj0iMTkuMyIgeTE9IjI1Ljc4IiB5Mj0iNi4xMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM2NTIyRjQiLz48c3RvcCBvZmZzZXQ9Ii41NSIgc3RvcC1jb2xvcj0iIzlCNkJGRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0E1ODVGRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMjIuNTkiIHgyPSIyNC44IiB5MT0iMjQuNzEiIHkyPSIxNS41MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM0MjFGOEIiLz48c3RvcCBvZmZzZXQ9Ii41NSIgc3RvcC1jb2xvcj0iIzcyMzBGRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzk3NzNGRiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvc3ZnPg==';\n\nconst FORDEFI_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZmlsbD0iIzEwMTExNCIgZD0iTTAgMGg0MnY0MkgweiIvPgogIDxwYXRoIGQ9Ik0xOS40NyAyNi44OUg1djMuNTdhNC41NyA0LjU3IDAgMCAwIDQuNTggNC41N2g1LjgzbDQuMDYtOC4xNFoiIGZpbGw9IiM3OTk0RkYiLz4KICA8cGF0aCBkPSJNNSAxNy40aDI3LjU4bC0zLjIgNi43OEg1VjE3LjRaIiBmaWxsPSIjNDg2REZGIi8+CiAgPHBhdGggZD0iTTE0LjY3IDdINXY3LjY4aDMzVjdoLTkuNjd2NS43NGgtMlY3aC05LjY3djUuNzRoLTEuOTlWN1oiIGZpbGw9IiM1Q0QxRkEiLz4KPC9zdmc+Cg==';\n\nexport const STACKS_PROVIDERS: StacksProviderConfig[] = [\n {\n id: 'LeatherProvider',\n name: 'Leather',\n icon: LEATHER_ICON,\n installUrl: 'https://chrome.google.com/webstore/detail/hiro-wallet/ldinpeekobnhjjdofggfgjlcehhmanlj',\n },\n {\n id: 'XverseProviders.BitcoinProvider',\n name: 'Xverse Wallet',\n icon: XVERSE_ICON,\n installUrl: 'https://chrome.google.com/webstore/detail/xverse-wallet/idnnbdplmphpflfnlkomgpfbpcgelopg',\n },\n {\n id: 'AsignaProvider',\n name: 'Asigna Multisig',\n icon: ASIGNA_ICON,\n installUrl: 'https://stx.asigna.io/',\n },\n {\n id: 'FordefiProviders.UtxoProvider',\n name: 'Fordefi',\n icon: FORDEFI_ICON,\n installUrl: 'https://chromewebstore.google.com/detail/fordefi/hcmehenccjdmfbojapcbcofkgdpbnlle',\n },\n];\n","import { useMemo } from 'react';\nimport { StacksXConnector } from './StacksXConnector';\nimport { STACKS_PROVIDERS } from './constants';\n\nexport function useStacksXConnectors(): StacksXConnector[] {\n return useMemo(() => STACKS_PROVIDERS.map(config => new StacksXConnector(config)), []);\n}\n","'use client';\n\nimport type { ChainType } from '@sodax/types';\nimport { create } from 'zustand';\nimport { createJSONStorage, persist, devtools } from 'zustand/middleware';\nimport { immer } from 'zustand/middleware/immer';\nimport type { XService } from './core';\nimport type { XConnection } from './types';\nimport { EvmXService } from './xchains/evm';\nimport { InjectiveXConnector, InjectiveXService } from './xchains/injective';\nimport { Wallet } from '@injectivelabs/wallet-base';\nimport { SolanaXService } from './xchains/solana/SolanaXService';\nimport { StellarXService } from './xchains/stellar';\nimport { SuiXService } from './xchains/sui';\nimport { IconXService } from './xchains/icon';\nimport { IconHanaXConnector } from './xchains/icon/IconHanaXConnector';\nimport { BitcoinXService } from './xchains/bitcoin';\nimport { UnisatXConnector } from './xchains/bitcoin/UnisatXConnector';\nimport { XverseXConnector } from './xchains/bitcoin/XverseXConnector';\nimport { OKXXConnector } from './xchains/bitcoin/OKXXConnector';\nimport { NearXService } from './xchains/near/NearXService';\nimport { StacksXService, StacksXConnector, STACKS_PROVIDERS } from './xchains/stacks';\n\ntype XWagmiStore = {\n xServices: Partial<Record<ChainType, XService>>;\n xConnections: Partial<Record<ChainType, XConnection>>;\n\n setXConnection: (xChainType: ChainType, xConnection: XConnection) => void;\n unsetXConnection: (xChainType: ChainType) => void;\n};\n\nconst initXServices = () => {\n const xServices = {};\n ['EVM', 'BITCOIN', 'INJECTIVE', 'STELLAR', 'SUI', 'SOLANA', 'ICON', 'NEAR', 'STACKS'].forEach(key => {\n const xChainType = key as ChainType;\n\n switch (xChainType) {\n // EVM, SUI, Solana wallet connectors are supported by their own sdks. wagmi, @mysten/dapp-kit, @solana/wallet-adapter-react.\n case 'EVM':\n xServices[xChainType] = EvmXService.getInstance();\n xServices[xChainType].setXConnectors([]);\n break;\n case 'SUI':\n xServices[xChainType] = SuiXService.getInstance();\n xServices[xChainType].setXConnectors([]);\n break;\n case 'SOLANA':\n xServices[xChainType] = SolanaXService.getInstance();\n xServices[xChainType].setXConnectors([]);\n break;\n case 'BITCOIN':\n xServices[xChainType] = BitcoinXService.getInstance();\n xServices[xChainType].setXConnectors([new UnisatXConnector(), new XverseXConnector(), new OKXXConnector()]);\n break;\n\n // Injective, Stellar, Icon wallet connectors are supported by sodax wallet-sdk-react sdk.\n case 'INJECTIVE':\n xServices[xChainType] = InjectiveXService.getInstance();\n xServices[xChainType].setXConnectors([\n // EVM wallets (auto-detected via EIP-6963)\n new InjectiveXConnector('MetaMask', Wallet.Metamask),\n // Cosmos wallets (detected via window globals)\n new InjectiveXConnector('Keplr', Wallet.Keplr),\n new InjectiveXConnector('Leap', Wallet.Leap),\n ]);\n break;\n case 'STELLAR':\n xServices[xChainType] = StellarXService.getInstance();\n xServices[xChainType].setXConnectors([]);\n break;\n case 'ICON':\n xServices[xChainType] = IconXService.getInstance();\n xServices[xChainType].setXConnectors([new IconHanaXConnector()]);\n break;\n case 'NEAR':\n xServices[xChainType] = NearXService.getInstance();\n xServices[xChainType].setXConnectors([]);\n break;\n case 'STACKS':\n xServices[xChainType] = StacksXService.getInstance();\n xServices[xChainType].setXConnectors(STACKS_PROVIDERS.map(config => new StacksXConnector(config)));\n break;\n default:\n break;\n }\n });\n\n return xServices;\n};\n\nexport const useXWagmiStore = create<XWagmiStore>()(\n devtools(\n persist(\n immer((set, get) => ({\n xServices: initXServices(),\n xConnections: {},\n setXConnection: (xChainType: ChainType, xConnection: XConnection) => {\n set(state => {\n state.xConnections[xChainType] = xConnection;\n });\n },\n unsetXConnection: (xChainType: ChainType) => {\n set(state => {\n delete state.xConnections[xChainType];\n });\n },\n })),\n {\n name: 'xwagmi-store',\n storage: createJSONStorage(() => localStorage),\n partialize: state => ({ xConnections: state.xConnections }),\n },\n ),\n { name: 'xwagmi-store' },\n ),\n);\n","import type { ChainType } from '@sodax/types';\nimport { useCurrentAccount, useCurrentWallet } from '@mysten/dapp-kit';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { useMemo } from 'react';\nimport { useAccount, useConnections } from 'wagmi';\nimport type { XConnection } from '../types';\nimport { useXWagmiStore } from '../useXWagmiStore';\n\n/**\n * Hook for accessing connection details for a specific blockchain\n *\n * Retrieves the current connection state for the specified chain type,\n * including the connected account and connector ID.\n *\n * @param {ChainType} xChainType - The type of blockchain to get connection details for\n * @returns {XConnection | undefined} Connection details including account and connector ID, or undefined if not connected\n *\n * @example\n * ```ts\n * const connection = useXConnection('EVM');\n *\n * if (connection) {\n * console.log('Connected account:', connection.xAccount.address);\n * console.log('Using connector:', connection.xConnectorId);\n * }\n * ```\n */\nexport function useXConnection(xChainType: ChainType | undefined): XConnection | undefined {\n const xConnection = useXWagmiStore(state => (xChainType ? state.xConnections?.[xChainType] : undefined));\n\n const evmConnections = useConnections();\n const { address: evmAddress } = useAccount();\n const suiAccount = useCurrentAccount();\n const suiCurrentWallet = useCurrentWallet();\n const solanaWallet = useWallet();\n\n const xConnection2 = useMemo(() => {\n if (!xChainType) {\n return undefined;\n }\n\n switch (xChainType) {\n case 'EVM':\n return {\n xAccount: { address: evmAddress as string, xChainType },\n xConnectorId: evmConnections?.[0]?.connector.id,\n };\n\n case 'SUI':\n if (suiCurrentWallet.currentWallet && suiCurrentWallet.connectionStatus === 'connected') {\n return {\n xAccount: { address: suiAccount?.address, xChainType },\n xConnectorId: suiCurrentWallet.currentWallet.name,\n };\n }\n return undefined;\n\n case 'SOLANA':\n if (solanaWallet.connected) {\n return {\n xAccount: { address: solanaWallet.publicKey?.toString(), xChainType },\n xConnectorId: `${solanaWallet.wallet?.adapter.name}`,\n };\n }\n return undefined;\n default:\n return xConnection;\n }\n }, [xChainType, xConnection, evmAddress, suiAccount, evmConnections, suiCurrentWallet, solanaWallet]);\n\n return xConnection2;\n}\n","import { useMemo } from 'react';\n\nimport { ChainTypeArr, type ChainId, type ChainType } from '@sodax/types';\n\nimport type { XAccount } from '../types';\nimport { useXConnection } from './useXConnection';\nimport { getXChainType } from '../actions';\n\n/**\n * Hook to get the current connected account for a specific blockchain\n *\n * @param chainIdentifier - The blockchain identifier (either chain type like 'EVM' or chain ID like '0xa86a.avax')\n * @returns {XAccount} The current connected account, or undefined if no account is connected\n *\n * @example\n * ```ts\n * // Using ChainType (preferred)\n * const { address } = useXAccount('EVM');\n *\n * // Using ChainId\n * const { address } = useXAccount('0xa86a.avax');\n *\n * // Returns: { address: string | undefined, xChainType: ChainType | undefined }\n * ```\n */\nfunction isChainType(chainIdentifier: ChainType | ChainId): chainIdentifier is ChainType {\n return ChainTypeArr.includes(chainIdentifier as ChainType);\n}\n\nexport function useXAccount(chainIdentifier?: ChainType | ChainId): XAccount {\n const resolvedChainType: ChainType | undefined = chainIdentifier\n ? isChainType(chainIdentifier)\n ? chainIdentifier\n : getXChainType(chainIdentifier as ChainId)\n : undefined;\n\n const xConnection = useXConnection(resolvedChainType);\n\n const xAccount = useMemo((): XAccount => {\n if (!resolvedChainType) {\n return {\n address: undefined,\n xChainType: undefined,\n };\n }\n\n return xConnection?.xAccount || { address: undefined, xChainType: resolvedChainType };\n }, [resolvedChainType, xConnection]);\n\n return xAccount;\n}\n","import { useMemo } from 'react';\n\nimport type { ChainType } from '@sodax/types';\nimport { useCurrentAccount } from '@mysten/dapp-kit';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { useAccount } from 'wagmi';\n\nimport type { XAccount } from '../types';\nimport { useXWagmiStore } from '../useXWagmiStore';\n\nexport function useXAccounts() {\n const xChainTypes = useXWagmiStore(state => Object.keys(state.xServices));\n const xConnections = useXWagmiStore(state => state.xConnections);\n const { address: evmAddress } = useAccount();\n const suiAccount = useCurrentAccount();\n const solanaWallet = useWallet();\n\n const xAccounts = useMemo(() => {\n const result: Partial<Record<ChainType, XAccount>> = {};\n for (const xChainType of xChainTypes) {\n const xConnection = xConnections[xChainType];\n\n if (xConnection?.xAccount) {\n result[xChainType] = xConnection.xAccount;\n } else {\n result[xChainType] = {\n address: undefined,\n xChainType,\n };\n }\n }\n\n if (evmAddress) {\n result['EVM'] = {\n address: evmAddress,\n xChainType: 'EVM',\n };\n }\n if (suiAccount) {\n result['SUI'] = {\n address: suiAccount.address,\n xChainType: 'SUI',\n };\n }\n if (solanaWallet.publicKey) {\n result['SOLANA'] = {\n address: solanaWallet.publicKey.toString(),\n xChainType: 'SOLANA',\n };\n }\n\n return result;\n }, [xChainTypes, xConnections, evmAddress, suiAccount, solanaWallet]);\n\n return xAccounts;\n}\n","import type { XAccount } from '@/types';\nimport { useConnectWallet } from '@mysten/dapp-kit';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { useMutation, type UseMutationResult } from '@tanstack/react-query';\nimport { useConnect } from 'wagmi';\nimport type { XConnector } from '../core/XConnector';\nimport { useXWagmiStore } from '../useXWagmiStore';\nimport type { EvmXConnector } from '../xchains/evm';\nimport type { SolanaXConnector } from '../xchains/solana';\nimport type { SuiXConnector } from '../xchains/sui';\n\n/**\n * Hook for connecting to various blockchain wallets across different chains\n *\n * Handles connection logic for EVM, SUI, Solana and other supported chains.\n * Sets up wallet connections and stores connection state in XWagmiStore.\n *\n * @param {void} - No parameters required\n * @returns {UseMutationResult<XAccount | undefined, Error, XConnector>} Mutation result containing:\n * - mutateAsync: Function to connect a wallet\n * - isPending: Boolean indicating if connection is in progress\n * - error: Any error that occurred\n * - data: Connected account data if successful\n *\n * @example\n * ```ts\n * const { mutateAsync: connect, isPending } = useXConnect();\n *\n * const handleConnect = async (connector: XConnector) => {\n * try {\n * await connect(connector);\n * } catch (err) {\n * console.error(err);\n * }\n * };\n * ```\n */\nexport function useXConnect(): UseMutationResult<XAccount | undefined, Error, XConnector> {\n const setXConnection = useXWagmiStore(state => state.setXConnection);\n\n const { connectAsync: evmConnectAsync } = useConnect();\n const { mutateAsync: suiConnectAsync } = useConnectWallet();\n\n const { select, connect } = useWallet();\n\n return useMutation({\n mutationFn: async (xConnector: XConnector) => {\n const xChainType = xConnector.xChainType;\n let xAccount: XAccount | undefined;\n\n switch (xChainType) {\n case 'EVM':\n await evmConnectAsync({ connector: (xConnector as EvmXConnector).connector });\n break;\n case 'SUI':\n await suiConnectAsync({ wallet: (xConnector as SuiXConnector).wallet });\n break;\n case 'SOLANA': {\n const walletName = (xConnector as SolanaXConnector).wallet.adapter.name;\n\n select(walletName);\n\n const adapter = (xConnector as SolanaXConnector).wallet.adapter;\n\n if (!adapter) throw new Error('No adapter found for Solana wallet');\n\n if (walletName === 'MetaMask') {\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Wallet connection timeout'));\n }, 30000);\n\n const handleConnect = () => {\n cleanup();\n resolve();\n };\n\n const handleError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n adapter.off('connect', handleConnect);\n adapter.off('error', handleError);\n };\n\n adapter.on('connect', handleConnect);\n adapter.on('error', handleError);\n\n connect().catch(err => {\n cleanup();\n reject(err);\n });\n });\n }\n\n break;\n }\n\n default:\n xAccount = await xConnector.connect();\n break;\n }\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 { XAccount } from '@/types';\n\nimport { XConnector } from '@/core';\nimport { SolanaXService } from './SolanaXService';\n\nexport class SolanaXConnector extends XConnector {\n wallet: any;\n constructor(wallet: any) {\n super('SOLANA', wallet?.adapter.name, wallet?.adapter.name);\n this.wallet = wallet;\n }\n\n getXService(): SolanaXService {\n return SolanaXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n return;\n }\n\n async disconnect(): Promise<void> {}\n\n public get icon() {\n return this.wallet?.adapter.icon;\n }\n}\n","import { useXService } from '@/hooks';\nimport { type UseQueryResult, useQuery } from '@tanstack/react-query';\n\nimport { StellarWalletsKitXConnector, type StellarXService } from '.';\n\nexport const useStellarXConnectors = (): UseQueryResult<StellarWalletsKitXConnector[] | undefined, Error | null> => {\n const xService = useXService('STELLAR') as StellarXService;\n\n return useQuery({\n queryKey: ['stellar-wallets', xService],\n queryFn: async () => {\n if (!xService) {\n return [];\n }\n\n const wallets = await xService.walletsKit.getSupportedWallets();\n\n return wallets.filter(wallet => wallet.isAvailable).map(wallet => new StellarWalletsKitXConnector(wallet));\n },\n });\n};\n","import type { ChainType } from '@sodax/types';\nimport type { XService } from '../core';\nimport { useXWagmiStore } from '../useXWagmiStore';\n\nexport function useXService(xChainType: ChainType | undefined): XService | undefined {\n const xService = useXWagmiStore(state => (xChainType ? state.xServices[xChainType] : undefined));\n return xService;\n}\n","import type { XAccount } from '@/types';\n\nimport { XConnector } from '@/core';\nimport type { NearWalletBase } from '@hot-labs/near-connect';\nimport { NearXService } from './NearXService';\n\nexport class NearXConnector extends XConnector {\n _wallet: NearWalletBase;\n\n constructor(wallet: NearWalletBase) {\n super('NEAR', wallet.manifest.name, wallet.manifest.id);\n this._wallet = wallet;\n }\n\n getXService(): NearXService {\n return NearXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n const walletSelector = this.getXService().walletSelector;\n const wallet = await walletSelector.connect({ walletId: this._wallet.manifest.id });\n const accounts = await wallet.getAccounts();\n\n if (accounts.length === 0 || accounts[0] === undefined) {\n return undefined;\n }\n\n return {\n address: accounts[0].accountId,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {\n const walletSelector = this.getXService().walletSelector;\n await walletSelector.disconnect(this._wallet);\n }\n\n public get icon() {\n return this._wallet.manifest.icon;\n }\n}\n","import { useXService } from '@/hooks';\nimport { type UseQueryResult, useQuery } from '@tanstack/react-query';\n\nimport { NearXConnector } from './NearXConnector';\nimport type { NearXService } from './NearXService';\n\nexport const useNearXConnectors = (): UseQueryResult<NearXConnector[] | undefined, Error | null> => {\n const xService = useXService('NEAR') as NearXService;\n\n return useQuery({\n queryKey: ['near-wallets'],\n queryFn: async () => {\n if (!xService) {\n return [];\n }\n\n await xService.walletSelector.whenManifestLoaded;\n const wallets = xService.walletSelector.availableWallets;\n\n return wallets.map(wallet => new NearXConnector(wallet));\n },\n });\n};\n","import type { ChainType } from '@sodax/types';\nimport { useWallets } from '@mysten/dapp-kit';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { useMemo } from 'react';\nimport { useConnectors } from 'wagmi';\nimport type { XConnector } from '../core';\nimport { EvmXConnector } from '../xchains/evm';\nimport { SolanaXConnector } from '../xchains/solana';\nimport { useStellarXConnectors } from '../xchains/stellar/useStellarXConnectors';\nimport { SuiXConnector } from '../xchains/sui';\nimport { useXService } from './useXService';\nimport { useNearXConnectors } from '../xchains/near/useNearXConnectors';\nimport { useStacksXConnectors } from '../xchains/stacks/useStacksXConnectors';\n\n/**\n * Hook to retrieve available wallet connectors for a specific blockchain type.\n *\n * This hook aggregates wallet connectors from different blockchain ecosystems:\n * - EVM: Uses wagmi connectors\n * - Sui: Uses Sui wallet adapters\n * - Stellar: Uses custom Stellar connectors\n * - Solana: Uses Solana wallet adapters (filtered to installed wallets only)\n *\n * @param xChainType - The blockchain type to get connectors for ('EVM' | 'SUI' | 'STELLAR' | 'SOLANA' | 'NEAR' | 'STACKS')\n * @returns An array of XConnector instances compatible with the specified chain type\n */\n\nexport function useXConnectors(xChainType: ChainType | undefined): XConnector[] {\n const xService = useXService(xChainType);\n const evmConnectors = useConnectors();\n const suiWallets = useWallets();\n const { data: stellarXConnectors } = useStellarXConnectors();\n const { data: nearXConnectors } = useNearXConnectors();\n const stacksXConnectors = useStacksXConnectors();\n const { wallets: solanaWallets } = useWallet();\n\n const xConnectors = useMemo((): XConnector[] => {\n if (!xChainType || !xService) {\n return [];\n }\n\n switch (xChainType) {\n case 'EVM':\n return evmConnectors.map(connector => new EvmXConnector(connector));\n case 'SUI':\n return suiWallets.map(wallet => new SuiXConnector(wallet));\n case 'STELLAR':\n return stellarXConnectors || [];\n case 'SOLANA':\n return solanaWallets\n .filter(wallet => wallet.readyState === 'Installed')\n .map(wallet => new SolanaXConnector(wallet));\n case 'NEAR':\n return nearXConnectors || [];\n case 'STACKS':\n return stacksXConnectors;\n default:\n return xService.getXConnectors();\n }\n }, [\n xService,\n xChainType,\n evmConnectors,\n suiWallets,\n stellarXConnectors,\n solanaWallets,\n nearXConnectors,\n stacksXConnectors,\n ]);\n\n return xConnectors;\n}\n","import type { ChainType } from '@sodax/types';\nimport { useDisconnectWallet } from '@mysten/dapp-kit';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { useCallback } from 'react';\nimport { useDisconnect } from 'wagmi';\nimport { getXService } from '../actions';\nimport { useXWagmiStore } from '../useXWagmiStore';\nimport type { NearXService } from '@/xchains/near/NearXService';\n\n/**\n * Hook for disconnecting from a specific blockchain wallet\n *\n * Handles disconnection logic for EVM, SUI, Solana and other supported chains.\n * Clears connection state from XWagmiStore.\n *\n * @param {void} - No parameters required\n * @returns {(xChainType: ChainType) => Promise<void>} Async function that disconnects from the specified chain\n *\n * @example\n * ```ts\n * const disconnect = useXDisconnect();\n *\n * const handleDisconnect = async (xChainType: ChainType) => {\n * await disconnect(xChainType);\n * };\n * ```\n */\nexport function useXDisconnect(): (xChainType: ChainType) => Promise<void> {\n // Get connection state and disconnect handler from store\n const xConnections = useXWagmiStore(state => state.xConnections);\n const unsetXConnection = useXWagmiStore(state => state.unsetXConnection);\n\n // Get chain-specific disconnect handlers\n const { disconnectAsync } = useDisconnect();\n const { mutateAsync: suiDisconnectAsync } = useDisconnectWallet();\n const solanaWallet = useWallet();\n\n return useCallback(\n async (xChainType: ChainType) => {\n // Handle disconnection based on chain type\n switch (xChainType) {\n case 'EVM':\n await disconnectAsync();\n break;\n case 'SUI':\n await suiDisconnectAsync();\n break;\n case 'SOLANA':\n await solanaWallet.disconnect();\n break;\n\n case 'NEAR': {\n const nearXService = getXService('NEAR') as NearXService;\n nearXService.walletSelector.disconnect();\n break;\n }\n\n default: {\n // Handle other chain types\n const xService = getXService(xChainType);\n const xConnectorId = xConnections[xChainType]?.xConnectorId;\n const xConnector = xConnectorId ? xService.getXConnectorById(xConnectorId) : undefined;\n await xConnector?.disconnect();\n break;\n }\n }\n\n // Clear connection state from store\n unsetXConnection(xChainType);\n },\n [xConnections, unsetXConnection, disconnectAsync, suiDisconnectAsync, solanaWallet],\n );\n}\n","import { getXChainType } from '@/actions';\nimport { type UseQueryResult, useQuery } from '@tanstack/react-query';\nimport type { ChainId, XToken } from '@sodax/types';\nimport { useXService } from './useXService';\n\n/**\n * Hook to fetch token balances for multiple tokens on a specific chain\n *\n * @param params - Query parameters object\n * @param params.xChainId - Chain identifier (e.g. '0xa86a.avax', '0x1.base', '0x2.bsc', '0x89.polygon', '0x1.optimism')\n * @param params.xTokens - Array of token objects to fetch balances for.\n * @param params.address - Wallet address to fetch balances for. If undefined, returns empty object\n *\n * @returns UseQueryResult containing an object mapping token addresses to their balances as bigints.\n * The balances are denominated in the token's smallest unit (e.g. wei for ETH).\n * Returns empty object if wallet is not connected or service is unavailable.\n */\n/**\n * @example\n * ```tsx\n * // Example usage in a component\n * function TokenBalances({ tokens }: { tokens: XToken[] }) {\n * const { address } = useXAccount('EVM');\n * const { data: balances } = useXBalances({\n * xChainId: '0xa86a.avax',\n * xTokens: tokens,\n * address,\n * });\n *\n * return (\n * <div>\n * {tokens.map(token => (\n * <div key={token.address}>\n * {token.symbol}: {formatUnits(balances?.[token.address] || 0n, token.decimals)}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\n\nexport function useXBalances({\n xChainId,\n xTokens,\n address,\n}: { xChainId: ChainId; xTokens: readonly XToken[]; address: string | undefined }): UseQueryResult<{\n [key: string]: bigint;\n}> {\n const xService = useXService(getXChainType(xChainId));\n return useQuery({\n queryKey: ['xBalances', xChainId, xTokens.map(x => x.symbol), address],\n queryFn: async () => {\n if (!xService) {\n return {};\n }\n\n const balances = await xService.getBalances(address, xTokens);\n\n return balances;\n },\n enabled: !!xService && !!address && (xTokens?.length ?? 0) > 0,\n refetchInterval: 5_000,\n });\n}\n","import type { InjectiveXService } from '@/xchains/injective';\nimport { Wallet } from '@injectivelabs/wallet-base';\nimport React from 'react';\nimport { useEffect } from 'react';\nimport { useXService } from './useXService';\nimport type { EvmWalletStrategy } from '@injectivelabs/wallet-evm';\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 injectiveXService = useXService('INJECTIVE') as unknown as InjectiveXService;\n const [ethereumChainId, setEthereumChainId] = React.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 (e) {\n console.warn('Failed to get Ethereum chain ID:', e);\n }\n };\n getEthereumChainId();\n\n try {\n (walletStrategy.getStrategy() as EvmWalletStrategy).onChainIdChanged(getEthereumChainId);\n } catch (e) {\n console.warn('Failed to subscribe to chain ID changes:', e);\n }\n }, [injectiveXService?.walletStrategy]);\n\n return ethereumChainId;\n}\n","import { useCallback, useMemo } from 'react';\nimport { useAccount, useSwitchChain } from 'wagmi';\nimport { baseChainInfo, type ChainId } from '@sodax/types';\nimport { getXChainType } from '@/actions';\nimport type { InjectiveXService } from '@/xchains/injective';\nimport { useXService } from '@/hooks/useXService';\nimport useEthereumChainId from './useEthereumChainId';\nimport { mainnet } from 'viem/chains';\nimport { Wallet } from '@injectivelabs/wallet-base';\n\ninterface UseEvmSwitchChainReturn {\n isWrongChain: boolean;\n handleSwitchChain: () => void;\n}\n\n/**\n * Hook to handle EVM chain switching functionality\n *\n * @param expectedXChainId - The target chain ID to switch to (e.g. '0xa.optimism', '0x89.polygon')\n * @returns {Object} Object containing:\n * - isWrongChain: boolean indicating if current chain differs from expected chain\n * - handleSwitchChain: function to trigger chain switch to expected chain\n *\n * @example\n * ```tsx\n * function ChainSwitchButton({ targetChain }: { targetChain: ChainId }) {\n * const { isWrongChain, handleSwitchChain } = useEvmSwitchChain(targetChain);\n *\n * return (\n * <Button onClick={handleSwitchChain} disabled={!isWrongChain}>\n * Switch Network\n * </Button>\n * );\n * }\n * ```\n */\n\nexport const switchEthereumChain = async () => {\n const metamaskProvider = (window as any).ethereum as any;\n\n return await Promise.race([\n metamaskProvider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: '0x1' }],\n }),\n new Promise<void>(resolve =>\n metamaskProvider.on('change', ({ chain }: { chain: { id: number } }) => {\n if (chain?.id === 1) {\n resolve();\n }\n }),\n ),\n ]);\n};\n\nexport const useEvmSwitchChain = (expectedXChainId: ChainId): UseEvmSwitchChainReturn => {\n const xChainType = getXChainType(expectedXChainId);\n const expectedChainId = baseChainInfo[expectedXChainId].chainId as number;\n\n const injectiveXService = useXService('INJECTIVE') as unknown as InjectiveXService;\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 &&\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 {\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 {\n ChainId,\n IEvmWalletProvider,\n IIconWalletProvider,\n IInjectiveWalletProvider,\n INearWalletProvider,\n ISolanaWalletProvider,\n IStacksWalletProvider,\n IStellarWalletProvider,\n ISuiWalletProvider,\n IBitcoinWalletProvider,\n} from '@sodax/types';\nimport { useMemo } from 'react';\nimport { BitcoinXService } from '../xchains/bitcoin/BitcoinXService';\nimport type { BitcoinXConnector } from '../xchains/bitcoin/BitcoinXConnector';\nimport {\n EvmWalletProvider,\n IconWalletProvider,\n SuiWalletProvider,\n InjectiveWalletProvider,\n StellarWalletProvider,\n SolanaWalletProvider,\n NearWalletProvider,\n StacksWalletProvider,\n} from '@sodax/wallet-sdk-core';\nimport { getXChainType } from '../actions';\nimport { usePublicClient, useWalletClient } from 'wagmi';\nimport { type SolanaXService, type StellarXService, useXAccount, useXService } from '..';\nimport type { SuiXService } from '../xchains/sui/SuiXService';\nimport { CHAIN_INFO, SupportedChainId } from '../xchains/icon/IconXService';\nimport type { InjectiveXService } from '../xchains/injective/InjectiveXService';\nimport type { NearXService } from '../xchains/near/NearXService';\nimport { useXConnection } from './useXConnection';\nimport { useXConnectors } from './useXConnectors';\nimport type { StacksXConnector } from '../xchains/stacks';\n\n/**\n * Hook to get the appropriate wallet provider based on the chain type.\n * Supports EVM, SUI, ICON, INJECTIVE, STELLAR, SOLANA and NEAR chains.\n *\n * @param {ChainId | undefined} spokeChainId - The chain ID to get the wallet provider for. Can be any valid ChainId value.\n * @returns {EvmWalletProvider | SuiWalletProvider | IconWalletProvider | InjectiveWalletProvider | undefined}\n * The appropriate wallet provider instance for the given chain ID, or undefined if:\n * - No chain ID is provided\n * - Chain type is not supported\n * - Required wallet provider options are not available\n *\n * @example\n * ```tsx\n * // Get wallet provider for a specific chain\n * const walletProvider = useWalletProvider('sui');\n * ```\n */\nexport function useWalletProvider(\n spokeChainId: ChainId | undefined,\n):\n | IEvmWalletProvider\n | ISuiWalletProvider\n | IIconWalletProvider\n | IInjectiveWalletProvider\n | IStellarWalletProvider\n | ISolanaWalletProvider\n | IBitcoinWalletProvider\n | INearWalletProvider\n | IStacksWalletProvider\n | undefined {\n const xChainType = getXChainType(spokeChainId);\n // EVM-specific hooks\n const evmPublicClient = usePublicClient();\n\n const { data: evmWalletClient } = useWalletClient();\n\n // Cross-chain hooks\n const xService = useXService(getXChainType(spokeChainId));\n const xAccount = useXAccount(spokeChainId);\n const stacksConnection = useXConnection('STACKS');\n const stacksConnectors = useXConnectors('STACKS');\n const xConnection = useXConnection(xChainType);\n\n return useMemo(() => {\n switch (xChainType) {\n case 'EVM': {\n if (!evmWalletClient) {\n return undefined;\n }\n if (!evmPublicClient) {\n return undefined;\n }\n\n return new EvmWalletProvider({\n walletClient: evmWalletClient,\n publicClient: evmPublicClient,\n });\n }\n\n case 'SUI': {\n const suiXService = xService as SuiXService;\n const { client, wallet, account } = {\n client: suiXService.suiClient,\n wallet: suiXService.suiWallet,\n account: suiXService.suiAccount,\n };\n\n return new SuiWalletProvider({ client, wallet, account });\n }\n\n case 'ICON': {\n const { walletAddress, rpcUrl } = {\n walletAddress: xAccount.address,\n rpcUrl: CHAIN_INFO[SupportedChainId.MAINNET].APIEndpoint,\n };\n\n return new IconWalletProvider({\n walletAddress: walletAddress as `hx${string}` | undefined,\n rpcUrl: rpcUrl as `http${string}`,\n });\n }\n\n case 'INJECTIVE': {\n const injectiveXService = xService as InjectiveXService;\n if (!injectiveXService) {\n return undefined;\n // throw new Error('InjectiveXService is not initialized');\n }\n\n return new InjectiveWalletProvider({\n msgBroadcaster: injectiveXService.msgBroadcaster,\n });\n }\n\n case 'STELLAR': {\n const stellarXService = xService as StellarXService;\n if (!stellarXService.walletsKit) {\n return undefined;\n }\n\n return new StellarWalletProvider({\n type: 'BROWSER_EXTENSION',\n walletsKit: stellarXService.walletsKit,\n network: 'PUBLIC',\n });\n }\n\n case 'SOLANA': {\n const solanaXService = xService as SolanaXService;\n\n if (!solanaXService.wallet) {\n return undefined;\n }\n\n if (!solanaXService.connection) {\n return undefined;\n }\n\n return new SolanaWalletProvider({\n wallet: solanaXService.wallet,\n endpoint: solanaXService.connection.rpcEndpoint,\n });\n }\n\n case 'BITCOIN': {\n if (!xConnection?.xConnectorId) return undefined;\n const connector = BitcoinXService.getInstance().getXConnectorById(xConnection.xConnectorId) as\n | BitcoinXConnector\n | undefined;\n if (!connector) return undefined;\n // Recreate from window extension object — works after page reload without reconnect\n return connector.recreateWalletProvider(xConnection.xAccount);\n }\n\n case 'NEAR': {\n const nearXService = xService as NearXService;\n if (!nearXService.walletSelector) {\n return undefined;\n }\n\n return new NearWalletProvider({ wallet: nearXService.walletSelector });\n }\n\n case 'STACKS': {\n const address = xAccount.address;\n if (!address) {\n return undefined;\n }\n\n const activeStacksConnector = stacksConnectors.find(c => c.id === stacksConnection?.xConnectorId) as\n | StacksXConnector\n | undefined;\n\n return new StacksWalletProvider({ address, provider: activeStacksConnector?.getProvider() });\n }\n\n default:\n return undefined;\n }\n }, [\n xChainType,\n evmPublicClient,\n evmWalletClient,\n xService,\n xAccount,\n stacksConnection,\n stacksConnectors,\n xConnection,\n ]);\n}\n","import { useWallet } from '@solana/wallet-adapter-react';\nimport { useMutation, type UseMutationResult } from '@tanstack/react-query';\nimport type { ChainType } from '@sodax/types';\nimport { useSignMessage } from 'wagmi';\nimport { useSignPersonalMessage } from '@mysten/dapp-kit';\nimport { StellarXService } from '@/xchains/stellar';\nimport { InjectiveXService } from '@/xchains/injective';\nimport { useXAccount } from './useXAccount';\nimport { getEthereumAddress } from '@injectivelabs/sdk-ts';\nimport { Wallet } from '@injectivelabs/wallet-base';\n\ntype SignMessageReturnType = `0x${string}` | Uint8Array | string | undefined;\n\nexport function useXSignMessage(): UseMutationResult<\n SignMessageReturnType,\n Error,\n { xChainType: ChainType; message: string },\n unknown\n> {\n const { signMessage } = useWallet();\n const { signMessageAsync: evmSignMessage } = useSignMessage();\n\n const { mutateAsync: signPersonalMessage } = useSignPersonalMessage();\n\n const { address: injectiveAddress } = useXAccount('INJECTIVE');\n\n return useMutation({\n mutationFn: async ({ xChainType, message }: { xChainType: ChainType; message: string }) => {\n let signature: SignMessageReturnType;\n\n switch (xChainType) {\n case 'EVM': {\n signature = await evmSignMessage({ message });\n break;\n }\n case 'SUI': {\n const res = await signPersonalMessage({ message: new Uint8Array(new TextEncoder().encode(message)) });\n signature = res.signature;\n break;\n }\n case 'SOLANA': {\n if (!signMessage) {\n throw new Error('Solana wallet not connected');\n }\n signature = await signMessage(new TextEncoder().encode(message));\n break;\n }\n\n case 'STELLAR': {\n const res = await StellarXService.getInstance().walletsKit.signMessage(message);\n signature = res.signedMessage;\n break;\n }\n\n case 'INJECTIVE': {\n if (!injectiveAddress) {\n throw new Error('Injective address not found');\n }\n\n const ethereumAddress = getEthereumAddress(injectiveAddress);\n const walletStrategy = InjectiveXService.getInstance().walletStrategy;\n const res = await walletStrategy.signArbitrary(\n walletStrategy.getWallet() === Wallet.Metamask ? ethereumAddress : injectiveAddress,\n message,\n );\n\n if (!res) {\n throw new Error('Injective signature not found');\n }\n signature = res;\n break;\n }\n\n default:\n console.warn('Unsupported chain type');\n break;\n }\n\n return signature;\n },\n });\n}\n","import { useMemo } from 'react';\nimport type { BitcoinXConnector } from './BitcoinXConnector';\nimport { useXService } from '../../hooks';\n\n/**\n * Hook to return available Bitcoin wallet connectors from the globally registered xService.\n */\nexport function useBitcoinXConnectors(): BitcoinXConnector[] {\n const xService = useXService('BITCOIN');\n \n return useMemo(() => {\n return (xService?.getXConnectors() || []) as BitcoinXConnector[];\n }, [xService]);\n}\n","'use client';\n\nimport { useCurrentAccount, useCurrentWallet, useSuiClient } from '@mysten/dapp-kit';\nimport { useEffect } from 'react';\nimport { EvmXService } from './xchains/evm';\nimport { SolanaXService } from './xchains/solana/SolanaXService';\nimport { SuiXService } from './xchains/sui';\nimport { useConnection, useWallet } from '@solana/wallet-adapter-react';\nimport { useConfig } from 'wagmi';\nimport { StacksXService } from './xchains/stacks/StacksXService';\nimport { createNetwork } from '@stacks/network';\nimport type { RpcConfig } from '@sodax/types';\n\nexport const Hydrate = ({ rpcConfig }: { rpcConfig: RpcConfig }) => {\n // sui\n const suiClient = useSuiClient();\n useEffect(() => {\n if (suiClient) {\n SuiXService.getInstance().suiClient = suiClient;\n }\n }, [suiClient]);\n const { currentWallet: suiWallet } = useCurrentWallet();\n useEffect(() => {\n if (suiWallet) {\n SuiXService.getInstance().suiWallet = suiWallet;\n }\n }, [suiWallet]);\n const suiAccount = useCurrentAccount();\n useEffect(() => {\n if (suiAccount) {\n SuiXService.getInstance().suiAccount = suiAccount;\n }\n }, [suiAccount]);\n\n // solana\n const { connection: solanaConnection } = useConnection();\n const solanaWallet = useWallet();\n useEffect(() => {\n if (solanaConnection) {\n SolanaXService.getInstance().connection = solanaConnection;\n }\n }, [solanaConnection]);\n useEffect(() => {\n if (solanaWallet) {\n SolanaXService.getInstance().wallet = solanaWallet;\n }\n }, [solanaWallet]);\n\n // evm\n const wagmiConfig = useConfig();\n useEffect(() => {\n if (wagmiConfig) {\n EvmXService.getInstance().wagmiConfig = wagmiConfig;\n }\n }, [wagmiConfig]);\n\n // stacks\n useEffect(() => {\n StacksXService.getInstance().network = createNetwork({\n network: 'mainnet',\n client: { baseUrl: rpcConfig.stacks ?? 'https://api.mainnet.hiro.so' },\n });\n }, [rpcConfig.stacks]);\n return null;\n};\n","import { useXWagmiStore } from '@/useXWagmiStore';\nimport { ICONexRequestEventType, ICONexResponseEventType, request } from './iconex';\n\nexport const reconnectIcon = async () => {\n const iconConnection = useXWagmiStore.getState().xConnections.ICON;\n if (!iconConnection) return;\n\n const recentXConnectorId = iconConnection.xConnectorId;\n\n const detail = await request({\n type: ICONexRequestEventType.REQUEST_ADDRESS,\n });\n\n if (detail?.type === ICONexResponseEventType.RESPONSE_ADDRESS) {\n useXWagmiStore.setState({\n xConnections: {\n ...useXWagmiStore.getState().xConnections,\n ICON: {\n xAccount: {\n address: detail?.payload,\n xChainType: 'ICON',\n },\n xConnectorId: recentXConnectorId,\n },\n },\n });\n }\n};\n","import { useXWagmiStore } from '@/useXWagmiStore';\nimport { InjectiveXService } from './InjectiveXService';\nimport { isEvmBrowserWallet } from '@injectivelabs/wallet-base';\nimport { getInjectiveAddress } from '@injectivelabs/sdk-ts';\nimport type { Wallet } from '@injectivelabs/wallet-base';\n\nexport const reconnectInjective = async () => {\n const injectiveConnection = useXWagmiStore.getState().xConnections.INJECTIVE;\n if (!injectiveConnection) return;\n\n const recentXConnectorId = injectiveConnection.xConnectorId;\n const walletStrategy = InjectiveXService.getInstance().walletStrategy;\n await walletStrategy.setWallet(recentXConnectorId as Wallet);\n const addresses = await walletStrategy.getAddresses();\n\n const address = isEvmBrowserWallet(recentXConnectorId as Wallet)\n ? getInjectiveAddress(addresses?.[0])\n : addresses?.[0];\n\n useXWagmiStore.setState({\n xConnections: {\n ...useXWagmiStore.getState().xConnections,\n INJECTIVE: {\n xAccount: {\n address,\n xChainType: 'INJECTIVE',\n },\n xConnectorId: recentXConnectorId,\n },\n },\n });\n};\n","import { useXWagmiStore } from '@/useXWagmiStore';\nimport { StellarXService } from './StellarXService';\n\nexport const reconnectStellar = async () => {\n const stellarConnection = useXWagmiStore.getState().xConnections.STELLAR;\n if (!stellarConnection) return;\n\n const recentXConnectorId = stellarConnection.xConnectorId;\n const stellarWalletKit = StellarXService.getInstance().walletsKit;\n stellarWalletKit.setWallet(recentXConnectorId);\n const { address } = await stellarWalletKit.getAddress();\n useXWagmiStore.setState({\n xConnections: {\n ...useXWagmiStore.getState().xConnections,\n STELLAR: {\n xAccount: {\n address,\n xChainType: 'STELLAR',\n },\n xConnectorId: recentXConnectorId,\n },\n },\n });\n};\n","'use client';\n\n// biome-ignore lint/style/useImportType: <explanation>\nimport React, { useMemo } from 'react';\n\n// sui\nimport { SuiClientProvider, WalletProvider as SuiWalletProvider } from '@mysten/dapp-kit';\nimport { getFullnodeUrl } from '@mysten/sui/client';\n\n// evm\nimport { WagmiProvider } from 'wagmi';\n\n// solana\nimport {\n ConnectionProvider as SolanaConnectionProvider,\n WalletProvider as SolanaWalletProvider,\n} from '@solana/wallet-adapter-react';\nimport { UnsafeBurnerWalletAdapter } from '@solana/wallet-adapter-wallets';\n\nimport type { RpcConfig } from '@sodax/types';\n\nimport { Hydrate } from './Hydrate';\nimport { createWagmiConfig } from './xchains/evm/EvmXService';\nimport { reconnectIcon } from './xchains/icon/actions';\nimport { reconnectInjective } from './xchains/injective/actions';\nimport { reconnectStellar } from './xchains/stellar/actions';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport type { State as WagmiState } from 'wagmi';\n\nconst queryClient = new QueryClient();\n\nexport type WagmiOptions = {\n reconnectOnMount?: boolean;\n ssr?: boolean;\n};\n\nexport type SodaxWalletProviderOptions = {\n wagmi?: WagmiOptions;\n solana?: {\n autoConnect?: boolean;\n };\n sui?: {\n autoConnect?: boolean;\n };\n};\n\nconst defaultOptions = {\n wagmi: {\n reconnectOnMount: false,\n ssr: true,\n },\n solana: {\n autoConnect: true,\n },\n sui: {\n autoConnect: true,\n },\n} satisfies SodaxWalletProviderOptions;\n\nexport type SodaxWalletProviderProps = {\n children: React.ReactNode;\n rpcConfig: RpcConfig;\n options?: SodaxWalletProviderOptions;\n initialState?: WagmiState;\n};\n\nexport const SodaxWalletProvider = ({ children, rpcConfig, options, initialState }: SodaxWalletProviderProps) => {\n const wagmi = useMemo(() => ({ ...defaultOptions.wagmi, ...options?.wagmi }), [options?.wagmi]);\n const wagmiConfig = useMemo(() => {\n return createWagmiConfig(rpcConfig, wagmi);\n }, [rpcConfig, wagmi]);\n\n const wallets = useMemo(() => [new UnsafeBurnerWalletAdapter()], []);\n const solana = useMemo(() => ({ ...defaultOptions.solana, ...options?.solana }), [options?.solana]);\n const sui = useMemo(() => ({ ...defaultOptions.sui, ...options?.sui }), [options?.sui]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <WagmiProvider reconnectOnMount={wagmi.reconnectOnMount} config={wagmiConfig} initialState={initialState}>\n <SuiClientProvider networks={{ mainnet: { url: getFullnodeUrl('mainnet') } }} defaultNetwork=\"mainnet\">\n <SuiWalletProvider autoConnect={sui.autoConnect}>\n <SolanaConnectionProvider endpoint={rpcConfig['solana'] ?? 'https://api.mainnet-beta.solana.com'}>\n <SolanaWalletProvider wallets={wallets} autoConnect={solana.autoConnect}>\n <Hydrate rpcConfig={rpcConfig} />\n {children}\n </SolanaWalletProvider>\n </SolanaConnectionProvider>\n </SuiWalletProvider>\n </SuiClientProvider>\n </WagmiProvider>\n </QueryClientProvider>\n );\n};\n\nreconnectIcon();\nreconnectInjective();\nreconnectStellar();\n","import type { ChainType } from '@sodax/types';\n\nexport type XAccount = {\n address: string | undefined;\n xChainType: ChainType | undefined;\n publicKey?: string;\n};\n\nexport type XConnection = {\n xAccount: XAccount;\n xConnectorId: string;\n};\n\nexport type CurrencyKey = string;\n\nexport enum WalletId {\n METAMASK = 'metamask',\n HANA = 'hana',\n PHANTOM = 'phantom',\n SUI = 'sui',\n KEPLR = 'keplr',\n}\n"]}
1
+ {"version":3,"sources":["../src/actions/getXChainType.ts","../src/core/XService.ts","../src/core/XConnector.ts","../src/utils/walletRpcConfig.ts","../src/utils/sortConnectors.ts","../src/utils/index.ts","../src/xchains/evm/EvmXService.ts","../src/xchains/evm/EvmXConnector.ts","../src/xchains/solana/SolanaXService.ts","../src/shared/guards.ts","../src/xchains/sui/SuiXService.ts","../src/xchains/sui/SuiXConnector.ts","../src/xchains/stellar/CustomSorobanServer.ts","../src/xchains/stellar/utils.ts","../src/constants.ts","../src/xchains/stellar/StellarXService.ts","../src/xchains/stellar/StellarWalletsKitXConnector.ts","../src/xchains/icon/IconXService.ts","../src/xchains/icon/iconex/index.tsx","../src/xchains/icon/IconHanaXConnector.ts","../src/xchains/injective/InjectiveXService.ts","../src/xchains/injective/InjectiveXConnector.ts","../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/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/bitcoinSignGuards.ts","../src/xchains/near/NearXService.ts","../src/xchains/near/NearXConnector.ts","../src/xchains/stacks/StacksXService.ts","../src/xchains/stacks/StacksXConnector.ts","../src/xchains/stacks/constants.ts","../src/chainRegistry.ts","../src/useXWalletStore.ts","../src/actions/getXService.ts","../src/providers/evm/EvmHydrator.tsx","../src/providers/evm/EvmActions.tsx","../src/providers/evm/EvmProvider.tsx","../src/xchains/solana/SolanaXConnector.ts","../src/providers/solana/SolanaHydrator.tsx","../src/providers/solana/SolanaActions.tsx","../src/providers/solana/SolanaProvider.tsx","../src/providers/sui/SuiHydrator.tsx","../src/providers/sui/SuiActions.tsx","../src/providers/sui/SuiProvider.tsx","../src/xchains/icon/actions.ts","../src/xchains/injective/actions.ts","../src/xchains/stellar/actions.ts","../src/hooks/useInitChainServices.ts","../src/SodaxWalletProvider.tsx"],"names":["baseChainInfo","address","getEvmChainKeyByChainId","defineChain","createConfig","mainnet","avalanche","arbitrum","base","bsc","sonic","optimism","polygon","lightlinkPhoenix","kaia","redbellyMainnet","http","ChainKeys","createStorage","cookieStorage","getPublicClient","erc20Abi","PublicKey","getAssociatedTokenAddressSync","getAccount","SuiWalletProvider","rpc","Address","Contract","TimeoutInfinite","scValToBigInt","StellarWalletsKit","WalletNetwork","allowAllModules","StellarSdk","IconSdkRaw","getNetworkEndpoints","Network","WalletStrategy","InjectiveChainId","IndexerGrpcAccountPortfolioApi","ChainGrpcWasmApi","MsgBroadcaster","isCosmosBrowserWallet","isCosmosWalletInstalled","isEvmBrowserWallet","getInjectiveAddress","detectBitcoinAddressType","request","MessageSigningProtocols","AddressPurpose","useMemo","useMutation","CHAIN_KEYS","ChainTypeArr","useSyncExternalStore","useCallback","disconnect","useState","useRef","create","devtools","immer","createContext","useContext","useEffect","Wallet","useAccount","useSwitchChain","warnedChains","NearConnector","JsonRpcProvider","network","networkFrom","fetchCallReadOnlyFunction","Cl","getEthereumAddress","InjectiveWalletProvider","StellarWalletProvider","IconWalletProvider","NearWalletProvider","StacksWalletProvider","persist","createJSONStorage","useConfig","useConnectors","usePublicClient","useWalletClient","useReconnect","EvmWalletProvider","useConnect","useDisconnect","useSignMessage","QueryClient","connectors","walletConnect","jsx","QueryClientProvider","jsxs","WagmiProvider","useConnection","useWallet","SolanaWalletProvider","SolanaConnectionProvider","useSuiClient","useCurrentWallet","useCurrentAccount","useWallets","useConnectWallet","useDisconnectWallet","useSignPersonalMessage","getFullnodeUrl","SuiClientProvider","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["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 { 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","import { getEvmChainKeyByChainId, type ChainKey, type EvmChainKey } from '@sodax/types';\nimport type { EvmWalletDefaults } from '@sodax/wallet-sdk-core';\nimport type { ChainEntry, EvmChainEntry, WalletDefaultsByKey } from '@/types/config.js';\n\nexport type { ChainEntry, WalletDefaultsByKey };\n\n/**\n * Extract `defaults` from a chain entry. Returns undefined when the entry is\n * missing, or for Stacks's preset-name string variant (no `defaults` slot).\n */\nexport function getEntryDefaults<K extends ChainKey>(\n entry: ChainEntry<K> | undefined,\n): WalletDefaultsByKey<K> | undefined {\n if (!entry || typeof entry === 'string') return undefined;\n return (entry as { defaults?: WalletDefaultsByKey<K> }).defaults;\n}\n\n/**\n * Extract `rpcUrl` from a chain entry. Use for chains whose underlying factory\n * expects a bare URL string (EVM/Solana/Sui/Icon/Near). Returns undefined for\n * missing entries and for non-rpcUrl forms (Stacks preset name, object entries\n * lacking the field) — downstream falls back to a public default.\n */\nexport function getRpcUrl<K extends ChainKey>(entry: ChainEntry<K> | undefined): string | undefined {\n if (!entry || typeof entry === 'string') return undefined;\n return (entry as { rpcUrl?: string }).rpcUrl;\n}\n\n/**\n * Resolve EVM wallet provider defaults for the chain currently active on a\n * wagmi-supplied client. Used by `EvmHydrator` so the provider re-instantiates\n * with the right defaults when wagmi swaps clients on chain switch.\n *\n * `getEvmChainKeyByChainId` lives in `@sodax/types` (alongside `baseChainInfo`,\n * the data source); this helper composes it with the `SodaxWalletConfig.EVM.chains`\n * lookup, which is React-layer concern.\n */\nexport function resolveEvmDefaults(\n activeChainId: number | undefined,\n evmChains: Partial<Record<EvmChainKey, EvmChainEntry>> | undefined,\n): EvmWalletDefaults | undefined {\n const key = getEvmChainKeyByChainId(activeChainId);\n if (!key || !evmChains) return undefined;\n return evmChains[key]?.defaults;\n}\n","import type { IXConnector } from '@/types/interfaces.js';\n\nexport type SortConnectorsOptions = {\n /** Connector IDs to prioritize. Earlier entries win. */\n preferred?: readonly string[];\n};\n\n/**\n * Stable sort of connectors for display. Ranking (highest first):\n * 1. Appears in `preferred[]` — earlier entries rank higher\n * 2. `connector.isInstalled === true`\n * 3. Original order (stable)\n *\n * Pure function — does not subscribe or read window.\n */\nexport function sortConnectors<T extends IXConnector>(\n connectors: readonly T[],\n options: SortConnectorsOptions = {},\n): T[] {\n const { preferred = [] } = options;\n const preferredIndex = new Map(preferred.map((id, i) => [id, i]));\n\n return [...connectors]\n .map((connector, originalIndex) => ({ connector, originalIndex }))\n .sort((a, b) => {\n const aPref = preferredIndex.get(a.connector.id);\n const bPref = preferredIndex.get(b.connector.id);\n if (aPref !== bPref) {\n if (aPref === undefined) return 1;\n if (bPref === undefined) return -1;\n return aPref - bPref;\n }\n if (a.connector.isInstalled !== b.connector.isInstalled) {\n return a.connector.isInstalled ? -1 : 1;\n }\n return a.originalIndex - b.originalIndex;\n })\n .map(({ connector }) => connector);\n}\n","import { baseChainInfo, type SpokeChainKey, type XToken } from '@sodax/types';\n\nexport { sortConnectors, type SortConnectorsOptions } from './sortConnectors.js';\nexport {\n getEntryDefaults,\n getRpcUrl,\n resolveEvmDefaults,\n type WalletDefaultsByKey,\n} from './walletRpcConfig.js';\n\nexport const isNativeToken = (xToken: XToken): boolean => {\n const nativeAddresses = [\n 'cx0000000000000000000000000000000000000000',\n '0x0000000000000000000000000000000000000000',\n 'inj',\n '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n 'hx0000000000000000000000000000000000000000',\n '11111111111111111111111111111111', // solana\n 'CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA', // stellar\n 'ST000000000000000000002AMW42H.nativetoken', // stacks\n '0:0', // bitcoin\n ];\n\n return nativeAddresses.includes(xToken.address);\n};\n\nexport const getWagmiChainId = (xChainId: SpokeChainKey): number => {\n const chainId = baseChainInfo[xChainId].chainId;\n if (typeof chainId !== 'number') {\n throw new Error(`[wallet-sdk-react] getWagmiChainId: expected numeric chainId, got ${typeof chainId}`);\n }\n return chainId;\n};\n","import { XService } from '@/core/XService.js';\nimport { ChainKeys, type XToken } from '@sodax/types';\nimport type { EvmTypeConfig } from '@/types/config.js';\nimport { getRpcUrl, getWagmiChainId, isNativeToken } from '@/utils/index.js';\n\nimport { type Address, type Chain, defineChain, erc20Abi } from 'viem';\nimport { getPublicClient } from 'wagmi/actions';\nimport { type Config, type CreateConnectorFn, createConfig, http, createStorage, cookieStorage } from 'wagmi';\nimport {\n mainnet,\n avalanche,\n base,\n optimism,\n polygon,\n arbitrum,\n bsc,\n sonic,\n lightlinkPhoenix,\n redbellyMainnet,\n kaia,\n} from 'wagmi/chains';\ntype WagmiOptions = {\n reconnectOnMount?: boolean;\n ssr?: boolean;\n};\n\n// HyperEVM chain is not supported by viem, so we need to define it manually\nexport const hyper = /*#__PURE__*/ defineChain({\n id: 999,\n name: 'HyperEVM',\n nativeCurrency: {\n decimals: 18,\n name: 'HYPE',\n symbol: 'HYPE',\n },\n rpcUrls: {\n default: { http: ['https://rpc.hyperliquid.xyz/evm'] },\n },\n blockExplorers: {\n default: {\n name: 'HyperEVMScan',\n url: 'https://hyperevmscan.io/',\n },\n },\n contracts: {\n multicall3: {\n address: '0xcA11bde05977b3631167028862bE2a173976CA11',\n blockCreated: 13051,\n },\n },\n});\n\nexport const createWagmiConfig = (\n evmChains: EvmTypeConfig['chains'],\n options?: WagmiOptions & { connectors?: CreateConnectorFn[] },\n): Config => {\n return createConfig({\n chains: [\n mainnet,\n avalanche,\n arbitrum,\n base,\n bsc,\n sonic,\n optimism,\n polygon,\n hyper,\n lightlinkPhoenix,\n kaia,\n redbellyMainnet,\n ],\n connectors: options?.connectors ?? [],\n ssr: options?.ssr,\n transports: {\n [mainnet.id]: http(getRpcUrl(evmChains?.[ChainKeys.ETHEREUM_MAINNET])),\n [avalanche.id]: http(getRpcUrl(evmChains?.[ChainKeys.AVALANCHE_MAINNET])),\n [arbitrum.id]: http(getRpcUrl(evmChains?.[ChainKeys.ARBITRUM_MAINNET])),\n [base.id]: http(getRpcUrl(evmChains?.[ChainKeys.BASE_MAINNET])),\n [bsc.id]: http(getRpcUrl(evmChains?.[ChainKeys.BSC_MAINNET])),\n [sonic.id]: http(getRpcUrl(evmChains?.[ChainKeys.SONIC_MAINNET])),\n [optimism.id]: http(getRpcUrl(evmChains?.[ChainKeys.OPTIMISM_MAINNET])),\n [polygon.id]: http(getRpcUrl(evmChains?.[ChainKeys.POLYGON_MAINNET])),\n [hyper.id]: http(getRpcUrl(evmChains?.[ChainKeys.HYPEREVM_MAINNET])),\n [lightlinkPhoenix.id]: http(getRpcUrl(evmChains?.[ChainKeys.LIGHTLINK_MAINNET])),\n [redbellyMainnet.id]: http(getRpcUrl(evmChains?.[ChainKeys.REDBELLY_MAINNET])),\n [kaia.id]: http(getRpcUrl(evmChains?.[ChainKeys.KAIA_MAINNET])),\n },\n storage: createStorage({\n storage: cookieStorage,\n key: 'sodax',\n }),\n });\n};\n\n/**\n * Service class for handling EVM chain interactions.\n * Implements singleton pattern and provides methods for wallet/chain operations.\n */\n\nexport class EvmXService extends XService {\n private static instance: EvmXService;\n public wagmiConfig: Config | undefined;\n\n private constructor() {\n super('EVM');\n }\n\n public static getInstance(): EvmXService {\n if (!EvmXService.instance) {\n EvmXService.instance = new EvmXService();\n }\n return EvmXService.instance;\n }\n\n // get erc20 token balance in a chain (evm chain only)\n async _getTokenBalance(address: string | undefined, chainId: number, tokenAddress: string): Promise<bigint> {\n const publicClient = getPublicClient(this.wagmiConfig as Config, { chainId: chainId });\n if (!publicClient) throw new Error('Public client not found');\n const balance = await publicClient.readContract({\n abi: erc20Abi,\n address: tokenAddress as `0x${string}`,\n functionName: 'balanceOf',\n args: [address as `0x${string}`],\n });\n return balance || 0n;\n }\n\n //get native balance of the chain (evm chain only)\n async _getChainBalance(address: string | undefined, chainId: number) {\n const balance = await getPublicClient(this.wagmiConfig as Config, { chainId: chainId })?.getBalance({\n address: address as Address,\n });\n return balance || 0n;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return 0n;\n if (!this.wagmiConfig) return 0n;\n\n const chainId = getWagmiChainId(xToken.chainKey);\n\n if (isNativeToken(xToken)) {\n return this._getChainBalance(address, chainId);\n }\n\n throw new Error(`Unsupported token: ${xToken.symbol}`);\n }\n\n override async getBalances(address: string | undefined, xTokens: XToken[]) {\n if (!address) return {};\n if (!this.wagmiConfig) return {};\n\n const nativeTokenBalancePromises = xTokens\n .filter(xToken => isNativeToken(xToken))\n .map(async xToken => {\n const balance = await this.getBalance(address, xToken);\n return { symbol: xToken.symbol, address: xToken.address, balance };\n });\n\n const nativeTokenBalances = await Promise.all(nativeTokenBalancePromises);\n const tokenMap: Record<string, bigint> = nativeTokenBalances.reduce<Record<string, bigint>>(\n (map, { address, balance }) => {\n if (balance) map[address] = balance;\n return map;\n },\n {},\n );\n\n const nonNativeXTokens = xTokens.filter(xToken => !isNativeToken(xToken));\n const firstToken = xTokens[0];\n if (!firstToken) return tokenMap;\n const chainKey = firstToken.chainKey;\n const viemChain: Chain = this.wagmiConfig.chains.find(chain => chain.id === getWagmiChainId(chainKey)) as Chain;\n const chainId = getWagmiChainId(chainKey);\n\n const publicClient = getPublicClient(this.wagmiConfig, { chainId: chainId });\n if (!publicClient) throw new Error('Public client not found');\n\n if (viemChain?.contracts?.multicall3) {\n //multicall supports\n const result = await publicClient.multicall({\n contracts: nonNativeXTokens.map(token => ({\n abi: erc20Abi,\n address: token.address as `0x${string}`,\n functionName: 'balanceOf',\n args: [address],\n })),\n });\n\n return nonNativeXTokens.reduce((acc, token, index) => {\n const resultValue = result?.[index]?.result;\n acc[token.address] = resultValue !== undefined && resultValue !== null ? BigInt(resultValue) : 0n;\n return acc;\n }, tokenMap);\n }\n\n const nonNativeTokenBalances: bigint[] = await Promise.all(\n nonNativeXTokens.map(token => this._getTokenBalance(address, chainId, token.address)),\n );\n\n return nonNativeXTokens.reduce((acc, token, idx) => {\n acc[token.address] = nonNativeTokenBalances[idx] ?? 0n;\n return acc;\n }, tokenMap);\n }\n}\n","import { XConnector } from '@/core/XConnector.js';\nimport type { XAccount } from '@/types/index.js';\nimport type { Connector } from 'wagmi';\n\nconst WALLETCONNECT_ICON = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath fill='%233B99FC' d='M9.58 11.58c3.55-3.47 9.29-3.47 12.84 0l.43.42a.44.44 0 0 1 0 .63l-1.46 1.43a.23.23 0 0 1-.32 0l-.59-.57a6.72 6.72 0 0 0-9.36 0l-.63.61a.23.23 0 0 1-.32 0L8.71 12.7a.44.44 0 0 1 0-.63l.87-.5Zm15.87 2.95 1.3 1.28a.44.44 0 0 1 0 .63l-5.87 5.74a.46.46 0 0 1-.64 0l-4.17-4.08a.11.11 0 0 0-.16 0l-4.17 4.08a.46.46 0 0 1-.64 0l-5.87-5.74a.44.44 0 0 1 0-.63l1.3-1.28a.46.46 0 0 1 .64 0l4.17 4.08a.11.11 0 0 0 .16 0l4.17-4.08a.46.46 0 0 1 .64 0l4.17 4.08a.11.11 0 0 0 .16 0l4.17-4.08a.46.46 0 0 1 .64 0Z'/%3E%3C/svg%3E\";\n\nexport class EvmXConnector extends XConnector {\n connector: Connector;\n\n constructor(connector: Connector) {\n super('EVM', connector.name, connector.id);\n this.connector = connector;\n }\n\n async connect(): Promise<XAccount | undefined> {\n return;\n }\n\n async disconnect(): Promise<void> {\n return;\n }\n\n public override get id(): string {\n return this.connector.id;\n }\n public override get icon(): string | undefined {\n if (!this.connector.icon && this.connector.type === 'walletConnect') {\n return WALLETCONNECT_ICON;\n }\n return this.connector.icon;\n }\n}\n","import { XService } from '@/core/XService.js';\nimport { isNativeToken } from '@/utils/index.js';\nimport type { XToken } from '@sodax/types';\nimport { type Connection, PublicKey } from '@solana/web3.js';\nimport { getAccount, getAssociatedTokenAddressSync } from '@solana/spl-token';\nimport type { WalletContextState } from '@solana/wallet-adapter-react';\n\nexport class SolanaXService extends XService {\n private static instance: SolanaXService;\n\n public connection: Connection | undefined;\n public wallet: WalletContextState | undefined;\n\n private constructor() {\n super('SOLANA');\n }\n\n public static getInstance(): SolanaXService {\n if (!SolanaXService.instance) {\n SolanaXService.instance = new SolanaXService();\n }\n return SolanaXService.instance;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return BigInt(0);\n\n const connection = this.connection;\n if (!connection) {\n return BigInt(0);\n }\n\n try {\n if (isNativeToken(xToken)) {\n const newBalance = await connection.getBalance(new PublicKey(address));\n return BigInt(newBalance);\n }\n\n const tokenAccountPubkey = getAssociatedTokenAddressSync(new PublicKey(xToken.address), new PublicKey(address));\n const tokenAccount = await getAccount(connection, tokenAccountPubkey);\n return BigInt(tokenAccount.amount);\n } catch {\n return BigInt(0);\n }\n }\n}\n","// packages/wallet-sdk-react/src/shared/guards.ts\n\n/**\n * Tiny runtime type guards used to safely narrow `unknown` values.\n *\n * Why this exists:\n * - In wallets land, many values come from outside TypeScript (window injections, 3rd-party SDKs, serialized state).\n * - Writing `as SomeType` skips checks and can crash later in confusing places.\n * - Guards + `assert(...)` let us fail fast with a clear error message at the boundary.\n */\n\nexport type UnknownRecord = Record<string, unknown>;\n\n/** True if value is a non-null object (Record-like). */\nexport function isRecord(value: unknown): value is UnknownRecord {\n return typeof value === 'object' && value !== null;\n}\n\n/** True if the object has a string property at `key`. */\nexport function hasStringProperty<Key extends string>(\n value: unknown,\n key: Key,\n): value is UnknownRecord & Record<Key, string> {\n return isRecord(value) && typeof value[key] === 'string';\n}\n\n/** True if the object has an optional string property at `key`. */\nexport function hasOptionalStringProperty<Key extends string>(\n value: unknown,\n key: Key,\n): value is UnknownRecord & Partial<Record<Key, string>> {\n return isRecord(value) && (value[key] === undefined || typeof value[key] === 'string');\n}\n\n/** True if the object has a boolean property at `key`. */\nexport function hasBooleanProperty<Key extends string>(\n value: unknown,\n key: Key,\n): value is UnknownRecord & Record<Key, boolean> {\n return isRecord(value) && typeof value[key] === 'boolean';\n}\n\n/** True if the object has a function property at `key`. */\nexport function hasFunctionProperty<Key extends string>(\n value: unknown,\n key: Key,\n): value is UnknownRecord & Record<Key, (...args: unknown[]) => unknown> {\n return isRecord(value) && typeof value[key] === 'function';\n}\n\n/**\n * Throws if condition is false.\n * Use this after guards to stop execution early with an actionable error message.\n */\nexport function assert(condition: unknown, message: string): asserts condition {\n if (!condition) {\n throw new Error(message);\n }\n}\n\n/**\n * Validates the runtime shape of Sui provider dependencies before passing them to wallet-sdk-core.\n * Used by both SuiHydrator (render path) and SuiXService.createWalletProvider (imperative path).\n */\nexport function assertSuiProviderShape(caller: string, client: unknown, wallet: unknown, account: unknown): void {\n const clientOk =\n isRecord(client) &&\n hasFunctionProperty(client, 'executeTransactionBlock') &&\n hasFunctionProperty(client, 'devInspectTransactionBlock') &&\n hasFunctionProperty(client, 'getCoins');\n assert(clientOk, `[${caller}] invalid Sui client shape`);\n\n const walletOk = isRecord(wallet) && hasStringProperty(wallet, 'name');\n assert(walletOk, `[${caller}] invalid Sui wallet shape`);\n\n const accountOk = isRecord(account) && hasStringProperty(account, 'address');\n assert(accountOk, `[${caller}] invalid Sui account shape`);\n}\n","import { XService } from '@/core/XService.js';\nimport type { XToken, ISuiWalletProvider } from '@sodax/types';\nimport { SuiWalletProvider } from '@sodax/wallet-sdk-core';\nimport { isNativeToken } from '@/utils/index.js';\nimport { assertSuiProviderShape } from '@/shared/guards.js';\n\n// These fields are hydrated by SuiHydrator from @mysten/dapp-kit hooks.\n// We use structural interfaces instead of importing nominal types from @mysten/wallet-standard\n// because dapp-kit may resolve a different version than wallet-sdk-core, causing nominal mismatch.\n// The `getBalance` method is the only field we call directly — the rest are passed through.\ninterface SuiClientLike {\n getBalance(input: { owner: string; coinType: string }): Promise<{ totalBalance: string }>;\n}\n\nexport class SuiXService extends XService {\n private static instance: SuiXService;\n\n // Hydrated by SuiHydrator. Start undefined because wallet may not be connected yet.\n // suiClient is typed structurally for the methods we call directly.\n // suiWallet/suiAccount are opaque — stored and passed through to SuiWalletProvider.\n public suiClient: SuiClientLike | undefined;\n public suiWallet: unknown;\n public suiAccount: unknown;\n\n private constructor() {\n super('SUI');\n }\n\n public static getInstance(): SuiXService {\n if (!SuiXService.instance) {\n SuiXService.instance = new SuiXService();\n }\n return SuiXService.instance;\n }\n\n createWalletProvider(): ISuiWalletProvider | undefined {\n if (!this.suiClient || !this.suiWallet || !this.suiAccount) {\n console.warn(\n '[SuiXService] createWalletProvider: missing dependencies — wallet not connected yet',\n { hasClient: !!this.suiClient, hasWallet: !!this.suiWallet, hasAccount: !!this.suiAccount },\n );\n return undefined;\n }\n\n // Runtime validation before passing data to wallet-sdk-core. This avoids \"trust me bro\" casting.\n // Note: we validate the minimum shape we rely on; the exact nominal types may differ by package version.\n assertSuiProviderShape('SuiXService', this.suiClient, this.suiWallet, this.suiAccount);\n\n // Version mismatch cast: dapp-kit hooks return types from their bundled @mysten/wallet-standard,\n // which differs nominally from wallet-sdk-core's version. Structurally identical at runtime.\n type SuiWalletProviderConfig = ConstructorParameters<typeof SuiWalletProvider>[0];\n return new SuiWalletProvider({\n client: this.suiClient,\n wallet: this.suiWallet,\n account: this.suiAccount,\n } as unknown as SuiWalletProviderConfig);\n }\n\n // getBalance is not used because getBalances uses getAllBalances which returns all balances\n\n override async getBalances(address: string | undefined, xTokens: readonly XToken[]): Promise<Record<string, bigint>> {\n if (!address || !this.suiClient) return {};\n // Capture in local so the closure sees a narrowed (non-undefined) reference.\n const client = this.suiClient;\n try {\n const balancePromises = xTokens.map(async xToken => {\n let coinType = isNativeToken(xToken) ? '0x2::sui::SUI' : xToken.address;\n\n // TODO: hard coded for getting legacy bnUSD balance\n if (\n coinType ===\n '0x03917a812fe4a6d6bc779c5ab53f8a80ba741f8af04121193fc44e0f662e2ceb::balanced_dollar::BALANCED_DOLLAR'\n ) {\n coinType =\n '0x3917a812fe4a6d6bc779c5ab53f8a80ba741f8af04121193fc44e0f662e2ceb::balanced_dollar::BALANCED_DOLLAR';\n }\n\n const balance = await client.getBalance({\n owner: address,\n coinType: coinType,\n });\n\n return {\n address: xToken.address,\n balance: balance ? BigInt(balance.totalBalance) : undefined,\n };\n });\n\n const results = await Promise.all(balancePromises);\n\n const tokenMap: Record<string, bigint> = {};\n results.forEach(result => {\n if (result.balance !== undefined) {\n tokenMap[result.address] = result.balance;\n }\n });\n\n return tokenMap;\n } catch (error) {\n console.error('[wallet-sdk-react] SUI getBalances failed:', error);\n return {};\n }\n }\n}\n","import type { XAccount } from '@/types/index.js';\n\nimport { XConnector } from '@/core/index.js';\nimport { SuiXService } from './SuiXService.js';\nimport { assert, hasOptionalStringProperty, hasStringProperty, isRecord } from '@/shared/guards.js';\n\n// Structural interface for what we actually use from a Sui wallet.\n// We don't import the nominal type from @mysten/wallet-standard because\n// @mysten/dapp-kit may resolve a different version, causing nominal mismatch.\n// Structural typing avoids this: as long as the object has these fields, it works.\ninterface SuiWalletInfo {\n id?: string;\n name: string;\n icon?: string;\n}\n\nconst isSuiWalletInfo = (value: unknown): value is SuiWalletInfo => {\n return (\n isRecord(value) &&\n hasStringProperty(value, 'name') &&\n // Some wallets may not expose `id` — in that case we fall back to `name` for stability.\n // We still validate if it exists.\n hasOptionalStringProperty(value, 'id') &&\n hasOptionalStringProperty(value, 'icon')\n );\n};\n\nexport class SuiXConnector extends XConnector {\n public readonly wallet: SuiWalletInfo;\n\n constructor(wallet: unknown) {\n assert(isSuiWalletInfo(wallet), '[SuiXConnector] invalid wallet object');\n\n const id = wallet.id ?? wallet.name;\n // After the fallback, `id` is always defined.\n assert(typeof id === 'string' && id.length > 0, '[SuiXConnector] invalid wallet id');\n\n super('SUI', wallet.name, id);\n this.wallet = { id, name: wallet.name, icon: wallet.icon };\n }\n\n getXService(): SuiXService {\n return SuiXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n return;\n }\n\n async disconnect(): Promise<void> {}\n\n public override get icon(): string | undefined {\n return this.wallet.icon;\n }\n}\n","import {\n type FeeBumpTransaction,\n type Memo,\n type MemoType,\n type Operation,\n rpc,\n type Transaction,\n} from '@stellar/stellar-sdk';\n\nclass CustomSorobanServer extends rpc.Server {\n private readonly customHeaders: Record<string, string>;\n\n constructor(serverUrl: string, customHeaders: Record<string, string>) {\n super(serverUrl, {\n allowHttp: true,\n });\n this.customHeaders = customHeaders;\n }\n\n override async simulateTransaction(\n tx: Transaction<Memo<MemoType>, Operation[]>,\n ): Promise<rpc.Api.SimulateTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'simulateTransaction',\n params: {\n transaction: tx.toXDR(),\n },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error simulating TX! status: ${response.status}`);\n }\n // Parse raw JSON-RPC payload into the discriminated union expected by callers\n return response.json().then(json => rpc.parseRawSimulation(json.result));\n }\n\n override async sendTransaction(tx: Transaction | FeeBumpTransaction): Promise<rpc.Api.SendTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'sendTransaction',\n params: {\n transaction: tx.toXDR(),\n },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error submitting TX! status: ${response.status}`);\n }\n return response.json().then(json => json.result);\n }\n\n override async getTransaction(hash: string): Promise<rpc.Api.GetTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'getTransaction',\n params: { hash },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error getting TX! status: ${response.status}`);\n }\n return response.json().then(json => json.result);\n }\n}\n\nexport default CustomSorobanServer;\n","import {\n Address,\n Contract,\n type Memo,\n type MemoType,\n type Operation,\n rpc,\n TimeoutInfinite,\n type Transaction,\n type TransactionBuilder,\n scValToBigInt,\n} from '@stellar/stellar-sdk';\nimport type CustomSorobanServer from './CustomSorobanServer.js';\n\nexport const STELLAR_RLP_MSG_TYPE = { type: 'symbol' };\n\n// Can be used whenever you need an Address argument for a contract method\nexport const accountToScVal = (account: string) => new Address(account).toScVal();\n\nexport const simulateTx = (\n tx: Transaction<Memo<MemoType>, Operation[]>,\n server: CustomSorobanServer,\n): Promise<rpc.Api.SimulateTransactionResponse> => server.simulateTransaction(tx);\n\nexport const getTokenBalance = async (\n address: string,\n tokenId: string,\n txBuilder: TransactionBuilder,\n server: CustomSorobanServer,\n) => {\n const params = [accountToScVal(address)];\n const contract = new Contract(tokenId);\n const tx = txBuilder\n .addOperation(contract.call('balance', ...params))\n .setTimeout(TimeoutInfinite)\n .build();\n\n const result = await simulateTx(tx, server);\n\n // Also throws on restore responses — invalid for read-only balance simulation\n if (!rpc.Api.isSimulationSuccess(result)) {\n throw new Error(`Simulation failed: ${JSON.stringify(result)}`);\n }\n\n return result.result ? scValToBigInt(result.result.retval) : 0n;\n};\n","/**\n * Default values used across providers and hydrators.\n * Centralized so consumers and tests have a single source of truth.\n */\n\n// ─── Stacks ─────────────────────────────────────────────────────────────────\nexport const STACKS_DEFAULT_RPC_URL = 'https://api.mainnet.hiro.so';\nexport const STACKS_DEFAULT_NETWORK = 'mainnet' as const;\n\n// ─── Sui ────────────────────────────────────────────────────────────────────\nexport const SUI_DEFAULT_NETWORK = 'mainnet' as const;\nexport const SUI_DEFAULT_AUTO_CONNECT = true;\n\n// ─── EVM ────────────────────────────────────────────────────────────────────\nexport const EVM_DEFAULT_RECONNECT_ON_MOUNT = false;\nexport const EVM_DEFAULT_SSR = true;\n\n// ─── Solana ─────────────────────────────────────────────────────────────────\nexport const SOLANA_DEFAULT_AUTO_CONNECT = true;\nexport const SOLANA_DEFAULT_RPC_URL = 'https://api.mainnet-beta.solana.com';\n/** Timeout for MetaMask Solana wallet connect — MetaMask's Solana adapter is slow to fire `connect`. */\nexport const SOLANA_METAMASK_CONNECT_TIMEOUT_MS = 30_000;\n\n// ─── Bitcoin ────────────────────────────────────────────────────────────────\nexport const BITCOIN_DEFAULT_RPC_URL = 'https://mempool.space/api';\n\n// ─── Stellar ────────────────────────────────────────────────────────────────\nexport const STELLAR_DEFAULT_HORIZON_RPC_URL = 'https://horizon.stellar.org';\nexport const STELLAR_DEFAULT_SOROBAN_RPC_URL = 'https://rpc.ankr.com/stellar_soroban';\n\n// ─── NEAR ───────────────────────────────────────────────────────────────────\nexport const NEAR_DEFAULT_RPC_URL = 'https://1rpc.io/near';\n\n// ─── Wallet metadata (install URLs + icons for extension-based wallets) ────\n// Keys are wallet-level, not per-connector: one OKX extension serves both\n// Bitcoin and EVM connectors, so metadata is shared.\n\nexport const WALLET_METADATA = {\n unisat: {\n installUrl: 'https://chromewebstore.google.com/detail/unisat-wallet/ppbibelpcjmhbdihakflkdcoccbgbkpo',\n icon: 'https://avatars.githubusercontent.com/u/125119198?s=200&v=4',\n },\n xverse: {\n installUrl: 'https://chromewebstore.google.com/detail/xverse-bitcoin-crypto-wal/idnnbdplmphpflfnlkomgpfbpcgelopg',\n icon:\n 'https://cdn.brandfetch.io/iddzGN5Rcv/w/400/h/400/theme/dark/icon.jpeg?c=1bxid64Mup7aczewSAYMX&t=1771902357797',\n },\n okx: {\n installUrl: 'https://chromewebstore.google.com/detail/okx-wallet/mcohilncbfahbmgdjkbpemcciiolgcge',\n icon: 'https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png',\n },\n hana: {\n installUrl: 'https://chromewebstore.google.com/detail/hana-wallet/jfdlamikmbghhapbgfoogdffldioobgl',\n icon: 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/hana.svg',\n },\n} as const satisfies Record<string, { installUrl: string; icon: string }>;\n","import { XService } from '@/core/XService.js';\nimport { StellarWalletsKit, WalletNetwork, allowAllModules } from '@creit.tech/stellar-wallets-kit';\nimport * as StellarSdk from '@stellar/stellar-sdk';\nimport CustomSorobanServer from './CustomSorobanServer.js';\nimport { getTokenBalance } from './utils.js';\nimport type { XToken } from '@sodax/types';\nimport { STELLAR_DEFAULT_HORIZON_RPC_URL, STELLAR_DEFAULT_SOROBAN_RPC_URL } from '@/constants.js';\n\n/** Base reserve in stroops (0.5 XLM). Each subentry (trustline, signer, data entry, offer) adds one base reserve. */\nconst STELLAR_BASE_RESERVE_STROOPS = 5_000_000;\n\n/** Horizon account fields used for minimum balance. Minimum = (2 + subentry_count + num_sponsoring - num_sponsored) * base_reserve + selling_liabilities. */\ninterface StellarAccountReserveFields {\n subentry_count?: number;\n num_sponsoring?: number;\n num_sponsored?: number;\n}\n\n/** Parse XLM balance string (e.g. \"198.8944970\") to stroops (1 XLM = 10^7 stroops). */\nfunction parseXlmBalanceToStroops(balanceStr: string): bigint {\n const parts = balanceStr.split('.');\n const whole = parts[0] ?? '0';\n const frac = (parts[1] ?? '').padEnd(7, '0').slice(0, 7);\n return BigInt(whole + frac);\n}\n\nexport class StellarXService extends XService {\n private static instance: StellarXService;\n\n public walletsKit: StellarWalletsKit;\n public server: StellarSdk.Horizon.Server;\n public sorobanServer: CustomSorobanServer;\n\n private constructor(horizonRpcUrl?: string, sorobanRpcUrl?: string) {\n super('STELLAR');\n\n this.walletsKit = new StellarWalletsKit({\n network: WalletNetwork.PUBLIC,\n modules: allowAllModules(),\n });\n\n this.server = new StellarSdk.Horizon.Server(horizonRpcUrl ?? STELLAR_DEFAULT_HORIZON_RPC_URL, { allowHttp: true });\n this.sorobanServer = new CustomSorobanServer(sorobanRpcUrl ?? STELLAR_DEFAULT_SOROBAN_RPC_URL, {});\n }\n\n public static getInstance(horizonRpcUrl?: string, sorobanRpcUrl?: string): StellarXService {\n if (!StellarXService.instance) {\n StellarXService.instance = new StellarXService(horizonRpcUrl, sorobanRpcUrl);\n } else {\n if (horizonRpcUrl) {\n StellarXService.instance.server = new StellarSdk.Horizon.Server(horizonRpcUrl, { allowHttp: true });\n }\n if (sorobanRpcUrl) {\n StellarXService.instance.sorobanServer = new CustomSorobanServer(sorobanRpcUrl, {});\n }\n }\n return StellarXService.instance;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return BigInt(0);\n\n const stellarAccount = await this.server.loadAccount(address);\n\n if (xToken.symbol === 'XLM') {\n const xlmBalance = stellarAccount.balances.find(balance => balance.asset_type === 'native');\n if (xlmBalance) {\n const rawBalanceStroops = parseXlmBalanceToStroops(xlmBalance.balance);\n const sellingLiabilitiesStroops = (xlmBalance as { selling_liabilities?: string }).selling_liabilities\n ? parseXlmBalanceToStroops((xlmBalance as { selling_liabilities: string }).selling_liabilities)\n : BigInt(0);\n const reserveFields = stellarAccount as unknown as StellarAccountReserveFields;\n const subentryCount = reserveFields.subentry_count ?? 0;\n const numSponsoring = reserveFields.num_sponsoring ?? 0;\n const numSponsored = reserveFields.num_sponsored ?? 0;\n // Minimum balance = (2 + subentry_count + num_sponsoring - num_sponsored) * base_reserve + selling_liabilities.\n // When account has sponsored reserves (num_sponsored > 0), those reserves are paid by the sponsor, so we don't subtract them.\n const reserveCount = Math.max(0, 2 + subentryCount + numSponsoring - numSponsored);\n const minBalanceStroops =\n BigInt(reserveCount) * BigInt(STELLAR_BASE_RESERVE_STROOPS) + sellingLiabilitiesStroops;\n const availableStroops =\n rawBalanceStroops > minBalanceStroops ? rawBalanceStroops - minBalanceStroops : BigInt(0);\n return availableStroops;\n }\n } else {\n try {\n const txBuilder = new StellarSdk.TransactionBuilder(stellarAccount, {\n fee: StellarSdk.BASE_FEE,\n networkPassphrase: StellarSdk.Networks.PUBLIC,\n });\n\n const balance = await getTokenBalance(address, xToken.address, txBuilder, this.sorobanServer);\n return balance;\n } catch (e) {\n console.error(`Error while fetching token on Stellar: ${xToken.symbol}, Error: ${e}`);\n }\n }\n\n return BigInt(0);\n }\n}\n","import type { XAccount } from '@/types/index.js';\n\nimport { XConnector } from '@/core/index.js';\nimport { StellarXService } from './StellarXService.js';\n\nexport type StellarWalletType = {\n icon: string;\n id: string;\n isAvailable: boolean;\n name: string;\n type: string;\n url: string;\n};\n\nexport class StellarWalletsKitXConnector extends XConnector {\n _wallet: StellarWalletType;\n\n constructor(wallet: StellarWalletType) {\n super('STELLAR', wallet.name, wallet.id);\n this._wallet = wallet;\n }\n\n getXService(): StellarXService {\n return StellarXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n const kit = this.getXService().walletsKit;\n\n if (!this._wallet) {\n return;\n }\n\n if (!this._wallet.isAvailable) {\n // Throw instead of silently navigating to the install URL — callers\n // that bypass `useWalletModal.selectWallet`'s pre-check otherwise\n // see a tab open with no surfaced error. Consumers read\n // `connector.installUrl` to render the install CTA on the caught\n // error.\n throw new Error(`${this._wallet.name} is not installed. Install the wallet and reload the page.`);\n }\n\n kit.setWallet(this._wallet.id);\n const { address } = await kit.getAddress();\n\n return {\n address: address,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {}\n\n public override get icon(): string {\n return this._wallet.icon;\n }\n\n public override get isInstalled(): boolean {\n return this._wallet.isAvailable;\n }\n\n public override get installUrl(): string | undefined {\n return this._wallet.url;\n }\n}\n","import { XService } from '@/core/XService.js';\nimport type { IconService } from 'icon-sdk-js';\nimport * as IconSdkRaw from 'icon-sdk-js';\nimport type { XToken } from '@sodax/types';\nimport { isNativeToken } from '@/utils/index.js';\n\nconst IconSdk = ('default' in IconSdkRaw.default ? IconSdkRaw.default : IconSdkRaw) as typeof IconSdkRaw;\nconst { IconService: IconServiceConstructor, Builder: IconBuilder, Converter: IconConverter } = IconSdk;\nexport interface CallData {\n target: string;\n method: string;\n params: string[];\n}\n\nexport enum SupportedChainId {\n MAINNET = 1,\n}\n\ninterface ChainInfo {\n readonly name: string;\n readonly node: string;\n readonly APIEndpoint: string;\n readonly debugAPIEndpoint: string;\n readonly chainId: number;\n readonly tracker: string;\n}\n\nexport const CHAIN_INFO: { readonly [chainId: number]: ChainInfo } = {\n [SupportedChainId.MAINNET]: {\n name: 'ICON Mainnet',\n node: 'https://ctz.solidwallet.io',\n APIEndpoint: 'https://ctz.solidwallet.io/api/v3',\n debugAPIEndpoint: 'https://api.icon.community/api/v3d',\n chainId: 1,\n tracker: 'https://tracker.icon.community',\n },\n};\n\nexport class IconXService extends XService {\n private static instance: IconXService;\n\n public iconService: IconService;\n\n private constructor(rpcUrl?: string) {\n super('ICON');\n const mainnetInfo = CHAIN_INFO[SupportedChainId.MAINNET];\n if (!mainnetInfo) throw new Error('ICON mainnet chain info not found');\n this.iconService = new IconServiceConstructor(\n new IconServiceConstructor.HttpProvider(rpcUrl ?? mainnetInfo.APIEndpoint),\n );\n }\n\n public static getInstance(rpcUrl?: string): IconXService {\n if (!IconXService.instance) {\n IconXService.instance = new IconXService(rpcUrl);\n }\n return IconXService.instance;\n }\n\n private async getAggregateData(requireSuccess: boolean, calls: CallData[]) {\n const rawTx = new IconBuilder.CallBuilder()\n // muticall address on mainnet\n .to('cxa4aa9185e23558cff990f494c1fd2845f6cbf741')\n .method('tryAggregate')\n .params({ requireSuccess: IconConverter.toHex(requireSuccess ? 1 : 0), calls })\n .build();\n\n try {\n const result = await this.iconService.call(rawTx).execute();\n const aggs = result['returnData'];\n\n const data = aggs.map((agg: Record<string, string>) => {\n if (agg['success'] === '0x0') {\n return null;\n }\n return agg['returnData'];\n });\n\n return data;\n } catch (err) {\n console.error(err);\n return Array(calls.length).fill(null);\n }\n }\n\n override async getBalances(address: string | undefined, xTokens: XToken[]) {\n if (!address) return {};\n\n const balances: Record<string, bigint> = {};\n\n const nativeXToken = xTokens.find(xToken => isNativeToken(xToken));\n const nonNativeXTokens = xTokens.filter(xToken => !isNativeToken(xToken));\n\n if (nativeXToken) {\n const balance = await this.iconService.getBalance(address).execute();\n balances[nativeXToken.address] = BigInt(balance.toFixed());\n }\n\n const cds: CallData[] = nonNativeXTokens.map(token => {\n return {\n target: token.address,\n method: 'balanceOf',\n params: [address],\n };\n });\n\n const data: (string | null)[] = await this.getAggregateData(\n false,\n cds.filter(cd => cd.target.startsWith('cx')),\n );\n\n return nonNativeXTokens.reduce((agg, token, idx) => {\n const balance = data[idx];\n if (balance) {\n balances[token.address] = BigInt(balance);\n }\n\n return agg;\n }, balances);\n }\n}\n","const ICONEX_RELAY_RESPONSE = 'ICONEX_RELAY_RESPONSE';\nconst ICONEX_RELAY_REQUEST = 'ICONEX_RELAY_REQUEST';\n\nexport enum ICONexRequestEventType {\n REQUEST_HAS_ACCOUNT = 'REQUEST_HAS_ACCOUNT',\n REQUEST_HAS_ADDRESS = 'REQUEST_HAS_ADDRESS',\n REQUEST_ADDRESS = 'REQUEST_ADDRESS',\n REQUEST_JSON = 'REQUEST_JSON',\n REQUEST_SIGNING = 'REQUEST_SIGNING',\n}\n\nexport enum ICONexResponseEventType {\n RESPONSE_HAS_ACCOUNT = 'RESPONSE_HAS_ACCOUNT',\n RESPONSE_HAS_ADDRESS = 'RESPONSE_HAS_ADDRESS',\n RESPONSE_ADDRESS = 'RESPONSE_ADDRESS',\n RESPONSE_JSON = 'RESPONSE_JSON',\n RESPONSE_SIGNING = 'RESPONSE_SIGNING',\n}\n\nexport interface ICONexRequestEvent {\n type: ICONexRequestEventType;\n // Request payload varies by event type (JSON-RPC params, signing data, etc).\n // `unknown` forces callers to validate before using — safer than `any`.\n payload?: unknown;\n}\n\nexport interface ICONexResponseEvent {\n type: ICONexResponseEventType;\n // Response payload is always a string: wallet address, tx hash, or signature.\n payload?: string;\n}\n\nexport type ICONexEvent = ICONexRequestEvent | ICONexResponseEvent;\n\nexport const request = (event: ICONexRequestEvent): Promise<ICONexResponseEvent> => {\n return new Promise((resolve, reject) => {\n // evt is a CustomEvent dispatched by the ICONex/Hana extension. Type the handler\n // param so evt.detail is properly typed instead of implicit `any`.\n const handler = (evt: Event) => {\n window.removeEventListener(ICONEX_RELAY_RESPONSE, handler);\n resolve((evt as CustomEvent<ICONexResponseEvent>).detail);\n };\n\n window.addEventListener(ICONEX_RELAY_RESPONSE, handler);\n window.dispatchEvent(\n new CustomEvent(ICONEX_RELAY_REQUEST, {\n detail: event,\n }),\n );\n });\n};\n","import type { XAccount } from '@/types/index.js';\nimport { ICONexRequestEventType, ICONexResponseEventType, request } from './iconex/index.js';\n\nimport { XConnector } from '@/core/XConnector.js';\nimport { assert, hasBooleanProperty, isRecord } from '@/shared/guards.js';\nimport { WALLET_METADATA } from '@/constants.js';\n\nconst isHanaWallet = (value: unknown): value is { available?: boolean } => {\n return isRecord(value) && (value.available === undefined || hasBooleanProperty(value, 'available'));\n};\n\nexport class IconHanaXConnector extends XConnector {\n constructor() {\n super('ICON', 'Hana Wallet', 'hana');\n }\n\n public override get isInstalled(): boolean {\n if (typeof window === 'undefined') return false;\n const hanaWallet = (window as unknown as Record<string, unknown>).hanaWallet;\n return isHanaWallet(hanaWallet) && hanaWallet.available === true;\n }\n\n public override get installUrl(): string {\n return WALLET_METADATA.hana.installUrl;\n }\n\n async connect(): Promise<XAccount | undefined> {\n const hanaWallet = (window as unknown as Record<string, unknown>).hanaWallet;\n assert(isHanaWallet(hanaWallet) || hanaWallet === undefined, '[IconHanaXConnector] invalid window.hanaWallet type');\n\n if (!hanaWallet || !hanaWallet.available) {\n window.open(WALLET_METADATA.hana.installUrl, '_blank', 'noopener,noreferrer');\n return;\n }\n\n const detail = await request({\n type: ICONexRequestEventType.REQUEST_ADDRESS,\n });\n\n if (detail?.type === ICONexResponseEventType.RESPONSE_ADDRESS) {\n return {\n address: detail?.payload,\n xChainType: this.xChainType,\n };\n }\n\n console.warn('[IconHanaXConnector] connect: unexpected response from Hana wallet', detail);\n return undefined;\n }\n\n async disconnect(): Promise<void> {\n console.log('HanaIconXConnector disconnected');\n }\n\n public override get icon(): string {\n return WALLET_METADATA.hana.icon;\n }\n}\n","import { XService } from '@/core/XService.js';\nimport { Network, getNetworkEndpoints } from '@injectivelabs/networks';\nimport { ChainGrpcWasmApi, IndexerGrpcAccountPortfolioApi } from '@injectivelabs/sdk-ts';\nimport { ChainId as InjectiveChainId } from '@injectivelabs/ts-types';\nimport { MsgBroadcaster } from '@injectivelabs/wallet-core';\nimport type { InjectiveRpcConfig, XToken } from '@sodax/types';\nimport { mainnet } from 'wagmi/chains';\nimport { WalletStrategy } from '@injectivelabs/wallet-strategy';\n\nexport class InjectiveXService extends XService {\n private static instance: InjectiveXService;\n\n public walletStrategy: WalletStrategy;\n public indexerGrpcAccountPortfolioApi: IndexerGrpcAccountPortfolioApi;\n public chainGrpcWasmApi: ChainGrpcWasmApi;\n public msgBroadcaster: MsgBroadcaster;\n\n private constructor(rpcConfig?: InjectiveRpcConfig) {\n super('INJECTIVE');\n\n const defaults = getNetworkEndpoints(Network.Mainnet);\n // Only `indexer` + `grpc` are overridable — the rest of the endpoints object\n // (rest, rpc, explorer, …) keeps the @injectivelabs/networks mainnet defaults.\n // Extend `InjectiveRpcConfig` if more endpoints need to be consumer-configurable.\n const endpoints = {\n ...defaults,\n indexer: rpcConfig?.indexer || defaults.indexer,\n grpc: rpcConfig?.grpc || defaults.grpc,\n };\n\n this.walletStrategy = new WalletStrategy({\n chainId: InjectiveChainId.Mainnet,\n strategies: {},\n evmOptions: {\n evmChainId: mainnet.id,\n rpcUrl: mainnet.rpcUrls.default.http[0],\n },\n });\n\n this.indexerGrpcAccountPortfolioApi = new IndexerGrpcAccountPortfolioApi(endpoints.indexer);\n this.chainGrpcWasmApi = new ChainGrpcWasmApi(endpoints.grpc);\n this.msgBroadcaster = new MsgBroadcaster({\n walletStrategy: this.walletStrategy,\n network: Network.Mainnet,\n endpoints,\n });\n }\n\n /**\n * @param rpcConfig - Only applied on first call. Subsequent calls return the\n * existing instance unchanged — gRPC/Indexer clients are built in the\n * constructor and can't be rebuilt at runtime. Pass the desired endpoints\n * via `SodaxWalletProvider.config.rpcConfig` once at app init.\n */\n public static getInstance(rpcConfig?: InjectiveRpcConfig): InjectiveXService {\n if (!InjectiveXService.instance) {\n InjectiveXService.instance = new InjectiveXService(rpcConfig);\n }\n return InjectiveXService.instance;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken) {\n if (!address) return 0n;\n\n const portfolio = await this.indexerGrpcAccountPortfolioApi.fetchAccountPortfolioBalances(address);\n\n const xTokenAddress = xToken.address;\n\n const balance = portfolio.bankBalancesList.find(_balance => _balance.denom === xTokenAddress);\n if (balance) {\n return BigInt(balance.amount);\n }\n\n return 0n;\n }\n}\n","import type { XAccount } from '@/types/index.js';\nimport { XConnector } from '@/core/index.js';\nimport { getInjectiveAddress } from '@injectivelabs/sdk-ts';\nimport { type Wallet, isEvmBrowserWallet, isCosmosBrowserWallet } from '@injectivelabs/wallet-base';\nimport { isCosmosWalletInstalled } from '@injectivelabs/wallet-cosmos';\nimport { InjectiveXService } from './InjectiveXService.js';\n\nconst WALLET_ICONS: Partial<Record<Wallet, string>> = {\n metamask: 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/metamask.svg',\n keplr: 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/keplr.svg',\n leap: 'https://assets.leapwallet.io/logos/leap-cosmos-logo.svg',\n rabby: 'https://raw.githubusercontent.com/RabbyHub/logo/master/symbol.svg',\n phantom: 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/phantom.svg',\n 'okx-wallet': 'https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png',\n 'trust-wallet': 'https://trustwallet.com/assets/images/media/assets/twLogo.svg',\n};\n\nexport class InjectiveXConnector extends XConnector {\n private wallet: Wallet;\n\n constructor(name: string, wallet: Wallet) {\n super('INJECTIVE', name, wallet);\n this.wallet = wallet;\n }\n\n getXService(): InjectiveXService {\n return InjectiveXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n if (isCosmosBrowserWallet(this.wallet) && !isCosmosWalletInstalled(this.wallet)) {\n console.warn(`[InjectiveXConnector] connect: ${this.wallet} cosmos wallet not installed`);\n return undefined;\n }\n\n const walletStrategy = this.getXService().walletStrategy;\n await walletStrategy.setWallet(this.wallet);\n const addresses = await walletStrategy.getAddresses();\n\n if (!addresses?.length) {\n console.warn(`[InjectiveXConnector] connect: ${this.wallet} returned no addresses`);\n return undefined;\n }\n\n const firstAddress = addresses[0];\n if (!firstAddress) {\n console.warn(`[InjectiveXConnector] connect: ${this.wallet} returned empty addresses array`);\n return undefined;\n }\n const address = isEvmBrowserWallet(this.wallet) ? getInjectiveAddress(firstAddress) : firstAddress;\n\n return {\n address,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {\n if (isEvmBrowserWallet(this.wallet)) {\n const walletStrategy = this.getXService().walletStrategy;\n await walletStrategy.setWallet(this.wallet);\n await walletStrategy.disconnect();\n }\n }\n\n public override get icon(): string | undefined {\n return WALLET_ICONS[this.wallet];\n }\n\n public override get isInstalled(): boolean {\n if (isCosmosBrowserWallet(this.wallet)) {\n return isCosmosWalletInstalled(this.wallet);\n }\n // EVM / other injective wallets: wallet-strategy handles install errors at connect time.\n // Default to true so users can attempt connect — Phase 3 classifier will surface walletNotInstalled if it fails.\n return true;\n }\n}\n","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 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 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 { XService } from '@/core/XService.js';\nimport type { XToken } from '@sodax/types';\nimport { NearConnector } from '@hot-labs/near-connect';\nimport { JsonRpcProvider } from 'near-api-js';\nimport { NEAR_DEFAULT_RPC_URL } from '@/constants.js';\n\nexport class NearXService extends XService {\n private static instance: NearXService;\n\n public walletSelector: NearConnector;\n public rpcUrl: string;\n\n /**\n * @param rpcUrl - Used by `getBalance` via `JsonRpcProvider({ url: rpcUrl })`.\n * Does NOT affect `walletSelector` — `@hot-labs/near-connect` only accepts\n * the network preset name (`'mainnet'`/`'testnet'`) and fetches RPC internally.\n * Custom RPC is therefore read-only for balance queries.\n */\n private constructor(rpcUrl: string = NEAR_DEFAULT_RPC_URL) {\n super('NEAR');\n\n this.rpcUrl = rpcUrl;\n this.walletSelector = new NearConnector({\n network: 'mainnet',\n logger: console,\n autoConnect: true,\n excludedWallets: ['okx-wallet'],\n });\n }\n\n /**\n * @param rpcUrl - Re-applied on every call (matches StacksXService semantics).\n * `rpcUrl` only drives `getBalance` via a per-call `JsonRpcProvider`, so it's\n * safe to update at runtime — no persistent chain client to rebuild.\n */\n public static getInstance(rpcUrl?: string): NearXService {\n if (!NearXService.instance) {\n NearXService.instance = new NearXService(rpcUrl);\n } else if (rpcUrl) {\n NearXService.instance.rpcUrl = rpcUrl;\n }\n return NearXService.instance;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n // reference: https://near.github.io/near-api-js/classes/_near-js_providers.json-rpc-provider.JsonRpcProvider.html\n const provider = new JsonRpcProvider({ url: this.rpcUrl });\n\n // get native balance\n if (xToken.symbol === 'NEAR') {\n const account = await provider.viewAccount({ accountId: address ?? '' });\n return BigInt(account.amount);\n }\n\n // Near Fungible Token Standard(https://github.com/near/NEPs/blob/master/neps/nep-0141.md)\n // get balance of the token\n\n const res = await provider.callFunction<number>({\n contractId: xToken.address,\n method: 'ft_balance_of',\n args: { account_id: address },\n });\n return BigInt(res ?? 0);\n }\n}\n","import type { XAccount } from '@/types/index.js';\n\nimport { XConnector } from '@/core/index.js';\nimport type { NearWalletBase } from '@hot-labs/near-connect';\nimport { NearXService } from './NearXService.js';\n\nexport class NearXConnector extends XConnector {\n _wallet: NearWalletBase;\n\n constructor(wallet: NearWalletBase) {\n super('NEAR', wallet.manifest.name, wallet.manifest.id);\n this._wallet = wallet;\n }\n\n getXService(): NearXService {\n return NearXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n const walletSelector = this.getXService().walletSelector;\n const wallet = await walletSelector.connect({ walletId: this._wallet.manifest.id });\n const accounts = await wallet.getAccounts();\n\n if (accounts.length === 0 || accounts[0] === undefined) {\n console.warn(`[NearXConnector] connect: ${this._wallet.manifest.name} returned no accounts`);\n return undefined;\n }\n\n return {\n address: accounts[0].accountId,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {\n const walletSelector = this.getXService().walletSelector;\n await walletSelector.disconnect(this._wallet);\n }\n\n public override get icon(): string {\n return this._wallet.manifest.icon;\n }\n}\n","import { XService } from '@/core/XService.js';\nimport type { XToken } from '@sodax/types';\nimport { fetchCallReadOnlyFunction, Cl, type UIntCV, type ResponseOkCV } from '@stacks/transactions';\nimport { networkFrom, type StacksNetwork, type StacksNetworkName } from '@stacks/network';\n\nexport class StacksXService extends XService {\n private static instance: StacksXService;\n\n public network: StacksNetwork;\n\n private constructor(network?: StacksNetworkName | StacksNetwork) {\n super('STACKS');\n this.network = networkFrom(network || 'mainnet');\n }\n\n public static getInstance(network?: StacksNetworkName | StacksNetwork): StacksXService {\n if (!StacksXService.instance) {\n StacksXService.instance = new StacksXService(network);\n } else if (network) {\n StacksXService.instance.network = networkFrom(network);\n }\n return StacksXService.instance;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return 0n;\n\n // native STX balance\n if (xToken.symbol === 'STX') {\n const url = `${this.network.client.baseUrl}/extended/v1/address/${address}/balances`;\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Error fetching data: ${response.statusText}`);\n }\n const data = await response.json();\n return BigInt(data.stx.balance);\n } catch (error) {\n console.error('Error fetching STX balance:', error);\n return 0n;\n }\n }\n\n // SIP-010 fungible token balance via read-only contract call\n const parts = xToken.address.split('.');\n const contractAddress = parts[0] ?? '';\n const contractName = parts[1] ?? '';\n try {\n const result = (await fetchCallReadOnlyFunction({\n contractAddress,\n contractName,\n functionName: 'get-balance',\n functionArgs: [Cl.principal(address)],\n network: this.network,\n senderAddress: address,\n })) as ResponseOkCV<UIntCV>;\n return result.value.value as bigint;\n } catch (error) {\n console.error('Error fetching token balance:', error);\n return 0n;\n }\n }\n}\n","import type { XAccount } from '@/types/index.js';\nimport { XConnector } from '@/core/index.js';\nimport type { StacksProvider } from '@stacks/connect';\nimport { request, disconnect } from '@stacks/connect';\n\nexport interface StacksProviderConfig {\n /** The provider ID matching the window path, e.g. 'LeatherProvider' or 'XverseProviders.BitcoinProvider' */\n id: string;\n name: string;\n icon: string;\n installUrl?: string;\n}\n\n/** Resolves a provider from `window` by dot-separated ID, matching @stacks/connect-ui's getProviderFromId */\nfunction getProviderFromId(id: string): StacksProvider | undefined {\n return id.split('.').reduce<unknown>((acc, part) => (acc as Record<string, unknown>)?.[part], window) as\n | StacksProvider\n | undefined;\n}\n\nexport class StacksXConnector extends XConnector {\n private readonly config: StacksProviderConfig;\n\n constructor(config: StacksProviderConfig) {\n super('STACKS', config.name, config.id);\n this.config = config;\n }\n\n async connect(): Promise<XAccount | undefined> {\n const provider = this.getProvider();\n\n if (!provider) {\n // Throw instead of silently navigating to the install URL — callers\n // that bypass `useWalletModal.selectWallet`'s pre-check otherwise\n // see a tab open with no surfaced error. Consumers read\n // `connector.installUrl` to render the install CTA on the caught\n // error.\n throw new Error(`${this.config.name} is not installed. Install the extension and reload the page.`);\n }\n\n const response = await request({ provider }, 'stx_getAddresses');\n // Stacks SDK types don't include `purpose` on AddressEntry, but wallets return it at runtime\n const stxAddress = response.addresses.find(a => (a as unknown as { purpose?: string }).purpose === 'stacks');\n\n if (!stxAddress) {\n console.warn(\n `[StacksXConnector] ${this.config.name}: no address with purpose=\"stacks\" returned from stx_getAddresses`,\n response.addresses,\n );\n return undefined;\n }\n\n return {\n address: stxAddress.address,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {\n disconnect();\n }\n\n public override get icon(): string {\n return this.config.icon;\n }\n\n public override get isInstalled(): boolean {\n if (typeof window === 'undefined') return false;\n return getProviderFromId(this.config.id) !== undefined;\n }\n\n public override get installUrl(): string | undefined {\n return this.config.installUrl;\n }\n\n public getProvider(): StacksProvider | undefined {\n return getProviderFromId(this.config.id);\n }\n}\n","import type { StacksProviderConfig } from './StacksXConnector.js';\n\n// Icons sourced from @stacks/connect DEFAULT_PROVIDERS\n// https://github.com/stx-labs/connect/blob/main/packages/connect/src/providers.ts\nconst LEATHER_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYuODM4NyIgZmlsbD0iIzEyMTAwRiIvPgo8cGF0aCBkPSJNNzQuOTE3MSA1Mi43MTE0QzgyLjQ3NjYgNTEuNTQwOCA5My40MDg3IDQzLjU4MDQgOTMuNDA4NyAzNy4zNzYxQzkzLjQwODcgMzUuNTAzMSA5MS44OTY4IDM0LjIxNTQgODkuNjg3MSAzNC4yMTU0Qzg1LjUwMDQgMzQuMjE1NCA3OC40MDYxIDQwLjUzNjggNzQuOTE3MSA1Mi43MTE0Wk0zOS45MTEgODMuNDk5MUMzMC4wMjU2IDgzLjQ5OTEgMjkuMjExNSA5My4zMzI0IDM5LjA5NjkgOTMuMzMyNEM0My41MTYzIDkzLjMzMjQgNDguODY2MSA5MS41NzY0IDUxLjY1NzMgODguNDE1N0M0Ny41ODY4IDg0LjkwMzggNDQuMjE0MSA4My40OTkxIDM5LjkxMSA4My40OTkxWk0xMDIuODI5IDc5LjI4NDhDMTAzLjQxIDk1Ljc5MDcgOTUuMDM2OSAxMDUuMDM5IDgwLjg0ODQgMTA1LjAzOUM3Mi40NzQ4IDEwNS4wMzkgNjguMjg4MSAxMDEuODc4IDU5LjMzMyA5Ni4wMjQ5QzU0LjY4MSAxMDEuMTc2IDQ1Ljg0MjMgMTA1LjAzOSAzOC41MTU0IDEwNS4wMzlDMTMuMjc4NSAxMDUuMDM5IDE0LjMyNTIgNzIuODQ2MyA0MC4wMjczIDcyLjg0NjNDNDUuMzc3MSA3Mi44NDYzIDQ5LjkxMjggNzQuMjUxMSA1NS43Mjc3IDc3Ljg4TDU5LjU2NTYgNjQuNDE3N0M0My43NDg5IDYwLjA4NjQgMzUuODQwNSA0Ny45MTE4IDQzLjYzMjYgMzAuNDY5M0g1Ni4xOTI5QzQ5LjIxNSA0Mi4wNTg2IDUzLjk4MzIgNTEuNjU3OCA2Mi44MjIgNTIuNzExNEM2Ny41OTAzIDM1LjczNzIgNzcuODI0NiAyMi41MDkgOTEuNDMxNiAyMi41MDlDOTkuMTA3NCAyMi41MDkgMTA1LjE1NSAyNy41NDI4IDEwNS4xNTUgMzYuNjczN0MxMDUuMTU1IDUxLjMwNjYgODYuMDgxOSA2My4yNDcxIDcxLjY2MDcgNjQuNDE3N0w2NS43Mjk1IDg1LjM3MjFDNzIuNDc0OCA5My4yMTUzIDkxLjE5OSAxMDAuODI0IDkxLjE5OSA3OS4yODQ4SDEwMi44MjlaIiBmaWxsPSIjRjVGMUVEIi8+Cjwvc3ZnPgo=';\n\nconst XVERSE_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MDAiIGhlaWdodD0iNjAwIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGZpbGw9IiMxNzE3MTciIGQ9Ik0wIDBoNjAwdjYwMEgweiIvPjxwYXRoIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgZD0iTTQ0MCA0MzUuNHYtNTFjMC0yLS44LTMuOS0yLjItNS4zTDIyMCAxNjIuMmE3LjYgNy42IDAgMCAwLTUuNC0yLjJoLTUxLjFjLTIuNSAwLTQuNiAyLTQuNiA0LjZ2NDcuM2MwIDIgLjggNCAyLjIgNS40bDc4LjIgNzcuOGE0LjYgNC42IDAgMCAxIDAgNi41bC03OSA3OC43Yy0xIC45LTEuNCAyLTEuNCAzLjJ2NTJjMCAyLjQgMiA0LjUgNC42IDQuNUgyNDljMi42IDAgNC42LTIgNC42LTQuNlY0MDVjMC0xLjIuNS0yLjQgMS40LTMuM2w0Mi40LTQyLjJhNC42IDQuNiAwIDAgMSA2LjQgMGw3OC43IDc4LjRhNy42IDcuNiAwIDAgMCA1LjQgMi4yaDQ3LjVjMi41IDAgNC42LTIgNC42LTQuNloiLz48cGF0aCBmaWxsPSIjRUU3QTMwIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGQ9Ik0zMjUuNiAyMjcuMmg0Mi44YzIuNiAwIDQuNiAyLjEgNC42IDQuNnY0Mi42YzAgNCA1IDYuMSA4IDMuMmw1OC43LTU4LjVjLjgtLjggMS4zLTIgMS4zLTMuMnYtNTEuMmMwLTIuNi0yLTQuNi00LjYtNC42TDM4NCAxNjBjLTEuMiAwLTIuNC41LTMuMyAxLjNsLTU4LjQgNTguMWE0LjYgNC42IDAgMCAwIDMuMiA3LjhaIi8+PC9nPjwvc3ZnPg==';\n\nconst ASIGNA_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMDEwMCIgZD0iTTAgMGgzMnYzMkgweiIvPjxwYXRoIGZpbGw9InVybCgjYSkiIGQ9Ik0xNS4xMSA1LjU1YTMgMyAwIDAgMC0xLjgyIDEuM2wtLjA1LjA4LS40My43Mi0uMDcuMTEtLjUuODUtLjA1LjA5LTEuMjkgMi4xOC0uMDQuMDctLjQ3LjgtLjA2LjEtLjQ2Ljc4LS4wNy4xMS0xLjYzIDIuNzYtLjA3LjExLS4zOC42Ni0uMDUuMDgtLjczIDEuMjQtLjM1LjYtLjQuNjctLjA1LjA5TDUuMSAyMC43bC0uMTEuMTgtLjE0LjIzLS4wNy4xMy0uMzMuNTUtLjA0LjA3di4wMWExLjI2IDEuMjYgMCAwIDAtLjE0LjQ3IDEuMzEgMS4zMSAwIDAgMCAxLjI0IDEuNGgxLjVsLjA1LS4wNi4wNC0uMDYuODctMS4yMS4wNS0uMDguNzctMS4wNy4wNS0uMDcuNC0uNTcuMDUtLjA2LjI0LS4zNGExLjUyIDEuNTIgMCAwIDEgMS4zOS0uNjIgMS41IDEuNSAwIDAgMSAuNjQuMiAxLjQ3IDEuNDcgMCAwIDEgLjczIDEuMjcgMS40NCAxLjQ0IDAgMCAxLS4yNy44NGwtLjYzLjg4LS4wNS4wNy0uMzIuNDUtLjA2LjA4LS4wOC4xMi0uMTIuMTYtLjA1LjA4aDIuMTNhMi4zMiAyLjMyIDAgMCAwIDEuNzctLjk2bDEuMTgtMS42My43Ny0xLjA4IDEuMy0xLjhhMS4yNCAxLjI0IDAgMCAxIC41NS0uNDNsLjA4LS4wM2ExLjMgMS4zIDAgMCAxIC4zLS4wNiAxLjI4IDEuMjggMCAwIDEgMS4xNS41NGwuMTEuMmExLjEzIDEuMTMgMCAwIDEgLjEuNDEgMS4xOSAxLjE5IDAgMCAxLS4yMy43N2wtLjAzLjA1LS41Ny44LS43Ljk4LS4yNy4zN2ExLjIyIDEuMjIgMCAwIDAtLjIuNSAxLjA1IDEuMDUgMCAwIDAtLjAyLjIzdi4wNmExLjE3IDEuMTcgMCAwIDAgLjE0LjQzbC4wMi4wNS4wNy4xYTEuNDQgMS40NCAwIDAgMCAuMS4xMWwuMDUuMDYuMDEuMDFhMS44IDEuOCAwIDAgMCAuMTQuMWMwIC4wMi4wMi4wMy4wNC4wM2ExIDEgMCAwIDAgLjA4LjA1bC4wNy4wNGExLjI1IDEuMjUgMCAwIDAgLjUuMWg2LjljLjEgMCAuMi0uMDEuMjktLjAzbC4wNi0uMDJhMS4yNyAxLjI3IDAgMCAwIC4yNy0uMS41Ny41NyAwIDAgMCAuMDctLjAzIDEuMjEgMS4yMSAwIDAgMCAuMjYtLjE5bC4wOC0uMDdhLjkyLjkyIDAgMCAwIC4xNS0uMTkgMS41NSAxLjU1IDAgMCAwIC4wOS0uMTdsLjAyLS4wNWExLjIyIDEuMjIgMCAwIDAgLjA4LS4yNnYtLjA0bC4wMi0uMDh2LS4wOGExLjMyIDEuMzIgMCAwIDAtLjItLjc0bC0xLjYtMi42NC0uMDYtLjEtLjItLjMyLS4zMy0uNTR2LS4wMWwtLjA1LS4wOC0xLjMtMi4xNS0uMDctLjEtLjA0LS4wNi0uOC0xLjMyLS4wNC0uMDctLjItLjM0LS4xLS4xNC0uMS0uMTYtLjUzLS45LS4xMy0uMi0uMDktLjE0LTIuMTctMy41Ny0uMDQtLjA3LS43Mi0xLjE5LS4wNS0uMDctLjQtLjY1YTIuNjUgMi42NSAwIDAgMC0uMy0uNCAyLjk2IDIuOTYgMCAwIDAtLjk3LS43NCAzLjA0IDMuMDQgMCAwIDAtMS4zLS4zYy0uMjUgMC0uNS4wNC0uNzQuMVoiLz48cGF0aCBmaWxsPSJ1cmwoI2IpIiBkPSJNMTkgMTYuM2E1LjQ1IDUuNDUgMCAwIDAtLjgzIDEuNTZsLS4wNC4xNWExLjM2IDEuMzYgMCAwIDEgLjI4LS4xNiAxLjI0IDEuMjQgMCAwIDEgLjM4LS4wOGguMWExLjI4IDEuMjggMCAwIDEgMS4wNS41NGMuMDQuMDYuMDguMTMuMS4yYTEuMjQgMS4yNCAwIDAgMSAuMDkuMjcgMS4xOSAxLjE5IDAgMCAxLS4yLjkxbC0uMDQuMDUtLjU3Ljc5LS43Ljk5LS4yNy4zN2ExLjIzIDEuMjMgMCAwIDAtLjIuNDIgMS4wNiAxLjA2IDAgMCAwLS4wMi4zMXYuMDZhMS4xNyAxLjE3IDAgMCAwIC4xNi40Ny45My45MyAwIDAgMCAuMDcuMSAxLjUgMS41IDAgMCAwIC4xLjEybC4wNS4wNmguMDFhMS45NCAxLjk0IDAgMCAwIC4wOS4wOCAxIDEgMCAwIDAgLjE3LjFsLjA3LjA0YTEuMjUgMS4yNSAwIDAgMCAuNS4xaDYuOWMuMSAwIC4yIDAgLjI4LS4wMmwuMDctLjAyYTEuMzIgMS4zMiAwIDAgMCAuMzQtLjEzbC4xNi0uMS4wMy0uMDNhMS4yOSAxLjI5IDAgMCAwIC4yLS4yIDIuNDMgMi40MyAwIDAgMCAuMTItLjE3Yy4wMy0uMDMuMDUtLjA4LjA3LS4xMmwuMDItLjA1YTEuMjEgMS4yMSAwIDAgMCAuMDktLjN2LS4wOGwuMDEtLjA5YTEuMzIgMS4zMiAwIDAgMC0uMi0uNzNsLTEuNi0yLjY0LS4wNi0uMS0uMi0uMzItLjMzLS41NHYtLjAybC0uMDUtLjA3LTEuMy0yLjE1LS4xMi0uMDctLjA3LS4wNGE0Ljk0IDQuOTQgMCAwIDAtMi40Ni0uNjdjLTEuMDMgMC0xLjc2LjU3LTIuMjYgMS4yWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMi4yOSAyMS4wOGMwIC4yOS0uMDkuNTgtLjI3Ljg0bC0xLjMxIDEuODRIN2wyLjUyLTMuNTNhMS41NCAxLjU0IDAgMCAxIDIuMS0uMzZjLjQzLjI4LjY2Ljc0LjY2IDEuMloiLz48cGF0aCBmaWxsPSIjMDAwIiBkPSJNMTEuMTYgMjEuMjVhLjU2LjU2IDAgMCAxLS41Ny41NS41Ni41NiAwIDAgMS0uNTctLjU2LjU2LjU2IDAgMCAxIC41Ny0uNTUuNTYuNTYgMCAwIDEgLjU3LjU2WiIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjE1LjIzIiB4Mj0iMTkuMyIgeTE9IjI1Ljc4IiB5Mj0iNi4xMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM2NTIyRjQiLz48c3RvcCBvZmZzZXQ9Ii41NSIgc3RvcC1jb2xvcj0iIzlCNkJGRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0E1ODVGRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMjIuNTkiIHgyPSIyNC44IiB5MT0iMjQuNzEiIHkyPSIxNS41MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM0MjFGOEIiLz48c3RvcCBvZmZzZXQ9Ii41NSIgc3RvcC1jb2xvcj0iIzcyMzBGRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzk3NzNGRiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvc3ZnPg==';\n\nconst FORDEFI_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZmlsbD0iIzEwMTExNCIgZD0iTTAgMGg0MnY0MkgweiIvPgogIDxwYXRoIGQ9Ik0xOS40NyAyNi44OUg1djMuNTdhNC41NyA0LjU3IDAgMCAwIDQuNTggNC41N2g1LjgzbDQuMDYtOC4xNFoiIGZpbGw9IiM3OTk0RkYiLz4KICA8cGF0aCBkPSJNNSAxNy40aDI3LjU4bC0zLjIgNi43OEg1VjE3LjRaIiBmaWxsPSIjNDg2REZGIi8+CiAgPHBhdGggZD0iTTE0LjY3IDdINXY3LjY4aDMzVjdoLTkuNjd2NS43NGgtMlY3aC05LjY3djUuNzRoLTEuOTlWN1oiIGZpbGw9IiM1Q0QxRkEiLz4KPC9zdmc+Cg==';\n\nexport const STACKS_PROVIDERS: StacksProviderConfig[] = [\n {\n id: 'LeatherProvider',\n name: 'Leather',\n icon: LEATHER_ICON,\n installUrl: 'https://chrome.google.com/webstore/detail/hiro-wallet/ldinpeekobnhjjdofggfgjlcehhmanlj',\n },\n {\n id: 'XverseProviders.BitcoinProvider',\n name: 'Xverse Wallet',\n icon: XVERSE_ICON,\n installUrl: 'https://chrome.google.com/webstore/detail/xverse-wallet/idnnbdplmphpflfnlkomgpfbpcgelopg',\n },\n {\n id: 'AsignaProvider',\n name: 'Asigna Multisig',\n icon: ASIGNA_ICON,\n installUrl: 'https://stx.asigna.io/',\n },\n {\n id: 'FordefiProviders.UtxoProvider',\n name: 'Fordefi',\n icon: FORDEFI_ICON,\n installUrl: 'https://chromewebstore.google.com/detail/fordefi/hcmehenccjdmfbojapcbcofkgdpbnlle',\n },\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 { useEffect, useMemo, useRef, useState } from 'react';\nimport { useConfig, useConnectors, useAccount, usePublicClient, useWalletClient, useReconnect } from 'wagmi';\nimport { EvmWalletProvider } from '@sodax/wallet-sdk-core';\nimport { EvmXService } from '@/xchains/evm/EvmXService.js';\nimport { EvmXConnector } from '@/xchains/evm/index.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\nimport { useWalletConfig } from '@/context/WalletConfigContext.js';\nimport { resolveEvmDefaults } from '@/utils/walletRpcConfig.js';\n\nexport const EvmHydrator = () => {\n const wagmiConfig = useConfig();\n const connectors = useConnectors();\n const { address, status, connector } = useAccount();\n const evmPublicClient = usePublicClient();\n const { data: evmWalletClient } = useWalletClient();\n const setXConnection = useXWalletStore(state => state.setXConnection);\n const unsetXConnection = useXWalletStore(state => state.unsetXConnection);\n const setWalletProvider = useXWalletStore(state => state.setWalletProvider);\n const userDisconnectedEvm = useXWalletStore(state => state.userDisconnected.EVM);\n const { reconnect } = useReconnect();\n const walletConfig = useWalletConfig();\n\n useEffect(() => {\n if (wagmiConfig) {\n EvmXService.getInstance().wagmiConfig = wagmiConfig;\n }\n }, [wagmiConfig]);\n\n const evmConnectors = useMemo(() => connectors.map(c => new EvmXConnector(c)), [connectors]);\n useEffect(() => {\n EvmXService.getInstance().setXConnectors(evmConnectors);\n useXWalletStore.getState().setXConnectors('EVM', evmConnectors);\n }, [evmConnectors]);\n\n // Retry reconnect when new connectors announce (Hana lazy-announces post-mount) or\n // when status settles to 'disconnected' with a persisted connection. wagmi's\n // `Hydrate.onMount()` only runs once and won't retry on its own.\n // `hydrated` gates retry until persist rehydration so `xConnections.EVM` and\n // `userDisconnected.EVM` reads are authoritative.\n const [hydrated, setHydrated] = useState(() => useXWalletStore.persist.hasHydrated());\n useEffect(() => {\n if (hydrated) return;\n const unsub = useXWalletStore.persist.onFinishHydration(() => setHydrated(true));\n return unsub;\n }, [hydrated]);\n // biome-ignore lint/correctness/useExhaustiveDependencies: `connectors` is a re-fire trigger only — wagmi mipd appends new connectors when wallets announce post-mount, and we want to retry reconnect each time the list grows\n useEffect(() => {\n if (!hydrated) return;\n if (status !== 'disconnected') return;\n const state = useXWalletStore.getState();\n if (!state.xConnections.EVM) return;\n if (state.userDisconnected.EVM) return;\n reconnect();\n }, [hydrated, connectors, status, reconnect]);\n\n // wasConnectedRef: skip the initial 'disconnected' tick before wagmi reconnects.\n // userDisconnectedEvm: skip ghost reconnects when a wallet ignores `wallet_revokePermissions`.\n // Don't gate on walletClient — wagmi still reports 'connected' when the active chain\n // is outside wagmiConfig.chains (e.g. Injective EVM 1776), so useWalletClient() never\n // resolves and the connection would be hidden. xConnections.EVM tracks intent;\n // walletProviders.EVM stays undefined until walletClient resolves, and callers\n // prompt switchChain before signing.\n const wasConnectedRef = useRef(false);\n useEffect(() => {\n if (status === 'connecting' || status === 'reconnecting') return;\n if (status === 'connected' && address && connector) {\n if (userDisconnectedEvm) return;\n wasConnectedRef.current = true;\n setXConnection('EVM', {\n xAccount: { address: address as string, xChainType: 'EVM' },\n xConnectorId: connector.id,\n });\n } else if (status === 'disconnected' && wasConnectedRef.current) {\n wasConnectedRef.current = false;\n unsetXConnection('EVM');\n }\n }, [address, status, connector, userDisconnectedEvm, setXConnection, unsetXConnection]);\n\n const walletProvider = useMemo(() => {\n if (!evmPublicClient || !evmWalletClient) return undefined;\n if (userDisconnectedEvm) return undefined;\n const defaults = resolveEvmDefaults(evmWalletClient.chain.id, walletConfig.EVM?.chains);\n return new EvmWalletProvider({\n walletClient: evmWalletClient,\n publicClient: evmPublicClient,\n defaults,\n });\n }, [evmPublicClient, evmWalletClient, walletConfig.EVM?.chains, userDisconnectedEvm]);\n\n useEffect(() => {\n setWalletProvider('EVM', walletProvider);\n }, [walletProvider, setWalletProvider]);\n\n return null;\n};\n","import { useEffect, useRef } from 'react';\nimport { useConfig, useConnect, useDisconnect, useSignMessage } from 'wagmi';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\nexport const EvmActions = () => {\n const wagmiConfig = useConfig();\n const { connectAsync } = useConnect();\n const { disconnectAsync } = useDisconnect();\n const { signMessageAsync } = useSignMessage();\n const registerChainActions = useXWalletStore(state => state.registerChainActions);\n\n const connectRef = useRef(connectAsync);\n const disconnectRef = useRef(disconnectAsync);\n const signMessageRef = useRef(signMessageAsync);\n const wagmiConfigRef = useRef(wagmiConfig);\n\n useEffect(() => {\n connectRef.current = connectAsync;\n disconnectRef.current = disconnectAsync;\n signMessageRef.current = signMessageAsync;\n wagmiConfigRef.current = wagmiConfig;\n }, [connectAsync, disconnectAsync, signMessageAsync, wagmiConfig]);\n\n useEffect(() => {\n registerChainActions('EVM', {\n connect: async (xConnectorId: string) => {\n const connector = wagmiConfigRef.current.connectors.find(c => c.id === xConnectorId);\n if (!connector) {\n console.warn(\n `[EvmActions] connect: connector \"${xConnectorId}\" not found in wagmi config`,\n wagmiConfigRef.current.connectors.map(c => c.id),\n );\n return undefined;\n }\n // Clear flag before awaiting — flips re-fire EvmHydrator's effects, surfacing\n // any pre-existing wagmi connection (ghost auto-reconnect).\n useXWalletStore.getState().clearUserDisconnected('EVM');\n try {\n await connectRef.current({ connector });\n } catch (error) {\n if (error instanceof Error && error.name === 'ConnectorAlreadyConnectedError') {\n return undefined;\n }\n throw error;\n }\n return undefined;\n },\n disconnect: async () => {\n // Clear zustand + flag synchronously so UI is consistent regardless of whether\n // wagmi.disconnect() throws (Hana 4200), hangs (WC relay), or succeeds.\n const store = useXWalletStore.getState();\n store.unsetXConnection('EVM');\n store.markUserDisconnected('EVM');\n try {\n await disconnectRef.current();\n } catch (error) {\n console.warn('[EvmActions] wagmi disconnect failed (zustand already cleared):', error);\n }\n },\n getConnectors: () => useXWalletStore.getState().xConnectorsByChain.EVM ?? [],\n getConnection: () => useXWalletStore.getState().xConnections.EVM,\n signMessage: async (message: string) => {\n const signature = await signMessageRef.current({ message });\n return signature;\n },\n });\n }, [registerChainActions]);\n\n return null;\n};\n","import { type ReactNode, useMemo, useRef } from 'react';\nimport { WagmiProvider } from 'wagmi';\nimport { walletConnect } from 'wagmi/connectors';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { createWagmiConfig } from '@/xchains/evm/EvmXService.js';\nimport type { EvmTypeConfig } from '@/types/config.js';\nimport { EvmHydrator } from './EvmHydrator.js';\nimport { EvmActions } from './EvmActions.js';\nimport { EVM_DEFAULT_RECONNECT_ON_MOUNT, EVM_DEFAULT_SSR } from '@/constants.js';\n\ntype EvmProviderProps = {\n children: ReactNode;\n /** EVM type slot — wagmi adapter settings + nested per-chain entries. */\n config: EvmTypeConfig;\n};\n\nexport const EvmProvider = ({ children, config }: EvmProviderProps) => {\n const reconnectOnMount = config.reconnectOnMount ?? EVM_DEFAULT_RECONNECT_ON_MOUNT;\n const ssr = config.ssr ?? EVM_DEFAULT_SSR;\n\n const queryClientRef = useRef<QueryClient>(null);\n if (!queryClientRef.current) {\n queryClientRef.current = new QueryClient();\n }\n\n const walletConnectConfig = config.walletConnect;\n\n const wagmiConfig = useMemo(() => {\n const connectors = [];\n if (walletConnectConfig) {\n if (walletConnectConfig.projectId) {\n connectors.push(walletConnect({ showQrModal: true, ...walletConnectConfig }));\n } else {\n console.warn('[wallet-sdk-react] walletConnect.projectId is required — WalletConnect connector skipped.');\n }\n }\n return createWagmiConfig(config.chains, { reconnectOnMount, ssr, connectors });\n }, [config.chains, reconnectOnMount, ssr, walletConnectConfig]);\n\n // wagmi requires its own QueryClientProvider — this is wagmi-internal, not the app's React Query cache.\n return (\n <QueryClientProvider client={queryClientRef.current}>\n <WagmiProvider reconnectOnMount={reconnectOnMount} config={wagmiConfig} initialState={config.initialState}>\n <EvmHydrator />\n <EvmActions />\n {children}\n </WagmiProvider>\n </QueryClientProvider>\n );\n};\n","import type { XAccount } from '@/types/index.js';\n// Wallet is the type from useWallet().wallets — each entry has .adapter (name, icon, url) and .readyState.\nimport type { Wallet } from '@solana/wallet-adapter-react';\n\nimport { XConnector } from '@/core/index.js';\nimport { SolanaXService } from './SolanaXService.js';\n\nexport class SolanaXConnector extends XConnector {\n wallet: Wallet;\n constructor(wallet: Wallet) {\n super('SOLANA', wallet?.adapter.name, wallet?.adapter.name);\n this.wallet = wallet;\n }\n\n getXService(): SolanaXService {\n return SolanaXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n return;\n }\n\n async disconnect(): Promise<void> {}\n\n public override get icon(): string {\n return this.wallet?.adapter.icon;\n }\n\n public override get isInstalled(): boolean {\n // WalletReadyState string values from @solana/wallet-adapter-base.\n // Imported as string literals to avoid adding -base as an explicit dep.\n // - 'Installed' — browser extension is injected (Phantom, Solflare, …).\n // - 'Loadable' — adapter can bootstrap the wallet on demand (e.g. mobile\n // deep-link adapters). The wallet isn't physically\n // present, but `connect()` will load it on first use,\n // so treat it as installed — otherwise the modal would\n // show a spurious \"Install\" CTA for a wallet the user\n // can actually connect to.\n const state = this.wallet?.readyState as string | undefined;\n return state === 'Installed' || state === 'Loadable';\n }\n\n public override get installUrl(): string | undefined {\n return this.wallet?.adapter.url;\n }\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport { useConnection, useWallet } from '@solana/wallet-adapter-react';\nimport { SolanaWalletProvider } from '@sodax/wallet-sdk-core';\nimport { ChainKeys } from '@sodax/types';\nimport { SolanaXService } from '@/xchains/solana/SolanaXService.js';\nimport { SolanaXConnector } from '@/xchains/solana/index.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\nimport { useWalletConfig } from '@/context/WalletConfigContext.js';\nimport { getEntryDefaults } from '@/utils/walletRpcConfig.js';\n\n/**\n * Hydrates Solana state from @solana/wallet-adapter-react hooks into SolanaXService singleton and store.\n */\nexport const SolanaHydrator = () => {\n const { connection } = useConnection();\n const solanaWallet = useWallet();\n const setXConnection = useXWalletStore(state => state.setXConnection);\n const unsetXConnection = useXWalletStore(state => state.unsetXConnection);\n const setWalletProvider = useXWalletStore(state => state.setWalletProvider);\n const walletConfig = useWalletConfig();\n const solanaDefaults = getEntryDefaults<typeof ChainKeys.SOLANA_MAINNET>(\n walletConfig.SOLANA?.chains?.[ChainKeys.SOLANA_MAINNET],\n );\n\n useEffect(() => {\n if (connection) {\n SolanaXService.getInstance().connection = connection;\n }\n }, [connection]);\n\n // useWallet() returns a new object ref every render — keep a ref so effects\n // can read the full object without listing it as a dep.\n // Empty deps array means this effect runs after every render to keep the ref fresh.\n const solanaWalletRef = useRef(solanaWallet);\n useEffect(() => {\n solanaWalletRef.current = solanaWallet;\n });\n\n // Memoize installed connectors. solanaWallet.wallets is an unstable array reference,\n // but we only care about the installed subset and stable adapter identity.\n const solanaConnectors = useMemo(\n () =>\n solanaWallet.wallets\n .filter(wallet => wallet.readyState === 'Installed')\n .map(wallet => new SolanaXConnector(wallet)),\n [solanaWallet.wallets],\n );\n\n useEffect(() => {\n SolanaXService.getInstance().setXConnectors(solanaConnectors);\n useXWalletStore.getState().setXConnectors('SOLANA', solanaConnectors);\n }, [solanaConnectors]);\n\n const wasConnectedRef = useRef(!!useXWalletStore.getState().xConnections.SOLANA);\n useEffect(() => {\n if (solanaWallet.connected && solanaWallet.publicKey) {\n wasConnectedRef.current = true;\n setXConnection('SOLANA', {\n xAccount: { address: solanaWallet.publicKey.toString(), xChainType: 'SOLANA' },\n xConnectorId: `${solanaWallet.wallet?.adapter.name}`,\n });\n } else if (wasConnectedRef.current) {\n wasConnectedRef.current = false;\n unsetXConnection('SOLANA');\n }\n }, [solanaWallet.connected, solanaWallet.publicKey, solanaWallet.wallet, setXConnection, unsetXConnection]);\n\n // Memoize wallet provider. Must wait for publicKey to be available — without it,\n // SolanaWalletProvider.getWalletAddress() throws \"Wallet public key is not initialized\".\n // Use solanaWallet directly (not ref) because useMemo runs DURING render, before the\n // effect that syncs the ref — ref would be one render behind.\n // biome-ignore lint/correctness/useExhaustiveDependencies: solanaWallet object ref changes every render but we only care about the listed primitive/stable fields; adding solanaWallet itself would defeat memoization\n const walletProvider = useMemo(() => {\n if (solanaWallet.connected && solanaWallet.publicKey && solanaWallet.wallet && connection) {\n return new SolanaWalletProvider({\n wallet: solanaWallet,\n endpoint: connection.rpcEndpoint,\n defaults: solanaDefaults,\n });\n }\n return undefined;\n }, [solanaWallet.connected, solanaWallet.publicKey, solanaWallet.wallet, connection, solanaDefaults]);\n\n useEffect(() => {\n SolanaXService.getInstance().wallet = solanaWalletRef.current;\n setWalletProvider('SOLANA', walletProvider);\n }, [walletProvider, setWalletProvider]);\n\n return null;\n};\n","import { useEffect, useRef } from 'react';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { useXWalletStore } from '@/useXWalletStore.js';\nimport { SOLANA_METAMASK_CONNECT_TIMEOUT_MS } from '@/constants.js';\n\n/**\n * Registers Solana ChainActions into the store.\n *\n * Connect strategy (unified for all Solana wallets including MetaMask):\n * 1. select() tells wallet-adapter-react which wallet to use.\n * 2. If already connected (autoConnect on refresh), skip.\n * 3. Listen for adapter 'connect'/'error' events first.\n * 4. Trigger walletRef.current.connect() after a tick (React needs to flush select() state).\n * 5. Resolve/reject based on adapter events — no timing dependency.\n */\nexport const SolanaActions = () => {\n const solanaWallet = useWallet();\n const registerChainActions = useXWalletStore(state => state.registerChainActions);\n\n const walletRef = useRef(solanaWallet);\n useEffect(() => { walletRef.current = solanaWallet; }, [solanaWallet]);\n\n useEffect(() => {\n registerChainActions('SOLANA', {\n connect: async (xConnectorId: string) => {\n const wallet = walletRef.current.wallets.find(w => w.adapter.name === xConnectorId);\n if (!wallet) {\n console.warn(\n `[SolanaActions] connect: wallet \"${xConnectorId}\" not found in adapter list`,\n walletRef.current.wallets.map(w => w.adapter.name),\n );\n return undefined;\n }\n\n walletRef.current.select(wallet.adapter.name);\n\n // Already connected (e.g. autoConnect on page refresh) — nothing to do\n if (wallet.adapter.connected) {\n return undefined;\n }\n\n // Event-driven connect: listen for result first, then trigger.\n // Works for all wallets (Phantom, MetaMask, etc.) without timing assumptions.\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Wallet connection timeout'));\n }, SOLANA_METAMASK_CONNECT_TIMEOUT_MS);\n\n const onConnect = () => { cleanup(); resolve(); };\n const onError = (err: Error) => { cleanup(); reject(err); };\n const cleanup = () => {\n clearTimeout(timeout);\n wallet.adapter.off('connect', onConnect);\n wallet.adapter.off('error', onError);\n };\n\n wallet.adapter.on('connect', onConnect);\n wallet.adapter.on('error', onError);\n\n // Yield one tick so React can flush select() state, then trigger connect\n // through React layer. If autoConnect is already connecting, skip — the\n // event listeners above will catch the result either way.\n setTimeout(() => {\n if (!wallet.adapter.connected && !wallet.adapter.connecting) {\n walletRef.current.connect().catch(err => { cleanup(); reject(err); });\n }\n }, 0);\n });\n\n return undefined;\n },\n disconnect: async () => {\n await walletRef.current.disconnect();\n },\n getConnectors: () => useXWalletStore.getState().xConnectorsByChain.SOLANA ?? [],\n getConnection: () => useXWalletStore.getState().xConnections.SOLANA,\n signMessage: async (message: string) => {\n if (!walletRef.current.signMessage) {\n throw new Error('Solana wallet not connected');\n }\n const signature = await walletRef.current.signMessage(new TextEncoder().encode(message));\n return Buffer.from(signature).toString('base64');\n },\n });\n }, [registerChainActions]);\n\n return null;\n};\n","import type { ReactNode } from 'react';\nimport {\n ConnectionProvider as SolanaConnectionProvider,\n WalletProvider as SolanaWalletProvider,\n} from '@solana/wallet-adapter-react';\nimport { ChainKeys } from '@sodax/types';\nimport type { SolanaTypeConfig } from '@/types/config.js';\nimport { SolanaHydrator } from './SolanaHydrator.js';\nimport { SolanaActions } from './SolanaActions.js';\nimport { SOLANA_DEFAULT_AUTO_CONNECT, SOLANA_DEFAULT_RPC_URL } from '@/constants.js';\n\nconst emptyWallets: [] = [];\n\ntype SolanaProviderProps = {\n children: ReactNode;\n /** Solana type slot — adapter settings + nested chain entries. */\n config: SolanaTypeConfig;\n};\n\nexport const SolanaProvider = ({ children, config }: SolanaProviderProps) => {\n const autoConnect = config.autoConnect ?? SOLANA_DEFAULT_AUTO_CONNECT;\n const endpoint = config.chains?.[ChainKeys.SOLANA_MAINNET]?.rpcUrl ?? SOLANA_DEFAULT_RPC_URL;\n\n return (\n <SolanaConnectionProvider endpoint={endpoint}>\n <SolanaWalletProvider wallets={emptyWallets} autoConnect={autoConnect}>\n <SolanaHydrator />\n <SolanaActions />\n {children}\n </SolanaWalletProvider>\n </SolanaConnectionProvider>\n );\n};\n","import { useEffect, useMemo, useRef } from 'react';\nimport { useCurrentAccount, useCurrentWallet, useSuiClient, useWallets } from '@mysten/dapp-kit';\nimport { SuiWalletProvider } from '@sodax/wallet-sdk-core';\nimport { ChainKeys } from '@sodax/types';\nimport { SuiXService, SuiXConnector } from '@/xchains/sui/index.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\nimport { useWalletConfig } from '@/context/WalletConfigContext.js';\nimport { getEntryDefaults } from '@/utils/walletRpcConfig.js';\nimport { assertSuiProviderShape } from '@/shared/guards.js';\n\n/**\n * Hydrates SUI state from @mysten/dapp-kit hooks into SuiXService singleton and store.\n */\nexport const SuiHydrator = (): null => {\n const suiClient = useSuiClient();\n const { currentWallet } = useCurrentWallet();\n const suiAccount = useCurrentAccount();\n const suiWallets = useWallets();\n const setXConnection = useXWalletStore(state => state.setXConnection);\n const unsetXConnection = useXWalletStore(state => state.unsetXConnection);\n const setWalletProvider = useXWalletStore(state => state.setWalletProvider);\n const walletConfig = useWalletConfig();\n const suiDefaults = getEntryDefaults<typeof ChainKeys.SUI_MAINNET>(walletConfig.SUI?.chains?.[ChainKeys.SUI_MAINNET]);\n\n // Sync dapp-kit values into the SuiXService singleton in a single effect.\n // The singleton is read by SuiXService.createWalletProvider() and balance methods.\n useEffect(() => {\n const service = SuiXService.getInstance();\n if (suiClient) service.suiClient = suiClient;\n if (currentWallet) service.suiWallet = currentWallet;\n if (suiAccount) service.suiAccount = suiAccount;\n }, [suiClient, currentWallet, suiAccount]);\n\n // Memoize the connector list — useWallets returns a new array reference even when the\n // underlying wallet set hasn't changed. Without memoization, every render would create\n // new XConnector instances and trigger downstream re-renders.\n const suiConnectors = useMemo(() => suiWallets.map(wallet => new SuiXConnector(wallet)), [suiWallets]);\n useEffect(() => {\n SuiXService.getInstance().setXConnectors(suiConnectors);\n useXWalletStore.getState().setXConnectors('SUI', suiConnectors);\n }, [suiConnectors]);\n\n const wasConnectedRef = useRef(!!useXWalletStore.getState().xConnections.SUI);\n useEffect(() => {\n if (currentWallet && suiAccount?.address) {\n wasConnectedRef.current = true;\n setXConnection('SUI', {\n xAccount: { address: suiAccount.address, xChainType: 'SUI' },\n // Match SuiXConnector.id derivation: prefer Wallet Standard `id`, fall back to `name`.\n xConnectorId: currentWallet.id ?? currentWallet.name,\n });\n } else if (wasConnectedRef.current) {\n wasConnectedRef.current = false;\n unsetXConnection('SUI');\n }\n }, [currentWallet, suiAccount, setXConnection, unsetXConnection]);\n\n // Create wallet provider directly from hook values (not singleton) — useMemo runs during\n // render, before the useEffect that syncs values into the singleton. Reading from the\n // singleton here would use stale fields from the previous render.\n const walletProvider = useMemo(() => {\n if (suiClient && currentWallet && suiAccount) {\n assertSuiProviderShape('SuiHydrator', suiClient, currentWallet, suiAccount);\n\n // @mysten/dapp-kit and wallet-sdk-core may resolve different @mysten/sui versions.\n // The types are structurally identical but nominally different.\n // `as unknown as T` documents a known, intentional version-mismatch cast —\n // unlike `as any`, it doesn't silence unrelated type errors.\n type SuiWalletProviderConfig = ConstructorParameters<typeof SuiWalletProvider>[0];\n return new SuiWalletProvider({\n client: suiClient,\n wallet: currentWallet,\n account: suiAccount,\n defaults: suiDefaults,\n } as unknown as SuiWalletProviderConfig);\n }\n return undefined;\n }, [suiClient, currentWallet, suiAccount, suiDefaults]);\n\n useEffect(() => {\n setWalletProvider('SUI', walletProvider);\n }, [walletProvider, setWalletProvider]);\n\n return null;\n};\n","import { useEffect, useRef } from 'react';\nimport { useConnectWallet, useDisconnectWallet, useWallets, useSignPersonalMessage } from '@mysten/dapp-kit';\nimport { useXWalletStore } from '@/useXWalletStore.js';\n\n/**\n * Registers SUI ChainActions into the store.\n */\nexport const SuiActions = () => {\n const suiWallets = useWallets();\n const { mutateAsync: suiConnectAsync } = useConnectWallet();\n const { mutateAsync: suiDisconnectAsync } = useDisconnectWallet();\n const { mutateAsync: signPersonalMessage } = useSignPersonalMessage();\n const registerChainActions = useXWalletStore(state => state.registerChainActions);\n\n const connectRef = useRef(suiConnectAsync);\n const disconnectRef = useRef(suiDisconnectAsync);\n const signMessageRef = useRef(signPersonalMessage);\n const walletsRef = useRef(suiWallets);\n\n useEffect(() => { connectRef.current = suiConnectAsync; }, [suiConnectAsync]);\n useEffect(() => { disconnectRef.current = suiDisconnectAsync; }, [suiDisconnectAsync]);\n useEffect(() => { signMessageRef.current = signPersonalMessage; }, [signPersonalMessage]);\n useEffect(() => { walletsRef.current = suiWallets; }, [suiWallets]);\n\n useEffect(() => {\n registerChainActions('SUI', {\n connect: async (xConnectorId: string) => {\n // Match SuiXConnector.id derivation: prefer Wallet Standard `id`, fall back to `name`.\n const wallet = walletsRef.current.find(w => (w.id ?? w.name) === xConnectorId);\n if (!wallet) {\n console.warn(\n `[SuiActions] connect: wallet \"${xConnectorId}\" not found in adapter list`,\n walletsRef.current.map(w => w.name),\n );\n return undefined;\n }\n await connectRef.current({ wallet });\n return undefined;\n },\n disconnect: async () => {\n await disconnectRef.current();\n // SUI disconnection state is cleared by SuiHydrator (single writer for provider-managed chains)\n },\n getConnectors: () => useXWalletStore.getState().xConnectorsByChain.SUI ?? [],\n getConnection: () => useXWalletStore.getState().xConnections.SUI,\n signMessage: async (message: string) => {\n const res = await signMessageRef.current({ message: new Uint8Array(new TextEncoder().encode(message)) });\n return res.signature;\n },\n });\n }, [registerChainActions]);\n\n return null;\n};\n","import type { ReactNode } from 'react';\nimport { ChainKeys } from '@sodax/types';\nimport { SuiClientProvider, WalletProvider as SuiWalletProvider } from '@mysten/dapp-kit';\nimport { getFullnodeUrl } from '@mysten/sui/client';\nimport type { SuiTypeConfig } from '@/types/config.js';\nimport { SuiHydrator } from './SuiHydrator.js';\nimport { SuiActions } from './SuiActions.js';\nimport { SUI_DEFAULT_AUTO_CONNECT, SUI_DEFAULT_NETWORK } from '@/constants.js';\n\ntype SuiProviderProps = {\n children: ReactNode;\n /** Sui type slot — adapter settings + nested chain entries. */\n config: SuiTypeConfig;\n};\n\nexport const SuiProvider = ({ children, config }: SuiProviderProps) => {\n const autoConnect = config.autoConnect ?? SUI_DEFAULT_AUTO_CONNECT;\n const network = config.network ?? SUI_DEFAULT_NETWORK;\n const rpcUrl = config.chains?.[ChainKeys.SUI_MAINNET]?.rpcUrl ?? getFullnodeUrl(network);\n\n return (\n <SuiClientProvider networks={{ [network]: { url: rpcUrl } }} defaultNetwork={network}>\n <SuiWalletProvider autoConnect={autoConnect}>\n <SuiHydrator />\n <SuiActions />\n {children}\n </SuiWalletProvider>\n </SuiClientProvider>\n );\n};\n","import { useXWalletStore } from '@/useXWalletStore.js';\nimport { ICONexRequestEventType, ICONexResponseEventType, request } from './iconex/index.js';\n\nexport const reconnectIcon = async () => {\n const iconConnection = useXWalletStore.getState().xConnections.ICON;\n if (!iconConnection) return;\n\n const recentXConnectorId = iconConnection.xConnectorId;\n\n const detail = await request({\n type: ICONexRequestEventType.REQUEST_ADDRESS,\n });\n\n if (detail?.type === ICONexResponseEventType.RESPONSE_ADDRESS) {\n useXWalletStore.getState().setXConnection('ICON', {\n xAccount: {\n address: detail?.payload,\n xChainType: 'ICON',\n },\n xConnectorId: recentXConnectorId,\n });\n }\n};\n","import { useXWalletStore } from '@/useXWalletStore.js';\nimport { InjectiveXService } from './InjectiveXService.js';\nimport { isEvmBrowserWallet, Wallet } from '@injectivelabs/wallet-base';\nimport { getInjectiveAddress } from '@injectivelabs/sdk-ts';\n\nfunction isWallet(value: string): value is Wallet {\n return Object.values(Wallet).some(v => v === value);\n}\n\nexport const reconnectInjective = async () => {\n const injectiveConnection = useXWalletStore.getState().xConnections.INJECTIVE;\n if (!injectiveConnection) return;\n\n const recentXConnectorId = injectiveConnection.xConnectorId;\n if (!isWallet(recentXConnectorId)) {\n console.warn(`[Injective] Stale wallet ID skipped: ${recentXConnectorId}`);\n return;\n }\n\n const walletStrategy = InjectiveXService.getInstance().walletStrategy;\n await walletStrategy.setWallet(recentXConnectorId);\n const addresses = await walletStrategy.getAddresses();\n\n const firstAddress = addresses?.[0];\n if (!firstAddress) return;\n\n const address = isEvmBrowserWallet(recentXConnectorId) ? getInjectiveAddress(firstAddress) : firstAddress;\n\n useXWalletStore.getState().setXConnection('INJECTIVE', {\n xAccount: {\n address,\n xChainType: 'INJECTIVE',\n },\n xConnectorId: recentXConnectorId,\n });\n};\n","import { useXWalletStore } from '@/useXWalletStore.js';\nimport { StellarXService } from './StellarXService.js';\n\nexport const reconnectStellar = async () => {\n const stellarConnection = useXWalletStore.getState().xConnections.STELLAR;\n if (!stellarConnection) return;\n\n const recentXConnectorId = stellarConnection.xConnectorId;\n const stellarWalletKit = StellarXService.getInstance().walletsKit;\n stellarWalletKit.setWallet(recentXConnectorId);\n const { address } = await stellarWalletKit.getAddress();\n useXWalletStore.getState().setXConnection('STELLAR', {\n xAccount: {\n address,\n xChainType: 'STELLAR',\n },\n xConnectorId: recentXConnectorId,\n });\n};\n","import { useEffect } from 'react';\nimport type { ChainType } from '@sodax/types';\nimport type { SodaxWalletConfig } from '@/types/config.js';\nimport { useXWalletStore } from '@/useXWalletStore.js';\nimport { chainRegistry } from '@/chainRegistry.js';\nimport { reconnectIcon } from '@/xchains/icon/actions.js';\nimport { reconnectInjective } from '@/xchains/injective/actions.js';\nimport { reconnectStellar } from '@/xchains/stellar/actions.js';\n\n/**\n * Initializes chain services based on config. Runs once on mount.\n * Config is immutable after initial render — dynamic changes require remounting SodaxWalletProvider.\n * After persist hydration, re-fires setXConnection for every persisted connection so the\n * createWalletProvider side-effect rebuilds walletProviders (which are not persisted).\n */\nexport function useInitChainServices(walletConfig: SodaxWalletConfig) {\n const initChainServices = useXWalletStore(state => state.initChainServices);\n const cleanupDisabledConnections = useXWalletStore(state => state.cleanupDisabledConnections);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: run-once on mount — config is immutable after initial render, dynamic changes require remounting SodaxWalletProvider\n useEffect(() => {\n initChainServices(walletConfig);\n\n const afterHydration = () => {\n cleanupDisabledConnections();\n\n const store = useXWalletStore.getState();\n for (const chainType of Object.keys(store.xConnections) as ChainType[]) {\n if (!chainRegistry[chainType]?.createWalletProvider) continue;\n const conn = store.xConnections[chainType];\n if (conn) store.setXConnection(chainType, conn);\n }\n\n if (walletConfig.ICON) {\n reconnectIcon().catch(error => console.warn('[wallet-sdk-react] ICON reconnect failed:', error));\n }\n if (walletConfig.INJECTIVE) {\n reconnectInjective().catch(error => console.warn('[wallet-sdk-react] Injective reconnect failed:', error));\n }\n if (walletConfig.STELLAR) {\n reconnectStellar().catch(error => console.warn('[wallet-sdk-react] Stellar reconnect failed:', error));\n }\n };\n\n if (useXWalletStore.persist.hasHydrated()) {\n afterHydration();\n } else {\n useXWalletStore.persist.onFinishHydration(afterHydration);\n }\n }, []);\n}\n","'use client';\n\nimport { type ReactNode, useRef } from 'react';\n\nimport type { SodaxWalletConfig } from './types/config.js';\nimport { WalletConfigProvider } from './context/WalletConfigContext.js';\nimport { EvmProvider } from './providers/evm/index.js';\nimport { SolanaProvider } from './providers/solana/index.js';\nimport { SuiProvider } from './providers/sui/index.js';\nimport { useInitChainServices } from './hooks/useInitChainServices.js';\n\nexport type SodaxWalletProviderProps = {\n children: ReactNode;\n /**\n * Captured once on mount. Dynamic changes require remounting `SodaxWalletProvider`\n * — passing a new reference on subsequent renders has no effect.\n */\n config: SodaxWalletConfig;\n};\n\n/**\n * Root provider for SODAX wallet connectivity. Mounts only the chain-type adapters opted\n * into via `config` and bridges to `@sodax/wallet-sdk-core` so SDK calls receive a typed\n * `IXxxWalletProvider`.\n *\n * Top-level keys on `SodaxWalletConfig` are chain-type slots (`EVM`, `SOLANA`, `BITCOIN`, …).\n * Omit a slot to skip mounting that adapter; pass `{}` to mount with SDK defaults. Provider-\n * managed chains (EVM/Solana/Sui) wrap their native React adapter (wagmi / wallet-adapter /\n * dapp-kit) plus a `<Hydrator>` that syncs adapter state into the Zustand store; non-provider\n * chains register `ChainActions` directly during `useInitChainServices`.\n *\n * **Config is captured once on mount** via `useRef` — subsequent re-renders with a new\n * reference have no effect. To swap config at runtime, remount with a new `key` prop.\n *\n * Must be wrapped by `<QueryClientProvider>` from `@tanstack/react-query` (or, if also\n * using `@sodax/dapp-kit`, see Setup skill for the full provider-stack ordering).\n *\n * @see {@link https://github.com/icon-project/sodax-sdks/blob/main/packages/wallet-sdk-react/docs/CONFIGURE_PROVIDER.md | Configure SodaxWalletProvider}\n */\nexport const SodaxWalletProvider = ({ children, config }: SodaxWalletProviderProps) => {\n // Freeze config on first render so context, store, and wagmi all share one snapshot\n // and unstable parent references can't trigger re-init.\n const configRef = useRef<SodaxWalletConfig>(config);\n const frozen = configRef.current;\n\n useInitChainServices(frozen);\n\n let content = <>{children}</>;\n\n if (frozen.SOLANA) {\n content = <SolanaProvider config={frozen.SOLANA}>{content}</SolanaProvider>;\n }\n\n if (frozen.SUI) {\n content = <SuiProvider config={frozen.SUI}>{content}</SuiProvider>;\n }\n\n if (frozen.EVM) {\n content = <EvmProvider config={frozen.EVM}>{content}</EvmProvider>;\n }\n\n return <WalletConfigProvider value={frozen}>{content}</WalletConfigProvider>;\n};\n"]}