Skip to content
This repository was archived by the owner on Oct 20, 2024. It is now read-only.
This repository was archived by the owner on Oct 20, 2024. It is now read-only.

Support middleware concurrent #105

Description

@alberthuang24

Question

Now let's assume we have a builder like this one.

        return instance
            .useDefaults({
                sender: instance.proxyImpl.address,
                verificationGasLimit: 200000,
                preVerificationGas: 21000
            })
            .useMiddleware(instance.resolveAccount)
            .useMiddleware(Presets.Middleware.getGasPrice(provider))
            .useMiddleware(SodiumCallData(instance, signer))
            .useMiddleware(instance.paymasterMiddleware())
            .useMiddleware(estimateUserOperationGas(instance.provider))
-> resolveAccount(100ms) -> getGasPrice (100ms) -> setupCalldata (100ms) -> paymasterMiddleware(100ms) -> estimateUserOperationGas(100ms).

The buildOp execution will be very slow because they are executed synchronously.

Maybe we can optimize them this way

        return instance
            .useDefaults({
                sender: instance.proxyImpl.address,
                verificationGasLimit: 200000,
                preVerificationGas: 21000
            })
            .useConcurrentMiddleware(instance.resolveAccount)
            .useConcurrentMiddleware(Presets.Middleware.getGasPrice(provider))
            .useConcurrentMiddleware(SodiumCallData(instance, signer))
            .useConcurrentMiddleware(instance.paymasterMiddleware())
            .useMiddleware(estimateUserOperationGas(instance.provider))
  async buildOp(entryPoint: string, chainId: BigNumberish) {
    const ctx = new UserOperationMiddlewareCtx(
      this.currOp,
      entryPoint,
      chainId
    );

    await Promise.all(this.concurrentMiddlewareStack.map(fn));
    for (const fn of this.middlewareStack) {
      await fn(ctx);
    }
    this.setPartial(ctx.op);

    return OpToJSON(this.currOp);
  }
(resolveAccount, getGasPrice, setupCalldata, paymasterMiddleware)(100ms) -> estimateUserOperationGas(100ms);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions