@biconomy/abstractjs
Version:
SDK for Biconomy integration with support for account abstraction, smart accounts, ERC-4337.
88 lines • 3.61 kB
JavaScript
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";
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 userOpsWithoutPayment = explorerResponse.userOps.slice(1);
const transactionStatus = await parseTransactionStatus(userOpsWithoutPayment, parameters.mode);
switch (transactionStatus.status) {
case "FAILED": {
const errorMessage = parseErrorMessage(transactionStatus.message);
if (client.info.isDebugMode) {
console.error({
transactionStatus,
hash: params.hash,
errorMessage,
explorerResponse
});
}
throw new Error(errorMessage);
}
case "MINED_FAIL": {
const errorMessage = parseErrorMessage(transactionStatus.message);
if (client.info.isDebugMode) {
console.error({
transactionStatus,
hash: params.hash,
errorMessage,
explorerResponse
});
}
throw new Error(errorMessage);
}
case "PENDING": {
break;
}
case "MINING": {
break;
}
case "MINED_SUCCESS": {
if (waitForReceipts) {
receipts = await Promise.all(userOpsWithoutPayment
.filter((userOp) => {
// Cleanup userOps are ignored for transaction receipt if it is not successful
if (userOp.isCleanUpUserOp &&
userOp.executionStatus !== "MINED_SUCCESS") {
return false;
}
// Only the main userOps will be considered
return true;
})
.map(async ({ chainId, executionData }) => {
return getTransactionReceiptFromViem(account.deploymentOn(Number(chainId), true).publicClient, {
confirmations,
...parameters,
hash: executionData
});
}));
}
break;
}
default: {
throw new Error("Unknown transaction status");
}
}
const explorerLinks = userOpsWithoutPayment.reduce((acc, userOp) => {
acc.push(getExplorerTxLink(userOp.executionData, userOp.chainId), getJiffyScanLink(userOp.userOpHash));
return acc;
}, [getMeeScanLink(params.hash)]);
return {
...explorerResponse,
userOps: userOpsWithoutPayment,
explorerLinks,
receipts,
transactionStatus: transactionStatus.status,
isFinalised: transactionStatus.isFinalised,
message: transactionStatus.message
};
}
export default getSupertransactionReceipt;
//# sourceMappingURL=getSupertransactionReceipt.js.map