diff --git a/.changeset/clean-steaks-try.md b/.changeset/clean-steaks-try.md new file mode 100644 index 000000000..f0f5220c4 --- /dev/null +++ b/.changeset/clean-steaks-try.md @@ -0,0 +1,5 @@ +--- +"@solana/transaction-confirmation": patch +--- + +Actually fixed a bug where transaction errors discovered during recent transaction confirmation might not be thrown. The fix in #793 was insufficient. 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 0c788d6e1..58c9e6ecf 100644 --- a/packages/transaction-confirmation/src/__tests__/confirmation-strategy-signature-test.ts +++ b/packages/transaction-confirmation/src/__tests__/confirmation-strategy-signature-test.ts @@ -114,7 +114,7 @@ describe('createSignatureConfirmationPromiseFactory', () => { 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' }], + value: [{ err: 'o no', confirmationStatus: 'finalized' }], }); const signatureConfirmationPromise = getSignatureConfirmationPromise({ abortSignal: new AbortController().signal, diff --git a/packages/transaction-confirmation/src/confirmation-strategy-recent-signature.ts b/packages/transaction-confirmation/src/confirmation-strategy-recent-signature.ts index edbbfd6f8..4735cfe19 100644 --- a/packages/transaction-confirmation/src/confirmation-strategy-recent-signature.ts +++ b/packages/transaction-confirmation/src/confirmation-strategy-recent-signature.ts @@ -109,14 +109,16 @@ export function createRecentSignatureConfirmationPromiseFactory< .getSignatureStatuses([signature]) .send({ abortSignal: abortController.signal }); const signatureStatus = signatureStatusResults[0]; - if ( + if (signatureStatus?.err) { + throw getSolanaErrorFromTransactionError(signatureStatus.err); + } + else if ( signatureStatus?.confirmationStatus && commitmentComparator(signatureStatus.confirmationStatus, commitment) >= 0 ) { return; - } else if (signatureStatus?.err) { - throw getSolanaErrorFromTransactionError(signatureStatus.err); - } else { + } + else { await new Promise(() => { /* never resolve */ });