@zerodev/sdk
Version:
A utility library for working with ERC-4337
271 lines (246 loc) • 7.88 kB
text/typescript
import type { Address, CustomSource, Hex, LocalAccount, PartialBy } from "viem"
import type {
EntryPointVersion,
UserOperation,
entryPoint06Abi,
entryPoint07Abi
} from "viem/account-abstraction"
import type { PLUGIN_TYPE, VALIDATOR_TYPE } from "../constants.js"
export type ZeroDevPaymasterRpcSchema<
entryPointVersion extends EntryPointVersion
> = [
{
Method: "zd_sponsorUserOperation"
Parameters: [
{
chainId: number
userOp: entryPointVersion extends "0.6"
? PartialBy<
UserOperation<"0.6">,
| "callGasLimit"
| "preVerificationGas"
| "verificationGasLimit"
>
: PartialBy<
UserOperation<"0.7">,
| "callGasLimit"
| "preVerificationGas"
| "verificationGasLimit"
| "paymasterVerificationGasLimit"
| "paymasterPostOpGasLimit"
>
entryPointAddress: Address
gasTokenData?: {
tokenAddress: Hex
}
shouldOverrideFee?: boolean
manualGasEstimation?: boolean
shouldConsume?: boolean
}
]
ReturnType: entryPointVersion extends "0.6"
? {
paymasterAndData: Hex
preVerificationGas: Hex
verificationGasLimit: Hex
callGasLimit: Hex
maxFeePerGas?: Hex
maxPriorityFeePerGas?: Hex
paymaster?: never
paymasterVerificationGasLimit?: never
paymasterPostOpGasLimit?: never
paymasterData?: never
}
: {
preVerificationGas: Hex
verificationGasLimit: Hex
callGasLimit: Hex
paymaster: Address
paymasterVerificationGasLimit: Hex
paymasterPostOpGasLimit: Hex
paymasterData: Hex
maxFeePerGas?: Hex
maxPriorityFeePerGas?: Hex
paymasterAndData?: never
}
},
{
Method: "zd_pm_accounts"
Parameters: [
{
chainId: number
entryPointAddress: Address
}
]
ReturnType: Address[]
},
{
Method: "stackup_getERC20TokenQuotes"
Parameters: [
{
chainId: number
userOp: UserOperation<"0.6">
entryPointAddress: Address
tokenAddress: Address
}
]
ReturnType: {
maxGasCostToken: string
tokenDecimals: string
}
}
]
export type ZeroDevUserOperationGasPriceWithBigIntAsHex = {
slow: {
maxFeePerGas: Hex
maxPriorityFeePerGas: Hex
}
standard: {
maxFeePerGas: Hex
maxPriorityFeePerGas: Hex
}
fast: {
maxFeePerGas: Hex
maxPriorityFeePerGas: Hex
}
}
export type ZeroDevAccountClientRpcSchema = [
{
Method: "zd_getUserOperationGasPrice"
Parameters: []
ReturnType: ZeroDevUserOperationGasPriceWithBigIntAsHex
}
]
export type ValidatorType = Extract<
keyof typeof VALIDATOR_TYPE,
"PERMISSION" | "SECONDARY" | "EIP7702"
>
export type KernelValidator<Name extends string = string> =
LocalAccount<Name> & {
validatorType: ValidatorType
supportedKernelVersions: string
getNonceKey: (
accountAddress?: Address,
customNonceKey?: bigint
) => Promise<bigint>
getStubSignature(
userOperation: UserOperation,
pluginEnableSignature?: Hex
): Promise<Hex>
signUserOperation: (
userOperation: UserOperation & {
chainId?: number | undefined
},
pluginEnableSignature?: Hex
) => Promise<Hex>
getEnableData(accountAddress?: Address): Promise<Hex>
isEnabled(accountAddress: Address, selector: Hex): Promise<boolean>
getIdentifier: () => Hex
}
export type KernelValidatorHook = {
getEnableData(accountAddress?: Address): Promise<Hex>
getIdentifier: () => Hex
}
export type ValidatorInitData = {
validatorAddress: Address
enableData: Hex
identifier: Hex
initConfig?: Hex[]
}
export type ActiveValidatorMode = "sudo" | "regular"
export type KernelPluginManager<entryPointVersion extends EntryPointVersion> =
KernelValidator & {
sudoValidator?: KernelValidator
regularValidator?: KernelValidator
activeValidatorMode: ActiveValidatorMode
hook?: KernelValidatorHook
getPluginEnableSignature(accountAddress: Address): Promise<Hex>
getValidatorInitData(): Promise<ValidatorInitData>
getAction(): Action
getValidityData(): PluginValidityData
getIdentifier(isSudo?: boolean): Hex
encodeModuleInstallCallData: (accountAddress: Address) => Promise<Hex>
getPluginsEnableTypedData: (
accountAddress: Address
) => Promise<Parameters<CustomSource["signTypedData"]>[0]>
signUserOperationWithActiveValidator: (
userOperation: UserOperation<entryPointVersion>
) => Promise<Hex>
}
export type PluginInstallData<entryPointVersion extends EntryPointVersion> =
entryPointVersion extends "0.6"
? {
selector: Hex
executor: Address
validator: Address
validUntil: number
validAfter: number
enableData: Hex
}
: // TODO: Add support for EP v0.7
never
export type KernelPluginManagerParams<
entryPointVersion extends EntryPointVersion
> = {
sudo?: KernelValidator
regular?: KernelValidator
hook?: KernelValidatorHook
pluginEnableSignature?: Hex
validatorInitData?: ValidatorInitData
action?: Action
entryPoint: EntryPointType<entryPointVersion>
kernelVersion: KERNEL_VERSION_TYPE
chainId?: number
isPreInstalled?: boolean
} & Partial<PluginValidityData>
export type Hook = {
address: Address
}
export type Action = {
address: Address
selector: Hex
hook?: Hook
}
export type PluginValidityData = {
validUntil: number
validAfter: number
}
export enum ValidatorMode {
sudo = "0x00000000",
plugin = "0x00000001",
enable = "0x00000002"
}
export type PluginMigrationData = {
type: (typeof PLUGIN_TYPE)[keyof typeof PLUGIN_TYPE]
address: Address
data: Hex
}
export type CallType = "call" | "delegatecall"
export type KernelEncodeCallDataArgs = {
to: Address
value: bigint
data: Hex
callType: CallType | undefined
}[]
export type GetEntryPointAbi<entryPointVersion extends EntryPointVersion> =
entryPointVersion extends "0.6"
? typeof entryPoint06Abi
: typeof entryPoint07Abi
export type Execution = {
target: Address
value: bigint
callData: Hex
}
export type KERNEL_V2_VERSION_TYPE = "0.0.2" | "0.2.2" | "0.2.3" | "0.2.4"
export type KERNEL_V3_VERSION_TYPE = "0.3.0" | "0.3.1" | "0.3.2" | "0.3.3"
export type KERNEL_VERSION_TYPE =
| KERNEL_V2_VERSION_TYPE
| KERNEL_V3_VERSION_TYPE
export type GetKernelVersion<entryPointVersion extends EntryPointVersion> =
entryPointVersion extends "0.6"
? KERNEL_V2_VERSION_TYPE
: KERNEL_V3_VERSION_TYPE
export type EntryPointType<entryPointVersion extends EntryPointVersion> = {
address: Address
version: entryPointVersion
}