@metamask-previews/transaction-controller 52.2.0-preview-d5a460dc → 52.2.0-preview-ca923904

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 (57) hide show
  1. package/dist/TransactionController.cjs +7 -3
  2. package/dist/TransactionController.cjs.map +1 -1
  3. package/dist/TransactionController.d.cts +1 -1
  4. package/dist/TransactionController.d.cts.map +1 -1
  5. package/dist/TransactionController.d.mts +1 -1
  6. package/dist/TransactionController.d.mts.map +1 -1
  7. package/dist/TransactionController.mjs +8 -4
  8. package/dist/TransactionController.mjs.map +1 -1
  9. package/dist/helpers/GasFeePoller.cjs +2 -4
  10. package/dist/helpers/GasFeePoller.cjs.map +1 -1
  11. package/dist/helpers/GasFeePoller.d.cts +2 -4
  12. package/dist/helpers/GasFeePoller.d.cts.map +1 -1
  13. package/dist/helpers/GasFeePoller.d.mts +2 -4
  14. package/dist/helpers/GasFeePoller.d.mts.map +1 -1
  15. package/dist/helpers/GasFeePoller.mjs +2 -4
  16. package/dist/helpers/GasFeePoller.mjs.map +1 -1
  17. package/dist/helpers/PendingTransactionTracker.cjs +2 -6
  18. package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
  19. package/dist/helpers/PendingTransactionTracker.d.cts +2 -5
  20. package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
  21. package/dist/helpers/PendingTransactionTracker.d.mts +2 -5
  22. package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
  23. package/dist/helpers/PendingTransactionTracker.mjs +2 -6
  24. package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
  25. package/dist/helpers/TransactionPoller.cjs +8 -12
  26. package/dist/helpers/TransactionPoller.cjs.map +1 -1
  27. package/dist/helpers/TransactionPoller.d.cts +3 -7
  28. package/dist/helpers/TransactionPoller.d.cts.map +1 -1
  29. package/dist/helpers/TransactionPoller.d.mts +3 -7
  30. package/dist/helpers/TransactionPoller.d.mts.map +1 -1
  31. package/dist/helpers/TransactionPoller.mjs +7 -11
  32. package/dist/helpers/TransactionPoller.mjs.map +1 -1
  33. package/dist/utils/feature-flags.cjs +31 -15
  34. package/dist/utils/feature-flags.cjs.map +1 -1
  35. package/dist/utils/feature-flags.d.cts +38 -26
  36. package/dist/utils/feature-flags.d.cts.map +1 -1
  37. package/dist/utils/feature-flags.d.mts +38 -26
  38. package/dist/utils/feature-flags.d.mts.map +1 -1
  39. package/dist/utils/feature-flags.mjs +28 -13
  40. package/dist/utils/feature-flags.mjs.map +1 -1
  41. package/dist/utils/gas.cjs +9 -4
  42. package/dist/utils/gas.cjs.map +1 -1
  43. package/dist/utils/gas.d.cts +6 -3
  44. package/dist/utils/gas.d.cts.map +1 -1
  45. package/dist/utils/gas.d.mts +6 -3
  46. package/dist/utils/gas.d.mts.map +1 -1
  47. package/dist/utils/gas.mjs +8 -3
  48. package/dist/utils/gas.mjs.map +1 -1
  49. package/dist/utils/utils.cjs +23 -1
  50. package/dist/utils/utils.cjs.map +1 -1
  51. package/dist/utils/utils.d.cts +8 -0
  52. package/dist/utils/utils.d.cts.map +1 -1
  53. package/dist/utils/utils.d.mts +8 -0
  54. package/dist/utils/utils.d.mts.map +1 -1
  55. package/dist/utils/utils.mjs +22 -1
  56. package/dist/utils/utils.mjs.map +1 -1
  57. package/package.json +1 -1
@@ -2,6 +2,19 @@ import { type Hex } from "@metamask/utils";
2
2
  import type { TransactionControllerMessenger } from "../TransactionController.cjs";
3
3
  export declare const FEATURE_FLAG_TRANSACTIONS = "confirmations_transactions";
4
4
  export declare const FEATURE_FLAG_EIP_7702 = "confirmations_eip_7702";
