From c59cdf12174357fc95f4f102ef4327f0f9d37a64 Mon Sep 17 00:00:00 2001 From: Pierre Seznec Date: Tue, 28 May 2024 14:29:22 +0200 Subject: [PATCH] add min gas call check --- packages/massa-web3/src/web3/BaseClient.ts | 14 ++++++++------ .../massa-web3/src/web3/SmartContractsClient.ts | 4 ++++ packages/massa-web3/test/web3/mockData.ts | 2 +- .../test/web3/smartContractsClient.spec.ts | 2 +- packages/web3-utils/src/constants.ts | 1 + 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/massa-web3/src/web3/BaseClient.ts b/packages/massa-web3/src/web3/BaseClient.ts index b1c416a4..187f535b 100755 --- a/packages/massa-web3/src/web3/BaseClient.ts +++ b/packages/massa-web3/src/web3/BaseClient.ts @@ -187,7 +187,7 @@ export class BaseClient { params: params, id: 0, } - let body; + let body try { body = JSON.stringify(bodyData) } catch (ex) { @@ -206,11 +206,13 @@ export class BaseClient { const responseData: JsonRpcResponseData = await resp.json() - return { - isError: !!responseData.error, - result: responseData.error ? null : responseData.result as T, - error: responseData.error ? new Error(responseData.error.message) : null, - } as JsonRpcResponseData; + return { + isError: !!responseData.error, + result: responseData.error ? null : (responseData.result as T), + error: responseData.error + ? new Error(responseData.error.message) + : null, + } as JsonRpcResponseData } catch (ex) { return { isError: true, diff --git a/packages/massa-web3/src/web3/SmartContractsClient.ts b/packages/massa-web3/src/web3/SmartContractsClient.ts index 09ea8b15..93ad8582 100644 --- a/packages/massa-web3/src/web3/SmartContractsClient.ts +++ b/packages/massa-web3/src/web3/SmartContractsClient.ts @@ -33,6 +33,7 @@ import { MAX_GAS_CALL, toMAS, MASSA_SCALING_FACTOR, + MIN_GAS_CALL, } from '@massalabs/web3-utils' import { wait } from '../utils/time' import { @@ -162,6 +163,9 @@ export class SmartContractsClient try { const response = await this.readSmartContract(callData) callData.maxGas = BigInt(response.info.gas_cost) + if (callData.maxGas < MIN_GAS_CALL) { + callData.maxGas = MIN_GAS_CALL + } } catch (error) { throw new Error( `Operation failed: Max gas unspecified and auto-estimation failed. Error details: ${error.message}` diff --git a/packages/massa-web3/test/web3/mockData.ts b/packages/massa-web3/test/web3/mockData.ts index 7d7341eb..2c5fd37f 100644 --- a/packages/massa-web3/test/web3/mockData.ts +++ b/packages/massa-web3/test/web3/mockData.ts @@ -647,7 +647,7 @@ export const mockContractReadOperationData: Array = }, }, ], - gas_cost: 1000000, + gas_cost: 12345678, }, ] diff --git a/packages/massa-web3/test/web3/smartContractsClient.spec.ts b/packages/massa-web3/test/web3/smartContractsClient.spec.ts index b76c4ed6..37949ac6 100644 --- a/packages/massa-web3/test/web3/smartContractsClient.spec.ts +++ b/packages/massa-web3/test/web3/smartContractsClient.spec.ts @@ -272,7 +272,7 @@ describe('SmartContractsClient', () => { expect(spy).toHaveBeenCalledWith( expect.objectContaining({ ...mockCallDataWithoutMaxGas, - maxGas: BigInt(1_000_000), + maxGas: BigInt(mockContractReadOperationData[0].gas_cost), }) ) spy.mockRestore() diff --git a/packages/web3-utils/src/constants.ts b/packages/web3-utils/src/constants.ts index 3d7a2ce4..3fec4f6b 100644 --- a/packages/web3-utils/src/constants.ts +++ b/packages/web3-utils/src/constants.ts @@ -23,6 +23,7 @@ export const BASE_ACCOUNT_CREATION_COST = fromMAS(0.001) export const MAX_GAS_EXECUTE_SC = 3_980_167_295n export const MAX_GAS_DEPLOYMENT = MAX_GAS_EXECUTE_SC export const MAX_GAS_CALL = 4_294_167_295n +export const MIN_GAS_CALL = 2100000n /* -------------------------------------------------------------------------- */ /* NETWORK */