From 565eddfb923ff1f49a7c240379ad1f3dbbb3ff5f Mon Sep 17 00:00:00 2001 From: ychiao Date: Mon, 3 Apr 2023 17:25:41 -0400 Subject: [PATCH] fix: Eth JSON-RPC api: handle messages with gasFeeCap less than baseFee --- chain/types/message.go | 9 +++++++-- node/impl/full/eth_test.go | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/chain/types/message.go b/chain/types/message.go index 4304ba659..47f8f2083 100644 --- a/chain/types/message.go +++ b/chain/types/message.go @@ -220,12 +220,17 @@ func (m *Message) ValidForBlockInclusion(minGas int64, version network.Version) } // EffectiveGasPremium returns the effective gas premium claimable by the miner -// given the supplied base fee. +// given the supplied base fee. This method is not used anywhere except the Eth API. // // Filecoin clamps the gas premium at GasFeeCap - BaseFee, if lower than the -// specified premium. +// specified premium. Returns 0 if GasFeeCap is less than BaseFee. func (m *Message) EffectiveGasPremium(baseFee abi.TokenAmount) abi.TokenAmount { available := big.Sub(m.GasFeeCap, baseFee) + // It's possible that storage providers may include messages with gasFeeCap less than the baseFee + // In such cases, their reward should be viewed as zero + if available.LessThan(big.NewInt(0)) { + available = big.NewInt(0) + } if big.Cmp(m.GasPremium, available) <= 0 { return m.GasPremium } diff --git a/node/impl/full/eth_test.go b/node/impl/full/eth_test.go index 87c0852fb..63dbb447e 100644 --- a/node/impl/full/eth_test.go +++ b/node/impl/full/eth_test.go @@ -114,7 +114,7 @@ func TestReward(t *testing.T) { {maxFeePerGas: big.NewInt(600), maxPriorityFeePerGas: big.NewInt(500), answer: big.NewInt(500)}, {maxFeePerGas: big.NewInt(600), maxPriorityFeePerGas: big.NewInt(600), answer: big.NewInt(500)}, {maxFeePerGas: big.NewInt(600), maxPriorityFeePerGas: big.NewInt(1000), answer: big.NewInt(500)}, - {maxFeePerGas: big.NewInt(50), maxPriorityFeePerGas: big.NewInt(200), answer: big.NewInt(-50)}, + {maxFeePerGas: big.NewInt(50), maxPriorityFeePerGas: big.NewInt(200), answer: big.NewInt(0)}, } for _, tc := range testcases { msg := &types.Message{GasFeeCap: tc.maxFeePerGas, GasPremium: tc.maxPriorityFeePerGas}