@sodax/wallet-sdk-react 1.3.1-beta-rc1 → 1.3.1-beta-rc2

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,11 +3,17 @@
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 satsConnect = require('sats-connect');
7
+ var React2 = require('react');
8
+ var dappKit = require('@mysten/dapp-kit');
9
+ var walletAdapterReact = require('@solana/wallet-adapter-react');
10
+ var wagmi = require('wagmi');
11
+ var zustand = require('zustand');
12
+ var middleware = require('zustand/middleware');
13
+ var immer = require('zustand/middleware/immer');
6
14
  var viem = require('viem');
7
15
  var actions = require('wagmi/actions');
8
- var wagmi = require('wagmi');
9
16
  var chains = require('wagmi/chains');
10
- var IconSdkRaw = require('icon-sdk-js');
11
17
  var networks = require('@injectivelabs/networks');
12
18
  var sdkTs = require('@injectivelabs/sdk-ts');
13
19
  var tsTypes = require('@injectivelabs/ts-types');
@@ -19,12 +25,7 @@ var web3_js = require('@solana/web3.js');
19
25
  var splToken = require('@solana/spl-token');
20
26
  var stellarWalletsKit = require('@creit.tech/stellar-wallets-kit');
21
27
  var StellarSdk = require('@stellar/stellar-sdk');
22
- var React2 = require('react');
23
- var dappKit = require('@mysten/dapp-kit');
24
- var walletAdapterReact = require('@solana/wallet-adapter-react');
25
- var zustand = require('zustand');
26
- var middleware = require('zustand/middleware');
27
- var immer = require('zustand/middleware/immer');
28
+ var IconSdkRaw = require('icon-sdk-js');
28
29
  var reactQuery = require('@tanstack/react-query');
29
30
  var chains$1 = require('viem/chains');
30
31
  var walletSdkCore = require('@sodax/wallet-sdk-core');
@@ -51,9 +52,9 @@ function _interopNamespace(e) {
51
52
  return Object.freeze(n);
52
53
  }
53
54
 
54
- var IconSdkRaw__namespace = /*#__PURE__*/_interopNamespace(IconSdkRaw);
55
- var StellarSdk__namespace = /*#__PURE__*/_interopNamespace(StellarSdk);
56
55
  var React2__default = /*#__PURE__*/_interopDefault(React2);
56
+ var StellarSdk__namespace = /*#__PURE__*/_interopNamespace(StellarSdk);
57
+ var IconSdkRaw__namespace = /*#__PURE__*/_interopNamespace(IconSdkRaw);
57
58
 
58
59
  // src/actions/getXChainType.ts