5
+ type GasEstimateFallback = {
6
+ /**
7
+ * The fallback gas estimate for a transaction.
8
+ * This value is either a fixed hexadecimal number or a percentage multiplier.
9
+ */
10
+ value: number | Hex;
11
+ /**
12
+ * Indicates whether the gas estimate is a fixed hexadecimal number or a percentage multiplier.
13
+ * - `true`: The gas estimate is a fixed hexadecimal number.
14
+ * - `false`: The gas estimate is a percentage multiplier.
15
+ */
16
+ isFixedGas: boolean;
17
+ };
5
18
  export type TransactionControllerFeatureFlags = {
6
19
  [FEATURE_FLAG_EIP_7702]?: {
7
20
  /**
@@ -21,28 +34,15 @@ export type TransactionControllerFeatureFlags = {
21
34
  [FEATURE_FLAG_TRANSACTIONS]?: {
22
35
  /** Maximum number of transactions that can be in an external batch. */
23
36
  batchSizeLimit?: number;
24
- acceleratedPolling?: {
25
- /**
26
- * Accelerated polling is used to speed up the polling process for
27
- * transactions that are not yet confirmed.
28
- */
29
- perChainConfig?: {
30
- /** Accelerated polling parameters on a per-chain basis. */
31
- [chainId: Hex]: {
32
- /**
33
- * Maximum number of polling requests that can be made in a row, before
34
- * the normal polling resumes.
35
- */
36
- countMax?: number;
37
- /** Interval between polling requests in milliseconds. */
38
- intervalMs?: number;
39
- };
40
- };
41
- /** Default `countMax` in case no chain-specific parameter is set. */
42
- defaultCountMax?: number;
43
- /** Default `intervalMs` in case no chain-specific parameter is set. */
44
- defaultIntervalMs?: number;
37
+ /** Fallback gas estimation configurations per chain. */
38
+ gasEstimateFallbacks?: {
39
+ [chainId: Hex]: GasEstimateFallback;
45
40
  };
41
+ /**
42
+ * Default gas estimate fallback.
43
+ * This value is used when no specific gas estimate fallback is found for a chain ID.
44
+ */
45
+ defaultGasEstimateFallback?: GasEstimateFallback;
46
46
  };
47
47
  };
48
48
  /**
@@ -79,14 +79,26 @@ export declare function getEIP7702UpgradeContractAddress(chainId: Hex, messenger
79
79
  */
80
80
  export declare function getBatchSizeLimit(messenger: TransactionControllerMessenger): number;
81
81
  /**
82
- * Retrieves the accelerated polling parameters for a given chain ID.
82
+ * Retrieves the gas estimate fallback for a given chain ID.
83
+ * Defaults to the default gas estimate fallback if not set.
83
84
  *
84
85
  * @param chainId - The chain ID.
85
86
  * @param messenger - The controller messenger instance.
86
- * @returns The accelerated polling parameters: `countMax` and `intervalMs`.
87
+ * @returns The gas estimate fallback.
88
+ */
89
+ export declare function getGasEstimateFallback(chainId: Hex, messenger: TransactionControllerMessenger): {
90
+ gasEstimateFallback: number | Hex;
91
+ isFixedGas: boolean;
92
+ };
93
+ /**
94
+ * Retrieves the default gas estimate fallback.
95
+ *
96
+ * @param messenger - The controller messenger instance.
97
+ * @returns The default gas estimate fallback.
87
98
  */
88
- export declare function getAcceleratedPollingParams(chainId: Hex, messenger: TransactionControllerMessenger): {
89
- countMax: number;
90
- intervalMs: number;
99
+ export declare function getDefaultGasEstimateFallback(messenger: TransactionControllerMessenger): {
100
+ gasEstimateFallback: number | Hex;
101
+ isFixedGas: boolean;
91
102
  };
103
+ export {};
92
104
  //# sourceMappingURL=feature-flags.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.d.cts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,GAAG,EAAE,wBAAwB;AAI/D,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAE/E,eAAO,MAAM,yBAAyB,+BAA+B,CAAC;AACtE,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAM9D,MAAM,MAAM,iCAAiC,GAAG;IAC9C,CAAC,qBAAqB,CAAC,CAAC,EAAE;QACxB;;;;WAIG;QACH,SAAS,CAAC,EAAE,MAAM,CAChB,GAAG,EACH;YACE,qCAAqC;YACrC,OAAO,EAAE,GAAG,CAAC;YAEb,qDAAqD;YACrD,SAAS,EAAE,GAAG,CAAC;SAChB,EAAE,CACJ,CAAC;QAEF,sDAAsD;QACtD,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC;KACzB,CAAC;IAEF,CAAC,yBAAyB,CAAC,CAAC,EAAE;QAC5B,uEAAuE;QACvE,cAAc,CAAC,EAAE,MAAM,CAAC;QAExB,kBAAkB,CAAC,EAAE;YACnB;;;eAGG;YACH,cAAc,CAAC,EAAE;gBACf,2DAA2D;gBAE3D,CAAC,OAAO,EAAE,GAAG,GAAG;oBACd;;;uBAGG;oBACH,QAAQ,CAAC,EAAE,MAAM,CAAC;oBAElB,yDAAyD;oBACzD,UAAU,CAAC,EAAE,MAAM,CAAC;iBACrB,CAAC;aACH,CAAC;YAEF,qEAAqE;YACrE,eAAe,CAAC,EAAE,MAAM,CAAC;YAEzB,uEAAuE;YACvE,iBAAiB,CAAC,EAAE,MAAM,CAAC;SAC5B,CAAC;KACH,CAAC;CACH,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,8BAA8B,GACxC,GAAG,EAAE,CAGP;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,EACzC,SAAS,EAAE,GAAG,GACb,GAAG,EAAE,CAiBP;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,EACzC,SAAS,EAAE,GAAG,GACb,GAAG,GAAG,SAAS,CAEjB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,8BAA8B,GACxC,MAAM,CAMR;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,GACxC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAiB1C"}
1
+ {"version":3,"file":"feature-flags.d.cts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,GAAG,EAAE,wBAAwB;AAI/D,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAE/E,eAAO,MAAM,yBAAyB,+BAA+B,CAAC;AACtE,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAK9D,KAAK,mBAAmB,GAAG;IACzB;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC;IAEpB;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,CAAC,qBAAqB,CAAC,CAAC,EAAE;QACxB;;;;WAIG;QACH,SAAS,CAAC,EAAE,MAAM,CAChB,GAAG,EACH;YACE,qCAAqC;YACrC,OAAO,EAAE,GAAG,CAAC;YAEb,qDAAqD;YACrD,SAAS,EAAE,GAAG,CAAC;SAChB,EAAE,CACJ,CAAC;QAEF,sDAAsD;QACtD,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC;KACzB,CAAC;IAEF,CAAC,yBAAyB,CAAC,CAAC,EAAE;QAC5B,uEAAuE;QACvE,cAAc,CAAC,EAAE,MAAM,CAAC;QAExB,wDAAwD;QACxD,oBAAoB,CAAC,EAAE;YACrB,CAAC,OAAO,EAAE,GAAG,GAAG,mBAAmB,CAAC;SACrC,CAAC;QAEF;;;WAGG;QACH,0BAA0B,CAAC,EAAE,mBAAmB,CAAC;KAClD,CAAC;CACH,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,8BAA8B,GACxC,GAAG,EAAE,CAGP;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,EACzC,SAAS,EAAE,GAAG,GACb,GAAG,EAAE,CAiBP;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,EACzC,SAAS,EAAE,GAAG,GACb,GAAG,GAAG,SAAS,CAEjB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,8BAA8B,GACxC,MAAM,CAMR;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,GACxC;IACD,mBAAmB,EAAE,MAAM,GAAG,GAAG,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;CACrB,CAcA;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,8BAA8B,GACxC;IACD,mBAAmB,EAAE,MAAM,GAAG,GAAG,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;CACrB,CAYA"}
@@ -2,6 +2,19 @@ import { type Hex } from "@metamask/utils";
2
2
  import type { TransactionControllerMessenger } from "../TransactionController.mjs";
3
3
  export declare const FEATURE_FLAG_TRANSACTIONS = "confirmations_transactions";
4
4
  export declare const FEATURE_FLAG_EIP_7702 = "confirmations_eip_7702";
5
+ type GasEstimateFallback = {
6
+ /**
7
+ * The fallback gas estimate for a transaction.
8
+ * This value is either a fixed hexadecimal number or a percentage multiplier.
9
+ */
10
+ value: number | Hex;
11
+ /**
12
+ * Indicates whether the gas estimate is a fixed hexadecimal number or a percentage multiplier.
13
+ * - `true`: The gas estimate is a fixed hexadecimal number.
14
+ * - `false`: The gas estimate is a percentage multiplier.
15
+ */
16
+ isFixedGas: boolean;
17
+ };
5
18
  export type TransactionControllerFeatureFlags = {
6
19
  [FEATURE_FLAG_EIP_7702]?: {
7
20
  /**
@@ -21,28 +34,15 @@ export type TransactionControllerFeatureFlags = {
21
34
  [FEATURE_FLAG_TRANSACTIONS]?: {
22
35
  /** Maximum number of transactions that can be in an external batch. */
23
36
  batchSizeLimit?: number;
24
- acceleratedPolling?: {
25
- /**
26
- * Accelerated polling is used to speed up the polling process for
27
- * transactions that are not yet confirmed.
28
- */
29
- perChainConfig?: {
30
- /** Accelerated polling parameters on a per-chain basis. */
31
- [chainId: Hex]: {
32
- /**
33
- * Maximum number of polling requests that can be made in a row, before
34
- * the normal polling resumes.
35
- */
36
- countMax?: number;
37
- /** Interval between polling requests in milliseconds. */
38
- intervalMs?: number;
39
- };
40
- };
41
- /** Default `countMax` in case no chain-specific parameter is set. */
42
- defaultCountMax?: number;
43
- /** Default `intervalMs` in case no chain-specific parameter is set. */
44
- defaultIntervalMs?: number;
37
+ /** Fallback gas estimation configurations per chain. */
38
+ gasEstimateFallbacks?: {
39
+ [chainId: Hex]: GasEstimateFallback;
45
40
  };
41
+ /**
42
+ * Default gas estimate fallback.
43
+ * This value is used when no specific gas estimate fallback is found for a chain ID.
44
+ */
45
+ defaultGasEstimateFallback?: GasEstimateFallback;
46
46
  };
47
47
  };
48
48
  /**
@@ -79,14 +79,26 @@ export declare function getEIP7702UpgradeContractAddress(chainId: Hex, messenger
79
79
  */
80
80
  export declare function getBatchSizeLimit(messenger: TransactionControllerMessenger): number;
81
81
  /**
82
- * Retrieves the accelerated polling parameters for a given chain ID.
82
+ * Retrieves the gas estimate fallback for a given chain ID.
83
+ * Defaults to the default gas estimate fallback if not set.
83
84
  *
84
85
  * @param chainId - The chain ID.
85
86
  * @param messenger - The controller messenger instance.
86
- * @returns The accelerated polling parameters: `countMax` and `intervalMs`.
87
+ * @returns The gas estimate fallback.
88
+ */
89
+ export declare function getGasEstimateFallback(chainId: Hex, messenger: TransactionControllerMessenger): {
90
+ gasEstimateFallback: number | Hex;
91
+ isFixedGas: boolean;
92
+ };
93
+ /**
94
+ * Retrieves the default gas estimate fallback.
95
+ *
96
+ * @param messenger - The controller messenger instance.
97
+ * @returns The default gas estimate fallback.
87
98
  */
88
- export declare function getAcceleratedPollingParams(chainId: Hex, messenger: TransactionControllerMessenger): {
89
- countMax: number;
90
- intervalMs: number;
99
+ export declare function getDefaultGasEstimateFallback(messenger: TransactionControllerMessenger): {
100
+ gasEstimateFallback: number | Hex;
101
+ isFixedGas: boolean;
91
102
  };
103
+ export {};
92
104
  //# sourceMappingURL=feature-flags.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.d.mts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,GAAG,EAAE,wBAAwB;AAI/D,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAE/E,eAAO,MAAM,yBAAyB,+BAA+B,CAAC;AACtE,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAM9D,MAAM,MAAM,iCAAiC,GAAG;IAC9C,CAAC,qBAAqB,CAAC,CAAC,EAAE;QACxB;;;;WAIG;QACH,SAAS,CAAC,EAAE,MAAM,CAChB,GAAG,EACH;YACE,qCAAqC;YACrC,OAAO,EAAE,GAAG,CAAC;YAEb,qDAAqD;YACrD,SAAS,EAAE,GAAG,CAAC;SAChB,EAAE,CACJ,CAAC;QAEF,sDAAsD;QACtD,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC;KACzB,CAAC;IAEF,CAAC,yBAAyB,CAAC,CAAC,EAAE;QAC5B,uEAAuE;QACvE,cAAc,CAAC,EAAE,MAAM,CAAC;QAExB,kBAAkB,CAAC,EAAE;YACnB;;;eAGG;YACH,cAAc,CAAC,EAAE;gBACf,2DAA2D;gBAE3D,CAAC,OAAO,EAAE,GAAG,GAAG;oBACd;;;uBAGG;oBACH,QAAQ,CAAC,EAAE,MAAM,CAAC;oBAElB,yDAAyD;oBACzD,UAAU,CAAC,EAAE,MAAM,CAAC;iBACrB,CAAC;aACH,CAAC;YAEF,qEAAqE;YACrE,eAAe,CAAC,EAAE,MAAM,CAAC;YAEzB,uEAAuE;YACvE,iBAAiB,CAAC,EAAE,MAAM,CAAC;SAC5B,CAAC;KACH,CAAC;CACH,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,8BAA8B,GACxC,GAAG,EAAE,CAGP;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,EACzC,SAAS,EAAE,GAAG,GACb,GAAG,EAAE,CAiBP;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,EACzC,SAAS,EAAE,GAAG,GACb,GAAG,GAAG,SAAS,CAEjB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,8BAA8B,GACxC,MAAM,CAMR;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,GACxC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAiB1C"}
1
+ {"version":3,"file":"feature-flags.d.mts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,GAAG,EAAE,wBAAwB;AAI/D,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAE/E,eAAO,MAAM,yBAAyB,+BAA+B,CAAC;AACtE,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAK9D,KAAK,mBAAmB,GAAG;IACzB;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC;IAEpB;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,CAAC,qBAAqB,CAAC,CAAC,EAAE;QACxB;;;;WAIG;QACH,SAAS,CAAC,EAAE,MAAM,CAChB,GAAG,EACH;YACE,qCAAqC;YACrC,OAAO,EAAE,GAAG,CAAC;YAEb,qDAAqD;YACrD,SAAS,EAAE,GAAG,CAAC;SAChB,EAAE,CACJ,CAAC;QAEF,sDAAsD;QACtD,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC;KACzB,CAAC;IAEF,CAAC,yBAAyB,CAAC,CAAC,EAAE;QAC5B,uEAAuE;QACvE,cAAc,CAAC,EAAE,MAAM,CAAC;QAExB,wDAAwD;QACxD,oBAAoB,CAAC,EAAE;YACrB,CAAC,OAAO,EAAE,GAAG,GAAG,mBAAmB,CAAC;SACrC,CAAC;QAEF;;;WAGG;QACH,0BAA0B,CAAC,EAAE,mBAAmB,CAAC;KAClD,CAAC;CACH,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,8BAA8B,GACxC,GAAG,EAAE,CAGP;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,EACzC,SAAS,EAAE,GAAG,GACb,GAAG,EAAE,CAiBP;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,EACzC,SAAS,EAAE,GAAG,GACb,GAAG,GAAG,SAAS,CAEjB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,8BAA8B,GACxC,MAAM,CAMR;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,8BAA8B,GACxC;IACD,mBAAmB,EAAE,MAAM,GAAG,GAAG,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;CACrB,CAcA;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,8BAA8B,GACxC;IACD,mBAAmB,EAAE,MAAM,GAAG,GAAG,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;CACrB,CAYA"}
@@ -4,8 +4,7 @@ import { projectLogger } from "../logger.mjs";
4
4
  export const FEATURE_FLAG_TRANSACTIONS = 'confirmations_transactions';
5
5
  export const FEATURE_FLAG_EIP_7702 = 'confirmations_eip_7702';
6
6
  const DEFAULT_BATCH_SIZE_LIMIT = 10;
7
- const DEFAULT_ACCELERATED_POLLING_COUNT_MAX = 10;
8
- const DEFAULT_ACCELERATED_POLLING_INTERVAL_MS = 3 * 1000;
7
+ const DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;
9
8
  const log = createModuleLogger(projectLogger, 'feature-flags');
10
9
  /**
11
10
  * Retrieves the supported EIP-7702 chains.
@@ -56,22 +55,38 @@ export function getBatchSizeLimit(messenger) {
56
55
  DEFAULT_BATCH_SIZE_LIMIT);
57
56
  }
58
57
  /**
59
- * Retrieves the accelerated polling parameters for a given chain ID.
58
+ * Retrieves the gas estimate fallback for a given chain ID.
59
+ * Defaults to the default gas estimate fallback if not set.
60
60
  *
61
61
  * @param chainId - The chain ID.
62
62
  * @param messenger - The controller messenger instance.
63
- * @returns The accelerated polling parameters: `countMax` and `intervalMs`.
63
+ * @returns The gas estimate fallback.
64
64
  */
65
- export function getAcceleratedPollingParams(chainId, messenger) {
65
+ export function getGasEstimateFallback(chainId, messenger) {
66
66
  const featureFlags = getFeatureFlags(messenger);
67
- const acceleratedPollingParams = featureFlags?.[FEATURE_FLAG_TRANSACTIONS]?.acceleratedPolling;
68
- const countMax = acceleratedPollingParams?.perChainConfig?.[chainId]?.countMax ||
69
- acceleratedPollingParams?.defaultCountMax ||
70
- DEFAULT_ACCELERATED_POLLING_COUNT_MAX;
71
- const intervalMs = acceleratedPollingParams?.perChainConfig?.[chainId]?.intervalMs ||
72
- acceleratedPollingParams?.defaultIntervalMs ||
73
- DEFAULT_ACCELERATED_POLLING_INTERVAL_MS;
74
- return { countMax, intervalMs };
67
+ const gasEstimateFallbackPerChain = featureFlags?.[FEATURE_FLAG_TRANSACTIONS]?.gasEstimateFallbacks?.[chainId];
68
+ if (gasEstimateFallbackPerChain) {
69
+ return {
70
+ gasEstimateFallback: gasEstimateFallbackPerChain.value,
71
+ isFixedGas: gasEstimateFallbackPerChain.isFixedGas,
72
+ };
73
+ }
74
+ return getDefaultGasEstimateFallback(messenger);
75
+ }
76
+ /**
77
+ * Retrieves the default gas estimate fallback.
78
+ *
79
+ * @param messenger - The controller messenger instance.
80
+ * @returns The default gas estimate fallback.
81
+ */
82
+ export function getDefaultGasEstimateFallback(messenger) {
83
+ const featureFlags = getFeatureFlags(messenger);
84
+ const defaultGasEstimateFallback = featureFlags?.[FEATURE_FLAG_TRANSACTIONS]?.defaultGasEstimateFallback;
85
+ return {
86
+ gasEstimateFallback: defaultGasEstimateFallback?.value ??
87
+ DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT,
88
+ isFixedGas: defaultGasEstimateFallback?.isFixedGas ?? false,
89
+ };
75
90
  }
76
91
  /**
77
92
  * Retrieves the relevant feature flags from the remote feature flag controller.
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.mjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAY,wBAAwB;AAE/D,OAAO,EAAE,gBAAgB,EAAE,wBAAoB;AAC/C,OAAO,EAAE,aAAa,EAAE,sBAAkB;AAG1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,4BAA4B,CAAC;AACtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AAE9D,MAAM,wBAAwB,GAAG,EAAE,CAAC;AACpC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AACjD,MAAM,uCAAuC,GAAG,CAAC,GAAG,IAAI,CAAC;AAyDzD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,SAAyC;IAEzC,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAChD,OAAO,YAAY,EAAE,CAAC,qBAAqB,CAAC,EAAE,eAAe,IAAI,EAAE,CAAC;AACtE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAY,EACZ,SAAyC,EACzC,SAAc;IAEd,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAEhD,MAAM,SAAS,GACb,YAAY,EAAE,CAAC,qBAAqB,CAAC,EAAE,SAAS,EAAE,CAChD,OAAO,CAAC,WAAW,EAAS,CAC7B,IAAI,EAAE,CAAC;IAEV,OAAO,SAAS;SACb,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnB,gBAAgB,CACd,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,EAC3B,QAAQ,CAAC,SAAS,EAClB,SAAS,CACV,CACF;SACA,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gCAAgC,CAC9C,OAAY,EACZ,SAAyC,EACzC,SAAc;IAEd,OAAO,2BAA2B,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAyC;IAEzC,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAChD,OAAO,CACL,YAAY,EAAE,CAAC,yBAAyB,CAAC,EAAE,cAAc;QACzD,wBAAwB,CACzB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAY,EACZ,SAAyC;IAEzC,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAEhD,MAAM,wBAAwB,GAC5B,YAAY,EAAE,CAAC,yBAAyB,CAAC,EAAE,kBAAkB,CAAC;IAEhE,MAAM,QAAQ,GACZ,wBAAwB,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ;QAC7D,wBAAwB,EAAE,eAAe;QACzC,qCAAqC,CAAC;IAExC,MAAM,UAAU,GACd,wBAAwB,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE,UAAU;QAC/D,wBAAwB,EAAE,iBAAiB;QAC3C,uCAAuC,CAAC;IAE1C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CACtB,SAAyC;IAEzC,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CACjC,sCAAsC,CACvC,CAAC,kBAAkB,CAAC;IAErB,GAAG,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;IAE7C,OAAO,YAAiD,CAAC;AAC3D,CAAC","sourcesContent":["import { createModuleLogger, type Hex } from '@metamask/utils';\n\nimport { isValidSignature } from './signature';\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\n\nexport const FEATURE_FLAG_TRANSACTIONS = 'confirmations_transactions';\nexport const FEATURE_FLAG_EIP_7702 = 'confirmations_eip_7702';\n\nconst DEFAULT_BATCH_SIZE_LIMIT = 10;\nconst DEFAULT_ACCELERATED_POLLING_COUNT_MAX = 10;\nconst DEFAULT_ACCELERATED_POLLING_INTERVAL_MS = 3 * 1000;\n\nexport type TransactionControllerFeatureFlags = {\n [FEATURE_FLAG_EIP_7702]?: {\n /**\n * All contracts that support EIP-7702 batch transactions.\n * Keyed by chain ID.\n * First entry in each array is the contract that standard EOAs will be upgraded to.\n */\n contracts?: Record<\n Hex,\n {\n /** Address of the smart contract. */\n address: Hex;\n\n /** Signature to verify the contract is authentic. */\n signature: Hex;\n }[]\n >;\n\n /** Chains enabled for EIP-7702 batch transactions. */\n supportedChains?: Hex[];\n };\n\n [FEATURE_FLAG_TRANSACTIONS]?: {\n /** Maximum number of transactions that can be in an external batch. */\n batchSizeLimit?: number;\n\n acceleratedPolling?: {\n /**\n * Accelerated polling is used to speed up the polling process for\n * transactions that are not yet confirmed.\n */\n perChainConfig?: {\n /** Accelerated polling parameters on a per-chain basis. */\n\n [chainId: Hex]: {\n /**\n * Maximum number of polling requests that can be made in a row, before\n * the normal polling resumes.\n */\n countMax?: number;\n\n /** Interval between polling requests in milliseconds. */\n intervalMs?: number;\n };\n };\n\n /** Default `countMax` in case no chain-specific parameter is set. */\n defaultCountMax?: number;\n\n /** Default `intervalMs` in case no chain-specific parameter is set. */\n defaultIntervalMs?: number;\n };\n };\n};\n\nconst log = createModuleLogger(projectLogger, 'feature-flags');\n\n/**\n * Retrieves the supported EIP-7702 chains.\n *\n * @param messenger - The controller messenger instance.\n * @returns The supported chains.\n */\nexport function getEIP7702SupportedChains(\n messenger: TransactionControllerMessenger,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n return featureFlags?.[FEATURE_FLAG_EIP_7702]?.supportedChains ?? [];\n}\n\n/**\n * Retrieves the supported EIP-7702 contract addresses for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The supported contract addresses.\n */\nexport function getEIP7702ContractAddresses(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n\n const contracts =\n featureFlags?.[FEATURE_FLAG_EIP_7702]?.contracts?.[\n chainId.toLowerCase() as Hex\n ] ?? [];\n\n return contracts\n .filter((contract) =>\n isValidSignature(\n [contract.address, chainId],\n contract.signature,\n publicKey,\n ),\n )\n .map((contract) => contract.address);\n}\n\n/**\n * Retrieves the EIP-7702 upgrade contract address.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The upgrade contract address.\n */\nexport function getEIP7702UpgradeContractAddress(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex | undefined {\n return getEIP7702ContractAddresses(chainId, messenger, publicKey)?.[0];\n}\n\n/**\n * Retrieves the batch size limit.\n * Defaults to 10 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The batch size limit.\n */\nexport function getBatchSizeLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FEATURE_FLAG_TRANSACTIONS]?.batchSizeLimit ??\n DEFAULT_BATCH_SIZE_LIMIT\n );\n}\n\n/**\n * Retrieves the accelerated polling parameters for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The accelerated polling parameters: `countMax` and `intervalMs`.\n */\nexport function getAcceleratedPollingParams(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): { countMax: number; intervalMs: number } {\n const featureFlags = getFeatureFlags(messenger);\n\n const acceleratedPollingParams =\n featureFlags?.[FEATURE_FLAG_TRANSACTIONS]?.acceleratedPolling;\n\n const countMax =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.countMax ||\n acceleratedPollingParams?.defaultCountMax ||\n DEFAULT_ACCELERATED_POLLING_COUNT_MAX;\n\n const intervalMs =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.intervalMs ||\n acceleratedPollingParams?.defaultIntervalMs ||\n DEFAULT_ACCELERATED_POLLING_INTERVAL_MS;\n\n return { countMax, intervalMs };\n}\n\n/**\n * Retrieves the relevant feature flags from the remote feature flag controller.\n *\n * @param messenger - The messenger instance.\n * @returns The feature flags.\n */\nfunction getFeatureFlags(\n messenger: TransactionControllerMessenger,\n): TransactionControllerFeatureFlags {\n const featureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags;\n\n log('Retrieved feature flags', featureFlags);\n\n return featureFlags as TransactionControllerFeatureFlags;\n}\n"]}
1
+ {"version":3,"file":"feature-flags.mjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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","sourcesContent":["import { createModuleLogger, type Hex } from '@metamask/utils';\n\nimport { isValidSignature } from './signature';\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\n\nexport const FEATURE_FLAG_TRANSACTIONS = 'confirmations_transactions';\nexport const FEATURE_FLAG_EIP_7702 = 'confirmations_eip_7702';\n\nconst DEFAULT_BATCH_SIZE_LIMIT = 10;\nconst DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;\n\ntype GasEstimateFallback = {\n /**\n * The fallback gas estimate for a transaction.\n * This value is either a fixed hexadecimal number or a percentage multiplier.\n */\n value: number | Hex;\n\n /**\n * Indicates whether the gas estimate is a fixed hexadecimal number or a percentage multiplier.\n * - `true`: The gas estimate is a fixed hexadecimal number.\n * - `false`: The gas estimate is a percentage multiplier.\n */\n isFixedGas: boolean;\n};\n\nexport type TransactionControllerFeatureFlags = {\n [FEATURE_FLAG_EIP_7702]?: {\n /**\n * All contracts that support EIP-7702 batch transactions.\n * Keyed by chain ID.\n * First entry in each array is the contract that standard EOAs will be upgraded to.\n */\n contracts?: Record<\n Hex,\n {\n /** Address of the smart contract. */\n address: Hex;\n\n /** Signature to verify the contract is authentic. */\n signature: Hex;\n }[]\n >;\n\n /** Chains enabled for EIP-7702 batch transactions. */\n supportedChains?: Hex[];\n };\n\n [FEATURE_FLAG_TRANSACTIONS]?: {\n /** Maximum number of transactions that can be in an external batch. */\n batchSizeLimit?: number;\n\n /** Fallback gas estimation configurations per chain. */\n gasEstimateFallbacks?: {\n [chainId: Hex]: GasEstimateFallback;\n };\n\n /**\n * Default gas estimate fallback.\n * This value is used when no specific gas estimate fallback is found for a chain ID.\n */\n defaultGasEstimateFallback?: GasEstimateFallback;\n };\n};\n\nconst log = createModuleLogger(projectLogger, 'feature-flags');\n\n/**\n * Retrieves the supported EIP-7702 chains.\n *\n * @param messenger - The controller messenger instance.\n * @returns The supported chains.\n */\nexport function getEIP7702SupportedChains(\n messenger: TransactionControllerMessenger,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n return featureFlags?.[FEATURE_FLAG_EIP_7702]?.supportedChains ?? [];\n}\n\n/**\n * Retrieves the supported EIP-7702 contract addresses for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The supported contract addresses.\n */\nexport function getEIP7702ContractAddresses(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n\n const contracts =\n featureFlags?.[FEATURE_FLAG_EIP_7702]?.contracts?.[\n chainId.toLowerCase() as Hex\n ] ?? [];\n\n return contracts\n .filter((contract) =>\n isValidSignature(\n [contract.address, chainId],\n contract.signature,\n publicKey,\n ),\n )\n .map((contract) => contract.address);\n}\n\n/**\n * Retrieves the EIP-7702 upgrade contract address.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The upgrade contract address.\n */\nexport function getEIP7702UpgradeContractAddress(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex | undefined {\n return getEIP7702ContractAddresses(chainId, messenger, publicKey)?.[0];\n}\n\n/**\n * Retrieves the batch size limit.\n * Defaults to 10 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The batch size limit.\n */\nexport function getBatchSizeLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FEATURE_FLAG_TRANSACTIONS]?.batchSizeLimit ??\n DEFAULT_BATCH_SIZE_LIMIT\n );\n}\n\n/**\n * Retrieves the gas estimate fallback for a given chain ID.\n * Defaults to the default gas estimate fallback if not set.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The gas estimate fallback.\n */\nexport function getGasEstimateFallback(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): {\n gasEstimateFallback: number | Hex;\n isFixedGas: boolean;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const gasEstimateFallbackPerChain =\n featureFlags?.[FEATURE_FLAG_TRANSACTIONS]?.gasEstimateFallbacks?.[chainId];\n\n if (gasEstimateFallbackPerChain) {\n return {\n gasEstimateFallback: gasEstimateFallbackPerChain.value,\n isFixedGas: gasEstimateFallbackPerChain.isFixedGas,\n };\n }\n\n return getDefaultGasEstimateFallback(messenger);\n}\n\n/**\n * Retrieves the default gas estimate fallback.\n *\n * @param messenger - The controller messenger instance.\n * @returns The default gas estimate fallback.\n */\nexport function getDefaultGasEstimateFallback(\n messenger: TransactionControllerMessenger,\n): {\n gasEstimateFallback: number | Hex;\n isFixedGas: boolean;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const defaultGasEstimateFallback =\n featureFlags?.[FEATURE_FLAG_TRANSACTIONS]?.defaultGasEstimateFallback;\n\n return {\n gasEstimateFallback:\n defaultGasEstimateFallback?.value ??\n DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT,\n isFixedGas: defaultGasEstimateFallback?.isFixedGas ?? false,\n };\n}\n\n/**\n * Retrieves the relevant feature flags from the remote feature flag controller.\n *\n * @param messenger - The messenger instance.\n * @returns The feature flags.\n */\nfunction getFeatureFlags(\n messenger: TransactionControllerMessenger,\n): TransactionControllerFeatureFlags {\n const featureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags;\n\n log('Retrieved feature flags', featureFlags);\n\n return featureFlags as TransactionControllerFeatureFlags;\n}\n"]}
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.addGasBuffer = exports.estimateGas = exports.updateGas = exports.DUMMY_AUTHORIZATION_SIGNATURE = exports.INTRINSIC_GAS = exports.MAX_GAS_BLOCK_PERCENT = exports.GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = exports.DEFAULT_GAS_MULTIPLIER = exports.FIXED_GAS = exports.log = void 0;
3
+ exports.addGasBuffer = exports.estimateGas = exports.updateGas = exports.DUMMY_AUTHORIZATION_SIGNATURE = exports.INTRINSIC_GAS = exports.MAX_GAS_BLOCK_PERCENT = exports.DEFAULT_GAS_MULTIPLIER = exports.FIXED_GAS = exports.log = void 0;
4
4
  const controller_utils_1 = require("@metamask/controller-utils");
5
5
  const utils_1 = require("@metamask/utils");
6
6
  const eip7702_1 = require("./eip7702.cjs");
7
+ const feature_flags_1 = require("./feature-flags.cjs");
7
8
  const simulation_api_1 = require("./simulation-api.cjs");
8
9
  const constants_1 = require("../constants.cjs");
9
10
  const logger_1 = require("../logger.cjs");
@@ -11,7 +12,6 @@ const types_1 = require("../types.cjs");
11
12
  exports.log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'gas');
