@earthworm/wallet-sdk 0.2.2 → 0.2.5

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.js CHANGED
@@ -1,27 +1,84 @@
1
- import { BrowserProvider, Contract, JsonRpcProvider, formatUnits } from 'ethers';
2
-
3
- // src/utils/chain.ts
4
- function toChainIdDecimal(chainId, fallback) {
5
- const decimal = Number.parseInt(chainId, 16);
6
- if (Number.isFinite(decimal)) return decimal;
7
- if (fallback !== void 0) return fallback;
8
- return Number.NaN;
9
- }
10
-
11
- // src/utils/env.ts
12
- var isBrowser = typeof window !== "undefined";
13
- function assertBrowser(apiName) {
14
- if (!isBrowser) {
15
- throw new Error(`[wallet-sdk] ${apiName} is only available in the browser`);
16
- }
17
- }
1
+ export { applyWalletAccountsChangedEffect } from './chunk-HLZ3QZTH.js';
2
+ export { ensureTargetNetwork, switchToConfiguredNetwork } from './chunk-XTONTXHH.js';
3
+ import { isBrowser } from './chunk-F7UNIZSN.js';
4
+ export { BSC_NETWORK, BSC_TESTNET_NETWORK, ERC20_ABI, ERC20_DECIMALS, ERC20_DECIMALS_ABI, SUPPORTED_BSC_CHAIN_IDS, USDT_CONFIG, WalletEvents, assertBrowser, bindBrowserProvider, bindWalletProvider, clearJsonRpcReadProviderCache, clearWalletRuntime, connectWallet, connectWalletAccount, createJsonRpcReadProvider, disconnectWallet, emitWalletEvent, getActiveWalletKey, getConfiguredReadProvider, getConnectedAddress, getContractDecimals, getContractPrice, getReadProviderWithFallback, getSelectedWalletProvider, getSharedBrowserProvider, getWalletAccounts, getWalletBrowserProvider, getWalletEventProvider, getWalletSdkConfig, getWalletSigner, hasDeployedContract, initWalletSdk, isBrowser, isContractDeployed, isWalletConnected, isWalletSdkInitialized, normalizeSupportedBscChainId, readConfiguredUsdtDecimals, readErc20Balance, readErc20Decimals, readUsdtBalance, refreshWalletAccounts, refreshWalletReadProvider, requestWallet, resetWalletSdkConfig, resolveChainConfig, resolveWalletKey, setWalletEventProvider, setWalletReadProvider, switchWalletAccount, syncConnectedWalletAccount, syncWalletAccountAddress, syncWalletRuntimeProvider, toChainIdDecimal, walletEvents } from './chunk-F7UNIZSN.js';
18
5
 
19
6
  // src/wallet/eip6963.ts
20
- var METAMASK_RDNS = "io.metamask";
21
- var COINBASE_RDNS = "com.coinbase.wallet";
22
- var TOKENPOCKET_RDNS = "com.tokenpocket";
7
+ var EIP6963_ANNOUNCE = "eip6963:announceProvider";
8
+ var EIP6963_REQUEST = "eip6963:requestProvider";
9
+ var TIP6963_ANNOUNCE = "TIP6963:announceProvider";
10
+ var TIP6963_REQUEST = "TIP6963:requestProvider";
11
+ var Wallet6963Name = /* @__PURE__ */ ((Wallet6963Name2) => {
12
+ Wallet6963Name2["MetaMask"] = "metamask";
13
+ Wallet6963Name2["Coinbase"] = "coinbase";
14
+ Wallet6963Name2["TokenPocket"] = "tokenpocket";
15
+ Wallet6963Name2["TronLink"] = "tronlink";
16
+ return Wallet6963Name2;
17
+ })(Wallet6963Name || {});
18
+ var Wallet6963Rdns = /* @__PURE__ */ ((Wallet6963Rdns2) => {
19
+ Wallet6963Rdns2["MetaMask"] = "io.metamask";
20
+ Wallet6963Rdns2["Coinbase"] = "com.coinbase.wallet";
21
+ Wallet6963Rdns2["TokenPocket"] = "com.tokenpocket";
22
+ Wallet6963Rdns2["TronLink"] = "org.tronlink.www";
23
+ Wallet6963Rdns2["TronLinkAlt"] = "io.tronlink";
24
+ return Wallet6963Rdns2;
25
+ })(Wallet6963Rdns || {});
26
+ function normalizeWalletName(name) {
27
+ return name.toLowerCase();
28
+ }
29
+ function matchExactWalletName(name, walletName) {
30
+ return normalizeWalletName(name) === walletName;
31
+ }
32
+ function matchIncludesWalletName(name, walletName) {
33
+ return normalizeWalletName(name).includes(walletName);
34
+ }
35
+ var WALLET_6963_MATCHERS = {
36
+ metamask: {
37
+ rdns: ["io.metamask" /* MetaMask */],
38
+ matchName: (name) => matchExactWalletName(name, "metamask" /* MetaMask */)
39
+ },
40
+ coinbase: {
41
+ rdns: ["com.coinbase.wallet" /* Coinbase */],
42
+ matchName: (name) => matchIncludesWalletName(name, "coinbase" /* Coinbase */)
43
+ },
44
+ tokenpocket: {
45
+ rdns: ["com.tokenpocket" /* TokenPocket */],
46
+ matchName: (name) => matchIncludesWalletName(name, "tokenpocket" /* TokenPocket */)
47
+ },
48
+ tronlink: {
49
+ rdns: ["org.tronlink.www" /* TronLink */, "io.tronlink" /* TronLinkAlt */],
50
+ matchName: (name) => matchIncludesWalletName(name, "tronlink" /* TronLink */)
51
+ }
52
+ };
23
53
  var discoveredProviders = [];
