diff --git a/package.json b/package.json index aa2f6dc2..83c1d90b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "safe-react", - "version": "2.15.0", + "version": "2.15.1", "description": "Allowing crypto users manage funds in a safer way", "website": "https://github.com/gnosis/safe-react#readme", "bugs": { diff --git a/src/logic/safe/transactions/__tests__/gas.test.ts b/src/logic/safe/transactions/__tests__/gas.test.ts index 589ae4d3..4c698240 100644 Binary files a/src/logic/safe/transactions/__tests__/gas.test.ts and b/src/logic/safe/transactions/__tests__/gas.test.ts differ diff --git a/src/logic/safe/transactions/gas.ts b/src/logic/safe/transactions/gas.ts index d4e9353b..92982f12 100644 --- a/src/logic/safe/transactions/gas.ts +++ b/src/logic/safe/transactions/gas.ts @@ -93,19 +93,40 @@ export const estimateTxGasCosts = async ( } } -// Parses the result of OpenEthereum/Parity and Nethermind error messages and returns the value -export const getNonGETHErrorDataResult = (errorMessage: string): string | undefined => { +// Parses the result from the error message (GETH, OpenEthereum/Parity and Nethermind) and returns the data value +export const getDataFromNodeErrorMessage = (errorMessage: string): string | undefined => { // Extracts JSON object from the error message const [, ...error] = errorMessage.split('\n') try { const errorAsJSON = JSON.parse(error.join('')) + // For new GETH nodes they will return the data as error in the format: + // { + // "originalError": { + // "code": number, + // "data": string, + // "message": "execution reverted: ..." + // } + // } + if (errorAsJSON.originalError && errorAsJSON.originalError.data) { + return errorAsJSON.originalError.data + } + + // OpenEthereum/Parity nodes will return the data as error in the format: + // { + // "error": { + // "code": number, + // "message": string, + // "data": "revert: 0x..." -> this is the result data that should be extracted from the message + // }, + // "id": number + // } if (errorAsJSON?.data) { const [, dataResult] = errorAsJSON.data.split(' ') return dataResult } } catch (error) { - console.error(`Error trying to extract data from openEthereum/Nethermind error message: ${errorMessage}`) + console.error(`Error trying to extract data from node error message: ${errorMessage}`) } } @@ -120,18 +141,16 @@ const getGasEstimationTxResponse = async (txConfig: { try { const result = await web3.eth.call(txConfig) - // GETH Nodes + // GETH Nodes (geth version < v1.9.24) // In case that the gas is not enough we will receive an EMPTY data - // Otherwise we will receive the gas amount as hash data + // Otherwise we will receive the gas amount as hash data -> this is valid for old versions of GETH nodes ( < v1.9.24) if (!sameString(result, EMPTY_DATA)) { return new BigNumber(result.substring(138), 16).toNumber() } } catch (error) { - // OpenEthereum/Parity nodes - // Parity/OpenEthereum nodes always returns the response as an error // So we try to extract the estimation result within the error in case is possible - const estimationData = getNonGETHErrorDataResult(error.message) + const estimationData = getDataFromNodeErrorMessage(error.message) if (!estimationData || sameString(estimationData, EMPTY_DATA)) { throw error @@ -140,8 +159,8 @@ const getGasEstimationTxResponse = async (txConfig: { return new BigNumber(estimationData.substring(138), 16).toNumber() } - // This will fail in case that we receive an EMPTY_DATA on the GETH node gas estimation - // We cannot throw this error above because it will be captured again on the OpenEthereum code bellow + // This will fail in case that we receive an EMPTY_DATA on the GETH node gas estimation (for version < v1.9.24 of geth nodes) + // We cannot throw this error above because it will be captured again on the catch block bellow throw new Error('Error while estimating the gas required for tx') }