@pimlico/alto 0.0.18 → 0.0.20
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/contracts/EIP712.sol/EIP712.json +1 -0
- package/contracts/ERC165.sol/ERC165.json +1 -0
- package/contracts/ERC20.sol/ERC20.json +1 -0
- package/contracts/Eip7702Support.sol/Eip7702Support.json +1 -0
- package/contracts/EntryPoint.sol/EntryPoint.json +1 -0
- package/contracts/EntryPointFilterOpsOverride.sol/EntryPointFilterOpsOverride06.json +1 -0
- package/contracts/EntryPointFilterOpsOverride.sol/EntryPointFilterOpsOverride07.json +1 -0
- package/contracts/EntryPointFilterOpsOverride.sol/EntryPointFilterOpsOverride08.json +1 -0
- package/contracts/EntryPointFilterOpsOverride.sol/EntryPointFilterOpsOverride09.json +1 -0
- package/contracts/EntryPointGasEstimationOverride.sol/EntryPointGasEstimationOverride06.json +1 -0
- package/contracts/EntryPointSimulations.sol/EntryPointSimulations07.json +1 -0
- package/contracts/EntryPointSimulations.sol/EntryPointSimulations08.json +1 -0
- package/contracts/EntryPointSimulations.sol/EntryPointSimulations09.json +1 -0
- package/contracts/Exec.sol/Exec.json +1 -0
- package/contracts/IAccount.sol/IAccount.json +1 -0
- package/contracts/IAccountExecute.sol/IAccountExecute.json +1 -0
- package/contracts/IAggregator.sol/IAggregator.json +1 -0
- package/contracts/IERC165.sol/IERC165.json +1 -0
- package/contracts/IERC5267.sol/IERC5267.json +1 -0
- package/contracts/IEntryPoint.sol/IEntryPoint.json +1 -0
- package/contracts/IEntryPointFilterOpsOverride.sol/IEntryPointFilterOpsOverride08.json +1 -0
- package/contracts/IEntryPointFilterOpsOverride.sol/IEntryPointFilterOpsOverride09.json +1 -0
- package/contracts/IEntryPointSimulations.sol/IEntryPointSimulations.json +1 -0
- package/contracts/INonceManager.sol/INonceManager.json +1 -0
- package/contracts/IPaymaster.sol/IPaymaster.json +1 -0
- package/contracts/ISenderCreator.sol/ISenderCreator.json +1 -0
- package/contracts/IStakeManager.sol/IStakeManager.json +1 -0
- package/contracts/LibBytes.sol/LibBytes.json +1 -0
- package/contracts/Math.sol/Math.json +1 -0
- package/contracts/MessageHashUtils.sol/MessageHashUtils.json +1 -0
- package/contracts/NonceManager.sol/NonceManager.json +1 -0
- package/contracts/Panic.sol/Panic.json +1 -0
- package/contracts/PimlicoSimulations.sol/PimlicoSimulations.json +1 -0
- package/contracts/ReentrancyGuard.sol/ReentrancyGuard.json +1 -0
- package/contracts/ReentrancyGuardTransient.sol/ReentrancyGuardTransient.json +1 -0
- package/contracts/SafeCast.sol/SafeCast.json +1 -0
- package/contracts/SenderCreator.sol/SenderCreator.json +1 -0
- package/contracts/ShortStrings.sol/ShortStrings.json +1 -0
- package/contracts/SignedMath.sol/SignedMath.json +1 -0
- package/contracts/SimulationOverrideHelper.sol/SimulationOverrideHelper.json +1 -0
- package/contracts/StakeManager.sol/StakeManager.json +1 -0
- package/contracts/StorageSlot.sol/StorageSlot.json +1 -0
- package/contracts/Strings.sol/Strings.json +1 -0
- package/contracts/TransientSlot.sol/TransientSlot.json +1 -0
- package/contracts/UserOperation.sol/UserOperationLib.json +1 -0
- package/contracts/UserOperationLib.sol/UserOperationLib.json +1 -0
- package/contracts/account-abstraction-v9/contracts/interfaces/IAggregator.sol/IAggregator.json +1 -0
- package/contracts/account-abstraction-v9/contracts/interfaces/IEntryPoint.sol/IEntryPoint.json +1 -0
- package/contracts/account-abstraction-v9/contracts/interfaces/INonceManager.sol/INonceManager.json +1 -0
- package/contracts/account-abstraction-v9/contracts/interfaces/IStakeManager.sol/IStakeManager.json +1 -0
- package/contracts/build-info/338795fc743ca612.json +1 -0
- package/contracts/build-info/44a9648cfe32a468.json +1 -0
- package/contracts/build-info/8dbf8a4ad39019b5.json +1 -0
- package/contracts/contracts/interfaces/IAggregator.sol/IAggregator.json +1 -0
- package/contracts/contracts/interfaces/IEntryPoint.sol/IEntryPoint.json +1 -0
- package/contracts/contracts/interfaces/INonceManager.sol/INonceManager.json +1 -0
- package/contracts/contracts/interfaces/IStakeManager.sol/IStakeManager.json +1 -0
- package/contracts/core/Eip7702Support.sol/Eip7702Support.json +1 -0
- package/contracts/core/NonceManager.sol/NonceManager.json +1 -0
- package/contracts/core/SenderCreator.sol/SenderCreator.json +1 -0
- package/contracts/core/StakeManager.sol/StakeManager.json +1 -0
- package/contracts/core/UserOperationLib.sol/UserOperationLib.json +1 -0
- package/contracts/interfaces/IAccount.sol/IAccount.json +1 -0
- package/contracts/interfaces/IAccountExecute.sol/IAccountExecute.json +1 -0
- package/contracts/interfaces/IAggregator.sol/IAggregator.json +1 -0
- package/contracts/interfaces/IEntryPoint.sol/IEntryPoint.json +1 -0
- package/contracts/interfaces/INonceManager.sol/INonceManager.json +1 -0
- package/contracts/interfaces/IPaymaster.sol/IPaymaster.json +1 -0
- package/contracts/interfaces/ISenderCreator.sol/ISenderCreator.json +1 -0
- package/contracts/interfaces/IStakeManager.sol/IStakeManager.json +1 -0
- package/contracts/overrides/Eip7702Support.sol/Eip7702Support.json +1 -0
- package/contracts/overrides/NonceManager.sol/NonceManager.json +1 -0
- package/contracts/overrides/SenderCreator.sol/SenderCreator.json +1 -0
- package/contracts/overrides/StakeManager.sol/StakeManager.json +1 -0
- package/contracts/overrides/UserOperationLib.sol/UserOperationLib.json +1 -0
- package/contracts/utils/Exec.sol/Exec.json +1 -0
- package/contracts/utils/StorageSlot.sol/StorageSlot.json +1 -0
- package/contracts/v09/EntryPoint.sol/EntryPoint.json +1 -0
- package/esm/cli/alto.js +16 -7
- package/esm/cli/alto.js.map +1 -1
- package/esm/cli/config/bundler.d.ts +690 -540
- package/esm/cli/config/bundler.js +101 -66
- package/esm/cli/config/bundler.js.map +1 -1
- package/esm/cli/config/options.d.ts +2 -1
- package/esm/cli/config/options.js +207 -59
- package/esm/cli/config/options.js.map +1 -1
- package/esm/cli/customTransport.d.ts +3 -3
- package/esm/cli/customTransport.js +4 -3
- package/esm/cli/customTransport.js.map +1 -1
- package/esm/cli/deploySimulationsContract.d.ts +5 -2
- package/esm/cli/deploySimulationsContract.js +108 -40
- package/esm/cli/deploySimulationsContract.js.map +1 -1
- package/esm/cli/handler.js +94 -22
- package/esm/cli/handler.js.map +1 -1
- package/esm/cli/instrumentation.js +7 -1
- package/esm/cli/instrumentation.js.map +1 -1
- package/esm/cli/parseArgs.js.map +1 -1
- package/esm/cli/setupServer.js +63 -63
- package/esm/cli/setupServer.js.map +1 -1
- package/esm/cli/shutDown.d.ts +20 -0
- package/esm/cli/shutDown.js +260 -0
- package/esm/cli/shutDown.js.map +1 -0
- package/esm/contracts/EntryPointFilterOpsOverride.sol/EntryPointFilterOpsOverride06.json +1 -0
- package/esm/contracts/EntryPointFilterOpsOverride.sol/EntryPointFilterOpsOverride07.json +1 -0
- package/esm/contracts/EntryPointFilterOpsOverride.sol/EntryPointFilterOpsOverride08.json +1 -0
- package/esm/contracts/EntryPointFilterOpsOverride.sol/EntryPointFilterOpsOverride09.json +1 -0
- package/esm/contracts/EntryPointGasEstimationOverride.sol/EntryPointGasEstimationOverride06.json +1 -0
- package/esm/contracts/EntryPointSimulations.sol/EntryPointSimulations07.json +1 -0
- package/esm/contracts/EntryPointSimulations.sol/EntryPointSimulations08.json +1 -0
- package/esm/contracts/EntryPointSimulations.sol/EntryPointSimulations09.json +1 -0
- package/esm/contracts/PimlicoSimulations.sol/PimlicoSimulations.json +1 -0
- package/esm/createConfig.d.ts +12 -4
- package/esm/createConfig.js +2 -0
- package/esm/createConfig.js.map +1 -1
- package/esm/executor/bundleManager.d.ts +111 -0
- package/esm/executor/bundleManager.js +354 -0
- package/esm/executor/bundleManager.js.map +1 -0
- package/esm/executor/executor.d.ts +18 -23
- package/esm/executor/executor.js +183 -119
- package/esm/executor/executor.js.map +1 -1
- package/esm/executor/executorManager.d.ts +39 -88
- package/esm/executor/executorManager.js +325 -550
- package/esm/executor/executorManager.js.map +1 -1
- package/esm/executor/filterOpsAndEstimateGas.d.ts +39 -0
- package/esm/executor/filterOpsAndEstimateGas.js +280 -0
- package/esm/executor/filterOpsAndEstimateGas.js.map +1 -0
- package/esm/executor/getBundleStatus.d.ts +25 -0
- package/esm/executor/getBundleStatus.js +35 -0
- package/esm/executor/getBundleStatus.js.map +1 -0
- package/esm/executor/index.d.ts +1 -0
- package/esm/executor/index.js +1 -0
- package/esm/executor/index.js.map +1 -1
- package/esm/executor/senderManager/createMemorySenderManager.d.ts +3 -3
- package/esm/executor/senderManager/createMemorySenderManager.js +14 -1
- package/esm/executor/senderManager/createMemorySenderManager.js.map +1 -1
- package/esm/executor/senderManager/createRedisSenderManager.d.ts +5 -4
- package/esm/executor/senderManager/createRedisSenderManager.js +4 -7
- package/esm/executor/senderManager/createRedisSenderManager.js.map +1 -1
- package/esm/executor/senderManager/flushOnStartUp.d.ts +3 -3
- package/esm/executor/senderManager/flushOnStartUp.js +4 -4
- package/esm/executor/senderManager/flushOnStartUp.js.map +1 -1
- package/esm/executor/senderManager/index.d.ts +4 -3
- package/esm/executor/senderManager/index.js +6 -2
- package/esm/executor/senderManager/index.js.map +1 -1
- package/esm/executor/senderManager/validateAndRefill.d.ts +4 -4
- package/esm/executor/senderManager/validateAndRefill.js +3 -3
- package/esm/executor/senderManager/validateAndRefill.js.map +1 -1
- package/esm/executor/utilityWalletMonitor.d.ts +5 -5
- package/esm/executor/utilityWalletMonitor.js +1 -1
- package/esm/executor/utilityWalletMonitor.js.map +1 -1
- package/esm/executor/utils.d.ts +14 -6
- package/esm/executor/utils.js +68 -37
- package/esm/executor/utils.js.map +1 -1
- package/esm/handlers/arbitrumGasPriceManager.d.ts +4 -3
- package/esm/handlers/arbitrumGasPriceManager.js +9 -5
- package/esm/handlers/arbitrumGasPriceManager.js.map +1 -1
- package/esm/handlers/eventManager.d.ts +19 -18
- package/esm/handlers/eventManager.js +81 -61
- package/esm/handlers/eventManager.js.map +1 -1
- package/esm/handlers/gasPriceManager.d.ts +12 -10
- package/esm/handlers/gasPriceManager.js +79 -125
- package/esm/handlers/gasPriceManager.js.map +1 -1
- package/esm/handlers/mantleGasPriceManager.d.ts +5 -5
- package/esm/handlers/mantleGasPriceManager.js +4 -4
- package/esm/handlers/mantleGasPriceManager.js.map +1 -1
- package/esm/handlers/optimismManager.d.ts +2 -2
- package/esm/handlers/optimismManager.js +1 -1
- package/esm/handlers/optimismManager.js.map +1 -1
- package/esm/mempool/index.d.ts +1 -1
- package/esm/mempool/index.js +1 -1
- package/esm/mempool/index.js.map +1 -1
- package/esm/mempool/mempool.d.ts +71 -33
- package/esm/mempool/mempool.js +231 -155
- package/esm/mempool/mempool.js.map +1 -1
- package/esm/mempool/reputationManager.d.ts +36 -36
- package/esm/mempool/reputationManager.js +93 -97
- package/esm/mempool/reputationManager.js.map +1 -1
- package/esm/mempool/statusManager.d.ts +20 -0
- package/esm/mempool/statusManager.js +143 -0
- package/esm/mempool/statusManager.js.map +1 -0
- package/esm/receiptCache/createMemoryReceiptCache.d.ts +3 -0
- package/esm/receiptCache/createMemoryReceiptCache.js +30 -0
- package/esm/receiptCache/createMemoryReceiptCache.js.map +1 -0
- package/esm/receiptCache/createRedisReceiptCache.d.ts +10 -0
- package/esm/receiptCache/createRedisReceiptCache.js +56 -0
- package/esm/receiptCache/createRedisReceiptCache.js.map +1 -0
- package/esm/receiptCache/index.d.ts +11 -0
- package/esm/receiptCache/index.js +21 -0
- package/esm/receiptCache/index.js.map +1 -0
- package/esm/rpc/createMethodHandler.d.ts +2 -2
- package/esm/rpc/createMethodHandler.js.map +1 -1
- package/esm/rpc/estimation/gasEstimationHandler.d.ts +15 -16
- package/esm/rpc/estimation/gasEstimationHandler.js +24 -24
- package/esm/rpc/estimation/gasEstimationHandler.js.map +1 -1
- package/esm/rpc/estimation/gasEstimations06.d.ts +18 -0
- package/esm/rpc/estimation/gasEstimations06.js +45 -0
- package/esm/rpc/estimation/gasEstimations06.js.map +1 -0
- package/esm/rpc/estimation/gasEstimations07.d.ts +63 -0
- package/esm/rpc/estimation/gasEstimations07.js +384 -0
- package/esm/rpc/estimation/gasEstimations07.js.map +1 -0
- package/esm/rpc/estimation/preVerificationGasCalculator.d.ts +56 -0
- package/esm/rpc/estimation/preVerificationGasCalculator.js +467 -0
- package/esm/rpc/estimation/preVerificationGasCalculator.js.map +1 -0
- package/esm/rpc/estimation/types.d.ts +25 -111
- package/esm/rpc/estimation/types.js +5 -121
- package/esm/rpc/estimation/types.js.map +1 -1
- package/esm/rpc/estimation/utils.d.ts +69 -0
- package/esm/rpc/estimation/utils.js +240 -0
- package/esm/rpc/estimation/utils.js.map +1 -0
- package/{lib/rpc/methods/pimlico_sendUserOperationNow.d.ts → esm/rpc/methods/boost_sendUserOperation.d.ts} +299 -385
- package/esm/rpc/methods/boost_sendUserOperation.js +57 -0
- package/esm/rpc/methods/boost_sendUserOperation.js.map +1 -0
- package/esm/rpc/methods/debug_bundler_clearReputation.js +2 -2
- package/esm/rpc/methods/debug_bundler_clearReputation.js.map +1 -1
- package/esm/rpc/methods/debug_bundler_clearState.js +2 -2
- package/esm/rpc/methods/debug_bundler_clearState.js.map +1 -1
- package/esm/rpc/methods/debug_bundler_dumpMempool.d.ts +338 -0
- package/esm/rpc/methods/debug_bundler_dumpMempool.js +1 -1
- package/esm/rpc/methods/debug_bundler_dumpMempool.js.map +1 -1
- package/esm/rpc/methods/debug_bundler_dumpReputation.js +2 -2
- package/esm/rpc/methods/debug_bundler_dumpReputation.js.map +1 -1
- package/esm/rpc/methods/debug_bundler_getStakeStatus.js +1 -2
- package/esm/rpc/methods/debug_bundler_getStakeStatus.js.map +1 -1
- package/esm/rpc/methods/debug_bundler_sendBundleNow.js +10 -2
- package/esm/rpc/methods/debug_bundler_sendBundleNow.js.map +1 -1
- package/esm/rpc/methods/debug_bundler_setBundlingMode.js +1 -1
- package/esm/rpc/methods/debug_bundler_setBundlingMode.js.map +1 -1
- package/esm/rpc/methods/debug_bundler_setReputation.js +1 -1
- package/esm/rpc/methods/debug_bundler_setReputation.js.map +1 -1
- package/esm/rpc/methods/eth_chainId.js +1 -1
- package/esm/rpc/methods/eth_chainId.js.map +1 -1
- package/esm/rpc/methods/eth_estimateUserOperationGas.d.ts +910 -301
- package/esm/rpc/methods/eth_estimateUserOperationGas.js +228 -12
- package/esm/rpc/methods/eth_estimateUserOperationGas.js.map +1 -1
- package/esm/rpc/methods/eth_getUserOperationByHash.d.ts +621 -11
- package/esm/rpc/methods/eth_getUserOperationByHash.js +8 -8
- package/esm/rpc/methods/eth_getUserOperationByHash.js.map +1 -1
- package/esm/rpc/methods/eth_getUserOperationReceipt.d.ts +26 -26
- package/esm/rpc/methods/eth_getUserOperationReceipt.js +10 -4
- package/esm/rpc/methods/eth_getUserOperationReceipt.js.map +1 -1
- package/esm/rpc/methods/eth_sendUserOperation.d.ts +319 -2
- package/esm/rpc/methods/eth_sendUserOperation.js +223 -20
- package/esm/rpc/methods/eth_sendUserOperation.js.map +1 -1
- package/esm/rpc/methods/eth_supportedEntryPoints.js +1 -1
- package/esm/rpc/methods/eth_supportedEntryPoints.js.map +1 -1
- package/esm/rpc/methods/index.js +11 -6
- package/esm/rpc/methods/index.js.map +1 -1
- package/esm/rpc/methods/pimlico_getUserOperationGasPrice.js +1 -1
- package/esm/rpc/methods/pimlico_getUserOperationGasPrice.js.map +1 -1
- package/esm/rpc/methods/pimlico_getUserOperationStatus.d.ts +6 -6
- package/esm/rpc/methods/pimlico_getUserOperationStatus.js +3 -3
- package/esm/rpc/methods/pimlico_getUserOperationStatus.js.map +1 -1
- package/esm/rpc/methods/pimlico_sendUserOperationNow.d.ts +330 -26
- package/esm/rpc/methods/pimlico_sendUserOperationNow.js +27 -24
- package/esm/rpc/methods/pimlico_sendUserOperationNow.js.map +1 -1
- package/{lib/rpc/methods/eth_estimateUserOperationGas.d.ts → esm/rpc/methods/pimlico_simulateAssetChange.d.ts} +891 -333
- package/esm/rpc/methods/pimlico_simulateAssetChange.js +113 -0
- package/esm/rpc/methods/pimlico_simulateAssetChange.js.map +1 -0
- package/esm/rpc/rpcHandler.d.ts +30 -54
- package/esm/rpc/rpcHandler.js +137 -315
- package/esm/rpc/rpcHandler.js.map +1 -1
- package/esm/rpc/server.d.ts +5 -5
- package/esm/rpc/server.js +15 -11
- package/esm/rpc/server.js.map +1 -1
- package/esm/rpc/validation/BundlerCollectorTracerV06.js +2 -2
- package/esm/rpc/validation/BundlerCollectorTracerV06.js.map +1 -1
- package/esm/rpc/validation/BundlerCollectorTracerV07.js +1 -1
- package/esm/rpc/validation/BundlerCollectorTracerV07.js.map +1 -1
- package/esm/rpc/validation/SafeValidator.d.ts +20 -22
- package/esm/rpc/validation/SafeValidator.js +87 -100
- package/esm/rpc/validation/SafeValidator.js.map +1 -1
- package/esm/rpc/validation/TracerResultParserV06.d.ts +3 -3
- package/esm/rpc/validation/TracerResultParserV06.js +19 -19
- package/esm/rpc/validation/TracerResultParserV06.js.map +1 -1
- package/esm/rpc/validation/TracerResultParserV07.d.ts +3 -3
- package/esm/rpc/validation/TracerResultParserV07.js +25 -25
- package/esm/rpc/validation/TracerResultParserV07.js.map +1 -1
- package/esm/rpc/validation/UnsafeValidator.d.ts +32 -33
- package/esm/rpc/validation/UnsafeValidator.js +117 -101
- package/esm/rpc/validation/UnsafeValidator.js.map +1 -1
- package/esm/rpc/validation/tracer.d.ts +1 -1
- package/esm/store/createMempoolStore.d.ts +3 -3
- package/esm/store/createMempoolStore.js +100 -113
- package/esm/store/createMempoolStore.js.map +1 -1
- package/esm/store/index.d.ts +4 -80
- package/esm/store/index.js +4 -1
- package/esm/store/index.js.map +1 -1
- package/esm/store/outstanding/index.d.ts +13 -0
- package/esm/store/outstanding/index.js +16 -0
- package/esm/store/outstanding/index.js.map +1 -0
- package/esm/store/outstanding/memory.d.ts +29 -0
- package/esm/store/outstanding/memory.js +263 -0
- package/esm/store/outstanding/memory.js.map +1 -0
- package/esm/store/outstanding/redis.d.ts +11 -0
- package/esm/store/outstanding/redis.js +229 -0
- package/esm/store/outstanding/redis.js.map +1 -0
- package/esm/store/outstanding/types.d.ts +19 -0
- package/esm/store/outstanding/types.js +2 -0
- package/esm/store/outstanding/types.js.map +1 -0
- package/esm/store/processing/index.d.ts +11 -0
- package/esm/store/processing/index.js +17 -0
- package/esm/store/processing/index.js.map +1 -0
- package/esm/store/processing/memory.d.ts +16 -0
- package/esm/store/processing/memory.js +58 -0
- package/esm/store/processing/memory.js.map +1 -0
- package/esm/store/processing/redis.d.ts +23 -0
- package/esm/store/processing/redis.js +85 -0
- package/esm/store/processing/redis.js.map +1 -0
- package/esm/store/processing/types.d.ts +10 -0
- package/esm/store/processing/types.js +2 -0
- package/esm/store/processing/types.js.map +1 -0
- package/esm/store/types.d.ts +50 -0
- package/esm/store/types.js +2 -0
- package/esm/store/types.js.map +1 -0
- package/esm/types/contracts/PimlicoSimulations.d.ts +1661 -0
- package/esm/types/contracts/{EntryPointSimulationsV7.js → PimlicoSimulations.js} +1104 -1788
- package/esm/types/contracts/PimlicoSimulations.js.map +1 -0
- package/esm/types/contracts/index.d.ts +1 -3
- package/esm/types/contracts/index.js +1 -3
- package/esm/types/contracts/index.js.map +1 -1
- package/esm/types/gasPrice.js +0 -18
- package/esm/types/gasPrice.js.map +1 -1
- package/esm/types/interfaces.d.ts +26 -26
- package/esm/types/mempool.d.ts +14 -28
- package/esm/types/mempool.js +1 -7
- package/esm/types/mempool.js.map +1 -1
- package/esm/types/schemas.d.ts +26347 -10767
- package/esm/types/schemas.js +202 -38
- package/esm/types/schemas.js.map +1 -1
- package/esm/types/utils.d.ts +2 -5
- package/esm/types/utils.js +16 -18
- package/esm/types/utils.js.map +1 -1
- package/esm/types/validation.d.ts +9447 -8727
- package/esm/types/validation.js +123 -161
- package/esm/types/validation.js.map +1 -1
- package/esm/utils/asyncTimeout.d.ts +5 -0
- package/esm/utils/asyncTimeout.js +23 -0
- package/esm/utils/asyncTimeout.js.map +1 -0
- package/esm/utils/bigInt.d.ts +9 -0
- package/esm/utils/bigInt.js +19 -2
- package/esm/utils/bigInt.js.map +1 -1
- package/esm/utils/eip7702.d.ts +4 -3
- package/esm/utils/eip7702.js +16 -7
- package/esm/utils/eip7702.js.map +1 -1
- package/esm/utils/entryPointOverrides.d.ts +12 -0
- package/esm/utils/entryPointOverrides.js +71 -0
- package/esm/utils/entryPointOverrides.js.map +1 -0
- package/esm/utils/helpers.d.ts +5 -3
- package/esm/utils/helpers.js +36 -13
- package/esm/utils/helpers.js.map +1 -1
- package/esm/utils/index.d.ts +2 -2
- package/esm/utils/index.js +1 -1
- package/esm/utils/index.js.map +1 -1
- package/esm/utils/metrics.d.ts +11 -9
- package/esm/utils/metrics.js +44 -25
- package/esm/utils/metrics.js.map +1 -1
- package/esm/utils/minMaxQueue/createMemoryMinMaxQueue.d.ts +2 -2
- package/esm/utils/minMaxQueue/createMemoryMinMaxQueue.js +2 -2
- package/esm/utils/minMaxQueue/createMemoryMinMaxQueue.js.map +1 -1
- package/esm/utils/minMaxQueue/createRedisMinMaxQueue.d.ts +26 -4
- package/esm/utils/minMaxQueue/createRedisMinMaxQueue.js +111 -71
- package/esm/utils/minMaxQueue/createRedisMinMaxQueue.js.map +1 -1
- package/esm/utils/minMaxQueue/index.d.ts +3 -3
- package/esm/utils/minMaxQueue/index.js +4 -3
- package/esm/utils/minMaxQueue/index.js.map +1 -1
- package/esm/utils/rpc-reply.d.ts +3 -3
- package/esm/utils/rpc-reply.js.map +1 -1
- package/esm/utils/toViemStateOverrides.d.ts +4 -0
- package/esm/utils/toViemStateOverrides.js +44 -0
- package/esm/utils/toViemStateOverrides.js.map +1 -0
- package/esm/utils/userop.d.ts +89 -87
- package/esm/utils/userop.js +207 -439
- package/esm/utils/userop.js.map +1 -1
- package/package.json +12 -7
- package/esm/executor/fastlane.d.ts +0 -9
- package/esm/executor/fastlane.js +0 -37
- package/esm/executor/fastlane.js.map +0 -1
- package/esm/executor/filterOpsAndEStimateGas.d.ts +0 -29
- package/esm/executor/filterOpsAndEStimateGas.js +0 -198
- package/esm/executor/filterOpsAndEStimateGas.js.map +0 -1
- package/esm/mempool/monitoring.d.ts +0 -14
- package/esm/mempool/monitoring.js +0 -97
- package/esm/mempool/monitoring.js.map +0 -1
- package/esm/rpc/estimation/gasEstimationsV06.d.ts +0 -19
- package/esm/rpc/estimation/gasEstimationsV06.js +0 -144
- package/esm/rpc/estimation/gasEstimationsV06.js.map +0 -1
- package/esm/rpc/estimation/gasEstimationsV07.d.ts +0 -101
- package/esm/rpc/estimation/gasEstimationsV07.js +0 -721
- package/esm/rpc/estimation/gasEstimationsV07.js.map +0 -1
- package/esm/store/createMemoryOutstandingStore.d.ts +0 -28
- package/esm/store/createMemoryOutstandingStore.js +0 -231
- package/esm/store/createMemoryOutstandingStore.js.map +0 -1
- package/esm/store/createRedisOutstandingStore.d.ts +0 -27
- package/esm/store/createRedisOutstandingStore.js +0 -344
- package/esm/store/createRedisOutstandingStore.js.map +0 -1
- package/esm/store/createRedisStore.d.ts +0 -9
- package/esm/store/createRedisStore.js +0 -131
- package/esm/store/createRedisStore.js.map +0 -1
- package/esm/store/createStore.d.ts +0 -6
- package/esm/store/createStore.js +0 -66
- package/esm/store/createStore.js.map +0 -1
- package/esm/types/contracts/EntryPointSimulationsV6.d.ts +0 -34
- package/esm/types/contracts/EntryPointSimulationsV6.js +0 -48
- package/esm/types/contracts/EntryPointSimulationsV6.js.map +0 -1
- package/esm/types/contracts/EntryPointSimulationsV7.d.ts +0 -2193
- package/esm/types/contracts/EntryPointSimulationsV7.js.map +0 -1
- package/esm/types/contracts/PimlicoEntryPointSimulations.d.ts +0 -26
- package/esm/types/contracts/PimlicoEntryPointSimulations.js +0 -38
- package/esm/types/contracts/PimlicoEntryPointSimulations.js.map +0 -1
- package/esm/utils/validation.d.ts +0 -76
- package/esm/utils/validation.js +0 -484
- package/esm/utils/validation.js.map +0 -1
- package/lib/cli/alto.d.ts +0 -7
- package/lib/cli/alto.js +0 -141
- package/lib/cli/alto.js.map +0 -1
- package/lib/cli/config/bundler.d.ts +0 -2836
- package/lib/cli/config/bundler.js +0 -222
- package/lib/cli/config/bundler.js.map +0 -1
- package/lib/cli/config/index.d.ts +0 -3
- package/lib/cli/config/index.js +0 -19
- package/lib/cli/config/index.js.map +0 -1
- package/lib/cli/config/options.d.ts +0 -13
- package/lib/cli/config/options.js +0 -553
- package/lib/cli/config/options.js.map +0 -1
- package/lib/cli/customTransport.d.ts +0 -14
- package/lib/cli/customTransport.js +0 -94
- package/lib/cli/customTransport.js.map +0 -1
- package/lib/cli/deploySimulationsContract.d.ts +0 -13
- package/lib/cli/deploySimulationsContract.js +0 -112
- package/lib/cli/deploySimulationsContract.js.map +0 -1
- package/lib/cli/handler.d.ts +0 -3
- package/lib/cli/handler.js +0 -157
- package/lib/cli/handler.js.map +0 -1
- package/lib/cli/index.d.ts +0 -4
- package/lib/cli/index.js +0 -20
- package/lib/cli/index.js.map +0 -1
- package/lib/cli/instrumentation.d.ts +0 -2
- package/lib/cli/instrumentation.js +0 -47
- package/lib/cli/instrumentation.js.map +0 -1
- package/lib/cli/parseArgs.d.ts +0 -8
- package/lib/cli/parseArgs.js +0 -25
- package/lib/cli/parseArgs.js.map +0 -1
- package/lib/cli/setupServer.d.ts +0 -13
- package/lib/cli/setupServer.js +0 -266
- package/lib/cli/setupServer.js.map +0 -1
- package/lib/cli/util.d.ts +0 -22
- package/lib/cli/util.js +0 -34
- package/lib/cli/util.js.map +0 -1
- package/lib/createConfig.d.ts +0 -16
- package/lib/createConfig.js +0 -13
- package/lib/createConfig.js.map +0 -1
- package/lib/executor/executor.d.ts +0 -65
- package/lib/executor/executor.js +0 -285
- package/lib/executor/executor.js.map +0 -1
- package/lib/executor/executorManager.d.ts +0 -107
- package/lib/executor/executorManager.js +0 -682
- package/lib/executor/executorManager.js.map +0 -1
- package/lib/executor/fastlane.d.ts +0 -9
- package/lib/executor/fastlane.js +0 -41
- package/lib/executor/fastlane.js.map +0 -1
- package/lib/executor/filterOpsAndEStimateGas.d.ts +0 -29
- package/lib/executor/filterOpsAndEStimateGas.js +0 -225
- package/lib/executor/filterOpsAndEStimateGas.js.map +0 -1
- package/lib/executor/index.d.ts +0 -5
- package/lib/executor/index.js +0 -21
- package/lib/executor/index.js.map +0 -1
- package/lib/executor/senderManager/createMemorySenderManager.d.ts +0 -8
- package/lib/executor/senderManager/createMemorySenderManager.js +0 -45
- package/lib/executor/senderManager/createMemorySenderManager.js.map +0 -1
- package/lib/executor/senderManager/createRedisSenderManager.d.ts +0 -8
- package/lib/executor/senderManager/createRedisSenderManager.js +0 -85
- package/lib/executor/senderManager/createRedisSenderManager.js.map +0 -1
- package/lib/executor/senderManager/flushOnStartUp.d.ts +0 -9
- package/lib/executor/senderManager/flushOnStartUp.js +0 -37
- package/lib/executor/senderManager/flushOnStartUp.js.map +0 -1
- package/lib/executor/senderManager/index.d.ts +0 -15
- package/lib/executor/senderManager/index.js +0 -25
- package/lib/executor/senderManager/index.js.map +0 -1
- package/lib/executor/senderManager/validateAndRefill.d.ts +0 -11
- package/lib/executor/senderManager/validateAndRefill.js +0 -115
- package/lib/executor/senderManager/validateAndRefill.js.map +0 -1
- package/lib/executor/utilityWalletMonitor.d.ts +0 -19
- package/lib/executor/utilityWalletMonitor.js +0 -42
- package/lib/executor/utilityWalletMonitor.js.map +0 -1
- package/lib/executor/utils.d.ts +0 -31
- package/lib/executor/utils.js +0 -170
- package/lib/executor/utils.js.map +0 -1
- package/lib/handlers/arbitrumGasPriceManager.d.ts +0 -14
- package/lib/handlers/arbitrumGasPriceManager.js +0 -39
- package/lib/handlers/arbitrumGasPriceManager.js.map +0 -1
- package/lib/handlers/eventManager.d.ts +0 -28
- package/lib/handlers/eventManager.js +0 -207
- package/lib/handlers/eventManager.js.map +0 -1
- package/lib/handlers/gasPriceManager.d.ts +0 -36
- package/lib/handlers/gasPriceManager.js +0 -423
- package/lib/handlers/gasPriceManager.js.map +0 -1
- package/lib/handlers/index.d.ts +0 -3
- package/lib/handlers/index.js +0 -19
- package/lib/handlers/index.js.map +0 -1
- package/lib/handlers/mantleGasPriceManager.d.ts +0 -23
- package/lib/handlers/mantleGasPriceManager.js +0 -44
- package/lib/handlers/mantleGasPriceManager.js.map +0 -1
- package/lib/handlers/optimismManager.d.ts +0 -10
- package/lib/handlers/optimismManager.js +0 -21
- package/lib/handlers/optimismManager.js.map +0 -1
- package/lib/index.d.ts +0 -2
- package/lib/index.js +0 -4
- package/lib/index.js.map +0 -1
- package/lib/mempool/index.d.ts +0 -4
- package/lib/mempool/index.js +0 -20
- package/lib/mempool/index.js.map +0 -1
- package/lib/mempool/mempool.d.ts +0 -191
- package/lib/mempool/mempool.js +0 -498
- package/lib/mempool/mempool.js.map +0 -1
- package/lib/mempool/monitoring.d.ts +0 -14
- package/lib/mempool/monitoring.js +0 -101
- package/lib/mempool/monitoring.js.map +0 -1
- package/lib/mempool/reputationManager.d.ts +0 -121
- package/lib/mempool/reputationManager.js +0 -472
- package/lib/mempool/reputationManager.js.map +0 -1
- package/lib/rpc/createMethodHandler.d.ts +0 -31
- package/lib/rpc/createMethodHandler.js +0 -34
- package/lib/rpc/createMethodHandler.js.map +0 -1
- package/lib/rpc/estimation/gasEstimationHandler.d.ts +0 -30
- package/lib/rpc/estimation/gasEstimationHandler.js +0 -50
- package/lib/rpc/estimation/gasEstimationHandler.js.map +0 -1
- package/lib/rpc/estimation/gasEstimationsV06.d.ts +0 -19
- package/lib/rpc/estimation/gasEstimationsV06.js +0 -148
- package/lib/rpc/estimation/gasEstimationsV06.js.map +0 -1
- package/lib/rpc/estimation/gasEstimationsV07.d.ts +0 -101
- package/lib/rpc/estimation/gasEstimationsV07.js +0 -727
- package/lib/rpc/estimation/gasEstimationsV07.js.map +0 -1
- package/lib/rpc/estimation/types.d.ts +0 -120
- package/lib/rpc/estimation/types.js +0 -125
- package/lib/rpc/estimation/types.js.map +0 -1
- package/lib/rpc/index.d.ts +0 -4
- package/lib/rpc/index.js +0 -20
- package/lib/rpc/index.js.map +0 -1
- package/lib/rpc/methods/debug_bundler_clearReputation.d.ts +0 -22
- package/lib/rpc/methods/debug_bundler_clearReputation.js +0 -15
- package/lib/rpc/methods/debug_bundler_clearReputation.js.map +0 -1
- package/lib/rpc/methods/debug_bundler_clearState.d.ts +0 -22
- package/lib/rpc/methods/debug_bundler_clearState.js +0 -16
- package/lib/rpc/methods/debug_bundler_clearState.js.map +0 -1
- package/lib/rpc/methods/debug_bundler_dumpMempool.d.ts +0 -973
- package/lib/rpc/methods/debug_bundler_dumpMempool.js +0 -16
- package/lib/rpc/methods/debug_bundler_dumpMempool.js.map +0 -1
- package/lib/rpc/methods/debug_bundler_dumpReputation.d.ts +0 -57
- package/lib/rpc/methods/debug_bundler_dumpReputation.js +0 -16
- package/lib/rpc/methods/debug_bundler_dumpReputation.js.map +0 -1
- package/lib/rpc/methods/debug_bundler_getStakeStatus.d.ts +0 -79
- package/lib/rpc/methods/debug_bundler_getStakeStatus.js +0 -25
- package/lib/rpc/methods/debug_bundler_getStakeStatus.js.map +0 -1
- package/lib/rpc/methods/debug_bundler_sendBundleNow.d.ts +0 -22
- package/lib/rpc/methods/debug_bundler_sendBundleNow.js +0 -15
- package/lib/rpc/methods/debug_bundler_sendBundleNow.js.map +0 -1
- package/lib/rpc/methods/debug_bundler_setBundlingMode.d.ts +0 -22
- package/lib/rpc/methods/debug_bundler_setBundlingMode.js +0 -16
- package/lib/rpc/methods/debug_bundler_setBundlingMode.js.map +0 -1
- package/lib/rpc/methods/debug_bundler_setReputation.d.ts +0 -46
- package/lib/rpc/methods/debug_bundler_setReputation.js +0 -16
- package/lib/rpc/methods/debug_bundler_setReputation.js.map +0 -1
- package/lib/rpc/methods/eth_chainId.d.ts +0 -22
- package/lib/rpc/methods/eth_chainId.js +0 -13
- package/lib/rpc/methods/eth_chainId.js.map +0 -1
- package/lib/rpc/methods/eth_estimateUserOperationGas.js +0 -26
- package/lib/rpc/methods/eth_estimateUserOperationGas.js.map +0 -1
- package/lib/rpc/methods/eth_getUserOperationByHash.d.ts +0 -1775
- package/lib/rpc/methods/eth_getUserOperationByHash.js +0 -101
- package/lib/rpc/methods/eth_getUserOperationByHash.js.map +0 -1
- package/lib/rpc/methods/eth_getUserOperationReceipt.d.ts +0 -412
- package/lib/rpc/methods/eth_getUserOperationReceipt.js +0 -14
- package/lib/rpc/methods/eth_getUserOperationReceipt.js.map +0 -1
- package/lib/rpc/methods/eth_sendUserOperation.d.ts +0 -878
- package/lib/rpc/methods/eth_sendUserOperation.js +0 -44
- package/lib/rpc/methods/eth_sendUserOperation.js.map +0 -1
- package/lib/rpc/methods/eth_supportedEntryPoints.d.ts +0 -22
- package/lib/rpc/methods/eth_supportedEntryPoints.js +0 -13
- package/lib/rpc/methods/eth_supportedEntryPoints.js.map +0 -1
- package/lib/rpc/methods/index.d.ts +0 -3
- package/lib/rpc/methods/index.js +0 -44
- package/lib/rpc/methods/index.js.map +0 -1
- package/lib/rpc/methods/pimlico_getUserOperationGasPrice.d.ts +0 -131
- package/lib/rpc/methods/pimlico_getUserOperationGasPrice.js +0 -33
- package/lib/rpc/methods/pimlico_getUserOperationGasPrice.js.map +0 -1
- package/lib/rpc/methods/pimlico_getUserOperationStatus.d.ts +0 -43
- package/lib/rpc/methods/pimlico_getUserOperationStatus.js +0 -14
- package/lib/rpc/methods/pimlico_getUserOperationStatus.js.map +0 -1
- package/lib/rpc/methods/pimlico_sendUserOperationNow.js +0 -53
- package/lib/rpc/methods/pimlico_sendUserOperationNow.js.map +0 -1
- package/lib/rpc/rpcHandler.d.ts +0 -75
- package/lib/rpc/rpcHandler.js +0 -408
- package/lib/rpc/rpcHandler.js.map +0 -1
- package/lib/rpc/server.d.ts +0 -26
- package/lib/rpc/server.js +0 -283
- package/lib/rpc/server.js.map +0 -1
- package/lib/rpc/validation/BundlerCollectorTracerV06.d.ts +0 -102
- package/lib/rpc/validation/BundlerCollectorTracerV06.js +0 -262
- package/lib/rpc/validation/BundlerCollectorTracerV06.js.map +0 -1
- package/lib/rpc/validation/BundlerCollectorTracerV07.d.ts +0 -102
- package/lib/rpc/validation/BundlerCollectorTracerV07.js +0 -261
- package/lib/rpc/validation/BundlerCollectorTracerV07.js.map +0 -1
- package/lib/rpc/validation/SafeValidator.d.ts +0 -52
- package/lib/rpc/validation/SafeValidator.js +0 -350
- package/lib/rpc/validation/SafeValidator.js.map +0 -1
- package/lib/rpc/validation/TracerResultParserV06.d.ts +0 -13
- package/lib/rpc/validation/TracerResultParserV06.js +0 -582
- package/lib/rpc/validation/TracerResultParserV06.js.map +0 -1
- package/lib/rpc/validation/TracerResultParserV07.d.ts +0 -33
- package/lib/rpc/validation/TracerResultParserV07.js +0 -599
- package/lib/rpc/validation/TracerResultParserV07.js.map +0 -1
- package/lib/rpc/validation/UnsafeValidator.d.ts +0 -98
- package/lib/rpc/validation/UnsafeValidator.js +0 -326
- package/lib/rpc/validation/UnsafeValidator.js.map +0 -1
- package/lib/rpc/validation/index.d.ts +0 -3
- package/lib/rpc/validation/index.js +0 -19
- package/lib/rpc/validation/index.js.map +0 -1
- package/lib/rpc/validation/tracer.d.ts +0 -125
- package/lib/rpc/validation/tracer.js +0 -112
- package/lib/rpc/validation/tracer.js.map +0 -1
- package/lib/store/createMemoryOutstandingStore.d.ts +0 -28
- package/lib/store/createMemoryOutstandingStore.js +0 -236
- package/lib/store/createMemoryOutstandingStore.js.map +0 -1
- package/lib/store/createMempoolStore.d.ts +0 -8
- package/lib/store/createMempoolStore.js +0 -199
- package/lib/store/createMempoolStore.js.map +0 -1
- package/lib/store/createRedisOutstandingStore.d.ts +0 -27
- package/lib/store/createRedisOutstandingStore.js +0 -349
- package/lib/store/createRedisOutstandingStore.js.map +0 -1
- package/lib/store/createRedisStore.d.ts +0 -9
- package/lib/store/createRedisStore.js +0 -138
- package/lib/store/createRedisStore.js.map +0 -1
- package/lib/store/createStore.d.ts +0 -6
- package/lib/store/createStore.js +0 -70
- package/lib/store/createStore.js.map +0 -1
- package/lib/store/index.d.ts +0 -81
- package/lib/store/index.js +0 -6
- package/lib/store/index.js.map +0 -1
- package/lib/types/contracts/ArbitrumL1FeeAbi.d.ts +0 -32
- package/lib/types/contracts/ArbitrumL1FeeAbi.js +0 -45
- package/lib/types/contracts/ArbitrumL1FeeAbi.js.map +0 -1
- package/lib/types/contracts/CallEngine.d.ts +0 -28
- package/lib/types/contracts/CallEngine.js +0 -40
- package/lib/types/contracts/CallEngine.js.map +0 -1
- package/lib/types/contracts/CodeHashGetter.d.ts +0 -37
- package/lib/types/contracts/CodeHashGetter.js +0 -48
- package/lib/types/contracts/CodeHashGetter.js.map +0 -1
- package/lib/types/contracts/EntryPoint.d.ts +0 -1789
- package/lib/types/contracts/EntryPoint.js +0 -2307
- package/lib/types/contracts/EntryPoint.js.map +0 -1
- package/lib/types/contracts/EntryPointSimulationsV6.d.ts +0 -34
- package/lib/types/contracts/EntryPointSimulationsV6.js +0 -51
- package/lib/types/contracts/EntryPointSimulationsV6.js.map +0 -1
- package/lib/types/contracts/EntryPointSimulationsV7.d.ts +0 -2193
- package/lib/types/contracts/EntryPointSimulationsV7.js +0 -2828
- package/lib/types/contracts/EntryPointSimulationsV7.js.map +0 -1
- package/lib/types/contracts/IAccountExecute.d.ts +0 -53
- package/lib/types/contracts/IAccountExecute.js +0 -71
- package/lib/types/contracts/IAccountExecute.js.map +0 -1
- package/lib/types/contracts/IPaymaster.d.ts +0 -3
- package/lib/types/contracts/IPaymaster.js +0 -120
- package/lib/types/contracts/IPaymaster.js.map +0 -1
- package/lib/types/contracts/MantleBvmGasPriceOracle.d.ts +0 -219
- package/lib/types/contracts/MantleBvmGasPriceOracle.js +0 -180
- package/lib/types/contracts/MantleBvmGasPriceOracle.js.map +0 -1
- package/lib/types/contracts/OpL1FeeAbi.d.ts +0 -114
- package/lib/types/contracts/OpL1FeeAbi.js +0 -77
- package/lib/types/contracts/OpL1FeeAbi.js.map +0 -1
- package/lib/types/contracts/PimlicoEntryPointSimulations.d.ts +0 -26
- package/lib/types/contracts/PimlicoEntryPointSimulations.js +0 -41
- package/lib/types/contracts/PimlicoEntryPointSimulations.js.map +0 -1
- package/lib/types/contracts/SenderCreator.d.ts +0 -4
- package/lib/types/contracts/SenderCreator.js +0 -26
- package/lib/types/contracts/SenderCreator.js.map +0 -1
- package/lib/types/contracts/SimpleAccountFactory.d.ts +0 -57
- package/lib/types/contracts/SimpleAccountFactory.js +0 -79
- package/lib/types/contracts/SimpleAccountFactory.js.map +0 -1
- package/lib/types/contracts/TestOpcodesAccount.d.ts +0 -4
- package/lib/types/contracts/TestOpcodesAccount.js +0 -284
- package/lib/types/contracts/TestOpcodesAccount.js.map +0 -1
- package/lib/types/contracts/TestOpcodesAccountFactory.d.ts +0 -4
- package/lib/types/contracts/TestOpcodesAccountFactory.js +0 -26
- package/lib/types/contracts/TestOpcodesAccountFactory.js.map +0 -1
- package/lib/types/contracts/TestStorageAccount.d.ts +0 -4
- package/lib/types/contracts/TestStorageAccount.js +0 -316
- package/lib/types/contracts/TestStorageAccount.js.map +0 -1
- package/lib/types/contracts/index.d.ts +0 -17
- package/lib/types/contracts/index.js +0 -33
- package/lib/types/contracts/index.js.map +0 -1
- package/lib/types/gasPrice.d.ts +0 -110
- package/lib/types/gasPrice.js +0 -55
- package/lib/types/gasPrice.js.map +0 -1
- package/lib/types/index.d.ts +0 -11
- package/lib/types/index.js +0 -27
- package/lib/types/index.js.map +0 -1
- package/lib/types/interfaces.d.ts +0 -59
- package/lib/types/interfaces.js +0 -3
- package/lib/types/interfaces.js.map +0 -1
- package/lib/types/mempool.d.ts +0 -60
- package/lib/types/mempool.js +0 -11
- package/lib/types/mempool.js.map +0 -1
- package/lib/types/schemas.d.ts +0 -20779
- package/lib/types/schemas.js +0 -638
- package/lib/types/schemas.js.map +0 -1
- package/lib/types/utils.d.ts +0 -25
- package/lib/types/utils.js +0 -35
- package/lib/types/utils.js.map +0 -1
- package/lib/types/validation.d.ts +0 -14327
- package/lib/types/validation.js +0 -312
- package/lib/types/validation.js.map +0 -1
- package/lib/utils/bigInt.d.ts +0 -4
- package/lib/utils/bigInt.js +0 -19
- package/lib/utils/bigInt.js.map +0 -1
- package/lib/utils/eip7702.d.ts +0 -4
- package/lib/utils/eip7702.js +0 -21
- package/lib/utils/eip7702.js.map +0 -1
- package/lib/utils/fastify-rpc-decorators.d.ts +0 -19
- package/lib/utils/fastify-rpc-decorators.js +0 -23
- package/lib/utils/fastify-rpc-decorators.js.map +0 -1
- package/lib/utils/helpers.d.ts +0 -15
- package/lib/utils/helpers.js +0 -59
- package/lib/utils/helpers.js.map +0 -1
- package/lib/utils/index.d.ts +0 -8
- package/lib/utils/index.js +0 -23
- package/lib/utils/index.js.map +0 -1
- package/lib/utils/logger.d.ts +0 -6
- package/lib/utils/logger.js +0 -85
- package/lib/utils/logger.js.map +0 -1
- package/lib/utils/metrics.d.ts +0 -28
- package/lib/utils/metrics.js +0 -192
- package/lib/utils/metrics.js.map +0 -1
- package/lib/utils/minMaxQueue/createMemoryMinMaxQueue.d.ts +0 -6
- package/lib/utils/minMaxQueue/createMemoryMinMaxQueue.js +0 -57
- package/lib/utils/minMaxQueue/createMemoryMinMaxQueue.js.map +0 -1
- package/lib/utils/minMaxQueue/createRedisMinMaxQueue.d.ts +0 -7
- package/lib/utils/minMaxQueue/createRedisMinMaxQueue.js +0 -105
- package/lib/utils/minMaxQueue/createRedisMinMaxQueue.js.map +0 -1
- package/lib/utils/minMaxQueue/index.d.ts +0 -12
- package/lib/utils/minMaxQueue/index.js +0 -16
- package/lib/utils/minMaxQueue/index.js.map +0 -1
- package/lib/utils/rpc-reply.d.ts +0 -16
- package/lib/utils/rpc-reply.js +0 -41
- package/lib/utils/rpc-reply.js.map +0 -1
- package/lib/utils/userop.d.ts +0 -138
- package/lib/utils/userop.js +0 -620
- package/lib/utils/userop.js.map +0 -1
- package/lib/utils/validation.d.ts +0 -76
- package/lib/utils/validation.js +0 -500
- package/lib/utils/validation.js.map +0 -1
|
@@ -1,46 +1,34 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getAAError, getBundleStatus, parseUserOperationReceipt, scaleBigIntByPercent } from "../utils/index.js";
|
|
3
|
-
import { TransactionReceiptNotFoundError, getAbiItem, InsufficientFundsError, NonceTooLowError } from "viem";
|
|
4
|
-
import { BaseError } from "abitype";
|
|
1
|
+
import { scaleBigIntByPercent } from "../utils/index.js";
|
|
5
2
|
import { getUserOpHashes } from "./utils.js";
|
|
6
|
-
|
|
7
|
-
const transactionInfos = submittedOps.map((userOpInfo) => userOpInfo.transactionInfo);
|
|
8
|
-
// Remove duplicates
|
|
9
|
-
return Array.from(new Set(transactionInfos));
|
|
10
|
-
}
|
|
11
|
-
const MIN_INTERVAL = 100; // 0.1 seconds (100ms)
|
|
12
|
-
const MAX_INTERVAL = 1000; // Capped at 1 second (1000ms)
|
|
13
|
-
const SCALE_FACTOR = 10; // Interval increases by 5ms per task per minute
|
|
3
|
+
const SCALE_FACTOR = 10; // Interval increases by 10ms per task per minute
|
|
14
4
|
const RPM_WINDOW = 60000; // 1 minute window in ms
|
|
15
5
|
export class ExecutorManager {
|
|
16
6
|
senderManager;
|
|
17
7
|
config;
|
|
18
8
|
executor;
|
|
19
9
|
mempool;
|
|
20
|
-
monitor;
|
|
21
10
|
logger;
|
|
22
11
|
metrics;
|
|
23
|
-
reputationManager;
|
|
24
|
-
unWatch;
|
|
25
|
-
currentlyHandlingBlock = false;
|
|
26
12
|
gasPriceManager;
|
|
27
|
-
|
|
13
|
+
bundleManager;
|
|
28
14
|
opsCount = [];
|
|
29
15
|
bundlingMode;
|
|
30
|
-
|
|
16
|
+
unWatch;
|
|
17
|
+
currentlyHandlingBlock = false;
|
|
18
|
+
constructor({ config, executor, mempool, metrics, gasPriceManager, senderManager, bundleManager }) {
|
|
31
19
|
this.config = config;
|
|
32
|
-
this.reputationManager = reputationManager;
|
|
33
20
|
this.executor = executor;
|
|
34
21
|
this.mempool = mempool;
|
|
35
|
-
this.monitor = monitor;
|
|
36
22
|
this.logger = config.getLogger({ module: "executor_manager" }, {
|
|
37
23
|
level: config.executorLogLevel || config.logLevel
|
|
38
24
|
});
|
|
39
25
|
this.metrics = metrics;
|
|
40
26
|
this.gasPriceManager = gasPriceManager;
|
|
41
|
-
this.eventManager = eventManager;
|
|
42
27
|
this.senderManager = senderManager;
|
|
43
28
|
this.bundlingMode = this.config.bundleMode;
|
|
29
|
+
this.bundleManager = bundleManager;
|
|
30
|
+
}
|
|
31
|
+
start() {
|
|
44
32
|
if (this.bundlingMode === "auto") {
|
|
45
33
|
this.autoScalingBundling();
|
|
46
34
|
}
|
|
@@ -48,7 +36,7 @@ export class ExecutorManager {
|
|
|
48
36
|
async setBundlingMode(bundleMode) {
|
|
49
37
|
this.bundlingMode = bundleMode;
|
|
50
38
|
if (bundleMode === "manual") {
|
|
51
|
-
await new Promise((resolve) => setTimeout(resolve, 2 *
|
|
39
|
+
await new Promise((resolve) => setTimeout(resolve, 2 * this.config.maxBundleInterval));
|
|
52
40
|
}
|
|
53
41
|
if (bundleMode === "auto") {
|
|
54
42
|
this.autoScalingBundling();
|
|
@@ -57,40 +45,65 @@ export class ExecutorManager {
|
|
|
57
45
|
async autoScalingBundling() {
|
|
58
46
|
const now = Date.now();
|
|
59
47
|
this.opsCount = this.opsCount.filter((timestamp) => now - timestamp < RPM_WINDOW);
|
|
60
|
-
const bundles = await this.mempool.getBundles();
|
|
48
|
+
const bundles = await this.mempool.getBundles(this.config.maxBundleCount);
|
|
61
49
|
if (bundles.length > 0) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
await Promise.all(bundles.map(async (bundle) => {
|
|
70
|
-
await this.sendBundleToExecutor(bundle);
|
|
71
|
-
}));
|
|
50
|
+
// Count total ops and add timestamps
|
|
51
|
+
const totalOps = bundles.reduce((sum, bundle) => sum + bundle.userOps.length, 0);
|
|
52
|
+
this.opsCount.push(...new Array(totalOps).fill(Date.now()));
|
|
53
|
+
}
|
|
54
|
+
// Send bundles to executor
|
|
55
|
+
for (const bundle of bundles) {
|
|
56
|
+
this.sendBundleToExecutor(bundle);
|
|
72
57
|
}
|
|
73
58
|
const rpm = this.opsCount.length;
|
|
74
59
|
// Calculate next interval with linear scaling
|
|
75
|
-
const nextInterval = Math.min(
|
|
76
|
-
|
|
60
|
+
const nextInterval = Math.min(this.config.minBundleInterval + rpm * SCALE_FACTOR, // Linear scaling
|
|
61
|
+
this.config.maxBundleInterval // Cap at configured max interval
|
|
77
62
|
);
|
|
78
63
|
if (this.bundlingMode === "auto") {
|
|
79
64
|
setTimeout(this.autoScalingBundling.bind(this), nextInterval);
|
|
80
65
|
}
|
|
81
66
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const bundles = await this.mempool.getBundles(1);
|
|
85
|
-
const bundle = bundles[0];
|
|
86
|
-
if (bundles.length === 0 || bundle.userOps.length === 0) {
|
|
67
|
+
startWatchingBlocks() {
|
|
68
|
+
if (this.unWatch) {
|
|
87
69
|
return;
|
|
88
70
|
}
|
|
89
|
-
|
|
90
|
-
if (
|
|
91
|
-
|
|
71
|
+
// If preconfirmationTime is set, poll at intervals instead of watching blocks
|
|
72
|
+
if (this.config.flashblocksPreconfirmationTime) {
|
|
73
|
+
// Set up interval to call handleBlock
|
|
74
|
+
const intervalId = setInterval(async () => {
|
|
75
|
+
try {
|
|
76
|
+
await this.handleBlock();
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
this.logger.error({ err }, "error while polling blocks");
|
|
80
|
+
}
|
|
81
|
+
}, this.config.flashblocksPreconfirmationTime);
|
|
82
|
+
// Store cleanup function
|
|
83
|
+
this.unWatch = () => {
|
|
84
|
+
clearInterval(intervalId);
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Default behavior - watch blocks
|
|
89
|
+
this.unWatch = this.config.publicClient.watchBlocks({
|
|
90
|
+
onBlock: async (block) => {
|
|
91
|
+
await this.handleBlock(block);
|
|
92
|
+
},
|
|
93
|
+
onError: (err) => {
|
|
94
|
+
this.logger.error({ err }, "error while watching blocks");
|
|
95
|
+
},
|
|
96
|
+
includeTransactions: false,
|
|
97
|
+
emitMissed: false
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
this.logger.debug("started watching blocks");
|
|
101
|
+
}
|
|
102
|
+
async getBaseFee() {
|
|
103
|
+
if (this.config.legacyTransactions) {
|
|
104
|
+
return 0n;
|
|
92
105
|
}
|
|
93
|
-
return
|
|
106
|
+
return await this.gasPriceManager.getBaseFee();
|
|
94
107
|
}
|
|
95
108
|
async sendBundleToExecutor(userOpBundle) {
|
|
96
109
|
const { entryPoint, userOps, version } = userOpBundle;
|
|
@@ -98,8 +111,9 @@ export class ExecutorManager {
|
|
|
98
111
|
return undefined;
|
|
99
112
|
}
|
|
100
113
|
const wallet = await this.senderManager.getWallet();
|
|
101
|
-
const [gasPriceParams, nonce] = await Promise.all([
|
|
114
|
+
const [gasPriceParams, baseFee, nonce] = await Promise.all([
|
|
102
115
|
this.gasPriceManager.tryGetNetworkGasPrice(),
|
|
116
|
+
this.getBaseFee(),
|
|
103
117
|
this.config.publicClient.getTransactionCount({
|
|
104
118
|
address: wallet.address,
|
|
105
119
|
blockTag: "latest"
|
|
@@ -108,571 +122,332 @@ export class ExecutorManager {
|
|
|
108
122
|
return [];
|
|
109
123
|
});
|
|
110
124
|
if (!gasPriceParams || nonce === undefined) {
|
|
111
|
-
await this.resubmitUserOperations(userOps, entryPoint, "Failed to get nonce and gas parameters for bundling");
|
|
112
125
|
// Free executor if failed to get initial params.
|
|
113
126
|
await this.senderManager.markWalletProcessed(wallet);
|
|
127
|
+
await this.mempool.resubmitUserOps({
|
|
128
|
+
userOps,
|
|
129
|
+
entryPoint,
|
|
130
|
+
reason: "Failed to get nonce and gas parameters for bundling"
|
|
131
|
+
});
|
|
114
132
|
return undefined;
|
|
115
133
|
}
|
|
116
134
|
const bundleResult = await this.executor.bundle({
|
|
117
135
|
executor: wallet,
|
|
118
136
|
userOpBundle,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
137
|
+
networkGasPrice: gasPriceParams,
|
|
138
|
+
networkBaseFee: baseFee,
|
|
139
|
+
nonce
|
|
122
140
|
});
|
|
123
|
-
|
|
124
|
-
|
|
141
|
+
if (!bundleResult.success) {
|
|
142
|
+
const { rejectedUserOps, recoverableOps, reason } = bundleResult;
|
|
143
|
+
// Recover any userOps that can be resubmitted.
|
|
144
|
+
await this.mempool.resubmitUserOps({
|
|
145
|
+
userOps: recoverableOps,
|
|
146
|
+
entryPoint,
|
|
147
|
+
reason
|
|
148
|
+
});
|
|
149
|
+
// For rejected userOps, we need to check for frontruns
|
|
150
|
+
const shouldCheckFrontrun = rejectedUserOps.some(({ reason }) => reason.includes("AA25 invalid account nonce") ||
|
|
151
|
+
reason.includes("AA10 sender already constructed"));
|
|
152
|
+
if (shouldCheckFrontrun) {
|
|
153
|
+
// Check each rejected userOp for frontrun or included
|
|
154
|
+
const results = await Promise.all(rejectedUserOps.map(async (userOpInfo) => ({
|
|
155
|
+
userOpInfo,
|
|
156
|
+
status: await this.bundleManager.getUserOpStatus({
|
|
157
|
+
userOpInfo,
|
|
158
|
+
entryPoint,
|
|
159
|
+
bundlerTxs: [],
|
|
160
|
+
blockReceivedTimestamp: Date.now()
|
|
161
|
+
})
|
|
162
|
+
})));
|
|
163
|
+
// Drop userOps that were rejected but not frontrun or included
|
|
164
|
+
const notFoundUserOps = results
|
|
165
|
+
.filter(({ status }) => status === "not_found")
|
|
166
|
+
.map(({ userOpInfo }) => userOpInfo);
|
|
167
|
+
await this.mempool.dropUserOps(entryPoint, notFoundUserOps);
|
|
168
|
+
// Stop tracking userOps that were included onchain either due to frontrun or included
|
|
169
|
+
const confirmedUserOps = results
|
|
170
|
+
.filter(({ status }) => ["frontran", "included"].includes(status))
|
|
171
|
+
.map(({ userOpInfo }) => userOpInfo);
|
|
172
|
+
await this.mempool.removeProcessing({
|
|
173
|
+
entryPoint,
|
|
174
|
+
userOps: confirmedUserOps
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
this.logger.warn({ reason }, "failed to send bundle transaction");
|
|
179
|
+
await this.mempool.dropUserOps(entryPoint, rejectedUserOps);
|
|
180
|
+
}
|
|
181
|
+
// Free wallet as no bundle was sent.
|
|
125
182
|
await this.senderManager.markWalletProcessed(wallet);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
// Unhandled error during simulation, drop all ops.
|
|
134
|
-
if (bundleResult.status === "unhandled_simulation_failure") {
|
|
135
|
-
const { rejectedUserOps } = bundleResult;
|
|
136
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
137
|
-
this.metrics.bundlesSubmitted.labels({ status: "failed" }).inc();
|
|
138
|
-
return undefined;
|
|
139
|
-
}
|
|
140
|
-
// Resubmit if executor has insufficient funds.
|
|
141
|
-
if (bundleResult.status === "bundle_submission_failure" &&
|
|
142
|
-
bundleResult.reason instanceof InsufficientFundsError) {
|
|
143
|
-
const { reason, userOpsToBundle, rejectedUserOps } = bundleResult;
|
|
144
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
145
|
-
await this.resubmitUserOperations(userOpsToBundle, entryPoint, reason.name);
|
|
146
|
-
this.metrics.bundlesSubmitted.labels({ status: "resubmit" }).inc();
|
|
147
|
-
return undefined;
|
|
148
|
-
}
|
|
149
|
-
// Encountered unhandled error during bundle simulation.
|
|
150
|
-
if (bundleResult.status === "bundle_submission_failure") {
|
|
151
|
-
const { rejectedUserOps, userOpsToBundle, reason } = bundleResult;
|
|
152
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
153
|
-
// NOTE: these ops passed validation, so we can try resubmitting them
|
|
154
|
-
await this.resubmitUserOperations(userOpsToBundle, entryPoint, reason instanceof BaseError
|
|
155
|
-
? reason.name
|
|
156
|
-
: "Encountered unhandled error during bundle simulation");
|
|
157
|
-
this.metrics.bundlesSubmitted.labels({ status: "failed" }).inc();
|
|
183
|
+
this.metrics.userOpsSubmitted
|
|
184
|
+
.labels({ status: "failed" })
|
|
185
|
+
.inc(rejectedUserOps.length);
|
|
186
|
+
if (reason === "filterops_failed" || reason === "generic_error") {
|
|
187
|
+
this.metrics.bundlesSubmitted.labels({ status: "failed" }).inc();
|
|
188
|
+
}
|
|
158
189
|
return undefined;
|
|
159
190
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
178
|
-
this.metrics.bundlesSubmitted.labels({ status: "success" }).inc();
|
|
179
|
-
return transactionHash;
|
|
180
|
-
}
|
|
181
|
-
return undefined;
|
|
182
|
-
}
|
|
183
|
-
startWatchingBlocks(handleBlock) {
|
|
184
|
-
if (this.unWatch) {
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
this.unWatch = this.config.publicClient.watchBlocks({
|
|
188
|
-
onBlock: handleBlock,
|
|
189
|
-
onError: (error) => {
|
|
190
|
-
this.logger.error({ error }, "error while watching blocks");
|
|
191
|
+
// Success case
|
|
192
|
+
let { userOpsBundled, rejectedUserOps, transactionRequest, transactionHash } = bundleResult;
|
|
193
|
+
// Increment submission attempts for all userOps submitted.
|
|
194
|
+
userOpsBundled = userOpsBundled.map((userOpInfo) => ({
|
|
195
|
+
...userOpInfo,
|
|
196
|
+
submissionAttempts: userOpInfo.submissionAttempts + 1
|
|
197
|
+
}));
|
|
198
|
+
const submittedBundle = {
|
|
199
|
+
uid: transactionHash,
|
|
200
|
+
executor: wallet,
|
|
201
|
+
transactionHash,
|
|
202
|
+
transactionRequest,
|
|
203
|
+
bundle: {
|
|
204
|
+
entryPoint,
|
|
205
|
+
version,
|
|
206
|
+
userOps: userOpsBundled,
|
|
207
|
+
submissionAttempts: 1
|
|
191
208
|
},
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
209
|
+
previousTransactionHashes: [],
|
|
210
|
+
lastReplaced: Date.now()
|
|
211
|
+
};
|
|
212
|
+
// Track bundle and start loop to watch blocks
|
|
213
|
+
this.bundleManager.trackBundle(submittedBundle);
|
|
214
|
+
this.startWatchingBlocks();
|
|
215
|
+
await this.mempool.markUserOpsAsSubmitted({
|
|
216
|
+
userOps: submittedBundle.bundle.userOps,
|
|
217
|
+
transactionHash: submittedBundle.transactionHash
|
|
195
218
|
});
|
|
196
|
-
this.
|
|
219
|
+
await this.mempool.dropUserOps(entryPoint, rejectedUserOps);
|
|
220
|
+
this.metrics.bundlesSubmitted.labels({ status: "success" }).inc();
|
|
221
|
+
return transactionHash;
|
|
197
222
|
}
|
|
198
223
|
stopWatchingBlocks() {
|
|
199
224
|
if (this.unWatch) {
|
|
200
|
-
this.logger.debug("stopped watching blocks");
|
|
201
225
|
this.unWatch();
|
|
202
226
|
this.unWatch = undefined;
|
|
203
227
|
}
|
|
204
228
|
}
|
|
205
|
-
// update the current status of the bundling transaction/s
|
|
206
|
-
async refreshTransactionStatus(transactionInfo) {
|
|
207
|
-
const { transactionHash: currentTxhash, bundle, previousTransactionHashes } = transactionInfo;
|
|
208
|
-
const { userOps, entryPoint } = bundle;
|
|
209
|
-
const txHashesToCheck = [currentTxhash, ...previousTransactionHashes];
|
|
210
|
-
const transactionDetails = await Promise.all(txHashesToCheck.map(async (transactionHash) => ({
|
|
211
|
-
transactionHash,
|
|
212
|
-
...(await getBundleStatus({
|
|
213
|
-
transactionHash,
|
|
214
|
-
bundle: transactionInfo.bundle,
|
|
215
|
-
publicClient: this.config.publicClient,
|
|
216
|
-
logger: this.logger
|
|
217
|
-
}))
|
|
218
|
-
})));
|
|
219
|
-
// first check if bundling txs returns status "mined", if not, check for reverted
|
|
220
|
-
const mined = transactionDetails.find(({ bundlingStatus }) => bundlingStatus.status === "included");
|
|
221
|
-
const reverted = transactionDetails.find(({ bundlingStatus }) => bundlingStatus.status === "reverted");
|
|
222
|
-
const finalizedTransaction = mined ?? reverted;
|
|
223
|
-
if (!finalizedTransaction) {
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
const { bundlingStatus, transactionHash, blockNumber } = finalizedTransaction;
|
|
227
|
-
// TODO: there has to be a better way of solving onchain AA95 errors.
|
|
228
|
-
if (bundlingStatus.status === "reverted" && bundlingStatus.isAA95) {
|
|
229
|
-
// resubmit with more gas when bundler encounters AA95
|
|
230
|
-
transactionInfo.transactionRequest.gas = scaleBigIntByPercent(transactionInfo.transactionRequest.gas, this.config.aa95GasMultiplier);
|
|
231
|
-
transactionInfo.transactionRequest.nonce += 1;
|
|
232
|
-
await this.replaceTransaction(transactionInfo, "AA95");
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
// Free executor if tx landed onchain
|
|
236
|
-
if (bundlingStatus.status !== "not_found") {
|
|
237
|
-
await this.senderManager.markWalletProcessed(transactionInfo.executor);
|
|
238
|
-
}
|
|
239
|
-
if (bundlingStatus.status === "included") {
|
|
240
|
-
const { userOperationDetails } = bundlingStatus;
|
|
241
|
-
await this.markUserOpsIncluded(userOps, entryPoint, blockNumber, transactionHash, userOperationDetails);
|
|
242
|
-
}
|
|
243
|
-
if (bundlingStatus.status === "reverted") {
|
|
244
|
-
await Promise.all(userOps.map(async (userOpInfo) => {
|
|
245
|
-
const { userOpHash } = userOpInfo;
|
|
246
|
-
await this.checkFrontrun({
|
|
247
|
-
entryPoint,
|
|
248
|
-
userOpHash,
|
|
249
|
-
transactionHash,
|
|
250
|
-
blockNumber
|
|
251
|
-
});
|
|
252
|
-
}));
|
|
253
|
-
await this.removeSubmitted(entryPoint, userOps);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
async checkFrontrun({ userOpHash, entryPoint, transactionHash, blockNumber }) {
|
|
257
|
-
const unwatch = this.config.publicClient.watchBlockNumber({
|
|
258
|
-
onBlockNumber: async (currentBlockNumber) => {
|
|
259
|
-
if (currentBlockNumber > blockNumber + 1n) {
|
|
260
|
-
try {
|
|
261
|
-
const userOperationReceipt = await this.getUserOperationReceipt(userOpHash);
|
|
262
|
-
if (userOperationReceipt) {
|
|
263
|
-
const transactionHash = userOperationReceipt.receipt.transactionHash;
|
|
264
|
-
const blockNumber = userOperationReceipt.receipt.blockNumber;
|
|
265
|
-
await this.mempool.removeSubmitted({
|
|
266
|
-
entryPoint,
|
|
267
|
-
userOpHash
|
|
268
|
-
});
|
|
269
|
-
await this.monitor.setUserOperationStatus(userOpHash, {
|
|
270
|
-
status: "included",
|
|
271
|
-
transactionHash
|
|
272
|
-
});
|
|
273
|
-
await this.eventManager.emitFrontranOnChain(userOpHash, transactionHash, blockNumber);
|
|
274
|
-
this.logger.info({
|
|
275
|
-
userOpHash,
|
|
276
|
-
transactionHash
|
|
277
|
-
}, "user op frontrun onchain");
|
|
278
|
-
this.metrics.userOperationsOnChain
|
|
279
|
-
.labels({ status: "frontran" })
|
|
280
|
-
.inc(1);
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
await this.monitor.setUserOperationStatus(userOpHash, {
|
|
284
|
-
status: "failed",
|
|
285
|
-
transactionHash
|
|
286
|
-
});
|
|
287
|
-
await this.eventManager.emitFailedOnChain(userOpHash, transactionHash, blockNumber);
|
|
288
|
-
this.logger.info({
|
|
289
|
-
userOpHash,
|
|
290
|
-
transactionHash
|
|
291
|
-
}, "user op failed onchain");
|
|
292
|
-
this.metrics.userOperationsOnChain
|
|
293
|
-
.labels({ status: "reverted" })
|
|
294
|
-
.inc(1);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
catch (error) {
|
|
298
|
-
this.logger.error({
|
|
299
|
-
userOpHash,
|
|
300
|
-
transactionHash,
|
|
301
|
-
error
|
|
302
|
-
}, "Error checking frontrun status");
|
|
303
|
-
// Still mark as failed since we couldn't verify inclusion
|
|
304
|
-
await this.monitor.setUserOperationStatus(userOpHash, {
|
|
305
|
-
status: "failed",
|
|
306
|
-
transactionHash
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
unwatch();
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
async getUserOperationReceipt(userOperationHash) {
|
|
315
|
-
const userOperationEventAbiItem = getAbiItem({
|
|
316
|
-
abi: EntryPointV06Abi,
|
|
317
|
-
name: "UserOperationEvent"
|
|
318
|
-
});
|
|
319
|
-
let fromBlock = undefined;
|
|
320
|
-
let toBlock = undefined;
|
|
321
|
-
if (this.config.maxBlockRange !== undefined) {
|
|
322
|
-
const latestBlock = await this.config.publicClient.getBlockNumber();
|
|
323
|
-
fromBlock = latestBlock - BigInt(this.config.maxBlockRange);
|
|
324
|
-
if (fromBlock < 0n) {
|
|
325
|
-
fromBlock = 0n;
|
|
326
|
-
}
|
|
327
|
-
toBlock = "latest";
|
|
328
|
-
}
|
|
329
|
-
const filterResult = await this.config.publicClient.getLogs({
|
|
330
|
-
address: this.config.entrypoints,
|
|
331
|
-
event: userOperationEventAbiItem,
|
|
332
|
-
fromBlock,
|
|
333
|
-
toBlock,
|
|
334
|
-
args: {
|
|
335
|
-
userOpHash: userOperationHash
|
|
336
|
-
}
|
|
337
|
-
});
|
|
338
|
-
this.logger.debug({
|
|
339
|
-
filterResult: filterResult.length,
|
|
340
|
-
userOperationEvent: filterResult.length === 0
|
|
341
|
-
? undefined
|
|
342
|
-
: filterResult[0].transactionHash
|
|
343
|
-
}, "filter result length");
|
|
344
|
-
if (filterResult.length === 0) {
|
|
345
|
-
return null;
|
|
346
|
-
}
|
|
347
|
-
const userOperationEvent = filterResult[0];
|
|
348
|
-
// throw if any of the members of userOperationEvent are undefined
|
|
349
|
-
if (userOperationEvent.args.actualGasCost === undefined ||
|
|
350
|
-
userOperationEvent.args.sender === undefined ||
|
|
351
|
-
userOperationEvent.args.nonce === undefined ||
|
|
352
|
-
userOperationEvent.args.userOpHash === undefined ||
|
|
353
|
-
userOperationEvent.args.success === undefined ||
|
|
354
|
-
userOperationEvent.args.paymaster === undefined ||
|
|
355
|
-
userOperationEvent.args.actualGasUsed === undefined) {
|
|
356
|
-
throw new Error("userOperationEvent has undefined members");
|
|
357
|
-
}
|
|
358
|
-
const txHash = userOperationEvent.transactionHash;
|
|
359
|
-
if (txHash === null) {
|
|
360
|
-
// transaction pending
|
|
361
|
-
return null;
|
|
362
|
-
}
|
|
363
|
-
const getTransactionReceipt = async (txHash) => {
|
|
364
|
-
while (true) {
|
|
365
|
-
try {
|
|
366
|
-
const transactionReceipt = await this.config.publicClient.getTransactionReceipt({
|
|
367
|
-
hash: txHash
|
|
368
|
-
});
|
|
369
|
-
let effectiveGasPrice = transactionReceipt.effectiveGasPrice ??
|
|
370
|
-
transactionReceipt.gasPrice ??
|
|
371
|
-
undefined;
|
|
372
|
-
if (effectiveGasPrice === undefined) {
|
|
373
|
-
const tx = await this.config.publicClient.getTransaction({
|
|
374
|
-
hash: txHash
|
|
375
|
-
});
|
|
376
|
-
effectiveGasPrice = tx.gasPrice ?? undefined;
|
|
377
|
-
}
|
|
378
|
-
if (effectiveGasPrice) {
|
|
379
|
-
transactionReceipt.effectiveGasPrice = effectiveGasPrice;
|
|
380
|
-
}
|
|
381
|
-
return transactionReceipt;
|
|
382
|
-
}
|
|
383
|
-
catch (e) {
|
|
384
|
-
if (e instanceof TransactionReceiptNotFoundError) {
|
|
385
|
-
continue;
|
|
386
|
-
}
|
|
387
|
-
throw e;
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
};
|
|
391
|
-
const receipt = await getTransactionReceipt(txHash);
|
|
392
|
-
const logs = receipt.logs;
|
|
393
|
-
if (logs.some((log) => log.blockHash === null ||
|
|
394
|
-
log.blockNumber === null ||
|
|
395
|
-
log.transactionIndex === null ||
|
|
396
|
-
log.transactionHash === null ||
|
|
397
|
-
log.logIndex === null ||
|
|
398
|
-
log.topics.length === 0)) {
|
|
399
|
-
// transaction pending
|
|
400
|
-
return null;
|
|
401
|
-
}
|
|
402
|
-
const userOperationReceipt = parseUserOperationReceipt(userOperationHash, receipt);
|
|
403
|
-
return userOperationReceipt;
|
|
404
|
-
}
|
|
405
229
|
async handleBlock(block) {
|
|
406
230
|
if (this.currentlyHandlingBlock) {
|
|
407
231
|
return;
|
|
408
232
|
}
|
|
409
233
|
this.currentlyHandlingBlock = true;
|
|
410
|
-
|
|
411
|
-
const
|
|
412
|
-
|
|
413
|
-
for (const entryPoint of this.config.entrypoints) {
|
|
414
|
-
const entries = await this.mempool.dumpSubmittedOps(entryPoint);
|
|
415
|
-
submittedEntries.push(...entries);
|
|
416
|
-
}
|
|
417
|
-
return submittedEntries;
|
|
418
|
-
};
|
|
419
|
-
const submittedEntries = await dumpSubmittedEntries();
|
|
420
|
-
if (submittedEntries.length === 0) {
|
|
234
|
+
const blockReceivedTimestamp = Date.now();
|
|
235
|
+
const pendingBundles = this.bundleManager.getPendingBundles();
|
|
236
|
+
if (pendingBundles.length === 0) {
|
|
421
237
|
this.stopWatchingBlocks();
|
|
422
238
|
this.currentlyHandlingBlock = false;
|
|
423
239
|
return;
|
|
424
240
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
.
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
241
|
+
const [bundleStatuses, networkGasPrice, networkBaseFee] = await Promise.all([
|
|
242
|
+
this.bundleManager.getBundleStatuses(pendingBundles),
|
|
243
|
+
this.gasPriceManager.tryGetNetworkGasPrice().catch(() => ({
|
|
244
|
+
maxFeePerGas: 0n,
|
|
245
|
+
maxPriorityFeePerGas: 0n
|
|
246
|
+
})),
|
|
247
|
+
this.getBaseFee().catch(() => 0n)
|
|
248
|
+
]);
|
|
249
|
+
await Promise.all(bundleStatuses.map(async (bundleStatus, index) => {
|
|
250
|
+
if (bundleStatus.status === "included") {
|
|
251
|
+
await this.bundleManager.processIncludedBundle({
|
|
252
|
+
submittedBundle: pendingBundles[index],
|
|
253
|
+
bundleReceipt: bundleStatus,
|
|
254
|
+
blockReceivedTimestamp
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
if (bundleStatus.status === "reverted") {
|
|
258
|
+
await this.bundleManager.processRevertedBundle({
|
|
259
|
+
blockReceivedTimestamp,
|
|
260
|
+
submittedBundle: pendingBundles[index],
|
|
261
|
+
bundleReceipt: bundleStatus,
|
|
262
|
+
block
|
|
263
|
+
});
|
|
448
264
|
}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
265
|
+
// can be potentially resubmitted - so we first submit it again to optimize for the speed
|
|
266
|
+
if (bundleStatus.status === "not_found") {
|
|
267
|
+
this.potentiallyResubmitBundle({
|
|
268
|
+
blockReceivedTimestamp,
|
|
269
|
+
submittedBundle: pendingBundles[index],
|
|
270
|
+
networkGasPrice,
|
|
271
|
+
networkBaseFee
|
|
272
|
+
});
|
|
452
273
|
}
|
|
453
274
|
}));
|
|
454
275
|
this.currentlyHandlingBlock = false;
|
|
455
276
|
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
const {
|
|
459
|
-
const
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
await this.failedToReplaceTransaction({
|
|
471
|
-
entryPoint,
|
|
472
|
-
rejectedUserOps,
|
|
473
|
-
oldTxHash,
|
|
474
|
-
reason: "Failed to get network gas price during replacement"
|
|
277
|
+
potentiallyResubmitBundle({ blockReceivedTimestamp, submittedBundle, networkGasPrice, networkBaseFee }) {
|
|
278
|
+
const { transactionRequest, lastReplaced } = submittedBundle;
|
|
279
|
+
const { maxFeePerGas, maxPriorityFeePerGas } = transactionRequest;
|
|
280
|
+
const isGasPriceTooLow = maxFeePerGas < networkGasPrice.maxFeePerGas ||
|
|
281
|
+
maxPriorityFeePerGas < networkGasPrice.maxPriorityFeePerGas;
|
|
282
|
+
const isStuck = Date.now() - lastReplaced > this.config.resubmitStuckTimeout;
|
|
283
|
+
if (isGasPriceTooLow) {
|
|
284
|
+
this.bundleManager.stopTrackingBundle(submittedBundle);
|
|
285
|
+
this.replaceTransaction({
|
|
286
|
+
blockReceivedTimestamp,
|
|
287
|
+
submittedBundle,
|
|
288
|
+
networkGasPrice,
|
|
289
|
+
networkBaseFee,
|
|
290
|
+
reason: "gas_price"
|
|
475
291
|
});
|
|
476
|
-
// Free executor if failed to get initial params.
|
|
477
|
-
await this.senderManager.markWalletProcessed(txInfo.executor);
|
|
478
|
-
return;
|
|
479
292
|
}
|
|
293
|
+
else if (isStuck) {
|
|
294
|
+
this.bundleManager.stopTrackingBundle(submittedBundle);
|
|
295
|
+
this.replaceTransaction({
|
|
296
|
+
blockReceivedTimestamp,
|
|
297
|
+
submittedBundle,
|
|
298
|
+
networkGasPrice,
|
|
299
|
+
networkBaseFee,
|
|
300
|
+
reason: "stuck"
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
async cancelBundle(submittedBundle) {
|
|
305
|
+
const { bundle: { userOps }, executor, transactionRequest, transactionHash } = submittedBundle;
|
|
306
|
+
const { walletClients, publicClient, blockTime } = this.config;
|
|
307
|
+
const walletClient = walletClients.public;
|
|
308
|
+
const logger = this.logger.child({
|
|
309
|
+
userOps: getUserOpHashes(userOps)
|
|
310
|
+
});
|
|
311
|
+
let gasMultiplier = 150n; // Start with 50% increase
|
|
312
|
+
for (let attempt = 0; attempt < 5; attempt++) {
|
|
313
|
+
try {
|
|
314
|
+
// Check if transaction is still pending
|
|
315
|
+
const currentNonce = await publicClient.getTransactionCount({
|
|
316
|
+
address: executor.address,
|
|
317
|
+
blockTag: "latest"
|
|
318
|
+
});
|
|
319
|
+
if (currentNonce > transactionRequest.nonce) {
|
|
320
|
+
logger.info("Transaction already mined or cancelled");
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
logger.info(`Trying to cancel bundle, attempt ${attempt + 1}`);
|
|
324
|
+
// Send cancel transaction with increasing gas price
|
|
325
|
+
const cancelTxHash = await walletClient.sendTransaction({
|
|
326
|
+
account: executor,
|
|
327
|
+
to: executor.address,
|
|
328
|
+
value: 0n,
|
|
329
|
+
nonce: transactionRequest.nonce,
|
|
330
|
+
maxFeePerGas: scaleBigIntByPercent(transactionRequest.maxFeePerGas, gasMultiplier),
|
|
331
|
+
maxPriorityFeePerGas: scaleBigIntByPercent(transactionRequest.maxPriorityFeePerGas, gasMultiplier)
|
|
332
|
+
});
|
|
333
|
+
logger.info({
|
|
334
|
+
originalTxHash: transactionHash,
|
|
335
|
+
cancelTxHash,
|
|
336
|
+
attempt: attempt + 1
|
|
337
|
+
}, "cancel transaction sent");
|
|
338
|
+
// Wait for transaction to potentially be mined
|
|
339
|
+
await new Promise((resolve) => setTimeout(resolve, blockTime / 2));
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
logger.warn({ err }, "failed to cancel bundle");
|
|
343
|
+
gasMultiplier += 20n; // Increase gas by additional 20% each retry
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// All retries exhausted
|
|
347
|
+
logger.error({ transactionHash }, "failed to cancel bundle after max retries");
|
|
348
|
+
}
|
|
349
|
+
async replaceTransaction({ blockReceivedTimestamp, submittedBundle, networkGasPrice, networkBaseFee, reason }) {
|
|
350
|
+
const { bundle, executor, transactionRequest, transactionHash: oldTxHash } = submittedBundle;
|
|
351
|
+
const { entryPoint } = bundle;
|
|
480
352
|
const bundleResult = await this.executor.bundle({
|
|
481
353
|
executor: executor,
|
|
354
|
+
networkGasPrice,
|
|
355
|
+
networkBaseFee,
|
|
482
356
|
userOpBundle: bundle,
|
|
483
|
-
nonce: transactionRequest.nonce
|
|
484
|
-
gasPriceParams: {
|
|
485
|
-
maxFeePerGas: scaleBigIntByPercent(gasPriceParameters.maxFeePerGas, 115n),
|
|
486
|
-
maxPriorityFeePerGas: scaleBigIntByPercent(gasPriceParameters.maxPriorityFeePerGas, 115n)
|
|
487
|
-
},
|
|
488
|
-
gasLimitSuggestion: transactionRequest.gas,
|
|
489
|
-
isReplacementTx: true
|
|
357
|
+
nonce: transactionRequest.nonce
|
|
490
358
|
});
|
|
491
|
-
//
|
|
492
|
-
if (
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
userOps:
|
|
497
|
-
}, "transaction potentially already included too many times, removing");
|
|
498
|
-
await this.senderManager.markWalletProcessed(txInfo.executor);
|
|
499
|
-
return;
|
|
500
|
-
}
|
|
501
|
-
// Free wallet if no bundle was sent or potentially included.
|
|
502
|
-
if (bundleResult.status !== "bundle_success") {
|
|
503
|
-
await this.senderManager.markWalletProcessed(txInfo.executor);
|
|
504
|
-
}
|
|
505
|
-
// Check if the transaction is potentially included.
|
|
506
|
-
const nonceTooLow = bundleResult.status === "bundle_submission_failure" &&
|
|
507
|
-
bundleResult.reason instanceof NonceTooLowError;
|
|
508
|
-
const allOpsFailedSimulation = bundleResult.status === "all_ops_failed_simulation" &&
|
|
509
|
-
bundleResult.rejectedUserOps.every((op) => op.reason === "AA25 invalid account nonce" ||
|
|
510
|
-
op.reason === "AA10 sender already constructed");
|
|
511
|
-
const potentiallyIncluded = nonceTooLow || allOpsFailedSimulation;
|
|
512
|
-
// log metrics
|
|
513
|
-
const replaceStatus = (() => {
|
|
514
|
-
switch (true) {
|
|
515
|
-
case potentiallyIncluded:
|
|
516
|
-
return "potentially_already_included";
|
|
517
|
-
case bundleResult?.status === "bundle_success":
|
|
518
|
-
return "replaced";
|
|
519
|
-
default:
|
|
520
|
-
return "failed";
|
|
521
|
-
}
|
|
522
|
-
})();
|
|
523
|
-
this.metrics.replacedTransactions
|
|
524
|
-
.labels({ reason, status: replaceStatus })
|
|
525
|
-
.inc();
|
|
526
|
-
if (potentiallyIncluded) {
|
|
527
|
-
this.logger.info({
|
|
528
|
-
oldTxHash,
|
|
529
|
-
userOpHashes: getUserOpHashes(bundleResult.rejectedUserOps)
|
|
530
|
-
}, "transaction potentially already included");
|
|
531
|
-
txInfo.timesPotentiallyIncluded += 1;
|
|
532
|
-
return;
|
|
533
|
-
}
|
|
534
|
-
if (bundleResult.status === "unhandled_simulation_failure") {
|
|
535
|
-
const { rejectedUserOps, reason } = bundleResult;
|
|
536
|
-
await this.failedToReplaceTransaction({
|
|
537
|
-
entryPoint,
|
|
538
|
-
oldTxHash,
|
|
539
|
-
reason,
|
|
540
|
-
rejectedUserOps
|
|
541
|
-
});
|
|
542
|
-
return;
|
|
543
|
-
}
|
|
544
|
-
if (bundleResult.status === "all_ops_failed_simulation") {
|
|
545
|
-
await this.failedToReplaceTransaction({
|
|
359
|
+
// Handle case where no bundle was sent.
|
|
360
|
+
if (!bundleResult.success) {
|
|
361
|
+
const { rejectedUserOps, recoverableOps, reason } = bundleResult;
|
|
362
|
+
// Recover any userOps that can be resubmitted.
|
|
363
|
+
await this.mempool.resubmitUserOps({
|
|
364
|
+
userOps: recoverableOps,
|
|
546
365
|
entryPoint,
|
|
547
|
-
|
|
548
|
-
reason: "all ops failed simulation",
|
|
549
|
-
rejectedUserOps: bundleResult.rejectedUserOps
|
|
550
|
-
});
|
|
551
|
-
return;
|
|
552
|
-
}
|
|
553
|
-
if (bundleResult.status === "bundle_submission_failure") {
|
|
554
|
-
const { reason, rejectedUserOps } = bundleResult;
|
|
555
|
-
const submissionFailureReason = reason instanceof BaseError ? reason.name : "INTERNAL FAILURE";
|
|
556
|
-
await this.failedToReplaceTransaction({
|
|
557
|
-
oldTxHash,
|
|
558
|
-
rejectedUserOps,
|
|
559
|
-
reason: submissionFailureReason,
|
|
560
|
-
entryPoint
|
|
366
|
+
reason
|
|
561
367
|
});
|
|
368
|
+
// For rejected userOps, we need to check for frontruns
|
|
369
|
+
const shouldCheckFrontrun = rejectedUserOps.some(({ reason }) => reason.includes("AA25 invalid account nonce") ||
|
|
370
|
+
reason.includes("AA10 sender already constructed"));
|
|
371
|
+
if (shouldCheckFrontrun) {
|
|
372
|
+
// Check each rejected userOp for frontrun or included
|
|
373
|
+
const results = await Promise.all(rejectedUserOps.map(async (userOpInfo) => ({
|
|
374
|
+
userOpInfo,
|
|
375
|
+
status: await this.bundleManager.getUserOpStatus({
|
|
376
|
+
userOpInfo,
|
|
377
|
+
entryPoint,
|
|
378
|
+
bundlerTxs: [
|
|
379
|
+
submittedBundle.transactionHash,
|
|
380
|
+
...submittedBundle.previousTransactionHashes
|
|
381
|
+
],
|
|
382
|
+
blockReceivedTimestamp
|
|
383
|
+
})
|
|
384
|
+
})));
|
|
385
|
+
const hasFrontrun = results.some(({ status }) => status === "frontran");
|
|
386
|
+
// If one userOp in the bundle was frontrun, we need to cancel the entire bundle
|
|
387
|
+
// as it will fail onchain
|
|
388
|
+
if (hasFrontrun) {
|
|
389
|
+
await this.cancelBundle(submittedBundle);
|
|
390
|
+
}
|
|
391
|
+
// Drop userOps that were rejected but not frontrun or included
|
|
392
|
+
const notFoundUserOps = results
|
|
393
|
+
.filter(({ status }) => status === "not_found")
|
|
394
|
+
.map(({ userOpInfo }) => userOpInfo);
|
|
395
|
+
await this.mempool.dropUserOps(entryPoint, notFoundUserOps);
|
|
396
|
+
// Stop tracking userOps that were included onchain either due to frontrun or included
|
|
397
|
+
const confirmedUserOps = results
|
|
398
|
+
.filter(({ status }) => ["frontran", "included"].includes(status))
|
|
399
|
+
.map(({ userOpInfo }) => userOpInfo);
|
|
400
|
+
await this.mempool.removeProcessing({
|
|
401
|
+
entryPoint,
|
|
402
|
+
userOps: confirmedUserOps
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
this.logger.warn({ oldTxHash, reason }, "failed to replace transaction");
|
|
407
|
+
await this.mempool.dropUserOps(entryPoint, rejectedUserOps);
|
|
408
|
+
}
|
|
409
|
+
// Free wallet as no bundle was sent.
|
|
410
|
+
await this.senderManager.markWalletProcessed(executor);
|
|
411
|
+
this.metrics.replacedTransactions
|
|
412
|
+
.labels({ reason, status: "failed" })
|
|
413
|
+
.inc();
|
|
562
414
|
return;
|
|
563
415
|
}
|
|
416
|
+
// Success case
|
|
564
417
|
const { rejectedUserOps, userOpsBundled, transactionRequest: newTransactionRequest, transactionHash: newTxHash } = bundleResult;
|
|
565
|
-
|
|
418
|
+
// Increment submission attempts for all replaced userOps
|
|
419
|
+
const userOpsReplaced = userOpsBundled.map((userOpInfo) => ({
|
|
420
|
+
...userOpInfo,
|
|
421
|
+
submissionAttempts: userOpInfo.submissionAttempts + 1
|
|
422
|
+
}));
|
|
566
423
|
const newTxInfo = {
|
|
567
|
-
...
|
|
424
|
+
...submittedBundle,
|
|
568
425
|
transactionRequest: newTransactionRequest,
|
|
569
426
|
transactionHash: newTxHash,
|
|
570
427
|
previousTransactionHashes: [
|
|
571
|
-
|
|
572
|
-
...
|
|
428
|
+
submittedBundle.transactionHash,
|
|
429
|
+
...submittedBundle.previousTransactionHashes
|
|
573
430
|
],
|
|
574
431
|
lastReplaced: Date.now(),
|
|
575
432
|
bundle: {
|
|
576
|
-
...
|
|
577
|
-
userOps: userOpsReplaced
|
|
433
|
+
...bundle,
|
|
434
|
+
userOps: userOpsReplaced,
|
|
435
|
+
submissionAttempts: bundle.submissionAttempts + 1
|
|
578
436
|
}
|
|
579
437
|
};
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
transactionInfo: newTxInfo
|
|
584
|
-
});
|
|
585
|
-
}));
|
|
438
|
+
// Track bundle and start loop to watch blocks
|
|
439
|
+
this.bundleManager.trackBundle(newTxInfo);
|
|
440
|
+
this.startWatchingBlocks();
|
|
586
441
|
// Drop all userOperations that were rejected during simulation.
|
|
587
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
442
|
+
await this.mempool.dropUserOps(entryPoint, rejectedUserOps);
|
|
588
443
|
this.logger.info({
|
|
589
444
|
oldTxHash,
|
|
590
445
|
newTxHash,
|
|
591
446
|
reason
|
|
592
447
|
}, "replaced transaction");
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
await Promise.all(userOpInfos.map(async (userOpInfo) => {
|
|
597
|
-
const { userOpHash } = userOpInfo;
|
|
598
|
-
await this.mempool.markSubmitted({
|
|
599
|
-
userOpHash,
|
|
600
|
-
transactionInfo
|
|
601
|
-
});
|
|
602
|
-
this.startWatchingBlocks(this.handleBlock.bind(this));
|
|
603
|
-
this.metrics.userOperationsSubmitted
|
|
604
|
-
.labels({ status: "success" })
|
|
605
|
-
.inc();
|
|
606
|
-
}));
|
|
607
|
-
}
|
|
608
|
-
async resubmitUserOperations(userOps, entryPoint, reason) {
|
|
609
|
-
await Promise.all(userOps.map(async (userOpInfo) => {
|
|
610
|
-
const { userOpHash, userOp } = userOpInfo;
|
|
611
|
-
this.logger.warn({
|
|
612
|
-
userOpHash,
|
|
613
|
-
reason
|
|
614
|
-
}, "resubmitting user operation");
|
|
615
|
-
await this.mempool.removeProcessing({ entryPoint, userOpHash });
|
|
616
|
-
await this.mempool.add(userOp, entryPoint);
|
|
617
|
-
this.metrics.userOperationsResubmitted.inc();
|
|
618
|
-
}));
|
|
619
|
-
}
|
|
620
|
-
async failedToReplaceTransaction({ oldTxHash, rejectedUserOps, reason, entryPoint }) {
|
|
621
|
-
this.logger.warn({ oldTxHash, reason }, "failed to replace transaction");
|
|
622
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
623
|
-
}
|
|
624
|
-
async removeSubmitted(entryPoint, userOps) {
|
|
625
|
-
await Promise.all(userOps.map(async (userOpInfo) => {
|
|
626
|
-
const { userOpHash } = userOpInfo;
|
|
627
|
-
await this.mempool.removeSubmitted({ entryPoint, userOpHash });
|
|
628
|
-
}));
|
|
629
|
-
}
|
|
630
|
-
async markUserOpsIncluded(userOps, entryPoint, blockNumber, transactionHash, userOperationDetails) {
|
|
631
|
-
await Promise.all(userOps.map(async (userOpInfo) => {
|
|
632
|
-
this.metrics.userOperationsOnChain
|
|
633
|
-
.labels({ status: "included" })
|
|
634
|
-
.inc();
|
|
635
|
-
const { userOpHash, userOp } = userOpInfo;
|
|
636
|
-
const opDetails = userOperationDetails[userOpHash];
|
|
637
|
-
const firstSubmitted = userOpInfo.addedToMempool;
|
|
638
|
-
this.metrics.userOperationInclusionDuration.observe((Date.now() - firstSubmitted) / 1000);
|
|
639
|
-
await this.mempool.removeSubmitted({ entryPoint, userOpHash });
|
|
640
|
-
this.reputationManager.updateUserOperationIncludedStatus(userOp, entryPoint, opDetails.accountDeployed);
|
|
641
|
-
if (opDetails.status === "succesful") {
|
|
642
|
-
await this.eventManager.emitIncludedOnChain(userOpHash, transactionHash, blockNumber);
|
|
643
|
-
}
|
|
644
|
-
else {
|
|
645
|
-
await this.eventManager.emitExecutionRevertedOnChain(userOpHash, transactionHash, opDetails.revertReason || "0x", blockNumber);
|
|
646
|
-
}
|
|
647
|
-
await this.monitor.setUserOperationStatus(userOpHash, {
|
|
648
|
-
status: "included",
|
|
649
|
-
transactionHash
|
|
650
|
-
});
|
|
651
|
-
this.logger.info({
|
|
652
|
-
opHash: userOpHash,
|
|
653
|
-
transactionHash
|
|
654
|
-
}, "user op included");
|
|
655
|
-
}));
|
|
656
|
-
}
|
|
657
|
-
async dropUserOps(entryPoint, rejectedUserOps) {
|
|
658
|
-
await Promise.all(rejectedUserOps.map(async (rejectedUserOp) => {
|
|
659
|
-
const { userOp, reason, userOpHash } = rejectedUserOp;
|
|
660
|
-
await this.mempool.removeProcessing({ entryPoint, userOpHash });
|
|
661
|
-
await this.mempool.removeSubmitted({ entryPoint, userOpHash });
|
|
662
|
-
await this.eventManager.emitDropped(userOpHash, reason, getAAError(reason));
|
|
663
|
-
await this.monitor.setUserOperationStatus(userOpHash, {
|
|
664
|
-
status: "rejected",
|
|
665
|
-
transactionHash: null
|
|
666
|
-
});
|
|
667
|
-
this.logger.warn({
|
|
668
|
-
userOperation: JSON.stringify(userOp, (_k, v) => typeof v === "bigint" ? v.toString() : v),
|
|
669
|
-
userOpHash,
|
|
670
|
-
reason
|
|
671
|
-
}, "user operation rejected");
|
|
672
|
-
this.metrics.userOperationsSubmitted
|
|
673
|
-
.labels({ status: "failed" })
|
|
674
|
-
.inc();
|
|
675
|
-
}));
|
|
448
|
+
this.metrics.replacedTransactions
|
|
449
|
+
.labels({ reason, status: "success" })
|
|
450
|
+
.inc();
|
|
676
451
|
}
|
|
677
452
|
}
|
|
678
453
|
//# sourceMappingURL=executorManager.js.map
|