@metamask-previews/transaction-controller 25.3.0-preview-eec1f90 → 26.0.0-preview-e24bcd2e

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 (147) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/dist/TransactionController.js +17 -16
  3. package/dist/TransactionController.mjs +16 -15
  4. package/dist/{chunk-K7UC23EG.mjs → chunk-2XFBWPHD.mjs} +3 -3
  5. package/dist/{chunk-VAOKN3J4.mjs → chunk-35MG26Y3.mjs} +13 -12
  6. package/dist/chunk-35MG26Y3.mjs.map +1 -0
  7. package/dist/{chunk-F3CMU2DM.js → chunk-3JEUO765.js} +6 -6
  8. package/dist/{chunk-V5X6MZHN.js → chunk-3VF7ZGRV.js} +126 -63
  9. package/dist/chunk-3VF7ZGRV.js.map +1 -0
  10. package/dist/{chunk-Z3HHSD5I.mjs → chunk-4VLQV2GA.mjs} +50 -3
  11. package/dist/chunk-4VLQV2GA.mjs.map +1 -0
  12. package/dist/chunk-53IYIDVS.mjs +132 -0
  13. package/dist/chunk-53IYIDVS.mjs.map +1 -0
  14. package/dist/{chunk-LOWIVTMF.js → chunk-5SKCGFUC.js} +64 -33
  15. package/dist/chunk-5SKCGFUC.js.map +1 -0
  16. package/dist/{chunk-R7NJVDWN.js → chunk-5WFLNKCL.js} +7 -6
  17. package/dist/chunk-5WFLNKCL.js.map +1 -0
  18. package/dist/{chunk-RQKICZYP.js → chunk-AO3AE3L7.js} +3 -3
  19. package/dist/{chunk-NRWEI43Q.js → chunk-CPYXP2OC.js} +40 -25
  20. package/dist/chunk-CPYXP2OC.js.map +1 -0
  21. package/dist/{chunk-OLIA2HD4.mjs → chunk-CWWZQZVR.mjs} +3 -3
  22. package/dist/{chunk-VEREDMI2.mjs → chunk-DOX6H5UJ.mjs} +2 -2
  23. package/dist/{chunk-XKNFL657.mjs → chunk-DRSMLO7B.mjs} +2 -2
  24. package/dist/chunk-ETMW527M.js +132 -0
  25. package/dist/chunk-ETMW527M.js.map +1 -0
  26. package/dist/{chunk-CXXGL43K.js → chunk-F247MMTE.js} +3 -3
  27. package/dist/{chunk-HBNQEJEM.js → chunk-FK7AP6SH.js} +1 -1
  28. package/dist/chunk-FK7AP6SH.js.map +1 -0
  29. package/dist/{chunk-SOSF65FI.js → chunk-HUVOOFOM.js} +15 -14
  30. package/dist/chunk-HUVOOFOM.js.map +1 -0
  31. package/dist/{chunk-IW2J56QK.mjs → chunk-JDLNCMGI.mjs} +50 -19
  32. package/dist/chunk-JDLNCMGI.mjs.map +1 -0
  33. package/dist/{chunk-2JERLB6M.js → chunk-L337FYVS.js} +5 -5
  34. package/dist/{chunk-A4P4B3OF.mjs → chunk-L7ZKSKEI.mjs} +125 -62
  35. package/dist/chunk-L7ZKSKEI.mjs.map +1 -0
  36. package/dist/{chunk-ITDY6AIZ.js → chunk-LQS2M5QR.js} +50 -3
  37. package/dist/chunk-LQS2M5QR.js.map +1 -0
  38. package/dist/{chunk-2AYEGKAN.js → chunk-LYD4TEKH.js} +7 -7
  39. package/dist/{chunk-ZWKHTNLF.mjs → chunk-P74YLPJO.mjs} +3 -3
  40. package/dist/{chunk-3D3SA6PY.mjs → chunk-RBF6CW7D.mjs} +2 -2
  41. package/dist/{chunk-ZQFMTLZJ.mjs → chunk-RXRJSBSF.mjs} +39 -24
  42. package/dist/chunk-RXRJSBSF.mjs.map +1 -0
  43. package/dist/{chunk-IZI7FQIN.mjs → chunk-TKWTUPCQ.mjs} +3 -3
  44. package/dist/{chunk-AMDQXP37.mjs → chunk-TWND5SFD.mjs} +2 -2
  45. package/dist/{chunk-UCY5PFZI.js → chunk-UBXRAA6G.js} +6 -6
  46. package/dist/{chunk-L4S5SEV3.js → chunk-UH7FNVKS.js} +4 -4
  47. package/dist/{chunk-KFL2GGZC.mjs → chunk-W3CS5GRD.mjs} +7 -6
  48. package/dist/chunk-W3CS5GRD.mjs.map +1 -0
  49. package/dist/{chunk-5OQ373JS.js → chunk-WLCFETHR.js} +10 -10
  50. package/dist/{chunk-UADPSS35.mjs → chunk-YEJJKWT2.mjs} +1 -1
  51. package/dist/chunk-YEJJKWT2.mjs.map +1 -0
  52. package/dist/constants.js +6 -2
  53. package/dist/constants.mjs +5 -1
  54. package/dist/errors.js +1 -1
  55. package/dist/errors.mjs +1 -1
  56. package/dist/gas-flows/DefaultGasFeeFlow.js +7 -7
  57. package/dist/gas-flows/DefaultGasFeeFlow.mjs +6 -6
  58. package/dist/gas-flows/LineaGasFeeFlow.js +8 -8
  59. package/dist/gas-flows/LineaGasFeeFlow.mjs +7 -7
  60. package/dist/gas-flows/OptimismLayer1GasFeeFlow.js +10 -0
  61. package/dist/gas-flows/OptimismLayer1GasFeeFlow.js.map +1 -0
  62. package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs +10 -0
  63. package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs.map +1 -0
  64. package/dist/helpers/EtherscanRemoteTransactionSource.js +5 -5
  65. package/dist/helpers/EtherscanRemoteTransactionSource.mjs +4 -4
  66. package/dist/helpers/GasFeePoller.js +5 -5
  67. package/dist/helpers/GasFeePoller.mjs +4 -4
  68. package/dist/helpers/MultichainTrackingHelper.js +6 -6
  69. package/dist/helpers/MultichainTrackingHelper.mjs +5 -5
  70. package/dist/helpers/PendingTransactionTracker.js +1 -1
  71. package/dist/helpers/PendingTransactionTracker.mjs +1 -1
  72. package/dist/index.js +17 -16
  73. package/dist/index.mjs +16 -15
  74. package/dist/tsconfig.build.tsbuildinfo +1 -1
  75. package/dist/types/TransactionController.d.ts +8 -0
  76. package/dist/types/TransactionController.d.ts.map +1 -1
  77. package/dist/types/constants.d.ts +23 -0
  78. package/dist/types/constants.d.ts.map +1 -1
  79. package/dist/types/gas-flows/OptimismLayer1GasFeeFlow.d.ts +10 -0
  80. package/dist/types/gas-flows/OptimismLayer1GasFeeFlow.d.ts.map +1 -0
  81. package/dist/types/helpers/GasFeePoller.d.ts +4 -5
  82. package/dist/types/helpers/GasFeePoller.d.ts.map +1 -1
  83. package/dist/types/helpers/MultichainTrackingHelper.d.ts +4 -0
  84. package/dist/types/helpers/MultichainTrackingHelper.d.ts.map +1 -1
  85. package/dist/types/types.d.ts +3 -3
  86. package/dist/types/types.d.ts.map +1 -1
  87. package/dist/types/utils/layer1-gas-fee-flow.d.ts +11 -2
  88. package/dist/types/utils/layer1-gas-fee-flow.d.ts.map +1 -1
  89. package/dist/types/utils/simulation.d.ts +7 -0
  90. package/dist/types/utils/simulation.d.ts.map +1 -1
  91. package/dist/types.js +2 -2
  92. package/dist/types.mjs +1 -1
  93. package/dist/utils/etherscan.js +3 -3
  94. package/dist/utils/etherscan.mjs +2 -2
  95. package/dist/utils/external-transactions.js +1 -1
  96. package/dist/utils/external-transactions.mjs +1 -1
  97. package/dist/utils/gas-fees.js +6 -6
  98. package/dist/utils/gas-fees.mjs +5 -5
  99. package/dist/utils/gas-flow.js +3 -3
  100. package/dist/utils/gas-flow.mjs +2 -2
  101. package/dist/utils/gas.js +3 -3
  102. package/dist/utils/gas.mjs +2 -2
  103. package/dist/utils/layer1-gas-fee-flow.js +4 -2
  104. package/dist/utils/layer1-gas-fee-flow.mjs +3 -1
  105. package/dist/utils/simulation-api.js +1 -1
  106. package/dist/utils/simulation-api.mjs +1 -1
  107. package/dist/utils/simulation.js +6 -3
  108. package/dist/utils/simulation.mjs +5 -2
  109. package/dist/utils/swaps.js +4 -4
  110. package/dist/utils/swaps.mjs +3 -3
  111. package/dist/utils/transaction-type.js +1 -1
  112. package/dist/utils/transaction-type.mjs +1 -1
  113. package/dist/utils/utils.js +1 -1
  114. package/dist/utils/utils.mjs +1 -1
  115. package/dist/utils/validation.js +1 -1
  116. package/dist/utils/validation.mjs +1 -1
  117. package/package.json +6 -4
  118. package/dist/chunk-A4P4B3OF.mjs.map +0 -1
  119. package/dist/chunk-HBNQEJEM.js.map +0 -1
  120. package/dist/chunk-ITDY6AIZ.js.map +0 -1
  121. package/dist/chunk-IW2J56QK.mjs.map +0 -1
  122. package/dist/chunk-KFL2GGZC.mjs.map +0 -1
  123. package/dist/chunk-LOWIVTMF.js.map +0 -1
  124. package/dist/chunk-NRWEI43Q.js.map +0 -1
  125. package/dist/chunk-R7NJVDWN.js.map +0 -1
  126. package/dist/chunk-SOSF65FI.js.map +0 -1
  127. package/dist/chunk-UADPSS35.mjs.map +0 -1
  128. package/dist/chunk-V5X6MZHN.js.map +0 -1
  129. package/dist/chunk-VAOKN3J4.mjs.map +0 -1
  130. package/dist/chunk-Z3HHSD5I.mjs.map +0 -1
  131. package/dist/chunk-ZQFMTLZJ.mjs.map +0 -1
  132. /package/dist/{chunk-K7UC23EG.mjs.map → chunk-2XFBWPHD.mjs.map} +0 -0
  133. /package/dist/{chunk-F3CMU2DM.js.map → chunk-3JEUO765.js.map} +0 -0
  134. /package/dist/{chunk-RQKICZYP.js.map → chunk-AO3AE3L7.js.map} +0 -0
  135. /package/dist/{chunk-OLIA2HD4.mjs.map → chunk-CWWZQZVR.mjs.map} +0 -0
  136. /package/dist/{chunk-VEREDMI2.mjs.map → chunk-DOX6H5UJ.mjs.map} +0 -0
  137. /package/dist/{chunk-XKNFL657.mjs.map → chunk-DRSMLO7B.mjs.map} +0 -0
  138. /package/dist/{chunk-CXXGL43K.js.map → chunk-F247MMTE.js.map} +0 -0
  139. /package/dist/{chunk-2JERLB6M.js.map → chunk-L337FYVS.js.map} +0 -0
  140. /package/dist/{chunk-2AYEGKAN.js.map → chunk-LYD4TEKH.js.map} +0 -0
  141. /package/dist/{chunk-ZWKHTNLF.mjs.map → chunk-P74YLPJO.mjs.map} +0 -0
  142. /package/dist/{chunk-3D3SA6PY.mjs.map → chunk-RBF6CW7D.mjs.map} +0 -0
  143. /package/dist/{chunk-IZI7FQIN.mjs.map → chunk-TKWTUPCQ.mjs.map} +0 -0
  144. /package/dist/{chunk-AMDQXP37.mjs.map → chunk-TWND5SFD.mjs.map} +0 -0
  145. /package/dist/{chunk-UCY5PFZI.js.map → chunk-UBXRAA6G.js.map} +0 -0
  146. /package/dist/{chunk-L4S5SEV3.js.map → chunk-UH7FNVKS.js.map} +0 -0
  147. /package/dist/{chunk-5OQ373JS.js.map → chunk-WLCFETHR.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [26.0.0]
11
+
12
+ ### Added
13
+
14
+ - Run `OptimismLayer1GasFeeFlow` on Optimism stack based transactions in order to add `layer1GasFee` property to transaction meta. ([#4055](https://github.com/MetaMask/core/pull/4055))
15
+ - Add `getLayer1GasFee` method to `TransactionController` to get the layer 1 gas fee for the given transaction params ([#4055](https://github.com/MetaMask/core/pull/4055))
16
+ - Add `SimulationErrorCode` enum ([#4106](https://github.com/MetaMask/core/pull/4106))
17
+
18
+ ### Changed
19
+
20
+ - **BREAKING:** Bump peer dependency `@metamask/gas-fee-controller` to `^15.0.0` ([#4121](https://github.com/MetaMask/core/pull/4121))
21
+ - Update `addTransaction` to skip simulation if `requireApproval` is specified as `false` ([#4106](https://github.com/MetaMask/core/pull/4106))
22
+ - Provide simulation error code in locally generated errors (under the `code` property) ([#4106](https://github.com/MetaMask/core/pull/4106))
23
+ - Add dependency `@ethersproject/contracts` `^5.7.0` ([#4055](https://github.com/MetaMask/core/pull/4055))
24
+ - Add dependency `@ethersproject/providers` `^5.7.0` ([#4055](https://github.com/MetaMask/core/pull/4055))
25
+ - Bump dependency `@metamask/network-controller` to `^18.1.0` ([#4121](https://github.com/MetaMask/core/pull/4121))
26
+
27
+ ### Removed
28
+
29
+ - **BREAKING**: Remove `isReverted` property from `SimulationError` type. ([#4106](https://github.com/MetaMask/core/pull/4106))
30
+
10
31
  ## [25.3.0]
11
32
 
12
33
  ### Added
@@ -727,7 +748,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
727
748
 
728
749
  All changes listed after this point were applied to this package following the monorepo conversion.
729
750
 
730
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@25.3.0...HEAD
751
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@26.0.0...HEAD
752
+ [26.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@25.3.0...@metamask/transaction-controller@26.0.0
731
753
  [25.3.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@25.2.1...@metamask/transaction-controller@25.3.0
732
754
  [25.2.1]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@25.2.0...@metamask/transaction-controller@25.2.1
733
755
  [25.2.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@25.1.0...@metamask/transaction-controller@25.2.0
@@ -4,32 +4,33 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkLOWIVTMFjs = require('./chunk-LOWIVTMF.js');
7
+ var _chunk5SKCGFUCjs = require('./chunk-5SKCGFUC.js');
8
8
  require('./chunk-SD6CWFDF.js');
9
9
  require('./chunk-VH47Q6TS.js');
10
- require('./chunk-RQKICZYP.js');
10
+ require('./chunk-AO3AE3L7.js');
11
11
  require('./chunk-QP75SWIQ.js');
12
12
  require('./chunk-ZNZEJDOE.js');
13
- require('./chunk-V5X6MZHN.js');
13
+ require('./chunk-3VF7ZGRV.js');
14
14
  require('./chunk-KT6UAKBB.js');
15
- require('./chunk-SOSF65FI.js');
16
- require('./chunk-R7NJVDWN.js');
15
+ require('./chunk-ETMW527M.js');
16
+ require('./chunk-HUVOOFOM.js');
17
+ require('./chunk-5WFLNKCL.js');
17
18
  require('./chunk-DTDTOMTB.js');
18
- require('./chunk-NRWEI43Q.js');
19
- require('./chunk-F3CMU2DM.js');
19
+ require('./chunk-CPYXP2OC.js');
20
+ require('./chunk-3JEUO765.js');
20
21
  require('./chunk-5KMU2IAT.js');
21
- require('./chunk-CXXGL43K.js');
22
+ require('./chunk-F247MMTE.js');
22
23
  require('./chunk-7LXE4KHV.js');
23
24
  require('./chunk-HMOSP33F.js');
24
- require('./chunk-UCY5PFZI.js');
25
- require('./chunk-2AYEGKAN.js');
26
- require('./chunk-2JERLB6M.js');
27
- require('./chunk-5OQ373JS.js');
25
+ require('./chunk-UBXRAA6G.js');
26
+ require('./chunk-LYD4TEKH.js');
27
+ require('./chunk-L337FYVS.js');
28
+ require('./chunk-WLCFETHR.js');
28
29
  require('./chunk-UGFBA4GV.js');
29
- require('./chunk-L4S5SEV3.js');
30
- require('./chunk-ITDY6AIZ.js');
30
+ require('./chunk-UH7FNVKS.js');
31
+ require('./chunk-LQS2M5QR.js');
31
32
  require('./chunk-S6VGOPUY.js');
32
- require('./chunk-HBNQEJEM.js');
33
+ require('./chunk-FK7AP6SH.js');
33
34
  require('./chunk-Z4BLTVTB.js');
34
35
 
35
36
 
@@ -37,5 +38,5 @@ require('./chunk-Z4BLTVTB.js');
37
38
 
38
39
 
39
40
 
40
- exports.ApprovalState = _chunkLOWIVTMFjs.ApprovalState; exports.CANCEL_RATE = _chunkLOWIVTMFjs.CANCEL_RATE; exports.HARDFORK = _chunkLOWIVTMFjs.HARDFORK; exports.SPEED_UP_RATE = _chunkLOWIVTMFjs.SPEED_UP_RATE; exports.TransactionController = _chunkLOWIVTMFjs.TransactionController;
41
+ exports.ApprovalState = _chunk5SKCGFUCjs.ApprovalState; exports.CANCEL_RATE = _chunk5SKCGFUCjs.CANCEL_RATE; exports.HARDFORK = _chunk5SKCGFUCjs.HARDFORK; exports.SPEED_UP_RATE = _chunk5SKCGFUCjs.SPEED_UP_RATE; exports.TransactionController = _chunk5SKCGFUCjs.TransactionController;
41
42
  //# sourceMappingURL=TransactionController.js.map
@@ -4,32 +4,33 @@ import {
4
4
  HARDFORK,
5
5
  SPEED_UP_RATE,
6
6
  TransactionController
7
- } from "./chunk-IW2J56QK.mjs";
7
+ } from "./chunk-JDLNCMGI.mjs";
8
8
  import "./chunk-KG4UW4K4.mjs";
9
9
  import "./chunk-NM6OYEPP.mjs";
10
- import "./chunk-XKNFL657.mjs";
10
+ import "./chunk-DRSMLO7B.mjs";
11
11
  import "./chunk-XGRAHX6T.mjs";
12
12
  import "./chunk-NHRBO3LU.mjs";
13
- import "./chunk-A4P4B3OF.mjs";
13
+ import "./chunk-L7ZKSKEI.mjs";
14
14
  import "./chunk-K4KOSAGM.mjs";
15
- import "./chunk-VAOKN3J4.mjs";
16
- import "./chunk-KFL2GGZC.mjs";
15
+ import "./chunk-53IYIDVS.mjs";
16
+ import "./chunk-35MG26Y3.mjs";
17
+ import "./chunk-W3CS5GRD.mjs";
17
18
  import "./chunk-Y7ENNK7L.mjs";
18
- import "./chunk-ZQFMTLZJ.mjs";
19
- import "./chunk-IZI7FQIN.mjs";
19
+ import "./chunk-RXRJSBSF.mjs";
20
+ import "./chunk-TKWTUPCQ.mjs";
20
21
  import "./chunk-5YES3V2R.mjs";
21
- import "./chunk-VEREDMI2.mjs";
22
+ import "./chunk-DOX6H5UJ.mjs";
22
23
  import "./chunk-FRKQ3Z2L.mjs";
23
24
  import "./chunk-HQSNKCXI.mjs";
24
- import "./chunk-K7UC23EG.mjs";
25
- import "./chunk-OLIA2HD4.mjs";
26
- import "./chunk-ZWKHTNLF.mjs";
27
- import "./chunk-3D3SA6PY.mjs";
25
+ import "./chunk-2XFBWPHD.mjs";
26
+ import "./chunk-CWWZQZVR.mjs";
27
+ import "./chunk-P74YLPJO.mjs";
28
+ import "./chunk-RBF6CW7D.mjs";
28
29
  import "./chunk-J56A7UCK.mjs";
29
- import "./chunk-AMDQXP37.mjs";
30
- import "./chunk-Z3HHSD5I.mjs";
30
+ import "./chunk-TWND5SFD.mjs";
31
+ import "./chunk-4VLQV2GA.mjs";
31
32
  import "./chunk-UQQWZT6C.mjs";
32
- import "./chunk-UADPSS35.mjs";
33
+ import "./chunk-YEJJKWT2.mjs";
33
34
  import "./chunk-XUI43LEZ.mjs";
34
35
  export {
35
36
  ApprovalState,
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  DefaultGasFeeFlow
3
- } from "./chunk-OLIA2HD4.mjs";
3
+ } from "./chunk-CWWZQZVR.mjs";
4
4
  import {
5
5
  projectLogger
6
6
  } from "./chunk-UQQWZT6C.mjs";
7
7
  import {
8
8
  GasFeeEstimateLevel
9
- } from "./chunk-UADPSS35.mjs";
9
+ } from "./chunk-YEJJKWT2.mjs";
10
10
  import {
11
11
  __privateAdd,
12
12
  __privateMethod
@@ -118,4 +118,4 @@ feesToString_fn = function(fees) {
118
118
  export {
119
119
  LineaGasFeeFlow
120
120
  };
121
- //# sourceMappingURL=chunk-K7UC23EG.mjs.map
121
+ //# sourceMappingURL=chunk-2XFBWPHD.mjs.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  updateTransactionLayer1GasFee
3
- } from "./chunk-KFL2GGZC.mjs";
3
+ } from "./chunk-W3CS5GRD.mjs";
4
4
  import {
5
5
  getGasFeeFlow
6
- } from "./chunk-AMDQXP37.mjs";
6
+ } from "./chunk-TWND5SFD.mjs";
7
7
  import {
8
8
  projectLogger
9
9
  } from "./chunk-UQQWZT6C.mjs";
@@ -15,26 +15,27 @@ import {
15
15
  } from "./chunk-XUI43LEZ.mjs";
16
16
 
17
17
  // src/helpers/GasFeePoller.ts
18
+ import EthQuery from "@metamask/eth-query";
18
19
  import { createModuleLogger } from "@metamask/utils";
19
20
  import EventEmitter from "events";
20
21
  var log = createModuleLogger(projectLogger, "gas-fee-poller");
21
22
  var INTERVAL_MILLISECONDS = 1e4;
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;
23
+ var _gasFeeFlows, _getGasFeeControllerEstimates, _getProvider, _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;
23
24
  var GasFeePoller = class {
24
25
  /**
25
26
  * Constructs a new instance of the GasFeePoller.
26
27
  * @param options - The options for this instance.
27
28
  * @param options.gasFeeFlows - The gas fee flows to use to obtain suitable gas fees.
28
- * @param options.getEthQuery - Callback to obtain an EthQuery instance.
29
29
  * @param options.getGasFeeControllerEstimates - Callback to obtain the default fee estimates.
30
+ * @param options.getProvider - Callback to obtain a provider instance.
30
31
  * @param options.getTransactions - Callback to obtain the transaction data.
31
32
  * @param options.layer1GasFeeFlows - The layer 1 gas fee flows to use to obtain suitable layer 1 gas fees.
32
33
  * @param options.onStateChange - Callback to register a listener for controller state changes.
33
34
  */
34
35
  constructor({
35
36
  gasFeeFlows,
36
- getEthQuery,
37
37
  getGasFeeControllerEstimates,
38
+ getProvider,
38
39
  getTransactions,
39
40
  layer1GasFeeFlows,
40
41
  onStateChange
@@ -48,16 +49,16 @@ var GasFeePoller = class {
48
49
  __privateAdd(this, _getUnapprovedTransactions);
49
50
  this.hub = new EventEmitter();
50
51
  __privateAdd(this, _gasFeeFlows, void 0);
51
- __privateAdd(this, _getEthQuery, void 0);
52
52
  __privateAdd(this, _getGasFeeControllerEstimates, void 0);
53
+ __privateAdd(this, _getProvider, void 0);
53
54
  __privateAdd(this, _getTransactions, void 0);
54
55
  __privateAdd(this, _layer1GasFeeFlows, void 0);
55
56
  __privateAdd(this, _timeout, void 0);
56
57
  __privateAdd(this, _running, false);
57
58
  __privateSet(this, _gasFeeFlows, gasFeeFlows);
58
59
  __privateSet(this, _layer1GasFeeFlows, layer1GasFeeFlows);
59
- __privateSet(this, _getEthQuery, getEthQuery);
60
60
  __privateSet(this, _getGasFeeControllerEstimates, getGasFeeControllerEstimates);
61
+ __privateSet(this, _getProvider, getProvider);
61
62
  __privateSet(this, _getTransactions, getTransactions);
62
63
  onStateChange(() => {
63
64
  const unapprovedTransactions = __privateMethod(this, _getUnapprovedTransactions, getUnapprovedTransactions_fn).call(this);
@@ -70,8 +71,8 @@ var GasFeePoller = class {
70
71
  }
71
72
  };
72
73
  _gasFeeFlows = new WeakMap();
73
- _getEthQuery = new WeakMap();
74
74
  _getGasFeeControllerEstimates = new WeakMap();
75
+ _getProvider = new WeakMap();
75
76
  _getTransactions = new WeakMap();
76
77
  _layer1GasFeeFlows = new WeakMap();
77
78
  _timeout = new WeakMap();
@@ -116,7 +117,7 @@ updateTransactionGasFeeEstimates_fn = async function() {
116
117
  _updateTransactionSuggestedFees = new WeakSet();
117
118
  updateTransactionSuggestedFees_fn = async function(transactionMeta) {
118
119
  const { chainId, networkClientId } = transactionMeta;
119
- const ethQuery = __privateGet(this, _getEthQuery).call(this, chainId, networkClientId);
120
+ const ethQuery = new EthQuery(__privateGet(this, _getProvider).call(this, chainId, networkClientId));
120
121
  const gasFeeFlow = getGasFeeFlow(transactionMeta, __privateGet(this, _gasFeeFlows));
121
122
  if (!gasFeeFlow) {
122
123
  log("No gas fee flow found", transactionMeta.id);
@@ -158,9 +159,9 @@ updateTransactionSuggestedFees_fn = async function(transactionMeta) {
158
159
  _updateTransactionLayer1GasFee = new WeakSet();
159
160
  updateTransactionLayer1GasFee_fn = async function(transactionMeta) {
160
161
  const { chainId, networkClientId } = transactionMeta;
161
- const ethQuery = __privateGet(this, _getEthQuery).call(this, chainId, networkClientId);
162
+ const provider = __privateGet(this, _getProvider).call(this, chainId, networkClientId);
162
163
  await updateTransactionLayer1GasFee({
163
- ethQuery,
164
+ provider,
164
165
  layer1GasFeeFlows: __privateGet(this, _layer1GasFeeFlows),
165
166
  transactionMeta
166
167
  });
@@ -179,4 +180,4 @@ getUnapprovedTransactions_fn = function() {
179
180
  export {
180
181
  GasFeePoller
181
182
  };
182
- //# sourceMappingURL=chunk-VAOKN3J4.mjs.map
183
+ //# sourceMappingURL=chunk-35MG26Y3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers/GasFeePoller.ts"],"sourcesContent":["import EthQuery from '@metamask/eth-query';\nimport type { GasFeeState } from '@metamask/gas-fee-controller';\nimport type { NetworkClientId, Provider } 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 #getGasFeeControllerEstimates: () => Promise<GasFeeState>;\n\n #getProvider: (chainId: Hex, networkClientId?: NetworkClientId) => Provider;\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.getGasFeeControllerEstimates - Callback to obtain the default fee estimates.\n * @param options.getProvider - Callback to obtain a provider instance.\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 getGasFeeControllerEstimates,\n getProvider,\n getTransactions,\n layer1GasFeeFlows,\n onStateChange,\n }: {\n gasFeeFlows: GasFeeFlow[];\n getGasFeeControllerEstimates: () => Promise<GasFeeState>;\n getProvider: (chainId: Hex, networkClientId?: NetworkClientId) => Provider;\n getTransactions: () => TransactionMeta[];\n layer1GasFeeFlows: Layer1GasFeeFlow[];\n onStateChange: (listener: () => void) => void;\n }) {\n this.#gasFeeFlows = gasFeeFlows;\n this.#layer1GasFeeFlows = layer1GasFeeFlows;\n this.#getGasFeeControllerEstimates = getGasFeeControllerEstimates;\n this.#getProvider = getProvider;\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 = new EthQuery(this.#getProvider(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 provider = this.#getProvider(chainId, networkClientId);\n\n await updateTransactionLayer1GasFee({\n provider,\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":[]}
@@ -1,10 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
2
 
3
3
 
4
- var _chunkCXXGL43Kjs = require('./chunk-CXXGL43K.js');
4
+ var _chunkF247MMTEjs = require('./chunk-F247MMTE.js');
5
5
 
6
6
 
7
- var _chunkITDY6AIZjs = require('./chunk-ITDY6AIZ.js');
7
+ var _chunkLQS2M5QRjs = require('./chunk-LQS2M5QR.js');
8
8
 
9
9
 
10
10
  var _chunkS6VGOPUYjs = require('./chunk-S6VGOPUY.js');
@@ -36,7 +36,7 @@ var EtherscanRemoteTransactionSource = class {
36
36
  _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _mutex, new (0, _asyncmutex.Mutex)());
37
37
  _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _fetchNormalTransactions, async (request, etherscanRequest) => {
38
38
  const { currentChainId } = request;
39
- const etherscanTransactions = await _chunkCXXGL43Kjs.fetchEtherscanTransactions.call(void 0,
39
+ const etherscanTransactions = await _chunkF247MMTEjs.fetchEtherscanTransactions.call(void 0,
40
40
  etherscanRequest
41
41
  );
42
42
  return _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getResponseTransactions, getResponseTransactions_fn).call(this, etherscanTransactions).map(
@@ -45,7 +45,7 @@ var EtherscanRemoteTransactionSource = class {
45
45
  });
46
46
  _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _fetchTokenTransactions, async (request, etherscanRequest) => {
47
47
  const { currentChainId } = request;
48
- const etherscanTransactions = await _chunkCXXGL43Kjs.fetchEtherscanTokenTransactions.call(void 0,
48
+ const etherscanTransactions = await _chunkF247MMTEjs.fetchEtherscanTokenTransactions.call(void 0,
49
49
  etherscanRequest
50
50
  );
51
51
  return _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _getResponseTransactions, getResponseTransactions_fn).call(this, etherscanTransactions).map(
@@ -56,7 +56,7 @@ var EtherscanRemoteTransactionSource = class {
56
56
  _chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _isTokenRequestPending, false);
57
57
  }
58
58
  isSupportedNetwork(chainId) {
59
- return Object.keys(_chunkITDY6AIZjs.ETHERSCAN_SUPPORTED_NETWORKS).includes(chainId);
59
+ return Object.keys(_chunkLQS2M5QRjs.ETHERSCAN_SUPPORTED_NETWORKS).includes(chainId);
60
60
  }
61
61
  getLastBlockVariations() {
62
62
  return [_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _isTokenRequestPending) ? "token" : "normal"];
@@ -167,4 +167,4 @@ normalizeTransactionBase_fn = function(txMeta, currentChainId) {
167
167
 
168
168
 
169
169
  exports.EtherscanRemoteTransactionSource = EtherscanRemoteTransactionSource;
170
- //# sourceMappingURL=chunk-F3CMU2DM.js.map
170
+ //# sourceMappingURL=chunk-3JEUO765.js.map
@@ -8,6 +8,10 @@ var _chunkKT6UAKBBjs = require('./chunk-KT6UAKBB.js');
8
8
  var _chunkHMOSP33Fjs = require('./chunk-HMOSP33F.js');
9
9
 
10
10
 
11
+
12
+ var _chunkLQS2M5QRjs = require('./chunk-LQS2M5QR.js');
13
+
14
+
11
15
  var _chunkS6VGOPUYjs = require('./chunk-S6VGOPUY.js');
12
16
 
13
17
  // src/utils/simulation.ts
@@ -15,7 +19,44 @@ var _abi = require('@ethersproject/abi');
15
19
  var _controllerutils = require('@metamask/controller-utils');
16
20
  var _metamaskethabis = require('@metamask/metamask-eth-abis');
17
21
  var _utils = require('@metamask/utils');
22
+ var SupportedToken = /* @__PURE__ */ ((SupportedToken2) => {
23
+ SupportedToken2["ERC20"] = "erc20";
24
+ SupportedToken2["ERC721"] = "erc721";
25
+ SupportedToken2["ERC1155"] = "erc1155";
26
+ SupportedToken2["ERC20_WRAPPED"] = "erc20Wrapped";
27
+ SupportedToken2["ERC721_LEGACY"] = "erc721Legacy";
28
+ return SupportedToken2;
29
+ })(SupportedToken || {});
18
30
  var log = _utils.createModuleLogger.call(void 0, _chunkS6VGOPUYjs.projectLogger, "simulation");
31
+ var SUPPORTED_EVENTS = [
32
+ "Transfer",
33
+ "TransferSingle",
34
+ "TransferBatch",
35
+ "Deposit",
36
+ "Withdrawal"
37
+ ];
38
+ var SUPPORTED_TOKEN_ABIS = {
39
+ ["erc20" /* ERC20 */]: {
40
+ abi: _metamaskethabis.abiERC20,
41
+ standard: "erc20" /* erc20 */
42
+ },
43
+ ["erc721" /* ERC721 */]: {
44
+ abi: _metamaskethabis.abiERC721,
45
+ standard: "erc721" /* erc721 */
46
+ },
47
+ ["erc1155" /* ERC1155 */]: {
48
+ abi: _metamaskethabis.abiERC1155,
49
+ standard: "erc1155" /* erc1155 */
50
+ },
51
+ ["erc20Wrapped" /* ERC20_WRAPPED */]: {
52
+ abi: _chunkLQS2M5QRjs.ABI_SIMULATION_ERC20_WRAPPED,
53
+ standard: "erc20" /* erc20 */
54
+ },
55
+ ["erc721Legacy" /* ERC721_LEGACY */]: {
56
+ abi: _chunkLQS2M5QRjs.ABI_SIMULATION_ERC721_LEGACY,
57
+ standard: "erc721" /* erc721 */
58
+ }
59
+ };
19
60
  var REVERTED_ERRORS = ["execution reverted", "insufficient funds for gas"];
20
61
  async function getSimulationData(request) {
21
62
  const { chainId, from, to, value, data } = request;
@@ -36,9 +77,6 @@ async function getSimulationData(request) {
36
77
  withLogs: true
37
78
  });
38
79
  const transactionError = response.transactions?.[0]?.error;
39
- if (REVERTED_ERRORS.some((error) => transactionError?.includes(error))) {
40
- throw new (0, _chunkHMOSP33Fjs.SimulationRevertedError)();
41
- }
42
80
  if (transactionError) {
43
81
  throw new (0, _chunkHMOSP33Fjs.SimulationError)(transactionError);
44
82
  }
@@ -52,12 +90,18 @@ async function getSimulationData(request) {
52
90
  };
53
91
  } catch (error) {
54
92
  log("Failed to get simulation data", error, request);
55
- const rawError = error;
93
+ let simulationError = error;
94
+ if (REVERTED_ERRORS.some(
95
+ (revertErrorMessage) => simulationError.message?.includes(revertErrorMessage)
96
+ )) {
97
+ simulationError = new (0, _chunkHMOSP33Fjs.SimulationRevertedError)();
98
+ }
99
+ const { code, message } = simulationError;
56
100
  return {
57
101
  tokenBalanceChanges: [],
58
102
  error: {
59
- code: rawError.code,
60
- message: rawError.message
103
+ code,
104
+ message
61
105
  }
62
106
  };
63
107
  }
@@ -80,16 +124,9 @@ function getEvents(response) {
80
124
  response.transactions[0]?.callTrace ?? {}
81
125
  );
82
126
  log("Extracted logs", logs);
83
- const erc20Interface = new (0, _abi.Interface)(_metamaskethabis.abiERC20);
84
- const erc721Interface = new (0, _abi.Interface)(_metamaskethabis.abiERC721);
85
- const erc1155Interface = new (0, _abi.Interface)(_metamaskethabis.abiERC1155);
127
+ const interfaces = getContractInterfaces();
86
128
  return logs.map((currentLog) => {
87
- const event = parseLog(
88
- currentLog,
89
- erc20Interface,
90
- erc721Interface,
91
- erc1155Interface
92
- );
129
+ const event = parseLog(currentLog, interfaces);
93
130
  if (!event) {
94
131
  log("Failed to parse log", currentLog);
95
132
  return void 0;
@@ -141,11 +178,15 @@ async function getTokenBalanceChanges(request, events) {
141
178
  throw new (0, _chunkHMOSP33Fjs.SimulationInvalidResponseError)();
142
179
  }
143
180
  return [...balanceTransactionsByToken.keys()].map((token, index) => {
144
- const previousBalance = normalizeReturnValue(
145
- response.transactions[index].return
181
+ const previousBalance = getValueFromBalanceTransaction(
182
+ request.from,
183
+ token,
184
+ response.transactions[index]
146
185
  );
147
- const newBalance = normalizeReturnValue(
148
- response.transactions[index + balanceTransactions.length + 1].return
186
+ const newBalance = getValueFromBalanceTransaction(
187
+ request.from,
188
+ token,
189
+ response.transactions[index + balanceTransactions.length + 1]
149
190
  );
150
191
  const balanceChange = getSimulationBalanceChange(
151
192
  previousBalance,
@@ -162,21 +203,12 @@ async function getTokenBalanceChanges(request, events) {
162
203
  }
163
204
  function getTokenBalanceTransactions(request, events) {
164
205
  const tokenKeys = /* @__PURE__ */ new Set();
165
- return events.reduce((result, event) => {
166
- if (!["Transfer", "TransferSingle", "TransferBatch"].includes(event.name) || ![event.args.from, event.args.to].includes(request.from)) {
167
- log("Ignoring event", event);
168
- return result;
169
- }
170
- let tokenIds = [void 0];
171
- if (event.tokenStandard === "erc721" /* erc721 */) {
172
- tokenIds = [event.args.tokenId];
173
- }
174
- if (event.tokenStandard === "erc1155" /* erc1155 */ && event.name === "TransferSingle") {
175
- tokenIds = [event.args.id];
176
- }
177
- if (event.tokenStandard === "erc1155" /* erc1155 */ && event.name === "TransferBatch") {
178
- tokenIds = event.args.ids;
179
- }
206
+ const userEvents = events.filter(
207
+ (event) => SUPPORTED_EVENTS.includes(event.name) && [event.args.from, event.args.to].includes(request.from)
208
+ );
209
+ log("Filtered user events", userEvents);
210
+ return userEvents.reduce((result, event) => {
211
+ const tokenIds = getEventTokenIds(event);
180
212
  log("Extracted token ids", tokenIds);
181
213
  for (const tokenId of tokenIds) {
182
214
  const simulationToken = {
@@ -193,42 +225,62 @@ function getTokenBalanceTransactions(request, events) {
193
225
  continue;
194
226
  }
195
227
  tokenKeys.add(tokenKey);
196
- const parameters = [request.from];
197
- if (event.tokenStandard === "erc1155" /* erc1155 */) {
198
- parameters.push(tokenId);
199
- }
228
+ const data = getBalanceTransactionData(
229
+ event.tokenStandard,
230
+ request.from,
231
+ tokenId
232
+ );
200
233
  result.set(simulationToken, {
201
234
  from: request.from,
202
235
  to: event.contractAddress,
203
- data: new (0, _abi.Interface)(event.abi).encodeFunctionData(
204
- "balanceOf",
205
- parameters
206
- )
236
+ data
207
237
  });
208
238
  }
209
239
  return result;
210
240
  }, /* @__PURE__ */ new Map());
211
241
  }
212
- function parseLog(eventLog, erc20, erc721, erc1155) {
213
- const abisByStandard = [
214
- {
215
- abi: _metamaskethabis.abiERC20,
216
- contractInterface: erc20,
217
- standard: "erc20" /* erc20 */
218
- },
219
- {
220
- abi: _metamaskethabis.abiERC721,
221
- contractInterface: erc721,
222
- standard: "erc721" /* erc721 */
223
- },
224
- {
225
- abi: _metamaskethabis.abiERC1155,
226
- contractInterface: erc1155,
227
- standard: "erc1155" /* erc1155 */
228
- }
229
- ];
230
- for (const { abi, contractInterface, standard } of abisByStandard) {
242
+ function getEventTokenIds(event) {
243
+ if (event.tokenStandard === "erc721" /* erc721 */) {
244
+ return [event.args.tokenId];
245
+ }
246
+ if (event.tokenStandard === "erc1155" /* erc1155 */ && event.name === "TransferSingle") {
247
+ return [event.args.id];
248
+ }
249
+ if (event.tokenStandard === "erc1155" /* erc1155 */ && event.name === "TransferBatch") {
250
+ return event.args.ids;
251
+ }
252
+ return [void 0];
253
+ }
254
+ function getValueFromBalanceTransaction(from, token, response) {
255
+ const normalizedReturn = normalizeReturnValue(response.return);
256
+ if (token.standard === "erc721" /* erc721 */) {
257
+ return normalizedReturn === from ? "0x1" : "0x0";
258
+ }
259
+ return normalizedReturn;
260
+ }
261
+ function getBalanceTransactionData(tokenStandard, from, tokenId) {
262
+ switch (tokenStandard) {
263
+ case "erc721" /* erc721 */:
264
+ return new (0, _abi.Interface)(_metamaskethabis.abiERC721).encodeFunctionData("ownerOf", [
265
+ tokenId
266
+ ]);
267
+ case "erc1155" /* erc1155 */:
268
+ return new (0, _abi.Interface)(_metamaskethabis.abiERC1155).encodeFunctionData("balanceOf", [
269
+ from,
270
+ tokenId
271
+ ]);
272
+ default:
273
+ return new (0, _abi.Interface)(_metamaskethabis.abiERC20).encodeFunctionData("balanceOf", [
274
+ from
275
+ ]);
276
+ }
277
+ }
278
+ function parseLog(eventLog, interfaces) {
279
+ const supportedTokens = Object.values(SupportedToken);
280
+ for (const token of supportedTokens) {
231
281
  try {
282
+ const contractInterface = interfaces.get(token);
283
+ const { abi, standard } = SUPPORTED_TOKEN_ABIS[token];
232
284
  return {
233
285
  ...contractInterface.parseLog(eventLog),
234
286
  abi,
@@ -266,8 +318,19 @@ function getSimulationBalanceChange(previousBalance, newBalance) {
266
318
  function normalizeReturnValue(value) {
267
319
  return _controllerutils.toHex.call(void 0, _controllerutils.hexToBN.call(void 0, value));
268
320
  }
321
+ function getContractInterfaces() {
322
+ const supportedTokens = Object.values(SupportedToken);
323
+ return new Map(
324
+ supportedTokens.map((tokenType) => {
325
+ const { abi } = SUPPORTED_TOKEN_ABIS[tokenType];
326
+ const contractInterface = new (0, _abi.Interface)(abi);
327
+ return [tokenType, contractInterface];
328
+ })
329
+ );
330
+ }
331
+
269
332
 
270
333
 
271
334
 
272
- exports.getSimulationData = getSimulationData;
273
- //# sourceMappingURL=chunk-V5X6MZHN.js.map
335
+ exports.SupportedToken = SupportedToken; exports.getSimulationData = getSimulationData;
336
+ //# sourceMappingURL=chunk-3VF7ZGRV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/simulation.ts"],"names":["SupportedToken"],"mappings":"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","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 {\n ABI_SIMULATION_ERC20_WRAPPED,\n ABI_SIMULATION_ERC721_LEGACY,\n} from '../constants';\nimport {\n SimulationError,\n SimulationInvalidResponseError,\n SimulationRevertedError,\n} from '../errors';\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 SimulationResponseTransaction,\n} from './simulation-api';\n\nexport enum SupportedToken {\n ERC20 = 'erc20',\n ERC721 = 'erc721',\n ERC1155 = 'erc1155',\n ERC20_WRAPPED = 'erc20Wrapped',\n ERC721_LEGACY = 'erc721Legacy',\n}\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\nconst log = createModuleLogger(projectLogger, 'simulation');\n\nconst SUPPORTED_EVENTS = [\n 'Transfer',\n 'TransferSingle',\n 'TransferBatch',\n 'Deposit',\n 'Withdrawal',\n];\n\nconst SUPPORTED_TOKEN_ABIS = {\n [SupportedToken.ERC20]: {\n abi: abiERC20,\n standard: SimulationTokenStandard.erc20,\n },\n [SupportedToken.ERC721]: {\n abi: abiERC721,\n standard: SimulationTokenStandard.erc721,\n },\n [SupportedToken.ERC1155]: {\n abi: abiERC1155,\n standard: SimulationTokenStandard.erc1155,\n },\n [SupportedToken.ERC20_WRAPPED]: {\n abi: ABI_SIMULATION_ERC20_WRAPPED,\n standard: SimulationTokenStandard.erc20,\n },\n [SupportedToken.ERC721_LEGACY]: {\n abi: ABI_SIMULATION_ERC721_LEGACY,\n standard: SimulationTokenStandard.erc721,\n },\n};\n\nconst REVERTED_ERRORS = ['execution reverted', 'insufficient funds for gas'];\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 throw new SimulationError(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 let simulationError = error as SimulationError;\n\n if (\n REVERTED_ERRORS.some((revertErrorMessage) =>\n simulationError.message?.includes(revertErrorMessage),\n )\n ) {\n simulationError = new SimulationRevertedError();\n }\n\n const { code, message } = simulationError;\n\n return {\n tokenBalanceChanges: [],\n error: {\n code,\n message,\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 interfaces = getContractInterfaces();\n\n return logs\n .map((currentLog) => {\n const event = parseLog(currentLog, interfaces);\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 SimulationInvalidResponseError();\n }\n\n return [...balanceTransactionsByToken.keys()]\n .map((token, index) => {\n const previousBalance = getValueFromBalanceTransaction(\n request.from,\n token,\n response.transactions[index],\n );\n\n const newBalance = getValueFromBalanceTransaction(\n request.from,\n token,\n response.transactions[index + balanceTransactions.length + 1],\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 const userEvents = events.filter(\n (event) =>\n SUPPORTED_EVENTS.includes(event.name) &&\n [event.args.from, event.args.to].includes(request.from),\n );\n\n log('Filtered user events', userEvents);\n\n return userEvents.reduce((result, event) => {\n const tokenIds = getEventTokenIds(event);\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 data = getBalanceTransactionData(\n event.tokenStandard,\n request.from,\n tokenId,\n );\n\n result.set(simulationToken, {\n from: request.from,\n to: event.contractAddress,\n data,\n });\n }\n\n return result;\n }, new Map<SimulationToken, SimulationRequestTransaction>());\n}\n\n/**\n * Extract token IDs from a parsed event.\n * @param event - The parsed event.\n * @returns An array of token IDs.\n */\nfunction getEventTokenIds(event: ParsedEvent): (Hex | undefined)[] {\n if (event.tokenStandard === SimulationTokenStandard.erc721) {\n return [event.args.tokenId as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferSingle'\n ) {\n return [event.args.id as Hex];\n }\n\n if (\n event.tokenStandard === SimulationTokenStandard.erc1155 &&\n event.name === 'TransferBatch'\n ) {\n return event.args.ids as Hex[];\n }\n\n // ERC-20 does not have a token ID so default to undefined.\n return [undefined];\n}\n\n/**\n * Extract the value from a balance transaction response.\n * @param from - The address to check the balance of.\n * @param token - The token to check the balance of.\n * @param response - The balance transaction response.\n * @returns The value of the balance transaction.\n */\nfunction getValueFromBalanceTransaction(\n from: Hex,\n token: SimulationToken,\n response: SimulationResponseTransaction,\n): Hex {\n const normalizedReturn = normalizeReturnValue(response.return);\n\n if (token.standard === SimulationTokenStandard.erc721) {\n return normalizedReturn === from ? '0x1' : '0x0';\n }\n\n return normalizedReturn;\n}\n\n/**\n * Generate the balance transaction data for a token.\n * @param tokenStandard - The token standard.\n * @param from - The address to check the balance of.\n * @param tokenId - The token ID to check the balance of.\n * @returns The balance transaction data.\n */\nfunction getBalanceTransactionData(\n tokenStandard: SimulationTokenStandard,\n from: Hex,\n tokenId?: Hex,\n): Hex {\n switch (tokenStandard) {\n case SimulationTokenStandard.erc721:\n return new Interface(abiERC721).encodeFunctionData('ownerOf', [\n tokenId,\n ]) as Hex;\n\n case SimulationTokenStandard.erc1155:\n return new Interface(abiERC1155).encodeFunctionData('balanceOf', [\n from,\n tokenId,\n ]) as Hex;\n\n default:\n return new Interface(abiERC20).encodeFunctionData('balanceOf', [\n from,\n ]) as Hex;\n }\n}\n\n/**\n * Parse a raw event log using known ABIs.\n * @param eventLog - The raw event log.\n * @param interfaces - The contract interfaces.\n * @returns The parsed event log or undefined if it could not be parsed.\n */\nfunction parseLog(\n eventLog: SimulationResponseLog,\n interfaces: Map<SupportedToken, Interface>,\n):\n | (LogDescription & { abi: ABI; standard: SimulationTokenStandard })\n | undefined {\n const supportedTokens = Object.values(SupportedToken);\n\n for (const token of supportedTokens) {\n try {\n const contractInterface = interfaces.get(token) as Interface;\n const { abi, standard } = SUPPORTED_TOKEN_ABIS[token];\n\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\n/**\n * Get the contract interfaces for all supported tokens.\n * @returns A map of supported tokens to their contract interfaces.\n */\nfunction getContractInterfaces(): Map<SupportedToken, Interface> {\n const supportedTokens = Object.values(SupportedToken);\n\n return new Map(\n supportedTokens.map((tokenType) => {\n const { abi } = SUPPORTED_TOKEN_ABIS[tokenType];\n const contractInterface = new Interface(abi);\n return [tokenType, contractInterface];\n }),\n );\n}\n"]}