@metamask/transaction-controller 44.1.0 → 45.1.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 (62) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/dist/TransactionController.cjs +41 -64
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +3 -15
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +3 -15
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +40 -63
  9. package/dist/TransactionController.mjs.map +1 -1
  10. package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs +4 -13
  11. package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs.map +1 -1
  12. package/dist/gas-flows/OracleLayer1GasFeeFlow.d.cts.map +1 -1
  13. package/dist/gas-flows/OracleLayer1GasFeeFlow.d.mts.map +1 -1
  14. package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs +4 -13
  15. package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs.map +1 -1
  16. package/dist/index.cjs +3 -2
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +3 -2
  19. package/dist/index.d.cts.map +1 -1
  20. package/dist/index.d.mts +3 -2
  21. package/dist/index.d.mts.map +1 -1
  22. package/dist/index.mjs +2 -1
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/types.cjs +6 -37
  25. package/dist/types.cjs.map +1 -1
  26. package/dist/types.d.cts +47 -1
  27. package/dist/types.d.cts.map +1 -1
  28. package/dist/types.d.mts +47 -1
  29. package/dist/types.d.mts.map +1 -1
  30. package/dist/types.mjs +6 -37
  31. package/dist/types.mjs.map +1 -1
  32. package/dist/utils/eip7702.cjs +87 -0
  33. package/dist/utils/eip7702.cjs.map +1 -0
  34. package/dist/utils/eip7702.d.cts +26 -0
  35. package/dist/utils/eip7702.d.cts.map +1 -0
  36. package/dist/utils/eip7702.d.mts +26 -0
  37. package/dist/utils/eip7702.d.mts.map +1 -0
  38. package/dist/utils/eip7702.mjs +83 -0
  39. package/dist/utils/eip7702.mjs.map +1 -0
  40. package/dist/utils/prepare.cjs +49 -0
  41. package/dist/utils/prepare.cjs.map +1 -0
  42. package/dist/utils/prepare.d.cts +21 -0
  43. package/dist/utils/prepare.d.cts.map +1 -0
  44. package/dist/utils/prepare.d.mts +21 -0
  45. package/dist/utils/prepare.d.mts.map +1 -0
  46. package/dist/utils/prepare.mjs +44 -0
  47. package/dist/utils/prepare.mjs.map +1 -0
  48. package/dist/utils/utils.cjs +3 -8
  49. package/dist/utils/utils.cjs.map +1 -1
  50. package/dist/utils/utils.d.cts.map +1 -1
  51. package/dist/utils/utils.d.mts.map +1 -1
  52. package/dist/utils/utils.mjs +3 -8
  53. package/dist/utils/utils.mjs.map +1 -1
  54. package/dist/utils/validation.cjs +91 -31
  55. package/dist/utils/validation.cjs.map +1 -1
  56. package/dist/utils/validation.d.cts +13 -5
  57. package/dist/utils/validation.d.cts.map +1 -1
  58. package/dist/utils/validation.d.mts +13 -5
  59. package/dist/utils/validation.d.mts.map +1 -1
  60. package/dist/utils/validation.mjs +92 -32
  61. package/dist/utils/validation.mjs.map +1 -1
  62. package/package.json +11 -11
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeTransaction = exports.prepareTransaction = exports.HARDFORK = void 0;
4
+ const common_1 = require("@ethereumjs/common");
5
+ const tx_1 = require("@ethereumjs/tx");
6
+ const utils_1 = require("@metamask/utils");
7
+ exports.HARDFORK = common_1.Hardfork.Prague;
8
+ /**
9
+ * Creates an `etheruemjs/tx` transaction object from the raw transaction parameters.
10
+ *
11
+ * @param chainId - Chain ID of the transaction.
12
+ * @param txParams - Transaction parameters.
13
+ * @returns The transaction object.
14
+ */
15
+ function prepareTransaction(chainId, txParams) {
16
+ // Does not allow `gasPrice` on type 4 transactions.
17
+ const data = txParams;
18
+ return tx_1.TransactionFactory.fromTxData(data, {
19
+ freeze: false,
20
+ common: getCommonConfiguration(chainId),
21
+ });
22
+ }
23
+ exports.prepareTransaction = prepareTransaction;
24
+ /**
25
+ * Serializes a transaction object into a hex string.
26
+ *
27
+ * @param transaction - The transaction object.
28
+ * @returns The prefixed hex string.
29
+ */
30
+ function serializeTransaction(transaction) {
31
+ return (0, utils_1.bytesToHex)(transaction.serialize());
32
+ }
33
+ exports.serializeTransaction = serializeTransaction;
34
+ /**
35
+ * Generates the configuration used to prepare transactions.
36
+ *
37
+ * @param chainId - Chain ID.
38
+ * @returns The common configuration.
39
+ */
40
+ function getCommonConfiguration(chainId) {
41
+ const customChainParams = {
42
+ chainId: parseInt(chainId, 16),
43
+ defaultHardfork: exports.HARDFORK,
44
+ };
45
+ return common_1.Common.custom(customChainParams, {
46
+ eips: [7702],
47
+ });
48
+ }
49
+ //# sourceMappingURL=prepare.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.cjs","sourceRoot":"","sources":["../../src/utils/prepare.ts"],"names":[],"mappings":";;;AACA,+CAAsD;AAEtD,uCAAoD;AACpD,2CAA6C;AAKhC,QAAA,QAAQ,GAAG,iBAAQ,CAAC,MAAM,CAAC;AAExC;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAChC,OAAY,EACZ,QAA2B;IAE3B,oDAAoD;IACpD,MAAM,IAAI,GAAG,QAAuB,CAAC;IAErC,OAAO,uBAAkB,CAAC,UAAU,CAAC,IAAI,EAAE;QACzC,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,sBAAsB,CAAC,OAAO,CAAC;KACxC,CAAC,CAAC;AACL,CAAC;AAXD,gDAWC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,WAA6B;IAChE,OAAO,IAAA,kBAAU,EAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;AAC7C,CAAC;AAFD,oDAEC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAAC,OAAY;IAC1C,MAAM,iBAAiB,GAAyB;QAC9C,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9B,eAAe,EAAE,gBAAQ;KAC1B,CAAC;IAEF,OAAO,eAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE;QACtC,IAAI,EAAE,CAAC,IAAI,CAAC;KACb,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { ChainConfig } from '@ethereumjs/common';\nimport { Common, Hardfork } from '@ethereumjs/common';\nimport type { TypedTransaction, TypedTxData } from '@ethereumjs/tx';\nimport { TransactionFactory } from '@ethereumjs/tx';\nimport { bytesToHex } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TransactionParams } from '../types';\n\nexport const HARDFORK = Hardfork.Prague;\n\n/**\n * Creates an `etheruemjs/tx` transaction object from the raw transaction parameters.\n *\n * @param chainId - Chain ID of the transaction.\n * @param txParams - Transaction parameters.\n * @returns The transaction object.\n */\nexport function prepareTransaction(\n chainId: Hex,\n txParams: TransactionParams,\n): TypedTransaction {\n // Does not allow `gasPrice` on type 4 transactions.\n const data = txParams as TypedTxData;\n\n return TransactionFactory.fromTxData(data, {\n freeze: false,\n common: getCommonConfiguration(chainId),\n });\n}\n\n/**\n * Serializes a transaction object into a hex string.\n *\n * @param transaction - The transaction object.\n * @returns The prefixed hex string.\n */\nexport function serializeTransaction(transaction: TypedTransaction) {\n return bytesToHex(transaction.serialize());\n}\n\n/**\n * Generates the configuration used to prepare transactions.\n *\n * @param chainId - Chain ID.\n * @returns The common configuration.\n */\nfunction getCommonConfiguration(chainId: Hex): Common {\n const customChainParams: Partial<ChainConfig> = {\n chainId: parseInt(chainId, 16),\n defaultHardfork: HARDFORK,\n };\n\n return Common.custom(customChainParams, {\n eips: [7702],\n });\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import { Hardfork } from "@ethereumjs/common";
2
+ import type { TypedTransaction } from "@ethereumjs/tx";
3
+ import type { Hex } from "@metamask/utils";
4
+ import type { TransactionParams } from "../types.cjs";
5
+ export declare const HARDFORK = Hardfork.Prague;
6
+ /**
7
+ * Creates an `etheruemjs/tx` transaction object from the raw transaction parameters.
8
+ *
9
+ * @param chainId - Chain ID of the transaction.
10
+ * @param txParams - Transaction parameters.
11
+ * @returns The transaction object.
12
+ */
13
+ export declare function prepareTransaction(chainId: Hex, txParams: TransactionParams): TypedTransaction;
14
+ /**
15
+ * Serializes a transaction object into a hex string.
16
+ *
17
+ * @param transaction - The transaction object.
18
+ * @returns The prefixed hex string.
19
+ */
20
+ export declare function serializeTransaction(transaction: TypedTransaction): `0x${string}`;
21
+ //# sourceMappingURL=prepare.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.d.cts","sourceRoot":"","sources":["../../src/utils/prepare.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,QAAQ,EAAE,2BAA2B;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAe,uBAAuB;AAGpE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAiB;AAElD,eAAO,MAAM,QAAQ,kBAAkB,CAAC;AAExC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,iBAAiB,GAC1B,gBAAgB,CAQlB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,gBAAgB,iBAEjE"}
@@ -0,0 +1,21 @@
1
+ import { Hardfork } from "@ethereumjs/common";
2
+ import type { TypedTransaction } from "@ethereumjs/tx";
3
+ import type { Hex } from "@metamask/utils";
4
+ import type { TransactionParams } from "../types.mjs";
5
+ export declare const HARDFORK = Hardfork.Prague;
6
+ /**
7
+ * Creates an `etheruemjs/tx` transaction object from the raw transaction parameters.
8
+ *
9
+ * @param chainId - Chain ID of the transaction.
10
+ * @param txParams - Transaction parameters.
11
+ * @returns The transaction object.
12
+ */
13
+ export declare function prepareTransaction(chainId: Hex, txParams: TransactionParams): TypedTransaction;
14
+ /**
15
+ * Serializes a transaction object into a hex string.
16
+ *
17
+ * @param transaction - The transaction object.
18
+ * @returns The prefixed hex string.
19
+ */
20
+ export declare function serializeTransaction(transaction: TypedTransaction): `0x${string}`;
21
+ //# sourceMappingURL=prepare.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.d.mts","sourceRoot":"","sources":["../../src/utils/prepare.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,QAAQ,EAAE,2BAA2B;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAe,uBAAuB;AAGpE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAiB;AAElD,eAAO,MAAM,QAAQ,kBAAkB,CAAC;AAExC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,iBAAiB,GAC1B,gBAAgB,CAQlB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,gBAAgB,iBAEjE"}
@@ -0,0 +1,44 @@
1
+ import { Common, Hardfork } from "@ethereumjs/common";
2
+ import { TransactionFactory } from "@ethereumjs/tx";
3
+ import { bytesToHex } from "@metamask/utils";
4
+ export const HARDFORK = Hardfork.Prague;
5
+ /**
6
+ * Creates an `etheruemjs/tx` transaction object from the raw transaction parameters.
7
+ *
8
+ * @param chainId - Chain ID of the transaction.
9
+ * @param txParams - Transaction parameters.
10
+ * @returns The transaction object.
11
+ */
12
+ export function prepareTransaction(chainId, txParams) {
13
+ // Does not allow `gasPrice` on type 4 transactions.
14
+ const data = txParams;
15
+ return TransactionFactory.fromTxData(data, {
16
+ freeze: false,
17
+ common: getCommonConfiguration(chainId),
18
+ });
19
+ }
20
+ /**
21
+ * Serializes a transaction object into a hex string.
22
+ *
23
+ * @param transaction - The transaction object.
24
+ * @returns The prefixed hex string.
25
+ */
26
+ export function serializeTransaction(transaction) {
27
+ return bytesToHex(transaction.serialize());
28
+ }
29
+ /**
30
+ * Generates the configuration used to prepare transactions.
31
+ *
32
+ * @param chainId - Chain ID.
33
+ * @returns The common configuration.
34
+ */
35
+ function getCommonConfiguration(chainId) {
36
+ const customChainParams = {
37
+ chainId: parseInt(chainId, 16),
38
+ defaultHardfork: HARDFORK,
39
+ };
40
+ return Common.custom(customChainParams, {
41
+ eips: [7702],
42
+ });
43
+ }
44
+ //# sourceMappingURL=prepare.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.mjs","sourceRoot":"","sources":["../../src/utils/prepare.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,2BAA2B;AAEtD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB;AACpD,OAAO,EAAE,UAAU,EAAE,wBAAwB;AAK7C,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAY,EACZ,QAA2B;IAE3B,oDAAoD;IACpD,MAAM,IAAI,GAAG,QAAuB,CAAC;IAErC,OAAO,kBAAkB,CAAC,UAAU,CAAC,IAAI,EAAE;QACzC,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,sBAAsB,CAAC,OAAO,CAAC;KACxC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAA6B;IAChE,OAAO,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAAC,OAAY;IAC1C,MAAM,iBAAiB,GAAyB;QAC9C,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9B,eAAe,EAAE,QAAQ;KAC1B,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE;QACtC,IAAI,EAAE,CAAC,IAAI,CAAC;KACb,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { ChainConfig } from '@ethereumjs/common';\nimport { Common, Hardfork } from '@ethereumjs/common';\nimport type { TypedTransaction, TypedTxData } from '@ethereumjs/tx';\nimport { TransactionFactory } from '@ethereumjs/tx';\nimport { bytesToHex } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport type { TransactionParams } from '../types';\n\nexport const HARDFORK = Hardfork.Prague;\n\n/**\n * Creates an `etheruemjs/tx` transaction object from the raw transaction parameters.\n *\n * @param chainId - Chain ID of the transaction.\n * @param txParams - Transaction parameters.\n * @returns The transaction object.\n */\nexport function prepareTransaction(\n chainId: Hex,\n txParams: TransactionParams,\n): TypedTransaction {\n // Does not allow `gasPrice` on type 4 transactions.\n const data = txParams as TypedTxData;\n\n return TransactionFactory.fromTxData(data, {\n freeze: false,\n common: getCommonConfiguration(chainId),\n });\n}\n\n/**\n * Serializes a transaction object into a hex string.\n *\n * @param transaction - The transaction object.\n * @returns The prefixed hex string.\n */\nexport function serializeTransaction(transaction: TypedTransaction) {\n return bytesToHex(transaction.serialize());\n}\n\n/**\n * Generates the configuration used to prepare transactions.\n *\n * @param chainId - Chain ID.\n * @returns The common configuration.\n */\nfunction getCommonConfiguration(chainId: Hex): Common {\n const customChainParams: Partial<ChainConfig> = {\n chainId: parseInt(chainId, 16),\n defaultHardfork: HARDFORK,\n };\n\n return Common.custom(customChainParams, {\n eips: [7702],\n });\n}\n"]}
@@ -11,6 +11,7 @@ exports.ESTIMATE_GAS_ERROR = 'eth_estimateGas rpc method error';
11
11
  // TODO: Replace `any` with type