24
54
  var discoveryPromise = null;
55
+ function getProviderDedupKey(detail) {
56
+ const rdns = detail.info.rdns?.trim().toLowerCase();
57
+ if (rdns) {
58
+ return `rdns:${rdns}`;
59
+ }
60
+ return `name:${normalizeWalletName(detail.info.name)}`;
61
+ }
62
+ function collectProviderDetail(providers, detail) {
63
+ if (!detail?.provider) return;
64
+ if (providers.some((item) => item.info.uuid === detail.info.uuid)) return;
65
+ const dedupKey = getProviderDedupKey(detail);
66
+ if (providers.some((item) => getProviderDedupKey(item) === dedupKey)) return;
67
+ providers.push(detail);
68
+ }
69
+ function matchesWallet6963(detail, matcher) {
70
+ const rdns = detail.info.rdns.toLowerCase();
71
+ return matcher.rdns.includes(rdns) || matcher.matchName(detail.info.name);
72
+ }
73
+ function defineWallet6963Provider(matcher) {
74
+ const find = () => findDiscoveredProvider((detail) => matchesWallet6963(detail, matcher));
75
+ const has = () => Boolean(find());
76
+ return { find, has };
77
+ }
78
+ var metamask6963 = defineWallet6963Provider(WALLET_6963_MATCHERS.metamask);
79
+ var coinbase6963 = defineWallet6963Provider(WALLET_6963_MATCHERS.coinbase);
80
+ var tokenPocket6963 = defineWallet6963Provider(WALLET_6963_MATCHERS.tokenpocket);
81
+ var tronLink6963 = defineWallet6963Provider(WALLET_6963_MATCHERS.tronlink);
25
82
  function discoverWalletProviders(timeoutMs = 500) {
26
83
  if (!isBrowser) {
27
84
  return Promise.resolve([]);
@@ -32,58 +89,35 @@ function discoverWalletProviders(timeoutMs = 500) {
32
89
  discoveryPromise = new Promise((resolve) => {
33
90
  const providers = [];
34
91
  const onAnnounce = (event) => {
35
- const detail = event.detail;
36
- if (!detail?.provider) return;
37
- if (providers.some((item) => item.info.uuid === detail.info.uuid)) return;
38
- providers.push(detail);
92
+ collectProviderDetail(providers, event.detail);
39
93
  };
40
- window.addEventListener("eip6963:announceProvider", onAnnounce);
41
- window.dispatchEvent(new Event("eip6963:requestProvider"));
94
+ window.addEventListener(EIP6963_ANNOUNCE, onAnnounce);
95
+ window.addEventListener(TIP6963_ANNOUNCE, onAnnounce);
96
+ window.dispatchEvent(new Event(EIP6963_REQUEST));
97
+ window.dispatchEvent(new Event(TIP6963_REQUEST));
42
98
  window.setTimeout(() => {
43
- window.removeEventListener("eip6963:announceProvider", onAnnounce);
99
+ window.removeEventListener(EIP6963_ANNOUNCE, onAnnounce);
100
+ window.removeEventListener(TIP6963_ANNOUNCE, onAnnounce);
44
101
  discoveredProviders = providers;
45
102
  resolve(providers);
46
103
  }, timeoutMs);
47
104
  });
48
105
  return discoveryPromise;
49
106
  }
107
+ if (isBrowser) {
108
+ void discoverWalletProviders();
109
+ }
50
110
  function findDiscoveredProvider(match) {
51
111
  return discoveredProviders.find(match)?.provider;
52
112
  }
53
- function findMetaMaskEip6963Provider() {
54
- return findDiscoveredProvider(
55
- (detail) => detail.info.rdns === METAMASK_RDNS || detail.info.name.toLowerCase() === "metamask"
56
- );
57
- }
58
- function findCoinbaseEip6963Provider() {
59
- return findDiscoveredProvider(
60
- (detail) => detail.info.rdns === COINBASE_RDNS || detail.info.name.toLowerCase().includes("coinbase")
61
- );
62
- }
63
- function findTokenPocketEip6963Provider() {
64
- return findDiscoveredProvider(
65
- (detail) => detail.info.rdns === TOKENPOCKET_RDNS || detail.info.name.toLowerCase().includes("tokenpocket")
66
- );
67
- }
68
- function hasMetaMaskEip6963Provider() {
69
- return Boolean(findMetaMaskEip6963Provider());
70
- }
71
- function hasCoinbaseEip6963Provider() {
72
- return Boolean(findCoinbaseEip6963Provider());
73
- }
74
- function hasTokenPocketEip6963Provider() {
75
- return Boolean(findTokenPocketEip6963Provider());
76
- }
77
- var providerCache = /* @__PURE__ */ new WeakMap();
78
- function getSharedBrowserProvider(ethereum) {
79
- const cached = providerCache.get(ethereum);
80
- if (cached) {
81
- return cached;
82
- }
83
- const provider = new BrowserProvider(ethereum);
84
- providerCache.set(ethereum, provider);
85
- return provider;
86
- }
113
+ var findMetaMaskEip6963Provider = metamask6963.find;
114
+ var findCoinbaseEip6963Provider = coinbase6963.find;
115
+ var findTokenPocketEip6963Provider = tokenPocket6963.find;
116
+ var findTronLinkEip6963Provider = tronLink6963.find;
117
+ var hasMetaMaskEip6963Provider = metamask6963.has;
118
+ var hasCoinbaseEip6963Provider = coinbase6963.has;
119
+ var hasTokenPocketEip6963Provider = tokenPocket6963.has;
120
+ var hasTronLinkEip6963Provider = tronLink6963.has;
87
121
 
88
122
  // src/wallet/injected-providers.ts
89
123
  var isRequestableProvider = (provider) => {
@@ -99,7 +133,7 @@ function getInjectedEthereumProviders() {
99
133
  }
100
134
  var isMetaMaskLikeProvider = (provider) => {
101
135
  return Boolean(
102
- provider.isMetaMask && !provider.isCoinbaseWallet && !provider.isTronLink && !provider.isTronLinkWallet
136
+ provider.isMetaMask && !provider.isCoinbaseWallet && !provider.isTokenPocket && !provider.isTronLink && !provider.isTronLinkWallet
103
137
  );
104
138
  };
105
139
  var isCoinbaseLikeProvider = (provider) => {
@@ -193,6 +227,27 @@ function resolveTokenPocketInjectedProvider() {
193
227
  }
194
228
  return void 0;
195
229
  }
230
+ function resolveTronLinkInjectedProvider() {
231
+ const fromEip6963 = findTronLinkEip6963Provider();
232
+ if (fromEip6963 && isRequestableProvider(fromEip6963)) {
233
+ return fromEip6963;
234
+ }
235
+ const ethereum = window.ethereum;
236
+ const fromProviders = getInjectedEthereumProviders().find(isTronLinkLikeProvider);
237
+ if (fromProviders) {
238
+ return fromProviders;
239
+ }
240
+ if (ethereum && isTronLinkLikeProvider(ethereum)) {
241
+ return ethereum;
242
+ }
243
+ if (isRequestableProvider(window.tronLink)) {
244
+ return window.tronLink;
245
+ }
246
+ if (isRequestableProvider(window.tron)) {
247
+ return window.tron;
248
+ }
249
+ return void 0;
250
+ }
196
251
  function hasMetaMaskInjectedProvider() {
197
252
  return Boolean(resolveMetaMaskInjectedProvider());
198
253
  }
@@ -204,6 +259,9 @@ function hasCoinbaseInjectedProvider() {
204
259
  function hasTokenPocketInjectedProvider() {
205
260
  return Boolean(resolveTokenPocketInjectedProvider());
206
261
  }
262
+ function hasTronLinkInjectedProvider() {
263
+ return Boolean(resolveTronLinkInjectedProvider());
264
+ }
207
265
  var cachedAggregatorProvider;
208
266
  var cachedAggregatorProviderCount = 0;
209
267
  var isMultiWalletAggregator = (provider) => {
@@ -265,637 +323,6 @@ function hasAggregatedInjectedProvider() {
265
323
  return isRequestableProvider(window.ethereum);
266
324
  }
267
325
 
268
- // src/abi/erc20.ts
269
- var ERC20_ABI = [
270
- {
271
- constant: true,
272
- inputs: [],
273
- name: "name",
274
- outputs: [
275
- {
276
- name: "",
277
- type: "string"
278
- }
279
- ],
280
- payable: false,
281
- stateMutability: "view",
282
- type: "function"
283
- },
284
- {
285
- constant: false,
286
- inputs: [
287
- {
288
- name: "_spender",
289
- type: "address"
290
- },
291
- {
292
- name: "_value",
293
- type: "uint256"
294
- }
295
- ],
296
- name: "approve",
297
- outputs: [
298
- {
299
- name: "success",
300
- type: "bool"
301
- }
302
- ],
303
- payable: false,
304
- stateMutability: "nonpayable",
305
- type: "function"
306
- },
307
- {
308
- constant: true,
309
- inputs: [],
310
- name: "totalSupply",
311
- outputs: [
312
- {
313
- name: "",
314
- type: "uint256"
315
- }
316
- ],
317
- payable: false,
318
- stateMutability: "view",
319
- type: "function"
320
- },
321
- {
322
- constant: false,
323
- inputs: [
324
- {
325
- name: "_from",
326
- type: "address"
327
- },
328
- {
329
- name: "_to",
330
- type: "address"
331
- },
332
- {
333
- name: "_value",
334
- type: "uint256"
335
- }
336
- ],
337
- name: "transferFrom",
338
- outputs: [
339
- {
340
- name: "success",
341
- type: "bool"
342
- }
343
- ],
344
- payable: false,
345
- stateMutability: "nonpayable",
346
- type: "function"
347
- },
348
- {
349
- constant: true,
350
- inputs: [],
351
- name: "decimals",
352
- outputs: [
353
- {
354
- name: "",
355
- type: "uint8"
356
- }
357
- ],
358
- payable: false,
359
- stateMutability: "view",
360
- type: "function"
361
- },
362
- {
363
- constant: false,
364
- inputs: [
365
- {
366
- name: "_value",
367
- type: "uint256"
368
- }
369
- ],
370
- name: "burn",
371
- outputs: [],
372
- payable: false,
373
- stateMutability: "nonpayable",
374
- type: "function"
375
- },
376
- {
377
- constant: true,
378
- inputs: [
379
- {
380
- name: "_owner",
381
- type: "address"
382
- }
383
- ],
384
- name: "balanceOf",
385
- outputs: [
386
- {
387
- name: "balance",
388
- type: "uint256"
389
- }
390
- ],
391
- payable: false,
392
- stateMutability: "view",
393
- type: "function"
394
- },
395
- {
396
- constant: false,
397
- inputs: [
398
- {
399
- name: "_from",
400
- type: "address"
401
- },
402
- {
403
- name: "_value",
404
- type: "uint256"
405
- }
406
- ],
407
- name: "burnFrom",
408
- outputs: [],
409
- payable: false,
410
- stateMutability: "nonpayable",
411
- type: "function"
412
- },
413
- {
414
- constant: false,
415
- inputs: [
416
- {
417
- name: "_to",
418
- type: "address[]"
419
- },
420
- {
421
- name: "_value",
422
- type: "uint256[]"
423
- }
424
- ],
425
- name: "transferArray",
426
- outputs: [],
427
- payable: false,
428
- stateMutability: "nonpayable",
429
- type: "function"
430
- },
431
- {
432
- constant: true,
433
- inputs: [],
434
- name: "symbol",
435
- outputs: [
436
- {
437
- name: "",
438
- type: "string"
439
- }
440
- ],
441
- payable: false,
442
- stateMutability: "view",
443
- type: "function"
444
- },
445
- {
446
- constant: false,
447
- inputs: [
448
- {
449
- name: "_to",
450
- type: "address"
451
- },
452
- {
453
- name: "_value",
454
- type: "uint256"
455
- }
456
- ],
457
- name: "transfer",
458
- outputs: [
459
- {
460
- name: "success",
461
- type: "bool"
462
- }
463
- ],
464
- payable: false,
465
- stateMutability: "nonpayable",
466
- type: "function"
467
- },
468
- {
469
- constant: true,
470
- inputs: [
471
- {
472
- name: "_owner",
473
- type: "address"
474
- },
475
- {
476
- name: "_spender",
477
- type: "address"
478
- }
479
- ],
480
- name: "allowance",
481
- outputs: [
482
- {
483
- name: "remaining",
484
- type: "uint256"
485
- }
486
- ],
487
- payable: false,
488
- stateMutability: "view",
489
- type: "function"
490
- },
491
- {
492
- inputs: [
493
- {
494
- name: "_tokenName",
495
- type: "string"
496
- },
497
- {
498
- name: "_tokenSymbol",
499
- type: "string"
500
- },
501
- {
502
- name: "_decimalUnits",
503
- type: "uint8"
504
- },
505
- {
506
- name: "_initialAmount",
507
- type: "uint256"
508
- }
509
- ],
510
- payable: false,
511
- stateMutability: "nonpayable",
512
- type: "constructor"
513
- },
514
- {
515
- anonymous: false,
516
- inputs: [
517
- {
518
- indexed: true,
519
- name: "from",
520
- type: "address"
521
- },
522
- {
523
- indexed: true,
524
- name: "to",
525
- type: "address"
526
- },
527
- {
528
- indexed: false,
529
- name: "value",
530
- type: "uint256"
531
- }
532
- ],
533
- name: "Transfer",
534
- type: "event"
535
- },
536
- {
537
- anonymous: false,
538
- inputs: [
539
- {
540
- indexed: true,
541
- name: "owner",
542
- type: "address"
543
- },
544
- {
545
- indexed: true,
546
- name: "spender",
547
- type: "address"
548
- },
549
- {
550
- indexed: false,
551
- name: "value",
552
- type: "uint256"
553
- }
554
- ],
555
- name: "Approval",
556
- type: "event"
557
- }
558
- ];
559
-
560
- // src/config/networks.ts
561
- var BSC_NETWORK = {
562
- chainId: "0x38",
563
- chainName: "BNB Smart Chain",
564
- nativeCurrency: {
565
- name: "BNB",
566
- symbol: "BNB",
567
- decimals: 18
568
- },
569
- rpcUrls: [
570
- "https://bsc-dataseed.binance.org/",
571
- "https://bsc-dataseed1.binance.org/",
572
- "https://bsc-dataseed2.binance.org/"
573
- ],
574
- blockExplorerUrls: ["https://bscscan.com"]
575
- };
576
- var BSC_TESTNET_NETWORK = {
577
- chainId: "0x61",
578
- chainName: "BNB Smart Chain Testnet",
579
- nativeCurrency: {
580
- name: "tBNB",
581
- symbol: "tBNB",
582
- decimals: 18
583
- },
584
- rpcUrls: [
585
- "https://data-seed-prebsc-1-s1.bnbchain.org:8545/",
586
- "https://data-seed-prebsc-2-s1.bnbchain.org:8545/",
587
- "https://data-seed-prebsc-1-s2.bnbchain.org:8545/"
588
- ],
589
- blockExplorerUrls: ["https://testnet.bscscan.com"]
590
- };
591
-
592
- // src/config/resolve-chain.ts
593
- var USDT_CONTRACT_ADDRESSES = {
594
- [BSC_NETWORK.chainId]: "0x55d398326f99059fF775485246999027B3197955",
595
- [BSC_TESTNET_NETWORK.chainId]: "0x66E972502A34A625828C544a1914E8D8cc2A9dE5"
596
- };
597
- function resolveUsdtContractAddress(chainId) {
598
- const address = USDT_CONTRACT_ADDRESSES[chainId];
599
- if (!address) {
600
- throw new Error(`[wallet-sdk] Unsupported chainId for USDT: ${chainId}`);
601
- }
602
- return address;
603
- }
604
- function resolveChainByMainnet(isMainnet) {
605
- return isMainnet ? BSC_NETWORK : BSC_TESTNET_NETWORK;
606
- }
607
- function resolveUsdtByMainnet(isMainnet) {
608
- return resolveUsdtContractAddress(resolveChainByMainnet(isMainnet).chainId);
609
- }
610
- function resolveChainConfig(chainId) {
611
- if (chainId === BSC_NETWORK.chainId) {
612
- return BSC_NETWORK;
613
- }
614
- if (chainId === BSC_TESTNET_NETWORK.chainId) {
615
- return BSC_TESTNET_NETWORK;
616
- }
617
- throw new Error(`[wallet-sdk] Unsupported chainId: ${chainId}`);
618
- }
619
-
620
- // src/config/usdt.ts
621
- var USDT_CONFIG = {
622
- symbol: "USDT",
623
- name: "Tether USD",
624
- decimals: 18,
625
- contractAbi: ERC20_ABI
626
- };
627
- var ERC20_DECIMALS = USDT_CONFIG.decimals;
628
-
629
- // src/core/contract.ts
630
- var ERC20_DECIMALS_ABI = ["function decimals() view returns (uint8)"];
631
- async function hasDeployedContract(readProvider, address) {
632
- const code = await readProvider.getCode(address);
633
- return Boolean(code && code !== "0x");
634
- }
635
- async function readErc20Decimals(readProvider, tokenAddress, erc20Abi = ERC20_DECIMALS_ABI, fallback = ERC20_DECIMALS) {
636
- if (!await hasDeployedContract(readProvider, tokenAddress)) {
637
- throw new Error(`[wallet-sdk] Token contract not deployed: ${tokenAddress}`);
638
- }
639
- try {
640
- const tokenContract = new Contract(tokenAddress, erc20Abi, readProvider);
641
- const decimals = Number(await tokenContract.getFunction("decimals").staticCall());
642
- return Number.isFinite(decimals) && decimals >= 0 ? decimals : fallback;
643
- } catch {
644
- return fallback;
645
- }
646
- }
647
-
648
- // src/core/init.ts
649
- var CONFIG_KEY = "__WALLET_SDK_CONFIG__";
650
- function getStoredConfig() {
651
- return globalThis[CONFIG_KEY] ?? null;
652
- }
653
- function storeConfig(config) {
654
- globalThis[CONFIG_KEY] = config;
655
- }
656
- function buildConfig(options) {
657
- const chain = resolveChainByMainnet(options.isMainnet);
658
- return {
659
- isMainnet: options.isMainnet,
660
- chainId: chain.chainId,
661
- chain,
662
- contract: {
663
- address: options.contract.address,
664
- abi: options.contract.abi
665
- },
666
- usdt: {
667
- address: resolveUsdtByMainnet(options.isMainnet),
668
- abi: USDT_CONFIG.contractAbi,
669
- symbol: USDT_CONFIG.symbol,
670
- name: USDT_CONFIG.name,
671
- decimals: USDT_CONFIG.decimals
672
- }
673
- };
674
- }
675
- function initWalletSdk(options) {
676
- const config = buildConfig(options);
677
- storeConfig(config);
678
- return config;
679
- }
680
- function getWalletSdkConfig() {
681
- const config = getStoredConfig();
682
- if (!config) {
683
- throw new Error("[wallet-sdk] initWalletSdk() must be called before using the library");
684
- }
685
- return config;
686
- }
687
- function isWalletSdkInitialized() {
688
- return getStoredConfig() !== null;
689
- }
690
- function resetWalletSdkConfig() {
691
- delete globalThis[CONFIG_KEY];
692
- }
693
- function createJsonRpcReadProvider(rpcUrl, chainIdHex, cache) {
694
- if (cache?.current) return cache.current;
695
- const provider = new JsonRpcProvider(rpcUrl, toChainIdDecimal(chainIdHex), {
696
- staticNetwork: true
697
- });
698
- if (cache) {
699
- cache.current = provider;
700
- }
701
- return provider;
702
- }
703
- function getReadProviderWithFallback(walletProvider, rpcConfig, fallbackCache) {
704
- if (walletProvider) return walletProvider;
705
- const rpcUrl = rpcConfig.rpcUrls[0];
706
- if (!rpcUrl || !rpcConfig.chainId) {
707
- throw new Error("RPC config is missing");
708
- }
709
- return createJsonRpcReadProvider(rpcUrl, rpcConfig.chainId, fallbackCache);
710
- }
711
-
712
- // src/core/contract-read.ts
713
- var readProviderCache = { current: null };
714
- var walletReadProvider = null;
715
- function setWalletReadProvider(provider) {
716
- walletReadProvider = provider;
717
- }
718
- function getConfiguredReadProvider() {
719
- const { chain } = getWalletSdkConfig();
720
- return getReadProviderWithFallback(walletReadProvider, chain, readProviderCache);
721
- }
722
- async function isContractDeployed(contractAddress) {
723
- return hasDeployedContract(getConfiguredReadProvider(), contractAddress);
724
- }
725
- async function getContractDecimals(contractAddress, options) {
726
- const readProvider = getConfiguredReadProvider();
727
- if (!await hasDeployedContract(readProvider, contractAddress)) {
728
- throw new Error(`[wallet-sdk] Contract not deployed: ${contractAddress}`);
729
- }
730
- const tokenContract = new Contract(contractAddress, options.abi, readProvider);
731
- const decimals = await tokenContract.getFunction(options.method).staticCall();
732
- return Number(decimals);
733
- }
734
- async function getContractPrice(contractAddress, options) {
735
- const readProvider = getConfiguredReadProvider();
736
- if (!await hasDeployedContract(readProvider, contractAddress)) {
737
- throw new Error(`[wallet-sdk] Contract not deployed: ${contractAddress}`);
738
- }
739
- const tokenContract = new Contract(contractAddress, options.abi, readProvider);
740
- const price = await tokenContract.getFunction(options.method).staticCall();
741
- const decimals = await getContractDecimals(contractAddress, { abi: options.abi, method: "decimals" });
742
- return formatUnits(price, decimals);
743
- }
744
-
745
- // src/core/network.ts
746
- async function ensureTargetNetwork(options) {
747
- const currentChainId = await options.getCurrentChainId();
748
- if (currentChainId.toLowerCase() === options.targetChainId.toLowerCase()) return;
749
- try {
750
- await options.switchChain(options.targetChainId);
751
- } catch (err) {
752
- const error = err;
753
- if (error?.code !== 4902 && error?.info?.error?.code !== 4902) {
754
- throw err;
755
- }
756
- await options.addChain(options.chainParams);
757
- await options.switchChain(options.targetChainId);
758
- }
759
- }
760
-
761
- // src/wallet/common.ts
762
- function bindBrowserProvider(eip1193, cache) {
763
- const nextProvider = getSharedBrowserProvider(eip1193);
764
- if (cache.value !== nextProvider) {
765
- cache.value = nextProvider;
766
- }
767
- return nextProvider;
768
- }
769
- async function requestWallet(eip1193, method, params) {
770
- return eip1193.request({
771
- method,
772
- ...params === void 0 ? {} : { params }
773
- });
774
- }
775
- async function connectWalletAccount(requestAccounts, getProvider, setSigner, markConnected) {
776
- const accounts = await requestAccounts() || [];
777
- if (!accounts.length) {
778
- throw new Error("No accounts returned");
779
- }
780
- const sourceProvider = getProvider();
781
- const nextSigner = await sourceProvider.getSigner();
782
- const address = await nextSigner.getAddress();
783
- setSigner(nextSigner);
784
- markConnected();
785
- return { address, signer: nextSigner };
786
- }
787
- async function syncWalletAccountAddress(getProvider, setSigner, markConnected, nextAddress) {
788
- const sourceProvider = getProvider();
789
- const nextSigner = nextAddress ? await sourceProvider.getSigner(nextAddress) : await sourceProvider.getSigner();
790
- const address = nextAddress || await nextSigner.getAddress();
791
- setSigner(nextSigner);
792
- markConnected();
793
- return { address, signer: nextSigner };
794
- }
795
- function clearWalletRuntime(cache) {
796
- cache.provider.value = null;
797
- cache.signer.value = null;
798
- if (cache.selectedProvider) {
799
- cache.selectedProvider.value = null;
800
- }
801
- }
802
-
803
- // src/wallet/events.ts
804
- var eventHandlers = {};
805
- var providerBridges = /* @__PURE__ */ new WeakMap();
806
- var walletEventProvider = null;
807
- var boundProvider = null;
808
- function hasRegisteredHandlers() {
809
- return Object.values(eventHandlers).some((handlers) => handlers && handlers.size > 0);
810
- }
811
- function dispatch(event, payload) {
812
- const handlers = eventHandlers[event];
813
- if (!handlers) return;
814
- for (const handler of handlers) {
815
- void handler(payload);
816
- }
817
- }
818
- function unbindProvider(provider) {
819
- const bridgeHandlers = providerBridges.get(provider);
820
- if (!bridgeHandlers) return;
821
- for (const [event, handler] of Object.entries(bridgeHandlers)) {
822
- provider.removeListener(event, handler);
823
- }
824
- providerBridges.delete(provider);
825
- }
826
- function syncProviderBinding() {
827
- if (boundProvider) {
828
- unbindProvider(boundProvider);
829
- boundProvider = null;
830
- }
831
- if (!walletEventProvider || !hasRegisteredHandlers()) {
832
- return;
833
- }
834
- const bridgeHandlers = {};
835
- if (eventHandlers.accountsChanged?.size) {
836
- bridgeHandlers.accountsChanged = (...args) => {
837
- dispatch("accountsChanged", args[0] ?? []);
838
- };
839
- }
840
- if (eventHandlers.chainChanged?.size) {
841
- bridgeHandlers.chainChanged = (...args) => {
842
- dispatch("chainChanged", String(args[0] ?? ""));
843
- };
844
- }
845
- for (const [event, handler] of Object.entries(bridgeHandlers)) {
846
- walletEventProvider.removeListener(event, handler);
847
- walletEventProvider.on(event, handler);
848
- }
849
- providerBridges.set(walletEventProvider, bridgeHandlers);
850
- boundProvider = walletEventProvider;
851
- }
852
- function setWalletEventProvider(provider) {
853
- walletEventProvider = provider;
854
- syncProviderBinding();
855
- }
856
- function getWalletEventProvider() {
857
- if (!walletEventProvider) {
858
- throw new Error("[wallet-sdk] Wallet event provider is not set");
859
- }
860
- return walletEventProvider;
861
- }
862
- function registerEvent(event, listener) {
863
- assertBrowser("walletEvents.on");
864
- if (!eventHandlers[event]) {
865
- eventHandlers[event] = /* @__PURE__ */ new Set();
866
- }
867
- eventHandlers[event].add(listener);
868
- syncProviderBinding();
869
- }
870
- function unregisterEvent(event, listener) {
871
- if (!isBrowser) return;
872
- if (listener) {
873
- eventHandlers[event]?.delete(listener);
874
- } else {
875
- eventHandlers[event]?.clear();
876
- }
877
- syncProviderBinding();
878
- }
879
- function clearEvents() {
880
- if (!isBrowser) return;
881
- for (const event of Object.keys(eventHandlers)) {
882
- eventHandlers[event]?.clear();
883
- }
884
- syncProviderBinding();
885
- }
886
- var WalletEventsEmitter = class {
887
- on(event, listener) {
888
- registerEvent(event, listener);
889
- }
890
- off(event, listener) {
891
- unregisterEvent(event, listener);
892
- }
893
- clear() {
894
- clearEvents();
895
- }
896
- };
897
- var walletEvents = new WalletEventsEmitter();
898
-
899
326
  // src/wallet/detection.ts
900
327
  function isEthereumProvider() {
901
328
  if (!isBrowser) return false;
@@ -915,7 +342,7 @@ function isInjectedProvider() {
915
342
  }
916
343
  function isTronLinkProvider() {
917
344
  if (!isBrowser) return false;
918
- return Boolean(window.tron?.request || window.tronLink);
345
+ return hasTronLinkInjectedProvider() || hasTronLinkEip6963Provider();
919
346
  }
920
347
 
921
- export { BSC_NETWORK, BSC_TESTNET_NETWORK, ERC20_ABI, ERC20_DECIMALS, ERC20_DECIMALS_ABI, USDT_CONFIG, USDT_CONTRACT_ADDRESSES, assertBrowser, bindBrowserProvider, clearWalletRuntime, connectWalletAccount, createJsonRpcReadProvider, discoverWalletProviders, ensureTargetNetwork, findCoinbaseEip6963Provider, findDiscoveredProvider, findMetaMaskEip6963Provider, findTokenPocketEip6963Provider, getAggregatedInjectedProvider, getConfiguredReadProvider, getContractDecimals, getContractPrice, getInjectedEthereumProviders, getReadProviderWithFallback, getSharedBrowserProvider, getWalletEventProvider, getWalletSdkConfig, hasAggregatedInjectedProvider, hasCoinbaseEip6963Provider, hasCoinbaseInjectedProvider, hasDeployedContract, hasMetaMaskEip6963Provider, hasMetaMaskInjectedProvider, hasRecoverableAggregatorProvider, hasTokenPocketEip6963Provider, hasTokenPocketInjectedProvider, initWalletSdk, isBrowser, isCoinbaseProvider, isContractDeployed, isEthereumProvider, isInjectedProvider, isTokenPocketProvider, isTronLinkProvider, isWalletSdkInitialized, readErc20Decimals, rememberAggregatorProvider, requestWallet, resetWalletSdkConfig, resolveChainByMainnet, resolveChainConfig, resolveCoinbaseInjectedProvider, resolveMetaMaskInjectedProvider, resolveTokenPocketInjectedProvider, resolveUsdtByMainnet, resolveUsdtContractAddress, setWalletEventProvider, setWalletReadProvider, syncWalletAccountAddress, toChainIdDecimal, walletEvents };
348
+ export { Wallet6963Name, Wallet6963Rdns, discoverWalletProviders, findCoinbaseEip6963Provider, findDiscoveredProvider, findMetaMaskEip6963Provider, findTokenPocketEip6963Provider, findTronLinkEip6963Provider, getAggregatedInjectedProvider, getInjectedEthereumProviders, hasAggregatedInjectedProvider, hasCoinbaseEip6963Provider, hasCoinbaseInjectedProvider, hasMetaMaskEip6963Provider, hasMetaMaskInjectedProvider, hasRecoverableAggregatorProvider, hasTokenPocketEip6963Provider, hasTokenPocketInjectedProvider, hasTronLinkEip6963Provider, hasTronLinkInjectedProvider, isCoinbaseProvider, isEthereumProvider, isInjectedProvider, isTokenPocketProvider, isTronLinkProvider, rememberAggregatorProvider, resolveCoinbaseInjectedProvider, resolveMetaMaskInjectedProvider, resolveTokenPocketInjectedProvider, resolveTronLinkInjectedProvider };