@sodax/wallet-sdk-react 2.0.0-rc.3 → 2.0.0-rc.4

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 (120) hide show
  1. package/README.md +12 -5
  2. package/dist/{chunk-BKJB527E.mjs → chunk-3QETHO6P.mjs} +1 -3
  3. package/dist/{chunk-PJLEJVAU.mjs → chunk-42LTUHMZ.mjs} +1 -3
  4. package/dist/{chunk-NY7U7OJW.mjs → chunk-7V7O3Q7Y.mjs} +0 -2
  5. package/dist/{chunk-BXJLBR4G.mjs → chunk-C6M34IVL.mjs} +2 -4
  6. package/dist/{chunk-XZ7CHO2S.mjs → chunk-FSOGMSJH.mjs} +2 -4
  7. package/dist/{chunk-X2MHIWXO.mjs → chunk-IFXZQW4C.mjs} +0 -2
  8. package/dist/{chunk-7ULB6DW4.mjs → chunk-JQ4H4GJ5.mjs} +3 -5
  9. package/dist/{chunk-N5A2TMF6.mjs → chunk-LKSSME2J.mjs} +2 -4
  10. package/dist/{chunk-PLCA4ZDJ.mjs → chunk-LUKR7YKV.mjs} +54 -30
  11. package/dist/{chunk-MXZVF5HR.mjs → chunk-NAKCAL2M.mjs} +0 -2
  12. package/dist/chunk-QMXBY3UI.mjs +1 -0
  13. package/dist/{chunk-MAQ47Q52.mjs → chunk-TACW7Z4D.mjs} +0 -2
  14. package/dist/{chunk-2BOUGCJ7.mjs → chunk-WPZOLGVB.mjs} +4 -6
  15. package/dist/{chunk-66BAUK56.mjs → chunk-X7BHR7WS.mjs} +2 -4
  16. package/dist/{chunk-E5IAZ7E6.mjs → chunk-Z5GXDHGL.mjs} +9 -5
  17. package/dist/{config-OlnzyEUE.d.ts → config-GVKK8IfY.d.ts} +6 -1
  18. package/dist/index.d.ts +4 -4
  19. package/dist/index.mjs +20 -31
  20. package/dist/xchains/bitcoin/index.mjs +14 -16
  21. package/dist/xchains/evm/index.d.ts +1 -1
  22. package/dist/xchains/evm/index.mjs +3 -5
  23. package/dist/xchains/icon/index.mjs +5 -7
  24. package/dist/xchains/injective/index.mjs +3 -5
  25. package/dist/xchains/near/index.mjs +4 -6
  26. package/dist/xchains/solana/index.mjs +5 -7
  27. package/dist/xchains/stacks/index.mjs +3 -5
  28. package/dist/xchains/stellar/index.mjs +4 -6
  29. package/dist/xchains/sui/index.mjs +5 -7
  30. package/docs/ADDING_A_NEW_CHAIN.md +1 -1
  31. package/docs/SUB_PATH_EXPORTS.md +14 -42
  32. package/package.json +32 -24
  33. package/ai-exported/AGENTS.md +0 -122
  34. package/ai-exported/integration/README.md +0 -102
  35. package/ai-exported/integration/ai-rules.md +0 -136
  36. package/ai-exported/integration/architecture.md +0 -181
  37. package/ai-exported/integration/examples/01-minimal-evm.tsx +0 -75
  38. package/ai-exported/integration/examples/02-multi-chain-modal.tsx +0 -169
  39. package/ai-exported/integration/examples/03-nextjs-app-router.tsx +0 -99
  40. package/ai-exported/integration/examples/04-walletconnect-setup.tsx +0 -89
  41. package/ai-exported/integration/examples/README.md +0 -29
  42. package/ai-exported/integration/recipes/batch-operations.md +0 -223
  43. package/ai-exported/integration/recipes/bridge-to-sdk.md +0 -164
  44. package/ai-exported/integration/recipes/chain-detection.md +0 -254
  45. package/ai-exported/integration/recipes/connect-button.md +0 -156
  46. package/ai-exported/integration/recipes/multi-chain-modal.md +0 -199
  47. package/ai-exported/integration/recipes/setup.md +0 -160
  48. package/ai-exported/integration/recipes/sign-message.md +0 -137
  49. package/ai-exported/integration/recipes/sub-path-imports.md +0 -95
  50. package/ai-exported/integration/recipes/switch-chain.md +0 -141
  51. package/ai-exported/integration/recipes/walletconnect-setup.md +0 -139
  52. package/ai-exported/integration/reference/api-surface.md +0 -175
  53. package/ai-exported/integration/reference/chain-support.md +0 -78
  54. package/ai-exported/integration/reference/connectors.md +0 -74
  55. package/ai-exported/integration/reference/hooks.md +0 -204
  56. package/ai-exported/integration/reference/wallet-brands.md +0 -106
  57. package/ai-exported/migration/README.md +0 -49
  58. package/ai-exported/migration/ai-rules.md +0 -144
  59. package/ai-exported/migration/breaking-changes.md +0 -305
  60. package/ai-exported/migration/checklist.md +0 -159
  61. package/ai-exported/migration/recipes/connect-button.md +0 -166
  62. package/ai-exported/migration/recipes/multi-chain-modal.md +0 -244
  63. package/ai-exported/migration/recipes/ssr-setup.md +0 -164
  64. package/ai-exported/migration/recipes/walletconnect-migration.md +0 -168
  65. package/ai-exported/migration/reference/components.md +0 -73
  66. package/ai-exported/migration/reference/config.md +0 -325
  67. package/ai-exported/migration/reference/hooks.md +0 -323
  68. package/ai-exported/migration/reference/imports.md +0 -157
  69. package/dist/chunk-2BOUGCJ7.mjs.map +0 -1
  70. package/dist/chunk-66BAUK56.mjs.map +0 -1
  71. package/dist/chunk-7ULB6DW4.mjs.map +0 -1
  72. package/dist/chunk-BKJB527E.mjs.map +0 -1
  73. package/dist/chunk-BXJLBR4G.mjs.map +0 -1
  74. package/dist/chunk-E5IAZ7E6.mjs.map +0 -1
  75. package/dist/chunk-MAQ47Q52.mjs.map +0 -1
  76. package/dist/chunk-MXZVF5HR.mjs.map +0 -1
  77. package/dist/chunk-N5A2TMF6.mjs.map +0 -1
  78. package/dist/chunk-NY7U7OJW.mjs.map +0 -1
  79. package/dist/chunk-PJLEJVAU.mjs.map +0 -1
  80. package/dist/chunk-PLCA4ZDJ.mjs.map +0 -1
  81. package/dist/chunk-TZMKDXFA.mjs +0 -3
  82. package/dist/chunk-TZMKDXFA.mjs.map +0 -1
  83. package/dist/chunk-X2MHIWXO.mjs.map +0 -1
  84. package/dist/chunk-XZ7CHO2S.mjs.map +0 -1
  85. package/dist/index.cjs +0 -3337
  86. package/dist/index.cjs.map +0 -1
  87. package/dist/index.mjs.map +0 -1
  88. package/dist/xchains/bitcoin/index.cjs +0 -1927
  89. package/dist/xchains/bitcoin/index.cjs.map +0 -1
  90. package/dist/xchains/bitcoin/index.mjs.map +0 -1
  91. package/dist/xchains/evm/index.cjs +0 -316
  92. package/dist/xchains/evm/index.cjs.map +0 -1
  93. package/dist/xchains/evm/index.mjs.map +0 -1
  94. package/dist/xchains/icon/index.cjs +0 -311
  95. package/dist/xchains/icon/index.cjs.map +0 -1
  96. package/dist/xchains/icon/index.mjs.map +0 -1
  97. package/dist/xchains/injective/index.cjs +0 -223
  98. package/dist/xchains/injective/index.cjs.map +0 -1
  99. package/dist/xchains/injective/index.mjs.map +0 -1
  100. package/dist/xchains/near/index.cjs +0 -190
  101. package/dist/xchains/near/index.cjs.map +0 -1
  102. package/dist/xchains/near/index.mjs.map +0 -1
  103. package/dist/xchains/solana/index.cjs +0 -186
  104. package/dist/xchains/solana/index.cjs.map +0 -1
  105. package/dist/xchains/solana/index.mjs.map +0 -1
  106. package/dist/xchains/stacks/index.cjs +0 -240
  107. package/dist/xchains/stacks/index.cjs.map +0 -1
  108. package/dist/xchains/stacks/index.mjs.map +0 -1
  109. package/dist/xchains/stellar/index.cjs +0 -322
  110. package/dist/xchains/stellar/index.cjs.map +0 -1
  111. package/dist/xchains/stellar/index.mjs.map +0 -1
  112. package/dist/xchains/sui/index.cjs +0 -248
  113. package/dist/xchains/sui/index.cjs.map +0 -1
  114. package/dist/xchains/sui/index.mjs.map +0 -1
  115. package/skills/SKILLS.md +0 -84
  116. package/skills/bridge-to-sdk.md +0 -148
  117. package/skills/connect-button.md +0 -116
  118. package/skills/evm-only-walletconnect.md +0 -111
  119. package/skills/multi-chain-modal.md +0 -178
  120. package/skills/setup.md +0 -107
