@owlprotocol/contracts-account-abstraction
Version:
ERC4337 Account Abstraction support for deploying relevant smart contracts and interacting with UserOps.
109 lines (108 loc) • 4.12 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 requestGetUserOperationReceipt_exports = {};
__export(requestGetUserOperationReceipt_exports, {
createRequestGetUserOperationReceipt: () => createRequestGetUserOperationReceipt
});
module.exports = __toCommonJS(requestGetUserOperationReceipt_exports);
var import_viem = require("viem");
var import_account_abstraction = require("viem/account-abstraction");
var import_chains = require("viem/chains");
var import_IEntryPoint = require("../../artifacts/IEntryPoint.js");
function createRequestGetUserOperationReceipt(request) {
return async function(args) {
const [hash] = args.params;
const chainId = await request({ method: "eth_chainId" });
const chainIdNumber = (0, import_viem.hexToNumber)(chainId);
const blockNumberHex = await request({
method: "eth_blockNumber"
});
let rpcMaxRange = 9e4;
if (chainIdNumber === import_chains.sei.id || chainIdNumber === import_chains.seiDevnet.id || chainIdNumber === import_chains.seiTestnet.id) {
rpcMaxRange = 2e3;
}
const blockNumber = (0, import_viem.hexToNumber)(blockNumberHex);
const fromBlock = Math.max(blockNumber - rpcMaxRange, 0);
const filterResult = await request({
method: "eth_getLogs",
params: [
{
address: import_account_abstraction.entryPoint07Address,
topics: (0, import_viem.encodeEventTopics)({
abi: [import_IEntryPoint.UserOperationEvent],
eventName: "UserOperationEvent",
args: {
userOpHash: hash
}
}),
fromBlock: (0, import_viem.numberToHex)(fromBlock),
toBlock: "latest"
}
]
});
if (filterResult.length === 0) {
return null;
}
const userOperationLog = filterResult[0];
const userOperationEvent = (0, import_viem.decodeEventLog)({
abi: [import_IEntryPoint.UserOperationEvent],
eventName: "UserOperationEvent",
data: userOperationLog.data,
topics: userOperationLog.topics,
strict: true
});
const transactionHash = userOperationLog.transactionHash;
if (transactionHash === null) {
return null;
}
const receipt = await request({
method: "eth_getTransactionReceipt",
params: [transactionHash]
});
if (!receipt) {
return null;
}
const logs = receipt.logs;
let startIndex = -1;
let endIndex = -1;
logs.forEach((log, index) => {
if (log?.topics[0] === userOperationLog.topics[0]) {
if (log.topics[1] === userOperationLog.topics[1]) {
endIndex = index;
} else if (endIndex === -1) {
startIndex = index;
}
}
});
if (endIndex === -1) {
throw new Error("fatal: no UserOperationEvent in logs");
}
const filteredLogs = logs.slice(startIndex + 1, endIndex);
return {
entryPoint: import_account_abstraction.entryPoint07Address,
userOpHash: hash,
sender: userOperationEvent.args.sender,
nonce: (0, import_viem.numberToHex)(userOperationEvent.args.nonce),
actualGasUsed: (0, import_viem.numberToHex)(userOperationEvent.args.actualGasUsed),
actualGasCost: (0, import_viem.numberToHex)(userOperationEvent.args.actualGasCost),
success: userOperationEvent.args.success,
receipt,
logs: filteredLogs
};
};
}