UNPKG

@zerodev/sdk

Version:

A utility library for working with ERC-4337

141 lines 5.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createKernelMigrationAccount = exports.MIGRATION_HELPER_ADDRESS = void 0; const viem_1 = require("viem"); const actions_1 = require("viem/actions"); const utils_1 = require("viem/utils"); const constants_js_1 = require("../../constants.js"); const MigrationHelperAbi_js_1 = require("./abi/MigrationHelperAbi.js"); const KernelAccountAbi_js_1 = require("./abi/kernel_v_3_0_0/KernelAccountAbi.js"); const createKernelAccount_js_1 = require("./createKernelAccount.js"); exports.MIGRATION_HELPER_ADDRESS = "0x03EB97959433D55748839D27C93330Cb85F31A93"; async function createKernelMigrationAccount(client, params) { if (params.entryPoint.version !== "0.7") { throw new Error("Only EntryPoint 0.7 is supported"); } const { plugins: { sudo: { migrate: { from: fromValidator, to: toValidator } } }, ...rest } = params; const account = await (0, createKernelAccount_js_1.createKernelAccount)(client, { plugins: { sudo: fromValidator }, ...rest }); let isRootValidatorMigrated = false; let isAccountDeployed = false; const getRootValidatorMigrationStatus = async () => { try { if (isRootValidatorMigrated) return isRootValidatorMigrated; const rootValidator = await (0, utils_1.getAction)(client, actions_1.readContract, "readContract")({ address: account.address, abi: KernelAccountAbi_js_1.KernelV3AccountAbi, functionName: "rootValidator", args: [] }); const toRootValidatorId = (0, viem_1.concatHex)([ constants_js_1.VALIDATOR_TYPE[toValidator.validatorType], (0, viem_1.pad)(toValidator.getIdentifier(), { size: 20, dir: "right" }) ]); isRootValidatorMigrated = rootValidator.toLowerCase() === toRootValidatorId.toLowerCase(); return isRootValidatorMigrated; } catch (error) { return false; } }; [isAccountDeployed, isRootValidatorMigrated] = await Promise.all([ account.isDeployed(), getRootValidatorMigrationStatus() ]); if (isAccountDeployed && isRootValidatorMigrated) { return (0, createKernelAccount_js_1.createKernelAccount)(client, { plugins: { sudo: toValidator }, ...rest, address: account.address }); } const installFallbackCallData = (0, viem_1.encodeFunctionData)({ abi: KernelAccountAbi_js_1.KernelV3AccountAbi, functionName: "installModule", args: [ 3n, exports.MIGRATION_HELPER_ADDRESS, (0, viem_1.concat)([ (0, viem_1.toFunctionSelector)((0, viem_1.getAbiItem)({ abi: MigrationHelperAbi_js_1.MigrationHelperAbi, name: "migrateWithCall" })), viem_1.zeroAddress, (0, viem_1.encodeAbiParameters)((0, viem_1.parseAbiParameters)("bytes selectorInitData, bytes hookInitData"), [constants_js_1.CALL_TYPE.DELEGATE_CALL, "0x0000"]) ]) ] }); const installFallbackCall = { to: account.address, data: installFallbackCallData, value: 0n }; const uninstallFallbackCallData = (0, viem_1.encodeFunctionData)({ abi: KernelAccountAbi_js_1.KernelV3AccountAbi, functionName: "uninstallModule", args: [ 3n, exports.MIGRATION_HELPER_ADDRESS, (0, viem_1.concat)([ (0, viem_1.toFunctionSelector)((0, viem_1.getAbiItem)({ abi: MigrationHelperAbi_js_1.MigrationHelperAbi, name: "migrateWithCall" })), "0x" ]) ] }); const uninstallFallbackCall = { to: account.address, data: uninstallFallbackCallData, value: 0n }; return { ...account, getRootValidatorMigrationStatus, async encodeCalls(calls, callType) { const isRootValidatorMigrated = await getRootValidatorMigrationStatus(); const executeCallData = await account.encodeCalls(calls, callType); if (isRootValidatorMigrated) { return executeCallData; } const { args: [execMode, executionCalldata] } = (0, viem_1.decodeFunctionData)({ abi: [(0, viem_1.getAbiItem)({ abi: KernelAccountAbi_js_1.KernelV3ExecuteAbi, name: "execute" })], data: executeCallData }); const migrationCallData = (0, viem_1.encodeFunctionData)({ abi: MigrationHelperAbi_js_1.MigrationHelperAbi, functionName: "migrateWithCall", args: [[], [], execMode, executionCalldata] }); const migrationCall = { to: exports.MIGRATION_HELPER_ADDRESS, data: migrationCallData, value: 0n }; if (params.kernelVersion !== "0.3.0") { return account.encodeCalls([migrationCall], "delegatecall"); } migrationCall.to = account.address; const finalCalls = [ installFallbackCall, migrationCall, uninstallFallbackCall ]; return account.encodeCalls(finalCalls, "call"); } }; } exports.createKernelMigrationAccount = createKernelMigrationAccount; //# sourceMappingURL=createKernelMigrationAccount.js.map