59
60
  function getXChainType(xChainId) {
@@ -149,6 +150,8 @@ var NearXService = class _NearXService extends XService {
149
150
  // src/actions/getXService.ts
150
151
  function getXService(xChainType) {
151
152
  switch (xChainType) {
153
+ case "BITCOIN":
154
+ return BitcoinXService.getInstance();
152
155
  case "EVM":
153
156
  return EvmXService.getInstance();
154
157
  case "SUI":
@@ -193,14 +196,341 @@ var isNativeToken = (xToken) => {
193
196
  "hx0000000000000000000000000000000000000000",
194
197
  "11111111111111111111111111111111",
195
198
  // solana
196
- "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA"
197
- // stellar,
199
+ "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA",
200
+ // stellar
201
+ "0:0"
202
+ // bitcoin
198
203
  ];
199
204
  return nativeAddresses.includes(xToken.address);
200
205
  };
201
206
  var getWagmiChainId = (xChainId) => {
202
207
  return types.baseChainInfo[xChainId].chainId;
203
208
  };
209
+
210
+ // src/xchains/bitcoin/BitcoinXService.ts
211
+ var BitcoinXService = class _BitcoinXService extends XService {
212
+ constructor(rpcUrl = "https://mempool.space/api") {
213
+ super("BITCOIN");
214
+ this.rpcUrl = rpcUrl;
215
+ }
216
+ static getInstance(rpcUrl) {
217
+ if (!_BitcoinXService.instance) {
218
+ _BitcoinXService.instance = new _BitcoinXService(rpcUrl);
219
+ } else if (rpcUrl && rpcUrl !== _BitcoinXService.instance.rpcUrl) {
220
+ _BitcoinXService.instance.rpcUrl = rpcUrl;
221
+ }
222
+ return _BitcoinXService.instance;
223
+ }
224
+ async getBalance(address, xToken) {
225
+ if (!address) return 0n;
226
+ try {
227
+ if (isNativeToken(xToken)) {
228
+ const response = await fetch(`${this.rpcUrl}/address/${address}/utxo`);
229
+ if (!response.ok) return 0n;
230
+ const utxos = await response.json();
231
+ const totalBalance = utxos.reduce((sum, utxo) => sum + utxo.value, 0);
232
+ return BigInt(totalBalance);
233
+ }
234
+ } catch {
235
+ return 0n;
236
+ }
237
+ return 0n;
238
+ }
239
+ };
240
+
241
+ // src/xchains/bitcoin/BitcoinXConnector.ts
242
+ var BitcoinXConnector = class extends XConnector {
243
+ constructor(name, id) {
244
+ super("BITCOIN", name, id);
245
+ }
246
+ getXService() {
247
+ return BitcoinXService.getInstance();
248
+ }
249
+ };
250
+ var UnisatWalletProvider = class {
251
+ constructor(unisat, address) {
252
+ this.unisat = unisat;
253
+ this.cachedAddress = address;
254
+ }
255
+ async getWalletAddress() {
256
+ try {
257
+ const accounts = await this.unisat.getAccounts();
258
+ if (accounts[0]) this.cachedAddress = accounts[0];
259
+ } catch {
260
+ }
261
+ return this.cachedAddress;
262
+ }
263
+ async getPublicKey() {
264
+ return this.unisat.getPublicKey();
265
+ }
266
+ async getAddressType(_address) {
267
+ const address = await this.getWalletAddress();
268
+ return types.detectBitcoinAddressType(address);
269
+ }
270
+ async signTransaction(psbtBase64, finalize = false) {
271
+ const psbtHex = Buffer.from(psbtBase64, "base64").toString("hex");
272
+ const signedHex = await this.unisat.signPsbt(psbtHex, { autoFinalized: finalize });
273
+ return signedHex;
274
+ }
275
+ async signEcdsaMessage(message) {
276
+ return this.unisat.signMessage(message, "ecdsa");
277
+ }
278
+ async signBip322Message(message) {
279
+ return this.unisat.signMessage(message, "bip322-simple");
280
+ }
281
+ async sendBitcoin(toAddress, satoshis) {
282
+ if (satoshis > BigInt(Number.MAX_SAFE_INTEGER)) {
283
+ throw new Error(`Amount ${satoshis} satoshis exceeds safe integer range`);
284
+ }
285
+ return this.unisat.sendBitcoin(toAddress, Number(satoshis));
286
+ }
287
+ };
288
+ var UnisatXConnector = class extends BitcoinXConnector {
289
+ constructor() {
290
+ super("Unisat", "unisat");
291
+ }
292
+ static isAvailable() {
293
+ return typeof window !== "undefined" && !!window.unisat;
294
+ }
295
+ get icon() {
296
+ return "https://avatars.githubusercontent.com/u/125119198?s=200&v=4";
297
+ }
298
+ async connect() {
299
+ if (!window.unisat) {
300
+ throw new Error("Unisat wallet is not installed");
301
+ }
302
+ const accounts = await window.unisat.requestAccounts();
303
+ const address = accounts[0];
304
+ if (!address) return void 0;
305
+ this.walletProvider = new UnisatWalletProvider(window.unisat, address);
306
+ return {
307
+ address,
308
+ xChainType: "BITCOIN"
309
+ };
310
+ }
311
+ async disconnect() {
312
+ this.walletProvider = void 0;
313
+ }
314
+ getWalletProvider() {
315
+ return this.walletProvider;
316
+ }
317
+ recreateWalletProvider(xAccount) {
318
+ if (!window.unisat || !xAccount.address) return void 0;
319
+ return new UnisatWalletProvider(window.unisat, xAccount.address);
320
+ }
321
+ };
322
+ var XverseWalletProvider = class {
323
+ constructor(address, publicKey) {
324
+ this.address = address;
325
+ this.publicKey = publicKey;
326
+ }
327
+ async getWalletAddress() {
328
+ return this.address;
329
+ }
330
+ async getPublicKey() {
331
+ return this.publicKey;
332
+ }
333
+ async getAddressType(_address) {
334
+ return types.detectBitcoinAddressType(this.address);
335
+ }
336
+ /**
337
+ * Parse a base64-encoded PSBT to count the number of inputs.
338
+ * Reads the unsigned transaction from the PSBT global section.
339
+ */
340
+ countPsbtInputs(psbtBase64) {
341
+ const data = Buffer.from(psbtBase64, "base64");
342
+ let offset = 5;
343
+ const keyLen = data[offset++] ?? 0;
344
+ if (keyLen !== 1 || data[offset++] !== 0) {
345
+ return 1;
346
+ }
347
+ const firstByte = data[offset++] ?? 0;
348
+ if (firstByte === 253) offset += 2;
349
+ else if (firstByte === 254) offset += 4;
350
+ else if (firstByte === 255) offset += 8;
351
+ offset += 4;
352
+ const inputByte = data[offset] ?? 0;
353
+ if (inputByte < 253) return inputByte;
354
+ return 1;
355
+ }
356
+ async signTransaction(psbtBase64, finalize = false) {
357
+ const { request: request2 } = await import('sats-connect');
358
+ const inputCount = this.countPsbtInputs(psbtBase64);
359
+ const signingIndexes = Array.from({ length: inputCount }, (_, i) => i);
360
+ const response = await request2("signPsbt", {
361
+ psbt: psbtBase64,
362
+ broadcast: false,
363
+ signInputs: {
364
+ [this.address]: signingIndexes
365
+ }
366
+ });
367
+ if (response.status === "error") {
368
+ throw new Error(response.error?.message || "Xverse PSBT signing failed");
369
+ }
370
+ const result = response.result;
371
+ if (finalize) {
372
+ return Buffer.from(result.psbt, "base64").toString("hex");
373
+ }
374
+ return result.psbt;
375
+ }
376
+ async signEcdsaMessage(message) {
377
+ const { request: request2 } = await import('sats-connect');
378
+ const response = await request2("signMessage", {
379
+ address: this.address,
380
+ message,
381
+ protocol: satsConnect.MessageSigningProtocols.ECDSA
382
+ });
383
+ if (response.status === "error") {
384
+ throw new Error(response.error?.message || "Xverse ECDSA signing failed");
385
+ }
386
+ return response.result.signature;
387
+ }
388
+ async signBip322Message(message) {
389
+ const { request: request2 } = await import('sats-connect');
390
+ const response = await request2("signMessage", {
391
+ address: this.address,
392
+ message,
393
+ protocol: satsConnect.MessageSigningProtocols.BIP322
394
+ });
395
+ if (response.status === "error") {
396
+ throw new Error(response.error?.message || "Xverse BIP322 signing failed");
397
+ }
398
+ return response.result.signature;
399
+ }
400
+ async sendBitcoin(toAddress, satoshis) {
401
+ const { request: request2 } = await import('sats-connect');
402
+ const response = await request2("sendTransfer", {
403
+ recipients: [
404
+ {
405
+ address: toAddress,
406
+ amount: Number(satoshis)
407
+ }
408
+ ]
409
+ });
410
+ if (response.status === "error") {
411
+ throw new Error(response.error?.message || "Xverse sendTransfer failed");
412
+ }
413
+ return response.result.txid;
414
+ }
415
+ };
416
+ var XverseXConnector = class _XverseXConnector extends BitcoinXConnector {
417
+ constructor() {
418
+ super("Xverse", "xverse");
419
+ }
420
+ static isAvailable() {
421
+ return typeof window !== "undefined" && !!window.BitcoinProvider;
422
+ }
423
+ get icon() {
424
+ return "https://cdn.brandfetch.io/iddzGN5Rcv/w/400/h/400/theme/dark/icon.jpeg?c=1bxid64Mup7aczewSAYMX&t=1771902357797";
425
+ }
426
+ async connect() {
427
+ if (!_XverseXConnector.isAvailable()) {
428
+ throw new Error("Xverse wallet is not installed");
429
+ }
430
+ const { request: request2 } = await import('sats-connect');
431
+ const response = await request2("getAccounts", {
432
+ purposes: [satsConnect.AddressPurpose.Payment],
433
+ message: "Connect to Sodax"
434
+ });
435
+ if (response.status === "error") {
436
+ throw new Error(response.error?.message || "Xverse connection failed");
437
+ }
438
+ const accounts = response.result;
439
+ const paymentAccount = accounts.find((a) => a.purpose === satsConnect.AddressPurpose.Payment) || accounts[0];
440
+ if (!paymentAccount) return void 0;
441
+ this.walletProvider = new XverseWalletProvider(
442
+ paymentAccount.address,
443
+ paymentAccount.publicKey
444
+ );
445
+ return {
446
+ address: paymentAccount.address,
447
+ publicKey: paymentAccount.publicKey,
448
+ xChainType: "BITCOIN"
449
+ };
450
+ }
451
+ async disconnect() {
452
+ this.walletProvider = void 0;
453
+ }
454
+ getWalletProvider() {
455
+ return this.walletProvider;
456
+ }
457
+ recreateWalletProvider(xAccount) {
458
+ if (!xAccount.address || !xAccount.publicKey) return void 0;
459
+ return new XverseWalletProvider(xAccount.address, xAccount.publicKey);
460
+ }
461
+ };
462
+ var OKXWalletProvider = class {
463
+ constructor(okx, address) {
464
+ this.okx = okx;
465
+ this.cachedAddress = address;
466
+ }
467
+ async getWalletAddress() {
468
+ try {
469
+ const accounts = await this.okx.getAccounts();
470
+ if (accounts[0]) this.cachedAddress = accounts[0];
471
+ } catch {
472
+ }
473
+ return this.cachedAddress;
474
+ }
475
+ async getPublicKey() {
476
+ return this.okx.getPublicKey();
477
+ }
478
+ async getAddressType(_address) {
479
+ const address = await this.getWalletAddress();
480
+ return types.detectBitcoinAddressType(address);
481
+ }
482
+ async signTransaction(psbtBase64, finalize = false) {
483
+ const psbtHex = Buffer.from(psbtBase64, "base64").toString("hex");
484
+ return this.okx.signPsbt(psbtHex, { autoFinalized: finalize });
485
+ }
486
+ async signEcdsaMessage(message) {
487
+ return this.okx.signMessage(message, "ecdsa");
488
+ }
489
+ async signBip322Message(message) {
490
+ return this.okx.signMessage(message, "bip322-simple");
491
+ }
492
+ async sendBitcoin(toAddress, satoshis) {
493
+ if (satoshis > BigInt(Number.MAX_SAFE_INTEGER)) {
494
+ throw new Error(`Amount ${satoshis} satoshis exceeds safe integer range`);
495
+ }
496
+ return this.okx.sendBitcoin(toAddress, Number(satoshis));
497
+ }
498
+ };
499
+ var OKXXConnector = class extends BitcoinXConnector {
500
+ constructor() {
501
+ super("OKX Wallet", "okx-bitcoin");
502
+ }
503
+ static isAvailable() {
504
+ return typeof window !== "undefined" && !!window.okxwallet?.bitcoin;
505
+ }
506
+ get icon() {
507
+ return "https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png";
508
+ }
509
+ async connect() {
510
+ const okx = window.okxwallet?.bitcoin;
511
+ if (!okx) {
512
+ throw new Error("OKX wallet is not installed");
513
+ }
514
+ const { address } = await okx.connect();
515
+ if (!address) return void 0;
516
+ this.walletProvider = new OKXWalletProvider(okx, address);
517
+ return {
518
+ address,
519
+ xChainType: "BITCOIN"
520
+ };
521
+ }
522
+ async disconnect() {
523
+ this.walletProvider = void 0;
524
+ }
525
+ getWalletProvider() {
526
+ return this.walletProvider;
527
+ }
528
+ recreateWalletProvider(xAccount) {
529
+ const okx = window.okxwallet?.bitcoin;
530
+ if (!okx || !xAccount.address) return void 0;
531
+ return new OKXWalletProvider(okx, xAccount.address);
532
+ }
533
+ };
204
534
  var hyper = /* @__PURE__ */ viem.defineChain({
205
535
  id: 999,
206
536
  name: "HyperEVM",
@@ -360,117 +690,6 @@ var EvmXConnector = class extends XConnector {
360
690
  return this.connector.icon;
361
691
  }
362
692
  };
363
- var IconSdk = "default" in IconSdkRaw__namespace.default ? IconSdkRaw__namespace.default : IconSdkRaw__namespace;
364
- var { IconService: IconServiceConstructor, Builder: IconBuilder, Converter: IconConverter } = IconSdk;
365
- var CHAIN_INFO = {
366
- [1 /* MAINNET */]: {
367
- APIEndpoint: "https://ctz.solidwallet.io/api/v3"}
368
- };
369
- var IconXService = class _IconXService extends XService {
370
- constructor() {
371
- super("ICON");
372
- this.iconService = new IconServiceConstructor(
373
- new IconServiceConstructor.HttpProvider(CHAIN_INFO[1 /* MAINNET */].APIEndpoint)
374
- );
375
- }
376
- static getInstance() {
377
- if (!_IconXService.instance) {
378
- _IconXService.instance = new _IconXService();
379
- }
380
- return _IconXService.instance;
381
- }
382
- async getAggregateData(requireSuccess, calls) {
383
- const rawTx = new IconBuilder.CallBuilder().to("cxa4aa9185e23558cff990f494c1fd2845f6cbf741").method("tryAggregate").params({ requireSuccess: IconConverter.toHex(requireSuccess ? 1 : 0), calls }).build();
384
- try {
385
- const result = await this.iconService.call(rawTx).execute();
386
- const aggs = result["returnData"];
387
- const data = aggs.map((agg) => {
388
- if (agg["success"] === "0x0") {
389
- return null;
390
- }
391
- return agg["returnData"];
392
- });
393
- return data;
394
- } catch (err) {
395
- console.error(err);
396
- return Array(calls.length).fill(null);
397
- }
398
- }
399
- async getBalances(address, xTokens) {
400
- if (!address) return {};
401
- const balances = {};
402
- const nativeXToken = xTokens.find((xToken) => isNativeToken(xToken));
403
- const nonNativeXTokens = xTokens.filter((xToken) => !isNativeToken(xToken));
404
- if (nativeXToken) {
405
- const balance = await this.iconService.getBalance(address).execute();
406
- balances[nativeXToken.address] = BigInt(balance.toFixed());
407
- }
408
- const cds = nonNativeXTokens.map((token) => {
409
- return {
410
- target: token.address,
411
- method: "balanceOf",
412
- params: [address]
413
- };
414
- });
415
- const data = await this.getAggregateData(
416
- false,
417
- cds.filter((cd) => cd.target.startsWith("cx"))
418
- );
419
- return nonNativeXTokens.reduce((agg, token, idx) => {
420
- const balance = data[idx];
421
- balances[token.address] = BigInt(balance);
422
- return agg;
423
- }, balances);
424
- }
425
- };
426
-
427
- // src/xchains/icon/iconex/index.tsx
428
- var ICONEX_RELAY_RESPONSE = "ICONEX_RELAY_RESPONSE";
429
- var ICONEX_RELAY_REQUEST = "ICONEX_RELAY_REQUEST";
430
- var request = (event) => {
431
- return new Promise((resolve, reject) => {
432
- const handler = (evt) => {
433
- window.removeEventListener(ICONEX_RELAY_RESPONSE, handler);
434
- resolve(evt.detail);
435
- };
436
- window.addEventListener(ICONEX_RELAY_RESPONSE, handler);
437
- window.dispatchEvent(
438
- new CustomEvent(ICONEX_RELAY_REQUEST, {
439
- detail: event
440
- })
441
- );
442
- });
443
- };
444
-
445
- // src/xchains/icon/IconHanaXConnector.ts
446
- var IconHanaXConnector = class extends XConnector {
447
- constructor() {
448
- super("ICON", "Hana Wallet", "hana");
449
- }
450
- async connect() {
451
- const { hanaWallet } = window;
452
- if (window && !hanaWallet && !hanaWallet?.isAvailable) {
453
- window.open("https://chromewebstore.google.com/detail/hana-wallet/jfdlamikmbghhapbgfoogdffldioobgl", "_blank");
454
- return;
455
- }
456
- const detail = await request({
457
- type: "REQUEST_ADDRESS" /* REQUEST_ADDRESS */
458
- });
459
- if (detail?.type === "RESPONSE_ADDRESS" /* RESPONSE_ADDRESS */) {
460
- return {
461
- address: detail?.payload,
462
- xChainType: this.xChainType
463
- };
464
- }
465
- return void 0;
466
- }
467
- async disconnect() {
468
- console.log("HanaIconXConnector disconnected");
469
- }
470
- get icon() {
471
- return "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/hana.svg";
472
- }
473
- };
474
693
  var InjectiveXService = class _InjectiveXService extends XService {
475
694
  constructor() {
476
695
  super("INJECTIVE");
@@ -607,25 +826,6 @@ var SolanaXService = class _SolanaXService extends XService {
607
826
  }
608
827
  }
609
828
  };
610
-
611
- // src/xchains/solana/SolanaXConnector.ts
612
- var SolanaXConnector = class extends XConnector {
613
- constructor(wallet) {
614
- super("SOLANA", wallet?.adapter.name, wallet?.adapter.name);
615
- this.wallet = wallet;
616
- }
617
- getXService() {
618
- return SolanaXService.getInstance();
619
- }
620
- async connect() {
621
- return;
622
- }
623
- async disconnect() {
624
- }
625
- get icon() {
626
- return this.wallet?.adapter.icon;
627
- }
628
- };
629
829
  var CustomSorobanServer = class extends StellarSdk.SorobanRpc.Server {
630
830
  constructor(serverUrl, customHeaders) {
631
831
  super(serverUrl, {
@@ -867,9 +1067,122 @@ var SuiXConnector = class extends XConnector {
867
1067
  return this.wallet?.icon;
868
1068
  }
869
1069
  };
1070
+ var IconSdk = "default" in IconSdkRaw__namespace.default ? IconSdkRaw__namespace.default : IconSdkRaw__namespace;
1071
+ var { IconService: IconServiceConstructor, Builder: IconBuilder, Converter: IconConverter } = IconSdk;
1072
+ var CHAIN_INFO = {
1073
+ [1 /* MAINNET */]: {
1074
+ APIEndpoint: "https://ctz.solidwallet.io/api/v3"}
1075
+ };
1076
+ var IconXService = class _IconXService extends XService {
1077
+ constructor() {
1078
+ super("ICON");
1079
+ this.iconService = new IconServiceConstructor(
1080
+ new IconServiceConstructor.HttpProvider(CHAIN_INFO[1 /* MAINNET */].APIEndpoint)
1081
+ );
1082
+ }
1083
+ static getInstance() {
1084
+ if (!_IconXService.instance) {
1085
+ _IconXService.instance = new _IconXService();
1086
+ }
1087
+ return _IconXService.instance;
1088
+ }
1089
+ async getAggregateData(requireSuccess, calls) {
1090
+ const rawTx = new IconBuilder.CallBuilder().to("cxa4aa9185e23558cff990f494c1fd2845f6cbf741").method("tryAggregate").params({ requireSuccess: IconConverter.toHex(requireSuccess ? 1 : 0), calls }).build();
1091
+ try {
1092
+ const result = await this.iconService.call(rawTx).execute();
1093
+ const aggs = result["returnData"];
1094
+ const data = aggs.map((agg) => {
1095
+ if (agg["success"] === "0x0") {
1096
+ return null;
1097
+ }
1098
+ return agg["returnData"];
1099
+ });
1100
+ return data;
1101
+ } catch (err) {
1102
+ console.error(err);
1103
+ return Array(calls.length).fill(null);
1104
+ }
1105
+ }
1106
+ async getBalances(address, xTokens) {
1107
+ if (!address) return {};
1108
+ const balances = {};
1109
+ const nativeXToken = xTokens.find((xToken) => isNativeToken(xToken));
1110
+ const nonNativeXTokens = xTokens.filter((xToken) => !isNativeToken(xToken));
1111
+ if (nativeXToken) {
1112
+ const balance = await this.iconService.getBalance(address).execute();
1113
+ balances[nativeXToken.address] = BigInt(balance.toFixed());
1114
+ }
1115
+ const cds = nonNativeXTokens.map((token) => {
1116
+ return {
1117
+ target: token.address,
1118
+ method: "balanceOf",
1119
+ params: [address]
1120
+ };
1121
+ });
1122
+ const data = await this.getAggregateData(
1123
+ false,
1124
+ cds.filter((cd) => cd.target.startsWith("cx"))
1125
+ );
1126
+ return nonNativeXTokens.reduce((agg, token, idx) => {
1127
+ const balance = data[idx];
1128
+ balances[token.address] = BigInt(balance);
1129
+ return agg;
1130
+ }, balances);
1131
+ }
1132
+ };
1133
+
1134
+ // src/xchains/icon/iconex/index.tsx
1135
+ var ICONEX_RELAY_RESPONSE = "ICONEX_RELAY_RESPONSE";
1136
+ var ICONEX_RELAY_REQUEST = "ICONEX_RELAY_REQUEST";
1137
+ var request = (event) => {
1138
+ return new Promise((resolve, reject) => {
1139
+ const handler = (evt) => {
1140
+ window.removeEventListener(ICONEX_RELAY_RESPONSE, handler);
1141
+ resolve(evt.detail);
1142
+ };
1143
+ window.addEventListener(ICONEX_RELAY_RESPONSE, handler);
1144
+ window.dispatchEvent(
1145
+ new CustomEvent(ICONEX_RELAY_REQUEST, {
1146
+ detail: event
1147
+ })
1148
+ );
1149
+ });
1150
+ };
1151
+
1152
+ // src/xchains/icon/IconHanaXConnector.ts
1153
+ var IconHanaXConnector = class extends XConnector {
1154
+ constructor() {
1155
+ super("ICON", "Hana Wallet", "hana");
1156
+ }
1157
+ async connect() {
1158
+ const { hanaWallet } = window;
1159
+ if (window && !hanaWallet && !hanaWallet?.isAvailable) {
1160
+ window.open("https://chromewebstore.google.com/detail/hana-wallet/jfdlamikmbghhapbgfoogdffldioobgl", "_blank");
1161
+ return;
1162
+ }
1163
+ const detail = await request({
1164
+ type: "REQUEST_ADDRESS" /* REQUEST_ADDRESS */
1165
+ });
1166
+ if (detail?.type === "RESPONSE_ADDRESS" /* RESPONSE_ADDRESS */) {
1167
+ return {
1168
+ address: detail?.payload,
1169
+ xChainType: this.xChainType
1170
+ };
1171
+ }
1172
+ return void 0;
1173
+ }
1174
+ async disconnect() {
1175
+ console.log("HanaIconXConnector disconnected");
1176
+ }
1177
+ get icon() {
1178
+ return "https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/hana.svg";
1179
+ }
1180
+ };
1181
+
1182
+ // src/useXWagmiStore.ts
870
1183
  var initXServices = () => {
871
1184
  const xServices = {};
872
- ["EVM", "INJECTIVE", "STELLAR", "SUI", "SOLANA", "ICON", "NEAR"].forEach((key) => {
1185
+ ["EVM", "BITCOIN", "INJECTIVE", "STELLAR", "SUI", "SOLANA", "ICON", "NEAR"].forEach((key) => {
873
1186
  const xChainType = key;
874
1187
  switch (xChainType) {
875
1188
  // EVM, SUI, Solana wallet connectors are supported by their own sdks. wagmi, @mysten/dapp-kit, @solana/wallet-adapter-react.
@@ -885,6 +1198,14 @@ var initXServices = () => {
885
1198
  xServices[xChainType] = SolanaXService.getInstance();
886
1199
  xServices[xChainType].setXConnectors([]);
887
1200
  break;
1201
+ case "BITCOIN":
1202
+ xServices[xChainType] = BitcoinXService.getInstance();
1203
+ xServices[xChainType].setXConnectors([
1204
+ new UnisatXConnector(),
1205
+ new XverseXConnector(),
1206
+ new OKXXConnector()
1207
+ ]);
1208
+ break;
888
1209
  // Injective, Stellar, Icon wallet connectors are supported by sodax wallet-sdk-react sdk.
889
1210
  case "INJECTIVE":
890
1211
  xServices[xChainType] = InjectiveXService.getInstance();
@@ -1097,6 +1418,25 @@ function useXConnect() {
1097
1418
  }
1098
1419
  });
1099
1420
  }
1421
+
1422
+ // src/xchains/solana/SolanaXConnector.ts
1423
+ var SolanaXConnector = class extends XConnector {
1424
+ constructor(wallet) {
1425
+ super("SOLANA", wallet?.adapter.name, wallet?.adapter.name);
1426
+ this.wallet = wallet;
1427
+ }
1428
+ getXService() {
1429
+ return SolanaXService.getInstance();
1430
+ }
1431
+ async connect() {
1432
+ return;
1433
+ }
1434
+ async disconnect() {
1435
+ }
1436
+ get icon() {
1437
+ return this.wallet?.adapter.icon;
1438
+ }
1439
+ };
1100
1440
  var useStellarXConnectors = () => {
1101
1441
  const xService = useXService("STELLAR");
1102
1442
  return reactQuery.useQuery({
@@ -1310,6 +1650,7 @@ function useWalletProvider(spokeChainId) {
1310
1650
  const { data: evmWalletClient } = wagmi.useWalletClient();
1311
1651
  const xService = useXService(getXChainType(spokeChainId));
1312
1652
  const xAccount = useXAccount(spokeChainId);
1653
+ const xConnection = useXConnection(xChainType);
1313
1654
  return React2.useMemo(() => {
1314
1655
  switch (xChainType) {
1315
1656
  case "EVM": {
@@ -1376,6 +1717,12 @@ function useWalletProvider(spokeChainId) {
1376
1717
  endpoint: solanaXService.connection.rpcEndpoint
1377
1718
  });
1378
1719
  }
1720
+ case "BITCOIN": {
1721
+ if (!xConnection?.xConnectorId) return void 0;
1722
+ const connector = BitcoinXService.getInstance().getXConnectorById(xConnection.xConnectorId);
1723
+ if (!connector) return void 0;
1724
+ return connector.recreateWalletProvider(xConnection.xAccount);
1725
+ }
1379
1726
  case "NEAR": {
1380
1727
  const nearXService = xService;
1381
1728
  if (!nearXService.walletSelector) {
@@ -1386,7 +1733,7 @@ function useWalletProvider(spokeChainId) {
1386
1733
  default:
1387
1734
  return void 0;
1388
1735
  }
1389
- }, [xChainType, evmPublicClient, evmWalletClient, xService, xAccount]);
1736
+ }, [xChainType, evmPublicClient, evmWalletClient, xService, xAccount, xConnection]);
1390
1737
  }
1391
1738
  function useXSignMessage() {
1392
1739
  const { signMessage } = walletAdapterReact.useWallet();
@@ -1442,6 +1789,14 @@ function useXSignMessage() {
1442
1789
  }
1443
1790
  });
1444
1791
  }
1792
+
1793
+ // src/xchains/bitcoin/useBitcoinXConnectors.ts
1794
+ function useBitcoinXConnectors() {
1795
+ const xService = useXService("BITCOIN");
1796
+ return React2.useMemo(() => {
1797
+ return xService?.getXConnectors() || [];
1798
+ }, [xService]);
1799
+ }
1445
1800
  var Hydrate = () => {
1446
1801
  const suiClient = dappKit.useSuiClient();
1447
1802
  React2.useEffect(() => {
@@ -1548,6 +1903,8 @@ var WalletId = /* @__PURE__ */ ((WalletId2) => {
1548
1903
  return WalletId2;
1549
1904
  })(WalletId || {});
1550
1905
 
1906
+ exports.BitcoinXConnector = BitcoinXConnector;
1907
+ exports.BitcoinXService = BitcoinXService;
1551
1908
  exports.EvmXConnector = EvmXConnector;
1552
1909
  exports.EvmXService = EvmXService;
1553
1910
  exports.IconHanaXConnector = IconHanaXConnector;
@@ -1555,6 +1912,7 @@ exports.IconXService = IconXService;
1555
1912
  exports.InjectiveKelprXConnector = InjectiveKelprXConnector;
1556
1913
  exports.InjectiveMetamaskXConnector = InjectiveMetamaskXConnector;
1557
1914
  exports.InjectiveXService = InjectiveXService;
1915
+ exports.OKXXConnector = OKXXConnector;
1558
1916
  exports.SodaxWalletProvider = SodaxWalletProvider;
1559
1917
  exports.SolanaXConnector = SolanaXConnector;
1560
1918
  exports.SolanaXService = SolanaXService;
@@ -1562,14 +1920,17 @@ exports.StellarWalletsKitXConnector = StellarWalletsKitXConnector;
1562
1920
  exports.StellarXService = StellarXService;
1563
1921
  exports.SuiXConnector = SuiXConnector;
1564
1922
  exports.SuiXService = SuiXService;
1923
+ exports.UnisatXConnector = UnisatXConnector;
1565
1924
  exports.WalletId = WalletId;
1566
1925
  exports.XConnector = XConnector;
1567
1926
  exports.XService = XService;
1927
+ exports.XverseXConnector = XverseXConnector;
1568
1928
  exports.getWagmiChainId = getWagmiChainId;
1569
1929
  exports.getXChainType = getXChainType;
1570
1930
  exports.getXService = getXService;
1571
1931
  exports.isNativeToken = isNativeToken;
1572
1932
  exports.switchEthereumChain = switchEthereumChain;
1933
+ exports.useBitcoinXConnectors = useBitcoinXConnectors;
1573
1934
  exports.useEvmSwitchChain = useEvmSwitchChain;
1574
1935
  exports.useWalletProvider = useWalletProvider;
1575
1936
  exports.useXAccount = useXAccount;