Merge pull request #1640 from gnosis/hotfix/v2.15.1

Hotfix v2.15.1
This commit is contained in:
Daniel Sanchez 2020-11-23 11:24:33 +01:00 committed by GitHub
commit 81a9baf9b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 11 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "safe-react", "name": "safe-react",
"version": "2.15.0", "version": "2.15.1",
"description": "Allowing crypto users manage funds in a safer way", "description": "Allowing crypto users manage funds in a safer way",
"website": "https://github.com/gnosis/safe-react#readme", "website": "https://github.com/gnosis/safe-react#readme",
"bugs": { "bugs": {

View File

@ -93,19 +93,40 @@ export const estimateTxGasCosts = async (
} }
} }
// Parses the result of OpenEthereum/Parity and Nethermind error messages and returns the value // Parses the result from the error message (GETH, OpenEthereum/Parity and Nethermind) and returns the data value
export const getNonGETHErrorDataResult = (errorMessage: string): string | undefined => { export const getDataFromNodeErrorMessage = (errorMessage: string): string | undefined => {
// Extracts JSON object from the error message // Extracts JSON object from the error message
const [, ...error] = errorMessage.split('\n') const [, ...error] = errorMessage.split('\n')
try { try {
const errorAsJSON = JSON.parse(error.join('')) 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) { if (errorAsJSON?.data) {
const [, dataResult] = errorAsJSON.data.split(' ') const [, dataResult] = errorAsJSON.data.split(' ')
return dataResult return dataResult
} }
} catch (error) { } 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 { try {
const result = await web3.eth.call(txConfig) 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 // 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)) { if (!sameString(result, EMPTY_DATA)) {
return new BigNumber(result.substring(138), 16).toNumber() return new BigNumber(result.substring(138), 16).toNumber()
} }
} catch (error) { } 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 // 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)) { if (!estimationData || sameString(estimationData, EMPTY_DATA)) {
throw error throw error
@ -140,8 +159,8 @@ const getGasEstimationTxResponse = async (txConfig: {
return new BigNumber(estimationData.substring(138), 16).toNumber() 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 // 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 OpenEthereum code bellow // 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') throw new Error('Error while estimating the gas required for tx')
} }