@sodax/wallet-sdk-react 1.3.1-beta-rc3 → 1.4.0-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -3,6 +3,8 @@
3
3
  var types = require('@sodax/types');
4
4
  var nearConnect = require('@hot-labs/near-connect');
5
5
  var nearApiJs = require('near-api-js');
6
+ var transactions = require('@stacks/transactions');
7
+ var network = require('@stacks/network');
6
8
  var satsConnect = require('sats-connect');
7
9
  var React2 = require('react');
8
10
  var dappKit = require('@mysten/dapp-kit');
@@ -26,6 +28,7 @@ var splToken = require('@solana/spl-token');
26
28
  var stellarWalletsKit = require('@creit.tech/stellar-wallets-kit');
27
29
  var StellarSdk = require('@stellar/stellar-sdk');
28
30
  var IconSdkRaw = require('icon-sdk-js');
31
+ var connect = require('@stacks/connect');
29
32
  var reactQuery = require('@tanstack/react-query');
30
33
  var chains$1 = require('viem/chains');
31
34
  var walletSdkCore = require('@sodax/wallet-sdk-core');
@@ -146,6 +149,50 @@ var NearXService = class _NearXService extends XService {
146
149
  return BigInt(res ?? 0);
147
150
  }
148
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
+ };
149
196
 
150
197
  // src/actions/getXService.ts
