UNPKG

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