@account-kit/infra
Version:
adapters for @aa-sdk/core for interacting with alchemy services
48 lines • 2.18 kB
JavaScript
import { applyUserOpOverrideOrFeeOption, bigIntMultiply, clientHeaderTrack, } from "@aa-sdk/core";
/**
* Function that estimates the transaction fees using Alchemy methods for a given client.
* It fetches the latest block and estimates the max priority fee per gas, applying any overrides or fee options provided.
*
* @example
* ```ts
* import { alchemyFeeEstimator, alchemy } from "@account-kit/infra";
* import { createSmartAccountClient } from "@aa-sdk/core";
*
* const alchemyTransport = alchemy({
* chain: sepolia,
* apiKey: "your-api-key"
* });
*
* const client = createSmartAccountClient({
* feeEstimator: alchemyFeeEstimator(alchemyTransport),
* ...otherParams
* });
* ```
*
* @param {AlchemyTransport} transport An alchemy transport for making Alchemy specific RPC calls
* @returns {ClientMiddlewareFn} A middleware function that takes a transaction structure and fee options, and returns the augmented structure with estimated fees
*/
export const alchemyFeeEstimator = (transport) => async (struct, { overrides, feeOptions, client: client_ }) => {
const client = clientHeaderTrack(client_, "alchemyFeeEstimator");
const transport_ = transport({ chain: client.chain });
let [block, maxPriorityFeePerGasEstimate] = await Promise.all([
client.getBlock({ blockTag: "latest" }),
// it is a fair assumption that if someone is using this Alchemy Middleware, then they are using Alchemy RPC
transport_.request({
method: "rundler_maxPriorityFeePerGas",
params: [],
}),
]);
const baseFeePerGas = block.baseFeePerGas;
if (baseFeePerGas == null) {
throw new Error("baseFeePerGas is null");
}
const maxPriorityFeePerGas = applyUserOpOverrideOrFeeOption(maxPriorityFeePerGasEstimate, overrides?.maxPriorityFeePerGas, feeOptions?.maxPriorityFeePerGas);
const maxFeePerGas = applyUserOpOverrideOrFeeOption(bigIntMultiply(baseFeePerGas, 1.5) + BigInt(maxPriorityFeePerGas), overrides?.maxFeePerGas, feeOptions?.maxFeePerGas);
return {
...struct,
maxPriorityFeePerGas,
maxFeePerGas,
};
};
//# sourceMappingURL=feeEstimator.js.map