@metamask-previews/transaction-controller 25.3.0-preview-92860b3f → 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.
- package/CHANGELOG.md +23 -1
- package/dist/TransactionController.js +18 -17
- package/dist/TransactionController.mjs +17 -16
- package/dist/{chunk-OJZQHE27.mjs → chunk-2XFBWPHD.mjs} +3 -3
- package/dist/{chunk-VAOKN3J4.mjs → chunk-35MG26Y3.mjs} +13 -12
- package/dist/chunk-35MG26Y3.mjs.map +1 -0
- package/dist/{chunk-2M7BJZZI.js → chunk-3JEUO765.js} +6 -6
- package/dist/{chunk-GNHEYMEB.js → chunk-3VF7ZGRV.js} +4 -4
- package/dist/{chunk-EEBD6453.mjs → chunk-4VLQV2GA.mjs} +3 -2
- package/dist/chunk-4VLQV2GA.mjs.map +1 -0
- package/dist/chunk-53IYIDVS.mjs +132 -0
- package/dist/chunk-53IYIDVS.mjs.map +1 -0
- package/dist/{chunk-5XBULBP2.js → chunk-5KMU2IAT.js} +3 -3
- package/dist/chunk-5KMU2IAT.js.map +1 -0
- package/dist/{chunk-RWSLMZRF.js → chunk-5SKCGFUC.js} +67 -35
- package/dist/chunk-5SKCGFUC.js.map +1 -0
- package/dist/{chunk-R7NJVDWN.js → chunk-5WFLNKCL.js} +7 -6
- package/dist/chunk-5WFLNKCL.js.map +1 -0
- package/dist/{chunk-JRQHIBG5.mjs → chunk-5YES3V2R.mjs} +3 -3
- package/dist/chunk-5YES3V2R.mjs.map +1 -0
- package/dist/{chunk-ODAT2YIF.js → chunk-AO3AE3L7.js} +3 -3
- package/dist/{chunk-SWICFTKD.js → chunk-CPYXP2OC.js} +40 -25
- package/dist/chunk-CPYXP2OC.js.map +1 -0
- package/dist/{chunk-DFURSMYC.mjs → chunk-CWWZQZVR.mjs} +3 -3
- package/dist/{chunk-FB2LVQNH.mjs → chunk-DOX6H5UJ.mjs} +2 -2
- package/dist/{chunk-NWH6YDU3.mjs → chunk-DRSMLO7B.mjs} +2 -2
- package/dist/chunk-ETMW527M.js +132 -0
- package/dist/chunk-ETMW527M.js.map +1 -0
- package/dist/{chunk-TOKKG3T3.js → chunk-F247MMTE.js} +3 -3
- package/dist/{chunk-HBNQEJEM.js → chunk-FK7AP6SH.js} +1 -1
- package/dist/chunk-FK7AP6SH.js.map +1 -0
- package/dist/{chunk-SOSF65FI.js → chunk-HUVOOFOM.js} +15 -14
- package/dist/chunk-HUVOOFOM.js.map +1 -0
- package/dist/{chunk-4T7DPR3I.mjs → chunk-JDLNCMGI.mjs} +52 -20
- package/dist/chunk-JDLNCMGI.mjs.map +1 -0
- package/dist/{chunk-A6SZHDCJ.js → chunk-L337FYVS.js} +5 -5
- package/dist/{chunk-VAQ5OJRV.mjs → chunk-L7ZKSKEI.mjs} +2 -2
- package/dist/{chunk-R6ONHOPG.js → chunk-LQS2M5QR.js} +3 -2
- package/dist/chunk-LQS2M5QR.js.map +1 -0
- package/dist/{chunk-PB6WUHLL.js → chunk-LYD4TEKH.js} +7 -7
- package/dist/{chunk-XQ3FQLMI.mjs → chunk-P74YLPJO.mjs} +3 -3
- package/dist/{chunk-WMA7ZL4J.mjs → chunk-RBF6CW7D.mjs} +2 -2
- package/dist/{chunk-7BCJM5QI.mjs → chunk-RXRJSBSF.mjs} +39 -24
- package/dist/chunk-RXRJSBSF.mjs.map +1 -0
- package/dist/{chunk-VDBVZJ44.mjs → chunk-TKWTUPCQ.mjs} +3 -3
- package/dist/{chunk-AMDQXP37.mjs → chunk-TWND5SFD.mjs} +2 -2
- package/dist/{chunk-YB5XTPU6.js → chunk-UBXRAA6G.js} +6 -6
- package/dist/{chunk-L4S5SEV3.js → chunk-UH7FNVKS.js} +4 -4
- package/dist/{chunk-KFL2GGZC.mjs → chunk-W3CS5GRD.mjs} +7 -6
- package/dist/chunk-W3CS5GRD.mjs.map +1 -0
- package/dist/{chunk-FTTHI2AB.js → chunk-WLCFETHR.js} +10 -10
- package/dist/{chunk-UADPSS35.mjs → chunk-YEJJKWT2.mjs} +1 -1
- package/dist/chunk-YEJJKWT2.mjs.map +1 -0
- package/dist/constants.js +2 -2
- package/dist/constants.mjs +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.mjs +1 -1
- package/dist/gas-flows/DefaultGasFeeFlow.js +7 -7
- package/dist/gas-flows/DefaultGasFeeFlow.mjs +6 -6
- package/dist/gas-flows/LineaGasFeeFlow.js +8 -8
- package/dist/gas-flows/LineaGasFeeFlow.mjs +7 -7
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.js +10 -0
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.js.map +1 -0
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs +10 -0
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs.map +1 -0
- package/dist/helpers/EtherscanRemoteTransactionSource.js +5 -5
- package/dist/helpers/EtherscanRemoteTransactionSource.mjs +4 -4
- package/dist/helpers/GasFeePoller.js +5 -5
- package/dist/helpers/GasFeePoller.mjs +4 -4
- package/dist/helpers/MultichainTrackingHelper.js +6 -6
- package/dist/helpers/MultichainTrackingHelper.mjs +5 -5
- package/dist/helpers/PendingTransactionTracker.js +3 -3
- package/dist/helpers/PendingTransactionTracker.mjs +2 -2
- package/dist/index.js +18 -17
- package/dist/index.mjs +17 -16
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/TransactionController.d.ts +9 -1
- package/dist/types/TransactionController.d.ts.map +1 -1
- package/dist/types/constants.d.ts +1 -0
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/gas-flows/OptimismLayer1GasFeeFlow.d.ts +10 -0
- package/dist/types/gas-flows/OptimismLayer1GasFeeFlow.d.ts.map +1 -0
- package/dist/types/helpers/GasFeePoller.d.ts +4 -5
- package/dist/types/helpers/GasFeePoller.d.ts.map +1 -1
- package/dist/types/helpers/MultichainTrackingHelper.d.ts +4 -0
- package/dist/types/helpers/MultichainTrackingHelper.d.ts.map +1 -1
- package/dist/types/helpers/PendingTransactionTracker.d.ts +1 -1
- package/dist/types/helpers/PendingTransactionTracker.d.ts.map +1 -1
- package/dist/types/types.d.ts +3 -3
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils/layer1-gas-fee-flow.d.ts +11 -2
- package/dist/types/utils/layer1-gas-fee-flow.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.mjs +1 -1
- package/dist/utils/etherscan.js +3 -3
- package/dist/utils/etherscan.mjs +2 -2
- package/dist/utils/external-transactions.js +1 -1
- package/dist/utils/external-transactions.mjs +1 -1
- package/dist/utils/gas-fees.js +6 -6
- package/dist/utils/gas-fees.mjs +5 -5
- package/dist/utils/gas-flow.js +3 -3
- package/dist/utils/gas-flow.mjs +2 -2
- package/dist/utils/gas.js +3 -3
- package/dist/utils/gas.mjs +2 -2
- package/dist/utils/layer1-gas-fee-flow.js +4 -2
- package/dist/utils/layer1-gas-fee-flow.mjs +3 -1
- package/dist/utils/simulation-api.js +1 -1
- package/dist/utils/simulation-api.mjs +1 -1
- package/dist/utils/simulation.js +4 -4
- package/dist/utils/simulation.mjs +3 -3
- package/dist/utils/swaps.js +4 -4
- package/dist/utils/swaps.mjs +3 -3
- package/dist/utils/transaction-type.js +1 -1
- package/dist/utils/transaction-type.mjs +1 -1
- package/dist/utils/utils.js +1 -1
- package/dist/utils/utils.mjs +1 -1
- package/dist/utils/validation.js +1 -1
- package/dist/utils/validation.mjs +1 -1
- package/package.json +6 -4
- package/dist/chunk-4T7DPR3I.mjs.map +0 -1
- package/dist/chunk-5XBULBP2.js.map +0 -1
- package/dist/chunk-7BCJM5QI.mjs.map +0 -1
- package/dist/chunk-EEBD6453.mjs.map +0 -1
- package/dist/chunk-HBNQEJEM.js.map +0 -1
- package/dist/chunk-JRQHIBG5.mjs.map +0 -1
- package/dist/chunk-KFL2GGZC.mjs.map +0 -1
- package/dist/chunk-R6ONHOPG.js.map +0 -1
- package/dist/chunk-R7NJVDWN.js.map +0 -1
- package/dist/chunk-RWSLMZRF.js.map +0 -1
- package/dist/chunk-SOSF65FI.js.map +0 -1
- package/dist/chunk-SWICFTKD.js.map +0 -1
- package/dist/chunk-UADPSS35.mjs.map +0 -1
- package/dist/chunk-VAOKN3J4.mjs.map +0 -1
- /package/dist/{chunk-OJZQHE27.mjs.map → chunk-2XFBWPHD.mjs.map} +0 -0
- /package/dist/{chunk-2M7BJZZI.js.map → chunk-3JEUO765.js.map} +0 -0
- /package/dist/{chunk-GNHEYMEB.js.map → chunk-3VF7ZGRV.js.map} +0 -0
- /package/dist/{chunk-ODAT2YIF.js.map → chunk-AO3AE3L7.js.map} +0 -0
- /package/dist/{chunk-DFURSMYC.mjs.map → chunk-CWWZQZVR.mjs.map} +0 -0
- /package/dist/{chunk-FB2LVQNH.mjs.map → chunk-DOX6H5UJ.mjs.map} +0 -0
- /package/dist/{chunk-NWH6YDU3.mjs.map → chunk-DRSMLO7B.mjs.map} +0 -0
- /package/dist/{chunk-TOKKG3T3.js.map → chunk-F247MMTE.js.map} +0 -0
- /package/dist/{chunk-A6SZHDCJ.js.map → chunk-L337FYVS.js.map} +0 -0
- /package/dist/{chunk-VAQ5OJRV.mjs.map → chunk-L7ZKSKEI.mjs.map} +0 -0
- /package/dist/{chunk-PB6WUHLL.js.map → chunk-LYD4TEKH.js.map} +0 -0
- /package/dist/{chunk-XQ3FQLMI.mjs.map → chunk-P74YLPJO.mjs.map} +0 -0
- /package/dist/{chunk-WMA7ZL4J.mjs.map → chunk-RBF6CW7D.mjs.map} +0 -0
- /package/dist/{chunk-VDBVZJ44.mjs.map → chunk-TKWTUPCQ.mjs.map} +0 -0
- /package/dist/{chunk-AMDQXP37.mjs.map → chunk-TWND5SFD.mjs.map} +0 -0
- /package/dist/{chunk-YB5XTPU6.js.map → chunk-UBXRAA6G.js.map} +0 -0
- /package/dist/{chunk-L4S5SEV3.js.map → chunk-UH7FNVKS.js.map} +0 -0
- /package/dist/{chunk-FTTHI2AB.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@
|
|
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
|
|
7
|
+
var _chunk5SKCGFUCjs = require('./chunk-5SKCGFUC.js');
|
|
8
8
|
require('./chunk-SD6CWFDF.js');
|
|
9
9
|
require('./chunk-VH47Q6TS.js');
|
|
10
|
-
require('./chunk-
|
|
10
|
+
require('./chunk-AO3AE3L7.js');
|
|
11
11
|
require('./chunk-QP75SWIQ.js');
|
|
12
12
|
require('./chunk-ZNZEJDOE.js');
|
|
13
|
-
require('./chunk-
|
|
13
|
+
require('./chunk-3VF7ZGRV.js');
|
|
14
14
|
require('./chunk-KT6UAKBB.js');
|
|
15
|
-
require('./chunk-
|
|
16
|
-
require('./chunk-
|
|
15
|
+
require('./chunk-ETMW527M.js');
|
|
16
|
+
require('./chunk-HUVOOFOM.js');
|
|
17
|
+
require('./chunk-5WFLNKCL.js');
|
|
17
18
|
require('./chunk-DTDTOMTB.js');
|
|
18
|
-
require('./chunk-
|
|
19
|
-
require('./chunk-
|
|
20
|
-
require('./chunk-
|
|
21
|
-
require('./chunk-
|
|
19
|
+
require('./chunk-CPYXP2OC.js');
|
|
20
|
+
require('./chunk-3JEUO765.js');
|
|
21
|
+
require('./chunk-5KMU2IAT.js');
|
|
22
|
+
require('./chunk-F247MMTE.js');
|
|
22
23
|
require('./chunk-7LXE4KHV.js');
|
|
23
24
|
require('./chunk-HMOSP33F.js');
|
|
24
|
-
require('./chunk-
|
|
25
|
-
require('./chunk-
|
|
26
|
-
require('./chunk-
|
|
27
|
-
require('./chunk-
|
|
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-
|
|
30
|
-
require('./chunk-
|
|
30
|
+
require('./chunk-UH7FNVKS.js');
|
|
31
|
+
require('./chunk-LQS2M5QR.js');
|
|
31
32
|
require('./chunk-S6VGOPUY.js');
|
|
32
|
-
require('./chunk-
|
|
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 =
|
|
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-
|
|
7
|
+
} from "./chunk-JDLNCMGI.mjs";
|
|
8
8
|
import "./chunk-KG4UW4K4.mjs";
|
|
9
9
|
import "./chunk-NM6OYEPP.mjs";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-DRSMLO7B.mjs";
|
|
11
11
|
import "./chunk-XGRAHX6T.mjs";
|
|
12
12
|
import "./chunk-NHRBO3LU.mjs";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-L7ZKSKEI.mjs";
|
|
14
14
|
import "./chunk-K4KOSAGM.mjs";
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-53IYIDVS.mjs";
|
|
16
|
+
import "./chunk-35MG26Y3.mjs";
|
|
17
|
+
import "./chunk-W3CS5GRD.mjs";
|
|
17
18
|
import "./chunk-Y7ENNK7L.mjs";
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-RXRJSBSF.mjs";
|
|
20
|
+
import "./chunk-TKWTUPCQ.mjs";
|
|
21
|
+
import "./chunk-5YES3V2R.mjs";
|
|
22
|
+
import "./chunk-DOX6H5UJ.mjs";
|
|
22
23
|
import "./chunk-FRKQ3Z2L.mjs";
|
|
23
24
|
import "./chunk-HQSNKCXI.mjs";
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
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-
|
|
30
|
-
import "./chunk-
|
|
30
|
+
import "./chunk-TWND5SFD.mjs";
|
|
31
|
+
import "./chunk-4VLQV2GA.mjs";
|
|
31
32
|
import "./chunk-UQQWZT6C.mjs";
|
|
32
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
121
|
+
//# sourceMappingURL=chunk-2XFBWPHD.mjs.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
updateTransactionLayer1GasFee
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-W3CS5GRD.mjs";
|
|
4
4
|
import {
|
|
5
5
|
getGasFeeFlow
|
|
6
|
-
} from "./chunk-
|
|
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,
|
|
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,
|
|
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
|
|
162
|
+
const provider = __privateGet(this, _getProvider).call(this, chainId, networkClientId);
|
|
162
163
|
await updateTransactionLayer1GasFee({
|
|
163
|
-
|
|
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-
|
|
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":";;;;;;;;;;;;;;;;;AAAA,OAAO,cAAc;AAIrB,SAAS,0BAA0B;AACnC,OAAO,kBAAkB;AAazB,IAAM,MAAM,mBAAmB,eAAe,gBAAgB;AAE9D,IAAM,wBAAwB;AApB9B;AAyBO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BxB,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAOG;AAkBH;AAcA;AAaA,uBAAM;AAON,uBAAM;AAeN,uBAAM;AAmDN,uBAAM;AAiBN;AA/KA,eAAoB,IAAI,aAAa;AAErC;AAEA;AAEA;AAEA;AAEA;AAEA;AAEA,iCAAW;AA2BT,uBAAK,cAAe;AACpB,uBAAK,oBAAqB;AAC1B,uBAAK,+BAAgC;AACrC,uBAAK,cAAe;AACpB,uBAAK,kBAAmB;AAExB,kBAAc,MAAM;AAClB,YAAM,yBAAyB,sBAAK,0DAAL;AAE/B,UAAI,uBAAuB,QAAQ;AACjC,8BAAK,kBAAL;AAAA,MACF,OAAO;AACL,8BAAK,gBAAL;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AA4HF;AAlLE;AAEA;AAEA;AAEA;AAEA;AAEA;AAEA;AA4CA;AAAA,WAAM,WAAG;AACP,MAAI,mBAAK,WAAU;AACjB;AAAA,EACF;AAIA,wBAAK,0BAAL;AAEA,qBAAK,UAAW;AAEhB,MAAI,iBAAiB;AACvB;AAEA;AAAA,UAAK,WAAG;AACN,MAAI,CAAC,mBAAK,WAAU;AAClB;AAAA,EACF;AAEA,eAAa,mBAAK,SAAQ;AAE1B,qBAAK,UAAW;AAChB,qBAAK,UAAW;AAEhB,MAAI,iBAAiB;AACvB;AAEM;AAAA,eAAU,iBAAG;AACjB,QAAM,sBAAK,wEAAL;AAGN,qBAAK,UAAW,WAAW,MAAM,sBAAK,0BAAL,YAAmB,qBAAqB;AAC3E;AAEM;AAAA,sCAAiC,iBAAG;AACxC,QAAM,yBAAyB,sBAAK,0DAAL;AAE/B,MAAI,iCAAiC;AAAA,IACnC,OAAO,uBAAuB;AAAA,EAChC,CAAC;AAED,QAAM,QAAQ;AAAA,IACZ,uBAAuB,QAAQ,CAAC,OAAO;AAAA,MACrC,sBAAK,oEAAL,WAAqC;AAAA,MACrC,sBAAK,kEAAL,WAAoC;AAAA,IACtC,CAAC;AAAA,EACH;AACF;AAEM;AAAA,oCAA+B,eAAC,iBAAkC;AACtE,QAAM,EAAE,SAAS,gBAAgB,IAAI;AAErC,QAAM,WAAW,IAAI,SAAS,mBAAK,cAAL,WAAkB,SAAS,gBAAgB;AACzE,QAAM,aAAa,cAAc,iBAAiB,mBAAK,aAAY;AAEnE,MAAI,CAAC,YAAY;AACf,QAAI,yBAAyB,gBAAgB,EAAE;AAAA,EACjD,OAAO;AACL;AAAA,MACE;AAAA,MACA,WAAW,YAAY;AAAA,MACvB,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,UAA6B;AAAA,IACjC;AAAA,IACA,8BAA8B,mBAAK;AAAA,IACnC;AAAA,EACF;AAEA,MAAI;AAEJ,MAAI,YAAY;AACd,QAAI;AACF,YAAM,WAAW,MAAM,WAAW,WAAW,OAAO;AACpD,wBAAkB,SAAS;AAAA,IAC7B,SAAS,OAAO;AACd,UAAI,oCAAoC,gBAAgB,IAAI,KAAK;AAAA,IACnE;AAAA,EACF;AAEA,MAAI,CAAC,mBAAmB,gBAAgB,uBAAuB;AAC7D;AAAA,EACF;AAEA,QAAM,yBAA0C;AAAA,IAC9C,GAAG;AAAA,IACH;AAAA,IACA,uBAAuB;AAAA,EACzB;AAEA,OAAK,IAAI,KAAK,uBAAuB,sBAAsB;AAE3D,MAAI,8BAA8B;AAAA,IAChC,iBAAiB,uBAAuB;AAAA,IACxC,aAAa,uBAAuB;AAAA,EACtC,CAAC;AACH;AAEM;AAAA,mCAA8B,eAAC,iBAAkC;AACrE,QAAM,EAAE,SAAS,gBAAgB,IAAI;AACrC,QAAM,WAAW,mBAAK,cAAL,WAAkB,SAAS;AAE5C,QAAM,8BAA8B;AAAA,IAClC;AAAA,IACA,mBAAmB,mBAAK;AAAA,IACxB;AAAA,EACF,CAAC;AAED,MAAI,gBAAgB,iBAAiB,QAAW;AAC9C;AAAA,EACF;AAEA,OAAK,IAAI,KAAK,uBAAuB,eAAe;AACtD;AAEA;AAAA,+BAA0B,WAAG;AAC3B,SAAO,mBAAK,kBAAL,WAAwB;AAAA,IAC7B,CAAC,OAAO,GAAG;AAAA,EACb;AACF;","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
|
|
4
|
+
var _chunkF247MMTEjs = require('./chunk-F247MMTE.js');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
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
|
|
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
|
|
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(
|
|
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-
|
|
170
|
+
//# sourceMappingURL=chunk-3JEUO765.js.map
|
|
@@ -9,7 +9,7 @@ var _chunkHMOSP33Fjs = require('./chunk-HMOSP33F.js');
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunkLQS2M5QRjs = require('./chunk-LQS2M5QR.js');
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
var _chunkS6VGOPUYjs = require('./chunk-S6VGOPUY.js');
|
|
@@ -49,11 +49,11 @@ var SUPPORTED_TOKEN_ABIS = {
|
|
|
49
49
|
standard: "erc1155" /* erc1155 */
|
|
50
50
|
},
|
|
51
51
|
["erc20Wrapped" /* ERC20_WRAPPED */]: {
|
|
52
|
-
abi:
|
|
52
|
+
abi: _chunkLQS2M5QRjs.ABI_SIMULATION_ERC20_WRAPPED,
|
|
53
53
|
standard: "erc20" /* erc20 */
|
|
54
54
|
},
|
|
55
55
|
["erc721Legacy" /* ERC721_LEGACY */]: {
|
|
56
|
-
abi:
|
|
56
|
+
abi: _chunkLQS2M5QRjs.ABI_SIMULATION_ERC721_LEGACY,
|
|
57
57
|
standard: "erc721" /* erc721 */
|
|
58
58
|
}
|
|
59
59
|
};
|
|
@@ -333,4 +333,4 @@ function getContractInterfaces() {
|
|
|
333
333
|
|
|
334
334
|
|
|
335
335
|
exports.SupportedToken = SupportedToken; exports.getSimulationData = getSimulationData;
|
|
336
|
-
//# sourceMappingURL=chunk-
|
|
336
|
+
//# sourceMappingURL=chunk-3VF7ZGRV.js.map
|
|
@@ -26,7 +26,8 @@ var CHAIN_IDS = {
|
|
|
26
26
|
MOONRIVER: "0x505",
|
|
27
27
|
GNOSIS: "0x64",
|
|
28
28
|
ARBITRUM: "0xa4b1",
|
|
29
|
-
ZKSYNC_ERA: "0x144"
|
|
29
|
+
ZKSYNC_ERA: "0x144",
|
|
30
|
+
ZORA: "0x76adf1"
|
|
30
31
|
};
|
|
31
32
|
var DEFAULT_ETHERSCAN_DOMAIN = "etherscan.io";
|
|
32
33
|
var DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX = "api";
|
|
@@ -170,4 +171,4 @@ export {
|
|
|
170
171
|
ABI_SIMULATION_ERC20_WRAPPED,
|
|
171
172
|
ABI_SIMULATION_ERC721_LEGACY
|
|
172
173
|
};
|
|
173
|
-
//# sourceMappingURL=chunk-
|
|
174
|
+
//# sourceMappingURL=chunk-4VLQV2GA.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts"],"sourcesContent":["export const CHAIN_IDS = {\n MAINNET: '0x1',\n GOERLI: '0x5',\n BASE: '0x2105',\n BASE_TESTNET: '0x14a33',\n BSC: '0x38',\n BSC_TESTNET: '0x61',\n OPTIMISM: '0xa',\n OPTIMISM_TESTNET: '0x1a4',\n OPBNB: '0xcc',\n OPBNB_TESTNET: '0x15eb',\n OPTIMISM_SEPOLIA: '0xaa37dc',\n POLYGON: '0x89',\n POLYGON_TESTNET: '0x13881',\n AVALANCHE: '0xa86a',\n AVALANCHE_TESTNET: '0xa869',\n FANTOM: '0xfa',\n FANTOM_TESTNET: '0xfa2',\n SEPOLIA: '0xaa36a7',\n LINEA_GOERLI: '0xe704',\n LINEA_SEPOLIA: '0xe705',\n LINEA_MAINNET: '0xe708',\n MOONBEAM: '0x504',\n MOONBEAM_TESTNET: '0x507',\n MOONRIVER: '0x505',\n GNOSIS: '0x64',\n ARBITRUM: '0xa4b1',\n ZKSYNC_ERA: '0x144',\n ZORA: '0x76adf1',\n} as const;\n\nexport const DEFAULT_ETHERSCAN_DOMAIN = 'etherscan.io';\nexport const DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX = 'api';\n\nexport const ETHERSCAN_SUPPORTED_NETWORKS = {\n [CHAIN_IDS.GOERLI]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-goerli`,\n },\n [CHAIN_IDS.MAINNET]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.SEPOLIA]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia`,\n },\n [CHAIN_IDS.LINEA_GOERLI]: {\n domain: 'lineascan.build',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-goerli`,\n },\n [CHAIN_IDS.LINEA_SEPOLIA]: {\n domain: 'lineascan.build',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia`,\n },\n [CHAIN_IDS.LINEA_MAINNET]: {\n domain: 'lineascan.build',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.BSC]: {\n domain: 'bscscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.BSC_TESTNET]: {\n domain: 'bscscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.OPTIMISM]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-optimistic`,\n },\n [CHAIN_IDS.OPTIMISM_SEPOLIA]: {\n domain: DEFAULT_ETHERSCAN_DOMAIN,\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-sepolia-optimistic`,\n },\n [CHAIN_IDS.POLYGON]: {\n domain: 'polygonscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.POLYGON_TESTNET]: {\n domain: 'polygonscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-mumbai`,\n },\n [CHAIN_IDS.AVALANCHE]: {\n domain: 'snowtrace.io',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.AVALANCHE_TESTNET]: {\n domain: 'snowtrace.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.FANTOM]: {\n domain: 'ftmscan.com',\n subdomain: DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX,\n },\n [CHAIN_IDS.FANTOM_TESTNET]: {\n domain: 'ftmscan.com',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-testnet`,\n },\n [CHAIN_IDS.MOONBEAM]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbeam`,\n },\n [CHAIN_IDS.MOONBEAM_TESTNET]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonbase`,\n },\n [CHAIN_IDS.MOONRIVER]: {\n domain: 'moonscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-moonriver`,\n },\n [CHAIN_IDS.GNOSIS]: {\n domain: 'gnosisscan.io',\n subdomain: `${DEFAULT_ETHERSCAN_SUBDOMAIN_PREFIX}-gnosis`,\n },\n};\n\nexport const GAS_BUFFER_CHAIN_OVERRIDES = {\n [CHAIN_IDS.OPTIMISM]: 1,\n [CHAIN_IDS.OPTIMISM_SEPOLIA]: 1,\n};\n\n/** Extract of the Wrapped ERC-20 ABI required for simulation. */\nexport const ABI_SIMULATION_ERC20_WRAPPED = [\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: 'to', type: 'address' },\n { indexed: false, name: 'wad', type: 'uint256' },\n ],\n name: 'Deposit',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: 'from', type: 'address' },\n { indexed: false, name: 'wad', type: 'uint256' },\n ],\n name: 'Withdrawal',\n type: 'event',\n },\n];\n\n/** Extract of the legacy ERC-721 ABI required for simulation. */\nexport const ABI_SIMULATION_ERC721_LEGACY = [\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n name: '_from',\n type: 'address',\n },\n {\n indexed: false,\n name: '_to',\n type: 'address',\n },\n {\n indexed: false,\n name: '_tokenId',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n];\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CHAIN_IDS
|
|
3
|
+
} from "./chunk-4VLQV2GA.mjs";
|
|
4
|
+
import {
|
|
5
|
+
projectLogger
|
|
6
|
+
} from "./chunk-UQQWZT6C.mjs";
|
|
7
|
+
import {
|
|
8
|
+
__privateAdd,
|
|
9
|
+
__privateMethod
|
|
10
|
+
} from "./chunk-XUI43LEZ.mjs";
|
|
11
|
+
|
|
12
|
+
// src/gas-flows/OptimismLayer1GasFeeFlow.ts
|
|
13
|
+
import { Common, Hardfork } from "@ethereumjs/common";
|
|
14
|
+
import { TransactionFactory } from "@ethereumjs/tx";
|
|
15
|
+
import { Contract } from "@ethersproject/contracts";
|
|
16
|
+
import { Web3Provider } from "@ethersproject/providers";
|
|
17
|
+
import { createModuleLogger, remove0x } from "@metamask/utils";
|
|
18
|
+
import BN from "bn.js";
|
|
19
|
+
import { omit } from "lodash";
|
|
20
|
+
var OPTIMISM_STACK_CHAIN_IDS = [
|
|
21
|
+
CHAIN_IDS.OPTIMISM,
|
|
22
|
+
CHAIN_IDS.OPTIMISM_TESTNET,
|
|
23
|
+
CHAIN_IDS.BASE,
|
|
24
|
+
CHAIN_IDS.BASE_TESTNET,
|
|
25
|
+
CHAIN_IDS.OPBNB,
|
|
26
|
+
CHAIN_IDS.OPBNB_TESTNET,
|
|
27
|
+
CHAIN_IDS.ZORA
|
|
28
|
+
];
|
|
29
|
+
var log = createModuleLogger(projectLogger, "optimisim-layer1-gas-fee-flow");
|
|
30
|
+
var OPTIMISM_GAS_PRICE_ORACLE_ABI = [
|
|
31
|
+
{
|
|
32
|
+
inputs: [{ internalType: "bytes", name: "_data", type: "bytes" }],
|
|
33
|
+
name: "getL1Fee",
|
|
34
|
+
outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
|
|
35
|
+
stateMutability: "view",
|
|
36
|
+
type: "function"
|
|
37
|
+
}
|
|
38
|
+
];
|
|
39
|
+
var OPTIMISM_GAS_PRICE_ORACLE_ADDRESS = "0x420000000000000000000000000000000000000F";
|
|
40
|
+
var _getOptimisimLayer1GasFee, getOptimisimLayer1GasFee_fn, _buildUnserializedTransaction, buildUnserializedTransaction_fn, _buildTransactionParams, buildTransactionParams_fn, _buildTransactionCommon, buildTransactionCommon_fn;
|
|
41
|
+
var OptimismLayer1GasFeeFlow = class {
|
|
42
|
+
constructor() {
|
|
43
|
+
__privateAdd(this, _getOptimisimLayer1GasFee);
|
|
44
|
+
/**
|
|
45
|
+
* Build an unserialized transaction for a transaction.
|
|
46
|
+
*
|
|
47
|
+
* @param transactionMeta - The transaction to build an unserialized transaction for.
|
|
48
|
+
* @returns The unserialized transaction.
|
|
49
|
+
*/
|
|
50
|
+
__privateAdd(this, _buildUnserializedTransaction);
|
|
51
|
+
/**
|
|
52
|
+
* Build transactionParams to be used in the unserialized transaction.
|
|
53
|
+
*
|
|
54
|
+
* @param transactionMeta - The transaction to build transactionParams.
|
|
55
|
+
* @returns The transactionParams for the unserialized transaction.
|
|
56
|
+
*/
|
|
57
|
+
__privateAdd(this, _buildTransactionParams);
|
|
58
|
+
/**
|
|
59
|
+
* This produces a transaction whose information does not completely match an
|
|
60
|
+
* Optimism transaction — for instance, DEFAULT_CHAIN is still 'mainnet' and
|
|
61
|
+
* genesis points to the mainnet genesis, not the Optimism genesis — but
|
|
62
|
+
* considering that all we want to do is serialize a transaction, this works
|
|
63
|
+
* fine for our use case.
|
|
64
|
+
*
|
|
65
|
+
* @param transactionMeta - The transaction to build an unserialized transaction for.
|
|
66
|
+
* @returns The unserialized transaction.
|
|
67
|
+
*/
|
|
68
|
+
__privateAdd(this, _buildTransactionCommon);
|
|
69
|
+
}
|
|
70
|
+
matchesTransaction(transactionMeta) {
|
|
71
|
+
return OPTIMISM_STACK_CHAIN_IDS.includes(transactionMeta.chainId);
|
|
72
|
+
}
|
|
73
|
+
async getLayer1Fee(request) {
|
|
74
|
+
try {
|
|
75
|
+
return await __privateMethod(this, _getOptimisimLayer1GasFee, getOptimisimLayer1GasFee_fn).call(this, request);
|
|
76
|
+
} catch (error) {
|
|
77
|
+
log("Failed to get Optimism layer 1 gas fee due to error", error);
|
|
78
|
+
throw new Error(`Failed to get Optimism layer 1 gas fee`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
_getOptimisimLayer1GasFee = new WeakSet();
|
|
83
|
+
getOptimisimLayer1GasFee_fn = async function(request) {
|
|
84
|
+
const { provider, transactionMeta } = request;
|
|
85
|
+
const contract = new Contract(
|
|
86
|
+
OPTIMISM_GAS_PRICE_ORACLE_ADDRESS,
|
|
87
|
+
OPTIMISM_GAS_PRICE_ORACLE_ABI,
|
|
88
|
+
// Network controller provider type is uncompatible with ethers provider
|
|
89
|
+
new Web3Provider(provider)
|
|
90
|
+
);
|
|
91
|
+
const serializedTransaction = __privateMethod(this, _buildUnserializedTransaction, buildUnserializedTransaction_fn).call(this, transactionMeta).serialize();
|
|
92
|
+
const result = await contract.getL1Fee(serializedTransaction);
|
|
93
|
+
if (result === void 0) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
"Failed to retrieve layer 1 gas fee from Optimism Gas Price Oracle."
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
layer1Fee: result.toHexString()
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
_buildUnserializedTransaction = new WeakSet();
|
|
103
|
+
buildUnserializedTransaction_fn = function(transactionMeta) {
|
|
104
|
+
const txParams = __privateMethod(this, _buildTransactionParams, buildTransactionParams_fn).call(this, transactionMeta);
|
|
105
|
+
const common = __privateMethod(this, _buildTransactionCommon, buildTransactionCommon_fn).call(this, transactionMeta);
|
|
106
|
+
return TransactionFactory.fromTxData(txParams, { common });
|
|
107
|
+
};
|
|
108
|
+
_buildTransactionParams = new WeakSet();
|
|
109
|
+
buildTransactionParams_fn = function(transactionMeta) {
|
|
110
|
+
return {
|
|
111
|
+
...omit(transactionMeta.txParams, "gas"),
|
|
112
|
+
gasLimit: transactionMeta.txParams.gas
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
_buildTransactionCommon = new WeakSet();
|
|
116
|
+
buildTransactionCommon_fn = function(transactionMeta) {
|
|
117
|
+
return Common.custom({
|
|
118
|
+
chainId: new BN(
|
|
119
|
+
remove0x(transactionMeta.chainId),
|
|
120
|
+
16
|
|
121
|
+
),
|
|
122
|
+
// Optimism only supports type-0 transactions; it does not support any of
|
|
123
|
+
// the newer EIPs since EIP-155. Source:
|
|
124
|
+
// <https://github.com/ethereum-optimism/optimism/blob/develop/specs/l2geth/transaction-types.md>
|
|
125
|
+
defaultHardfork: Hardfork.London
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export {
|
|
130
|
+
OptimismLayer1GasFeeFlow
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=chunk-53IYIDVS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gas-flows/OptimismLayer1GasFeeFlow.ts"],"sourcesContent":["import { Common, Hardfork } from '@ethereumjs/common';\nimport { TransactionFactory } from '@ethereumjs/tx';\nimport { Contract } from '@ethersproject/contracts';\nimport { Web3Provider, type ExternalProvider } from '@ethersproject/providers';\nimport { createModuleLogger, type Hex, remove0x } from '@metamask/utils';\nimport BN from 'bn.js';\nimport { omit } from 'lodash';\n\nimport { CHAIN_IDS } from '../constants';\nimport { projectLogger } from '../logger';\nimport type {\n Layer1GasFeeFlow,\n Layer1GasFeeFlowRequest,\n Layer1GasFeeFlowResponse,\n TransactionMeta,\n} from '../types';\n\n// This gas flow to be used for the following OP stack chains\nconst OPTIMISM_STACK_CHAIN_IDS: Hex[] = [\n CHAIN_IDS.OPTIMISM,\n CHAIN_IDS.OPTIMISM_TESTNET,\n CHAIN_IDS.BASE,\n CHAIN_IDS.BASE_TESTNET,\n CHAIN_IDS.OPBNB,\n CHAIN_IDS.OPBNB_TESTNET,\n CHAIN_IDS.ZORA,\n];\n\nconst log = createModuleLogger(projectLogger, 'optimisim-layer1-gas-fee-flow');\n\n// Snippet of the ABI that we need\n// Should we need more of it at some point, the full ABI can be found here:\n// https://github.com/ethereum-optimism/optimism/blob/develop/gas-oracle/abis/OVM_GasPriceOracle.json\nconst OPTIMISM_GAS_PRICE_ORACLE_ABI = [\n {\n inputs: [{ internalType: 'bytes', name: '_data', type: 'bytes' }],\n name: 'getL1Fee',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n];\n\n// BlockExplorer link: https://optimistic.etherscan.io/address/0x420000000000000000000000000000000000000f#code\nconst OPTIMISM_GAS_PRICE_ORACLE_ADDRESS =\n '0x420000000000000000000000000000000000000F';\n\n/**\n * Optimism layer 1 gas fee flow that obtains gas fee estimate using Optimisim oracle contract.\n */\nexport class OptimismLayer1GasFeeFlow implements Layer1GasFeeFlow {\n matchesTransaction(transactionMeta: TransactionMeta): boolean {\n return OPTIMISM_STACK_CHAIN_IDS.includes(transactionMeta.chainId);\n }\n\n async getLayer1Fee(\n request: Layer1GasFeeFlowRequest,\n ): Promise<Layer1GasFeeFlowResponse> {\n try {\n return await this.#getOptimisimLayer1GasFee(request);\n } catch (error) {\n log('Failed to get Optimism layer 1 gas fee due to error', error);\n throw new Error(`Failed to get Optimism layer 1 gas fee`);\n }\n }\n\n async #getOptimisimLayer1GasFee(\n request: Layer1GasFeeFlowRequest,\n ): Promise<Layer1GasFeeFlowResponse> {\n const { provider, transactionMeta } = request;\n\n const contract = new Contract(\n OPTIMISM_GAS_PRICE_ORACLE_ADDRESS,\n OPTIMISM_GAS_PRICE_ORACLE_ABI,\n // Network controller provider type is uncompatible with ethers provider\n new Web3Provider(provider as unknown as ExternalProvider),\n );\n\n const serializedTransaction =\n this.#buildUnserializedTransaction(transactionMeta).serialize();\n\n const result = await contract.getL1Fee(serializedTransaction);\n\n if (result === undefined) {\n throw new Error(\n 'Failed to retrieve layer 1 gas fee from Optimism Gas Price Oracle.',\n );\n }\n\n return {\n layer1Fee: result.toHexString(),\n };\n }\n\n /**\n * Build an unserialized transaction for a transaction.\n *\n * @param transactionMeta - The transaction to build an unserialized transaction for.\n * @returns The unserialized transaction.\n */\n #buildUnserializedTransaction(transactionMeta: TransactionMeta) {\n const txParams = this.#buildTransactionParams(transactionMeta);\n const common = this.#buildTransactionCommon(transactionMeta);\n return TransactionFactory.fromTxData(txParams, { common });\n }\n\n /**\n * Build transactionParams to be used in the unserialized transaction.\n *\n * @param transactionMeta - The transaction to build transactionParams.\n * @returns The transactionParams for the unserialized transaction.\n */\n #buildTransactionParams(\n transactionMeta: TransactionMeta,\n ): TransactionMeta['txParams'] {\n return {\n ...omit(transactionMeta.txParams, 'gas'),\n gasLimit: transactionMeta.txParams.gas,\n };\n }\n\n /**\n * This produces a transaction whose information does not completely match an\n * Optimism transaction — for instance, DEFAULT_CHAIN is still 'mainnet' and\n * genesis points to the mainnet genesis, not the Optimism genesis — but\n * considering that all we want to do is serialize a transaction, this works\n * fine for our use case.\n *\n * @param transactionMeta - The transaction to build an unserialized transaction for.\n * @returns The unserialized transaction.\n */\n #buildTransactionCommon(transactionMeta: TransactionMeta) {\n return Common.custom({\n chainId: new BN(\n remove0x(transactionMeta.chainId),\n 16,\n ) as unknown as number,\n // Optimism only supports type-0 transactions; it does not support any of\n // the newer EIPs since EIP-155. Source:\n // <https://github.com/ethereum-optimism/optimism/blob/develop/specs/l2geth/transaction-types.md>\n defaultHardfork: Hardfork.London,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,QAAQ,gBAAgB;AACjC,SAAS,0BAA0B;AACnC,SAAS,gBAAgB;AACzB,SAAS,oBAA2C;AACpD,SAAS,oBAA8B,gBAAgB;AACvD,OAAO,QAAQ;AACf,SAAS,YAAY;AAYrB,IAAM,2BAAkC;AAAA,EACtC,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AACZ;AAEA,IAAM,MAAM,mBAAmB,eAAe,+BAA+B;AAK7E,IAAM,gCAAgC;AAAA,EACpC;AAAA,IACE,QAAQ,CAAC,EAAE,cAAc,SAAS,MAAM,SAAS,MAAM,QAAQ,CAAC;AAAA,IAChE,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AACF;AAGA,IAAM,oCACJ;AA7CF;AAkDO,IAAM,2BAAN,MAA2D;AAAA,EAA3D;AAgBL,uBAAM;AAkCN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAhFA,mBAAmB,iBAA2C;AAC5D,WAAO,yBAAyB,SAAS,gBAAgB,OAAO;AAAA,EAClE;AAAA,EAEA,MAAM,aACJ,SACmC;AACnC,QAAI;AACF,aAAO,MAAM,sBAAK,wDAAL,WAA+B;AAAA,IAC9C,SAAS,OAAO;AACd,UAAI,uDAAuD,KAAK;AAChE,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAAA,EACF;AA+EF;AA7EQ;AAAA,8BAAyB,eAC7B,SACmC;AACnC,QAAM,EAAE,UAAU,gBAAgB,IAAI;AAEtC,QAAM,WAAW,IAAI;AAAA,IACnB;AAAA,IACA;AAAA;AAAA,IAEA,IAAI,aAAa,QAAuC;AAAA,EAC1D;AAEA,QAAM,wBACJ,sBAAK,gEAAL,WAAmC,iBAAiB,UAAU;AAEhE,QAAM,SAAS,MAAM,SAAS,SAAS,qBAAqB;AAE5D,MAAI,WAAW,QAAW;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW,OAAO,YAAY;AAAA,EAChC;AACF;AAQA;AAAA,kCAA6B,SAAC,iBAAkC;AAC9D,QAAM,WAAW,sBAAK,oDAAL,WAA6B;AAC9C,QAAM,SAAS,sBAAK,oDAAL,WAA6B;AAC5C,SAAO,mBAAmB,WAAW,UAAU,EAAE,OAAO,CAAC;AAC3D;AAQA;AAAA,4BAAuB,SACrB,iBAC6B;AAC7B,SAAO;AAAA,IACL,GAAG,KAAK,gBAAgB,UAAU,KAAK;AAAA,IACvC,UAAU,gBAAgB,SAAS;AAAA,EACrC;AACF;AAYA;AAAA,4BAAuB,SAAC,iBAAkC;AACxD,SAAO,OAAO,OAAO;AAAA,IACnB,SAAS,IAAI;AAAA,MACX,SAAS,gBAAgB,OAAO;AAAA,MAChC;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAIA,iBAAiB,SAAS;AAAA,EAC5B,CAAC;AACH;","names":[]}
|
|
@@ -89,7 +89,7 @@ var PendingTransactionTracker = class {
|
|
|
89
89
|
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _getChainId, getChainId);
|
|
90
90
|
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _getEthQuery, getEthQuery);
|
|
91
91
|
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _getTransactions, getTransactions);
|
|
92
|
-
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _isResubmitEnabled, isResubmitEnabled ?? true);
|
|
92
|
+
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _isResubmitEnabled, isResubmitEnabled ?? (() => true));
|
|
93
93
|
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _listener, _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _onLatestBlock, onLatestBlock_fn).bind(this));
|
|
94
94
|
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _getGlobalLock, getGlobalLock);
|
|
95
95
|
_chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _publishTransaction, publishTransaction);
|
|
@@ -177,7 +177,7 @@ checkTransactions_fn = async function() {
|
|
|
177
177
|
};
|
|
178
178
|
_resubmitTransactions = new WeakSet();
|
|
179
179
|
resubmitTransactions_fn = async function(latestBlockNumber) {
|
|
180
|
-
if (!_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _isResubmitEnabled) || !_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _running)) {
|
|
180
|
+
if (!_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _isResubmitEnabled).call(this) || !_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _running)) {
|
|
181
181
|
return;
|
|
182
182
|
}
|
|
183
183
|
log("Resubmitting transactions");
|
|
@@ -396,4 +396,4 @@ getCurrentChainTransactions_fn = function() {
|
|
|
396
396
|
|
|
397
397
|
|
|
398
398
|
exports.PendingTransactionTracker = PendingTransactionTracker;
|
|
399
|
-
//# sourceMappingURL=chunk-
|
|
399
|
+
//# sourceMappingURL=chunk-5KMU2IAT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/helpers/PendingTransactionTracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { query } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type {\n BlockTracker,\n NetworkClientId,\n} from '@metamask/network-controller';\nimport EventEmitter from 'events';\nimport { cloneDeep, merge } from 'lodash';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { TransactionMeta, TransactionReceipt } from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\n\n/**\n * We wait this many blocks before emitting a 'transaction-dropped' event\n * This is because we could be talking to a node that is out of sync\n */\nconst DROPPED_BLOCK_COUNT = 3;\n\nconst RECEIPT_STATUS_SUCCESS = '0x1';\nconst RECEIPT_STATUS_FAILURE = '0x0';\nconst MAX_RETRY_BLOCK_DISTANCE = 50;\n\nconst KNOWN_TRANSACTION_ERRORS = [\n 'replacement transaction underpriced',\n 'known transaction',\n 'gas price too low to replace',\n 'transaction with the same hash was already imported',\n 'gateway timeout',\n 'nonce too low',\n];\n\nconst log = createModuleLogger(projectLogger, 'pending-transactions');\n\ntype SuccessfulTransactionReceipt = TransactionReceipt & {\n blockNumber: string;\n blockHash: string;\n};\n\ntype Events = {\n 'transaction-confirmed': [txMeta: TransactionMeta];\n 'transaction-dropped': [txMeta: TransactionMeta];\n 'transaction-failed': [txMeta: TransactionMeta, error: Error];\n 'transaction-updated': [txMeta: TransactionMeta, note: string];\n};\n\n// This interface was created before this ESLint rule was added.\n// Convert to a `type` in a future major version.\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport interface PendingTransactionTrackerEventEmitter extends EventEmitter {\n on<T extends keyof Events>(\n eventName: T,\n listener: (...args: Events[T]) => void,\n ): this;\n\n emit<T extends keyof Events>(eventName: T, ...args: Events[T]): boolean;\n}\n\nexport class PendingTransactionTracker {\n hub: PendingTransactionTrackerEventEmitter;\n\n #approveTransaction: (transactionId: string) => Promise<void>;\n\n #blockTracker: BlockTracker;\n\n #droppedBlockCountByHash: Map<string, number>;\n\n #getChainId: () => string;\n\n #getEthQuery: (networkClientId?: NetworkClientId) => EthQuery;\n\n #getTransactions: () => TransactionMeta[];\n\n #isResubmitEnabled: () => boolean;\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n #listener: any;\n\n #getGlobalLock: () => Promise<() => void>;\n\n #publishTransaction: (ethQuery: EthQuery, rawTx: string) => Promise<string>;\n\n #running: boolean;\n\n #beforeCheckPendingTransaction: (transactionMeta: TransactionMeta) => boolean;\n\n #beforePublish: (transactionMeta: TransactionMeta) => boolean;\n\n constructor({\n approveTransaction,\n blockTracker,\n getChainId,\n getEthQuery,\n getTransactions,\n isResubmitEnabled,\n getGlobalLock,\n publishTransaction,\n hooks,\n }: {\n approveTransaction: (transactionId: string) => Promise<void>;\n blockTracker: BlockTracker;\n getChainId: () => string;\n getEthQuery: (networkClientId?: NetworkClientId) => EthQuery;\n getTransactions: () => TransactionMeta[];\n isResubmitEnabled?: () => boolean;\n getGlobalLock: () => Promise<() => void>;\n publishTransaction: (ethQuery: EthQuery, rawTx: string) => Promise<string>;\n hooks?: {\n beforeCheckPendingTransaction?: (\n transactionMeta: TransactionMeta,\n ) => boolean;\n beforePublish?: (transactionMeta: TransactionMeta) => boolean;\n };\n }) {\n this.hub = new EventEmitter() as PendingTransactionTrackerEventEmitter;\n\n this.#approveTransaction = approveTransaction;\n this.#blockTracker = blockTracker;\n this.#droppedBlockCountByHash = new Map();\n this.#getChainId = getChainId;\n this.#getEthQuery = getEthQuery;\n this.#getTransactions = getTransactions;\n this.#isResubmitEnabled = isResubmitEnabled ?? (() => true);\n this.#listener = this.#onLatestBlock.bind(this);\n this.#getGlobalLock = getGlobalLock;\n this.#publishTransaction = publishTransaction;\n this.#running = false;\n this.#beforePublish = hooks?.beforePublish ?? (() => true);\n this.#beforeCheckPendingTransaction =\n hooks?.beforeCheckPendingTransaction ?? (() => true);\n }\n\n startIfPendingTransactions = () => {\n const pendingTransactions = this.#getPendingTransactions();\n\n if (pendingTransactions.length) {\n this.#start();\n } else {\n this.stop();\n }\n };\n\n /**\n * Force checks the network if the given transaction is confirmed and updates it's status.\n *\n * @param txMeta - The transaction to check\n */\n async forceCheckTransaction(txMeta: TransactionMeta) {\n const releaseLock = await this.#getGlobalLock();\n\n try {\n await this.#checkTransaction(txMeta);\n } catch (error) {\n /* istanbul ignore next */\n log('Failed to check transaction', error);\n } finally {\n releaseLock();\n }\n }\n\n #start() {\n if (this.#running) {\n return;\n }\n\n this.#blockTracker.on('latest', this.#listener);\n this.#running = true;\n\n log('Started polling');\n }\n\n stop() {\n if (!this.#running) {\n return;\n }\n\n this.#blockTracker.removeListener('latest', this.#listener);\n this.#running = false;\n\n log('Stopped polling');\n }\n\n async #onLatestBlock(latestBlockNumber: string) {\n const releaseLock = await this.#getGlobalLock();\n\n try {\n await this.#checkTransactions();\n } catch (error) {\n /* istanbul ignore next */\n log('Failed to check transactions', error);\n } finally {\n releaseLock();\n }\n\n try {\n await this.#resubmitTransactions(latestBlockNumber);\n } catch (error) {\n /* istanbul ignore next */\n log('Failed to resubmit transactions', error);\n }\n }\n\n async #checkTransactions() {\n log('Checking transactions');\n\n const pendingTransactions = this.#getPendingTransactions();\n\n if (!pendingTransactions.length) {\n log('No pending transactions to check');\n return;\n }\n\n log('Found pending transactions to check', {\n count: pendingTransactions.length,\n ids: pendingTransactions.map((tx) => tx.id),\n });\n\n await Promise.all(\n pendingTransactions.map((tx) => this.#checkTransaction(tx)),\n );\n }\n\n async #resubmitTransactions(latestBlockNumber: string) {\n if (!this.#isResubmitEnabled() || !this.#running) {\n return;\n }\n\n log('Resubmitting transactions');\n\n const pendingTransactions = this.#getPendingTransactions();\n\n if (!pendingTransactions.length) {\n log('No pending transactions to resubmit');\n return;\n }\n\n log('Found pending transactions to resubmit', {\n count: pendingTransactions.length,\n ids: pendingTransactions.map((tx) => tx.id),\n });\n\n for (const txMeta of pendingTransactions) {\n try {\n await this.#resubmitTransaction(txMeta, latestBlockNumber);\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n /* istanbul ignore next */\n const errorMessage =\n error.value?.message?.toLowerCase() || error.message.toLowerCase();\n\n if (this.#isKnownTransactionError(errorMessage)) {\n log('Ignoring known transaction error', errorMessage);\n return;\n }\n\n this.#warnTransaction(\n txMeta,\n error.message,\n 'There was an error when resubmitting this transaction.',\n );\n }\n }\n }\n\n #isKnownTransactionError(errorMessage: string) {\n return KNOWN_TRANSACTION_ERRORS.some((knownError) =>\n errorMessage.includes(knownError),\n );\n }\n\n async #resubmitTransaction(\n txMeta: TransactionMeta,\n latestBlockNumber: string,\n ) {\n if (!this.#isResubmitDue(txMeta, latestBlockNumber)) {\n return;\n }\n\n const { rawTx } = txMeta;\n\n if (!this.#beforePublish(txMeta)) {\n return;\n }\n\n if (!rawTx?.length) {\n log('Approving transaction as no raw value');\n await this.#approveTransaction(txMeta.id);\n return;\n }\n\n const ethQuery = this.#getEthQuery(txMeta.networkClientId);\n await this.#publishTransaction(ethQuery, rawTx);\n\n const retryCount = (txMeta.retryCount ?? 0) + 1;\n\n this.#updateTransaction(\n merge({}, txMeta, { retryCount }),\n 'PendingTransactionTracker:transaction-retry - Retry count increased',\n );\n }\n\n #isResubmitDue(txMeta: TransactionMeta, latestBlockNumber: string): boolean {\n const txMetaWithFirstRetryBlockNumber = cloneDeep(txMeta);\n\n if (!txMetaWithFirstRetryBlockNumber.firstRetryBlockNumber) {\n txMetaWithFirstRetryBlockNumber.firstRetryBlockNumber = latestBlockNumber;\n\n this.#updateTransaction(\n txMetaWithFirstRetryBlockNumber,\n 'PendingTransactionTracker:#isResubmitDue - First retry block number set',\n );\n }\n\n const { firstRetryBlockNumber } = txMetaWithFirstRetryBlockNumber;\n\n const blocksSinceFirstRetry =\n Number.parseInt(latestBlockNumber, 16) -\n Number.parseInt(firstRetryBlockNumber, 16);\n\n const retryCount = txMeta.retryCount || 0;\n\n // Exponential backoff to limit retries at publishing\n // Capped at ~15 minutes between retries\n const requiredBlocksSinceFirstRetry = Math.min(\n MAX_RETRY_BLOCK_DISTANCE,\n Math.pow(2, retryCount),\n );\n\n return blocksSinceFirstRetry >= requiredBlocksSinceFirstRetry;\n }\n\n async #checkTransaction(txMeta: TransactionMeta) {\n const { hash, id } = txMeta;\n\n if (!hash && this.#beforeCheckPendingTransaction(txMeta)) {\n const error = new Error(\n 'We had an error while submitting this transaction, please try again.',\n );\n\n error.name = 'NoTxHashError';\n\n this.#failTransaction(txMeta, error);\n\n return;\n }\n\n if (this.#isNonceTaken(txMeta)) {\n log('Nonce already taken', id);\n this.#dropTransaction(txMeta);\n return;\n }\n\n try {\n const receipt = await this.#getTransactionReceipt(hash);\n const isSuccess = receipt?.status === RECEIPT_STATUS_SUCCESS;\n const isFailure = receipt?.status === RECEIPT_STATUS_FAILURE;\n\n if (isFailure) {\n log('Transaction receipt has failed status');\n\n this.#failTransaction(\n txMeta,\n new Error('Transaction dropped or replaced'),\n );\n\n return;\n }\n\n const { blockNumber, blockHash } = receipt || {};\n\n if (isSuccess && blockNumber && blockHash) {\n await this.#onTransactionConfirmed(txMeta, {\n ...receipt,\n blockNumber,\n blockHash,\n });\n\n return;\n }\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n log('Failed to check transaction', id, error);\n\n this.#warnTransaction(\n txMeta,\n error.message,\n 'There was a problem loading this transaction.',\n );\n\n return;\n }\n\n if (await this.#isTransactionDropped(txMeta)) {\n this.#dropTransaction(txMeta);\n }\n }\n\n async #onTransactionConfirmed(\n txMeta: TransactionMeta,\n receipt: SuccessfulTransactionReceipt,\n ) {\n const { id } = txMeta;\n const { blockHash } = receipt;\n\n log('Transaction confirmed', id);\n\n const { baseFeePerGas, timestamp: blockTimestamp } =\n await this.#getBlockByHash(blockHash, false);\n\n const updatedTxMeta = cloneDeep(txMeta);\n updatedTxMeta.baseFeePerGas = baseFeePerGas;\n updatedTxMeta.blockTimestamp = blockTimestamp;\n updatedTxMeta.status = TransactionStatus.confirmed;\n updatedTxMeta.txParams = {\n ...updatedTxMeta.txParams,\n gasUsed: receipt.gasUsed,\n };\n updatedTxMeta.txReceipt = receipt;\n updatedTxMeta.verifiedOnBlockchain = true;\n\n this.#updateTransaction(\n updatedTxMeta,\n 'PendingTransactionTracker:#onTransactionConfirmed - Transaction confirmed',\n );\n\n this.hub.emit('transaction-confirmed', updatedTxMeta);\n }\n\n async #isTransactionDropped(txMeta: TransactionMeta) {\n const {\n hash,\n id,\n txParams: { nonce, from },\n } = txMeta;\n\n /* istanbul ignore next */\n if (!nonce || !hash) {\n return false;\n }\n\n const networkNextNonceHex = await this.#getNetworkTransactionCount(from);\n const networkNextNonceNumber = parseInt(networkNextNonceHex, 16);\n const nonceNumber = parseInt(nonce, 16);\n\n if (nonceNumber >= networkNextNonceNumber) {\n return false;\n }\n\n let droppedBlockCount = this.#droppedBlockCountByHash.get(hash);\n\n if (droppedBlockCount === undefined) {\n droppedBlockCount = 0;\n this.#droppedBlockCountByHash.set(hash, droppedBlockCount);\n }\n\n if (droppedBlockCount < DROPPED_BLOCK_COUNT) {\n log('Incrementing dropped block count', { id, droppedBlockCount });\n this.#droppedBlockCountByHash.set(hash, droppedBlockCount + 1);\n return false;\n }\n\n log('Hit dropped block count', id);\n\n this.#droppedBlockCountByHash.delete(hash);\n return true;\n }\n\n #isNonceTaken(txMeta: TransactionMeta): boolean {\n const { id, txParams } = txMeta;\n\n return this.#getCurrentChainTransactions().some(\n (tx) =>\n tx.id !== id &&\n tx.txParams.from === txParams.from &&\n tx.status === TransactionStatus.confirmed &&\n tx.txParams.nonce === txParams.nonce &&\n tx.type !== TransactionType.incoming,\n );\n }\n\n #getPendingTransactions(): TransactionMeta[] {\n return this.#getCurrentChainTransactions().filter(\n (tx) =>\n tx.status === TransactionStatus.submitted &&\n !tx.verifiedOnBlockchain &&\n !tx.isUserOperation,\n );\n }\n\n #warnTransaction(txMeta: TransactionMeta, error: string, message: string) {\n this.#updateTransaction(\n {\n ...txMeta,\n warning: { error, message },\n },\n 'PendingTransactionTracker:#warnTransaction - Warning added',\n );\n }\n\n #failTransaction(txMeta: TransactionMeta, error: Error) {\n log('Transaction failed', txMeta.id, error);\n this.hub.emit('transaction-failed', txMeta, error);\n }\n\n #dropTransaction(txMeta: TransactionMeta) {\n log('Transaction dropped', txMeta.id);\n this.hub.emit('transaction-dropped', txMeta);\n }\n\n #updateTransaction(txMeta: TransactionMeta, note: string) {\n this.hub.emit('transaction-updated', txMeta, note);\n }\n\n async #getTransactionReceipt(\n txHash?: string,\n ): Promise<TransactionReceipt | undefined> {\n return await query(this.#getEthQuery(), 'getTransactionReceipt', [txHash]);\n }\n\n async #getBlockByHash(\n blockHash: string,\n includeTransactionDetails: boolean,\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<any> {\n return await query(this.#getEthQuery(), 'getBlockByHash', [\n blockHash,\n includeTransactionDetails,\n ]);\n }\n\n async #getNetworkTransactionCount(address: string): Promise<string> {\n return await query(this.#getEthQuery(), 'getTransactionCount', [address]);\n }\n\n #getCurrentChainTransactions(): TransactionMeta[] {\n const currentChainId = this.#getChainId();\n\n return this.#getTransactions().filter(\n (tx) => tx.chainId === currentChainId,\n );\n }\n}\n"]}
|