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