From 10b05e927715fb2b6d48276c2ae851675e8f405b Mon Sep 17 00:00:00 2001 From: rajgoesout Date: Fri, 16 Jan 2026 20:15:13 +0530 Subject: [PATCH 1/2] fix(react): return empty array for empty sign batches Fixes https://github.com/anza-xyz/kit/issues/1182 --- .../__tests__/useSignAndSendTransaction-test.ts | 15 +++++++++++++++ .../src/__tests__/useSignTransaction-test.ts | 15 +++++++++++++++ packages/react/src/useSignAndSendTransaction.ts | 3 +++ packages/react/src/useSignTransaction.ts | 3 +++ 4 files changed, 36 insertions(+) diff --git a/packages/react/src/__tests__/useSignAndSendTransaction-test.ts b/packages/react/src/__tests__/useSignAndSendTransaction-test.ts index 2c9608484..9f5e37fe9 100644 --- a/packages/react/src/__tests__/useSignAndSendTransaction-test.ts +++ b/packages/react/src/__tests__/useSignAndSendTransaction-test.ts @@ -129,6 +129,21 @@ describe('useSignAndSendTransaction', () => { }); }); describe('useSignAndSendTransactions', () => { + it('returns empty output without calling the wallet implementation when given no inputs', async () => { + expect.assertions(2); + const { result } = renderHook(() => useSignAndSendTransactions(mockUiWalletAccount, 'solana:danknet')); + // eslint-disable-next-line jest/no-conditional-in-test + if (result.__type === 'error' || !result.current) { + throw result.current; + } else { + const signAndSendTransactions = result.current; + const results = await signAndSendTransactions(); + // eslint-disable-next-line jest/no-conditional-expect + expect(results).toEqual([]); + // eslint-disable-next-line jest/no-conditional-expect + expect(mockSignAndSendTransaction).not.toHaveBeenCalled(); + } + }); it("passes through multiple inputs to the wallet's `signAndSendTransaction` implementation", async () => { expect.assertions(3); mockSignAndSendTransaction.mockResolvedValueOnce([{ signature: 'abc' }, { signature: 'def' }]); diff --git a/packages/react/src/__tests__/useSignTransaction-test.ts b/packages/react/src/__tests__/useSignTransaction-test.ts index 54cceac50..99d04cac5 100644 --- a/packages/react/src/__tests__/useSignTransaction-test.ts +++ b/packages/react/src/__tests__/useSignTransaction-test.ts @@ -132,6 +132,21 @@ describe('useSignTransaction', () => { }); }); describe('useSignTransactions', () => { + it('returns empty output without calling the wallet implementation when given no inputs', async () => { + expect.assertions(2); + const { result } = renderHook(() => useSignTransactions(mockUiWalletAccount, 'solana:danknet')); + // eslint-disable-next-line jest/no-conditional-in-test + if (result.__type === 'error' || !result.current) { + throw result.current; + } else { + const signTransactions = result.current; + const results = await signTransactions(); + // eslint-disable-next-line jest/no-conditional-expect + expect(results).toEqual([]); + // eslint-disable-next-line jest/no-conditional-expect + expect(mockSignTransaction).not.toHaveBeenCalled(); + } + }); it("passes through multiple inputs to the wallet's `signTransaction` implementation", async () => { expect.assertions(3); mockSignTransaction.mockResolvedValueOnce([{ signature: 'abc' }, { signature: 'def' }]); diff --git a/packages/react/src/useSignAndSendTransaction.ts b/packages/react/src/useSignAndSendTransaction.ts index dd02da02d..d98cf9736 100644 --- a/packages/react/src/useSignAndSendTransaction.ts +++ b/packages/react/src/useSignAndSendTransaction.ts @@ -142,6 +142,9 @@ export function useSignAndSendTransactions { + if (inputs.length === 0) { + return []; + } const inputsWithChainAndAccount = inputs.map(({ options, ...rest }) => { const minContextSlot = options?.minContextSlot; return { diff --git a/packages/react/src/useSignTransaction.ts b/packages/react/src/useSignTransaction.ts index 7c81d5b79..001e71cf5 100644 --- a/packages/react/src/useSignTransaction.ts +++ b/packages/react/src/useSignTransaction.ts @@ -138,6 +138,9 @@ export function useSignTransactions( const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount); return useCallback( async (...inputs) => { + if (inputs.length === 0) { + return []; + } const inputsWithAccountAndChain = inputs.map(({ options, ...rest }) => { const minContextSlot = options?.minContextSlot; return { From 74ded7fffae3b95bd1c33a67a70f40c9b05606f9 Mon Sep 17 00:00:00 2001 From: Callum Date: Mon, 19 Jan 2026 13:15:43 +0000 Subject: [PATCH 2/2] Add changeset --- .changeset/strong-kids-burn.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/strong-kids-burn.md diff --git a/.changeset/strong-kids-burn.md b/.changeset/strong-kids-burn.md new file mode 100644 index 000000000..03a8f1ddd --- /dev/null +++ b/.changeset/strong-kids-burn.md @@ -0,0 +1,5 @@ +--- +'@solana/react': patch +--- + +Return immediately when passing empty array of transactions to `useSignTransactions` and `useSignAndSendTransactions`