@pimlico/alto 0.0.0-main.20250428T104157 → 0.0.0-main.20250429T114818
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/Eip7702Support.sol/Eip7702Support.json +1 -0
- package/contracts/EntryPoint.sol/EntryPoint.json +1 -0
- package/contracts/EntryPointCodeOverride.sol/EntryPointCodeOverride.json +1 -0
- package/contracts/EntryPointSimulations.sol/EntryPointSimulations.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/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/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/PimlicoEntryPointSimulationsV7.sol/PimlicoEntryPointSimulationsV7.json +1 -0
- package/contracts/PimlicoEntryPointSimulationsV8.sol/PimlicoEntryPointSimulationsV8.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/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/build-info/0c52dc19c74a9a932ddddcca463ce398.json +1 -0
- package/contracts/build-info/a1d9af887789a0ade8ffbc8b045f0780.json +1 -0
- package/contracts/interfaces/IEntryPoint.sol/IEntryPoint.json +1 -0
- package/esm/cli/deploySimulationsContract.js +14 -5
- package/esm/cli/deploySimulationsContract.js.map +1 -1
- package/package.json +2 -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 -2872
- package/lib/cli/config/bundler.js +0 -242
- 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 -587
- 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 -100
- 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 -301
- package/lib/executor/executor.js.map +0 -1
- package/lib/executor/executorManager.d.ts +0 -108
- package/lib/executor/executorManager.js +0 -702
- 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 -34
- package/lib/executor/utils.js +0 -167
- 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 -29
- package/lib/handlers/eventManager.js +0 -225
- package/lib/handlers/eventManager.js.map +0 -1
- package/lib/handlers/gasPriceManager.d.ts +0 -36
- package/lib/handlers/gasPriceManager.js +0 -391
- 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 -499
- 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.d.ts +0 -1891
- 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.d.ts +0 -1268
- package/lib/rpc/methods/pimlico_sendUserOperationNow.js +0 -55
- package/lib/rpc/methods/pimlico_sendUserOperationNow.js.map +0 -1
- package/lib/rpc/rpcHandler.d.ts +0 -75
- package/lib/rpc/rpcHandler.js +0 -391
- 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 -51
- package/lib/rpc/validation/SafeValidator.js +0 -327
- 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 -97
- package/lib/rpc/validation/UnsafeValidator.js +0 -303
- 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 -2076
- package/lib/types/contracts/EntryPointSimulationsV7.js +0 -2678
- 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 -25
- package/lib/types/contracts/PimlicoEntryPointSimulations.js +0 -42
- 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 -58
- 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 -20785
- package/lib/types/schemas.js +0 -679
- 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/asyncTimeout.d.ts +0 -5
- package/lib/utils/asyncTimeout.js +0 -51
- package/lib/utils/asyncTimeout.js.map +0 -1
- package/lib/utils/bigInt.d.ts +0 -8
- package/lib/utils/bigInt.js +0 -24
- 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 -9
- package/lib/utils/index.js +0 -24
- 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 -29
- package/lib/utils/metrics.js +0 -199
- 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 -491
- package/lib/utils/validation.js.map +0 -1
|
@@ -1,702 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ExecutorManager = void 0;
|
|
4
|
-
const types_1 = require("../types/index.js");
|
|
5
|
-
const utils_1 = require("../utils/index.js");
|
|
6
|
-
const viem_1 = require("viem");
|
|
7
|
-
const abitype_1 = require("abitype");
|
|
8
|
-
const utils_2 = require("./utils.js");
|
|
9
|
-
function getTransactionsFromUserOperationEntries(submittedOps) {
|
|
10
|
-
const transactionInfos = submittedOps.map((userOpInfo) => userOpInfo.transactionInfo);
|
|
11
|
-
// Remove duplicates
|
|
12
|
-
return Array.from(new Set(transactionInfos));
|
|
13
|
-
}
|
|
14
|
-
const MIN_INTERVAL = 100; // 0.1 seconds (100ms)
|
|
15
|
-
const MAX_INTERVAL = 1000; // Capped at 1 second (1000ms)
|
|
16
|
-
const SCALE_FACTOR = 10; // Interval increases by 5ms per task per minute
|
|
17
|
-
const RPM_WINDOW = 60000; // 1 minute window in ms
|
|
18
|
-
class ExecutorManager {
|
|
19
|
-
senderManager;
|
|
20
|
-
config;
|
|
21
|
-
executor;
|
|
22
|
-
mempool;
|
|
23
|
-
monitor;
|
|
24
|
-
logger;
|
|
25
|
-
metrics;
|
|
26
|
-
reputationManager;
|
|
27
|
-
unWatch;
|
|
28
|
-
currentlyHandlingBlock = false;
|
|
29
|
-
gasPriceManager;
|
|
30
|
-
eventManager;
|
|
31
|
-
opsCount = [];
|
|
32
|
-
bundlingMode;
|
|
33
|
-
constructor({ config, executor, mempool, monitor, reputationManager, metrics, gasPriceManager, eventManager, senderManager }) {
|
|
34
|
-
this.config = config;
|
|
35
|
-
this.reputationManager = reputationManager;
|
|
36
|
-
this.executor = executor;
|
|
37
|
-
this.mempool = mempool;
|
|
38
|
-
this.monitor = monitor;
|
|
39
|
-
this.logger = config.getLogger({ module: "executor_manager" }, {
|
|
40
|
-
level: config.executorLogLevel || config.logLevel
|
|
41
|
-
});
|
|
42
|
-
this.metrics = metrics;
|
|
43
|
-
this.gasPriceManager = gasPriceManager;
|
|
44
|
-
this.eventManager = eventManager;
|
|
45
|
-
this.senderManager = senderManager;
|
|
46
|
-
this.bundlingMode = this.config.bundleMode;
|
|
47
|
-
if (this.bundlingMode === "auto") {
|
|
48
|
-
this.autoScalingBundling();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
async setBundlingMode(bundleMode) {
|
|
52
|
-
this.bundlingMode = bundleMode;
|
|
53
|
-
if (bundleMode === "manual") {
|
|
54
|
-
await new Promise((resolve) => setTimeout(resolve, 2 * MAX_INTERVAL));
|
|
55
|
-
}
|
|
56
|
-
if (bundleMode === "auto") {
|
|
57
|
-
this.autoScalingBundling();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
async autoScalingBundling() {
|
|
61
|
-
const now = Date.now();
|
|
62
|
-
this.opsCount = this.opsCount.filter((timestamp) => now - timestamp < RPM_WINDOW);
|
|
63
|
-
const bundles = await this.mempool.getBundles();
|
|
64
|
-
if (bundles.length > 0) {
|
|
65
|
-
const opsCount = bundles
|
|
66
|
-
.map(({ userOps }) => userOps.length)
|
|
67
|
-
.reduce((a, b) => a + b);
|
|
68
|
-
// Add timestamps for each task
|
|
69
|
-
const timestamp = Date.now();
|
|
70
|
-
this.opsCount.push(...Array(opsCount).fill(timestamp));
|
|
71
|
-
// Send bundles to executor
|
|
72
|
-
await Promise.all(bundles.map(async (bundle) => {
|
|
73
|
-
await this.sendBundleToExecutor(bundle);
|
|
74
|
-
}));
|
|
75
|
-
}
|
|
76
|
-
const rpm = this.opsCount.length;
|
|
77
|
-
// Calculate next interval with linear scaling
|
|
78
|
-
const nextInterval = Math.min(MIN_INTERVAL + rpm * SCALE_FACTOR, // Linear scaling
|
|
79
|
-
MAX_INTERVAL // Cap at 1000ms
|
|
80
|
-
);
|
|
81
|
-
if (this.bundlingMode === "auto") {
|
|
82
|
-
setTimeout(this.autoScalingBundling.bind(this), nextInterval);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// Debug endpoint
|
|
86
|
-
async sendBundleNow() {
|
|
87
|
-
const bundles = await this.mempool.getBundles(1);
|
|
88
|
-
const bundle = bundles[0];
|
|
89
|
-
if (bundles.length === 0 || bundle.userOps.length === 0) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
const txHash = await this.sendBundleToExecutor(bundle);
|
|
93
|
-
if (!txHash) {
|
|
94
|
-
throw new Error("no tx hash");
|
|
95
|
-
}
|
|
96
|
-
return txHash;
|
|
97
|
-
}
|
|
98
|
-
async sendBundleToExecutor(userOpBundle) {
|
|
99
|
-
const { entryPoint, userOps, version } = userOpBundle;
|
|
100
|
-
if (userOps.length === 0) {
|
|
101
|
-
return undefined;
|
|
102
|
-
}
|
|
103
|
-
const wallet = await this.senderManager.getWallet();
|
|
104
|
-
const [gasPriceParams, nonce] = await Promise.all([
|
|
105
|
-
this.gasPriceManager.tryGetNetworkGasPrice(),
|
|
106
|
-
this.config.publicClient.getTransactionCount({
|
|
107
|
-
address: wallet.address,
|
|
108
|
-
blockTag: "latest"
|
|
109
|
-
})
|
|
110
|
-
]).catch((_) => {
|
|
111
|
-
return [];
|
|
112
|
-
});
|
|
113
|
-
if (!gasPriceParams || nonce === undefined) {
|
|
114
|
-
await this.resubmitUserOperations(userOps, entryPoint, "Failed to get nonce and gas parameters for bundling");
|
|
115
|
-
// Free executor if failed to get initial params.
|
|
116
|
-
await this.senderManager.markWalletProcessed(wallet);
|
|
117
|
-
return undefined;
|
|
118
|
-
}
|
|
119
|
-
const bundleResult = await this.executor.bundle({
|
|
120
|
-
executor: wallet,
|
|
121
|
-
userOpBundle,
|
|
122
|
-
nonce,
|
|
123
|
-
gasPriceParams,
|
|
124
|
-
isReplacementTx: false
|
|
125
|
-
});
|
|
126
|
-
// Free wallet if no bundle was sent.
|
|
127
|
-
if (bundleResult.status !== "bundle_success") {
|
|
128
|
-
await this.senderManager.markWalletProcessed(wallet);
|
|
129
|
-
}
|
|
130
|
-
// All ops failed simulation, drop them and return.
|
|
131
|
-
if (bundleResult.status === "all_ops_failed_simulation") {
|
|
132
|
-
const { rejectedUserOps } = bundleResult;
|
|
133
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
134
|
-
return undefined;
|
|
135
|
-
}
|
|
136
|
-
// Unhandled error during simulation, drop all ops.
|
|
137
|
-
if (bundleResult.status === "unhandled_simulation_failure") {
|
|
138
|
-
const { rejectedUserOps } = bundleResult;
|
|
139
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
140
|
-
this.metrics.bundlesSubmitted.labels({ status: "failed" }).inc();
|
|
141
|
-
return undefined;
|
|
142
|
-
}
|
|
143
|
-
// Resubmit if executor has insufficient funds.
|
|
144
|
-
if (bundleResult.status === "bundle_submission_failure" &&
|
|
145
|
-
bundleResult.reason instanceof viem_1.InsufficientFundsError) {
|
|
146
|
-
const { reason, userOpsToBundle, rejectedUserOps } = bundleResult;
|
|
147
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
148
|
-
await this.resubmitUserOperations(userOpsToBundle, entryPoint, reason.name);
|
|
149
|
-
this.metrics.bundlesSubmitted.labels({ status: "resubmit" }).inc();
|
|
150
|
-
return undefined;
|
|
151
|
-
}
|
|
152
|
-
// Encountered unhandled error during bundle simulation.
|
|
153
|
-
if (bundleResult.status === "bundle_submission_failure") {
|
|
154
|
-
const { rejectedUserOps, userOpsToBundle, reason } = bundleResult;
|
|
155
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
156
|
-
// NOTE: these ops passed validation, so we can try resubmitting them
|
|
157
|
-
await this.resubmitUserOperations(userOpsToBundle, entryPoint, reason instanceof abitype_1.BaseError
|
|
158
|
-
? reason.name
|
|
159
|
-
: "Encountered unhandled error during bundle simulation");
|
|
160
|
-
this.metrics.bundlesSubmitted.labels({ status: "failed" }).inc();
|
|
161
|
-
return undefined;
|
|
162
|
-
}
|
|
163
|
-
if (bundleResult.status === "bundle_success") {
|
|
164
|
-
let { userOpsBundled, rejectedUserOps, transactionRequest, transactionHash } = bundleResult;
|
|
165
|
-
// Increment submission attempts for all userOps submitted.
|
|
166
|
-
userOpsBundled = userOpsBundled.map((userOpInfo) => ({
|
|
167
|
-
...userOpInfo,
|
|
168
|
-
submissionAttempts: userOpInfo.submissionAttempts + 1
|
|
169
|
-
}));
|
|
170
|
-
const transactionInfo = {
|
|
171
|
-
executor: wallet,
|
|
172
|
-
transactionHash,
|
|
173
|
-
transactionRequest,
|
|
174
|
-
bundle: {
|
|
175
|
-
entryPoint,
|
|
176
|
-
version,
|
|
177
|
-
userOps: userOpsBundled
|
|
178
|
-
},
|
|
179
|
-
previousTransactionHashes: [],
|
|
180
|
-
lastReplaced: Date.now(),
|
|
181
|
-
submissionAttempts: 1,
|
|
182
|
-
timesPotentiallyIncluded: 0
|
|
183
|
-
};
|
|
184
|
-
await this.markUserOperationsAsSubmitted(userOpsBundled, transactionInfo);
|
|
185
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
186
|
-
this.metrics.bundlesSubmitted.labels({ status: "success" }).inc();
|
|
187
|
-
return transactionHash;
|
|
188
|
-
}
|
|
189
|
-
return undefined;
|
|
190
|
-
}
|
|
191
|
-
startWatchingBlocks(handleBlock) {
|
|
192
|
-
if (this.unWatch) {
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
this.unWatch = this.config.publicClient.watchBlocks({
|
|
196
|
-
onBlock: handleBlock,
|
|
197
|
-
onError: (error) => {
|
|
198
|
-
this.logger.error({ error }, "error while watching blocks");
|
|
199
|
-
},
|
|
200
|
-
emitMissed: false,
|
|
201
|
-
includeTransactions: false,
|
|
202
|
-
pollingInterval: this.config.pollingInterval
|
|
203
|
-
});
|
|
204
|
-
this.logger.debug("started watching blocks");
|
|
205
|
-
}
|
|
206
|
-
stopWatchingBlocks() {
|
|
207
|
-
if (this.unWatch) {
|
|
208
|
-
this.logger.debug("stopped watching blocks");
|
|
209
|
-
this.unWatch();
|
|
210
|
-
this.unWatch = undefined;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
// update the current status of the bundling transaction/s
|
|
214
|
-
async refreshTransactionStatus(transactionInfo) {
|
|
215
|
-
const { transactionHash: currentTxhash, bundle, previousTransactionHashes } = transactionInfo;
|
|
216
|
-
const { userOps, entryPoint } = bundle;
|
|
217
|
-
const txHashesToCheck = [currentTxhash, ...previousTransactionHashes];
|
|
218
|
-
const transactionDetails = await Promise.all(txHashesToCheck.map(async (transactionHash) => ({
|
|
219
|
-
transactionHash,
|
|
220
|
-
...(await (0, utils_1.getBundleStatus)({
|
|
221
|
-
transactionHash,
|
|
222
|
-
bundle: transactionInfo.bundle,
|
|
223
|
-
publicClient: this.config.publicClient,
|
|
224
|
-
logger: this.logger
|
|
225
|
-
}))
|
|
226
|
-
})));
|
|
227
|
-
// first check if bundling txs returns status "mined", if not, check for reverted
|
|
228
|
-
const mined = transactionDetails.find(({ bundlingStatus }) => bundlingStatus.status === "included");
|
|
229
|
-
const reverted = transactionDetails.find(({ bundlingStatus }) => bundlingStatus.status === "reverted");
|
|
230
|
-
const finalizedTransaction = mined ?? reverted;
|
|
231
|
-
if (!finalizedTransaction) {
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
const { bundlingStatus, transactionHash, blockNumber } = finalizedTransaction;
|
|
235
|
-
// TODO: there has to be a better way of solving onchain AA95 errors.
|
|
236
|
-
if (bundlingStatus.status === "reverted" && bundlingStatus.isAA95) {
|
|
237
|
-
// resubmit with more gas when bundler encounters AA95
|
|
238
|
-
transactionInfo.transactionRequest.gas = (0, utils_1.scaleBigIntByPercent)(transactionInfo.transactionRequest.gas, this.config.aa95GasMultiplier);
|
|
239
|
-
transactionInfo.transactionRequest.nonce += 1;
|
|
240
|
-
await this.replaceTransaction(transactionInfo, "AA95");
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
// Free executor if tx landed onchain
|
|
244
|
-
if (bundlingStatus.status !== "not_found") {
|
|
245
|
-
await this.senderManager.markWalletProcessed(transactionInfo.executor);
|
|
246
|
-
}
|
|
247
|
-
if (bundlingStatus.status === "included") {
|
|
248
|
-
const { userOperationDetails } = bundlingStatus;
|
|
249
|
-
await this.markUserOpsIncluded(userOps, entryPoint, blockNumber, transactionHash, userOperationDetails);
|
|
250
|
-
}
|
|
251
|
-
if (bundlingStatus.status === "reverted") {
|
|
252
|
-
await Promise.all(userOps.map(async (userOpInfo) => {
|
|
253
|
-
const { userOpHash } = userOpInfo;
|
|
254
|
-
await this.checkFrontrun({
|
|
255
|
-
entryPoint,
|
|
256
|
-
userOpHash,
|
|
257
|
-
transactionHash,
|
|
258
|
-
blockNumber
|
|
259
|
-
});
|
|
260
|
-
}));
|
|
261
|
-
await this.removeSubmitted(entryPoint, userOps);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
async checkFrontrun({ userOpHash, entryPoint, transactionHash, blockNumber }) {
|
|
265
|
-
const unwatch = this.config.publicClient.watchBlockNumber({
|
|
266
|
-
onBlockNumber: async (currentBlockNumber) => {
|
|
267
|
-
if (currentBlockNumber > blockNumber + 1n) {
|
|
268
|
-
try {
|
|
269
|
-
const userOperationReceipt = await this.getUserOperationReceipt(userOpHash);
|
|
270
|
-
if (userOperationReceipt) {
|
|
271
|
-
const transactionHash = userOperationReceipt.receipt.transactionHash;
|
|
272
|
-
const blockNumber = userOperationReceipt.receipt.blockNumber;
|
|
273
|
-
await this.mempool.removeSubmitted({
|
|
274
|
-
entryPoint,
|
|
275
|
-
userOpHash
|
|
276
|
-
});
|
|
277
|
-
await this.monitor.setUserOperationStatus(userOpHash, {
|
|
278
|
-
status: "included",
|
|
279
|
-
transactionHash
|
|
280
|
-
});
|
|
281
|
-
this.eventManager.emitFrontranOnChain(userOpHash, transactionHash, blockNumber);
|
|
282
|
-
this.logger.info({
|
|
283
|
-
userOpHash,
|
|
284
|
-
transactionHash
|
|
285
|
-
}, "user op frontrun onchain");
|
|
286
|
-
this.metrics.userOperationsOnChain
|
|
287
|
-
.labels({ status: "frontran" })
|
|
288
|
-
.inc(1);
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
await this.monitor.setUserOperationStatus(userOpHash, {
|
|
292
|
-
status: "failed",
|
|
293
|
-
transactionHash
|
|
294
|
-
});
|
|
295
|
-
this.eventManager.emitFailedOnChain(userOpHash, transactionHash, blockNumber);
|
|
296
|
-
this.logger.info({
|
|
297
|
-
userOpHash,
|
|
298
|
-
transactionHash
|
|
299
|
-
}, "user op failed onchain");
|
|
300
|
-
this.metrics.userOperationsOnChain
|
|
301
|
-
.labels({ status: "reverted" })
|
|
302
|
-
.inc(1);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
catch (error) {
|
|
306
|
-
this.logger.error({
|
|
307
|
-
userOpHash,
|
|
308
|
-
transactionHash,
|
|
309
|
-
error
|
|
310
|
-
}, "Error checking frontrun status");
|
|
311
|
-
// Still mark as failed since we couldn't verify inclusion
|
|
312
|
-
await this.monitor.setUserOperationStatus(userOpHash, {
|
|
313
|
-
status: "failed",
|
|
314
|
-
transactionHash
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
unwatch();
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
async getUserOperationReceipt(userOperationHash) {
|
|
323
|
-
const userOperationEventAbiItem = (0, viem_1.getAbiItem)({
|
|
324
|
-
abi: types_1.EntryPointV06Abi,
|
|
325
|
-
name: "UserOperationEvent"
|
|
326
|
-
});
|
|
327
|
-
let fromBlock = undefined;
|
|
328
|
-
let toBlock = undefined;
|
|
329
|
-
if (this.config.maxBlockRange !== undefined) {
|
|
330
|
-
const latestBlock = await this.config.publicClient.getBlockNumber();
|
|
331
|
-
fromBlock = latestBlock - BigInt(this.config.maxBlockRange);
|
|
332
|
-
if (fromBlock < 0n) {
|
|
333
|
-
fromBlock = 0n;
|
|
334
|
-
}
|
|
335
|
-
toBlock = "latest";
|
|
336
|
-
}
|
|
337
|
-
const filterResult = await this.config.publicClient.getLogs({
|
|
338
|
-
address: this.config.entrypoints,
|
|
339
|
-
event: userOperationEventAbiItem,
|
|
340
|
-
fromBlock,
|
|
341
|
-
toBlock,
|
|
342
|
-
args: {
|
|
343
|
-
userOpHash: userOperationHash
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
|
-
this.logger.debug({
|
|
347
|
-
filterResult: filterResult.length,
|
|
348
|
-
userOperationEvent: filterResult.length === 0
|
|
349
|
-
? undefined
|
|
350
|
-
: filterResult[0].transactionHash
|
|
351
|
-
}, "filter result length");
|
|
352
|
-
if (filterResult.length === 0) {
|
|
353
|
-
return null;
|
|
354
|
-
}
|
|
355
|
-
const userOperationEvent = filterResult[0];
|
|
356
|
-
// throw if any of the members of userOperationEvent are undefined
|
|
357
|
-
if (userOperationEvent.args.actualGasCost === undefined ||
|
|
358
|
-
userOperationEvent.args.sender === undefined ||
|
|
359
|
-
userOperationEvent.args.nonce === undefined ||
|
|
360
|
-
userOperationEvent.args.userOpHash === undefined ||
|
|
361
|
-
userOperationEvent.args.success === undefined ||
|
|
362
|
-
userOperationEvent.args.paymaster === undefined ||
|
|
363
|
-
userOperationEvent.args.actualGasUsed === undefined) {
|
|
364
|
-
throw new Error("userOperationEvent has undefined members");
|
|
365
|
-
}
|
|
366
|
-
const txHash = userOperationEvent.transactionHash;
|
|
367
|
-
if (txHash === null) {
|
|
368
|
-
// transaction pending
|
|
369
|
-
return null;
|
|
370
|
-
}
|
|
371
|
-
const getTransactionReceipt = async (txHash) => {
|
|
372
|
-
while (true) {
|
|
373
|
-
try {
|
|
374
|
-
const transactionReceipt = await this.config.publicClient.getTransactionReceipt({
|
|
375
|
-
hash: txHash
|
|
376
|
-
});
|
|
377
|
-
let effectiveGasPrice = transactionReceipt.effectiveGasPrice ??
|
|
378
|
-
transactionReceipt.gasPrice ??
|
|
379
|
-
undefined;
|
|
380
|
-
if (effectiveGasPrice === undefined) {
|
|
381
|
-
const tx = await this.config.publicClient.getTransaction({
|
|
382
|
-
hash: txHash
|
|
383
|
-
});
|
|
384
|
-
effectiveGasPrice = tx.gasPrice ?? undefined;
|
|
385
|
-
}
|
|
386
|
-
if (effectiveGasPrice) {
|
|
387
|
-
transactionReceipt.effectiveGasPrice = effectiveGasPrice;
|
|
388
|
-
}
|
|
389
|
-
return transactionReceipt;
|
|
390
|
-
}
|
|
391
|
-
catch (e) {
|
|
392
|
-
if (e instanceof viem_1.TransactionReceiptNotFoundError) {
|
|
393
|
-
continue;
|
|
394
|
-
}
|
|
395
|
-
throw e;
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
};
|
|
399
|
-
const receipt = await getTransactionReceipt(txHash);
|
|
400
|
-
const logs = receipt.logs;
|
|
401
|
-
if (logs.some((log) => log.blockHash === null ||
|
|
402
|
-
log.blockNumber === null ||
|
|
403
|
-
log.transactionIndex === null ||
|
|
404
|
-
log.transactionHash === null ||
|
|
405
|
-
log.logIndex === null ||
|
|
406
|
-
log.topics.length === 0)) {
|
|
407
|
-
// transaction pending
|
|
408
|
-
return null;
|
|
409
|
-
}
|
|
410
|
-
const userOperationReceipt = (0, utils_1.parseUserOperationReceipt)(userOperationHash, receipt);
|
|
411
|
-
return userOperationReceipt;
|
|
412
|
-
}
|
|
413
|
-
async handleBlock(block) {
|
|
414
|
-
if (this.currentlyHandlingBlock) {
|
|
415
|
-
return;
|
|
416
|
-
}
|
|
417
|
-
this.currentlyHandlingBlock = true;
|
|
418
|
-
this.logger.debug({ blockNumber: block.number }, "handling block");
|
|
419
|
-
const dumpSubmittedEntries = async () => {
|
|
420
|
-
const submittedEntries = [];
|
|
421
|
-
for (const entryPoint of this.config.entrypoints) {
|
|
422
|
-
const entries = await this.mempool.dumpSubmittedOps(entryPoint);
|
|
423
|
-
submittedEntries.push(...entries);
|
|
424
|
-
}
|
|
425
|
-
return submittedEntries;
|
|
426
|
-
};
|
|
427
|
-
const submittedEntries = await dumpSubmittedEntries();
|
|
428
|
-
if (submittedEntries.length === 0) {
|
|
429
|
-
this.stopWatchingBlocks();
|
|
430
|
-
this.currentlyHandlingBlock = false;
|
|
431
|
-
return;
|
|
432
|
-
}
|
|
433
|
-
// refresh op statuses
|
|
434
|
-
const ops = await dumpSubmittedEntries();
|
|
435
|
-
const txs = getTransactionsFromUserOperationEntries(ops);
|
|
436
|
-
await Promise.all(txs.map((txInfo) => this.refreshTransactionStatus(txInfo)));
|
|
437
|
-
// for all still not included check if needs to be replaced (based on gas price)
|
|
438
|
-
const gasPriceParameters = await this.gasPriceManager
|
|
439
|
-
.tryGetNetworkGasPrice()
|
|
440
|
-
.catch(() => ({
|
|
441
|
-
maxFeePerGas: 0n,
|
|
442
|
-
maxPriorityFeePerGas: 0n
|
|
443
|
-
}));
|
|
444
|
-
const transactionInfos = getTransactionsFromUserOperationEntries(await dumpSubmittedEntries());
|
|
445
|
-
await Promise.all(transactionInfos.map(async (txInfo) => {
|
|
446
|
-
const { transactionRequest } = txInfo;
|
|
447
|
-
const { maxFeePerGas, maxPriorityFeePerGas } = transactionRequest;
|
|
448
|
-
const isMaxFeeTooLow = maxFeePerGas < gasPriceParameters.maxFeePerGas;
|
|
449
|
-
const isPriorityFeeTooLow = maxPriorityFeePerGas <
|
|
450
|
-
gasPriceParameters.maxPriorityFeePerGas;
|
|
451
|
-
const isStuck = Date.now() - txInfo.lastReplaced >
|
|
452
|
-
this.config.resubmitStuckTimeout;
|
|
453
|
-
if (isMaxFeeTooLow || isPriorityFeeTooLow) {
|
|
454
|
-
await this.replaceTransaction(txInfo, "gas_price");
|
|
455
|
-
return;
|
|
456
|
-
}
|
|
457
|
-
if (isStuck) {
|
|
458
|
-
await this.replaceTransaction(txInfo, "stuck");
|
|
459
|
-
return;
|
|
460
|
-
}
|
|
461
|
-
}));
|
|
462
|
-
this.currentlyHandlingBlock = false;
|
|
463
|
-
}
|
|
464
|
-
async replaceTransaction(txInfo, reason) {
|
|
465
|
-
// Setup vars
|
|
466
|
-
const { bundle, executor, transactionRequest, transactionHash: oldTxHash } = txInfo;
|
|
467
|
-
const { userOps, entryPoint } = bundle;
|
|
468
|
-
const gasPriceParams = await this.gasPriceManager
|
|
469
|
-
.tryGetNetworkGasPrice()
|
|
470
|
-
.catch((_) => {
|
|
471
|
-
return undefined;
|
|
472
|
-
});
|
|
473
|
-
if (!gasPriceParams) {
|
|
474
|
-
const rejectedUserOps = userOps.map((userOpInfo) => ({
|
|
475
|
-
...userOpInfo,
|
|
476
|
-
reason: "Failed to get network gas price during replacement"
|
|
477
|
-
}));
|
|
478
|
-
await this.failedToReplaceTransaction({
|
|
479
|
-
entryPoint,
|
|
480
|
-
rejectedUserOps,
|
|
481
|
-
oldTxHash,
|
|
482
|
-
reason: "Failed to get network gas price during replacement"
|
|
483
|
-
});
|
|
484
|
-
// Free executor if failed to get initial params.
|
|
485
|
-
await this.senderManager.markWalletProcessed(txInfo.executor);
|
|
486
|
-
return;
|
|
487
|
-
}
|
|
488
|
-
// If the transaction is stuck increase gasPrice based on number of submission attempts.
|
|
489
|
-
if (reason === "stuck" || reason === "gas_price") {
|
|
490
|
-
const multiplier = 100n + BigInt(txInfo.submissionAttempts) * 20n;
|
|
491
|
-
const multiplierCeiling = this.config.resubmitMultiplierCeiling;
|
|
492
|
-
gasPriceParams.maxFeePerGas = (0, utils_1.scaleBigIntByPercent)(gasPriceParams.maxFeePerGas, (0, utils_1.minBigInt)(multiplier, multiplierCeiling));
|
|
493
|
-
gasPriceParams.maxPriorityFeePerGas = (0, utils_1.scaleBigIntByPercent)(gasPriceParams.maxPriorityFeePerGas, (0, utils_1.minBigInt)(multiplier, multiplierCeiling));
|
|
494
|
-
}
|
|
495
|
-
const bundleResult = await this.executor.bundle({
|
|
496
|
-
executor: executor,
|
|
497
|
-
userOpBundle: bundle,
|
|
498
|
-
nonce: transactionRequest.nonce,
|
|
499
|
-
gasPriceParams,
|
|
500
|
-
gasLimitSuggestion: transactionRequest.gas,
|
|
501
|
-
isReplacementTx: true
|
|
502
|
-
});
|
|
503
|
-
// Free wallet and return if potentially included too many times.
|
|
504
|
-
if (txInfo.timesPotentiallyIncluded >= 3) {
|
|
505
|
-
this.removeSubmitted(entryPoint, bundle.userOps);
|
|
506
|
-
this.logger.warn({
|
|
507
|
-
oldTxHash,
|
|
508
|
-
userOps: (0, utils_2.getUserOpHashes)(bundleResult.rejectedUserOps)
|
|
509
|
-
}, "transaction potentially already included too many times, removing");
|
|
510
|
-
await this.senderManager.markWalletProcessed(txInfo.executor);
|
|
511
|
-
return;
|
|
512
|
-
}
|
|
513
|
-
// Free wallet if no bundle was sent or potentially included.
|
|
514
|
-
if (bundleResult.status !== "bundle_success") {
|
|
515
|
-
await this.senderManager.markWalletProcessed(txInfo.executor);
|
|
516
|
-
}
|
|
517
|
-
// Check if the transaction is potentially included.
|
|
518
|
-
const nonceTooLow = bundleResult.status === "bundle_submission_failure" &&
|
|
519
|
-
bundleResult.reason instanceof viem_1.NonceTooLowError;
|
|
520
|
-
const allOpsFailedSimulation = bundleResult.status === "all_ops_failed_simulation" &&
|
|
521
|
-
bundleResult.rejectedUserOps.every((op) => op.reason === "AA25 invalid account nonce" ||
|
|
522
|
-
op.reason === "AA10 sender already constructed");
|
|
523
|
-
const potentiallyIncluded = nonceTooLow || allOpsFailedSimulation;
|
|
524
|
-
// log metrics
|
|
525
|
-
const replaceStatus = (() => {
|
|
526
|
-
switch (true) {
|
|
527
|
-
case potentiallyIncluded:
|
|
528
|
-
return "potentially_already_included";
|
|
529
|
-
case bundleResult?.status === "bundle_success":
|
|
530
|
-
return "replaced";
|
|
531
|
-
default:
|
|
532
|
-
return "failed";
|
|
533
|
-
}
|
|
534
|
-
})();
|
|
535
|
-
this.metrics.replacedTransactions
|
|
536
|
-
.labels({ reason, status: replaceStatus })
|
|
537
|
-
.inc();
|
|
538
|
-
if (potentiallyIncluded) {
|
|
539
|
-
this.logger.info({
|
|
540
|
-
oldTxHash,
|
|
541
|
-
userOpHashes: (0, utils_2.getUserOpHashes)(bundleResult.rejectedUserOps)
|
|
542
|
-
}, "transaction potentially already included");
|
|
543
|
-
txInfo.timesPotentiallyIncluded += 1;
|
|
544
|
-
return;
|
|
545
|
-
}
|
|
546
|
-
if (bundleResult.status === "unhandled_simulation_failure") {
|
|
547
|
-
const { rejectedUserOps, reason } = bundleResult;
|
|
548
|
-
await this.failedToReplaceTransaction({
|
|
549
|
-
entryPoint,
|
|
550
|
-
oldTxHash,
|
|
551
|
-
reason,
|
|
552
|
-
rejectedUserOps
|
|
553
|
-
});
|
|
554
|
-
return;
|
|
555
|
-
}
|
|
556
|
-
if (bundleResult.status === "all_ops_failed_simulation") {
|
|
557
|
-
await this.failedToReplaceTransaction({
|
|
558
|
-
entryPoint,
|
|
559
|
-
oldTxHash,
|
|
560
|
-
reason: "all ops failed simulation",
|
|
561
|
-
rejectedUserOps: bundleResult.rejectedUserOps
|
|
562
|
-
});
|
|
563
|
-
return;
|
|
564
|
-
}
|
|
565
|
-
if (bundleResult.status === "bundle_submission_failure") {
|
|
566
|
-
const { reason, rejectedUserOps } = bundleResult;
|
|
567
|
-
const submissionFailureReason = reason instanceof abitype_1.BaseError ? reason.name : "INTERNAL FAILURE";
|
|
568
|
-
await this.failedToReplaceTransaction({
|
|
569
|
-
oldTxHash,
|
|
570
|
-
rejectedUserOps,
|
|
571
|
-
reason: submissionFailureReason,
|
|
572
|
-
entryPoint
|
|
573
|
-
});
|
|
574
|
-
return;
|
|
575
|
-
}
|
|
576
|
-
const { rejectedUserOps, userOpsBundled, transactionRequest: newTransactionRequest, transactionHash: newTxHash } = bundleResult;
|
|
577
|
-
// Increment submission attempts for all replaced userOps
|
|
578
|
-
const userOpsReplaced = userOpsBundled.map((userOpInfo) => ({
|
|
579
|
-
...userOpInfo,
|
|
580
|
-
submissionAttempts: userOpInfo.submissionAttempts + 1
|
|
581
|
-
}));
|
|
582
|
-
const newTxInfo = {
|
|
583
|
-
...txInfo,
|
|
584
|
-
transactionRequest: newTransactionRequest,
|
|
585
|
-
transactionHash: newTxHash,
|
|
586
|
-
previousTransactionHashes: [
|
|
587
|
-
txInfo.transactionHash,
|
|
588
|
-
...txInfo.previousTransactionHashes
|
|
589
|
-
],
|
|
590
|
-
lastReplaced: Date.now(),
|
|
591
|
-
submissionAttempts: txInfo.submissionAttempts + 1,
|
|
592
|
-
bundle: {
|
|
593
|
-
...txInfo.bundle,
|
|
594
|
-
userOps: userOpsReplaced
|
|
595
|
-
}
|
|
596
|
-
};
|
|
597
|
-
await this.markUserOperationsAsReplaced(userOpsReplaced, newTxInfo);
|
|
598
|
-
// Drop all userOperations that were rejected during simulation.
|
|
599
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
600
|
-
this.logger.info({
|
|
601
|
-
oldTxHash,
|
|
602
|
-
newTxHash,
|
|
603
|
-
reason
|
|
604
|
-
}, "replaced transaction");
|
|
605
|
-
return;
|
|
606
|
-
}
|
|
607
|
-
async markUserOperationsAsReplaced(userOpsReplaced, newTxInfo) {
|
|
608
|
-
// Mark as replaced in mempool
|
|
609
|
-
await Promise.all(userOpsReplaced.map(async (userOpInfo) => {
|
|
610
|
-
await this.mempool.replaceSubmitted({
|
|
611
|
-
userOpInfo,
|
|
612
|
-
transactionInfo: newTxInfo
|
|
613
|
-
});
|
|
614
|
-
}));
|
|
615
|
-
}
|
|
616
|
-
async markUserOperationsAsSubmitted(userOpInfos, transactionInfo) {
|
|
617
|
-
await Promise.all(userOpInfos.map(async (userOpInfo) => {
|
|
618
|
-
const { userOpHash } = userOpInfo;
|
|
619
|
-
await this.mempool.markSubmitted({
|
|
620
|
-
userOpHash,
|
|
621
|
-
transactionInfo
|
|
622
|
-
});
|
|
623
|
-
this.startWatchingBlocks(this.handleBlock.bind(this));
|
|
624
|
-
this.metrics.userOperationsSubmitted
|
|
625
|
-
.labels({ status: "success" })
|
|
626
|
-
.inc();
|
|
627
|
-
}));
|
|
628
|
-
}
|
|
629
|
-
async resubmitUserOperations(userOps, entryPoint, reason) {
|
|
630
|
-
await Promise.all(userOps.map(async (userOpInfo) => {
|
|
631
|
-
const { userOpHash, userOp } = userOpInfo;
|
|
632
|
-
this.logger.warn({
|
|
633
|
-
userOpHash,
|
|
634
|
-
reason
|
|
635
|
-
}, "resubmitting user operation");
|
|
636
|
-
await this.mempool.removeProcessing({ entryPoint, userOpHash });
|
|
637
|
-
await this.mempool.add(userOp, entryPoint);
|
|
638
|
-
this.metrics.userOperationsResubmitted.inc();
|
|
639
|
-
}));
|
|
640
|
-
}
|
|
641
|
-
async failedToReplaceTransaction({ oldTxHash, rejectedUserOps, reason, entryPoint }) {
|
|
642
|
-
this.logger.warn({ oldTxHash, reason }, "failed to replace transaction");
|
|
643
|
-
await this.dropUserOps(entryPoint, rejectedUserOps);
|
|
644
|
-
}
|
|
645
|
-
async removeSubmitted(entryPoint, userOps) {
|
|
646
|
-
await Promise.all(userOps.map(async (userOpInfo) => {
|
|
647
|
-
const { userOpHash } = userOpInfo;
|
|
648
|
-
await this.mempool.removeSubmitted({ entryPoint, userOpHash });
|
|
649
|
-
}));
|
|
650
|
-
}
|
|
651
|
-
async markUserOpsIncluded(userOps, entryPoint, blockNumber, transactionHash, userOperationDetails) {
|
|
652
|
-
await Promise.all(userOps.map(async (userOpInfo) => {
|
|
653
|
-
this.metrics.userOperationsOnChain
|
|
654
|
-
.labels({ status: "included" })
|
|
655
|
-
.inc();
|
|
656
|
-
const { userOpHash, userOp, submissionAttempts } = userOpInfo;
|
|
657
|
-
const opDetails = userOperationDetails[userOpHash];
|
|
658
|
-
const firstSubmitted = userOpInfo.addedToMempool;
|
|
659
|
-
this.metrics.userOperationInclusionDuration.observe((Date.now() - firstSubmitted) / 1000);
|
|
660
|
-
// Track the number of submission attempts for included ops
|
|
661
|
-
this.metrics.userOperationsSubmissionAttempts.observe(submissionAttempts);
|
|
662
|
-
await this.mempool.removeSubmitted({ entryPoint, userOpHash });
|
|
663
|
-
this.reputationManager.updateUserOperationIncludedStatus(userOp, entryPoint, opDetails.accountDeployed);
|
|
664
|
-
if (opDetails.status === "succesful") {
|
|
665
|
-
this.eventManager.emitIncludedOnChain(userOpHash, transactionHash, blockNumber);
|
|
666
|
-
}
|
|
667
|
-
else {
|
|
668
|
-
this.eventManager.emitExecutionRevertedOnChain(userOpHash, transactionHash, opDetails.revertReason || "0x", blockNumber);
|
|
669
|
-
}
|
|
670
|
-
await this.monitor.setUserOperationStatus(userOpHash, {
|
|
671
|
-
status: "included",
|
|
672
|
-
transactionHash
|
|
673
|
-
});
|
|
674
|
-
this.logger.info({
|
|
675
|
-
opHash: userOpHash,
|
|
676
|
-
transactionHash
|
|
677
|
-
}, "user op included");
|
|
678
|
-
}));
|
|
679
|
-
}
|
|
680
|
-
async dropUserOps(entryPoint, rejectedUserOps) {
|
|
681
|
-
await Promise.all(rejectedUserOps.map(async (rejectedUserOp) => {
|
|
682
|
-
const { userOp, reason, userOpHash } = rejectedUserOp;
|
|
683
|
-
await this.mempool.removeProcessing({ entryPoint, userOpHash });
|
|
684
|
-
await this.mempool.removeSubmitted({ entryPoint, userOpHash });
|
|
685
|
-
this.eventManager.emitDropped(userOpHash, reason, (0, utils_1.getAAError)(reason));
|
|
686
|
-
await this.monitor.setUserOperationStatus(userOpHash, {
|
|
687
|
-
status: "rejected",
|
|
688
|
-
transactionHash: null
|
|
689
|
-
});
|
|
690
|
-
this.logger.warn({
|
|
691
|
-
userOperation: JSON.stringify(userOp, (_k, v) => typeof v === "bigint" ? v.toString() : v),
|
|
692
|
-
userOpHash,
|
|
693
|
-
reason
|
|
694
|
-
}, "user operation rejected");
|
|
695
|
-
this.metrics.userOperationsSubmitted
|
|
696
|
-
.labels({ status: "failed" })
|
|
697
|
-
.inc();
|
|
698
|
-
}));
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
exports.ExecutorManager = ExecutorManager;
|
|
702
|
-
//# sourceMappingURL=executorManager.js.map
|