@metamask/transaction-controller 25.0.0 → 25.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/dist/TransactionController.js +17 -16
  3. package/dist/TransactionController.mjs +16 -15
  4. package/dist/{chunk-EQ3RRHB7.mjs → chunk-3D3SA6PY.mjs} +2 -2
  5. package/dist/{chunk-ZCQRDZ36.js → chunk-5IHLDAOF.js} +5 -5
  6. package/dist/{chunk-IC233ZQS.js → chunk-5OQ373JS.js} +10 -10
  7. package/dist/{chunk-6MYNWYJK.mjs → chunk-5UL3VDFT.mjs} +34 -10
  8. package/dist/chunk-5UL3VDFT.mjs.map +1 -0
  9. package/dist/chunk-6XMG522E.mjs +56 -0
  10. package/dist/chunk-6XMG522E.mjs.map +1 -0
  11. package/dist/{chunk-JR6HDRNV.mjs → chunk-BYBPZUHS.mjs} +30 -7
  12. package/dist/chunk-BYBPZUHS.mjs.map +1 -0
  13. package/dist/{chunk-NUOBUW7C.js → chunk-CXXGL43K.js} +3 -3
  14. package/dist/{chunk-7MZ57ILQ.mjs → chunk-DWHMMJOW.mjs} +2 -2
  15. package/dist/{chunk-GKTIFXPN.js → chunk-F3CMU2DM.js} +6 -6
  16. package/dist/{chunk-I5YZ7QUK.js → chunk-FHG5GY6F.js} +6 -6
  17. package/dist/{chunk-DTEDYRTL.js → chunk-GC77BSQZ.js} +32 -9
  18. package/dist/chunk-GC77BSQZ.js.map +1 -0
  19. package/dist/chunk-GE57YNGX.js +56 -0
  20. package/dist/chunk-GE57YNGX.js.map +1 -0
  21. package/dist/{chunk-DE3MZYVY.mjs → chunk-GJ7VDSXJ.mjs} +114 -43
  22. package/dist/chunk-GJ7VDSXJ.mjs.map +1 -0
  23. package/dist/{chunk-BJEESIBE.js → chunk-ICNMLQ6S.js} +124 -53
  24. package/dist/chunk-ICNMLQ6S.js.map +1 -0
  25. package/dist/{chunk-DQP6X25N.mjs → chunk-IK55QTGO.mjs} +3 -3
  26. package/dist/{chunk-RI6MVJJN.js → chunk-ITDY6AIZ.js} +6 -1
  27. package/dist/chunk-ITDY6AIZ.js.map +1 -0
  28. package/dist/{chunk-2K7J3EY3.mjs → chunk-IZI7FQIN.mjs} +3 -3
  29. package/dist/chunk-KFL2GGZC.mjs +48 -0
  30. package/dist/chunk-KFL2GGZC.mjs.map +1 -0
  31. package/dist/{chunk-M7455RU7.js → chunk-NRWEI43Q.js} +3 -3
  32. package/dist/{chunk-ZJLZSFOZ.js → chunk-PF3UOCRW.js} +7 -7
  33. package/dist/{chunk-UM4ORJ5B.mjs → chunk-PGTV7236.mjs} +3 -3
  34. package/dist/{chunk-7APMBUKB.js → chunk-QEX3QMSL.js} +35 -11
  35. package/dist/chunk-QEX3QMSL.js.map +1 -0
  36. package/dist/{chunk-FS7FRO7B.mjs → chunk-QRSTF45Q.mjs} +3 -3
  37. package/dist/chunk-R7NJVDWN.js +48 -0
  38. package/dist/chunk-R7NJVDWN.js.map +1 -0
  39. package/dist/{chunk-IUBAETUH.js → chunk-RQKICZYP.js} +3 -3
  40. package/dist/{chunk-H4M66BA3.js → chunk-TZTP4JVA.js} +4 -4
  41. package/dist/{chunk-HPNXIKFY.js → chunk-VEJ3MIZG.js} +1 -1
  42. package/dist/chunk-VEJ3MIZG.js.map +1 -0
  43. package/dist/{chunk-Y734U4V6.mjs → chunk-VEREDMI2.mjs} +2 -2
  44. package/dist/{chunk-LM4NUNMT.mjs → chunk-W57BD6NX.mjs} +1 -1
  45. package/dist/chunk-W57BD6NX.mjs.map +1 -0
  46. package/dist/{chunk-UKYY2RVS.mjs → chunk-XKNFL657.mjs} +2 -2
  47. package/dist/{chunk-MHM5LRRF.mjs → chunk-Z3HHSD5I.mjs} +6 -1
  48. package/dist/chunk-Z3HHSD5I.mjs.map +1 -0
  49. package/dist/{chunk-C67QD5PV.mjs → chunk-ZQFMTLZJ.mjs} +2 -2
  50. package/dist/constants.js +2 -2
  51. package/dist/constants.mjs +1 -1
  52. package/dist/gas-flows/DefaultGasFeeFlow.js +7 -7
  53. package/dist/gas-flows/DefaultGasFeeFlow.mjs +6 -6
  54. package/dist/gas-flows/LineaGasFeeFlow.js +8 -8
  55. package/dist/gas-flows/LineaGasFeeFlow.mjs +7 -7
  56. package/dist/helpers/EtherscanRemoteTransactionSource.js +5 -5
  57. package/dist/helpers/EtherscanRemoteTransactionSource.mjs +4 -4
  58. package/dist/helpers/GasFeePoller.js +5 -4
  59. package/dist/helpers/GasFeePoller.mjs +4 -3
  60. package/dist/helpers/MultichainTrackingHelper.js +6 -6
  61. package/dist/helpers/MultichainTrackingHelper.mjs +5 -5
  62. package/dist/helpers/PendingTransactionTracker.js +1 -1
  63. package/dist/helpers/PendingTransactionTracker.mjs +1 -1
  64. package/dist/index.js +19 -16
  65. package/dist/index.mjs +18 -15
  66. package/dist/tsconfig.build.tsbuildinfo +1 -1
  67. package/dist/types/TransactionController.d.ts +1 -0
  68. package/dist/types/TransactionController.d.ts.map +1 -1
  69. package/dist/types/constants.d.ts +5 -0
  70. package/dist/types/constants.d.ts.map +1 -1
  71. package/dist/types/helpers/GasFeePoller.d.ts +5 -3
  72. package/dist/types/helpers/GasFeePoller.d.ts.map +1 -1
  73. package/dist/types/index.d.ts +2 -2
  74. package/dist/types/index.d.ts.map +1 -1
  75. package/dist/types/types.d.ts +42 -0
  76. package/dist/types/types.d.ts.map +1 -1
  77. package/dist/types/utils/layer1-gas-fee-flow.d.ts +16 -0
  78. package/dist/types/utils/layer1-gas-fee-flow.d.ts.map +1 -0
  79. package/dist/types/utils/simulation-api.d.ts +14 -6
  80. package/dist/types/utils/simulation-api.d.ts.map +1 -1
  81. package/dist/types/utils/simulation.d.ts +1 -1
  82. package/dist/types/utils/simulation.d.ts.map +1 -1
  83. package/dist/types.js +2 -2
  84. package/dist/types.mjs +1 -1
  85. package/dist/utils/etherscan.js +3 -3
  86. package/dist/utils/etherscan.mjs +2 -2
  87. package/dist/utils/external-transactions.js +1 -1
  88. package/dist/utils/external-transactions.mjs +1 -1
  89. package/dist/utils/gas-fees.js +6 -6
  90. package/dist/utils/gas-fees.mjs +5 -5
  91. package/dist/utils/gas-flow.js +3 -3
  92. package/dist/utils/gas-flow.mjs +2 -2
  93. package/dist/utils/gas.js +3 -3
  94. package/dist/utils/gas.mjs +2 -2
  95. package/dist/utils/layer1-gas-fee-flow.js +9 -0
  96. package/dist/utils/layer1-gas-fee-flow.js.map +1 -0
  97. package/dist/utils/layer1-gas-fee-flow.mjs +9 -0
  98. package/dist/utils/layer1-gas-fee-flow.mjs.map +1 -0
  99. package/dist/utils/simulation-api.js +2 -3
  100. package/dist/utils/simulation-api.mjs +1 -2
  101. package/dist/utils/simulation.js +4 -5
  102. package/dist/utils/simulation.mjs +3 -4
  103. package/dist/utils/swaps.js +4 -4
  104. package/dist/utils/swaps.mjs +3 -3
  105. package/dist/utils/transaction-type.js +1 -1
  106. package/dist/utils/transaction-type.mjs +1 -1
  107. package/dist/utils/utils.js +1 -1
  108. package/dist/utils/utils.mjs +1 -1
  109. package/dist/utils/validation.js +1 -1
  110. package/dist/utils/validation.mjs +1 -1
  111. package/package.json +7 -8
  112. package/dist/chunk-6MYNWYJK.mjs.map +0 -1
  113. package/dist/chunk-7APMBUKB.js.map +0 -1
  114. package/dist/chunk-BJEESIBE.js.map +0 -1
  115. package/dist/chunk-DE3MZYVY.mjs.map +0 -1
  116. package/dist/chunk-DEKM6PVG.mjs +0 -46
  117. package/dist/chunk-DEKM6PVG.mjs.map +0 -1
  118. package/dist/chunk-DTEDYRTL.js.map +0 -1
  119. package/dist/chunk-FDJPXQTF.js +0 -46
  120. package/dist/chunk-FDJPXQTF.js.map +0 -1
  121. package/dist/chunk-HPNXIKFY.js.map +0 -1
  122. package/dist/chunk-JR6HDRNV.mjs.map +0 -1
  123. package/dist/chunk-LM4NUNMT.mjs.map +0 -1
  124. package/dist/chunk-MHM5LRRF.mjs.map +0 -1
  125. package/dist/chunk-RI6MVJJN.js.map +0 -1
  126. /package/dist/{chunk-EQ3RRHB7.mjs.map → chunk-3D3SA6PY.mjs.map} +0 -0
  127. /package/dist/{chunk-ZCQRDZ36.js.map → chunk-5IHLDAOF.js.map} +0 -0
  128. /package/dist/{chunk-IC233ZQS.js.map → chunk-5OQ373JS.js.map} +0 -0
  129. /package/dist/{chunk-NUOBUW7C.js.map → chunk-CXXGL43K.js.map} +0 -0
  130. /package/dist/{chunk-7MZ57ILQ.mjs.map → chunk-DWHMMJOW.mjs.map} +0 -0
  131. /package/dist/{chunk-GKTIFXPN.js.map → chunk-F3CMU2DM.js.map} +0 -0
  132. /package/dist/{chunk-I5YZ7QUK.js.map → chunk-FHG5GY6F.js.map} +0 -0
  133. /package/dist/{chunk-DQP6X25N.mjs.map → chunk-IK55QTGO.mjs.map} +0 -0
  134. /package/dist/{chunk-2K7J3EY3.mjs.map → chunk-IZI7FQIN.mjs.map} +0 -0
  135. /package/dist/{chunk-M7455RU7.js.map → chunk-NRWEI43Q.js.map} +0 -0
  136. /package/dist/{chunk-ZJLZSFOZ.js.map → chunk-PF3UOCRW.js.map} +0 -0
  137. /package/dist/{chunk-UM4ORJ5B.mjs.map → chunk-PGTV7236.mjs.map} +0 -0
  138. /package/dist/{chunk-FS7FRO7B.mjs.map → chunk-QRSTF45Q.mjs.map} +0 -0
  139. /package/dist/{chunk-IUBAETUH.js.map → chunk-RQKICZYP.js.map} +0 -0
  140. /package/dist/{chunk-H4M66BA3.js.map → chunk-TZTP4JVA.js.map} +0 -0
  141. /package/dist/{chunk-Y734U4V6.mjs.map → chunk-VEREDMI2.mjs.map} +0 -0
  142. /package/dist/{chunk-UKYY2RVS.mjs.map → chunk-XKNFL657.mjs.map} +0 -0
  143. /package/dist/{chunk-C67QD5PV.mjs.map → chunk-ZQFMTLZJ.mjs.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [25.2.0]
11
+
12
+ ### Added
13
+
14
+ - Add simulation types ([#4067](https://github.com/MetaMask/core/pull/4067))
15
+ - SimulationBalanceChange
16
+ - SimulationData
17
+ - SimulationError
18
+ - SimulationToken
19
+ - SimulationTokenBalanceChange
20
+ - SimulationTokenStandard
21
+
22
+ ### Changed
23
+
24
+ - No longer wait for simulation to complete before creating approval request ([#4067](https://github.com/MetaMask/core/pull/4067))
25
+ - Automatically update simulation data if transaction parameters are updated ([#4067](https://github.com/MetaMask/core/pull/4067))
26
+ - Determine networks supporting simulation dynamically using API ([#4087](https://github.com/MetaMask/core/pull/4087))
27
+
28
+ ## [25.1.0]
29
+
30
+ ### Added
31
+
32
+ - Support `Layer1GasFeeFlows` and add `layer1GasFee` property to `TransactionMeta` ([#3944](https://github.com/MetaMask/core/pull/3944))
33
+
34
+ ### Fixed
35
+
36
+ - Fix `types` field in `package.json` ([#4047](https://github.com/MetaMask/core/pull/4047))
37
+
10
38
  ## [25.0.0]
11
39
 
12
40
  ### Added
@@ -674,7 +702,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
674
702
 
675
703
  All changes listed after this point were applied to this package following the monorepo conversion.
676
704
 
677
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@25.0.0...HEAD
705
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@25.2.0...HEAD
706
+ [25.2.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@25.1.0...@metamask/transaction-controller@25.2.0
707
+ [25.1.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@25.0.0...@metamask/transaction-controller@25.1.0
678
708
  [25.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@24.0.0...@metamask/transaction-controller@25.0.0
679
709
  [24.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@23.1.0...@metamask/transaction-controller@24.0.0
680
710
  [23.1.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@23.0.0...@metamask/transaction-controller@23.1.0
@@ -4,30 +4,31 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkBJEESIBEjs = require('./chunk-BJEESIBE.js');
7
+ var _chunkICNMLQ6Sjs = require('./chunk-ICNMLQ6S.js');
8
8
  require('./chunk-VH47Q6TS.js');
9
- require('./chunk-IUBAETUH.js');
9
+ require('./chunk-RQKICZYP.js');
10
10
  require('./chunk-QP75SWIQ.js');
11
11
  require('./chunk-ZNZEJDOE.js');
12
- require('./chunk-DTEDYRTL.js');
13
- require('./chunk-FDJPXQTF.js');
12
+ require('./chunk-GC77BSQZ.js');
13
+ require('./chunk-GE57YNGX.js');
14
14
  require('./chunk-HS277C77.js');
15
- require('./chunk-7APMBUKB.js');
15
+ require('./chunk-QEX3QMSL.js');
16
+ require('./chunk-R7NJVDWN.js');
16
17
  require('./chunk-DTDTOMTB.js');
17
- require('./chunk-M7455RU7.js');
18
+ require('./chunk-NRWEI43Q.js');
18
19
  require('./chunk-5XBULBP2.js');
19
20
  require('./chunk-7LXE4KHV.js');
20
- require('./chunk-I5YZ7QUK.js');
21
- require('./chunk-ZJLZSFOZ.js');
22
- require('./chunk-ZCQRDZ36.js');
23
- require('./chunk-IC233ZQS.js');
21
+ require('./chunk-FHG5GY6F.js');
22
+ require('./chunk-PF3UOCRW.js');
23
+ require('./chunk-5IHLDAOF.js');
24
+ require('./chunk-5OQ373JS.js');
24
25
  require('./chunk-UGFBA4GV.js');
25
- require('./chunk-H4M66BA3.js');
26
- require('./chunk-GKTIFXPN.js');
27
- require('./chunk-NUOBUW7C.js');
28
- require('./chunk-RI6MVJJN.js');
26
+ require('./chunk-TZTP4JVA.js');
27
+ require('./chunk-F3CMU2DM.js');
28
+ require('./chunk-CXXGL43K.js');
29
+ require('./chunk-ITDY6AIZ.js');
29
30
  require('./chunk-S6VGOPUY.js');
30
- require('./chunk-HPNXIKFY.js');
31
+ require('./chunk-VEJ3MIZG.js');
31
32
  require('./chunk-Z4BLTVTB.js');
32
33
 
33
34
 
@@ -35,5 +36,5 @@ require('./chunk-Z4BLTVTB.js');
35
36
 
36
37
 
37
38
 
38
- exports.ApprovalState = _chunkBJEESIBEjs.ApprovalState; exports.CANCEL_RATE = _chunkBJEESIBEjs.CANCEL_RATE; exports.HARDFORK = _chunkBJEESIBEjs.HARDFORK; exports.SPEED_UP_RATE = _chunkBJEESIBEjs.SPEED_UP_RATE; exports.TransactionController = _chunkBJEESIBEjs.TransactionController;
39
+ exports.ApprovalState = _chunkICNMLQ6Sjs.ApprovalState; exports.CANCEL_RATE = _chunkICNMLQ6Sjs.CANCEL_RATE; exports.HARDFORK = _chunkICNMLQ6Sjs.HARDFORK; exports.SPEED_UP_RATE = _chunkICNMLQ6Sjs.SPEED_UP_RATE; exports.TransactionController = _chunkICNMLQ6Sjs.TransactionController;
39
40
  //# sourceMappingURL=TransactionController.js.map
@@ -4,30 +4,31 @@ import {
4
4
  HARDFORK,
5
5
  SPEED_UP_RATE,
6
6
  TransactionController
7
- } from "./chunk-DE3MZYVY.mjs";
7
+ } from "./chunk-GJ7VDSXJ.mjs";
8
8
  import "./chunk-NM6OYEPP.mjs";
9
- import "./chunk-UKYY2RVS.mjs";
9
+ import "./chunk-XKNFL657.mjs";
10
10
  import "./chunk-XGRAHX6T.mjs";
11
11
  import "./chunk-NHRBO3LU.mjs";
12
- import "./chunk-JR6HDRNV.mjs";
13
- import "./chunk-DEKM6PVG.mjs";
12
+ import "./chunk-BYBPZUHS.mjs";
13
+ import "./chunk-6XMG522E.mjs";
14
14
  import "./chunk-JRBREX22.mjs";
15
- import "./chunk-6MYNWYJK.mjs";
15
+ import "./chunk-5UL3VDFT.mjs";
16
+ import "./chunk-KFL2GGZC.mjs";
16
17
  import "./chunk-Y7ENNK7L.mjs";
17
- import "./chunk-C67QD5PV.mjs";
18
+ import "./chunk-ZQFMTLZJ.mjs";
18
19
  import "./chunk-JRQHIBG5.mjs";
19
20
  import "./chunk-FRKQ3Z2L.mjs";
20
- import "./chunk-UM4ORJ5B.mjs";
21
- import "./chunk-FS7FRO7B.mjs";
22
- import "./chunk-DQP6X25N.mjs";
23
- import "./chunk-EQ3RRHB7.mjs";
21
+ import "./chunk-PGTV7236.mjs";
22
+ import "./chunk-QRSTF45Q.mjs";
23
+ import "./chunk-IK55QTGO.mjs";
24
+ import "./chunk-3D3SA6PY.mjs";
24
25
  import "./chunk-J56A7UCK.mjs";
25
- import "./chunk-7MZ57ILQ.mjs";
26
- import "./chunk-2K7J3EY3.mjs";
27
- import "./chunk-Y734U4V6.mjs";
28
- import "./chunk-MHM5LRRF.mjs";
26
+ import "./chunk-DWHMMJOW.mjs";
27
+ import "./chunk-IZI7FQIN.mjs";
28
+ import "./chunk-VEREDMI2.mjs";
29
+ import "./chunk-Z3HHSD5I.mjs";
29
30
  import "./chunk-UQQWZT6C.mjs";
30
- import "./chunk-LM4NUNMT.mjs";
31
+ import "./chunk-W57BD6NX.mjs";
31
32
  import "./chunk-XUI43LEZ.mjs";
32
33
  export {
33
34
  ApprovalState,
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-J56A7UCK.mjs";
4
4
  import {
5
5
  CHAIN_IDS
6
- } from "./chunk-MHM5LRRF.mjs";
6
+ } from "./chunk-Z3HHSD5I.mjs";
7
7
  import {
8
8
  createModuleLogger,
9
9
  projectLogger
@@ -208,4 +208,4 @@ export {
208
208
  updateSwapsTransaction,
209
209
  updatePostTransactionBalance
210
210
  };
211
- //# sourceMappingURL=chunk-EQ3RRHB7.mjs.map
211
+ //# sourceMappingURL=chunk-3D3SA6PY.mjs.map
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkIC233ZQSjs = require('./chunk-IC233ZQS.js');
3
+ var _chunk5OQ373JSjs = require('./chunk-5OQ373JS.js');
4
4
 
5
5
 
6
- var _chunkH4M66BA3js = require('./chunk-H4M66BA3.js');
6
+ var _chunkTZTP4JVAjs = require('./chunk-TZTP4JVA.js');
7
7
 
8
8
 
9
9
  var _chunkS6VGOPUYjs = require('./chunk-S6VGOPUY.js');
@@ -20,7 +20,7 @@ var log = _utils.createModuleLogger.call(void 0, _chunkS6VGOPUYjs.projectLogger,
20
20
  async function updateGasFees(request) {
21
21
  const { txMeta } = request;
22
22
  const initialParams = { ...txMeta.txParams };
23
- const isSwap = _chunkIC233ZQSjs.SWAP_TRANSACTION_TYPES.includes(
23
+ const isSwap = _chunk5OQ373JSjs.SWAP_TRANSACTION_TYPES.includes(
24
24
  txMeta.type
25
25
  );
26
26
  const savedGasFees = isSwap ? void 0 : request.getSavedGasFees(txMeta.chainId);
@@ -185,7 +185,7 @@ async function getSuggestedGasFees(request) {
185
185
  if (!eip1559 && txMeta.txParams.gasPrice || eip1559 && txMeta.txParams.maxFeePerGas && txMeta.txParams.maxPriorityFeePerGas) {
186
186
  return {};
187
187
  }
188
- const gasFeeFlow = _chunkH4M66BA3js.getGasFeeFlow.call(void 0, txMeta, gasFeeFlows);
188
+ const gasFeeFlow = _chunkTZTP4JVAjs.getGasFeeFlow.call(void 0, txMeta, gasFeeFlows);
189
189
  try {
190
190
  const response = await gasFeeFlow.getGasFees({
191
191
  ethQuery,
@@ -205,4 +205,4 @@ async function getSuggestedGasFees(request) {
205
205
 
206
206
 
207
207
  exports.updateGasFees = updateGasFees; exports.gweiDecimalToWeiHex = gweiDecimalToWeiHex;
208
- //# sourceMappingURL=chunk-ZCQRDZ36.js.map
208
+ //# sourceMappingURL=chunk-5IHLDAOF.js.map
@@ -3,7 +3,7 @@
3
3
  var _chunkUGFBA4GVjs = require('./chunk-UGFBA4GV.js');
4
4
 
5
5
 
6
- var _chunkRI6MVJJNjs = require('./chunk-RI6MVJJN.js');
6
+ var _chunkITDY6AIZjs = require('./chunk-ITDY6AIZ.js');
7
7
 
8
8
 
9
9
 
@@ -57,15 +57,15 @@ var ZKSYNC_ERA_SWAPS_TOKEN_OBJECT = {
57
57
  ...ETH_SWAPS_TOKEN_OBJECT
58
58
  };
59
59
  var SWAPS_CHAINID_DEFAULT_TOKEN_MAP = {
60
- [_chunkRI6MVJJNjs.CHAIN_IDS.MAINNET]: ETH_SWAPS_TOKEN_OBJECT,
60
+ [_chunkITDY6AIZjs.CHAIN_IDS.MAINNET]: ETH_SWAPS_TOKEN_OBJECT,
61
61
  [SWAPS_TESTNET_CHAIN_ID]: TEST_ETH_SWAPS_TOKEN_OBJECT,
62
- [_chunkRI6MVJJNjs.CHAIN_IDS.BSC]: BNB_SWAPS_TOKEN_OBJECT,
63
- [_chunkRI6MVJJNjs.CHAIN_IDS.POLYGON]: MATIC_SWAPS_TOKEN_OBJECT,
64
- [_chunkRI6MVJJNjs.CHAIN_IDS.GOERLI]: GOERLI_SWAPS_TOKEN_OBJECT,
65
- [_chunkRI6MVJJNjs.CHAIN_IDS.AVALANCHE]: AVAX_SWAPS_TOKEN_OBJECT,
66
- [_chunkRI6MVJJNjs.CHAIN_IDS.OPTIMISM]: OPTIMISM_SWAPS_TOKEN_OBJECT,
67
- [_chunkRI6MVJJNjs.CHAIN_IDS.ARBITRUM]: ARBITRUM_SWAPS_TOKEN_OBJECT,
68
- [_chunkRI6MVJJNjs.CHAIN_IDS.ZKSYNC_ERA]: ZKSYNC_ERA_SWAPS_TOKEN_OBJECT
62
+ [_chunkITDY6AIZjs.CHAIN_IDS.BSC]: BNB_SWAPS_TOKEN_OBJECT,
63
+ [_chunkITDY6AIZjs.CHAIN_IDS.POLYGON]: MATIC_SWAPS_TOKEN_OBJECT,
64
+ [_chunkITDY6AIZjs.CHAIN_IDS.GOERLI]: GOERLI_SWAPS_TOKEN_OBJECT,
65
+ [_chunkITDY6AIZjs.CHAIN_IDS.AVALANCHE]: AVAX_SWAPS_TOKEN_OBJECT,
66
+ [_chunkITDY6AIZjs.CHAIN_IDS.OPTIMISM]: OPTIMISM_SWAPS_TOKEN_OBJECT,
67
+ [_chunkITDY6AIZjs.CHAIN_IDS.ARBITRUM]: ARBITRUM_SWAPS_TOKEN_OBJECT,
68
+ [_chunkITDY6AIZjs.CHAIN_IDS.ZKSYNC_ERA]: ZKSYNC_ERA_SWAPS_TOKEN_OBJECT
69
69
  };
70
70
  var SWAP_TRANSACTION_TYPES = [
71
71
  "swap" /* swap */,
@@ -208,4 +208,4 @@ function sleep(ms) {
208
208
 
209
209
 
210
210
  exports.UPDATE_POST_TX_BALANCE_TIMEOUT = UPDATE_POST_TX_BALANCE_TIMEOUT; exports.UPDATE_POST_TX_BALANCE_ATTEMPTS = UPDATE_POST_TX_BALANCE_ATTEMPTS; exports.DEFAULT_TOKEN_ADDRESS = DEFAULT_TOKEN_ADDRESS; exports.SWAPS_CHAINID_DEFAULT_TOKEN_MAP = SWAPS_CHAINID_DEFAULT_TOKEN_MAP; exports.SWAP_TRANSACTION_TYPES = SWAP_TRANSACTION_TYPES; exports.updateSwapsTransaction = updateSwapsTransaction; exports.updatePostTransactionBalance = updatePostTransactionBalance;
211
- //# sourceMappingURL=chunk-IC233ZQS.js.map
211
+ //# sourceMappingURL=chunk-5OQ373JS.js.map
@@ -1,6 +1,9 @@
1
+ import {
2
+ updateTransactionLayer1GasFee
3
+ } from "./chunk-KFL2GGZC.mjs";
1
4
  import {
2
5
  getGasFeeFlow
3
- } from "./chunk-7MZ57ILQ.mjs";
6
+ } from "./chunk-DWHMMJOW.mjs";
4
7
  import {
5
8
  projectLogger
6
9
  } from "./chunk-UQQWZT6C.mjs";
@@ -16,7 +19,7 @@ import { createModuleLogger } from "@metamask/utils";
16
19
  import EventEmitter from "events";
17
20
  var log = createModuleLogger(projectLogger, "gas-fee-poller");
18
21
  var INTERVAL_MILLISECONDS = 1e4;
19
- var _gasFeeFlows, _getEthQuery, _getGasFeeControllerEstimates, _getTransactions, _timeout, _running, _start, start_fn, _stop, stop_fn, _onTimeout, onTimeout_fn, _updateUnapprovedTransactions, updateUnapprovedTransactions_fn, _updateTransactionSuggestedFees, updateTransactionSuggestedFees_fn, _getUnapprovedTransactions, getUnapprovedTransactions_fn;
22
+ var _gasFeeFlows, _getEthQuery, _getGasFeeControllerEstimates, _getTransactions, _layer1GasFeeFlows, _timeout, _running, _start, start_fn, _stop, stop_fn, _onTimeout, onTimeout_fn, _updateTransactionGasFeeEstimates, updateTransactionGasFeeEstimates_fn, _updateTransactionSuggestedFees, updateTransactionSuggestedFees_fn, _updateTransactionLayer1GasFee, updateTransactionLayer1GasFee_fn, _getUnapprovedTransactions, getUnapprovedTransactions_fn;
20
23
  var GasFeePoller = class {
21
24
  /**
22
25
  * Constructs a new instance of the GasFeePoller.
@@ -25,6 +28,7 @@ var GasFeePoller = class {
25
28
  * @param options.getEthQuery - Callback to obtain an EthQuery instance.
26
29
  * @param options.getGasFeeControllerEstimates - Callback to obtain the default fee estimates.
27
30
  * @param options.getTransactions - Callback to obtain the transaction data.
31
+ * @param options.layer1GasFeeFlows - The layer 1 gas fee flows to use to obtain suitable layer 1 gas fees.
28
32
  * @param options.onStateChange - Callback to register a listener for controller state changes.
29
33
  */
30
34
  constructor({
@@ -32,22 +36,26 @@ var GasFeePoller = class {
32
36
  getEthQuery,
33
37
  getGasFeeControllerEstimates,
34
38
  getTransactions,
39
+ layer1GasFeeFlows,
35
40
  onStateChange
36
41
  }) {
37
42
  __privateAdd(this, _start);
38
43
  __privateAdd(this, _stop);
39
44
  __privateAdd(this, _onTimeout);
40
- __privateAdd(this, _updateUnapprovedTransactions);
45
+ __privateAdd(this, _updateTransactionGasFeeEstimates);
41
46
  __privateAdd(this, _updateTransactionSuggestedFees);
47
+ __privateAdd(this, _updateTransactionLayer1GasFee);
42
48
  __privateAdd(this, _getUnapprovedTransactions);
43
49
  this.hub = new EventEmitter();
44
50
  __privateAdd(this, _gasFeeFlows, void 0);
45
51
  __privateAdd(this, _getEthQuery, void 0);
46
52
  __privateAdd(this, _getGasFeeControllerEstimates, void 0);
47
53
  __privateAdd(this, _getTransactions, void 0);
54
+ __privateAdd(this, _layer1GasFeeFlows, void 0);
48
55
  __privateAdd(this, _timeout, void 0);
49
56
  __privateAdd(this, _running, false);
50
57
  __privateSet(this, _gasFeeFlows, gasFeeFlows);
58
+ __privateSet(this, _layer1GasFeeFlows, layer1GasFeeFlows);
51
59
  __privateSet(this, _getEthQuery, getEthQuery);
52
60
  __privateSet(this, _getGasFeeControllerEstimates, getGasFeeControllerEstimates);
53
61
  __privateSet(this, _getTransactions, getTransactions);
@@ -65,6 +73,7 @@ _gasFeeFlows = new WeakMap();
65
73
  _getEthQuery = new WeakMap();
66
74
  _getGasFeeControllerEstimates = new WeakMap();
67
75
  _getTransactions = new WeakMap();
76
+ _layer1GasFeeFlows = new WeakMap();
68
77
  _timeout = new WeakMap();
69
78
  _running = new WeakMap();
70
79
  _start = new WeakSet();
@@ -88,19 +97,20 @@ stop_fn = function() {
88
97
  };
89
98
  _onTimeout = new WeakSet();
90
99
  onTimeout_fn = async function() {
91
- await __privateMethod(this, _updateUnapprovedTransactions, updateUnapprovedTransactions_fn).call(this);
100
+ await __privateMethod(this, _updateTransactionGasFeeEstimates, updateTransactionGasFeeEstimates_fn).call(this);
92
101
  __privateSet(this, _timeout, setTimeout(() => __privateMethod(this, _onTimeout, onTimeout_fn).call(this), INTERVAL_MILLISECONDS));
93
102
  };
94
- _updateUnapprovedTransactions = new WeakSet();
95
- updateUnapprovedTransactions_fn = async function() {
103
+ _updateTransactionGasFeeEstimates = new WeakSet();
104
+ updateTransactionGasFeeEstimates_fn = async function() {
96
105
  const unapprovedTransactions = __privateMethod(this, _getUnapprovedTransactions, getUnapprovedTransactions_fn).call(this);
97
106
  log("Found unapproved transactions", {
98
107
  count: unapprovedTransactions.length
99
108
  });
100
109
  await Promise.all(
101
- unapprovedTransactions.map(
102
- (tx) => __privateMethod(this, _updateTransactionSuggestedFees, updateTransactionSuggestedFees_fn).call(this, tx)
103
- )
110
+ unapprovedTransactions.flatMap((tx) => [
111
+ __privateMethod(this, _updateTransactionSuggestedFees, updateTransactionSuggestedFees_fn).call(this, tx),
112
+ __privateMethod(this, _updateTransactionLayer1GasFee, updateTransactionLayer1GasFee_fn).call(this, tx)
113
+ ])
104
114
  );
105
115
  };
106
116
  _updateTransactionSuggestedFees = new WeakSet();
@@ -145,6 +155,20 @@ updateTransactionSuggestedFees_fn = async function(transactionMeta) {
145
155
  transaction: updatedTransactionMeta.id
146
156
  });
147
157
  };
158
+ _updateTransactionLayer1GasFee = new WeakSet();
159
+ updateTransactionLayer1GasFee_fn = async function(transactionMeta) {
160
+ const { chainId, networkClientId } = transactionMeta;
161
+ const ethQuery = __privateGet(this, _getEthQuery).call(this, chainId, networkClientId);
162
+ await updateTransactionLayer1GasFee({
163
+ ethQuery,
164
+ layer1GasFeeFlows: __privateGet(this, _layer1GasFeeFlows),
165
+ transactionMeta
166
+ });
167
+ if (transactionMeta.layer1GasFee === void 0) {
168
+ return;
169
+ }
170
+ this.hub.emit("transaction-updated", transactionMeta);
171
+ };
148
172
  _getUnapprovedTransactions = new WeakSet();
149
173
  getUnapprovedTransactions_fn = function() {
150
174
  return __privateGet(this, _getTransactions).call(this).filter(
@@ -155,4 +179,4 @@ getUnapprovedTransactions_fn = function() {
155
179
  export {
156
180
  GasFeePoller
157
181
  };
158
- //# sourceMappingURL=chunk-6MYNWYJK.mjs.map
182
+ //# sourceMappingURL=chunk-5UL3VDFT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers/GasFeePoller.ts"],"sourcesContent":["import type EthQuery from '@metamask/eth-query';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport EventEmitter from 'events';\n\nimport { projectLogger } from '../logger';\nimport type {\n GasFeeEstimates,\n GasFeeFlow,\n GasFeeFlowRequest,\n Layer1GasFeeFlow,\n} from '../types';\nimport { TransactionStatus, type TransactionMeta } from '../types';\nimport { getGasFeeFlow } from '../utils/gas-flow';\nimport { updateTransactionLayer1GasFee } from '../utils/layer1-gas-fee-flow';\n\nconst log = createModuleLogger(projectLogger, 'gas-fee-poller');\n\nconst INTERVAL_MILLISECONDS = 10000;\n\n/**\n * Automatically polls and updates suggested gas fees on unapproved transactions.\n */\nexport class GasFeePoller {\n hub: EventEmitter = new EventEmitter();\n\n #gasFeeFlows: GasFeeFlow[];\n\n #getEthQuery: (chainId: Hex, networkClientId?: NetworkClientId) => EthQuery;\n\n #getGasFeeControllerEstimates: () => Promise<GasFeeState>;\n\n #getTransactions: () => TransactionMeta[];\n\n #layer1GasFeeFlows: Layer1GasFeeFlow[];\n\n #timeout: ReturnType<typeof setTimeout> | undefined;\n\n #running = false;\n\n /**\n * Constructs a new instance of the GasFeePoller.\n * @param options - The options for this instance.\n * @param options.gasFeeFlows - The gas fee flows to use to obtain suitable gas fees.\n * @param options.getEthQuery - Callback to obtain an EthQuery instance.\n * @param options.getGasFeeControllerEstimates - Callback to obtain the default fee estimates.\n * @param options.getTransactions - Callback to obtain the transaction data.\n * @param options.layer1GasFeeFlows - The layer 1 gas fee flows to use to obtain suitable layer 1 gas fees.\n * @param options.onStateChange - Callback to register a listener for controller state changes.\n */\n constructor({\n gasFeeFlows,\n getEthQuery,\n getGasFeeControllerEstimates,\n getTransactions,\n layer1GasFeeFlows,\n onStateChange,\n }: {\n gasFeeFlows: GasFeeFlow[];\n getEthQuery: (chainId: Hex, networkClientId?: NetworkClientId) => EthQuery;\n getGasFeeControllerEstimates: () => Promise<GasFeeState>;\n getTransactions: () => TransactionMeta[];\n layer1GasFeeFlows: Layer1GasFeeFlow[];\n onStateChange: (listener: () => void) => void;\n }) {\n this.#gasFeeFlows = gasFeeFlows;\n this.#layer1GasFeeFlows = layer1GasFeeFlows;\n this.#getEthQuery = getEthQuery;\n this.#getGasFeeControllerEstimates = getGasFeeControllerEstimates;\n this.#getTransactions = getTransactions;\n\n onStateChange(() => {\n const unapprovedTransactions = this.#getUnapprovedTransactions();\n\n if (unapprovedTransactions.length) {\n this.#start();\n } else {\n this.#stop();\n }\n });\n }\n\n #start() {\n if (this.#running) {\n return;\n }\n\n // Intentionally not awaiting since this starts the timeout chain.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.#onTimeout();\n\n this.#running = true;\n\n log('Started polling');\n }\n\n #stop() {\n if (!this.#running) {\n return;\n }\n\n clearTimeout(this.#timeout);\n\n this.#timeout = undefined;\n this.#running = false;\n\n log('Stopped polling');\n }\n\n async #onTimeout() {\n await this.#updateTransactionGasFeeEstimates();\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeout = setTimeout(() => this.#onTimeout(), INTERVAL_MILLISECONDS);\n }\n\n async #updateTransactionGasFeeEstimates() {\n const unapprovedTransactions = this.#getUnapprovedTransactions();\n\n log('Found unapproved transactions', {\n count: unapprovedTransactions.length,\n });\n\n await Promise.all(\n unapprovedTransactions.flatMap((tx) => [\n this.#updateTransactionSuggestedFees(tx),\n this.#updateTransactionLayer1GasFee(tx),\n ]),\n );\n }\n\n async #updateTransactionSuggestedFees(transactionMeta: TransactionMeta) {\n const { chainId, networkClientId } = transactionMeta;\n\n const ethQuery = this.#getEthQuery(chainId, networkClientId);\n const gasFeeFlow = getGasFeeFlow(transactionMeta, this.#gasFeeFlows);\n\n if (!gasFeeFlow) {\n log('No gas fee flow found', transactionMeta.id);\n } else {\n log(\n 'Found gas fee flow',\n gasFeeFlow.constructor.name,\n transactionMeta.id,\n );\n }\n\n const request: GasFeeFlowRequest = {\n ethQuery,\n getGasFeeControllerEstimates: this.#getGasFeeControllerEstimates,\n transactionMeta,\n };\n\n let gasFeeEstimates: GasFeeEstimates | undefined;\n\n if (gasFeeFlow) {\n try {\n const response = await gasFeeFlow.getGasFees(request);\n gasFeeEstimates = response.estimates;\n } catch (error) {\n log('Failed to get suggested gas fees', transactionMeta.id, error);\n }\n }\n\n if (!gasFeeEstimates && transactionMeta.gasFeeEstimatesLoaded) {\n return;\n }\n\n const updatedTransactionMeta: TransactionMeta = {\n ...transactionMeta,\n gasFeeEstimates,\n gasFeeEstimatesLoaded: true,\n };\n\n this.hub.emit('transaction-updated', updatedTransactionMeta);\n\n log('Updated suggested gas fees', {\n gasFeeEstimates: updatedTransactionMeta.gasFeeEstimates,\n transaction: updatedTransactionMeta.id,\n });\n }\n\n async #updateTransactionLayer1GasFee(transactionMeta: TransactionMeta) {\n const { chainId, networkClientId } = transactionMeta;\n const ethQuery = this.#getEthQuery(chainId, networkClientId);\n\n await updateTransactionLayer1GasFee({\n ethQuery,\n layer1GasFeeFlows: this.#layer1GasFeeFlows,\n transactionMeta,\n });\n\n if (transactionMeta.layer1GasFee === undefined) {\n return;\n }\n\n this.hub.emit('transaction-updated', transactionMeta);\n }\n\n #getUnapprovedTransactions() {\n return this.#getTransactions().filter(\n (tx) => tx.status === TransactionStatus.unapproved,\n );\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,56 @@
1
+ import {
2
+ projectLogger
3
+ } from "./chunk-UQQWZT6C.mjs";
4
+
5
+ // src/utils/simulation-api.ts
6
+ import { convertHexToDecimal } from "@metamask/controller-utils";
7
+ import { createModuleLogger } from "@metamask/utils";
8
+ var log = createModuleLogger(projectLogger, "simulation-api");
9
+ var RPC_METHOD = "infura_simulateTransactions";
10
+ var BASE_URL = "https://tx-sentinel-{0}.api.cx.metamask.io/";
11
+ var ENDPOINT_NETWORKS = "networks";
12
+ var requestIdCounter = 0;
13
+ async function simulateTransactions(chainId, request) {
14
+ const url = await getSimulationUrl(chainId);
15
+ log("Sending request", url, request);
16
+ const requestId = requestIdCounter;
17
+ requestIdCounter += 1;
18
+ const response = await fetch(url, {
19
+ method: "POST",
20
+ body: JSON.stringify({
21
+ id: String(requestId),
22
+ jsonrpc: "2.0",
23
+ method: RPC_METHOD,
24
+ params: [request]
25
+ })
26
+ });
27
+ const responseJson = await response.json();
28
+ log("Received response", responseJson);
29
+ if (responseJson.error) {
30
+ throw responseJson.error;
31
+ }
32
+ return responseJson?.result;
33
+ }
34
+ async function getSimulationUrl(chainId) {
35
+ const networkData = await getNetworkData();
36
+ const chainIdDecimal = convertHexToDecimal(chainId);
37
+ const network = networkData[chainIdDecimal];
38
+ if (!network?.confirmations) {
39
+ log("Chain is not supported", chainId);
40
+ throw new Error(`Chain is not supported: ${chainId}`);
41
+ }
42
+ return getUrl(network.network);
43
+ }
44
+ async function getNetworkData() {
45
+ const url = `${getUrl("ethereum-mainnet")}${ENDPOINT_NETWORKS}`;
46
+ const response = await fetch(url);
47
+ return response.json();
48
+ }
49
+ function getUrl(subdomain) {
50
+ return BASE_URL.replace("{0}", subdomain);
51
+ }
52
+
53
+ export {
54
+ simulateTransactions
55
+ };
56
+ //# sourceMappingURL=chunk-6XMG522E.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/simulation-api.ts"],"sourcesContent":["import { convertHexToDecimal } from '@metamask/controller-utils';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n\nimport { projectLogger } from '../logger';\n\nconst log = createModuleLogger(projectLogger, 'simulation-api');\n\nconst RPC_METHOD = 'infura_simulateTransactions';\nconst BASE_URL = 'https://tx-sentinel-{0}.api.cx.metamask.io/';\nconst ENDPOINT_NETWORKS = 'networks';\n\n/** Single transaction to simulate in a simulation API request. */\nexport type SimulationRequestTransaction = {\n /** Data to send with the transaction. */\n data?: Hex;\n\n /** Sender of the transaction. */\n from: Hex;\n\n /** Gas limit for the transaction. */\n gas?: Hex;\n\n /** Maximum fee per gas for the transaction. */\n maxFeePerGas?: Hex;\n\n /** Maximum priority fee per gas for the transaction. */\n maxPriorityFeePerGas?: Hex;\n\n /** Recipient of the transaction. */\n to?: Hex;\n\n /** Value to send with the transaction. */\n value?: Hex;\n};\n\n/** Request to the simulation API to simulate transactions. */\nexport type SimulationRequest = {\n /**\n * Transactions to be sequentially simulated.\n * State changes impact subsequent transactions in the list.\n */\n transactions: SimulationRequestTransaction[];\n\n /**\n * Overrides to the state of the blockchain, keyed by smart contract address.\n */\n overrides?: {\n [address: Hex]: {\n /** Overrides to the storage slots for a smart contract account. */\n stateDiff: {\n [slot: Hex]: Hex;\n };\n };\n };\n\n /**\n * Whether to include call traces in the response.\n * Defaults to false.\n */\n withCallTrace?: boolean;\n\n /**\n * Whether to include event logs in the response.\n * Defaults to false.\n */\n withLogs?: boolean;\n};\n\n/** Raw event log emitted by a simulated transaction. */\nexport type SimulationResponseLog = {\n /** Address of the account that created the event. */\n address: Hex;\n\n /** Raw data in the event that is not indexed. */\n data: Hex;\n\n /** Raw indexed data from the event. */\n topics: Hex[];\n};\n\n/** Call trace of a single simulated transaction. */\nexport type SimulationResponseCallTrace = {\n /** Nested calls. */\n calls: SimulationResponseCallTrace[];\n\n /** Raw event logs created by the call. */\n logs: SimulationResponseLog[];\n};\n\n/**\n * Changes to the blockchain state.\n * Keyed by account address.\n */\nexport type SimulationResponseStateDiff = {\n [address: Hex]: {\n /** Native balance of the account. */\n balance?: Hex;\n\n /** Nonce of the account. */\n nonce?: Hex;\n\n /** Storage values per slot. */\n storage?: {\n [slot: Hex]: Hex;\n };\n };\n};\n\n/** Response from the simulation API for a single transaction. */\nexport type SimulationResponseTransaction = {\n /** An error message indicating the transaction could not be simulated. */\n error?: string;\n\n /** Return value of the transaction, such as the balance if calling balanceOf. */\n return: Hex;\n\n /** Hierarchy of call data including nested calls and logs. */\n callTrace?: SimulationResponseCallTrace;\n\n /** Changes to the blockchain state. */\n stateDiff?: {\n /** Initial blockchain state before the transaction. */\n pre?: SimulationResponseStateDiff;\n\n /** Updated blockchain state after the transaction. */\n post?: SimulationResponseStateDiff;\n };\n};\n\n/** Response from the simulation API. */\nexport type SimulationResponse = {\n /** Simulation data for each transaction in the request. */\n transactions: SimulationResponseTransaction[];\n};\n\n/** Data for a network supported by the Simulation API. */\ntype SimulationNetwork = {\n /** Subdomain of the API for the network. */\n network: string;\n\n /** Whether the network supports confirmation simulations. */\n confirmations: boolean;\n};\n\n/** Response from the simulation API containing supported networks. */\ntype SimulationNetworkResponse = {\n [chainIdDecimal: string]: SimulationNetwork;\n};\n\nlet requestIdCounter = 0;\n\n/**\n * Simulate transactions using the transaction simulation API.\n * @param chainId - The chain ID to simulate transactions on.\n * @param request - The request to simulate transactions.\n */\nexport async function simulateTransactions(\n chainId: Hex,\n request: SimulationRequest,\n): Promise<SimulationResponse> {\n const url = await getSimulationUrl(chainId);\n\n log('Sending request', url, request);\n\n const requestId = requestIdCounter;\n requestIdCounter += 1;\n\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n id: String(requestId),\n jsonrpc: '2.0',\n method: RPC_METHOD,\n params: [request],\n }),\n });\n\n const responseJson = await response.json();\n\n log('Received response', responseJson);\n\n if (responseJson.error) {\n throw responseJson.error;\n }\n\n return responseJson?.result;\n}\n\n/**\n * Get the URL for the transaction simulation API.\n * @param chainId - The chain ID to get the URL for.\n * @returns The URL for the transaction simulation API.\n */\nasync function getSimulationUrl(chainId: Hex): Promise<string> {\n const networkData = await getNetworkData();\n const chainIdDecimal = convertHexToDecimal(chainId);\n const network = networkData[chainIdDecimal];\n\n if (!network?.confirmations) {\n log('Chain is not supported', chainId);\n throw new Error(`Chain is not supported: ${chainId}`);\n }\n\n return getUrl(network.network);\n}\n\n/**\n * Retrieve the supported network data from the simulation API.\n */\nasync function getNetworkData(): Promise<SimulationNetworkResponse> {\n const url = `${getUrl('ethereum-mainnet')}${ENDPOINT_NETWORKS}`;\n const response = await fetch(url);\n return response.json();\n}\n\n/**\n * Generate the URL for the specified subdomain in the simulation API.\n * @param subdomain - The subdomain to generate the URL for.\n * @returns The URL for the transaction simulation API.\n */\nfunction getUrl(subdomain: string): string {\n return BASE_URL.replace('{0}', subdomain);\n}\n"],"mappings":";;;;;AAAA,SAAS,2BAA2B;AACpC,SAAS,0BAAoC;AAI7C,IAAM,MAAM,mBAAmB,eAAe,gBAAgB;AAE9D,IAAM,aAAa;AACnB,IAAM,WAAW;AACjB,IAAM,oBAAoB;AA4I1B,IAAI,mBAAmB;AAOvB,eAAsB,qBACpB,SACA,SAC6B;AAC7B,QAAM,MAAM,MAAM,iBAAiB,OAAO;AAE1C,MAAI,mBAAmB,KAAK,OAAO;AAEnC,QAAM,YAAY;AAClB,sBAAoB;AAEpB,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU;AAAA,MACnB,IAAI,OAAO,SAAS;AAAA,MACpB,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ,CAAC,OAAO;AAAA,IAClB,CAAC;AAAA,EACH,CAAC;AAED,QAAM,eAAe,MAAM,SAAS,KAAK;AAEzC,MAAI,qBAAqB,YAAY;AAErC,MAAI,aAAa,OAAO;AACtB,UAAM,aAAa;AAAA,EACrB;AAEA,SAAO,cAAc;AACvB;AAOA,eAAe,iBAAiB,SAA+B;AAC7D,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,iBAAiB,oBAAoB,OAAO;AAClD,QAAM,UAAU,YAAY,cAAc;AAE1C,MAAI,CAAC,SAAS,eAAe;AAC3B,QAAI,0BAA0B,OAAO;AACrC,UAAM,IAAI,MAAM,2BAA2B,OAAO,EAAE;AAAA,EACtD;AAEA,SAAO,OAAO,QAAQ,OAAO;AAC/B;AAKA,eAAe,iBAAqD;AAClE,QAAM,MAAM,GAAG,OAAO,kBAAkB,CAAC,GAAG,iBAAiB;AAC7D,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,SAAO,SAAS,KAAK;AACvB;AAOA,SAAS,OAAO,WAA2B;AACzC,SAAO,SAAS,QAAQ,OAAO,SAAS;AAC1C;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  simulateTransactions
3
- } from "./chunk-DEKM6PVG.mjs";
3
+ } from "./chunk-6XMG522E.mjs";
4
4
  import {
5
5
  projectLogger
6
6
  } from "./chunk-UQQWZT6C.mjs";
@@ -16,10 +16,23 @@ async function getSimulationData(request) {
16
16
  log("Getting simulation data", request);
17
17
  try {
18
18
  const response = await simulateTransactions(chainId, {
19
- transactions: [{ from, to, value, data }],
19
+ transactions: [
20
+ {
21
+ data,
22
+ from,
23
+ maxFeePerGas: "0x0",
24
+ maxPriorityFeePerGas: "0x0",
25
+ to,
26
+ value
27
+ }
28
+ ],
20
29
  withCallTrace: true,
21
30
  withLogs: true
22
31
  });
32
+ const transactionError = response.transactions?.[0]?.error;
33
+ if (transactionError) {
34
+ throw { message: transactionError };
35
+ }
23
36
  const nativeBalanceChange = getNativeBalanceChange(request.from, response);
24
37
  const events = getEvents(response);
25
38
  log("Parsed events", events);
@@ -30,7 +43,15 @@ async function getSimulationData(request) {
30
43
  };
31
44
  } catch (error) {
32
45
  log("Failed to get simulation data", error, request);
33
- return void 0;
46
+ const rawError = error;
47
+ return {
48
+ tokenBalanceChanges: [],
49
+ error: {
50
+ code: rawError.code,
51
+ message: rawError.message,
52
+ isReverted: rawError.message?.includes("execution reverted") ?? false
53
+ }
54
+ };
34
55
  }
35
56
  }
36
57
  function getNativeBalanceChange(userAddress, response) {
@@ -39,15 +60,17 @@ function getNativeBalanceChange(userAddress, response) {
39
60
  return void 0;
40
61
  }
41
62
  const { stateDiff } = transactionResponse;
42
- const previousBalance = stateDiff.pre[userAddress]?.balance;
43
- const newBalance = stateDiff.post[userAddress]?.balance;
63
+ const previousBalance = stateDiff?.pre?.[userAddress]?.balance;
64
+ const newBalance = stateDiff?.post?.[userAddress]?.balance;
44
65
  if (!previousBalance || !newBalance) {
45
66
  return void 0;
46
67
  }
47
68
  return getSimulationBalanceChange(previousBalance, newBalance);
48
69
  }
49
70
  function getEvents(response) {
50
- const logs = extractLogs(response.transactions[0]?.callTrace ?? {});
71
+ const logs = extractLogs(
72
+ response.transactions[0]?.callTrace ?? {}
73
+ );
51
74
  log("Extracted logs", logs);
52
75
  const erc20Interface = new Interface(abiERC20);
53
76
  const erc721Interface = new Interface(abiERC721);
@@ -239,4 +262,4 @@ function normalizeReturnValue(value) {
239
262
  export {
240
263
  getSimulationData
241
264
  };
242
- //# sourceMappingURL=chunk-JR6HDRNV.mjs.map
265
+ //# sourceMappingURL=chunk-BYBPZUHS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/simulation.ts"],"sourcesContent":["import type { Fragment, LogDescription, Result } from '@ethersproject/abi';\nimport { Interface } from '@ethersproject/abi';\nimport { hexToBN, toHex } from '@metamask/controller-utils';\nimport { abiERC20, abiERC721, abiERC1155 } from '@metamask/metamask-eth-abis';\nimport { createModuleLogger, type Hex } from '@metamask/utils';\n\nimport { projectLogger } from '../logger';\nimport type {\n SimulationBalanceChange,\n SimulationData,\n SimulationTokenBalanceChange,\n SimulationToken,\n} from '../types';\nimport { SimulationTokenStandard } from '../types';\nimport { simulateTransactions } from './simulation-api';\nimport type {\n SimulationResponseLog,\n SimulationRequestTransaction,\n SimulationResponse,\n SimulationResponseCallTrace,\n} from './simulation-api';\n\nconst log = createModuleLogger(projectLogger, 'simulation');\n\ntype ABI = Fragment[];\n\nexport type GetSimulationDataRequest = {\n chainId: Hex;\n from: Hex;\n to?: Hex;\n value?: Hex;\n data?: Hex;\n};\n\ntype ParsedEvent = {\n contractAddress: Hex;\n tokenStandard: SimulationTokenStandard;\n name: string;\n args: Record<string, Hex | Hex[]>;\n abi: ABI;\n};\n\n/**\n * Generate simulation data for a transaction.\n * @param request - The transaction to simulate.\n * @param request.chainId - The chain ID of the transaction.\n * @param request.from - The sender of the transaction.\n * @param request.to - The recipient of the transaction.\n * @param request.value - The value of the transaction.\n * @param request.data - The data of the transaction.\n * @returns The simulation data.\n */\nexport async function getSimulationData(\n request: GetSimulationDataRequest,\n): Promise<SimulationData> {\n const { chainId, from, to, value, data } = request;\n\n log('Getting simulation data', request);\n\n try {\n const response = await simulateTransactions(chainId, {\n transactions: [\n {\n data,\n from,\n maxFeePerGas: '0x0',\n maxPriorityFeePerGas: '0x0',\n to,\n value,\n },\n ],\n withCallTrace: true,\n withLogs: true,\n });\n\n const transactionError = response.transactions?.[0]?.error;\n\n if (transactionError) {\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw { message: transactionError };\n }\n\n const nativeBalanceChange = getNativeBalanceChange(request.from, response);\n const events = getEvents(response);\n\n log('Parsed events', events);\n\n const tokenBalanceChanges = await getTokenBalanceChanges(request, events);\n\n return {\n nativeBalanceChange,\n tokenBalanceChanges,\n };\n } catch (error) {\n log('Failed to get simulation data', error, request);\n\n const rawError = error as { code?: number; message?: string };\n\n return {\n tokenBalanceChanges: [],\n error: {\n code: rawError.code,\n message: rawError.message,\n isReverted: rawError.message?.includes('execution reverted') ?? false,\n },\n };\n }\n}\n\n/**\n * Extract the native balance change from a simulation response.\n * @param userAddress - The user's account address.\n * @param response - The simulation response.\n * @returns The native balance change or undefined if unchanged.\n */\nfunction getNativeBalanceChange(\n userAddress: Hex,\n response: SimulationResponse,\n): SimulationBalanceChange | undefined {\n const transactionResponse = response.transactions[0];\n\n /* istanbul ignore next */\n if (!transactionResponse) {\n return undefined;\n }\n\n const { stateDiff } = transactionResponse;\n const previousBalance = stateDiff?.pre?.[userAddress]?.balance;\n const newBalance = stateDiff?.post?.[userAddress]?.balance;\n\n if (!previousBalance || !newBalance) {\n return undefined;\n }\n\n return getSimulationBalanceChange(previousBalance, newBalance);\n}\n\n/**\n * Extract events from a simulation response.\n * @param response - The simulation response.\n * @returns The parsed events.\n */\nfunction getEvents(response: SimulationResponse): ParsedEvent[] {\n /* istanbul ignore next */\n const logs = extractLogs(\n response.transactions[0]?.callTrace ?? ({} as SimulationResponseCallTrace),\n );\n\n log('Extracted logs', logs);\n\n const erc20Interface = new Interface(abiERC20);\n const erc721Interface = new Interface(abiERC721);\n const erc1155Interface = new Interface(abiERC1155);\n\n return logs\n .map((currentLog) => {\n const event = parseLog(\n currentLog,\n erc20Interface,\n erc721Interface,\n erc1155Interface,\n );\n\n if (!event) {\n log('Failed to parse log', currentLog);\n return undefined;\n }\n\n /* istanbul ignore next */\n const inputs = event.abi.find((e) => e.name === event.name)?.inputs;\n\n /* istanbul ignore if */\n if (!inputs) {\n log('Failed to find inputs for event', event);\n return undefined;\n }\n\n const args = parseEventArgs(event.args, inputs);\n\n return {\n contractAddress: currentLog.address,\n tokenStandard: event.standard,\n name: event.name,\n args,\n abi: event.abi,\n };\n })\n .filter((e) => e !== undefined) as ParsedEvent[];\n}\n\n/**\n * Parse event arguments using ABI input definitions.\n * @param args - The raw event arguments.\n * @param abiInputs - The ABI input definitions.\n * @returns The parsed event arguments.\n */\nfunction parseEventArgs(\n args: Result,\n abiInputs: { name: string }[],\n): Record<string, Hex | Hex[]> {\n return args.reduce((result, arg, index) => {\n const name = abiInputs[index].name.replace('_', '');\n const value = parseEventArgValue(arg);\n\n result[name] = value;\n\n return result;\n }, {});\n}\n\n/**\n * Parse an event argument value.\n * @param value - The event argument value.\n * @returns The parsed event argument value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseEventArgValue(value: any): Hex | Hex[] {\n if (Array.isArray(value)) {\n return value.map(parseEventArgValue) as Hex[];\n }\n\n return (value.toHexString?.() ?? value).toLowerCase();\n}\n\n/**\n * Generate token balance changes from parsed events.\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns An array of token balance changes.\n */\nasync function getTokenBalanceChanges(\n request: GetSimulationDataRequest,\n events: ParsedEvent[],\n): Promise<SimulationTokenBalanceChange[]> {\n const balanceTransactionsByToken = getTokenBalanceTransactions(\n request,\n events,\n );\n\n const balanceTransactions = [...balanceTransactionsByToken.values()];\n\n log('Generated balance transactions', balanceTransactions);\n\n if (!balanceTransactions.length) {\n return [];\n }\n\n const response = await simulateTransactions(request.chainId as Hex, {\n transactions: [...balanceTransactions, request, ...balanceTransactions],\n });\n\n log('Balance simulation response', response);\n\n if (response.transactions.length !== balanceTransactions.length * 2 + 1) {\n throw new Error('Invalid response from simulation API');\n }\n\n return [...balanceTransactionsByToken.keys()]\n .map((token, index) => {\n const previousBalance = normalizeReturnValue(\n response.transactions[index].return,\n );\n\n const newBalance = normalizeReturnValue(\n response.transactions[index + balanceTransactions.length + 1].return,\n );\n\n const balanceChange = getSimulationBalanceChange(\n previousBalance,\n newBalance,\n );\n\n if (!balanceChange) {\n return undefined;\n }\n\n return {\n ...token,\n ...balanceChange,\n };\n })\n .filter((change) => change !== undefined) as SimulationTokenBalanceChange[];\n}\n\n/**\n * Generate transactions to check token balances.\n * @param request - The transaction that was simulated.\n * @param events - The parsed events.\n * @returns A map of token balance transactions keyed by token.\n */\nfunction getTokenBalanceTransactions(\n request: GetSimulationDataRequest,\n events: ParsedEvent[],\n): Map<SimulationToken, SimulationRequestTransaction> {\n const tokenKeys = new Set();\n\n return events.reduce((result, event) => {\n if (\n !['Transfer', 'TransferSingle', 'TransferBatch'].includes(event.name) ||\n ![event.args.from, event.args.to].includes(request.from)\n ) {\n log('Ignoring event', event);\n return result;\n }\n\n // ERC-20 does not have a token ID so default to undefined.\n let tokenIds: (Hex | undefined)[] = [undefined];\n\n if (event.tokenStandard === SimulationTokenStandard.erc721) {\n tokenIds = [event.args.tokenId as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferSingle'\n ) {\n tokenIds = [event.args.id as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferBatch'\n ) {\n tokenIds = event.args.ids as Hex[];\n }\n\n log('Extracted token ids', tokenIds);\n\n for (const tokenId of tokenIds) {\n const simulationToken: SimulationToken = {\n address: event.contractAddress,\n standard: event.tokenStandard,\n id: tokenId,\n };\n\n const tokenKey = JSON.stringify(simulationToken);\n\n if (tokenKeys.has(tokenKey)) {\n log(\n 'Ignoring additional event with same contract and token ID',\n simulationToken,\n );\n continue;\n }\n\n tokenKeys.add(tokenKey);\n\n const parameters = [request.from];\n\n if (event.tokenStandard === SimulationTokenStandard.erc1155) {\n parameters.push(tokenId as Hex);\n }\n\n result.set(simulationToken, {\n from: request.from,\n to: event.contractAddress,\n data: new Interface(event.abi).encodeFunctionData(\n 'balanceOf',\n parameters,\n ) as Hex,\n });\n }\n\n return result;\n }, new Map<SimulationToken, SimulationRequestTransaction>());\n}\n\n/**\n * Parse a raw event log using known ABIs.\n * @param eventLog - The raw event log.\n * @param erc20 - The ERC-20 ABI interface.\n * @param erc721 - The ERC-721 ABI interface.\n * @param erc1155 - The ERC-1155 ABI interface.\n * @returns The parsed event log or undefined if it could not be parsed.\n */\nfunction parseLog(\n eventLog: SimulationResponseLog,\n erc20: Interface,\n erc721: Interface,\n erc1155: Interface,\n):\n | (LogDescription & { abi: ABI; standard: SimulationTokenStandard })\n | undefined {\n const abisByStandard = [\n {\n abi: abiERC20,\n contractInterface: erc20,\n standard: SimulationTokenStandard.erc20,\n },\n {\n abi: abiERC721,\n contractInterface: erc721,\n standard: SimulationTokenStandard.erc721,\n },\n {\n abi: abiERC1155,\n contractInterface: erc1155,\n standard: SimulationTokenStandard.erc1155,\n },\n ];\n\n for (const { abi, contractInterface, standard } of abisByStandard) {\n try {\n return {\n ...contractInterface.parseLog(eventLog),\n abi,\n standard,\n };\n } catch (e) {\n continue;\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract all logs from a call trace tree.\n * @param call - The root call trace.\n * @returns An array of logs.\n */\nfunction extractLogs(\n call: SimulationResponseCallTrace,\n): SimulationResponseLog[] {\n /* istanbul ignore next */\n const logs = call.logs ?? [];\n\n /* istanbul ignore next */\n const nestedCalls = call.calls ?? [];\n\n return [\n ...logs,\n ...nestedCalls.map((nestedCall) => extractLogs(nestedCall)).flat(),\n ];\n}\n\n/**\n * Generate balance change data from previous and new balances.\n * @param previousBalance - The previous balance.\n * @param newBalance - The new balance.\n * @returns The balance change data or undefined if unchanged.\n */\nfunction getSimulationBalanceChange(\n previousBalance: Hex,\n newBalance: Hex,\n): SimulationBalanceChange | undefined {\n const differenceBN = hexToBN(newBalance).sub(hexToBN(previousBalance));\n const isDecrease = differenceBN.isNeg();\n const difference = toHex(differenceBN.abs());\n\n if (differenceBN.isZero()) {\n log('Balance change is zero');\n return undefined;\n }\n\n return {\n previousBalance,\n newBalance,\n difference,\n isDecrease,\n };\n}\n\n/**\n * Normalize a return value.\n * @param value - The return value to normalize.\n * @returns The normalized return value.\n */\nfunction normalizeReturnValue(value: Hex): Hex {\n return toHex(hexToBN(value));\n}\n"],"mappings":";;;;;;;;AACA,SAAS,iBAAiB;AAC1B,SAAS,SAAS,aAAa;AAC/B,SAAS,UAAU,WAAW,kBAAkB;AAChD,SAAS,0BAAoC;AAkB7C,IAAM,MAAM,mBAAmB,eAAe,YAAY;AA8B1D,eAAsB,kBACpB,SACyB;AACzB,QAAM,EAAE,SAAS,MAAM,IAAI,OAAO,KAAK,IAAI;AAE3C,MAAI,2BAA2B,OAAO;AAEtC,MAAI;AACF,UAAM,WAAW,MAAM,qBAAqB,SAAS;AAAA,MACnD,cAAc;AAAA,QACZ;AAAA,UACE;AAAA,UACA;AAAA,UACA,cAAc;AAAA,UACd,sBAAsB;AAAA,UACtB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe;AAAA,MACf,UAAU;AAAA,IACZ,CAAC;AAED,UAAM,mBAAmB,SAAS,eAAe,CAAC,GAAG;AAErD,QAAI,kBAAkB;AAEpB,YAAM,EAAE,SAAS,iBAAiB;AAAA,IACpC;AAEA,UAAM,sBAAsB,uBAAuB,QAAQ,MAAM,QAAQ;AACzE,UAAM,SAAS,UAAU,QAAQ;AAEjC,QAAI,iBAAiB,MAAM;AAE3B,UAAM,sBAAsB,MAAM,uBAAuB,SAAS,MAAM;AAExE,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iCAAiC,OAAO,OAAO;AAEnD,UAAM,WAAW;AAEjB,WAAO;AAAA,MACL,qBAAqB,CAAC;AAAA,MACtB,OAAO;AAAA,QACL,MAAM,SAAS;AAAA,QACf,SAAS,SAAS;AAAA,QAClB,YAAY,SAAS,SAAS,SAAS,oBAAoB,KAAK;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AACF;AAQA,SAAS,uBACP,aACA,UACqC;AACrC,QAAM,sBAAsB,SAAS,aAAa,CAAC;AAGnD,MAAI,CAAC,qBAAqB;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,UAAU,IAAI;AACtB,QAAM,kBAAkB,WAAW,MAAM,WAAW,GAAG;AACvD,QAAM,aAAa,WAAW,OAAO,WAAW,GAAG;AAEnD,MAAI,CAAC,mBAAmB,CAAC,YAAY;AACnC,WAAO;AAAA,EACT;AAEA,SAAO,2BAA2B,iBAAiB,UAAU;AAC/D;AAOA,SAAS,UAAU,UAA6C;AAE9D,QAAM,OAAO;AAAA,IACX,SAAS,aAAa,CAAC,GAAG,aAAc,CAAC;AAAA,EAC3C;AAEA,MAAI,kBAAkB,IAAI;AAE1B,QAAM,iBAAiB,IAAI,UAAU,QAAQ;AAC7C,QAAM,kBAAkB,IAAI,UAAU,SAAS;AAC/C,QAAM,mBAAmB,IAAI,UAAU,UAAU;AAEjD,SAAO,KACJ,IAAI,CAAC,eAAe;AACnB,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,OAAO;AACV,UAAI,uBAAuB,UAAU;AACrC,aAAO;AAAA,IACT;AAGA,UAAM,SAAS,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI,GAAG;AAG7D,QAAI,CAAC,QAAQ;AACX,UAAI,mCAAmC,KAAK;AAC5C,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,eAAe,MAAM,MAAM,MAAM;AAE9C,WAAO;AAAA,MACL,iBAAiB,WAAW;AAAA,MAC5B,eAAe,MAAM;AAAA,MACrB,MAAM,MAAM;AAAA,MACZ;AAAA,MACA,KAAK,MAAM;AAAA,IACb;AAAA,EACF,CAAC,EACA,OAAO,CAAC,MAAM,MAAM,MAAS;AAClC;AAQA,SAAS,eACP,MACA,WAC6B;AAC7B,SAAO,KAAK,OAAO,CAAC,QAAQ,KAAK,UAAU;AACzC,UAAM,OAAO,UAAU,KAAK,EAAE,KAAK,QAAQ,KAAK,EAAE;AAClD,UAAM,QAAQ,mBAAmB,GAAG;AAEpC,WAAO,IAAI,IAAI;AAEf,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;AAQA,SAAS,mBAAmB,OAAyB;AACnD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,kBAAkB;AAAA,EACrC;AAEA,UAAQ,MAAM,cAAc,KAAK,OAAO,YAAY;AACtD;AAQA,eAAe,uBACb,SACA,QACyC;AACzC,QAAM,6BAA6B;AAAA,IACjC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,sBAAsB,CAAC,GAAG,2BAA2B,OAAO,CAAC;AAEnE,MAAI,kCAAkC,mBAAmB;AAEzD,MAAI,CAAC,oBAAoB,QAAQ;AAC/B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAW,MAAM,qBAAqB,QAAQ,SAAgB;AAAA,IAClE,cAAc,CAAC,GAAG,qBAAqB,SAAS,GAAG,mBAAmB;AAAA,EACxE,CAAC;AAED,MAAI,+BAA+B,QAAQ;AAE3C,MAAI,SAAS,aAAa,WAAW,oBAAoB,SAAS,IAAI,GAAG;AACvE,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAEA,SAAO,CAAC,GAAG,2BAA2B,KAAK,CAAC,EACzC,IAAI,CAAC,OAAO,UAAU;AACrB,UAAM,kBAAkB;AAAA,MACtB,SAAS,aAAa,KAAK,EAAE;AAAA,IAC/B;AAEA,UAAM,aAAa;AAAA,MACjB,SAAS,aAAa,QAAQ,oBAAoB,SAAS,CAAC,EAAE;AAAA,IAChE;AAEA,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF,CAAC,EACA,OAAO,CAAC,WAAW,WAAW,MAAS;AAC5C;AAQA,SAAS,4BACP,SACA,QACoD;AACpD,QAAM,YAAY,oBAAI,IAAI;AAE1B,SAAO,OAAO,OAAO,CAAC,QAAQ,UAAU;AACtC,QACE,CAAC,CAAC,YAAY,kBAAkB,eAAe,EAAE,SAAS,MAAM,IAAI,KACpE,CAAC,CAAC,MAAM,KAAK,MAAM,MAAM,KAAK,EAAE,EAAE,SAAS,QAAQ,IAAI,GACvD;AACA,UAAI,kBAAkB,KAAK;AAC3B,aAAO;AAAA,IACT;AAGA,QAAI,WAAgC,CAAC,MAAS;AAE9C,QAAI,MAAM,yCAAkD;AAC1D,iBAAW,CAAC,MAAM,KAAK,OAAc;AAAA,IACvC;AAEA,QACE,MAAM,6CACN,MAAM,SAAS,kBACf;AACA,iBAAW,CAAC,MAAM,KAAK,EAAS;AAAA,IAClC;AAEA,QACE,MAAM,6CACN,MAAM,SAAS,iBACf;AACA,iBAAW,MAAM,KAAK;AAAA,IACxB;AAEA,QAAI,uBAAuB,QAAQ;AAEnC,eAAW,WAAW,UAAU;AAC9B,YAAM,kBAAmC;AAAA,QACvC,SAAS,MAAM;AAAA,QACf,UAAU,MAAM;AAAA,QAChB,IAAI;AAAA,MACN;AAEA,YAAM,WAAW,KAAK,UAAU,eAAe;AAE/C,UAAI,UAAU,IAAI,QAAQ,GAAG;AAC3B;AAAA,UACE;AAAA,UACA;AAAA,QACF;AACA;AAAA,MACF;AAEA,gBAAU,IAAI,QAAQ;AAEtB,YAAM,aAAa,CAAC,QAAQ,IAAI;AAEhC,UAAI,MAAM,2CAAmD;AAC3D,mBAAW,KAAK,OAAc;AAAA,MAChC;AAEA,aAAO,IAAI,iBAAiB;AAAA,QAC1B,MAAM,QAAQ;AAAA,QACd,IAAI,MAAM;AAAA,QACV,MAAM,IAAI,UAAU,MAAM,GAAG,EAAE;AAAA,UAC7B;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT,GAAG,oBAAI,IAAmD,CAAC;AAC7D;AAUA,SAAS,SACP,UACA,OACA,QACA,SAGY;AACZ,QAAM,iBAAiB;AAAA,IACrB;AAAA,MACE,KAAK;AAAA,MACL,mBAAmB;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,mBAAmB;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,KAAK;AAAA,MACL,mBAAmB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,aAAW,EAAE,KAAK,mBAAmB,SAAS,KAAK,gBAAgB;AACjE,QAAI;AACF,aAAO;AAAA,QACL,GAAG,kBAAkB,SAAS,QAAQ;AAAA,QACtC;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,GAAG;AACV;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAOA,SAAS,YACP,MACyB;AAEzB,QAAM,OAAO,KAAK,QAAQ,CAAC;AAG3B,QAAM,cAAc,KAAK,SAAS,CAAC;AAEnC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,YAAY,IAAI,CAAC,eAAe,YAAY,UAAU,CAAC,EAAE,KAAK;AAAA,EACnE;AACF;AAQA,SAAS,2BACP,iBACA,YACqC;AACrC,QAAM,eAAe,QAAQ,UAAU,EAAE,IAAI,QAAQ,eAAe,CAAC;AACrE,QAAM,aAAa,aAAa,MAAM;AACtC,QAAM,aAAa,MAAM,aAAa,IAAI,CAAC;AAE3C,MAAI,aAAa,OAAO,GAAG;AACzB,QAAI,wBAAwB;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAOA,SAAS,qBAAqB,OAAiB;AAC7C,SAAO,MAAM,QAAQ,KAAK,CAAC;AAC7B;","names":[]}
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkRI6MVJJNjs = require('./chunk-RI6MVJJN.js');
3
+ var _chunkITDY6AIZjs = require('./chunk-ITDY6AIZ.js');
4
4
 
5
5
 
6
6
  var _chunkS6VGOPUYjs = require('./chunk-S6VGOPUY.js');
@@ -70,7 +70,7 @@ function getEtherscanApiUrl(chainId, urlParams) {
70
70
  return url;
71
71
  }
72
72
  function getEtherscanApiHost(chainId) {
73
- const networkInfo = _chunkRI6MVJJNjs.ETHERSCAN_SUPPORTED_NETWORKS[chainId];
73
+ const networkInfo = _chunkITDY6AIZjs.ETHERSCAN_SUPPORTED_NETWORKS[chainId];
74
74
  if (!networkInfo) {
75
75
  throw new Error(`Etherscan does not support chain with ID: ${chainId}`);
76
76
  }
@@ -82,4 +82,4 @@ function getEtherscanApiHost(chainId) {
82
82
 
83
83
 
84
84
  exports.fetchEtherscanTransactions = fetchEtherscanTransactions; exports.fetchEtherscanTokenTransactions = fetchEtherscanTokenTransactions; exports.getEtherscanApiHost = getEtherscanApiHost;
85
- //# sourceMappingURL=chunk-NUOBUW7C.js.map
85
+ //# sourceMappingURL=chunk-CXXGL43K.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  GasFeeEstimateLevel
3
- } from "./chunk-LM4NUNMT.mjs";
3
+ } from "./chunk-W57BD6NX.mjs";
4
4
 
5
5
  // src/utils/gas-flow.ts
6
6
  import { weiHexToGweiDec } from "@metamask/controller-utils";
@@ -59,4 +59,4 @@ export {
59
59
  getGasFeeFlow,
60
60
  mergeGasFeeEstimates
61
61
  };
62
- //# sourceMappingURL=chunk-7MZ57ILQ.mjs.map
62
+ //# sourceMappingURL=chunk-DWHMMJOW.mjs.map