12
12
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
13
  const NORMALIZERS = {
14
+ authorizationList: (authorizationList) => authorizationList,
14
15
  data: (data) => (0, utils_1.add0x)(padHexToEvenLength(data)),
15
16
  from: (from) => (0, utils_1.add0x)(from).toLowerCase(),
16
17
  gas: (gas) => (0, utils_1.add0x)(gas),
@@ -62,10 +63,7 @@ const validateGasValues = (gasValues) => {
62
63
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
64
  const value = gasValues[key];
64
65
  if (typeof value !== 'string' || !(0, utils_1.isStrictHexString)(value)) {
65
- throw new TypeError(
66
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
67
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
68
- `expected hex string for ${key} but received: ${value}`);
66
+ throw new TypeError(`expected hex string for ${key} but received: ${value}`);
69
67
  }
70
68
  });
71
69
  };
@@ -79,10 +77,7 @@ exports.validateGasValues = validateGasValues;
79
77
  */
80
78
  function validateIfTransactionUnapproved(transactionMeta, fnName) {
81
79
  if (transactionMeta?.status !== types_1.TransactionStatus.unapproved) {
82
- throw new Error(
83
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
84
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
85
- `TransactionsController: Can only call ${fnName} on an unapproved transaction.\n Current tx status: ${transactionMeta?.status}`);
80
+ throw new Error(`TransactionsController: Can only call ${fnName} on an unapproved transaction.\n Current tx status: ${transactionMeta?.status}`);
86
81
  }
87
82
  }
