zerodev sessionkey
zerodev sessionkey demo代码比较
https://www.diffchecker.com/zY2Lu8JQ/
代码主要区别在于:serializeSessionKeyAccount, deserializeSessionKeyAccount,

代码分析
- util
- serializeSessionKeyAccount
- deserializeSessionKeyAccount
export const serializeSessionKeyAccountParams = (
params: SessionKeyAccountParams
) => {
const jsonString = JSON.stringify(params)
const uint8Array = new TextEncoder().encode(jsonString)
const base64String = bytesToBase64(uint8Array)
return base64String
}
export const deserializeSessionKeyAccountParams = (params: string) => {
const uint8Array = base64ToBytes(params)
const jsonString = new TextDecoder().decode(uint8Array)
return JSON.parse(jsonString) as SessionKeyAccountParams
}
import type { KernelSmartAccount } from "@zerodev/sdk"
import type { Hex } from "viem"
import {
isSessionKeyValidatorPlugin,
serializeSessionKeyAccountParams
} from "./utils.js"
export const serializeSessionKeyAccount = async (
account: KernelSmartAccount,
privateKey?: Hex
): Promise<string> => {
if (!isSessionKeyValidatorPlugin(account.kernelPluginManager))
throw new Error("Account plugin is not a session key validator")
const sessionKeyParams =
account.kernelPluginManager.getPluginSerializationParams()
const executorData = account.kernelPluginManager.getExecutorData()
const validityData = account.kernelPluginManager.getValidityData()
const enableSignature =
await account.kernelPluginManager.getPluginEnableSignature(
account.address
)
const accountParams = {
initCode: await account.generateInitCode(),
accountAddress: account.address
}
const paramsToBeSerialized = {
sessionKeyParams,
executorData,
validityData,
accountParams,
enableSignature,
privateKey
}
return serializeSessionKeyAccountParams(paramsToBeSerialized)
}
import { KernelAccountAbi, createKernelAccount } from "@zerodev/sdk"
import { KernelFactoryAbi } from "@zerodev/sdk"
import { toKernelPluginManager } from "@zerodev/sdk/accounts"
import type { ValidatorInitData } from "@zerodev/sdk/types"
import type { SmartAccountSigner } from "permissionless/accounts"
import type { Address, Hex } from "viem"
import { decodeFunctionData } from "viem"
import { privateKeyToAccount } from "viem/accounts"
import { signerToSessionKeyValidator } from "./toSessionKeyValidatorPlugin.js"
import { deserializeSessionKeyAccountParams } from "./utils.js"
export const deserializeSessionKeyAccount = async <
TSource extends string = "custom",
TAddress extends Address = Address
>(
client: Parameters<typeof createKernelAccount>[0],
sessionKeyAccountParams: string,
sessionKeySigner?: SmartAccountSigner<TSource, TAddress>
) => {
const params = deserializeSessionKeyAccountParams(sessionKeyAccountParams)
let signer: SmartAccountSigner<string, Hex>
if (params.privateKey) signer = privateKeyToAccount(params.privateKey)
else if (sessionKeySigner) signer = sessionKeySigner
else throw new Error("No signer or serialized sessionKey provided")
const sessionKeyPlugin = await signerToSessionKeyValidator(client, {
signer,
validatorData: params.sessionKeyParams
})
const { index, validatorInitData } = decodeParamsFromInitCode(
params.accountParams.initCode
)
const kernelPluginManager = await toKernelPluginManager(client, {
regular: sessionKeyPlugin,
pluginEnableSignature: params.enableSignature,
validatorInitData,
executorData: params.executorData,
...params.validityData
})
return createKernelAccount(client, {
plugins: kernelPluginManager,
index,
deployedAccountAddress: params.accountParams.accountAddress
})
}
export const decodeParamsFromInitCode = (initCode: Hex) => {
let index: bigint | undefined
let validatorInitData: ValidatorInitData | undefined
const createAccountFunctionData = decodeFunctionData({
abi: KernelFactoryAbi,
data: `0x${initCode.slice(42)}`
})
if (!createAccountFunctionData) throw new Error("Invalid initCode")
if (createAccountFunctionData.functionName === "createAccount") {
index = createAccountFunctionData.args[2]
const initializeFunctionData = decodeFunctionData({
abi: KernelAccountAbi,
data: createAccountFunctionData.args[1]
})
if (!initializeFunctionData) throw new Error("Invalid initCode")
if (initializeFunctionData.functionName === "initialize") {
validatorInitData = {
validatorAddress: initializeFunctionData.args[0],
enableData: initializeFunctionData.args[1]
}
}
}
if (index === undefined || validatorInitData === undefined)
throw new Error("Invalid initCode")
return { index, validatorInitData }
}