@zerodev/sdk
Version:
A utility library for working with ERC-4337
141 lines • 5.75 kB
JavaScript
;
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