@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.
@@ -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, UserInfo } from "@toruslabs/base-controllers";
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
- private blockTracker;
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<void>;
27
+ refetchEtherscanTx(address?: string): Promise<unknown[]>;
42
28
  fetchEtherscanTx<T>(parameters: {
43
29
  selectedAddress: string;
44
- selectedNetwork: string;
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": "4.11.0",
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": "^4.11.0",
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": "ece0fb5e61005a05f63eb85dd6a76a0c6e108089",
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
- private blockTracker: PollingBlockTracker;
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: string;
90
- jwtToken?: string;
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
- if (!rehydrate)
116
- await this.storeUserLogin({
117
- verifier: aggregateVerifier || verifier,
118
- verifierId,
119
- options: { calledFromEmbed, rehydrate },
120
- address,
121
- web3AuthClientId,
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
- // const selectedNetwork = this.getProviderConfig().rpcTarget;
219
- // if (ETHERSCAN_SUPPORTED_NETWORKS.has(selectedNetwork)) {
220
- // const data = await this.fetchEtherscanTx({ selectedAddress, selectedNetwork });
221
- // if (data.length) {
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; selectedNetwork: string }): Promise<T[]> {
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));