@exodus/web3-ethereum 11.8.0 → 11.10.0
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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BaseProvider } from '@exodus/web3-provider';
|
|
2
2
|
import type { ChainId, Deps, JsonRpcCallback, JsonRpcRequest, JsonRpcResult, ProviderConnectInfo, RequestArguments } from './types.js';
|
|
3
|
-
interface EthereumProviderEvents {
|
|
3
|
+
export interface EthereumProviderEvents {
|
|
4
4
|
accountsChanged(accounts: string[]): void;
|
|
5
5
|
chainChanged(chainId: ChainId): void;
|
|
6
6
|
connect(providerConnectInfo: ProviderConnectInfo): void;
|
|
@@ -13,10 +13,26 @@ export declare class EthereumProvider extends BaseProvider<EthereumProviderEvent
|
|
|
13
13
|
protected _callRpcMethod<Params, Response>(method: string, params: Params): Promise<Response>;
|
|
14
14
|
isConnected(): boolean;
|
|
15
15
|
request: (args: RequestArguments) => Promise<unknown>;
|
|
16
|
+
/**
|
|
17
|
+
* Experimental API
|
|
18
|
+
*/
|
|
19
|
+
_metamask: {
|
|
20
|
+
/**
|
|
21
|
+
* Determines if MetaMask is unlocked by the user.
|
|
22
|
+
*
|
|
23
|
+
* @returns Promise resolving to true if MetaMask is currently unlocked.
|
|
24
|
+
*/
|
|
25
|
+
isUnlocked: () => Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Make a batch RPC request.
|
|
28
|
+
*
|
|
29
|
+
* @param requests - The RPC requests to make.
|
|
30
|
+
*/
|
|
31
|
+
requestBatch: (requests: RequestArguments[]) => Promise<unknown[]>;
|
|
32
|
+
};
|
|
16
33
|
get chainId(): ChainId | null;
|
|
17
34
|
get selectedAddress(): string | null;
|
|
18
35
|
enable: () => Promise<string[]>;
|
|
19
36
|
send: (methodOrPayload: string | JsonRpcRequest, paramsOrCallback: unknown[] | JsonRpcCallback) => Promise<void | JsonRpcResult>;
|
|
20
37
|
sendAsync: (payload: JsonRpcRequest, callback: JsonRpcCallback) => void;
|
|
21
38
|
}
|
|
22
|
-
export {};
|
package/lib/provider/provider.js
CHANGED
|
@@ -190,6 +190,37 @@ export class EthereumProvider extends BaseProvider {
|
|
|
190
190
|
}
|
|
191
191
|
return this._callRpcMethod(method, revisedParams);
|
|
192
192
|
};
|
|
193
|
+
/**
|
|
194
|
+
* Experimental API
|
|
195
|
+
*/
|
|
196
|
+
_metamask = {
|
|
197
|
+
/**
|
|
198
|
+
* Determines if MetaMask is unlocked by the user.
|
|
199
|
+
*
|
|
200
|
+
* @returns Promise resolving to true if MetaMask is currently unlocked.
|
|
201
|
+
*/
|
|
202
|
+
// TODO: improve this, atm heurestic if we have accounts, assume unlocked
|
|
203
|
+
isUnlocked: async () => Array.isArray(this.#accounts) && this.#accounts.length > 0,
|
|
204
|
+
/**
|
|
205
|
+
* Make a batch RPC request.
|
|
206
|
+
*
|
|
207
|
+
* @param requests - The RPC requests to make.
|
|
208
|
+
*/
|
|
209
|
+
requestBatch: async (requests) => {
|
|
210
|
+
if (!Array.isArray(requests)) {
|
|
211
|
+
throw ethErrors.rpc.invalidRequest({
|
|
212
|
+
message: 'Batch requests must be made with an array of request objects.',
|
|
213
|
+
data: requests,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
const results = [];
|
|
217
|
+
// for-loop to ensure handling requests one-by-one.
|
|
218
|
+
for (const request of requests) {
|
|
219
|
+
results.push(await this.request(request));
|
|
220
|
+
}
|
|
221
|
+
return results;
|
|
222
|
+
},
|
|
223
|
+
};
|
|
193
224
|
/*
|
|
194
225
|
* Legacy API.
|
|
195
226
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createEthereumProviderProxy } from './proxy.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createEthereumProviderProxy } from './proxy.js';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EthereumProvider } from '../provider/provider.js';
|
|
2
|
+
import type { ManagementProvider, WalletProviderManager } from '@exodus/web3-management';
|
|
3
|
+
export declare type EthereumProviderProxyDeps = {
|
|
4
|
+
isWalletNameFlag: string;
|
|
5
|
+
impersonateOtherWallets?: boolean;
|
|
6
|
+
getDefaultChainId: () => number;
|
|
7
|
+
walletProviderManager: WalletProviderManager;
|
|
8
|
+
getManagementProvider: () => Promise<ManagementProvider>;
|
|
9
|
+
getEthereumProvider: () => Promise<EthereumProvider>;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* createEthereumProviderProxy creates a light weight proxy that
|
|
13
|
+
* gets intercepts all calls to the real provider. By default only
|
|
14
|
+
* the proxy will be loaded and it will instantiate the real provider
|
|
15
|
+
* once it's being used in order to reduce the memory load of our provider
|
|
16
|
+
* whenever injected inside a website that doesn't use web3.
|
|
17
|
+
* @param param0
|
|
18
|
+
* @returns
|
|
19
|
+
*/
|
|
20
|
+
export declare const createEthereumProviderProxy: ({ isWalletNameFlag, impersonateOtherWallets, getDefaultChainId, walletProviderManager, getManagementProvider, getEthereumProvider, }: EthereumProviderProxyDeps) => import("@exodus/web3-provider").BaseProvider<string | symbol>;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { createProviderProxy } from '@exodus/web3-provider/proxy';
|
|
2
|
+
const ETHEREUM_INIT_METHODS_SET = new Set([
|
|
3
|
+
'accountsChangedSet',
|
|
4
|
+
'autoRefreshOnNetworkChange',
|
|
5
|
+
'chainId',
|
|
6
|
+
'enable',
|
|
7
|
+
'isConnected',
|
|
8
|
+
'isUnlocked',
|
|
9
|
+
'networkChangedSet',
|
|
10
|
+
'request',
|
|
11
|
+
'selectedAddress',
|
|
12
|
+
'send',
|
|
13
|
+
'sendAsync',
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* createEthereumProviderProxy creates a light weight proxy that
|
|
17
|
+
* gets intercepts all calls to the real provider. By default only
|
|
18
|
+
* the proxy will be loaded and it will instantiate the real provider
|
|
19
|
+
* once it's being used in order to reduce the memory load of our provider
|
|
20
|
+
* whenever injected inside a website that doesn't use web3.
|
|
21
|
+
* @param param0
|
|
22
|
+
* @returns
|
|
23
|
+
*/
|
|
24
|
+
export const createEthereumProviderProxy = ({ isWalletNameFlag, impersonateOtherWallets, getDefaultChainId, walletProviderManager, getManagementProvider, getEthereumProvider, }) => {
|
|
25
|
+
let listeners = [];
|
|
26
|
+
let provider = Object.assign(Object.create(null), {
|
|
27
|
+
[isWalletNameFlag]: true,
|
|
28
|
+
});
|
|
29
|
+
const cacheListener = (event, listener) => {
|
|
30
|
+
listeners.push([event, listener]);
|
|
31
|
+
return provider;
|
|
32
|
+
};
|
|
33
|
+
const clearCachedListeners = () => {
|
|
34
|
+
listeners = [];
|
|
35
|
+
return provider;
|
|
36
|
+
};
|
|
37
|
+
const setNameFlags = () => {
|
|
38
|
+
if (impersonateOtherWallets) {
|
|
39
|
+
// For compatibility with MetaMask's Ethereum Provider.
|
|
40
|
+
// See: https://docs.metamask.io/guide/ethereum-provider.html#properties.
|
|
41
|
+
provider.isMetaMask = true;
|
|
42
|
+
// For Phantom compatiblity
|
|
43
|
+
provider.isPhantom = true;
|
|
44
|
+
}
|
|
45
|
+
// Dynamically set the wallet name flag to true
|
|
46
|
+
provider.defineFlag?.(isWalletNameFlag);
|
|
47
|
+
};
|
|
48
|
+
const restoreListeners = (provider) => {
|
|
49
|
+
listeners.forEach(([event, listener]) => provider.on(event, listener));
|
|
50
|
+
listeners = [];
|
|
51
|
+
};
|
|
52
|
+
provider.on = cacheListener;
|
|
53
|
+
provider.addListener = cacheListener;
|
|
54
|
+
provider.removeAllListeners = clearCachedListeners;
|
|
55
|
+
setNameFlags();
|
|
56
|
+
const initProvider = async () => {
|
|
57
|
+
provider = await getEthereumProvider();
|
|
58
|
+
setNameFlags();
|
|
59
|
+
restoreListeners(provider);
|
|
60
|
+
};
|
|
61
|
+
const getActiveChainId = () => provider.request({ method: 'eth_chainId' });
|
|
62
|
+
const get = (_, property) => {
|
|
63
|
+
const contextualFunction = (property, shouldInitProvider = false) => {
|
|
64
|
+
if (provider[property]?.constructor.name === 'Function') {
|
|
65
|
+
return provider[property].bind(provider);
|
|
66
|
+
}
|
|
67
|
+
// Handle async calls
|
|
68
|
+
return async (...args) => {
|
|
69
|
+
if (shouldInitProvider) {
|
|
70
|
+
await initProvider();
|
|
71
|
+
}
|
|
72
|
+
if (property === 'enable' ||
|
|
73
|
+
args[0]?.method === 'eth_requestAccounts') {
|
|
74
|
+
const managementProvider = await getManagementProvider();
|
|
75
|
+
const chainId = (await getActiveChainId()) || (await getDefaultChainId());
|
|
76
|
+
await managementProvider.askUserToChooseWallet(`evm:${chainId}`);
|
|
77
|
+
const defaultWalletProvider = walletProviderManager.getDefaultWalletProvider();
|
|
78
|
+
// Check if the user selected a different wallet when connecting to Exodus wallet.
|
|
79
|
+
if (defaultWalletProvider) {
|
|
80
|
+
restoreListeners(defaultWalletProvider.provider);
|
|
81
|
+
return defaultWalletProvider.provider[property].bind(defaultWalletProvider.provider)(...args);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return provider[property].bind(provider)(...args);
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
const defaultWalletProvider = walletProviderManager.getDefaultWalletProvider();
|
|
88
|
+
if (defaultWalletProvider) {
|
|
89
|
+
restoreListeners(defaultWalletProvider.provider);
|
|
90
|
+
if (typeof defaultWalletProvider.provider[property] === 'function') {
|
|
91
|
+
return defaultWalletProvider.provider[property].bind(defaultWalletProvider.provider);
|
|
92
|
+
}
|
|
93
|
+
return defaultWalletProvider.provider[property];
|
|
94
|
+
}
|
|
95
|
+
if (provider[property] !== undefined) {
|
|
96
|
+
if (typeof provider[property] === 'function') {
|
|
97
|
+
return contextualFunction(property);
|
|
98
|
+
}
|
|
99
|
+
return provider[property];
|
|
100
|
+
}
|
|
101
|
+
if (ETHEREUM_INIT_METHODS_SET.has(property)) {
|
|
102
|
+
return contextualFunction(property, true);
|
|
103
|
+
}
|
|
104
|
+
if (property === '_metamask') {
|
|
105
|
+
return {
|
|
106
|
+
isUnlocked: async (...args) => {
|
|
107
|
+
if (!provider._metamask) {
|
|
108
|
+
await initProvider();
|
|
109
|
+
}
|
|
110
|
+
return provider._metamask.isUnlocked(...args);
|
|
111
|
+
},
|
|
112
|
+
requestBatch: async (...args) => {
|
|
113
|
+
if (!provider._metamask) {
|
|
114
|
+
await initProvider();
|
|
115
|
+
}
|
|
116
|
+
return provider._metamask.requestBatch(...args);
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const set = (target, prop, value) => {
|
|
122
|
+
// Allow setting these specific properties as the ecosystem relies on that.
|
|
123
|
+
if (['autoRefreshOnNetworkChange', 'removeListener'].includes(prop)) {
|
|
124
|
+
target[prop] = value;
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
return false;
|
|
128
|
+
};
|
|
129
|
+
const has = (_, property) => ETHEREUM_INIT_METHODS_SET.has(property);
|
|
130
|
+
return createProviderProxy(provider, { get, set, has });
|
|
131
|
+
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exodus/web3-ethereum",
|
|
3
3
|
"description": "Apps connectivity library for EVM-compatible chains.",
|
|
4
|
-
"version": "11.
|
|
4
|
+
"version": "11.10.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"module": "lib/index.js",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
".": "./lib/index.js",
|
|
11
11
|
"./package.json": "./package.json",
|
|
12
12
|
"./provider": "./lib/provider/index.js",
|
|
13
|
+
"./provider-proxy": "./lib/provider-proxy/index.js",
|
|
13
14
|
"./rpc": "./lib/rpc-handlers/index.js",
|
|
14
15
|
"./wallet-standard": "./lib/wallet-standard/index.js",
|
|
15
16
|
"./eip6963": "./lib/eip6963/index.js"
|
|
@@ -35,7 +36,7 @@
|
|
|
35
36
|
"@exodus/ethereum-api": "^6.3.33",
|
|
36
37
|
"@exodus/web3-constants": "^1.29.0",
|
|
37
38
|
"@exodus/web3-ethereum-utils": "^3.22.0",
|
|
38
|
-
"@exodus/web3-provider": "^3.
|
|
39
|
+
"@exodus/web3-provider": "^3.13.0",
|
|
39
40
|
"@exodus/web3-rpc-handlers": "^2.19.0",
|
|
40
41
|
"@exodus/web3-utils": "^1.42.0",
|
|
41
42
|
"bn.js": "^5.2.0",
|
|
@@ -45,6 +46,7 @@
|
|
|
45
46
|
"@exodus/assets": "^8.0.95",
|
|
46
47
|
"@exodus/json-rpc": "^1.11.0",
|
|
47
48
|
"@exodus/schemasafe": "^1.0.0",
|
|
49
|
+
"@exodus/web3-management": "0.27.0",
|
|
48
50
|
"@exodus/web3-types": "0.0.0",
|
|
49
51
|
"@exodus/web3-validation": "^1.37.1",
|
|
50
52
|
"@wallet-standard/base": "^1.0.1"
|
|
@@ -52,5 +54,5 @@
|
|
|
52
54
|
"peerDependencies": {
|
|
53
55
|
"@exodus/assets": "^8.0.95"
|
|
54
56
|
},
|
|
55
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "c88e13bae6cc31906b513d7e17c1b2a989e4768d"
|
|
56
58
|
}
|