@biconomy/abstractjs
Version:
SDK for Biconomy integration with support for account abstraction, smart accounts, ERC-4337.
81 lines • 3.75 kB
JavaScript
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