12
13
  exports.FIXED_GAS = '0x5208';
13
14
  exports.DEFAULT_GAS_MULTIPLIER = 1.5;
14
- exports.GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;
15
15
  exports.MAX_GAS_BLOCK_PERCENT = 90;
16
16
  exports.INTRINSIC_GAS = 21000;
17
17
  exports.DUMMY_AUTHORIZATION_SIGNATURE = '0x1111111111111111111111111111111111111111111111111111111111111111';
@@ -44,15 +44,19 @@ exports.updateGas = updateGas;
44
44
  * @param options.chainId - The chain ID of the transaction.
45
45
  * @param options.ethQuery - The EthQuery instance to interact with the network.
46
46
  * @param options.isSimulationEnabled - Whether the simulation is enabled.
47
+ * @param options.messenger - The messenger instance for communication.
47
48
  * @param options.txParams - The transaction parameters.
48
49
  * @returns The estimated gas and related info.
49
50
  */
50
- async function estimateGas({ chainId, ethQuery, isSimulationEnabled, txParams, }) {
51
+ async function estimateGas({ chainId, ethQuery, isSimulationEnabled, messenger, txParams, }) {
51
52
  const request = { ...txParams };
52
53
  const { authorizationList, data, from, value, to } = request;
53
54
  const { gasLimit: blockGasLimit, number: blockNumber } = await getLatestBlock(ethQuery);
54
55
  const blockGasLimitBN = (0, controller_utils_1.hexToBN)(blockGasLimit);
55
- const fallback = (0, controller_utils_1.BNToHex)((0, controller_utils_1.fractionBN)(blockGasLimitBN, exports.GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT, 100));
56
+ const { gasEstimateFallback, isFixedGas } = (0, feature_flags_1.getGasEstimateFallback)(chainId, messenger);
57
+ const fallback = isFixedGas
58
+ ? gasEstimateFallback
59
+ : (0, controller_utils_1.BNToHex)((0, controller_utils_1.fractionBN)(blockGasLimitBN, gasEstimateFallback, 100));
56
60
  request.data = data ? (0, utils_1.add0x)(data) : data;
57
61
  request.value = value || '0x0';
58
62
  request.authorizationList = normalizeAuthorizationList(request.authorizationList, chainId);
@@ -142,6 +146,7 @@ async function getGas(request) {
142
146
  chainId: request.chainId,
143
147
  ethQuery: request.ethQuery,
144
148
  isSimulationEnabled,
149
+ messenger: request.messenger,
145
150
  txParams: txMeta.txParams,
146
151
  });
147
152
  if (isCustomNetwork || simulationFails) {
@@ -1 +1 @@
1
- {"version":3,"file":"gas.cjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":";;;AAAA,iEAKoC;AAGpC,2CAAsE;AAEtE,2CAA8C;AAC9C,yDAAwD;AACxD,gDAA0D;AAC1D,0CAA0C;AAC1C,wCAIkB;AAUL,QAAA,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,KAAK,CAAC,CAAC;AAE/C,QAAA,SAAS,GAAG,QAAQ,CAAC;AACrB,QAAA,sBAAsB,GAAG,GAAG,CAAC;AAC7B,QAAA,mCAAmC,GAAG,EAAE,CAAC;AACzC,QAAA,qBAAqB,GAAG,EAAE,CAAC;AAC3B,QAAA,aAAa,GAAG,KAAK,CAAC;AAEtB,QAAA,6BAA6B,GACxC,oEAAoE,CAAC;AAEvE;;;;GAIG;AACI,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,aAAa,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAE7C,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,gBAAgB,CAAC,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvE,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;IAC1B,MAAM,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAE3C,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE;QACtB,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;KAClD;IAED,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE;QAC/B,MAAM,CAAC,mBAAmB,GAAG,EAAE,CAAC;KACjC;IAED,MAAM,CAAC,mBAAmB,CAAC,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;AACvD,CAAC;AAnBD,8BAmBC;AAED;;;;;;;;;;GAUG;AACI,KAAK,UAAU,WAAW,CAAC,EAChC,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,QAAQ,GAMT;IACC,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAE7D,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,GACpD,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEjC,MAAM,eAAe,GAAG,IAAA,0BAAO,EAAC,aAAa,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,IAAA,0BAAO,EACtB,IAAA,6BAAU,EAAC,eAAe,EAAE,2CAAmC,EAAE,GAAG,CAAC,CACtE,CAAC;IAEF,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAA,aAAK,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,OAAO,CAAC,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC;IAE/B,OAAO,CAAC,iBAAiB,GAAG,0BAA0B,CACpD,OAAO,CAAC,iBAAiB,EACzB,OAAO,CACR,CAAC;IAEF,OAAO,OAAO,CAAC,QAAQ,CAAC;IACxB,OAAO,OAAO,CAAC,YAAY,CAAC;IAC5B,OAAO,OAAO,CAAC,oBAAoB,CAAC;IAEpC,IAAI,YAAY,GAAG,QAAQ,CAAC;IAC5B,IAAI,eAAmD,CAAC;IAExD,MAAM,uBAAuB,GAC3B,QAAQ,CAAC,IAAI,KAAK,+BAAuB,CAAC,OAAO;QACjD,iBAAiB,EAAE,MAAM;QACzB,IAAI;QACJ,IAAI,KAAK,IAAI;QACb,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC;IAE5C,IAAI;QACF,IAAI,mBAAmB,IAAI,uBAAuB,EAAE;YAClD,YAAY,GAAG,MAAM,gCAAgC,CACnD,OAAO,EACP,QAAQ,EACR,OAAO,CACR,CAAC;SACH;aAAM;YACL,YAAY,GAAG,MAAM,IAAA,wBAAK,EAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;SAChE;QACD,8DAA8D;KAC/D;IAAC,OAAO,KAAU,EAAE;QACnB,eAAe,GAAG;YAChB,MAAM,EAAE,KAAK,CAAC,OAAO;YACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE;gBACL,WAAW;gBACX,aAAa;aACd;SACF,CAAC;QAEF,IAAA,WAAG,EAAC,mBAAmB,EAAE,EAAE,GAAG,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC;KAC5D;IAED,OAAO;QACL,aAAa;QACb,YAAY;QACZ,eAAe;KAChB,CAAC;AACJ,CAAC;AA1ED,kCA0EC;AAED;;;;;;;;GAQG;AACH,SAAgB,YAAY,CAC1B,YAAoB,EACpB,aAAqB,EACrB,UAAkB;IAElB,MAAM,cAAc,GAAG,IAAA,0BAAO,EAAC,YAAY,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,IAAA,6BAAU,EACzB,IAAA,0BAAO,EAAC,aAAa,CAAC,EACtB,6BAAqB,EACrB,GAAG,CACJ,CAAC;IAEF,MAAM,WAAW,GAAG,IAAA,6BAAU,EAAC,cAAc,EAAE,UAAU,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;IAEtE,IAAI,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE;QAC/B,MAAM,eAAe,GAAG,IAAA,aAAK,EAAC,YAAY,CAAC,CAAC;QAC5C,IAAA,WAAG,EAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;QAC9C,OAAO,eAAe,CAAC;KACxB;IAED,IAAI,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE;QAC5B,MAAM,SAAS,GAAG,IAAA,aAAK,EAAC,IAAA,0BAAO,EAAC,WAAW,CAAC,CAAC,CAAC;QAC9C,IAAA,WAAG,EAAC,uBAAuB,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACpD,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,MAAM,GAAG,IAAA,aAAK,EAAC,IAAA,0BAAO,EAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,IAAA,WAAG,EAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC;AA9BD,oCA8BC;AAED;;;;;GAKG;AACH,KAAK,UAAU,MAAM,CACnB,OAAyB;IAEzB,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC1E,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;IAEpC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE;QACvB,IAAA,WAAG,EAAC,0BAA0B,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;KAC9D;IAED,IAAI,MAAM,gBAAgB,CAAC,OAAO,CAAC,EAAE;QACnC,IAAA,WAAG,EAAC,mBAAmB,EAAE,iBAAS,CAAC,CAAC;QACpC,OAAO,CAAC,iBAAS,EAAE,SAAS,EAAE,iBAAS,CAAC,CAAC;KAC1C;IAED,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,MAAM,WAAW,CAAC;QACzE,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,mBAAmB;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;IAEH,IAAI,eAAe,IAAI,eAAe,EAAE;QACtC,IAAA,WAAG,EACD,eAAe;YACb,CAAC,CAAC,2CAA2C;YAC7C,CAAC,CAAC,uDAAuD,CAC5D,CAAC;QACF,OAAO,CAAC,YAAY,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;KACtD;IAED,IAAI,QAAQ,GAAG,YAAY,CAAC;IAE5B,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,gBAAgB,GACpB,sCAA0B,CACxB,OAAkD,CACnD,IAAI,8BAAsB,CAAC;QAE9B,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;KACxE;IAED,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,gBAAgB,CAAC,EAC9B,QAAQ,EACR,MAAM,EACN,eAAe,GACE;IACjB,MAAM,EACJ,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GACvB,GAAG,MAAM,CAAC;IAEX,IAAI,eAAe,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE;QAClC,OAAO,KAAK,CAAC;KACd;IAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEzC,OAAO,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,OAAO,CACpB,QAAkB,EAClB,OAAe;IAEf,OAAO,MAAM,IAAA,wBAAK,EAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,cAAc,CAC3B,QAAkB;IAElB,OAAO,MAAM,IAAA,wBAAK,EAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,gCAAgC,CAC7C,QAA2B,EAC3B,QAAkB,EAClB,OAAY;IAEZ,MAAM,UAAU,GAAG,MAAM,IAAA,wBAAK,EAAC,QAAQ,EAAE,aAAa,EAAE;QACtD;YACE,GAAG,QAAQ;YACX,IAAI,EAAE,IAAI;SACX;KACF,CAAC,CAAC;IAEH,IAAA,WAAG,EAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IAEpC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,OAAc,CAAC;IAEzE,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC;QACnC,OAAO,EAAE,OAAc;QACvB,iBAAiB;QACjB,WAAW,EAAE,QAAQ;KACtB,CAAC,CAAC;IAEH,IAAA,WAAG,EAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,IAAA,0BAAO,EACnB,IAAA,0BAAO,EAAC,UAAU,CAAC,CAAC,GAAG,CAAC,IAAA,0BAAO,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAa,CAAC,CACjE,CAAC;IAEF,IAAA,WAAG,EAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAE/B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,WAAW,CAAC,EACzB,OAAO,EACP,iBAAiB,EACjB,WAAW,GAKZ;IACC,MAAM,QAAQ,GAAG,MAAM,IAAA,qCAAoB,EAAC,OAAO,EAAE;QACnD,YAAY,EAAE;YACZ;gBACE,EAAE,EAAE,WAAW,CAAC,EAAS;gBACzB,IAAI,EAAE,WAAW,CAAC,IAAW;gBAC7B,IAAI,EAAE,WAAW,CAAC,IAAW;gBAC7B,KAAK,EAAE,WAAW,CAAC,KAAY;aAChC;SACF;QACD,SAAS,EAAE;YACT,CAAC,WAAW,CAAC,IAAc,CAAC,EAAE;gBAC5B,IAAI,EACF,iBAAiB;oBAChB,CAAC,2BAAiB,GAAG,IAAA,gBAAQ,EAAC,iBAAiB,CAAC,CAAS;aAC7D;SACF;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAEpD,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;KAC9C;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,0BAA0B,CACjC,iBAAyD,EACzD,OAAY;IAEZ,OAAO,iBAAiB,EAAE,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAChD,GAAG,aAAa;QAChB,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI,OAAO;QACzC,KAAK,EAAE,aAAa,CAAC,KAAK,IAAI,KAAK;QACnC,CAAC,EAAE,aAAa,CAAC,CAAC,IAAI,qCAA6B;QACnD,CAAC,EAAE,aAAa,CAAC,CAAC,IAAI,qCAA6B;QACnD,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI,KAAK;KACxC,CAAC,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {\n BNToHex,\n fractionBN,\n hexToBN,\n query,\n} from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type { Hex } from '@metamask/utils';\nimport { add0x, createModuleLogger, remove0x } from '@metamask/utils';\n\nimport { DELEGATION_PREFIX } from './eip7702';\nimport { simulateTransactions } from './simulation-api';\nimport { GAS_BUFFER_CHAIN_OVERRIDES } from '../constants';\nimport { projectLogger } from '../logger';\nimport {\n TransactionEnvelopeType,\n type TransactionMeta,\n type TransactionParams,\n} from '../types';\n\nexport type UpdateGasRequest = {\n chainId: Hex;\n ethQuery: EthQuery;\n isCustomNetwork: boolean;\n isSimulationEnabled: boolean;\n txMeta: TransactionMeta;\n};\n\nexport const log = createModuleLogger(projectLogger, 'gas');\n\nexport const FIXED_GAS = '0x5208';\nexport const DEFAULT_GAS_MULTIPLIER = 1.5;\nexport const GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;\nexport const MAX_GAS_BLOCK_PERCENT = 90;\nexport const INTRINSIC_GAS = 21000;\n\nexport const DUMMY_AUTHORIZATION_SIGNATURE =\n '0x1111111111111111111111111111111111111111111111111111111111111111';\n\n/**\n * Populate the gas properties of the provided transaction meta.\n *\n * @param request - The request object including the necessary parameters.\n */\nexport async function updateGas(request: UpdateGasRequest) {\n const { txMeta } = request;\n const initialParams = { ...txMeta.txParams };\n\n const [gas, simulationFails, gasLimitNoBuffer] = await getGas(request);\n\n txMeta.txParams.gas = gas;\n txMeta.simulationFails = simulationFails;\n txMeta.gasLimitNoBuffer = gasLimitNoBuffer;\n\n if (!initialParams.gas) {\n txMeta.originalGasEstimate = txMeta.txParams.gas;\n }\n\n if (!txMeta.defaultGasEstimates) {\n txMeta.defaultGasEstimates = {};\n }\n\n txMeta.defaultGasEstimates.gas = txMeta.txParams.gas;\n}\n\n/**\n * Estimate the gas for the provided transaction parameters.\n * If the gas estimate fails, the fallback value is returned.\n *\n * @param options - The options object.\n * @param options.chainId - The chain ID of the transaction.\n * @param options.ethQuery - The EthQuery instance to interact with the network.\n * @param options.isSimulationEnabled - Whether the simulation is enabled.\n * @param options.txParams - The transaction parameters.\n * @returns The estimated gas and related info.\n */\nexport async function estimateGas({\n chainId,\n ethQuery,\n isSimulationEnabled,\n txParams,\n}: {\n chainId: Hex;\n ethQuery: EthQuery;\n isSimulationEnabled: boolean;\n txParams: TransactionParams;\n}) {\n const request = { ...txParams };\n const { authorizationList, data, from, value, to } = request;\n\n const { gasLimit: blockGasLimit, number: blockNumber } =\n await getLatestBlock(ethQuery);\n\n const blockGasLimitBN = hexToBN(blockGasLimit);\n\n const fallback = BNToHex(\n fractionBN(blockGasLimitBN, GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT, 100),\n );\n\n request.data = data ? add0x(data) : data;\n request.value = value || '0x0';\n\n request.authorizationList = normalizeAuthorizationList(\n request.authorizationList,\n chainId,\n );\n\n delete request.gasPrice;\n delete request.maxFeePerGas;\n delete request.maxPriorityFeePerGas;\n\n let estimatedGas = fallback;\n let simulationFails: TransactionMeta['simulationFails'];\n\n const isUpgradeWithDataToSelf =\n txParams.type === TransactionEnvelopeType.setCode &&\n authorizationList?.length &&\n data &&\n data !== '0x' &&\n from?.toLowerCase() === to?.toLowerCase();\n\n try {\n if (isSimulationEnabled && isUpgradeWithDataToSelf) {\n estimatedGas = await estimateGasUpgradeWithDataToSelf(\n request,\n ethQuery,\n chainId,\n );\n } else {\n estimatedGas = await query(ethQuery, 'estimateGas', [request]);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n simulationFails = {\n reason: error.message,\n errorKey: error.errorKey,\n debug: {\n blockNumber,\n blockGasLimit,\n },\n };\n\n log('Estimation failed', { ...simulationFails, fallback });\n }\n\n return {\n blockGasLimit,\n estimatedGas,\n simulationFails,\n };\n}\n\n/**\n * Add a buffer to the provided estimated gas.\n * The buffer is calculated based on the block gas limit and a multiplier.\n *\n * @param estimatedGas - The estimated gas.\n * @param blockGasLimit - The block gas limit.\n * @param multiplier - The multiplier to apply to the estimated gas.\n * @returns The gas with the buffer applied.\n */\nexport function addGasBuffer(\n estimatedGas: string,\n blockGasLimit: string,\n multiplier: number,\n) {\n const estimatedGasBN = hexToBN(estimatedGas);\n\n const maxGasBN = fractionBN(\n hexToBN(blockGasLimit),\n MAX_GAS_BLOCK_PERCENT,\n 100,\n );\n\n const paddedGasBN = fractionBN(estimatedGasBN, multiplier * 100, 100);\n\n if (estimatedGasBN.gt(maxGasBN)) {\n const estimatedGasHex = add0x(estimatedGas);\n log('Using estimated value', estimatedGasHex);\n return estimatedGasHex;\n }\n\n if (paddedGasBN.lt(maxGasBN)) {\n const paddedHex = add0x(BNToHex(paddedGasBN));\n log('Using padded estimate', paddedHex, multiplier);\n return paddedHex;\n }\n\n const maxHex = add0x(BNToHex(maxGasBN));\n log('Using 90% of block gas limit', maxHex);\n return maxHex;\n}\n\n/**\n * Determine the gas for the provided request.\n *\n * @param request - The request object including the necessary parameters.\n * @returns The final gas value and the estimate used.\n */\nasync function getGas(\n request: UpdateGasRequest,\n): Promise<[string, TransactionMeta['simulationFails']?, string?]> {\n const { chainId, isCustomNetwork, isSimulationEnabled, txMeta } = request;\n const { disableGasBuffer } = txMeta;\n\n if (txMeta.txParams.gas) {\n log('Using value from request', txMeta.txParams.gas);\n return [txMeta.txParams.gas, undefined, txMeta.txParams.gas];\n }\n\n if (await requiresFixedGas(request)) {\n log('Using fixed value', FIXED_GAS);\n return [FIXED_GAS, undefined, FIXED_GAS];\n }\n\n const { blockGasLimit, estimatedGas, simulationFails } = await estimateGas({\n chainId: request.chainId,\n ethQuery: request.ethQuery,\n isSimulationEnabled,\n txParams: txMeta.txParams,\n });\n\n if (isCustomNetwork || simulationFails) {\n log(\n isCustomNetwork\n ? 'Using original estimate as custom network'\n : 'Using original fallback estimate as simulation failed',\n );\n return [estimatedGas, simulationFails, estimatedGas];\n }\n\n let finalGas = estimatedGas;\n\n if (!disableGasBuffer) {\n const bufferMultiplier =\n GAS_BUFFER_CHAIN_OVERRIDES[\n chainId as keyof typeof GAS_BUFFER_CHAIN_OVERRIDES\n ] ?? DEFAULT_GAS_MULTIPLIER;\n\n finalGas = addGasBuffer(estimatedGas, blockGasLimit, bufferMultiplier);\n }\n\n return [finalGas, simulationFails, estimatedGas];\n}\n\n/**\n * Determine if the gas for the provided request should be fixed.\n *\n * @param options - The options object.\n * @param options.ethQuery - The EthQuery instance to interact with the network.\n * @param options.txMeta - The transaction meta object.\n * @param options.isCustomNetwork - Whether the network is a custom network.\n * @returns Whether the gas should be fixed.\n */\nasync function requiresFixedGas({\n ethQuery,\n txMeta,\n isCustomNetwork,\n}: UpdateGasRequest): Promise<boolean> {\n const {\n txParams: { to, data },\n } = txMeta;\n\n if (isCustomNetwork || !to || data) {\n return false;\n }\n\n const code = await getCode(ethQuery, to);\n\n return !code || code === '0x';\n}\n\n/**\n * Get the contract code for the provided address.\n *\n * @param ethQuery - The EthQuery instance to interact with the network.\n * @param address - The address to get the code for.\n * @returns The contract code.\n */\nasync function getCode(\n ethQuery: EthQuery,\n address: string,\n): Promise<string | undefined> {\n return await query(ethQuery, 'getCode', [address]);\n}\n\n/**\n * Get the latest block from the network.\n *\n * @param ethQuery - The EthQuery instance to interact with the network.\n * @returns The latest block number.\n */\nasync function getLatestBlock(\n ethQuery: EthQuery,\n): Promise<{ gasLimit: string; number: string }> {\n return await query(ethQuery, 'getBlockByNumber', ['latest', false]);\n}\n\n/**\n * Estimate the gas for a type 4 transaction.\n *\n * @param txParams - The transaction parameters.\n * @param ethQuery - The EthQuery instance to interact with the network.\n * @param chainId - The chain ID of the transaction.\n * @returns The estimated gas.\n */\nasync function estimateGasUpgradeWithDataToSelf(\n txParams: TransactionParams,\n ethQuery: EthQuery,\n chainId: Hex,\n) {\n const upgradeGas = await query(ethQuery, 'estimateGas', [\n {\n ...txParams,\n data: '0x',\n },\n ]);\n\n log('Upgrade only gas', upgradeGas);\n\n const delegationAddress = txParams.authorizationList?.[0].address as Hex;\n\n const executeGas = await simulateGas({\n chainId: chainId as Hex,\n delegationAddress,\n transaction: txParams,\n });\n\n log('Execute gas', executeGas);\n\n const total = BNToHex(\n hexToBN(upgradeGas).add(hexToBN(executeGas)).subn(INTRINSIC_GAS),\n );\n\n log('Total type 4 gas', total);\n\n return total;\n}\n\n/**\n * Simulate the required gas using the simulation API.\n *\n * @param options - The options object.\n * @param options.chainId - The chain ID of the transaction.\n * @param options.delegationAddress - The delegation address of the sender to mock.\n * @param options.transaction - The transaction parameters.\n * @returns The simulated gas.\n */\nasync function simulateGas({\n chainId,\n delegationAddress,\n transaction,\n}: {\n chainId: Hex;\n delegationAddress?: Hex;\n transaction: TransactionParams;\n}): Promise<Hex> {\n const response = await simulateTransactions(chainId, {\n transactions: [\n {\n to: transaction.to as Hex,\n from: transaction.from as Hex,\n data: transaction.data as Hex,\n value: transaction.value as Hex,\n },\n ],\n overrides: {\n [transaction.from as string]: {\n code:\n delegationAddress &&\n ((DELEGATION_PREFIX + remove0x(delegationAddress)) as Hex),\n },\n },\n });\n\n const gasUsed = response?.transactions?.[0].gasUsed;\n\n if (!gasUsed) {\n throw new Error('No simulated gas returned');\n }\n\n return gasUsed;\n}\n\n/**\n * Populate the authorization list with dummy values.\n *\n * @param authorizationList - The authorization list to prepare.\n * @param chainId - The chain ID to use.\n * @returns The authorization list with dummy values.\n */\nfunction normalizeAuthorizationList(\n authorizationList: TransactionParams['authorizationList'],\n chainId: Hex,\n) {\n return authorizationList?.map((authorization) => ({\n ...authorization,\n chainId: authorization.chainId ?? chainId,\n nonce: authorization.nonce ?? '0x1',\n r: authorization.r ?? DUMMY_AUTHORIZATION_SIGNATURE,\n s: authorization.s ?? DUMMY_AUTHORIZATION_SIGNATURE,\n yParity: authorization.yParity ?? '0x1',\n }));\n}\n"]}
1
+ {"version":3,"file":"gas.cjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BNToHex,\n fractionBN,\n hexToBN,\n query,\n} from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type { Hex } from '@metamask/utils';\nimport { add0x, createModuleLogger, remove0x } from '@metamask/utils';\n\nimport { DELEGATION_PREFIX } from './eip7702';\nimport { getGasEstimateFallback } from './feature-flags';\nimport { simulateTransactions } from './simulation-api';\nimport { GAS_BUFFER_CHAIN_OVERRIDES } from '../constants';\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\nimport {\n TransactionEnvelopeType,\n type TransactionMeta,\n type TransactionParams,\n} from '../types';\n\nexport type UpdateGasRequest = {\n chainId: Hex;\n ethQuery: EthQuery;\n isCustomNetwork: boolean;\n isSimulationEnabled: boolean;\n messenger: TransactionControllerMessenger;\n txMeta: TransactionMeta;\n};\n\nexport const log = createModuleLogger(projectLogger, 'gas');\n\nexport const FIXED_GAS = '0x5208';\nexport const DEFAULT_GAS_MULTIPLIER = 1.5;\nexport const MAX_GAS_BLOCK_PERCENT = 90;\nexport const INTRINSIC_GAS = 21000;\n\nexport const DUMMY_AUTHORIZATION_SIGNATURE =\n '0x1111111111111111111111111111111111111111111111111111111111111111';\n\n/**\n * Populate the gas properties of the provided transaction meta.\n *\n * @param request - The request object including the necessary parameters.\n */\nexport async function updateGas(request: UpdateGasRequest) {\n const { txMeta } = request;\n const initialParams = { ...txMeta.txParams };\n\n const [gas, simulationFails, gasLimitNoBuffer] = await getGas(request);\n\n txMeta.txParams.gas = gas;\n txMeta.simulationFails = simulationFails;\n txMeta.gasLimitNoBuffer = gasLimitNoBuffer;\n\n if (!initialParams.gas) {\n txMeta.originalGasEstimate = txMeta.txParams.gas;\n }\n\n if (!txMeta.defaultGasEstimates) {\n txMeta.defaultGasEstimates = {};\n }\n\n txMeta.defaultGasEstimates.gas = txMeta.txParams.gas;\n}\n\n/**\n * Estimate the gas for the provided transaction parameters.\n * If the gas estimate fails, the fallback value is returned.\n *\n * @param options - The options object.\n * @param options.chainId - The chain ID of the transaction.\n * @param options.ethQuery - The EthQuery instance to interact with the network.\n * @param options.isSimulationEnabled - Whether the simulation is enabled.\n * @param options.messenger - The messenger instance for communication.\n * @param options.txParams - The transaction parameters.\n * @returns The estimated gas and related info.\n */\nexport async function estimateGas({\n chainId,\n ethQuery,\n isSimulationEnabled,\n messenger,\n txParams,\n}: {\n chainId: Hex;\n ethQuery: EthQuery;\n isSimulationEnabled: boolean;\n messenger: TransactionControllerMessenger;\n txParams: TransactionParams;\n}) {\n const request = { ...txParams };\n const { authorizationList, data, from, value, to } = request;\n\n const { gasLimit: blockGasLimit, number: blockNumber } =\n await getLatestBlock(ethQuery);\n\n const blockGasLimitBN = hexToBN(blockGasLimit);\n const { gasEstimateFallback, isFixedGas } = getGasEstimateFallback(\n chainId,\n messenger,\n );\n\n const fallback = isFixedGas\n ? (gasEstimateFallback as string)\n : BNToHex(fractionBN(blockGasLimitBN, gasEstimateFallback, 100));\n\n request.data = data ? add0x(data) : data;\n request.value = value || '0x0';\n\n request.authorizationList = normalizeAuthorizationList(\n request.authorizationList,\n chainId,\n );\n\n delete request.gasPrice;\n delete request.maxFeePerGas;\n delete request.maxPriorityFeePerGas;\n\n let estimatedGas = fallback;\n let simulationFails: TransactionMeta['simulationFails'];\n\n const isUpgradeWithDataToSelf =\n txParams.type === TransactionEnvelopeType.setCode &&\n authorizationList?.length &&\n data &&\n data !== '0x' &&\n from?.toLowerCase() === to?.toLowerCase();\n\n try {\n if (isSimulationEnabled && isUpgradeWithDataToSelf) {\n estimatedGas = await estimateGasUpgradeWithDataToSelf(\n request,\n ethQuery,\n chainId,\n );\n } else {\n estimatedGas = await query(ethQuery, 'estimateGas', [request]);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n simulationFails = {\n reason: error.message,\n errorKey: error.errorKey,\n debug: {\n blockNumber,\n blockGasLimit,\n },\n };\n\n log('Estimation failed', { ...simulationFails, fallback });\n }\n\n return {\n blockGasLimit,\n estimatedGas,\n simulationFails,\n };\n}\n\n/**\n * Add a buffer to the provided estimated gas.\n * The buffer is calculated based on the block gas limit and a multiplier.\n *\n * @param estimatedGas - The estimated gas.\n * @param blockGasLimit - The block gas limit.\n * @param multiplier - The multiplier to apply to the estimated gas.\n * @returns The gas with the buffer applied.\n */\nexport function addGasBuffer(\n estimatedGas: string,\n blockGasLimit: string,\n multiplier: number,\n) {\n const estimatedGasBN = hexToBN(estimatedGas);\n\n const maxGasBN = fractionBN(\n hexToBN(blockGasLimit),\n MAX_GAS_BLOCK_PERCENT,\n 100,\n );\n\n const paddedGasBN = fractionBN(estimatedGasBN, multiplier * 100, 100);\n\n if (estimatedGasBN.gt(maxGasBN)) {\n const estimatedGasHex = add0x(estimatedGas);\n log('Using estimated value', estimatedGasHex);\n return estimatedGasHex;\n }\n\n if (paddedGasBN.lt(maxGasBN)) {\n const paddedHex = add0x(BNToHex(paddedGasBN));\n log('Using padded estimate', paddedHex, multiplier);\n return paddedHex;\n }\n\n const maxHex = add0x(BNToHex(maxGasBN));\n log('Using 90% of block gas limit', maxHex);\n return maxHex;\n}\n\n/**\n * Determine the gas for the provided request.\n *\n * @param request - The request object including the necessary parameters.\n * @returns The final gas value and the estimate used.\n */\nasync function getGas(\n request: UpdateGasRequest,\n): Promise<[string, TransactionMeta['simulationFails']?, string?]> {\n const { chainId, isCustomNetwork, isSimulationEnabled, txMeta } = request;\n const { disableGasBuffer } = txMeta;\n\n if (txMeta.txParams.gas) {\n log('Using value from request', txMeta.txParams.gas);\n return [txMeta.txParams.gas, undefined, txMeta.txParams.gas];\n }\n\n if (await requiresFixedGas(request)) {\n log('Using fixed value', FIXED_GAS);\n return [FIXED_GAS, undefined, FIXED_GAS];\n }\n\n const { blockGasLimit, estimatedGas, simulationFails } = await estimateGas({\n chainId: request.chainId,\n ethQuery: request.ethQuery,\n isSimulationEnabled,\n messenger: request.messenger,\n txParams: txMeta.txParams,\n });\n\n if (isCustomNetwork || simulationFails) {\n log(\n isCustomNetwork\n ? 'Using original estimate as custom network'\n : 'Using original fallback estimate as simulation failed',\n );\n return [estimatedGas, simulationFails, estimatedGas];\n }\n\n let finalGas = estimatedGas;\n\n if (!disableGasBuffer) {\n const bufferMultiplier =\n GAS_BUFFER_CHAIN_OVERRIDES[\n chainId as keyof typeof GAS_BUFFER_CHAIN_OVERRIDES\n ] ?? DEFAULT_GAS_MULTIPLIER;\n\n finalGas = addGasBuffer(estimatedGas, blockGasLimit, bufferMultiplier);\n }\n\n return [finalGas, simulationFails, estimatedGas];\n}\n\n/**\n * Determine if the gas for the provided request should be fixed.\n *\n * @param options - The options object.\n * @param options.ethQuery - The EthQuery instance to interact with the network.\n * @param options.txMeta - The transaction meta object.\n * @param options.isCustomNetwork - Whether the network is a custom network.\n * @returns Whether the gas should be fixed.\n */\nasync function requiresFixedGas({\n ethQuery,\n txMeta,\n isCustomNetwork,\n}: UpdateGasRequest): Promise<boolean> {\n const {\n txParams: { to, data },\n } = txMeta;\n\n if (isCustomNetwork || !to || data) {\n return false;\n }\n\n const code = await getCode(ethQuery, to);\n\n return !code || code === '0x';\n}\n\n/**\n * Get the contract code for the provided address.\n *\n * @param ethQuery - The EthQuery instance to interact with the network.\n * @param address - The address to get the code for.\n * @returns The contract code.\n */\nasync function getCode(\n ethQuery: EthQuery,\n address: string,\n): Promise<string | undefined> {\n return await query(ethQuery, 'getCode', [address]);\n}\n\n/**\n * Get the latest block from the network.\n *\n * @param ethQuery - The EthQuery instance to interact with the network.\n * @returns The latest block number.\n */\nasync function getLatestBlock(\n ethQuery: EthQuery,\n): Promise<{ gasLimit: string; number: string }> {\n return await query(ethQuery, 'getBlockByNumber', ['latest', false]);\n}\n\n/**\n * Estimate the gas for a type 4 transaction.\n *\n * @param txParams - The transaction parameters.\n * @param ethQuery - The EthQuery instance to interact with the network.\n * @param chainId - The chain ID of the transaction.\n * @returns The estimated gas.\n */\nasync function estimateGasUpgradeWithDataToSelf(\n txParams: TransactionParams,\n ethQuery: EthQuery,\n chainId: Hex,\n) {\n const upgradeGas = await query(ethQuery, 'estimateGas', [\n {\n ...txParams,\n data: '0x',\n },\n ]);\n\n log('Upgrade only gas', upgradeGas);\n\n const delegationAddress = txParams.authorizationList?.[0].address as Hex;\n\n const executeGas = await simulateGas({\n chainId: chainId as Hex,\n delegationAddress,\n transaction: txParams,\n });\n\n log('Execute gas', executeGas);\n\n const total = BNToHex(\n hexToBN(upgradeGas).add(hexToBN(executeGas)).subn(INTRINSIC_GAS),\n );\n\n log('Total type 4 gas', total);\n\n return total;\n}\n\n/**\n * Simulate the required gas using the simulation API.\n *\n * @param options - The options object.\n * @param options.chainId - The chain ID of the transaction.\n * @param options.delegationAddress - The delegation address of the sender to mock.\n * @param options.transaction - The transaction parameters.\n * @returns The simulated gas.\n */\nasync function simulateGas({\n chainId,\n delegationAddress,\n transaction,\n}: {\n chainId: Hex;\n delegationAddress?: Hex;\n transaction: TransactionParams;\n}): Promise<Hex> {\n const response = await simulateTransactions(chainId, {\n transactions: [\n {\n to: transaction.to as Hex,\n from: transaction.from as Hex,\n data: transaction.data as Hex,\n value: transaction.value as Hex,\n },\n ],\n overrides: {\n [transaction.from as string]: {\n code:\n delegationAddress &&\n ((DELEGATION_PREFIX + remove0x(delegationAddress)) as Hex),\n },\n },\n });\n\n const gasUsed = response?.transactions?.[0].gasUsed;\n\n if (!gasUsed) {\n throw new Error('No simulated gas returned');\n }\n\n return gasUsed;\n}\n\n/**\n * Populate the authorization list with dummy values.\n *\n * @param authorizationList - The authorization list to prepare.\n * @param chainId - The chain ID to use.\n * @returns The authorization list with dummy values.\n */\nfunction normalizeAuthorizationList(\n authorizationList: TransactionParams['authorizationList'],\n chainId: Hex,\n) {\n return authorizationList?.map((authorization) => ({\n ...authorization,\n chainId: authorization.chainId ?? chainId,\n nonce: authorization.nonce ?? '0x1',\n r: authorization.r ?? DUMMY_AUTHORIZATION_SIGNATURE,\n s: authorization.s ?? DUMMY_AUTHORIZATION_SIGNATURE,\n yParity: authorization.yParity ?? '0x1',\n }));\n}\n"]}
@@ -1,18 +1,19 @@
1
1
  /// <reference types="debug" />
