Skip to content
This repository was archived by the owner on Nov 10, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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": {
Expand Down
Binary file modified src/logic/safe/transactions/__tests__/gas.test.ts
Binary file not shown.
39 changes: 29 additions & 10 deletions src/logic/safe/transactions/gas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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}`)
}
}

Expand All @@ -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
Expand All @@ -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')
}

Expand Down