Skip to content

Commit

Permalink
feat: userop gas limit fix (#154)
Browse files Browse the repository at this point in the history
  • Loading branch information
0xSulpiride authored Feb 26, 2024
1 parent 1f06314 commit 43af1d3
Show file tree
Hide file tree
Showing 16 changed files with 85 additions and 44 deletions.
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
],
"npmClient": "yarn",
"useWorkspaces": true,
"version": "1.0.38-alpha",
"version": "1.0.39-alpha",
"stream": "true",
"command": {
"version": {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "root",
"private": true,
"version": "1.0.38-alpha",
"version": "1.0.39-alpha",
"engines": {
"node": ">=18.0.0"
},
Expand Down
8 changes: 4 additions & 4 deletions packages/api/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "api",
"version": "1.0.38-alpha",
"version": "1.0.39-alpha",
"description": "The API module of Etherspot bundler client",
"author": "Etherspot",
"homepage": "https://https://github.com/etherspot/skandha#readme",
Expand Down Expand Up @@ -35,13 +35,13 @@
"class-transformer": "0.5.1",
"class-validator": "0.14.0",
"ethers": "5.7.2",
"executor": "^1.0.38-alpha",
"executor": "^1.0.39-alpha",
"fastify": "4.14.1",
"monitoring": "^1.0.38-alpha",
"monitoring": "^1.0.39-alpha",
"pino": "8.11.0",
"pino-pretty": "10.0.0",
"reflect-metadata": "0.1.13",
"types": "^1.0.38-alpha"
"types": "^1.0.39-alpha"
},
"devDependencies": {
"@types/connect": "3.4.35"
Expand Down
14 changes: 7 additions & 7 deletions packages/cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cli",
"version": "1.0.38-alpha",
"version": "1.0.39-alpha",
"description": "> TODO: description",
"author": "zincoshine <[email protected]>",
"homepage": "https://https://github.com/etherspot/skandha#readme",
Expand Down Expand Up @@ -38,15 +38,15 @@
"@libp2p/peer-id-factory": "2.0.1",
"@libp2p/prometheus-metrics": "1.1.3",
"@multiformats/multiaddr": "12.1.3",
"api": "^1.0.38-alpha",
"db": "^1.0.38-alpha",
"executor": "^1.0.38-alpha",
"api": "^1.0.39-alpha",
"db": "^1.0.39-alpha",
"executor": "^1.0.39-alpha",
"find-up": "5.0.0",
"got": "12.5.3",
"js-yaml": "4.1.0",
"monitoring": "^1.0.38-alpha",
"node": "^1.0.38-alpha",
"types": "^1.0.38-alpha",
"monitoring": "^1.0.39-alpha",
"node": "^1.0.39-alpha",
"types": "^1.0.39-alpha",
"yargs": "17.6.2"
},
"devDependencies": {
Expand Down
4 changes: 2 additions & 2 deletions packages/db/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "db",
"version": "1.0.38-alpha",
"version": "1.0.39-alpha",
"description": "The DB module of Etherspot bundler client",
"author": "Etherspot",
"homepage": "https://github.com/etherspot/etherspot-bundler#readme",
Expand Down Expand Up @@ -33,7 +33,7 @@
"dependencies": {
"@chainsafe/ssz": "0.10.1",
"@farcaster/rocksdb": "5.5.0",
"types": "^1.0.38-alpha"
"types": "^1.0.39-alpha"
},
"devDependencies": {
"@types/rocksdb": "3.0.1",
Expand Down
8 changes: 4 additions & 4 deletions packages/executor/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "executor",
"version": "1.0.38-alpha",
"version": "1.0.39-alpha",
"description": "The Relayer module of Etherspot bundler client",
"author": "Etherspot",
"homepage": "https://https://github.com/etherspot/skandha#readme",
Expand Down Expand Up @@ -34,8 +34,8 @@
"@flashbots/ethers-provider-bundle": "0.6.2",
"async-mutex": "0.4.0",
"ethers": "5.7.2",
"monitoring": "^1.0.38-alpha",
"params": "^1.0.38-alpha",
"types": "^1.0.38-alpha"
"monitoring": "^1.0.39-alpha",
"params": "^1.0.39-alpha",
"types": "^1.0.39-alpha"
}
}
18 changes: 18 additions & 0 deletions packages/executor/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,22 @@ export class Config {
)
);

conf.bundleGasLimit = Number(
fromEnvVar(
network,
"BUNDLE_GAS_LIMIT",
conf.bundleGasLimit || bundlerDefaultConfigs.bundleGasLimit
)
);

