@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
JavaScript
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
};
}
}