@earthworm/wallet-sdk 0.2.3 → 0.2.6

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/README.md CHANGED
@@ -8,17 +8,17 @@ Browser EVM wallet SDK for DApps (MetaMask, Coinbase, TronLink, TokenPocket, con
8
8
  pnpm add @earthworm/wallet-sdk ethers
9
9
  ```
10
10
 
11
- ## Usage
11
+ ## Quick start
12
12
 
13
13
  ```ts
14
14
  import {
15
15
  initWalletSdk,
16
- getWalletSdkConfig,
16
+ connectWallet,
17
+ disconnectWallet,
18
+ isWalletConnected,
17
19
  walletEvents,
18
- setWalletEventProvider,
19
- switchToConfiguredNetwork,
20
- requestWallet,
21
20
  resolveMetaMaskInjectedProvider,
21
+ switchToConfiguredNetwork,
22
22
  isEthereumProvider,
23
23
  isCoinbaseProvider,
24
24
  isTokenPocketProvider,
@@ -29,46 +29,112 @@ initWalletSdk({
29
29
  usdt: { address: "0x55d398326f99059fF775485246999027B3197955" },
30
30
  });
31
31
 
32
- // Optional: switch chain after connect
32
+ const provider = resolveMetaMaskInjectedProvider();
33
+ if (!provider) throw new Error("MetaMask not found");
34
+
33
35
  await connectWallet(provider, { chainId: "0x38" });
36
+ console.log("Connected:", isWalletConnected());
37
+
38
+ await disconnectWallet();
39
+ ```
34
40
 
35
- // Detect installed wallets
36
- if (isEthereumProvider()) {
37
- console.log("MetaMask is available");
38
- }
41
+ `connectWallet()` binds the provider and registers event listeners internally. You do not need to call `setWalletEventProvider()` separately after connect.
39
42
 
40
- if (isCoinbaseProvider()) {
41
- console.log("Coinbase Wallet is available");
42
- }
43
+ ## Wallet detection
43
44
 
44
- if (isTokenPocketProvider()) {
45
- console.log("TokenPocket is available");
46
- }
45
+ ```ts
46
+ if (isEthereumProvider()) console.log("MetaMask is available");
47
+ if (isCoinbaseProvider()) console.log("Coinbase Wallet is available");
48
+ if (isTokenPocketProvider()) console.log("TokenPocket is available");
49
+ if (isTronLinkProvider()) console.log("TronLink is available");
50
+ ```
47
51
 
48
- if (isTronLinkProvider()) {
49
- console.log("TronLink is available");
50
- }
52
+ ## Events
51
53
 
52
- const provider = resolveMetaMaskInjectedProvider();
53
- setWalletEventProvider(provider ?? null);
54
+ All `walletEvents.on(...)` listeners receive `(wallet, event)`:
55
+
56
+ - `wallet`: `"metamask" | "coinbase" | "tokenpocket" | "tronlink" | "unknown"`
57
+ - `event.name`: native wallet event name (e.g. `"accountsChanged"`, `"setAccount"`, `"disconnectWeb"`)
58
+ - `event.payload`: normalized SDK payload for that event
59
+ - `event.raw`: raw provider / postMessage arguments
54
60
 
61
+ ```ts
55
62
  walletEvents.on("accountsChanged", (wallet, event) => {
56
- console.log(wallet, event.payload); // account addresses
63
+ console.log(wallet, event.name, event.payload); // string[] — current account address(es)
57
64
  });
58
65
 
59
66
  walletEvents.on("chainChanged", (wallet, event) => {
60
- console.log("Network changed:", wallet, event.payload); // hex chainId, e.g. "0x38"
67
+ console.log(wallet, event.payload); // hex chainId, e.g. "0x38"
61
68
  });
62
69
 
63
70
  walletEvents.on("networkSwitched", (wallet, event) => {
64
71
  console.log(wallet, event.payload); // { chainId, previousChainId, switched }
65
72
  });
66
73
 
67
- async function switchWalletToBscMainnet() {
68
- const provider = resolveMetaMaskInjectedProvider();
69
- if (!provider) return;
74
+ walletEvents.on("walletDisconnected", (wallet, event) => {
75
+ console.log(wallet, event.payload); // { source: "app" | "provider" }
76
+ });
77
+ ```
78
+
79
+ ### Event summary
80
+
81
+ | Event | When it fires |
82
+ | -------------------- | ------------------------------------------------------------------------------ |
83
+ | `accountsChanged` | Active account updated (switch account, reconnect after TronLink revoke, etc.) |
84
+ | `chainChanged` | Wallet network changed |
85
+ | `networkSwitched` | SDK invoked `switchToConfiguredNetwork()` |
86
+ | `walletDisconnected` | Wallet or DApp disconnected |
87
+
88
+ ### `walletDisconnected`
89
+
90
+ | Source | Trigger |
91
+ | -------------------- | ---------------------------------- |
92
+ | `source: "app"` | DApp called `disconnectWallet()` |
93
+ | `source: "provider"` | Wallet revoked the site connection |
94
+
95
+ **MetaMask**
96
+
97
+ - Site revoked in the extension → empty `accountsChanged` → `walletDisconnected`
98
+
99
+ **TronLink / TokenPocket / Coinbase**
70
100
 
71
- setWalletEventProvider(provider);
72
- await switchToConfiguredNetwork("0x38");
73
- }
101
+ On disconnect-like events (empty `accountsChanged`, `disconnect`, etc.), the SDK silently calls `eth_accounts`:
102
+
103
+ - **Still has authorized addresses** → sync active account → `accountsChanged` (no disconnect)
104
+ - **No authorized addresses** → clear connection state → `walletDisconnected`
105
+
106
+ This supports:
107
+
108
+ 1. Single address connected, then revoked → `walletDisconnected`
109
+ 2. Multiple addresses, one revoked but others remain → `accountsChanged` with remaining address
110
+ 3. After revoke, switch to another already-connected address → `accountsChanged`
111
+
112
+ When TronLink, TokenPocket, or Coinbase disconnects via provider, the SDK keeps the provider bound so a later account switch can still emit `accountsChanged`. Calling `disconnectWallet()` from the DApp performs a full disconnect.
113
+
114
+ ### App-initiated disconnect
115
+
116
+ `disconnectWallet()` clears local state and, by default, calls `wallet_revokePermissions` so MetaMask / Coinbase remove the site from connected dApps. TronLink does not support DApp-side revoke; local state is cleared only.
117
+
118
+ ```ts
119
+ const { revoked } = await disconnectWallet();
120
+ console.log(revoked ? "Wallet permission revoked" : "Local disconnect only");
74
121
  ```
122
+
123
+ Pass `{ revokePermissions: false }` to skip the wallet revoke request.
124
+
125
+ ## Switch network
126
+
127
+ ```ts
128
+ import { switchToConfiguredNetwork } from "@earthworm/wallet-sdk";
129
+
130
+ await switchToConfiguredNetwork("0x38"); // BSC mainnet
131
+ ```
132
+
133
+ ## Demo
134
+
135
+ ```bash
136
+ pnpm run build
137
+ pnpm run demo
138
+ ```
139
+
140
+ Open http://localhost:5173 and test connect, disconnect, account switch, and the event log.
@@ -0,0 +1,2 @@
1
+ export { applyTronLinkAccountResolution, applyVerifiedAccountResolution, applyWalletAccountsChangedEffect, applyWalletDisconnectEffect } from './chunk-M4PEE6H7.js';
2
+ import './chunk-YFNGF2E3.js';
@@ -0,0 +1,60 @@
1
+ import { getSelectedWalletProvider, isWalletConnected, disconnectWallet, ensureWalletRuntimeProviderBound, syncConnectedWalletAccount, getWalletAccounts } from './chunk-YFNGF2E3.js';
2
+
3
+ // src/wallet/account-sync.ts
4
+ async function syncWalletAccount(address) {
5
+ if (!ensureWalletRuntimeProviderBound()) {
6
+ return { action: "ignored" };
7
+ }
8
+ try {
9
+ const result = await syncConnectedWalletAccount(address);
10
+ return { action: "synced", address: result.address };
11
+ } catch {
12
+ return { action: "ignored" };
13
+ }
14
+ }
15
+ async function fetchAuthorizedAccounts() {
16
+ if (!getSelectedWalletProvider()) {
17
+ return [];
18
+ }
19
+ try {
20
+ return await getWalletAccounts();
21
+ } catch {
22
+ return [];
23
+ }
24
+ }
25
+ async function applyVerifiedAccountResolution(accounts) {
26
+ if (!getSelectedWalletProvider()) {
27
+ return { action: "ignored" };
28
+ }
29
+ if (accounts.length > 0) {
30
+ const synced = await syncWalletAccount(accounts[0]);
31
+ if (synced.action === "synced") {
32
+ return synced;
33
+ }
34
+ }
35
+ const authorizedAccounts = await fetchAuthorizedAccounts();
36
+ if (authorizedAccounts.length > 0) {
37
+ return syncWalletAccount(authorizedAccounts[0]);
38
+ }
39
+ if (!isWalletConnected()) {
40
+ return { action: "ignored" };
41
+ }
42
+ await disconnectWallet({ silent: true, preserveProvider: true, revokePermissions: false });
43
+ return { action: "disconnected" };
44
+ }
45
+ async function applyWalletAccountsChangedEffect(wallet, accounts) {
46
+ if (!accounts.length) {
47
+ return { action: "ignored" };
48
+ }
49
+ return syncWalletAccount(accounts[0]);
50
+ }
51
+ async function applyWalletDisconnectEffect() {
52
+ if (!isWalletConnected()) {
53
+ return { action: "ignored" };
54
+ }
55
+ await disconnectWallet({ silent: true, revokePermissions: false });
56
+ return { action: "disconnected" };
57
+ }
58
+ var applyTronLinkAccountResolution = applyVerifiedAccountResolution;
59
+
60
+ export { applyTronLinkAccountResolution, applyVerifiedAccountResolution, applyWalletAccountsChangedEffect, applyWalletDisconnectEffect };
@@ -1,4 +1,4 @@
1
- import { getWalletEventProvider, resolveChainConfig, requestWallet, syncWalletRuntimeProvider, emitWalletEvent, getActiveWalletKey } from './chunk-Z2EMFRMV.js';
1
+ import { getWalletEventProvider, resolveChainConfig, requestWallet, syncWalletRuntimeProvider, emitWalletEvent, getActiveWalletKey } from './chunk-YFNGF2E3.js';
2
2
 
3
3
  // src/core/network.ts
4
4
  async function ensureTargetNetwork(options) {
@@ -1,33 +1,6 @@
1
- import { BrowserProvider, Contract, formatUnits, JsonRpcProvider } from 'ethers';
1
+ import { Contract, formatUnits, JsonRpcProvider, BrowserProvider } from 'ethers';
2
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
- }
18
- var providerCache = /* @__PURE__ */ new WeakMap();
19
- function resetSharedBrowserProvider(ethereum) {
20
- providerCache.delete(ethereum);
21
- }
22
- function getSharedBrowserProvider(ethereum) {
23
- const cached = providerCache.get(ethereum);
24
- if (cached) {
25
- return cached;
26
- }
27
- const provider = new BrowserProvider(ethereum);
28
- providerCache.set(ethereum, provider);
29
- return provider;
30
- }
3
+ // src/core/contract-read.ts
31
4
 
32
5
  // src/abi/erc20.ts
33
6
  var ERC20_ABI = [
@@ -428,6 +401,16 @@ async function readErc20Balance(readProvider, tokenAddress, accountAddress, erc2
428
401
  decimals
429
402
  };
430
403
  }
404
+
405
+ // src/utils/chain.ts
406
+ function toChainIdDecimal(chainId, fallback) {
407
+ const decimal = Number.parseInt(chainId, 16);
408
+ if (Number.isFinite(decimal)) return decimal;
409
+ if (fallback !== void 0) return fallback;
410
+ return Number.NaN;
411
+ }
412
+
413
+ // src/core/read-provider.ts
431
414
  var jsonRpcReadProviderCache = { current: null };
432
415
  function clearJsonRpcReadProviderCache() {
433
416
  jsonRpcReadProviderCache.current = null;
@@ -504,6 +487,21 @@ function resetWalletSdkConfig() {
504
487
  delete globalState[INITIALIZED_KEY];
505
488
  clearJsonRpcReadProviderCache();
506
489
  }
490
+ var providerCache = /* @__PURE__ */ new WeakMap();
491
+ function resetSharedBrowserProvider(ethereum) {
492
+ providerCache.delete(ethereum);
493
+ }
494
+ function getSharedBrowserProvider(ethereum) {
495
+ const cached = providerCache.get(ethereum);
496
+ if (cached) {
497
+ return cached;
498
+ }
499
+ const provider = new BrowserProvider(ethereum);
500
+ providerCache.set(ethereum, provider);
501
+ return provider;
502
+ }
503
+
504
+ // src/core/contract-read.ts
507
505
  var walletReadProvider = null;
508
506
  function setWalletReadProvider(provider) {
509
507
  walletReadProvider = provider;
@@ -598,6 +596,14 @@ function clearWalletRuntime(cache) {
598
596
  }
599
597
  }
600
598
 
599
+ // src/utils/env.ts
600
+ var isBrowser = typeof window !== "undefined";
601
+ function assertBrowser(apiName) {
602
+ if (!isBrowser) {
603
+ throw new Error(`[wallet-sdk] ${apiName} is only available in the browser`);
604
+ }
605
+ }
606
+
601
607
  // src/wallet/resolve-wallet-key.ts
602
608
  function resolveWalletKey(provider) {
603
609
  if (!provider) {
@@ -671,6 +677,12 @@ function parseTronLinkChainChanged(args) {
671
677
  raw: args
672
678
  };
673
679
  }
680
+ function normalizeTronLinkLegacyAccountData(data) {
681
+ if (data && typeof data === "object" && "address" in data) {
682
+ return normalizeAccountList(data.address);
683
+ }
684
+ return normalizeAccountList(data);
685
+ }
674
686
  function parseTronLinkLegacyMessage(data) {
675
687
  const message = data?.message;
676
688
  if (!message?.action) {
@@ -684,16 +696,16 @@ function parseTronLinkLegacyMessage(data) {
684
696
  };
685
697
  }
686
698
  if (message.action === "accountsChanged") {
687
- const payload = normalizeAccountList(message.data);
699
+ const payload = normalizeTronLinkLegacyAccountData(message.data);
688
700
  return {
689
701
  name: "accountsChanged",
690
702
  payload,
691
703
  raw: [data]
692
704
  };
693
705
  }
694
- if (message.action === "disconnectWeb") {
706
+ if (message.action === "disconnectWeb" || message.action === "disconnect") {
695
707
  return {
696
- name: "disconnectWeb",
708
+ name: message.action,
697
709
  payload: [],
698
710
  raw: [data]
699
711
  };
@@ -705,34 +717,44 @@ var DEFAULT_RETRY = {
705
717
  emptyAccountsRetryIntervalMs: 0
706
718
  };
707
719
  var TRONLINK_RETRY = {
708
- emptyAccountsRetryAttempts: 5,
709
- emptyAccountsRetryIntervalMs: 120
720
+ emptyAccountsRetryAttempts: 0,
721
+ emptyAccountsRetryIntervalMs: 0
710
722
  };
711
723
  var walletEventAdapters = {
712
724
  metamask: {
713
725
  parseAccountsChanged: parseMetaMaskAccountsChanged,
714
726
  parseChainChanged: parseMetaMaskChainChanged,
727
+ emptyAccountsMeansDisconnect: true,
728
+ confirmEmptyAccountsWithRpc: false,
715
729
  ...DEFAULT_RETRY
716
730
  },
717
731
  coinbase: {
718
732
  parseAccountsChanged: parseMetaMaskAccountsChanged,
719
733
  parseChainChanged: parseMetaMaskChainChanged,
734
+ emptyAccountsMeansDisconnect: false,
735
+ confirmEmptyAccountsWithRpc: true,
720
736
  ...DEFAULT_RETRY
721
737
  },
722
738
  tokenpocket: {
723
739
  parseAccountsChanged: parseMetaMaskAccountsChanged,
724
740
  parseChainChanged: parseMetaMaskChainChanged,
741
+ emptyAccountsMeansDisconnect: false,
742
+ confirmEmptyAccountsWithRpc: true,
725
743
  ...DEFAULT_RETRY
726
744
  },
727
745
  tronlink: {
728
746
  parseAccountsChanged: parseTronLinkAccountsChanged,
729
747
  parseChainChanged: parseTronLinkChainChanged,
730
748
  parseLegacyMessage: parseTronLinkLegacyMessage,
749
+ emptyAccountsMeansDisconnect: false,
750
+ confirmEmptyAccountsWithRpc: true,
731
751
  ...TRONLINK_RETRY
732
752
  },
733
753
  unknown: {
734
754
  parseAccountsChanged: parseMetaMaskAccountsChanged,
735
755
  parseChainChanged: parseMetaMaskChainChanged,
756
+ emptyAccountsMeansDisconnect: true,
757
+ confirmEmptyAccountsWithRpc: false,
736
758
  emptyAccountsRetryAttempts: 2,
737
759
  emptyAccountsRetryIntervalMs: 100
738
760
  }
@@ -744,6 +766,7 @@ function getWalletEventAdapter(wallet) {
744
766
  // src/wallet/events.ts
745
767
  var eventHandlers = {};
746
768
  var providerBridges = /* @__PURE__ */ new WeakMap();
769
+ var tronLinkAuxiliaryBindings = [];
747
770
  var walletEventProvider = null;
748
771
  var boundProvider = null;
749
772
  var activeWalletKey = "unknown";
@@ -755,6 +778,56 @@ function dispatch(sdkEvent, wallet, event) {
755
778
  void handler(wallet, event);
756
779
  }
757
780
  }
781
+ function hasWalletEventListeners() {
782
+ return Boolean(eventHandlers.accountsChanged?.size || eventHandlers.walletDisconnected?.size);
783
+ }
784
+ function collectTronLinkEventProviders(primary) {
785
+ if (!isBrowser) {
786
+ return primary ? [primary] : [];
787
+ }
788
+ const providers = [];
789
+ const seen = /* @__PURE__ */ new Set();
790
+ const add = (provider) => {
791
+ if (!provider || seen.has(provider)) {
792
+ return;
793
+ }
794
+ seen.add(provider);
795
+ providers.push(provider);
796
+ };
797
+ add(primary);
798
+ add(window.tron ?? null);
799
+ add(window.tronLink ?? null);
800
+ const ethereum = window.ethereum;
801
+ if (ethereum && (ethereum.isTronLink || ethereum.isTronLinkWallet)) {
802
+ add(ethereum);
803
+ }
804
+ return providers;
805
+ }
806
+ async function ensureWalletEventBinding() {
807
+ const { getSelectedWalletProvider: getSelectedWalletProvider2 } = await import('./runtime-7KOICQLR.js');
808
+ const selected = getSelectedWalletProvider2();
809
+ if (selected && !walletEventProvider) {
810
+ setWalletEventProvider(selected);
811
+ }
812
+ }
813
+ async function handleVerifiedAccountEvent(wallet, nativeEvent) {
814
+ const { applyVerifiedAccountResolution } = await import('./account-sync-GCHF7QJT.js');
815
+ const result = await applyVerifiedAccountResolution(nativeEvent.payload);
816
+ if (result.action === "synced" && result.address) {
817
+ await ensureWalletEventBinding();
818
+ dispatch("accountsChanged", wallet, {
819
+ ...nativeEvent,
820
+ payload: [result.address]
821
+ });
822
+ return;
823
+ }
824
+ if (result.action === "disconnected") {
825
+ dispatch("walletDisconnected", wallet, {
826
+ ...nativeEvent,
827
+ payload: { source: "provider" }
828
+ });
829
+ }
830
+ }
758
831
  function emitWalletEvent(sdkEvent, wallet, event) {
759
832
  dispatch(sdkEvent, wallet, event);
760
833
  }
@@ -767,6 +840,9 @@ function unbindProvider(provider) {
767
840
  if (bridgeHandlers.chainChanged) {
768
841
  provider.removeListener("chainChanged", bridgeHandlers.chainChanged);
769
842
  }
843
+ if (bridgeHandlers.disconnect) {
844
+ provider.removeListener("disconnect", bridgeHandlers.disconnect);
845
+ }
770
846
  providerBridges.delete(provider);
771
847
  }
772
848
  function unbindTronLinkLegacyMessages() {
@@ -776,13 +852,77 @@ function unbindTronLinkLegacyMessages() {
776
852
  window.removeEventListener("message", tronLinkMessageListener);
777
853
  tronLinkMessageListener = null;
778
854
  }
855
+ async function handleWalletDisconnect(wallet, nativeEvent) {
856
+ const { applyWalletDisconnectEffect } = await import('./account-sync-GCHF7QJT.js');
857
+ const result = await applyWalletDisconnectEffect();
858
+ if (result.action === "disconnected") {
859
+ dispatch("walletDisconnected", wallet, nativeEvent);
860
+ }
861
+ }
779
862
  async function handleAccountsChanged(wallet, nativeEvent) {
780
- const { applyWalletAccountsChangedEffect } = await import('./account-sync-77HMBIWC.js');
781
- await applyWalletAccountsChangedEffect(wallet, nativeEvent.payload);
782
- dispatch("accountsChanged", wallet, nativeEvent);
863
+ const adapter = getWalletEventAdapter(wallet);
864
+ if (adapter.confirmEmptyAccountsWithRpc) {
865
+ void handleVerifiedAccountEvent(wallet, nativeEvent);
866
+ return;
867
+ }
868
+ if (nativeEvent.name === "disconnectWeb" || nativeEvent.name === "disconnect") {
869
+ void handleWalletDisconnect(wallet, {
870
+ ...nativeEvent,
871
+ payload: { source: "provider" }
872
+ });
873
+ return;
874
+ }
875
+ if (!nativeEvent.payload.length) {
876
+ if (adapter.emptyAccountsMeansDisconnect) {
877
+ void handleWalletDisconnect(wallet, {
878
+ ...nativeEvent,
879
+ name: "accountsChanged",
880
+ payload: { source: "provider" }
881
+ });
882
+ return;
883
+ }
884
+ return;
885
+ }
886
+ const { applyWalletAccountsChangedEffect } = await import('./account-sync-GCHF7QJT.js');
887
+ const result = await applyWalletAccountsChangedEffect(wallet, nativeEvent.payload);
888
+ if (result.action !== "synced" || !result.address) {
889
+ return;
890
+ }
891
+ dispatch("accountsChanged", wallet, {
892
+ ...nativeEvent,
893
+ payload: [result.address]
894
+ });
895
+ }
896
+ function unbindTronLinkAuxiliaryProviders() {
897
+ for (const binding of tronLinkAuxiliaryBindings) {
898
+ binding.provider.removeListener("accountsChanged", binding.handler);
899
+ }
900
+ tronLinkAuxiliaryBindings.length = 0;
901
+ }
902
+ function bindTronLinkAuxiliaryProviders(wallet, adapter) {
903
+ if (!hasWalletEventListeners() || wallet !== "tronlink") {
904
+ unbindTronLinkAuxiliaryProviders();
905
+ return;
906
+ }
907
+ unbindTronLinkAuxiliaryProviders();
908
+ for (const provider of collectTronLinkEventProviders(walletEventProvider)) {
909
+ if (provider === walletEventProvider) {
910
+ continue;
911
+ }
912
+ const handler = (...args) => {
913
+ const nativeEvent = adapter.parseAccountsChanged(args);
914
+ void handleAccountsChanged("tronlink", nativeEvent);
915
+ };
916
+ provider.removeListener("accountsChanged", handler);
917
+ provider.on("accountsChanged", handler);
918
+ tronLinkAuxiliaryBindings.push({ provider, handler });
919
+ }
783
920
  }
784
921
  function bindTronLinkLegacyMessages(wallet) {
785
- if (!isBrowser || wallet !== "tronlink" || tronLinkMessageListener) {
922
+ if (!isBrowser || wallet !== "tronlink" || !hasWalletEventListeners()) {
923
+ return;
924
+ }
925
+ if (tronLinkMessageListener) {
786
926
  return;
787
927
  }
788
928
  const adapter = getWalletEventAdapter(wallet);
@@ -794,30 +934,49 @@ function bindTronLinkLegacyMessages(wallet) {
794
934
  if (!parsed) {
795
935
  return;
796
936
  }
797
- if (parsed.name === "disconnectWeb") {
798
- void handleAccountsChanged(wallet, parsed);
937
+ void handleAccountsChanged("tronlink", parsed);
938
+ };
939
+ window.addEventListener("message", tronLinkMessageListener);
940
+ }
941
+ function syncTronLinkExtras(adapter, wallet) {
942
+ if (!hasWalletEventListeners()) {
943
+ unbindTronLinkLegacyMessages();
944
+ unbindTronLinkAuxiliaryProviders();
945
+ return;
946
+ }
947
+ void import('./runtime-7KOICQLR.js').then(({ getSelectedWalletProvider: getSelectedWalletProvider2 }) => {
948
+ const selected = getSelectedWalletProvider2();
949
+ const selectedKey = selected ? resolveWalletKey(selected) : "unknown";
950
+ const eventKey = walletEventProvider ? resolveWalletKey(walletEventProvider) : "unknown";
951
+ const shouldListen = wallet === "tronlink" || activeWalletKey === "tronlink" || selectedKey === "tronlink" || eventKey === "tronlink";
952
+ if (!shouldListen) {
953
+ unbindTronLinkLegacyMessages();
954
+ unbindTronLinkAuxiliaryProviders();
799
955
  return;
800
956
  }
801
- if (parsed.payload.length > 0 || parsed.name === "accountsChanged") {
802
- void handleAccountsChanged(wallet, parsed);
957
+ bindTronLinkLegacyMessages("tronlink");
958
+ bindTronLinkAuxiliaryProviders("tronlink", adapter);
959
+ }).catch(() => {
960
+ if (wallet === "tronlink" || activeWalletKey === "tronlink") {
961
+ bindTronLinkLegacyMessages("tronlink");
962
+ bindTronLinkAuxiliaryProviders("tronlink", adapter);
803
963
  }
804
- };
805
- window.addEventListener("message", tronLinkMessageListener);
964
+ });
806
965
  }
807
966
  function syncProviderBinding() {
808
967
  if (boundProvider) {
809
968
  unbindProvider(boundProvider);
810
969
  boundProvider = null;
811
970
  }
812
- unbindTronLinkLegacyMessages();
813
971
  if (!walletEventProvider) {
814
972
  activeWalletKey = "unknown";
973
+ syncTronLinkExtras(getWalletEventAdapter("tronlink"), "unknown");
815
974
  return;
816
975
  }
817
976
  activeWalletKey = resolveWalletKey(walletEventProvider);
818
977
  const adapter = getWalletEventAdapter(activeWalletKey);
819
978
  const bridgeHandlers = {};
820
- if (eventHandlers.accountsChanged?.size) {
979
+ if (eventHandlers.accountsChanged?.size || eventHandlers.walletDisconnected?.size) {
821
980
  bridgeHandlers.accountsChanged = (...args) => {
822
981
  const nativeEvent = adapter.parseAccountsChanged(args);
823
982
  void handleAccountsChanged(activeWalletKey, nativeEvent);
@@ -832,6 +991,24 @@ function syncProviderBinding() {
832
991
  dispatch("chainChanged", activeWalletKey, nativeEvent);
833
992
  };
834
993
  }
994
+ if (eventHandlers.walletDisconnected?.size) {
995
+ bridgeHandlers.disconnect = () => {
996
+ const disconnectAdapter = getWalletEventAdapter(activeWalletKey);
997
+ if (disconnectAdapter.confirmEmptyAccountsWithRpc) {
998
+ void handleVerifiedAccountEvent(activeWalletKey, {
999
+ name: "disconnect",
1000
+ payload: [],
1001
+ raw: []
1002
+ });
1003
+ return;
1004
+ }
1005
+ void handleWalletDisconnect(activeWalletKey, {
1006
+ name: "disconnect",
1007
+ payload: { source: "provider" },
1008
+ raw: []
1009
+ });
1010
+ };
1011
+ }
835
1012
  if (bridgeHandlers.accountsChanged) {
836
1013
  walletEventProvider.removeListener("accountsChanged", bridgeHandlers.accountsChanged);
837
1014
  walletEventProvider.on("accountsChanged", bridgeHandlers.accountsChanged);
@@ -840,9 +1017,13 @@ function syncProviderBinding() {
840
1017
  walletEventProvider.removeListener("chainChanged", bridgeHandlers.chainChanged);
841
1018
  walletEventProvider.on("chainChanged", bridgeHandlers.chainChanged);
842
1019
  }
1020
+ if (bridgeHandlers.disconnect) {
1021
+ walletEventProvider.removeListener("disconnect", bridgeHandlers.disconnect);
1022
+ walletEventProvider.on("disconnect", bridgeHandlers.disconnect);
1023
+ }
843
1024
  providerBridges.set(walletEventProvider, bridgeHandlers);
844
1025
  boundProvider = walletEventProvider;
845
- bindTronLinkLegacyMessages(activeWalletKey);
1026
+ syncTronLinkExtras(adapter, activeWalletKey);
846
1027
  }
847
1028
  function setWalletEventProvider(provider) {
848
1029
  walletEventProvider = provider;
@@ -974,7 +1155,7 @@ async function connectWallet(eip1193, options = {}) {
974
1155
  }
975
1156
  );
976
1157
  if (options.chainId && isActiveConnectionSession(runtime, session)) {
977
- const { switchToConfiguredNetwork } = await import('./network-WJN3S7KB.js');
1158
+ const { switchToConfiguredNetwork } = await import('./network-72KB2UUH.js');
978
1159
  await switchToConfiguredNetwork(options.chainId);
979
1160
  }
980
1161
  return result;
@@ -1051,15 +1232,60 @@ async function switchWalletAccount(address) {
1051
1232
  }
1052
1233
  return syncConnectedWalletAccount(address);
1053
1234
  }
1054
- function disconnectWallet() {
1235
+ async function tryRevokeAccountPermissions(provider) {
1236
+ try {
1237
+ await requestWallet(provider, "wallet_revokePermissions", [{ eth_accounts: {} }]);
1238
+ return true;
1239
+ } catch (err) {
1240
+ const error = err;
1241
+ if (error?.code === 4001) {
1242
+ throw err;
1243
+ }
1244
+ return false;
1245
+ }
1246
+ }
1247
+ function ensureWalletRuntimeProviderBound() {
1248
+ const runtime = getRuntimeStore();
1249
+ if (!runtime.selectedProvider) {
1250
+ return false;
1251
+ }
1252
+ if (!runtime.provider) {
1253
+ runtime.provider = getSharedBrowserProvider(runtime.selectedProvider);
1254
+ setWalletReadProvider(runtime.provider);
1255
+ }
1256
+ return runtime.provider !== null;
1257
+ }
1258
+ async function disconnectWallet(options) {
1055
1259
  const runtime = getRuntimeStore();
1260
+ const wasConnected = runtime.connected;
1261
+ const walletKey = wasConnected ? getActiveWalletKey() : "unknown";
1262
+ const preservedProvider = options?.preserveProvider ? runtime.selectedProvider : null;
1263
+ const provider = runtime.selectedProvider;
1264
+ const shouldRevoke = options?.revokePermissions !== false && !options?.preserveProvider && provider !== null;
1265
+ let revoked = false;
1266
+ if (shouldRevoke && provider) {
1267
+ revoked = await tryRevokeAccountPermissions(provider);
1268
+ }
1056
1269
  invalidateConnectionSession(runtime);
1057
1270
  runtime.provider = null;
1058
1271
  runtime.signer = null;
1059
- runtime.selectedProvider = null;
1060
1272
  runtime.connected = false;
1061
- setWalletEventProvider(null);
1062
1273
  setWalletReadProvider(null);
1274
+ if (options?.preserveProvider && preservedProvider) {
1275
+ runtime.selectedProvider = preservedProvider;
1276
+ setWalletEventProvider(preservedProvider);
1277
+ } else {
1278
+ runtime.selectedProvider = null;
1279
+ setWalletEventProvider(null);
1280
+ }
1281
+ if (wasConnected && !options?.silent) {
1282
+ emitWalletEvent("walletDisconnected", walletKey, {
1283
+ name: "disconnect",
1284
+ payload: { source: "app" },
1285
+ raw: []
1286
+ });
1287
+ }
1288
+ return { revoked };
1063
1289
  }
1064
1290
 
1065
- 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, getWalletEventAdapter, 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 };
1291
+ 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, ensureWalletRuntimeProviderBound, 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 };
package/dist/index.d.ts CHANGED
@@ -78,6 +78,10 @@ type NetworkSwitchResult = {
78
78
  /** @en `true` if switch was invoked; `false` if already on target chain. @zh `true` 已发起切链;`false` 已在目标链。 */
79
79
  switched: boolean;
80
80
  };
81
+ type WalletDisconnectPayload = {
82
+ /** @en `app` when `disconnectWallet()` is called; `provider` when the wallet emits disconnect. @zh `app` 为调用 `disconnectWallet()`;`provider` 为钱包主动断开。 */
83
+ source: "app" | "provider";
84
+ };
81
85
  type ConnectWalletOptions = {
82
86
  /** @en Switch wallet to this BSC chain after connect. @zh 连接后切换到指定 BSC 链。 */
83
87
  chainId?: SupportedBscChainId;
@@ -518,10 +522,27 @@ declare function switchWalletAccount(address: string): Promise<{
518
522
  signer: JsonRpcSigner;
519
523
  }>;
520
524
  /**
521
- * @en Disconnect the wallet.
522
- * @zh 断开钱包连接。
525
+ * @en Re-bind BrowserProvider when `selectedProvider` exists but runtime provider was cleared.
526
+ * @zh 当 `selectedProvider` 仍在但 runtime provider 被清空时,重新绑定 BrowserProvider。
527
+ */
528
+ declare function ensureWalletRuntimeProviderBound(): boolean;
529
+ type DisconnectWalletOptions = {
530
+ /** @en When `true`, skip `walletDisconnected` event (internal provider-driven disconnect). @zh 为 `true` 时不触发 `walletDisconnected`(内部由 provider 断开时使用)。 */
531
+ silent?: boolean;
532
+ /** @en Keep `selectedProvider` and event listeners (TronLink account switch after revoke). @zh 保留 `selectedProvider` 与事件监听(TronLink 撤销后切账户)。 */
533
+ preserveProvider?: boolean;
534
+ /** @en Attempt `wallet_revokePermissions` before clearing local state (default `true`). @zh 清除本地状态前尝试 `wallet_revokePermissions`(默认 `true`)。 */
535
+ revokePermissions?: boolean;
536
+ };
537
+ type DisconnectWalletResult = {
538
+ /** @en Whether `eth_accounts` permission was revoked in the wallet. @zh 是否已在钱包侧撤销 `eth_accounts` 授权。 */
539
+ revoked: boolean;
540
+ };
541
+ /**
542
+ * @en Disconnect the wallet; optionally revoke site permissions in MetaMask / Coinbase.
543
+ * @zh 断开钱包;可选在 MetaMask / Coinbase 中撤销站点授权。
523
544
  */
524
- declare function disconnectWallet(): void;
545
+ declare function disconnectWallet(options?: DisconnectWalletOptions): Promise<DisconnectWalletResult>;
525
546
 
526
547
  type SupportedWalletKey = "metamask" | "tronlink" | "coinbase" | "tokenpocket" | "unknown";
527
548
  /**
@@ -540,6 +561,7 @@ type WalletSdkEventMap = {
540
561
  accountsChanged: string[];
541
562
  chainChanged: string;
542
563
  networkSwitched: NetworkSwitchResult;
564
+ walletDisconnected: WalletDisconnectPayload;
543
565
  };
544
566
  type WalletSdkEventName = keyof WalletSdkEventMap;
545
567
  type WalletScopedEventListener<K extends WalletSdkEventName = WalletSdkEventName> = (wallet: SupportedWalletKey, event: WalletNativeEvent<WalletSdkEventMap[K]>) => void | Promise<void>;
@@ -572,8 +594,8 @@ type WalletAccountsSyncResult = {
572
594
  address?: string;
573
595
  };
574
596
  /**
575
- * @en Apply wallet-specific account sync/disconnect side effects.
576
- * @zh 按钱包类型应用账户同步/断开副作用。
597
+ * @en Sync signer when payload includes an account address.
598
+ * @zh 仅当 payload 含账户地址时同步 signer。
577
599
  */
578
600
  declare function applyWalletAccountsChangedEffect(wallet: SupportedWalletKey, accounts: string[]): Promise<WalletAccountsSyncResult>;
579
601
 
@@ -770,4 +792,4 @@ declare const ERC20_ABI: ({
770
792
  stateMutability?: undefined;
771
793
  })[];
772
794
 
773
- export { BSC_NETWORK, BSC_TESTNET_NETWORK, type ChainConfig, type ChainNativeCurrency, type ConnectWalletOptions, ERC20_ABI, ERC20_DECIMALS, ERC20_DECIMALS_ABI, type Eip6963ProviderDetail, type Eip6963ProviderInfo, type Erc20BalanceResult, type EthereumRequestParams, type EvmReadProvider, type GetConfiguredReadProviderOptions, type GetContractReadOptions, type InjectedEthereumProvider, type MutableRef, type NetworkSwitchResult, SUPPORTED_BSC_CHAIN_IDS, type SupportedBscChainId, type SupportedWalletKey, USDT_CONFIG, type UsdtInitConfig, Wallet6963Name, Wallet6963Rdns, type WalletAccountsSyncResult, type WalletEventProvider, WalletEvents, type WalletNativeEvent, type WalletScopedEventListener, type WalletSdkConfig, type WalletSdkEventMap, type WalletSdkEventName, type WalletSdkInitOptions, applyWalletAccountsChangedEffect, assertBrowser, bindBrowserProvider, bindWalletProvider, clearJsonRpcReadProviderCache, clearWalletRuntime, connectWallet, connectWalletAccount, createJsonRpcReadProvider, disconnectWallet, discoverWalletProviders, emitWalletEvent, ensureTargetNetwork, findCoinbaseEip6963Provider, findDiscoveredProvider, findMetaMaskEip6963Provider, findTokenPocketEip6963Provider, findTronLinkEip6963Provider, getActiveWalletKey, getAggregatedInjectedProvider, getConfiguredReadProvider, getConnectedAddress, getContractDecimals, getContractPrice, getInjectedEthereumProviders, getReadProviderWithFallback, getSelectedWalletProvider, getSharedBrowserProvider, getWalletAccounts, getWalletBrowserProvider, getWalletEventProvider, getWalletSdkConfig, getWalletSigner, hasAggregatedInjectedProvider, hasCoinbaseEip6963Provider, hasCoinbaseInjectedProvider, hasDeployedContract, hasMetaMaskEip6963Provider, hasMetaMaskInjectedProvider, hasRecoverableAggregatorProvider, hasTokenPocketEip6963Provider, hasTokenPocketInjectedProvider, hasTronLinkEip6963Provider, hasTronLinkInjectedProvider, initWalletSdk, isBrowser, isCoinbaseProvider, isContractDeployed, isEthereumProvider, isInjectedProvider, isTokenPocketProvider, isTronLinkProvider, isWalletConnected, isWalletSdkInitialized, normalizeSupportedBscChainId, readConfiguredUsdtDecimals, readErc20Balance, readErc20Decimals, readUsdtBalance, refreshWalletAccounts, refreshWalletReadProvider, rememberAggregatorProvider, requestWallet, resetWalletSdkConfig, resolveChainConfig, resolveCoinbaseInjectedProvider, resolveMetaMaskInjectedProvider, resolveTokenPocketInjectedProvider, resolveTronLinkInjectedProvider, resolveWalletKey, setWalletEventProvider, setWalletReadProvider, switchToConfiguredNetwork, switchWalletAccount, syncConnectedWalletAccount, syncWalletAccountAddress, syncWalletRuntimeProvider, toChainIdDecimal, walletEvents };
795
+ export { BSC_NETWORK, BSC_TESTNET_NETWORK, type ChainConfig, type ChainNativeCurrency, type ConnectWalletOptions, type DisconnectWalletOptions, type DisconnectWalletResult, ERC20_ABI, ERC20_DECIMALS, ERC20_DECIMALS_ABI, type Eip6963ProviderDetail, type Eip6963ProviderInfo, type Erc20BalanceResult, type EthereumRequestParams, type EvmReadProvider, type GetConfiguredReadProviderOptions, type GetContractReadOptions, type InjectedEthereumProvider, type MutableRef, type NetworkSwitchResult, SUPPORTED_BSC_CHAIN_IDS, type SupportedBscChainId, type SupportedWalletKey, USDT_CONFIG, type UsdtInitConfig, Wallet6963Name, Wallet6963Rdns, type WalletAccountsSyncResult, type WalletDisconnectPayload, type WalletEventProvider, WalletEvents, type WalletNativeEvent, type WalletScopedEventListener, type WalletSdkConfig, type WalletSdkEventMap, type WalletSdkEventName, type WalletSdkInitOptions, applyWalletAccountsChangedEffect, assertBrowser, bindBrowserProvider, bindWalletProvider, clearJsonRpcReadProviderCache, clearWalletRuntime, connectWallet, connectWalletAccount, createJsonRpcReadProvider, disconnectWallet, discoverWalletProviders, emitWalletEvent, ensureTargetNetwork, ensureWalletRuntimeProviderBound, findCoinbaseEip6963Provider, findDiscoveredProvider, findMetaMaskEip6963Provider, findTokenPocketEip6963Provider, findTronLinkEip6963Provider, getActiveWalletKey, getAggregatedInjectedProvider, getConfiguredReadProvider, getConnectedAddress, getContractDecimals, getContractPrice, getInjectedEthereumProviders, getReadProviderWithFallback, getSelectedWalletProvider, getSharedBrowserProvider, getWalletAccounts, getWalletBrowserProvider, getWalletEventProvider, getWalletSdkConfig, getWalletSigner, hasAggregatedInjectedProvider, hasCoinbaseEip6963Provider, hasCoinbaseInjectedProvider, hasDeployedContract, hasMetaMaskEip6963Provider, hasMetaMaskInjectedProvider, hasRecoverableAggregatorProvider, hasTokenPocketEip6963Provider, hasTokenPocketInjectedProvider, hasTronLinkEip6963Provider, hasTronLinkInjectedProvider, initWalletSdk, isBrowser, isCoinbaseProvider, isContractDeployed, isEthereumProvider, isInjectedProvider, isTokenPocketProvider, isTronLinkProvider, isWalletConnected, isWalletSdkInitialized, normalizeSupportedBscChainId, readConfiguredUsdtDecimals, readErc20Balance, readErc20Decimals, readUsdtBalance, refreshWalletAccounts, refreshWalletReadProvider, rememberAggregatorProvider, requestWallet, resetWalletSdkConfig, resolveChainConfig, resolveCoinbaseInjectedProvider, resolveMetaMaskInjectedProvider, resolveTokenPocketInjectedProvider, resolveTronLinkInjectedProvider, resolveWalletKey, setWalletEventProvider, setWalletReadProvider, switchToConfiguredNetwork, switchWalletAccount, syncConnectedWalletAccount, syncWalletAccountAddress, syncWalletRuntimeProvider, toChainIdDecimal, walletEvents };
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- export { applyWalletAccountsChangedEffect } from './chunk-BUZ26NFL.js';
2
- export { ensureTargetNetwork, switchToConfiguredNetwork } from './chunk-TPFOHQNS.js';
3
- import { isBrowser } from './chunk-Z2EMFRMV.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-Z2EMFRMV.js';
1
+ export { applyWalletAccountsChangedEffect } from './chunk-M4PEE6H7.js';
2
+ export { ensureTargetNetwork, switchToConfiguredNetwork } from './chunk-TZWW7JTY.js';
3
+ import { isBrowser } from './chunk-YFNGF2E3.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, ensureWalletRuntimeProviderBound, 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-YFNGF2E3.js';
5
5
 
6
6
  // src/wallet/eip6963.ts
7
7
  var EIP6963_ANNOUNCE = "eip6963:announceProvider";
@@ -1,2 +1,2 @@
1
- export { ensureTargetNetwork, switchToConfiguredNetwork } from './chunk-TPFOHQNS.js';
2
- import './chunk-Z2EMFRMV.js';
1
+ export { ensureTargetNetwork, switchToConfiguredNetwork } from './chunk-TZWW7JTY.js';
2
+ import './chunk-YFNGF2E3.js';
@@ -0,0 +1 @@
1
+ export { bindWalletProvider, connectWallet, disconnectWallet, ensureWalletRuntimeProviderBound, getConnectedAddress, getSelectedWalletProvider, getWalletAccounts, getWalletBrowserProvider, getWalletSigner, isWalletConnected, refreshWalletAccounts, switchWalletAccount, syncConnectedWalletAccount, syncWalletRuntimeProvider } from './chunk-YFNGF2E3.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@earthworm/wallet-sdk",
3
- "version": "0.2.3",
3
+ "version": "0.2.6",
4
4
  "description": "EVM wallet utilities for browser DApps",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -1,2 +0,0 @@
1
- export { applyWalletAccountsChangedEffect } from './chunk-BUZ26NFL.js';
2
- import './chunk-Z2EMFRMV.js';
@@ -1,48 +0,0 @@
1
- import { syncConnectedWalletAccount, isWalletConnected, getWalletEventAdapter, disconnectWallet, getSelectedWalletProvider, getWalletAccounts } from './chunk-Z2EMFRMV.js';
2
-
3
- // src/wallet/account-sync.ts
4
- function delay(ms) {
5
- return new Promise((resolve) => {
6
- setTimeout(resolve, ms);
7
- });
8
- }
9
- async function recoverAccountsForWallet(wallet) {
10
- const adapter = getWalletEventAdapter(wallet);
11
- for (let attempt = 0; attempt < adapter.emptyAccountsRetryAttempts; attempt++) {
12
- if (attempt > 0) {
13
- await delay(adapter.emptyAccountsRetryIntervalMs);
14
- }
15
- if (!getSelectedWalletProvider()) {
16
- return [];
17
- }
18
- try {
19
- const accounts = await getWalletAccounts();
20
- if (accounts.length > 0) {
21
- return accounts;
22
- }
23
- } catch {
24
- }
25
- }
26
- return [];
27
- }
28
- async function applyWalletAccountsChangedEffect(wallet, accounts) {
29
- if (accounts.length > 0) {
30
- const result = await syncConnectedWalletAccount(accounts[0]);
31
- return { action: "synced", address: result.address };
32
- }
33
- if (!isWalletConnected()) {
34
- return { action: "ignored" };
35
- }
36
- const adapter = getWalletEventAdapter(wallet);
37
- if (adapter.emptyAccountsRetryAttempts > 0) {
38
- const recovered = await recoverAccountsForWallet(wallet);
39
- if (recovered.length > 0) {
40
- const result = await syncConnectedWalletAccount(recovered[0]);
41
- return { action: "synced", address: result.address };
42
- }
43
- }
44
- disconnectWallet();
45
- return { action: "disconnected" };
46
- }
47
-
48
- export { applyWalletAccountsChangedEffect };