88
83
  exports.validateIfTransactionUnapproved = validateIfTransactionUnapproved;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n add0x,\n getKnownPropertyNames,\n isStrictHexString,\n} from '@metamask/utils';\nimport type { Json } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { TransactionStatus } from '../types';\nimport type {\n TransactionParams,\n TransactionMeta,\n TransactionError,\n GasPriceValue,\n FeeMarketEIP1559Values,\n} from '../types';\n\nexport const ESTIMATE_GAS_ERROR = 'eth_estimateGas rpc method error';\n\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst NORMALIZERS: { [param in keyof TransactionParams]: any } = {\n data: (data: string) => add0x(padHexToEvenLength(data)),\n from: (from: string) => add0x(from).toLowerCase(),\n gas: (gas: string) => add0x(gas),\n gasLimit: (gas: string) => add0x(gas),\n gasPrice: (gasPrice: string) => add0x(gasPrice),\n nonce: (nonce: string) => add0x(nonce),\n to: (to: string) => add0x(to).toLowerCase(),\n value: (value: string) => add0x(value),\n maxFeePerGas: (maxFeePerGas: string) => add0x(maxFeePerGas),\n maxPriorityFeePerGas: (maxPriorityFeePerGas: string) =>\n add0x(maxPriorityFeePerGas),\n estimatedBaseFee: (maxPriorityFeePerGas: string) =>\n add0x(maxPriorityFeePerGas),\n type: (type: string) => add0x(type),\n};\n\n/**\n * Normalizes properties on transaction params.\n *\n * @param txParams - The transaction params to normalize.\n * @returns Normalized transaction params.\n */\nexport function normalizeTransactionParams(txParams: TransactionParams) {\n const normalizedTxParams: TransactionParams = { from: '' };\n\n for (const key of getKnownPropertyNames(NORMALIZERS)) {\n if (txParams[key]) {\n normalizedTxParams[key] = NORMALIZERS[key](txParams[key]);\n }\n }\n\n if (!normalizedTxParams.value) {\n normalizedTxParams.value = '0x0';\n }\n\n return normalizedTxParams;\n}\n\n/**\n * Checks if a transaction is EIP-1559 by checking for the existence of\n * maxFeePerGas and maxPriorityFeePerGas within its parameters.\n *\n * @param txParams - Transaction params object to add.\n * @returns Boolean that is true if the transaction is EIP-1559 (has maxFeePerGas and maxPriorityFeePerGas), otherwise returns false.\n */\nexport function isEIP1559Transaction(txParams: TransactionParams): boolean {\n const hasOwnProp = (obj: TransactionParams, key: string) =>\n Object.prototype.hasOwnProperty.call(obj, key);\n return (\n hasOwnProp(txParams, 'maxFeePerGas') &&\n hasOwnProp(txParams, 'maxPriorityFeePerGas')\n );\n}\n\nexport const validateGasValues = (\n gasValues: GasPriceValue | FeeMarketEIP1559Values,\n) => {\n Object.keys(gasValues).forEach((key) => {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const value = (gasValues as any)[key];\n if (typeof value !== 'string' || !isStrictHexString(value)) {\n throw new TypeError(\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `expected hex string for ${key} but received: ${value}`,\n );\n }\n });\n};\n\n/**\n * Validates that a transaction is unapproved.\n * Throws if the transaction is not unapproved.\n *\n * @param transactionMeta - The transaction metadata to check.\n * @param fnName - The name of the function calling this helper.\n */\nexport function validateIfTransactionUnapproved(\n transactionMeta: TransactionMeta | undefined,\n fnName: string,\n) {\n if (transactionMeta?.status !== TransactionStatus.unapproved) {\n throw new Error(\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `TransactionsController: Can only call ${fnName} on an unapproved transaction.\\n Current tx status: ${transactionMeta?.status}`,\n );\n }\n}\n\n/**\n * Normalizes properties on transaction params.\n *\n * @param error - The error to be normalize.\n * @returns Normalized transaction error.\n */\nexport function normalizeTxError(\n error: Error & { code?: string; value?: unknown },\n): TransactionError {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n code: error.code,\n rpc: isJsonCompatible(error.value) ? error.value : undefined,\n };\n}\n\n/**\n * Normalize an object containing gas fee values.\n *\n * @param gasFeeValues - An object containing gas fee values.\n * @returns An object containing normalized gas fee values.\n */\nexport function normalizeGasFeeValues(\n gasFeeValues: GasPriceValue | FeeMarketEIP1559Values,\n): GasPriceValue | FeeMarketEIP1559Values {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const normalize = (value: any) =>\n typeof value === 'string' ? add0x(value) : value;\n\n if ('gasPrice' in gasFeeValues) {\n return {\n gasPrice: normalize(gasFeeValues.gasPrice),\n };\n }\n\n return {\n maxFeePerGas: normalize(gasFeeValues.maxFeePerGas),\n maxPriorityFeePerGas: normalize(gasFeeValues.maxPriorityFeePerGas),\n };\n}\n\n/**\n * Determines whether the given value can be encoded as JSON.\n *\n * @param value - The value.\n * @returns True if the value is JSON-encodable, false if not.\n */\nfunction isJsonCompatible(value: unknown): value is Json {\n try {\n JSON.parse(JSON.stringify(value));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Ensure a hex string is of even length by adding a leading 0 if necessary.\n * Any existing `0x` prefix is preserved but is not added if missing.\n *\n * @param hex - The hex string to ensure is even.\n * @returns The hex string with an even length.\n */\nexport function padHexToEvenLength(hex: string) {\n const prefix = hex.toLowerCase().startsWith('0x') ? hex.slice(0, 2) : '';\n const data = prefix ? hex.slice(2) : hex;\n const evenData = data.length % 2 === 0 ? data : `0${data}`;\n\n return prefix + evenData;\n}\n\n/**\n * Calculate the absolute percentage change between two values.\n *\n * @param originalValue - The first value.\n * @param newValue - The second value.\n * @returns The percentage change from the first value to the second value.\n * If the original value is zero and the new value is not, returns 100.\n */\nexport function getPercentageChange(originalValue: BN, newValue: BN): number {\n const precisionFactor = new BN(10).pow(new BN(18));\n const originalValuePrecision = originalValue.mul(precisionFactor);\n const newValuePrecision = newValue.mul(precisionFactor);\n\n const difference = newValuePrecision.sub(originalValuePrecision);\n\n if (difference.isZero()) {\n return 0;\n }\n\n if (originalValuePrecision.isZero() && !newValuePrecision.isZero()) {\n return 100;\n }\n\n return difference.muln(100).div(originalValuePrecision).abs().toNumber();\n}\n"]}
1
+ {"version":3,"file":"utils.cjs","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AuthorizationList } from '@ethereumjs/common';\nimport {\n add0x,\n getKnownPropertyNames,\n isStrictHexString,\n} from '@metamask/utils';\nimport type { Json } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { TransactionStatus } from '../types';\nimport type {\n TransactionParams,\n TransactionMeta,\n TransactionError,\n GasPriceValue,\n FeeMarketEIP1559Values,\n} from '../types';\n\nexport const ESTIMATE_GAS_ERROR = 'eth_estimateGas rpc method error';\n\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst NORMALIZERS: { [param in keyof TransactionParams]: any } = {\n authorizationList: (authorizationList?: AuthorizationList) =>\n authorizationList,\n data: (data: string) => add0x(padHexToEvenLength(data)),\n from: (from: string) => add0x(from).toLowerCase(),\n gas: (gas: string) => add0x(gas),\n gasLimit: (gas: string) => add0x(gas),\n gasPrice: (gasPrice: string) => add0x(gasPrice),\n nonce: (nonce: string) => add0x(nonce),\n to: (to: string) => add0x(to).toLowerCase(),\n value: (value: string) => add0x(value),\n maxFeePerGas: (maxFeePerGas: string) => add0x(maxFeePerGas),\n maxPriorityFeePerGas: (maxPriorityFeePerGas: string) =>\n add0x(maxPriorityFeePerGas),\n estimatedBaseFee: (maxPriorityFeePerGas: string) =>\n add0x(maxPriorityFeePerGas),\n type: (type: string) => add0x(type),\n};\n\n/**\n * Normalizes properties on transaction params.\n *\n * @param txParams - The transaction params to normalize.\n * @returns Normalized transaction params.\n */\nexport function normalizeTransactionParams(txParams: TransactionParams) {\n const normalizedTxParams: TransactionParams = { from: '' };\n\n for (const key of getKnownPropertyNames(NORMALIZERS)) {\n if (txParams[key]) {\n normalizedTxParams[key] = NORMALIZERS[key](txParams[key]);\n }\n }\n\n if (!normalizedTxParams.value) {\n normalizedTxParams.value = '0x0';\n }\n\n return normalizedTxParams;\n}\n\n/**\n * Checks if a transaction is EIP-1559 by checking for the existence of\n * maxFeePerGas and maxPriorityFeePerGas within its parameters.\n *\n * @param txParams - Transaction params object to add.\n * @returns Boolean that is true if the transaction is EIP-1559 (has maxFeePerGas and maxPriorityFeePerGas), otherwise returns false.\n */\nexport function isEIP1559Transaction(txParams: TransactionParams): boolean {\n const hasOwnProp = (obj: TransactionParams, key: string) =>\n Object.prototype.hasOwnProperty.call(obj, key);\n return (\n hasOwnProp(txParams, 'maxFeePerGas') &&\n hasOwnProp(txParams, 'maxPriorityFeePerGas')\n );\n}\n\nexport const validateGasValues = (\n gasValues: GasPriceValue | FeeMarketEIP1559Values,\n) => {\n Object.keys(gasValues).forEach((key) => {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const value = (gasValues as any)[key];\n if (typeof value !== 'string' || !isStrictHexString(value)) {\n throw new TypeError(\n `expected hex string for ${key} but received: ${value}`,\n );\n }\n });\n};\n\n/**\n * Validates that a transaction is unapproved.\n * Throws if the transaction is not unapproved.\n *\n * @param transactionMeta - The transaction metadata to check.\n * @param fnName - The name of the function calling this helper.\n */\nexport function validateIfTransactionUnapproved(\n transactionMeta: TransactionMeta | undefined,\n fnName: string,\n) {\n if (transactionMeta?.status !== TransactionStatus.unapproved) {\n throw new Error(\n `TransactionsController: Can only call ${fnName} on an unapproved transaction.\\n Current tx status: ${transactionMeta?.status}`,\n );\n }\n}\n\n/**\n * Normalizes properties on transaction params.\n *\n * @param error - The error to be normalize.\n * @returns Normalized transaction error.\n */\nexport function normalizeTxError(\n error: Error & { code?: string; value?: unknown },\n): TransactionError {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n code: error.code,\n rpc: isJsonCompatible(error.value) ? error.value : undefined,\n };\n}\n\n/**\n * Normalize an object containing gas fee values.\n *\n * @param gasFeeValues - An object containing gas fee values.\n * @returns An object containing normalized gas fee values.\n */\nexport function normalizeGasFeeValues(\n gasFeeValues: GasPriceValue | FeeMarketEIP1559Values,\n): GasPriceValue | FeeMarketEIP1559Values {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const normalize = (value: any) =>\n typeof value === 'string' ? add0x(value) : value;\n\n if ('gasPrice' in gasFeeValues) {\n return {\n gasPrice: normalize(gasFeeValues.gasPrice),\n };\n }\n\n return {\n maxFeePerGas: normalize(gasFeeValues.maxFeePerGas),\n maxPriorityFeePerGas: normalize(gasFeeValues.maxPriorityFeePerGas),\n };\n}\n\n/**\n * Determines whether the given value can be encoded as JSON.\n *\n * @param value - The value.\n * @returns True if the value is JSON-encodable, false if not.\n */\nfunction isJsonCompatible(value: unknown): value is Json {\n try {\n JSON.parse(JSON.stringify(value));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Ensure a hex string is of even length by adding a leading 0 if necessary.\n * Any existing `0x` prefix is preserved but is not added if missing.\n *\n * @param hex - The hex string to ensure is even.\n * @returns The hex string with an even length.\n */\nexport function padHexToEvenLength(hex: string) {\n const prefix = hex.toLowerCase().startsWith('0x') ? hex.slice(0, 2) : '';\n const data = prefix ? hex.slice(2) : hex;\n const evenData = data.length % 2 === 0 ? data : `0${data}`;\n\n return prefix + evenData;\n}\n\n/**\n * Calculate the absolute percentage change between two values.\n *\n * @param originalValue - The first value.\n * @param newValue - The second value.\n * @returns The percentage change from the first value to the second value.\n * If the original value is zero and the new value is not, returns 100.\n */\nexport function getPercentageChange(originalValue: BN, newValue: BN): number {\n const precisionFactor = new BN(10).pow(new BN(18));\n const originalValuePrecision = originalValue.mul(precisionFactor);\n const newValuePrecision = newValue.mul(precisionFactor);\n\n const difference = newValuePrecision.sub(originalValuePrecision);\n\n if (difference.isZero()) {\n return 0;\n }\n\n if (originalValuePrecision.isZero() && !newValuePrecision.isZero()) {\n return 100;\n }\n\n return difference.muln(100).div(originalValuePrecision).abs().toNumber();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.cts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc;AAGvB,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,sBAAsB,EACvB,qBAAiB;AAElB,eAAO,MAAM,kBAAkB,qCAAqC,CAAC;AAqBrE;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,iBAAiB,qBAcrE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAOzE;AAED,eAAO,MAAM,iBAAiB,cACjB,aAAa,GAAG,sBAAsB,SAclD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,EAC5C,MAAM,EAAE,MAAM,QASf;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAChD,gBAAgB,CAQlB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,aAAa,GAAG,sBAAsB,GACnD,aAAa,GAAG,sBAAsB,CAgBxC;AAiBD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,UAM7C;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,CAgB3E"}
1
+ {"version":3,"file":"utils.d.cts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc;AAGvB,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,sBAAsB,EACvB,qBAAiB;AAElB,eAAO,MAAM,kBAAkB,qCAAqC,CAAC;AAuBrE;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,iBAAiB,qBAcrE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAOzE;AAED,eAAO,MAAM,iBAAiB,cACjB,aAAa,GAAG,sBAAsB,SAYlD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,EAC5C,MAAM,EAAE,MAAM,QAOf;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAChD,gBAAgB,CAQlB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,aAAa,GAAG,sBAAsB,GACnD,aAAa,GAAG,sBAAsB,CAgBxC;AAiBD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,UAM7C;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,CAgB3E"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.mts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc;AAGvB,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,sBAAsB,EACvB,qBAAiB;AAElB,eAAO,MAAM,kBAAkB,qCAAqC,CAAC;AAqBrE;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,iBAAiB,qBAcrE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAOzE;AAED,eAAO,MAAM,iBAAiB,cACjB,aAAa,GAAG,sBAAsB,SAclD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,EAC5C,MAAM,EAAE,MAAM,QASf;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAChD,gBAAgB,CAQlB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,aAAa,GAAG,sBAAsB,GACnD,aAAa,GAAG,sBAAsB,CAgBxC;AAiBD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,UAM7C;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,CAgB3E"}
1
+ {"version":3,"file":"utils.d.mts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc;AAGvB,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,sBAAsB,EACvB,qBAAiB;AAElB,eAAO,MAAM,kBAAkB,qCAAqC,CAAC;AAuBrE;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,iBAAiB,qBAcrE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAOzE;AAED,eAAO,MAAM,iBAAiB,cACjB,aAAa,GAAG,sBAAsB,SAYlD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,eAAe,EAAE,eAAe,GAAG,SAAS,EAC5C,MAAM,EAAE,MAAM,QAOf;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAChD,gBAAgB,CAQlB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,aAAa,GAAG,sBAAsB,GACnD,aAAa,GAAG,sBAAsB,CAgBxC;AAiBD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,UAM7C;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,CAgB3E"}
@@ -12,6 +12,7 @@ export const ESTIMATE_GAS_ERROR = 'eth_estimateGas rpc method error';
12
12
  // TODO: Replace `any` with type
13
13
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
14
  const NORMALIZERS = {
15
+ authorizationList: (authorizationList) => authorizationList,
15
16
  data: (data) => add0x(padHexToEvenLength(data)),
16
17
  from: (from) => add0x(from).toLowerCase(),
17
18
  gas: (gas) => add0x(gas),
@@ -61,10 +62,7 @@ export const validateGasValues = (gasValues) => {
61
62
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
63
  const value = gasValues[key];
63
64
  if (typeof value !== 'string' || !isStrictHexString(value)) {
64
- throw new TypeError(
65
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
66
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
67
- `expected hex string for ${key} but received: ${value}`);
65
+ throw new TypeError(`expected hex string for ${key} but received: ${value}`);
68
66
  }
69
67
  });
70
68
  };
@@ -77,10 +75,7 @@ export const validateGasValues = (gasValues) => {
77
75
  */
78
76
  export function validateIfTransactionUnapproved(transactionMeta, fnName) {
79
77
  if (transactionMeta?.status !== TransactionStatus.unapproved) {
80
- throw new Error(
81
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
82
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
83
- `TransactionsController: Can only call ${fnName} on an unapproved transaction.\n Current tx status: ${transactionMeta?.status}`);
78
+ throw new Error(`TransactionsController: Can only call ${fnName} on an unapproved transaction.\n Current tx status: ${transactionMeta?.status}`);
84
79
  }
85
80
  }
86
81
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EACL,KAAK,EACL,qBAAqB,EACrB,iBAAiB,EAClB,wBAAwB;AAEzB,OAAO,GAAE,cAAc;;AAEvB,OAAO,EAAE,iBAAiB,EAAE,qBAAiB;AAS7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,kCAAkC,CAAC;AAErE,gCAAgC;AAChC,8DAA8D;AAC9D,MAAM,WAAW,GAAgD;IAC/D,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;IACjD,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;IAChC,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;IACrC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC/C,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IACtC,EAAE,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;IAC3C,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IACtC,YAAY,EAAE,CAAC,YAAoB,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;IAC3D,oBAAoB,EAAE,CAAC,oBAA4B,EAAE,EAAE,CACrD,KAAK,CAAC,oBAAoB,CAAC;IAC7B,gBAAgB,EAAE,CAAC,oBAA4B,EAAE,EAAE,CACjD,KAAK,CAAC,oBAAoB,CAAC;IAC7B,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;CACpC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAA2B;IACpE,MAAM,kBAAkB,GAAsB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAE3D,KAAK,MAAM,GAAG,IAAI,qBAAqB,CAAC,WAAW,CAAC,EAAE;QACpD,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;YACjB,kBAAkB,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;SAC3D;KACF;IAED,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;QAC7B,kBAAkB,CAAC,KAAK,GAAG,KAAK,CAAC;KAClC;IAED,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAA2B;IAC9D,MAAM,UAAU,GAAG,CAAC,GAAsB,EAAE,GAAW,EAAE,EAAE,CACzD,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,CACL,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC;QACpC,UAAU,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAC7C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,SAAiD,EACjD,EAAE;IACF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACrC,gCAAgC;QAChC,8DAA8D;QAC9D,MAAM,KAAK,GAAI,SAAiB,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;YAC1D,MAAM,IAAI,SAAS;YACjB,gFAAgF;YAChF,4EAA4E;YAC5E,2BAA2B,GAAG,kBAAkB,KAAK,EAAE,CACxD,CAAC;SACH;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAC7C,eAA4C,EAC5C,MAAc;IAEd,IAAI,eAAe,EAAE,MAAM,KAAK,iBAAiB,CAAC,UAAU,EAAE;QAC5D,MAAM,IAAI,KAAK;QACb,gFAAgF;QAChF,4EAA4E;QAC5E,yCAAyC,MAAM,4DAA4D,eAAe,EAAE,MAAM,EAAE,CACrI,CAAC;KACH;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAiD;IAEjD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAAoD;IAEpD,gCAAgC;IAChC,8DAA8D;IAC9D,MAAM,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE,CAC/B,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEnD,IAAI,UAAU,IAAI,YAAY,EAAE;QAC9B,OAAO;YACL,QAAQ,EAAE,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC;SAC3C,CAAC;KACH;IAED,OAAO;QACL,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;QAClD,oBAAoB,EAAE,SAAS,CAAC,YAAY,CAAC,oBAAoB,CAAC;KACnE,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;KACb;IAAC,MAAM;QACN,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAE3D,OAAO,MAAM,GAAG,QAAQ,CAAC;AAC3B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,aAAiB,EAAE,QAAY;IACjE,MAAM,eAAe,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,sBAAsB,GAAG,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAClE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAExD,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEjE,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE;QACvB,OAAO,CAAC,CAAC;KACV;IAED,IAAI,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE;QAClE,OAAO,GAAG,CAAC;KACZ;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AAC3E,CAAC","sourcesContent":["import {\n add0x,\n getKnownPropertyNames,\n isStrictHexString,\n} from '@metamask/utils';\nimport type { Json } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { TransactionStatus } from '../types';\nimport type {\n TransactionParams,\n TransactionMeta,\n TransactionError,\n GasPriceValue,\n FeeMarketEIP1559Values,\n} from '../types';\n\nexport const ESTIMATE_GAS_ERROR = 'eth_estimateGas rpc method error';\n\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst NORMALIZERS: { [param in keyof TransactionParams]: any } = {\n data: (data: string) => add0x(padHexToEvenLength(data)),\n from: (from: string) => add0x(from).toLowerCase(),\n gas: (gas: string) => add0x(gas),\n gasLimit: (gas: string) => add0x(gas),\n gasPrice: (gasPrice: string) => add0x(gasPrice),\n nonce: (nonce: string) => add0x(nonce),\n to: (to: string) => add0x(to).toLowerCase(),\n value: (value: string) => add0x(value),\n maxFeePerGas: (maxFeePerGas: string) => add0x(maxFeePerGas),\n maxPriorityFeePerGas: (maxPriorityFeePerGas: string) =>\n add0x(maxPriorityFeePerGas),\n estimatedBaseFee: (maxPriorityFeePerGas: string) =>\n add0x(maxPriorityFeePerGas),\n type: (type: string) => add0x(type),\n};\n\n/**\n * Normalizes properties on transaction params.\n *\n * @param txParams - The transaction params to normalize.\n * @returns Normalized transaction params.\n */\nexport function normalizeTransactionParams(txParams: TransactionParams) {\n const normalizedTxParams: TransactionParams = { from: '' };\n\n for (const key of getKnownPropertyNames(NORMALIZERS)) {\n if (txParams[key]) {\n normalizedTxParams[key] = NORMALIZERS[key](txParams[key]);\n }\n }\n\n if (!normalizedTxParams.value) {\n normalizedTxParams.value = '0x0';\n }\n\n return normalizedTxParams;\n}\n\n/**\n * Checks if a transaction is EIP-1559 by checking for the existence of\n * maxFeePerGas and maxPriorityFeePerGas within its parameters.\n *\n * @param txParams - Transaction params object to add.\n * @returns Boolean that is true if the transaction is EIP-1559 (has maxFeePerGas and maxPriorityFeePerGas), otherwise returns false.\n */\nexport function isEIP1559Transaction(txParams: TransactionParams): boolean {\n const hasOwnProp = (obj: TransactionParams, key: string) =>\n Object.prototype.hasOwnProperty.call(obj, key);\n return (\n hasOwnProp(txParams, 'maxFeePerGas') &&\n hasOwnProp(txParams, 'maxPriorityFeePerGas')\n );\n}\n\nexport const validateGasValues = (\n gasValues: GasPriceValue | FeeMarketEIP1559Values,\n) => {\n Object.keys(gasValues).forEach((key) => {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const value = (gasValues as any)[key];\n if (typeof value !== 'string' || !isStrictHexString(value)) {\n throw new TypeError(\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `expected hex string for ${key} but received: ${value}`,\n );\n }\n });\n};\n\n/**\n * Validates that a transaction is unapproved.\n * Throws if the transaction is not unapproved.\n *\n * @param transactionMeta - The transaction metadata to check.\n * @param fnName - The name of the function calling this helper.\n */\nexport function validateIfTransactionUnapproved(\n transactionMeta: TransactionMeta | undefined,\n fnName: string,\n) {\n if (transactionMeta?.status !== TransactionStatus.unapproved) {\n throw new Error(\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `TransactionsController: Can only call ${fnName} on an unapproved transaction.\\n Current tx status: ${transactionMeta?.status}`,\n );\n }\n}\n\n/**\n * Normalizes properties on transaction params.\n *\n * @param error - The error to be normalize.\n * @returns Normalized transaction error.\n */\nexport function normalizeTxError(\n error: Error & { code?: string; value?: unknown },\n): TransactionError {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n code: error.code,\n rpc: isJsonCompatible(error.value) ? error.value : undefined,\n };\n}\n\n/**\n * Normalize an object containing gas fee values.\n *\n * @param gasFeeValues - An object containing gas fee values.\n * @returns An object containing normalized gas fee values.\n */\nexport function normalizeGasFeeValues(\n gasFeeValues: GasPriceValue | FeeMarketEIP1559Values,\n): GasPriceValue | FeeMarketEIP1559Values {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const normalize = (value: any) =>\n typeof value === 'string' ? add0x(value) : value;\n\n if ('gasPrice' in gasFeeValues) {\n return {\n gasPrice: normalize(gasFeeValues.gasPrice),\n };\n }\n\n return {\n maxFeePerGas: normalize(gasFeeValues.maxFeePerGas),\n maxPriorityFeePerGas: normalize(gasFeeValues.maxPriorityFeePerGas),\n };\n}\n\n/**\n * Determines whether the given value can be encoded as JSON.\n *\n * @param value - The value.\n * @returns True if the value is JSON-encodable, false if not.\n */\nfunction isJsonCompatible(value: unknown): value is Json {\n try {\n JSON.parse(JSON.stringify(value));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Ensure a hex string is of even length by adding a leading 0 if necessary.\n * Any existing `0x` prefix is preserved but is not added if missing.\n *\n * @param hex - The hex string to ensure is even.\n * @returns The hex string with an even length.\n */\nexport function padHexToEvenLength(hex: string) {\n const prefix = hex.toLowerCase().startsWith('0x') ? hex.slice(0, 2) : '';\n const data = prefix ? hex.slice(2) : hex;\n const evenData = data.length % 2 === 0 ? data : `0${data}`;\n\n return prefix + evenData;\n}\n\n/**\n * Calculate the absolute percentage change between two values.\n *\n * @param originalValue - The first value.\n * @param newValue - The second value.\n * @returns The percentage change from the first value to the second value.\n * If the original value is zero and the new value is not, returns 100.\n */\nexport function getPercentageChange(originalValue: BN, newValue: BN): number {\n const precisionFactor = new BN(10).pow(new BN(18));\n const originalValuePrecision = originalValue.mul(precisionFactor);\n const newValuePrecision = newValue.mul(precisionFactor);\n\n const difference = newValuePrecision.sub(originalValuePrecision);\n\n if (difference.isZero()) {\n return 0;\n }\n\n if (originalValuePrecision.isZero() && !newValuePrecision.isZero()) {\n return 100;\n }\n\n return difference.muln(100).div(originalValuePrecision).abs().toNumber();\n}\n"]}
1
+ {"version":3,"file":"utils.mjs","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AuthorizationList } from '@ethereumjs/common';\nimport {\n add0x,\n getKnownPropertyNames,\n isStrictHexString,\n} from '@metamask/utils';\nimport type { Json } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { TransactionStatus } from '../types';\nimport type {\n TransactionParams,\n TransactionMeta,\n TransactionError,\n GasPriceValue,\n FeeMarketEIP1559Values,\n} from '../types';\n\nexport const ESTIMATE_GAS_ERROR = 'eth_estimateGas rpc method error';\n\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst NORMALIZERS: { [param in keyof TransactionParams]: any } = {\n authorizationList: (authorizationList?: AuthorizationList) =>\n authorizationList,\n data: (data: string) => add0x(padHexToEvenLength(data)),\n from: (from: string) => add0x(from).toLowerCase(),\n gas: (gas: string) => add0x(gas),\n gasLimit: (gas: string) => add0x(gas),\n gasPrice: (gasPrice: string) => add0x(gasPrice),\n nonce: (nonce: string) => add0x(nonce),\n to: (to: string) => add0x(to).toLowerCase(),\n value: (value: string) => add0x(value),\n maxFeePerGas: (maxFeePerGas: string) => add0x(maxFeePerGas),\n maxPriorityFeePerGas: (maxPriorityFeePerGas: string) =>\n add0x(maxPriorityFeePerGas),\n estimatedBaseFee: (maxPriorityFeePerGas: string) =>\n add0x(maxPriorityFeePerGas),\n type: (type: string) => add0x(type),\n};\n\n/**\n * Normalizes properties on transaction params.\n *\n * @param txParams - The transaction params to normalize.\n * @returns Normalized transaction params.\n */\nexport function normalizeTransactionParams(txParams: TransactionParams) {\n const normalizedTxParams: TransactionParams = { from: '' };\n\n for (const key of getKnownPropertyNames(NORMALIZERS)) {\n if (txParams[key]) {\n normalizedTxParams[key] = NORMALIZERS[key](txParams[key]);\n }\n }\n\n if (!normalizedTxParams.value) {\n normalizedTxParams.value = '0x0';\n }\n\n return normalizedTxParams;\n}\n\n/**\n * Checks if a transaction is EIP-1559 by checking for the existence of\n * maxFeePerGas and maxPriorityFeePerGas within its parameters.\n *\n * @param txParams - Transaction params object to add.\n * @returns Boolean that is true if the transaction is EIP-1559 (has maxFeePerGas and maxPriorityFeePerGas), otherwise returns false.\n */\nexport function isEIP1559Transaction(txParams: TransactionParams): boolean {\n const hasOwnProp = (obj: TransactionParams, key: string) =>\n Object.prototype.hasOwnProperty.call(obj, key);\n return (\n hasOwnProp(txParams, 'maxFeePerGas') &&\n hasOwnProp(txParams, 'maxPriorityFeePerGas')\n );\n}\n\nexport const validateGasValues = (\n gasValues: GasPriceValue | FeeMarketEIP1559Values,\n) => {\n Object.keys(gasValues).forEach((key) => {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const value = (gasValues as any)[key];\n if (typeof value !== 'string' || !isStrictHexString(value)) {\n throw new TypeError(\n `expected hex string for ${key} but received: ${value}`,\n );\n }\n });\n};\n\n/**\n * Validates that a transaction is unapproved.\n * Throws if the transaction is not unapproved.\n *\n * @param transactionMeta - The transaction metadata to check.\n * @param fnName - The name of the function calling this helper.\n */\nexport function validateIfTransactionUnapproved(\n transactionMeta: TransactionMeta | undefined,\n fnName: string,\n) {\n if (transactionMeta?.status !== TransactionStatus.unapproved) {\n throw new Error(\n `TransactionsController: Can only call ${fnName} on an unapproved transaction.\\n Current tx status: ${transactionMeta?.status}`,\n );\n }\n}\n\n/**\n * Normalizes properties on transaction params.\n *\n * @param error - The error to be normalize.\n * @returns Normalized transaction error.\n */\nexport function normalizeTxError(\n error: Error & { code?: string; value?: unknown },\n): TransactionError {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n code: error.code,\n rpc: isJsonCompatible(error.value) ? error.value : undefined,\n };\n}\n\n/**\n * Normalize an object containing gas fee values.\n *\n * @param gasFeeValues - An object containing gas fee values.\n * @returns An object containing normalized gas fee values.\n */\nexport function normalizeGasFeeValues(\n gasFeeValues: GasPriceValue | FeeMarketEIP1559Values,\n): GasPriceValue | FeeMarketEIP1559Values {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const normalize = (value: any) =>\n typeof value === 'string' ? add0x(value) : value;\n\n if ('gasPrice' in gasFeeValues) {\n return {\n gasPrice: normalize(gasFeeValues.gasPrice),\n };\n }\n\n return {\n maxFeePerGas: normalize(gasFeeValues.maxFeePerGas),\n maxPriorityFeePerGas: normalize(gasFeeValues.maxPriorityFeePerGas),\n };\n}\n\n/**\n * Determines whether the given value can be encoded as JSON.\n *\n * @param value - The value.\n * @returns True if the value is JSON-encodable, false if not.\n */\nfunction isJsonCompatible(value: unknown): value is Json {\n try {\n JSON.parse(JSON.stringify(value));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Ensure a hex string is of even length by adding a leading 0 if necessary.\n * Any existing `0x` prefix is preserved but is not added if missing.\n *\n * @param hex - The hex string to ensure is even.\n * @returns The hex string with an even length.\n */\nexport function padHexToEvenLength(hex: string) {\n const prefix = hex.toLowerCase().startsWith('0x') ? hex.slice(0, 2) : '';\n const data = prefix ? hex.slice(2) : hex;\n const evenData = data.length % 2 === 0 ? data : `0${data}`;\n\n return prefix + evenData;\n}\n\n/**\n * Calculate the absolute percentage change between two values.\n *\n * @param originalValue - The first value.\n * @param newValue - The second value.\n * @returns The percentage change from the first value to the second value.\n * If the original value is zero and the new value is not, returns 100.\n */\nexport function getPercentageChange(originalValue: BN, newValue: BN): number {\n const precisionFactor = new BN(10).pow(new BN(18));\n const originalValuePrecision = originalValue.mul(precisionFactor);\n const newValuePrecision = newValue.mul(precisionFactor);\n\n const difference = newValuePrecision.sub(originalValuePrecision);\n\n if (difference.isZero()) {\n return 0;\n }\n\n if (originalValuePrecision.isZero() && !newValuePrecision.isZero()) {\n return 100;\n }\n\n return difference.muln(100).div(originalValuePrecision).abs().toNumber();\n}\n"]}
@@ -6,36 +6,44 @@ const controller_utils_1 = require("@metamask/controller-utils");
6
6
  const metamask_eth_abis_1 = require("@metamask/metamask-eth-abis");
7
7
  const rpc_errors_1 = require("@metamask/rpc-errors");
8
8
  const utils_1 = require("@metamask/utils");
9
- const types_1 = require("../types.cjs");
10
9
  const utils_2 = require("./utils.cjs");
10
+ const types_1 = require("../types.cjs");
11
+ const TRANSACTION_ENVELOPE_TYPES_FEE_MARKET = [
12
+ types_1.TransactionEnvelopeType.feeMarket,
13
+ types_1.TransactionEnvelopeType.setCode,
14
+ ];
11
15
  /**
12
16
  * Validates whether a transaction initiated by a specific 'from' address is permitted by the origin.
13
17
  *
14
- * @param permittedAddresses - The permitted accounts for the given origin.
15
- * @param selectedAddress - The currently selected Ethereum address in the wallet.
16
- * @param from - The address from which the transaction is initiated.
17
- * @param origin - The origin or source of the transaction.
18
+ * @param options - Options bag.
19
+ * @param options.from - The address from which the transaction is initiated.
20
+ * @param options.origin - The origin or source of the transaction.
21
+ * @param options.permittedAddresses - The permitted accounts for the given origin.
22
+ * @param options.selectedAddress - The currently selected Ethereum address in the wallet.
23
+ * @param options.txParams - The transaction parameters.
18
24
  * @throws Throws an error if the transaction is not permitted.
19
25
  */
20
- async function validateTransactionOrigin(permittedAddresses, selectedAddress, from, origin) {
21
- if (origin === controller_utils_1.ORIGIN_METAMASK) {
22
- // Ensure the 'from' address matches the currently selected address
23
- if (from !== selectedAddress) {
24
- throw rpc_errors_1.rpcErrors.internal({
25
- message: `Internally initiated transaction is using invalid account.`,
26
- data: {
27
- origin,
28
- fromAddress: from,
29
- selectedAddress,
30
- },
31
- });
32
- }
33
- return;
26
+ async function validateTransactionOrigin({ from, origin, permittedAddresses, selectedAddress, txParams, }) {
27
+ const isInternal = origin === controller_utils_1.ORIGIN_METAMASK;
28
+ const isExternal = origin && origin !== controller_utils_1.ORIGIN_METAMASK;
29
+ const { authorizationList, type } = txParams;
30
+ if (isInternal && from !== selectedAddress) {
31
+ throw rpc_errors_1.rpcErrors.internal({
32
+ message: `Internally initiated transaction is using invalid account.`,
33
+ data: {
34
+ origin,
35
+ fromAddress: from,
36
+ selectedAddress,
37
+ },
38
+ });
34
39
  }
35
- // Check if the origin has permissions to initiate transactions from the specified address
36
- if (!permittedAddresses.includes(from)) {
40
+ if (isExternal && permittedAddresses && !permittedAddresses.includes(from)) {
37
41
  throw rpc_errors_1.providerErrors.unauthorized({ data: { origin } });
38
42
  }
43
+ if (isExternal &&
44
+ (authorizationList || type === types_1.TransactionEnvelopeType.setCode)) {
45
+ throw rpc_errors_1.rpcErrors.invalidParams('External EIP-7702 transactions are not supported');
46
+ }
39
47
  }
40
48
  exports.validateTransactionOrigin = validateTransactionOrigin;
41
49
  /**
@@ -54,6 +62,7 @@ function validateTxParams(txParams, isEIP1559Compatible = true) {
54
62
  validateParamData(txParams.data);
55
63
  validateParamChainId(txParams.chainId);
56
64
  validateGasFeeParams(txParams);
65
+ validateAuthorizationList(txParams);
57
66
  }
58
67
  exports.validateTxParams = validateTxParams;
59
68
  /**
@@ -236,19 +245,25 @@ function validateGasFeeParams(txParams) {
236
245
  * expectations for provided field.
237
246
  */
238
247
  function ensureProperTransactionEnvelopeTypeProvided(txParams, field) {
248
+ const type = txParams.type;
239
249
  switch (field) {
250
+ case 'authorizationList':
251
+ if (type && type !== types_1.TransactionEnvelopeType.setCode) {
252
+ throw rpc_errors_1.rpcErrors.invalidParams(`Invalid transaction envelope type: specified type "${type}" but including authorizationList requires type: "${types_1.TransactionEnvelopeType.setCode}"`);
253
+ }
254
+ break;
240
255
  case 'maxFeePerGas':
241
256
  case 'maxPriorityFeePerGas':
242
- if (txParams.type &&
243
- txParams.type !== types_1.TransactionEnvelopeType.feeMarket) {
244
- throw rpc_errors_1.rpcErrors.invalidParams(`Invalid transaction envelope type: specified type "${txParams.type}" but including maxFeePerGas and maxPriorityFeePerGas requires type: "${types_1.TransactionEnvelopeType.feeMarket}"`);
257
+ if (type &&
258
+ !TRANSACTION_ENVELOPE_TYPES_FEE_MARKET.includes(type)) {
259
+ throw rpc_errors_1.rpcErrors.invalidParams(`Invalid transaction envelope type: specified type "${type}" but including maxFeePerGas and maxPriorityFeePerGas requires type: "${TRANSACTION_ENVELOPE_TYPES_FEE_MARKET.join(', ')}"`);
245
260
  }
246
261
  break;
247
262
  case 'gasPrice':
248
263
  default:
249
- if (txParams.type &&
250
- txParams.type === types_1.TransactionEnvelopeType.feeMarket) {
251
- throw rpc_errors_1.rpcErrors.invalidParams(`Invalid transaction envelope type: specified type "${txParams.type}" but included a gasPrice instead of maxFeePerGas and maxPriorityFeePerGas`);
264
+ if (type &&
265
+ TRANSACTION_ENVELOPE_TYPES_FEE_MARKET.includes(type)) {
266
+ throw rpc_errors_1.rpcErrors.invalidParams(`Invalid transaction envelope type: specified type "${type}" but included a gasPrice instead of maxFeePerGas and maxPriorityFeePerGas`);
252
267
  }
253
268
  }
254
269
  }
@@ -271,14 +286,59 @@ function ensureMutuallyExclusiveFieldsNotProvided(txParams, fieldBeingValidated,
271
286
  * Ensures that the provided value for field is a valid hexadecimal.
272
287
  * Throws an invalidParams error if field is not a valid hexadecimal.
273
288
  *
274
- * @param txParams - The transaction parameters object
289
+ * @param data - The object containing the field
275
290
  * @param field - The current field being validated
276
291
  * @throws {rpcErrors.invalidParams} Throws if field is not a valid hexadecimal
277
292
  */
278
- function ensureFieldIsValidHex(txParams, field) {
279
- const value = txParams[field];
293
+ function ensureFieldIsValidHex(data, field) {
294
+ const value = data[field];
280
295
  if (typeof value !== 'string' || !(0, utils_1.isStrictHexString)(value)) {
281
- throw rpc_errors_1.rpcErrors.invalidParams(`Invalid transaction params: ${field} is not a valid hexadecimal. got: (${String(value)})`);
296
+ throw rpc_errors_1.rpcErrors.invalidParams(`Invalid transaction params: ${String(field)} is not a valid hexadecimal string. got: (${String(value)})`);
297
+ }
298
+ }
299
+ /**
300
+ * Validate the authorization list property in the transaction parameters.
301
+ *
302
+ * @param txParams - The transaction parameters containing the authorization list to validate.
303
+ */
304
+ function validateAuthorizationList(txParams) {
305
+ const { authorizationList } = txParams;
306
+ if (!authorizationList) {
307
+ return;
308
+ }
309
+ ensureProperTransactionEnvelopeTypeProvided(txParams, 'authorizationList');
310
+ if (!Array.isArray(authorizationList)) {
311
+ throw rpc_errors_1.rpcErrors.invalidParams(`Invalid transaction params: authorizationList must be an array`);
312
+ }
313
+ for (const authorization of authorizationList) {
314
+ validateAuthorization(authorization);
315
+ }
316
+ }
317
+ /**
318
+ * Validate an authorization object.
319
+ *
320
+ * @param authorization - The authorization object to validate.
321
+ */
322
+ function validateAuthorization(authorization) {
323
+ ensureFieldIsValidHex(authorization, 'address');
324
+ validateHexLength(authorization.address, 20, 'address');
325
+ for (const field of ['chainId', 'nonce', 'r', 's', 'yParity']) {
326
+ if (authorization[field]) {
327
+ ensureFieldIsValidHex(authorization, field);
328
+ }
329
+ }
330
+ }
331
+ /**
332
+ * Validate the number of bytes in a hex string.
333
+ *
334
+ * @param value - The hex string to validate.
335
+ * @param lengthBytes - The expected length in bytes.
336
+ * @param fieldName - The name of the field being validated.
337
+ */
338
+ function validateHexLength(value, lengthBytes, fieldName) {
339
+ const actualLengthBytes = (0, utils_1.remove0x)(value).length / 2;
340
+ if (actualLengthBytes !== lengthBytes) {
341
+ throw rpc_errors_1.rpcErrors.invalidParams(`Invalid transaction params: ${fieldName} must be ${lengthBytes} bytes. got: ${actualLengthBytes} bytes`);
282
342
  }
283
343
  }
284
344
  //# sourceMappingURL=validation.cjs.map