From d11334d7e0c1d2f26b0194bfbb9bb42edc5e6a59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Ace=C3=B1olaza?= Date: Thu, 20 Jun 2024 16:57:08 -0300 Subject: [PATCH 1/2] Adds an extra to the tx estimate to account for EIP-150 reserved gas --- .changeset/blue-starfishes-help.md | 5 +++++ .../src/evm/fulfillments/api-calls.test.ts | 12 ++++++------ .../airnode-node/src/evm/fulfillments/api-calls.ts | 11 ++++++++--- 3 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 .changeset/blue-starfishes-help.md diff --git a/.changeset/blue-starfishes-help.md b/.changeset/blue-starfishes-help.md new file mode 100644 index 0000000000..36448ae50a --- /dev/null +++ b/.changeset/blue-starfishes-help.md @@ -0,0 +1,5 @@ +--- +"@api3/airnode-node": patch +--- + +Adds extra gas to estimate to account for EIP-150 diff --git a/packages/airnode-node/src/evm/fulfillments/api-calls.test.ts b/packages/airnode-node/src/evm/fulfillments/api-calls.test.ts index 4b05b52765..58a38dbc12 100644 --- a/packages/airnode-node/src/evm/fulfillments/api-calls.test.ts +++ b/packages/airnode-node/src/evm/fulfillments/api-calls.test.ts @@ -656,8 +656,8 @@ describe('submitApiCall', () => { { level: 'INFO', message: `Gas limit is set to ${ - 73804 + 290001 - } (AirnodeRrp: ${73804} + Fulfillment Call: ${290001}) for Request:${apiCall.id}.`, + 73804 + 290001 + 5684 + } (AirnodeRrp: ${73804} + Fulfillment Call: ${290001} + EIP150: ${5684}) for Request:${apiCall.id}.`, }, { level: 'INFO', message: `Submitting API call fulfillment for Request:${apiCall.id}...` }, ]); @@ -686,7 +686,7 @@ describe('submitApiCall', () => { apiCall.fulfillFunctionId, '0x448b8ad3a330cf8f269f487881b59efff721b3dfa8e61f7c8fd2480389459ed3', '0xda6d5aa27f48aa951ba401c8a779645f7d1fa4a46a5e99eb7da04b4e059449a834ca1058c85dfe8117305265228f8cf7ae64c3ef3c4d1cc191f77807227dac461b', - { ...txOpts, gasLimit: ethers.BigNumber.from(73804 + 290001) } + { ...txOpts, gasLimit: ethers.BigNumber.from(73804 + 290001 + 5684) } ); expect(failMock).not.toHaveBeenCalled(); } @@ -735,8 +735,8 @@ describe('submitApiCall', () => { { level: 'INFO', message: `Gas limit is set to ${ - 73804 + 290001 - } (AirnodeRrp: ${73804} + Fulfillment Call: ${290001}) for Request:${apiCall.id}.`, + 73804 + 290001 + 5684 + } (AirnodeRrp: ${73804} + Fulfillment Call: ${290001} + EIP150: ${5684}) for Request:${apiCall.id}.`, }, { level: 'INFO', message: `Submitting API call fulfillment for Request:${apiCall.id}...` }, { @@ -768,7 +768,7 @@ describe('submitApiCall', () => { apiCall.fulfillFunctionId, '0x448b8ad3a330cf8f269f487881b59efff721b3dfa8e61f7c8fd2480389459ed3', '0xda6d5aa27f48aa951ba401c8a779645f7d1fa4a46a5e99eb7da04b4e059449a834ca1058c85dfe8117305265228f8cf7ae64c3ef3c4d1cc191f77807227dac461b', - { ...txOpts, gasLimit: ethers.BigNumber.from(73804 + 290001) } + { ...txOpts, gasLimit: ethers.BigNumber.from(73804 + 290001 + 5684) } ); expect(failMock).not.toHaveBeenCalled(); } diff --git a/packages/airnode-node/src/evm/fulfillments/api-calls.ts b/packages/airnode-node/src/evm/fulfillments/api-calls.ts index 1fbe3dc617..02f145edd3 100644 --- a/packages/airnode-node/src/evm/fulfillments/api-calls.ts +++ b/packages/airnode-node/src/evm/fulfillments/api-calls.ts @@ -316,15 +316,20 @@ export async function estimateGasAndSubmitFulfill( } const [airnodeRrpGasCost, fulfillmentCallGasCost] = estimateGasData; - const totalCost = airnodeRrpGasCost.add(fulfillmentCallGasCost); + const subTotalCost = airnodeRrpGasCost.add(fulfillmentCallGasCost); + // https://github.com/ethereum/EIPs/issues/114 + // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-150.md + const eip150GasReserve = subTotalCost.div(64); + const totalGasCost = subTotalCost.add(eip150GasReserve); + // If gas estimation is success, submit fulfillment without making static test call const gasLimitNoticeLog = logger.pend( 'INFO', - `Gas limit is set to ${totalCost} (AirnodeRrp: ${airnodeRrpGasCost} + Fulfillment Call: ${fulfillmentCallGasCost}) for Request:${request.id}.` + `Gas limit is set to ${totalGasCost} (AirnodeRrp: ${airnodeRrpGasCost} + Fulfillment Call: ${fulfillmentCallGasCost} + EIP150: ${eip150GasReserve}) for Request:${request.id}.` ); const [submitLogs, submitErr, submitData] = await submitFulfill(airnodeRrp, request, { ...options, - gasTarget: { ...options.gasTarget, gasLimit: totalCost }, + gasTarget: { ...options.gasTarget, gasLimit: totalGasCost }, }); return [[...estimateGasLogs, gasLimitNoticeLog, ...submitLogs], submitErr, submitData]; } From 36d4325c7b45f5bf9a149b7bc68a626ee8ecf573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20Ace=C3=B1olaza?= Date: Mon, 24 Jun 2024 14:25:13 -0300 Subject: [PATCH 2/2] Fixes EIP-150 1/64 estimation math --- .../src/evm/fulfillments/api-calls.test.ts | 12 ++++++------ .../airnode-node/src/evm/fulfillments/api-calls.ts | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/airnode-node/src/evm/fulfillments/api-calls.test.ts b/packages/airnode-node/src/evm/fulfillments/api-calls.test.ts index 58a38dbc12..36734b9aa8 100644 --- a/packages/airnode-node/src/evm/fulfillments/api-calls.test.ts +++ b/packages/airnode-node/src/evm/fulfillments/api-calls.test.ts @@ -656,8 +656,8 @@ describe('submitApiCall', () => { { level: 'INFO', message: `Gas limit is set to ${ - 73804 + 290001 + 5684 - } (AirnodeRrp: ${73804} + Fulfillment Call: ${290001} + EIP150: ${5684}) for Request:${apiCall.id}.`, + 73804 + 290001 + 5774 + } (AirnodeRrp: ${73804} + Fulfillment Call: ${290001} + EIP150: ${5774}) for Request:${apiCall.id}.`, }, { level: 'INFO', message: `Submitting API call fulfillment for Request:${apiCall.id}...` }, ]); @@ -686,7 +686,7 @@ describe('submitApiCall', () => { apiCall.fulfillFunctionId, '0x448b8ad3a330cf8f269f487881b59efff721b3dfa8e61f7c8fd2480389459ed3', '0xda6d5aa27f48aa951ba401c8a779645f7d1fa4a46a5e99eb7da04b4e059449a834ca1058c85dfe8117305265228f8cf7ae64c3ef3c4d1cc191f77807227dac461b', - { ...txOpts, gasLimit: ethers.BigNumber.from(73804 + 290001 + 5684) } + { ...txOpts, gasLimit: ethers.BigNumber.from(73804 + 290001 + 5774) } ); expect(failMock).not.toHaveBeenCalled(); } @@ -735,8 +735,8 @@ describe('submitApiCall', () => { { level: 'INFO', message: `Gas limit is set to ${ - 73804 + 290001 + 5684 - } (AirnodeRrp: ${73804} + Fulfillment Call: ${290001} + EIP150: ${5684}) for Request:${apiCall.id}.`, + 73804 + 290001 + 5774 + } (AirnodeRrp: ${73804} + Fulfillment Call: ${290001} + EIP150: ${5774}) for Request:${apiCall.id}.`, }, { level: 'INFO', message: `Submitting API call fulfillment for Request:${apiCall.id}...` }, { @@ -768,7 +768,7 @@ describe('submitApiCall', () => { apiCall.fulfillFunctionId, '0x448b8ad3a330cf8f269f487881b59efff721b3dfa8e61f7c8fd2480389459ed3', '0xda6d5aa27f48aa951ba401c8a779645f7d1fa4a46a5e99eb7da04b4e059449a834ca1058c85dfe8117305265228f8cf7ae64c3ef3c4d1cc191f77807227dac461b', - { ...txOpts, gasLimit: ethers.BigNumber.from(73804 + 290001 + 5684) } + { ...txOpts, gasLimit: ethers.BigNumber.from(73804 + 290001 + 5774) } ); expect(failMock).not.toHaveBeenCalled(); } diff --git a/packages/airnode-node/src/evm/fulfillments/api-calls.ts b/packages/airnode-node/src/evm/fulfillments/api-calls.ts index 02f145edd3..a528f67e36 100644 --- a/packages/airnode-node/src/evm/fulfillments/api-calls.ts +++ b/packages/airnode-node/src/evm/fulfillments/api-calls.ts @@ -319,7 +319,7 @@ export async function estimateGasAndSubmitFulfill( const subTotalCost = airnodeRrpGasCost.add(fulfillmentCallGasCost); // https://github.com/ethereum/EIPs/issues/114 // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-150.md - const eip150GasReserve = subTotalCost.div(64); + const eip150GasReserve = subTotalCost.div(63); const totalGasCost = subTotalCost.add(eip150GasReserve); // If gas estimation is success, submit fulfillment without making static test call