@enclave-hq/wallet-sdk 1.1.2 → 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.
@@ -178,7 +178,7 @@ declare class WalletManager extends TypedEventEmitter<WalletManagerEvents> {
178
178
  private setupAdapterListeners;
179
179
  private removeAdapterListeners;
180
180
  private saveToStorage;
181
- private restoreFromStorage;
181
+ restoreFromStorage(): Promise<Account | null>;
182
182
  private clearStorage;
183
183
  private getHistoryRecords;
184
184
  }
@@ -188,6 +188,7 @@ interface WalletContextValue {
188
188
  account: Account | null;
189
189
  isConnected: boolean;
190
190
  connectedWallets: ConnectedWallet[];
191
+ isRestoring: boolean;
191
192
  connect: (type: WalletType, chainId?: number) => Promise<Account>;
192
193
  connectAdditional: (type: WalletType, chainId?: number) => Promise<Account>;
193
194
  disconnect: () => Promise<void>;
@@ -178,7 +178,7 @@ declare class WalletManager extends TypedEventEmitter<WalletManagerEvents> {
178
178
  private setupAdapterListeners;
179
179
  private removeAdapterListeners;
180
180
  private saveToStorage;
181
- private restoreFromStorage;
181
+ restoreFromStorage(): Promise<Account | null>;
182
182
  private clearStorage;
183
183
  private getHistoryRecords;
184
184
  }
@@ -188,6 +188,7 @@ interface WalletContextValue {
188
188
  account: Account | null;
189
189
  isConnected: boolean;
190
190
  connectedWallets: ConnectedWallet[];
191
+ isRestoring: boolean;
191
192
  connect: (type: WalletType, chainId?: number) => Promise<Account>;
192
193
  connectAdditional: (type: WalletType, chainId?: number) => Promise<Account>;
193
194
  disconnect: () => Promise<void>;
@@ -285,7 +285,7 @@ var CHAIN_INFO = {
285
285
  "https://data-seed-prebsc-1-s3.binance.org:8545",
286
286
  "https://data-seed-prebsc-2-s3.binance.org:8545",
287
287
  "https://data-seed-prebsc-1-s1.binance.org:8545"
288
- // 原来的主节点作为最后备选
288
+ // Original main node as last fallback
289
289
  ],
290
290
  blockExplorerUrls: ["https://testnet.bscscan.com"]
291
291
  },
@@ -451,7 +451,7 @@ var MetaMaskAdapter = class extends BrowserWalletAdapter {
451
451
  };
452
452
  }
453
453
  /**
454
- * 连接钱包
454
+ * Connect wallet
455
455
  */
