@toruslabs/ethereum-controllers 4.11.0 → 5.0.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.
- package/dist/ethereumControllers.cjs.js +48 -30
- package/dist/ethereumControllers.cjs.js.map +1 -1
- package/dist/ethereumControllers.esm.js +50 -24
- package/dist/ethereumControllers.esm.js.map +1 -1
- package/dist/ethereumControllers.umd.min.js +1 -1
- package/dist/ethereumControllers.umd.min.js.LICENSE.txt +2 -0
- package/dist/ethereumControllers.umd.min.js.map +1 -1
- package/dist/types/Account/AccountTrackerController.d.ts +3 -0
- package/dist/types/Preferences/PreferencesController.d.ts +5 -19
- package/package.json +3 -3
- package/src/Account/AccountTrackerController.ts +19 -6
- package/src/Preferences/PreferencesController.ts +25 -40
|
@@ -26,6 +26,9 @@ declare class AccountTrackerController extends BaseController<AccountTrackerConf
|
|
|
26
26
|
private getIdentities;
|
|
27
27
|
private getCurrentChainId;
|
|
28
28
|
constructor({ config, state, provider, blockTracker, getIdentities, onPreferencesStateChange, getCurrentChainId, }: AccountTrackerControllerOptions);
|
|
29
|
+
blockTrackerListener(block: EthereumBlock): void;
|
|
30
|
+
startPolling(): void;
|
|
31
|
+
stopPolling(): void;
|
|
29
32
|
syncAccounts(): boolean;
|
|
30
33
|
refresh(): Promise<void>;
|
|
31
34
|
private _updateAccounts;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { BasePreferencesController, CustomNft, CustomToken, IPreferencesController, PreferencesConfig, PreferencesState
|
|
1
|
+
import { BasePreferencesController, CustomNft, CustomToken, InitPreferencesParams, IPreferencesController, PreferencesConfig, PreferencesState } from "@toruslabs/base-controllers";
|
|
2
2
|
import { SafeEventEmitterProvider } from "@toruslabs/openlogin-jrpc";
|
|
3
|
-
import PollingBlockTracker from "../Block/PollingBlockTracker";
|
|
4
3
|
import KeyringController from "../Keyring/KeyringController";
|
|
5
4
|
import NetworkController from "../Network/NetworkController";
|
|
6
5
|
import type { AddChainMessageParams, CustomNetworkPayload, CustomNftInfo, CustomTokenInfo, ExtendedAddressPreferences, TransactionPayload } from "../utils/interfaces";
|
|
@@ -8,7 +7,6 @@ interface IPreferencesControllerOptions {
|
|
|
8
7
|
config?: Partial<PreferencesConfig> & Pick<PreferencesConfig, "api" | "commonApiHost" | "signInPrefix">;
|
|
9
8
|
state?: Partial<PreferencesState<ExtendedAddressPreferences>>;
|
|
10
9
|
provider: SafeEventEmitterProvider;
|
|
11
|
-
blockTracker?: PollingBlockTracker;
|
|
12
10
|
signAuthMessage?: KeyringController["signAuthMessage"];
|
|
13
11
|
getProviderConfig?: NetworkController["getProviderConfig"];
|
|
14
12
|
setProviderConfig?: NetworkController["setProviderConfig"];
|
|
@@ -19,29 +17,17 @@ export default class PreferencesController extends BasePreferencesController<Ext
|
|
|
19
17
|
private getProviderConfig;
|
|
20
18
|
private setProviderConfig;
|
|
21
19
|
private provider;
|
|
22
|
-
|
|
23
|
-
constructor({ config, state, provider, blockTracker, signAuthMessage, getProviderConfig, setProviderConfig }: IPreferencesControllerOptions);
|
|
20
|
+
constructor({ config, state, provider, signAuthMessage, getProviderConfig, setProviderConfig }: IPreferencesControllerOptions);
|
|
24
21
|
poll(interval?: number): Promise<void>;
|
|
25
|
-
initPreferences(params:
|
|
26
|
-
address: string;
|
|
27
|
-
jwtToken?: string;
|
|
28
|
-
calledFromEmbed?: boolean;
|
|
29
|
-
userInfo?: UserInfo;
|
|
30
|
-
rehydrate?: boolean;
|
|
31
|
-
locale?: string;
|
|
32
|
-
type?: string;
|
|
33
|
-
signatures?: string[];
|
|
34
|
-
network?: string;
|
|
35
|
-
web3AuthClientId?: string;
|
|
36
|
-
}): Promise<void>;
|
|
22
|
+
initPreferences(params: InitPreferencesParams): Promise<void>;
|
|
37
23
|
getSelectedAddress(): string;
|
|
38
24
|
sync(address: string): Promise<boolean>;
|
|
39
25
|
patchNewTx(tx: TransactionPayload, address: string): Promise<void>;
|
|
40
26
|
recalculatePastTx(address?: string): void;
|
|
41
|
-
refetchEtherscanTx(address?: string): Promise<
|
|
27
|
+
refetchEtherscanTx(address?: string): Promise<unknown[]>;
|
|
42
28
|
fetchEtherscanTx<T>(parameters: {
|
|
43
29
|
selectedAddress: string;
|
|
44
|
-
|
|
30
|
+
chainId: string;
|
|
45
31
|
}): Promise<T[]>;
|
|
46
32
|
getEtherScanTokens(address: string, chainId: string): Promise<CustomTokenInfo[]>;
|
|
47
33
|
getSimpleHashNfts(address: string, chainId: string): Promise<CustomNftInfo[]>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toruslabs/ethereum-controllers",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"homepage": "https://github.com/torusresearch/controllers#readme",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"main": "dist/ethereumControllers.cjs.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"@ethereumjs/util": "^9.0.1",
|
|
25
25
|
"@metamask/eth-sig-util": "^7.0.1",
|
|
26
26
|
"@metamask/rpc-errors": "^6.1.0",
|
|
27
|
-
"@toruslabs/base-controllers": "^
|
|
27
|
+
"@toruslabs/base-controllers": "^5.0.0",
|
|
28
28
|
"@toruslabs/http-helpers": "^6.0.0",
|
|
29
29
|
"@toruslabs/openlogin-jrpc": "^6.1.0",
|
|
30
30
|
"async-mutex": "^0.4.0",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"publishConfig": {
|
|
65
65
|
"access": "public"
|
|
66
66
|
},
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "f63427503cff9c9a08240da584ebee008f1d7527",
|
|
68
68
|
"devDependencies": {
|
|
69
69
|
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
|
|
70
70
|
"hardhat": "^2.19.3"
|
|
@@ -65,12 +65,6 @@ class AccountTrackerController
|
|
|
65
65
|
this.blockTracker = blockTracker;
|
|
66
66
|
this.ethersProvider = new BrowserProvider(this.provider, "any");
|
|
67
67
|
|
|
68
|
-
// Initiate block tracker internal tracking.
|
|
69
|
-
this.blockTracker.on("latest", (block: EthereumBlock) => {
|
|
70
|
-
this.configure({ _currentBlock: block });
|
|
71
|
-
this.refresh();
|
|
72
|
-
});
|
|
73
|
-
|
|
74
68
|
this.getIdentities = getIdentities;
|
|
75
69
|
this.getCurrentChainId = getCurrentChainId;
|
|
76
70
|
|
|
@@ -79,6 +73,25 @@ class AccountTrackerController
|
|
|
79
73
|
const refreshNeeded = this.syncAccounts();
|
|
80
74
|
if (refreshNeeded) this.refresh();
|
|
81
75
|
});
|
|
76
|
+
this.blockTrackerListener = this.blockTrackerListener.bind(this);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
blockTrackerListener(block: EthereumBlock) {
|
|
80
|
+
this.configure({ _currentBlock: block });
|
|
81
|
+
this.refresh();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
startPolling(): void {
|
|
85
|
+
this.stopPolling();
|
|
86
|
+
// Initiate block tracker internal tracking.
|
|
87
|
+
if (Object.keys(this.state.accounts).length > 0) {
|
|
88
|
+
// Adding this listener on block tracker triggers it to start polling.
|
|
89
|
+
this.blockTracker.on("latest", this.blockTrackerListener);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
stopPolling(): void {
|
|
94
|
+
this.blockTracker.removeListener("latest", this.blockTrackerListener);
|
|
82
95
|
}
|
|
83
96
|
|
|
84
97
|
syncAccounts(): boolean {
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { stripHexPrefix } from "@ethereumjs/util";
|
|
2
2
|
import {
|
|
3
|
+
ACCOUNT_TYPE,
|
|
3
4
|
BasePreferencesController,
|
|
4
5
|
CustomNft,
|
|
5
6
|
CustomToken,
|
|
7
|
+
InitPreferencesParams,
|
|
6
8
|
IPreferencesController,
|
|
7
9
|
PreferencesConfig,
|
|
8
10
|
PreferencesState,
|
|
9
11
|
TransactionStatus,
|
|
10
|
-
UserInfo,
|
|
11
12
|
} from "@toruslabs/base-controllers";
|
|
12
13
|
import { get, patch, post, remove } from "@toruslabs/http-helpers";
|
|
13
14
|
import { SafeEventEmitterProvider } from "@toruslabs/openlogin-jrpc";
|
|
14
15
|
import { Mutex } from "async-mutex";
|
|
15
16
|
import log from "loglevel";
|
|
16
17
|
|
|
17
|
-
import PollingBlockTracker from "../Block/PollingBlockTracker";
|
|
18
18
|
import KeyringController from "../Keyring/KeyringController";
|
|
19
19
|
import NetworkController from "../Network/NetworkController";
|
|
20
|
-
import { SUPPORTED_NETWORKS } from "../utils/constants";
|
|
20
|
+
import { ETHERSCAN_SUPPORTED_CHAINS, SUPPORTED_NETWORKS } from "../utils/constants";
|
|
21
21
|
import { formatDate, formatPastTx, formatTime, getEthTxStatus } from "../utils/helpers";
|
|
22
22
|
import type {
|
|
23
23
|
AddChainMessageParams,
|
|
@@ -37,8 +37,6 @@ interface IPreferencesControllerOptions {
|
|
|
37
37
|
config?: Partial<PreferencesConfig> & Pick<PreferencesConfig, "api" | "commonApiHost" | "signInPrefix">;
|
|
38
38
|
state?: Partial<PreferencesState<ExtendedAddressPreferences>>;
|
|
39
39
|
provider: SafeEventEmitterProvider;
|
|
40
|
-
// TODO: Require later
|
|
41
|
-
blockTracker?: PollingBlockTracker;
|
|
42
40
|
signAuthMessage?: KeyringController["signAuthMessage"];
|
|
43
41
|
getProviderConfig?: NetworkController["getProviderConfig"];
|
|
44
42
|
setProviderConfig?: NetworkController["setProviderConfig"];
|
|
@@ -58,15 +56,11 @@ export default class PreferencesController
|
|
|
58
56
|
|
|
59
57
|
private provider: SafeEventEmitterProvider;
|
|
60
58
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
constructor({ config, state, provider, blockTracker, signAuthMessage, getProviderConfig, setProviderConfig }: IPreferencesControllerOptions) {
|
|
59
|
+
constructor({ config, state, provider, signAuthMessage, getProviderConfig, setProviderConfig }: IPreferencesControllerOptions) {
|
|
64
60
|
super({ config, state, defaultPreferences: { formattedPastTransactions: [], fetchedPastTx: [], paymentTx: [] }, signAuthMessage });
|
|
65
61
|
this.provider = provider;
|
|
66
62
|
this.getProviderConfig = getProviderConfig;
|
|
67
63
|
this.setProviderConfig = setProviderConfig;
|
|
68
|
-
this.blockTracker = blockTracker;
|
|
69
|
-
log.info(this.blockTracker);
|
|
70
64
|
}
|
|
71
65
|
|
|
72
66
|
public async poll(interval?: number): Promise<void> {
|
|
@@ -85,20 +79,9 @@ export default class PreferencesController
|
|
|
85
79
|
}, this.config.pollInterval);
|
|
86
80
|
}
|
|
87
81
|
|
|
88
|
-
public async initPreferences(params: {
|
|
89
|
-
address
|
|
90
|
-
jwtToken
|
|
91
|
-
calledFromEmbed?: boolean;
|
|
92
|
-
userInfo?: UserInfo;
|
|
93
|
-
rehydrate?: boolean;
|
|
94
|
-
locale?: string;
|
|
95
|
-
type?: string;
|
|
96
|
-
signatures?: string[];
|
|
97
|
-
network?: string;
|
|
98
|
-
web3AuthClientId?: string;
|
|
99
|
-
}): Promise<void> {
|
|
100
|
-
const { address, jwtToken, calledFromEmbed, userInfo, rehydrate, locale = "en-US", type, signatures, network, web3AuthClientId } = params;
|
|
101
|
-
await super.init(address, userInfo, jwtToken, { type, email: userInfo.email, signatures, network });
|
|
82
|
+
public async initPreferences(params: InitPreferencesParams): Promise<void> {
|
|
83
|
+
const { address, jwtToken, calledFromEmbed, userInfo, rehydrate, locale = "en-US", type, signatures, web3AuthClientId, web3AuthNetwork } = params;
|
|
84
|
+
await super.init({ address, userInfo, idToken: jwtToken, type, metadata: { email: userInfo.email, signatures } });
|
|
102
85
|
const { aggregateVerifier, verifier, verifierId } = userInfo || {};
|
|
103
86
|
const userExists = await this.sync(address);
|
|
104
87
|
if (!userExists) {
|
|
@@ -110,16 +93,18 @@ export default class PreferencesController
|
|
|
110
93
|
verifierId,
|
|
111
94
|
locale,
|
|
112
95
|
address,
|
|
96
|
+
type,
|
|
97
|
+
web3AuthNetwork,
|
|
113
98
|
});
|
|
114
99
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
100
|
+
await this.storeUserLogin({
|
|
101
|
+
verifier: aggregateVerifier || verifier,
|
|
102
|
+
verifierId,
|
|
103
|
+
options: { calledFromEmbed, rehydrate },
|
|
104
|
+
address,
|
|
105
|
+
web3AuthClientId,
|
|
106
|
+
web3AuthNetwork,
|
|
107
|
+
});
|
|
123
108
|
}
|
|
124
109
|
|
|
125
110
|
public getSelectedAddress(): string {
|
|
@@ -140,6 +125,7 @@ export default class PreferencesController
|
|
|
140
125
|
customNetworks,
|
|
141
126
|
customTokens,
|
|
142
127
|
customNfts,
|
|
128
|
+
account_type: accountType,
|
|
143
129
|
} = user || {};
|
|
144
130
|
|
|
145
131
|
// update latest data in state.
|
|
@@ -153,6 +139,7 @@ export default class PreferencesController
|
|
|
153
139
|
customTokens,
|
|
154
140
|
customNfts,
|
|
155
141
|
customNetworks,
|
|
142
|
+
accountType: accountType as ACCOUNT_TYPE,
|
|
156
143
|
},
|
|
157
144
|
address
|
|
158
145
|
);
|
|
@@ -215,18 +202,16 @@ export default class PreferencesController
|
|
|
215
202
|
public async refetchEtherscanTx(address?: string) {
|
|
216
203
|
const selectedAddress = address || this.state.selectedAddress;
|
|
217
204
|
if (this.getAddressState(selectedAddress)?.jwtToken) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
// this.emit("addEtherscanTransactions", data, selectedNetwork);
|
|
223
|
-
// }
|
|
224
|
-
// }
|
|
205
|
+
const { chainId } = this.getProviderConfig();
|
|
206
|
+
if (ETHERSCAN_SUPPORTED_CHAINS.includes(chainId)) {
|
|
207
|
+
return this.fetchEtherscanTx({ selectedAddress, chainId: this.getProviderConfig().chainId });
|
|
208
|
+
}
|
|
225
209
|
}
|
|
226
210
|
}
|
|
227
211
|
|
|
228
|
-
async fetchEtherscanTx<T>(parameters: { selectedAddress: string;
|
|
212
|
+
async fetchEtherscanTx<T>(parameters: { selectedAddress: string; chainId: string }): Promise<T[]> {
|
|
229
213
|
try {
|
|
214
|
+
// TODO: rewrite this api to use chainId
|
|
230
215
|
const url = new URL(`${this.config.api}/etherscan`);
|
|
231
216
|
Object.keys(parameters).forEach((key) => url.searchParams.append(key, parameters[key as keyof typeof parameters]));
|
|
232
217
|
const response = await get<{ success: boolean; data: T[] }>(url.href, this.headers(parameters.selectedAddress));
|