conf.userOpGasLimit = Number(
fromEnvVar(
network,
"USEROP_GAS_LIMIT",
conf.userOpGasLimit || bundlerDefaultConfigs.userOpGasLimit
)
);

// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
if (!conf.whitelistedEntities) {
conf.whitelistedEntities = bundlerDefaultConfigs.whitelistedEntities;
Expand Down Expand Up @@ -400,6 +416,8 @@ const bundlerDefaultConfigs: BundlerConfig = {
pvgMarkup: 0,
gasFeeInSimulation: false,
skipBundleValidation: false,
userOpGasLimit: 25000000,
bundleGasLimit: 25000000,
};

const NETWORKS_ENV = (): string[] | undefined => {
Expand Down
2 changes: 2 additions & 0 deletions packages/executor/src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ export interface NetworkConfig {
gasFeeInSimulation: boolean;
// skips bundle validation
skipBundleValidation: boolean;
userOpGasLimit: number; // 25kk by default
bundleGasLimit: number; // 25kk by default
}

export type BundlerConfig = Omit<
Expand Down
7 changes: 7 additions & 0 deletions packages/executor/src/modules/eth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import { PerChainMetrics } from "monitoring/lib";
import { deepHexlify, packUserOp } from "../utils";
import { UserOpValidationService, MempoolService } from "../services";
import { Log, NetworkConfig } from "../interfaces";
import { getUserOpGasLimit } from "../services/BundlingService/utils";
import {
EstimateUserOperationGasArgs,
SendUserOperationGasArgs,
Expand Down Expand Up @@ -76,6 +77,12 @@ export class Eth {
await this.mempoolService.validateUserOpReplaceability(userOp, entryPoint);

this.logger.debug("Validating user op before sending to mempool...");
if (getUserOpGasLimit(userOp).gt(this.config.userOpGasLimit)) {
throw new RpcError(
"UserOp's gas limit is too high",
RpcErrorCodes.INVALID_USEROP
);
}
await this.userOpValidationService.validateGasFee(userOp);
const validationResult =
await this.userOpValidationService.simulateValidation(userOp, entryPoint);
Expand Down
10 changes: 8 additions & 2 deletions packages/executor/src/services/BundlingService/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import { getAddr, wait } from "../../utils";
import { MempoolEntry } from "../../entities/MempoolEntry";
import { IRelayingMode } from "./interfaces";
import { ClassicRelayer, FlashbotsRelayer } from "./relayers";
import { getUserOpGasLimit } from "./utils";

export class BundlingService {
private mutex: Mutex;
Expand All @@ -34,7 +35,7 @@ export class BundlingService {
private maxBundleSize: number;
private networkConfig: NetworkConfig;
private relayer: IRelayingMode;
private maxSubmitAttempts = 10;
private maxSubmitAttempts = 5;

constructor(
private chainId: number,
Expand Down Expand Up @@ -114,6 +115,7 @@ export class BundlingService {
maxPriorityFeePerGas: BigNumber.from(0),
};

let gasLimit = BigNumber.from(0);
const paymasterDeposit: { [key: string]: BigNumber } = {};
const stakedEntityCount: { [key: string]: number } = {};
const senders = new Set<string>();
Expand All @@ -122,6 +124,10 @@ export class BundlingService {
});

for (const entry of entries) {
if (getUserOpGasLimit(entry.userOp, gasLimit).gt(this.networkConfig.bundleGasLimit)) {
this.logger.debug(`${entry.userOpHash} reached bundle gas limit`);
continue;
}
// validate gas prices if enabled
if (this.networkConfig.enforceGasPrice) {
let { maxPriorityFeePerGas, maxFeePerGas } = gasFee;
Expand Down Expand Up @@ -379,7 +385,7 @@ export class BundlingService {
bundle.entries,
MempoolEntryStatus.Pending
);
// await this.mempoolService.attemptToBundle(bundle.entries);
await this.mempoolService.attemptToBundle(bundle.entries);
void this.relayer.sendBundle(bundle).catch((err) => {
this.logger.error(err);
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { BigNumber } from "ethers";
import { UserOperationStruct } from "types/lib/executor/contracts/EntryPoint";
import { MempoolEntry } from "../../../entities/MempoolEntry";

export function estimateBundleGasLimit(
Expand All @@ -7,17 +8,24 @@ export function estimateBundleGasLimit(
): BigNumber {
let gasLimit = BigNumber.from(markup);
for (const { userOp } of bundle) {
gasLimit = BigNumber.from(userOp.verificationGasLimit)
.mul(3)
.add(userOp.preVerificationGas)
.add(userOp.callGasLimit)
.mul(11)
.div(10)
.add(gasLimit);
gasLimit = getUserOpGasLimit(userOp, gasLimit);
}
if (gasLimit.lt(1e5)) {
// gasLimit should at least be 1e5 to pass test in test-executor
gasLimit = BigNumber.from(1e5);
}
return gasLimit;
}

export function getUserOpGasLimit(
userOp: UserOperationStruct,
markup: BigNumber = BigNumber.from(0)
): BigNumber {
return BigNumber.from(userOp.verificationGasLimit)
.mul(3)
.add(userOp.preVerificationGas)
.add(userOp.callGasLimit)
.mul(11)
.div(10)
.add(markup);
}
4 changes: 2 additions & 2 deletions packages/monitoring/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "monitoring",
"version": "1.0.38-alpha",
"version": "1.0.39-alpha",
"description": "The Monitoring module of Etherspot bundler client",
"author": "Etherspot",
"homepage": "https://github.com/etherspot/etherspot-bundler#readme",
Expand Down Expand Up @@ -32,6 +32,6 @@
},
"dependencies": {
"prom-client": "15.1.0",
"types": "^1.0.38-alpha"
"types": "^1.0.39-alpha"
}
}
16 changes: 8 additions & 8 deletions packages/node/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "node",
"version": "1.0.38-alpha",
"version": "1.0.39-alpha",
"description": "The bundler node module of Etherspot bundler client",
"author": "Etherspot",
"homepage": "https://https://github.com/etherspot/skandha#readme",
Expand Down Expand Up @@ -56,25 +56,25 @@
"@libp2p/tcp": "6.1.0",
"@multiformats/multiaddr": "11.4.0",
"abstract-leveldown": "7.2.0",
"api": "^1.0.38-alpha",
"api": "^1.0.39-alpha",
"datastore-core": "8.0.1",
"db": "^1.0.38-alpha",
"db": "^1.0.39-alpha",
"ethers": "5.7.2",
"executor": "^1.0.38-alpha",
"executor": "^1.0.39-alpha",
"it-filter": "1.0.2",
"it-map": "1.0.5",
"it-sort": "1.0.0",
"it-take": "1.0.1",
"libp2p": "0.42.2",
"monitoring": "^1.0.38-alpha",
"params": "^1.0.38-alpha",
"monitoring": "^1.0.39-alpha",
"params": "^1.0.39-alpha",
"prettier": "2.8.4",
"snappy": "7.2.2",
"snappyjs": "0.7.0",
"stream-to-it": "0.2.4",
"strict-event-emitter-types": "2.0.0",
"types": "^1.0.38-alpha",
"utils": "^1.0.38-alpha",
"types": "^1.0.39-alpha",
"utils": "^1.0.39-alpha",
"varint": "6.0.0",
"xxhash-wasm": "1.0.2"
},
Expand Down
6 changes: 3 additions & 3 deletions packages/params/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "params",
"version": "1.0.38-alpha",
"version": "1.0.39-alpha",
"description": "Various bundler parameters",
"author": "Etherspot",
"homepage": "https://github.com/etherspot/skandha#readme",
Expand All @@ -26,8 +26,8 @@
"@eth-optimism/sdk": "3.0.0",
"@mantleio/sdk": "0.2.1",
"ethers": "5.7.2",
"types": "^1.0.38-alpha",
"utils": "^1.0.38-alpha"
"types": "^1.0.39-alpha",
"utils": "^1.0.39-alpha"
},
"scripts": {
"clean": "rm -rf lib && rm -f *.tsbuildinfo",
Expand Down
2 changes: 1 addition & 1 deletion packages/types/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "types",
"version": "1.0.38-alpha",
"version": "1.0.39-alpha",
"description": "The types of Etherspot bundler client",
"author": "Etherspot",
"homepage": "https://https://github.com/etherspot/skandha#readme",
Expand Down
4 changes: 2 additions & 2 deletions packages/utils/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "utils",
"version": "1.0.38-alpha",
"version": "1.0.39-alpha",
"description": "utils of Etherspot bundler client",
"author": "Etherspot",
"homepage": "https://https://github.com/etherspot/skandha#readme",
Expand Down Expand Up @@ -37,6 +37,6 @@
"case": "^1.6.3",
"pino": "8.11.0",
"pino-pretty": "10.0.0",
"types": "^1.0.38-alpha"
"types": "^1.0.39-alpha"
}
}

0 comments on commit 43af1d3

Please sign in to comment.