@openocean.finance/widget-sdk
Version:
OpenOcean Any-to-Any Cross-Chain-Swap SDK
40 lines • 1.93 kB
JavaScript
import { waitForTransactionReceipt as waitForTransactionReceiptInternal } from 'viem/actions';
import { OpenOceanErrorCode } from '../../errors/constants.js';
import { TransactionError } from '../../errors/errors.js';
import { getPublicClient } from './publicClient.js';
export async function waitForTransactionReceipt({ client, chainId, txHash, onReplaced, }) {
let { transactionReceipt, replacementReason } = await waitForReceipt(client, txHash, onReplaced);
if (!transactionReceipt?.status) {
const publicClient = await getPublicClient(chainId);
const result = await waitForReceipt(publicClient, txHash, onReplaced);
transactionReceipt = result.transactionReceipt;
replacementReason = result.replacementReason;
}
if (transactionReceipt?.status === 'reverted') {
throw new TransactionError(OpenOceanErrorCode.TransactionFailed, 'Transaction was reverted.');
}
// We should only allow repriced transaction to continue the execution.
// Cancelled and replaced transactions should be treated as failed.
if (replacementReason === 'cancelled' || replacementReason === 'replaced') {
throw new TransactionError(OpenOceanErrorCode.TransactionCanceled, 'Transaction was canceled or replaced.');
}
return transactionReceipt;
}
async function waitForReceipt(client, txHash, onReplaced) {
let replacementReason;
let transactionReceipt;
try {
transactionReceipt = await waitForTransactionReceiptInternal(client, {
hash: txHash,
onReplaced: (response) => {
replacementReason = response.reason;
onReplaced?.(response);
},
});
}
catch {
// We can ignore errors from waitForTransactionReceipt as we have a status check fallback
}
return { transactionReceipt, replacementReason };
}
//# sourceMappingURL=waitForTransactionReceipt.js.map