UNPKG

@owlprotocol/contracts-account-abstraction

Version:

ERC4337 Account Abstraction support for deploying relevant smart contracts and interacting with UserOps.

161 lines (160 loc) 5.6 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var simulateHandleOp_exports = {}; __export(simulateHandleOp_exports, { getExecutionResult: () => getExecutionResult, simulateHandleOpV07: () => simulateHandleOpV07 }); module.exports = __toCommonJS(simulateHandleOp_exports); var import_viem = require("viem"); var import_simulateEntryPoint = require("./simulateEntryPoint.js"); var import_parseFailedOpWithRevert = require("../../gasestimation/parseFailedOpWithRevert.js"); var import_EntryPointSimulations = require("../../artifacts/EntryPointSimulations.js"); var import_models = require("../../models/index.js"); async function getExecutionResult(client, parameters) { const { packedUserOperation, entryPoint, entryPointSimulationsAddress, stateOverride } = parameters; const error = await simulateHandleOpV07(client, { packedUserOperation, entryPoint, targetAddress: packedUserOperation.sender, targetCallData: packedUserOperation.callData, entryPointSimulationsAddress, stateOverride }); if (error.result === "failed") { throw new import_models.ExecutionError( `UserOperation reverted during simulation with reason: ${error.data}`, import_models.ExecutionErrors.UserOperationReverted ); } return error; } async function simulateHandleOpV07(client, parameters) { const { packedUserOperation, entryPoint, targetAddress, targetCallData, entryPointSimulationsAddress, stateOverride } = parameters; const entryPointSimulationsSimulateHandleOpCallData = (0, import_viem.encodeFunctionData)({ abi: import_EntryPointSimulations.abi, functionName: "simulateHandleOp", args: [packedUserOperation] }); const entryPointSimulationsSimulateTargetCallData = (0, import_viem.encodeFunctionData)({ abi: import_EntryPointSimulations.abi, functionName: "simulateCallData", args: [packedUserOperation, targetAddress, targetCallData] }); const cause = await (0, import_simulateEntryPoint.simulateEntryPoint)(client, { entryPoint, entryPointSimulationsCallData: [ entryPointSimulationsSimulateHandleOpCallData, entryPointSimulationsSimulateTargetCallData ], entryPointSimulationsAddress, stateOverride }); try { const executionResult = getSimulateHandleOpResult(cause[0]); if (executionResult.result === "failed") { return executionResult; } const targetCallValidationResult = validateTargetCallDataResult(cause[1]); if (targetCallValidationResult.result === "failed") { return targetCallValidationResult; } return { result: "execution", data: { callDataResult: targetCallValidationResult.data, executionResult: executionResult.data.executionResult } }; } catch (e) { return { result: "failed", data: "Unknown error, could not parse simulate handle op result.", code: import_models.ValidationErrors.SimulateValidation }; } } function getSimulateHandleOpResult(data) { try { const decodedError = (0, import_viem.decodeErrorResult)({ abi: import_EntryPointSimulations.abi, data }); if (decodedError && decodedError.errorName === "FailedOp" && decodedError.args) { return { result: "failed", data: decodedError.args[1], code: import_models.ValidationErrors.SimulateValidation }; } if (decodedError && decodedError.errorName === "FailedOpWithRevert" && decodedError.args) { return { result: "failed", data: (0, import_parseFailedOpWithRevert.parseFailedOpWithRevert)(decodedError.args?.[2]), code: import_models.ValidationErrors.SimulateValidation }; } } catch { const decodedResult = (0, import_viem.decodeFunctionResult)({ abi: import_EntryPointSimulations.abi, functionName: "simulateHandleOp", data }); return { result: "execution", data: { executionResult: decodedResult } }; } throw new Error("Unexpected error"); } function validateTargetCallDataResult(data) { try { const targetCallResult = (0, import_viem.decodeFunctionResult)({ abi: import_EntryPointSimulations.abi, functionName: "simulateCallData", data }); const parsedTargetCallResult = import_models.targetCallResultSchema.parse(targetCallResult); if (parsedTargetCallResult.success) { return { result: "success", data: parsedTargetCallResult }; } return { result: "failed", data: parsedTargetCallResult.returnData, code: import_models.ExecutionErrors.UserOperationReverted }; } catch (_e) { return { result: "failed", data: "Unknown error, could not parse target call data result.", code: import_models.ExecutionErrors.UserOperationReverted }; } }