@toruslabs/ethereum-controllers 8.4.7 → 8.5.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.
@@ -16,7 +16,8 @@ class NetworkController extends baseControllers.BaseController {
16
16
  constructor({
17
17
  config,
18
18
  state,
19
- idleTimeTracker
19
+ idleTimeTracker,
20
+ analytics
20
21
  }) {
21
22
  super({
22
23
  config,
@@ -30,6 +31,7 @@ class NetworkController extends baseControllers.BaseController {
30
31
  _defineProperty(this, "blockTracker", null);
31
32
  _defineProperty(this, "baseProviderHandlers", void 0);
32
33
  _defineProperty(this, "idleTimeTracker", void 0);
34
+ _defineProperty(this, "analytics", void 0);
33
35
  this.defaultState = {
34
36
  chainId: "loading",
35
37
  properties: {
@@ -37,6 +39,7 @@ class NetworkController extends baseControllers.BaseController {
37
39
  },
38
40
  providerConfig: constants.SUPPORTED_NETWORKS[constants.MAINNET_CHAIN_ID]
39
41
  };
42
+ this.analytics = analytics;
40
43
  // when a new network is set,
41
44
  // we set to loading first and
42
45
  // then when connection succeeds,
@@ -147,8 +150,12 @@ class NetworkController extends baseControllers.BaseController {
147
150
  networkMiddleware,
148
151
  blockTracker
149
152
  }) {
150
- const ethereumMiddleware = createEthereumMiddleware.createEthereumMiddleware(this.baseProviderHandlers);
153
+ const ethereumMiddleware = createEthereumMiddleware.createEthereumMiddleware(this.baseProviderHandlers, this.analytics);
151
154
  const engine = new auth.JRPCEngine();
155
+ engine.push(baseControllers.createAnalyticsMiddleware({
156
+ analytics: this.analytics,
157
+ providerConfig: this.getProviderConfig()
158
+ }));
152
159
  engine.push(ethereumMiddleware);
153
160
  engine.push(networkMiddleware);
154
161
  const provider = auth.providerFromEngine(engine);
@@ -183,7 +190,7 @@ class NetworkController extends baseControllers.BaseController {
183
190
  this.blockTracker = blockTracker;
184
191
  }
185
192
  configureStandardProvider(providerConfig) {
186
- const networkClient = createJsonRpcClient.createJsonRpcClient(providerConfig, this.config, this.idleTimeTracker);
193
+ const networkClient = createJsonRpcClient.createJsonRpcClient(providerConfig, this.config, this.idleTimeTracker, this.analytics);
187
194
  log.info("networkClient", networkClient);
188
195
  this.setNetworkClient(networkClient);
189
196
  }
@@ -48,7 +48,7 @@ function createProcessEstimateUserOperationGasMiddleware({
48
48
  const {
49
49
  method
50
50
  } = request;
51
- if (method !== constants.METHOD_TYPES.ETH_ESTIMATE_USER_OPERATION_GAS) return next();
51
+ if (method !== constants.METHOD_TYPES.ETH_ESTIMATE_AA_TRANSACTION_GAS) return next();
52
52
  if (!processEstimateUserOperationGas) throw new Error("WalletMiddleware - opts.processEstimateUserOperationGas not provided");
53
53
  response.result = await processEstimateUserOperationGas(request.params, request);
54
54
  });
@@ -295,15 +295,33 @@ function createRequestAccountsMiddleware({
295
295
  */
296
296
  function createAAMiddleware({
297
297
  bundlerUrl,
298
- paymasterUrl
298
+ paymasterUrl,
299
+ analytics
299
300
  }) {
300
301
  // forward request to bundler/paymaster
301
302
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
302
303
  const middlewares = [];
304
+ // NOTE: bundler/paymaster rpc only accept number as request id, we need to handle that here if client doesn't handle request id themselves
305
+ const idNumberRemapMiddleware = (req, res, next, _end) => {
306
+ // skip if not bundler/paymaster methods
307
+ if (!constants.BUNDLER_METHOD_TYPES.includes(req.method) && !constants.PAYMASTER_METHOD_TYPES.includes(req.method)) {
308
+ return next();
309
+ }
310
+ const originalId = req.id;
311
+ const newId = Math.floor(Math.random() * 1000000);
312
+ req.id = newId;
313
+ res.id = newId;
314
+ next(done => {
315
+ req.id = originalId;
316
+ res.id = originalId;
317
+ done();
318
+ });
319
+ };
303
320
  const bundlerFetchMiddleware = baseControllers.createFetchMiddleware({
304
- rpcTarget: bundlerUrl
321
+ rpcTarget: bundlerUrl,
322
+ analytics
305
323
  });
306
- // NOTE: bundler/paymaster rpc only accept number as request id, we might need to handle that here if client doesn't handle request id themselves
324
+ middlewares.push(idNumberRemapMiddleware);
307
325
  middlewares.push((request, response, next, end) => {
308
326
  if (!constants.BUNDLER_METHOD_TYPES.includes(request.method)) {
309
327
  return next();
@@ -312,7 +330,8 @@ function createAAMiddleware({
312
330
  });
313
331
  if (paymasterUrl) {
314
332
  const paymasterFetchMiddleware = baseControllers.createFetchMiddleware({
315
- rpcTarget: paymasterUrl
333
+ rpcTarget: paymasterUrl,
334
+ analytics
316
335
  });
317
336
  middlewares.push((request, response, next, end) => {
318
337
  if (!constants.PAYMASTER_METHOD_TYPES.includes(request.method)) {
@@ -323,7 +342,7 @@ function createAAMiddleware({
323
342
  }
324
343
  return auth.mergeMiddleware(middlewares);
325
344
  }
326
- function createEthereumMiddleware(providerHandlers) {
345
+ function createEthereumMiddleware(providerHandlers, analytics) {
327
346
  const {
328
347
  requestAccounts,
329
348
  getAccounts,
@@ -377,7 +396,8 @@ function createEthereumMiddleware(providerHandlers) {
377
396
  if (aaConfig) {
378
397
  middlewares.push(createAAMiddleware({
379
398
  bundlerUrl: aaConfig.bundlerUrl,
380
- paymasterUrl: aaConfig.paymasterUrl
399
+ paymasterUrl: aaConfig.paymasterUrl,
400
+ analytics
381
401
  }));
382
402
  }
383
403
  return auth.mergeMiddleware(middlewares);
@@ -29,13 +29,14 @@ function createProviderConfigMiddleware(providerConfig) {
29
29
  return next();
30
30
  };
31
31
  }
32
- function createJsonRpcClient(providerConfig, networkConfig, idleTimeTracker) {
32
+ function createJsonRpcClient(providerConfig, networkConfig, idleTimeTracker, analytics) {
33
33
  const {
34
34
  chainId,
35
35
  rpcTarget
36
36
  } = providerConfig;
37
37
  const fetchMiddleware = baseControllers.createFetchMiddleware({
38
- rpcTarget
38
+ rpcTarget,
39
+ analytics
39
40
  });
40
41
  const blockProvider = auth.providerFromMiddleware(fetchMiddleware);
41
42
  const blockTracker = new PollingBlockTracker.PollingBlockTracker({
@@ -1,4 +1,4 @@
1
- import { BaseController, IdleTimeTracker, INetworkController } from "@toruslabs/base-controllers";
1
+ import { type Analytics, BaseController, IdleTimeTracker, INetworkController } from "@toruslabs/base-controllers";
2
2
  import { SafeEventEmitterProvider } from "@web3auth/auth";
3
3
  import { PollingBlockTracker } from "../Block/PollingBlockTracker";
4
4
  import { EthereumNetworkConfig, EthereumNetworkState, EthereumProviderConfig, NetworkControllerEvents } from "../utils/interfaces";
@@ -12,10 +12,12 @@ export declare class NetworkController extends BaseController<EthereumNetworkCon
12
12
  private blockTracker?;
13
13
  private baseProviderHandlers;
14
14
  private idleTimeTracker;
15
- constructor({ config, state, idleTimeTracker, }: {
15
+ private analytics?;
16
+ constructor({ config, state, idleTimeTracker, analytics, }: {
16
17
  config?: Partial<EthereumNetworkConfig>;
17
18
  state?: Partial<EthereumNetworkState>;
18
19
  idleTimeTracker: IdleTimeTracker;
20
+ analytics: Analytics;
19
21
  });
20
22
  getNetworkIdentifier(): string;
21
23
  getNetworkRPCUrl(): string;
@@ -1,4 +1,4 @@
1
- import { InPageWalletProviderState, MessageParams, SwitchChainMessageParams, UserRequestApprovalParams } from "@toruslabs/base-controllers";
1
+ import { type Analytics, InPageWalletProviderState, MessageParams, SwitchChainMessageParams, UserRequestApprovalParams } from "@toruslabs/base-controllers";
2
2
  import { JRPCEngineEndCallback, JRPCEngineNextCallback, JRPCMiddleware, JRPCRequest, JRPCResponse } from "@web3auth/auth";
3
3
  import { AddChainMessageParams, BlockParams, EthereumTransactionMeta, TransactionParams, TransactionRPCMeta, TypedMessageParams, UserOperationGas } from "../utils/interfaces";
4
4
  export interface IProviderHandlers {
@@ -76,8 +76,9 @@ export declare function createRequestAccountsMiddleware({ requestAccounts, }: {
76
76
  /**
77
77
  * Middleware to handle bundler/paymaster rpc method
78
78
  */
79
- export declare function createAAMiddleware({ bundlerUrl, paymasterUrl }: {
79
+ export declare function createAAMiddleware({ bundlerUrl, paymasterUrl, analytics, }: {
80
80
  bundlerUrl: string;
81
81
  paymasterUrl?: string;
82
+ analytics?: Analytics;
82
83
  }): JRPCMiddleware<unknown, unknown>;
83
- export declare function createEthereumMiddleware(providerHandlers: IProviderHandlers): JRPCMiddleware<unknown, unknown>;
84
+ export declare function createEthereumMiddleware(providerHandlers: IProviderHandlers, analytics?: Analytics): JRPCMiddleware<unknown, unknown>;
@@ -1,10 +1,10 @@
1
- import { IdleTimeTracker, ProviderConfig } from "@toruslabs/base-controllers";
1
+ import { type Analytics, IdleTimeTracker, ProviderConfig } from "@toruslabs/base-controllers";
2
2
  import { JRPCMiddleware } from "@web3auth/auth";
3
3
  import { PollingBlockTracker } from "../Block/PollingBlockTracker";
4
4
  import { EthereumNetworkConfig } from "../utils/interfaces";
5
5
  export declare function createChainIdMiddleware(chainId: string): JRPCMiddleware<unknown, string>;
6
6
  export declare function createProviderConfigMiddleware(providerConfig: ProviderConfig): JRPCMiddleware<unknown, ProviderConfig>;
7
- export declare function createJsonRpcClient(providerConfig: ProviderConfig, networkConfig: EthereumNetworkConfig, idleTimeTracker?: IdleTimeTracker): {
7
+ export declare function createJsonRpcClient(providerConfig: ProviderConfig, networkConfig: EthereumNetworkConfig, idleTimeTracker?: IdleTimeTracker, analytics?: Analytics): {
8
8
  networkMiddleware: JRPCMiddleware<unknown, unknown>;
9
9
  blockTracker: PollingBlockTracker;
10
10
  };
@@ -31,6 +31,7 @@ export declare const METHOD_TYPES: {
31
31
  readonly GET_ACCOUNTS: "eth_accounts";
32
32
  readonly ETH_TRANSACTION: "eth_sendTransaction";
33
33
  readonly ETH_SIGN_TRANSACTION: "eth_signTransaction";
34
+ readonly ETH_ESTIMATE_AA_TRANSACTION_GAS: "eth_estimateAATransactionGas";
34
35
  readonly ETH_ESTIMATE_USER_OPERATION_GAS: "eth_estimateUserOperationGas";
35
36
  readonly ETH_GET_SUPPORTED_ENTRY_POINTS: "eth_supportedEntryPoints";
36
37
  readonly ETH_GET_USER_OPERATION: "eth_getUserOperationByHash";
@@ -231,6 +231,8 @@ const METHOD_TYPES = {
231
231
  GET_ACCOUNTS: "eth_accounts",
232
232
  ETH_TRANSACTION: "eth_sendTransaction",
233
233
  ETH_SIGN_TRANSACTION: "eth_signTransaction",
234
+ // In TransferToken UI of WS, we call this method via JRPC provider to get gas estimation for a user op. Renamed to avoid conflict with bundler's gas estimation method
235
+ ETH_ESTIMATE_AA_TRANSACTION_GAS: "eth_estimateAATransactionGas",
234
236
  // start bundler methods
235
237
  ETH_ESTIMATE_USER_OPERATION_GAS: "eth_estimateUserOperationGas",
236
238
  ETH_GET_SUPPORTED_ENTRY_POINTS: "eth_supportedEntryPoints",
@@ -1,7 +1,7 @@
1
1
  import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
2
2
  import _objectSpread from '@babel/runtime/helpers/objectSpread2';
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
- import { BaseController, createSwappableProxy, createEventEmitterProxy } from '@toruslabs/base-controllers';
4
+ import { BaseController, createAnalyticsMiddleware, createSwappableProxy, createEventEmitterProxy } from '@toruslabs/base-controllers';
5
5
  import { JRPCEngine, providerFromEngine } from '@web3auth/auth';
6
6
  import { Mutex } from 'async-mutex';
7
7
  import log from 'loglevel';
@@ -14,7 +14,8 @@ class NetworkController extends BaseController {
14
14
  constructor({
15
15
  config,
16
16
  state,
17
- idleTimeTracker
17
+ idleTimeTracker,
18
+ analytics
18
19
  }) {
19
20
  super({
20
21
  config,
@@ -28,6 +29,7 @@ class NetworkController extends BaseController {
28
29
  _defineProperty(this, "blockTracker", null);
29
30
  _defineProperty(this, "baseProviderHandlers", void 0);
30
31
  _defineProperty(this, "idleTimeTracker", void 0);
32
+ _defineProperty(this, "analytics", void 0);
31
33
  this.defaultState = {
32
34
  chainId: "loading",
33
35
  properties: {
@@ -35,6 +37,7 @@ class NetworkController extends BaseController {
35
37
  },
36
38
  providerConfig: SUPPORTED_NETWORKS[MAINNET_CHAIN_ID]
37
39
  };
40
+ this.analytics = analytics;
38
41
 
39
42
  // when a new network is set,
40
43
  // we set to loading first and
@@ -148,8 +151,12 @@ class NetworkController extends BaseController {
148
151
  networkMiddleware,
149
152
  blockTracker
150
153
  }) {
151
- const ethereumMiddleware = createEthereumMiddleware(this.baseProviderHandlers);
154
+ const ethereumMiddleware = createEthereumMiddleware(this.baseProviderHandlers, this.analytics);
152
155
  const engine = new JRPCEngine();
156
+ engine.push(createAnalyticsMiddleware({
157
+ analytics: this.analytics,
158
+ providerConfig: this.getProviderConfig()
159
+ }));
153
160
  engine.push(ethereumMiddleware);
154
161
  engine.push(networkMiddleware);
155
162
  const provider = providerFromEngine(engine);
@@ -185,7 +192,7 @@ class NetworkController extends BaseController {
185
192
  this.blockTracker = blockTracker;
186
193
  }
187
194
  configureStandardProvider(providerConfig) {
188
- const networkClient = createJsonRpcClient(providerConfig, this.config, this.idleTimeTracker);
195
+ const networkClient = createJsonRpcClient(providerConfig, this.config, this.idleTimeTracker, this.analytics);
189
196
  log.info("networkClient", networkClient);
190
197
  this.setNetworkClient(networkClient);
191
198
  }
@@ -46,7 +46,7 @@ function createProcessEstimateUserOperationGasMiddleware({
46
46
  const {
47
47
  method
48
48
  } = request;
49
- if (method !== METHOD_TYPES.ETH_ESTIMATE_USER_OPERATION_GAS) return next();
49
+ if (method !== METHOD_TYPES.ETH_ESTIMATE_AA_TRANSACTION_GAS) return next();
50
50
  if (!processEstimateUserOperationGas) throw new Error("WalletMiddleware - opts.processEstimateUserOperationGas not provided");
51
51
  response.result = await processEstimateUserOperationGas(request.params, request);
52
52
  });
@@ -294,15 +294,34 @@ function createRequestAccountsMiddleware({
294
294
  */
295
295
  function createAAMiddleware({
296
296
  bundlerUrl,
297
- paymasterUrl
297
+ paymasterUrl,
298
+ analytics
298
299
  }) {
299
300
  // forward request to bundler/paymaster
300
301
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
301
302
  const middlewares = [];
303
+
304
+ // NOTE: bundler/paymaster rpc only accept number as request id, we need to handle that here if client doesn't handle request id themselves
305
+ const idNumberRemapMiddleware = (req, res, next, _end) => {
306
+ // skip if not bundler/paymaster methods
307
+ if (!BUNDLER_METHOD_TYPES.includes(req.method) && !PAYMASTER_METHOD_TYPES.includes(req.method)) {
308
+ return next();
309
+ }
310
+ const originalId = req.id;
311
+ const newId = Math.floor(Math.random() * 1000000);
312
+ req.id = newId;
313
+ res.id = newId;
314
+ next(done => {
315
+ req.id = originalId;
316
+ res.id = originalId;
317
+ done();
318
+ });
319
+ };
302
320
  const bundlerFetchMiddleware = createFetchMiddleware({
303
- rpcTarget: bundlerUrl
321
+ rpcTarget: bundlerUrl,
322
+ analytics
304
323
  });
305
- // NOTE: bundler/paymaster rpc only accept number as request id, we might need to handle that here if client doesn't handle request id themselves
324
+ middlewares.push(idNumberRemapMiddleware);
306
325
  middlewares.push((request, response, next, end) => {
307
326
  if (!BUNDLER_METHOD_TYPES.includes(request.method)) {
308
327
  return next();
@@ -311,7 +330,8 @@ function createAAMiddleware({
311
330
  });
312
331
  if (paymasterUrl) {
313
332
  const paymasterFetchMiddleware = createFetchMiddleware({
314
- rpcTarget: paymasterUrl
333
+ rpcTarget: paymasterUrl,
334
+ analytics
315
335
  });
316
336
  middlewares.push((request, response, next, end) => {
317
337
  if (!PAYMASTER_METHOD_TYPES.includes(request.method)) {
@@ -322,7 +342,7 @@ function createAAMiddleware({
322
342
  }
323
343
  return mergeMiddleware(middlewares);
324
344
  }
325
- function createEthereumMiddleware(providerHandlers) {
345
+ function createEthereumMiddleware(providerHandlers, analytics) {
326
346
  const {
327
347
  requestAccounts,
328
348
  getAccounts,
@@ -376,7 +396,8 @@ function createEthereumMiddleware(providerHandlers) {
376
396
  if (aaConfig) {
377
397
  middlewares.push(createAAMiddleware({
378
398
  bundlerUrl: aaConfig.bundlerUrl,
379
- paymasterUrl: aaConfig.paymasterUrl
399
+ paymasterUrl: aaConfig.paymasterUrl,
400
+ analytics
380
401
  }));
381
402
  }
382
403
  return mergeMiddleware(middlewares);
@@ -27,13 +27,14 @@ function createProviderConfigMiddleware(providerConfig) {
27
27
  return next();
28
28
  };
29
29
  }
30
- function createJsonRpcClient(providerConfig, networkConfig, idleTimeTracker) {
30
+ function createJsonRpcClient(providerConfig, networkConfig, idleTimeTracker, analytics) {
31
31
  const {
32
32
  chainId,
33
33
  rpcTarget
34
34
  } = providerConfig;
35
35
  const fetchMiddleware = createFetchMiddleware({
36
- rpcTarget
36
+ rpcTarget,
37
+ analytics
37
38
  });
38
39
  const blockProvider = providerFromMiddleware(fetchMiddleware);
39
40
  const blockTracker = new PollingBlockTracker({
@@ -229,6 +229,8 @@ const METHOD_TYPES = {
229
229
  GET_ACCOUNTS: "eth_accounts",
230
230
  ETH_TRANSACTION: "eth_sendTransaction",
231
231
  ETH_SIGN_TRANSACTION: "eth_signTransaction",
232
+ // In TransferToken UI of WS, we call this method via JRPC provider to get gas estimation for a user op. Renamed to avoid conflict with bundler's gas estimation method
233
+ ETH_ESTIMATE_AA_TRANSACTION_GAS: "eth_estimateAATransactionGas",
232
234
  // start bundler methods
233
235
  ETH_ESTIMATE_USER_OPERATION_GAS: "eth_estimateUserOperationGas",
234
236
  ETH_GET_SUPPORTED_ENTRY_POINTS: "eth_supportedEntryPoints",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toruslabs/ethereum-controllers",
3
- "version": "8.4.7",
3
+ "version": "8.5.0",
4
4
  "homepage": "https://github.com/torusresearch/controllers#readme",
5
5
  "license": "ISC",
6
6
  "sideEffects": false,
@@ -21,7 +21,7 @@
21
21
  "dependencies": {
22
22
  "@ethereumjs/util": "^9.1.0",
23
23
  "@metamask/delegation-toolkit": "^0.11.0",
24
- "@toruslabs/base-controllers": "^8.4.6",
24
+ "@toruslabs/base-controllers": "^8.5.0",
25
25
  "@toruslabs/http-helpers": "^8.1.1",
26
26
  "@web3auth/auth": "^10.4.1",
27
27
  "async-mutex": "^0.5.0",
@@ -63,7 +63,7 @@
63
63
  "publishConfig": {
64
64
  "access": "public"
65
65
  },
66
- "gitHead": "8356258913e258284e86d13db0994d50e3ee0322",
66
+ "gitHead": "8337c32aaff845838d7ca69da92b94ca991e4df9",
67
67
  "devDependencies": {
68
68
  "@typechain/ethers-v6": "^0.5.1",
69
69
  "typechain": "^8.3.2"