2
2
  import type EthQuery from "@metamask/eth-query";
3
3
  import type { Hex } from "@metamask/utils";
4
+ import type { TransactionControllerMessenger } from "../TransactionController.cjs";
4
5
  import { type TransactionMeta, type TransactionParams } from "../types.cjs";
5
6
  export type UpdateGasRequest = {
6
7
  chainId: Hex;
7
8
  ethQuery: EthQuery;
8
9
  isCustomNetwork: boolean;
9
10
  isSimulationEnabled: boolean;
11
+ messenger: TransactionControllerMessenger;
10
12
  txMeta: TransactionMeta;
11
13
  };
12
14
  export declare const log: import("debug").Debugger;
13
15
  export declare const FIXED_GAS = "0x5208";
14
16
  export declare const DEFAULT_GAS_MULTIPLIER = 1.5;
15
- export declare const GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;
16
17
  export declare const MAX_GAS_BLOCK_PERCENT = 90;
17
18
  export declare const INTRINSIC_GAS = 21000;
18
19
  export declare const DUMMY_AUTHORIZATION_SIGNATURE = "0x1111111111111111111111111111111111111111111111111111111111111111";
@@ -30,17 +31,19 @@ export declare function updateGas(request: UpdateGasRequest): Promise<void>;
30
31
  * @param options.chainId - The chain ID of the transaction.