151
198
  function getXService(xChainType) {
@@ -166,6 +213,8 @@ function getXService(xChainType) {
166
213
  return StellarXService.getInstance();
167
214
  case "NEAR":
168
215
  return NearXService.getInstance();
216
+ case "STACKS":
217
+ return StacksXService.getInstance();
169
218
  default:
170
219
  throw new Error(`Unsupported chain type: ${xChainType}`);
171
220
  }
@@ -198,6 +247,8 @@ var isNativeToken = (xToken) => {
198
247
  // solana
199
248
  "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA",
200
249
  // stellar
250
+ "ST000000000000000000002AMW42H.nativetoken",
251
+ // stacks
201
252
  "0:0"
202
253
  // bitcoin
203
254
  ];
@@ -354,10 +405,10 @@ var XverseWalletProvider = class {
354
405
  return 1;
355
406
  }
356
407
  async signTransaction(psbtBase64, finalize = false) {
357
- const { request: request2 } = await import('sats-connect');
408
+ const { request: request3 } = await import('sats-connect');
358
409
  const inputCount = this.countPsbtInputs(psbtBase64);
359
410
  const signingIndexes = Array.from({ length: inputCount }, (_, i) => i);
360
- const response = await request2("signPsbt", {
411
+ const response = await request3("signPsbt", {
361
412
  psbt: psbtBase64,
362
413
  broadcast: false,
363
414
  signInputs: {
@@ -374,8 +425,8 @@ var XverseWalletProvider = class {
374
425
  return result.psbt;
375
426
  }
376
427
  async signEcdsaMessage(message) {
377
- const { request: request2 } = await import('sats-connect');
378
- const response = await request2("signMessage", {
428
+ const { request: request3 } = await import('sats-connect');
429
+ const response = await request3("signMessage", {
379
430
  address: this.address,
380
431
  message,
381
432
  protocol: satsConnect.MessageSigningProtocols.ECDSA
@@ -386,8 +437,8 @@ var XverseWalletProvider = class {
386
437
  return response.result.signature;
387
438
  }
388
439
  async signBip322Message(message) {
389
- const { request: request2 } = await import('sats-connect');
390
- const response = await request2("signMessage", {
440
+ const { request: request3 } = await import('sats-connect');
441
+ const response = await request3("signMessage", {
391
442
  address: this.address,
392
443
  message,
393
444
  protocol: satsConnect.MessageSigningProtocols.BIP322
@@ -398,8 +449,8 @@ var XverseWalletProvider = class {
398
449
  return response.result.signature;
399
450
  }
400
451
  async sendBitcoin(toAddress, satoshis) {
401
- const { request: request2 } = await import('sats-connect');
402
- const response = await request2("sendTransfer", {
452
+ const { request: request3 } = await import('sats-connect');
453
+ const response = await request3("sendTransfer", {
403
454
  recipients: [
404
455
  {
405
456
  address: toAddress,
@@ -413,9 +464,19 @@ var XverseWalletProvider = class {
413
464
  return response.result.txid;
414
465
  }
415
466
  };
467
+ var XVERSE_ADDRESS_TYPE_KEY = "xverse-address-type";
416
468
  var XverseXConnector = class _XverseXConnector extends BitcoinXConnector {
417
469
  constructor() {
418
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
+ }
419
480
  }
420
481
  static isAvailable() {
421
482
  return typeof window !== "undefined" && !!window.BitcoinProvider;
@@ -427,16 +488,16 @@ var XverseXConnector = class _XverseXConnector extends BitcoinXConnector {
427
488
  if (!_XverseXConnector.isAvailable()) {
428
489
  throw new Error("Xverse wallet is not installed");
429
490
  }
430
- const { request: request2 } = await import('sats-connect');
431
- const response = await request2("getAccounts", {
432
- purposes: [satsConnect.AddressPurpose.Payment],
491
+ const { request: request3 } = await import('sats-connect');
492
+ const response = await request3("getAccounts", {
493
+ purposes: [this.addressPurpose],
433
494
  message: "Connect to Sodax"
434
495
  });
435
496
  if (response.status === "error") {
436
497
  throw new Error(response.error?.message || "Xverse connection failed");
437
498
  }
438
499
  const accounts = response.result;
439
- const paymentAccount = accounts.find((a) => a.purpose === satsConnect.AddressPurpose.Payment) || accounts[0];
500
+ const paymentAccount = accounts.find((a) => a.purpose === this.addressPurpose) || accounts[0];
440
501
  if (!paymentAccount) return void 0;
441
502
  this.walletProvider = new XverseWalletProvider(
442
503
  paymentAccount.address,
@@ -1178,11 +1239,82 @@ var IconHanaXConnector = class extends XConnector {
1178
1239
  return "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/hana.svg";
1179
1240
  }
1180
1241
  };
1242
+ function getProviderFromId(id) {
1243
+ return id.split(".").reduce((acc, part) => acc?.[part], window);
1244
+ }
1245
+ var StacksXConnector = class extends XConnector {
1246
+ constructor(config) {
1247
+ super("STACKS", config.name, config.id);
1248
+ this.config = config;
1249
+ }
1250
+ async connect() {
1251
+ const provider = this.getProvider();
1252
+ if (!provider) {
1253
+ if (this.config.installUrl) {
1254
+ window.open(this.config.installUrl, "_blank");
1255
+ }
1256
+ return void 0;
1257
+ }
1258
+ const response = await connect.request({ provider }, "stx_getAddresses");
1259
+ const stxAddress = response.addresses.find((a) => a.purpose === "stacks");
1260
+ if (!stxAddress) {
1261
+ return void 0;
1262
+ }
1263
+ return {
1264
+ address: stxAddress.address,
1265
+ xChainType: this.xChainType
1266
+ };
1267
+ }
1268
+ async disconnect() {
1269
+ connect.disconnect();
1270
+ }
1271
+ get icon() {
1272
+ return this.config.icon;
1273
+ }
1274
+ getProvider() {
1275
+ return getProviderFromId(this.config.id);
1276
+ }
1277
+ };
1278
+
1279
+ // src/xchains/stacks/constants.ts
1280
+ var LEATHER_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYuODM4NyIgZmlsbD0iIzEyMTAwRiIvPgo8cGF0aCBkPSJNNzQuOTE3MSA1Mi43MTE0QzgyLjQ3NjYgNTEuNTQwOCA5My40MDg3IDQzLjU4MDQgOTMuNDA4NyAzNy4zNzYxQzkzLjQwODcgMzUuNTAzMSA5MS44OTY4IDM0LjIxNTQgODkuNjg3MSAzNC4yMTU0Qzg1LjUwMDQgMzQuMjE1NCA3OC40MDYxIDQwLjUzNjggNzQuOTE3MSA1Mi43MTE0Wk0zOS45MTEgODMuNDk5MUMzMC4wMjU2IDgzLjQ5OTEgMjkuMjExNSA5My4zMzI0IDM5LjA5NjkgOTMuMzMyNEM0My41MTYzIDkzLjMzMjQgNDguODY2MSA5MS41NzY0IDUxLjY1NzMgODguNDE1N0M0Ny41ODY4IDg0LjkwMzggNDQuMjE0MSA4My40OTkxIDM5LjkxMSA4My40OTkxWk0xMDIuODI5IDc5LjI4NDhDMTAzLjQxIDk1Ljc5MDcgOTUuMDM2OSAxMDUuMDM5IDgwLjg0ODQgMTA1LjAzOUM3Mi40NzQ4IDEwNS4wMzkgNjguMjg4MSAxMDEuODc4IDU5LjMzMyA5Ni4wMjQ5QzU0LjY4MSAxMDEuMTc2IDQ1Ljg0MjMgMTA1LjAzOSAzOC41MTU0IDEwNS4wMzlDMTMuMjc4NSAxMDUuMDM5IDE0LjMyNTIgNzIuODQ2MyA0MC4wMjczIDcyLjg0NjNDNDUuMzc3MSA3Mi44NDYzIDQ5LjkxMjggNzQuMjUxMSA1NS43Mjc3IDc3Ljg4TDU5LjU2NTYgNjQuNDE3N0M0My43NDg5IDYwLjA4NjQgMzUuODQwNSA0Ny45MTE4IDQzLjYzMjYgMzAuNDY5M0g1Ni4xOTI5QzQ5LjIxNSA0Mi4wNTg2IDUzLjk4MzIgNTEuNjU3OCA2Mi44MjIgNTIuNzExNEM2Ny41OTAzIDM1LjczNzIgNzcuODI0NiAyMi41MDkgOTEuNDMxNiAyMi41MDlDOTkuMTA3NCAyMi41MDkgMTA1LjE1NSAyNy41NDI4IDEwNS4xNTUgMzYuNjczN0MxMDUuMTU1IDUxLjMwNjYgODYuMDgxOSA2My4yNDcxIDcxLjY2MDcgNjQuNDE3N0w2NS43Mjk1IDg1LjM3MjFDNzIuNDc0OCA5My4yMTUzIDkxLjE5OSAxMDAuODI0IDkxLjE5OSA3OS4yODQ4SDEwMi44MjlaIiBmaWxsPSIjRjVGMUVEIi8+Cjwvc3ZnPgo=";
1281
+ var XVERSE_ICON = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MDAiIGhlaWdodD0iNjAwIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGZpbGw9IiMxNzE3MTciIGQ9Ik0wIDBoNjAwdjYwMEgweiIvPjxwYXRoIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgZD0iTTQ0MCA0MzUuNHYtNTFjMC0yLS44LTMuOS0yLjItNS4zTDIyMCAxNjIuMmE3LjYgNy42IDAgMCAwLTUuNC0yLjJoLTUxLjFjLTIuNSAwLTQuNiAyLTQuNiA0LjZ2NDcuM2MwIDIgLjggNCAyLjIgNS40bDc4LjIgNzcuOGE0LjYgNC42IDAgMCAxIDAgNi41bC03OSA3OC43Yy0xIC45LTEuNCAyLTEuNCAzLjJ2NTJjMCAyLjQgMiA0LjUgNC42IDQuNUgyNDljMi42IDAgNC42LTIgNC42LTQuNlY0MDVjMC0xLjIuNS0yLjQgMS40LTMuM2w0Mi40LTQyLjJhNC42IDQuNiAwIDAgMSA2LjQgMGw3OC43IDc4LjRhNy42IDcuNiAwIDAgMCA1LjQgMi4yaDQ3LjVjMi41IDAgNC42LTIgNC42LTQuNloiLz48cGF0aCBmaWxsPSIjRUU3QTMwIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGQ9Ik0zMjUuNiAyMjcuMmg0Mi44YzIuNiAwIDQuNiAyLjEgNC42IDQuNnY0Mi42YzAgNCA1IDYuMSA4IDMuMmw1OC43LTU4LjVjLjgtLjggMS4zLTIgMS4zLTMuMnYtNTEuMmMwLTIuNi0yLTQuNi00LjYtNC42TDM4NCAxNjBjLTEuMiAwLTIuNC41LTMuMyAxLjNsLTU4LjQgNTguMWE0LjYgNC42IDAgMCAwIDMuMiA3LjhaIi8+PC9nPjwvc3ZnPg==";
1282
+ var ASIGNA_ICON = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMDEwMCIgZD0iTTAgMGgzMnYzMkgweiIvPjxwYXRoIGZpbGw9InVybCgjYSkiIGQ9Ik0xNS4xMSA1LjU1YTMgMyAwIDAgMC0xLjgyIDEuM2wtLjA1LjA4LS40My43Mi0uMDcuMTEtLjUuODUtLjA1LjA5LTEuMjkgMi4xOC0uMDQuMDctLjQ3LjgtLjA2LjEtLjQ2Ljc4LS4wNy4xMS0xLjYzIDIuNzYtLjA3LjExLS4zOC42Ni0uMDUuMDgtLjczIDEuMjQtLjM1LjYtLjQuNjctLjA1LjA5TDUuMSAyMC43bC0uMTEuMTgtLjE0LjIzLS4wNy4xMy0uMzMuNTUtLjA0LjA3di4wMWExLjI2IDEuMjYgMCAwIDAtLjE0LjQ3IDEuMzEgMS4zMSAwIDAgMCAxLjI0IDEuNGgxLjVsLjA1LS4wNi4wNC0uMDYuODctMS4yMS4wNS0uMDguNzctMS4wNy4wNS0uMDcuNC0uNTcuMDUtLjA2LjI0LS4zNGExLjUyIDEuNTIgMCAwIDEgMS4zOS0uNjIgMS41IDEuNSAwIDAgMSAuNjQuMiAxLjQ3IDEuNDcgMCAwIDEgLjczIDEuMjcgMS40NCAxLjQ0IDAgMCAxLS4yNy44NGwtLjYzLjg4LS4wNS4wNy0uMzIuNDUtLjA2LjA4LS4wOC4xMi0uMTIuMTYtLjA1LjA4aDIuMTNhMi4zMiAyLjMyIDAgMCAwIDEuNzctLjk2bDEuMTgtMS42My43Ny0xLjA4IDEuMy0xLjhhMS4yNCAxLjI0IDAgMCAxIC41NS0uNDNsLjA4LS4wM2ExLjMgMS4zIDAgMCAxIC4zLS4wNiAxLjI4IDEuMjggMCAwIDEgMS4xNS41NGwuMTEuMmExLjEzIDEuMTMgMCAwIDEgLjEuNDEgMS4xOSAxLjE5IDAgMCAxLS4yMy43N2wtLjAzLjA1LS41Ny44LS43Ljk4LS4yNy4zN2ExLjIyIDEuMjIgMCAwIDAtLjIuNSAxLjA1IDEuMDUgMCAwIDAtLjAyLjIzdi4wNmExLjE3IDEuMTcgMCAwIDAgLjE0LjQzbC4wMi4wNS4wNy4xYTEuNDQgMS40NCAwIDAgMCAuMS4xMWwuMDUuMDYuMDEuMDFhMS44IDEuOCAwIDAgMCAuMTQuMWMwIC4wMi4wMi4wMy4wNC4wM2ExIDEgMCAwIDAgLjA4LjA1bC4wNy4wNGExLjI1IDEuMjUgMCAwIDAgLjUuMWg2LjljLjEgMCAuMi0uMDEuMjktLjAzbC4wNi0uMDJhMS4yNyAxLjI3IDAgMCAwIC4yNy0uMS41Ny41NyAwIDAgMCAuMDctLjAzIDEuMjEgMS4yMSAwIDAgMCAuMjYtLjE5bC4wOC0uMDdhLjkyLjkyIDAgMCAwIC4xNS0uMTkgMS41NSAxLjU1IDAgMCAwIC4wOS0uMTdsLjAyLS4wNWExLjIyIDEuMjIgMCAwIDAgLjA4LS4yNnYtLjA0bC4wMi0uMDh2LS4wOGExLjMyIDEuMzIgMCAwIDAtLjItLjc0bC0xLjYtMi42NC0uMDYtLjEtLjItLjMyLS4zMy0uNTR2LS4wMWwtLjA1LS4wOC0xLjMtMi4xNS0uMDctLjEtLjA0LS4wNi0uOC0xLjMyLS4wNC0uMDctLjItLjM0LS4xLS4xNC0uMS0uMTYtLjUzLS45LS4xMy0uMi0uMDktLjE0LTIuMTctMy41Ny0uMDQtLjA3LS43Mi0xLjE5LS4wNS0uMDctLjQtLjY1YTIuNjUgMi42NSAwIDAgMC0uMy0uNCAyLjk2IDIuOTYgMCAwIDAtLjk3LS43NCAzLjA0IDMuMDQgMCAwIDAtMS4zLS4zYy0uMjUgMC0uNS4wNC0uNzQuMVoiLz48cGF0aCBmaWxsPSJ1cmwoI2IpIiBkPSJNMTkgMTYuM2E1LjQ1IDUuNDUgMCAwIDAtLjgzIDEuNTZsLS4wNC4xNWExLjM2IDEuMzYgMCAwIDEgLjI4LS4xNiAxLjI0IDEuMjQgMCAwIDEgLjM4LS4wOGguMWExLjI4IDEuMjggMCAwIDEgMS4wNS41NGMuMDQuMDYuMDguMTMuMS4yYTEuMjQgMS4yNCAwIDAgMSAuMDkuMjcgMS4xOSAxLjE5IDAgMCAxLS4yLjkxbC0uMDQuMDUtLjU3Ljc5LS43Ljk5LS4yNy4zN2ExLjIzIDEuMjMgMCAwIDAtLjIuNDIgMS4wNiAxLjA2IDAgMCAwLS4wMi4zMXYuMDZhMS4xNyAxLjE3IDAgMCAwIC4xNi40Ny45My45MyAwIDAgMCAuMDcuMSAxLjUgMS41IDAgMCAwIC4xLjEybC4wNS4wNmguMDFhMS45NCAxLjk0IDAgMCAwIC4wOS4wOCAxIDEgMCAwIDAgLjE3LjFsLjA3LjA0YTEuMjUgMS4yNSAwIDAgMCAuNS4xaDYuOWMuMSAwIC4yIDAgLjI4LS4wMmwuMDctLjAyYTEuMzIgMS4zMiAwIDAgMCAuMzQtLjEzbC4xNi0uMS4wMy0uMDNhMS4yOSAxLjI5IDAgMCAwIC4yLS4yIDIuNDMgMi40MyAwIDAgMCAuMTItLjE3Yy4wMy0uMDMuMDUtLjA4LjA3LS4xMmwuMDItLjA1YTEuMjEgMS4yMSAwIDAgMCAuMDktLjN2LS4wOGwuMDEtLjA5YTEuMzIgMS4zMiAwIDAgMC0uMi0uNzNsLTEuNi0yLjY0LS4wNi0uMS0uMi0uMzItLjMzLS41NHYtLjAybC0uMDUtLjA3LTEuMy0yLjE1LS4xMi0uMDctLjA3LS4wNGE0Ljk0IDQuOTQgMCAwIDAtMi40Ni0uNjdjLTEuMDMgMC0xLjc2LjU3LTIuMjYgMS4yWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMi4yOSAyMS4wOGMwIC4yOS0uMDkuNTgtLjI3Ljg0bC0xLjMxIDEuODRIN2wyLjUyLTMuNTNhMS41NCAxLjU0IDAgMCAxIDIuMS0uMzZjLjQzLjI4LjY2Ljc0LjY2IDEuMloiLz48cGF0aCBmaWxsPSIjMDAwIiBkPSJNMTEuMTYgMjEuMjVhLjU2LjU2IDAgMCAxLS41Ny41NS41Ni41NiAwIDAgMS0uNTctLjU2LjU2LjU2IDAgMCAxIC41Ny0uNTUuNTYuNTYgMCAwIDEgLjU3LjU2WiIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjE1LjIzIiB4Mj0iMTkuMyIgeTE9IjI1Ljc4IiB5Mj0iNi4xMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM2NTIyRjQiLz48c3RvcCBvZmZzZXQ9Ii41NSIgc3RvcC1jb2xvcj0iIzlCNkJGRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0E1ODVGRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMjIuNTkiIHgyPSIyNC44IiB5MT0iMjQuNzEiIHkyPSIxNS41MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM0MjFGOEIiLz48c3RvcCBvZmZzZXQ9Ii41NSIgc3RvcC1jb2xvcj0iIzcyMzBGRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzk3NzNGRiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvc3ZnPg==";
1283
+ var FORDEFI_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZmlsbD0iIzEwMTExNCIgZD0iTTAgMGg0MnY0MkgweiIvPgogIDxwYXRoIGQ9Ik0xOS40NyAyNi44OUg1djMuNTdhNC41NyA0LjU3IDAgMCAwIDQuNTggNC41N2g1LjgzbDQuMDYtOC4xNFoiIGZpbGw9IiM3OTk0RkYiLz4KICA8cGF0aCBkPSJNNSAxNy40aDI3LjU4bC0zLjIgNi43OEg1VjE3LjRaIiBmaWxsPSIjNDg2REZGIi8+CiAgPHBhdGggZD0iTTE0LjY3IDdINXY3LjY4aDMzVjdoLTkuNjd2NS43NGgtMlY3aC05LjY3djUuNzRoLTEuOTlWN1oiIGZpbGw9IiM1Q0QxRkEiLz4KPC9zdmc+Cg==";
1284
+ var STACKS_PROVIDERS = [
1285
+ {
1286
+ id: "LeatherProvider",
1287
+ name: "Leather",
1288
+ icon: LEATHER_ICON,
1289
+ installUrl: "https://chrome.google.com/webstore/detail/hiro-wallet/ldinpeekobnhjjdofggfgjlcehhmanlj"
1290
+ },
1291
+ {
1292
+ id: "XverseProviders.BitcoinProvider",
1293
+ name: "Xverse Wallet",
1294
+ icon: XVERSE_ICON,
1295
+ installUrl: "https://chrome.google.com/webstore/detail/xverse-wallet/idnnbdplmphpflfnlkomgpfbpcgelopg"
1296
+ },
1297
+ {
1298
+ id: "AsignaProvider",
1299
+ name: "Asigna Multisig",
1300
+ icon: ASIGNA_ICON,
1301
+ installUrl: "https://stx.asigna.io/"
1302
+ },
1303
+ {
1304
+ id: "FordefiProviders.UtxoProvider",
1305
+ name: "Fordefi",
1306
+ icon: FORDEFI_ICON,
1307
+ installUrl: "https://chromewebstore.google.com/detail/fordefi/hcmehenccjdmfbojapcbcofkgdpbnlle"
1308
+ }
1309
+ ];
1310
+ function useStacksXConnectors() {
1311
+ return React2.useMemo(() => STACKS_PROVIDERS.map((config) => new StacksXConnector(config)), []);
1312
+ }
1181
1313
 
1182
1314
  // src/useXWagmiStore.ts
1183
1315
  var initXServices = () => {
1184
1316
  const xServices = {};
1185
- ["EVM", "BITCOIN", "INJECTIVE", "STELLAR", "SUI", "SOLANA", "ICON", "NEAR"].forEach((key) => {
1317
+ ["EVM", "BITCOIN", "INJECTIVE", "STELLAR", "SUI", "SOLANA", "ICON", "NEAR", "STACKS"].forEach((key) => {
1186
1318
  const xChainType = key;
1187
1319
  switch (xChainType) {
1188
1320
  // EVM, SUI, Solana wallet connectors are supported by their own sdks. wagmi, @mysten/dapp-kit, @solana/wallet-adapter-react.
@@ -1223,6 +1355,10 @@ var initXServices = () => {
1223
1355
  xServices[xChainType] = NearXService.getInstance();
1224
1356
  xServices[xChainType].setXConnectors([]);
1225
1357
  break;
1358
+ case "STACKS":
1359
+ xServices[xChainType] = StacksXService.getInstance();
1360
+ xServices[xChainType].setXConnectors(STACKS_PROVIDERS.map((config) => new StacksXConnector(config)));
1361
+ break;
1226
1362
  }
1227
1363
  });
1228
1364
  return xServices;
@@ -1510,6 +1646,7 @@ function useXConnectors(xChainType) {
1510
1646
  const suiWallets = dappKit.useWallets();
1511
1647
  const { data: stellarXConnectors } = useStellarXConnectors();
1512
1648
  const { data: nearXConnectors } = useNearXConnectors();
1649
+ const stacksXConnectors = useStacksXConnectors();
1513
1650
  const { wallets: solanaWallets } = walletAdapterReact.useWallet();
1514
1651
  const xConnectors = React2.useMemo(() => {
1515
1652
  if (!xChainType || !xService) {
@@ -1526,10 +1663,21 @@ function useXConnectors(xChainType) {
1526
1663
  return solanaWallets.filter((wallet) => wallet.readyState === "Installed").map((wallet) => new SolanaXConnector(wallet));
1527
1664
  case "NEAR":
1528
1665
  return nearXConnectors || [];
1666
+ case "STACKS":
1667
+ return stacksXConnectors;
1529
1668
  default:
1530
1669
  return xService.getXConnectors();
1531
1670
  }
1532
- }, [xService, xChainType, evmConnectors, suiWallets, stellarXConnectors, solanaWallets, nearXConnectors]);
1671
+ }, [
1672
+ xService,
1673
+ xChainType,
1674
+ evmConnectors,
1675
+ suiWallets,
1676
+ stellarXConnectors,
1677
+ solanaWallets,
1678
+ nearXConnectors,
1679
+ stacksXConnectors
1680
+ ]);
1533
1681
  return xConnectors;
1534
1682
  }
1535
1683
  function useXDisconnect() {
@@ -1650,6 +1798,8 @@ function useWalletProvider(spokeChainId) {
1650
1798
  const { data: evmWalletClient } = wagmi.useWalletClient();
1651
1799
  const xService = useXService(getXChainType(spokeChainId));
1652
1800
  const xAccount = useXAccount(spokeChainId);
1801
+ const stacksConnection = useXConnection("STACKS");
1802
+ const stacksConnectors = useXConnectors("STACKS");
1653
1803
  const xConnection = useXConnection(xChainType);
1654
1804
  return React2.useMemo(() => {
1655
1805
  switch (xChainType) {
@@ -1730,10 +1880,27 @@ function useWalletProvider(spokeChainId) {
1730
1880
  }
1731
1881
  return new walletSdkCore.NearWalletProvider({ wallet: nearXService.walletSelector });
1732
1882
  }
1883
+ case "STACKS": {
1884
+ const address = xAccount.address;
1885
+ if (!address) {
1886
+ return void 0;
1887
+ }
1888
+ const activeStacksConnector = stacksConnectors.find((c) => c.id === stacksConnection?.xConnectorId);
1889
+ return new walletSdkCore.StacksWalletProvider({ address, provider: activeStacksConnector?.getProvider() });
1890
+ }
1733
1891
  default:
1734
1892
  return void 0;
1735
1893
  }
1736
- }, [xChainType, evmPublicClient, evmWalletClient, xService, xAccount, xConnection]);
1894
+ }, [
1895
+ xChainType,
1896
+ evmPublicClient,
1897
+ evmWalletClient,
1898
+ xService,
1899
+ xAccount,
1900
+ stacksConnection,
1901
+ stacksConnectors,
1902
+ xConnection
1903
+ ]);
1737
1904
  }
1738
1905
  function useXSignMessage() {
1739
1906
  const { signMessage } = walletAdapterReact.useWallet();
@@ -1797,7 +1964,7 @@ function useBitcoinXConnectors() {
1797
1964
  return xService?.getXConnectors() || [];
1798
1965
  }, [xService]);
1799
1966
  }
1800
- var Hydrate = () => {
1967
+ var Hydrate = ({ rpcConfig }) => {
1801
1968
  const suiClient = dappKit.useSuiClient();
1802
1969
  React2.useEffect(() => {
1803
1970
  if (suiClient) {
@@ -1834,6 +2001,12 @@ var Hydrate = () => {
1834
2001
  EvmXService.getInstance().wagmiConfig = wagmiConfig;
1835
2002
  }
1836
2003
  }, [wagmiConfig]);
2004
+ React2.useEffect(() => {
2005
+ StacksXService.getInstance().network = network.createNetwork({
2006
+ network: "mainnet",
2007
+ client: { baseUrl: rpcConfig.stacks ?? "https://api.mainnet.hiro.so" }
2008
+ });
2009
+ }, [rpcConfig.stacks]);
1837
2010
  return null;
1838
2011
  };
1839
2012
 
@@ -1888,7 +2061,7 @@ var SodaxWalletProvider = ({ children, rpcConfig }) => {
1888
2061
  return createWagmiConfig(rpcConfig);
1889
2062
  }, [rpcConfig]);
1890
2063
  const wallets = React2.useMemo(() => [new walletAdapterWallets.UnsafeBurnerWalletAdapter()], []);
1891
- return /* @__PURE__ */ React2__default.default.createElement(reactQuery.QueryClientProvider, { client: queryClient }, /* @__PURE__ */ React2__default.default.createElement(wagmi.WagmiProvider, { reconnectOnMount: false, config: wagmiConfig }, /* @__PURE__ */ React2__default.default.createElement(dappKit.SuiClientProvider, { networks: { mainnet: { url: client.getFullnodeUrl("mainnet") } }, defaultNetwork: "mainnet" }, /* @__PURE__ */ React2__default.default.createElement(dappKit.WalletProvider, { autoConnect: true }, /* @__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: true }, /* @__PURE__ */ React2__default.default.createElement(Hydrate, null), children))))));
2064
+ return /* @__PURE__ */ React2__default.default.createElement(reactQuery.QueryClientProvider, { client: queryClient }, /* @__PURE__ */ React2__default.default.createElement(wagmi.WagmiProvider, { reconnectOnMount: false, config: wagmiConfig }, /* @__PURE__ */ React2__default.default.createElement(dappKit.SuiClientProvider, { networks: { mainnet: { url: client.getFullnodeUrl("mainnet") } }, defaultNetwork: "mainnet" }, /* @__PURE__ */ React2__default.default.createElement(dappKit.WalletProvider, { autoConnect: true }, /* @__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: true }, /* @__PURE__ */ React2__default.default.createElement(Hydrate, { rpcConfig }), children))))));
1892
2065
  };
1893
2066
  reconnectIcon();
1894
2067
  reconnectStellar();
@@ -1913,9 +2086,12 @@ exports.InjectiveKelprXConnector = InjectiveKelprXConnector;
1913
2086
  exports.InjectiveMetamaskXConnector = InjectiveMetamaskXConnector;
1914
2087
  exports.InjectiveXService = InjectiveXService;
1915
2088
  exports.OKXXConnector = OKXXConnector;
2089
+ exports.STACKS_PROVIDERS = STACKS_PROVIDERS;
1916
2090
  exports.SodaxWalletProvider = SodaxWalletProvider;
1917
2091
  exports.SolanaXConnector = SolanaXConnector;
1918
2092
  exports.SolanaXService = SolanaXService;
2093
+ exports.StacksXConnector = StacksXConnector;
2094
+ exports.StacksXService = StacksXService;
1919
2095
  exports.StellarWalletsKitXConnector = StellarWalletsKitXConnector;
1920
2096
  exports.StellarXService = StellarXService;
1921
2097
  exports.SuiXConnector = SuiXConnector;
@@ -1932,6 +2108,7 @@ exports.isNativeToken = isNativeToken;
1932
2108
  exports.switchEthereumChain = switchEthereumChain;
1933
2109
  exports.useBitcoinXConnectors = useBitcoinXConnectors;
1934
2110
  exports.useEvmSwitchChain = useEvmSwitchChain;
2111
+ exports.useStacksXConnectors = useStacksXConnectors;
1935
2112
  exports.useWalletProvider = useWalletProvider;
1936
2113
  exports.useXAccount = useXAccount;
1937
2114
  exports.useXAccounts = useXAccounts;