From 5af0d79e6d8db07b96c0c57a8a39e711cedb5f54 Mon Sep 17 00:00:00 2001 From: Steven Luscher Date: Thu, 28 Aug 2025 22:39:39 +0000 Subject: [PATCH] The recent transaction confirmation strategy now throws transaction errors from the one-shot test --- .changeset/rotten-weeks-enjoy.md | 5 +++++ .../confirmation-strategy-signature-test.ts | 14 ++++++++++++++ .../src/confirmation-strategy-recent-signature.ts | 5 +++-- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 .changeset/rotten-weeks-enjoy.md diff --git a/.changeset/rotten-weeks-enjoy.md b/.changeset/rotten-weeks-enjoy.md new file mode 100644 index 000000000..cccdd2f7b --- /dev/null +++ b/.changeset/rotten-weeks-enjoy.md @@ -0,0 +1,5 @@ +--- +'@solana/transaction-confirmation': patch +--- + +Fixed a bug where transaction errors discovered during recent transaction confirmation might not be thrown diff --git a/packages/transaction-confirmation/src/__tests__/confirmation-strategy-signature-test.ts b/packages/transaction-confirmation/src/__tests__/confirmation-strategy-signature-test.ts index 25bf7d334..0c788d6e1 100644 --- a/packages/transaction-confirmation/src/__tests__/confirmation-strategy-signature-test.ts +++ b/packages/transaction-confirmation/src/__tests__/confirmation-strategy-signature-test.ts @@ -111,6 +111,20 @@ describe('createSignatureConfirmationPromiseFactory', () => { }); await expect(signatureConfirmationPromise).resolves.toBeUndefined(); }); + it('fatals when the signature status returned by the one-shot query is an error', async () => { + expect.assertions(1); + getSignatureStatusesMock.mockResolvedValue({ + value: [{ err: 'o no' }], + }); + const signatureConfirmationPromise = getSignatureConfirmationPromise({ + abortSignal: new AbortController().signal, + commitment: 'finalized', + signature: 'abc' as Signature, + }); + await expect(signatureConfirmationPromise).rejects.toThrow( + new SolanaError(SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN, { errorName: 'o no' }), + ); + }); it('resolves when a signature status notification is returned by the signature subscription', async () => { expect.assertions(1); signatureNotificationGenerator.mockImplementation(async function* () { diff --git a/packages/transaction-confirmation/src/confirmation-strategy-recent-signature.ts b/packages/transaction-confirmation/src/confirmation-strategy-recent-signature.ts index 1ab8c8e6c..edbbfd6f8 100644 --- a/packages/transaction-confirmation/src/confirmation-strategy-recent-signature.ts +++ b/packages/transaction-confirmation/src/confirmation-strategy-recent-signature.ts @@ -110,11 +110,12 @@ export function createRecentSignatureConfirmationPromiseFactory< .send({ abortSignal: abortController.signal }); const signatureStatus = signatureStatusResults[0]; if ( - signatureStatus && - signatureStatus.confirmationStatus && + signatureStatus?.confirmationStatus && commitmentComparator(signatureStatus.confirmationStatus, commitment) >= 0 ) { return; + } else if (signatureStatus?.err) { + throw getSolanaErrorFromTransactionError(signatureStatus.err); } else { await new Promise(() => { /* never resolve */