31
32
  * @param options.ethQuery - The EthQuery instance to interact with the network.
32
33
  * @param options.isSimulationEnabled - Whether the simulation is enabled.
34
+ * @param options.messenger - The messenger instance for communication.
33
35
  * @param options.txParams - The transaction parameters.
34
36
  * @returns The estimated gas and related info.
35
37
  */
36
- export declare function estimateGas({ chainId, ethQuery, isSimulationEnabled, txParams, }: {
38
+ export declare function estimateGas({ chainId, ethQuery, isSimulationEnabled, messenger, txParams, }: {
37
39
  chainId: Hex;
38
40
  ethQuery: EthQuery;
39
41
  isSimulationEnabled: boolean;
42
+ messenger: TransactionControllerMessenger;
40
43
  txParams: TransactionParams;
41
44
  }): Promise<{
42
45
  blockGasLimit: string;
43
- estimatedGas: `0x${string}`;
46
+ estimatedGas: string;
44
47
  simulationFails: {
45
48
  reason?: string | undefined;
46
49
  errorKey?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"gas.d.cts","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":";AAMA,OAAO,KAAK,QAAQ,4BAA4B;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAO3C,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,qBAAiB;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,GAAG,0BAA2C,CAAC;AAE5D,eAAO,MAAM,SAAS,WAAW,CAAC;AAClC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,aAAa,QAAQ,CAAC;AAEnC,eAAO,MAAM,6BAA6B,uEAC4B,CAAC;AAEvE;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,iBAmBxD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,EAChC,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;;;;;;;;;;;GAgEA;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,iBA2BnB"}
1
+ {"version":3,"file":"gas.d.cts","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":";AAMA,OAAO,KAAK,QAAQ,4BAA4B;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAQ3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,qBAAiB;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,8BAA8B,CAAC;IAC1C,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,GAAG,0BAA2C,CAAC;AAE5D,eAAO,MAAM,SAAS,WAAW,CAAC;AAClC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,aAAa,QAAQ,CAAC;AAEnC,eAAO,MAAM,6BAA6B,uEAC4B,CAAC;AAEvE;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,iBAmBxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,EAChC,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,SAAS,EACT,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,8BAA8B,CAAC;IAC1C,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;;;;;;;;;;;GAoEA;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,iBA2BnB"}
@@ -1,18 +1,19 @@
1
1
  /// <reference types="debug" />
2
2
  import type EthQuery from "@metamask/eth-query";
3
3
  import type { Hex } from "@metamask/utils";
4
+ import type { TransactionControllerMessenger } from "../TransactionController.mjs";
4
5
  import { type TransactionMeta, type TransactionParams } from "../types.mjs";
5
6
  export type UpdateGasRequest = {
6
7
  chainId: Hex;
7
8
  ethQuery: EthQuery;
8
9
  isCustomNetwork: boolean;
9
10
  isSimulationEnabled: boolean;
11
+ messenger: TransactionControllerMessenger;
10
12
  txMeta: TransactionMeta;
11
13
  };
12
14
  export declare const log: import("debug").Debugger;
13
15
  export declare const FIXED_GAS = "0x5208";
14
16
  export declare const DEFAULT_GAS_MULTIPLIER = 1.5;
15
- export declare const GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;
16
17
  export declare const MAX_GAS_BLOCK_PERCENT = 90;
17
18
  export declare const INTRINSIC_GAS = 21000;
18
19
  export declare const DUMMY_AUTHORIZATION_SIGNATURE = "0x1111111111111111111111111111111111111111111111111111111111111111";
@@ -30,17 +31,19 @@ export declare function updateGas(request: UpdateGasRequest): Promise<void>;
30
31
  * @param options.chainId - The chain ID of the transaction.
31
32
  * @param options.ethQuery - The EthQuery instance to interact with the network.
32
33
  * @param options.isSimulationEnabled - Whether the simulation is enabled.
34
+ * @param options.messenger - The messenger instance for communication.
33
35
  * @param options.txParams - The transaction parameters.
34
36
  * @returns The estimated gas and related info.
35
37
  */
36
- export declare function estimateGas({ chainId, ethQuery, isSimulationEnabled, txParams, }: {
38
+ export declare function estimateGas({ chainId, ethQuery, isSimulationEnabled, messenger, txParams, }: {
37
39
  chainId: Hex;
38
40
  ethQuery: EthQuery;
39
41
  isSimulationEnabled: boolean;
42
+ messenger: TransactionControllerMessenger;
40
43
  txParams: TransactionParams;
41
44
  }): Promise<{
42
45
  blockGasLimit: string;
43
- estimatedGas: `0x${string}`;
46
+ estimatedGas: string;
44
47
  simulationFails: {
45
48
  reason?: string | undefined;
46
49
  errorKey?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"gas.d.mts","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":";AAMA,OAAO,KAAK,QAAQ,4BAA4B;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAO3C,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,qBAAiB;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,GAAG,0BAA2C,CAAC;AAE5D,eAAO,MAAM,SAAS,WAAW,CAAC;AAClC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,aAAa,QAAQ,CAAC;AAEnC,eAAO,MAAM,6BAA6B,uEAC4B,CAAC;AAEvE;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,iBAmBxD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,EAChC,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;;;;;;;;;;;GAgEA;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,iBA2BnB"}
1
+ {"version":3,"file":"gas.d.mts","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":";AAMA,OAAO,KAAK,QAAQ,4BAA4B;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAQ3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,qBAAiB;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,8BAA8B,CAAC;IAC1C,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,GAAG,0BAA2C,CAAC;AAE5D,eAAO,MAAM,SAAS,WAAW,CAAC;AAClC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,aAAa,QAAQ,CAAC;AAEnC,eAAO,MAAM,6BAA6B,uEAC4B,CAAC;AAEvE;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,iBAmBxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,EAChC,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,SAAS,EACT,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,SAAS,EAAE,8BAA8B,CAAC;IAC1C,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;;;;;;;;;;;GAoEA;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,iBA2BnB"}
@@ -1,6 +1,7 @@
1
1
  import { BNToHex, fractionBN, hexToBN, query } from "@metamask/controller-utils";
2
2
  import { add0x, createModuleLogger, remove0x } from "@metamask/utils";
3
3
  import { DELEGATION_PREFIX } from "./eip7702.mjs";
4
+ import { getGasEstimateFallback } from "./feature-flags.mjs";
4
5
  import { simulateTransactions } from "./simulation-api.mjs";
5
6
  import { GAS_BUFFER_CHAIN_OVERRIDES } from "../constants.mjs";
6
7
  import { projectLogger } from "../logger.mjs";
@@ -8,7 +9,6 @@ import { TransactionEnvelopeType } from "../types.mjs";
8
9
  export const log = createModuleLogger(projectLogger, 'gas');
9
10
  export const FIXED_GAS = '0x5208';
10
11
  export const DEFAULT_GAS_MULTIPLIER = 1.5;
11
- export const GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;
12
12
  export const MAX_GAS_BLOCK_PERCENT = 90;
13
13
  export const INTRINSIC_GAS = 21000;
14
14
  export const DUMMY_AUTHORIZATION_SIGNATURE = '0x1111111111111111111111111111111111111111111111111111111111111111';
@@ -40,15 +40,19 @@ export async function updateGas(request) {
40
40
  * @param options.chainId - The chain ID of the transaction.
41
41
  * @param options.ethQuery - The EthQuery instance to interact with the network.
42
42
  * @param options.isSimulationEnabled - Whether the simulation is enabled.
43
+ * @param options.messenger - The messenger instance for communication.
43
44
  * @param options.txParams - The transaction parameters.
44
45
  * @returns The estimated gas and related info.
45
46
  */
46
- export async function estimateGas({ chainId, ethQuery, isSimulationEnabled, txParams, }) {
47
+ export async function estimateGas({ chainId, ethQuery, isSimulationEnabled, messenger, txParams, }) {
47
48
  const request = { ...txParams };
48
49
  const { authorizationList, data, from, value, to } = request;
49
50
  const { gasLimit: blockGasLimit, number: blockNumber } = await getLatestBlock(ethQuery);
50
51
  const blockGasLimitBN = hexToBN(blockGasLimit);
51
- const fallback = BNToHex(fractionBN(blockGasLimitBN, GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT, 100));
52
+ const { gasEstimateFallback, isFixedGas } = getGasEstimateFallback(chainId, messenger);
53
+ const fallback = isFixedGas
54
+ ? gasEstimateFallback
55
+ : BNToHex(fractionBN(blockGasLimitBN, gasEstimateFallback, 100));
52
56
  request.data = data ? add0x(data) : data;
53
57
  request.value = value || '0x0';
54
58
  request.authorizationList = normalizeAuthorizationList(request.authorizationList, chainId);
@@ -136,6 +140,7 @@ async function getGas(request) {
136
140
  chainId: request.chainId,
137
141
  ethQuery: request.ethQuery,
138
142
  isSimulationEnabled,
143
+ messenger: request.messenger,
139
144
  txParams: txMeta.txParams,
140
145
  });
141
146
  if (isCustomNetwork || simulationFails) {