@enclave-hq/wallet-sdk 1.1.3 → 1.1.4

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.
@@ -1473,9 +1473,6 @@ var WalletManager = class extends TypedEventEmitter {
1473
1473
  walletConnectProjectId: config.walletConnectProjectId ?? ""
1474
1474
  };
1475
1475
  this.registry = new AdapterRegistry();
1476
- if (this.config.enableStorage) {
1477
- this.restoreFromStorage();
1478
- }
1479
1476
  }
1480
1477
  // ===== Connection Management =====
1481
1478
  /**
@@ -1586,13 +1583,13 @@ var WalletManager = class extends TypedEventEmitter {
1586
1583
  return adapter.currentAccount;
1587
1584
  }
1588
1585
  /**
1589
- * 获取主钱包账户
1586
+ * Get primary wallet account
1590
1587
  */
1591
1588
  getPrimaryAccount() {
1592
1589
  return this.primaryWallet?.currentAccount || null;
1593
1590
  }
1594
1591
  /**
1595
- * 获取所有已连接的钱包
1592
+ * Get all connected wallets
1596
1593
  */
1597
1594
  getConnectedWallets() {
1598
1595
  return Array.from(this.connectedWallets.values()).map((adapter) => ({
@@ -1605,14 +1602,14 @@ var WalletManager = class extends TypedEventEmitter {
1605
1602
  }));
1606
1603
  }
1607
1604
  /**
1608
- * 根据链类型获取钱包
1605
+ * Get wallet by chain type
1609
1606
  */
1610
1607
  getWalletByChainType(chainType) {
1611
1608
  return this.connectedWallets.get(chainType) || null;
1612
1609
  }
1613
- // ===== 签名 =====
1610
+ // ===== Signing =====
1614
1611
  /**
1615
- * 使用主钱包签名
1612
+ * Sign message with primary wallet
1616
1613
  */
1617
1614
  async signMessage(message) {
1618
1615
  if (!this.primaryWallet) {
@@ -1621,7 +1618,7 @@ var WalletManager = class extends TypedEventEmitter {
1621
1618
  return this.primaryWallet.signMessage(message);
1622
1619
  }
1623
1620
  /**
1624
- * 使用指定链类型的钱包签名
1621
+ * Sign message with wallet of specified chain type
1625
1622
  */
1626
1623
  async signMessageWithChainType(message, chainType) {
1627
1624
  if (!chainType) {
@@ -1634,7 +1631,7 @@ var WalletManager = class extends TypedEventEmitter {
1634
1631
  return adapter.signMessage(message);
1635
1632
  }
1636
1633
  /**
1637
- * 签名 TypedData(仅 EVM
1634
+ * Sign TypedData (EVM only)
1638
1635
  */
1639
1636
  async signTypedData(typedData, chainType) {
1640
1637
  const adapter = chainType ? this.connectedWallets.get(chainType) : this.primaryWallet;
@@ -1647,7 +1644,7 @@ var WalletManager = class extends TypedEventEmitter {
1647
1644
  return adapter.signTypedData(typedData);
1648
1645
  }
1649
1646
  /**
1650
- * 签名交易(使用主钱包)
1647
+ * Sign transaction (with primary wallet)
1651
1648
  */
1652
1649
  async signTransaction(transaction) {
1653
1650
  if (!this.primaryWallet) {
@@ -1659,7 +1656,7 @@ var WalletManager = class extends TypedEventEmitter {
1659
1656
  return this.primaryWallet.signTransaction(transaction);
1660
1657
  }
1661
1658
  /**
1662
- * 使用指定链类型的钱包签名交易
1659
+ * Sign transaction with wallet of specified chain type
1663
1660
  */
1664
1661
  async signTransactionWithChainType(transaction, chainType) {
1665
1662
  if (!chainType) {
@@ -1674,9 +1671,9 @@ var WalletManager = class extends TypedEventEmitter {
1674
1671
  }
1675
1672
  return adapter.signTransaction(transaction);
1676
1673
  }
1677
- // ===== 链切换 =====
1674
+ // ===== Chain Switching =====
1678
1675
  /**
1679
- * 请求切换链(仅 EVM
1676
+ * Request chain switch (EVM only)
1680
1677
  */
1681
1678
  async requestSwitchChain(chainId, options) {
1682
1679
  if (!this.primaryWallet) {
@@ -1697,9 +1694,9 @@ var WalletManager = class extends TypedEventEmitter {
1697
1694
  throw error;
1698
1695
  }
1699
1696
  }
1700
- // ===== 合约调用 =====
1697
+ // ===== Contract Calls =====
1701
1698
  /**
1702
- * 读取合约
1699
+ * Read contract
1703
1700
  */
1704
1701
  async readContract(address, abi, functionName, args, chainType) {
1705
1702
  const adapter = chainType ? this.connectedWallets.get(chainType) : this.primaryWallet;
@@ -1712,7 +1709,7 @@ var WalletManager = class extends TypedEventEmitter {
1712
1709
  return adapter.readContract({ address, abi, functionName, args });
1713
1710
  }
1714
1711
  /**
1715
- * 写入合约
1712
+ * Write contract
1716
1713
  */
1717
1714
  async writeContract(address, abi, functionName, args, options, chainType) {
1718
1715
  const adapter = chainType ? this.connectedWallets.get(chainType) : this.primaryWallet;
@@ -1731,7 +1728,7 @@ var WalletManager = class extends TypedEventEmitter {
1731
1728
  });
1732
1729
  }
1733
1730
  /**
1734
- * 估算 Gas
1731
+ * Estimate gas
1735
1732
  */
1736
1733
  async estimateGas(address, abi, functionName, args, chainType) {
1737
1734
  const adapter = chainType ? this.connectedWallets.get(chainType) : this.primaryWallet;
@@ -1744,7 +1741,7 @@ var WalletManager = class extends TypedEventEmitter {
1744
1741
  return adapter.estimateGas({ address, abi, functionName, args });
1745
1742
  }
1746
1743
  /**
1747
- * 等待交易确认
1744
+ * Wait for transaction confirmation
1748
1745
  */
1749
1746
  async waitForTransaction(txHash, confirmations, chainType) {
1750
1747
  const adapter = chainType ? this.connectedWallets.get(chainType) : this.primaryWallet;
@@ -1756,9 +1753,9 @@ var WalletManager = class extends TypedEventEmitter {
1756
1753
  }
1757
1754
  return adapter.waitForTransaction(txHash, confirmations);
1758
1755
  }
1759
- // ===== Provider 访问 =====
1756
+ // ===== Provider Access =====
1760
1757
  /**
1761
- * 获取主钱包 Provider
1758
+ * Get primary wallet Provider
1762
1759
  */
1763
1760
  getProvider() {
1764
1761
  if (!this.primaryWallet) {
@@ -1767,7 +1764,7 @@ var WalletManager = class extends TypedEventEmitter {
1767
1764
  return this.primaryWallet.getProvider();
1768
1765
  }
1769
1766
  /**
1770
- * 获取指定链类型的 Provider
1767
+ * Get Provider by chain type
1771
1768
  */
1772
1769
  getProviderByChainType(chainType) {
1773
1770
  const adapter = this.connectedWallets.get(chainType);
@@ -1776,21 +1773,21 @@ var WalletManager = class extends TypedEventEmitter {
1776
1773
  }
1777
1774
  return adapter.getProvider();
1778
1775
  }
1779
- // ===== 私有方法 =====
1776
+ // ===== Private Methods =====
1780
1777
  /**
1781
- * 设置主钱包
1778
+ * Set primary wallet
1782
1779
  */
1783
1780
  setPrimaryWallet(adapter) {
1784
1781
  this.primaryWallet = adapter;
1785
1782
  }
1786
1783
  /**
1787
- * 判断钱包是否支持链切换
1784
+ * Check if wallet supports chain switching
1788
1785
  */
1789
1786
  canSwitchChain(adapter) {
1790
1787
  return !!adapter.switchChain;
1791
1788
  }
1792
1789
  /**
1793
- * 设置适配器事件监听
1790
+ * Setup adapter event listeners
1794
1791
  */
1795
1792
  setupAdapterListeners(adapter, isPrimary) {
1796
1793
  adapter.on("accountChanged", (account) => {
@@ -1831,15 +1828,15 @@ var WalletManager = class extends TypedEventEmitter {
1831
1828
  });
1832
1829
  }
1833
1830
  /**
1834
- * 移除适配器事件监听
1831
+ * Remove adapter event listeners
1835
1832
  */
1836
1833
  removeAdapterListeners(adapter) {
1837
1834
  if (!adapter) return;
1838
1835
  adapter.removeAllListeners();
1839
1836
  }
1840
- // ===== 存储 =====
1837
+ // ===== Storage =====
1841
1838
  /**
1842
- * 保存到存储
1839
+ * Save to storage
1843
1840
  */
1844
1841
  saveToStorage() {
1845
1842
  if (typeof window === "undefined" || !this.config.enableStorage) {
@@ -1847,6 +1844,8 @@ var WalletManager = class extends TypedEventEmitter {
1847
1844
  }
1848
1845
  const data = {
1849
1846
  current: this.primaryWallet?.currentAccount?.universalAddress || null,
1847
+ primaryWalletType: this.primaryWallet?.type,
1848
+ primaryChainId: this.primaryWallet?.currentAccount?.chainId,
1850
1849
  history: this.getHistoryRecords()
1851
1850
  };
1852
1851
  try {
@@ -1859,12 +1858,101 @@ var WalletManager = class extends TypedEventEmitter {
1859
1858
  }
1860
1859
  }
1861
1860
  /**
1862
- * 从存储恢复
1861
+ * Restore from storage
1862
+ * Returns a Promise that can be used for auto-reconnection
1863
1863
  */
1864
- restoreFromStorage() {
1864
+ async restoreFromStorage() {
1865
+ if (typeof window === "undefined" || !this.config.enableStorage) {
1866
+ return null;
1867
+ }
1868
+ try {
1869
+ const stored = localStorage.getItem(`${this.config.storagePrefix}data`);
1870
+ if (!stored) {
1871
+ console.debug("[WalletManager] No stored wallet data found");
1872
+ return null;
1873
+ }
1874
+ const data = JSON.parse(stored);
1875
+ console.debug("[WalletManager] Restoring from storage:", data);
1876
+ if (!data.primaryWalletType || !data.current) {
1877
+ console.debug("[WalletManager] Missing primary wallet info in storage");
1878
+ return null;
1879
+ }
1880
+ const adapter = this.registry.getAdapter(data.primaryWalletType);
1881
+ if (!adapter) {
1882
+ console.debug("[WalletManager] Adapter not found for type:", data.primaryWalletType);
1883
+ return null;
1884
+ }
1885
+ const isAvailable = await adapter.isAvailable();
1886
+ if (!isAvailable) {
1887
+ console.debug("[WalletManager] Wallet not available:", data.primaryWalletType);
1888
+ return null;
1889
+ }
1890
+ console.debug("[WalletManager] Wallet is available, attempting restoration");
1891
+ if (adapter.chainType === ChainType.EVM && data.primaryWalletType === "metamask" /* METAMASK */) {
1892
+ try {
1893
+ const provider = typeof window !== "undefined" ? window.ethereum : null;
1894
+ if (provider) {
1895
+ const accounts = await provider.request({
1896
+ method: "eth_accounts"
1897
+ });
1898
+ console.debug("[WalletManager] Checking authorized accounts:", accounts);
1899
+ if (accounts && accounts.length > 0) {
1900
+ const savedAddress = data.current.split(":")[1];
1901
+ const currentAddress = accounts[0].toLowerCase();
1902
+ console.debug("[WalletManager] Comparing addresses - saved:", savedAddress, "current:", currentAddress);
1903
+ if (currentAddress === savedAddress.toLowerCase()) {
1904
+ console.debug("[WalletManager] Address matches, attempting connect (should be silent if already authorized)");
1905
+ try {
1906
+ const account2 = await adapter.connect(data.primaryChainId);
1907
+ this.setPrimaryWallet(adapter);
1908
+ this.connectedWallets.set(adapter.chainType, adapter);
1909
+ this.setupAdapterListeners(adapter, true);
1910
+ this.emit("accountChanged", account2);
1911
+ console.debug("[WalletManager] Connect successful");
1912
+ return account2;
1913
+ } catch (connectError) {
1914
+ console.debug("[WalletManager] Connect failed (might be user rejection):", connectError?.message);
1915
+ return null;
1916
+ }
1917
+ } else {
1918
+ console.debug("[WalletManager] Address mismatch, will try normal connect");
1919
+ }
1920
+ } else {
1921
+ console.debug("[WalletManager] No authorized accounts found");
1922
+ }
1923
+ }
1924
+ } catch (silentError) {
1925
+ console.debug("Silent connection failed, trying normal connection:", silentError);
1926
+ }
1927
+ }
1928
+ if (adapter.chainType === ChainType.TRON && data.primaryWalletType === "tronlink" /* TRONLINK */) {
1929
+ try {
1930
+ const tronWeb = adapter.getTronWeb?.();
1931
+ if (tronWeb && tronWeb.defaultAddress?.base58) {
1932
+ const account2 = await adapter.connect(data.primaryChainId);
1933
+ this.setPrimaryWallet(adapter);
1934
+ this.connectedWallets.set(adapter.chainType, adapter);
1935
+ this.setupAdapterListeners(adapter, true);
1936
+ this.emit("accountChanged", account2);
1937
+ return account2;
1938
+ }
1939
+ } catch (silentError) {
1940
+ console.debug("Silent TronLink connection failed:", silentError);
1941
+ }
1942
+ }
1943
+ const account = await adapter.connect(data.primaryChainId);
1944
+ this.setPrimaryWallet(adapter);
1945
+ this.connectedWallets.set(adapter.chainType, adapter);
1946
+ this.setupAdapterListeners(adapter, true);
1947
+ this.emit("accountChanged", account);
1948
+ return account;
1949
+ } catch (error) {
1950
+ console.debug("Failed to restore wallet from storage:", error);
1951
+ return null;
1952
+ }
1865
1953
  }
1866
1954
  /**
1867
- * 清除存储
1955
+ * Clear storage
1868
1956
  */
1869
1957
  clearStorage() {
1870
1958
  if (typeof window === "undefined") {
@@ -1877,7 +1965,7 @@ var WalletManager = class extends TypedEventEmitter {
1877
1965
  }
1878
1966
  }
1879
1967
  /**
1880
- * 获取历史记录
1968
+ * Get history records
1881
1969
  */
1882
1970
  getHistoryRecords() {
1883
1971
  const records = [];
@@ -1904,6 +1992,7 @@ function WalletProvider({ children, walletManager: externalWalletManager }) {
1904
1992
  const [walletManager] = useState(() => externalWalletManager || new WalletManager());
1905
1993
  const [account, setAccount] = useState(null);
1906
1994
  const [connectedWallets, setConnectedWallets] = useState([]);
1995
+ const [isRestoring, setIsRestoring] = useState(true);
1907
1996
  const updateConnectedWallets = useCallback(() => {
1908
1997
  setConnectedWallets(walletManager.getConnectedWallets());
1909
1998
  }, [walletManager]);
@@ -1935,6 +2024,22 @@ function WalletProvider({ children, walletManager: externalWalletManager }) {
1935
2024
  const signTransaction = useCallback(async (transaction) => {
1936
2025
  return walletManager.signTransaction(transaction);
1937
2026
  }, [walletManager]);
2027
+ useEffect(() => {
2028
+ const restoreConnection = async () => {
2029
+ try {
2030
+ const restoredAccount = await walletManager.restoreFromStorage();
2031
+ if (restoredAccount) {
2032
+ setAccount(restoredAccount);
2033
+ updateConnectedWallets();
2034
+ }
2035
+ } catch (error) {
2036
+ console.debug("Failed to restore wallet connection:", error);
2037
+ } finally {
2038
+ setIsRestoring(false);
2039
+ }
2040
+ };
2041
+ restoreConnection();
2042
+ }, [walletManager, updateConnectedWallets]);
1938
2043
  useEffect(() => {
1939
2044
  const handleAccountChanged = (newAccount) => {
1940
2045
  setAccount(newAccount);
@@ -1956,20 +2061,26 @@ function WalletProvider({ children, walletManager: externalWalletManager }) {
1956
2061
  walletManager.on("chainChanged", handleChainChanged);
1957
2062
  walletManager.on("disconnected", handleDisconnected);
1958
2063
  walletManager.on("primaryWalletSwitched", handlePrimaryWalletSwitched);
1959
- setAccount(walletManager.getPrimaryAccount());
1960
- updateConnectedWallets();
2064
+ if (!isRestoring) {
2065
+ const primaryAccount = walletManager.getPrimaryAccount();
2066
+ if (primaryAccount) {
2067
+ setAccount(primaryAccount);
2068
+ updateConnectedWallets();
2069
+ }
2070
+ }
1961
2071
  return () => {
1962
2072
  walletManager.off("accountChanged", handleAccountChanged);
1963
2073
  walletManager.off("chainChanged", handleChainChanged);
1964
2074
  walletManager.off("disconnected", handleDisconnected);
1965
2075
  walletManager.off("primaryWalletSwitched", handlePrimaryWalletSwitched);
1966
2076
  };
1967
- }, [walletManager, updateConnectedWallets]);
2077
+ }, [walletManager, updateConnectedWallets, isRestoring]);
1968
2078
  const value = {
1969
2079
  walletManager,
1970
2080
  account,
1971
2081
  isConnected: account !== null,
1972
2082
  connectedWallets,
2083
+ isRestoring,
1973
2084
  connect,
1974
2085
  connectAdditional,
1975
2086
  disconnect,