Skip to content

Commit

Permalink
feat: Implement addtional fee estimation via resolvers
Browse files Browse the repository at this point in the history
  • Loading branch information
jsanmigimeno committed Jun 19, 2024
1 parent 17397b7 commit 0a87507
Show file tree
Hide file tree
Showing 11 changed files with 266 additions and 85 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@
"pg": "^8.11.3",
"pino": "^8.15.1",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.8.1"
"rxjs": "^7.8.1",
"viem": "^2.15.1"
},
"devDependencies": {
"@nestjs/cli": "^10.0.0",
Expand Down
80 changes: 80 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 24 additions & 0 deletions src/resolvers/base-sepolia.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import pino from "pino";
import { JsonRpcProvider } from "ethers6";
import { ResolverConfig } from "./resolver";
import OPStackResolver from "./op-stack";

export const BASE_SEPOLIA_CHAIN_NAME = 'baseSepolia';

export class BaseSepoliaResolver extends OPStackResolver {

constructor(
config: ResolverConfig,
provider: JsonRpcProvider,
logger: pino.Logger,
) {
super(
BASE_SEPOLIA_CHAIN_NAME,
config,
provider,
logger,
);
}
}

export default BaseSepoliaResolver;
54 changes: 54 additions & 0 deletions src/resolvers/op-stack.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { JsonRpcProvider, TransactionRequest } from "ethers6";
import { Resolver, ResolverConfig } from "./resolver";
import pino from "pino";
import { createPublicClient, http } from "viem";
import { publicActionsL2 } from 'viem/op-stack'

export const RESOLVER_TYPE_OP_STACK = 'op-stack';

export class OPStackResolver extends Resolver {
override readonly resolverType;

private client: any; //TODO use VIEM types

constructor(
chainName: string,
config: ResolverConfig,
provider: JsonRpcProvider,
logger: pino.Logger,
) {
super(
config,
provider,
logger,
);

this.resolverType = RESOLVER_TYPE_OP_STACK;

this.client = this.loadClient(
chainName,
this.provider._getConnection().url //TODO the 'rpc' url should be added to the ResolverConfig
);
}

private loadClient(
chainName: string,
rpc: string,
): any {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const chain = require(`viem/chains`)[chainName];

return createPublicClient({
chain,
transport: http(rpc),
}).extend(publicActionsL2());
}

override async estimateAdditionalFee(
transactionRequest: TransactionRequest
): Promise<bigint> {
return this.client.estimateL1Fee(transactionRequest)
}
}

export default OPStackResolver;
24 changes: 24 additions & 0 deletions src/resolvers/optimism-sepolia.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import pino from "pino";
import { JsonRpcProvider } from "ethers6";
import { ResolverConfig } from "./resolver";
import OPStackResolver from "./op-stack";

export const OPTIMISM_SEPOLIA_CHAIN_NAME = 'optimismSepolia';

export class OptimismSepoliaResolver extends OPStackResolver {

constructor(
config: ResolverConfig,
provider: JsonRpcProvider,
logger: pino.Logger,
) {
super(
OPTIMISM_SEPOLIA_CHAIN_NAME,
config,
provider,
logger,
);
}
}

export default OptimismSepoliaResolver;
8 changes: 7 additions & 1 deletion src/resolvers/resolver.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { JsonRpcProvider } from "ethers6";
import { JsonRpcProvider, TransactionRequest } from "ethers6";
import pino from "pino";

export const RESOLVER_TYPE_DEFAULT = 'default';
Expand Down Expand Up @@ -78,4 +78,10 @@ export class Resolver {
): Promise<number> {
return new Promise((resolve) => resolve(observedBlockNumber));
};

estimateAdditionalFee(
_transactionRequest: TransactionRequest
): Promise<bigint> {
return new Promise((resolve) => resolve(0n));
}
}
Loading

0 comments on commit 0a87507

Please sign in to comment.