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

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 (127) hide show
  1. package/README.md +107 -142
  2. package/dist/XConnector-12q0OVe5.d.ts +146 -0
  3. package/dist/chunk-7V7O3Q7Y.mjs +62 -0
  4. package/dist/chunk-C6M34IVL.mjs +86 -0
  5. package/dist/chunk-DQTYAMKF.mjs +1609 -0
  6. package/dist/chunk-FSOGMSJH.mjs +39 -0
  7. package/dist/chunk-IFXZQW4C.mjs +98 -0
  8. package/dist/chunk-JQ4H4GJ5.mjs +100 -0
  9. package/dist/chunk-LKSSME2J.mjs +31 -0
  10. package/dist/chunk-MWWVB7TD.mjs +123 -0
  11. package/dist/chunk-NAKCAL2M.mjs +32 -0
  12. package/dist/chunk-OPYSVPRW.mjs +144 -0
  13. package/dist/chunk-QMXBY3UI.mjs +1 -0
  14. package/dist/chunk-TACW7Z4D.mjs +31 -0
  15. package/dist/chunk-WPZOLGVB.mjs +148 -0
  16. package/dist/chunk-X7BHR7WS.mjs +200 -0
  17. package/dist/chunk-Z5GXDHGL.mjs +190 -0
  18. package/dist/config-DEsqgrG1.d.ts +151 -0
  19. package/dist/index.d.ts +768 -1498
  20. package/dist/index.mjs +453 -2005
  21. package/dist/xchains/bitcoin/index.d.ts +125 -0
  22. package/dist/xchains/bitcoin/index.mjs +14 -0
  23. package/dist/xchains/evm/index.d.ts +39 -0
  24. package/dist/xchains/evm/index.mjs +3 -0
  25. package/dist/xchains/icon/index.d.ts +37 -0
  26. package/dist/xchains/icon/index.mjs +5 -0
  27. package/dist/xchains/injective/index.d.ts +35 -0
  28. package/dist/xchains/injective/index.mjs +3 -0
  29. package/dist/xchains/near/index.d.ts +34 -0
  30. package/dist/xchains/near/index.mjs +4 -0
  31. package/dist/xchains/solana/index.d.ts +26 -0
  32. package/dist/xchains/solana/index.mjs +5 -0
  33. package/dist/xchains/stacks/index.d.ts +42 -0
  34. package/dist/xchains/stacks/index.mjs +3 -0
  35. package/dist/xchains/stellar/index.d.ts +44 -0
  36. package/dist/xchains/stellar/index.mjs +4 -0
  37. package/dist/xchains/sui/index.d.ts +37 -0
  38. package/dist/xchains/sui/index.mjs +5 -0
  39. package/docs/ADDING_A_NEW_CHAIN.md +440 -0
  40. package/docs/ARCHITECTURE.md +291 -0
  41. package/docs/BATCH_OPERATIONS.md +267 -0
  42. package/docs/CHAIN_DETECTION.md +216 -0
  43. package/docs/CONFIGURE_PROVIDER.md +360 -0
  44. package/docs/CONNECTORS.md +247 -0
  45. package/docs/CONNECT_FLOW.md +276 -0
  46. package/docs/EVM_SWITCH_CHAIN.md +161 -0
  47. package/docs/SIGN_MESSAGE.md +213 -0
  48. package/docs/SUB_PATH_EXPORTS.md +218 -0
  49. package/docs/WALLETCONNECT.md +154 -0
  50. package/docs/WALLET_MODAL.md +331 -0
  51. package/docs/WALLET_PROVIDER_BRIDGE.md +226 -0
  52. package/package.json +56 -22
  53. package/dist/index.cjs +0 -2147
  54. package/dist/index.cjs.map +0 -1
  55. package/dist/index.d.cts +0 -1579
  56. package/dist/index.mjs.map +0 -1
  57. package/src/Hydrate.ts +0 -65
  58. package/src/SodaxWalletProvider.tsx +0 -97
  59. package/src/actions/getXChainType.ts +0 -8
  60. package/src/actions/getXService.ts +0 -33
  61. package/src/actions/index.ts +0 -2
  62. package/src/assets/wallets/hana.svg +0 -6
  63. package/src/assets/wallets/havah.svg +0 -76
  64. package/src/assets/wallets/keplr.svg +0 -30
  65. package/src/assets/wallets/metamask.svg +0 -60
  66. package/src/assets/wallets/phantom.svg +0 -4
  67. package/src/assets/wallets/sui.svg +0 -20
  68. package/src/core/XConnector.ts +0 -54
  69. package/src/core/XService.ts +0 -85
  70. package/src/core/index.ts +0 -2
  71. package/src/hooks/index.ts +0 -11
  72. package/src/hooks/useEthereumChainId.ts +0 -44
  73. package/src/hooks/useEvmSwitchChain.ts +0 -91
  74. package/src/hooks/useWalletProvider.ts +0 -206
  75. package/src/hooks/useXAccount.ts +0 -51
  76. package/src/hooks/useXAccounts.ts +0 -56
  77. package/src/hooks/useXBalances.ts +0 -65
  78. package/src/hooks/useXConnect.ts +0 -118
  79. package/src/hooks/useXConnection.ts +0 -72
  80. package/src/hooks/useXConnectors.ts +0 -72
  81. package/src/hooks/useXDisconnect.ts +0 -73
  82. package/src/hooks/useXService.ts +0 -8
  83. package/src/hooks/useXSignMessage.ts +0 -82
  84. package/src/index.ts +0 -19
  85. package/src/types/index.ts +0 -22
  86. package/src/useXWagmiStore.ts +0 -116
  87. package/src/utils/index.ts +0 -21
  88. package/src/xchains/bitcoin/BitcoinXConnector.ts +0 -34
  89. package/src/xchains/bitcoin/BitcoinXService.ts +0 -40
  90. package/src/xchains/bitcoin/OKXXConnector.ts +0 -117
  91. package/src/xchains/bitcoin/UnisatXConnector.ts +0 -117
  92. package/src/xchains/bitcoin/XverseXConnector.ts +0 -232
  93. package/src/xchains/bitcoin/index.ts +0 -7
  94. package/src/xchains/bitcoin/useBitcoinXConnectors.ts +0 -14
  95. package/src/xchains/evm/EvmXConnector.ts +0 -27
  96. package/src/xchains/evm/EvmXService.ts +0 -211
  97. package/src/xchains/evm/index.ts +0 -3
  98. package/src/xchains/icon/IconHanaXConnector.ts +0 -39
  99. package/src/xchains/icon/IconXService.ts +0 -117
  100. package/src/xchains/icon/actions.ts +0 -28
  101. package/src/xchains/icon/iconex/index.tsx +0 -46
  102. package/src/xchains/icon/index.ts +0 -2
  103. package/src/xchains/injective/InjectiveXConnector.ts +0 -60
  104. package/src/xchains/injective/InjectiveXService.ts +0 -62
  105. package/src/xchains/injective/actions.ts +0 -32
  106. package/src/xchains/injective/index.ts +0 -2
  107. package/src/xchains/near/NearXConnector.ts +0 -42
  108. package/src/xchains/near/NearXService.ts +0 -46
  109. package/src/xchains/near/useNearXConnectors.ts +0 -23
  110. package/src/xchains/solana/SolanaXConnector.ts +0 -26
  111. package/src/xchains/solana/SolanaXService.ts +0 -46
  112. package/src/xchains/solana/index.ts +0 -2
  113. package/src/xchains/stacks/StacksXConnector.ts +0 -63
  114. package/src/xchains/stacks/StacksXService.ts +0 -59
  115. package/src/xchains/stacks/constants.ts +0 -42
  116. package/src/xchains/stacks/index.ts +0 -4
  117. package/src/xchains/stacks/useStacksXConnectors.ts +0 -7
  118. package/src/xchains/stellar/CustomSorobanServer.ts +0 -93
  119. package/src/xchains/stellar/StellarWalletsKitXConnector.ts +0 -53
  120. package/src/xchains/stellar/StellarXService.ts +0 -93
  121. package/src/xchains/stellar/actions.ts +0 -24
  122. package/src/xchains/stellar/index.tsx +0 -2
  123. package/src/xchains/stellar/useStellarXConnectors.ts +0 -21
  124. package/src/xchains/stellar/utils.ts +0 -49
  125. package/src/xchains/sui/SuiXConnector.ts +0 -28
  126. package/src/xchains/sui/SuiXService.ts +0 -66
  127. package/src/xchains/sui/index.ts +0 -2
package/dist/index.cjs DELETED
@@ -1,2147 +0,0 @@
1
- 'use strict';
2
-
3
- var types = require('@sodax/types');
4
- var nearConnect = require('@hot-labs/near-connect');
5
- var nearApiJs = require('near-api-js');
6
- var transactions = require('@stacks/transactions');
7
- var network = require('@stacks/network');
8
- var satsConnect = require('sats-connect');
9
- var React2 = require('react');
10
- var dappKit = require('@mysten/dapp-kit');
11
- var walletAdapterReact = require('@solana/wallet-adapter-react');
12
- var wagmi = require('wagmi');
13
- var zustand = require('zustand');
14
- var middleware = require('zustand/middleware');
15
- var immer = require('zustand/middleware/immer');
16
- var viem = require('viem');
17
- var actions = require('wagmi/actions');
18
- var chains = require('wagmi/chains');
19
- var networks = require('@injectivelabs/networks');
20
- var sdkTs = require('@injectivelabs/sdk-ts');
21
- var tsTypes = require('@injectivelabs/ts-types');
22
- var walletCore = require('@injectivelabs/wallet-core');
23
- var walletStrategy = require('@injectivelabs/wallet-strategy');
24
- var walletBase = require('@injectivelabs/wallet-base');
25
- var walletCosmos = require('@injectivelabs/wallet-cosmos');
26
- var web3_js = require('@solana/web3.js');
27
- var splToken = require('@solana/spl-token');
28
- var stellarWalletsKit = require('@creit.tech/stellar-wallets-kit');
29
- var StellarSdk = require('@stellar/stellar-sdk');
30
- var IconSdkRaw = require('icon-sdk-js');
31
- var connect = require('@stacks/connect');
32
- var reactQuery = require('@tanstack/react-query');
33
- var chains$1 = require('viem/chains');
34
- var walletSdkCore = require('@sodax/wallet-sdk-core');
35
- var client = require('@mysten/sui/client');
36
- var walletAdapterWallets = require('@solana/wallet-adapter-wallets');
37
-
38
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
39
-
40
- function _interopNamespace(e) {
41
- if (e && e.__esModule) return e;
42
- var n = Object.create(null);
43
- if (e) {
44
- Object.keys(e).forEach(function (k) {
45
- if (k !== 'default') {
46
- var d = Object.getOwnPropertyDescriptor(e, k);
47
- Object.defineProperty(n, k, d.get ? d : {
48
- enumerable: true,
49
- get: function () { return e[k]; }
50
- });
51
- }
52
- });
53
- }
54
- n.default = e;
55
- return Object.freeze(n);
56
- }
57
-
58
- var React2__default = /*#__PURE__*/_interopDefault(React2);
59
- var StellarSdk__namespace = /*#__PURE__*/_interopNamespace(StellarSdk);
60
- var IconSdkRaw__namespace = /*#__PURE__*/_interopNamespace(IconSdkRaw);
61
-
62
- // src/actions/getXChainType.ts
63
- function getXChainType(xChainId) {
64
- if (!xChainId) {
65
- return void 0;
66
- }
67
- return types.baseChainInfo[xChainId].type;
68
- }
69
-
70
- // src/core/XService.ts
71
- var XService = class {
72
- constructor(xChainType) {
73
- /** Available wallet connectors for this chain */
74
- this.xConnectors = [];
75
- this.xChainType = xChainType;
76
- }
77
- /**
78
- * Gets the balance of a specific token for an address
79
- * @param address The wallet address to check
80
- * @param xToken The token to get the balance for
81
- * @returns Promise resolving to the token balance as a bigint
82
- */
83
- async getBalance(address, xToken) {
84
- return 0n;
85
- }
86
- /**
87
- * Gets balances for multiple tokens for an address
88
- * @param address The wallet address to check
89
- * @param xTokens Array of tokens to get balances for
90
- * @returns Promise resolving to object mapping token addresses to balances
91
- */
92
- async getBalances(address, xTokens) {
93
- if (!address) return {};
94
- const balancePromises = xTokens.map(async (xToken) => {
95
- const balance = await this.getBalance(address, xToken);
96
- return { address: xToken.address, balance };
97
- });
98
- const balances = await Promise.all(balancePromises);
99
- return balances.reduce((acc, { address: address2, balance }) => {
100
- acc[address2] = balance;
101
- return acc;
102
- }, {});
103
- }
104
- /**
105
- * Gets all available connectors for this chain
106
- */
107
- getXConnectors() {
108
- return this.xConnectors;
109
- }
110
- /**
111
- * Sets the available connectors for this chain
112
- */
113
- setXConnectors(xConnectors) {
114
- this.xConnectors = xConnectors;
115
- }
116
- /**
117
- * Gets a specific connector by its ID
118
- * @param xConnectorId The connector ID to look up
119
- * @returns The matching connector or undefined if not found
120
- */
121
- getXConnectorById(xConnectorId) {
122
- return this.getXConnectors().find((xConnector) => xConnector.id === xConnectorId);
123
- }
124
- };
125
- var NearXService = class _NearXService extends XService {
126
- constructor() {
127
- super("NEAR");
128
- this.walletSelector = new nearConnect.NearConnector({
129
- network: "mainnet",
130
- logger: console,
131
- autoConnect: true,
132
- excludedWallets: ["okx-wallet"]
133
- });
134
- }
135
- static getInstance() {
136
- if (!_NearXService.instance) {
137
- _NearXService.instance = new _NearXService();
138
- }
139
- return _NearXService.instance;
140
- }
141
- async getBalance(address, xToken) {
142
- const url = "https://1rpc.io/near";
143
- const provider = new nearApiJs.JsonRpcProvider({ url });
144
- if (xToken.symbol === "NEAR") {
145
- const account = await provider.viewAccount({ accountId: address ?? "" });
146
- return BigInt(account.amount);
147
- }
148
- const res = await provider.callFunction({ contractId: xToken.address, method: "ft_balance_of", args: { account_id: address } });
149
- return BigInt(res ?? 0);
150
- }
151
- };
152
- var StacksXService = class _StacksXService extends XService {
153
- constructor() {
154
- super("STACKS");
155
- this.network = network.networkFrom("mainnet");
156
- }
157
- static getInstance() {
158
- if (!_StacksXService.instance) {
159
- _StacksXService.instance = new _StacksXService();
160
- }
161
- return _StacksXService.instance;
162
- }
163
- async getBalance(address, xToken) {
164
- if (!address) return 0n;
165
- if (xToken.symbol === "STX") {
166
- const url = `${this.network?.client.baseUrl}/extended/v1/address/${address}/balances`;
167
- try {
168
- const response = await fetch(url);
169
- if (!response.ok) {
170
- throw new Error(`Error fetching data: ${response.statusText}`);
171
- }
172
- const data = await response.json();
173
- return BigInt(data.stx.balance);
174
- } catch (error) {
175
- console.error("Error fetching STX balance:", error);
176
- return 0n;
177
- }
178
- }
179
- const [contractAddress, contractName] = xToken.address.split(".");
180
- try {
181
- const result = await transactions.fetchCallReadOnlyFunction({
182
- contractAddress,
183
- contractName,
184
- functionName: "get-balance",
185
- functionArgs: [transactions.Cl.principal(address)],
186
- network: this.network,
187
- senderAddress: address
188
- });
189
- return result.value.value;
190
- } catch (error) {
191
- console.error("Error fetching token balance:", error);
192
- return 0n;
193
- }
194
- }
195
- };
196
-
197
- // src/actions/getXService.ts
198
- function getXService(xChainType) {
199
- switch (xChainType) {
200
- case "BITCOIN":
201
- return BitcoinXService.getInstance();
202
- case "EVM":
203
- return EvmXService.getInstance();
204
- case "SUI":
205
- return SuiXService.getInstance();
206
- case "SOLANA":
207
- return SolanaXService.getInstance();
208
- case "ICON":
209
- return IconXService.getInstance();
210
- case "INJECTIVE":
211
- return InjectiveXService.getInstance();
212
- case "STELLAR":
213
- return StellarXService.getInstance();
214
- case "NEAR":
215
- return NearXService.getInstance();
216
- case "STACKS":
217
- return StacksXService.getInstance();
218
- default:
219
- throw new Error(`Unsupported chain type: ${xChainType}`);
220
- }
221
- }
222
-
223
- // src/core/XConnector.ts
224
- var XConnector = class {
225
- constructor(xChainType, name, id) {
226
- this.xChainType = xChainType;
227
- this.name = name;
228
- this._id = id;
229
- }
230
- /** Get the unique identifier for this connector */
231
- get id() {
232
- return this._id;
233
- }
234
- /** Get the optional icon URL for this wallet provider */
235
- get icon() {
236
- return this._icon;
237
- }
238
- };
239
- var isNativeToken = (xToken) => {
240
- const nativeAddresses = [
241
- "cx0000000000000000000000000000000000000000",
242
- "0x0000000000000000000000000000000000000000",
243
- "inj",
244
- "0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI",
245
- "hx0000000000000000000000000000000000000000",
246
- "11111111111111111111111111111111",
247
- // solana
248
- "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA",
249
- // stellar
250
- "ST000000000000000000002AMW42H.nativetoken",
251
- // stacks
252
- "0:0"
253
- // bitcoin
254
- ];
255
- return nativeAddresses.includes(xToken.address);
256
- };
257
- var getWagmiChainId = (xChainId) => {
258
- return types.baseChainInfo[xChainId].chainId;
259
- };
260
-
261
- // src/xchains/bitcoin/BitcoinXService.ts
262
- var BitcoinXService = class _BitcoinXService extends XService {
263
- constructor(rpcUrl = "https://mempool.space/api") {
264
- super("BITCOIN");
265
- this.rpcUrl = rpcUrl;
266
- }
267
- static getInstance(rpcUrl) {
268
- if (!_BitcoinXService.instance) {
269
- _BitcoinXService.instance = new _BitcoinXService(rpcUrl);
270
- } else if (rpcUrl && rpcUrl !== _BitcoinXService.instance.rpcUrl) {
271
- _BitcoinXService.instance.rpcUrl = rpcUrl;
272
- }
273
- return _BitcoinXService.instance;
274
- }
275
- async getBalance(address, xToken) {
276
- if (!address) return 0n;
277
- try {
278
- if (isNativeToken(xToken)) {
279
- const response = await fetch(`${this.rpcUrl}/address/${address}/utxo`);
280
- if (!response.ok) return 0n;
281
- const utxos = await response.json();
282
- const totalBalance = utxos.reduce((sum, utxo) => sum + utxo.value, 0);
283
- return BigInt(totalBalance);
284
- }
285
- } catch {
286
- return 0n;
287
- }
288
- return 0n;
289
- }
290
- };
291
-
292
- // src/xchains/bitcoin/BitcoinXConnector.ts
293
- var BitcoinXConnector = class extends XConnector {
294
- constructor(name, id) {
295
- super("BITCOIN", name, id);
296
- }
297
- getXService() {
298
- return BitcoinXService.getInstance();
299
- }
300
- };
301
- var UnisatWalletProvider = class {
302
- constructor(unisat, address) {
303
- this.unisat = unisat;
304
- this.cachedAddress = address;
305
- }
306
- async getWalletAddress() {
307
- try {
308
- const accounts = await this.unisat.getAccounts();
309
- if (accounts[0]) this.cachedAddress = accounts[0];
310
- } catch {
311
- }
312
- return this.cachedAddress;
313
- }
314
- async getPublicKey() {
315
- return this.unisat.getPublicKey();
316
- }
317
- async getAddressType(_address) {
318
- const address = await this.getWalletAddress();
319
- return types.detectBitcoinAddressType(address);
320
- }
321
- async signTransaction(psbtBase64, finalize = false) {
322
- const psbtHex = Buffer.from(psbtBase64, "base64").toString("hex");
323
- const signedHex = await this.unisat.signPsbt(psbtHex, { autoFinalized: finalize });
324
- return signedHex;
325
- }
326
- async signEcdsaMessage(message) {
327
- return this.unisat.signMessage(message, "ecdsa");
328
- }
329
- async signBip322Message(message) {
330
- return this.unisat.signMessage(message, "bip322-simple");
331
- }
332
- async sendBitcoin(toAddress, satoshis) {
333
- if (satoshis > BigInt(Number.MAX_SAFE_INTEGER)) {
334
- throw new Error(`Amount ${satoshis} satoshis exceeds safe integer range`);
335
- }
336
- return this.unisat.sendBitcoin(toAddress, Number(satoshis));
337
- }
338
- };
339
- var UnisatXConnector = class extends BitcoinXConnector {
340
- constructor() {
341
- super("Unisat", "unisat");
342
- }
343
- static isAvailable() {
344
- return typeof window !== "undefined" && !!window.unisat;
345
- }
346
- get icon() {
347
- return "https://avatars.githubusercontent.com/u/125119198?s=200&v=4";
348
- }
349
- async connect() {
350
- if (!window.unisat) {
351
- throw new Error("Unisat wallet is not installed");
352
- }
353
- const accounts = await window.unisat.requestAccounts();
354
- const address = accounts[0];
355
- if (!address) return void 0;
356
- this.walletProvider = new UnisatWalletProvider(window.unisat, address);
357
- return {
358
- address,
359
- xChainType: "BITCOIN"
360
- };
361
- }
362
- async disconnect() {
363
- this.walletProvider = void 0;
364
- }
365
- getWalletProvider() {
366
- return this.walletProvider;
367
- }
368
- recreateWalletProvider(xAccount) {
369
- if (!window.unisat || !xAccount.address) return void 0;
370
- return new UnisatWalletProvider(window.unisat, xAccount.address);
371
- }
372
- };
373
- var XverseWalletProvider = class {
374
- constructor(address, publicKey) {
375
- this.address = address;
376
- this.publicKey = publicKey;
377
- }
378
- async getWalletAddress() {
379
- return this.address;
380
- }
381
- async getPublicKey() {
382
- return this.publicKey;
383
- }
384
- async getAddressType(_address) {
385
- return types.detectBitcoinAddressType(this.address);
386
- }
387
- /**
388
- * Parse a base64-encoded PSBT to count the number of inputs.
389
- * Reads the unsigned transaction from the PSBT global section.
390
- */
391
- countPsbtInputs(psbtBase64) {
392
- const data = Buffer.from(psbtBase64, "base64");
393
- let offset = 5;
394
- const keyLen = data[offset++] ?? 0;
395
- if (keyLen !== 1 || data[offset++] !== 0) {
396
- return 1;
397
- }
398
- const firstByte = data[offset++] ?? 0;
399
- if (firstByte === 253) offset += 2;
400
- else if (firstByte === 254) offset += 4;
401
- else if (firstByte === 255) offset += 8;
402
- offset += 4;
403
- const inputByte = data[offset] ?? 0;
404
- if (inputByte < 253) return inputByte;
405
- return 1;
406
- }
407
- async signTransaction(psbtBase64, finalize = false) {
408
- const { request: request3 } = await import('sats-connect');
409
- const inputCount = this.countPsbtInputs(psbtBase64);
410
- const signingIndexes = Array.from({ length: inputCount }, (_, i) => i);
411
- const response = await request3("signPsbt", {
412
- psbt: psbtBase64,
413
- broadcast: false,
414
- signInputs: {
415
- [this.address]: signingIndexes
416
- }
417
- });
418
- if (response.status === "error") {
419
- throw new Error(response.error?.message || "Xverse PSBT signing failed");
420
- }
421
- const result = response.result;
422
- if (finalize) {
423
- return Buffer.from(result.psbt, "base64").toString("hex");
424
- }
425
- return result.psbt;
426
- }
427
- async signEcdsaMessage(message) {
428
- const { request: request3 } = await import('sats-connect');
429
- const response = await request3("signMessage", {
430
- address: this.address,
431
- message,
432
- protocol: satsConnect.MessageSigningProtocols.ECDSA
433
- });
434
- if (response.status === "error") {
435
- throw new Error(response.error?.message || "Xverse ECDSA signing failed");
436
- }
437
- return response.result.signature;
438
- }
439
- async signBip322Message(message) {
440
- const { request: request3 } = await import('sats-connect');
441
- const response = await request3("signMessage", {
442
- address: this.address,
443
- message,
444
- protocol: satsConnect.MessageSigningProtocols.BIP322
445
- });
446
- if (response.status === "error") {
447
- throw new Error(response.error?.message || "Xverse BIP322 signing failed");
448
- }
449
- return response.result.signature;
450
- }
451
- async sendBitcoin(toAddress, satoshis) {
452
- const { request: request3 } = await import('sats-connect');
453
- const response = await request3("sendTransfer", {
454
- recipients: [
455
- {
456
- address: toAddress,
457
- amount: Number(satoshis)
458
- }
459
- ]
460
- });
461
- if (response.status === "error") {
462
- throw new Error(response.error?.message || "Xverse sendTransfer failed");
463
- }
464
- return response.result.txid;
465
- }
466
- };
467
- var XVERSE_ADDRESS_TYPE_KEY = "xverse-address-type";
468
- var XverseXConnector = class _XverseXConnector extends BitcoinXConnector {
469
- constructor() {
470
- super("Xverse", "xverse");
471
- const saved = typeof window !== "undefined" ? localStorage.getItem(XVERSE_ADDRESS_TYPE_KEY) : null;
472
- this.addressPurpose = saved === "segwit" ? satsConnect.AddressPurpose.Payment : satsConnect.AddressPurpose.Ordinals;
473
- }
474
- /** Set address purpose and persist to localStorage. */
475
- setAddressPurpose(type) {
476
- this.addressPurpose = type === "taproot" ? satsConnect.AddressPurpose.Ordinals : satsConnect.AddressPurpose.Payment;
477
- if (typeof window !== "undefined") {
478
- localStorage.setItem(XVERSE_ADDRESS_TYPE_KEY, type);
479
- }
480
- }
481
- static isAvailable() {
482
- return typeof window !== "undefined" && !!window.BitcoinProvider;
483
- }
484
- get icon() {
485
- return "https://cdn.brandfetch.io/iddzGN5Rcv/w/400/h/400/theme/dark/icon.jpeg?c=1bxid64Mup7aczewSAYMX&t=1771902357797";
486
- }
487
- async connect() {
488
- if (!_XverseXConnector.isAvailable()) {
489
- throw new Error("Xverse wallet is not installed");
490
- }
491
- const { request: request3 } = await import('sats-connect');
492
- const response = await request3("getAccounts", {
493
- purposes: [this.addressPurpose],
494
- message: "Connect to Sodax"
495
- });
496
- if (response.status === "error") {
497
- throw new Error(response.error?.message || "Xverse connection failed");
498
- }
499
- const accounts = response.result;
500
- const paymentAccount = accounts.find((a) => a.purpose === this.addressPurpose) || accounts[0];
501
- if (!paymentAccount) return void 0;
502
- this.walletProvider = new XverseWalletProvider(
503
- paymentAccount.address,
504
- paymentAccount.publicKey
505
- );
506
- return {
507
- address: paymentAccount.address,
508
- publicKey: paymentAccount.publicKey,
509
- xChainType: "BITCOIN"
510
- };
511
- }
512
- async disconnect() {
513
- this.walletProvider = void 0;
514
- }
515
- getWalletProvider() {
516
- return this.walletProvider;
517
- }
518
- recreateWalletProvider(xAccount) {
519
- if (!xAccount.address || !xAccount.publicKey) return void 0;
520
- return new XverseWalletProvider(xAccount.address, xAccount.publicKey);
521
- }
522
- };
523
- var OKXWalletProvider = class {
524
- constructor(okx, address) {
525
- this.okx = okx;
526
- this.cachedAddress = address;
527
- }
528
- async getWalletAddress() {
529
- try {
530
- const accounts = await this.okx.getAccounts();
531
- if (accounts[0]) this.cachedAddress = accounts[0];
532
- } catch {
533
- }
534
- return this.cachedAddress;
535
- }
536
- async getPublicKey() {
537
- return this.okx.getPublicKey();
538
- }
539
- async getAddressType(_address) {
540
- const address = await this.getWalletAddress();
541
- return types.detectBitcoinAddressType(address);
542
- }
543
- async signTransaction(psbtBase64, finalize = false) {
544
- const psbtHex = Buffer.from(psbtBase64, "base64").toString("hex");
545
- return this.okx.signPsbt(psbtHex, { autoFinalized: finalize });
546
- }
547
- async signEcdsaMessage(message) {
548
- return this.okx.signMessage(message, "ecdsa");
549
- }
550
- async signBip322Message(message) {
551
- return this.okx.signMessage(message, "bip322-simple");
552
- }
553
- async sendBitcoin(toAddress, satoshis) {
554
- if (satoshis > BigInt(Number.MAX_SAFE_INTEGER)) {
555
- throw new Error(`Amount ${satoshis} satoshis exceeds safe integer range`);
556
- }
557
- return this.okx.sendBitcoin(toAddress, Number(satoshis));
558
- }
559
- };
560
- var OKXXConnector = class extends BitcoinXConnector {
561
- constructor() {
562
- super("OKX Wallet", "okx-bitcoin");
563
- }
564
- static isAvailable() {
565
- return typeof window !== "undefined" && !!window.okxwallet?.bitcoin;
566
- }
567
- get icon() {
568
- return "https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png";
569
- }
570
- async connect() {
571
- const okx = window.okxwallet?.bitcoin;
572
- if (!okx) {
573
- throw new Error("OKX wallet is not installed");
574
- }
575
- const { address } = await okx.connect();
576
- if (!address) return void 0;
577
- this.walletProvider = new OKXWalletProvider(okx, address);
578
- return {
579
- address,
580
- xChainType: "BITCOIN"
581
- };
582
- }
583
- async disconnect() {
584
- this.walletProvider = void 0;
585
- }
586
- getWalletProvider() {
587
- return this.walletProvider;
588
- }
589
- recreateWalletProvider(xAccount) {
590
- const okx = window.okxwallet?.bitcoin;
591
- if (!okx || !xAccount.address) return void 0;
592
- return new OKXWalletProvider(okx, xAccount.address);
593
- }
594
- };
595
- var hyper = /* @__PURE__ */ viem.defineChain({
596
- id: 999,
597
- name: "HyperEVM",
598
- nativeCurrency: {
599
- decimals: 18,
600
- name: "HYPE",
601
- symbol: "HYPE"
602
- },
603
- rpcUrls: {
604
- default: { http: ["https://rpc.hyperliquid.xyz/evm"] }
605
- },
606
- blockExplorers: {
607
- default: {
608
- name: "HyperEVMScan",
609
- url: "https://hyperevmscan.io/"
610
- }
611
- },
612
- contracts: {
613
- multicall3: {
614
- address: "0xcA11bde05977b3631167028862bE2a173976CA11",
615
- blockCreated: 13051
616
- }
617
- }
618
- });
619
- var createWagmiConfig = (config, options) => {
620
- return wagmi.createConfig({
621
- chains: [
622
- chains.mainnet,
623
- chains.avalanche,
624
- chains.arbitrum,
625
- chains.base,
626
- chains.bsc,
627
- chains.sonic,
628
- chains.optimism,
629
- chains.polygon,
630
- hyper,
631
- chains.lightlinkPhoenix,
632
- chains.kaia,
633
- chains.redbellyMainnet
634
- ],
635
- ssr: options?.ssr,
636
- transports: {
637
- [chains.mainnet.id]: wagmi.http(config[types.ETHEREUM_MAINNET_CHAIN_ID]),
638
- [chains.avalanche.id]: wagmi.http(config[types.AVALANCHE_MAINNET_CHAIN_ID]),
639
- [chains.arbitrum.id]: wagmi.http(config[types.ARBITRUM_MAINNET_CHAIN_ID]),
640
- [chains.base.id]: wagmi.http(config[types.BASE_MAINNET_CHAIN_ID]),
641
- [chains.bsc.id]: wagmi.http(config[types.BSC_MAINNET_CHAIN_ID]),
642
- [chains.sonic.id]: wagmi.http(config[types.SONIC_MAINNET_CHAIN_ID]),
643
- [chains.optimism.id]: wagmi.http(config[types.OPTIMISM_MAINNET_CHAIN_ID]),
644
- [chains.polygon.id]: wagmi.http(config[types.POLYGON_MAINNET_CHAIN_ID]),
645
- [hyper.id]: wagmi.http(config[types.HYPEREVM_MAINNET_CHAIN_ID]),
646
- [chains.lightlinkPhoenix.id]: wagmi.http(config[types.LIGHTLINK_MAINNET_CHAIN_ID]),
647
- [chains.redbellyMainnet.id]: wagmi.http(config[types.REDBELLY_MAINNET_CHAIN_ID]),
648
- [chains.kaia.id]: wagmi.http(config[types.KAIA_MAINNET_CHAIN_ID])
649
- },
650
- storage: wagmi.createStorage({
651
- storage: wagmi.cookieStorage,
652
- key: "sodax"
653
- })
654
- });
655
- };
656
- var EvmXService = class _EvmXService extends XService {
657
- constructor() {
658
- super("EVM");
659
- }
660
- getXConnectors() {
661
- return [];
662
- }
663
- static getInstance() {
664
- if (!_EvmXService.instance) {
665
- _EvmXService.instance = new _EvmXService();
666
- }
667
- return _EvmXService.instance;
668
- }
669
- // get erc20 token balance in a chain (evm chain only)
670
- async _getTokenBalance(address, chainId, tokenAddress) {
671
- const publicClient = actions.getPublicClient(this.wagmiConfig, { chainId });
672
- if (!publicClient) throw new Error("Public client not found");
673
- const balance = await publicClient.readContract({
674
- abi: viem.erc20Abi,
675
- address: tokenAddress,
676
- functionName: "balanceOf",
677
- args: [address]
678
- });
679
- return balance || 0n;
680
- }
681
- //get native balance of the chain (evm chain only)
682
- async _getChainBalance(address, chainId) {
683
- const balance = await actions.getPublicClient(this.wagmiConfig, { chainId })?.getBalance({
684
- address
685
- });
686
- return balance || 0n;
687
- }
688
- async getBalance(address, xToken) {
689
- if (!address) return 0n;
690
- if (!this.wagmiConfig) return 0n;
691
- const chainId = getWagmiChainId(xToken.xChainId);
692
- if (isNativeToken(xToken)) {
693
- return this._getChainBalance(address, chainId);
694
- }
695
- throw new Error(`Unsupported token: ${xToken.symbol}`);
696
- }
697
- async getBalances(address, xTokens) {
698
- if (!address) return {};
699
- if (!this.wagmiConfig) return {};
700
- const nativeTokenBalancePromises = xTokens.filter((xToken) => isNativeToken(xToken)).map(async (xToken) => {
701
- const balance = await this.getBalance(address, xToken);
702
- return { symbol: xToken.symbol, address: xToken.address, balance };
703
- });
704
- const nativeTokenBalances = await Promise.all(nativeTokenBalancePromises);
705
- const tokenMap = nativeTokenBalances.reduce((map, { address: address2, balance }) => {
706
- if (balance) map[address2] = balance;
707
- return map;
708
- }, {});
709
- const nonNativeXTokens = xTokens.filter((xToken) => !isNativeToken(xToken));
710
- const xChainId = xTokens[0].xChainId;
711
- const viemChain = this.wagmiConfig.chains.find((chain) => chain.id === getWagmiChainId(xChainId));
712
- const chainId = getWagmiChainId(xChainId);
713
- const publicClient = actions.getPublicClient(this.wagmiConfig, { chainId });
714
- if (!publicClient) throw new Error("Public client not found");
715
- if (viemChain?.contracts?.multicall3) {
716
- const result = await publicClient.multicall({
717
- contracts: nonNativeXTokens.map((token) => ({
718
- abi: viem.erc20Abi,
719
- address: token.address,
720
- functionName: "balanceOf",
721
- args: [address]
722
- }))
723
- });
724
- return nonNativeXTokens.reduce((acc, token, index) => {
725
- acc[token.address] = result?.[index]?.result?.toString() || "0";
726
- return acc;
727
- }, tokenMap);
728
- }
729
- const nonNativeTokenBalances = await Promise.all(
730
- nonNativeXTokens.map((token) => this._getTokenBalance(address, chainId, token.address))
731
- );
732
- return nonNativeXTokens.reduce((acc, token, idx) => {
733
- acc[token.address] = nonNativeTokenBalances[idx] || "0";
734
- return acc;
735
- }, tokenMap);
736
- }
737
- };
738
-
739
- // src/xchains/evm/EvmXConnector.ts
740
- var EvmXConnector = class extends XConnector {
741
- constructor(connector) {
742
- super("EVM", connector.name, connector.id);
743
- this.connector = connector;
744
- }
745
- async connect() {
746
- return;
747
- }
748
- async disconnect() {
749
- return;
750
- }
751
- get id() {
752
- return this.connector.id;
753
- }
754
- get icon() {
755
- return this.connector.icon;
756
- }
757
- };
758
- var InjectiveXService = class _InjectiveXService extends XService {
759
- constructor() {
760
- super("INJECTIVE");
761
- const endpoints = networks.getNetworkEndpoints(networks.Network.Mainnet);
762
- this.walletStrategy = new walletStrategy.WalletStrategy({
763
- chainId: tsTypes.ChainId.Mainnet,
764
- strategies: {},
765
- evmOptions: {
766
- evmChainId: chains.mainnet.id,
767
- rpcUrl: chains.mainnet.rpcUrls.default.http[0]
768
- }
769
- });
770
- this.indexerGrpcAccountPortfolioApi = new sdkTs.IndexerGrpcAccountPortfolioApi(endpoints.indexer);
771
- this.chainGrpcWasmApi = new sdkTs.ChainGrpcWasmApi(endpoints.grpc);
772
- this.msgBroadcaster = new walletCore.MsgBroadcaster({
773
- walletStrategy: this.walletStrategy,
774
- network: networks.Network.Mainnet,
775
- endpoints
776
- });
777
- }
778
- static getInstance() {
779
- if (!_InjectiveXService.instance) {
780
- _InjectiveXService.instance = new _InjectiveXService();
781
- }
782
- return _InjectiveXService.instance;
783
- }
784
- async getBalance(address, xToken) {
785
- if (!address) return 0n;
786
- const portfolio = await this.indexerGrpcAccountPortfolioApi.fetchAccountPortfolioBalances(address);
787
- const xTokenAddress = xToken.address;
788
- const balance = portfolio.bankBalancesList.find((_balance) => _balance.denom === xTokenAddress);
789
- if (balance) {
790
- return BigInt(balance.amount);
791
- }
792
- return 0n;
793
- }
794
- };
795
- var WALLET_ICONS = {
796
- metamask: "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/metamask.svg",
797
- keplr: "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/keplr.svg",
798
- leap: "https://assets.leapwallet.io/logos/leap-cosmos-logo.svg",
799
- rabby: "https://raw.githubusercontent.com/RabbyHub/logo/master/symbol.svg",
800
- phantom: "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/phantom.svg",
801
- "okx-wallet": "https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png",
802
- "trust-wallet": "https://trustwallet.com/assets/images/media/assets/twLogo.svg"
803
- };
804
- var InjectiveXConnector = class extends XConnector {
805
- constructor(name, wallet) {
806
- super("INJECTIVE", name, wallet);
807
- this.wallet = wallet;
808
- }
809
- getXService() {
810
- return InjectiveXService.getInstance();
811
- }
812
- async connect() {
813
- if (walletBase.isCosmosBrowserWallet(this.wallet) && !walletCosmos.isCosmosWalletInstalled(this.wallet)) {
814
- return void 0;
815
- }
816
- const walletStrategy = this.getXService().walletStrategy;
817
- await walletStrategy.setWallet(this.wallet);
818
- const addresses = await walletStrategy.getAddresses();
819
- if (!addresses?.length) return void 0;
820
- const address = walletBase.isEvmBrowserWallet(this.wallet) ? sdkTs.getInjectiveAddress(addresses[0]) : addresses[0];
821
- return {
822
- address,
823
- xChainType: this.xChainType
824
- };
825
- }
826
- async disconnect() {
827
- if (walletBase.isEvmBrowserWallet(this.wallet)) {
828
- const walletStrategy = this.getXService().walletStrategy;
829
- await walletStrategy.setWallet(this.wallet);
830
- await walletStrategy.disconnect();
831
- }
832
- }
833
- get icon() {
834
- return WALLET_ICONS[this.wallet];
835
- }
836
- };
837
- var SolanaXService = class _SolanaXService extends XService {
838
- constructor() {
839
- super("SOLANA");
840
- }
841
- static getInstance() {
842
- if (!_SolanaXService.instance) {
843
- _SolanaXService.instance = new _SolanaXService();
844
- }
845
- return _SolanaXService.instance;
846
- }
847
- async getBalance(address, xToken) {
848
- if (!address) return BigInt(0);
849
- const connection = this.connection;
850
- if (!connection) {
851
- return BigInt(0);
852
- }
853
- try {
854
- if (isNativeToken(xToken)) {
855
- const newBalance = await connection.getBalance(new web3_js.PublicKey(address));
856
- return BigInt(newBalance);
857
- }
858
- const tokenAccountPubkey = splToken.getAssociatedTokenAddressSync(new web3_js.PublicKey(xToken.address), new web3_js.PublicKey(address));
859
- const tokenAccount = await splToken.getAccount(connection, tokenAccountPubkey);
860
- return BigInt(tokenAccount.amount);
861
- } catch {
862
- return BigInt(0);
863
- }
864
- }
865
- };
866
- var CustomSorobanServer = class extends StellarSdk.SorobanRpc.Server {
867
- constructor(serverUrl, customHeaders) {
868
- super(serverUrl, {
869
- allowHttp: true
870
- });
871
- this.customHeaders = customHeaders;
872
- }
873
- async simulateTransaction(tx) {
874
- const requestOptions = {
875
- method: "POST",
876
- headers: {
877
- "Content-Type": "application/json",
878
- ...this.customHeaders
879
- },
880
- body: JSON.stringify({
881
- id: 1,
882
- jsonrpc: "2.0",
883
- method: "simulateTransaction",
884
- params: {
885
- transaction: tx.toXDR()
886
- }
887
- })
888
- };
889
- const response = await fetch(`${this.serverURL}`, requestOptions);
890
- if (!response.ok) {
891
- throw new Error(`HTTP error simulating TX! status: ${response.status}`);
892
- }
893
- return response.json().then((json) => json.result);
894
- }
895
- async sendTransaction(tx) {
896
- const requestOptions = {
897
- method: "POST",
898
- headers: {
899
- "Content-Type": "application/json",
900
- ...this.customHeaders
901
- },
902
- body: JSON.stringify({
903
- id: 1,
904
- jsonrpc: "2.0",
905
- method: "sendTransaction",
906
- params: {
907
- transaction: tx.toXDR()
908
- }
909
- })
910
- };
911
- const response = await fetch(`${this.serverURL}`, requestOptions);
912
- if (!response.ok) {
913
- throw new Error(`HTTP error submitting TX! status: ${response.status}`);
914
- }
915
- return response.json().then((json) => json.result);
916
- }
917
- async getTransaction(hash) {
918
- const requestOptions = {
919
- method: "POST",
920
- headers: {
921
- "Content-Type": "application/json",
922
- ...this.customHeaders
923
- },
924
- body: JSON.stringify({
925
- id: 1,
926
- jsonrpc: "2.0",
927
- method: "getTransaction",
928
- params: { hash }
929
- })
930
- };
931
- const response = await fetch(`${this.serverURL}`, requestOptions);
932
- if (!response.ok) {
933
- throw new Error(`HTTP error getting TX! status: ${response.status}`);
934
- }
935
- return response.json().then((json) => json.result);
936
- }
937
- };
938
- var CustomSorobanServer_default = CustomSorobanServer;
939
- var accountToScVal = (account) => new StellarSdk.Address(account).toScVal();
940
- var simulateTx = async (tx, server) => {
941
- const response = await server.simulateTransaction(tx);
942
- if (response !== void 0) {
943
- return response;
944
- }
945
- throw new Error("cannot simulate transaction");
946
- };
947
- var getTokenBalance = async (address, tokenId, txBuilder, server) => {
948
- const params = [accountToScVal(address)];
949
- const contract = new StellarSdk.Contract(tokenId);
950
- const tx = txBuilder.addOperation(contract.call("balance", ...params)).setTimeout(StellarSdk.TimeoutInfinite).build();
951
- const result = await simulateTx(tx, server);
952
- return result.results ? StellarSdk.scValToBigInt(StellarSdk.xdr.ScVal.fromXDR(result.results[0].xdr, "base64")) : 0n;
953
- };
954
-
955
- // src/xchains/stellar/StellarXService.ts
956
- var STELLAR_BASE_RESERVE_STROOPS = 5e6;
957
- function parseXlmBalanceToStroops(balanceStr) {
958
- const parts = balanceStr.split(".");
959
- const whole = parts[0] ?? "0";
960
- const frac = (parts[1] ?? "").padEnd(7, "0").slice(0, 7);
961
- return BigInt(whole + frac);
962
- }
963
- var StellarXService = class _StellarXService extends XService {
964
- constructor() {
965
- super("STELLAR");
966
- this.walletsKit = new stellarWalletsKit.StellarWalletsKit({
967
- network: stellarWalletsKit.WalletNetwork.PUBLIC,
968
- modules: stellarWalletsKit.allowAllModules()
969
- });
970
- this.server = new StellarSdk__namespace.Horizon.Server("https://horizon.stellar.org", { allowHttp: true });
971
- this.sorobanServer = new CustomSorobanServer_default("https://rpc.ankr.com/stellar_soroban", {});
972
- }
973
- static getInstance() {
974
- if (!_StellarXService.instance) {
975
- _StellarXService.instance = new _StellarXService();
976
- }
977
- return _StellarXService.instance;
978
- }
979
- async getBalance(address, xToken) {
980
- if (!address) return BigInt(0);
981
- const stellarAccount = await this.server.loadAccount(address);
982
- if (xToken.symbol === "XLM") {
983
- const xlmBalance = stellarAccount.balances.find((balance) => balance.asset_type === "native");
984
- if (xlmBalance) {
985
- const rawBalanceStroops = parseXlmBalanceToStroops(xlmBalance.balance);
986
- const sellingLiabilitiesStroops = xlmBalance.selling_liabilities ? parseXlmBalanceToStroops(xlmBalance.selling_liabilities) : BigInt(0);
987
- const reserveFields = stellarAccount;
988
- const subentryCount = reserveFields.subentry_count ?? 0;
989
- const numSponsoring = reserveFields.num_sponsoring ?? 0;
990
- const numSponsored = reserveFields.num_sponsored ?? 0;
991
- const reserveCount = Math.max(0, 2 + subentryCount + numSponsoring - numSponsored);
992
- const minBalanceStroops = BigInt(reserveCount) * BigInt(STELLAR_BASE_RESERVE_STROOPS) + sellingLiabilitiesStroops;
993
- const availableStroops = rawBalanceStroops > minBalanceStroops ? rawBalanceStroops - minBalanceStroops : BigInt(0);
994
- return availableStroops;
995
- }
996
- } else {
997
- try {
998
- const txBuilder = new StellarSdk__namespace.TransactionBuilder(stellarAccount, {
999
- fee: StellarSdk__namespace.BASE_FEE,
1000
- networkPassphrase: StellarSdk__namespace.Networks.PUBLIC
1001
- });
1002
- const balance = await getTokenBalance(address, xToken.address, txBuilder, this.sorobanServer);
1003
- return balance;
1004
- } catch (e) {
1005
- console.error(`Error while fetching token on Stellar: ${xToken.symbol}, Error: ${e}`);
1006
- }
1007
- }
1008
- return BigInt(0);
1009
- }
1010
- };
1011
-
1012
- // src/xchains/stellar/StellarWalletsKitXConnector.ts
1013
- var StellarWalletsKitXConnector = class extends XConnector {
1014
- constructor(wallet) {
1015
- super("STELLAR", wallet.name, wallet.id);
1016
- this._wallet = wallet;
1017
- }
1018
- getXService() {
1019
- return StellarXService.getInstance();
1020
- }
1021
- async connect() {
1022
- const kit = this.getXService().walletsKit;
1023
- if (!this._wallet) {
1024
- return;
1025
- }
1026
- if (!this._wallet.isAvailable && this._wallet.url) {
1027
- window.open(this._wallet.url, "_blank");
1028
- return;
1029
- }
1030
- kit.setWallet(this._wallet.id);
1031
- const { address } = await kit.getAddress();
1032
- return {
1033
- address,
1034
- xChainType: this.xChainType
1035
- };
1036
- }
1037
- async disconnect() {
1038
- }
1039
- get icon() {
1040
- return this._wallet.icon;
1041
- }
1042
- };
1043
-
1044
- // src/xchains/sui/SuiXService.ts
1045
- var SuiXService = class _SuiXService extends XService {
1046
- // TODO: define suiAccount type
1047
- constructor() {
1048
- super("SUI");
1049
- }
1050
- static getInstance() {
1051
- if (!_SuiXService.instance) {
1052
- _SuiXService.instance = new _SuiXService();
1053
- }
1054
- return _SuiXService.instance;
1055
- }
1056
- // getBalance is not used because getBalances uses getAllBalances which returns all balances
1057
- async getBalances(address, xTokens) {
1058
- if (!address) return {};
1059
- try {
1060
- const balancePromises = xTokens.map(async (xToken) => {
1061
- let coinType = isNativeToken(xToken) ? "0x2::sui::SUI" : xToken.address;
1062
- if (coinType === "0x03917a812fe4a6d6bc779c5ab53f8a80ba741f8af04121193fc44e0f662e2ceb::balanced_dollar::BALANCED_DOLLAR") {
1063
- coinType = "0x3917a812fe4a6d6bc779c5ab53f8a80ba741f8af04121193fc44e0f662e2ceb::balanced_dollar::BALANCED_DOLLAR";
1064
- }
1065
- const balance = await this.suiClient.getBalance({
1066
- owner: address,
1067
- coinType
1068
- });
1069
- return {
1070
- address: xToken.address,
1071
- balance: balance ? BigInt(balance.totalBalance) : void 0
1072
- };
1073
- });
1074
- const results = await Promise.all(balancePromises);
1075
- const tokenMap = {};
1076
- results.forEach((result) => {
1077
- if (result.balance !== void 0) {
1078
- tokenMap[result.address] = result.balance;
1079
- }
1080
- });
1081
- return tokenMap;
1082
- } catch (e) {
1083
- console.log("error", e);
1084
- return {};
1085
- }
1086
- }
1087
- };
1088
-
1089
- // src/xchains/sui/SuiXConnector.ts
1090
- var SuiXConnector = class extends XConnector {
1091
- constructor(wallet) {
1092
- super("SUI", wallet?.name, wallet?.name);
1093
- this.wallet = wallet;
1094
- }
1095
- getXService() {
1096
- return SuiXService.getInstance();
1097
- }
1098
- async connect() {
1099
- return;
1100
- }
1101
- async disconnect() {
1102
- }
1103
- get icon() {
1104
- return this.wallet?.icon;
1105
- }
1106
- };
1107
- var IconSdk = "default" in IconSdkRaw__namespace.default ? IconSdkRaw__namespace.default : IconSdkRaw__namespace;
1108
- var { IconService: IconServiceConstructor, Builder: IconBuilder, Converter: IconConverter } = IconSdk;
1109
- var CHAIN_INFO = {
1110
- [1 /* MAINNET */]: {
1111
- APIEndpoint: "https://ctz.solidwallet.io/api/v3"}
1112
- };
1113
- var IconXService = class _IconXService extends XService {
1114
- constructor() {
1115
- super("ICON");
1116
- this.iconService = new IconServiceConstructor(
1117
- new IconServiceConstructor.HttpProvider(CHAIN_INFO[1 /* MAINNET */].APIEndpoint)
1118
- );
1119
- }
1120
- static getInstance() {
1121
- if (!_IconXService.instance) {
1122
- _IconXService.instance = new _IconXService();
1123
- }
1124
- return _IconXService.instance;
1125
- }
1126
- async getAggregateData(requireSuccess, calls) {
1127
- const rawTx = new IconBuilder.CallBuilder().to("cxa4aa9185e23558cff990f494c1fd2845f6cbf741").method("tryAggregate").params({ requireSuccess: IconConverter.toHex(requireSuccess ? 1 : 0), calls }).build();
1128
- try {
1129
- const result = await this.iconService.call(rawTx).execute();
1130
- const aggs = result["returnData"];
1131
- const data = aggs.map((agg) => {
1132
- if (agg["success"] === "0x0") {
1133
- return null;
1134
- }
1135
- return agg["returnData"];
1136
- });
1137
- return data;
1138
- } catch (err) {
1139
- console.error(err);
1140
- return Array(calls.length).fill(null);
1141
- }
1142
- }
1143
- async getBalances(address, xTokens) {
1144
- if (!address) return {};
1145
- const balances = {};
1146
- const nativeXToken = xTokens.find((xToken) => isNativeToken(xToken));
1147
- const nonNativeXTokens = xTokens.filter((xToken) => !isNativeToken(xToken));
1148
- if (nativeXToken) {
1149
- const balance = await this.iconService.getBalance(address).execute();
1150
- balances[nativeXToken.address] = BigInt(balance.toFixed());
1151
- }
1152
- const cds = nonNativeXTokens.map((token) => {
1153
- return {
1154
- target: token.address,
1155
- method: "balanceOf",
1156
- params: [address]
1157
- };
1158
- });
1159
- const data = await this.getAggregateData(
1160
- false,
1161
- cds.filter((cd) => cd.target.startsWith("cx"))
1162
- );
1163
- return nonNativeXTokens.reduce((agg, token, idx) => {
1164
- const balance = data[idx];
1165
- balances[token.address] = BigInt(balance);
1166
- return agg;
1167
- }, balances);
1168
- }
1169
- };
1170
-
1171
- // src/xchains/icon/iconex/index.tsx
1172
- var ICONEX_RELAY_RESPONSE = "ICONEX_RELAY_RESPONSE";
1173
- var ICONEX_RELAY_REQUEST = "ICONEX_RELAY_REQUEST";
1174
- var request = (event) => {
1175
- return new Promise((resolve, reject) => {
1176
- const handler = (evt) => {
1177
- window.removeEventListener(ICONEX_RELAY_RESPONSE, handler);
1178
- resolve(evt.detail);
1179
- };
1180
- window.addEventListener(ICONEX_RELAY_RESPONSE, handler);
1181
- window.dispatchEvent(
1182
- new CustomEvent(ICONEX_RELAY_REQUEST, {
1183
- detail: event
1184
- })
1185
- );
1186
- });
1187
- };
1188
-
1189
- // src/xchains/icon/IconHanaXConnector.ts
1190
- var IconHanaXConnector = class extends XConnector {
1191
- constructor() {
1192
- super("ICON", "Hana Wallet", "hana");
1193
- }
1194
- async connect() {
1195
- const { hanaWallet } = window;
1196
- if (window && !hanaWallet && !hanaWallet?.isAvailable) {
1197
- window.open("https://chromewebstore.google.com/detail/hana-wallet/jfdlamikmbghhapbgfoogdffldioobgl", "_blank");
1198
- return;
1199
- }
1200
- const detail = await request({
1201
- type: "REQUEST_ADDRESS" /* REQUEST_ADDRESS */
1202
- });
1203
- if (detail?.type === "RESPONSE_ADDRESS" /* RESPONSE_ADDRESS */) {
1204
- return {
1205
- address: detail?.payload,
1206
- xChainType: this.xChainType
1207
- };
1208
- }
1209
- return void 0;
1210
- }
1211
- async disconnect() {
1212
- console.log("HanaIconXConnector disconnected");
1213
- }
1214
- get icon() {
1215
- return "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/hana.svg";
1216
- }
1217
- };
1218
- function getProviderFromId(id) {
1219
- return id.split(".").reduce((acc, part) => acc?.[part], window);
1220
- }
1221
- var StacksXConnector = class extends XConnector {
1222
- constructor(config) {
1223
- super("STACKS", config.name, config.id);
1224
- this.config = config;
1225
- }
1226
- async connect() {
1227
- const provider = this.getProvider();
1228
- if (!provider) {
1229
- if (this.config.installUrl) {
1230
- window.open(this.config.installUrl, "_blank");
1231
- }
1232
- return void 0;
1233
- }
1234
- const response = await connect.request({ provider }, "stx_getAddresses");
1235
- const stxAddress = response.addresses.find((a) => a.purpose === "stacks");
1236
- if (!stxAddress) {
1237
- return void 0;
1238
- }
1239
- return {
1240
- address: stxAddress.address,
1241
- xChainType: this.xChainType
1242
- };
1243
- }
1244
- async disconnect() {
1245
- connect.disconnect();
1246
- }
1247
- get icon() {
1248
- return this.config.icon;
1249
- }
1250
- getProvider() {
1251
- return getProviderFromId(this.config.id);
1252
- }
1253
- };
1254
-
1255
- // src/xchains/stacks/constants.ts
1256
- var LEATHER_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYuODM4NyIgZmlsbD0iIzEyMTAwRiIvPgo8cGF0aCBkPSJNNzQuOTE3MSA1Mi43MTE0QzgyLjQ3NjYgNTEuNTQwOCA5My40MDg3IDQzLjU4MDQgOTMuNDA4NyAzNy4zNzYxQzkzLjQwODcgMzUuNTAzMSA5MS44OTY4IDM0LjIxNTQgODkuNjg3MSAzNC4yMTU0Qzg1LjUwMDQgMzQuMjE1NCA3OC40MDYxIDQwLjUzNjggNzQuOTE3MSA1Mi43MTE0Wk0zOS45MTEgODMuNDk5MUMzMC4wMjU2IDgzLjQ5OTEgMjkuMjExNSA5My4zMzI0IDM5LjA5NjkgOTMuMzMyNEM0My41MTYzIDkzLjMzMjQgNDguODY2MSA5MS41NzY0IDUxLjY1NzMgODguNDE1N0M0Ny41ODY4IDg0LjkwMzggNDQuMjE0MSA4My40OTkxIDM5LjkxMSA4My40OTkxWk0xMDIuODI5IDc5LjI4NDhDMTAzLjQxIDk1Ljc5MDcgOTUuMDM2OSAxMDUuMDM5IDgwLjg0ODQgMTA1LjAzOUM3Mi40NzQ4IDEwNS4wMzkgNjguMjg4MSAxMDEuODc4IDU5LjMzMyA5Ni4wMjQ5QzU0LjY4MSAxMDEuMTc2IDQ1Ljg0MjMgMTA1LjAzOSAzOC41MTU0IDEwNS4wMzlDMTMuMjc4NSAxMDUuMDM5IDE0LjMyNTIgNzIuODQ2MyA0MC4wMjczIDcyLjg0NjNDNDUuMzc3MSA3Mi44NDYzIDQ5LjkxMjggNzQuMjUxMSA1NS43Mjc3IDc3Ljg4TDU5LjU2NTYgNjQuNDE3N0M0My43NDg5IDYwLjA4NjQgMzUuODQwNSA0Ny45MTE4IDQzLjYzMjYgMzAuNDY5M0g1Ni4xOTI5QzQ5LjIxNSA0Mi4wNTg2IDUzLjk4MzIgNTEuNjU3OCA2Mi44MjIgNTIuNzExNEM2Ny41OTAzIDM1LjczNzIgNzcuODI0NiAyMi41MDkgOTEuNDMxNiAyMi41MDlDOTkuMTA3NCAyMi41MDkgMTA1LjE1NSAyNy41NDI4IDEwNS4xNTUgMzYuNjczN0MxMDUuMTU1IDUxLjMwNjYgODYuMDgxOSA2My4yNDcxIDcxLjY2MDcgNjQuNDE3N0w2NS43Mjk1IDg1LjM3MjFDNzIuNDc0OCA5My4yMTUzIDkxLjE5OSAxMDAuODI0IDkxLjE5OSA3OS4yODQ4SDEwMi44MjlaIiBmaWxsPSIjRjVGMUVEIi8+Cjwvc3ZnPgo=";
1257
- var XVERSE_ICON = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MDAiIGhlaWdodD0iNjAwIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGZpbGw9IiMxNzE3MTciIGQ9Ik0wIDBoNjAwdjYwMEgweiIvPjxwYXRoIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgZD0iTTQ0MCA0MzUuNHYtNTFjMC0yLS44LTMuOS0yLjItNS4zTDIyMCAxNjIuMmE3LjYgNy42IDAgMCAwLTUuNC0yLjJoLTUxLjFjLTIuNSAwLTQuNiAyLTQuNiA0LjZ2NDcuM2MwIDIgLjggNCAyLjIgNS40bDc4LjIgNzcuOGE0LjYgNC42IDAgMCAxIDAgNi41bC03OSA3OC43Yy0xIC45LTEuNCAyLTEuNCAzLjJ2NTJjMCAyLjQgMiA0LjUgNC42IDQuNUgyNDljMi42IDAgNC42LTIgNC42LTQuNlY0MDVjMC0xLjIuNS0yLjQgMS40LTMuM2w0Mi40LTQyLjJhNC42IDQuNiAwIDAgMSA2LjQgMGw3OC43IDc4LjRhNy42IDcuNiAwIDAgMCA1LjQgMi4yaDQ3LjVjMi41IDAgNC42LTIgNC42LTQuNloiLz48cGF0aCBmaWxsPSIjRUU3QTMwIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGQ9Ik0zMjUuNiAyMjcuMmg0Mi44YzIuNiAwIDQuNiAyLjEgNC42IDQuNnY0Mi42YzAgNCA1IDYuMSA4IDMuMmw1OC43LTU4LjVjLjgtLjggMS4zLTIgMS4zLTMuMnYtNTEuMmMwLTIuNi0yLTQuNi00LjYtNC42TDM4NCAxNjBjLTEuMiAwLTIuNC41LTMuMyAxLjNsLTU4LjQgNTguMWE0LjYgNC42IDAgMCAwIDMuMiA3LjhaIi8+PC9nPjwvc3ZnPg==";
1258
- var ASIGNA_ICON = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMDEwMCIgZD0iTTAgMGgzMnYzMkgweiIvPjxwYXRoIGZpbGw9InVybCgjYSkiIGQ9Ik0xNS4xMSA1LjU1YTMgMyAwIDAgMC0xLjgyIDEuM2wtLjA1LjA4LS40My43Mi0uMDcuMTEtLjUuODUtLjA1LjA5LTEuMjkgMi4xOC0uMDQuMDctLjQ3LjgtLjA2LjEtLjQ2Ljc4LS4wNy4xMS0xLjYzIDIuNzYtLjA3LjExLS4zOC42Ni0uMDUuMDgtLjczIDEuMjQtLjM1LjYtLjQuNjctLjA1LjA5TDUuMSAyMC43bC0uMTEuMTgtLjE0LjIzLS4wNy4xMy0uMzMuNTUtLjA0LjA3di4wMWExLjI2IDEuMjYgMCAwIDAtLjE0LjQ3IDEuMzEgMS4zMSAwIDAgMCAxLjI0IDEuNGgxLjVsLjA1LS4wNi4wNC0uMDYuODctMS4yMS4wNS0uMDguNzctMS4wNy4wNS0uMDcuNC0uNTcuMDUtLjA2LjI0LS4zNGExLjUyIDEuNTIgMCAwIDEgMS4zOS0uNjIgMS41IDEuNSAwIDAgMSAuNjQuMiAxLjQ3IDEuNDcgMCAwIDEgLjczIDEuMjcgMS40NCAxLjQ0IDAgMCAxLS4yNy44NGwtLjYzLjg4LS4wNS4wNy0uMzIuNDUtLjA2LjA4LS4wOC4xMi0uMTIuMTYtLjA1LjA4aDIuMTNhMi4zMiAyLjMyIDAgMCAwIDEuNzctLjk2bDEuMTgtMS42My43Ny0xLjA4IDEuMy0xLjhhMS4yNCAxLjI0IDAgMCAxIC41NS0uNDNsLjA4LS4wM2ExLjMgMS4zIDAgMCAxIC4zLS4wNiAxLjI4IDEuMjggMCAwIDEgMS4xNS41NGwuMTEuMmExLjEzIDEuMTMgMCAwIDEgLjEuNDEgMS4xOSAxLjE5IDAgMCAxLS4yMy43N2wtLjAzLjA1LS41Ny44LS43Ljk4LS4yNy4zN2ExLjIyIDEuMjIgMCAwIDAtLjIuNSAxLjA1IDEuMDUgMCAwIDAtLjAyLjIzdi4wNmExLjE3IDEuMTcgMCAwIDAgLjE0LjQzbC4wMi4wNS4wNy4xYTEuNDQgMS40NCAwIDAgMCAuMS4xMWwuMDUuMDYuMDEuMDFhMS44IDEuOCAwIDAgMCAuMTQuMWMwIC4wMi4wMi4wMy4wNC4wM2ExIDEgMCAwIDAgLjA4LjA1bC4wNy4wNGExLjI1IDEuMjUgMCAwIDAgLjUuMWg2LjljLjEgMCAuMi0uMDEuMjktLjAzbC4wNi0uMDJhMS4yNyAxLjI3IDAgMCAwIC4yNy0uMS41Ny41NyAwIDAgMCAuMDctLjAzIDEuMjEgMS4yMSAwIDAgMCAuMjYtLjE5bC4wOC0uMDdhLjkyLjkyIDAgMCAwIC4xNS0uMTkgMS41NSAxLjU1IDAgMCAwIC4wOS0uMTdsLjAyLS4wNWExLjIyIDEuMjIgMCAwIDAgLjA4LS4yNnYtLjA0bC4wMi0uMDh2LS4wOGExLjMyIDEuMzIgMCAwIDAtLjItLjc0bC0xLjYtMi42NC0uMDYtLjEtLjItLjMyLS4zMy0uNTR2LS4wMWwtLjA1LS4wOC0xLjMtMi4xNS0uMDctLjEtLjA0LS4wNi0uOC0xLjMyLS4wNC0uMDctLjItLjM0LS4xLS4xNC0uMS0uMTYtLjUzLS45LS4xMy0uMi0uMDktLjE0LTIuMTctMy41Ny0uMDQtLjA3LS43Mi0xLjE5LS4wNS0uMDctLjQtLjY1YTIuNjUgMi42NSAwIDAgMC0uMy0uNCAyLjk2IDIuOTYgMCAwIDAtLjk3LS43NCAzLjA0IDMuMDQgMCAwIDAtMS4zLS4zYy0uMjUgMC0uNS4wNC0uNzQuMVoiLz48cGF0aCBmaWxsPSJ1cmwoI2IpIiBkPSJNMTkgMTYuM2E1LjQ1IDUuNDUgMCAwIDAtLjgzIDEuNTZsLS4wNC4xNWExLjM2IDEuMzYgMCAwIDEgLjI4LS4xNiAxLjI0IDEuMjQgMCAwIDEgLjM4LS4wOGguMWExLjI4IDEuMjggMCAwIDEgMS4wNS41NGMuMDQuMDYuMDguMTMuMS4yYTEuMjQgMS4yNCAwIDAgMSAuMDkuMjcgMS4xOSAxLjE5IDAgMCAxLS4yLjkxbC0uMDQuMDUtLjU3Ljc5LS43Ljk5LS4yNy4zN2ExLjIzIDEuMjMgMCAwIDAtLjIuNDIgMS4wNiAxLjA2IDAgMCAwLS4wMi4zMXYuMDZhMS4xNyAxLjE3IDAgMCAwIC4xNi40Ny45My45MyAwIDAgMCAuMDcuMSAxLjUgMS41IDAgMCAwIC4xLjEybC4wNS4wNmguMDFhMS45NCAxLjk0IDAgMCAwIC4wOS4wOCAxIDEgMCAwIDAgLjE3LjFsLjA3LjA0YTEuMjUgMS4yNSAwIDAgMCAuNS4xaDYuOWMuMSAwIC4yIDAgLjI4LS4wMmwuMDctLjAyYTEuMzIgMS4zMiAwIDAgMCAuMzQtLjEzbC4xNi0uMS4wMy0uMDNhMS4yOSAxLjI5IDAgMCAwIC4yLS4yIDIuNDMgMi40MyAwIDAgMCAuMTItLjE3Yy4wMy0uMDMuMDUtLjA4LjA3LS4xMmwuMDItLjA1YTEuMjEgMS4yMSAwIDAgMCAuMDktLjN2LS4wOGwuMDEtLjA5YTEuMzIgMS4zMiAwIDAgMC0uMi0uNzNsLTEuNi0yLjY0LS4wNi0uMS0uMi0uMzItLjMzLS41NHYtLjAybC0uMDUtLjA3LTEuMy0yLjE1LS4xMi0uMDctLjA3LS4wNGE0Ljk0IDQuOTQgMCAwIDAtMi40Ni0uNjdjLTEuMDMgMC0xLjc2LjU3LTIuMjYgMS4yWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMi4yOSAyMS4wOGMwIC4yOS0uMDkuNTgtLjI3Ljg0bC0xLjMxIDEuODRIN2wyLjUyLTMuNTNhMS41NCAxLjU0IDAgMCAxIDIuMS0uMzZjLjQzLjI4LjY2Ljc0LjY2IDEuMloiLz48cGF0aCBmaWxsPSIjMDAwIiBkPSJNMTEuMTYgMjEuMjVhLjU2LjU2IDAgMCAxLS41Ny41NS41Ni41NiAwIDAgMS0uNTctLjU2LjU2LjU2IDAgMCAxIC41Ny0uNTUuNTYuNTYgMCAwIDEgLjU3LjU2WiIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjE1LjIzIiB4Mj0iMTkuMyIgeTE9IjI1Ljc4IiB5Mj0iNi4xMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM2NTIyRjQiLz48c3RvcCBvZmZzZXQ9Ii41NSIgc3RvcC1jb2xvcj0iIzlCNkJGRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0E1ODVGRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMjIuNTkiIHgyPSIyNC44IiB5MT0iMjQuNzEiIHkyPSIxNS41MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM0MjFGOEIiLz48c3RvcCBvZmZzZXQ9Ii41NSIgc3RvcC1jb2xvcj0iIzcyMzBGRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzk3NzNGRiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvc3ZnPg==";
1259
- var FORDEFI_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZmlsbD0iIzEwMTExNCIgZD0iTTAgMGg0MnY0MkgweiIvPgogIDxwYXRoIGQ9Ik0xOS40NyAyNi44OUg1djMuNTdhNC41NyA0LjU3IDAgMCAwIDQuNTggNC41N2g1LjgzbDQuMDYtOC4xNFoiIGZpbGw9IiM3OTk0RkYiLz4KICA8cGF0aCBkPSJNNSAxNy40aDI3LjU4bC0zLjIgNi43OEg1VjE3LjRaIiBmaWxsPSIjNDg2REZGIi8+CiAgPHBhdGggZD0iTTE0LjY3IDdINXY3LjY4aDMzVjdoLTkuNjd2NS43NGgtMlY3aC05LjY3djUuNzRoLTEuOTlWN1oiIGZpbGw9IiM1Q0QxRkEiLz4KPC9zdmc+Cg==";
1260
- var STACKS_PROVIDERS = [
1261
- {
1262
- id: "LeatherProvider",
1263
- name: "Leather",
1264
- icon: LEATHER_ICON,
1265
- installUrl: "https://chrome.google.com/webstore/detail/hiro-wallet/ldinpeekobnhjjdofggfgjlcehhmanlj"
1266
- },
1267
- {
1268
- id: "XverseProviders.BitcoinProvider",
1269
- name: "Xverse Wallet",
1270
- icon: XVERSE_ICON,
1271
- installUrl: "https://chrome.google.com/webstore/detail/xverse-wallet/idnnbdplmphpflfnlkomgpfbpcgelopg"
1272
- },
1273
- {
1274
- id: "AsignaProvider",
1275
- name: "Asigna Multisig",
1276
- icon: ASIGNA_ICON,
1277
- installUrl: "https://stx.asigna.io/"
1278
- },
1279
- {
1280
- id: "FordefiProviders.UtxoProvider",
1281
- name: "Fordefi",
1282
- icon: FORDEFI_ICON,
1283
- installUrl: "https://chromewebstore.google.com/detail/fordefi/hcmehenccjdmfbojapcbcofkgdpbnlle"
1284
- }
1285
- ];
1286
- function useStacksXConnectors() {
1287
- return React2.useMemo(() => STACKS_PROVIDERS.map((config) => new StacksXConnector(config)), []);
1288
- }
1289
-
1290
- // src/useXWagmiStore.ts
1291
- var initXServices = () => {
1292
- const xServices = {};
1293
- ["EVM", "BITCOIN", "INJECTIVE", "STELLAR", "SUI", "SOLANA", "ICON", "NEAR", "STACKS"].forEach((key) => {
1294
- const xChainType = key;
1295
- switch (xChainType) {
1296
- // EVM, SUI, Solana wallet connectors are supported by their own sdks. wagmi, @mysten/dapp-kit, @solana/wallet-adapter-react.
1297
- case "EVM":
1298
- xServices[xChainType] = EvmXService.getInstance();
1299
- xServices[xChainType].setXConnectors([]);
1300
- break;
1301
- case "SUI":
1302
- xServices[xChainType] = SuiXService.getInstance();
1303
- xServices[xChainType].setXConnectors([]);
1304
- break;
1305
- case "SOLANA":
1306
- xServices[xChainType] = SolanaXService.getInstance();
1307
- xServices[xChainType].setXConnectors([]);
1308
- break;
1309
- case "BITCOIN":
1310
- xServices[xChainType] = BitcoinXService.getInstance();
1311
- xServices[xChainType].setXConnectors([new UnisatXConnector(), new XverseXConnector(), new OKXXConnector()]);
1312
- break;
1313
- // Injective, Stellar, Icon wallet connectors are supported by sodax wallet-sdk-react sdk.
1314
- case "INJECTIVE":
1315
- xServices[xChainType] = InjectiveXService.getInstance();
1316
- xServices[xChainType].setXConnectors([
1317
- // EVM wallets (auto-detected via EIP-6963)
1318
- new InjectiveXConnector("MetaMask", walletBase.Wallet.Metamask),
1319
- // Cosmos wallets (detected via window globals)
1320
- new InjectiveXConnector("Keplr", walletBase.Wallet.Keplr),
1321
- new InjectiveXConnector("Leap", walletBase.Wallet.Leap)
1322
- ]);
1323
- break;
1324
- case "STELLAR":
1325
- xServices[xChainType] = StellarXService.getInstance();
1326
- xServices[xChainType].setXConnectors([]);
1327
- break;
1328
- case "ICON":
1329
- xServices[xChainType] = IconXService.getInstance();
1330
- xServices[xChainType].setXConnectors([new IconHanaXConnector()]);
1331
- break;
1332
- case "NEAR":
1333
- xServices[xChainType] = NearXService.getInstance();
1334
- xServices[xChainType].setXConnectors([]);
1335
- break;
1336
- case "STACKS":
1337
- xServices[xChainType] = StacksXService.getInstance();
1338
- xServices[xChainType].setXConnectors(STACKS_PROVIDERS.map((config) => new StacksXConnector(config)));
1339
- break;
1340
- }
1341
- });
1342
- return xServices;
1343
- };
1344
- var useXWagmiStore = zustand.create()(
1345
- middleware.devtools(
1346
- middleware.persist(
1347
- immer.immer((set, get) => ({
1348
- xServices: initXServices(),
1349
- xConnections: {},
1350
- setXConnection: (xChainType, xConnection) => {
1351
- set((state) => {
1352
- state.xConnections[xChainType] = xConnection;
1353
- });
1354
- },
1355
- unsetXConnection: (xChainType) => {
1356
- set((state) => {
1357
- delete state.xConnections[xChainType];
1358
- });
1359
- }
1360
- })),
1361
- {
1362
- name: "xwagmi-store",
1363
- storage: middleware.createJSONStorage(() => localStorage),
1364
- partialize: (state) => ({ xConnections: state.xConnections })
1365
- }
1366
- ),
1367
- { name: "xwagmi-store" }
1368
- )
1369
- );
1370
-
1371
- // src/hooks/useXConnection.ts
1372
- function useXConnection(xChainType) {
1373
- const xConnection = useXWagmiStore((state) => xChainType ? state.xConnections?.[xChainType] : void 0);
1374
- const evmConnections = wagmi.useConnections();
1375
- const { address: evmAddress } = wagmi.useAccount();
1376
- const suiAccount = dappKit.useCurrentAccount();
1377
- const suiCurrentWallet = dappKit.useCurrentWallet();
1378
- const solanaWallet = walletAdapterReact.useWallet();
1379
- const xConnection2 = React2.useMemo(() => {
1380
- if (!xChainType) {
1381
- return void 0;
1382
- }
1383
- switch (xChainType) {
1384
- case "EVM":
1385
- return {
1386
- xAccount: { address: evmAddress, xChainType },
1387
- xConnectorId: evmConnections?.[0]?.connector.id
1388
- };
1389
- case "SUI":
1390
- if (suiCurrentWallet.currentWallet && suiCurrentWallet.connectionStatus === "connected") {
1391
- return {
1392
- xAccount: { address: suiAccount?.address, xChainType },
1393
- xConnectorId: suiCurrentWallet.currentWallet.name
1394
- };
1395
- }
1396
- return void 0;
1397
- case "SOLANA":
1398
- if (solanaWallet.connected) {
1399
- return {
1400
- xAccount: { address: solanaWallet.publicKey?.toString(), xChainType },
1401
- xConnectorId: `${solanaWallet.wallet?.adapter.name}`
1402
- };
1403
- }
1404
- return void 0;
1405
- default:
1406
- return xConnection;
1407
- }
1408
- }, [xChainType, xConnection, evmAddress, suiAccount, evmConnections, suiCurrentWallet, solanaWallet]);
1409
- return xConnection2;
1410
- }
1411
-
1412
- // src/hooks/useXAccount.ts
1413
- function isChainType(chainIdentifier) {
1414
- return types.ChainTypeArr.includes(chainIdentifier);
1415
- }
1416
- function useXAccount(chainIdentifier) {
1417
- const resolvedChainType = chainIdentifier ? isChainType(chainIdentifier) ? chainIdentifier : getXChainType(chainIdentifier) : void 0;
1418
- const xConnection = useXConnection(resolvedChainType);
1419
- const xAccount = React2.useMemo(() => {
1420
- if (!resolvedChainType) {
1421
- return {
1422
- address: void 0,
1423
- xChainType: void 0
1424
- };
1425
- }
1426
- return xConnection?.xAccount || { address: void 0, xChainType: resolvedChainType };
1427
- }, [resolvedChainType, xConnection]);
1428
- return xAccount;
1429
- }
1430
- function useXAccounts() {
1431
- const xChainTypes = useXWagmiStore((state) => Object.keys(state.xServices));
1432
- const xConnections = useXWagmiStore((state) => state.xConnections);
1433
- const { address: evmAddress } = wagmi.useAccount();
1434
- const suiAccount = dappKit.useCurrentAccount();
1435
- const solanaWallet = walletAdapterReact.useWallet();
1436
- const xAccounts = React2.useMemo(() => {
1437
- const result = {};
1438
- for (const xChainType of xChainTypes) {
1439
- const xConnection = xConnections[xChainType];
1440
- if (xConnection?.xAccount) {
1441
- result[xChainType] = xConnection.xAccount;
1442
- } else {
1443
- result[xChainType] = {
1444
- address: void 0,
1445
- xChainType
1446
- };
1447
- }
1448
- }
1449
- if (evmAddress) {
1450
- result["EVM"] = {
1451
- address: evmAddress,
1452
- xChainType: "EVM"
1453
- };
1454
- }
1455
- if (suiAccount) {
1456
- result["SUI"] = {
1457
- address: suiAccount.address,
1458
- xChainType: "SUI"
1459
- };
1460
- }
1461
- if (solanaWallet.publicKey) {
1462
- result["SOLANA"] = {
1463
- address: solanaWallet.publicKey.toString(),
1464
- xChainType: "SOLANA"
1465
- };
1466
- }
1467
- return result;
1468
- }, [xChainTypes, xConnections, evmAddress, suiAccount, solanaWallet]);
1469
- return xAccounts;
1470
- }
1471
- function useXConnect() {
1472
- const setXConnection = useXWagmiStore((state) => state.setXConnection);
1473
- const { connectAsync: evmConnectAsync } = wagmi.useConnect();
1474
- const { mutateAsync: suiConnectAsync } = dappKit.useConnectWallet();
1475
- const { select, connect } = walletAdapterReact.useWallet();
1476
- return reactQuery.useMutation({
1477
- mutationFn: async (xConnector) => {
1478
- const xChainType = xConnector.xChainType;
1479
- let xAccount;
1480
- switch (xChainType) {
1481
- case "EVM":
1482
- await evmConnectAsync({ connector: xConnector.connector });
1483
- break;
1484
- case "SUI":
1485
- await suiConnectAsync({ wallet: xConnector.wallet });
1486
- break;
1487
- case "SOLANA": {
1488
- const walletName = xConnector.wallet.adapter.name;
1489
- select(walletName);
1490
- const adapter = xConnector.wallet.adapter;
1491
- if (!adapter) throw new Error("No adapter found for Solana wallet");
1492
- if (walletName === "MetaMask") {
1493
- await new Promise((resolve, reject) => {
1494
- const timeout = setTimeout(() => {
1495
- cleanup();
1496
- reject(new Error("Wallet connection timeout"));
1497
- }, 3e4);
1498
- const handleConnect = () => {
1499
- cleanup();
1500
- resolve();
1501
- };
1502
- const handleError = (error) => {
1503
- cleanup();
1504
- reject(error);
1505
- };
1506
- const cleanup = () => {
1507
- clearTimeout(timeout);
1508
- adapter.off("connect", handleConnect);
1509
- adapter.off("error", handleError);
1510
- };
1511
- adapter.on("connect", handleConnect);
1512
- adapter.on("error", handleError);
1513
- connect().catch((err) => {
1514
- cleanup();
1515
- reject(err);
1516
- });
1517
- });
1518
- }
1519
- break;
1520
- }
1521
- default:
1522
- xAccount = await xConnector.connect();
1523
- break;
1524
- }
1525
- if (xAccount) {
1526
- setXConnection(xConnector.xChainType, {
1527
- xAccount,
1528
- xConnectorId: xConnector.id
1529
- });
1530
- }
1531
- return xAccount;
1532
- }
1533
- });
1534
- }
1535
-
1536
- // src/xchains/solana/SolanaXConnector.ts
1537
- var SolanaXConnector = class extends XConnector {
1538
- constructor(wallet) {
1539
- super("SOLANA", wallet?.adapter.name, wallet?.adapter.name);
1540
- this.wallet = wallet;
1541
- }
1542
- getXService() {
1543
- return SolanaXService.getInstance();
1544
- }
1545
- async connect() {
1546
- return;
1547
- }
1548
- async disconnect() {
1549
- }
1550
- get icon() {
1551
- return this.wallet?.adapter.icon;
1552
- }
1553
- };
1554
- var useStellarXConnectors = () => {
1555
- const xService = useXService("STELLAR");
1556
- return reactQuery.useQuery({
1557
- queryKey: ["stellar-wallets", xService],
1558
- queryFn: async () => {
1559
- if (!xService) {
1560
- return [];
1561
- }
1562
- const wallets = await xService.walletsKit.getSupportedWallets();
1563
- return wallets.filter((wallet) => wallet.isAvailable).map((wallet) => new StellarWalletsKitXConnector(wallet));
1564
- }
1565
- });
1566
- };
1567
-
1568
- // src/hooks/useXService.ts
1569
- function useXService(xChainType) {
1570
- const xService = useXWagmiStore((state) => xChainType ? state.xServices[xChainType] : void 0);
1571
- return xService;
1572
- }
1573
-
1574
- // src/xchains/near/NearXConnector.ts
1575
- var NearXConnector = class extends XConnector {
1576
- constructor(wallet) {
1577
- super("NEAR", wallet.manifest.name, wallet.manifest.id);
1578
- this._wallet = wallet;
1579
- }
1580
- getXService() {
1581
- return NearXService.getInstance();
1582
- }
1583
- async connect() {
1584
- const walletSelector = this.getXService().walletSelector;
1585
- const wallet = await walletSelector.connect({ walletId: this._wallet.manifest.id });
1586
- const accounts = await wallet.getAccounts();
1587
- if (accounts.length === 0 || accounts[0] === void 0) {
1588
- return void 0;
1589
- }
1590
- return {
1591
- address: accounts[0].accountId,
1592
- xChainType: this.xChainType
1593
- };
1594
- }
1595
- async disconnect() {
1596
- const walletSelector = this.getXService().walletSelector;
1597
- await walletSelector.disconnect(this._wallet);
1598
- }
1599
- get icon() {
1600
- return this._wallet.manifest.icon;
1601
- }
1602
- };
1603
-
1604
- // src/xchains/near/useNearXConnectors.ts
1605
- var useNearXConnectors = () => {
1606
- const xService = useXService("NEAR");
1607
- return reactQuery.useQuery({
1608
- queryKey: ["near-wallets"],
1609
- queryFn: async () => {
1610
- if (!xService) {
1611
- return [];
1612
- }
1613
- await xService.walletSelector.whenManifestLoaded;
1614
- const wallets = xService.walletSelector.availableWallets;
1615
- return wallets.map((wallet) => new NearXConnector(wallet));
1616
- }
1617
- });
1618
- };
1619
-
1620
- // src/hooks/useXConnectors.ts
1621
- function useXConnectors(xChainType) {
1622
- const xService = useXService(xChainType);
1623
- const evmConnectors = wagmi.useConnectors();
1624
- const suiWallets = dappKit.useWallets();
1625
- const { data: stellarXConnectors } = useStellarXConnectors();
1626
- const { data: nearXConnectors } = useNearXConnectors();
1627
- const stacksXConnectors = useStacksXConnectors();
1628
- const { wallets: solanaWallets } = walletAdapterReact.useWallet();
1629
- const xConnectors = React2.useMemo(() => {
1630
- if (!xChainType || !xService) {
1631
- return [];
1632
- }
1633
- switch (xChainType) {
1634
- case "EVM":
1635
- return evmConnectors.map((connector) => new EvmXConnector(connector));
1636
- case "SUI":
1637
- return suiWallets.map((wallet) => new SuiXConnector(wallet));
1638
- case "STELLAR":
1639
- return stellarXConnectors || [];
1640
- case "SOLANA":
1641
- return solanaWallets.filter((wallet) => wallet.readyState === "Installed").map((wallet) => new SolanaXConnector(wallet));
1642
- case "NEAR":
1643
- return nearXConnectors || [];
1644
- case "STACKS":
1645
- return stacksXConnectors;
1646
- default:
1647
- return xService.getXConnectors();
1648
- }
1649
- }, [
1650
- xService,
1651
- xChainType,
1652
- evmConnectors,
1653
- suiWallets,
1654
- stellarXConnectors,
1655
- solanaWallets,
1656
- nearXConnectors,
1657
- stacksXConnectors
1658
- ]);
1659
- return xConnectors;
1660
- }
1661
- function useXDisconnect() {
1662
- const xConnections = useXWagmiStore((state) => state.xConnections);
1663
- const unsetXConnection = useXWagmiStore((state) => state.unsetXConnection);
1664
- const { disconnectAsync } = wagmi.useDisconnect();
1665
- const { mutateAsync: suiDisconnectAsync } = dappKit.useDisconnectWallet();
1666
- const solanaWallet = walletAdapterReact.useWallet();
1667
- return React2.useCallback(
1668
- async (xChainType) => {
1669
- switch (xChainType) {
1670
- case "EVM":
1671
- await disconnectAsync();
1672
- break;
1673
- case "SUI":
1674
- await suiDisconnectAsync();
1675
- break;
1676
- case "SOLANA":
1677
- await solanaWallet.disconnect();
1678
- break;
1679
- case "NEAR": {
1680
- const nearXService = getXService("NEAR");
1681
- nearXService.walletSelector.disconnect();
1682
- break;
1683
- }
1684
- default: {
1685
- const xService = getXService(xChainType);
1686
- const xConnectorId = xConnections[xChainType]?.xConnectorId;
1687
- const xConnector = xConnectorId ? xService.getXConnectorById(xConnectorId) : void 0;
1688
- await xConnector?.disconnect();
1689
- break;
1690
- }
1691
- }
1692
- unsetXConnection(xChainType);
1693
- },
1694
- [xConnections, unsetXConnection, disconnectAsync, suiDisconnectAsync, solanaWallet]
1695
- );
1696
- }
1697
- function useXBalances({
1698
- xChainId,
1699
- xTokens,
1700
- address
1701
- }) {
1702
- const xService = useXService(getXChainType(xChainId));
1703
- return reactQuery.useQuery({
1704
- queryKey: ["xBalances", xChainId, xTokens.map((x) => x.symbol), address],
1705
- queryFn: async () => {
1706
- if (!xService) {
1707
- return {};
1708
- }
1709
- const balances = await xService.getBalances(address, xTokens);
1710
- return balances;
1711
- },
1712
- enabled: !!xService && !!address && (xTokens?.length ?? 0) > 0,
1713
- refetchInterval: 5e3
1714
- });
1715
- }
1716
- function useEthereumChainId() {
1717
- const injectiveXService = useXService("INJECTIVE");
1718
- const [ethereumChainId, setEthereumChainId] = React2__default.default.useState(null);
1719
- React2.useEffect(() => {
1720
- if (!injectiveXService?.walletStrategy?.getWallet()) return;
1721
- const walletStrategy = injectiveXService.walletStrategy;
1722
- if (walletStrategy.getWallet() !== walletBase.Wallet.Metamask) return;
1723
- const getEthereumChainId = async () => {
1724
- try {
1725
- const chainId = await walletStrategy.getEthereumChainId();
1726
- setEthereumChainId(Number.parseInt(chainId));
1727
- } catch (e) {
1728
- console.warn("Failed to get Ethereum chain ID:", e);
1729
- }
1730
- };
1731
- getEthereumChainId();
1732
- try {
1733
- walletStrategy.getStrategy().onChainIdChanged(getEthereumChainId);
1734
- } catch (e) {
1735
- console.warn("Failed to subscribe to chain ID changes:", e);
1736
- }
1737
- }, [injectiveXService?.walletStrategy]);
1738
- return ethereumChainId;
1739
- }
1740
- var switchEthereumChain = async () => {
1741
- const metamaskProvider = window.ethereum;
1742
- return await Promise.race([
1743
- metamaskProvider.request({
1744
- method: "wallet_switchEthereumChain",
1745
- params: [{ chainId: "0x1" }]
1746
- }),
1747
- new Promise(
1748
- (resolve) => metamaskProvider.on("change", ({ chain }) => {
1749
- if (chain?.id === 1) {
1750
- resolve();
1751
- }
1752
- })
1753
- )
1754
- ]);
1755
- };
1756
- var useEvmSwitchChain = (expectedXChainId) => {
1757
- const xChainType = getXChainType(expectedXChainId);
1758
- const expectedChainId = types.baseChainInfo[expectedXChainId].chainId;
1759
- const injectiveXService = useXService("INJECTIVE");
1760
- const ethereumChainId = useEthereumChainId();
1761
- const { chainId } = wagmi.useAccount();
1762
- const isWrongChain = React2.useMemo(() => {
1763
- return xChainType === "EVM" && chainId !== expectedChainId || xChainType === "INJECTIVE" && injectiveXService && injectiveXService.walletStrategy.getWallet() === walletBase.Wallet.Metamask && ethereumChainId !== chains$1.mainnet.id;
1764
- }, [xChainType, chainId, expectedChainId, ethereumChainId, injectiveXService]);
1765
- const { switchChain } = wagmi.useSwitchChain();
1766
- const handleSwitchChain = React2.useCallback(() => {
1767
- if (xChainType === "INJECTIVE") {
1768
- switchEthereumChain();
1769
- } else {
1770
- switchChain({ chainId: expectedChainId });
1771
- }
1772
- }, [switchChain, expectedChainId, xChainType]);
1773
- return React2.useMemo(
1774
- () => ({
1775
- isWrongChain,
1776
- handleSwitchChain
1777
- }),
1778
- [isWrongChain, handleSwitchChain]
1779
- );
1780
- };
1781
- function useWalletProvider(spokeChainId) {
1782
- const xChainType = getXChainType(spokeChainId);
1783
- const evmPublicClient = wagmi.usePublicClient();
1784
- const { data: evmWalletClient } = wagmi.useWalletClient();
1785
- const xService = useXService(getXChainType(spokeChainId));
1786
- const xAccount = useXAccount(spokeChainId);
1787
- const stacksConnection = useXConnection("STACKS");
1788
- const stacksConnectors = useXConnectors("STACKS");
1789
- const xConnection = useXConnection(xChainType);
1790
- return React2.useMemo(() => {
1791
- switch (xChainType) {
1792
- case "EVM": {
1793
- if (!evmWalletClient) {
1794
- return void 0;
1795
- }
1796
- if (!evmPublicClient) {
1797
- return void 0;
1798
- }
1799
- return new walletSdkCore.EvmWalletProvider({
1800
- walletClient: evmWalletClient,
1801
- publicClient: evmPublicClient
1802
- });
1803
- }
1804
- case "SUI": {
1805
- const suiXService = xService;
1806
- const { client, wallet, account } = {
1807
- client: suiXService.suiClient,
1808
- wallet: suiXService.suiWallet,
1809
- account: suiXService.suiAccount
1810
- };
1811
- return new walletSdkCore.SuiWalletProvider({ client, wallet, account });
1812
- }
1813
- case "ICON": {
1814
- const { walletAddress, rpcUrl } = {
1815
- walletAddress: xAccount.address,
1816
- rpcUrl: CHAIN_INFO[1 /* MAINNET */].APIEndpoint
1817
- };
1818
- return new walletSdkCore.IconWalletProvider({
1819
- walletAddress,
1820
- rpcUrl
1821
- });
1822
- }
1823
- case "INJECTIVE": {
1824
- const injectiveXService = xService;
1825
- if (!injectiveXService) {
1826
- return void 0;
1827
- }
1828
- return new walletSdkCore.InjectiveWalletProvider({
1829
- msgBroadcaster: injectiveXService.msgBroadcaster
1830
- });
1831
- }
1832
- case "STELLAR": {
1833
- const stellarXService = xService;
1834
- if (!stellarXService.walletsKit) {
1835
- return void 0;
1836
- }
1837
- return new walletSdkCore.StellarWalletProvider({
1838
- type: "BROWSER_EXTENSION",
1839
- walletsKit: stellarXService.walletsKit,
1840
- network: "PUBLIC"
1841
- });
1842
- }
1843
- case "SOLANA": {
1844
- const solanaXService = xService;
1845
- if (!solanaXService.wallet) {
1846
- return void 0;
1847
- }
1848
- if (!solanaXService.connection) {
1849
- return void 0;
1850
- }
1851
- return new walletSdkCore.SolanaWalletProvider({
1852
- wallet: solanaXService.wallet,
1853
- endpoint: solanaXService.connection.rpcEndpoint
1854
- });
1855
- }
1856
- case "BITCOIN": {
1857
- if (!xConnection?.xConnectorId) return void 0;
1858
- const connector = BitcoinXService.getInstance().getXConnectorById(xConnection.xConnectorId);
1859
- if (!connector) return void 0;
1860
- return connector.recreateWalletProvider(xConnection.xAccount);
1861
- }
1862
- case "NEAR": {
1863
- const nearXService = xService;
1864
- if (!nearXService.walletSelector) {
1865
- return void 0;
1866
- }
1867
- return new walletSdkCore.NearWalletProvider({ wallet: nearXService.walletSelector });
1868
- }
1869
- case "STACKS": {
1870
- const address = xAccount.address;
1871
- if (!address) {
1872
- return void 0;
1873
- }
1874
- const activeStacksConnector = stacksConnectors.find((c) => c.id === stacksConnection?.xConnectorId);
1875
- return new walletSdkCore.StacksWalletProvider({ address, provider: activeStacksConnector?.getProvider() });
1876
- }
1877
- default:
1878
- return void 0;
1879
- }
1880
- }, [
1881
- xChainType,
1882
- evmPublicClient,
1883
- evmWalletClient,
1884
- xService,
1885
- xAccount,
1886
- stacksConnection,
1887
- stacksConnectors,
1888
- xConnection
1889
- ]);
1890
- }
1891
- function useXSignMessage() {
1892
- const { signMessage } = walletAdapterReact.useWallet();
1893
- const { signMessageAsync: evmSignMessage } = wagmi.useSignMessage();
1894
- const { mutateAsync: signPersonalMessage } = dappKit.useSignPersonalMessage();
1895
- const { address: injectiveAddress } = useXAccount("INJECTIVE");
1896
- return reactQuery.useMutation({
1897
- mutationFn: async ({ xChainType, message }) => {
1898
- let signature;
1899
- switch (xChainType) {
1900
- case "EVM": {
1901
- signature = await evmSignMessage({ message });
1902
- break;
1903
- }
1904
- case "SUI": {
1905
- const res = await signPersonalMessage({ message: new Uint8Array(new TextEncoder().encode(message)) });
1906
- signature = res.signature;
1907
- break;
1908
- }
1909
- case "SOLANA": {
1910
- if (!signMessage) {
1911
- throw new Error("Solana wallet not connected");
1912
- }
1913
- signature = await signMessage(new TextEncoder().encode(message));
1914
- break;
1915
- }
1916
- case "STELLAR": {
1917
- const res = await StellarXService.getInstance().walletsKit.signMessage(message);
1918
- signature = res.signedMessage;
1919
- break;
1920
- }
1921
- case "INJECTIVE": {
1922
- if (!injectiveAddress) {
1923
- throw new Error("Injective address not found");
1924
- }
1925
- const ethereumAddress = sdkTs.getEthereumAddress(injectiveAddress);
1926
- const walletStrategy = InjectiveXService.getInstance().walletStrategy;
1927
- const res = await walletStrategy.signArbitrary(
1928
- walletStrategy.getWallet() === walletBase.Wallet.Metamask ? ethereumAddress : injectiveAddress,
1929
- message
1930
- );
1931
- if (!res) {
1932
- throw new Error("Injective signature not found");
1933
- }
1934
- signature = res;
1935
- break;
1936
- }
1937
- default:
1938
- console.warn("Unsupported chain type");
1939
- break;
1940
- }
1941
- return signature;
1942
- }
1943
- });
1944
- }
1945
-
1946
- // src/xchains/bitcoin/useBitcoinXConnectors.ts
1947
- function useBitcoinXConnectors() {
1948
- const xService = useXService("BITCOIN");
1949
- return React2.useMemo(() => {
1950
- return xService?.getXConnectors() || [];
1951
- }, [xService]);
1952
- }
1953
- var Hydrate = ({ rpcConfig }) => {
1954
- const suiClient = dappKit.useSuiClient();
1955
- React2.useEffect(() => {
1956
- if (suiClient) {
1957
- SuiXService.getInstance().suiClient = suiClient;
1958
- }
1959
- }, [suiClient]);
1960
- const { currentWallet: suiWallet } = dappKit.useCurrentWallet();
1961
- React2.useEffect(() => {
1962
- if (suiWallet) {
1963
- SuiXService.getInstance().suiWallet = suiWallet;
1964
- }
1965
- }, [suiWallet]);
1966
- const suiAccount = dappKit.useCurrentAccount();
1967
- React2.useEffect(() => {
1968
- if (suiAccount) {
1969
- SuiXService.getInstance().suiAccount = suiAccount;
1970
- }
1971
- }, [suiAccount]);
1972
- const { connection: solanaConnection } = walletAdapterReact.useConnection();
1973
- const solanaWallet = walletAdapterReact.useWallet();
1974
- React2.useEffect(() => {
1975
- if (solanaConnection) {
1976
- SolanaXService.getInstance().connection = solanaConnection;
1977
- }
1978
- }, [solanaConnection]);
1979
- React2.useEffect(() => {
1980
- if (solanaWallet) {
1981
- SolanaXService.getInstance().wallet = solanaWallet;
1982
- }
1983
- }, [solanaWallet]);
1984
- const wagmiConfig = wagmi.useConfig();
1985
- React2.useEffect(() => {
1986
- if (wagmiConfig) {
1987
- EvmXService.getInstance().wagmiConfig = wagmiConfig;
1988
- }
1989
- }, [wagmiConfig]);
1990
- React2.useEffect(() => {
1991
- StacksXService.getInstance().network = network.createNetwork({
1992
- network: "mainnet",
1993
- client: { baseUrl: rpcConfig.stacks ?? "https://api.mainnet.hiro.so" }
1994
- });
1995
- }, [rpcConfig.stacks]);
1996
- return null;
1997
- };
1998
-
1999
- // src/xchains/icon/actions.ts
2000
- var reconnectIcon = async () => {
2001
- const iconConnection = useXWagmiStore.getState().xConnections.ICON;
2002
- if (!iconConnection) return;
2003
- const recentXConnectorId = iconConnection.xConnectorId;
2004
- const detail = await request({
2005
- type: "REQUEST_ADDRESS" /* REQUEST_ADDRESS */
2006
- });
2007
- if (detail?.type === "RESPONSE_ADDRESS" /* RESPONSE_ADDRESS */) {
2008
- useXWagmiStore.setState({
2009
- xConnections: {
2010
- ...useXWagmiStore.getState().xConnections,
2011
- ICON: {
2012
- xAccount: {
2013
- address: detail?.payload,
2014
- xChainType: "ICON"
2015
- },
2016
- xConnectorId: recentXConnectorId
2017
- }
2018
- }
2019
- });
2020
- }
2021
- };
2022
- var reconnectInjective = async () => {
2023
- const injectiveConnection = useXWagmiStore.getState().xConnections.INJECTIVE;
2024
- if (!injectiveConnection) return;
2025
- const recentXConnectorId = injectiveConnection.xConnectorId;
2026
- const walletStrategy = InjectiveXService.getInstance().walletStrategy;
2027
- await walletStrategy.setWallet(recentXConnectorId);
2028
- const addresses = await walletStrategy.getAddresses();
2029
- const address = walletBase.isEvmBrowserWallet(recentXConnectorId) ? sdkTs.getInjectiveAddress(addresses?.[0]) : addresses?.[0];
2030
- useXWagmiStore.setState({
2031
- xConnections: {
2032
- ...useXWagmiStore.getState().xConnections,
2033
- INJECTIVE: {
2034
- xAccount: {
2035
- address,
2036
- xChainType: "INJECTIVE"
2037
- },
2038
- xConnectorId: recentXConnectorId
2039
- }
2040
- }
2041
- });
2042
- };
2043
-
2044
- // src/xchains/stellar/actions.ts
2045
- var reconnectStellar = async () => {
2046
- const stellarConnection = useXWagmiStore.getState().xConnections.STELLAR;
2047
- if (!stellarConnection) return;
2048
- const recentXConnectorId = stellarConnection.xConnectorId;
2049
- const stellarWalletKit = StellarXService.getInstance().walletsKit;
2050
- stellarWalletKit.setWallet(recentXConnectorId);
2051
- const { address } = await stellarWalletKit.getAddress();
2052
- useXWagmiStore.setState({
2053
- xConnections: {
2054
- ...useXWagmiStore.getState().xConnections,
2055
- STELLAR: {
2056
- xAccount: {
2057
- address,
2058
- xChainType: "STELLAR"
2059
- },
2060
- xConnectorId: recentXConnectorId
2061
- }
2062
- }
2063
- });
2064
- };
2065
- var queryClient = new reactQuery.QueryClient();
2066
- var defaultOptions = {
2067
- wagmi: {
2068
- reconnectOnMount: false,
2069
- ssr: true
2070
- },
2071
- solana: {
2072
- autoConnect: true
2073
- },
2074
- sui: {
2075
- autoConnect: true
2076
- }
2077
- };
2078
- var SodaxWalletProvider = ({ children, rpcConfig, options, initialState }) => {
2079
- const wagmi$1 = React2.useMemo(() => ({ ...defaultOptions.wagmi, ...options?.wagmi }), [options?.wagmi]);
2080
- const wagmiConfig = React2.useMemo(() => {
2081
- return createWagmiConfig(rpcConfig, wagmi$1);
2082
- }, [rpcConfig, wagmi$1]);
2083
- const wallets = React2.useMemo(() => [new walletAdapterWallets.UnsafeBurnerWalletAdapter()], []);
2084
- const solana = React2.useMemo(() => ({ ...defaultOptions.solana, ...options?.solana }), [options?.solana]);
2085
- const sui = React2.useMemo(() => ({ ...defaultOptions.sui, ...options?.sui }), [options?.sui]);
2086
- return /* @__PURE__ */ React2__default.default.createElement(reactQuery.QueryClientProvider, { client: queryClient }, /* @__PURE__ */ React2__default.default.createElement(wagmi.WagmiProvider, { reconnectOnMount: wagmi$1.reconnectOnMount, config: wagmiConfig, initialState }, /* @__PURE__ */ React2__default.default.createElement(dappKit.SuiClientProvider, { networks: { mainnet: { url: client.getFullnodeUrl("mainnet") } }, defaultNetwork: "mainnet" }, /* @__PURE__ */ React2__default.default.createElement(dappKit.WalletProvider, { autoConnect: sui.autoConnect }, /* @__PURE__ */ React2__default.default.createElement(walletAdapterReact.ConnectionProvider, { endpoint: rpcConfig["solana"] ?? "https://api.mainnet-beta.solana.com" }, /* @__PURE__ */ React2__default.default.createElement(walletAdapterReact.WalletProvider, { wallets, autoConnect: solana.autoConnect }, /* @__PURE__ */ React2__default.default.createElement(Hydrate, { rpcConfig }), children))))));
2087
- };
2088
- reconnectIcon();
2089
- reconnectInjective();
2090
- reconnectStellar();
2091
-
2092
- // src/types/index.ts
2093
- var WalletId = /* @__PURE__ */ ((WalletId2) => {
2094
- WalletId2["METAMASK"] = "metamask";
2095
- WalletId2["HANA"] = "hana";
2096
- WalletId2["PHANTOM"] = "phantom";
2097
- WalletId2["SUI"] = "sui";
2098
- WalletId2["KEPLR"] = "keplr";
2099
- return WalletId2;
2100
- })(WalletId || {});
2101
-
2102
- exports.BitcoinXConnector = BitcoinXConnector;
2103
- exports.BitcoinXService = BitcoinXService;
2104
- exports.EvmXConnector = EvmXConnector;
2105
- exports.EvmXService = EvmXService;
2106
- exports.IconHanaXConnector = IconHanaXConnector;
2107
- exports.IconXService = IconXService;
2108
- exports.InjectiveXConnector = InjectiveXConnector;
2109
- exports.InjectiveXService = InjectiveXService;
2110
- exports.OKXXConnector = OKXXConnector;
2111
- exports.STACKS_PROVIDERS = STACKS_PROVIDERS;
2112
- exports.SodaxWalletProvider = SodaxWalletProvider;
2113
- exports.SolanaXConnector = SolanaXConnector;
2114
- exports.SolanaXService = SolanaXService;
2115
- exports.StacksXConnector = StacksXConnector;
2116
- exports.StacksXService = StacksXService;
2117
- exports.StellarWalletsKitXConnector = StellarWalletsKitXConnector;
2118
- exports.StellarXService = StellarXService;
2119
- exports.SuiXConnector = SuiXConnector;
2120
- exports.SuiXService = SuiXService;
2121
- exports.UnisatXConnector = UnisatXConnector;
2122
- exports.WalletId = WalletId;
2123
- exports.XConnector = XConnector;
2124
- exports.XService = XService;
2125
- exports.XverseXConnector = XverseXConnector;
2126
- exports.createWagmi = createWagmiConfig;
2127
- exports.createWagmiConfig = createWagmiConfig;
2128
- exports.getWagmiChainId = getWagmiChainId;
2129
- exports.getXChainType = getXChainType;
2130
- exports.getXService = getXService;
2131
- exports.isNativeToken = isNativeToken;
2132
- exports.useBitcoinXConnectors = useBitcoinXConnectors;
2133
- exports.useEvmSwitchChain = useEvmSwitchChain;
2134
- exports.useStacksXConnectors = useStacksXConnectors;
2135
- exports.useWalletProvider = useWalletProvider;
2136
- exports.useXAccount = useXAccount;
2137
- exports.useXAccounts = useXAccounts;
2138
- exports.useXBalances = useXBalances;
2139
- exports.useXConnect = useXConnect;
2140
- exports.useXConnection = useXConnection;
2141
- exports.useXConnectors = useXConnectors;
2142
- exports.useXDisconnect = useXDisconnect;
2143
- exports.useXService = useXService;
2144
- exports.useXSignMessage = useXSignMessage;
2145
- exports.useXWagmiStore = useXWagmiStore;
2146
- //# sourceMappingURL=index.cjs.map
2147
- //# sourceMappingURL=index.cjs.map