@sodax/wallet-sdk-react 1.5.7-beta → 2.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -0,0 +1,125 @@
1
+ import { XService, XConnector } from './chunk-X2MHIWXO.mjs';
2
+ import { getNetworkEndpoints, Network } from '@injectivelabs/networks';
3
+ import { IndexerGrpcAccountPortfolioApi, ChainGrpcWasmApi, getInjectiveAddress } from '@injectivelabs/sdk-ts';
4
+ import { ChainId } from '@injectivelabs/ts-types';
5
+ import { MsgBroadcaster } from '@injectivelabs/wallet-core';
6
+ import { mainnet } from 'wagmi/chains';
7
+ import { WalletStrategy } from '@injectivelabs/wallet-strategy';
8
+ import { isCosmosBrowserWallet, isEvmBrowserWallet } from '@injectivelabs/wallet-base';
9
+ import { isCosmosWalletInstalled } from '@injectivelabs/wallet-cosmos';
10
+
11
+ var InjectiveXService = class _InjectiveXService extends XService {
12
+ static instance;
13
+ walletStrategy;
14
+ indexerGrpcAccountPortfolioApi;
15
+ chainGrpcWasmApi;
16
+ msgBroadcaster;
17
+ constructor(rpcConfig) {
18
+ super("INJECTIVE");
19
+ const defaults = getNetworkEndpoints(Network.Mainnet);
20
+ const endpoints = {
21
+ ...defaults,
22
+ indexer: rpcConfig?.indexer || defaults.indexer,
23
+ grpc: rpcConfig?.grpc || defaults.grpc
24
+ };
25
+ this.walletStrategy = new WalletStrategy({
26
+ chainId: ChainId.Mainnet,
27
+ strategies: {},
28
+ evmOptions: {
29
+ evmChainId: mainnet.id,
30
+ rpcUrl: mainnet.rpcUrls.default.http[0]
31
+ }
32
+ });
33
+ this.indexerGrpcAccountPortfolioApi = new IndexerGrpcAccountPortfolioApi(endpoints.indexer);
34
+ this.chainGrpcWasmApi = new ChainGrpcWasmApi(endpoints.grpc);
35
+ this.msgBroadcaster = new MsgBroadcaster({
36
+ walletStrategy: this.walletStrategy,
37
+ network: Network.Mainnet,
38
+ endpoints
39
+ });
40
+ }
41
+ /**
42
+ * @param rpcConfig - Only applied on first call. Subsequent calls return the
43
+ * existing instance unchanged — gRPC/Indexer clients are built in the
44
+ * constructor and can't be rebuilt at runtime. Pass the desired endpoints
45
+ * via `SodaxWalletProvider.config.rpcConfig` once at app init.
46
+ */
47
+ static getInstance(rpcConfig) {
48
+ if (!_InjectiveXService.instance) {
49
+ _InjectiveXService.instance = new _InjectiveXService(rpcConfig);
50
+ }
51
+ return _InjectiveXService.instance;
52
+ }
53
+ async getBalance(address, xToken) {
54
+ if (!address) return 0n;
55
+ const portfolio = await this.indexerGrpcAccountPortfolioApi.fetchAccountPortfolioBalances(address);
56
+ const xTokenAddress = xToken.address;
57
+ const balance = portfolio.bankBalancesList.find((_balance) => _balance.denom === xTokenAddress);
58
+ if (balance) {
59
+ return BigInt(balance.amount);
60
+ }
61
+ return 0n;
62
+ }
63
+ };
64
+ var WALLET_ICONS = {
65
+ metamask: "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/metamask.svg",
66
+ keplr: "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/keplr.svg",
67
+ leap: "https://assets.leapwallet.io/logos/leap-cosmos-logo.svg",
68
+ rabby: "https://raw.githubusercontent.com/RabbyHub/logo/master/symbol.svg",
69
+ phantom: "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/phantom.svg",
70
+ "okx-wallet": "https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png",
71
+ "trust-wallet": "https://trustwallet.com/assets/images/media/assets/twLogo.svg"
72
+ };
73
+ var InjectiveXConnector = class extends XConnector {
74
+ wallet;
75
+ constructor(name, wallet) {
76
+ super("INJECTIVE", name, wallet);
77
+ this.wallet = wallet;
78
+ }
79
+ getXService() {
80
+ return InjectiveXService.getInstance();
81
+ }
82
+ async connect() {
83
+ if (isCosmosBrowserWallet(this.wallet) && !isCosmosWalletInstalled(this.wallet)) {
84
+ console.warn(`[InjectiveXConnector] connect: ${this.wallet} cosmos wallet not installed`);
85
+ return void 0;
86
+ }
87
+ const walletStrategy = this.getXService().walletStrategy;
88
+ await walletStrategy.setWallet(this.wallet);
89
+ const addresses = await walletStrategy.getAddresses();
90
+ if (!addresses?.length) {
91
+ console.warn(`[InjectiveXConnector] connect: ${this.wallet} returned no addresses`);
92
+ return void 0;
93
+ }
94
+ const firstAddress = addresses[0];
95
+ if (!firstAddress) {
96
+ console.warn(`[InjectiveXConnector] connect: ${this.wallet} returned empty addresses array`);
97
+ return void 0;
98
+ }
99
+ const address = isEvmBrowserWallet(this.wallet) ? getInjectiveAddress(firstAddress) : firstAddress;
100
+ return {
101
+ address,
102
+ xChainType: this.xChainType
103
+ };
104
+ }
105
+ async disconnect() {
106
+ if (isEvmBrowserWallet(this.wallet)) {
107
+ const walletStrategy = this.getXService().walletStrategy;
108
+ await walletStrategy.setWallet(this.wallet);
109
+ await walletStrategy.disconnect();
110
+ }
111
+ }
112
+ get icon() {
113
+ return WALLET_ICONS[this.wallet];
114
+ }
115
+ get isInstalled() {
116
+ if (isCosmosBrowserWallet(this.wallet)) {
117
+ return isCosmosWalletInstalled(this.wallet);
118
+ }
119
+ return true;
120
+ }
121
+ };
122
+
123
+ export { InjectiveXConnector, InjectiveXService };
124
+ //# sourceMappingURL=chunk-BKJB527E.mjs.map
125
+ //# sourceMappingURL=chunk-BKJB527E.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/xchains/injective/InjectiveXService.ts","../src/xchains/injective/InjectiveXConnector.ts"],"names":["InjectiveChainId"],"mappings":";;;;;;;;;;AASO,IAAM,iBAAA,GAAN,MAAM,kBAAA,SAA0B,QAAA,CAAS;AAAA,EAC9C,OAAe,QAAA;AAAA,EAER,cAAA;AAAA,EACA,8BAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EAEC,YAAY,SAAA,EAAgC;AAClD,IAAA,KAAA,CAAM,WAAW,CAAA;AAEjB,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,OAAA,CAAQ,OAAO,CAAA;AAIpD,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,GAAG,QAAA;AAAA,MACH,OAAA,EAAS,SAAA,EAAW,OAAA,IAAW,QAAA,CAAS,OAAA;AAAA,MACxC,IAAA,EAAM,SAAA,EAAW,IAAA,IAAQ,QAAA,CAAS;AAAA,KACpC;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe;AAAA,MACvC,SAASA,OAAA,CAAiB,OAAA;AAAA,MAC1B,YAAY,EAAC;AAAA,MACb,UAAA,EAAY;AAAA,QACV,YAAY,OAAA,CAAQ,EAAA;AAAA,QACpB,MAAA,EAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC;AAAA;AACxC,KACD,CAAA;AAED,IAAA,IAAA,CAAK,8BAAA,GAAiC,IAAI,8BAAA,CAA+B,SAAA,CAAU,OAAO,CAAA;AAC1F,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,SAAA,CAAU,IAAI,CAAA;AAC3D,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe;AAAA,MACvC,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAc,YAAY,SAAA,EAAmD;AAC3E,IAAA,IAAI,CAAC,mBAAkB,QAAA,EAAU;AAC/B,MAAA,kBAAA,CAAkB,QAAA,GAAW,IAAI,kBAAA,CAAkB,SAAS,CAAA;AAAA,IAC9D;AACA,IAAA,OAAO,kBAAA,CAAkB,QAAA;AAAA,EAC3B;AAAA,EAEA,MAAe,UAAA,CAAW,OAAA,EAA6B,MAAA,EAAgB;AACrE,IAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AAErB,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,8BAAA,CAA+B,8BAA8B,OAAO,CAAA;AAEjG,IAAA,MAAM,gBAAgB,MAAA,CAAO,OAAA;AAE7B,IAAA,MAAM,UAAU,SAAA,CAAU,gBAAA,CAAiB,KAAK,CAAA,QAAA,KAAY,QAAA,CAAS,UAAU,aAAa,CAAA;AAC5F,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,EAAA;AAAA,EACT;AACF;ACpEA,IAAM,YAAA,GAAgD;AAAA,EACpD,QAAA,EAAU,qFAAA;AAAA,EACV,KAAA,EAAO,kFAAA;AAAA,EACP,IAAA,EAAM,yDAAA;AAAA,EACN,KAAA,EAAO,mEAAA;AAAA,EACP,OAAA,EAAS,oFAAA;AAAA,EACT,YAAA,EAAc,iEAAA;AAAA,EACd,cAAA,EAAgB;AAClB,CAAA;AAEO,IAAM,mBAAA,GAAN,cAAkC,UAAA,CAAW;AAAA,EAC1C,MAAA;AAAA,EAER,WAAA,CAAY,MAAc,MAAA,EAAgB;AACxC,IAAA,KAAA,CAAM,WAAA,EAAa,MAAM,MAAM,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,WAAA,GAAiC;AAC/B,IAAA,OAAO,kBAAkB,WAAA,EAAY;AAAA,EACvC;AAAA,EAEA,MAAM,OAAA,GAAyC;AAC7C,IAAA,IAAI,qBAAA,CAAsB,KAAK,MAAM,CAAA,IAAK,CAAC,uBAAA,CAAwB,IAAA,CAAK,MAAM,CAAA,EAAG;AAC/E,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,IAAA,CAAK,MAAM,CAAA,4BAAA,CAA8B,CAAA;AACxF,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,WAAA,EAAY,CAAE,cAAA;AAC1C,IAAA,MAAM,cAAA,CAAe,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,YAAA,EAAa;AAEpD,IAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,IAAA,CAAK,MAAM,CAAA,sBAAA,CAAwB,CAAA;AAClF,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAA,GAAe,UAAU,CAAC,CAAA;AAChC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,IAAA,CAAK,MAAM,CAAA,+BAAA,CAAiC,CAAA;AAC3F,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,UAAU,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,GAAI,mBAAA,CAAoB,YAAY,CAAA,GAAI,YAAA;AAEtF,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,EAAG;AACnC,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,WAAA,EAAY,CAAE,cAAA;AAC1C,MAAA,MAAM,cAAA,CAAe,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAC1C,MAAA,MAAM,eAAe,UAAA,EAAW;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,IAAoB,IAAA,GAA2B;AAC7C,IAAA,OAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,IAAoB,WAAA,GAAuB;AACzC,IAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,MAAM,CAAA,EAAG;AACtC,MAAA,OAAO,uBAAA,CAAwB,KAAK,MAAM,CAAA;AAAA,IAC5C;AAGA,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"chunk-BKJB527E.mjs","sourcesContent":["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"]}
@@ -0,0 +1,88 @@
1
+ import { NEAR_DEFAULT_RPC_URL } from './chunk-MXZVF5HR.mjs';
2
+ import { XService, XConnector } from './chunk-X2MHIWXO.mjs';
3
+ import { NearConnector } from '@hot-labs/near-connect';
4
+ import { JsonRpcProvider } from 'near-api-js';
5
+
6
+ var NearXService = class _NearXService extends XService {
7
+ static instance;
8
+ walletSelector;
9
+ rpcUrl;
10
+ /**
11
+ * @param rpcUrl - Used by `getBalance` via `JsonRpcProvider({ url: rpcUrl })`.
12
+ * Does NOT affect `walletSelector` — `@hot-labs/near-connect` only accepts
13
+ * the network preset name (`'mainnet'`/`'testnet'`) and fetches RPC internally.
14
+ * Custom RPC is therefore read-only for balance queries.
15
+ */
16
+ constructor(rpcUrl = NEAR_DEFAULT_RPC_URL) {
17
+ super("NEAR");
18
+ this.rpcUrl = rpcUrl;
19
+ this.walletSelector = new NearConnector({
20
+ network: "mainnet",
21
+ logger: console,
22
+ autoConnect: true,
23
+ excludedWallets: ["okx-wallet"]
24
+ });
25
+ }
26
+ /**
27
+ * @param rpcUrl - Re-applied on every call (matches StacksXService semantics).
28
+ * `rpcUrl` only drives `getBalance` via a per-call `JsonRpcProvider`, so it's
29
+ * safe to update at runtime — no persistent chain client to rebuild.
30
+ */
31
+ static getInstance(rpcUrl) {
32
+ if (!_NearXService.instance) {
33
+ _NearXService.instance = new _NearXService(rpcUrl);
34
+ } else if (rpcUrl) {
35
+ _NearXService.instance.rpcUrl = rpcUrl;
36
+ }
37
+ return _NearXService.instance;
38
+ }
39
+ async getBalance(address, xToken) {
40
+ const provider = new JsonRpcProvider({ url: this.rpcUrl });
41
+ if (xToken.symbol === "NEAR") {
42
+ const account = await provider.viewAccount({ accountId: address ?? "" });
43
+ return BigInt(account.amount);
44
+ }
45
+ const res = await provider.callFunction({
46
+ contractId: xToken.address,
47
+ method: "ft_balance_of",
48
+ args: { account_id: address }
49
+ });
50
+ return BigInt(res ?? 0);
51
+ }
52
+ };
53
+
54
+ // src/xchains/near/NearXConnector.ts
55
+ var NearXConnector = class extends XConnector {
56
+ _wallet;
57
+ constructor(wallet) {
58
+ super("NEAR", wallet.manifest.name, wallet.manifest.id);
59
+ this._wallet = wallet;
60
+ }
61
+ getXService() {
62
+ return NearXService.getInstance();
63
+ }
64
+ async connect() {
65
+ const walletSelector = this.getXService().walletSelector;
66
+ const wallet = await walletSelector.connect({ walletId: this._wallet.manifest.id });
67
+ const accounts = await wallet.getAccounts();
68
+ if (accounts.length === 0 || accounts[0] === void 0) {
69
+ console.warn(`[NearXConnector] connect: ${this._wallet.manifest.name} returned no accounts`);
70
+ return void 0;
71
+ }
72
+ return {
73
+ address: accounts[0].accountId,
74
+ xChainType: this.xChainType
75
+ };
76
+ }
77
+ async disconnect() {
78
+ const walletSelector = this.getXService().walletSelector;
79
+ await walletSelector.disconnect(this._wallet);
80
+ }
81
+ get icon() {
82
+ return this._wallet.manifest.icon;
83
+ }
84
+ };
85
+
86
+ export { NearXConnector, NearXService };
87
+ //# sourceMappingURL=chunk-BXJLBR4G.mjs.map
88
+ //# sourceMappingURL=chunk-BXJLBR4G.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/xchains/near/NearXService.ts","../src/xchains/near/NearXConnector.ts"],"names":[],"mappings":"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","file":"chunk-BXJLBR4G.mjs","sourcesContent":["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"]}
@@ -0,0 +1,186 @@
1
+ import { getRpcUrl, getWagmiChainId, isNativeToken } from './chunk-NY7U7OJW.mjs';
2
+ import { XService, XConnector } from './chunk-X2MHIWXO.mjs';
3
+ import { ChainKeys } from '@sodax/types';
4
+ import { defineChain, erc20Abi } from 'viem';
5
+ import { getPublicClient } from 'wagmi/actions';
6
+ import { createConfig, createStorage, http, cookieStorage } from 'wagmi';
7
+ import { mainnet, avalanche, arbitrum, base, bsc, sonic, optimism, polygon, lightlinkPhoenix, kaia, redbellyMainnet } from 'wagmi/chains';
8
+
9
+ var hyper = /* @__PURE__ */ defineChain({
10
+ id: 999,
11
+ name: "HyperEVM",
12
+ nativeCurrency: {
13
+ decimals: 18,
14
+ name: "HYPE",
15
+ symbol: "HYPE"
16
+ },
17
+ rpcUrls: {
18
+ default: { http: ["https://rpc.hyperliquid.xyz/evm"] }
19
+ },
20
+ blockExplorers: {
21
+ default: {
22
+ name: "HyperEVMScan",
23
+ url: "https://hyperevmscan.io/"
24
+ }
25
+ },
26
+ contracts: {
27
+ multicall3: {
28
+ address: "0xcA11bde05977b3631167028862bE2a173976CA11",
29
+ blockCreated: 13051
30
+ }
31
+ }
32
+ });
33
+ var createWagmiConfig = (evmChains, options) => {
34
+ return createConfig({
35
+ chains: [
36
+ mainnet,
37
+ avalanche,
38
+ arbitrum,
39
+ base,
40
+ bsc,
41
+ sonic,
42
+ optimism,
43
+ polygon,
44
+ hyper,
45
+ lightlinkPhoenix,
46
+ kaia,
47
+ redbellyMainnet
48
+ ],
49
+ connectors: options?.connectors ?? [],
50
+ ssr: options?.ssr,
51
+ transports: {
52
+ [mainnet.id]: http(getRpcUrl(evmChains?.[ChainKeys.ETHEREUM_MAINNET])),
53
+ [avalanche.id]: http(getRpcUrl(evmChains?.[ChainKeys.AVALANCHE_MAINNET])),
54
+ [arbitrum.id]: http(getRpcUrl(evmChains?.[ChainKeys.ARBITRUM_MAINNET])),
55
+ [base.id]: http(getRpcUrl(evmChains?.[ChainKeys.BASE_MAINNET])),
56
+ [bsc.id]: http(getRpcUrl(evmChains?.[ChainKeys.BSC_MAINNET])),
57
+ [sonic.id]: http(getRpcUrl(evmChains?.[ChainKeys.SONIC_MAINNET])),
58
+ [optimism.id]: http(getRpcUrl(evmChains?.[ChainKeys.OPTIMISM_MAINNET])),
59
+ [polygon.id]: http(getRpcUrl(evmChains?.[ChainKeys.POLYGON_MAINNET])),
60
+ [hyper.id]: http(getRpcUrl(evmChains?.[ChainKeys.HYPEREVM_MAINNET])),
61
+ [lightlinkPhoenix.id]: http(getRpcUrl(evmChains?.[ChainKeys.LIGHTLINK_MAINNET])),
62
+ [redbellyMainnet.id]: http(getRpcUrl(evmChains?.[ChainKeys.REDBELLY_MAINNET])),
63
+ [kaia.id]: http(getRpcUrl(evmChains?.[ChainKeys.KAIA_MAINNET]))
64
+ },
65
+ storage: createStorage({
66
+ storage: cookieStorage,
67
+ key: "sodax"
68
+ })
69
+ });
70
+ };
71
+ var EvmXService = class _EvmXService extends XService {
72
+ static instance;
73
+ wagmiConfig;
74
+ constructor() {
75
+ super("EVM");
76
+ }
77
+ static getInstance() {
78
+ if (!_EvmXService.instance) {
79
+ _EvmXService.instance = new _EvmXService();
80
+ }
81
+ return _EvmXService.instance;
82
+ }
83
+ // get erc20 token balance in a chain (evm chain only)
84
+ async _getTokenBalance(address, chainId, tokenAddress) {
85
+ const publicClient = getPublicClient(this.wagmiConfig, { chainId });
86
+ if (!publicClient) throw new Error("Public client not found");
87
+ const balance = await publicClient.readContract({
88
+ abi: erc20Abi,
89
+ address: tokenAddress,
90
+ functionName: "balanceOf",
91
+ args: [address]
92
+ });
93
+ return balance || 0n;
94
+ }
95
+ //get native balance of the chain (evm chain only)
96
+ async _getChainBalance(address, chainId) {
97
+ const balance = await getPublicClient(this.wagmiConfig, { chainId })?.getBalance({
98
+ address
99
+ });
100
+ return balance || 0n;
101
+ }
102
+ async getBalance(address, xToken) {
103
+ if (!address) return 0n;
104
+ if (!this.wagmiConfig) return 0n;
105
+ const chainId = getWagmiChainId(xToken.chainKey);
106
+ if (isNativeToken(xToken)) {
107
+ return this._getChainBalance(address, chainId);
108
+ }
109
+ throw new Error(`Unsupported token: ${xToken.symbol}`);
110
+ }
111
+ async getBalances(address, xTokens) {
112
+ if (!address) return {};
113
+ if (!this.wagmiConfig) return {};
114
+ const nativeTokenBalancePromises = xTokens.filter((xToken) => isNativeToken(xToken)).map(async (xToken) => {
115
+ const balance = await this.getBalance(address, xToken);
116
+ return { symbol: xToken.symbol, address: xToken.address, balance };
117
+ });
118
+ const nativeTokenBalances = await Promise.all(nativeTokenBalancePromises);
119
+ const tokenMap = nativeTokenBalances.reduce(
120
+ (map, { address: address2, balance }) => {
121
+ if (balance) map[address2] = balance;
122
+ return map;
123
+ },
124
+ {}
125
+ );
126
+ const nonNativeXTokens = xTokens.filter((xToken) => !isNativeToken(xToken));
127
+ const firstToken = xTokens[0];
128
+ if (!firstToken) return tokenMap;
129
+ const chainKey = firstToken.chainKey;
130
+ const viemChain = this.wagmiConfig.chains.find((chain) => chain.id === getWagmiChainId(chainKey));
131
+ const chainId = getWagmiChainId(chainKey);
132
+ const publicClient = getPublicClient(this.wagmiConfig, { chainId });
133
+ if (!publicClient) throw new Error("Public client not found");
134
+ if (viemChain?.contracts?.multicall3) {
135
+ const result = await publicClient.multicall({
136
+ contracts: nonNativeXTokens.map((token) => ({
137
+ abi: erc20Abi,
138
+ address: token.address,
139
+ functionName: "balanceOf",
140
+ args: [address]
141
+ }))
142
+ });
143
+ return nonNativeXTokens.reduce((acc, token, index) => {
144
+ const resultValue = result?.[index]?.result;
145
+ acc[token.address] = resultValue !== void 0 && resultValue !== null ? BigInt(resultValue) : 0n;
146
+ return acc;
147
+ }, tokenMap);
148
+ }
149
+ const nonNativeTokenBalances = await Promise.all(
150
+ nonNativeXTokens.map((token) => this._getTokenBalance(address, chainId, token.address))
151
+ );
152
+ return nonNativeXTokens.reduce((acc, token, idx) => {
153
+ acc[token.address] = nonNativeTokenBalances[idx] ?? 0n;
154
+ return acc;
155
+ }, tokenMap);
156
+ }
157
+ };
158
+
159
+ // src/xchains/evm/EvmXConnector.ts
160
+ var 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";
161
+ var EvmXConnector = class extends XConnector {
162
+ connector;
163
+ constructor(connector) {
164
+ super("EVM", connector.name, connector.id);
165
+ this.connector = connector;
166
+ }
167
+ async connect() {
168
+ return;
169
+ }
170
+ async disconnect() {
171
+ return;
172
+ }
173
+ get id() {
174
+ return this.connector.id;
175
+ }
176
+ get icon() {
177
+ if (!this.connector.icon && this.connector.type === "walletConnect") {
178
+ return WALLETCONNECT_ICON;
179
+ }
180
+ return this.connector.icon;
181
+ }
182
+ };
183
+
184
+ export { EvmXConnector, EvmXService, createWagmiConfig };
185
+ //# sourceMappingURL=chunk-E5IAZ7E6.mjs.map
186
+ //# sourceMappingURL=chunk-E5IAZ7E6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/xchains/evm/EvmXService.ts","../src/xchains/evm/EvmXConnector.ts"],"names":["address"],"mappings":"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","file":"chunk-E5IAZ7E6.mjs","sourcesContent":["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"]}
@@ -0,0 +1,33 @@
1
+ // src/shared/guards.ts
2
+ function isRecord(value) {
3
+ return typeof value === "object" && value !== null;
4
+ }
5
+ function hasStringProperty(value, key) {
6
+ return isRecord(value) && typeof value[key] === "string";
7
+ }
8
+ function hasOptionalStringProperty(value, key) {
9
+ return isRecord(value) && (value[key] === void 0 || typeof value[key] === "string");
10
+ }
11
+ function hasBooleanProperty(value, key) {
12
+ return isRecord(value) && typeof value[key] === "boolean";
13
+ }
14
+ function hasFunctionProperty(value, key) {
15
+ return isRecord(value) && typeof value[key] === "function";
16
+ }
17
+ function assert(condition, message) {
18
+ if (!condition) {
19
+ throw new Error(message);
20
+ }
21
+ }
22
+ function assertSuiProviderShape(caller, client, wallet, account) {
23
+ const clientOk = isRecord(client) && hasFunctionProperty(client, "executeTransactionBlock") && hasFunctionProperty(client, "devInspectTransactionBlock") && hasFunctionProperty(client, "getCoins");
24
+ assert(clientOk, `[${caller}] invalid Sui client shape`);
25
+ const walletOk = isRecord(wallet) && hasStringProperty(wallet, "name");
26
+ assert(walletOk, `[${caller}] invalid Sui wallet shape`);
27
+ const accountOk = isRecord(account) && hasStringProperty(account, "address");
28
+ assert(accountOk, `[${caller}] invalid Sui account shape`);
29
+ }
30
+
31
+ export { assert, assertSuiProviderShape, hasBooleanProperty, hasFunctionProperty, hasOptionalStringProperty, hasStringProperty, isRecord };
32
+ //# sourceMappingURL=chunk-MAQ47Q52.mjs.map
33
+ //# sourceMappingURL=chunk-MAQ47Q52.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/guards.ts"],"names":[],"mappings":";AAcO,SAAS,SAAS,KAAA,EAAwC;AAC/D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAGO,SAAS,iBAAA,CACd,OACA,GAAA,EAC8C;AAC9C,EAAA,OAAO,SAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,GAAG,CAAA,KAAM,QAAA;AAClD;AAGO,SAAS,yBAAA,CACd,OACA,GAAA,EACuD;AACvD,EAAA,OAAO,QAAA,CAAS,KAAK,CAAA,KAAM,KAAA,CAAM,GAAG,MAAM,MAAA,IAAa,OAAO,KAAA,CAAM,GAAG,CAAA,KAAM,QAAA,CAAA;AAC/E;AAGO,SAAS,kBAAA,CACd,OACA,GAAA,EAC+C;AAC/C,EAAA,OAAO,SAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,GAAG,CAAA,KAAM,SAAA;AAClD;AAGO,SAAS,mBAAA,CACd,OACA,GAAA,EACuE;AACvE,EAAA,OAAO,SAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,GAAG,CAAA,KAAM,UAAA;AAClD;AAMO,SAAS,MAAA,CAAO,WAAoB,OAAA,EAAoC;AAC7E,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,MAAM,OAAO,CAAA;AAAA,EACzB;AACF;AAMO,SAAS,sBAAA,CAAuB,MAAA,EAAgB,MAAA,EAAiB,MAAA,EAAiB,OAAA,EAAwB;AAC/G,EAAA,MAAM,QAAA,GACJ,QAAA,CAAS,MAAM,CAAA,IACf,oBAAoB,MAAA,EAAQ,yBAAyB,CAAA,IACrD,mBAAA,CAAoB,MAAA,EAAQ,4BAA4B,CAAA,IACxD,mBAAA,CAAoB,QAAQ,UAAU,CAAA;AACxC,EAAA,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA,EAAI,MAAM,CAAA,0BAAA,CAA4B,CAAA;AAEvD,EAAA,MAAM,WAAW,QAAA,CAAS,MAAM,CAAA,IAAK,iBAAA,CAAkB,QAAQ,MAAM,CAAA;AACrE,EAAA,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA,EAAI,MAAM,CAAA,0BAAA,CAA4B,CAAA;AAEvD,EAAA,MAAM,YAAY,QAAA,CAAS,OAAO,CAAA,IAAK,iBAAA,CAAkB,SAAS,SAAS,CAAA;AAC3E,EAAA,MAAA,CAAO,SAAA,EAAW,CAAA,CAAA,EAAI,MAAM,CAAA,2BAAA,CAA6B,CAAA;AAC3D","file":"chunk-MAQ47Q52.mjs","sourcesContent":["// 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"]}
@@ -0,0 +1,34 @@
1
+ // src/constants.ts
2
+ var SUI_DEFAULT_NETWORK = "mainnet";
3
+ var SUI_DEFAULT_AUTO_CONNECT = true;
4
+ var EVM_DEFAULT_RECONNECT_ON_MOUNT = false;
5
+ var EVM_DEFAULT_SSR = true;
6
+ var SOLANA_DEFAULT_AUTO_CONNECT = true;
7
+ var SOLANA_DEFAULT_RPC_URL = "https://api.mainnet-beta.solana.com";
8
+ var SOLANA_METAMASK_CONNECT_TIMEOUT_MS = 3e4;
9
+ var BITCOIN_DEFAULT_RPC_URL = "https://mempool.space/api";
10
+ var STELLAR_DEFAULT_HORIZON_RPC_URL = "https://horizon.stellar.org";
11
+ var STELLAR_DEFAULT_SOROBAN_RPC_URL = "https://rpc.ankr.com/stellar_soroban";
12
+ var NEAR_DEFAULT_RPC_URL = "https://1rpc.io/near";
13
+ var WALLET_METADATA = {
14
+ unisat: {
15
+ installUrl: "https://chromewebstore.google.com/detail/unisat-wallet/ppbibelpcjmhbdihakflkdcoccbgbkpo",
16
+ icon: "https://avatars.githubusercontent.com/u/125119198?s=200&v=4"
17
+ },
18
+ xverse: {
19
+ installUrl: "https://chromewebstore.google.com/detail/xverse-bitcoin-crypto-wal/idnnbdplmphpflfnlkomgpfbpcgelopg",
20
+ icon: "https://cdn.brandfetch.io/iddzGN5Rcv/w/400/h/400/theme/dark/icon.jpeg?c=1bxid64Mup7aczewSAYMX&t=1771902357797"
21
+ },
22
+ okx: {
23
+ installUrl: "https://chromewebstore.google.com/detail/okx-wallet/mcohilncbfahbmgdjkbpemcciiolgcge",
24
+ icon: "https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png"
25
+ },
26
+ hana: {
27
+ installUrl: "https://chromewebstore.google.com/detail/hana-wallet/jfdlamikmbghhapbgfoogdffldioobgl",
28
+ icon: "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/hana.svg"
29
+ }
30
+ };
31
+
32
+ export { BITCOIN_DEFAULT_RPC_URL, EVM_DEFAULT_RECONNECT_ON_MOUNT, EVM_DEFAULT_SSR, NEAR_DEFAULT_RPC_URL, SOLANA_DEFAULT_AUTO_CONNECT, SOLANA_DEFAULT_RPC_URL, SOLANA_METAMASK_CONNECT_TIMEOUT_MS, STELLAR_DEFAULT_HORIZON_RPC_URL, STELLAR_DEFAULT_SOROBAN_RPC_URL, SUI_DEFAULT_AUTO_CONNECT, SUI_DEFAULT_NETWORK, WALLET_METADATA };
33
+ //# sourceMappingURL=chunk-MXZVF5HR.mjs.map
34
+ //# sourceMappingURL=chunk-MXZVF5HR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts"],"names":[],"mappings":";AAUO,IAAM,mBAAA,GAAsB;AAC5B,IAAM,wBAAA,GAA2B;AAGjC,IAAM,8BAAA,GAAiC;AACvC,IAAM,eAAA,GAAkB;AAGxB,IAAM,2BAAA,GAA8B;AACpC,IAAM,sBAAA,GAAyB;AAE/B,IAAM,kCAAA,GAAqC;AAG3C,IAAM,uBAAA,GAA0B;AAGhC,IAAM,+BAAA,GAAkC;AACxC,IAAM,+BAAA,GAAkC;AAGxC,IAAM,oBAAA,GAAuB;AAM7B,IAAM,eAAA,GAAkB;AAAA,EAC7B,MAAA,EAAQ;AAAA,IACN,UAAA,EAAY,yFAAA;AAAA,IACZ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,UAAA,EAAY,qGAAA;AAAA,IACZ,IAAA,EACE;AAAA,GACJ;AAAA,EACA,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,sFAAA;AAAA,IACZ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,uFAAA;AAAA,IACZ,IAAA,EAAM;AAAA;AAEV","file":"chunk-MXZVF5HR.mjs","sourcesContent":["/**\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"]}
@@ -0,0 +1,33 @@
1
+ import { SolanaXService } from './chunk-XZ7CHO2S.mjs';
2
+ import { XConnector } from './chunk-X2MHIWXO.mjs';
3
+
4
+ // src/xchains/solana/SolanaXConnector.ts
5
+ var SolanaXConnector = class extends XConnector {
6
+ wallet;
7
+ constructor(wallet) {
8
+ super("SOLANA", wallet?.adapter.name, wallet?.adapter.name);
9
+ this.wallet = wallet;
10
+ }
11
+ getXService() {
12
+ return SolanaXService.getInstance();
13
+ }
14
+ async connect() {
15
+ return;
16
+ }
17
+ async disconnect() {
18
+ }
19
+ get icon() {
20
+ return this.wallet?.adapter.icon;
21
+ }
22
+ get isInstalled() {
23
+ const state = this.wallet?.readyState;
24
+ return state === "Installed" || state === "Loadable";
25
+ }
26
+ get installUrl() {
27
+ return this.wallet?.adapter.url;
28
+ }
29
+ };
30
+
31
+ export { SolanaXConnector };
32
+ //# sourceMappingURL=chunk-N5A2TMF6.mjs.map
33
+ //# sourceMappingURL=chunk-N5A2TMF6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/xchains/solana/SolanaXConnector.ts"],"names":[],"mappings":";;;;AAOO,IAAM,gBAAA,GAAN,cAA+B,UAAA,CAAW;AAAA,EAC/C,MAAA;AAAA,EACA,YAAY,MAAA,EAAgB;AAC1B,IAAA,KAAA,CAAM,UAAU,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAC1D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,WAAA,GAA8B;AAC5B,IAAA,OAAO,eAAe,WAAA,EAAY;AAAA,EACpC;AAAA,EAEA,MAAM,OAAA,GAAyC;AAC7C,IAAA;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAAA,EAAC;AAAA,EAEnC,IAAoB,IAAA,GAAe;AACjC,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA;AAAA,EAC9B;AAAA,EAEA,IAAoB,WAAA,GAAuB;AAUzC,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,EAAQ,UAAA;AAC3B,IAAA,OAAO,KAAA,KAAU,eAAe,KAAA,KAAU,UAAA;AAAA,EAC5C;AAAA,EAEA,IAAoB,UAAA,GAAiC;AACnD,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,CAAQ,GAAA;AAAA,EAC9B;AACF","file":"chunk-N5A2TMF6.mjs","sourcesContent":["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"]}