@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.
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +121 -33
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +121 -33
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.d.mts +2 -1
- package/dist/react/index.d.ts +2 -1
- package/dist/react/index.js +147 -36
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +147 -36
- package/dist/react/index.mjs.map +1 -1
- package/package.json +1 -2
package/dist/react/index.d.mts
CHANGED
|
@@ -178,7 +178,7 @@ declare class WalletManager extends TypedEventEmitter<WalletManagerEvents> {
|
|
|
178
178
|
private setupAdapterListeners;
|
|
179
179
|
private removeAdapterListeners;
|
|
180
180
|
private saveToStorage;
|
|
181
|
-
|
|
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>;
|
package/dist/react/index.d.ts
CHANGED
|
@@ -178,7 +178,7 @@ declare class WalletManager extends TypedEventEmitter<WalletManagerEvents> {
|
|
|
178
178
|
private setupAdapterListeners;
|
|
179
179
|
private removeAdapterListeners;
|
|
180
180
|
private saveToStorage;
|
|
181
|
-
|
|
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>;
|
package/dist/react/index.js
CHANGED
|
@@ -1480,9 +1480,6 @@ 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
|
/**
|
|
@@ -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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
|
|
1967
|
-
|
|
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,
|