From 662ae22a5bd8c5437ef0df9c523db2f4f6fa2709 Mon Sep 17 00:00:00 2001 From: Jeremy Wei Date: Wed, 2 Oct 2024 10:36:05 -0400 Subject: [PATCH 1/3] eip-1559 fixes --- contracts/test/ERC20toCW20PointerTest.js | 2 +- x/evm/keeper/fee.go | 10 +- x/evm/keeper/fee_test.go | 151 ++++++++++++----------- x/evm/types/params.go | 16 +-- 4 files changed, 92 insertions(+), 87 deletions(-) diff --git a/contracts/test/ERC20toCW20PointerTest.js b/contracts/test/ERC20toCW20PointerTest.js index e64e08852..6d59cf770 100644 --- a/contracts/test/ERC20toCW20PointerTest.js +++ b/contracts/test/ERC20toCW20PointerTest.js @@ -86,7 +86,7 @@ describe("ERC20 to CW20 Pointer", function () { }); describe("transfer()", function () { - it.only("should transfer", async function () { + it("should transfer", async function () { let sender = accounts[0]; let recipient = accounts[1]; diff --git a/x/evm/keeper/fee.go b/x/evm/keeper/fee.go index f53631c02..b00e7912a 100644 --- a/x/evm/keeper/fee.go +++ b/x/evm/keeper/fee.go @@ -11,10 +11,18 @@ func (k *Keeper) AdjustDynamicBaseFeePerGas(ctx sdk.Context, blockGasUsed uint64 return nil } currentBaseFee := k.GetDynamicBaseFeePerGas(ctx) + targetGasUsed := sdk.NewDec(int64(k.GetTargetGasUsedPerBlock(ctx))) + if targetGasUsed.IsZero() { + return ¤tBaseFee + } minimumFeePerGas := k.GetParams(ctx).MinimumFeePerGas blockGasLimit := sdk.NewDec(ctx.ConsensusParams().Block.MaxGas) blockGasUsedDec := sdk.NewDec(int64(blockGasUsed)) - targetGasUsed := sdk.NewDec(int64(k.GetTargetGasUsedPerBlock(ctx))) + + // cap block gas used to block gas limit + if blockGasUsedDec.GT(blockGasLimit) { + blockGasUsedDec = blockGasLimit + } var newBaseFee sdk.Dec if blockGasUsedDec.GT(targetGasUsed) { diff --git a/x/evm/keeper/fee_test.go b/x/evm/keeper/fee_test.go index 83f3e2fb0..df1d9d35f 100644 --- a/x/evm/keeper/fee_test.go +++ b/x/evm/keeper/fee_test.go @@ -32,82 +32,93 @@ func TestAdjustBaseFeePerGas(t *testing.T) { targetGasUsed uint64 expectedBaseFee uint64 }{ + // { + // name: "Block gas usage exactly half of limit, 0% up, 0% down, no fee change", + // currentBaseFee: 100, + // minimumFee: 10, + // blockGasUsed: 500000, + // blockGasLimit: 1000000, + // upwardAdj: sdk.NewDec(0), + // downwardAdj: sdk.NewDec(0), + // targetGasUsed: 500000, + // expectedBaseFee: 100, + // }, + // { + // name: "Block gas usage 50%, 50% up, 50% down, no fee change", + // currentBaseFee: 100, + // minimumFee: 10, + // blockGasUsed: 500000, + // blockGasLimit: 1000000, + // upwardAdj: sdk.NewDecWithPrec(5, 1), + // downwardAdj: sdk.NewDecWithPrec(5, 1), + // targetGasUsed: 500000, + // expectedBaseFee: 100, + // }, + // { + // name: "Block gas usage 75%, 0% up, 0% down, base fee stays the same", + // currentBaseFee: 10000, + // minimumFee: 10, + // blockGasUsed: 750000, + // blockGasLimit: 1000000, + // upwardAdj: sdk.NewDec(0), + // downwardAdj: sdk.NewDec(0), + // targetGasUsed: 500000, + // expectedBaseFee: 10000, + // }, + // { + // name: "Block gas usage 25%, 0% up, 0% down, base fee stays the same", + // currentBaseFee: 10000, + // minimumFee: 10, + // blockGasUsed: 250000, + // blockGasLimit: 1000000, + // upwardAdj: sdk.NewDec(0), + // downwardAdj: sdk.NewDec(0), + // targetGasUsed: 500000, + // expectedBaseFee: 10000, + // }, + // { + // name: "Block gas usage 75%, 50% up, 0% down, base fee increases by 25%", + // currentBaseFee: 10000, + // minimumFee: 10, + // blockGasUsed: 750000, + // blockGasLimit: 1000000, + // upwardAdj: sdk.NewDecWithPrec(5, 1), + // downwardAdj: sdk.NewDec(0), + // targetGasUsed: 500000, + // expectedBaseFee: 12500, + // }, + // { + // name: "Block gas usage 25%, 0% up, 50% down, base fee decreases by 25%", + // currentBaseFee: 10000, + // minimumFee: 10, + // blockGasUsed: 250000, + // blockGasLimit: 1000000, + // upwardAdj: sdk.NewDec(0), + // downwardAdj: sdk.NewDecWithPrec(5, 1), + // targetGasUsed: 500000, + // expectedBaseFee: 7500, + // }, + // { + // name: "Block gas usage low, new base fee below minimum, set to minimum", + // currentBaseFee: 100, + // minimumFee: 99, + // blockGasUsed: 0, + // blockGasLimit: 1000000, + // upwardAdj: sdk.NewDecWithPrec(5, 2), + // downwardAdj: sdk.NewDecWithPrec(5, 2), + // targetGasUsed: 500000, + // expectedBaseFee: 99, // Should not go below the minimum fee + // }, { - name: "Block gas usage exactly half of limit, 0% up, 0% down, no fee change", - currentBaseFee: 100, - minimumFee: 10, - blockGasUsed: 500000, - blockGasLimit: 1000000, - upwardAdj: sdk.NewDec(0), - downwardAdj: sdk.NewDec(0), - targetGasUsed: 500000, - expectedBaseFee: 100, - }, - { - name: "Block gas usage 50%, 50% up, 50% down, no fee change", - currentBaseFee: 100, - minimumFee: 10, - blockGasUsed: 500000, - blockGasLimit: 1000000, - upwardAdj: sdk.NewDecWithPrec(5, 1), - downwardAdj: sdk.NewDecWithPrec(5, 1), - targetGasUsed: 500000, - expectedBaseFee: 100, - }, - { - name: "Block gas usage 75%, 0% up, 0% down, base fee stays the same", - currentBaseFee: 10000, - minimumFee: 10, - blockGasUsed: 750000, - blockGasLimit: 1000000, - upwardAdj: sdk.NewDec(0), - downwardAdj: sdk.NewDec(0), - targetGasUsed: 500000, - expectedBaseFee: 10000, - }, - { - name: "Block gas usage 25%, 0% up, 0% down, base fee stays the same", + name: "target gas used is 0", currentBaseFee: 10000, minimumFee: 10, - blockGasUsed: 250000, - blockGasLimit: 1000000, - upwardAdj: sdk.NewDec(0), - downwardAdj: sdk.NewDec(0), - targetGasUsed: 500000, - expectedBaseFee: 10000, - }, - { - name: "Block gas usage 75%, 50% up, 0% down, base fee increases by 25%", - currentBaseFee: 10000, - minimumFee: 10, - blockGasUsed: 750000, + blockGasUsed: 0, blockGasLimit: 1000000, upwardAdj: sdk.NewDecWithPrec(5, 1), - downwardAdj: sdk.NewDec(0), - targetGasUsed: 500000, - expectedBaseFee: 12500, - }, - { - name: "Block gas usage 25%, 0% up, 50% down, base fee decreases by 25%", - currentBaseFee: 10000, - minimumFee: 10, - blockGasUsed: 250000, - blockGasLimit: 1000000, - upwardAdj: sdk.NewDec(0), downwardAdj: sdk.NewDecWithPrec(5, 1), - targetGasUsed: 500000, - expectedBaseFee: 7500, - }, - { - name: "Block gas usage low, new base fee below minimum, set to minimum", - currentBaseFee: 100, - minimumFee: 99, - blockGasUsed: 0, - blockGasLimit: 1000000, - upwardAdj: sdk.NewDecWithPrec(5, 2), - downwardAdj: sdk.NewDecWithPrec(5, 2), - targetGasUsed: 500000, - expectedBaseFee: 99, // Should not go below the minimum fee + targetGasUsed: 0, + expectedBaseFee: 10000, }, } diff --git a/x/evm/types/params.go b/x/evm/types/params.go index b70c2ca92..c6376a000 100644 --- a/x/evm/types/params.go +++ b/x/evm/types/params.go @@ -64,7 +64,7 @@ func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { paramtypes.NewParamSetPair(KeyMinFeePerGas, &p.MinimumFeePerGas, validateMinFeePerGas), paramtypes.NewParamSetPair(KeyWhitelistedCwCodeHashesForDelegateCall, &p.WhitelistedCwCodeHashesForDelegateCall, validateWhitelistedCwHashesForDelegateCall), paramtypes.NewParamSetPair(KeyDeliverTxHookWasmGasLimit, &p.DeliverTxHookWasmGasLimit, validateDeliverTxHookWasmGasLimit), - paramtypes.NewParamSetPair(KeyTargetGasUsedPerBlock, &p.TargetGasUsedPerBlock, validateTargetGasUsedPerBlock), + paramtypes.NewParamSetPair(KeyTargetGasUsedPerBlock, &p.TargetGasUsedPerBlock, func(i interface{}) error { return nil} ), } } @@ -90,23 +90,9 @@ func (p Params) Validate() error { if err := validateBaseFeeAdjustment(p.MaxDynamicBaseFeeDownwardAdjustment); err != nil { return fmt.Errorf("invalid max dynamic base fee downward adjustment: %s, err: %s", p.MaxDynamicBaseFeeDownwardAdjustment, err) } - if err := validateTargetGasUsedPerBlock(p.TargetGasUsedPerBlock); err != nil { - return err - } return validateWhitelistedCwHashesForDelegateCall(p.WhitelistedCwCodeHashesForDelegateCall) } -func validateTargetGasUsedPerBlock(i interface{}) error { - v, ok := i.(uint64) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - if v == 0 { - return fmt.Errorf("invalid target gas used per block: must be greater than 0, got %d", v) - } - return nil -} - func validateBaseFeeAdjustment(i interface{}) error { adjustment, ok := i.(sdk.Dec) if !ok { From e77a85d28eefa8c2870a8f8b12a89a06822c5c44 Mon Sep 17 00:00:00 2001 From: Jeremy Wei Date: Wed, 2 Oct 2024 10:36:56 -0400 Subject: [PATCH 2/3] fix --- x/evm/keeper/fee_test.go | 154 ++++++++++++++++++------------------- x/evm/keeper/msg_server.go | 2 - x/evm/module.go | 1 - 3 files changed, 77 insertions(+), 80 deletions(-) diff --git a/x/evm/keeper/fee_test.go b/x/evm/keeper/fee_test.go index df1d9d35f..0135381c4 100644 --- a/x/evm/keeper/fee_test.go +++ b/x/evm/keeper/fee_test.go @@ -32,83 +32,83 @@ func TestAdjustBaseFeePerGas(t *testing.T) { targetGasUsed uint64 expectedBaseFee uint64 }{ - // { - // name: "Block gas usage exactly half of limit, 0% up, 0% down, no fee change", - // currentBaseFee: 100, - // minimumFee: 10, - // blockGasUsed: 500000, - // blockGasLimit: 1000000, - // upwardAdj: sdk.NewDec(0), - // downwardAdj: sdk.NewDec(0), - // targetGasUsed: 500000, - // expectedBaseFee: 100, - // }, - // { - // name: "Block gas usage 50%, 50% up, 50% down, no fee change", - // currentBaseFee: 100, - // minimumFee: 10, - // blockGasUsed: 500000, - // blockGasLimit: 1000000, - // upwardAdj: sdk.NewDecWithPrec(5, 1), - // downwardAdj: sdk.NewDecWithPrec(5, 1), - // targetGasUsed: 500000, - // expectedBaseFee: 100, - // }, - // { - // name: "Block gas usage 75%, 0% up, 0% down, base fee stays the same", - // currentBaseFee: 10000, - // minimumFee: 10, - // blockGasUsed: 750000, - // blockGasLimit: 1000000, - // upwardAdj: sdk.NewDec(0), - // downwardAdj: sdk.NewDec(0), - // targetGasUsed: 500000, - // expectedBaseFee: 10000, - // }, - // { - // name: "Block gas usage 25%, 0% up, 0% down, base fee stays the same", - // currentBaseFee: 10000, - // minimumFee: 10, - // blockGasUsed: 250000, - // blockGasLimit: 1000000, - // upwardAdj: sdk.NewDec(0), - // downwardAdj: sdk.NewDec(0), - // targetGasUsed: 500000, - // expectedBaseFee: 10000, - // }, - // { - // name: "Block gas usage 75%, 50% up, 0% down, base fee increases by 25%", - // currentBaseFee: 10000, - // minimumFee: 10, - // blockGasUsed: 750000, - // blockGasLimit: 1000000, - // upwardAdj: sdk.NewDecWithPrec(5, 1), - // downwardAdj: sdk.NewDec(0), - // targetGasUsed: 500000, - // expectedBaseFee: 12500, - // }, - // { - // name: "Block gas usage 25%, 0% up, 50% down, base fee decreases by 25%", - // currentBaseFee: 10000, - // minimumFee: 10, - // blockGasUsed: 250000, - // blockGasLimit: 1000000, - // upwardAdj: sdk.NewDec(0), - // downwardAdj: sdk.NewDecWithPrec(5, 1), - // targetGasUsed: 500000, - // expectedBaseFee: 7500, - // }, - // { - // name: "Block gas usage low, new base fee below minimum, set to minimum", - // currentBaseFee: 100, - // minimumFee: 99, - // blockGasUsed: 0, - // blockGasLimit: 1000000, - // upwardAdj: sdk.NewDecWithPrec(5, 2), - // downwardAdj: sdk.NewDecWithPrec(5, 2), - // targetGasUsed: 500000, - // expectedBaseFee: 99, // Should not go below the minimum fee - // }, + { + name: "Block gas usage exactly half of limit, 0% up, 0% down, no fee change", + currentBaseFee: 100, + minimumFee: 10, + blockGasUsed: 500000, + blockGasLimit: 1000000, + upwardAdj: sdk.NewDec(0), + downwardAdj: sdk.NewDec(0), + targetGasUsed: 500000, + expectedBaseFee: 100, + }, + { + name: "Block gas usage 50%, 50% up, 50% down, no fee change", + currentBaseFee: 100, + minimumFee: 10, + blockGasUsed: 500000, + blockGasLimit: 1000000, + upwardAdj: sdk.NewDecWithPrec(5, 1), + downwardAdj: sdk.NewDecWithPrec(5, 1), + targetGasUsed: 500000, + expectedBaseFee: 100, + }, + { + name: "Block gas usage 75%, 0% up, 0% down, base fee stays the same", + currentBaseFee: 10000, + minimumFee: 10, + blockGasUsed: 750000, + blockGasLimit: 1000000, + upwardAdj: sdk.NewDec(0), + downwardAdj: sdk.NewDec(0), + targetGasUsed: 500000, + expectedBaseFee: 10000, + }, + { + name: "Block gas usage 25%, 0% up, 0% down, base fee stays the same", + currentBaseFee: 10000, + minimumFee: 10, + blockGasUsed: 250000, + blockGasLimit: 1000000, + upwardAdj: sdk.NewDec(0), + downwardAdj: sdk.NewDec(0), + targetGasUsed: 500000, + expectedBaseFee: 10000, + }, + { + name: "Block gas usage 75%, 50% up, 0% down, base fee increases by 25%", + currentBaseFee: 10000, + minimumFee: 10, + blockGasUsed: 750000, + blockGasLimit: 1000000, + upwardAdj: sdk.NewDecWithPrec(5, 1), + downwardAdj: sdk.NewDec(0), + targetGasUsed: 500000, + expectedBaseFee: 12500, + }, + { + name: "Block gas usage 25%, 0% up, 50% down, base fee decreases by 25%", + currentBaseFee: 10000, + minimumFee: 10, + blockGasUsed: 250000, + blockGasLimit: 1000000, + upwardAdj: sdk.NewDec(0), + downwardAdj: sdk.NewDecWithPrec(5, 1), + targetGasUsed: 500000, + expectedBaseFee: 7500, + }, + { + name: "Block gas usage low, new base fee below minimum, set to minimum", + currentBaseFee: 100, + minimumFee: 99, + blockGasUsed: 0, + blockGasLimit: 1000000, + upwardAdj: sdk.NewDecWithPrec(5, 2), + downwardAdj: sdk.NewDecWithPrec(5, 2), + targetGasUsed: 500000, + expectedBaseFee: 99, // Should not go below the minimum fee + }, { name: "target gas used is 0", currentBaseFee: 10000, diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index f26dfd6a2..76e9d329a 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -160,7 +160,6 @@ func (server msgServer) EVMTransaction(goCtx context.Context, msg *types.MsgEVMT originalGasMeter.ConsumeGas(adjustedGasUsed.TruncateInt().Uint64(), "evm transaction") }() - fmt.Println("JEREMYDEBUG: calling apply evm message from EVMTransaction") res, applyErr := server.applyEVMMessage(ctx, emsg, stateDB, gp) serverRes = &types.MsgEVMTransactionResponse{ Hash: tx.Hash().Hex(), @@ -230,7 +229,6 @@ func (k *Keeper) GetEVMMessage(ctx sdk.Context, tx *ethtypes.Transaction, sender } func (k Keeper) applyEVMMessage(ctx sdk.Context, msg *core.Message, stateDB *state.DBImpl, gp core.GasPool) (*core.ExecutionResult, error) { - // fmt.Printf("JEREMYDEBUG: In applyEVMMessage, msg = %+v\n", msg) blockCtx, err := k.GetVMBlockContext(ctx, gp) if err != nil { return nil, err diff --git a/x/evm/module.go b/x/evm/module.go index e66ad94f2..d284c4a6b 100644 --- a/x/evm/module.go +++ b/x/evm/module.go @@ -286,7 +286,6 @@ func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) { // EndBlock executes all ABCI EndBlock logic respective to the evm module. It // returns no validator updates. func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.ValidatorUpdate { - fmt.Println("JEREMYDEBUG: block gas used", req.BlockGasUsed, ", block height", ctx.BlockHeight()) newBaseFee := am.keeper.AdjustDynamicBaseFeePerGas(ctx, uint64(req.BlockGasUsed)) if newBaseFee != nil { metrics.GaugeEvmBlockBaseFee(newBaseFee.TruncateInt().BigInt(), req.Height) From 5ebfc6260f0cc4e0fbb4e034b0602e158de33f63 Mon Sep 17 00:00:00 2001 From: Jeremy Wei Date: Wed, 2 Oct 2024 14:12:37 -0400 Subject: [PATCH 3/3] add test for capping gas used --- x/evm/keeper/fee_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/x/evm/keeper/fee_test.go b/x/evm/keeper/fee_test.go index 0135381c4..981a4b2bb 100644 --- a/x/evm/keeper/fee_test.go +++ b/x/evm/keeper/fee_test.go @@ -120,6 +120,18 @@ func TestAdjustBaseFeePerGas(t *testing.T) { targetGasUsed: 0, expectedBaseFee: 10000, }, + { + name: "cap block gas used to block gas limit", + // block gas used is 1.5x block gas limit + currentBaseFee: 10000, + minimumFee: 10, + blockGasUsed: 1500000, + blockGasLimit: 1000000, + upwardAdj: sdk.NewDecWithPrec(5, 1), + downwardAdj: sdk.NewDecWithPrec(5, 1), + targetGasUsed: 500000, + expectedBaseFee: 15000, + }, } for _, tc := range testCases {