@zerodev/sdk
Version:
A utility library for working with ERC-4337
67 lines (60 loc) • 1.94 kB
text/typescript
import {
type Hex,
concatHex,
encodeFunctionData,
getAbiItem,
toFunctionSelector,
toHex
} from "viem"
import { CALL_TYPE } from "../../../../constants.js"
import { getExecMode } from "../../../../utils.js"
import { KernelV3ExecuteAbi } from "../../abi/kernel_v_3_0_0/KernelAccountAbi.js"
import type { CallArgs, DelegateCallArgs } from "../types.js"
export type EncodeExecuteOptions = Parameters<typeof getExecMode>[0]
type EncodeExecuteCallArgs<TOptions> =
| (TOptions extends {
callType: CALL_TYPE.DELEGATE_CALL
}
? DelegateCallArgs
: CallArgs)
| { calldata: Hex }
export const encodeExecuteCall = <TOptions extends EncodeExecuteOptions>(
args: EncodeExecuteCallArgs<TOptions>,
options: TOptions,
includeHooks = false
) => {
let calldata: Hex
if ("calldata" in args) {
calldata = args.calldata
} else {
calldata = concatHex([
args.to,
options.callType !== CALL_TYPE.DELEGATE_CALL
? toHex(args.value || 0n, { size: 32 })
: "0x", // No value if delegate call
args.data || "0x"
])
}
const executeUserOpSig = toFunctionSelector(
getAbiItem({ abi: KernelV3ExecuteAbi, name: "executeUserOp" })
)
// The calldata using hook plugin should be as follows:
// [0:4] - `executeUserOp` function signature
// [4:8] - `execute` function signature
// [8:] - `execute` function arguments
if (includeHooks) {
return concatHex([
executeUserOpSig,
encodeFunctionData({
abi: KernelV3ExecuteAbi,
functionName: "execute",
args: [getExecMode(options), calldata]
})
])
}
return encodeFunctionData({
abi: KernelV3ExecuteAbi,
functionName: "execute",
args: [getExecMode(options), calldata]
})
}