UNPKG

@biconomy/abstractjs

Version:

SDK for Biconomy integration with support for account abstraction, smart accounts, ERC-4337.

81 lines 3.75 kB
import { formatTransactionReceipt } from "viem"; import { getTransactionReceipt as getTransactionReceiptFromViem } from "viem/actions"; import { getExplorerTxLink, getJiffyScanLink, getMeeScanLink } from "../../../account/utils/explorer.js"; import { parseErrorMessage } from "../../../account/utils/parseErrorMessage.js"; import { parseTransactionStatus } from "../../../account/utils/parseTransactionStatus.js"; import { createHttpClient } from "../../createHttpClient.js"; import { DEFAULT_PATHFINDER_URL } from "../../createMeeClient.js"; export async function getSupertransactionReceipt(client, parameters) { const { confirmations = 2, waitForReceipts = true, ...params } = parameters; const account = parameters.account ?? client.account; // We will collect all receipts only after happy path let receipts = null; const explorerResponse = await client.request({ path: `explorer/${params.hash}`, method: "GET" }); const metaStatus = await parseTransactionStatus(explorerResponse.userOps); switch (metaStatus.status) { case "FAILED": { console.log({ metaStatus, explorerResponse, hash: params.hash }); throw new Error(parseErrorMessage(metaStatus.message)); } case "MINED_FAIL": { console.log({ metaStatus, explorerResponse, hash: params.hash }); throw new Error(parseErrorMessage(metaStatus.message)); } case "PENDING": { break; } case "MINING": { break; } case "MINED_SUCCESS": { if (waitForReceipts) { const isSponsoredSupertransaction = explorerResponse.paymentInfo.sponsored; const sponsorshipUrl = explorerResponse.paymentInfo.sponsorshipUrl || DEFAULT_PATHFINDER_URL; receipts = await Promise.all(explorerResponse.userOps .filter((userOp) => { if (userOp.isCleanUpUserOp && userOp.executionStatus !== "MINED_SUCCESS") { return false; } return true; }) .map(async ({ chainId, executionData }, index) => { // If sponsored tx ? the receipt for sponsored payment userOp needs to be fetched from // sponsorship backend if (isSponsoredSupertransaction && index === 0) { const sponsorshipClient = createHttpClient(sponsorshipUrl); const receipt = await sponsorshipClient.request({ path: `sponsorship/receipt/${chainId}/${executionData}`, method: "GET" }); return formatTransactionReceipt(receipt); } return getTransactionReceiptFromViem(account.deploymentOn(Number(chainId), true).publicClient, { confirmations, ...parameters, hash: executionData }); })); } break; } default: { throw new Error("Unknown transaction status"); } } const explorerLinks = explorerResponse.userOps.reduce((acc, userOp) => { acc.push(getExplorerTxLink(userOp.executionData, userOp.chainId), getJiffyScanLink(userOp.userOpHash)); return acc; }, [getMeeScanLink(params.hash)]); return { ...explorerResponse, explorerLinks, receipts, transactionStatus: metaStatus.status }; } export default getSupertransactionReceipt; //# sourceMappingURL=getSupertransactionReceipt.js.map