From 62f7baf5dca84e6ba3b8b039dbe919405176028a Mon Sep 17 00:00:00 2001 From: Oleg Nikonychev Date: Thu, 26 Dec 2024 19:47:22 +0400 Subject: [PATCH 01/10] fix(evm): proper block gas calculation in precompile calls --- x/evm/keeper/call_contract.go | 15 ++++++--------- x/evm/keeper/funtoken_from_coin_test.go | 2 ++ x/evm/precompile/funtoken_test.go | 6 ++++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/x/evm/keeper/call_contract.go b/x/evm/keeper/call_contract.go index ad4ac90c7..d9dc889e8 100644 --- a/x/evm/keeper/call_contract.go +++ b/x/evm/keeper/call_contract.go @@ -108,14 +108,17 @@ func (k Keeper) CallContractWithInput( ctx, evmMsg, evm.NewNoOpTracer(), commit, evmCfg, txConfig, true, ) if err != nil { - // We don't know the actual gas used, so consuming the gas limit - k.ResetGasMeterAndConsumeGas(ctx, gasLimit) + k.ResetGasMeterAndConsumeGas(ctx, ctx.GasMeter().Limit()) err = errors.Wrap(err, "failed to apply ethereum core message") return } + blockGasUsed, errBlockGasUsed := k.AddToBlockGasUsed(ctx, evmResp.GasUsed) + if errBlockGasUsed != nil { + return nil, nil, errors.Wrap(errBlockGasUsed, "error adding transient gas used to block") + } + k.ResetGasMeterAndConsumeGas(ctx, blockGasUsed) if evmResp.Failed() { - k.ResetGasMeterAndConsumeGas(ctx, evmResp.GasUsed) if strings.Contains(evmResp.VmError, vm.ErrOutOfGas.Error()) { err = fmt.Errorf("gas required exceeds allowance (%d)", gasLimit) return @@ -130,12 +133,6 @@ func (k Keeper) CallContractWithInput( // Success, update block gas used and bloom filter if commit { - blockGasUsed, err := k.AddToBlockGasUsed(ctx, evmResp.GasUsed) - if err != nil { - k.ResetGasMeterAndConsumeGas(ctx, ctx.GasMeter().Limit()) - return nil, nil, errors.Wrap(err, "error adding transient gas used to block") - } - k.ResetGasMeterAndConsumeGas(ctx, blockGasUsed) k.updateBlockBloom(ctx, evmResp, uint64(txConfig.LogIndex)) // TODO: remove after migrating logs //err = k.EmitLogEvents(ctx, evmResp) diff --git a/x/evm/keeper/funtoken_from_coin_test.go b/x/evm/keeper/funtoken_from_coin_test.go index ed3f47c10..f790ca896 100644 --- a/x/evm/keeper/funtoken_from_coin_test.go +++ b/x/evm/keeper/funtoken_from_coin_test.go @@ -255,6 +255,8 @@ func (s *FunTokenFromCoinSuite) TestConvertCoinToEvmAndBack() { s.Require().NoError(err) s.Require().Equal("0", balance.String()) + deps.ResetGasMeter() + s.T().Log("sad: Convert more erc-20 to back to bank coin, insufficient funds") _, err = deps.EvmKeeper.CallContract( deps.Ctx, diff --git a/x/evm/precompile/funtoken_test.go b/x/evm/precompile/funtoken_test.go index 7645a26e5..12cce737b 100644 --- a/x/evm/precompile/funtoken_test.go +++ b/x/evm/precompile/funtoken_test.go @@ -171,6 +171,8 @@ func (s *FuntokenSuite) TestHappyPath() { sdk.NewCoins(sdk.NewCoin(s.funtoken.BankDenom, sdk.NewInt(69_420))), )) + deps.ResetGasMeter() + s.Run("IFunToken.bankBalance", func() { s.Require().NotEmpty(funtoken.BankDenom) evmResp, err := deps.EvmKeeper.CallContract( @@ -222,7 +224,6 @@ func (s *FuntokenSuite) TestHappyPath() { input, err := embeds.SmartContract_FunToken.ABI.Pack(string(precompile.FunTokenMethod_sendToBank), callArgs...) s.NoError(err) - deps.ResetGasMeter() _, ethTxResp, err := evmtest.CallContractTx( &deps, precompile.PrecompileAddr_FunToken, @@ -242,7 +243,6 @@ func (s *FuntokenSuite) TestHappyPath() { s.Equal(sdk.NewInt(420).String(), deps.App.BankKeeper.GetBalance(deps.Ctx, randomAcc, funtoken.BankDenom).Amount.String(), ) - s.deps.ResetGasMeter() s.Require().NotNil(deps.EvmKeeper.Bank.StateDB) s.T().Log("Parse the response contract addr and response bytes") @@ -255,6 +255,8 @@ func (s *FuntokenSuite) TestHappyPath() { s.NoError(err) s.Require().Equal("420", sentAmt.String()) + deps.ResetGasMeter() + s.Run("IFuntoken.balance", func() { evmResp, err := deps.EvmKeeper.CallContract( deps.Ctx, From d25a6686320ac846ad23672465f3dc4632ecdfd0 Mon Sep 17 00:00:00 2001 From: Oleg Nikonychev Date: Thu, 26 Dec 2024 19:48:46 +0400 Subject: [PATCH 02/10] chore: changelog update --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index efc5f45f4..785c7f1e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ only on the "bankkeeper.BaseKeeper"'s gas consumption. Remove unnecessary argument in the `VerifyFee` function, which returns the token payment required based on the effective fee from the tx data. Improve documentation. +- [#2131](https://github.com/NibiruChain/nibiru/pull/2131) - fix(evm): proper block gas calculation in precompile calls #### Nibiru EVM | Before Audit 2 - 2024-12-06 From ba6fc13cc27f372319e453b607af05106a227787 Mon Sep 17 00:00:00 2001 From: Oleg Nikonychev Date: Thu, 26 Dec 2024 21:58:56 +0400 Subject: [PATCH 03/10] fix(evm): proper tx gas refund --- x/evm/keeper/msg_server.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index 1e946066f..8d07c4e9b 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -72,22 +72,21 @@ func (k *Keeper) EthereumTx( k.updateBlockBloom(ctx, evmResp, uint64(txConfig.LogIndex)) - blockGasUsed, err := k.AddToBlockGasUsed(ctx, evmResp.GasUsed) - if err != nil { - return nil, errors.Wrap(err, "error adding transient gas used to block") - } - // refund gas in order to match the Ethereum gas consumption instead of the // default SDK one. refundGas := uint64(0) - if evmMsg.Gas() > blockGasUsed { - refundGas = evmMsg.Gas() - blockGasUsed + if evmMsg.Gas() > evmResp.GasUsed { + refundGas = evmMsg.Gas() - evmResp.GasUsed } weiPerGas := txMsg.EffectiveGasPriceWeiPerGas(evmConfig.BaseFeeWei) if err = k.RefundGas(ctx, evmMsg.From(), refundGas, weiPerGas); err != nil { return nil, errors.Wrapf(err, "error refunding leftover gas to sender %s", evmMsg.From()) } + blockGasUsed, err := k.AddToBlockGasUsed(ctx, evmResp.GasUsed) + if err != nil { + return nil, errors.Wrap(err, "error adding transient gas used to block") + } // reset the gas meter for current TxMsg (EthereumTx) k.ResetGasMeterAndConsumeGas(ctx, blockGasUsed) From 5b577295bef4fff2719836670aeb36621d6fca05 Mon Sep 17 00:00:00 2001 From: Oleg Nikonychev Date: Sat, 28 Dec 2024 13:45:10 +0400 Subject: [PATCH 04/10] fix: moved gas comsumption from call_contract to msg_server --- x/evm/keeper/call_contract.go | 6 ------ x/evm/keeper/funtoken_from_coin.go | 8 +++++++- x/evm/keeper/keeper.go | 3 ++- x/evm/keeper/msg_server.go | 7 +++++++ 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/x/evm/keeper/call_contract.go b/x/evm/keeper/call_contract.go index d9dc889e8..8bf199785 100644 --- a/x/evm/keeper/call_contract.go +++ b/x/evm/keeper/call_contract.go @@ -108,15 +108,9 @@ func (k Keeper) CallContractWithInput( ctx, evmMsg, evm.NewNoOpTracer(), commit, evmCfg, txConfig, true, ) if err != nil { - k.ResetGasMeterAndConsumeGas(ctx, ctx.GasMeter().Limit()) err = errors.Wrap(err, "failed to apply ethereum core message") return } - blockGasUsed, errBlockGasUsed := k.AddToBlockGasUsed(ctx, evmResp.GasUsed) - if errBlockGasUsed != nil { - return nil, nil, errors.Wrap(errBlockGasUsed, "error adding transient gas used to block") - } - k.ResetGasMeterAndConsumeGas(ctx, blockGasUsed) if evmResp.Failed() { if strings.Contains(evmResp.VmError, vm.ErrOutOfGas.Error()) { diff --git a/x/evm/keeper/funtoken_from_coin.go b/x/evm/keeper/funtoken_from_coin.go index 4dfaa5c92..4cd8e765b 100644 --- a/x/evm/keeper/funtoken_from_coin.go +++ b/x/evm/keeper/funtoken_from_coin.go @@ -78,12 +78,18 @@ func (k *Keeper) deployERC20ForBankCoin( bytecodeForCall := append(embeds.SmartContract_ERC20Minter.Bytecode, packedArgs...) // nil address for contract creation - _, _, err = k.CallContractWithInput( + evmResp, _, err := k.CallContractWithInput( ctx, evm.EVM_MODULE_ADDRESS, nil, true, bytecodeForCall, Erc20GasLimitDeploy, ) if err != nil { + k.ResetGasMeterAndConsumeGas(ctx, ctx.GasMeter().Limit()) return gethcommon.Address{}, errors.Wrap(err, "failed to deploy ERC20 contract") } + blockGasUsed, errBlockGasUsed := k.AddToBlockGasUsed(ctx, evmResp.GasUsed) + if errBlockGasUsed != nil { + return gethcommon.Address{}, errors.Wrap(errBlockGasUsed, "error adding transient gas used") + } + k.ResetGasMeterAndConsumeGas(ctx, blockGasUsed) return erc20Addr, nil } diff --git a/x/evm/keeper/keeper.go b/x/evm/keeper/keeper.go index 79899bd89..086e2c805 100644 --- a/x/evm/keeper/keeper.go +++ b/x/evm/keeper/keeper.go @@ -104,7 +104,7 @@ func (k *Keeper) AddToBlockGasUsed( ) (blockGasUsed uint64, err error) { // Either k.EvmState.BlockGasUsed.GetOr() or k.EvmState.BlockGasUsed.Set() // also consume gas and could panic. - defer HandleOutOfGasPanic(&err, "") + defer HandleOutOfGasPanic(&err, "")() blockGasUsed = k.EvmState.BlockGasUsed.GetOr(ctx, 0) + gasUsed if blockGasUsed < gasUsed { @@ -147,6 +147,7 @@ func HandleOutOfGasPanic(err *error, format string) func() { if r := recover(); r != nil { switch r.(type) { case sdk.ErrorOutOfGas: + *err = vm.ErrOutOfGas default: panic(r) diff --git a/x/evm/keeper/msg_server.go b/x/evm/keeper/msg_server.go index 8d07c4e9b..d88d2e47a 100644 --- a/x/evm/keeper/msg_server.go +++ b/x/evm/keeper/msg_server.go @@ -562,8 +562,15 @@ func (k Keeper) convertCoinToEvmBornCoin( coin.Amount.BigInt(), ) if err != nil { + k.ResetGasMeterAndConsumeGas(ctx, ctx.GasMeter().Limit()) return nil, err } + blockGasUsed, errBlockGasUsed := k.AddToBlockGasUsed(ctx, evmResp.GasUsed) + if errBlockGasUsed != nil { + return nil, errors.Wrap(errBlockGasUsed, "error adding transient gas used") + } + k.ResetGasMeterAndConsumeGas(ctx, blockGasUsed) + if evmResp.Failed() { return nil, fmt.Errorf("failed to mint erc-20 tokens of contract %s", erc20Addr.String()) From 06d7d98799cc322671757ba3fbea722ac0cf4d03 Mon Sep 17 00:00:00 2001 From: Oleg Nikonychev Date: Tue, 7 Jan 2025 15:48:45 +0400 Subject: [PATCH 05/10] test: fixed test for funtoken created from coin --- x/evm/precompile/funtoken_test.go | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/x/evm/precompile/funtoken_test.go b/x/evm/precompile/funtoken_test.go index c99f81411..3f6e96230 100644 --- a/x/evm/precompile/funtoken_test.go +++ b/x/evm/precompile/funtoken_test.go @@ -29,16 +29,11 @@ func TestSuite(t *testing.T) { type FuntokenSuite struct { suite.Suite - deps evmtest.TestDeps - funtoken evm.FunToken + deps evmtest.TestDeps } func (s *FuntokenSuite) SetupSuite() { s.deps = evmtest.NewTestDeps() - - s.T().Log("Create FunToken from coin") - bankDenom := "unibi" - s.funtoken = evmtest.CreateFunTokenForBankCoin(&s.deps, bankDenom, &s.Suite) } func (s *FuntokenSuite) TestFailToPackABI() { @@ -157,7 +152,7 @@ func (s *FuntokenSuite) TestHappyPath() { deps := evmtest.NewTestDeps() s.T().Log("Create FunToken mapping and ERC20") - bankDenom := "unibi" + bankDenom := "anycoin" funtoken := evmtest.CreateFunTokenForBankCoin(&deps, bankDenom, &s.Suite) erc20 := funtoken.Erc20Addr.Address @@ -170,7 +165,7 @@ func (s *FuntokenSuite) TestHappyPath() { deps.App.BankKeeper, deps.Ctx, deps.Sender.NibiruAddr, - sdk.NewCoins(sdk.NewCoin(s.funtoken.BankDenom, sdk.NewInt(69_420))), + sdk.NewCoins(sdk.NewCoin(funtoken.BankDenom, sdk.NewInt(69_420))), )) deps.ResetGasMeter() @@ -203,7 +198,7 @@ func (s *FuntokenSuite) TestHappyPath() { sdk.WrapSDKContext(deps.Ctx), &evm.MsgConvertCoinToEvm{ Sender: deps.Sender.NibiruAddr.String(), - BankCoin: sdk.NewCoin(s.funtoken.BankDenom, sdk.NewInt(69_420)), + BankCoin: sdk.NewCoin(funtoken.BankDenom, sdk.NewInt(69_420)), ToEthAddr: eth.EIP55Addr{ Address: deps.Sender.EthAddr, }, @@ -354,11 +349,15 @@ func (out FunTokenBankBalanceReturn) ParseFromResp( } func (s *FuntokenSuite) TestPrecompileLocalGas() { + deps := s.deps randomAcc := testutil.AccAddress() + bankDenom := "unibi" + funtoken := evmtest.CreateFunTokenForBankCoin(&s.deps, bankDenom, &s.Suite) + deployResp, err := evmtest.DeployContract( &deps, embeds.SmartContract_TestFunTokenPrecompileLocalGas, - s.funtoken.Erc20Addr.Address, + funtoken.Erc20Addr.Address, ) s.Require().NoError(err) contractAddr := deployResp.ContractAddr @@ -368,7 +367,7 @@ func (s *FuntokenSuite) TestPrecompileLocalGas() { deps.App.BankKeeper, deps.Ctx, deps.Sender.NibiruAddr, - sdk.NewCoins(sdk.NewCoin(s.funtoken.BankDenom, sdk.NewInt(1000))), + sdk.NewCoins(sdk.NewCoin(funtoken.BankDenom, sdk.NewInt(1000))), )) s.T().Log("Fund contract with erc20 coins") @@ -376,7 +375,7 @@ func (s *FuntokenSuite) TestPrecompileLocalGas() { sdk.WrapSDKContext(deps.Ctx), &evm.MsgConvertCoinToEvm{ Sender: deps.Sender.NibiruAddr.String(), - BankCoin: sdk.NewCoin(s.funtoken.BankDenom, sdk.NewInt(1000)), + BankCoin: sdk.NewCoin(funtoken.BankDenom, sdk.NewInt(1000)), ToEthAddr: eth.EIP55Addr{ Address: contractAddr, }, From bde298eaf2dd33fa2856f8b77327630a80e11acf Mon Sep 17 00:00:00 2001 From: Oleg Nikonychev Date: Tue, 7 Jan 2025 15:55:50 +0400 Subject: [PATCH 06/10] chore: lint --- eth/rpc/backend/backend_suite_test.go | 12 ------------ eth/rpc/backend/gas_used_test.go | 9 +++++---- x/evm/precompile/funtoken_test.go | 1 - 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/eth/rpc/backend/backend_suite_test.go b/eth/rpc/backend/backend_suite_test.go index fd2cf6b4c..ad42296fe 100644 --- a/eth/rpc/backend/backend_suite_test.go +++ b/eth/rpc/backend/backend_suite_test.go @@ -8,7 +8,6 @@ import ( "testing" "time" - "github.com/cosmos/cosmos-sdk/client/flags" sdk "github.com/cosmos/cosmos-sdk/types" gethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -191,17 +190,6 @@ func WaitForReceipt(s *BackendSuite, txHash gethcommon.Hash) (*big.Int, *gethcom } } -// broadcastSDKTx broadcasts the given SDK transaction and returns the response -func (s *BackendSuite) broadcastSDKTx(sdkTx sdk.Tx) *sdk.TxResponse { - txBytes, err := s.backend.ClientCtx().TxConfig.TxEncoder()(sdkTx) - s.Require().NoError(err) - - syncCtx := s.backend.ClientCtx().WithBroadcastMode(flags.BroadcastSync) - rsp, err := syncCtx.BroadcastTx(txBytes) - s.Require().NoError(err) - return rsp -} - // broadcastSDKTx broadcasts the given SDK transaction and returns the response func (s *BackendSuite) getUnibiBalance(address gethcommon.Address) *hexutil.Big { latestBlock := rpc.EthLatestBlockNumber diff --git a/eth/rpc/backend/gas_used_test.go b/eth/rpc/backend/gas_used_test.go index 3cde49d54..289ff1e50 100644 --- a/eth/rpc/backend/gas_used_test.go +++ b/eth/rpc/backend/gas_used_test.go @@ -3,6 +3,9 @@ package backend_test import ( "math/big" + "github.com/ethereum/go-ethereum/common/hexutil" + gethcore "github.com/ethereum/go-ethereum/core/types" + "github.com/NibiruChain/nibiru/v2/eth" "github.com/NibiruChain/nibiru/v2/eth/rpc" "github.com/NibiruChain/nibiru/v2/x/common/testutil" @@ -10,8 +13,6 @@ import ( "github.com/NibiruChain/nibiru/v2/x/evm/embeds" "github.com/NibiruChain/nibiru/v2/x/evm/evmtest" "github.com/NibiruChain/nibiru/v2/x/evm/precompile" - "github.com/ethereum/go-ethereum/common/hexutil" - gethcore "github.com/ethereum/go-ethereum/core/types" ) // TestGasUsedTransfers verifies that gas used is correctly calculated for simple transfers. @@ -67,7 +68,7 @@ func (s *BackendSuite) TestGasUsedFunTokens() { erc20Addr, err := eth.NewEIP55AddrFromStr(testContractAddress.String()) s.Require().NoError(err) - nonce, err := s.backend.GetTransactionCount(s.fundedAccEthAddr, rpc.EthPendingBlockNumber) + _, err = s.backend.GetTransactionCount(s.fundedAccEthAddr, rpc.EthPendingBlockNumber) s.Require().NoError(err) txResp, err := s.network.BroadcastMsgs(s.node.Address, &evm.MsgCreateFunToken{ @@ -87,7 +88,7 @@ func (s *BackendSuite) TestGasUsedFunTokens() { ) s.Require().NoError(err) - nonce, err = s.backend.GetTransactionCount(s.fundedAccEthAddr, rpc.EthPendingBlockNumber) + nonce, err := s.backend.GetTransactionCount(s.fundedAccEthAddr, rpc.EthPendingBlockNumber) s.Require().NoError(err) balanceBefore := s.getUnibiBalance(s.fundedAccEthAddr) diff --git a/x/evm/precompile/funtoken_test.go b/x/evm/precompile/funtoken_test.go index 3f6e96230..dfb4203d8 100644 --- a/x/evm/precompile/funtoken_test.go +++ b/x/evm/precompile/funtoken_test.go @@ -349,7 +349,6 @@ func (out FunTokenBankBalanceReturn) ParseFromResp( } func (s *FuntokenSuite) TestPrecompileLocalGas() { - deps := s.deps randomAcc := testutil.AccAddress() bankDenom := "unibi" From f680e2c7f96f6c9928f80b047248ea295f90972c Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 7 Jan 2025 09:48:34 -0500 Subject: [PATCH 07/10] Apply suggestions from code review Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- eth/rpc/backend/backend_suite_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/rpc/backend/backend_suite_test.go b/eth/rpc/backend/backend_suite_test.go index ad42296fe..f671ac965 100644 --- a/eth/rpc/backend/backend_suite_test.go +++ b/eth/rpc/backend/backend_suite_test.go @@ -194,7 +194,7 @@ func WaitForReceipt(s *BackendSuite, txHash gethcommon.Hash) (*big.Int, *gethcom func (s *BackendSuite) getUnibiBalance(address gethcommon.Address) *hexutil.Big { latestBlock := rpc.EthLatestBlockNumber latestBlockOrHash := rpc.BlockNumberOrHash{BlockNumber: &latestBlock} - balance, err := s.backend.GetBalance(s.fundedAccEthAddr, latestBlockOrHash) + balance, err := s.backend.GetBalance(address, latestBlockOrHash) s.Require().NoError(err) return balance } From 0ad6b9118025adab93749d1647695f4250f410e1 Mon Sep 17 00:00:00 2001 From: Oleg Nikonychev Date: Tue, 7 Jan 2025 20:47:36 +0400 Subject: [PATCH 08/10] fix: cleanup --- eth/rpc/backend/backend_suite_test.go | 10 +++++----- eth/rpc/backend/gas_used_test.go | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/eth/rpc/backend/backend_suite_test.go b/eth/rpc/backend/backend_suite_test.go index ad42296fe..8626527db 100644 --- a/eth/rpc/backend/backend_suite_test.go +++ b/eth/rpc/backend/backend_suite_test.go @@ -10,7 +10,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" gethcommon "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" gethcore "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" @@ -168,6 +167,7 @@ func SendTransaction(s *BackendSuite, tx *gethcore.LegacyTx, waitForNextBlock bo return txHash } +// WaitForReceipt waits for a transaction to be included in a block, returns block number, block hash and receipt func WaitForReceipt(s *BackendSuite, txHash gethcommon.Hash) (*big.Int, *gethcommon.Hash, *backend.TransactionReceipt) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -190,11 +190,11 @@ func WaitForReceipt(s *BackendSuite, txHash gethcommon.Hash) (*big.Int, *gethcom } } -// broadcastSDKTx broadcasts the given SDK transaction and returns the response -func (s *BackendSuite) getUnibiBalance(address gethcommon.Address) *hexutil.Big { +// getUnibiBalance returns the balance of an address in unibi +func (s *BackendSuite) getUnibiBalance(address gethcommon.Address) *big.Int { latestBlock := rpc.EthLatestBlockNumber latestBlockOrHash := rpc.BlockNumberOrHash{BlockNumber: &latestBlock} - balance, err := s.backend.GetBalance(s.fundedAccEthAddr, latestBlockOrHash) + balance, err := s.backend.GetBalance(address, latestBlockOrHash) s.Require().NoError(err) - return balance + return evm.WeiToNative(balance.ToInt()) } diff --git a/eth/rpc/backend/gas_used_test.go b/eth/rpc/backend/gas_used_test.go index 289ff1e50..f62307e1a 100644 --- a/eth/rpc/backend/gas_used_test.go +++ b/eth/rpc/backend/gas_used_test.go @@ -54,7 +54,7 @@ func (s *BackendSuite) TestGasUsedTransfers() { balanceAfter := s.getUnibiBalance(s.fundedAccEthAddr) s.Require().Equal( receipt1.GasUsed+receipt2.GasUsed+2, - evm.WeiToNative(balanceBefore.ToInt()).Uint64()-evm.WeiToNative(balanceAfter.ToInt()).Uint64(), + balanceBefore.Uint64()-balanceAfter.Uint64(), ) } @@ -175,6 +175,6 @@ func (s *BackendSuite) TestGasUsedFunTokens() { balanceAfter := s.getUnibiBalance(s.fundedAccEthAddr) s.Require().Equal( receipt1.GasUsed+receipt2.GasUsed+receipt3.GasUsed, - evm.WeiToNative(balanceBefore.ToInt()).Uint64()-evm.WeiToNative(balanceAfter.ToInt()).Uint64(), + balanceBefore.Uint64()-balanceAfter.Uint64(), ) } From b4c7bbaa8c65bae7f57345338ecb2a87445102b0 Mon Sep 17 00:00:00 2001 From: Oleg Nikonychev Date: Tue, 7 Jan 2025 23:02:23 +0400 Subject: [PATCH 09/10] fix: minor test fix --- x/evm/precompile/funtoken_test.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/x/evm/precompile/funtoken_test.go b/x/evm/precompile/funtoken_test.go index c3021f0eb..0d7b22622 100644 --- a/x/evm/precompile/funtoken_test.go +++ b/x/evm/precompile/funtoken_test.go @@ -222,10 +222,7 @@ func (s *FuntokenSuite) TestHappyPath() { s.NoError(err) deps.ResetGasMeter() - err = testapp.FundFeeCollector(deps.App.BankKeeper, deps.Ctx, - sdkmath.NewInt(70_000), - ) - s.NoError(err) + s.Require().NoError(testapp.FundFeeCollector(deps.App.BankKeeper, deps.Ctx, sdkmath.NewInt(20))) _, ethTxResp, err := evmtest.CallContractTx( &deps, precompile.PrecompileAddr_FunToken, @@ -432,6 +429,7 @@ func (s *FuntokenSuite) TestPrecompileLocalGas() { func (s *FuntokenSuite) TestSendToEvm() { deps := evmtest.NewTestDeps() + s.Require().NoError(testapp.FundFeeCollector(deps.App.BankKeeper, deps.Ctx, sdkmath.NewInt(20))) s.T().Log("1) Create a new FunToken from coin 'ulibi'") bankDenom := "ulibi" @@ -576,6 +574,7 @@ func (s *FuntokenSuite) TestSendToEvm_NotMadeFromCoin() { // - unescrow erc20 token deps := evmtest.NewTestDeps() + s.Require().NoError(testapp.FundFeeCollector(deps.App.BankKeeper, deps.Ctx, sdkmath.NewInt(20))) bob := evmtest.NewEthPrivAcc() alice := evmtest.NewEthPrivAcc() From 404a5da1ed0352d2927faf5a903ecf6dbf347a14 Mon Sep 17 00:00:00 2001 From: Oleg Nikonychev Date: Wed, 8 Jan 2025 15:07:14 +0400 Subject: [PATCH 10/10] fix: getting current nonce for a specified address --- eth/rpc/backend/backend_suite_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/rpc/backend/backend_suite_test.go b/eth/rpc/backend/backend_suite_test.go index 4c2116a1c..34b8dd88d 100644 --- a/eth/rpc/backend/backend_suite_test.go +++ b/eth/rpc/backend/backend_suite_test.go @@ -205,7 +205,7 @@ func (s *BackendSuite) getUnibiBalance(address gethcommon.Address) *big.Int { // getCurrentNonce returns the current nonce of the funded account func (s *BackendSuite) getCurrentNonce(address gethcommon.Address) uint64 { - nonce, err := s.backend.GetTransactionCount(s.fundedAccEthAddr, rpc.EthPendingBlockNumber) + nonce, err := s.backend.GetTransactionCount(address, rpc.EthPendingBlockNumber) s.Require().NoError(err) return uint64(*nonce)