UNPKG

@owlprotocol/contracts-account-abstraction

Version:

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

68 lines (67 loc) 2.22 kB
import { decodeFunctionData } from "viem"; import { UserOperationNotFoundError, entryPoint07Address, formatUserOperation } from "viem/account-abstraction"; import { getBlockNumber, getLogs, getTransaction } from "viem/actions"; import { getAction } from "viem/utils"; import { sei, seiDevnet, seiTestnet } from "viem/chains"; import { UserOperationEvent } from "../../artifacts/IEntryPointSimulations.js"; import { toUserOperationEncoded } from "../../models/PackedUserOperation.js"; import { handleOps } from "../../artifacts/IEntryPoint.js"; async function getUserOperation(client, { hash }) { const chainIdNumber = client.chain.id; let rpcMaxRange = 90000n; if (chainIdNumber === sei.id || chainIdNumber === seiDevnet.id || chainIdNumber === seiTestnet.id) { rpcMaxRange = 2000n; } const blockNumber = await getBlockNumber(client); const fromBlock = rpcMaxRange < blockNumber ? blockNumber - rpcMaxRange : 0n; const filterResult = await getAction( client, getLogs, "getLogs" )({ address: entryPoint07Address, event: UserOperationEvent, args: { userOpHash: hash }, fromBlock, toBlock: "latest", strict: true }); const userOperationEvent = filterResult[0]; if (!userOperationEvent) throw new UserOperationNotFoundError({ hash }); const transactionHash = userOperationEvent.transactionHash; const transaction = await getAction(client, getTransaction, "getTransaction")({ hash: transactionHash }); let op = void 0; try { const decoded = decodeFunctionData({ abi: [handleOps], data: transaction.input }); const ops = decoded.args[0]; op = ops.find( (op2) => op2.sender === userOperationEvent.args.sender && op2.nonce === userOperationEvent.args.nonce ); } catch { throw new UserOperationNotFoundError({ hash }); } if (op === void 0) { throw new UserOperationNotFoundError({ hash }); } const userOperation = toUserOperationEncoded(op); return { blockHash: transaction.blockHash, blockNumber: transaction.blockNumber, entryPoint: entryPoint07Address, transactionHash, userOperation: formatUserOperation(userOperation) }; } export { getUserOperation };