@toruslabs/ethereum-controllers 9.0.0 → 9.2.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.
Files changed (50) hide show
  1. package/dist/lib.cjs/AccountAbstraction/AccountAbstractionController.js +18 -20
  2. package/dist/lib.cjs/Eip5792/walletGetCallsStatus.js +2 -2
  3. package/dist/lib.cjs/Eip7702/eip7702Utils.js +3 -3
  4. package/dist/lib.cjs/Gas/GasFeeController.js +2 -3
  5. package/dist/lib.cjs/Keyring/KeyringController.js +8 -10
  6. package/dist/lib.cjs/Message/utils.js +3 -6
  7. package/dist/lib.cjs/Network/NetworkController.js +7 -9
  8. package/dist/lib.cjs/Network/createEthereumMiddleware.js +373 -285
  9. package/dist/lib.cjs/Network/createJsonRpcClient.js +22 -21
  10. package/dist/lib.cjs/Preferences/PreferencesController.js +2 -2
  11. package/dist/lib.cjs/Transaction/TransactionController.js +13 -13
  12. package/dist/lib.cjs/Transaction/TransactionGasUtil.js +8 -8
  13. package/dist/lib.cjs/Transaction/TransactionUtils.js +20 -20
  14. package/dist/lib.cjs/index.js +9 -0
  15. package/dist/lib.cjs/types/AccountAbstraction/AccountAbstractionController.d.ts +3 -3
  16. package/dist/lib.cjs/types/Eip5792/walletSendCalls.d.ts +1 -1
  17. package/dist/lib.cjs/types/Eip7702/walletUpgradeAccount.d.ts +1 -1
  18. package/dist/lib.cjs/types/Network/NetworkController.d.ts +1 -1
  19. package/dist/lib.cjs/types/Network/createEthereumMiddleware.d.ts +28 -90
  20. package/dist/lib.cjs/types/Network/createJsonRpcClient.d.ts +4 -4
  21. package/dist/lib.cjs/types/Network/index.d.ts +5 -0
  22. package/dist/lib.cjs/types/Network/interfaces.d.ts +58 -0
  23. package/dist/lib.cjs/types/index.d.ts +1 -3
  24. package/dist/lib.cjs/types/utils/eip5792Types.d.ts +1 -1
  25. package/dist/lib.cjs/types/utils/eip7702Types.d.ts +1 -1
  26. package/dist/lib.cjs/types/utils/interfaces.d.ts +2 -2
  27. package/dist/lib.cjs/utils/conversionUtils.js +2 -2
  28. package/dist/lib.cjs/utils/helpers.js +4 -4
  29. package/dist/lib.cjs/utils/transaction.js +2 -2
  30. package/dist/lib.esm/AccountAbstraction/AccountAbstractionController.js +19 -21
  31. package/dist/lib.esm/Eip5792/walletGetCallsStatus.js +2 -2
  32. package/dist/lib.esm/Eip7702/eip7702Utils.js +3 -3
  33. package/dist/lib.esm/Gas/GasFeeController.js +2 -3
  34. package/dist/lib.esm/Keyring/KeyringController.js +9 -11
  35. package/dist/lib.esm/Message/utils.js +4 -7
  36. package/dist/lib.esm/Network/NetworkController.js +8 -10
  37. package/dist/lib.esm/Network/createEthereumMiddleware.js +387 -290
  38. package/dist/lib.esm/Network/createJsonRpcClient.js +23 -22
  39. package/dist/lib.esm/Preferences/PreferencesController.js +2 -2
  40. package/dist/lib.esm/Transaction/TransactionController.js +13 -13
  41. package/dist/lib.esm/Transaction/TransactionGasUtil.js +8 -8
  42. package/dist/lib.esm/Transaction/TransactionUtils.js +20 -20
  43. package/dist/lib.esm/index.js +4 -3
  44. package/dist/lib.esm/utils/conversionUtils.js +2 -2
  45. package/dist/lib.esm/utils/helpers.js +3 -3
  46. package/dist/lib.esm/utils/transaction.js +2 -2
  47. package/package.json +5 -5
  48. package/dist/lib.cjs/types/utils/hex.d.ts +0 -9
  49. package/dist/lib.cjs/utils/hex.js +0 -23
  50. package/dist/lib.esm/utils/hex.js +0 -21
@@ -8,25 +8,23 @@ var log = require('loglevel');
8
8
  var viem = require('viem');
9
9
  var accountAbstraction = require('viem/account-abstraction');
10
10
 
