From 1ed351fca95c2ca956eaaca799182192abdb8b74 Mon Sep 17 00:00:00 2001 From: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> Date: Fri, 10 Jan 2025 11:55:14 -0600 Subject: [PATCH] fix(evm-precompile): use bank.MsgServer Send in precompile IFunToken.bankMsgSend (#2160) * fix(evm-precompile): use bank.MsgServer Send in precompile IFunToken.bankMsgSend * chore: changelog --- CHANGELOG.md | 1 + x/evm/precompile/funtoken.go | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eccf51dc4..cd3c85c40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,6 +74,7 @@ JSON encoding for the `EIP55Addr` struct was not following the Go conventions an needed to include double quotes around the hexadecimal string. - [#2156](https://github.com/NibiruChain/nibiru/pull/2156) - test(evm-e2e): add E2E test using the Nibiru Oracle's ChainLink impl - [#2157](https://github.com/NibiruChain/nibiru/pull/2157) - fix(evm): Fix unit inconsistency related to AuthInfo.Fee and txData.Fee using effective fee +- [#2160](https://github.com/NibiruChain/nibiru/pull/2160) - fix(evm-precompile): use bank.MsgServer Send in precompile IFunToken.bankMsgSend #### Nibiru EVM | Before Audit 2 - 2024-12-06 diff --git a/x/evm/precompile/funtoken.go b/x/evm/precompile/funtoken.go index f903fc436..c77248d3f 100644 --- a/x/evm/precompile/funtoken.go +++ b/x/evm/precompile/funtoken.go @@ -6,6 +6,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + bank "github.com/cosmos/cosmos-sdk/x/bank/types" gethabi "github.com/ethereum/go-ethereum/accounts/abi" gethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" @@ -125,6 +127,10 @@ type precompileFunToken struct { // /// @param to the receiving Nibiru base account address as a string // function sendToBank(address erc20, uint256 amount, string memory to) external; // ``` +// +// Because [sendToBank] uses "SendCoinsFromModuleToAccount" to send Bank Coins, +// this method correctly avoids sending funds to addresses blocked by the Bank +// module. func (p precompileFunToken) sendToBank( startResult OnRunStartResult, caller gethcommon.Address, @@ -701,9 +707,6 @@ func (p precompileFunToken) bankMsgSend( if err != nil { return nil, ErrInvalidArgs(err) } - if amount.Sign() != 1 { - return nil, fmt.Errorf("msgSend amount must be positive") - } // parse toStr (bech32 or hex) toEthAddr, e := parseToAddr(toStr) @@ -715,8 +718,16 @@ func (p precompileFunToken) bankMsgSend( // do the bank send coin := sdk.NewCoins(sdk.NewCoin(denom, math.NewIntFromBigInt(amount))) - if err := p.evmKeeper.Bank.SendCoins( - ctx, fromBech32, toBech32, coin, + bankMsg := &bank.MsgSend{ + FromAddress: fromBech32.String(), + ToAddress: toBech32.String(), + Amount: coin, + } + if err := bankMsg.ValidateBasic(); err != nil { + return nil, err + } + if _, err := bankkeeper.NewMsgServerImpl(p.evmKeeper.Bank).Send( + sdk.WrapSDKContext(ctx), bankMsg, ); err != nil { return nil, fmt.Errorf("bankMsgSend: %w", err) }