import { type Hex, type SendUserOperationResult, type SmartAccountSigner, } from "@alchemy/aa-core"; import { ZeroDevProvider, type ZeroDevProviderConfig } from "../provider.js"; import type { KernelBaseValidator, KernelBaseValidatorParams, } from "../validator/base.js"; import type { PaymasterConfig, PaymasterPolicy } from "../paymaster/types.js"; import { KernelSmartContractAccount, type KernelSmartAccountParams, isKernelAccount, } from "../account.js"; import { polygonMumbai } from "viem/chains"; import { withZeroDevPaymasterAndData } from "../middleware/paymaster.js"; import type { RequiredProps } from "../types.js"; export type ValidatorProviderParamsOpts
= {
paymasterConfig?: PaymasterConfig
>;
validatorConfig?: Omit >;
};
export interface ValidatorProviderParams {
projectId: string;
owner: SmartAccountSigner;
opts?: ValidatorProviderParamsOpts ;
}
export type ExtendedValidatorProviderParams<
P extends KernelBaseValidatorParams
> = ValidatorProviderParams & RequiredProps ;
// A simple facade abstraction for validator related provider operations
// Needs to be implemented for each validator plugin
export abstract class ValidatorProvider<
P extends KernelBaseValidatorParams
> extends ZeroDevProvider {
constructor(
params: ExtendedValidatorProviderParams ,
validator: KernelBaseValidator
) {
super({
...params.opts?.providerConfig,
chain: params.opts?.providerConfig?.chain ?? polygonMumbai,
rpcUrl: params.opts?.providerConfig?.rpcUrl,
projectId: params.projectId,
});
this.connect(
() =>
new KernelSmartContractAccount({
projectId: params.projectId,
owner: params.owner,
validator,
rpcClient: this.rpcClient,
...params.opts?.accountConfig,
})
);
if (params.opts?.paymasterConfig) {
withZeroDevPaymasterAndData(this, params.opts.paymasterConfig);
}
}
getEncodedEnableData = async (enableData: Hex): Promise