11
- const eoaInterceptorMiddleware = eoaAddress => (req, res, next, end) => {
12
- req.isAAProviderRequest = true;
13
- if (req.method === "eth_accounts" || req.method === "eth_requestAccounts") {
14
- res.result = [eoaAddress];
15
- end();
16
- return;
11
+ const eoaInterceptorMiddleware = eoaAddress => async ({
12
+ request,
13
+ next,
14
+ context
15
+ }) => {
16
+ context.set("isAAProviderRequest", true);
17
+ if (request.method === "eth_accounts" || request.method === "eth_requestAccounts") {
18
+ return [eoaAddress];
17
19
  }
18
- next();
20
+ return next();
19
21
  };
20
22
  function eoaProviderAsMiddleware(provider) {
21
- return async (req, res, _next, end) => {
22
- // send request to provider
23
- try {
24
- const providerRes = await provider.request(req);
25
- res.result = providerRes;
26
- return end();
27
- } catch (error) {
28
- return end(error);
29
- }
23
+ return async ({
24
+ request
25
+ }) => {
26
+ const result = await provider.request(request);
27
+ return result;
30
28
  };
31
29
  }
32
30
  class AccountAbstractionController extends baseControllers.BaseController {
@@ -92,10 +90,10 @@ class AccountAbstractionController extends baseControllers.BaseController {
92
90
  transport: viem.http(providerConfig.rpcTarget)
93
91
  });
94
92
  // viem wallet client using json-rpc account from eoaProvider
95
- const aaEngine = new auth.JRPCEngine();
96
- aaEngine.push(eoaInterceptorMiddleware(eoaAddress));
97
- aaEngine.push(eoaProviderAsMiddleware(eoaProvider));
98
- const provider = auth.providerFromEngine(aaEngine);
93
+ const aaEngine = auth.JRPCEngineV2.create({
94
+ middleware: [eoaInterceptorMiddleware(eoaAddress), eoaProviderAsMiddleware(eoaProvider)]
95
+ });
96
+ const provider = auth.providerFromEngineV2(aaEngine);
99
97
  // need to hoist the account address https://viem.sh/docs/clients/wallet#optional-hoist-the-account
100
98
  const eoaWalletClient = viem.createWalletClient({
101
99
  account: eoaAddress,
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  var baseControllers = require('@toruslabs/base-controllers');
4
+ var metadataHelpers = require('@toruslabs/metadata-helpers');
4
5
  var auth = require('@web3auth/auth');
5
6
  var eip5792Types = require('../utils/eip5792Types.js');
6
- var hex = require('../utils/hex.js');
7
7
 
8
8
  /**
9
9
  * Maps a TransactionStatus to an EIP-5792 GetCallsStatusCode.
@@ -65,7 +65,7 @@ function walletGetCallsStatus(request, getTransactionByBatchId) {
65
65
  return {
66
66
  status: mapTransactionStatusToEip5792Status(batchTx.status),
67
67
  id: batchId,
68
- chainId: hex.addHexPrefix(batchTx.chainId),
68
+ chainId: metadataHelpers.add0x(batchTx.chainId),
69
69
  atomic: true,
70
70
  receipts: batchTx.txReceipt ? [batchTx.txReceipt] : []
71
71
  };
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
+ var metadataHelpers = require('@toruslabs/metadata-helpers');
3
4
  var viem = require('viem');
4
5
  var abis = require('../utils/abis.js');
5
6
  var constants = require('../utils/constants.js');
6
7
  var eip7702Types = require('../utils/eip7702Types.js');
7
- var hex = require('../utils/hex.js');
8
8
 
9
9
  /**
10
10
  * The MetaMask EIP-7702 Stateless Delegator contract address.
@@ -14,10 +14,10 @@ const MetaMask_EIP7702_Stateless_Delegator = "0x63c0c19a282a1B52b07dD5a65b58948A
14
14
  async function getDelegationAddress(walletAddress, chainId, getEthCode) {
15
15
  // query eth_getCode
16
16
  const code = await getEthCode(walletAddress, chainId);
17
- const normalizedCode = code ? hex.addHexPrefix(code).toLowerCase() : "0x0";
17
+ const normalizedCode = code ? metadataHelpers.add0x(code).toLowerCase() : "0x0";
18
18
  const hasDelegation = normalizedCode.length === 48 && normalizedCode.startsWith(eip7702Types.EIP_7702_PREFIX);
19
19
  if (hasDelegation) {
20
- const delegationAddress = hex.addHexPrefix(normalizedCode.slice(eip7702Types.EIP_7702_PREFIX.length));
20
+ const delegationAddress = metadataHelpers.add0x(normalizedCode.slice(eip7702Types.EIP_7702_PREFIX.length));
21
21
  return delegationAddress;
22
22
  }
23
23
  return null;
@@ -2,10 +2,9 @@
2
2
 
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
4
  var baseControllers = require('@toruslabs/base-controllers');
5
+ var metadataHelpers = require('@toruslabs/metadata-helpers');
5
6
  var log = require('loglevel');
6
- var viem = require('viem');
7
7
  var constants = require('../utils/constants.js');
8
- var hex = require('../utils/hex.js');
9
8
  var gasUtil = require('./gasUtil.js');
10
9
 
11
10
  const GAS_FEE_API = "https://mock-gas-server.herokuapp.com/";
@@ -120,7 +119,7 @@ class GasFeeController extends baseControllers.BaseController {
120
119
  const chainId = this.getNetworkIdentifier();
121
120
  if (chainId === "loading") return;
122
121
  let chainIdInt;
123
- if (typeof chainId === "string" && viem.isHex(hex.addHexPrefix(chainId))) {
122
+ if (metadataHelpers.isHexString(chainId)) {
124
123
  chainIdInt = Number.parseInt(chainId, 16);
125
124
  }
126
125
  try {
@@ -5,7 +5,6 @@ var baseControllers = require('@toruslabs/base-controllers');
5
5
  var metadataHelpers = require('@toruslabs/metadata-helpers');
6
6
  var viem$1 = require('viem');
7
7
  var accounts = require('viem/accounts');
8
- var hex = require('../utils/hex.js');
9
8
  var viem = require('../utils/viem.js');
10
9
 
11
10
  class KeyringController extends baseControllers.BaseKeyringController {
@@ -24,7 +23,7 @@ class KeyringController extends baseControllers.BaseKeyringController {
24
23
  }
25
24
  async signTransaction(tx, address) {
26
25
  const wallet = this._getWalletForAccount(address);
27
- const account = accounts.privateKeyToAccount(hex.addHexPrefix(wallet.privateKey));
26
+ const account = accounts.privateKeyToAccount(metadataHelpers.add0x(wallet.privateKey));
28
27
  const localTx = tx;
29
28
  const txToSign = viem.prepareViemTx(localTx);
30
29
  // NOTE: don't use account.signTransaction directly because it only return signed serialized transaction
@@ -44,7 +43,7 @@ class KeyringController extends baseControllers.BaseKeyringController {
44
43
  }
45
44
  async signEip7702Authorization(authorization, address) {
46
45
  const wallet = this._getWalletForAccount(address);
47
- const account = accounts.privateKeyToAccount(hex.addHexPrefix(wallet.privateKey));
46
+ const account = accounts.privateKeyToAccount(metadataHelpers.add0x(wallet.privateKey));
48
47
  // Convert hex strings to proper types for RLP encoding
49
48
  // EIP-7702 authorization tuple: [chain_id_decimal, address, nonce_decimal]
50
49
  const chainIdDecimal = parseInt(authorization.chainId, 16);
@@ -68,8 +67,8 @@ class KeyringController extends baseControllers.BaseKeyringController {
68
67
  }
69
68
  async importAccount(accountPrivateKey) {
70
69
  try {
71
- const hexPrivateKey = accountPrivateKey.padStart(64, "0");
72
- const account = accounts.privateKeyToAccount(hex.addHexPrefix(hexPrivateKey));
70
+ const hexPrivateKey = metadataHelpers.remove0x(accountPrivateKey).padStart(64, "0");
71
+ const account = accounts.privateKeyToAccount(metadataHelpers.add0x(hexPrivateKey));
73
72
  const publicKey = account.publicKey;
74
73
  const address = account.address;
75
74
  const existingWallet = this.state.wallets.find(w => w.address === address);
@@ -100,8 +99,7 @@ class KeyringController extends baseControllers.BaseKeyringController {
100
99
  }
101
100
  }
102
101
  getPrivateKeyBytes(privateKey) {
103
- const stripped = hex.stripHexPrefix(privateKey);
104
- return metadataHelpers.hexToBytes(stripped);
102
+ return metadataHelpers.hexToBytes(privateKey);
105
103
  }
106
104
  // For eth_sign, we need to sign arbitrary data:
107
105
  async signMessage(data, address) {
@@ -110,14 +108,14 @@ class KeyringController extends baseControllers.BaseKeyringController {
110
108
  }
111
109
  const wallet = this._getWalletForAccount(address);
112
110
  const privKey = this.getPrivateKeyBytes(wallet.privateKey);
113
- const payload = metadataHelpers.hexToBytes(hex.stripHexPrefix(data));
111
+ const payload = metadataHelpers.hexToBytes(data);
114
112
  const messageSig = baseControllers.ecsignature(payload, privKey);
115
113
  const sig = baseControllers.concatSig(messageSig.v, messageSig.r, messageSig.s);
116
114
  return sig;
117
115
  }
118
116
  async signPersonalMessage(data, address) {
119
117
  const wallet = this._getWalletForAccount(address);
120
- const account = accounts.privateKeyToAccount(hex.addHexPrefix(wallet.privateKey));
118
+ const account = accounts.privateKeyToAccount(metadataHelpers.add0x(wallet.privateKey));
121
119
  // we need to check if the data is hex or not
122
120
  // For historical reasons, you must submit the message to sign in hex-encoded UTF-8.
123
121
  // https://docs.metamask.io/wallet/how-to/sign-data/#use-personal_sign
@@ -131,7 +129,7 @@ class KeyringController extends baseControllers.BaseKeyringController {
131
129
  // personal_signTypedData, signs data along with the schema
132
130
  async signTypedData(typedData, address) {
133
131
  const wallet = this._getWalletForAccount(address);
134
- const account = accounts.privateKeyToAccount(hex.addHexPrefix(wallet.privateKey));
132
+ const account = accounts.privateKeyToAccount(metadataHelpers.add0x(wallet.privateKey));
135
133
  delete typedData.types.EIP712Domain;
136
134
  const primaryType = typedData.primaryType;
137
135
  if (!primaryType) {
@@ -3,9 +3,7 @@
3
3
  var baseControllers = require('@toruslabs/base-controllers');
4
4
  var metadataHelpers = require('@toruslabs/metadata-helpers');
5
5
  var viem = require('viem');
6
- var hex = require('../utils/hex.js');
7
6
 
8
- const hexRe = /^[0-9A-Fa-f]+$/gu;
9
7
  function validateAddress(address, propertyName) {
10
8
  if (!address || typeof address !== "string" || !viem.isAddress(address)) {
11
9
  throw new Error(`Invalid "${propertyName}" address: ${address} must be a valid string.`);
@@ -23,14 +21,13 @@ function validateSignMessageData(messageData) {
23
21
  }
24
22
  function normalizeMessageData(data) {
25
23
  try {
26
- const stripped = hex.stripHexPrefix(data);
27
- if (stripped.match(hexRe)) {
28
- return hex.addHexPrefix(stripped);
24
+ if (metadataHelpers.isHexString(data)) {
25
+ return metadataHelpers.add0x(data);
29
26
  }
30
27
  } catch {
31
28
  // do nothing
32
29
  }
33
- return hex.addHexPrefix(metadataHelpers.bytesToHex(metadataHelpers.utf8ToBytes(data)));
30
+ return metadataHelpers.add0x(metadataHelpers.bytesToHex(metadataHelpers.utf8ToBytes(data)));
34
31
  }
35
32
  async function validateTypedSignMessageDataV4(messageData, currentChainId) {
36
33
  validateAddress(messageData.from, "from");
@@ -150,15 +150,13 @@ class NetworkController extends baseControllers.BaseController {
150
150
  networkMiddleware,
151
151
  blockTracker
152
152
  }) {
153
- const ethereumMiddleware = createEthereumMiddleware.createEthereumMiddleware(this.baseProviderHandlers, this.getProviderConfig(), this.analytics);
154
- const engine = new auth.JRPCEngine();
155
- engine.push(baseControllers.createAnalyticsMiddleware({
156
- providerConfig: this.getProviderConfig(),
157
- analytics: this.analytics
158
- }));
159
- engine.push(ethereumMiddleware);
160
- engine.push(networkMiddleware);
161
- const provider = auth.providerFromEngine(engine);
153
+ const engine = auth.JRPCEngineV2.create({
154
+ middleware: [baseControllers.createAnalyticsMiddleware({
155
+ providerConfig: this.getProviderConfig(),
156
+ analytics: this.analytics
157
+ }), createEthereumMiddleware.createEthereumMiddleware(this.baseProviderHandlers, this.getProviderConfig(), this.analytics), networkMiddleware]
158
+ });
159
+ const provider = auth.providerFromEngineV2(engine);
162
160
  this.setProvider({
163
161
  provider,
164
162
  blockTracker