@@ -1,316 +0,0 @@
1
- 'use strict';
2
-
3
- var types = require('@sodax/types');
4
- var viem = require('viem');
5
- var actions = require('wagmi/actions');
6
- var wagmi = require('wagmi');
7
- var chains = require('wagmi/chains');
8
-
9
- // src/core/XService.ts
10
- var XService = class {
11
- /** The blockchain type this service handles */
12
- xChainType;
13
- /** Available wallet connectors for this chain */
14
- xConnectors = [];
15
- constructor(xChainType) {
16
- this.xChainType = xChainType;
17
- }
18
- /**
19
- * Gets the balance of a specific token for an address
20
- * @param address The wallet address to check
21
- * @param xToken The token to get the balance for
22
- * @returns Promise resolving to the token balance as a bigint
23
- */
24
- async getBalance(address, xToken) {
25
- return 0n;
26
- }
27
- /**
28
- * Gets balances for multiple tokens for an address
29
- * @param address The wallet address to check
30
- * @param xTokens Array of tokens to get balances for
31
- * @returns Promise resolving to object mapping token addresses to balances
32
- */
33
- async getBalances(address, xTokens) {
34
- if (!address) return {};
35
- const balancePromises = xTokens.map(async (xToken) => {
36
- const balance = await this.getBalance(address, xToken);
37
- return { address: xToken.address, balance };
38
- });
39
- const balances = await Promise.all(balancePromises);
40
- return balances.reduce((acc, { address: address2, balance }) => {
41
- acc[address2] = balance;
42
- return acc;
43
- }, {});
44
- }
45
- /**
46
- * Gets all available connectors for this chain
47
- */
48
- getXConnectors() {
49
- return this.xConnectors;
50
- }
51
- /**
52
- * Sets the available connectors for this chain
53
- */
54
- setXConnectors(xConnectors) {
55
- this.xConnectors = xConnectors;
56
- }
57
- /**
58
- * Gets a specific connector by its ID
59
- * @param xConnectorId The connector ID to look up
60
- * @returns The matching connector or undefined if not found
61
- */
62
- getXConnectorById(xConnectorId) {
63
- return this.getXConnectors().find((xConnector) => xConnector.id === xConnectorId);
64
- }
65
- };
66
- function getRpcUrl(entry) {
67
- if (!entry || typeof entry === "string") return void 0;
68
- return entry.rpcUrl;
69
- }
70
-
71
- // src/utils/index.ts
72
- var isNativeToken = (xToken) => {
73
- const nativeAddresses = [
74
- "cx0000000000000000000000000000000000000000",
75
- "0x0000000000000000000000000000000000000000",
76
- "inj",
77
- "0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI",
78
- "hx0000000000000000000000000000000000000000",
79
- "11111111111111111111111111111111",
80
- // solana
81
- "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA",
82
- // stellar
83
- "ST000000000000000000002AMW42H.nativetoken",
84
- // stacks
85
- "0:0"
86
- // bitcoin
87
- ];
88
- return nativeAddresses.includes(xToken.address);
89
- };
90
- var getWagmiChainId = (xChainId) => {
91
- const chainId = types.baseChainInfo[xChainId].chainId;
92
- if (typeof chainId !== "number") {
93
- throw new Error(`[wallet-sdk-react] getWagmiChainId: expected numeric chainId, got ${typeof chainId}`);
94
- }
95
- return chainId;
96
- };
97
- var hyper = /* @__PURE__ */ viem.defineChain({
98
- id: 999,
99
- name: "HyperEVM",
100
- nativeCurrency: {
101
- decimals: 18,
102
- name: "HYPE",
103
- symbol: "HYPE"
104
- },
105
- rpcUrls: {
106
- default: { http: ["https://rpc.hyperliquid.xyz/evm"] }
107
- },
108
- blockExplorers: {
109
- default: {
110
- name: "HyperEVMScan",
111
- url: "https://hyperevmscan.io/"
112
- }
113
- },
114
- contracts: {
115
- multicall3: {
116
- address: "0xcA11bde05977b3631167028862bE2a173976CA11",
117
- blockCreated: 13051
118
- }
119
- }
120
- });
121
- var createWagmiConfig = (evmChains, options) => {
122
- return wagmi.createConfig({
123
- chains: [
124
- chains.mainnet,
125
- chains.avalanche,
126
- chains.arbitrum,
127
- chains.base,
128
- chains.bsc,
129
- chains.sonic,
130
- chains.optimism,
131
- chains.polygon,
132
- hyper,
133
- chains.lightlinkPhoenix,
134
- chains.kaia,
135
- chains.redbellyMainnet
136
- ],
137
- connectors: options?.connectors ?? [],
138
- ssr: options?.ssr,
139
- transports: {
140
- [chains.mainnet.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.ETHEREUM_MAINNET])),
141
- [chains.avalanche.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.AVALANCHE_MAINNET])),
142
- [chains.arbitrum.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.ARBITRUM_MAINNET])),
143
- [chains.base.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.BASE_MAINNET])),
144
- [chains.bsc.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.BSC_MAINNET])),
145
- [chains.sonic.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.SONIC_MAINNET])),
146
- [chains.optimism.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.OPTIMISM_MAINNET])),
147
- [chains.polygon.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.POLYGON_MAINNET])),
148
- [hyper.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.HYPEREVM_MAINNET])),
149
- [chains.lightlinkPhoenix.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.LIGHTLINK_MAINNET])),
150
- [chains.redbellyMainnet.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.REDBELLY_MAINNET])),
151
- [chains.kaia.id]: wagmi.http(getRpcUrl(evmChains?.[types.ChainKeys.KAIA_MAINNET]))
152
- },
153
- storage: wagmi.createStorage({
154
- storage: wagmi.cookieStorage,
155
- key: "sodax"
156
- })
157
- });
158
- };
159
- var EvmXService = class _EvmXService extends XService {
160
- static instance;
161
- wagmiConfig;
162
- constructor() {
163
- super("EVM");
164
- }
165
- static getInstance() {
166
- if (!_EvmXService.instance) {
167
- _EvmXService.instance = new _EvmXService();
168
- }
169
- return _EvmXService.instance;
170
- }
171
- // get erc20 token balance in a chain (evm chain only)
172
- async _getTokenBalance(address, chainId, tokenAddress) {
173
- const publicClient = actions.getPublicClient(this.wagmiConfig, { chainId });
174
- if (!publicClient) throw new Error("Public client not found");
175
- const balance = await publicClient.readContract({
176
- abi: viem.erc20Abi,
177
- address: tokenAddress,
178
- functionName: "balanceOf",
179
- args: [address]
180
- });
181
- return balance || 0n;
182
- }
183
- //get native balance of the chain (evm chain only)
184
- async _getChainBalance(address, chainId) {
185
- const balance = await actions.getPublicClient(this.wagmiConfig, { chainId })?.getBalance({
186
- address
187
- });
188
- return balance || 0n;
189
- }
190
- async getBalance(address, xToken) {
191
- if (!address) return 0n;
192
- if (!this.wagmiConfig) return 0n;
193
- const chainId = getWagmiChainId(xToken.chainKey);
194
- if (isNativeToken(xToken)) {
195
- return this._getChainBalance(address, chainId);
196
- }
197
- throw new Error(`Unsupported token: ${xToken.symbol}`);
198
- }
199
- async getBalances(address, xTokens) {
200
- if (!address) return {};
201
- if (!this.wagmiConfig) return {};
202
- const nativeTokenBalancePromises = xTokens.filter((xToken) => isNativeToken(xToken)).map(async (xToken) => {
203
- const balance = await this.getBalance(address, xToken);
204
- return { symbol: xToken.symbol, address: xToken.address, balance };
205
- });
206
- const nativeTokenBalances = await Promise.all(nativeTokenBalancePromises);
207
- const tokenMap = nativeTokenBalances.reduce(
208
- (map, { address: address2, balance }) => {
209
- if (balance) map[address2] = balance;
210
- return map;
211
- },
212
- {}
213
- );
214
- const nonNativeXTokens = xTokens.filter((xToken) => !isNativeToken(xToken));
215
- const firstToken = xTokens[0];
216
- if (!firstToken) return tokenMap;
217
- const chainKey = firstToken.chainKey;
218
- const viemChain = this.wagmiConfig.chains.find((chain) => chain.id === getWagmiChainId(chainKey));
219
- const chainId = getWagmiChainId(chainKey);
220
- const publicClient = actions.getPublicClient(this.wagmiConfig, { chainId });
221
- if (!publicClient) throw new Error("Public client not found");
222
- if (viemChain?.contracts?.multicall3) {
223
- const result = await publicClient.multicall({
224
- contracts: nonNativeXTokens.map((token) => ({
225
- abi: viem.erc20Abi,
226
- address: token.address,
227
- functionName: "balanceOf",
228
- args: [address]
229
- }))
230
- });
231
- return nonNativeXTokens.reduce((acc, token, index) => {
232
- const resultValue = result?.[index]?.result;
233
- acc[token.address] = resultValue !== void 0 && resultValue !== null ? BigInt(resultValue) : 0n;
234
- return acc;
235
- }, tokenMap);
236
- }
237
- const nonNativeTokenBalances = await Promise.all(
238
- nonNativeXTokens.map((token) => this._getTokenBalance(address, chainId, token.address))
239
- );
240
- return nonNativeXTokens.reduce((acc, token, idx) => {
241
- acc[token.address] = nonNativeTokenBalances[idx] ?? 0n;
242
- return acc;
243
- }, tokenMap);
244
- }
245
- };
246
-
247
- // src/core/XConnector.ts
248
- var XConnector = class {
249
- /** The blockchain type this connector supports */
250
- xChainType;
251
- /** Display name of the wallet provider */
252
- name;
253
- /** Unique identifier for the connector */
254
- _id;
255
- /** Optional icon URL for the wallet provider */
256
- _icon;
257
- constructor(xChainType, name, id) {
258
- this.xChainType = xChainType;
259
- this.name = name;
260
- this._id = id;
261
- }
262
- /** Get the unique identifier for this connector */
263
- get id() {
264
- return this._id;
265
- }
266
- /** Get the optional icon URL for this wallet provider */
267
- get icon() {
268
- return this._icon;
269
- }
270
- /**
271
- * True when the wallet extension backing this connector is installed.
272
- * Default: true (for provider-managed chains where connector presence already
273
- * implies install — EVM via EIP-6963, Solana/Sui via adapter discovery).
274
- * Subclasses backed by extension injection (Bitcoin, ICON, Stacks) override
275
- * this with a window probe.
276
- */
277
- get isInstalled() {
278
- return true;
279
- }
280
- /** URL to install the wallet extension when missing. Subclasses override. */
281
- get installUrl() {
282
- return void 0;
283
- }
284
- };
285
-
286
- // src/xchains/evm/EvmXConnector.ts
287
- 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";
288
- var EvmXConnector = class extends XConnector {
289
- connector;
290
- constructor(connector) {
291
- super("EVM", connector.name, connector.id);
292
- this.connector = connector;
293
- }
294
- async connect() {
295
- return;
296
- }
297
- async disconnect() {
298
- return;
299
- }
300
- get id() {
301
- return this.connector.id;
302
- }
303
- get icon() {
304
- if (!this.connector.icon && this.connector.type === "walletConnect") {
305
- return WALLETCONNECT_ICON;
306
- }
307
- return this.connector.icon;
308
- }
309
- };
310
-
311
- exports.EvmXConnector = EvmXConnector;
312
- exports.EvmXService = EvmXService;
313
- exports.createWagmi = createWagmiConfig;
314
- exports.createWagmiConfig = createWagmiConfig;
315
- //# sourceMappingURL=index.cjs.map
316
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/XService.ts","../../../src/utils/walletRpcConfig.ts","../../../src/utils/index.ts","../../../src/xchains/evm/EvmXService.ts","../../../src/core/XConnector.ts","../../../src/xchains/evm/EvmXConnector.ts"],"names":["address","baseChainInfo","defineChain","createConfig","mainnet","avalanche","arbitrum","base","bsc","sonic","optimism","polygon","lightlinkPhoenix","kaia","redbellyMainnet","http","ChainKeys","createStorage","cookieStorage","getPublicClient","erc20Abi"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ChainType, IXServiceBase, XToken } from '@sodax/types';\nimport type { IXConnector } from '@/types/interfaces.js';\n\n/**\n * Abstract base class for blockchain service implementations.\n *\n * The XService class serves as a foundation for implementing blockchain-specific services\n * in a multi-chain environment. It provides a standardized interface for:\n * 1. Managing wallet connectors for different blockchain types\n * 2. Querying token balances across different chains\n *\n * Each blockchain implementation (e.g., Solana, EVM chains) extends this class\n * to provide chain-specific functionality while maintaining a consistent interface.\n *\n * @abstract\n * @class XService\n * @property {ChainType} xChainType - The blockchain type this service handles (e.g., 'SOLANA', 'EVM')\n * @property {XConnector[]} xConnectors - Available wallet connectors for this chain\n *\n */\nexport abstract class XService implements IXServiceBase {\n /** The blockchain type this service handles */\n public readonly xChainType: ChainType;\n\n /** Available wallet connectors for this chain */\n private xConnectors: IXConnector[] = [];\n\n constructor(xChainType: ChainType) {\n this.xChainType = xChainType;\n }\n\n /**\n * Gets the balance of a specific token for an address\n * @param address The wallet address to check\n * @param xToken The token to get the balance for\n * @returns Promise resolving to the token balance as a bigint\n */\n public async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n return 0n;\n }\n\n /**\n * Gets balances for multiple tokens for an address\n * @param address The wallet address to check\n * @param xTokens Array of tokens to get balances for\n * @returns Promise resolving to object mapping token addresses to balances\n */\n public async getBalances(address: string | undefined, xTokens: readonly XToken[]): Promise<Record<string, bigint>> {\n if (!address) return {};\n\n const balancePromises = xTokens.map(async xToken => {\n const balance = await this.getBalance(address, xToken);\n return { address: xToken.address, balance };\n });\n\n const balances = await Promise.all(balancePromises);\n return balances.reduce<Record<string, bigint>>((acc, { address, balance }) => {\n acc[address] = balance;\n return acc;\n }, {});\n }\n\n /**\n * Gets all available connectors for this chain\n */\n public getXConnectors(): IXConnector[] {\n return this.xConnectors;\n }\n\n /**\n * Sets the available connectors for this chain\n */\n public setXConnectors(xConnectors: IXConnector[]): void {\n this.xConnectors = xConnectors;\n }\n\n /**\n * Gets a specific connector by its ID\n * @param xConnectorId The connector ID to look up\n * @returns The matching connector or undefined if not found\n */\n public getXConnectorById(xConnectorId: string): IXConnector | undefined {\n return this.getXConnectors().find(xConnector => xConnector.id === xConnectorId);\n }\n}\n","import { 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 { 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 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 { 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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
@@ -1,311 +0,0 @@
1
- 'use strict';
2
-
3
- var IconSdkRaw = require('icon-sdk-js');
4
- require('@sodax/types');
5
-
6
- function _interopNamespace(e) {
7
- if (e && e.__esModule) return e;
8
- var n = Object.create(null);
9
- if (e) {
10
- Object.keys(e).forEach(function (k) {
11
- if (k !== 'default') {
12
- var d = Object.getOwnPropertyDescriptor(e, k);
13
- Object.defineProperty(n, k, d.get ? d : {
14
- enumerable: true,
15
- get: function () { return e[k]; }
16
- });
17
- }
18
- });
19
- }
20
- n.default = e;
21
- return Object.freeze(n);
22
- }
23
-
24
- var IconSdkRaw__namespace = /*#__PURE__*/_interopNamespace(IconSdkRaw);
25
-
26
- // src/core/XService.ts
27
- var XService = class {
28
- /** The blockchain type this service handles */
29
- xChainType;
30
- /** Available wallet connectors for this chain */
31
- xConnectors = [];
32
- constructor(xChainType) {
33
- this.xChainType = xChainType;
34
- }
35
- /**
36
- * Gets the balance of a specific token for an address
37
- * @param address The wallet address to check
38
- * @param xToken The token to get the balance for
39
- * @returns Promise resolving to the token balance as a bigint
40
- */
41
- async getBalance(address, xToken) {
42
- return 0n;
43
- }
44
- /**
45
- * Gets balances for multiple tokens for an address
46
- * @param address The wallet address to check
47
- * @param xTokens Array of tokens to get balances for
48
- * @returns Promise resolving to object mapping token addresses to balances
49
- */
50
- async getBalances(address, xTokens) {
51
- if (!address) return {};
52
- const balancePromises = xTokens.map(async (xToken) => {
53
- const balance = await this.getBalance(address, xToken);
54
- return { address: xToken.address, balance };
55
- });
56
- const balances = await Promise.all(balancePromises);
57
- return balances.reduce((acc, { address: address2, balance }) => {
58
- acc[address2] = balance;
59
- return acc;
60
- }, {});
61
- }
62
- /**
63
- * Gets all available connectors for this chain
64
- */
65
- getXConnectors() {
66
- return this.xConnectors;
67
- }
68
- /**
69
- * Sets the available connectors for this chain
70
- */
71
- setXConnectors(xConnectors) {
72
- this.xConnectors = xConnectors;
73
- }
74
- /**
75
- * Gets a specific connector by its ID
76
- * @param xConnectorId The connector ID to look up
77
- * @returns The matching connector or undefined if not found
78
- */
79
- getXConnectorById(xConnectorId) {
80
- return this.getXConnectors().find((xConnector) => xConnector.id === xConnectorId);
81
- }
82
- };
83
-
84
- // src/utils/index.ts
85
- var isNativeToken = (xToken) => {
86
- const nativeAddresses = [
87
- "cx0000000000000000000000000000000000000000",
88
- "0x0000000000000000000000000000000000000000",
89
- "inj",
90
- "0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI",
91
- "hx0000000000000000000000000000000000000000",
92
- "11111111111111111111111111111111",
93
- // solana
94
- "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA",
95
- // stellar
96
- "ST000000000000000000002AMW42H.nativetoken",
97
- // stacks
98
- "0:0"
99
- // bitcoin
100
- ];
101
- return nativeAddresses.includes(xToken.address);
102
- };
103
-
104
- // src/xchains/icon/IconXService.ts
105
- var IconSdk = "default" in IconSdkRaw__namespace.default ? IconSdkRaw__namespace.default : IconSdkRaw__namespace;
106
- var { IconService: IconServiceConstructor, Builder: IconBuilder, Converter: IconConverter } = IconSdk;
107
- var SupportedChainId = /* @__PURE__ */ ((SupportedChainId2) => {
108
- SupportedChainId2[SupportedChainId2["MAINNET"] = 1] = "MAINNET";
109
- return SupportedChainId2;
110
- })(SupportedChainId || {});
111
- var CHAIN_INFO = {
112
- [1 /* MAINNET */]: {
113
- name: "ICON Mainnet",
114
- node: "https://ctz.solidwallet.io",
115
- APIEndpoint: "https://ctz.solidwallet.io/api/v3",
116
- debugAPIEndpoint: "https://api.icon.community/api/v3d",
117
- chainId: 1,
118
- tracker: "https://tracker.icon.community"
119
- }
120
- };
121
- var IconXService = class _IconXService extends XService {
122
- static instance;
123
- iconService;
124
- constructor(rpcUrl) {
125
- super("ICON");
126
- const mainnetInfo = CHAIN_INFO[1 /* MAINNET */];
127
- if (!mainnetInfo) throw new Error("ICON mainnet chain info not found");
128
- this.iconService = new IconServiceConstructor(
129
- new IconServiceConstructor.HttpProvider(rpcUrl ?? mainnetInfo.APIEndpoint)
130
- );
131
- }
132
- static getInstance(rpcUrl) {
133
- if (!_IconXService.instance) {
134
- _IconXService.instance = new _IconXService(rpcUrl);
135
- }
136
- return _IconXService.instance;
137
- }
138
- async getAggregateData(requireSuccess, calls) {
139
- const rawTx = new IconBuilder.CallBuilder().to("cxa4aa9185e23558cff990f494c1fd2845f6cbf741").method("tryAggregate").params({ requireSuccess: IconConverter.toHex(requireSuccess ? 1 : 0), calls }).build();
140
- try {
141
- const result = await this.iconService.call(rawTx).execute();
142
- const aggs = result["returnData"];
143
- const data = aggs.map((agg) => {
144
- if (agg["success"] === "0x0") {
145
- return null;
146
- }
147
- return agg["returnData"];
148
- });
149
- return data;
150
- } catch (err) {
151
- console.error(err);
152
- return Array(calls.length).fill(null);
153
- }
154
- }
155
- async getBalances(address, xTokens) {
156
- if (!address) return {};
157
- const balances = {};
158
- const nativeXToken = xTokens.find((xToken) => isNativeToken(xToken));
159
- const nonNativeXTokens = xTokens.filter((xToken) => !isNativeToken(xToken));
160
- if (nativeXToken) {
161
- const balance = await this.iconService.getBalance(address).execute();
162
- balances[nativeXToken.address] = BigInt(balance.toFixed());
163
- }
164
- const cds = nonNativeXTokens.map((token) => {
165
- return {
166
- target: token.address,
167
- method: "balanceOf",
168
- params: [address]
169
- };
170
- });
171
- const data = await this.getAggregateData(
172
- false,
173
- cds.filter((cd) => cd.target.startsWith("cx"))
174
- );
175
- return nonNativeXTokens.reduce((agg, token, idx) => {
176
- const balance = data[idx];
177
- if (balance) {
178
- balances[token.address] = BigInt(balance);
179
- }
180
- return agg;
181
- }, balances);
182
- }
183
- };
184
-
185
- // src/xchains/icon/iconex/index.tsx
186
- var ICONEX_RELAY_RESPONSE = "ICONEX_RELAY_RESPONSE";
187
- var ICONEX_RELAY_REQUEST = "ICONEX_RELAY_REQUEST";
188
- var request = (event) => {
189
- return new Promise((resolve, reject) => {
190
- const handler = (evt) => {
191
- window.removeEventListener(ICONEX_RELAY_RESPONSE, handler);
192
- resolve(evt.detail);
193
- };
194
- window.addEventListener(ICONEX_RELAY_RESPONSE, handler);
195
- window.dispatchEvent(
196
- new CustomEvent(ICONEX_RELAY_REQUEST, {
197
- detail: event
198
- })
199
- );
200
- });
201
- };
202
-
203
- // src/core/XConnector.ts
204
- var XConnector = class {
205
- /** The blockchain type this connector supports */
206
- xChainType;
207
- /** Display name of the wallet provider */
208
- name;
209
- /** Unique identifier for the connector */
210
- _id;
211
- /** Optional icon URL for the wallet provider */
212
- _icon;
213
- constructor(xChainType, name, id) {
214
- this.xChainType = xChainType;
215
- this.name = name;
216
- this._id = id;
217
- }
218
- /** Get the unique identifier for this connector */
219
- get id() {
220
- return this._id;
221
- }
222
- /** Get the optional icon URL for this wallet provider */
223
- get icon() {
224
- return this._icon;
225
- }
226
- /**
227
- * True when the wallet extension backing this connector is installed.
228
- * Default: true (for provider-managed chains where connector presence already
229
- * implies install — EVM via EIP-6963, Solana/Sui via adapter discovery).
230
- * Subclasses backed by extension injection (Bitcoin, ICON, Stacks) override
231
- * this with a window probe.
232
- */
233
- get isInstalled() {
234
- return true;
235
- }
236
- /** URL to install the wallet extension when missing. Subclasses override. */
237
- get installUrl() {
238
- return void 0;
239
- }
240
- };
241
-
242
- // src/shared/guards.ts
243
- function isRecord(value) {
244
- return typeof value === "object" && value !== null;
245
- }
246
- function hasBooleanProperty(value, key) {
247
- return isRecord(value) && typeof value[key] === "boolean";
248
- }
249
- function assert(condition, message) {
250
- if (!condition) {
251
- throw new Error(message);
252
- }
253
- }
254
-
255
- // src/constants.ts
256
- var WALLET_METADATA = {
257
- hana: {
258
- installUrl: "https://chromewebstore.google.com/detail/hana-wallet/jfdlamikmbghhapbgfoogdffldioobgl",
259
- icon: "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/hana.svg"
260
- }
261
- };
262
-
263
- // src/xchains/icon/IconHanaXConnector.ts
264
- var isHanaWallet = (value) => {
265
- return isRecord(value) && (value.available === void 0 || hasBooleanProperty(value, "available"));
266
- };
267
- var IconHanaXConnector = class extends XConnector {
268
- constructor() {
269
- super("ICON", "Hana Wallet", "hana");
270
- }
271
- get isInstalled() {
272
- if (typeof window === "undefined") return false;
273
- const hanaWallet = window.hanaWallet;
274
- return isHanaWallet(hanaWallet) && hanaWallet.available === true;
275
- }
276
- get installUrl() {
277
- return WALLET_METADATA.hana.installUrl;
278
- }
279
- async connect() {
280
- const hanaWallet = window.hanaWallet;
281
- assert(isHanaWallet(hanaWallet) || hanaWallet === void 0, "[IconHanaXConnector] invalid window.hanaWallet type");
282
- if (!hanaWallet || !hanaWallet.available) {
283
- window.open(WALLET_METADATA.hana.installUrl, "_blank", "noopener,noreferrer");
284
- return;
285
- }
286
- const detail = await request({
287
- type: "REQUEST_ADDRESS" /* REQUEST_ADDRESS */
288
- });
289
- if (detail?.type === "RESPONSE_ADDRESS" /* RESPONSE_ADDRESS */) {
290
- return {
291
- address: detail?.payload,
292
- xChainType: this.xChainType
293
- };
294
- }
295
- console.warn("[IconHanaXConnector] connect: unexpected response from Hana wallet", detail);
296
- return void 0;
297
- }
298
- async disconnect() {
299
- console.log("HanaIconXConnector disconnected");
300
- }
301
- get icon() {
302
- return WALLET_METADATA.hana.icon;
303
- }
304
- };
305
-
306
- exports.CHAIN_INFO = CHAIN_INFO;
307
- exports.IconHanaXConnector = IconHanaXConnector;
308
- exports.IconXService = IconXService;
309
- exports.SupportedChainId = SupportedChainId;
310
- //# sourceMappingURL=index.cjs.map
311
- //# sourceMappingURL=index.cjs.map