From 0a6d317fdca446f5d479737ba06668c991280af4 Mon Sep 17 00:00:00 2001 From: Alice <111580170+Alicepoltora@users.noreply.github.com> Date: Mon, 20 Jul 2026 20:34:04 +0700 Subject: [PATCH] fix(eip-1193): make transaction receipt lookup non-blocking --- .../providers/eip-1193/EIP1193.Mock.ts | 18 ++++++++- .../providers/eip-1193/provider.test.ts | 37 +++++++++++++++---- .../src/providers/eip-1193/provider.ts | 5 ++- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/packages/w3s-web-core-sdk/src/__mocks__/providers/eip-1193/EIP1193.Mock.ts b/packages/w3s-web-core-sdk/src/__mocks__/providers/eip-1193/EIP1193.Mock.ts index 0e5f15d..cac79e9 100644 --- a/packages/w3s-web-core-sdk/src/__mocks__/providers/eip-1193/EIP1193.Mock.ts +++ b/packages/w3s-web-core-sdk/src/__mocks__/providers/eip-1193/EIP1193.Mock.ts @@ -93,13 +93,29 @@ export const MockSendTransactionResponse = { */ export const GetTransactionReceiptParams = ['0xdeadbeef'] +/** + * Mocks for EIP-1193 rpc responses - eth_getTransactionReceipt. + */ +export const MockTransactionReceipt = { + transactionHash: GetTransactionReceiptParams[0], +} + /** * Mocks for EIP-1193 rpc responses - eth_getTransactionReceipt. */ export const MockGetTransactionReceiptResponse = { id: undefined, jsonrpc: undefined, - result: { receipt: { transactionHash: GetTransactionReceiptParams[0] } }, + result: MockTransactionReceipt, +} + +/** + * Mocks for EIP-1193 rpc responses - eth_getTransactionReceipt. + */ +export const MockPendingTransactionReceiptResponse = { + id: undefined, + jsonrpc: undefined, + result: null, } /** diff --git a/packages/w3s-web-core-sdk/src/__tests__/providers/eip-1193/provider.test.ts b/packages/w3s-web-core-sdk/src/__tests__/providers/eip-1193/provider.test.ts index cf7679f..9e17ccb 100644 --- a/packages/w3s-web-core-sdk/src/__tests__/providers/eip-1193/provider.test.ts +++ b/packages/w3s-web-core-sdk/src/__tests__/providers/eip-1193/provider.test.ts @@ -33,8 +33,10 @@ import { EthAccountsResponse, GetTransactionReceiptParams, MockGetTransactionReceiptResponse, + MockPendingTransactionReceiptResponse, MockSendTransactionResponse, MockSendUserOperationResponse, + MockTransactionReceipt, MockWaitForUserOperationReceiptResponse, PersonalSignParams, PersonalSignResponse, @@ -351,23 +353,44 @@ describe('Providers > eip-1193 > EIP1193Provider > rpc methods', () => { params: GetTransactionReceiptParams, } - // Spy on `waitForTransactionReceipt` - const waitForGetTransactionReceiptSpy = jest - .spyOn(publicClient, 'waitForTransactionReceipt') - .mockResolvedValue(MockWaitForUserOperationReceiptResponse as never) + const requestSpy = jest + .spyOn(publicClient, 'request') + .mockResolvedValue(MockTransactionReceipt) const response = await provider.request< string, typeof MockGetTransactionReceiptResponse >(mockPayload) - expect(waitForGetTransactionReceiptSpy).toHaveBeenCalledWith({ - hash: GetTransactionReceiptParams[0], + expect(requestSpy).toHaveBeenCalledWith({ + method: 'eth_getTransactionReceipt', + params: GetTransactionReceiptParams, }) expect(response).toEqual(MockGetTransactionReceiptResponse) - waitForGetTransactionReceiptSpy.mockRestore() + requestSpy.mockRestore() + }) + + it('should return null for a pending eth_getTransactionReceipt', async () => { + const mockPayload = { + method: 'eth_getTransactionReceipt', + params: GetTransactionReceiptParams, + } + + const requestSpy = jest + .spyOn(publicClient, 'request') + .mockResolvedValue(null) + + const response = await provider.request< + string, + typeof MockPendingTransactionReceiptResponse + >(mockPayload) + + expect(requestSpy).toHaveBeenCalledTimes(1) + expect(response).toEqual(MockPendingTransactionReceiptResponse) + + requestSpy.mockRestore() }) it('should throw an error when the addresses are different for eth_signTypedData_v4', async () => { diff --git a/packages/w3s-web-core-sdk/src/providers/eip-1193/provider.ts b/packages/w3s-web-core-sdk/src/providers/eip-1193/provider.ts index d627742..74c0db6 100644 --- a/packages/w3s-web-core-sdk/src/providers/eip-1193/provider.ts +++ b/packages/w3s-web-core-sdk/src/providers/eip-1193/provider.ts @@ -107,8 +107,9 @@ export default class EIP1193Provider< case 'eth_getTransactionReceipt': { const [hash] = params as [Hex] - const receipt = await this.publicClient.waitForTransactionReceipt({ - hash, + const receipt = await this.publicClient.request({ + method: 'eth_getTransactionReceipt', + params: [hash], }) return this.getResponse(receipt, payload)