@metamask/transaction-controller 36.1.0 → 37.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +47 -1
- package/dist/TransactionController.cjs +2071 -0
- package/dist/TransactionController.cjs.map +1 -0
- package/dist/{types/TransactionController.d.ts → TransactionController.d.cts} +19 -26
- package/dist/TransactionController.d.cts.map +1 -0
- package/dist/TransactionController.d.mts +828 -0
- package/dist/TransactionController.d.mts.map +1 -0
- package/dist/TransactionController.mjs +2072 -44
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/constants.cjs +170 -0
- package/dist/constants.cjs.map +1 -0
- package/dist/{types/constants.d.ts → constants.d.cts} +1 -1
- package/dist/constants.d.cts.map +1 -0
- package/dist/constants.d.mts +143 -0
- package/dist/constants.d.mts.map +1 -0
- package/dist/constants.mjs +165 -18
- package/dist/constants.mjs.map +1 -1
- package/dist/errors.cjs +30 -0
- package/dist/{chunk-HMOSP33F.js.map → errors.cjs.map} +1 -1
- package/dist/{types/errors.d.ts → errors.d.cts} +2 -2
- package/dist/errors.d.cts.map +1 -0
- package/dist/errors.d.mts +15 -0
- package/dist/errors.d.mts.map +1 -0
- package/dist/errors.mjs +22 -14
- package/dist/errors.mjs.map +1 -1
- package/dist/gas-flows/DefaultGasFeeFlow.cjs +87 -0
- package/dist/gas-flows/DefaultGasFeeFlow.cjs.map +1 -0
- package/dist/{types/gas-flows/DefaultGasFeeFlow.d.ts → gas-flows/DefaultGasFeeFlow.d.cts} +2 -2
- package/dist/gas-flows/DefaultGasFeeFlow.d.cts.map +1 -0
- package/dist/gas-flows/DefaultGasFeeFlow.d.mts +10 -0
- package/dist/gas-flows/DefaultGasFeeFlow.d.mts.map +1 -0
- package/dist/gas-flows/DefaultGasFeeFlow.mjs +81 -13
- package/dist/gas-flows/DefaultGasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/LineaGasFeeFlow.cjs +102 -0
- package/dist/gas-flows/LineaGasFeeFlow.cjs.map +1 -0
- package/dist/{types/gas-flows/LineaGasFeeFlow.d.ts → gas-flows/LineaGasFeeFlow.d.cts} +2 -2
- package/dist/gas-flows/LineaGasFeeFlow.d.cts.map +1 -0
- package/dist/gas-flows/LineaGasFeeFlow.d.mts +12 -0
- package/dist/gas-flows/LineaGasFeeFlow.d.mts.map +1 -0
- package/dist/gas-flows/LineaGasFeeFlow.mjs +96 -14
- package/dist/gas-flows/LineaGasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs +29 -0
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.cjs.map +1 -0
- package/dist/{types/gas-flows/OptimismLayer1GasFeeFlow.d.ts → gas-flows/OptimismLayer1GasFeeFlow.d.cts} +3 -3
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.cts.map +1 -0
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts +10 -0
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.d.mts.map +1 -0
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs +24 -10
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs +92 -0
- package/dist/gas-flows/OracleLayer1GasFeeFlow.cjs.map +1 -0
- package/dist/{types/gas-flows/OracleLayer1GasFeeFlow.d.ts → gas-flows/OracleLayer1GasFeeFlow.d.cts} +3 -3
- package/dist/gas-flows/OracleLayer1GasFeeFlow.d.cts.map +1 -0
- package/dist/gas-flows/OracleLayer1GasFeeFlow.d.mts +12 -0
- package/dist/gas-flows/OracleLayer1GasFeeFlow.d.mts.map +1 -0
- package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs +88 -7
- package/dist/gas-flows/OracleLayer1GasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.cjs +21 -0
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.cjs.map +1 -0
- package/dist/{types/gas-flows/ScrollLayer1GasFeeFlow.d.ts → gas-flows/ScrollLayer1GasFeeFlow.d.cts} +3 -3
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.cts.map +1 -0
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.mts +10 -0
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.d.mts.map +1 -0
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.mjs +16 -10
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.mjs.map +1 -1
- package/dist/gas-flows/TestGasFeeFlow.cjs +73 -0
- package/dist/{chunk-FMRLPVFZ.mjs.map → gas-flows/TestGasFeeFlow.cjs.map} +1 -1
- package/dist/{types/gas-flows/TestGasFeeFlow.d.ts → gas-flows/TestGasFeeFlow.d.cts} +2 -2
- package/dist/gas-flows/TestGasFeeFlow.d.cts.map +1 -0
- package/dist/gas-flows/TestGasFeeFlow.d.mts +12 -0
- package/dist/gas-flows/TestGasFeeFlow.d.mts.map +1 -0
- package/dist/gas-flows/TestGasFeeFlow.mjs +67 -7
- package/dist/gas-flows/TestGasFeeFlow.mjs.map +1 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.cjs +149 -0
- package/dist/helpers/EtherscanRemoteTransactionSource.cjs.map +1 -0
- package/dist/{types/helpers/EtherscanRemoteTransactionSource.d.ts → helpers/EtherscanRemoteTransactionSource.d.cts} +3 -3
- package/dist/helpers/EtherscanRemoteTransactionSource.d.cts.map +1 -0
- package/dist/helpers/EtherscanRemoteTransactionSource.d.mts +15 -0
- package/dist/helpers/EtherscanRemoteTransactionSource.d.mts.map +1 -0
- package/dist/helpers/EtherscanRemoteTransactionSource.mjs +147 -10
- package/dist/helpers/EtherscanRemoteTransactionSource.mjs.map +1 -1
- package/dist/helpers/GasFeePoller.cjs +185 -0
- package/dist/helpers/GasFeePoller.cjs.map +1 -0
- package/dist/{types/helpers/GasFeePoller.d.ts → helpers/GasFeePoller.d.cts} +7 -7
- package/dist/helpers/GasFeePoller.d.cts.map +1 -0
- package/dist/helpers/GasFeePoller.d.mts +35 -0
- package/dist/helpers/GasFeePoller.d.mts.map +1 -0
- package/dist/helpers/GasFeePoller.mjs +183 -10
- package/dist/helpers/GasFeePoller.mjs.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.cjs +199 -0
- package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -0
- package/dist/{types/helpers/IncomingTransactionHelper.d.ts → helpers/IncomingTransactionHelper.d.cts} +6 -6
- package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -0
- package/dist/helpers/IncomingTransactionHelper.d.mts +40 -0
- package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -0
- package/dist/helpers/IncomingTransactionHelper.mjs +190 -7
- package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.cjs +284 -0
- package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -0
- package/dist/{types/helpers/MultichainTrackingHelper.d.ts → helpers/MultichainTrackingHelper.d.cts} +8 -8
- package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -0
- package/dist/helpers/MultichainTrackingHelper.d.mts +76 -0
- package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -0
- package/dist/helpers/MultichainTrackingHelper.mjs +282 -11
- package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.cjs +327 -0
- package/dist/helpers/PendingTransactionTracker.cjs.map +1 -0
- package/dist/{types/helpers/PendingTransactionTracker.d.ts → helpers/PendingTransactionTracker.d.cts} +7 -8
- package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -0
- package/dist/helpers/PendingTransactionTracker.d.mts +42 -0
- package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -0
- package/dist/helpers/PendingTransactionTracker.mjs +319 -8
- package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
- package/dist/index.cjs +32 -0
- package/dist/index.cjs.map +1 -0
- package/dist/{types/index.d.ts → index.d.cts} +11 -10
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +11 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +7 -76
- package/dist/index.mjs.map +1 -1
- package/dist/logger.cjs +9 -0
- package/dist/logger.cjs.map +1 -0
- package/dist/{types/logger.d.ts → logger.d.cts} +2 -2
- package/dist/logger.d.cts.map +1 -0
- package/dist/logger.d.mts +6 -0
- package/dist/logger.d.mts.map +1 -0
- package/dist/logger.mjs +5 -11
- package/dist/logger.mjs.map +1 -1
- package/dist/types.cjs +308 -0
- package/dist/types.cjs.map +1 -0
- package/dist/{types/types.d.ts → types.d.cts} +35 -35
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +1027 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +304 -23
- package/dist/types.mjs.map +1 -1
- package/dist/utils/etherscan.cjs +111 -0
- package/dist/utils/etherscan.cjs.map +1 -0
- package/dist/{types/utils/etherscan.d.ts → utils/etherscan.d.cts} +2 -2
- package/dist/utils/etherscan.d.cts.map +1 -0
- package/dist/utils/etherscan.d.mts +71 -0
- package/dist/utils/etherscan.d.mts.map +1 -0
- package/dist/utils/etherscan.mjs +104 -13
- package/dist/utils/etherscan.mjs.map +1 -1
- package/dist/utils/external-transactions.cjs +36 -0
- package/dist/utils/external-transactions.cjs.map +1 -0
- package/dist/{types/utils/external-transactions.d.ts → utils/external-transactions.d.cts} +2 -2
- package/dist/utils/external-transactions.d.cts.map +1 -0
- package/dist/utils/external-transactions.d.mts +10 -0
- package/dist/utils/external-transactions.d.mts.map +1 -0
- package/dist/utils/external-transactions.mjs +31 -8
- package/dist/utils/external-transactions.mjs.map +1 -1
- package/dist/utils/gas-fees.cjs +208 -0
- package/dist/utils/gas-fees.cjs.map +1 -0
- package/dist/{types/utils/gas-fees.d.ts → utils/gas-fees.d.cts} +5 -5
- package/dist/utils/gas-fees.d.cts.map +1 -0
- package/dist/utils/gas-fees.d.mts +26 -0
- package/dist/utils/gas-fees.d.mts.map +1 -0
- package/dist/utils/gas-fees.mjs +202 -15
- package/dist/utils/gas-fees.mjs.map +1 -1
- package/dist/utils/gas-flow.cjs +76 -0
- package/dist/utils/gas-flow.cjs.map +1 -0
- package/dist/{types/utils/gas-flow.d.ts → utils/gas-flow.d.cts} +5 -5
- package/dist/utils/gas-flow.d.cts.map +1 -0
- package/dist/utils/gas-flow.d.mts +26 -0
- package/dist/utils/gas-flow.d.mts.map +1 -0
- package/dist/utils/gas-flow.mjs +70 -10
- package/dist/utils/gas-flow.mjs.map +1 -1
- package/dist/utils/gas.cjs +112 -0
- package/dist/utils/gas.cjs.map +1 -0
- package/dist/{types/utils/gas.d.ts → utils/gas.d.cts} +4 -4
- package/dist/utils/gas.d.cts.map +1 -0
- package/dist/utils/gas.d.mts +28 -0
- package/dist/utils/gas.d.mts.map +1 -0
- package/dist/utils/gas.mjs +105 -19
- package/dist/utils/gas.mjs.map +1 -1
- package/dist/utils/history.cjs +164 -0
- package/dist/utils/history.cjs.map +1 -0
- package/dist/{types/utils/history.d.ts → utils/history.d.cts} +2 -2
- package/dist/utils/history.d.cts.map +1 -0
- package/dist/utils/history.d.mts +29 -0
- package/dist/utils/history.d.mts.map +1 -0
- package/dist/utils/history.mjs +163 -13
- package/dist/utils/history.mjs.map +1 -1
- package/dist/utils/layer1-gas-fee-flow.cjs +59 -0
- package/dist/utils/layer1-gas-fee-flow.cjs.map +1 -0
- package/dist/{types/utils/layer1-gas-fee-flow.d.ts → utils/layer1-gas-fee-flow.d.cts} +4 -4
- package/dist/utils/layer1-gas-fee-flow.d.cts.map +1 -0
- package/dist/utils/layer1-gas-fee-flow.d.mts +25 -0
- package/dist/utils/layer1-gas-fee-flow.d.mts.map +1 -0
- package/dist/utils/layer1-gas-fee-flow.mjs +53 -10
- package/dist/utils/layer1-gas-fee-flow.mjs.map +1 -1
- package/dist/utils/nonce.cjs +66 -0
- package/dist/utils/nonce.cjs.map +1 -0
- package/dist/{types/utils/nonce.d.ts → utils/nonce.d.cts} +3 -3
- package/dist/utils/nonce.d.cts.map +1 -0
- package/dist/utils/nonce.d.mts +21 -0
- package/dist/utils/nonce.d.mts.map +1 -0
- package/dist/utils/nonce.mjs +60 -10
- package/dist/utils/nonce.mjs.map +1 -1
- package/dist/utils/retry.cjs +89 -0
- package/dist/utils/retry.cjs.map +1 -0
- package/dist/{types/utils/retry.d.ts → utils/retry.d.cts} +3 -3
- package/dist/utils/retry.d.cts.map +1 -0
- package/dist/utils/retry.d.mts +11 -0
- package/dist/utils/retry.d.mts.map +1 -0
- package/dist/utils/retry.mjs +84 -7
- package/dist/utils/retry.mjs.map +1 -1
- package/dist/utils/simulation-api.cjs +72 -0
- package/dist/utils/simulation-api.cjs.map +1 -0
- package/dist/{types/utils/simulation-api.d.ts → utils/simulation-api.d.cts} +2 -2
- package/dist/utils/simulation-api.d.cts.map +1 -0
- package/dist/utils/simulation-api.d.mts +107 -0
- package/dist/utils/simulation-api.d.mts.map +1 -0
- package/dist/utils/simulation-api.mjs +67 -10
- package/dist/utils/simulation-api.mjs.map +1 -1
- package/dist/utils/simulation.cjs +443 -0
- package/dist/utils/simulation.cjs.map +1 -0
- package/dist/{types/utils/simulation.d.ts → utils/simulation.d.cts} +6 -6
- package/dist/utils/simulation.d.cts.map +1 -0
- package/dist/utils/simulation.d.mts +46 -0
- package/dist/utils/simulation.d.mts.map +1 -0
- package/dist/utils/simulation.mjs +436 -15
- package/dist/utils/simulation.mjs.map +1 -1
- package/dist/utils/swaps.cjs +309 -0
- package/dist/utils/swaps.cjs.map +1 -0
- package/dist/{types/utils/swaps.d.ts → utils/swaps.d.cts} +5 -5
- package/dist/utils/swaps.d.cts.map +1 -0
- package/dist/utils/swaps.d.mts +84 -0
- package/dist/utils/swaps.d.mts.map +1 -0
- package/dist/utils/swaps.mjs +303 -22
- package/dist/utils/swaps.mjs.map +1 -1
- package/dist/utils/transaction-type.cjs +115 -0
- package/dist/utils/transaction-type.cjs.map +1 -0
- package/dist/{types/utils/transaction-type.d.ts → utils/transaction-type.d.cts} +3 -3
- package/dist/utils/transaction-type.d.cts.map +1 -0
- package/dist/utils/transaction-type.d.mts +14 -0
- package/dist/utils/transaction-type.d.mts.map +1 -0
- package/dist/utils/transaction-type.mjs +110 -10
- package/dist/utils/transaction-type.mjs.map +1 -1
- package/dist/utils/utils.cjs +151 -0
- package/dist/utils/utils.cjs.map +1 -0
- package/dist/{types/utils/utils.d.ts → utils/utils.d.cts} +2 -2
- package/dist/utils/utils.d.cts.map +1 -0
- package/dist/utils/utils.d.mts +52 -0
- package/dist/utils/utils.d.mts.map +1 -0
- package/dist/utils/utils.mjs +139 -21
- package/dist/utils/utils.mjs.map +1 -1
- package/dist/utils/validation.cjs +267 -0
- package/dist/{chunk-4OYPDGHO.js.map → utils/validation.cjs.map} +1 -1
- package/dist/{types/utils/validation.d.ts → utils/validation.d.cts} +2 -2
- package/dist/utils/validation.d.cts.map +1 -0
- package/dist/utils/validation.d.mts +20 -0
- package/dist/utils/validation.d.mts.map +1 -0
- package/dist/utils/validation.mjs +261 -11
- package/dist/utils/validation.mjs.map +1 -1
- package/package.json +20 -15
- package/dist/TransactionController.js +0 -46
- package/dist/TransactionController.js.map +0 -1
- package/dist/chunk-2XKEAKQG.js +0 -55
- package/dist/chunk-2XKEAKQG.js.map +0 -1
- package/dist/chunk-3AVRGHUO.mjs +0 -360
- package/dist/chunk-3AVRGHUO.mjs.map +0 -1
- package/dist/chunk-3ZV5YEUV.mjs +0 -239
- package/dist/chunk-3ZV5YEUV.mjs.map +0 -1
- package/dist/chunk-4OYPDGHO.js +0 -201
- package/dist/chunk-4V4XIPCI.mjs +0 -338
- package/dist/chunk-4V4XIPCI.mjs.map +0 -1
- package/dist/chunk-5G6OHAXI.mjs +0 -137
- package/dist/chunk-5G6OHAXI.mjs.map +0 -1
- package/dist/chunk-5HYWLTVQ.js +0 -228
- package/dist/chunk-5HYWLTVQ.js.map +0 -1
- package/dist/chunk-5QVDIVJH.js +0 -68
- package/dist/chunk-5QVDIVJH.js.map +0 -1
- package/dist/chunk-6B5BEO3R.mjs +0 -399
- package/dist/chunk-6B5BEO3R.mjs.map +0 -1
- package/dist/chunk-6DDVVUJC.mjs +0 -50
- package/dist/chunk-6DDVVUJC.mjs.map +0 -1
- package/dist/chunk-6OLJWLKK.js +0 -338
- package/dist/chunk-6OLJWLKK.js.map +0 -1
- package/dist/chunk-7LXE4KHV.js +0 -40
- package/dist/chunk-7LXE4KHV.js.map +0 -1
- package/dist/chunk-7NMV2NPM.js +0 -172
- package/dist/chunk-7NMV2NPM.js.map +0 -1
- package/dist/chunk-AWIJZAW3.mjs +0 -112
- package/dist/chunk-AWIJZAW3.mjs.map +0 -1
- package/dist/chunk-BZV72SCF.js +0 -226
- package/dist/chunk-BZV72SCF.js.map +0 -1
- package/dist/chunk-EGQCE3FK.mjs +0 -85
- package/dist/chunk-EGQCE3FK.mjs.map +0 -1
- package/dist/chunk-EHWAY6XU.js +0 -112
- package/dist/chunk-EHWAY6XU.js.map +0 -1
- package/dist/chunk-EKJXGERC.mjs +0 -172
- package/dist/chunk-EKJXGERC.mjs.map +0 -1
- package/dist/chunk-FG74Z3F5.mjs +0 -102
- package/dist/chunk-FG74Z3F5.mjs.map +0 -1
- package/dist/chunk-FMRLPVFZ.mjs +0 -66
- package/dist/chunk-FRKQ3Z2L.mjs +0 -40
- package/dist/chunk-FRKQ3Z2L.mjs.map +0 -1
- package/dist/chunk-HMOSP33F.js +0 -36
- package/dist/chunk-HQSNKCXI.mjs +0 -36
- package/dist/chunk-HQSNKCXI.mjs.map +0 -1
- package/dist/chunk-JIFPK37W.mjs +0 -257
- package/dist/chunk-JIFPK37W.mjs.map +0 -1
- package/dist/chunk-JOQK7A5G.mjs +0 -68
- package/dist/chunk-JOQK7A5G.mjs.map +0 -1
- package/dist/chunk-K4KOSAGM.mjs +0 -61
- package/dist/chunk-K4KOSAGM.mjs.map +0 -1
- package/dist/chunk-KG4UW4K4.mjs +0 -88
- package/dist/chunk-KG4UW4K4.mjs.map +0 -1
- package/dist/chunk-KT6UAKBB.js +0 -61
- package/dist/chunk-KT6UAKBB.js.map +0 -1
- package/dist/chunk-KTGMNUTQ.js +0 -106
- package/dist/chunk-KTGMNUTQ.js.map +0 -1
- package/dist/chunk-KYRW4BLA.mjs +0 -121
- package/dist/chunk-KYRW4BLA.mjs.map +0 -1
- package/dist/chunk-LFFYCDHB.mjs +0 -92
- package/dist/chunk-LFFYCDHB.mjs.map +0 -1
- package/dist/chunk-NNCUD3QF.js +0 -360
- package/dist/chunk-NNCUD3QF.js.map +0 -1
- package/dist/chunk-NNHSNPT2.mjs +0 -67
- package/dist/chunk-NNHSNPT2.mjs.map +0 -1
- package/dist/chunk-NOHEXQ7Y.mjs +0 -55
- package/dist/chunk-NOHEXQ7Y.mjs.map +0 -1
- package/dist/chunk-NYKRCWBG.js +0 -31
- package/dist/chunk-NYKRCWBG.js.map +0 -1
- package/dist/chunk-O6ZZVIFH.mjs +0 -176
- package/dist/chunk-O6ZZVIFH.mjs.map +0 -1
- package/dist/chunk-PRUNMTRD.js +0 -50
- package/dist/chunk-PRUNMTRD.js.map +0 -1
- package/dist/chunk-PSZ34BI5.js +0 -92
- package/dist/chunk-PSZ34BI5.js.map +0 -1
- package/dist/chunk-QKV7E5BO.js +0 -257
- package/dist/chunk-QKV7E5BO.js.map +0 -1
- package/dist/chunk-RHDPOIS4.js +0 -239
- package/dist/chunk-RHDPOIS4.js.map +0 -1
- package/dist/chunk-S6VGOPUY.js +0 -14
- package/dist/chunk-S6VGOPUY.js.map +0 -1
- package/dist/chunk-SD6CWFDF.js +0 -88
- package/dist/chunk-SD6CWFDF.js.map +0 -1
- package/dist/chunk-SFFOC25Q.mjs +0 -226
- package/dist/chunk-SFFOC25Q.mjs.map +0 -1
- package/dist/chunk-SMC5Q6ZH.mjs +0 -120
- package/dist/chunk-SMC5Q6ZH.mjs.map +0 -1
- package/dist/chunk-TIE3CPF7.js +0 -120
- package/dist/chunk-TIE3CPF7.js.map +0 -1
- package/dist/chunk-TJMQEH57.js +0 -66
- package/dist/chunk-TJMQEH57.js.map +0 -1
- package/dist/chunk-UGN7PBON.js +0 -176
- package/dist/chunk-UGN7PBON.js.map +0 -1
- package/dist/chunk-UHAFIPSL.js +0 -121
- package/dist/chunk-UHAFIPSL.js.map +0 -1
- package/dist/chunk-UHSRHP55.mjs +0 -106
- package/dist/chunk-UHSRHP55.mjs.map +0 -1
- package/dist/chunk-ULD4JC3Q.js +0 -399
- package/dist/chunk-ULD4JC3Q.js.map +0 -1
- package/dist/chunk-UQQWZT6C.mjs +0 -14
- package/dist/chunk-UQQWZT6C.mjs.map +0 -1
- package/dist/chunk-V72C4MCR.js +0 -137
- package/dist/chunk-V72C4MCR.js.map +0 -1
- package/dist/chunk-VEVVBHP3.mjs +0 -31
- package/dist/chunk-VEVVBHP3.mjs.map +0 -1
- package/dist/chunk-VGFPVAKX.mjs +0 -228
- package/dist/chunk-VGFPVAKX.mjs.map +0 -1
- package/dist/chunk-VKWOHNDO.js +0 -2509
- package/dist/chunk-VKWOHNDO.js.map +0 -1
- package/dist/chunk-WR5F34OW.js +0 -23
- package/dist/chunk-WR5F34OW.js.map +0 -1
- package/dist/chunk-X4XSEYPL.mjs +0 -201
- package/dist/chunk-X4XSEYPL.mjs.map +0 -1
- package/dist/chunk-XTMJ25EF.mjs +0 -2509
- package/dist/chunk-XTMJ25EF.mjs.map +0 -1
- package/dist/chunk-XUI43LEZ.mjs +0 -30
- package/dist/chunk-XUI43LEZ.mjs.map +0 -1
- package/dist/chunk-XVYXRCRL.js +0 -85
- package/dist/chunk-XVYXRCRL.js.map +0 -1
- package/dist/chunk-YVCX6Z75.js +0 -102
- package/dist/chunk-YVCX6Z75.js.map +0 -1
- package/dist/chunk-YWLMT7XH.js +0 -67
- package/dist/chunk-YWLMT7XH.js.map +0 -1
- package/dist/chunk-Z4BLTVTB.js +0 -30
- package/dist/chunk-Z4BLTVTB.js.map +0 -1
- package/dist/chunk-Z4GV3YQQ.mjs +0 -23
- package/dist/chunk-Z4GV3YQQ.mjs.map +0 -1
- package/dist/constants.js +0 -20
- package/dist/constants.js.map +0 -1
- package/dist/errors.js +0 -15
- package/dist/errors.js.map +0 -1
- package/dist/gas-flows/DefaultGasFeeFlow.js +0 -15
- package/dist/gas-flows/DefaultGasFeeFlow.js.map +0 -1
- package/dist/gas-flows/LineaGasFeeFlow.js +0 -16
- package/dist/gas-flows/LineaGasFeeFlow.js.map +0 -1
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.js +0 -11
- package/dist/gas-flows/OptimismLayer1GasFeeFlow.js.map +0 -1
- package/dist/gas-flows/OracleLayer1GasFeeFlow.js +0 -9
- package/dist/gas-flows/OracleLayer1GasFeeFlow.js.map +0 -1
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.js +0 -11
- package/dist/gas-flows/ScrollLayer1GasFeeFlow.js.map +0 -1
- package/dist/gas-flows/TestGasFeeFlow.js +0 -9
- package/dist/gas-flows/TestGasFeeFlow.js.map +0 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.js +0 -12
- package/dist/helpers/EtherscanRemoteTransactionSource.js.map +0 -1
- package/dist/helpers/GasFeePoller.js +0 -12
- package/dist/helpers/GasFeePoller.js.map +0 -1
- package/dist/helpers/IncomingTransactionHelper.js +0 -9
- package/dist/helpers/IncomingTransactionHelper.js.map +0 -1
- package/dist/helpers/MultichainTrackingHelper.js +0 -13
- package/dist/helpers/MultichainTrackingHelper.js.map +0 -1
- package/dist/helpers/PendingTransactionTracker.js +0 -10
- package/dist/helpers/PendingTransactionTracker.js.map +0 -1
- package/dist/index.js +0 -77
- package/dist/index.js.map +0 -1
- package/dist/logger.js +0 -12
- package/dist/logger.js.map +0 -1
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/dist/types/TransactionController.d.ts.map +0 -1
- package/dist/types/constants.d.ts.map +0 -1
- package/dist/types/errors.d.ts.map +0 -1
- package/dist/types/gas-flows/DefaultGasFeeFlow.d.ts.map +0 -1
- package/dist/types/gas-flows/LineaGasFeeFlow.d.ts.map +0 -1
- package/dist/types/gas-flows/OptimismLayer1GasFeeFlow.d.ts.map +0 -1
- package/dist/types/gas-flows/OracleLayer1GasFeeFlow.d.ts.map +0 -1
- package/dist/types/gas-flows/ScrollLayer1GasFeeFlow.d.ts.map +0 -1
- package/dist/types/gas-flows/TestGasFeeFlow.d.ts.map +0 -1
- package/dist/types/helpers/EtherscanRemoteTransactionSource.d.ts.map +0 -1
- package/dist/types/helpers/GasFeePoller.d.ts.map +0 -1
- package/dist/types/helpers/IncomingTransactionHelper.d.ts.map +0 -1
- package/dist/types/helpers/MultichainTrackingHelper.d.ts.map +0 -1
- package/dist/types/helpers/PendingTransactionTracker.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/logger.d.ts.map +0 -1
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/utils/etherscan.d.ts.map +0 -1
- package/dist/types/utils/external-transactions.d.ts.map +0 -1
- package/dist/types/utils/gas-fees.d.ts.map +0 -1
- package/dist/types/utils/gas-flow.d.ts.map +0 -1
- package/dist/types/utils/gas.d.ts.map +0 -1
- package/dist/types/utils/history.d.ts.map +0 -1
- package/dist/types/utils/layer1-gas-fee-flow.d.ts.map +0 -1
- package/dist/types/utils/nonce.d.ts.map +0 -1
- package/dist/types/utils/retry.d.ts.map +0 -1
- package/dist/types/utils/simulation-api.d.ts.map +0 -1
- package/dist/types/utils/simulation.d.ts.map +0 -1
- package/dist/types/utils/swaps.d.ts.map +0 -1
- package/dist/types/utils/transaction-type.d.ts.map +0 -1
- package/dist/types/utils/utils.d.ts.map +0 -1
- package/dist/types/utils/validation.d.ts.map +0 -1
- package/dist/types.js +0 -24
- package/dist/types.js.map +0 -1
- package/dist/utils/etherscan.js +0 -14
- package/dist/utils/etherscan.js.map +0 -1
- package/dist/utils/external-transactions.js +0 -9
- package/dist/utils/external-transactions.js.map +0 -1
- package/dist/utils/gas-fees.js +0 -16
- package/dist/utils/gas-fees.js.map +0 -1
- package/dist/utils/gas-flow.js +0 -11
- package/dist/utils/gas-flow.js.map +0 -1
- package/dist/utils/gas.js +0 -20
- package/dist/utils/gas.js.map +0 -1
- package/dist/utils/history.js +0 -14
- package/dist/utils/history.js.map +0 -1
- package/dist/utils/layer1-gas-fee-flow.js +0 -11
- package/dist/utils/layer1-gas-fee-flow.js.map +0 -1
- package/dist/utils/nonce.js +0 -11
- package/dist/utils/nonce.js.map +0 -1
- package/dist/utils/retry.js +0 -8
- package/dist/utils/retry.js.map +0 -1
- package/dist/utils/simulation-api.js +0 -11
- package/dist/utils/simulation-api.js.map +0 -1
- package/dist/utils/simulation.js +0 -17
- package/dist/utils/simulation.js.map +0 -1
- package/dist/utils/swaps.js +0 -24
- package/dist/utils/swaps.js.map +0 -1
- package/dist/utils/transaction-type.js +0 -11
- package/dist/utils/transaction-type.js.map +0 -1
- package/dist/utils/utils.js +0 -23
- package/dist/utils/utils.js.map +0 -1
- package/dist/utils/validation.js +0 -12
- package/dist/utils/validation.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="debug" />
|
|
2
|
-
import type EthQuery from
|
|
3
|
-
import type { Hex } from
|
|
4
|
-
import type { TransactionMeta, TransactionParams } from
|
|
2
|
+
import type EthQuery from "@metamask/eth-query";
|
|
3
|
+
import type { Hex } from "@metamask/utils";
|
|
4
|
+
import type { TransactionMeta, TransactionParams } from "../types.cjs";
|
|
5
5
|
export type UpdateGasRequest = {
|
|
6
6
|
ethQuery: EthQuery;
|
|
7
7
|
isCustomNetwork: boolean;
|
|
@@ -25,4 +25,4 @@ export declare function estimateGas(txParams: TransactionParams, ethQuery: EthQu
|
|
|
25
25
|
} | undefined;
|
|
26
26
|
}>;
|
|
27
27
|
export declare function addGasBuffer(estimatedGas: string, blockGasLimit: string, multiplier: number): `0x${string}`;
|
|
28
|
-
//# sourceMappingURL=gas.d.
|
|
28
|
+
//# sourceMappingURL=gas.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gas.d.cts","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":";AAQA,OAAO,KAAK,QAAQ,4BAA4B;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,qBAAiB;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,GAAG,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,GAAG,0BAA2C,CAAC;AAE5D,eAAO,MAAM,SAAS,WAAW,CAAC;AAClC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,iBAkBxD;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,QAAQ;;;;;;;;;;;GAwCnB;AAED,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,iBAqBnB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/// <reference types="debug" />
|
|
2
|
+
import type EthQuery from "@metamask/eth-query";
|
|
3
|
+
import type { Hex } from "@metamask/utils";
|
|
4
|
+
import type { TransactionMeta, TransactionParams } from "../types.mjs";
|
|
5
|
+
export type UpdateGasRequest = {
|
|
6
|
+
ethQuery: EthQuery;
|
|
7
|
+
isCustomNetwork: boolean;
|
|
8
|
+
chainId: Hex;
|
|
9
|
+
txMeta: TransactionMeta;
|
|
10
|
+
};
|
|
11
|
+
export declare const log: import("debug").Debugger;
|
|
12
|
+
export declare const FIXED_GAS = "0x5208";
|
|
13
|
+
export declare const DEFAULT_GAS_MULTIPLIER = 1.5;
|
|
14
|
+
export declare function updateGas(request: UpdateGasRequest): Promise<void>;
|
|
15
|
+
export declare function estimateGas(txParams: TransactionParams, ethQuery: EthQuery): Promise<{
|
|
16
|
+
blockGasLimit: string;
|
|
17
|
+
estimatedGas: string;
|
|
18
|
+
simulationFails: {
|
|
19
|
+
reason: any;
|
|
20
|
+
errorKey: any;
|
|
21
|
+
debug: {
|
|
22
|
+
blockNumber: string;
|
|
23
|
+
blockGasLimit: string;
|
|
24
|
+
};
|
|
25
|
+
} | undefined;
|
|
26
|
+
}>;
|
|
27
|
+
export declare function addGasBuffer(estimatedGas: string, blockGasLimit: string, multiplier: number): `0x${string}`;
|
|
28
|
+
//# sourceMappingURL=gas.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gas.d.mts","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":";AAQA,OAAO,KAAK,QAAQ,4BAA4B;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,qBAAiB;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,GAAG,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,GAAG,0BAA2C,CAAC;AAE5D,eAAO,MAAM,SAAS,WAAW,CAAC;AAClC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,iBAkBxD;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,QAAQ;;;;;;;;;;;GAwCnB;AAED,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,iBAqBnB"}
|
package/dist/utils/gas.mjs
CHANGED
|
@@ -1,20 +1,106 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
};
|
|
1
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
2
|
+
import { BNToHex, fractionBN, hexToBN, query } from "@metamask/controller-utils";
|
|
3
|
+
import { add0x, createModuleLogger } from "@metamask/utils";
|
|
4
|
+
import { GAS_BUFFER_CHAIN_OVERRIDES } from "../constants.mjs";
|
|
5
|
+
import { projectLogger } from "../logger.mjs";
|
|
6
|
+
export const log = createModuleLogger(projectLogger, 'gas');
|
|
7
|
+
export const FIXED_GAS = '0x5208';
|
|
8
|
+
export const DEFAULT_GAS_MULTIPLIER = 1.5;
|
|
9
|
+
export async function updateGas(request) {
|
|
10
|
+
const { txMeta } = request;
|
|
11
|
+
const initialParams = { ...txMeta.txParams };
|
|
12
|
+
const [gas, simulationFails] = await getGas(request);
|
|
13
|
+
txMeta.txParams.gas = gas;
|
|
14
|
+
txMeta.simulationFails = simulationFails;
|
|
15
|
+
if (!initialParams.gas) {
|
|
16
|
+
txMeta.originalGasEstimate = txMeta.txParams.gas;
|
|
17
|
+
}
|
|
18
|
+
if (!txMeta.defaultGasEstimates) {
|
|
19
|
+
txMeta.defaultGasEstimates = {};
|
|
20
|
+
}
|
|
21
|
+
txMeta.defaultGasEstimates.gas = txMeta.txParams.gas;
|
|
22
|
+
}
|
|
23
|
+
export async function estimateGas(txParams, ethQuery) {
|
|
24
|
+
const request = { ...txParams };
|
|
25
|
+
const { data, value } = request;
|
|
26
|
+
const { gasLimit: gasLimitHex, number: blockNumber } = await getLatestBlock(ethQuery);
|
|
27
|
+
const gasLimitBN = hexToBN(gasLimitHex);
|
|
28
|
+
request.data = data ? add0x(data) : data;
|
|
29
|
+
request.gas = BNToHex(fractionBN(gasLimitBN, 19, 20));
|
|
30
|
+
request.value = value || '0x0';
|
|
31
|
+
let estimatedGas = request.gas;
|
|
32
|
+
let simulationFails;
|
|
33
|
+
try {
|
|
34
|
+
estimatedGas = await query(ethQuery, 'estimateGas', [request]);
|
|
35
|
+
// TODO: Replace `any` with type
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
simulationFails = {
|
|
40
|
+
reason: error.message,
|
|
41
|
+
errorKey: error.errorKey,
|
|
42
|
+
debug: {
|
|
43
|
+
blockNumber,
|
|
44
|
+
blockGasLimit: gasLimitHex,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
log('Estimation failed', { ...simulationFails, fallback: estimateGas });
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
blockGasLimit: gasLimitHex,
|
|
51
|
+
estimatedGas,
|
|
52
|
+
simulationFails,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function addGasBuffer(estimatedGas, blockGasLimit, multiplier) {
|
|
56
|
+
const estimatedGasBN = hexToBN(estimatedGas);
|
|
57
|
+
const maxGasBN = hexToBN(blockGasLimit).muln(0.9);
|
|
58
|
+
const paddedGasBN = estimatedGasBN.muln(multiplier);
|
|
59
|
+
if (estimatedGasBN.gt(maxGasBN)) {
|
|
60
|
+
const estimatedGasHex = add0x(estimatedGas);
|
|
61
|
+
log('Using estimated value', estimatedGasHex);
|
|
62
|
+
return estimatedGasHex;
|
|
63
|
+
}
|
|
64
|
+
if (paddedGasBN.lt(maxGasBN)) {
|
|
65
|
+
const paddedHex = add0x(BNToHex(paddedGasBN));
|
|
66
|
+
log('Using padded estimate', paddedHex, multiplier);
|
|
67
|
+
return paddedHex;
|
|
68
|
+
}
|
|
69
|
+
const maxHex = add0x(BNToHex(maxGasBN));
|
|
70
|
+
log('Using 90% of block gas limit', maxHex);
|
|
71
|
+
return maxHex;
|
|
72
|
+
}
|
|
73
|
+
async function getGas(request) {
|
|
74
|
+
const { isCustomNetwork, chainId, txMeta } = request;
|
|
75
|
+
if (txMeta.txParams.gas) {
|
|
76
|
+
log('Using value from request', txMeta.txParams.gas);
|
|
77
|
+
return [txMeta.txParams.gas];
|
|
78
|
+
}
|
|
79
|
+
if (await requiresFixedGas(request)) {
|
|
80
|
+
log('Using fixed value', FIXED_GAS);
|
|
81
|
+
return [FIXED_GAS];
|
|
82
|
+
}
|
|
83
|
+
const { blockGasLimit, estimatedGas, simulationFails } = await estimateGas(txMeta.txParams, request.ethQuery);
|
|
84
|
+
if (isCustomNetwork) {
|
|
85
|
+
log('Using original estimate as custom network');
|
|
86
|
+
return [estimatedGas, simulationFails];
|
|
87
|
+
}
|
|
88
|
+
const bufferMultiplier = GAS_BUFFER_CHAIN_OVERRIDES[chainId] ?? DEFAULT_GAS_MULTIPLIER;
|
|
89
|
+
const bufferedGas = addGasBuffer(estimatedGas, blockGasLimit, bufferMultiplier);
|
|
90
|
+
return [bufferedGas, simulationFails];
|
|
91
|
+
}
|
|
92
|
+
async function requiresFixedGas({ ethQuery, txMeta, isCustomNetwork, }) {
|
|
93
|
+
const { txParams: { to, data }, } = txMeta;
|
|
94
|
+
if (isCustomNetwork || !to || data) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const code = await getCode(ethQuery, to);
|
|
98
|
+
return !code || code === '0x';
|
|
99
|
+
}
|
|
100
|
+
async function getCode(ethQuery, address) {
|
|
101
|
+
return await query(ethQuery, 'getCode', [address]);
|
|
102
|
+
}
|
|
103
|
+
async function getLatestBlock(ethQuery) {
|
|
104
|
+
return await query(ethQuery, 'getBlockByNumber', ['latest', false]);
|
|
105
|
+
}
|
|
20
106
|
//# sourceMappingURL=gas.mjs.map
|
package/dist/utils/gas.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"
|
|
1
|
+
{"version":3,"file":"gas.mjs","sourceRoot":"","sources":["../../src/utils/gas.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\n\nimport {\n BNToHex,\n fractionBN,\n hexToBN,\n query,\n} from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport type { Hex } from '@metamask/utils';\nimport { add0x, createModuleLogger } from '@metamask/utils';\n\nimport { GAS_BUFFER_CHAIN_OVERRIDES } from '../constants';\nimport { projectLogger } from '../logger';\nimport type { TransactionMeta, TransactionParams } from '../types';\n\nexport type UpdateGasRequest = {\n ethQuery: EthQuery;\n isCustomNetwork: boolean;\n chainId: Hex;\n txMeta: TransactionMeta;\n};\n\nexport const log = createModuleLogger(projectLogger, 'gas');\n\nexport const FIXED_GAS = '0x5208';\nexport const DEFAULT_GAS_MULTIPLIER = 1.5;\n\nexport async function updateGas(request: UpdateGasRequest) {\n const { txMeta } = request;\n const initialParams = { ...txMeta.txParams };\n\n const [gas, simulationFails] = await getGas(request);\n\n txMeta.txParams.gas = gas;\n txMeta.simulationFails = simulationFails;\n\n if (!initialParams.gas) {\n txMeta.originalGasEstimate = txMeta.txParams.gas;\n }\n\n if (!txMeta.defaultGasEstimates) {\n txMeta.defaultGasEstimates = {};\n }\n\n txMeta.defaultGasEstimates.gas = txMeta.txParams.gas;\n}\n\nexport async function estimateGas(\n txParams: TransactionParams,\n ethQuery: EthQuery,\n) {\n const request = { ...txParams };\n const { data, value } = request;\n\n const { gasLimit: gasLimitHex, number: blockNumber } = await getLatestBlock(\n ethQuery,\n );\n\n const gasLimitBN = hexToBN(gasLimitHex);\n\n request.data = data ? add0x(data) : data;\n request.gas = BNToHex(fractionBN(gasLimitBN, 19, 20));\n request.value = value || '0x0';\n\n let estimatedGas = request.gas;\n let simulationFails;\n\n try {\n estimatedGas = await query(ethQuery, 'estimateGas', [request]);\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n simulationFails = {\n reason: error.message,\n errorKey: error.errorKey,\n debug: {\n blockNumber,\n blockGasLimit: gasLimitHex,\n },\n };\n\n log('Estimation failed', { ...simulationFails, fallback: estimateGas });\n }\n\n return {\n blockGasLimit: gasLimitHex,\n estimatedGas,\n simulationFails,\n };\n}\n\nexport function addGasBuffer(\n estimatedGas: string,\n blockGasLimit: string,\n multiplier: number,\n) {\n const estimatedGasBN = hexToBN(estimatedGas);\n const maxGasBN = hexToBN(blockGasLimit).muln(0.9);\n const paddedGasBN = estimatedGasBN.muln(multiplier);\n\n if (estimatedGasBN.gt(maxGasBN)) {\n const estimatedGasHex = add0x(estimatedGas);\n log('Using estimated value', estimatedGasHex);\n return estimatedGasHex;\n }\n\n if (paddedGasBN.lt(maxGasBN)) {\n const paddedHex = add0x(BNToHex(paddedGasBN));\n log('Using padded estimate', paddedHex, multiplier);\n return paddedHex;\n }\n\n const maxHex = add0x(BNToHex(maxGasBN));\n log('Using 90% of block gas limit', maxHex);\n return maxHex;\n}\n\nasync function getGas(\n request: UpdateGasRequest,\n): Promise<[string, TransactionMeta['simulationFails']?]> {\n const { isCustomNetwork, chainId, txMeta } = request;\n\n if (txMeta.txParams.gas) {\n log('Using value from request', txMeta.txParams.gas);\n return [txMeta.txParams.gas];\n }\n\n if (await requiresFixedGas(request)) {\n log('Using fixed value', FIXED_GAS);\n return [FIXED_GAS];\n }\n\n const { blockGasLimit, estimatedGas, simulationFails } = await estimateGas(\n txMeta.txParams,\n request.ethQuery,\n );\n\n if (isCustomNetwork) {\n log('Using original estimate as custom network');\n return [estimatedGas, simulationFails];\n }\n\n const bufferMultiplier =\n GAS_BUFFER_CHAIN_OVERRIDES[\n chainId as keyof typeof GAS_BUFFER_CHAIN_OVERRIDES\n ] ?? DEFAULT_GAS_MULTIPLIER;\n\n const bufferedGas = addGasBuffer(\n estimatedGas,\n blockGasLimit,\n bufferMultiplier,\n );\n\n return [bufferedGas, simulationFails];\n}\n\nasync function requiresFixedGas({\n ethQuery,\n txMeta,\n isCustomNetwork,\n}: UpdateGasRequest): Promise<boolean> {\n const {\n txParams: { to, data },\n } = txMeta;\n\n if (isCustomNetwork || !to || data) {\n return false;\n }\n\n const code = await getCode(ethQuery, to);\n\n return !code || code === '0x';\n}\n\nasync function getCode(\n ethQuery: EthQuery,\n address: string,\n): Promise<string | undefined> {\n return await query(ethQuery, 'getCode', [address]);\n}\n\nasync function getLatestBlock(\n ethQuery: EthQuery,\n): Promise<{ gasLimit: string; number: string }> {\n return await query(ethQuery, 'getBlockByNumber', ['latest', false]);\n}\n"]}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.updateTransactionHistory = exports.addInitialHistorySnapshot = exports.DISPLAYED_TRANSACTION_HISTORY_PATHS = exports.MAX_TRANSACTION_HISTORY_LENGTH = void 0;
|
|
7
|
+
const fast_json_patch_1 = __importDefault(require("fast-json-patch"));
|
|
8
|
+
const lodash_1 = require("lodash");
|
|
9
|
+
/**
|
|
10
|
+
* The maximum allowed length of the `transaction.history` property.
|
|
11
|
+
*/
|
|
12
|
+
exports.MAX_TRANSACTION_HISTORY_LENGTH = 100;
|
|
13
|
+
/**
|
|
14
|
+
* A list of trarnsaction history paths that may be used for display. These entries will not be
|
|
15
|
+
* compressed.
|
|
16
|
+
*/
|
|
17
|
+
exports.DISPLAYED_TRANSACTION_HISTORY_PATHS = [
|
|
18
|
+
'/status',
|
|
19
|
+
'/txParams/gasPrice',
|
|
20
|
+
'/txParams/gas',
|
|
21
|
+
'/estimatedBaseFee',
|
|
22
|
+
'/blockTimestamp',
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Build a new version of the provided transaction with an initial history
|
|
26
|
+
* entry, which is just a snapshot of the transaction.
|
|
27
|
+
*
|
|
28
|
+
* @param transactionMeta - TransactionMeta to add initial history snapshot to.
|
|
29
|
+
* @returns A copy of `transactionMeta` with a new `history` property.
|
|
30
|
+
*/
|
|
31
|
+
function addInitialHistorySnapshot(transactionMeta) {
|
|
32
|
+
const snapshot = snapshotFromTransactionMeta(transactionMeta);
|
|
33
|
+
return (0, lodash_1.merge)({}, transactionMeta, { history: [snapshot] });
|
|
34
|
+
}
|
|
35
|
+
exports.addInitialHistorySnapshot = addInitialHistorySnapshot;
|
|
36
|
+
/**
|
|
37
|
+
* Builds a new version of the transaction with a new history entry if
|
|
38
|
+
* it has a `history` property, or just returns the transaction.
|
|
39
|
+
*
|
|
40
|
+
* @param transactionMeta - TransactionMeta to add history entry to.
|
|
41
|
+
* @param note - Note to add to history entry.
|
|
42
|
+
* @returns A copy of `transactionMeta` with a new `history` entry if it has an
|
|
43
|
+
* existing non-empty `history` array.
|
|
44
|
+
*/
|
|
45
|
+
function updateTransactionHistory(transactionMeta, note) {
|
|
46
|
+
if (!transactionMeta.history) {
|
|
47
|
+
return transactionMeta;
|
|
48
|
+
}
|
|
49
|
+
const currentState = snapshotFromTransactionMeta(transactionMeta);
|
|
50
|
+
const previousState = replayHistory(transactionMeta.history);
|
|
51
|
+
const newHistoryEntry = generateHistoryEntry(previousState, currentState, note);
|
|
52
|
+
if (newHistoryEntry.length === 0) {
|
|
53
|
+
return transactionMeta;
|
|
54
|
+
}
|
|
55
|
+
// Casts required here because this list has two separate types of entries:
|
|
56
|
+
// TransactionMeta and TransactionHistoryEntry. The only TransactionMeta is the first
|
|
57
|
+
// entry, but TypeScript loses that type information when `slice` is called for some reason.
|
|
58
|
+
let updatedHistory = [
|
|
59
|
+
...transactionMeta.history,
|
|
60
|
+
newHistoryEntry,
|
|
61
|
+
];
|
|
62
|
+
if (updatedHistory.length > exports.MAX_TRANSACTION_HISTORY_LENGTH) {
|
|
63
|
+
updatedHistory = compressTransactionHistory(updatedHistory);
|
|
64
|
+
}
|
|
65
|
+
return (0, lodash_1.merge)({}, transactionMeta, {
|
|
66
|
+
history: updatedHistory,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
exports.updateTransactionHistory = updateTransactionHistory;
|
|
70
|
+
/**
|
|
71
|
+
* Compress the transaction history, if it is possible to do so without compressing entries used
|
|
72
|
+
* for display. History entries are merged together to make room for a single new entry.
|
|
73
|
+
*
|
|
74
|
+
* @param transactionHistory - The transaction history to compress.
|
|
75
|
+
* @returns A compressed transaction history.
|
|
76
|
+
*/
|
|
77
|
+
function compressTransactionHistory(transactionHistory) {
|
|
78
|
+
const initialEntry = transactionHistory[0];
|
|
79
|
+
// Casts required here because this list has two separate types of entries:
|
|
80
|
+
// TransactionMeta and TransactionHistoryEntry. The only TransactionMeta is the first
|
|
81
|
+
// entry, but TypeScript loses that type information when `slice` is called for some reason.
|
|
82
|
+
const historyEntries = transactionHistory.slice(1);
|
|
83
|
+
const firstNonDisplayedEntryIndex = historyEntries.findIndex((historyEntry) => {
|
|
84
|
+
return !historyEntry.some(({ path }) => exports.DISPLAYED_TRANSACTION_HISTORY_PATHS.includes(path));
|
|
85
|
+
});
|
|
86
|
+
// If no non-displayed entry is found, let history exceed max size.
|
|
87
|
+
// TODO: Move data used for display to another property, so that we can more reliably limit
|
|
88
|
+
// history size or remove it altogether.
|
|
89
|
+
if (firstNonDisplayedEntryIndex === -1) {
|
|
90
|
+
return transactionHistory;
|
|
91
|
+
}
|
|
92
|
+
// If a non-displayed entry is found that we can remove, merge it with another entry.
|
|
93
|
+
// The entry we're merging with might be a "displayed" entry, but that's OK, merging more changes
|
|
94
|
+
// in does not break our display logic.
|
|
95
|
+
const mergeTargetEntryIndex =
|
|
96
|
+
// Merge with previous entry if there is no next entry.
|
|
97
|
+
// We default to merging with next because the next entry might also be non-displayed, so it
|
|
98
|
+
// might be removed in a future trim, saving more space.
|
|
99
|
+
firstNonDisplayedEntryIndex === historyEntries.length - 1
|
|
100
|
+
? firstNonDisplayedEntryIndex - 1
|
|
101
|
+
: firstNonDisplayedEntryIndex + 1;
|
|
102
|
+
const firstIndexToMerge = Math.min(firstNonDisplayedEntryIndex, mergeTargetEntryIndex);
|
|
103
|
+
const firstEntryToMerge = historyEntries[firstIndexToMerge];
|
|
104
|
+
const secondEntryToMerge = historyEntries[firstIndexToMerge + 1];
|
|
105
|
+
const beforeMergeState = replayHistory([
|
|
106
|
+
initialEntry,
|
|
107
|
+
...historyEntries.slice(0, firstIndexToMerge),
|
|
108
|
+
]);
|
|
109
|
+
const afterMergeState = replayHistory([
|
|
110
|
+
beforeMergeState,
|
|
111
|
+
firstEntryToMerge,
|
|
112
|
+
secondEntryToMerge,
|
|
113
|
+
]);
|
|
114
|
+
const mergedHistoryEntry = generateHistoryEntry(beforeMergeState, afterMergeState, `${String(firstEntryToMerge[0].note)}, ${String(secondEntryToMerge[0].note)}`);
|
|
115
|
+
historyEntries.splice(firstIndexToMerge, 2, mergedHistoryEntry);
|
|
116
|
+
return [initialEntry, ...historyEntries];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Generates a history entry from the previous and new transaction metadata.
|
|
120
|
+
*
|
|
121
|
+
* @param previousState - The previous transaction metadata.
|
|
122
|
+
* @param currentState - The new transaction metadata.
|
|
123
|
+
* @param note - A note for the transaction metada update.
|
|
124
|
+
* @returns An array of history operation.
|
|
125
|
+
*/
|
|
126
|
+
function generateHistoryEntry(
|
|
127
|
+
// TODO: Replace `any` with type
|
|
128
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
129
|
+
previousState, currentState, note) {
|
|
130
|
+
const historyOperationsEntry = fast_json_patch_1.default.compare(previousState, currentState);
|
|
131
|
+
// Add a note to the first operation, since it breaks if we append it to the entry
|
|
132
|
+
if (historyOperationsEntry[0]) {
|
|
133
|
+
if (note) {
|
|
134
|
+
historyOperationsEntry[0].note = note;
|
|
135
|
+
}
|
|
136
|
+
historyOperationsEntry[0].timestamp = Date.now();
|
|
137
|
+
}
|
|
138
|
+
return historyOperationsEntry;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Recovers previous transactionMeta from passed history array.
|
|
142
|
+
*
|
|
143
|
+
* @param transactionHistory - The transaction metadata to replay.
|
|
144
|
+
* @returns The transaction metadata.
|
|
145
|
+
*/
|
|
146
|
+
function replayHistory(transactionHistory) {
|
|
147
|
+
const shortHistory = (0, lodash_1.cloneDeep)(transactionHistory);
|
|
148
|
+
return shortHistory.reduce(
|
|
149
|
+
// TODO: Replace `any` with type
|
|
150
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
151
|
+
(val, entry) => fast_json_patch_1.default.applyPatch(val, entry).newDocument);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Clone the transaction meta data without the history property.
|
|
155
|
+
*
|
|
156
|
+
* @param transactionMeta - The transaction metadata to snapshot.
|
|
157
|
+
* @returns A deep clone of transaction metadata without history property.
|
|
158
|
+
*/
|
|
159
|
+
function snapshotFromTransactionMeta(transactionMeta) {
|
|
160
|
+
const snapshot = { ...transactionMeta };
|
|
161
|
+
delete snapshot.history;
|
|
162
|
+
return (0, lodash_1.cloneDeep)(snapshot);
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=history.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.cjs","sourceRoot":"","sources":["../../src/utils/history.ts"],"names":[],"mappings":"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","sourcesContent":["import jsonDiffer from 'fast-json-patch';\nimport { cloneDeep, merge } from 'lodash';\n\nimport type {\n TransactionHistory,\n TransactionHistoryEntry,\n TransactionMeta,\n} from '../types';\n\n/**\n * The maximum allowed length of the `transaction.history` property.\n */\nexport const MAX_TRANSACTION_HISTORY_LENGTH = 100;\n\n/**\n * A list of trarnsaction history paths that may be used for display. These entries will not be\n * compressed.\n */\nexport const DISPLAYED_TRANSACTION_HISTORY_PATHS = [\n '/status',\n '/txParams/gasPrice',\n '/txParams/gas',\n '/estimatedBaseFee',\n '/blockTimestamp',\n];\n\n/**\n * Build a new version of the provided transaction with an initial history\n * entry, which is just a snapshot of the transaction.\n *\n * @param transactionMeta - TransactionMeta to add initial history snapshot to.\n * @returns A copy of `transactionMeta` with a new `history` property.\n */\nexport function addInitialHistorySnapshot(\n transactionMeta: TransactionMeta,\n): TransactionMeta {\n const snapshot = snapshotFromTransactionMeta(transactionMeta);\n return merge({}, transactionMeta, { history: [snapshot] });\n}\n\n/**\n * Builds a new version of the transaction with a new history entry if\n * it has a `history` property, or just returns the transaction.\n *\n * @param transactionMeta - TransactionMeta to add history entry to.\n * @param note - Note to add to history entry.\n * @returns A copy of `transactionMeta` with a new `history` entry if it has an\n * existing non-empty `history` array.\n */\nexport function updateTransactionHistory(\n transactionMeta: TransactionMeta,\n note: string,\n): TransactionMeta {\n if (!transactionMeta.history) {\n return transactionMeta;\n }\n\n const currentState = snapshotFromTransactionMeta(transactionMeta);\n const previousState = replayHistory(transactionMeta.history);\n const newHistoryEntry = generateHistoryEntry(\n previousState,\n currentState,\n note,\n );\n\n if (newHistoryEntry.length === 0) {\n return transactionMeta;\n }\n\n // Casts required here because this list has two separate types of entries:\n // TransactionMeta and TransactionHistoryEntry. The only TransactionMeta is the first\n // entry, but TypeScript loses that type information when `slice` is called for some reason.\n let updatedHistory = [\n ...transactionMeta.history,\n newHistoryEntry,\n ] as TransactionHistory;\n\n if (updatedHistory.length > MAX_TRANSACTION_HISTORY_LENGTH) {\n updatedHistory = compressTransactionHistory(updatedHistory);\n }\n\n return merge({}, transactionMeta, {\n history: updatedHistory,\n });\n}\n\n/**\n * Compress the transaction history, if it is possible to do so without compressing entries used\n * for display. History entries are merged together to make room for a single new entry.\n *\n * @param transactionHistory - The transaction history to compress.\n * @returns A compressed transaction history.\n */\nfunction compressTransactionHistory(\n transactionHistory: TransactionHistory,\n): TransactionHistory {\n const initialEntry = transactionHistory[0];\n // Casts required here because this list has two separate types of entries:\n // TransactionMeta and TransactionHistoryEntry. The only TransactionMeta is the first\n // entry, but TypeScript loses that type information when `slice` is called for some reason.\n const historyEntries = transactionHistory.slice(\n 1,\n ) as TransactionHistoryEntry[];\n\n const firstNonDisplayedEntryIndex = historyEntries.findIndex(\n (historyEntry) => {\n return !historyEntry.some(({ path }) =>\n DISPLAYED_TRANSACTION_HISTORY_PATHS.includes(path),\n );\n },\n );\n\n // If no non-displayed entry is found, let history exceed max size.\n // TODO: Move data used for display to another property, so that we can more reliably limit\n // history size or remove it altogether.\n if (firstNonDisplayedEntryIndex === -1) {\n return transactionHistory;\n }\n\n // If a non-displayed entry is found that we can remove, merge it with another entry.\n // The entry we're merging with might be a \"displayed\" entry, but that's OK, merging more changes\n // in does not break our display logic.\n const mergeTargetEntryIndex =\n // Merge with previous entry if there is no next entry.\n // We default to merging with next because the next entry might also be non-displayed, so it\n // might be removed in a future trim, saving more space.\n firstNonDisplayedEntryIndex === historyEntries.length - 1\n ? firstNonDisplayedEntryIndex - 1\n : firstNonDisplayedEntryIndex + 1;\n const firstIndexToMerge = Math.min(\n firstNonDisplayedEntryIndex,\n mergeTargetEntryIndex,\n );\n const firstEntryToMerge = historyEntries[firstIndexToMerge];\n const secondEntryToMerge = historyEntries[firstIndexToMerge + 1];\n\n const beforeMergeState = replayHistory([\n initialEntry,\n ...historyEntries.slice(0, firstIndexToMerge),\n ]);\n const afterMergeState = replayHistory([\n beforeMergeState,\n firstEntryToMerge,\n secondEntryToMerge,\n ]);\n const mergedHistoryEntry = generateHistoryEntry(\n beforeMergeState,\n afterMergeState,\n `${String(firstEntryToMerge[0].note)}, ${String(\n secondEntryToMerge[0].note,\n )}`,\n );\n\n historyEntries.splice(firstIndexToMerge, 2, mergedHistoryEntry);\n return [initialEntry, ...historyEntries];\n}\n\n/**\n * Generates a history entry from the previous and new transaction metadata.\n *\n * @param previousState - The previous transaction metadata.\n * @param currentState - The new transaction metadata.\n * @param note - A note for the transaction metada update.\n * @returns An array of history operation.\n */\nfunction generateHistoryEntry(\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n previousState: any,\n currentState: TransactionMeta,\n note: string,\n): TransactionHistoryEntry {\n const historyOperationsEntry = jsonDiffer.compare(\n previousState,\n currentState,\n ) as TransactionHistoryEntry;\n // Add a note to the first operation, since it breaks if we append it to the entry\n if (historyOperationsEntry[0]) {\n if (note) {\n historyOperationsEntry[0].note = note;\n }\n historyOperationsEntry[0].timestamp = Date.now();\n }\n return historyOperationsEntry;\n}\n\n/**\n * Recovers previous transactionMeta from passed history array.\n *\n * @param transactionHistory - The transaction metadata to replay.\n * @returns The transaction metadata.\n */\nfunction replayHistory(\n transactionHistory: TransactionHistory,\n): TransactionMeta {\n const shortHistory = cloneDeep(transactionHistory);\n return shortHistory.reduce(\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (val, entry: any) => jsonDiffer.applyPatch(val, entry).newDocument,\n ) as TransactionMeta;\n}\n\n/**\n * Clone the transaction meta data without the history property.\n *\n * @param transactionMeta - The transaction metadata to snapshot.\n * @returns A deep clone of transaction metadata without history property.\n */\nfunction snapshotFromTransactionMeta(\n transactionMeta: TransactionMeta,\n): TransactionMeta {\n const snapshot = { ...transactionMeta };\n delete snapshot.history;\n return cloneDeep(snapshot);\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TransactionMeta } from
|
|
1
|
+
import type { TransactionMeta } from "../types.cjs";
|
|
2
2
|
/**
|
|
3
3
|
* The maximum allowed length of the `transaction.history` property.
|
|
4
4
|
*/
|
|
@@ -26,4 +26,4 @@ export declare function addInitialHistorySnapshot(transactionMeta: TransactionMe
|
|
|
26
26
|
* existing non-empty `history` array.
|
|
27
27
|
*/
|
|
28
28
|
export declare function updateTransactionHistory(transactionMeta: TransactionMeta, note: string): TransactionMeta;
|
|
29
|
-
//# sourceMappingURL=history.d.
|
|
29
|
+
//# sourceMappingURL=history.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.cts","sourceRoot":"","sources":["../../src/utils/history.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,eAAe,EAChB,qBAAiB;AAElB;;GAEG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,mCAAmC,UAM/C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,eAAe,GAC/B,eAAe,CAGjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE,MAAM,GACX,eAAe,CAgCjB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TransactionMeta } from "../types.mjs";
|
|
2
|
+
/**
|
|
3
|
+
* The maximum allowed length of the `transaction.history` property.
|
|
4
|
+
*/
|
|
5
|
+
export declare const MAX_TRANSACTION_HISTORY_LENGTH = 100;
|
|
6
|
+
/**
|
|
7
|
+
* A list of trarnsaction history paths that may be used for display. These entries will not be
|
|
8
|
+
* compressed.
|
|
9
|
+
*/
|
|
10
|
+
export declare const DISPLAYED_TRANSACTION_HISTORY_PATHS: string[];
|
|
11
|
+
/**
|
|
12
|
+
* Build a new version of the provided transaction with an initial history
|
|
13
|
+
* entry, which is just a snapshot of the transaction.
|
|
14
|
+
*
|
|
15
|
+
* @param transactionMeta - TransactionMeta to add initial history snapshot to.
|
|
16
|
+
* @returns A copy of `transactionMeta` with a new `history` property.
|
|
17
|
+
*/
|
|
18
|
+
export declare function addInitialHistorySnapshot(transactionMeta: TransactionMeta): TransactionMeta;
|
|
19
|
+
/**
|
|
20
|
+
* Builds a new version of the transaction with a new history entry if
|
|
21
|
+
* it has a `history` property, or just returns the transaction.
|
|
22
|
+
*
|
|
23
|
+
* @param transactionMeta - TransactionMeta to add history entry to.
|
|
24
|
+
* @param note - Note to add to history entry.
|
|
25
|
+
* @returns A copy of `transactionMeta` with a new `history` entry if it has an
|
|
26
|
+
* existing non-empty `history` array.
|
|
27
|
+
*/
|
|
28
|
+
export declare function updateTransactionHistory(transactionMeta: TransactionMeta, note: string): TransactionMeta;
|
|
29
|
+
//# sourceMappingURL=history.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.mts","sourceRoot":"","sources":["../../src/utils/history.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,eAAe,EAChB,qBAAiB;AAElB;;GAEG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,mCAAmC,UAM/C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,eAAe,GAC/B,eAAe,CAGjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE,MAAM,GACX,eAAe,CAgCjB"}
|
package/dist/utils/history.mjs
CHANGED
|
@@ -1,14 +1,164 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
import "
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
function $importDefault(module) {
|
|
2
|
+
if (module?.__esModule) {
|
|
3
|
+
return module.default;
|
|
4
|
+
}
|
|
5
|
+
return module;
|
|
6
|
+
}
|
|
7
|
+
import $jsonDiffer from "fast-json-patch";
|
|
8
|
+
const jsonDiffer = $importDefault($jsonDiffer);
|
|
9
|
+
import $lodash from "lodash";
|
|
10
|
+
const { cloneDeep, merge } = $lodash;
|
|
11
|
+
/**
|
|
12
|
+
* The maximum allowed length of the `transaction.history` property.
|
|
13
|
+
*/
|
|
14
|
+
export const MAX_TRANSACTION_HISTORY_LENGTH = 100;
|
|
15
|
+
/**
|
|
16
|
+
* A list of trarnsaction history paths that may be used for display. These entries will not be
|
|
17
|
+
* compressed.
|
|
18
|
+
*/
|
|
19
|
+
export const DISPLAYED_TRANSACTION_HISTORY_PATHS = [
|
|
20
|
+
'/status',
|
|
21
|
+
'/txParams/gasPrice',
|
|
22
|
+
'/txParams/gas',
|
|
23
|
+
'/estimatedBaseFee',
|
|
24
|
+
'/blockTimestamp',
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Build a new version of the provided transaction with an initial history
|
|
28
|
+
* entry, which is just a snapshot of the transaction.
|
|
29
|
+
*
|
|
30
|
+
* @param transactionMeta - TransactionMeta to add initial history snapshot to.
|
|
31
|
+
* @returns A copy of `transactionMeta` with a new `history` property.
|
|
32
|
+
*/
|
|
33
|
+
export function addInitialHistorySnapshot(transactionMeta) {
|
|
34
|
+
const snapshot = snapshotFromTransactionMeta(transactionMeta);
|
|
35
|
+
return merge({}, transactionMeta, { history: [snapshot] });
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Builds a new version of the transaction with a new history entry if
|
|
39
|
+
* it has a `history` property, or just returns the transaction.
|
|
40
|
+
*
|
|
41
|
+
* @param transactionMeta - TransactionMeta to add history entry to.
|
|
42
|
+
* @param note - Note to add to history entry.
|
|
43
|
+
* @returns A copy of `transactionMeta` with a new `history` entry if it has an
|
|
44
|
+
* existing non-empty `history` array.
|
|
45
|
+
*/
|
|
46
|
+
export function updateTransactionHistory(transactionMeta, note) {
|
|
47
|
+
if (!transactionMeta.history) {
|
|
48
|
+
return transactionMeta;
|
|
49
|
+
}
|
|
50
|
+
const currentState = snapshotFromTransactionMeta(transactionMeta);
|
|
51
|
+
const previousState = replayHistory(transactionMeta.history);
|
|
52
|
+
const newHistoryEntry = generateHistoryEntry(previousState, currentState, note);
|
|
53
|
+
if (newHistoryEntry.length === 0) {
|
|
54
|
+
return transactionMeta;
|
|
55
|
+
}
|
|
56
|
+
// Casts required here because this list has two separate types of entries:
|
|
57
|
+
// TransactionMeta and TransactionHistoryEntry. The only TransactionMeta is the first
|
|
58
|
+
// entry, but TypeScript loses that type information when `slice` is called for some reason.
|
|
59
|
+
let updatedHistory = [
|
|
60
|
+
...transactionMeta.history,
|
|
61
|
+
newHistoryEntry,
|
|
62
|
+
];
|
|
63
|
+
if (updatedHistory.length > MAX_TRANSACTION_HISTORY_LENGTH) {
|
|
64
|
+
updatedHistory = compressTransactionHistory(updatedHistory);
|
|
65
|
+
}
|
|
66
|
+
return merge({}, transactionMeta, {
|
|
67
|
+
history: updatedHistory,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Compress the transaction history, if it is possible to do so without compressing entries used
|
|
72
|
+
* for display. History entries are merged together to make room for a single new entry.
|
|
73
|
+
*
|
|
74
|
+
* @param transactionHistory - The transaction history to compress.
|
|
75
|
+
* @returns A compressed transaction history.
|
|
76
|
+
*/
|
|
77
|
+
function compressTransactionHistory(transactionHistory) {
|
|
78
|
+
const initialEntry = transactionHistory[0];
|
|
79
|
+
// Casts required here because this list has two separate types of entries:
|
|
80
|
+
// TransactionMeta and TransactionHistoryEntry. The only TransactionMeta is the first
|
|
81
|
+
// entry, but TypeScript loses that type information when `slice` is called for some reason.
|
|
82
|
+
const historyEntries = transactionHistory.slice(1);
|
|
83
|
+
const firstNonDisplayedEntryIndex = historyEntries.findIndex((historyEntry) => {
|
|
84
|
+
return !historyEntry.some(({ path }) => DISPLAYED_TRANSACTION_HISTORY_PATHS.includes(path));
|
|
85
|
+
});
|
|
86
|
+
// If no non-displayed entry is found, let history exceed max size.
|
|
87
|
+
// TODO: Move data used for display to another property, so that we can more reliably limit
|
|
88
|
+
// history size or remove it altogether.
|
|
89
|
+
if (firstNonDisplayedEntryIndex === -1) {
|
|
90
|
+
return transactionHistory;
|
|
91
|
+
}
|
|
92
|
+
// If a non-displayed entry is found that we can remove, merge it with another entry.
|
|
93
|
+
// The entry we're merging with might be a "displayed" entry, but that's OK, merging more changes
|
|
94
|
+
// in does not break our display logic.
|
|
95
|
+
const mergeTargetEntryIndex =
|
|
96
|
+
// Merge with previous entry if there is no next entry.
|
|
97
|
+
// We default to merging with next because the next entry might also be non-displayed, so it
|
|
98
|
+
// might be removed in a future trim, saving more space.
|
|
99
|
+
firstNonDisplayedEntryIndex === historyEntries.length - 1
|
|
100
|
+
? firstNonDisplayedEntryIndex - 1
|
|
101
|
+
: firstNonDisplayedEntryIndex + 1;
|
|
102
|
+
const firstIndexToMerge = Math.min(firstNonDisplayedEntryIndex, mergeTargetEntryIndex);
|
|
103
|
+
const firstEntryToMerge = historyEntries[firstIndexToMerge];
|
|
104
|
+
const secondEntryToMerge = historyEntries[firstIndexToMerge + 1];
|
|
105
|
+
const beforeMergeState = replayHistory([
|
|
106
|
+
initialEntry,
|
|
107
|
+
...historyEntries.slice(0, firstIndexToMerge),
|
|
108
|
+
]);
|
|
109
|
+
const afterMergeState = replayHistory([
|
|
110
|
+
beforeMergeState,
|
|
111
|
+
firstEntryToMerge,
|
|
112
|
+
secondEntryToMerge,
|
|
113
|
+
]);
|
|
114
|
+
const mergedHistoryEntry = generateHistoryEntry(beforeMergeState, afterMergeState, `${String(firstEntryToMerge[0].note)}, ${String(secondEntryToMerge[0].note)}`);
|
|
115
|
+
historyEntries.splice(firstIndexToMerge, 2, mergedHistoryEntry);
|
|
116
|
+
return [initialEntry, ...historyEntries];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Generates a history entry from the previous and new transaction metadata.
|
|
120
|
+
*
|
|
121
|
+
* @param previousState - The previous transaction metadata.
|
|
122
|
+
* @param currentState - The new transaction metadata.
|
|
123
|
+
* @param note - A note for the transaction metada update.
|
|
124
|
+
* @returns An array of history operation.
|
|
125
|
+
*/
|
|
126
|
+
function generateHistoryEntry(
|
|
127
|
+
// TODO: Replace `any` with type
|
|
128
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
129
|
+
previousState, currentState, note) {
|
|
130
|
+
const historyOperationsEntry = jsonDiffer.compare(previousState, currentState);
|
|
131
|
+
// Add a note to the first operation, since it breaks if we append it to the entry
|
|
132
|
+
if (historyOperationsEntry[0]) {
|
|
133
|
+
if (note) {
|
|
134
|
+
historyOperationsEntry[0].note = note;
|
|
135
|
+
}
|
|
136
|
+
historyOperationsEntry[0].timestamp = Date.now();
|
|
137
|
+
}
|
|
138
|
+
return historyOperationsEntry;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Recovers previous transactionMeta from passed history array.
|
|
142
|
+
*
|
|
143
|
+
* @param transactionHistory - The transaction metadata to replay.
|
|
144
|
+
* @returns The transaction metadata.
|
|
145
|
+
*/
|
|
146
|
+
function replayHistory(transactionHistory) {
|
|
147
|
+
const shortHistory = cloneDeep(transactionHistory);
|
|
148
|
+
return shortHistory.reduce(
|
|
149
|
+
// TODO: Replace `any` with type
|
|
150
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
151
|
+
(val, entry) => jsonDiffer.applyPatch(val, entry).newDocument);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Clone the transaction meta data without the history property.
|
|
155
|
+
*
|
|
156
|
+
* @param transactionMeta - The transaction metadata to snapshot.
|
|
157
|
+
* @returns A deep clone of transaction metadata without history property.
|
|
158
|
+
*/
|
|
159
|
+
function snapshotFromTransactionMeta(transactionMeta) {
|
|
160
|
+
const snapshot = { ...transactionMeta };
|
|
161
|
+
delete snapshot.history;
|
|
162
|
+
return cloneDeep(snapshot);
|
|
163
|
+
}
|
|
14
164
|
//# sourceMappingURL=history.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
1
|
+
{"version":3,"file":"history.mjs","sourceRoot":"","sources":["../../src/utils/history.ts"],"names":[],"mappings":"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","sourcesContent":["import jsonDiffer from 'fast-json-patch';\nimport { cloneDeep, merge } from 'lodash';\n\nimport type {\n TransactionHistory,\n TransactionHistoryEntry,\n TransactionMeta,\n} from '../types';\n\n/**\n * The maximum allowed length of the `transaction.history` property.\n */\nexport const MAX_TRANSACTION_HISTORY_LENGTH = 100;\n\n/**\n * A list of trarnsaction history paths that may be used for display. These entries will not be\n * compressed.\n */\nexport const DISPLAYED_TRANSACTION_HISTORY_PATHS = [\n '/status',\n '/txParams/gasPrice',\n '/txParams/gas',\n '/estimatedBaseFee',\n '/blockTimestamp',\n];\n\n/**\n * Build a new version of the provided transaction with an initial history\n * entry, which is just a snapshot of the transaction.\n *\n * @param transactionMeta - TransactionMeta to add initial history snapshot to.\n * @returns A copy of `transactionMeta` with a new `history` property.\n */\nexport function addInitialHistorySnapshot(\n transactionMeta: TransactionMeta,\n): TransactionMeta {\n const snapshot = snapshotFromTransactionMeta(transactionMeta);\n return merge({}, transactionMeta, { history: [snapshot] });\n}\n\n/**\n * Builds a new version of the transaction with a new history entry if\n * it has a `history` property, or just returns the transaction.\n *\n * @param transactionMeta - TransactionMeta to add history entry to.\n * @param note - Note to add to history entry.\n * @returns A copy of `transactionMeta` with a new `history` entry if it has an\n * existing non-empty `history` array.\n */\nexport function updateTransactionHistory(\n transactionMeta: TransactionMeta,\n note: string,\n): TransactionMeta {\n if (!transactionMeta.history) {\n return transactionMeta;\n }\n\n const currentState = snapshotFromTransactionMeta(transactionMeta);\n const previousState = replayHistory(transactionMeta.history);\n const newHistoryEntry = generateHistoryEntry(\n previousState,\n currentState,\n note,\n );\n\n if (newHistoryEntry.length === 0) {\n return transactionMeta;\n }\n\n // Casts required here because this list has two separate types of entries:\n // TransactionMeta and TransactionHistoryEntry. The only TransactionMeta is the first\n // entry, but TypeScript loses that type information when `slice` is called for some reason.\n let updatedHistory = [\n ...transactionMeta.history,\n newHistoryEntry,\n ] as TransactionHistory;\n\n if (updatedHistory.length > MAX_TRANSACTION_HISTORY_LENGTH) {\n updatedHistory = compressTransactionHistory(updatedHistory);\n }\n\n return merge({}, transactionMeta, {\n history: updatedHistory,\n });\n}\n\n/**\n * Compress the transaction history, if it is possible to do so without compressing entries used\n * for display. History entries are merged together to make room for a single new entry.\n *\n * @param transactionHistory - The transaction history to compress.\n * @returns A compressed transaction history.\n */\nfunction compressTransactionHistory(\n transactionHistory: TransactionHistory,\n): TransactionHistory {\n const initialEntry = transactionHistory[0];\n // Casts required here because this list has two separate types of entries:\n // TransactionMeta and TransactionHistoryEntry. The only TransactionMeta is the first\n // entry, but TypeScript loses that type information when `slice` is called for some reason.\n const historyEntries = transactionHistory.slice(\n 1,\n ) as TransactionHistoryEntry[];\n\n const firstNonDisplayedEntryIndex = historyEntries.findIndex(\n (historyEntry) => {\n return !historyEntry.some(({ path }) =>\n DISPLAYED_TRANSACTION_HISTORY_PATHS.includes(path),\n );\n },\n );\n\n // If no non-displayed entry is found, let history exceed max size.\n // TODO: Move data used for display to another property, so that we can more reliably limit\n // history size or remove it altogether.\n if (firstNonDisplayedEntryIndex === -1) {\n return transactionHistory;\n }\n\n // If a non-displayed entry is found that we can remove, merge it with another entry.\n // The entry we're merging with might be a \"displayed\" entry, but that's OK, merging more changes\n // in does not break our display logic.\n const mergeTargetEntryIndex =\n // Merge with previous entry if there is no next entry.\n // We default to merging with next because the next entry might also be non-displayed, so it\n // might be removed in a future trim, saving more space.\n firstNonDisplayedEntryIndex === historyEntries.length - 1\n ? firstNonDisplayedEntryIndex - 1\n : firstNonDisplayedEntryIndex + 1;\n const firstIndexToMerge = Math.min(\n firstNonDisplayedEntryIndex,\n mergeTargetEntryIndex,\n );\n const firstEntryToMerge = historyEntries[firstIndexToMerge];\n const secondEntryToMerge = historyEntries[firstIndexToMerge + 1];\n\n const beforeMergeState = replayHistory([\n initialEntry,\n ...historyEntries.slice(0, firstIndexToMerge),\n ]);\n const afterMergeState = replayHistory([\n beforeMergeState,\n firstEntryToMerge,\n secondEntryToMerge,\n ]);\n const mergedHistoryEntry = generateHistoryEntry(\n beforeMergeState,\n afterMergeState,\n `${String(firstEntryToMerge[0].note)}, ${String(\n secondEntryToMerge[0].note,\n )}`,\n );\n\n historyEntries.splice(firstIndexToMerge, 2, mergedHistoryEntry);\n return [initialEntry, ...historyEntries];\n}\n\n/**\n * Generates a history entry from the previous and new transaction metadata.\n *\n * @param previousState - The previous transaction metadata.\n * @param currentState - The new transaction metadata.\n * @param note - A note for the transaction metada update.\n * @returns An array of history operation.\n */\nfunction generateHistoryEntry(\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n previousState: any,\n currentState: TransactionMeta,\n note: string,\n): TransactionHistoryEntry {\n const historyOperationsEntry = jsonDiffer.compare(\n previousState,\n currentState,\n ) as TransactionHistoryEntry;\n // Add a note to the first operation, since it breaks if we append it to the entry\n if (historyOperationsEntry[0]) {\n if (note) {\n historyOperationsEntry[0].note = note;\n }\n historyOperationsEntry[0].timestamp = Date.now();\n }\n return historyOperationsEntry;\n}\n\n/**\n * Recovers previous transactionMeta from passed history array.\n *\n * @param transactionHistory - The transaction metadata to replay.\n * @returns The transaction metadata.\n */\nfunction replayHistory(\n transactionHistory: TransactionHistory,\n): TransactionMeta {\n const shortHistory = cloneDeep(transactionHistory);\n return shortHistory.reduce(\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (val, entry: any) => jsonDiffer.applyPatch(val, entry).newDocument,\n ) as TransactionMeta;\n}\n\n/**\n * Clone the transaction meta data without the history property.\n *\n * @param transactionMeta - The transaction metadata to snapshot.\n * @returns A deep clone of transaction metadata without history property.\n */\nfunction snapshotFromTransactionMeta(\n transactionMeta: TransactionMeta,\n): TransactionMeta {\n const snapshot = { ...transactionMeta };\n delete snapshot.history;\n return cloneDeep(snapshot);\n}\n"]}
|