From 59f6038bbc23f8f8065be4756c05d5061e978e16 Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Tue, 30 Apr 2024 13:23:25 -0700 Subject: [PATCH 01/12] adding data check for revert util method --- packages/web3-eth/src/rpc_method_wrappers.ts | 1 - packages/web3-eth/src/utils/send_tx_helper.ts | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web3-eth/src/rpc_method_wrappers.ts b/packages/web3-eth/src/rpc_method_wrappers.ts index 20e832be892..7cbf6801519 100644 --- a/packages/web3-eth/src/rpc_method_wrappers.ts +++ b/packages/web3-eth/src/rpc_method_wrappers.ts @@ -581,7 +581,6 @@ export function sendTransaction< transaction, transactionFormatted, }); - await sendTxHelper.checkRevertBeforeSending( transactionFormatted as TransactionCall, ); diff --git a/packages/web3-eth/src/utils/send_tx_helper.ts b/packages/web3-eth/src/utils/send_tx_helper.ts index 2e3385d5d1c..15f579f8eda 100644 --- a/packages/web3-eth/src/utils/send_tx_helper.ts +++ b/packages/web3-eth/src/utils/send_tx_helper.ts @@ -121,7 +121,8 @@ export class SendTxHelper< } public async checkRevertBeforeSending(tx: TransactionCall) { - if (this.options.checkRevertBeforeSending !== false) { + // should not check revert reason if data is not provided + if (this.options.checkRevertBeforeSending !== false && !isNullish(tx.data)) { const reason = await getRevertReason(this.web3Context, tx, this.options.contractAbi); if (reason !== undefined) { throw await getTransactionError( From b08ba9e4342962f194d0469de96688ea3afd7d35 Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Tue, 30 Apr 2024 16:43:34 -0700 Subject: [PATCH 02/12] fix up tests --- .../web3_eth/send_transaction.test.ts | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts index 9018381bd6a..8dde31bf8ea 100644 --- a/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts +++ b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts @@ -539,7 +539,7 @@ describe('Web3Eth.sendTransaction', () => { .contractAddress as Address; }); - it('Should throw TransactionRevertInstructionError because gas too low', async () => { + it.only('Should throw TransactionRevertInstructionError because gas too low', async () => { const transaction: Transaction = { from: tempAcc.address, to: '0x0000000000000000000000000000000000000000', @@ -548,27 +548,30 @@ describe('Web3Eth.sendTransaction', () => { }; const expectedThrownError = { - name: 'TransactionRevertInstructionError', - code: 402, - reason: + cause: { + code: -32000, + message: getSystemTestBackend() === BACKEND.GETH - ? 'err: intrinsic gas too low: have 1, want 21000 (supplied gas 1)' - : 'base fee exceeds gas limit', + ? 'intrinsic gas too low: gas 1, minimum needed 21000' + : 'Transaction requires at least 21000 gas but got 1', + }, + name: 'InvalidResponseError', }; if (getSystemTestBackend() !== BACKEND.HARDHAT) { await expect( web3Eth .sendTransaction(transaction) - .on('error', error => expect(error).toMatchObject(expectedThrownError)), + .on('error', error => { + expect(error).toMatchObject(expectedThrownError)}), ).rejects.toMatchObject(expectedThrownError); } else { try { await web3Eth.sendTransaction(transaction); } catch (error) { - expect((error as any).name).toEqual(expectedThrownError.name); - expect((error as any).code).toEqual(expectedThrownError.code); - expect((error as any).reason).toContain(expectedThrownError.reason); + expect((error as any).cause.message).toEqual(expectedThrownError.cause.message); + expect((error as any).cause.code).toEqual(expectedThrownError.cause.code); + expect((error as any).name).toContain(expectedThrownError.name); } } }); From 5efced43f874de63af9591b1f6bdb305bda86045 Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Tue, 30 Apr 2024 16:47:37 -0700 Subject: [PATCH 03/12] fix lint --- .../web3-eth/test/integration/web3_eth/send_transaction.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts index 8dde31bf8ea..6a129dd408a 100644 --- a/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts +++ b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts @@ -539,7 +539,7 @@ describe('Web3Eth.sendTransaction', () => { .contractAddress as Address; }); - it.only('Should throw TransactionRevertInstructionError because gas too low', async () => { + it('Should throw TransactionRevertInstructionError because gas too low', async () => { const transaction: Transaction = { from: tempAcc.address, to: '0x0000000000000000000000000000000000000000', From 87a164f45731b88a7bc11fa7c384ecbff2d97a4e Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Tue, 7 May 2024 10:16:59 -0400 Subject: [PATCH 04/12] change legacy request --- .../web3-core/src/web3_request_manager.ts | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/packages/web3-core/src/web3_request_manager.ts b/packages/web3-core/src/web3_request_manager.ts index dc12d919fd0..f0b1f388df9 100644 --- a/packages/web3-core/src/web3_request_manager.ts +++ b/packages/web3-core/src/web3_request_manager.ts @@ -267,18 +267,18 @@ export class Web3RequestManager< legacy: true, error: false, }), - ); + ); const result = provider.request( - payload, - // a callback that is expected to be called after getting the response: - (err, response) => { - if (err) { - return rejectWithError(err); - } - - return resolveWithResponse(response); - }, - ); + payload, + // a callback that is expected to be called after getting the response: + (err, response) => { + if (err) { + return rejectWithError(err); + } + + return resolveWithResponse(response); + }, + ); // Some providers, that follow a previous drafted version of EIP1193, has a `request` function // that is not defined as `async`, but it returns a promise. // Such providers would not be picked with if(isEIP1193Provider(provider)) above @@ -287,10 +287,24 @@ export class Web3RequestManager< // So check if the returned result is a Promise, and resolve with it accordingly. // Note: in this case we expect the callback provided above to never be called. if (isPromise(result)) { + // turn this into an async/await, promise doesnt work const responsePromise = result as unknown as Promise< JsonRpcResponse >; - responsePromise.then(resolveWithResponse).catch(rejectWithError); + responsePromise.then( + res => + this._processJsonRpcResponse(payload, res, { + legacy: true, + error: false, + }) as JsonRpcResponseWithResult, + ) + .catch(error => + this._processJsonRpcResponse( + payload, + error as JsonRpcResponse, + { legacy: true, error: true }, + ), + );; } }); } @@ -298,7 +312,7 @@ export class Web3RequestManager< // TODO: This could be deprecated and removed. if (isLegacySendProvider(provider)) { return new Promise>((resolve, reject): void => { - provider.send(payload, (err, response) => { + const res = provider.send(payload, (err, response) => { if (err) { return reject( this._processJsonRpcResponse( @@ -326,6 +340,7 @@ export class Web3RequestManager< }), ); }); + return res; }); } From e810ab366deaf530be296950f98dbffe6a9c3e32 Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Wed, 8 May 2024 19:14:07 -0400 Subject: [PATCH 05/12] revert contract changes, add try catch --- .../web3-core/src/web3_request_manager.ts | 61 ++++++++++--------- packages/web3-eth/src/utils/send_tx_helper.ts | 2 +- .../web3_eth/send_transaction.test.ts | 23 +++---- .../external-providers/hardhat.test.ts | 9 ++- .../integration/external-providers/helper.ts | 30 ++++++++- 5 files changed, 78 insertions(+), 47 deletions(-) diff --git a/packages/web3-core/src/web3_request_manager.ts b/packages/web3-core/src/web3_request_manager.ts index f0b1f388df9..c762d152a25 100644 --- a/packages/web3-core/src/web3_request_manager.ts +++ b/packages/web3-core/src/web3_request_manager.ts @@ -243,14 +243,14 @@ export class Web3RequestManager< payload, error as JsonRpcResponse, { legacy: true, error: true }, - ), + ) ); } // TODO: This could be deprecated and removed. if (isLegacyRequestProvider(provider)) { return new Promise>((resolve, reject) => { - const rejectWithError = (err: unknown) => + const rejectWithError = (err: unknown) =>{ reject( this._processJsonRpcResponse( payload, @@ -259,26 +259,27 @@ export class Web3RequestManager< legacy: true, error: true, }, - ), - ); + )) + } + const resolveWithResponse = (response: JsonRpcResponse) => resolve( this._processJsonRpcResponse(payload, response, { legacy: true, error: false, }), - ); + ); const result = provider.request( - payload, - // a callback that is expected to be called after getting the response: - (err, response) => { - if (err) { - return rejectWithError(err); - } - - return resolveWithResponse(response); - }, - ); + payload, + // a callback that is expected to be called after getting the response: + (err, response) => { + if (err) { + return rejectWithError(err); + } + + return resolveWithResponse(response); + }, + ); // Some providers, that follow a previous drafted version of EIP1193, has a `request` function // that is not defined as `async`, but it returns a promise. // Such providers would not be picked with if(isEIP1193Provider(provider)) above @@ -287,28 +288,28 @@ export class Web3RequestManager< // So check if the returned result is a Promise, and resolve with it accordingly. // Note: in this case we expect the callback provided above to never be called. if (isPromise(result)) { - // turn this into an async/await, promise doesnt work const responsePromise = result as unknown as Promise< JsonRpcResponse >; - responsePromise.then( - res => - this._processJsonRpcResponse(payload, res, { - legacy: true, - error: false, - }) as JsonRpcResponseWithResult, - ) - .catch(error => - this._processJsonRpcResponse( - payload, - error as JsonRpcResponse, - { legacy: true, error: true }, - ), - );; + responsePromise.then(resolveWithResponse).catch(error => { + try { + // Attempt to process the error response + const processedError = this._processJsonRpcResponse( + payload, + error as JsonRpcResponse, + { legacy: true, error: true } + ); + reject(processedError); + } catch (processingError) { + // Catch any errors that occur during the error processing + reject(processingError); + } + }); } }); } + // TODO: This could be deprecated and removed. if (isLegacySendProvider(provider)) { return new Promise>((resolve, reject): void => { diff --git a/packages/web3-eth/src/utils/send_tx_helper.ts b/packages/web3-eth/src/utils/send_tx_helper.ts index 15f579f8eda..412cb3449be 100644 --- a/packages/web3-eth/src/utils/send_tx_helper.ts +++ b/packages/web3-eth/src/utils/send_tx_helper.ts @@ -122,7 +122,7 @@ export class SendTxHelper< public async checkRevertBeforeSending(tx: TransactionCall) { // should not check revert reason if data is not provided - if (this.options.checkRevertBeforeSending !== false && !isNullish(tx.data)) { + if (this.options.checkRevertBeforeSending !== false) { const reason = await getRevertReason(this.web3Context, tx, this.options.contractAbi); if (reason !== undefined) { throw await getTransactionError( diff --git a/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts index 6a129dd408a..9d3ebbf6c71 100644 --- a/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts +++ b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts @@ -548,30 +548,27 @@ describe('Web3Eth.sendTransaction', () => { }; const expectedThrownError = { - cause: { - code: -32000, - message: + name: 'TransactionRevertInstructionError', + code: 402, + reason: getSystemTestBackend() === BACKEND.GETH - ? 'intrinsic gas too low: gas 1, minimum needed 21000' - : 'Transaction requires at least 21000 gas but got 1', - }, - name: 'InvalidResponseError', + ? 'err: intrinsic gas too low: have 1, want 21000 (supplied gas 1)' + : 'base fee exceeds gas limit', }; if (getSystemTestBackend() !== BACKEND.HARDHAT) { await expect( web3Eth .sendTransaction(transaction) - .on('error', error => { - expect(error).toMatchObject(expectedThrownError)}), + .on('error', error => expect(error).toMatchObject(expectedThrownError)), ).rejects.toMatchObject(expectedThrownError); } else { try { await web3Eth.sendTransaction(transaction); } catch (error) { - expect((error as any).cause.message).toEqual(expectedThrownError.cause.message); - expect((error as any).cause.code).toEqual(expectedThrownError.cause.code); - expect((error as any).name).toContain(expectedThrownError.name); + expect((error as any).name).toEqual(expectedThrownError.name); + expect((error as any).code).toEqual(expectedThrownError.code); + expect((error as any).reason).toContain(expectedThrownError.reason); } } }); @@ -723,4 +720,4 @@ describe('Web3Eth.sendTransaction', () => { ).rejects.toMatchObject(expectedThrownError); }); }); -}); +}); \ No newline at end of file diff --git a/packages/web3/test/integration/external-providers/hardhat.test.ts b/packages/web3/test/integration/external-providers/hardhat.test.ts index 989424199fb..6a4fb6ff28b 100644 --- a/packages/web3/test/integration/external-providers/hardhat.test.ts +++ b/packages/web3/test/integration/external-providers/hardhat.test.ts @@ -18,11 +18,16 @@ along with web3.js. If not, see . // eslint-disable-next-line import/no-extraneous-dependencies import hardhat from 'hardhat'; -import { performBasicRpcCalls } from './helper'; +import { performBasicRpcCalls, failErrorCalls} from './helper'; describe('compatibility with `hardhat` provider', () => { it('should initialize Web3, get accounts & block number and send a transaction', async () => { // use the hardhat provider for web3.js - await performBasicRpcCalls(hardhat.network.provider); + await expect(performBasicRpcCalls(hardhat.network.provider)).resolves.not.toThrow(); }); + it('should throw on error calls', async () => { + const result = failErrorCalls(hardhat.network.provider); + await expect(result).rejects.toThrow(); + + }) }); diff --git a/packages/web3/test/integration/external-providers/helper.ts b/packages/web3/test/integration/external-providers/helper.ts index c1f88dd86b0..b4281b3055b 100644 --- a/packages/web3/test/integration/external-providers/helper.ts +++ b/packages/web3/test/integration/external-providers/helper.ts @@ -16,7 +16,9 @@ along with web3.js. If not, see . */ import { SupportedProviders } from 'web3-types'; +import { Contract } from 'web3-eth-contract'; import Web3 from '../../../src/index'; +import { BasicAbi, BasicBytecode } from '../../shared_fixtures/build/Basic'; /** * Performs basic RPC calls (like `eth_accounts`, `eth_blockNumber` and `eth_sendTransaction`) @@ -44,5 +46,31 @@ export async function performBasicRpcCalls(provider: SupportedProviders) { expect(typeof blockNumber1).toBe('bigint'); // After sending a transaction, the blocknumber is supposed to be greater than or equal the block number before sending the transaction - expect(blockNumber1).toBeGreaterThanOrEqual(blockNumber0); + expect(blockNumber1).toBeGreaterThanOrEqual(blockNumber0); } + +export async function failErrorCalls(provider: SupportedProviders) { + let contract: Contract; + const web3 = new Web3(provider); + + contract = new web3.eth.Contract(BasicAbi, undefined, { + provider, + }); + + let deployOptions: Record;; + + // eslint-disable-next-line prefer-const + deployOptions = { + data: BasicBytecode, + arguments: [10, 'string init value'], + }; + const accounts = await web3.eth.getAccounts(); + + const sendOptions = { from: accounts[0], gas: '1000000' }; + + + contract = await contract.deploy(deployOptions).send(sendOptions); + + await contract.methods.reverts().send({ from: accounts[0] }) + +} \ No newline at end of file From f1819bcd7617ee4b07f67850af18a6f51d999ff0 Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Wed, 8 May 2024 19:33:53 -0400 Subject: [PATCH 06/12] fix lint --- packages/web3-core/src/web3_request_manager.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/web3-core/src/web3_request_manager.ts b/packages/web3-core/src/web3_request_manager.ts index c762d152a25..cb74b32f174 100644 --- a/packages/web3-core/src/web3_request_manager.ts +++ b/packages/web3-core/src/web3_request_manager.ts @@ -313,7 +313,7 @@ export class Web3RequestManager< // TODO: This could be deprecated and removed. if (isLegacySendProvider(provider)) { return new Promise>((resolve, reject): void => { - const res = provider.send(payload, (err, response) => { + provider.send(payload, (err, response) => { if (err) { return reject( this._processJsonRpcResponse( @@ -341,7 +341,6 @@ export class Web3RequestManager< }), ); }); - return res; }); } From 024de10b111a5967c434c9c7b59984228318b6b4 Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Wed, 8 May 2024 21:14:59 -0400 Subject: [PATCH 07/12] fix changes --- packages/web3-core/src/web3_request_manager.ts | 1 - packages/web3-eth/src/rpc_method_wrappers.ts | 1 + packages/web3-eth/src/utils/send_tx_helper.ts | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/web3-core/src/web3_request_manager.ts b/packages/web3-core/src/web3_request_manager.ts index 452a87f1f35..3d7d6ccef0f 100644 --- a/packages/web3-core/src/web3_request_manager.ts +++ b/packages/web3-core/src/web3_request_manager.ts @@ -307,7 +307,6 @@ export class Web3RequestManager< }); } - // TODO: This could be deprecated and removed. if (isLegacySendProvider(provider)) { return new Promise>((resolve, reject): void => { diff --git a/packages/web3-eth/src/rpc_method_wrappers.ts b/packages/web3-eth/src/rpc_method_wrappers.ts index 7cbf6801519..238fe162429 100644 --- a/packages/web3-eth/src/rpc_method_wrappers.ts +++ b/packages/web3-eth/src/rpc_method_wrappers.ts @@ -581,6 +581,7 @@ export function sendTransaction< transaction, transactionFormatted, }); + await sendTxHelper.checkRevertBeforeSending( transactionFormatted as TransactionCall, ); diff --git a/packages/web3-eth/src/utils/send_tx_helper.ts b/packages/web3-eth/src/utils/send_tx_helper.ts index 6c464f70d45..282e778e519 100644 --- a/packages/web3-eth/src/utils/send_tx_helper.ts +++ b/packages/web3-eth/src/utils/send_tx_helper.ts @@ -121,7 +121,6 @@ export class SendTxHelper< } public async checkRevertBeforeSending(tx: TransactionCall) { - // should not check revert reason if data is not provided if (this.options.checkRevertBeforeSending !== false) { const reason = await getRevertReason(this.web3Context, tx, this.options.contractAbi); if (reason !== undefined) { From 4a704660ead770b9c823fd5a35a34ca3463b3417 Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Wed, 8 May 2024 22:20:22 -0400 Subject: [PATCH 08/12] update tests --- .../test/unit/web3_request_manager.test.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/packages/web3-core/test/unit/web3_request_manager.test.ts b/packages/web3-core/test/unit/web3_request_manager.test.ts index 375e27a5d1e..87d66787b65 100644 --- a/packages/web3-core/test/unit/web3_request_manager.test.ts +++ b/packages/web3-core/test/unit/web3_request_manager.test.ts @@ -280,6 +280,21 @@ describe('Web3RequestManager', () => { expect(myProvider.request).toHaveBeenCalledTimes(1); expect(await pr).toBe('test'); }); + + it('promise of legacy provider should be error', async () => { + const manager = new Web3RequestManager(undefined, undefined); + const pr = new Promise(resolve => { + resolve('test'); + }); + const myProvider = { + request: jest.fn().mockImplementation(async () => pr), + } as any; + manager.setProvider(myProvider); + await manager.send(request); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(await pr).toBe('test'); + }); + it('Got a "nullish" response from provider', async () => { const manager = new Web3RequestManager(undefined, undefined); const myProvider = { @@ -1134,6 +1149,22 @@ describe('Web3RequestManager', () => { expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); }); + it('should error in isPromise', async () => { + + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation((async () => Promise.reject(errorResponse))), + } as any; + + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).rejects.toEqual(errorResponse); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + it('should pass request to provider and reject if provider returns error', async () => { const manager = new Web3RequestManager(); const myProvider = { From 3ee777ae3a2e10df221ca81b699f5743ca5d4a22 Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Thu, 9 May 2024 07:38:11 -0400 Subject: [PATCH 09/12] lint and feedback --- .../web3-core/src/web3_request_manager.ts | 37 ++++++++++--------- .../test/unit/web3_request_manager.test.ts | 17 +-------- packages/web3-eth/src/rpc_method_wrappers.ts | 2 +- .../integration/external-providers/helper.ts | 12 +++--- 4 files changed, 26 insertions(+), 42 deletions(-) diff --git a/packages/web3-core/src/web3_request_manager.ts b/packages/web3-core/src/web3_request_manager.ts index 3d7d6ccef0f..1cbe9377988 100644 --- a/packages/web3-core/src/web3_request_manager.ts +++ b/packages/web3-core/src/web3_request_manager.ts @@ -210,7 +210,7 @@ export class Web3RequestManager< ) as JsonRpcPayload; if (!isNullish(this.middleware)) { - payload = (await this.middleware.processRequest(payload)); + payload = await this.middleware.processRequest(payload); } if (isWeb3Provider(provider)) { let response; @@ -241,14 +241,14 @@ export class Web3RequestManager< payload, error as JsonRpcResponse, { legacy: true, error: true }, - ) + ), ); } // TODO: This could be deprecated and removed. if (isLegacyRequestProvider(provider)) { return new Promise>((resolve, reject) => { - const rejectWithError = (err: unknown) =>{ + const rejectWithError = (err: unknown) => { reject( this._processJsonRpcResponse( payload, @@ -257,9 +257,10 @@ export class Web3RequestManager< legacy: true, error: true, }, - )) - } - + ), + ); + }; + const resolveWithResponse = (response: JsonRpcResponse) => resolve( this._processJsonRpcResponse(payload, response, { @@ -290,18 +291,18 @@ export class Web3RequestManager< JsonRpcResponse >; responsePromise.then(resolveWithResponse).catch(error => { - try { - // Attempt to process the error response - const processedError = this._processJsonRpcResponse( - payload, - error as JsonRpcResponse, - { legacy: true, error: true } - ); - reject(processedError); - } catch (processingError) { - // Catch any errors that occur during the error processing - reject(processingError); - } + try { + // Attempt to process the error response + const processedError = this._processJsonRpcResponse( + payload, + error as JsonRpcResponse, + { legacy: true, error: true }, + ); + reject(processedError); + } catch (processingError) { + // Catch any errors that occur during the error processing + reject(processingError); + } }); } }); diff --git a/packages/web3-core/test/unit/web3_request_manager.test.ts b/packages/web3-core/test/unit/web3_request_manager.test.ts index 87d66787b65..31da617e779 100644 --- a/packages/web3-core/test/unit/web3_request_manager.test.ts +++ b/packages/web3-core/test/unit/web3_request_manager.test.ts @@ -281,20 +281,6 @@ describe('Web3RequestManager', () => { expect(await pr).toBe('test'); }); - it('promise of legacy provider should be error', async () => { - const manager = new Web3RequestManager(undefined, undefined); - const pr = new Promise(resolve => { - resolve('test'); - }); - const myProvider = { - request: jest.fn().mockImplementation(async () => pr), - } as any; - manager.setProvider(myProvider); - await manager.send(request); - expect(myProvider.request).toHaveBeenCalledTimes(1); - expect(await pr).toBe('test'); - }); - it('Got a "nullish" response from provider', async () => { const manager = new Web3RequestManager(undefined, undefined); const myProvider = { @@ -1150,12 +1136,11 @@ describe('Web3RequestManager', () => { }); it('should error in isPromise', async () => { - const manager = new Web3RequestManager(); const myProvider = { request: jest .fn() - .mockImplementation((async () => Promise.reject(errorResponse))), + .mockImplementation(async () => Promise.reject(errorResponse)), } as any; jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); diff --git a/packages/web3-eth/src/rpc_method_wrappers.ts b/packages/web3-eth/src/rpc_method_wrappers.ts index 238fe162429..20e832be892 100644 --- a/packages/web3-eth/src/rpc_method_wrappers.ts +++ b/packages/web3-eth/src/rpc_method_wrappers.ts @@ -581,7 +581,7 @@ export function sendTransaction< transaction, transactionFormatted, }); - + await sendTxHelper.checkRevertBeforeSending( transactionFormatted as TransactionCall, ); diff --git a/packages/web3/test/integration/external-providers/helper.ts b/packages/web3/test/integration/external-providers/helper.ts index b4281b3055b..d88b1a7c90f 100644 --- a/packages/web3/test/integration/external-providers/helper.ts +++ b/packages/web3/test/integration/external-providers/helper.ts @@ -38,7 +38,7 @@ export async function performBasicRpcCalls(provider: SupportedProviders) { to: accounts[1], from: accounts[0], value: '1', - gas: 21000 + gas: 21000, }); expect(tx.status).toBe(BigInt(1)); @@ -46,7 +46,7 @@ export async function performBasicRpcCalls(provider: SupportedProviders) { expect(typeof blockNumber1).toBe('bigint'); // After sending a transaction, the blocknumber is supposed to be greater than or equal the block number before sending the transaction - expect(blockNumber1).toBeGreaterThanOrEqual(blockNumber0); + expect(blockNumber1).toBeGreaterThanOrEqual(blockNumber0); } export async function failErrorCalls(provider: SupportedProviders) { @@ -57,7 +57,7 @@ export async function failErrorCalls(provider: SupportedProviders) { provider, }); - let deployOptions: Record;; + let deployOptions: Record; // eslint-disable-next-line prefer-const deployOptions = { @@ -68,9 +68,7 @@ export async function failErrorCalls(provider: SupportedProviders) { const sendOptions = { from: accounts[0], gas: '1000000' }; - contract = await contract.deploy(deployOptions).send(sendOptions); - await contract.methods.reverts().send({ from: accounts[0] }) - -} \ No newline at end of file + await contract.methods.reverts().send({ from: accounts[0] }); +} From ab3d5df15b001f204039d87807f0309d1515a666 Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Thu, 9 May 2024 08:00:04 -0400 Subject: [PATCH 10/12] update test --- .../test/unit/web3_request_manager.test.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/web3-core/test/unit/web3_request_manager.test.ts b/packages/web3-core/test/unit/web3_request_manager.test.ts index 31da617e779..321e0d5049d 100644 --- a/packages/web3-core/test/unit/web3_request_manager.test.ts +++ b/packages/web3-core/test/unit/web3_request_manager.test.ts @@ -1150,6 +1150,23 @@ describe('Web3RequestManager', () => { expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); }); + it('should error in isPromise and error in _processJsonRpcResponse', async () => { + const manager = new Web3RequestManager(); + const myProvider = { + request: jest + .fn() + .mockImplementation(async () => Promise.reject(errorResponse)), + } as any; + jest.spyOn(manager as any, '_processJsonRpcResponse').mockImplementation(() => { + throw new Error('Error in promise'); + }); + jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); + + await expect(manager.sendBatch(request)).rejects.toEqual(new Error('Error in promise')); + expect(myProvider.request).toHaveBeenCalledTimes(1); + expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); + }); + it('should pass request to provider and reject if provider returns error', async () => { const manager = new Web3RequestManager(); const myProvider = { From 8cc75448caa0fb70a5ace89e0ad3519fbb6ebf4b Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Thu, 9 May 2024 08:36:56 -0400 Subject: [PATCH 11/12] update test --- packages/web3-core/test/unit/web3_request_manager.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/web3-core/test/unit/web3_request_manager.test.ts b/packages/web3-core/test/unit/web3_request_manager.test.ts index 321e0d5049d..2db8c010fd8 100644 --- a/packages/web3-core/test/unit/web3_request_manager.test.ts +++ b/packages/web3-core/test/unit/web3_request_manager.test.ts @@ -1150,7 +1150,7 @@ describe('Web3RequestManager', () => { expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); }); - it('should error in isPromise and error in _processJsonRpcResponse', async () => { + it('should catch error and process json response in isPromise', async () => { const manager = new Web3RequestManager(); const myProvider = { request: jest @@ -1158,11 +1158,11 @@ describe('Web3RequestManager', () => { .mockImplementation(async () => Promise.reject(errorResponse)), } as any; jest.spyOn(manager as any, '_processJsonRpcResponse').mockImplementation(() => { - throw new Error('Error in promise'); + return errorResponse; }); jest.spyOn(manager, 'provider', 'get').mockReturnValue(myProvider); - await expect(manager.sendBatch(request)).rejects.toEqual(new Error('Error in promise')); + await expect(manager.sendBatch(request)).rejects.toEqual(errorResponse); expect(myProvider.request).toHaveBeenCalledTimes(1); expect(myProvider.request).toHaveBeenCalledWith(payload, expect.any(Function)); }); From fa2461c75190796c9beedb55226af30f53c6abaa Mon Sep 17 00:00:00 2001 From: Alex Luu Date: Thu, 9 May 2024 08:52:54 -0400 Subject: [PATCH 12/12] format --- .../web3_eth/send_transaction.test.ts | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts index 9d3ebbf6c71..9b0eda360dc 100644 --- a/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts +++ b/packages/web3-eth/test/integration/web3_eth/send_transaction.test.ts @@ -90,7 +90,9 @@ describe('Web3Eth.sendTransaction', () => { expect(response.status).toBe(BigInt(1)); expect(response.events).toBeUndefined(); - const minedTransactionData = await web3EthWithWallet.getTransaction(response.transactionHash); + const minedTransactionData = await web3EthWithWallet.getTransaction( + response.transactionHash, + ); expect(minedTransactionData).toMatchObject({ from: tempAcc.address, @@ -119,7 +121,9 @@ describe('Web3Eth.sendTransaction', () => { expect(response.status).toBe(BigInt(1)); expect(response.events).toBeUndefined(); - const minedTransactionData = await web3EthWithWallet.getTransaction(response.transactionHash); + const minedTransactionData = await web3EthWithWallet.getTransaction( + response.transactionHash, + ); expect(minedTransactionData).toMatchObject({ from: tempAcc.address, @@ -152,7 +156,9 @@ describe('Web3Eth.sendTransaction', () => { expect(response.status).toBe(BigInt(1)); expect(response.events).toBeUndefined(); - const minedTransactionData = await web3EthWithWallet.getTransaction(response.transactionHash); + const minedTransactionData = await web3EthWithWallet.getTransaction( + response.transactionHash, + ); expect(minedTransactionData).toMatchObject({ from: tempAcc.address, @@ -534,9 +540,12 @@ describe('Web3Eth.sendTransaction', () => { from: tempAcc.address, data: SimpleRevertDeploymentData, }; - simpleRevertDeployTransaction.gas = await web3Eth.estimateGas(simpleRevertDeployTransaction); - simpleRevertContractAddress = (await web3Eth.sendTransaction(simpleRevertDeployTransaction)) - .contractAddress as Address; + simpleRevertDeployTransaction.gas = await web3Eth.estimateGas( + simpleRevertDeployTransaction, + ); + simpleRevertContractAddress = ( + await web3Eth.sendTransaction(simpleRevertDeployTransaction) + ).contractAddress as Address; }); it('Should throw TransactionRevertInstructionError because gas too low', async () => { @@ -578,7 +587,9 @@ describe('Web3Eth.sendTransaction', () => { const transaction: Transaction = { from: tempAcc.address, to: '0x0000000000000000000000000000000000000000', - value: BigInt('99999999999999999999999999999999999999999999999999999999999999999'), + value: BigInt( + '99999999999999999999999999999999999999999999999999999999999999999', + ), }; const expectedThrownError = { @@ -587,7 +598,9 @@ describe('Web3Eth.sendTransaction', () => { code: 402, reason: getSystemTestBackend() === BACKEND.GETH - ? expect.stringContaining('err: insufficient funds for gas * price + value: address') + ? expect.stringContaining( + 'err: insufficient funds for gas * price + value: address', + ) : 'VM Exception while processing transaction: insufficient balance', }; @@ -720,4 +733,4 @@ describe('Web3Eth.sendTransaction', () => { ).rejects.toMatchObject(expectedThrownError); }); }); -}); \ No newline at end of file +});