@reown/appkit 1.6.7-basic-test.8.0 → 1.6.7
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/esm/exports/constants.js +1 -1
- package/dist/esm/exports/constants.js.map +1 -1
- package/dist/esm/exports/index.js +3 -1
- package/dist/esm/exports/index.js.map +1 -1
- package/dist/esm/exports/react.js +3 -1
- package/dist/esm/exports/react.js.map +1 -1
- package/dist/esm/exports/vue.js +3 -1
- package/dist/esm/exports/vue.js.map +1 -1
- package/dist/esm/package.json +2 -7
- package/dist/esm/src/adapters/ChainAdapterBlueprint.js +1 -0
- package/dist/esm/src/adapters/ChainAdapterBlueprint.js.map +1 -1
- package/dist/esm/src/client.js +8 -1
- package/dist/esm/src/client.js.map +1 -1
- package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/exports/constants.d.ts +1 -1
- package/dist/types/exports/index.d.ts +3 -2
- package/dist/types/exports/react.d.ts +3 -2
- package/dist/types/exports/vue.d.ts +3 -2
- package/dist/types/src/adapters/ChainAdapterBlueprint.d.ts +3 -3
- package/dist/types/src/library/react/index.d.ts +1 -1
- package/dist/types/src/library/vue/index.d.ts +1 -1
- package/dist/types/src/utils/TypesUtil.d.ts +0 -5
- package/package.json +10 -15
- package/dist/esm/exports/basic.js +0 -12
- package/dist/esm/exports/basic.js.map +0 -1
- package/dist/esm/src/client/appkit-basic.js +0 -29
- package/dist/esm/src/client/appkit-basic.js.map +0 -1
- package/dist/esm/src/client/appkit.js +0 -320
- package/dist/esm/src/client/appkit.js.map +0 -1
- package/dist/esm/src/client/core.js +0 -1334
- package/dist/esm/src/client/core.js.map +0 -1
- package/dist/esm/tests/appkit.test.js +0 -1482
- package/dist/esm/tests/appkit.test.js.map +0 -1
- package/dist/esm/tests/client/adapter-management.test.js +0 -83
- package/dist/esm/tests/client/adapter-management.test.js.map +0 -1
- package/dist/esm/tests/client/appkit-basic.test.js +0 -44
- package/dist/esm/tests/client/appkit-basic.test.js.map +0 -1
- package/dist/esm/tests/client/balance.test.js +0 -67
- package/dist/esm/tests/client/balance.test.js.map +0 -1
- package/dist/esm/tests/client/connection.test.js +0 -52
- package/dist/esm/tests/client/connection.test.js.map +0 -1
- package/dist/esm/tests/client/initialization.test.js +0 -114
- package/dist/esm/tests/client/initialization.test.js.map +0 -1
- package/dist/esm/tests/client/listeners.test.js +0 -35
- package/dist/esm/tests/client/listeners.test.js.map +0 -1
- package/dist/esm/tests/client/public-methods.test.js +0 -700
- package/dist/esm/tests/client/public-methods.test.js.map +0 -1
- package/dist/esm/tests/client/universal-adapter.test.js +0 -44
- package/dist/esm/tests/client/universal-adapter.test.js.map +0 -1
- package/dist/esm/tests/client/walletconnect-events.test.js +0 -80
- package/dist/esm/tests/client/walletconnect-events.test.js.map +0 -1
- package/dist/esm/tests/connectors/WalletConnectConnector.test.js +0 -63
- package/dist/esm/tests/connectors/WalletConnectConnector.test.js.map +0 -1
- package/dist/esm/tests/mocks/Account.js +0 -13
- package/dist/esm/tests/mocks/Account.js.map +0 -1
- package/dist/esm/tests/mocks/Adapter.js +0 -95
- package/dist/esm/tests/mocks/Adapter.js.map +0 -1
- package/dist/esm/tests/mocks/AppKit.js +0 -24
- package/dist/esm/tests/mocks/AppKit.js.map +0 -1
- package/dist/esm/tests/mocks/Networks.js +0 -5
- package/dist/esm/tests/mocks/Networks.js.map +0 -1
- package/dist/esm/tests/mocks/Options.js +0 -17
- package/dist/esm/tests/mocks/Options.js.map +0 -1
- package/dist/esm/tests/mocks/Providers.js +0 -46
- package/dist/esm/tests/mocks/Providers.js.map +0 -1
- package/dist/esm/tests/mocks/UniversalProvider.js +0 -139
- package/dist/esm/tests/mocks/UniversalProvider.js.map +0 -1
- package/dist/esm/tests/siwe.test.js +0 -270
- package/dist/esm/tests/siwe.test.js.map +0 -1
- package/dist/esm/tests/test-utils.js +0 -32
- package/dist/esm/tests/test-utils.js.map +0 -1
- package/dist/esm/tests/universal-adapter.test.js +0 -246
- package/dist/esm/tests/universal-adapter.test.js.map +0 -1
- package/dist/esm/tests/utils/HelpersUtil.test.js +0 -218
- package/dist/esm/tests/utils/HelpersUtil.test.js.map +0 -1
- package/dist/esm/tsconfig.tsbuildinfo +0 -1
- package/dist/types/exports/basic.d.ts +0 -8
- package/dist/types/src/client/appkit-basic.d.ts +0 -23
- package/dist/types/src/client/appkit.d.ts +0 -22
- package/dist/types/src/client/core.d.ts +0 -208
- package/dist/types/tests/appkit.test.d.ts +0 -1
- package/dist/types/tests/client/adapter-management.test.d.ts +0 -1
- package/dist/types/tests/client/appkit-basic.test.d.ts +0 -1
- package/dist/types/tests/client/balance.test.d.ts +0 -1
- package/dist/types/tests/client/connection.test.d.ts +0 -1
- package/dist/types/tests/client/initialization.test.d.ts +0 -1
- package/dist/types/tests/client/listeners.test.d.ts +0 -1
- package/dist/types/tests/client/public-methods.test.d.ts +0 -1
- package/dist/types/tests/client/universal-adapter.test.d.ts +0 -1
- package/dist/types/tests/client/walletconnect-events.test.d.ts +0 -1
- package/dist/types/tests/connectors/WalletConnectConnector.test.d.ts +0 -1
- package/dist/types/tests/mocks/Account.d.ts +0 -12
- package/dist/types/tests/mocks/Adapter.d.ts +0 -5
- package/dist/types/tests/mocks/AppKit.d.ts +0 -3
- package/dist/types/tests/mocks/Networks.d.ts +0 -3
- package/dist/types/tests/mocks/Options.d.ts +0 -6
- package/dist/types/tests/mocks/UniversalProvider.d.ts +0 -3
- package/dist/types/tests/siwe.test.d.ts +0 -1
- package/dist/types/tests/test-utils.d.ts +0 -5
- package/dist/types/tests/universal-adapter.test.d.ts +0 -1
- package/dist/types/tests/utils/HelpersUtil.test.d.ts +0 -1
|
@@ -1,1334 +0,0 @@
|
|
|
1
|
-
import UniversalProvider from '@walletconnect/universal-provider';
|
|
2
|
-
import { ConstantsUtil, NetworkUtil, ParseUtil } from '@reown/appkit-common';
|
|
3
|
-
import { AccountController, AlertController, AssetUtil, BlockchainApiController, ChainController, ConnectionController, ConnectorController, ConstantsUtil as CoreConstantsUtil, CoreHelperUtil, EnsController, EventsController, ModalController, OptionsController, PublicStateController, RouterController, SnackController, StorageUtil, ThemeController } from '@reown/appkit-core';
|
|
4
|
-
import { WalletUtil } from '@reown/appkit-scaffold-ui/utils';
|
|
5
|
-
import { setColorTheme, setThemeVariables } from '@reown/appkit-ui';
|
|
6
|
-
import { CaipNetworksUtil, ErrorUtil, HelpersUtil, LoggerUtil, ConstantsUtil as UtilConstantsUtil } from '@reown/appkit-utils';
|
|
7
|
-
import { ProviderUtil } from '../store/ProviderUtil.js';
|
|
8
|
-
import { UniversalAdapter } from '../universal-adapter/client.js';
|
|
9
|
-
import { WcHelpersUtil } from '../utils/index.js';
|
|
10
|
-
export class AppKitCore {
|
|
11
|
-
constructor(options) {
|
|
12
|
-
this.chainNamespaces = [];
|
|
13
|
-
this.reportedAlertErrors = {};
|
|
14
|
-
// -- Public Internal ---------------------------------------------------
|
|
15
|
-
this.getCaipNetwork = (chainNamespace) => {
|
|
16
|
-
if (chainNamespace) {
|
|
17
|
-
return ChainController.getRequestedCaipNetworks(chainNamespace).filter(c => c.chainNamespace === chainNamespace)?.[0];
|
|
18
|
-
}
|
|
19
|
-
return ChainController.state.activeCaipNetwork || this.defaultCaipNetwork;
|
|
20
|
-
};
|
|
21
|
-
this.getCaipNetworkId = () => {
|
|
22
|
-
const network = this.getCaipNetwork();
|
|
23
|
-
if (network) {
|
|
24
|
-
return network.id;
|
|
25
|
-
}
|
|
26
|
-
return undefined;
|
|
27
|
-
};
|
|
28
|
-
this.getCaipNetworks = (namespace) => ChainController.getRequestedCaipNetworks(namespace);
|
|
29
|
-
this.getActiveChainNamespace = () => ChainController.state.activeChain;
|
|
30
|
-
this.setRequestedCaipNetworks = (requestedCaipNetworks, chain) => {
|
|
31
|
-
ChainController.setRequestedCaipNetworks(requestedCaipNetworks, chain);
|
|
32
|
-
};
|
|
33
|
-
this.getApprovedCaipNetworkIds = () => ChainController.getAllApprovedCaipNetworkIds();
|
|
34
|
-
this.getCaipAddress = (chainNamespace) => {
|
|
35
|
-
if (ChainController.state.activeChain === chainNamespace || !chainNamespace) {
|
|
36
|
-
return ChainController.state.activeCaipAddress;
|
|
37
|
-
}
|
|
38
|
-
return ChainController.getAccountProp('caipAddress', chainNamespace);
|
|
39
|
-
};
|
|
40
|
-
this.setClientId = clientId => {
|
|
41
|
-
BlockchainApiController.setClientId(clientId);
|
|
42
|
-
};
|
|
43
|
-
this.getProvider = (namespace) => ProviderUtil.getProvider(namespace);
|
|
44
|
-
this.getProviderType = (namespace) => ProviderUtil.state.providerIds[namespace];
|
|
45
|
-
this.getPreferredAccountType = () => AccountController.state.preferredAccountType;
|
|
46
|
-
this.setCaipAddress = (caipAddress, chain) => {
|
|
47
|
-
AccountController.setCaipAddress(caipAddress, chain);
|
|
48
|
-
};
|
|
49
|
-
this.setBalance = (balance, balanceSymbol, chain) => {
|
|
50
|
-
AccountController.setBalance(balance, balanceSymbol, chain);
|
|
51
|
-
};
|
|
52
|
-
this.setProfileName = (profileName, chain) => {
|
|
53
|
-
AccountController.setProfileName(profileName, chain);
|
|
54
|
-
};
|
|
55
|
-
this.setProfileImage = (profileImage, chain) => {
|
|
56
|
-
AccountController.setProfileImage(profileImage, chain);
|
|
57
|
-
};
|
|
58
|
-
this.setUser = user => {
|
|
59
|
-
AccountController.setUser(user);
|
|
60
|
-
};
|
|
61
|
-
this.resetAccount = (chain) => {
|
|
62
|
-
AccountController.resetAccount(chain);
|
|
63
|
-
};
|
|
64
|
-
this.setCaipNetwork = caipNetwork => {
|
|
65
|
-
ChainController.setActiveCaipNetwork(caipNetwork);
|
|
66
|
-
};
|
|
67
|
-
this.setAllAccounts = (addresses, chain) => {
|
|
68
|
-
AccountController.setAllAccounts(addresses, chain);
|
|
69
|
-
OptionsController.setHasMultipleAddresses(addresses?.length > 1);
|
|
70
|
-
};
|
|
71
|
-
this.setStatus = (status, chain) => {
|
|
72
|
-
StorageUtil.setConnectionStatus(status);
|
|
73
|
-
AccountController.setStatus(status, chain);
|
|
74
|
-
};
|
|
75
|
-
this.getAddressByChainNamespace = (chainNamespace) => ChainController.getAccountProp('address', chainNamespace);
|
|
76
|
-
this.setConnectors = connectors => {
|
|
77
|
-
const allConnectors = [...ConnectorController.getConnectors(), ...connectors];
|
|
78
|
-
ConnectorController.setConnectors(allConnectors);
|
|
79
|
-
};
|
|
80
|
-
this.fetchIdentity = request => BlockchainApiController.fetchIdentity(request);
|
|
81
|
-
this.getReownName = address => EnsController.getNamesForAddress(address);
|
|
82
|
-
this.getConnectors = () => ConnectorController.getConnectors();
|
|
83
|
-
this.getConnectorImage = connector => AssetUtil.getConnectorImage(connector);
|
|
84
|
-
this.setConnectedWalletInfo = (connectedWalletInfo, chain) => {
|
|
85
|
-
AccountController.setConnectedWalletInfo(connectedWalletInfo, chain);
|
|
86
|
-
};
|
|
87
|
-
this.getIsConnectedState = () => Boolean(ChainController.state.activeCaipAddress);
|
|
88
|
-
this.addAddressLabel = (address, label, chain) => {
|
|
89
|
-
AccountController.addAddressLabel(address, label, chain);
|
|
90
|
-
};
|
|
91
|
-
this.removeAddressLabel = (address, chain) => {
|
|
92
|
-
AccountController.removeAddressLabel(address, chain);
|
|
93
|
-
};
|
|
94
|
-
this.getAddress = (chainNamespace) => {
|
|
95
|
-
if (ChainController.state.activeChain === chainNamespace || !chainNamespace) {
|
|
96
|
-
return AccountController.state.address;
|
|
97
|
-
}
|
|
98
|
-
return ChainController.getAccountProp('address', chainNamespace);
|
|
99
|
-
};
|
|
100
|
-
this.setApprovedCaipNetworksData = namespace => ChainController.setApprovedCaipNetworksData(namespace);
|
|
101
|
-
this.resetNetwork = (namespace) => {
|
|
102
|
-
ChainController.resetNetwork(namespace);
|
|
103
|
-
};
|
|
104
|
-
this.addConnector = connector => {
|
|
105
|
-
ConnectorController.addConnector(connector);
|
|
106
|
-
};
|
|
107
|
-
this.resetWcConnection = () => {
|
|
108
|
-
ConnectionController.resetWcConnection();
|
|
109
|
-
};
|
|
110
|
-
this.setAddressExplorerUrl = (addressExplorerUrl, chain) => {
|
|
111
|
-
AccountController.setAddressExplorerUrl(addressExplorerUrl, chain);
|
|
112
|
-
};
|
|
113
|
-
this.setSmartAccountDeployed = (isDeployed, chain) => {
|
|
114
|
-
AccountController.setSmartAccountDeployed(isDeployed, chain);
|
|
115
|
-
};
|
|
116
|
-
this.setSmartAccountEnabledNetworks = (smartAccountEnabledNetworks, chain) => {
|
|
117
|
-
ChainController.setSmartAccountEnabledNetworks(smartAccountEnabledNetworks, chain);
|
|
118
|
-
};
|
|
119
|
-
this.setPreferredAccountType = (preferredAccountType, chain) => {
|
|
120
|
-
AccountController.setPreferredAccountType(preferredAccountType, chain);
|
|
121
|
-
};
|
|
122
|
-
this.setEIP6963Enabled = enabled => {
|
|
123
|
-
OptionsController.setEIP6963Enabled(enabled);
|
|
124
|
-
};
|
|
125
|
-
this.handleUnsafeRPCRequest = () => {
|
|
126
|
-
if (this.isOpen()) {
|
|
127
|
-
// If we are on the modal but there is no transaction stack, close the modal
|
|
128
|
-
if (this.isTransactionStackEmpty()) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
// Check if we need to replace or redirect
|
|
132
|
-
this.redirect('ApproveTransaction');
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
// If called from outside the modal, open ApproveTransaction
|
|
136
|
-
this.open({ view: 'ApproveTransaction' });
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
this.options = options;
|
|
140
|
-
this.version = options.sdkVersion;
|
|
141
|
-
this.caipNetworks = this.extendCaipNetworks(options);
|
|
142
|
-
this.chainNamespaces = [
|
|
143
|
-
...new Set(this.caipNetworks?.map(caipNetwork => caipNetwork.chainNamespace))
|
|
144
|
-
];
|
|
145
|
-
this.defaultCaipNetwork = this.extendDefaultCaipNetwork(options);
|
|
146
|
-
this.chainAdapters = this.createAdapters(options.adapters);
|
|
147
|
-
this.initialize(options);
|
|
148
|
-
this.sendInitializeEvent(options);
|
|
149
|
-
}
|
|
150
|
-
async initialize(options) {
|
|
151
|
-
this.initControllers(options);
|
|
152
|
-
await this.initChainAdapters();
|
|
153
|
-
await this.injectModalUi();
|
|
154
|
-
await this.syncExistingConnection();
|
|
155
|
-
PublicStateController.set({ initialized: true });
|
|
156
|
-
}
|
|
157
|
-
sendInitializeEvent(options) {
|
|
158
|
-
const { ...optionsCopy } = options;
|
|
159
|
-
delete optionsCopy.adapters;
|
|
160
|
-
EventsController.sendEvent({
|
|
161
|
-
type: 'track',
|
|
162
|
-
event: 'INITIALIZE',
|
|
163
|
-
properties: {
|
|
164
|
-
...optionsCopy,
|
|
165
|
-
networks: options.networks.map(n => n.id),
|
|
166
|
-
siweConfig: {
|
|
167
|
-
options: options.siweConfig?.options || {}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
// -- Controllers initialization ---------------------------------------------------
|
|
173
|
-
initControllers(options) {
|
|
174
|
-
this.initializeOptionsController(options);
|
|
175
|
-
this.initializeChainController(options);
|
|
176
|
-
this.initializeThemeController(options);
|
|
177
|
-
this.initializeConnectionController(options);
|
|
178
|
-
}
|
|
179
|
-
initializeThemeController(options) {
|
|
180
|
-
if (options.themeMode) {
|
|
181
|
-
ThemeController.setThemeMode(options.themeMode);
|
|
182
|
-
}
|
|
183
|
-
if (options.themeVariables) {
|
|
184
|
-
ThemeController.setThemeVariables(options.themeVariables);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
initializeChainController(options) {
|
|
188
|
-
if (!this.connectionControllerClient || !this.networkControllerClient) {
|
|
189
|
-
throw new Error('ConnectionControllerClient and NetworkControllerClient must be set');
|
|
190
|
-
}
|
|
191
|
-
ChainController.initialize(options.adapters ?? [], this.caipNetworks, {
|
|
192
|
-
connectionControllerClient: this.connectionControllerClient,
|
|
193
|
-
networkControllerClient: this.networkControllerClient
|
|
194
|
-
});
|
|
195
|
-
const network = this.getDefaultNetwork();
|
|
196
|
-
if (network) {
|
|
197
|
-
ChainController.setActiveCaipNetwork(network);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
initializeConnectionController(options) {
|
|
201
|
-
ConnectionController.setWcBasic(options.basic ?? false);
|
|
202
|
-
}
|
|
203
|
-
initializeOptionsController(options) {
|
|
204
|
-
OptionsController.setDebug(options.debug !== false);
|
|
205
|
-
if (!options.projectId) {
|
|
206
|
-
AlertController.open(ErrorUtil.ALERT_ERRORS.PROJECT_ID_NOT_CONFIGURED, 'error');
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
// On by default
|
|
210
|
-
OptionsController.setEnableWalletConnect(options.enableWalletConnect !== false);
|
|
211
|
-
OptionsController.setEnableWalletGuide(options.enableWalletGuide !== false);
|
|
212
|
-
OptionsController.setEnableWallets(options.enableWallets !== false);
|
|
213
|
-
OptionsController.setEIP6963Enabled(options.enableEIP6963 !== false);
|
|
214
|
-
OptionsController.setEnableAuthLogger(options.enableAuthLogger !== false);
|
|
215
|
-
OptionsController.setSdkVersion(options.sdkVersion);
|
|
216
|
-
OptionsController.setProjectId(options.projectId);
|
|
217
|
-
OptionsController.setEnableEmbedded(options.enableEmbedded);
|
|
218
|
-
OptionsController.setAllWallets(options.allWallets);
|
|
219
|
-
OptionsController.setIncludeWalletIds(options.includeWalletIds);
|
|
220
|
-
OptionsController.setExcludeWalletIds(options.excludeWalletIds);
|
|
221
|
-
OptionsController.setFeaturedWalletIds(options.featuredWalletIds);
|
|
222
|
-
OptionsController.setTokens(options.tokens);
|
|
223
|
-
OptionsController.setTermsConditionsUrl(options.termsConditionsUrl);
|
|
224
|
-
OptionsController.setPrivacyPolicyUrl(options.privacyPolicyUrl);
|
|
225
|
-
OptionsController.setCustomWallets(options.customWallets);
|
|
226
|
-
OptionsController.setFeatures(options.features);
|
|
227
|
-
OptionsController.setAllowUnsupportedChain(options.allowUnsupportedChain);
|
|
228
|
-
OptionsController.setDefaultAccountTypes(options.defaultAccountTypes);
|
|
229
|
-
const defaultMetaData = this.getDefaultMetaData();
|
|
230
|
-
if (!options.metadata && defaultMetaData) {
|
|
231
|
-
options.metadata = defaultMetaData;
|
|
232
|
-
}
|
|
233
|
-
OptionsController.setMetadata(options.metadata);
|
|
234
|
-
OptionsController.setDisableAppend(options.disableAppend);
|
|
235
|
-
OptionsController.setEnableEmbedded(options.enableEmbedded);
|
|
236
|
-
OptionsController.setSIWX(options.siwx);
|
|
237
|
-
const evmAdapter = options.adapters?.find(adapter => adapter.namespace === ConstantsUtil.CHAIN.EVM);
|
|
238
|
-
// Set the SIWE client for EVM chains
|
|
239
|
-
if (evmAdapter) {
|
|
240
|
-
if (options.siweConfig) {
|
|
241
|
-
if (options.siwx) {
|
|
242
|
-
throw new Error('Cannot set both `siweConfig` and `siwx` options');
|
|
243
|
-
}
|
|
244
|
-
OptionsController.setSIWX(options.siweConfig.mapToSIWX());
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
getDefaultMetaData() {
|
|
249
|
-
if (typeof window !== 'undefined' && typeof document !== 'undefined') {
|
|
250
|
-
return {
|
|
251
|
-
name: document.getElementsByTagName('title')?.[0]?.textContent || '',
|
|
252
|
-
description: document.querySelector('meta[property="og:description"]')?.content || '',
|
|
253
|
-
url: window.location.origin,
|
|
254
|
-
icons: [document.querySelector('link[rel~="icon"]')?.href || '']
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
return null;
|
|
258
|
-
}
|
|
259
|
-
// -- Network Initialization ---------------------------------------------------
|
|
260
|
-
getUnsupportedNetwork(caipNetworkId) {
|
|
261
|
-
return {
|
|
262
|
-
id: caipNetworkId.split(':')[1],
|
|
263
|
-
caipNetworkId,
|
|
264
|
-
name: ConstantsUtil.UNSUPPORTED_NETWORK_NAME,
|
|
265
|
-
chainNamespace: caipNetworkId.split(':')[0],
|
|
266
|
-
nativeCurrency: {
|
|
267
|
-
name: '',
|
|
268
|
-
decimals: 0,
|
|
269
|
-
symbol: ''
|
|
270
|
-
},
|
|
271
|
-
rpcUrls: {
|
|
272
|
-
default: {
|
|
273
|
-
http: []
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
setUnsupportedNetwork(chainId) {
|
|
279
|
-
const namespace = this.getActiveChainNamespace();
|
|
280
|
-
if (namespace) {
|
|
281
|
-
const unsupportedNetwork = this.getUnsupportedNetwork(`${namespace}:${chainId}`);
|
|
282
|
-
ChainController.setActiveCaipNetwork(unsupportedNetwork);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
getDefaultNetwork() {
|
|
286
|
-
const caipNetworkId = StorageUtil.getActiveCaipNetworkId();
|
|
287
|
-
if (caipNetworkId) {
|
|
288
|
-
const caipNetwork = this.caipNetworks?.find(n => n.caipNetworkId === caipNetworkId);
|
|
289
|
-
if (caipNetwork) {
|
|
290
|
-
return caipNetwork;
|
|
291
|
-
}
|
|
292
|
-
return this.getUnsupportedNetwork(caipNetworkId);
|
|
293
|
-
}
|
|
294
|
-
return this.caipNetworks?.[0];
|
|
295
|
-
}
|
|
296
|
-
extendCaipNetwork(network, options) {
|
|
297
|
-
const extendedNetwork = CaipNetworksUtil.extendCaipNetwork(network, {
|
|
298
|
-
customNetworkImageUrls: options.chainImages,
|
|
299
|
-
projectId: options.projectId
|
|
300
|
-
});
|
|
301
|
-
return extendedNetwork;
|
|
302
|
-
}
|
|
303
|
-
extendCaipNetworks(options) {
|
|
304
|
-
const extendedNetworks = CaipNetworksUtil.extendCaipNetworks(options.networks, {
|
|
305
|
-
customNetworkImageUrls: options.chainImages,
|
|
306
|
-
projectId: options.projectId
|
|
307
|
-
});
|
|
308
|
-
return extendedNetworks;
|
|
309
|
-
}
|
|
310
|
-
extendDefaultCaipNetwork(options) {
|
|
311
|
-
const defaultNetwork = options.networks.find(n => n.id === options.defaultNetwork?.id);
|
|
312
|
-
const extendedNetwork = defaultNetwork
|
|
313
|
-
? CaipNetworksUtil.extendCaipNetwork(defaultNetwork, {
|
|
314
|
-
customNetworkImageUrls: options.chainImages,
|
|
315
|
-
projectId: options.projectId
|
|
316
|
-
})
|
|
317
|
-
: undefined;
|
|
318
|
-
return extendedNetwork;
|
|
319
|
-
}
|
|
320
|
-
// -- Client Initialization ---------------------------------------------------
|
|
321
|
-
createClients() {
|
|
322
|
-
this.connectionControllerClient = {
|
|
323
|
-
connectWalletConnect: async () => {
|
|
324
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
325
|
-
if (!adapter) {
|
|
326
|
-
throw new Error('Adapter not found');
|
|
327
|
-
}
|
|
328
|
-
const result = await adapter.connectWalletConnect(this.getCaipNetwork()?.id);
|
|
329
|
-
this.close();
|
|
330
|
-
this.setClientId(result?.clientId || null);
|
|
331
|
-
StorageUtil.setConnectedNamespaces([...ChainController.state.chains.keys()]);
|
|
332
|
-
await this.syncWalletConnectAccount();
|
|
333
|
-
},
|
|
334
|
-
connectExternal: async ({ id, info, type, provider, chain, caipNetwork }) => {
|
|
335
|
-
const activeChain = ChainController.state.activeChain;
|
|
336
|
-
const chainToUse = chain || activeChain;
|
|
337
|
-
const adapter = this.getAdapter(chainToUse);
|
|
338
|
-
if (chain && chain !== activeChain && !caipNetwork) {
|
|
339
|
-
const toConnectNetwork = this.caipNetworks?.find(network => network.chainNamespace === chain);
|
|
340
|
-
if (toConnectNetwork) {
|
|
341
|
-
this.setCaipNetwork(toConnectNetwork);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
if (!adapter) {
|
|
345
|
-
throw new Error('Adapter not found');
|
|
346
|
-
}
|
|
347
|
-
const res = await adapter.connect({
|
|
348
|
-
id,
|
|
349
|
-
info,
|
|
350
|
-
type,
|
|
351
|
-
provider,
|
|
352
|
-
chainId: caipNetwork?.id || this.getCaipNetwork()?.id,
|
|
353
|
-
rpcUrl: caipNetwork?.rpcUrls?.default?.http?.[0] ||
|
|
354
|
-
this.getCaipNetwork()?.rpcUrls?.default?.http?.[0]
|
|
355
|
-
});
|
|
356
|
-
if (!res) {
|
|
357
|
-
return;
|
|
358
|
-
}
|
|
359
|
-
StorageUtil.addConnectedNamespace(chainToUse);
|
|
360
|
-
this.syncProvider({ ...res, chainNamespace: chainToUse });
|
|
361
|
-
await this.syncAccount({ ...res, chainNamespace: chainToUse });
|
|
362
|
-
const { accounts } = await adapter.getAccounts({ namespace: chainToUse, id });
|
|
363
|
-
this.setAllAccounts(accounts, chainToUse);
|
|
364
|
-
},
|
|
365
|
-
reconnectExternal: async ({ id, info, type, provider }) => {
|
|
366
|
-
const namespace = ChainController.state.activeChain;
|
|
367
|
-
const adapter = this.getAdapter(namespace);
|
|
368
|
-
if (adapter?.reconnect) {
|
|
369
|
-
await adapter?.reconnect({ id, info, type, provider, chainId: this.getCaipNetwork()?.id });
|
|
370
|
-
StorageUtil.addConnectedNamespace(namespace);
|
|
371
|
-
}
|
|
372
|
-
},
|
|
373
|
-
disconnect: async () => {
|
|
374
|
-
const namespace = ChainController.state.activeChain;
|
|
375
|
-
const adapter = this.getAdapter(namespace);
|
|
376
|
-
const provider = ProviderUtil.getProvider(namespace);
|
|
377
|
-
const providerType = ProviderUtil.state.providerIds[namespace];
|
|
378
|
-
await adapter?.disconnect({ provider, providerType });
|
|
379
|
-
StorageUtil.removeConnectedNamespace(namespace);
|
|
380
|
-
ProviderUtil.resetChain(namespace);
|
|
381
|
-
this.setUser(undefined);
|
|
382
|
-
this.setStatus('disconnected', namespace);
|
|
383
|
-
},
|
|
384
|
-
checkInstalled: (ids) => {
|
|
385
|
-
if (!ids) {
|
|
386
|
-
return Boolean(window.ethereum);
|
|
387
|
-
}
|
|
388
|
-
return ids.some(id => Boolean(window.ethereum?.[String(id)]));
|
|
389
|
-
},
|
|
390
|
-
signMessage: async (message) => {
|
|
391
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
392
|
-
const result = await adapter?.signMessage({
|
|
393
|
-
message,
|
|
394
|
-
address: AccountController.state.address,
|
|
395
|
-
provider: ProviderUtil.getProvider(ChainController.state.activeChain)
|
|
396
|
-
});
|
|
397
|
-
return result?.signature || '';
|
|
398
|
-
},
|
|
399
|
-
sendTransaction: async (args) => {
|
|
400
|
-
if (args.chainNamespace === ConstantsUtil.CHAIN.EVM) {
|
|
401
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
402
|
-
const provider = ProviderUtil.getProvider(ChainController.state.activeChain);
|
|
403
|
-
const result = await adapter?.sendTransaction({ ...args, provider });
|
|
404
|
-
return result?.hash || '';
|
|
405
|
-
}
|
|
406
|
-
return '';
|
|
407
|
-
},
|
|
408
|
-
estimateGas: async (args) => {
|
|
409
|
-
if (args.chainNamespace === ConstantsUtil.CHAIN.EVM) {
|
|
410
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
411
|
-
const provider = ProviderUtil.getProvider(ChainController.state.activeChain);
|
|
412
|
-
const caipNetwork = this.getCaipNetwork();
|
|
413
|
-
if (!caipNetwork) {
|
|
414
|
-
throw new Error('CaipNetwork is undefined');
|
|
415
|
-
}
|
|
416
|
-
const result = await adapter?.estimateGas({
|
|
417
|
-
...args,
|
|
418
|
-
provider,
|
|
419
|
-
caipNetwork
|
|
420
|
-
});
|
|
421
|
-
return result?.gas || 0n;
|
|
422
|
-
}
|
|
423
|
-
return 0n;
|
|
424
|
-
},
|
|
425
|
-
getEnsAvatar: async () => {
|
|
426
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
427
|
-
const result = await adapter?.getProfile({
|
|
428
|
-
address: AccountController.state.address,
|
|
429
|
-
chainId: Number(this.getCaipNetwork()?.id)
|
|
430
|
-
});
|
|
431
|
-
return result?.profileImage || false;
|
|
432
|
-
},
|
|
433
|
-
getEnsAddress: async (name) => {
|
|
434
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
435
|
-
const caipNetwork = this.getCaipNetwork();
|
|
436
|
-
if (!caipNetwork) {
|
|
437
|
-
return false;
|
|
438
|
-
}
|
|
439
|
-
const result = await adapter?.getEnsAddress({
|
|
440
|
-
name,
|
|
441
|
-
caipNetwork
|
|
442
|
-
});
|
|
443
|
-
return result?.address || false;
|
|
444
|
-
},
|
|
445
|
-
writeContract: async (args) => {
|
|
446
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
447
|
-
const caipNetwork = this.getCaipNetwork();
|
|
448
|
-
const caipAddress = this.getCaipAddress();
|
|
449
|
-
const provider = ProviderUtil.getProvider(ChainController.state.activeChain);
|
|
450
|
-
if (!caipNetwork || !caipAddress) {
|
|
451
|
-
throw new Error('CaipNetwork or CaipAddress is undefined');
|
|
452
|
-
}
|
|
453
|
-
const result = await adapter?.writeContract({ ...args, caipNetwork, provider, caipAddress });
|
|
454
|
-
return result?.hash;
|
|
455
|
-
},
|
|
456
|
-
parseUnits: (value, decimals) => {
|
|
457
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
458
|
-
return adapter?.parseUnits({ value, decimals }) ?? 0n;
|
|
459
|
-
},
|
|
460
|
-
formatUnits: (value, decimals) => {
|
|
461
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
462
|
-
return adapter?.formatUnits({ value, decimals }) ?? '0';
|
|
463
|
-
},
|
|
464
|
-
getCapabilities: async (params) => {
|
|
465
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
466
|
-
await adapter?.getCapabilities(params);
|
|
467
|
-
},
|
|
468
|
-
grantPermissions: async (params) => {
|
|
469
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
470
|
-
return await adapter?.grantPermissions(params);
|
|
471
|
-
},
|
|
472
|
-
revokePermissions: async (params) => {
|
|
473
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
474
|
-
if (adapter?.revokePermissions) {
|
|
475
|
-
return await adapter.revokePermissions(params);
|
|
476
|
-
}
|
|
477
|
-
return '0x';
|
|
478
|
-
}
|
|
479
|
-
};
|
|
480
|
-
this.networkControllerClient = {
|
|
481
|
-
switchCaipNetwork: async (caipNetwork) => await this.switchCaipNetwork(caipNetwork),
|
|
482
|
-
// eslint-disable-next-line @typescript-eslint/require-await
|
|
483
|
-
getApprovedCaipNetworksData: async () => this.getApprovedCaipNetworksData()
|
|
484
|
-
};
|
|
485
|
-
ConnectionController.setClient(this.connectionControllerClient);
|
|
486
|
-
}
|
|
487
|
-
getApprovedCaipNetworksData() {
|
|
488
|
-
const providerType = ProviderUtil.state.providerIds[ChainController.state.activeChain];
|
|
489
|
-
if (providerType === UtilConstantsUtil.CONNECTOR_TYPE_WALLET_CONNECT) {
|
|
490
|
-
const namespaces = this.universalProvider?.session?.namespaces;
|
|
491
|
-
return {
|
|
492
|
-
/*
|
|
493
|
-
* MetaMask Wallet only returns 1 namespace in the session object. This makes it imposible
|
|
494
|
-
* to switch to other networks. Setting supportsAllNetworks to true for MetaMask Wallet
|
|
495
|
-
* will make it possible to switch to other networks.
|
|
496
|
-
*/
|
|
497
|
-
supportsAllNetworks: this.universalProvider?.session?.peer?.metadata.name === 'MetaMask Wallet',
|
|
498
|
-
approvedCaipNetworkIds: this.getChainsFromNamespaces(namespaces)
|
|
499
|
-
};
|
|
500
|
-
}
|
|
501
|
-
return { supportsAllNetworks: true, approvedCaipNetworkIds: [] };
|
|
502
|
-
}
|
|
503
|
-
async switchCaipNetwork(caipNetwork) {
|
|
504
|
-
if (!caipNetwork) {
|
|
505
|
-
return;
|
|
506
|
-
}
|
|
507
|
-
if (AccountController.state.address) {
|
|
508
|
-
if (caipNetwork.chainNamespace === ChainController.state.activeChain) {
|
|
509
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
510
|
-
const provider = ProviderUtil.getProvider(ChainController.state.activeChain);
|
|
511
|
-
const providerType = ProviderUtil.state.providerIds[ChainController.state.activeChain];
|
|
512
|
-
await adapter?.switchNetwork({ caipNetwork, provider, providerType });
|
|
513
|
-
this.setCaipNetwork(caipNetwork);
|
|
514
|
-
await this.syncAccount({
|
|
515
|
-
address: AccountController.state.address,
|
|
516
|
-
chainId: caipNetwork.id,
|
|
517
|
-
chainNamespace: caipNetwork.chainNamespace
|
|
518
|
-
});
|
|
519
|
-
}
|
|
520
|
-
else {
|
|
521
|
-
const providerType = ProviderUtil.state.providerIds[ChainController.state.activeChain];
|
|
522
|
-
this.setCaipNetwork(caipNetwork);
|
|
523
|
-
if (providerType === 'WALLET_CONNECT') {
|
|
524
|
-
this.syncWalletConnectAccount();
|
|
525
|
-
}
|
|
526
|
-
else {
|
|
527
|
-
const address = this.getAddressByChainNamespace(caipNetwork.chainNamespace);
|
|
528
|
-
if (address) {
|
|
529
|
-
this.syncAccount({
|
|
530
|
-
address,
|
|
531
|
-
chainId: caipNetwork.id,
|
|
532
|
-
chainNamespace: caipNetwork.chainNamespace
|
|
533
|
-
});
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
else {
|
|
539
|
-
this.setCaipNetwork(caipNetwork);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
getChainsFromNamespaces(namespaces = {}) {
|
|
543
|
-
return Object.values(namespaces).flatMap((namespace) => {
|
|
544
|
-
const chains = (namespace.chains || []);
|
|
545
|
-
const accountsChains = namespace.accounts.map(account => {
|
|
546
|
-
const { chainId, chainNamespace } = ParseUtil.parseCaipAddress(account);
|
|
547
|
-
return `${chainNamespace}:${chainId}`;
|
|
548
|
-
});
|
|
549
|
-
return Array.from(new Set([...chains, ...accountsChains]));
|
|
550
|
-
});
|
|
551
|
-
}
|
|
552
|
-
// -- Adapter Initialization ---------------------------------------------------
|
|
553
|
-
createAdapters(blueprints) {
|
|
554
|
-
this.createClients();
|
|
555
|
-
return this.chainNamespaces.reduce((adapters, namespace) => {
|
|
556
|
-
const blueprint = blueprints?.find(b => b.namespace === namespace);
|
|
557
|
-
if (blueprint) {
|
|
558
|
-
adapters[namespace] = blueprint;
|
|
559
|
-
adapters[namespace].namespace = namespace;
|
|
560
|
-
adapters[namespace].construct({
|
|
561
|
-
namespace,
|
|
562
|
-
projectId: this.options?.projectId,
|
|
563
|
-
networks: this.caipNetworks
|
|
564
|
-
});
|
|
565
|
-
}
|
|
566
|
-
else {
|
|
567
|
-
adapters[namespace] = new UniversalAdapter({
|
|
568
|
-
namespace,
|
|
569
|
-
networks: this.caipNetworks
|
|
570
|
-
});
|
|
571
|
-
}
|
|
572
|
-
return adapters;
|
|
573
|
-
// eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter
|
|
574
|
-
}, {});
|
|
575
|
-
}
|
|
576
|
-
async initChainAdapter(namespace) {
|
|
577
|
-
this.onConnectors(namespace);
|
|
578
|
-
this.listenAdapter(namespace);
|
|
579
|
-
this.chainAdapters?.[namespace].syncConnectors(this.options, this);
|
|
580
|
-
await this.createUniversalProviderForAdapter(namespace);
|
|
581
|
-
}
|
|
582
|
-
async initChainAdapters() {
|
|
583
|
-
await Promise.all(this.chainNamespaces.map(async (namespace) => {
|
|
584
|
-
await this.initChainAdapter(namespace);
|
|
585
|
-
}));
|
|
586
|
-
}
|
|
587
|
-
onConnectors(chainNamespace) {
|
|
588
|
-
const adapter = this.getAdapter(chainNamespace);
|
|
589
|
-
adapter?.on('connectors', this.setConnectors.bind(this));
|
|
590
|
-
}
|
|
591
|
-
listenAdapter(chainNamespace) {
|
|
592
|
-
const adapter = this.getAdapter(chainNamespace);
|
|
593
|
-
if (!adapter) {
|
|
594
|
-
return;
|
|
595
|
-
}
|
|
596
|
-
const connectionStatus = StorageUtil.getConnectionStatus();
|
|
597
|
-
if (connectionStatus === 'connected') {
|
|
598
|
-
this.setStatus('connecting', chainNamespace);
|
|
599
|
-
}
|
|
600
|
-
else {
|
|
601
|
-
this.setStatus(connectionStatus, chainNamespace);
|
|
602
|
-
}
|
|
603
|
-
adapter.on('switchNetwork', ({ address, chainId }) => {
|
|
604
|
-
if (chainId &&
|
|
605
|
-
this.caipNetworks?.find(n => n.id === chainId || n.caipNetworkId === chainId)) {
|
|
606
|
-
if (ChainController.state.activeChain === chainNamespace && address) {
|
|
607
|
-
this.syncAccount({ address, chainId, chainNamespace });
|
|
608
|
-
}
|
|
609
|
-
else if (ChainController.state.activeChain === chainNamespace &&
|
|
610
|
-
AccountController.state.address) {
|
|
611
|
-
this.syncAccount({
|
|
612
|
-
address: AccountController.state.address,
|
|
613
|
-
chainId,
|
|
614
|
-
chainNamespace
|
|
615
|
-
});
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
else {
|
|
619
|
-
this.setUnsupportedNetwork(chainId);
|
|
620
|
-
}
|
|
621
|
-
});
|
|
622
|
-
adapter.on('disconnect', this.disconnect.bind(this));
|
|
623
|
-
adapter.on('pendingTransactions', () => {
|
|
624
|
-
const address = AccountController.state.address;
|
|
625
|
-
const activeCaipNetwork = ChainController.state.activeCaipNetwork;
|
|
626
|
-
if (!address || !activeCaipNetwork?.id) {
|
|
627
|
-
return;
|
|
628
|
-
}
|
|
629
|
-
this.updateNativeBalance();
|
|
630
|
-
});
|
|
631
|
-
adapter.on('accountChanged', ({ address, chainId }) => {
|
|
632
|
-
if (ChainController.state.activeChain === chainNamespace && chainId) {
|
|
633
|
-
this.syncAccount({
|
|
634
|
-
address,
|
|
635
|
-
chainId,
|
|
636
|
-
chainNamespace
|
|
637
|
-
});
|
|
638
|
-
}
|
|
639
|
-
else if (ChainController.state.activeChain === chainNamespace &&
|
|
640
|
-
ChainController.state.activeCaipNetwork?.id) {
|
|
641
|
-
this.syncAccount({
|
|
642
|
-
address,
|
|
643
|
-
chainId: ChainController.state.activeCaipNetwork?.id,
|
|
644
|
-
chainNamespace
|
|
645
|
-
});
|
|
646
|
-
}
|
|
647
|
-
});
|
|
648
|
-
}
|
|
649
|
-
async createUniversalProviderForAdapter(chainNamespace) {
|
|
650
|
-
await this.getUniversalProvider();
|
|
651
|
-
if (this.universalProvider) {
|
|
652
|
-
this.chainAdapters?.[chainNamespace]?.setUniversalProvider?.(this.universalProvider);
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
// -- Connection Sync ---------------------------------------------------
|
|
656
|
-
async syncExistingConnection() {
|
|
657
|
-
await Promise.allSettled(this.chainNamespaces.map(namespace => this.syncNamespaceConnection(namespace)));
|
|
658
|
-
}
|
|
659
|
-
async syncNamespaceConnection(namespace) {
|
|
660
|
-
try {
|
|
661
|
-
const connectorId = StorageUtil.getConnectedConnectorId(namespace);
|
|
662
|
-
this.setStatus('connecting', namespace);
|
|
663
|
-
switch (connectorId) {
|
|
664
|
-
case ConstantsUtil.CONNECTOR_ID.WALLET_CONNECT:
|
|
665
|
-
await this.syncWalletConnectAccount();
|
|
666
|
-
break;
|
|
667
|
-
case ConstantsUtil.CONNECTOR_ID.AUTH:
|
|
668
|
-
// Handled during initialization of adapters' auth provider
|
|
669
|
-
break;
|
|
670
|
-
default:
|
|
671
|
-
await this.syncAdapterConnection(namespace);
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
catch (err) {
|
|
675
|
-
console.warn("AppKit couldn't sync existing connection", err);
|
|
676
|
-
StorageUtil.deleteConnectedConnectorId(namespace);
|
|
677
|
-
this.setStatus('disconnected', namespace);
|
|
678
|
-
}
|
|
679
|
-
}
|
|
680
|
-
async syncAdapterConnection(namespace) {
|
|
681
|
-
const adapter = this.getAdapter(namespace);
|
|
682
|
-
const connectorId = StorageUtil.getConnectedConnectorId(namespace);
|
|
683
|
-
const caipNetwork = this.getCaipNetwork();
|
|
684
|
-
try {
|
|
685
|
-
if (!adapter || !connectorId) {
|
|
686
|
-
throw new Error(`Adapter or connectorId not found for namespace ${namespace}`);
|
|
687
|
-
}
|
|
688
|
-
const connection = await adapter?.syncConnection({
|
|
689
|
-
namespace,
|
|
690
|
-
id: connectorId,
|
|
691
|
-
chainId: caipNetwork?.id,
|
|
692
|
-
rpcUrl: caipNetwork?.rpcUrls?.default?.http?.[0]
|
|
693
|
-
});
|
|
694
|
-
if (connection) {
|
|
695
|
-
const accounts = await adapter?.getAccounts({
|
|
696
|
-
namespace,
|
|
697
|
-
id: connectorId
|
|
698
|
-
});
|
|
699
|
-
if (accounts && accounts.accounts.length > 0) {
|
|
700
|
-
this.setAllAccounts(accounts.accounts, namespace);
|
|
701
|
-
}
|
|
702
|
-
else {
|
|
703
|
-
this.setAllAccounts([CoreHelperUtil.createAccount(namespace, connection.address, 'eoa')], namespace);
|
|
704
|
-
}
|
|
705
|
-
this.syncProvider({ ...connection, chainNamespace: namespace });
|
|
706
|
-
await this.syncAccount({ ...connection, chainNamespace: namespace });
|
|
707
|
-
this.setStatus('connected', namespace);
|
|
708
|
-
}
|
|
709
|
-
else {
|
|
710
|
-
this.setStatus('disconnected', namespace);
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
catch (e) {
|
|
714
|
-
StorageUtil.deleteConnectedConnectorId(namespace);
|
|
715
|
-
this.setStatus('disconnected', namespace);
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
async syncWalletConnectAccount() {
|
|
719
|
-
this.chainNamespaces.forEach(async (chainNamespace) => {
|
|
720
|
-
const adapter = this.getAdapter(chainNamespace);
|
|
721
|
-
const namespaceAccounts = this.universalProvider?.session?.namespaces?.[chainNamespace]?.accounts || [];
|
|
722
|
-
// We try and find the address for this network in the session object.
|
|
723
|
-
const activeChainId = ChainController.state.activeCaipNetwork?.id;
|
|
724
|
-
const sessionAddress = namespaceAccounts.find(account => {
|
|
725
|
-
const { chainId } = ParseUtil.parseCaipAddress(account);
|
|
726
|
-
return chainId === activeChainId?.toString();
|
|
727
|
-
}) || namespaceAccounts[0];
|
|
728
|
-
if (sessionAddress) {
|
|
729
|
-
const caipAddress = ParseUtil.validateCaipAddress(sessionAddress);
|
|
730
|
-
const { chainId, address } = ParseUtil.parseCaipAddress(caipAddress);
|
|
731
|
-
ProviderUtil.setProviderId(chainNamespace, UtilConstantsUtil.CONNECTOR_TYPE_WALLET_CONNECT);
|
|
732
|
-
if (this.caipNetworks &&
|
|
733
|
-
ChainController.state.activeCaipNetwork &&
|
|
734
|
-
adapter?.namespace !== ConstantsUtil.CHAIN.EVM) {
|
|
735
|
-
const provider = adapter?.getWalletConnectProvider({
|
|
736
|
-
caipNetworks: this.caipNetworks,
|
|
737
|
-
provider: this.universalProvider,
|
|
738
|
-
activeCaipNetwork: ChainController.state.activeCaipNetwork
|
|
739
|
-
});
|
|
740
|
-
ProviderUtil.setProvider(chainNamespace, provider);
|
|
741
|
-
}
|
|
742
|
-
else {
|
|
743
|
-
ProviderUtil.setProvider(chainNamespace, this.universalProvider);
|
|
744
|
-
}
|
|
745
|
-
StorageUtil.setConnectedConnectorId(chainNamespace, ConstantsUtil.CONNECTOR_ID.WALLET_CONNECT);
|
|
746
|
-
StorageUtil.addConnectedNamespace(chainNamespace);
|
|
747
|
-
if (adapter?.adapterType === 'wagmi') {
|
|
748
|
-
try {
|
|
749
|
-
await adapter?.connect({
|
|
750
|
-
id: 'walletConnect',
|
|
751
|
-
type: 'WALLET_CONNECT',
|
|
752
|
-
chainId: ChainController.state.activeCaipNetwork?.id
|
|
753
|
-
});
|
|
754
|
-
}
|
|
755
|
-
catch (error) {
|
|
756
|
-
/**
|
|
757
|
-
* Handle edge case where wagmi detects existing connection but lacks to complete UniversalProvider instance.
|
|
758
|
-
* Connection attempt fails due to already connected state - reconnect to restore provider state.
|
|
759
|
-
*/
|
|
760
|
-
if (adapter?.reconnect) {
|
|
761
|
-
adapter?.reconnect({
|
|
762
|
-
id: 'walletConnect',
|
|
763
|
-
type: 'WALLET_CONNECT'
|
|
764
|
-
});
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
|
-
this.syncWalletConnectAccounts(chainNamespace);
|
|
769
|
-
await this.syncAccount({
|
|
770
|
-
address,
|
|
771
|
-
chainId,
|
|
772
|
-
chainNamespace
|
|
773
|
-
});
|
|
774
|
-
}
|
|
775
|
-
});
|
|
776
|
-
await ChainController.setApprovedCaipNetworksData(ChainController.state.activeChain);
|
|
777
|
-
}
|
|
778
|
-
syncWalletConnectAccounts(chainNamespace) {
|
|
779
|
-
const addresses = this.universalProvider?.session?.namespaces?.[chainNamespace]?.accounts
|
|
780
|
-
?.map(account => {
|
|
781
|
-
const { address } = ParseUtil.parseCaipAddress(account);
|
|
782
|
-
return address;
|
|
783
|
-
})
|
|
784
|
-
.filter((address, index, self) => self.indexOf(address) === index);
|
|
785
|
-
if (addresses) {
|
|
786
|
-
this.setAllAccounts(addresses.map(address => CoreHelperUtil.createAccount(chainNamespace, address, chainNamespace === 'bip122' ? 'payment' : 'eoa')), chainNamespace);
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
syncProvider({ type, provider, id, chainNamespace }) {
|
|
790
|
-
ProviderUtil.setProviderId(chainNamespace, type);
|
|
791
|
-
ProviderUtil.setProvider(chainNamespace, provider);
|
|
792
|
-
StorageUtil.setConnectedConnectorId(chainNamespace, id);
|
|
793
|
-
}
|
|
794
|
-
async syncAccount(params) {
|
|
795
|
-
const { address, chainId, chainNamespace } = params;
|
|
796
|
-
const { chainId: activeChainId } = StorageUtil.getActiveNetworkProps();
|
|
797
|
-
const chainIdToUse = chainId || activeChainId;
|
|
798
|
-
const isUnsupportedNetwork = ChainController.state.activeCaipNetwork?.name === ConstantsUtil.UNSUPPORTED_NETWORK_NAME;
|
|
799
|
-
const shouldSupportAllNetworks = ChainController.getNetworkProp('supportsAllNetworks', chainNamespace);
|
|
800
|
-
// Only update state when needed
|
|
801
|
-
if (!HelpersUtil.isLowerCaseMatch(address, AccountController.state.address)) {
|
|
802
|
-
this.setCaipAddress(`${chainNamespace}:${chainId}:${address}`, chainNamespace);
|
|
803
|
-
await this.syncIdentity({ address, chainId, chainNamespace });
|
|
804
|
-
}
|
|
805
|
-
this.setStatus('connected', chainNamespace);
|
|
806
|
-
if (isUnsupportedNetwork && !shouldSupportAllNetworks) {
|
|
807
|
-
return;
|
|
808
|
-
}
|
|
809
|
-
if (chainIdToUse) {
|
|
810
|
-
let caipNetwork = this.caipNetworks?.find(n => n.id.toString() === chainIdToUse.toString());
|
|
811
|
-
let fallbackCaipNetwork = this.caipNetworks?.find(n => n.chainNamespace === chainNamespace);
|
|
812
|
-
// If doesn't support all networks, we need to use approved networks
|
|
813
|
-
if (!shouldSupportAllNetworks && !caipNetwork && !fallbackCaipNetwork) {
|
|
814
|
-
// Connection can be requested for a chain that is not supported by the wallet so we need to use approved networks here
|
|
815
|
-
const caipNetworkIds = this.getApprovedCaipNetworkIds() || [];
|
|
816
|
-
const caipNetworkId = caipNetworkIds.find(id => ParseUtil.parseCaipNetworkId(id)?.chainId === chainIdToUse.toString());
|
|
817
|
-
const fallBackCaipNetworkId = caipNetworkIds.find(id => ParseUtil.parseCaipNetworkId(id)?.chainNamespace === chainNamespace);
|
|
818
|
-
caipNetwork = this.caipNetworks?.find(n => n.caipNetworkId === caipNetworkId);
|
|
819
|
-
fallbackCaipNetwork = this.caipNetworks?.find(n => n.caipNetworkId === fallBackCaipNetworkId ||
|
|
820
|
-
// This is a workaround used in Solana network to support deprecated caipNetworkId
|
|
821
|
-
('deprecatedCaipNetworkId' in n && n.deprecatedCaipNetworkId === fallBackCaipNetworkId));
|
|
822
|
-
}
|
|
823
|
-
const network = caipNetwork || fallbackCaipNetwork;
|
|
824
|
-
if (network?.chainNamespace === ChainController.state.activeChain) {
|
|
825
|
-
this.setCaipNetwork(network);
|
|
826
|
-
}
|
|
827
|
-
this.syncConnectedWalletInfo(chainNamespace);
|
|
828
|
-
// Only update state when needed
|
|
829
|
-
if (!HelpersUtil.isLowerCaseMatch(address, AccountController.state.address)) {
|
|
830
|
-
this.setCaipAddress(`${chainNamespace}:${network?.id}:${address}`, chainNamespace);
|
|
831
|
-
await this.syncIdentity({
|
|
832
|
-
address,
|
|
833
|
-
chainId: network?.id,
|
|
834
|
-
chainNamespace
|
|
835
|
-
});
|
|
836
|
-
}
|
|
837
|
-
await this.syncBalance({ address, chainId: network?.id, chainNamespace });
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
async syncIdentity({ address, chainId, chainNamespace }) {
|
|
841
|
-
const activeCaipNetwork = this.caipNetworks?.find(n => n.caipNetworkId === `${chainNamespace}:${chainId}`);
|
|
842
|
-
if (chainNamespace !== ConstantsUtil.CHAIN.EVM || activeCaipNetwork?.testnet) {
|
|
843
|
-
return;
|
|
844
|
-
}
|
|
845
|
-
try {
|
|
846
|
-
const { name, avatar } = await this.fetchIdentity({
|
|
847
|
-
address
|
|
848
|
-
});
|
|
849
|
-
this.setProfileName(name, chainNamespace);
|
|
850
|
-
this.setProfileImage(avatar, chainNamespace);
|
|
851
|
-
if (!name) {
|
|
852
|
-
await this.syncReownName(address, chainNamespace);
|
|
853
|
-
const adapter = this.getAdapter(chainNamespace);
|
|
854
|
-
const result = await adapter?.getProfile({
|
|
855
|
-
address,
|
|
856
|
-
chainId: Number(chainId)
|
|
857
|
-
});
|
|
858
|
-
if (result?.profileName) {
|
|
859
|
-
this.setProfileName(result.profileName, chainNamespace);
|
|
860
|
-
if (result.profileImage) {
|
|
861
|
-
this.setProfileImage(result.profileImage, chainNamespace);
|
|
862
|
-
}
|
|
863
|
-
}
|
|
864
|
-
else {
|
|
865
|
-
await this.syncReownName(address, chainNamespace);
|
|
866
|
-
this.setProfileImage(null, chainNamespace);
|
|
867
|
-
}
|
|
868
|
-
}
|
|
869
|
-
}
|
|
870
|
-
catch {
|
|
871
|
-
if (chainId === 1) {
|
|
872
|
-
await this.syncReownName(address, chainNamespace);
|
|
873
|
-
}
|
|
874
|
-
else {
|
|
875
|
-
await this.syncReownName(address, chainNamespace);
|
|
876
|
-
this.setProfileImage(null, chainNamespace);
|
|
877
|
-
}
|
|
878
|
-
}
|
|
879
|
-
}
|
|
880
|
-
async syncReownName(address, chainNamespace) {
|
|
881
|
-
try {
|
|
882
|
-
const registeredWcNames = await this.getReownName(address);
|
|
883
|
-
if (registeredWcNames[0]) {
|
|
884
|
-
const wcName = registeredWcNames[0];
|
|
885
|
-
this.setProfileName(wcName.name, chainNamespace);
|
|
886
|
-
}
|
|
887
|
-
else {
|
|
888
|
-
this.setProfileName(null, chainNamespace);
|
|
889
|
-
}
|
|
890
|
-
}
|
|
891
|
-
catch {
|
|
892
|
-
this.setProfileName(null, chainNamespace);
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
syncConnectedWalletInfo(chainNamespace) {
|
|
896
|
-
const connectorId = StorageUtil.getConnectedConnectorId(chainNamespace);
|
|
897
|
-
const providerType = ProviderUtil.getProviderId(chainNamespace);
|
|
898
|
-
if (providerType === UtilConstantsUtil.CONNECTOR_TYPE_ANNOUNCED ||
|
|
899
|
-
providerType === UtilConstantsUtil.CONNECTOR_TYPE_INJECTED) {
|
|
900
|
-
if (connectorId) {
|
|
901
|
-
const connector = this.getConnectors().find(c => c.id === connectorId);
|
|
902
|
-
if (connector) {
|
|
903
|
-
const { info, name, imageUrl } = connector;
|
|
904
|
-
const icon = imageUrl || this.getConnectorImage(connector);
|
|
905
|
-
this.setConnectedWalletInfo({ name, icon, ...info }, chainNamespace);
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
}
|
|
909
|
-
else if (providerType === UtilConstantsUtil.CONNECTOR_TYPE_WALLET_CONNECT) {
|
|
910
|
-
const provider = ProviderUtil.getProvider(chainNamespace);
|
|
911
|
-
if (provider?.session) {
|
|
912
|
-
this.setConnectedWalletInfo({
|
|
913
|
-
...provider.session.peer.metadata,
|
|
914
|
-
name: provider.session.peer.metadata.name,
|
|
915
|
-
icon: provider.session.peer.metadata.icons?.[0]
|
|
916
|
-
}, chainNamespace);
|
|
917
|
-
}
|
|
918
|
-
}
|
|
919
|
-
else if (connectorId) {
|
|
920
|
-
if (connectorId === ConstantsUtil.CONNECTOR_ID.COINBASE) {
|
|
921
|
-
const connector = this.getConnectors().find(c => c.id === ConstantsUtil.CONNECTOR_ID.COINBASE);
|
|
922
|
-
this.setConnectedWalletInfo({ name: 'Coinbase Wallet', icon: this.getConnectorImage(connector) }, chainNamespace);
|
|
923
|
-
}
|
|
924
|
-
this.setConnectedWalletInfo({ name: connectorId }, chainNamespace);
|
|
925
|
-
}
|
|
926
|
-
}
|
|
927
|
-
async syncBalance(params) {
|
|
928
|
-
const caipNetwork = NetworkUtil.getNetworksByNamespace(this.caipNetworks, params.chainNamespace).find(n => n.id.toString() === params.chainId?.toString());
|
|
929
|
-
if (!caipNetwork) {
|
|
930
|
-
return;
|
|
931
|
-
}
|
|
932
|
-
const isApiBalanceSupported = CoreConstantsUtil.BALANCE_SUPPORTED_CHAINS.includes(caipNetwork?.chainNamespace);
|
|
933
|
-
if (caipNetwork.testnet || !isApiBalanceSupported) {
|
|
934
|
-
await this.updateNativeBalance();
|
|
935
|
-
return;
|
|
936
|
-
}
|
|
937
|
-
const balances = await AccountController.fetchTokenBalance(() => this.setBalance('0.00', caipNetwork.nativeCurrency.symbol, caipNetwork.chainNamespace));
|
|
938
|
-
const balance = balances.find(b => b.chainId === `${params.chainNamespace}:${params.chainId}` &&
|
|
939
|
-
b.symbol === caipNetwork.nativeCurrency.symbol);
|
|
940
|
-
this.setBalance(balance?.quantity?.numeric || '0.00', caipNetwork.nativeCurrency.symbol, params.chainNamespace);
|
|
941
|
-
}
|
|
942
|
-
async updateNativeBalance() {
|
|
943
|
-
const adapter = this.getAdapter(ChainController.state.activeChain);
|
|
944
|
-
if (adapter && ChainController.state.activeChain && AccountController.state.address) {
|
|
945
|
-
const balance = await adapter.getBalance({
|
|
946
|
-
address: AccountController.state.address,
|
|
947
|
-
chainId: ChainController.state.activeCaipNetwork?.id,
|
|
948
|
-
caipNetwork: this.getCaipNetwork(),
|
|
949
|
-
tokens: this.options.tokens
|
|
950
|
-
});
|
|
951
|
-
this.setBalance(balance.balance, balance.symbol, ChainController.state.activeChain);
|
|
952
|
-
}
|
|
953
|
-
}
|
|
954
|
-
// -- Universal Provider ---------------------------------------------------
|
|
955
|
-
async initializeUniversalAdapter() {
|
|
956
|
-
const logger = LoggerUtil.createLogger((error, ...args) => {
|
|
957
|
-
if (error) {
|
|
958
|
-
this.handleAlertError(error);
|
|
959
|
-
}
|
|
960
|
-
// eslint-disable-next-line no-console
|
|
961
|
-
console.error(...args);
|
|
962
|
-
});
|
|
963
|
-
const universalProviderOptions = {
|
|
964
|
-
projectId: this.options?.projectId,
|
|
965
|
-
metadata: {
|
|
966
|
-
name: this.options?.metadata ? this.options?.metadata.name : '',
|
|
967
|
-
description: this.options?.metadata ? this.options?.metadata.description : '',
|
|
968
|
-
url: this.options?.metadata ? this.options?.metadata.url : '',
|
|
969
|
-
icons: this.options?.metadata ? this.options?.metadata.icons : ['']
|
|
970
|
-
},
|
|
971
|
-
logger
|
|
972
|
-
};
|
|
973
|
-
OptionsController.setManualWCControl(Boolean(this.options?.manualWCControl));
|
|
974
|
-
this.universalProvider =
|
|
975
|
-
this.options.universalProvider ?? (await UniversalProvider.init(universalProviderOptions));
|
|
976
|
-
this.listenWalletConnect();
|
|
977
|
-
}
|
|
978
|
-
listenWalletConnect() {
|
|
979
|
-
if (this.universalProvider) {
|
|
980
|
-
this.universalProvider.on('display_uri', (uri) => {
|
|
981
|
-
ConnectionController.setUri(uri);
|
|
982
|
-
});
|
|
983
|
-
this.universalProvider.on('connect', ConnectionController.finalizeWcConnection);
|
|
984
|
-
this.universalProvider.on('disconnect', () => {
|
|
985
|
-
this.chainNamespaces.forEach(namespace => {
|
|
986
|
-
this.resetAccount(namespace);
|
|
987
|
-
});
|
|
988
|
-
ConnectionController.resetWcConnection();
|
|
989
|
-
});
|
|
990
|
-
this.universalProvider.on('chainChanged', (chainId) => {
|
|
991
|
-
// eslint-disable-next-line eqeqeq
|
|
992
|
-
const caipNetwork = this.caipNetworks?.find(c => c.id == chainId);
|
|
993
|
-
const currentCaipNetwork = this.getCaipNetwork();
|
|
994
|
-
if (!caipNetwork) {
|
|
995
|
-
this.setUnsupportedNetwork(chainId);
|
|
996
|
-
return;
|
|
997
|
-
}
|
|
998
|
-
if (currentCaipNetwork?.id !== caipNetwork?.id) {
|
|
999
|
-
this.setCaipNetwork(caipNetwork);
|
|
1000
|
-
}
|
|
1001
|
-
});
|
|
1002
|
-
this.universalProvider.on('session_event', (callbackData) => {
|
|
1003
|
-
if (WcHelpersUtil.isSessionEventData(callbackData)) {
|
|
1004
|
-
const { name, data } = callbackData.params.event;
|
|
1005
|
-
if (name === 'accountsChanged' &&
|
|
1006
|
-
Array.isArray(data) &&
|
|
1007
|
-
CoreHelperUtil.isCaipAddress(data[0])) {
|
|
1008
|
-
this.syncAccount(ParseUtil.parseCaipAddress(data[0]));
|
|
1009
|
-
}
|
|
1010
|
-
}
|
|
1011
|
-
});
|
|
1012
|
-
}
|
|
1013
|
-
}
|
|
1014
|
-
createUniversalProvider() {
|
|
1015
|
-
if (!this.universalProviderInitPromise &&
|
|
1016
|
-
CoreHelperUtil.isClient() &&
|
|
1017
|
-
this.options?.projectId) {
|
|
1018
|
-
this.universalProviderInitPromise = this.initializeUniversalAdapter();
|
|
1019
|
-
}
|
|
1020
|
-
return this.universalProviderInitPromise;
|
|
1021
|
-
}
|
|
1022
|
-
async getUniversalProvider() {
|
|
1023
|
-
if (!this.universalProvider) {
|
|
1024
|
-
try {
|
|
1025
|
-
await this.createUniversalProvider();
|
|
1026
|
-
}
|
|
1027
|
-
catch (error) {
|
|
1028
|
-
throw new Error('AppKit:getUniversalProvider - Cannot create provider');
|
|
1029
|
-
}
|
|
1030
|
-
}
|
|
1031
|
-
return this.universalProvider;
|
|
1032
|
-
}
|
|
1033
|
-
// - Utils -------------------------------------------------------------------
|
|
1034
|
-
handleAlertError(error) {
|
|
1035
|
-
const matchedUniversalProviderError = Object.entries(ErrorUtil.UniversalProviderErrors).find(([, { message }]) => error.message.includes(message));
|
|
1036
|
-
const [errorKey, errorValue] = matchedUniversalProviderError ?? [];
|
|
1037
|
-
const { message, alertErrorKey } = errorValue ?? {};
|
|
1038
|
-
if (errorKey && message && !this.reportedAlertErrors[errorKey]) {
|
|
1039
|
-
const alertError = ErrorUtil.ALERT_ERRORS[alertErrorKey];
|
|
1040
|
-
if (alertError) {
|
|
1041
|
-
AlertController.open(alertError, 'error');
|
|
1042
|
-
this.reportedAlertErrors[errorKey] = true;
|
|
1043
|
-
}
|
|
1044
|
-
}
|
|
1045
|
-
}
|
|
1046
|
-
getAdapter(namespace) {
|
|
1047
|
-
if (!namespace) {
|
|
1048
|
-
return undefined;
|
|
1049
|
-
}
|
|
1050
|
-
return this.chainAdapters?.[namespace];
|
|
1051
|
-
}
|
|
1052
|
-
createAdapter(blueprint) {
|
|
1053
|
-
if (!blueprint) {
|
|
1054
|
-
return;
|
|
1055
|
-
}
|
|
1056
|
-
const namespace = blueprint.namespace;
|
|
1057
|
-
if (!namespace) {
|
|
1058
|
-
return;
|
|
1059
|
-
}
|
|
1060
|
-
this.createClients();
|
|
1061
|
-
const adapterBlueprint = blueprint;
|
|
1062
|
-
adapterBlueprint.namespace = namespace;
|
|
1063
|
-
adapterBlueprint.construct({
|
|
1064
|
-
namespace,
|
|
1065
|
-
projectId: this.options?.projectId,
|
|
1066
|
-
networks: this.caipNetworks
|
|
1067
|
-
});
|
|
1068
|
-
if (!this.chainNamespaces.includes(namespace)) {
|
|
1069
|
-
this.chainNamespaces.push(namespace);
|
|
1070
|
-
}
|
|
1071
|
-
if (this.chainAdapters) {
|
|
1072
|
-
this.chainAdapters[namespace] = adapterBlueprint;
|
|
1073
|
-
}
|
|
1074
|
-
}
|
|
1075
|
-
// -- Public -------------------------------------------------------------------
|
|
1076
|
-
async open(options) {
|
|
1077
|
-
await this.injectModalUi();
|
|
1078
|
-
if (options?.uri) {
|
|
1079
|
-
ConnectionController.setUri(options.uri);
|
|
1080
|
-
}
|
|
1081
|
-
if (options?.namespace) {
|
|
1082
|
-
ConnectorController.setFilterByNamespace(options.namespace);
|
|
1083
|
-
}
|
|
1084
|
-
await ModalController.open(options);
|
|
1085
|
-
}
|
|
1086
|
-
async close() {
|
|
1087
|
-
await this.injectModalUi();
|
|
1088
|
-
ModalController.close();
|
|
1089
|
-
}
|
|
1090
|
-
setLoading(loading) {
|
|
1091
|
-
ModalController.setLoading(loading);
|
|
1092
|
-
}
|
|
1093
|
-
async disconnect() {
|
|
1094
|
-
await ConnectionController.disconnect();
|
|
1095
|
-
}
|
|
1096
|
-
// -- review these -------------------------------------------------------------------
|
|
1097
|
-
getError() {
|
|
1098
|
-
return '';
|
|
1099
|
-
}
|
|
1100
|
-
getChainId() {
|
|
1101
|
-
return ChainController.state.activeCaipNetwork?.id;
|
|
1102
|
-
}
|
|
1103
|
-
switchNetwork(appKitNetwork) {
|
|
1104
|
-
const network = this.caipNetworks?.find(n => n.id === appKitNetwork.id);
|
|
1105
|
-
if (!network) {
|
|
1106
|
-
AlertController.open(ErrorUtil.ALERT_ERRORS.SWITCH_NETWORK_NOT_FOUND, 'error');
|
|
1107
|
-
return;
|
|
1108
|
-
}
|
|
1109
|
-
ChainController.switchActiveNetwork(network);
|
|
1110
|
-
}
|
|
1111
|
-
getWalletProvider() {
|
|
1112
|
-
return ChainController.state.activeChain
|
|
1113
|
-
? ProviderUtil.state.providers[ChainController.state.activeChain]
|
|
1114
|
-
: null;
|
|
1115
|
-
}
|
|
1116
|
-
getWalletProviderType() {
|
|
1117
|
-
return ChainController.state.activeChain
|
|
1118
|
-
? ProviderUtil.state.providerIds[ChainController.state.activeChain]
|
|
1119
|
-
: null;
|
|
1120
|
-
}
|
|
1121
|
-
subscribeProviders(callback) {
|
|
1122
|
-
return ProviderUtil.subscribeProviders(callback);
|
|
1123
|
-
}
|
|
1124
|
-
getThemeMode() {
|
|
1125
|
-
return ThemeController.state.themeMode;
|
|
1126
|
-
}
|
|
1127
|
-
getThemeVariables() {
|
|
1128
|
-
return ThemeController.state.themeVariables;
|
|
1129
|
-
}
|
|
1130
|
-
setThemeMode(themeMode) {
|
|
1131
|
-
ThemeController.setThemeMode(themeMode);
|
|
1132
|
-
setColorTheme(ThemeController.state.themeMode);
|
|
1133
|
-
}
|
|
1134
|
-
setTermsConditionsUrl(termsConditionsUrl) {
|
|
1135
|
-
OptionsController.setTermsConditionsUrl(termsConditionsUrl);
|
|
1136
|
-
}
|
|
1137
|
-
setPrivacyPolicyUrl(privacyPolicyUrl) {
|
|
1138
|
-
OptionsController.setPrivacyPolicyUrl(privacyPolicyUrl);
|
|
1139
|
-
}
|
|
1140
|
-
setThemeVariables(themeVariables) {
|
|
1141
|
-
ThemeController.setThemeVariables(themeVariables);
|
|
1142
|
-
setThemeVariables(ThemeController.state.themeVariables);
|
|
1143
|
-
}
|
|
1144
|
-
subscribeTheme(callback) {
|
|
1145
|
-
return ThemeController.subscribe(callback);
|
|
1146
|
-
}
|
|
1147
|
-
getWalletInfo() {
|
|
1148
|
-
return AccountController.state.connectedWalletInfo;
|
|
1149
|
-
}
|
|
1150
|
-
subscribeAccount(callback) {
|
|
1151
|
-
function updateVal() {
|
|
1152
|
-
const authConnector = ConnectorController.getAuthConnector();
|
|
1153
|
-
callback({
|
|
1154
|
-
allAccounts: AccountController.state.allAccounts,
|
|
1155
|
-
caipAddress: ChainController.state.activeCaipAddress,
|
|
1156
|
-
address: CoreHelperUtil.getPlainAddress(ChainController.state.activeCaipAddress),
|
|
1157
|
-
isConnected: Boolean(ChainController.state.activeCaipAddress),
|
|
1158
|
-
status: AccountController.state.status,
|
|
1159
|
-
embeddedWalletInfo: authConnector
|
|
1160
|
-
? {
|
|
1161
|
-
user: AccountController.state.user,
|
|
1162
|
-
authProvider: AccountController.state.socialProvider || 'email',
|
|
1163
|
-
accountType: AccountController.state.preferredAccountType,
|
|
1164
|
-
isSmartAccountDeployed: Boolean(AccountController.state.smartAccountDeployed)
|
|
1165
|
-
}
|
|
1166
|
-
: undefined
|
|
1167
|
-
});
|
|
1168
|
-
}
|
|
1169
|
-
ChainController.subscribe(updateVal);
|
|
1170
|
-
AccountController.subscribe(updateVal);
|
|
1171
|
-
ConnectorController.subscribe(updateVal);
|
|
1172
|
-
}
|
|
1173
|
-
subscribeNetwork(callback) {
|
|
1174
|
-
return ChainController.subscribe(({ activeCaipNetwork }) => {
|
|
1175
|
-
callback({
|
|
1176
|
-
caipNetwork: activeCaipNetwork,
|
|
1177
|
-
chainId: activeCaipNetwork?.id,
|
|
1178
|
-
caipNetworkId: activeCaipNetwork?.caipNetworkId
|
|
1179
|
-
});
|
|
1180
|
-
});
|
|
1181
|
-
}
|
|
1182
|
-
subscribeWalletInfo(callback) {
|
|
1183
|
-
return AccountController.subscribeKey('connectedWalletInfo', callback);
|
|
1184
|
-
}
|
|
1185
|
-
subscribeShouldUpdateToAddress(callback) {
|
|
1186
|
-
AccountController.subscribeKey('shouldUpdateToAddress', callback);
|
|
1187
|
-
}
|
|
1188
|
-
subscribeCaipNetworkChange(callback) {
|
|
1189
|
-
ChainController.subscribeKey('activeCaipNetwork', callback);
|
|
1190
|
-
}
|
|
1191
|
-
getState() {
|
|
1192
|
-
return PublicStateController.state;
|
|
1193
|
-
}
|
|
1194
|
-
subscribeState(callback) {
|
|
1195
|
-
return PublicStateController.subscribe(callback);
|
|
1196
|
-
}
|
|
1197
|
-
showErrorMessage(message) {
|
|
1198
|
-
SnackController.showError(message);
|
|
1199
|
-
}
|
|
1200
|
-
showSuccessMessage(message) {
|
|
1201
|
-
SnackController.showSuccess(message);
|
|
1202
|
-
}
|
|
1203
|
-
getEvent() {
|
|
1204
|
-
return { ...EventsController.state };
|
|
1205
|
-
}
|
|
1206
|
-
subscribeEvents(callback) {
|
|
1207
|
-
return EventsController.subscribe(callback);
|
|
1208
|
-
}
|
|
1209
|
-
replace(route) {
|
|
1210
|
-
RouterController.replace(route);
|
|
1211
|
-
}
|
|
1212
|
-
redirect(route) {
|
|
1213
|
-
RouterController.push(route);
|
|
1214
|
-
}
|
|
1215
|
-
popTransactionStack(cancel) {
|
|
1216
|
-
RouterController.popTransactionStack(cancel);
|
|
1217
|
-
}
|
|
1218
|
-
isOpen() {
|
|
1219
|
-
return ModalController.state.open;
|
|
1220
|
-
}
|
|
1221
|
-
isTransactionStackEmpty() {
|
|
1222
|
-
return RouterController.state.transactionStack.length === 0;
|
|
1223
|
-
}
|
|
1224
|
-
isTransactionShouldReplaceView() {
|
|
1225
|
-
return RouterController.state.transactionStack[RouterController.state.transactionStack.length - 1]?.replace;
|
|
1226
|
-
}
|
|
1227
|
-
static getInstance() {
|
|
1228
|
-
return this.instance;
|
|
1229
|
-
}
|
|
1230
|
-
updateFeatures(newFeatures) {
|
|
1231
|
-
OptionsController.setFeatures(newFeatures);
|
|
1232
|
-
}
|
|
1233
|
-
updateOptions(newOptions) {
|
|
1234
|
-
const currentOptions = OptionsController.state || {};
|
|
1235
|
-
const updatedOptions = { ...currentOptions, ...newOptions };
|
|
1236
|
-
OptionsController.setOptions(updatedOptions);
|
|
1237
|
-
}
|
|
1238
|
-
setConnectMethodsOrder(connectMethodsOrder) {
|
|
1239
|
-
OptionsController.setConnectMethodsOrder(connectMethodsOrder);
|
|
1240
|
-
}
|
|
1241
|
-
setWalletFeaturesOrder(walletFeaturesOrder) {
|
|
1242
|
-
OptionsController.setWalletFeaturesOrder(walletFeaturesOrder);
|
|
1243
|
-
}
|
|
1244
|
-
setCollapseWallets(collapseWallets) {
|
|
1245
|
-
OptionsController.setCollapseWallets(collapseWallets);
|
|
1246
|
-
}
|
|
1247
|
-
setSocialsOrder(socialsOrder) {
|
|
1248
|
-
OptionsController.setSocialsOrder(socialsOrder);
|
|
1249
|
-
}
|
|
1250
|
-
getConnectMethodsOrder() {
|
|
1251
|
-
return WalletUtil.getConnectOrderMethod(OptionsController.state.features, ConnectorController.getConnectors());
|
|
1252
|
-
}
|
|
1253
|
-
/**
|
|
1254
|
-
* Removes an adapter from the AppKit.
|
|
1255
|
-
* @param namespace - The namespace of the adapter to remove.
|
|
1256
|
-
*/
|
|
1257
|
-
removeAdapter(namespace) {
|
|
1258
|
-
const isConnected = this.getIsConnectedState();
|
|
1259
|
-
const adapter = this.getAdapter(namespace);
|
|
1260
|
-
if (!adapter || !this.chainAdapters || isConnected) {
|
|
1261
|
-
return;
|
|
1262
|
-
}
|
|
1263
|
-
const newCaipNetworks = this.caipNetworks?.filter(network => network.chainNamespace !== namespace);
|
|
1264
|
-
ChainController.removeAdapter(namespace);
|
|
1265
|
-
ConnectorController.removeAdapter(namespace);
|
|
1266
|
-
this.chainNamespaces = this.chainNamespaces.filter(n => n !== namespace);
|
|
1267
|
-
this.caipNetworks = newCaipNetworks;
|
|
1268
|
-
adapter.removeAllEventListeners();
|
|
1269
|
-
Reflect.deleteProperty(this.chainAdapters, namespace);
|
|
1270
|
-
}
|
|
1271
|
-
/**
|
|
1272
|
-
* Adds an adapter to the AppKit.
|
|
1273
|
-
* @param adapter - The adapter instance.
|
|
1274
|
-
* @param networks - The list of networks that this adapter supports / uses.
|
|
1275
|
-
*/
|
|
1276
|
-
addAdapter(adapter, networks) {
|
|
1277
|
-
const namespace = adapter.namespace;
|
|
1278
|
-
if (!this.connectionControllerClient || !this.networkControllerClient) {
|
|
1279
|
-
return;
|
|
1280
|
-
}
|
|
1281
|
-
if (!this.chainAdapters || !namespace) {
|
|
1282
|
-
return;
|
|
1283
|
-
}
|
|
1284
|
-
const extendedAdapterNetworks = this.extendCaipNetworks({ ...this.options, networks });
|
|
1285
|
-
this.caipNetworks = [...(this.caipNetworks || []), ...extendedAdapterNetworks];
|
|
1286
|
-
this.createAdapter(adapter);
|
|
1287
|
-
this.initChainAdapter(namespace);
|
|
1288
|
-
ChainController.addAdapter(adapter, {
|
|
1289
|
-
connectionControllerClient: this.connectionControllerClient,
|
|
1290
|
-
networkControllerClient: this.networkControllerClient
|
|
1291
|
-
}, extendedAdapterNetworks);
|
|
1292
|
-
}
|
|
1293
|
-
/**
|
|
1294
|
-
* Adds a network to an existing adapter in AppKit.
|
|
1295
|
-
* @param namespace - The chain namespace to add the network to (e.g. 'eip155', 'solana')
|
|
1296
|
-
* @param network - The network configuration to add
|
|
1297
|
-
* @throws Error if adapter for namespace doesn't exist
|
|
1298
|
-
*/
|
|
1299
|
-
addNetwork(namespace, network) {
|
|
1300
|
-
if (this.chainAdapters && !this.chainAdapters[namespace]) {
|
|
1301
|
-
throw new Error(`Adapter for namespace ${namespace} doesn't exist`);
|
|
1302
|
-
}
|
|
1303
|
-
const extendedNetwork = this.extendCaipNetwork(network, this.options);
|
|
1304
|
-
ChainController.addNetwork(extendedNetwork);
|
|
1305
|
-
if (this.caipNetworks && !this.caipNetworks?.find(n => n.id === extendedNetwork.id)) {
|
|
1306
|
-
this.caipNetworks.push(extendedNetwork);
|
|
1307
|
-
}
|
|
1308
|
-
}
|
|
1309
|
-
/**
|
|
1310
|
-
* Removes a network from an existing adapter in AppKit.
|
|
1311
|
-
* @param namespace - The chain namespace the network belongs to
|
|
1312
|
-
* @param networkId - The network ID to remove
|
|
1313
|
-
* @throws Error if adapter for namespace doesn't exist or if removing last network
|
|
1314
|
-
*/
|
|
1315
|
-
removeNetwork(namespace, networkId) {
|
|
1316
|
-
if (this.chainAdapters && !this.chainAdapters[namespace]) {
|
|
1317
|
-
throw new Error(`Adapter for namespace ${namespace} doesn't exist`);
|
|
1318
|
-
}
|
|
1319
|
-
const networkToRemove = this.caipNetworks?.find(n => n.id === networkId);
|
|
1320
|
-
if (!networkToRemove) {
|
|
1321
|
-
throw new Error(`Network with ID ${networkId} not found`);
|
|
1322
|
-
}
|
|
1323
|
-
if (!this.caipNetworks) {
|
|
1324
|
-
return;
|
|
1325
|
-
}
|
|
1326
|
-
const remainingNetworks = this.caipNetworks.filter(n => n.chainNamespace === namespace && n.id !== networkId);
|
|
1327
|
-
if (!remainingNetworks?.length) {
|
|
1328
|
-
throw new Error('Cannot remove last network for a namespace');
|
|
1329
|
-
}
|
|
1330
|
-
ChainController.removeNetwork(namespace, networkId);
|
|
1331
|
-
this.caipNetworks = [...remainingNetworks];
|
|
1332
|
-
}
|
|
1333
|
-
}
|
|
1334
|
-
//# sourceMappingURL=core.js.map
|