456
456
  async connect(chainId) {
457
457
  await this.ensureAvailable();
@@ -1414,7 +1414,7 @@ var AdapterRegistry = class {
1414
1414
  this.registerDefaultAdapters();
1415
1415
  }
1416
1416
  /**
1417
- * 注册默认适配器
1417
+ * Register default adapters
1418
1418
  */
1419
1419
  registerDefaultAdapters() {
1420
1420
  this.register("metamask" /* METAMASK */, () => new MetaMaskAdapter());
@@ -1422,13 +1422,13 @@ var AdapterRegistry = class {
1422
1422
  this.register("tronlink" /* TRONLINK */, () => new TronLinkAdapter());
1423
1423
  }
1424
1424
  /**
1425
- * 注册适配器
1425
+ * Register adapter
1426
1426
  */
1427
1427
  register(type, factory) {
1428
1428
  this.adapters.set(type, factory);
1429
1429
  }
1430
1430
  /**
1431
- * 获取适配器
1431
+ * Get adapter
1432
1432
  */
1433
1433
  getAdapter(type) {
1434
1434
  const factory = this.adapters.get(type);
@@ -1438,13 +1438,13 @@ var AdapterRegistry = class {
1438
1438
  return factory();
1439
1439
  }
1440
1440
  /**
1441
- * 判断适配器是否已注册
1441
+ * Check if adapter is registered
1442
1442
  */
1443
1443
  has(type) {
1444
1444
  return this.adapters.has(type);
1445
1445
  }
1446
1446
  /**
1447
- * 获取所有已注册的适配器类型
1447
+ * Get all registered adapter types
1448
1448
  */
1449
1449
  getRegisteredTypes() {
1450
1450
  return Array.from(this.adapters.keys());
@@ -1468,9 +1468,9 @@ var AdapterRegistry = class {
1468
1468
  var WalletManager = class extends TypedEventEmitter {
1469
1469
  constructor(config = {}) {
1470
1470
  super();
1471
- // 主钱包
1471
+ // Primary wallet
1472
1472
  this.primaryWallet = null;
1473
- // 已连接钱包池
1473
+ // Connected wallet pool
1474
1474
  this.connectedWallets = /* @__PURE__ */ new Map();
1475
1475
  this.config = {
1476
1476
  enableStorage: config.enableStorage ?? true,
@@ -1480,13 +1480,10 @@ var WalletManager = class extends TypedEventEmitter {
1480
1480
  walletConnectProjectId: config.walletConnectProjectId ?? ""
1481
1481
  };
1482
1482
  this.registry = new AdapterRegistry();
1483
- if (this.config.enableStorage) {
1484
- this.restoreFromStorage();
1485
- }
1486
1483
  }
1487
- // ===== 连接管理 =====
1484
+ // ===== Connection Management =====
1488
1485
  /**
1489
- * 连接主钱包
1486
+ * Connect primary wallet
1490
1487
  */
1491
1488
  async connect(type, chainId) {
1492
1489
  const adapter = this.registry.getAdapter(type);
@@ -1507,7 +1504,7 @@ var WalletManager = class extends TypedEventEmitter {
1507
1504
  return account;
1508
1505
  }
1509
1506
  /**
1510
- * 连接额外的钱包(不改变主钱包)
1507
+ * Connect additional wallet (without changing primary wallet)
1511
1508
  */
1512
1509
  async connectAdditional(type, chainId) {
1513
1510
  const adapter = this.registry.getAdapter(type);
@@ -1527,7 +1524,7 @@ var WalletManager = class extends TypedEventEmitter {
1527
1524
  return account;
1528
1525
  }
1529
1526
  /**
1530
- * 使用私钥连接(仅用于开发/测试)
1527
+ * Connect with private key (for development/testing only)
1531
1528
  */
1532
1529
  async connectWithPrivateKey(privateKey, chainId) {
1533
1530
  const adapter = new EVMPrivateKeyAdapter();
@@ -1539,7 +1536,7 @@ var WalletManager = class extends TypedEventEmitter {
1539
1536
  return account;
1540
1537
  }
1541
1538
  /**
1542
- * 断开主钱包
1539
+ * Disconnect primary wallet
1543
1540
  */
1544
1541
  async disconnect() {
1545
1542
  if (!this.primaryWallet) {
@@ -1556,7 +1553,7 @@ var WalletManager = class extends TypedEventEmitter {
1556
1553
  this.emit("disconnected");
1557
1554
  }
1558
1555
  /**
1559
- * 断开所有钱包
1556
+ * Disconnect all wallets
1560
1557
  */
1561
1558
  async disconnectAll() {
1562
1559
  const wallets = Array.from(this.connectedWallets.values());
@@ -1571,9 +1568,9 @@ var WalletManager = class extends TypedEventEmitter {
1571
1568
  }
1572
1569
  this.emit("disconnected");
1573
1570
  }
1574
- // ===== 主钱包管理 =====
1571
+ // ===== Primary Wallet Management =====
1575
1572
  /**
1576
- * 切换主钱包
1573
+ * Switch primary wallet
1577
1574
  */
1578
1575
  async switchPrimaryWallet(chainType) {
1579
1576
  const adapter = this.connectedWallets.get(chainType);
@@ -1593,13 +1590,13 @@ var WalletManager = class extends TypedEventEmitter {
1593
1590
  return adapter.currentAccount;
1594
1591
  }
1595
1592
  /**
1596
- * 获取主钱包账户
1593
+ * Get primary wallet account
1597
1594
  */
1598
1595
  getPrimaryAccount() {
1599
1596
  return this.primaryWallet?.currentAccount || null;
1600
1597
  }
1601
1598
  /**
1602
- * 获取所有已连接的钱包
1599
+ * Get all connected wallets
1603
1600
  */
1604
1601
  getConnectedWallets() {
1605
1602
  return Array.from(this.connectedWallets.values()).map((adapter) => ({
@@ -1612,14 +1609,14 @@ var WalletManager = class extends TypedEventEmitter {
1612
1609
  }));
1613
1610
  }
1614
1611
  /**
1615
- * 根据链类型获取钱包
1612
+ * Get wallet by chain type
1616
1613
  */
1617
1614
  getWalletByChainType(chainType) {
1618
1615
  return this.connectedWallets.get(chainType) || null;
1619
1616
  }
1620
- // ===== 签名 =====
1617
+ // ===== Signing =====
1621
1618
  /**
1622
- * 使用主钱包签名
1619
+ * Sign message with primary wallet
1623
1620
  */
1624
1621
  async signMessage(message) {
1625
1622
  if (!this.primaryWallet) {
@@ -1628,7 +1625,7 @@ var WalletManager = class extends TypedEventEmitter {
1628
1625
  return this.primaryWallet.signMessage(message);
1629
1626
  }
1630
1627
  /**
1631
- * 使用指定链类型的钱包签名
1628
+ * Sign message with wallet of specified chain type
1632
1629
  */
1633
1630
  async signMessageWithChainType(message, chainType) {
1634
1631
  if (!chainType) {
@@ -1641,7 +1638,7 @@ var WalletManager = class extends TypedEventEmitter {
1641
1638
  return adapter.signMessage(message);
1642
1639
  }
1643
1640
  /**
1644
- * 签名 TypedData(仅 EVM
1641
+ * Sign TypedData (EVM only)
1645
1642
  */
1646
1643
  async signTypedData(typedData, chainType) {
1647
1644
  const adapter = chainType ? this.connectedWallets.get(chainType) : this.primaryWallet;
@@ -1654,7 +1651,7 @@ var WalletManager = class extends TypedEventEmitter {
1654
1651
  return adapter.signTypedData(typedData);
1655
1652
  }
1656
1653
  /**
1657
- * 签名交易(使用主钱包)
1654
+ * Sign transaction (with primary wallet)
1658
1655
  */
1659
1656
  async signTransaction(transaction) {
1660
1657
  if (!this.primaryWallet) {
@@ -1666,7 +1663,7 @@ var WalletManager = class extends TypedEventEmitter {
1666
1663
  return this.primaryWallet.signTransaction(transaction);
1667
1664
  }
1668
1665
  /**
1669
- * 使用指定链类型的钱包签名交易
1666
+ * Sign transaction with wallet of specified chain type
1670
1667
  */
1671
1668
  async signTransactionWithChainType(transaction, chainType) {
1672
1669
  if (!chainType) {
@@ -1681,9 +1678,9 @@ var WalletManager = class extends TypedEventEmitter {
1681
1678
  }
1682
1679
  return adapter.signTransaction(transaction);
1683
1680
  }
1684
- // ===== 链切换 =====
1681
+ // ===== Chain Switching =====
1685
1682
  /**
1686
- * 请求切换链(仅 EVM
1683
+ * Request chain switch (EVM only)
1687
1684
  */
1688
1685
  async requestSwitchChain(chainId, options) {
1689
1686
  if (!this.primaryWallet) {
@@ -1704,9 +1701,9 @@ var WalletManager = class extends TypedEventEmitter {
1704
1701
  throw error;
1705
1702
  }
1706
1703
  }
1707
- // ===== 合约调用 =====
1704
+ // ===== Contract Calls =====
1708
1705
  /**
1709
- * 读取合约
1706
+ * Read contract
1710
1707
  */
1711
1708
  async readContract(address, abi, functionName, args, chainType) {
1712
1709
  const adapter = chainType ? this.connectedWallets.get(chainType) : this.primaryWallet;
@@ -1719,7 +1716,7 @@ var WalletManager = class extends TypedEventEmitter {
1719
1716
  return adapter.readContract({ address, abi, functionName, args });
1720
1717
  }
1721
1718
  /**
1722
- * 写入合约
1719
+ * Write contract
1723
1720
  */
1724
1721
  async writeContract(address, abi, functionName, args, options, chainType) {
1725
1722
  const adapter = chainType ? this.connectedWallets.get(chainType) : this.primaryWallet;
@@ -1738,7 +1735,7 @@ var WalletManager = class extends TypedEventEmitter {
1738
1735
  });
1739
1736
  }
1740
1737
  /**
1741
- * 估算 Gas
1738
+ * Estimate gas
1742
1739
  */
1743
1740
  async estimateGas(address, abi, functionName, args, chainType) {
1744
1741
  const adapter = chainType ? this.connectedWallets.get(chainType) : this.primaryWallet;
@@ -1751,7 +1748,7 @@ var WalletManager = class extends TypedEventEmitter {
1751
1748
  return adapter.estimateGas({ address, abi, functionName, args });
1752
1749
  }
1753
1750
  /**
1754
- * 等待交易确认
1751
+ * Wait for transaction confirmation
1755
1752
  */
1756
1753
  async waitForTransaction(txHash, confirmations, chainType) {
1757
1754
  const adapter = chainType ? this.connectedWallets.get(chainType) : this.primaryWallet;
@@ -1763,9 +1760,9 @@ var WalletManager = class extends TypedEventEmitter {
1763
1760
  }
1764
1761
  return adapter.waitForTransaction(txHash, confirmations);
1765
1762
  }
1766
- // ===== Provider 访问 =====
1763
+ // ===== Provider Access =====
1767
1764
  /**
1768
- * 获取主钱包 Provider
1765
+ * Get primary wallet Provider
1769
1766
  */
1770
1767
  getProvider() {
1771
1768
  if (!this.primaryWallet) {
@@ -1774,7 +1771,7 @@ var WalletManager = class extends TypedEventEmitter {
1774
1771
  return this.primaryWallet.getProvider();
1775
1772
  }
1776
1773
  /**
1777
- * 获取指定链类型的 Provider
1774
+ * Get Provider by chain type
1778
1775
  */
1779
1776
  getProviderByChainType(chainType) {
1780
1777
  const adapter = this.connectedWallets.get(chainType);
@@ -1783,21 +1780,21 @@ var WalletManager = class extends TypedEventEmitter {
1783
1780
  }
1784
1781
  return adapter.getProvider();
1785
1782
  }
1786
- // ===== 私有方法 =====
1783
+ // ===== Private Methods =====
1787
1784
  /**
1788
- * 设置主钱包
1785
+ * Set primary wallet
1789
1786
  */
1790
1787
  setPrimaryWallet(adapter) {
1791
1788
  this.primaryWallet = adapter;
1792
1789
  }
1793
1790
  /**
1794
- * 判断钱包是否支持链切换
1791
+ * Check if wallet supports chain switching
1795
1792
  */
1796
1793
  canSwitchChain(adapter) {
1797
1794
  return !!adapter.switchChain;
1798
1795
  }
1799
1796
  /**
1800
- * 设置适配器事件监听
1797
+ * Setup adapter event listeners
1801
1798
  */
1802
1799
  setupAdapterListeners(adapter, isPrimary) {
1803
1800
  adapter.on("accountChanged", (account) => {
@@ -1838,15 +1835,15 @@ var WalletManager = class extends TypedEventEmitter {
1838
1835
  });
1839
1836
  }
1840
1837
  /**
1841
- * 移除适配器事件监听
1838
+ * Remove adapter event listeners
1842
1839
  */
1843
1840
  removeAdapterListeners(adapter) {
1844
1841
  if (!adapter) return;
1845
1842
  adapter.removeAllListeners();
1846
1843
  }
1847
- // ===== 存储 =====
1844
+ // ===== Storage =====
1848
1845
  /**
1849
- * 保存到存储
1846
+ * Save to storage
1850
1847
  */
1851
1848
  saveToStorage() {
1852
1849
  if (typeof window === "undefined" || !this.config.enableStorage) {
@@ -1854,6 +1851,8 @@ var WalletManager = class extends TypedEventEmitter {
1854
1851
  }
1855
1852
  const data = {
1856
1853
  current: this.primaryWallet?.currentAccount?.universalAddress || null,
1854
+ primaryWalletType: this.primaryWallet?.type,
1855
+ primaryChainId: this.primaryWallet?.currentAccount?.chainId,
1857
1856
  history: this.getHistoryRecords()
1858
1857
  };
1859
1858
  try {
@@ -1866,12 +1865,101 @@ var WalletManager = class extends TypedEventEmitter {
1866
1865
  }
1867
1866
  }
1868
1867
  /**
1869
- * 从存储恢复
1868
+ * Restore from storage
1869
+ * Returns a Promise that can be used for auto-reconnection
1870
1870
  */
1871
- restoreFromStorage() {
1871
+ async restoreFromStorage() {
1872
+ if (typeof window === "undefined" || !this.config.enableStorage) {
1873
+ return null;
1874
+ }
1875
+ try {
1876
+ const stored = localStorage.getItem(`${this.config.storagePrefix}data`);
1877
+ if (!stored) {
1878
+ console.debug("[WalletManager] No stored wallet data found");
1879
+ return null;
1880
+ }
1881
+ const data = JSON.parse(stored);
1882
+ console.debug("[WalletManager] Restoring from storage:", data);
1883
+ if (!data.primaryWalletType || !data.current) {
1884
+ console.debug("[WalletManager] Missing primary wallet info in storage");
1885
+ return null;
1886
+ }
1887
+ const adapter = this.registry.getAdapter(data.primaryWalletType);
1888
+ if (!adapter) {
1889
+ console.debug("[WalletManager] Adapter not found for type:", data.primaryWalletType);
1890
+ return null;
1891
+ }
1892
+ const isAvailable = await adapter.isAvailable();
1893
+ if (!isAvailable) {
1894
+ console.debug("[WalletManager] Wallet not available:", data.primaryWalletType);
1895
+ return null;
1896
+ }
1897
+ console.debug("[WalletManager] Wallet is available, attempting restoration");
1898
+ if (adapter.chainType === ChainType.EVM && data.primaryWalletType === "metamask" /* METAMASK */) {
1899
+ try {
1900
+ const provider = typeof window !== "undefined" ? window.ethereum : null;
1901
+ if (provider) {
1902
+ const accounts = await provider.request({
1903
+ method: "eth_accounts"
1904
+ });
1905
+ console.debug("[WalletManager] Checking authorized accounts:", accounts);
1906
+ if (accounts && accounts.length > 0) {
1907
+ const savedAddress = data.current.split(":")[1];
1908
+ const currentAddress = accounts[0].toLowerCase();
1909
+ console.debug("[WalletManager] Comparing addresses - saved:", savedAddress, "current:", currentAddress);
1910
+ if (currentAddress === savedAddress.toLowerCase()) {
1911
+ console.debug("[WalletManager] Address matches, attempting connect (should be silent if already authorized)");
1912
+ try {
1913
+ const account2 = await adapter.connect(data.primaryChainId);
1914
+ this.setPrimaryWallet(adapter);
1915
+ this.connectedWallets.set(adapter.chainType, adapter);
1916
+ this.setupAdapterListeners(adapter, true);
1917
+ this.emit("accountChanged", account2);
1918
+ console.debug("[WalletManager] Connect successful");
1919
+ return account2;
1920
+ } catch (connectError) {
1921
+ console.debug("[WalletManager] Connect failed (might be user rejection):", connectError?.message);
1922
+ return null;
1923
+ }
1924
+ } else {
1925
+ console.debug("[WalletManager] Address mismatch, will try normal connect");
1926
+ }
1927
+ } else {
1928
+ console.debug("[WalletManager] No authorized accounts found");
1929
+ }
1930
+ }
1931
+ } catch (silentError) {
1932
+ console.debug("Silent connection failed, trying normal connection:", silentError);
1933
+ }
1934
+ }
1935
+ if (adapter.chainType === ChainType.TRON && data.primaryWalletType === "tronlink" /* TRONLINK */) {
1936
+ try {
1937
+ const tronWeb = adapter.getTronWeb?.();
1938
+ if (tronWeb && tronWeb.defaultAddress?.base58) {
1939
+ const account2 = await adapter.connect(data.primaryChainId);
1940
+ this.setPrimaryWallet(adapter);
1941
+ this.connectedWallets.set(adapter.chainType, adapter);
1942
+ this.setupAdapterListeners(adapter, true);
1943
+ this.emit("accountChanged", account2);
1944
+ return account2;
1945
+ }
1946
+ } catch (silentError) {
1947
+ console.debug("Silent TronLink connection failed:", silentError);
1948
+ }
1949
+ }
1950
+ const account = await adapter.connect(data.primaryChainId);
1951
+ this.setPrimaryWallet(adapter);
1952
+ this.connectedWallets.set(adapter.chainType, adapter);
1953
+ this.setupAdapterListeners(adapter, true);
1954
+ this.emit("accountChanged", account);
1955
+ return account;
1956
+ } catch (error) {
1957
+ console.debug("Failed to restore wallet from storage:", error);
1958
+ return null;
1959
+ }
1872
1960
  }
1873
1961
  /**
1874
- * 清除存储
1962
+ * Clear storage
1875
1963
  */
1876
1964
  clearStorage() {
1877
1965
  if (typeof window === "undefined") {
@@ -1884,7 +1972,7 @@ var WalletManager = class extends TypedEventEmitter {
1884
1972
  }
1885
1973
  }
1886
1974
  /**
1887
- * 获取历史记录
1975
+ * Get history records
1888
1976
  */
1889
1977
  getHistoryRecords() {
1890
1978
  const records = [];
@@ -1911,6 +1999,7 @@ function WalletProvider({ children, walletManager: externalWalletManager }) {
1911
1999
  const [walletManager] = React.useState(() => externalWalletManager || new WalletManager());
1912
2000
  const [account, setAccount] = React.useState(null);
1913
2001
  const [connectedWallets, setConnectedWallets] = React.useState([]);
2002
+ const [isRestoring, setIsRestoring] = React.useState(true);
1914
2003
  const updateConnectedWallets = React.useCallback(() => {
1915
2004
  setConnectedWallets(walletManager.getConnectedWallets());
1916
2005
  }, [walletManager]);
@@ -1942,6 +2031,22 @@ function WalletProvider({ children, walletManager: externalWalletManager }) {
1942
2031
  const signTransaction = React.useCallback(async (transaction) => {
1943
2032
  return walletManager.signTransaction(transaction);
1944
2033
  }, [walletManager]);
2034
+ React.useEffect(() => {
2035
+ const restoreConnection = async () => {
2036
+ try {
2037
+ const restoredAccount = await walletManager.restoreFromStorage();
2038
+ if (restoredAccount) {
2039
+ setAccount(restoredAccount);
2040
+ updateConnectedWallets();
2041
+ }
2042
+ } catch (error) {
2043
+ console.debug("Failed to restore wallet connection:", error);
2044
+ } finally {
2045
+ setIsRestoring(false);
2046
+ }
2047
+ };
2048
+ restoreConnection();
2049
+ }, [walletManager, updateConnectedWallets]);
1945
2050
  React.useEffect(() => {
1946
2051
  const handleAccountChanged = (newAccount) => {
1947
2052
  setAccount(newAccount);
@@ -1963,20 +2068,26 @@ function WalletProvider({ children, walletManager: externalWalletManager }) {
1963
2068
  walletManager.on("chainChanged", handleChainChanged);
1964
2069
  walletManager.on("disconnected", handleDisconnected);
1965
2070
  walletManager.on("primaryWalletSwitched", handlePrimaryWalletSwitched);
1966
- setAccount(walletManager.getPrimaryAccount());
1967
- updateConnectedWallets();
2071
+ if (!isRestoring) {
2072
+ const primaryAccount = walletManager.getPrimaryAccount();
2073
+ if (primaryAccount) {
2074
+ setAccount(primaryAccount);
2075
+ updateConnectedWallets();
2076
+ }
2077
+ }
1968
2078
  return () => {
1969
2079
  walletManager.off("accountChanged", handleAccountChanged);
1970
2080
  walletManager.off("chainChanged", handleChainChanged);
1971
2081
  walletManager.off("disconnected", handleDisconnected);
1972
2082
  walletManager.off("primaryWalletSwitched", handlePrimaryWalletSwitched);
1973
2083
  };
1974
- }, [walletManager, updateConnectedWallets]);
2084
+ }, [walletManager, updateConnectedWallets, isRestoring]);
1975
2085
  const value = {
1976
2086
  walletManager,
1977
2087
  account,
1978
2088
  isConnected: account !== null,
1979
2089
  connectedWallets,
2090
+ isRestoring,
1980
2091
  connect,
1981
2092
  connectAdditional,
1982
2093
  disconnect,