From a0015af3aefce64609a01940333728848814551f Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 21 Jan 2025 10:59:08 -0800 Subject: [PATCH 01/15] chore: cleanup funtoken test --- x/evm/precompile/funtoken_test.go | 47 +++++++++++++++++++------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/x/evm/precompile/funtoken_test.go b/x/evm/precompile/funtoken_test.go index 2cd2bd34b..2dbadd876 100644 --- a/x/evm/precompile/funtoken_test.go +++ b/x/evm/precompile/funtoken_test.go @@ -119,15 +119,14 @@ func (s *FuntokenSuite) TestHappyPath() { deps := evmtest.NewTestDeps() s.T().Log("Create FunToken mapping and ERC20") - bankDenom := "unibi" - funtoken := evmtest.CreateFunTokenForBankCoin(deps, bankDenom, &s.Suite) + funtoken := evmtest.CreateFunTokenForBankCoin(deps, evm.EVMBankDenom, &s.Suite) erc20 := funtoken.Erc20Addr.Address s.Require().NoError(testapp.FundAccount( deps.App.BankKeeper, deps.Ctx, deps.Sender.NibiruAddr, - sdk.NewCoins(sdk.NewCoin(bankDenom, sdk.NewInt(69_420))), + sdk.NewCoins(sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(69_420))), )) s.Run("IFunToken.bankBalance()", func() { @@ -152,17 +151,25 @@ func (s *FuntokenSuite) TestHappyPath() { s.Equal(deps.Sender.NibiruAddr.String(), bech32Addr) }) - _, err := deps.EvmKeeper.ConvertCoinToEvm( - sdk.WrapSDKContext(deps.Ctx), - &evm.MsgConvertCoinToEvm{ - Sender: deps.Sender.NibiruAddr.String(), - BankCoin: sdk.NewCoin(bankDenom, sdk.NewInt(69_420)), - ToEthAddr: eth.EIP55Addr{ - Address: deps.Sender.EthAddr, + s.Run("ConvertCoinToEvm", func() { + _, err := deps.EvmKeeper.ConvertCoinToEvm( + sdk.WrapSDKContext(deps.Ctx), + &evm.MsgConvertCoinToEvm{ + Sender: deps.Sender.NibiruAddr.String(), + BankCoin: sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(69_420)), + ToEthAddr: eth.EIP55Addr{ + Address: deps.Sender.EthAddr, + }, }, - }, - ) - s.Require().NoError(err) + ) + s.Require().NoError(err) + evmObj, _ := deps.NewEVM() + evmtest.AssertERC20BalanceEqualWithDescription( + s.T(), deps, evmObj, erc20, deps.Sender.EthAddr, big.NewInt(69_420), "expect 69420 balance", + ) + evmtest.AssertBankBalanceEqualWithDescription(s.T(), deps, evm.EVMBankDenom, deps.Sender.EthAddr, big.NewInt(0), "expect the sender to have zero balance") + evmtest.AssertBankBalanceEqualWithDescription(s.T(), deps, evm.EVMBankDenom, evm.EVM_MODULE_ADDRESS, big.NewInt(69_420), "expect x/evm module to escrow all tokens") + }) s.Run("Mint tokens - Fail from non-owner", func() { contractInput, err := embeds.SmartContract_ERC20Minter.ABI.Pack("mint", deps.Sender.EthAddr, big.NewInt(69_420)) @@ -187,7 +194,6 @@ func (s *FuntokenSuite) TestHappyPath() { s.NoError(err) evmObj, _ := deps.NewEVM() - ethTxResp, err := deps.EvmKeeper.CallContractWithInput( deps.Ctx, evmObj, @@ -199,15 +205,19 @@ func (s *FuntokenSuite) TestHappyPath() { ) s.Require().NoError(err) s.Require().Empty(ethTxResp.VmError) - s.True(deps.App.BankKeeper == deps.App.EvmKeeper.Bank) evmtest.AssertERC20BalanceEqualWithDescription( - s.T(), deps, evmObj, erc20, deps.Sender.EthAddr, big.NewInt(69_000), "expect 69000 balance", + s.T(), deps, evmObj, erc20, deps.Sender.EthAddr, big.NewInt(69_000), "expect 69000 balance remaining", ) evmtest.AssertERC20BalanceEqualWithDescription( s.T(), deps, evmObj, erc20, evm.EVM_MODULE_ADDRESS, big.NewInt(0), "expect 0 balance", ) - s.Require().True(deps.App.BankKeeper.GetBalance(deps.Ctx, randomAcc, funtoken.BankDenom).Amount.Equal(sdk.NewInt(420))) + evmtest.AssertBankBalanceEqualWithDescription( + s.T(), deps, evm.EVMBankDenom, eth.NibiruAddrToEthAddr(randomAcc), big.NewInt(420), "expect 420 balance", + ) + evmtest.AssertBankBalanceEqualWithDescription( + s.T(), deps, evm.EVMBankDenom, evm.EVM_MODULE_ADDRESS, big.NewInt(69_000), "expect 69000 balance", + ) s.T().Log("Parse the response contract addr and response bytes") var sentAmt *big.Int @@ -220,8 +230,9 @@ func (s *FuntokenSuite) TestHappyPath() { }) s.Run("IFuntoken.balance", func() { - contractInput, err := embeds.SmartContract_FunToken.ABI.Pack("balance", deps.Sender.EthAddr, erc20) + contractInput, err := embeds.SmartContract_FunToken.ABI.Pack(string(precompile.FunTokenMethod_balance), deps.Sender.EthAddr, erc20) s.Require().NoError(err) + evmObj, _ := deps.NewEVM() evmResp, err := deps.EvmKeeper.CallContractWithInput( deps.Ctx, From dec549dc8a33574ef7f5084b77bfc78a4276a603 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 21 Jan 2025 11:07:12 -0800 Subject: [PATCH 02/15] Update funtoken_test.go --- x/evm/precompile/funtoken_test.go | 167 ++++++++++++++++-------------- 1 file changed, 89 insertions(+), 78 deletions(-) diff --git a/x/evm/precompile/funtoken_test.go b/x/evm/precompile/funtoken_test.go index 2dbadd876..a5b21f60d 100644 --- a/x/evm/precompile/funtoken_test.go +++ b/x/evm/precompile/funtoken_test.go @@ -374,7 +374,7 @@ func (s *FuntokenSuite) TestSendToEvm_MadeFromCoin() { s.Run("Call sendToEvm(string bankDenom, uint256 amount, string to)", func() { contractInput, err := embeds.SmartContract_FunToken.ABI.Pack( - "sendToEvm", + string(precompile.FunTokenMethod_sendToEvm), bankDenom, big.NewInt(1000), deps.Sender.EthAddr.Hex(), @@ -393,20 +393,19 @@ func (s *FuntokenSuite) TestSendToEvm_MadeFromCoin() { s.Require().NoError(err) s.Require().Empty(ethTxResp.VmError, "sendToEvm VMError") - s.T().Log("4) The response returns the actual minted/unescrowed amount") + s.T().Log("The response returns the actual minted/unescrowed amount") var amountSent *big.Int err = embeds.SmartContract_FunToken.ABI.UnpackIntoInterface( - &amountSent, "sendToEvm", ethTxResp.Ret, + &amountSent, string(precompile.FunTokenMethod_sendToEvm), ethTxResp.Ret, ) s.Require().NoError(err) s.Require().EqualValues(1000, amountSent.Int64(), "expect 1000 minted to EVM") s.T().Log("Check the user lost 1000 ulibi in bank") - bankBal := deps.App.BankKeeper.GetBalance(deps.Ctx, deps.Sender.NibiruAddr, bankDenom).Amount.BigInt() - s.EqualValues(big.NewInt(234), bankBal, "did user lose 1000 ulibi from bank?") + evmtest.AssertBankBalanceEqualWithDescription(s.T(), deps, bankDenom, deps.Sender.EthAddr, big.NewInt(234), "did user lose 1000 ulibi from bank?") - // check the evm module account balance - s.EqualValues(big.NewInt(1000), deps.App.BankKeeper.GetBalance(deps.Ctx, evm.EVM_MODULE_ADDRESS_NIBI, bankDenom).Amount.BigInt()) + s.T().Log("Check the module account has 1000 ulibi") + evmtest.AssertBankBalanceEqualWithDescription(s.T(), deps, bankDenom, evm.EVM_MODULE_ADDRESS, big.NewInt(1000), "expect 1000 balance") s.T().Log("Check the user gained 1000 in ERC20 representation") evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, deps.Sender.EthAddr, big.NewInt(1000), "expect 1000 balance") @@ -418,16 +417,17 @@ func (s *FuntokenSuite) TestSendToEvm_MadeFromCoin() { // We'll pick a brand new random account to receive them. s.Run("Sending 400 tokens back from EVM to Cosmos bank => recipient:", func() { - recipient := testutil.AccAddress() + randomRecipient := testutil.AccAddress() + contractInput, err := embeds.SmartContract_FunToken.ABI.Pack( string(precompile.FunTokenMethod_sendToBank), erc20Addr, big.NewInt(400), - recipient.String(), + randomRecipient.String(), ) s.Require().NoError(err) - ethExResp, err := deps.EvmKeeper.CallContractWithInput( + ethTxResp, err := deps.EvmKeeper.CallContractWithInput( deps.Ctx, evmObj, deps.Sender.EthAddr, @@ -437,13 +437,13 @@ func (s *FuntokenSuite) TestSendToEvm_MadeFromCoin() { evmtest.FunTokenGasLimitSendToEvm, ) s.Require().NoError(err) - s.Require().Empty(ethExResp.VmError, "sendToBank VMError") + s.Require().Empty(ethTxResp.VmError, "sendToBank VMError") s.T().Log("Parse the returned amount from `sendToBank`") var actualSent *big.Int err = embeds.SmartContract_FunToken.ABI.UnpackIntoInterface( &actualSent, string(precompile.FunTokenMethod_sendToBank), - ethExResp.Ret, + ethTxResp.Ret, ) s.Require().NoError(err) s.Require().EqualValues(big.NewInt(400), actualSent, "expect 400 minted back to bank") @@ -461,10 +461,24 @@ func (s *FuntokenSuite) TestSendToEvm_MadeFromCoin() { ) s.T().Log("Check the bank side got 400 more") - s.Require().EqualValues(big.NewInt(400), deps.App.BankKeeper.GetBalance(deps.Ctx, recipient, bankDenom).Amount.BigInt(), "did the recipient get 400?") + evmtest.AssertBankBalanceEqualWithDescription( + s.T(), + deps, + bankDenom, + eth.NibiruAddrToEthAddr(randomRecipient), + big.NewInt(400), + "did the recipient get 400?", + ) s.T().Log("Confirm module account doesn't keep them (burn or escrow) for bank-based tokens") - s.Require().EqualValues(big.NewInt(600), deps.App.BankKeeper.GetBalance(deps.Ctx, evm.EVM_MODULE_ADDRESS[:], bankDenom).Amount.BigInt(), "module should now have 600 left escrowed") + evmtest.AssertBankBalanceEqualWithDescription( + s.T(), + deps, + bankDenom, + evm.EVM_MODULE_ADDRESS, + big.NewInt(600), + "module should now have 600 left escrowed", + ) }) } @@ -487,7 +501,6 @@ func (s *FuntokenSuite) TestSendToEvm_MadeFromERC20() { // - unescrow erc20 token deps := evmtest.NewTestDeps() - evmObj, _ := deps.NewEVM() alice := evmtest.NewEthPrivAcc() bob := evmtest.NewEthPrivAcc() @@ -503,9 +516,6 @@ func (s *FuntokenSuite) TestSendToEvm_MadeFromERC20() { s.Require().NoError(err, "failed to deploy test ERC20") erc20Addr := erc20Resp.ContractAddr - // the initial supply was sent to the deployer - evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, deps.Sender.EthAddr, bigTokens(1_000_000), "expect nonzero balance") - // create fun token from that erc20 _, err = deps.EvmKeeper.CreateFunToken( sdk.WrapSDKContext(deps.Ctx), @@ -517,67 +527,73 @@ func (s *FuntokenSuite) TestSendToEvm_MadeFromERC20() { s.Require().NoError(err) // Transfer 500 tokens to bob => 500 * 10^18 raw - contractInput, err := embeds.SmartContract_TestERC20.ABI.Pack( - "transfer", - bob.EthAddr, - bigTokens(500), // 500 in human sense - ) - s.Require().NoError(err) - _, err = deps.EvmKeeper.CallContractWithInput( - deps.Ctx, - evmObj, - deps.Sender.EthAddr, - &erc20Addr, - true, - contractInput, - keeper.Erc20GasLimitExecute, - ) - s.Require().NoError(err) + s.Run("Transfer 500 tokens to bob", func() { + contractInput, err := embeds.SmartContract_TestERC20.ABI.Pack( + "transfer", + bob.EthAddr, + bigTokens(500), // 500 in human sense + ) + s.Require().NoError(err) + evmObj, _ := deps.NewEVM() + _, err = deps.EvmKeeper.CallContractWithInput( + deps.Ctx, + evmObj, + deps.Sender.EthAddr, + &erc20Addr, + true, + contractInput, + keeper.Erc20GasLimitExecute, + ) + s.Require().NoError(err) - // Now user should have 500 tokens => raw is 500 * 10^18 - evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, bob.EthAddr, bigTokens(500), "expect nonzero balance") + // Now user should have 500 tokens => raw is 500 * 10^18 + evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, bob.EthAddr, bigTokens(500), "expect nonzero balance") + }) // sendToBank: e.g. 100 tokens => 100 * 1e18 raw // expects to escrow on EVM side and mint on cosmos side - contractInput, err = embeds.SmartContract_FunToken.ABI.Pack( - string(precompile.FunTokenMethod_sendToBank), - erc20Addr, // address - bigTokens(100), - alice.NibiruAddr.String(), - ) - s.Require().NoError(err) - resp, err := deps.EvmKeeper.CallContractWithInput( - deps.Ctx, - evmObj, - bob.EthAddr, /* from */ - &precompile.PrecompileAddr_FunToken, /* to */ - true, /* commit */ - contractInput, - evmtest.FunTokenGasLimitSendToEvm, /* gasLimit */ - ) - s.Require().NoError(err) - s.Require().Empty(resp.VmError) + s.Run("send 100 tokens to alice", func() { + contractInput, err := embeds.SmartContract_FunToken.ABI.Pack( + string(precompile.FunTokenMethod_sendToBank), + erc20Addr, // address + bigTokens(100), + alice.NibiruAddr.String(), + ) + s.Require().NoError(err) + evmObj, _ := deps.NewEVM() + resp, err := deps.EvmKeeper.CallContractWithInput( + deps.Ctx, + evmObj, + bob.EthAddr, /* from */ + &precompile.PrecompileAddr_FunToken, /* to */ + true, /* commit */ + contractInput, + evmtest.FunTokenGasLimitSendToEvm, /* gasLimit */ + ) + s.Require().NoError(err) + s.Require().Empty(resp.VmError) - // Bank side should see 100 - bankBal := deps.App.BankKeeper.GetBalance(deps.Ctx, alice.NibiruAddr, "erc20/"+erc20Addr.Hex()) - s.Require().EqualValues(bigTokens(100), bankBal.Amount.BigInt()) + // Bank side should see 100 + evmtest.AssertBankBalanceEqualWithDescription(s.T(), deps, "erc20/"+erc20Addr.Hex(), alice.EthAddr, bigTokens(100), "expect 100 balance") - // Expect user to have 400 tokens => 400 * 10^18 - evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, bob.EthAddr, bigTokens(400), "expect Bob's balance to be 400") + // Expect user to have 400 tokens => 400 * 10^18 + evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, bob.EthAddr, bigTokens(400), "expect Bob's balance to be 400") - // 100 tokens are escrowed - evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, evm.EVM_MODULE_ADDRESS, bigTokens(100), "expect EVM module to escrow 100 tokens") + // 100 tokens are escrowed + evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, evm.EVM_MODULE_ADDRESS, bigTokens(100), "expect EVM module to escrow 100 tokens") + }) // Finally sendToEvm(100) -> (expects to burn on cosmos side and unescrow in the EVM side) s.Run("send 100 tokens back to Bob", func() { contractInput, err := embeds.SmartContract_FunToken.ABI.Pack( "sendToEvm", - bankBal.Denom, + "erc20/"+erc20Addr.Hex(), bigTokens(100), bob.EthAddr.Hex(), ) s.Require().NoError(err) - resp, err = deps.EvmKeeper.CallContractWithInput( + evmObj, _ := deps.NewEVM() + resp, err := deps.EvmKeeper.CallContractWithInput( deps.Ctx, evmObj, alice.EthAddr, @@ -588,25 +604,20 @@ func (s *FuntokenSuite) TestSendToEvm_MadeFromERC20() { ) s.Require().NoError(err) s.Require().Empty(resp.VmError) - }) - - // no bank side left for alice - balAfter := deps.App.BankKeeper.GetBalance(deps.Ctx, alice.NibiruAddr, bankBal.Denom).Amount.BigInt() - s.Require().EqualValues(bigTokens(0), balAfter) - // check bob has 500 tokens again => 500 * 1e18 - evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, bob.EthAddr, bigTokens(500), "expect nonzero balance") + // no bank side left for alice + evmtest.AssertBankBalanceEqualWithDescription(s.T(), deps, "erc20/"+erc20Addr.Hex(), alice.EthAddr, bigTokens(0), "expect 0 balance") - // check evm module account's balance, it should have escrowed some tokens - // unescrow the tokens - evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, evm.EVM_MODULE_ADDRESS, bigTokens(0), "expect zero balance") + // check bob has 500 tokens again => 500 * 1e18 + evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, bob.EthAddr, bigTokens(500), "expect nonzero balance") - // burns the bank tokens - evmBal2 := deps.App.BankKeeper.GetBalance(deps.Ctx, evm.EVM_MODULE_ADDRESS[:], bankBal.Denom).Amount.BigInt() - s.Require().EqualValues(bigTokens(0), evmBal2) + // check evm module account's balance, it should have escrowed some tokens + // unescrow the tokens + evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, evm.EVM_MODULE_ADDRESS, bigTokens(0), "expect zero balance") - // user has 500 tokens again => 500 * 1e18 - evmtest.AssertERC20BalanceEqualWithDescription(s.T(), deps, evmObj, erc20Addr, bob.EthAddr, bigTokens(500), "expect nonzero balance") + // burns the bank tokens + evmtest.AssertBankBalanceEqualWithDescription(s.T(), deps, "erc20/"+erc20Addr.Hex(), evm.EVM_MODULE_ADDRESS, bigTokens(0), "expect 0 balance") + }) } // FunTokenWhoAmIReturn holds the return values from the "IFuntoken.whoAmI" From 90bc48cc6d954ba42efaa0f49f5b0074a2384d15 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 21 Jan 2025 13:45:52 -0800 Subject: [PATCH 03/15] refactor: update wasm tests --- x/evm/precompile/test/export.go | 186 ++++++-------------------------- x/evm/precompile/wasm_test.go | 160 +++++++++++++++++---------- x/evm/statedb/journal_test.go | 24 ++--- 3 files changed, 147 insertions(+), 223 deletions(-) diff --git a/x/evm/precompile/test/export.go b/x/evm/precompile/test/export.go index e37c99b09..1fce5969c 100644 --- a/x/evm/precompile/test/export.go +++ b/x/evm/precompile/test/export.go @@ -2,7 +2,6 @@ package test import ( "encoding/json" - "math/big" "os" "os/exec" "path" @@ -11,11 +10,9 @@ import ( wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" wasm "github.com/CosmWasm/wasmd/x/wasm/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/core/vm" "github.com/stretchr/testify/suite" "github.com/NibiruChain/nibiru/v2/app" - serverconfig "github.com/NibiruChain/nibiru/v2/app/server/config" "github.com/NibiruChain/nibiru/v2/x/evm/embeds" "github.com/NibiruChain/nibiru/v2/x/evm/evmtest" "github.com/NibiruChain/nibiru/v2/x/evm/precompile" @@ -30,7 +27,7 @@ const ( // SetupWasmContracts stores all Wasm bytecode and has the "deps.Sender" // instantiate each Wasm contract using the precompile. -func SetupWasmContracts(deps *evmtest.TestDeps, evmObj *vm.EVM, s *suite.Suite) ( +func SetupWasmContracts(deps *evmtest.TestDeps, s *suite.Suite) ( contracts []sdk.AccAddress, ) { wasmCodes := deployWasmBytecode(s, deps.Ctx, deps.Sender.NibiruAddr, deps.App) @@ -50,45 +47,18 @@ func SetupWasmContracts(deps *evmtest.TestDeps, evmObj *vm.EVM, s *suite.Suite) } for i, wasmCode := range wasmCodes { - s.T().Logf("Instantiate using Wasm precompile: %s", wasmCode.binPath) + s.T().Logf("Instantiate %s", wasmCode.binPath) - m := wasm.MsgInstantiateContract{ - Admin: "", - CodeID: wasmCode.codeId, - Label: instantiateArgs[i].Label, - Msg: instantiateArgs[i].InstantiateMsg, - } - - msgArgsBz, err := json.Marshal(m.Msg) - s.NoError(err) - - contractInput, err := embeds.SmartContract_Wasm.ABI.Pack( - string(precompile.WasmMethod_instantiate), - m.Admin, m.CodeID, msgArgsBz, m.Label, []precompile.WasmBankCoin{}, - ) - s.NoError(err) - - ethTxResp, err := deps.EvmKeeper.CallContractWithInput( + wasmPermissionedKeeper := wasmkeeper.NewDefaultPermissionKeeper(deps.App.WasmKeeper) + contractAddr, _, err := wasmPermissionedKeeper.Instantiate( deps.Ctx, - evmObj, - deps.Sender.EthAddr, - &precompile.PrecompileAddr_Wasm, - true, - contractInput, - WasmGasLimitInstantiate, - ) - - s.Require().NoError(err) - s.Require().NotEmpty(ethTxResp.Ret) - - s.T().Log("Parse the response contract addr and response bytes") - vals, err := embeds.SmartContract_Wasm.ABI.Unpack( - string(precompile.WasmMethod_instantiate), - ethTxResp.Ret, + wasmCode.codeId, + deps.Sender.NibiruAddr, + deps.Sender.NibiruAddr, + instantiateArgs[i].InstantiateMsg, + instantiateArgs[i].Label, + sdk.Coins{}, ) - s.Require().NoError(err) - - contractAddr, err := sdk.AccAddressFromBech32(vals[0].(string)) s.NoError(err) contracts = append(contracts, contractAddr) } @@ -102,7 +72,7 @@ func deployWasmBytecode( s *suite.Suite, ctx sdk.Context, sender sdk.AccAddress, - nibiru *app.NibiruApp, + app *app.NibiruApp, ) (codeIds []struct { codeId uint64 binPath string @@ -135,12 +105,11 @@ func deployWasmBytecode( // The "Create" fn is private on the nibiru.WasmKeeper. By placing it as the // decorated keeper in PermissionedKeeper type, we can access "Create" as a // public fn. - wasmPermissionedKeeper := wasmkeeper.NewDefaultPermissionKeeper(nibiru.WasmKeeper) - instantiateAccess := &wasm.AccessConfig{ - Permission: wasm.AccessTypeEverybody, - } + wasmPermissionedKeeper := wasmkeeper.NewDefaultPermissionKeeper(app.WasmKeeper) codeId, _, err := wasmPermissionedKeeper.Create( - ctx, sender, wasmBytecode, instantiateAccess, + ctx, sender, wasmBytecode, &wasm.AccessConfig{ + Permission: wasm.AccessTypeEverybody, + }, ) s.Require().NoError(err) codeIds = append(codeIds, struct { @@ -163,7 +132,6 @@ func deployWasmBytecode( func AssertWasmCounterState( s *suite.Suite, deps evmtest.TestDeps, - evmObj *vm.EVM, wasmContract sdk.AccAddress, wantCount int64, ) { @@ -173,46 +141,12 @@ func AssertWasmCounterState( } `) - contractInput, err := embeds.SmartContract_Wasm.ABI.Pack( - string(precompile.WasmMethod_query), - wasmContract.String(), - msgArgsBz, - ) + resp, err := deps.App.WasmKeeper.QuerySmart(deps.Ctx, wasmContract, msgArgsBz) s.Require().NoError(err) - - ethTxResp, err := deps.EvmKeeper.CallContractWithInput( - deps.Ctx, - evmObj, - deps.Sender.EthAddr, - &precompile.PrecompileAddr_Wasm, - false, - contractInput, - WasmGasLimitQuery, - ) - s.Require().NoError(err) - s.Require().NotEmpty(ethTxResp.Ret) - - s.T().Log("Parse the response contract addr and response bytes") - s.T().Logf("ethTxResp.Ret: %s", ethTxResp.Ret) - - var queryResp []byte - err = embeds.SmartContract_Wasm.ABI.UnpackIntoInterface( - // Since there's only one return value, don't unpack as a slice. - // If there were two or more return values, we'd use - // &[]any{...} - &queryResp, - string(precompile.WasmMethod_query), - ethTxResp.Ret, - ) - s.Require().NoError(err) - s.T().Logf("queryResp: %s", queryResp) - - var wasmMsg wasm.RawContractMessage - s.NoError(json.Unmarshal(queryResp, &wasmMsg)) - s.NoError(wasmMsg.ValidateBasic()) + s.Require().NotEmpty(resp) var typedResp QueryMsgCountResp - s.NoError(json.Unmarshal(queryResp, &typedResp)) + s.NoError(json.Unmarshal(resp, &typedResp)) s.EqualValues(wantCount, typedResp.Count) s.EqualValues(deps.Sender.NibiruAddr.String(), typedResp.Owner) @@ -264,7 +198,6 @@ type QueryMsgCountResp struct { func IncrementWasmCounterWithExecuteMulti( s *suite.Suite, deps *evmtest.TestDeps, - evmObj *vm.EVM, wasmContract sdk.AccAddress, times uint, commit bool, @@ -277,70 +210,6 @@ func IncrementWasmCounterWithExecuteMulti( // Parse funds argument. var funds []precompile.WasmBankCoin // blank funds - fundsJson, err := json.Marshal(funds) - s.NoErrorf(err, "fundsJson: %s", fundsJson) - err = json.Unmarshal(fundsJson, &funds) - s.Require().NoError(err, "fundsJson %s, funds %s", fundsJson, funds) - - // The "times" arg determines the number of messages in the executeMsgs slice - executeMsgs := []struct { - ContractAddr string `json:"contractAddr"` - MsgArgs []byte `json:"msgArgs"` - Funds []precompile.WasmBankCoin `json:"funds"` - }{ - {wasmContract.String(), msgArgsBz, funds}, - } - if times == 0 { - executeMsgs = executeMsgs[:0] // force empty - } else { - for i := uint(1); i < times; i++ { - executeMsgs = append(executeMsgs, executeMsgs[0]) - } - } - s.Require().Len(executeMsgs, int(times)) // sanity check assertion - - callArgs := []any{ - executeMsgs, - } - input, err := embeds.SmartContract_Wasm.ABI.Pack( - string(precompile.WasmMethod_executeMulti), - callArgs..., - ) - s.Require().NoError(err) - - ethTxResp, err := deps.EvmKeeper.CallContractWithInput( - deps.Ctx, - evmObj, - deps.Sender.EthAddr, - &precompile.PrecompileAddr_Wasm, - commit, - input, - WasmGasLimitExecute, - ) - s.Require().NoError(err) - s.Require().NotEmpty(ethTxResp.Ret) -} - -func IncrementWasmCounterWithExecuteMultiViaVMCall( - s *suite.Suite, - deps *evmtest.TestDeps, - wasmContract sdk.AccAddress, - times int, - finalizeTx bool, - evmObj *vm.EVM, -) error { - msgArgsBz := []byte(` - { - "increment": {} - } - `) - - // Parse funds argument. - var funds []precompile.WasmBankCoin // blank funds - fundsJson, err := json.Marshal(funds) - s.NoErrorf(err, "fundsJson: %s", fundsJson) - err = json.Unmarshal(fundsJson, &funds) - s.Require().NoError(err, "fundsJson %s, funds %s", fundsJson, funds) // The "times" arg determines the number of messages in the executeMsgs slice executeMsgs := []struct { @@ -348,7 +217,8 @@ func IncrementWasmCounterWithExecuteMultiViaVMCall( MsgArgs []byte `json:"msgArgs"` Funds []precompile.WasmBankCoin `json:"funds"` }{} - for i := 0; i < times; i++ { + + for i := uint(0); i < times; i++ { executeMsgs = append(executeMsgs, struct { ContractAddr string `json:"contractAddr"` MsgArgs []byte `json:"msgArgs"` @@ -362,12 +232,16 @@ func IncrementWasmCounterWithExecuteMultiViaVMCall( ) s.Require().NoError(err) - _, _, err = evmObj.Call( - vm.AccountRef(deps.Sender.EthAddr), - precompile.PrecompileAddr_Wasm, + evmObj, _ := deps.NewEVM() + ethTxResp, err := deps.EvmKeeper.CallContractWithInput( + deps.Ctx, + evmObj, + deps.Sender.EthAddr, + &precompile.PrecompileAddr_Wasm, + commit, contractInput, - serverconfig.DefaultEthCallGasLimit, - big.NewInt(0), + WasmGasLimitExecute, ) - return err + s.Require().NoError(err) + s.Require().NotEmpty(ethTxResp.Ret) } diff --git a/x/evm/precompile/wasm_test.go b/x/evm/precompile/wasm_test.go index 3bedd115b..16a81d802 100644 --- a/x/evm/precompile/wasm_test.go +++ b/x/evm/precompile/wasm_test.go @@ -10,6 +10,7 @@ import ( "github.com/NibiruChain/nibiru/v2/x/common/testutil" "github.com/NibiruChain/nibiru/v2/x/common/testutil/testapp" + "github.com/NibiruChain/nibiru/v2/x/evm" "github.com/NibiruChain/nibiru/v2/x/evm/embeds" "github.com/NibiruChain/nibiru/v2/x/evm/evmtest" "github.com/NibiruChain/nibiru/v2/x/evm/precompile" @@ -34,11 +35,48 @@ func TestWasmSuite(t *testing.T) { suite.Run(t, new(WasmSuite)) } -func (s *WasmSuite) TestExecuteHappy() { +func (s *WasmSuite) TestInstantiate() { deps := evmtest.NewTestDeps() evmObj, _ := deps.NewEVM() - wasmContracts := test.SetupWasmContracts(&deps, evmObj, &s.Suite) + test.SetupWasmContracts(&deps, &s.Suite) + + contractInput, err := embeds.SmartContract_Wasm.ABI.Pack( + string(precompile.WasmMethod_instantiate), + "", // admin + uint64(1), // codeId + []byte(`{}`), // instantiateMsg + "some non-empty label", // label + []precompile.WasmBankCoin{}, // funds + ) + s.Require().NoError(err) + + ethTxResp, err := deps.EvmKeeper.CallContractWithInput( + deps.Ctx, + evmObj, + deps.Sender.EthAddr, + &precompile.PrecompileAddr_Wasm, + true, + contractInput, + WasmGasLimitExecute, + ) + + s.Require().NoError(err) + s.Require().NotEmpty(ethTxResp.Ret) + + vals, err := embeds.SmartContract_Wasm.ABI.Unpack( + string(precompile.WasmMethod_instantiate), + ethTxResp.Ret, + ) + s.Require().NoError(err) + s.Require().NotEmpty(vals[0].(string)) +} + +func (s *WasmSuite) TestExecute() { + deps := evmtest.NewTestDeps() + evmObj, _ := deps.NewEVM() + + wasmContracts := test.SetupWasmContracts(&deps, &s.Suite) wasmContract := wasmContracts[0] // nibi_stargate.wasm s.Run("create denom", func() { @@ -50,17 +88,11 @@ func (s *WasmSuite) TestExecuteHappy() { } `) - var funds []precompile.WasmBankCoin - fundsJson, err := json.Marshal(funds) - s.NoErrorf(err, "fundsJson: %s", fundsJson) - err = json.Unmarshal(fundsJson, &funds) - s.Require().NoError(err, "fundsJson %s, funds %s", fundsJson, funds) - contractInput, err := embeds.SmartContract_Wasm.ABI.Pack( string(precompile.WasmMethod_execute), wasmContract.String(), msgArgsBz, - funds, + []precompile.WasmBankCoin{}, ) s.Require().NoError(err) ethTxResp, err := deps.EvmKeeper.CallContractWithInput( @@ -76,7 +108,6 @@ func (s *WasmSuite) TestExecuteHappy() { s.Require().NotEmpty(ethTxResp.Ret) }) - s.T().Log("Execute: mint tokens") s.Run("mint tokens", func() { coinDenom := tokenfactory.TFDenom{ Creator: wasmContract.String(), @@ -98,6 +129,7 @@ func (s *WasmSuite) TestExecuteHappy() { ) s.Require().NoError(err) + evmObj, _ = deps.NewEVM() ethTxResp, err := deps.EvmKeeper.CallContractWithInput( deps.Ctx, evmObj, @@ -115,82 +147,103 @@ func (s *WasmSuite) TestExecuteHappy() { }) } -func (s *WasmSuite) TestExecuteMultiHappy() { +func (s *WasmSuite) TestExecuteMulti() { deps := evmtest.NewTestDeps() - evmObj, _ := deps.NewEVM() - wasmContracts := test.SetupWasmContracts(&deps, evmObj, &s.Suite) + wasmContracts := test.SetupWasmContracts(&deps, &s.Suite) wasmContract := wasmContracts[1] // hello_world_counter.wasm // count = 0 - test.AssertWasmCounterState(&s.Suite, deps, evmObj, wasmContract, 0) + test.AssertWasmCounterState(&s.Suite, deps, wasmContract, 0) // count += 2 test.IncrementWasmCounterWithExecuteMulti( - &s.Suite, &deps, evmObj, wasmContract, 2, true) + &s.Suite, &deps, wasmContract, 2, true) // count = 2 - test.AssertWasmCounterState(&s.Suite, deps, evmObj, wasmContract, 2) - s.assertWasmCounterStateRaw(deps, wasmContract, 2) + test.AssertWasmCounterState(&s.Suite, deps, wasmContract, 2) // count += 67 test.IncrementWasmCounterWithExecuteMulti( - &s.Suite, &deps, evmObj, wasmContract, 67, true) + &s.Suite, &deps, wasmContract, 67, true) // count = 69 - test.AssertWasmCounterState(&s.Suite, deps, evmObj, wasmContract, 69) - s.assertWasmCounterStateRaw(deps, wasmContract, 69) + test.AssertWasmCounterState(&s.Suite, deps, wasmContract, 69) } -// From IWasm.query of Wasm.sol: -// -// ```solidity -// function queryRaw( -// string memory contractAddr, -// bytes memory key -// ) external view returns (bytes memory response); -// ``` -func (s *WasmSuite) assertWasmCounterStateRaw( - deps evmtest.TestDeps, - wasmContract sdk.AccAddress, - wantCount int64, -) { +func (s *WasmSuite) TestQueryRaw() { + deps := evmtest.NewTestDeps() + wasmContracts := test.SetupWasmContracts(&deps, &s.Suite) + wasmContract := wasmContracts[1] // hello_world_counter.wasm + contractInput, err := embeds.SmartContract_Wasm.ABI.Pack( string(precompile.WasmMethod_queryRaw), wasmContract.String(), []byte(`state`), ) s.Require().NoError(err) - evmObj, _ := deps.NewEVM() + evmObj, _ := deps.NewEVM() ethTxResp, err := deps.EvmKeeper.CallContractWithInput( deps.Ctx, evmObj, deps.Sender.EthAddr, &precompile.PrecompileAddr_Wasm, - true, + false, // commit contractInput, WasmGasLimitQuery, ) + s.Require().NoError(err) s.Require().NotEmpty(ethTxResp.Ret) - s.T().Log("Parse the response contract addr and response bytes") - s.T().Logf("ethTxResp.Ret: %s", ethTxResp.Ret) - var queryResp []byte err = embeds.SmartContract_Wasm.ABI.UnpackIntoInterface( &queryResp, string(precompile.WasmMethod_queryRaw), ethTxResp.Ret, ) + s.Require().NoError(err, "ethTxResp: %s", ethTxResp) + + var typedResp test.QueryMsgCountResp + s.NoError(json.Unmarshal(queryResp, &typedResp)) + s.EqualValues(0, typedResp.Count) + s.EqualValues(deps.Sender.NibiruAddr.String(), typedResp.Owner) +} + +func (s *WasmSuite) TestQuerySmart() { + deps := evmtest.NewTestDeps() + wasmContracts := test.SetupWasmContracts(&deps, &s.Suite) + wasmContract := wasmContracts[1] // hello_world_counter.wasm + + contractInput, err := embeds.SmartContract_Wasm.ABI.Pack( + string(precompile.WasmMethod_query), + wasmContract.String(), + []byte(`{"count": {}}`), + ) s.Require().NoError(err) - s.T().Logf("queryResp: %s", queryResp) - var wasmMsg wasm.RawContractMessage - s.NoError(wasmMsg.UnmarshalJSON(queryResp), queryResp) - s.T().Logf("wasmMsg: %s", wasmMsg) - s.NoError(wasmMsg.ValidateBasic()) + evmObj, _ := deps.NewEVM() + ethTxResp, err := deps.EvmKeeper.CallContractWithInput( + deps.Ctx, + evmObj, + deps.Sender.EthAddr, + &precompile.PrecompileAddr_Wasm, + false, // commit + contractInput, + WasmGasLimitQuery, + ) + + s.Require().NoError(err) + s.Require().NotEmpty(ethTxResp.Ret) + + var queryResp []byte + err = embeds.SmartContract_Wasm.ABI.UnpackIntoInterface( + &queryResp, + string(precompile.WasmMethod_query), + ethTxResp.Ret, + ) + s.Require().NoError(err, "ethTxResp: %s", ethTxResp) var typedResp test.QueryMsgCountResp - s.NoError(json.Unmarshal(wasmMsg, &typedResp)) - s.EqualValues(wantCount, typedResp.Count) - s.EqualValues(deps.Sender.NibiruAddr.String(), typedResp.Owner) + s.Require().NoError(json.Unmarshal(queryResp, &typedResp)) + s.Require().EqualValues(0, typedResp.Count) + s.Require().EqualValues(deps.Sender.NibiruAddr.String(), typedResp.Owner) } func (s *WasmSuite) TestSadArgsCount() { @@ -357,24 +410,23 @@ type WasmExecuteMsg struct { func (s *WasmSuite) TestExecuteMultiValidation() { deps := evmtest.NewTestDeps() - evmObj, _ := deps.NewEVM() s.Require().NoError(testapp.FundAccount( deps.App.BankKeeper, deps.Ctx, deps.Sender.NibiruAddr, - sdk.NewCoins(sdk.NewCoin("unibi", sdk.NewInt(100))), + sdk.NewCoins(sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(100))), )) - wasmContracts := test.SetupWasmContracts(&deps, evmObj, &s.Suite) + wasmContracts := test.SetupWasmContracts(&deps, &s.Suite) wasmContract := wasmContracts[1] // hello_world_counter.wasm - invalidMsgArgsBz := []byte(`{"invalid": "json"}`) // Invalid message format validMsgArgsBz := []byte(`{"increment": {}}`) // Valid increment message + invalidMsgArgsBz := []byte(`{"invalid": "json"}`) // Invalid message format var emptyFunds []precompile.WasmBankCoin validFunds := []precompile.WasmBankCoin{{ - Denom: "unibi", + Denom: evm.EVMBankDenom, Amount: big.NewInt(100), }} invalidFunds := []precompile.WasmBankCoin{{ @@ -500,11 +552,11 @@ func (s *WasmSuite) TestExecuteMultiPartialExecution() { deps := evmtest.NewTestDeps() evmObj, _ := deps.NewEVM() - wasmContracts := test.SetupWasmContracts(&deps, evmObj, &s.Suite) + wasmContracts := test.SetupWasmContracts(&deps, &s.Suite) wasmContract := wasmContracts[1] // hello_world_counter.wasm // First verify initial state is 0 - test.AssertWasmCounterState(&s.Suite, deps, evmObj, wasmContract, 0) + test.AssertWasmCounterState(&s.Suite, deps, wasmContract, 0) // Create a batch where the second message will fail validation executeMsgs := []WasmExecuteMsg{ @@ -540,5 +592,5 @@ func (s *WasmSuite) TestExecuteMultiPartialExecution() { s.Require().Contains(err.Error(), "unknown variant") // Verify that no state changes occurred - test.AssertWasmCounterState(&s.Suite, deps, evmObj, wasmContract, 0) + test.AssertWasmCounterState(&s.Suite, deps, wasmContract, 0) } diff --git a/x/evm/statedb/journal_test.go b/x/evm/statedb/journal_test.go index 27582e69f..0a5de0dfe 100644 --- a/x/evm/statedb/journal_test.go +++ b/x/evm/statedb/journal_test.go @@ -171,13 +171,13 @@ func (s *Suite) TestJournalReversion() { )) s.T().Log("Set up helloworldcounter.wasm") - wasmContracts := test.SetupWasmContracts(&deps, evmObj, &s.Suite) + wasmContracts := test.SetupWasmContracts(&deps, &s.Suite) helloWorldCounterWasm := wasmContracts[1] fmt.Printf("wasmContract: %s\n", helloWorldCounterWasm) s.T().Log("commitEvmTx=true, expect 0 dirty journal entries") test.IncrementWasmCounterWithExecuteMulti( - &s.Suite, &deps, evmObj, helloWorldCounterWasm, 7, true, + &s.Suite, &deps, helloWorldCounterWasm, 7, true, ) if stateDB.DebugDirtiesCount() != 0 { debugDirtiesCountMismatch(stateDB, s.T()) @@ -186,7 +186,7 @@ func (s *Suite) TestJournalReversion() { s.T().Log("commitEvmTx=false, expect dirty journal entries") test.IncrementWasmCounterWithExecuteMulti( - &s.Suite, &deps, evmObj, helloWorldCounterWasm, 5, false, + &s.Suite, &deps, helloWorldCounterWasm, 5, false, ) s.T().Log("Expect exactly 1 dirty journal entry for the precompile snapshot") if stateDB.DebugDirtiesCount() != 1 { @@ -196,23 +196,22 @@ func (s *Suite) TestJournalReversion() { s.T().Log("Expect to see the pending changes included") test.AssertWasmCounterState( - &s.Suite, deps, evmObj, helloWorldCounterWasm, 12, // 12 = 7 + 5 + &s.Suite, deps, helloWorldCounterWasm, 12, // 12 = 7 + 5 ) // NOTE: that the [StateDB.Commit] fn has not been called yet. We're still // mid-transaction. s.T().Log("EVM revert operation should bring about the old state") - err := test.IncrementWasmCounterWithExecuteMultiViaVMCall( - &s.Suite, &deps, helloWorldCounterWasm, 50, false, evmObj, + test.IncrementWasmCounterWithExecuteMulti( + &s.Suite, &deps, helloWorldCounterWasm, 50, false, ) - s.Require().NoError(err) s.T().Log(heredoc.Doc(`At this point, 2 precompile calls have succeeded. One that increments the counter to 7 + 5, and another for +50. The StateDB has not been committed. We expect to be able to revert to both snapshots and see the prior states.`)) test.AssertWasmCounterState( - &s.Suite, deps, evmObj, helloWorldCounterWasm, 7+5+50, + &s.Suite, deps, helloWorldCounterWasm, 7+5+50, ) errFn := common.TryCatch(func() { @@ -223,19 +222,18 @@ snapshots and see the prior states.`)) stateDB.RevertToSnapshot(5) test.AssertWasmCounterState( - &s.Suite, deps, evmObj, helloWorldCounterWasm, 7+5, + &s.Suite, deps, helloWorldCounterWasm, 7+5, ) stateDB.RevertToSnapshot(3) test.AssertWasmCounterState( - &s.Suite, deps, evmObj, helloWorldCounterWasm, 7, // state before precompile called + &s.Suite, deps, helloWorldCounterWasm, 7, // state before precompile called ) - err = stateDB.Commit() - s.Require().NoError(err) + s.Require().NoError(stateDB.Commit()) s.Require().EqualValues(0, stateDB.DebugDirtiesCount()) test.AssertWasmCounterState( - &s.Suite, deps, evmObj, helloWorldCounterWasm, 7, // state before precompile called + &s.Suite, deps, helloWorldCounterWasm, 7, // state before precompile called ) } From 43ee0808e2e5f269ddb8265b3d910bd316c893e3 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 21 Jan 2025 13:46:42 -0800 Subject: [PATCH 04/15] Update export.go --- x/evm/precompile/test/export.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/x/evm/precompile/test/export.go b/x/evm/precompile/test/export.go index 1fce5969c..2c93dc411 100644 --- a/x/evm/precompile/test/export.go +++ b/x/evm/precompile/test/export.go @@ -208,9 +208,6 @@ func IncrementWasmCounterWithExecuteMulti( } `) - // Parse funds argument. - var funds []precompile.WasmBankCoin // blank funds - // The "times" arg determines the number of messages in the executeMsgs slice executeMsgs := []struct { ContractAddr string `json:"contractAddr"` @@ -223,7 +220,7 @@ func IncrementWasmCounterWithExecuteMulti( ContractAddr string `json:"contractAddr"` MsgArgs []byte `json:"msgArgs"` Funds []precompile.WasmBankCoin `json:"funds"` - }{wasmContract.String(), msgArgsBz, funds}) + }{wasmContract.String(), msgArgsBz, []precompile.WasmBankCoin{}}) } contractInput, err := embeds.SmartContract_Wasm.ABI.Pack( From a641633aba99758c71a0a3d03e4509955830b28b Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 21 Jan 2025 13:47:57 -0800 Subject: [PATCH 05/15] Update debug.go --- x/evm/statedb/debug.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/x/evm/statedb/debug.go b/x/evm/statedb/debug.go index c2b5fb968..3927e4a5d 100644 --- a/x/evm/statedb/debug.go +++ b/x/evm/statedb/debug.go @@ -22,12 +22,6 @@ func (s *StateDB) DebugDirties() map[common.Address]int { return s.Journal.dirties } -// DebugEntries is a test helper that returns the sequence of [JournalChange] -// objects added during execution. -func (s *StateDB) DebugEntries() []JournalChange { - return s.Journal.entries -} - // DebugStateObjects is a test helper that returns returns a copy of the // [StateDB.stateObjects] map. func (s *StateDB) DebugStateObjects() map[common.Address]*stateObject { From c66d0cf2b08eb5c8ae95d349b5cab670900feb3f Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 22 Jan 2025 12:23:32 -0800 Subject: [PATCH 06/15] fix: TestJournalReversion --- x/evm/precompile/test/export.go | 49 ++++++++++++++++++++++++++++++++- x/evm/statedb/journal_test.go | 36 +++++++++++++----------- 2 files changed, 68 insertions(+), 17 deletions(-) diff --git a/x/evm/precompile/test/export.go b/x/evm/precompile/test/export.go index 2c93dc411..dc2e775d6 100644 --- a/x/evm/precompile/test/export.go +++ b/x/evm/precompile/test/export.go @@ -10,6 +10,7 @@ import ( wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" wasm "github.com/CosmWasm/wasmd/x/wasm/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/ethereum/go-ethereum/core/vm" "github.com/stretchr/testify/suite" "github.com/NibiruChain/nibiru/v2/app" @@ -152,6 +153,52 @@ func AssertWasmCounterState( s.EqualValues(deps.Sender.NibiruAddr.String(), typedResp.Owner) } +func AssertWasmCounterStateWithEvm( + s *suite.Suite, + deps evmtest.TestDeps, + evmObj *vm.EVM, + wasmContract sdk.AccAddress, + wantCount int64, +) { + msgArgsBz := []byte(` + { + "count": {} + } + `) + + contractInput, err := embeds.SmartContract_Wasm.ABI.Pack( + string(precompile.WasmMethod_query), + wasmContract.String(), + msgArgsBz, + ) + s.Require().NoError(err) + + evmResp, err := deps.EvmKeeper.CallContractWithInput( + deps.Ctx, + evmObj, + deps.Sender.EthAddr, + &precompile.PrecompileAddr_Wasm, + false, + contractInput, + WasmGasLimitQuery, + ) + s.Require().NoError(err) + s.Require().NotEmpty(evmResp.Ret) + + var queryResp []byte + s.NoError(embeds.SmartContract_Wasm.ABI.UnpackIntoInterface( + &queryResp, + string(precompile.WasmMethod_query), + evmResp.Ret, + )) + + var typedResp QueryMsgCountResp + s.NoError(json.Unmarshal(queryResp, &typedResp)) + + s.EqualValues(wantCount, typedResp.Count) + s.EqualValues(deps.Sender.NibiruAddr.String(), typedResp.Owner) +} + // Result of QueryMsg::Count from the [hello_world_counter] Wasm contract: // // ```rust @@ -198,6 +245,7 @@ type QueryMsgCountResp struct { func IncrementWasmCounterWithExecuteMulti( s *suite.Suite, deps *evmtest.TestDeps, + evmObj *vm.EVM, wasmContract sdk.AccAddress, times uint, commit bool, @@ -229,7 +277,6 @@ func IncrementWasmCounterWithExecuteMulti( ) s.Require().NoError(err) - evmObj, _ := deps.NewEVM() ethTxResp, err := deps.EvmKeeper.CallContractWithInput( deps.Ctx, evmObj, diff --git a/x/evm/statedb/journal_test.go b/x/evm/statedb/journal_test.go index 0a5de0dfe..e10505a00 100644 --- a/x/evm/statedb/journal_test.go +++ b/x/evm/statedb/journal_test.go @@ -161,8 +161,6 @@ func (s *Suite) TestContractCallsAnotherContract() { func (s *Suite) TestJournalReversion() { deps := evmtest.NewTestDeps() - evmObj, _ := deps.NewEVM() - stateDB := evmObj.StateDB.(*statedb.StateDB) s.Require().NoError(testapp.FundAccount( deps.App.BankKeeper, deps.Ctx, @@ -176,8 +174,9 @@ func (s *Suite) TestJournalReversion() { fmt.Printf("wasmContract: %s\n", helloWorldCounterWasm) s.T().Log("commitEvmTx=true, expect 0 dirty journal entries") + evmObj, stateDB := deps.NewEVM() test.IncrementWasmCounterWithExecuteMulti( - &s.Suite, &deps, helloWorldCounterWasm, 7, true, + &s.Suite, &deps, evmObj, helloWorldCounterWasm, 7, true, ) if stateDB.DebugDirtiesCount() != 0 { debugDirtiesCountMismatch(stateDB, s.T()) @@ -185,8 +184,9 @@ func (s *Suite) TestJournalReversion() { } s.T().Log("commitEvmTx=false, expect dirty journal entries") + evmObj, stateDB = deps.NewEVM() test.IncrementWasmCounterWithExecuteMulti( - &s.Suite, &deps, helloWorldCounterWasm, 5, false, + &s.Suite, &deps, evmObj, helloWorldCounterWasm, 5, false, ) s.T().Log("Expect exactly 1 dirty journal entry for the precompile snapshot") if stateDB.DebugDirtiesCount() != 1 { @@ -194,9 +194,13 @@ func (s *Suite) TestJournalReversion() { s.FailNowf("statedb dirty count mismatch", "expected 1 dirty journal change, but instead got: %d", stateDB.DebugDirtiesCount()) } - s.T().Log("Expect to see the pending changes included") + s.T().Log("Expect to see the pending changes included in the EVM context") + test.AssertWasmCounterStateWithEvm( + &s.Suite, deps, evmObj, helloWorldCounterWasm, 7+5, + ) + s.T().Log("Expect to see the pending changes not included in cosmos ctx") test.AssertWasmCounterState( - &s.Suite, deps, helloWorldCounterWasm, 12, // 12 = 7 + 5 + &s.Suite, deps, helloWorldCounterWasm, 7, ) // NOTE: that the [StateDB.Commit] fn has not been called yet. We're still @@ -204,14 +208,14 @@ func (s *Suite) TestJournalReversion() { s.T().Log("EVM revert operation should bring about the old state") test.IncrementWasmCounterWithExecuteMulti( - &s.Suite, &deps, helloWorldCounterWasm, 50, false, + &s.Suite, &deps, evmObj, helloWorldCounterWasm, 50, false, ) s.T().Log(heredoc.Doc(`At this point, 2 precompile calls have succeeded. One that increments the counter to 7 + 5, and another for +50. The StateDB has not been committed. We expect to be able to revert to both snapshots and see the prior states.`)) - test.AssertWasmCounterState( - &s.Suite, deps, helloWorldCounterWasm, 7+5+50, + test.AssertWasmCounterStateWithEvm( + &s.Suite, deps, evmObj, helloWorldCounterWasm, 7+5+50, ) errFn := common.TryCatch(func() { @@ -220,20 +224,20 @@ snapshots and see the prior states.`)) }) s.Require().ErrorContains(errFn(), "revision id 9000 cannot be reverted") - stateDB.RevertToSnapshot(5) - test.AssertWasmCounterState( - &s.Suite, deps, helloWorldCounterWasm, 7+5, + stateDB.RevertToSnapshot(2) + test.AssertWasmCounterStateWithEvm( + &s.Suite, deps, evmObj, helloWorldCounterWasm, 7+5, ) - stateDB.RevertToSnapshot(3) - test.AssertWasmCounterState( - &s.Suite, deps, helloWorldCounterWasm, 7, // state before precompile called + stateDB.RevertToSnapshot(0) + test.AssertWasmCounterStateWithEvm( + &s.Suite, deps, evmObj, helloWorldCounterWasm, 7, ) s.Require().NoError(stateDB.Commit()) s.Require().EqualValues(0, stateDB.DebugDirtiesCount()) test.AssertWasmCounterState( - &s.Suite, deps, helloWorldCounterWasm, 7, // state before precompile called + &s.Suite, deps, helloWorldCounterWasm, 7, ) } From e850154cf861403b3a2089a288e9ca2880241ef6 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 22 Jan 2025 13:39:43 -0800 Subject: [PATCH 07/15] test(evm): add dirty state attack tests --- .../TestDirtyStateAttack1.json | 40 +++ .../TestDirtyStateAttack2.json | 40 +++ .../TestDirtyStateAttack3.json | 58 ++++ .../contracts/TestDirtyStateAttack1.sol | 34 +++ .../contracts/TestDirtyStateAttack2.sol | 37 +++ .../contracts/TestDirtyStateAttack3.sol | 53 ++++ x/evm/embeds/embeds.go | 26 +- x/evm/keeper/funtoken_from_coin_test.go | 289 +++++++++++++++++- 8 files changed, 574 insertions(+), 3 deletions(-) create mode 100644 x/evm/embeds/artifacts/contracts/TestDirtyStateAttack1.sol/TestDirtyStateAttack1.json create mode 100644 x/evm/embeds/artifacts/contracts/TestDirtyStateAttack2.sol/TestDirtyStateAttack2.json create mode 100644 x/evm/embeds/artifacts/contracts/TestDirtyStateAttack3.sol/TestDirtyStateAttack3.json create mode 100644 x/evm/embeds/contracts/TestDirtyStateAttack1.sol create mode 100644 x/evm/embeds/contracts/TestDirtyStateAttack2.sol create mode 100644 x/evm/embeds/contracts/TestDirtyStateAttack3.sol diff --git a/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack1.sol/TestDirtyStateAttack1.json b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack1.sol/TestDirtyStateAttack1.json new file mode 100644 index 000000000..190d3dc8a --- /dev/null +++ b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack1.sol/TestDirtyStateAttack1.json @@ -0,0 +1,40 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TestDirtyStateAttack1", + "sourceName": "contracts/TestDirtyStateAttack1.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "erc20_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "sendRecipient", + "type": "address" + }, + { + "internalType": "string", + "name": "bech32Recipient", + "type": "string" + } + ], + "name": "attack", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506040516107da3803806107da833981810160405281019061003291906100db565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610108565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a88261007d565b9050919050565b6100b88161009d565b81146100c357600080fd5b50565b6000815190506100d5816100af565b92915050565b6000602082840312156100f1576100f0610078565b5b60006100ff848285016100c6565b91505092915050565b6106c3806101176000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e655beb414610030575b600080fd5b61004a6004803603810190610045919061040f565b61004c565b005b60008273ffffffffffffffffffffffffffffffffffffffff166108fc678ac7230489e800009081150290604051600060405180830381858888f193505050509050806100cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c4906104c8565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16629896808560405160240161012093929190610590565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101aa9190610615565b6000604051808303816000865af19150503d80600081146101e7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ec565b606091505b505090508060405160200161020090610652565b60405160208183030381529060405290610250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610247919061066b565b60405180910390fd5b5050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102968261026b565b9050919050565b6102a68161028b565b81146102b157600080fd5b50565b6000813590506102c38161029d565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61031c826102d3565b810181811067ffffffffffffffff8211171561033b5761033a6102e4565b5b80604052505050565b600061034e610257565b905061035a8282610313565b919050565b600067ffffffffffffffff82111561037a576103796102e4565b5b610383826102d3565b9050602081019050919050565b82818337600083830152505050565b60006103b26103ad8461035f565b610344565b9050828152602081018484840111156103ce576103cd6102ce565b5b6103d9848285610390565b509392505050565b600082601f8301126103f6576103f56102c9565b5b813561040684826020860161039f565b91505092915050565b6000806040838503121561042657610425610261565b5b6000610434858286016102b4565b925050602083013567ffffffffffffffff81111561045557610454610266565b5b610461858286016103e1565b9150509250929050565b600082825260208201905092915050565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b60006104b260148361046b565b91506104bd8261047c565b602082019050919050565b600060208201905081810360008301526104e1816104a5565b9050919050565b60006104f38261026b565b9050919050565b610503816104e8565b82525050565b6000819050919050565b61051c81610509565b82525050565b600081519050919050565b60005b8381101561054b578082015181840152602081019050610530565b60008484015250505050565b600061056282610522565b61056c818561046b565b935061057c81856020860161052d565b610585816102d3565b840191505092915050565b60006060820190506105a560008301866104fa565b6105b26020830185610513565b81810360408301526105c48184610557565b9050949350505050565b600081519050919050565b600081905092915050565b60006105ef826105ce565b6105f981856105d9565b935061060981856020860161052d565b80840191505092915050565b600061062182846105e4565b915081905092915050565b7f4661696c656420746f2063616c6c2062616e6b53656e64000000000000000000815250565b600061065d8261062c565b601782019150819050919050565b600060208201905081810360008301526106858184610557565b90509291505056fea2646970667358221220b1d6754ff01a90b91186ccf26633cba5add088b2b0240f20b7d32cd876e2820764736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e655beb414610030575b600080fd5b61004a6004803603810190610045919061040f565b61004c565b005b60008273ffffffffffffffffffffffffffffffffffffffff166108fc678ac7230489e800009081150290604051600060405180830381858888f193505050509050806100cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c4906104c8565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16629896808560405160240161012093929190610590565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101aa9190610615565b6000604051808303816000865af19150503d80600081146101e7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ec565b606091505b505090508060405160200161020090610652565b60405160208183030381529060405290610250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610247919061066b565b60405180910390fd5b5050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102968261026b565b9050919050565b6102a68161028b565b81146102b157600080fd5b50565b6000813590506102c38161029d565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61031c826102d3565b810181811067ffffffffffffffff8211171561033b5761033a6102e4565b5b80604052505050565b600061034e610257565b905061035a8282610313565b919050565b600067ffffffffffffffff82111561037a576103796102e4565b5b610383826102d3565b9050602081019050919050565b82818337600083830152505050565b60006103b26103ad8461035f565b610344565b9050828152602081018484840111156103ce576103cd6102ce565b5b6103d9848285610390565b509392505050565b600082601f8301126103f6576103f56102c9565b5b813561040684826020860161039f565b91505092915050565b6000806040838503121561042657610425610261565b5b6000610434858286016102b4565b925050602083013567ffffffffffffffff81111561045557610454610266565b5b610461858286016103e1565b9150509250929050565b600082825260208201905092915050565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b60006104b260148361046b565b91506104bd8261047c565b602082019050919050565b600060208201905081810360008301526104e1816104a5565b9050919050565b60006104f38261026b565b9050919050565b610503816104e8565b82525050565b6000819050919050565b61051c81610509565b82525050565b600081519050919050565b60005b8381101561054b578082015181840152602081019050610530565b60008484015250505050565b600061056282610522565b61056c818561046b565b935061057c81856020860161052d565b610585816102d3565b840191505092915050565b60006060820190506105a560008301866104fa565b6105b26020830185610513565b81810360408301526105c48184610557565b9050949350505050565b600081519050919050565b600081905092915050565b60006105ef826105ce565b6105f981856105d9565b935061060981856020860161052d565b80840191505092915050565b600061062182846105e4565b915081905092915050565b7f4661696c656420746f2063616c6c2062616e6b53656e64000000000000000000815250565b600061065d8261062c565b601782019150819050919050565b600060208201905081810360008301526106858184610557565b90509291505056fea2646970667358221220b1d6754ff01a90b91186ccf26633cba5add088b2b0240f20b7d32cd876e2820764736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack2.sol/TestDirtyStateAttack2.json b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack2.sol/TestDirtyStateAttack2.json new file mode 100644 index 000000000..f463fec12 --- /dev/null +++ b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack2.sol/TestDirtyStateAttack2.json @@ -0,0 +1,40 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TestDirtyStateAttack2", + "sourceName": "contracts/TestDirtyStateAttack2.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "erc20_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "sendRecipient", + "type": "address" + }, + { + "internalType": "string", + "name": "bech32Recipient", + "type": "string" + } + ], + "name": "attack", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610960380380610960833981810160405281019061003291906100db565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610108565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a88261007d565b9050919050565b6100b88161009d565b81146100c357600080fd5b50565b6000815190506100d5816100af565b92915050565b6000602082840312156100f1576100f0610078565b5b60006100ff848285016100c6565b91505092915050565b610849806101176000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e655beb414610030575b600080fd5b61004a6004803603810190610045919061046d565b61004c565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83620f42406040518363ffffffff1660e01b81526004016100aa92919061056d565b6020604051808303816000875af11580156100c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ed91906105ce565b61012c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012390610658565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16628954408460405160240161017f93929190610716565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610209919061079b565b6000604051808303816000865af19150503d8060008114610246576040519150601f19603f3d011682016040523d82523d6000602084013e61024b565b606091505b505090508060405160200161025f906107d8565b604051602081830303815290604052906102af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102a691906107f1565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102f4826102c9565b9050919050565b610304816102e9565b811461030f57600080fd5b50565b600081359050610321816102fb565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61037a82610331565b810181811067ffffffffffffffff8211171561039957610398610342565b5b80604052505050565b60006103ac6102b5565b90506103b88282610371565b919050565b600067ffffffffffffffff8211156103d8576103d7610342565b5b6103e182610331565b9050602081019050919050565b82818337600083830152505050565b600061041061040b846103bd565b6103a2565b90508281526020810184848401111561042c5761042b61032c565b5b6104378482856103ee565b509392505050565b600082601f83011261045457610453610327565b5b81356104648482602086016103fd565b91505092915050565b60008060408385031215610484576104836102bf565b5b600061049285828601610312565b925050602083013567ffffffffffffffff8111156104b3576104b26102c4565b5b6104bf8582860161043f565b9150509250929050565b6000819050919050565b60006104ee6104e96104e4846102c9565b6104c9565b6102c9565b9050919050565b6000610500826104d3565b9050919050565b6000610512826104f5565b9050919050565b61052281610507565b82525050565b6000819050919050565b6000819050919050565b600061055761055261054d84610528565b6104c9565b610532565b9050919050565b6105678161053c565b82525050565b60006040820190506105826000830185610519565b61058f602083018461055e565b9392505050565b60008115159050919050565b6105ab81610596565b81146105b657600080fd5b50565b6000815190506105c8816105a2565b92915050565b6000602082840312156105e4576105e36102bf565b5b60006105f2848285016105b9565b91505092915050565b600082825260208201905092915050565b7f4552432d3230207472616e73666572206661696c656400000000000000000000600082015250565b60006106426016836105fb565b915061064d8261060c565b602082019050919050565b6000602082019050818103600083015261067181610635565b9050919050565b6000610683826102c9565b9050919050565b61069381610678565b82525050565b6106a281610532565b82525050565b600081519050919050565b60005b838110156106d15780820151818401526020810190506106b6565b60008484015250505050565b60006106e8826106a8565b6106f281856105fb565b93506107028185602086016106b3565b61070b81610331565b840191505092915050565b600060608201905061072b600083018661068a565b6107386020830185610699565b818103604083015261074a81846106dd565b9050949350505050565b600081519050919050565b600081905092915050565b600061077582610754565b61077f818561075f565b935061078f8185602086016106b3565b80840191505092915050565b60006107a7828461076a565b915081905092915050565b7f4661696c656420746f2063616c6c2073656e64546f42616e6b00000000000000815250565b60006107e3826107b2565b601982019150819050919050565b6000602082019050818103600083015261080b81846106dd565b90509291505056fea2646970667358221220f7c1135bb3f393a158817da7f32fcaeb3d691627a2718c4344d6401ed4e4d4a064736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e655beb414610030575b600080fd5b61004a6004803603810190610045919061046d565b61004c565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83620f42406040518363ffffffff1660e01b81526004016100aa92919061056d565b6020604051808303816000875af11580156100c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ed91906105ce565b61012c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012390610658565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16628954408460405160240161017f93929190610716565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610209919061079b565b6000604051808303816000865af19150503d8060008114610246576040519150601f19603f3d011682016040523d82523d6000602084013e61024b565b606091505b505090508060405160200161025f906107d8565b604051602081830303815290604052906102af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102a691906107f1565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102f4826102c9565b9050919050565b610304816102e9565b811461030f57600080fd5b50565b600081359050610321816102fb565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61037a82610331565b810181811067ffffffffffffffff8211171561039957610398610342565b5b80604052505050565b60006103ac6102b5565b90506103b88282610371565b919050565b600067ffffffffffffffff8211156103d8576103d7610342565b5b6103e182610331565b9050602081019050919050565b82818337600083830152505050565b600061041061040b846103bd565b6103a2565b90508281526020810184848401111561042c5761042b61032c565b5b6104378482856103ee565b509392505050565b600082601f83011261045457610453610327565b5b81356104648482602086016103fd565b91505092915050565b60008060408385031215610484576104836102bf565b5b600061049285828601610312565b925050602083013567ffffffffffffffff8111156104b3576104b26102c4565b5b6104bf8582860161043f565b9150509250929050565b6000819050919050565b60006104ee6104e96104e4846102c9565b6104c9565b6102c9565b9050919050565b6000610500826104d3565b9050919050565b6000610512826104f5565b9050919050565b61052281610507565b82525050565b6000819050919050565b6000819050919050565b600061055761055261054d84610528565b6104c9565b610532565b9050919050565b6105678161053c565b82525050565b60006040820190506105826000830185610519565b61058f602083018461055e565b9392505050565b60008115159050919050565b6105ab81610596565b81146105b657600080fd5b50565b6000815190506105c8816105a2565b92915050565b6000602082840312156105e4576105e36102bf565b5b60006105f2848285016105b9565b91505092915050565b600082825260208201905092915050565b7f4552432d3230207472616e73666572206661696c656400000000000000000000600082015250565b60006106426016836105fb565b915061064d8261060c565b602082019050919050565b6000602082019050818103600083015261067181610635565b9050919050565b6000610683826102c9565b9050919050565b61069381610678565b82525050565b6106a281610532565b82525050565b600081519050919050565b60005b838110156106d15780820151818401526020810190506106b6565b60008484015250505050565b60006106e8826106a8565b6106f281856105fb565b93506107028185602086016106b3565b61070b81610331565b840191505092915050565b600060608201905061072b600083018661068a565b6107386020830185610699565b818103604083015261074a81846106dd565b9050949350505050565b600081519050919050565b600081905092915050565b600061077582610754565b61077f818561075f565b935061078f8185602086016106b3565b80840191505092915050565b60006107a7828461076a565b915081905092915050565b7f4661696c656420746f2063616c6c2073656e64546f42616e6b00000000000000815250565b60006107e3826107b2565b601982019150819050919050565b6000602082019050818103600083015261080b81846106dd565b90509291505056fea2646970667358221220f7c1135bb3f393a158817da7f32fcaeb3d691627a2718c4344d6401ed4e4d4a064736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack3.sol/TestDirtyStateAttack3.json b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack3.sol/TestDirtyStateAttack3.json new file mode 100644 index 000000000..9b232ec8f --- /dev/null +++ b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack3.sol/TestDirtyStateAttack3.json @@ -0,0 +1,58 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TestDirtyStateAttack3", + "sourceName": "contracts/TestDirtyStateAttack3.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "erc20_", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "sendRecipient", + "type": "address" + }, + { + "internalType": "string", + "name": "bech32Recipient", + "type": "string" + } + ], + "name": "attack", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "sendRecipient", + "type": "address" + }, + { + "internalType": "string", + "name": "bech32Recipient", + "type": "string" + } + ], + "name": "transferFunds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6080604052600060015560405161094c38038061094c833981810160405281019061002a91906100d3565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610100565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a082610075565b9050919050565b6100b081610095565b81146100bb57600080fd5b50565b6000815190506100cd816100a7565b92915050565b6000602082840312156100e9576100e8610070565b5b60006100f7848285016100be565b91505092915050565b61083d8061010f6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631054aea21461003b578063e655beb414610057575b600080fd5b610055600480360381019061005091906104d3565b610073565b005b610071600480360381019061006c91906104d3565b610277565b005b8173ffffffffffffffffffffffffffffffffffffffff166108fc678ac7230489e800009081150290604051600060405180830381858888f193505050506100ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e69061058c565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16629896808460405160240161014293929190610654565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101cc91906106d9565b6000604051808303816000865af19150503d8060008114610209576040519150601f19603f3d011682016040523d82523d6000602084013e61020e565b606091505b505090508060405160200161022290610716565b60405160208183030381529060405290610272576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610269919061072f565b60405180910390fd5b600080fd5b6001600081548092919061028a90610780565b91905055503073ffffffffffffffffffffffffffffffffffffffff16631054aea283836040518363ffffffff1660e01b81526004016102ca9291906107d7565b600060405180830381600087803b1580156102e457600080fd5b505af19250505080156102f5575060015b610316576001600081548092919061030c90610780565b9190505550610317565b5b5050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061035a8261032f565b9050919050565b61036a8161034f565b811461037557600080fd5b50565b60008135905061038781610361565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6103e082610397565b810181811067ffffffffffffffff821117156103ff576103fe6103a8565b5b80604052505050565b600061041261031b565b905061041e82826103d7565b919050565b600067ffffffffffffffff82111561043e5761043d6103a8565b5b61044782610397565b9050602081019050919050565b82818337600083830152505050565b600061047661047184610423565b610408565b90508281526020810184848401111561049257610491610392565b5b61049d848285610454565b509392505050565b600082601f8301126104ba576104b961038d565b5b81356104ca848260208601610463565b91505092915050565b600080604083850312156104ea576104e9610325565b5b60006104f885828601610378565b925050602083013567ffffffffffffffff8111156105195761051861032a565b5b610525858286016104a5565b9150509250929050565b600082825260208201905092915050565b7f455448207472616e73666572206661696c656400000000000000000000000000600082015250565b600061057660138361052f565b915061058182610540565b602082019050919050565b600060208201905081810360008301526105a581610569565b9050919050565b60006105b78261032f565b9050919050565b6105c7816105ac565b82525050565b6000819050919050565b6105e0816105cd565b82525050565b600081519050919050565b60005b8381101561060f5780820151818401526020810190506105f4565b60008484015250505050565b6000610626826105e6565b610630818561052f565b93506106408185602086016105f1565b61064981610397565b840191505092915050565b600060608201905061066960008301866105be565b61067660208301856105d7565b8181036040830152610688818461061b565b9050949350505050565b600081519050919050565b600081905092915050565b60006106b382610692565b6106bd818561069d565b93506106cd8185602086016105f1565b80840191505092915050565b60006106e582846106a8565b915081905092915050565b7f4661696c656420746f2063616c6c2062616e6b53656e64000000000000000000815250565b6000610721826106f0565b601782019150819050919050565b60006020820190508181036000830152610749818461061b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061078b826105cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036107bd576107bc610751565b5b600182019050919050565b6107d18161034f565b82525050565b60006040820190506107ec60008301856107c8565b81810360208301526107fe818461061b565b9050939250505056fea2646970667358221220c3d57175350dbc81f4b427386910dce09422042c0b464bd34bfcdb6940a4715964736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80631054aea21461003b578063e655beb414610057575b600080fd5b610055600480360381019061005091906104d3565b610073565b005b610071600480360381019061006c91906104d3565b610277565b005b8173ffffffffffffffffffffffffffffffffffffffff166108fc678ac7230489e800009081150290604051600060405180830381858888f193505050506100ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e69061058c565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16629896808460405160240161014293929190610654565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101cc91906106d9565b6000604051808303816000865af19150503d8060008114610209576040519150601f19603f3d011682016040523d82523d6000602084013e61020e565b606091505b505090508060405160200161022290610716565b60405160208183030381529060405290610272576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610269919061072f565b60405180910390fd5b600080fd5b6001600081548092919061028a90610780565b91905055503073ffffffffffffffffffffffffffffffffffffffff16631054aea283836040518363ffffffff1660e01b81526004016102ca9291906107d7565b600060405180830381600087803b1580156102e457600080fd5b505af19250505080156102f5575060015b610316576001600081548092919061030c90610780565b9190505550610317565b5b5050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061035a8261032f565b9050919050565b61036a8161034f565b811461037557600080fd5b50565b60008135905061038781610361565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6103e082610397565b810181811067ffffffffffffffff821117156103ff576103fe6103a8565b5b80604052505050565b600061041261031b565b905061041e82826103d7565b919050565b600067ffffffffffffffff82111561043e5761043d6103a8565b5b61044782610397565b9050602081019050919050565b82818337600083830152505050565b600061047661047184610423565b610408565b90508281526020810184848401111561049257610491610392565b5b61049d848285610454565b509392505050565b600082601f8301126104ba576104b961038d565b5b81356104ca848260208601610463565b91505092915050565b600080604083850312156104ea576104e9610325565b5b60006104f885828601610378565b925050602083013567ffffffffffffffff8111156105195761051861032a565b5b610525858286016104a5565b9150509250929050565b600082825260208201905092915050565b7f455448207472616e73666572206661696c656400000000000000000000000000600082015250565b600061057660138361052f565b915061058182610540565b602082019050919050565b600060208201905081810360008301526105a581610569565b9050919050565b60006105b78261032f565b9050919050565b6105c7816105ac565b82525050565b6000819050919050565b6105e0816105cd565b82525050565b600081519050919050565b60005b8381101561060f5780820151818401526020810190506105f4565b60008484015250505050565b6000610626826105e6565b610630818561052f565b93506106408185602086016105f1565b61064981610397565b840191505092915050565b600060608201905061066960008301866105be565b61067660208301856105d7565b8181036040830152610688818461061b565b9050949350505050565b600081519050919050565b600081905092915050565b60006106b382610692565b6106bd818561069d565b93506106cd8185602086016105f1565b80840191505092915050565b60006106e582846106a8565b915081905092915050565b7f4661696c656420746f2063616c6c2062616e6b53656e64000000000000000000815250565b6000610721826106f0565b601782019150819050919050565b60006020820190508181036000830152610749818461061b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061078b826105cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036107bd576107bc610751565b5b600182019050919050565b6107d18161034f565b82525050565b60006040820190506107ec60008301856107c8565b81810360208301526107fe818461061b565b9050939250505056fea2646970667358221220c3d57175350dbc81f4b427386910dce09422042c0b464bd34bfcdb6940a4715964736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/x/evm/embeds/contracts/TestDirtyStateAttack1.sol b/x/evm/embeds/contracts/TestDirtyStateAttack1.sol new file mode 100644 index 000000000..93b7bb763 --- /dev/null +++ b/x/evm/embeds/contracts/TestDirtyStateAttack1.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; +import "./IFunToken.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; + +contract TestDirtyStateAttack1 { + address erc20; + + constructor(address erc20_) { + erc20 = erc20_; + } + + function attack( + address payable sendRecipient, + string memory bech32Recipient + ) public { + bool isSent = sendRecipient.send(10 ether); // 10 NIBI + require(isSent, "Failed to send ether"); + + (bool success, ) = FUNTOKEN_PRECOMPILE_ADDRESS.call( + abi.encodeWithSignature( + "sendToBank(address,uint256,string)", + erc20, + uint256(10e6), // 10 WNIBI + bech32Recipient + ) + ); + + require(success, string.concat("Failed to call bankSend")); + } +} diff --git a/x/evm/embeds/contracts/TestDirtyStateAttack2.sol b/x/evm/embeds/contracts/TestDirtyStateAttack2.sol new file mode 100644 index 000000000..04a13931f --- /dev/null +++ b/x/evm/embeds/contracts/TestDirtyStateAttack2.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; +import "./IFunToken.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract TestDirtyStateAttack2 { + address erc20; + + constructor(address erc20_) { + erc20 = erc20_; + } + + function attack( + address payable sendRecipient, + string memory bech32Recipient + ) public { + require( + ERC20(erc20).transfer(sendRecipient, 1e6), // 1 WNIBI + "ERC-20 transfer failed" + ); + + (bool success, ) = FUNTOKEN_PRECOMPILE_ADDRESS.call( + abi.encodeWithSignature( + "sendToBank(address,uint256,string)", + erc20, + uint256(9e6), // 9 WNIBI + bech32Recipient + ) + ); + + require(success, string.concat("Failed to call sendToBank")); + } +} diff --git a/x/evm/embeds/contracts/TestDirtyStateAttack3.sol b/x/evm/embeds/contracts/TestDirtyStateAttack3.sol new file mode 100644 index 000000000..16730b2de --- /dev/null +++ b/x/evm/embeds/contracts/TestDirtyStateAttack3.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; +import "./IFunToken.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract TestDirtyStateAttack3 { + address erc20; + uint counter = 0; + + constructor(address erc20_) payable { + erc20 = erc20_; + } + + function attack( + address payable sendRecipient, + string memory bech32Recipient + ) external { + counter++; + try + TestDirtyStateAttack3(payable(address(this))).transferFunds( + sendRecipient, + bech32Recipient + ) + {} catch + { + counter++; + } + } + + function transferFunds( + address payable sendRecipient, + string memory bech32Recipient + ) external { + require(sendRecipient.send(10 ether), "ETH transfer failed"); // 10 NIBI + + (bool success, ) = FUNTOKEN_PRECOMPILE_ADDRESS.call( + abi.encodeWithSignature( + "sendToBank(address,uint256,string)", + erc20, + uint256(10e6), // 10 WNIBI + bech32Recipient + ) + ); + + require(success, string.concat("Failed to call bankSend")); + + revert(); + } +} diff --git a/x/evm/embeds/embeds.go b/x/evm/embeds/embeds.go index f08e26b5d..60f496843 100644 --- a/x/evm/embeds/embeds.go +++ b/x/evm/embeds/embeds.go @@ -47,6 +47,12 @@ var ( testMetadataBytes32 []byte //go:embed artifacts/contracts/TestPrecompileSendToBankThenERC20Transfer.sol/TestPrecompileSendToBankThenERC20Transfer.json testPrecompileSendToBankThenERC20Transfer []byte + //go:embed artifacts/contracts/TestDirtyStateAttack1.sol/TestDirtyStateAttack1.json + testDirtyStateAttack1 []byte + //go:embed artifacts/contracts/TestDirtyStateAttack2.sol/TestDirtyStateAttack2.json + testDirtyStateAttack2 []byte + //go:embed artifacts/contracts/TestDirtyStateAttack3.sol/TestDirtyStateAttack3.json + testDirtyStateAttack3 []byte ) var ( @@ -118,7 +124,6 @@ var ( Name: "TestERC20TransferThenPrecompileSend.sol", EmbedJSON: testERC20TransferThenPrecompileSendJson, } - // SmartContract_TestPrecompileSelfCallRevert is a test contract // that creates another instance of itself, calls the precompile method and then force reverts. // It tests a race condition where the state DB commit @@ -150,12 +155,26 @@ var ( Name: "MKR.sol", EmbedJSON: testMetadataBytes32, } - // SmartContract_TestPrecompileSendToBankThenERC20Transfer is a test contract that sends to bank then calls ERC20 transfer SmartContract_TestPrecompileSendToBankThenERC20Transfer = CompiledEvmContract{ Name: "TestPrecompileSendToBankThenERC20Transfer.sol", EmbedJSON: testPrecompileSendToBankThenERC20Transfer, } + // SmartContract_TestDirtyStateAttack1 is a test contract that composes manual send and funtoken sendToBank + SmartContract_TestDirtyStateAttack1 = CompiledEvmContract{ + Name: "TestDirtyStateAttack1.sol", + EmbedJSON: testDirtyStateAttack1, + } + // SmartContract_TestDirtyStateAttack2 is a test contract that composes erc20 transfer and funtoken sendToBank + SmartContract_TestDirtyStateAttack2 = CompiledEvmContract{ + Name: "TestDirtyStateAttack2.sol", + EmbedJSON: testDirtyStateAttack2, + } + // SmartContract_TestDirtyStateAttack3 is a test contract that composes manual send and funtoken sendToBank with a reversion + SmartContract_TestDirtyStateAttack3 = CompiledEvmContract{ + Name: "TestDirtyStateAttack3.sol", + EmbedJSON: testDirtyStateAttack3, + } ) func init() { @@ -175,6 +194,9 @@ func init() { SmartContract_TestRandom.MustLoad() SmartContract_TestBytes32Metadata.MustLoad() SmartContract_TestPrecompileSendToBankThenERC20Transfer.MustLoad() + SmartContract_TestDirtyStateAttack1.MustLoad() + SmartContract_TestDirtyStateAttack2.MustLoad() + SmartContract_TestDirtyStateAttack3.MustLoad() } type CompiledEvmContract struct { diff --git a/x/evm/keeper/funtoken_from_coin_test.go b/x/evm/keeper/funtoken_from_coin_test.go index 7a75afca6..e0e97203f 100644 --- a/x/evm/keeper/funtoken_from_coin_test.go +++ b/x/evm/keeper/funtoken_from_coin_test.go @@ -751,7 +751,7 @@ func (s *FunTokenFromCoinSuite) TestPrecompileSendToBankThenErc20Transfer() { Account: bob.EthAddr, BalanceBank: big.NewInt(0), BalanceERC20: big.NewInt(0), - Description: "Charles has 0 NIBI / 0 WNIBI", + Description: "Bob has 0 NIBI / 0 WNIBI", }.Assert(s.T(), deps, evmObj) evmtest.FunTokenBalanceAssert{ @@ -771,6 +771,293 @@ func (s *FunTokenFromCoinSuite) TestPrecompileSendToBankThenErc20Transfer() { }.Assert(s.T(), deps, evmObj) } +// TestDirtyStateAttack1 +// 1. Creates a funtoken from coin. +// 2. Calls the test contract +// a. manual send 10 NIBI to Alice +// b. FunToken.sendToBank 10 WNIBI to Alice +// +// INITIAL STATE: +// - Test contract funds: 10 WNIBI, 10 NIBI +// CONTRACT CALL: +// - Sends 10 NIBI to Alice manually +// - Sends 10 WNIBI to Alice via FunToken.sendToBank +// EXPECTED: +// - Test contract funds: 0 WNIBI, 0 NIBI +// - Alice: 20 NIBI +// - Module account: 0 NIBI escrowed +func (s *FunTokenFromCoinSuite) TestDirtyStateAttack1() { + deps := evmtest.NewTestDeps() + + // Initial setup + funToken := s.fundAndCreateFunToken(deps, 10e6) + + s.T().Log("Deploy Test Contract") + deployResp, err := evmtest.DeployContract( + &deps, + embeds.SmartContract_TestDirtyStateAttack1, + funToken.Erc20Addr.Address, + ) + s.Require().NoError(err) + testContractAddr := deployResp.ContractAddr + + s.Run("Convert bank coin to erc-20: give test contract 10 WNIBI (erc20)", func() { + _, err = deps.EvmKeeper.ConvertCoinToEvm( + sdk.WrapSDKContext(deps.Ctx), + &evm.MsgConvertCoinToEvm{ + Sender: deps.Sender.NibiruAddr.String(), + BankCoin: sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6)), + ToEthAddr: eth.EIP55Addr{Address: testContractAddr}, + }, + ) + s.Require().NoError(err) + }) + + s.Run("Send 10 NIBI to test contract manually", func() { + s.Require().NoError(testapp.FundAccount( + deps.App.BankKeeper, + deps.Ctx, + eth.EthAddrToNibiruAddr(testContractAddr), + sdk.NewCoins(sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6))), + )) + }) + + alice := evmtest.NewEthPrivAcc() + + s.Run("call test contract", func() { + contractInput, err := embeds.SmartContract_TestDirtyStateAttack1.ABI.Pack( + "attack", + alice.EthAddr, + alice.NibiruAddr.String(), + ) + s.Require().NoError(err) + evmObj, _ := deps.NewEVM() + _, err = deps.EvmKeeper.CallContractWithInput( + deps.Ctx, + evmObj, + deps.Sender.EthAddr, + &testContractAddr, + true, + contractInput, + evmtest.FunTokenGasLimitSendToEvm, + ) + s.Require().NoError(err) + + evmtest.FunTokenBalanceAssert{ + FunToken: funToken, + Account: alice.EthAddr, + BalanceBank: big.NewInt(20e6), + BalanceERC20: big.NewInt(0), + Description: "Alice has 20 NIBI / 0 WNIBI", + }.Assert(s.T(), deps, evmObj) + + evmtest.FunTokenBalanceAssert{ + FunToken: funToken, + Account: testContractAddr, + BalanceBank: big.NewInt(0), + BalanceERC20: big.NewInt(0), + Description: "Test contract has 0 WNIBI / 0 NIBI", + }.Assert(s.T(), deps, evmObj) + + evmtest.FunTokenBalanceAssert{ + FunToken: funToken, + Account: evm.EVM_MODULE_ADDRESS, + BalanceBank: big.NewInt(0), + BalanceERC20: big.NewInt(0), + Description: "Module account has 0 NIBI escrowed", + }.Assert(s.T(), deps, evmObj) + }) +} + +// TestDirtyStateAttack2 +// 1. Creates a funtoken from coin. +// 2. Calls the test contract +// a. erc20 transfer 1 WNIBI to Alice +// b. FunToken.sendToBank 9 WNIBI to Alice +// +// INITIAL STATE: +// - Test contract funds: 10 WNIBI +// CONTRACT CALL: +// - Sends 1 WNIBI to Alice via erc20 transfer +// - Sends 9 WNIBI to Alice via FunToken.sendToBank +// EXPECTED: +// - Test contract funds: 0 WNIBI +// - Alice: 9 NIBI, 1 WNIBI +// - Module account: 1 NIBI escrowed +func (s *FunTokenFromCoinSuite) TestDirtyStateAttack2() { + deps := evmtest.NewTestDeps() + + // Initial setup + funToken := s.fundAndCreateFunToken(deps, 10e6) + + s.T().Log("Deploy Test Contract") + deployResp, err := evmtest.DeployContract( + &deps, + embeds.SmartContract_TestDirtyStateAttack2, + funToken.Erc20Addr.Address, + ) + s.Require().NoError(err) + testContractAddr := deployResp.ContractAddr + + s.Run("Convert bank coin to erc-20: give test contract 10 WNIBI (erc20)", func() { + _, err = deps.EvmKeeper.ConvertCoinToEvm( + sdk.WrapSDKContext(deps.Ctx), + &evm.MsgConvertCoinToEvm{ + Sender: deps.Sender.NibiruAddr.String(), + BankCoin: sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6)), + ToEthAddr: eth.EIP55Addr{Address: testContractAddr}, + }, + ) + s.Require().NoError(err) + }) + + alice := evmtest.NewEthPrivAcc() + + s.Run("call test contract", func() { + contractInput, err := embeds.SmartContract_TestDirtyStateAttack2.ABI.Pack( + "attack", + alice.EthAddr, + alice.NibiruAddr.String(), + ) + s.Require().NoError(err) + evmObj, _ := deps.NewEVM() + _, err = deps.EvmKeeper.CallContractWithInput( + deps.Ctx, + evmObj, + deps.Sender.EthAddr, + &testContractAddr, + true, + contractInput, + evmtest.FunTokenGasLimitSendToEvm, + ) + s.Require().NoError(err) + + evmtest.FunTokenBalanceAssert{ + FunToken: funToken, + Account: alice.EthAddr, + BalanceBank: big.NewInt(9e6), + BalanceERC20: big.NewInt(1e6), + Description: "Alice has 9 NIBI / 1 WNIBI", + }.Assert(s.T(), deps, evmObj) + + evmtest.FunTokenBalanceAssert{ + FunToken: funToken, + Account: testContractAddr, + BalanceBank: big.NewInt(0), + BalanceERC20: big.NewInt(0), + Description: "Test contract has 0 WNIBI / 0 NIBI", + }.Assert(s.T(), deps, evmObj) + + evmtest.FunTokenBalanceAssert{ + FunToken: funToken, + Account: evm.EVM_MODULE_ADDRESS, + BalanceBank: big.NewInt(1e6), + BalanceERC20: big.NewInt(0), + Description: "Module account has 1 NIBI escrowed", + }.Assert(s.T(), deps, evmObj) + }) +} + +// TestDirtyStateAttack3 +// 1. Creates a funtoken from coin. +// 2. Calls the test contract +// a. manual send 10 NIBI to Alice +// b. FunToken.sendToBank 10 WNIBI to Alice +// c. reverts +// +// INITIAL STATE: +// - Test contract funds: 10 WNIBI, 10 NIBI +// CONTRACT CALL: +// - Sends 10 NIBI to Alice manually +// - Sends 10 WNIBI to Alice via FunToken.sendToBank +// - reverts +// EXPECTED: +// - Test contract funds: 10 WNIBI, 10 NIBI +// - Alice: 0 WNIBI, 0 NIBI +// - Module account: 10 NIBI escrowed +func (s *FunTokenFromCoinSuite) TestDirtyStateAttack3() { + deps := evmtest.NewTestDeps() + + // Initial setup + funToken := s.fundAndCreateFunToken(deps, 10e6) + + s.T().Log("Deploy Test Contract") + deployResp, err := evmtest.DeployContract( + &deps, + embeds.SmartContract_TestDirtyStateAttack3, + funToken.Erc20Addr.Address, + ) + s.Require().NoError(err) + testContractAddr := deployResp.ContractAddr + + s.Run("Convert bank coin to erc-20: give test contract 10 WNIBI (erc20)", func() { + _, err = deps.EvmKeeper.ConvertCoinToEvm( + sdk.WrapSDKContext(deps.Ctx), + &evm.MsgConvertCoinToEvm{ + Sender: deps.Sender.NibiruAddr.String(), + BankCoin: sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6)), + ToEthAddr: eth.EIP55Addr{Address: testContractAddr}, + }, + ) + s.Require().NoError(err) + }) + + s.Run("Send 10 NIBI to test contract manually", func() { + s.Require().NoError(testapp.FundAccount( + deps.App.BankKeeper, + deps.Ctx, + eth.EthAddrToNibiruAddr(testContractAddr), + sdk.NewCoins(sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6))), + )) + }) + + alice := evmtest.NewEthPrivAcc() + + s.Run("call test contract", func() { + contractInput, err := embeds.SmartContract_TestDirtyStateAttack3.ABI.Pack( + "attack", + alice.EthAddr, + alice.NibiruAddr.String(), + ) + s.Require().NoError(err) + evmObj, _ := deps.NewEVM() + _, err = deps.EvmKeeper.CallContractWithInput( + deps.Ctx, + evmObj, + deps.Sender.EthAddr, + &testContractAddr, + true, + contractInput, + evmtest.FunTokenGasLimitSendToEvm, + ) + s.Require().NoError(err) + + evmtest.FunTokenBalanceAssert{ + FunToken: funToken, + Account: alice.EthAddr, + BalanceBank: big.NewInt(0), + BalanceERC20: big.NewInt(0), + Description: "Alice has 0 NIBI / 0 WNIBI", + }.Assert(s.T(), deps, evmObj) + + evmtest.FunTokenBalanceAssert{ + FunToken: funToken, + Account: testContractAddr, + BalanceBank: big.NewInt(10e6), + BalanceERC20: big.NewInt(10e6), + Description: "Test contract has 10 WNIBI / 10 NIBI", + }.Assert(s.T(), deps, evmObj) + + evmtest.FunTokenBalanceAssert{ + FunToken: funToken, + Account: evm.EVM_MODULE_ADDRESS, + BalanceBank: big.NewInt(10e6), + BalanceERC20: big.NewInt(0), + Description: "Module account has 10 NIBI escrowed", + }.Assert(s.T(), deps, evmObj) + }) +} + // fundAndCreateFunToken creates initial setup for tests func (s *FunTokenFromCoinSuite) fundAndCreateFunToken(deps evmtest.TestDeps, unibiAmount int64) evm.FunToken { bankDenom := evm.EVMBankDenom From aecd9e58d77c11760110b89a2a347d72b26efcc0 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 22 Jan 2025 14:11:20 -0800 Subject: [PATCH 08/15] Update wasm_test.go --- x/evm/precompile/wasm_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x/evm/precompile/wasm_test.go b/x/evm/precompile/wasm_test.go index 16a81d802..85173d992 100644 --- a/x/evm/precompile/wasm_test.go +++ b/x/evm/precompile/wasm_test.go @@ -149,6 +149,7 @@ func (s *WasmSuite) TestExecute() { func (s *WasmSuite) TestExecuteMulti() { deps := evmtest.NewTestDeps() + evmObj, _ := deps.NewEVM() wasmContracts := test.SetupWasmContracts(&deps, &s.Suite) wasmContract := wasmContracts[1] // hello_world_counter.wasm @@ -156,12 +157,12 @@ func (s *WasmSuite) TestExecuteMulti() { test.AssertWasmCounterState(&s.Suite, deps, wasmContract, 0) // count += 2 test.IncrementWasmCounterWithExecuteMulti( - &s.Suite, &deps, wasmContract, 2, true) + &s.Suite, &deps, evmObj, wasmContract, 2, true) // count = 2 test.AssertWasmCounterState(&s.Suite, deps, wasmContract, 2) // count += 67 test.IncrementWasmCounterWithExecuteMulti( - &s.Suite, &deps, wasmContract, 67, true) + &s.Suite, &deps, evmObj, wasmContract, 67, true) // count = 69 test.AssertWasmCounterState(&s.Suite, deps, wasmContract, 69) } From c938af22b9c204251350cbccd2afffaf68533a70 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 22 Jan 2025 14:27:28 -0800 Subject: [PATCH 09/15] test: add TestWasmPrecompileDirtyStateAttack4 --- .../TestDirtyStateAttack4.json | 47 ++++++++++++++ .../contracts/TestDirtyStateAttack4.sol | 28 ++++++++ x/evm/embeds/embeds.go | 8 +++ x/evm/precompile/test/bank_transfer.wasm | Bin 0 -> 195987 bytes x/evm/precompile/test/counter.wasm | Bin 0 -> 203070 bytes x/evm/precompile/test/export.go | 10 ++- .../{ => test}/hello_world_counter.wasm | Bin x/evm/precompile/test/infinite_loop.wasm | Bin 0 -> 193630 bytes x/evm/precompile/test/staking.wasm | Bin 0 -> 195769 bytes x/evm/precompile/test/wasteful_gas.wasm | Bin 0 -> 195446 bytes x/evm/precompile/wasm_test.go | 61 ++++++++++++++++++ 11 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 x/evm/embeds/artifacts/contracts/TestDirtyStateAttack4.sol/TestDirtyStateAttack4.json create mode 100644 x/evm/embeds/contracts/TestDirtyStateAttack4.sol create mode 100644 x/evm/precompile/test/bank_transfer.wasm create mode 100644 x/evm/precompile/test/counter.wasm rename x/evm/precompile/{ => test}/hello_world_counter.wasm (100%) create mode 100644 x/evm/precompile/test/infinite_loop.wasm create mode 100644 x/evm/precompile/test/staking.wasm create mode 100644 x/evm/precompile/test/wasteful_gas.wasm diff --git a/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack4.sol/TestDirtyStateAttack4.json b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack4.sol/TestDirtyStateAttack4.json new file mode 100644 index 000000000..3907e082f --- /dev/null +++ b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack4.sol/TestDirtyStateAttack4.json @@ -0,0 +1,47 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TestDirtyStateAttack4", + "sourceName": "contracts/TestDirtyStateAttack4.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "wasmAddr", + "type": "string" + }, + { + "internalType": "bytes", + "name": "msgArgs", + "type": "bytes" + } + ], + "name": "attack", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60806040526000805561084a806100176000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806333c889971461003b5780638ada066e14610057575b600080fd5b610055600480360381019061005091906102d6565b610075565b005b61005f6101e4565b60405161006c9190610370565b60405180910390f35b600080815480929190610087906103ba565b91905055506000600167ffffffffffffffff8111156100a9576100a8610402565b5b6040519080825280602002602001820160405280156100e257816020015b6100cf6101ed565b8152602001906001900390816100c75790505b50905060405180604001604052806040518060400160405280600581526020017f756e6962690000000000000000000000000000000000000000000000000000008152508152602001620f42408152508160008151811061014657610145610431565b5b602002602001018190525061080273ffffffffffffffffffffffffffffffffffffffff166361ffaee486868686866040518663ffffffff1660e01b8152600401610194959493929190610689565b6000604051808303816000875af11580156101b3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101dc91906107cb565b505050505050565b60008054905090565b604051806040016040528060608152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126102405761023f61021b565b5b8235905067ffffffffffffffff81111561025d5761025c610220565b5b60208301915083600182028301111561027957610278610225565b5b9250929050565b60008083601f8401126102965761029561021b565b5b8235905067ffffffffffffffff8111156102b3576102b2610220565b5b6020830191508360018202830111156102cf576102ce610225565b5b9250929050565b600080600080604085870312156102f0576102ef610211565b5b600085013567ffffffffffffffff81111561030e5761030d610216565b5b61031a8782880161022a565b9450945050602085013567ffffffffffffffff81111561033d5761033c610216565b5b61034987828801610280565b925092505092959194509250565b6000819050919050565b61036a81610357565b82525050565b60006020820190506103856000830184610361565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006103c582610357565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036103f7576103f661038b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b600061049d8385610460565b93506104aa838584610471565b6104b383610480565b840190509392505050565b600082825260208201905092915050565b60006104db83856104be565b93506104e8838584610471565b6104f183610480565b840190509392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610562578082015181840152602081019050610547565b60008484015250505050565b600061057982610528565b6105838185610533565b9350610593818560208601610544565b61059c81610480565b840191505092915050565b6105b081610357565b82525050565b600060408301600083015184820360008601526105d3828261056e565b91505060208301516105e860208601826105a7565b508091505092915050565b60006105ff83836105b6565b905092915050565b6000602082019050919050565b600061061f826104fc565b6106298185610507565b93508360208202850161063b85610518565b8060005b85811015610677578484038952815161065885826105f3565b945061066383610607565b925060208a0199505060018101905061063f565b50829750879550505050505092915050565b600060608201905081810360008301526106a4818789610491565b905081810360208301526106b98185876104cf565b905081810360408301526106cd8184610614565b90509695505050505050565b600080fd5b6106e782610480565b810181811067ffffffffffffffff8211171561070657610705610402565b5b80604052505050565b6000610719610207565b905061072582826106de565b919050565b600067ffffffffffffffff82111561074557610744610402565b5b61074e82610480565b9050602081019050919050565b600061076e6107698461072a565b61070f565b90508281526020810184848401111561078a576107896106d9565b5b610795848285610544565b509392505050565b600082601f8301126107b2576107b161021b565b5b81516107c284826020860161075b565b91505092915050565b6000602082840312156107e1576107e0610211565b5b600082015167ffffffffffffffff8111156107ff576107fe610216565b5b61080b8482850161079d565b9150509291505056fea26469706673582212208caac82ecde5bb31fb5b34bd6b569b73277f17eb9b132d65942a718f83178c9c64736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806333c889971461003b5780638ada066e14610057575b600080fd5b610055600480360381019061005091906102d6565b610075565b005b61005f6101e4565b60405161006c9190610370565b60405180910390f35b600080815480929190610087906103ba565b91905055506000600167ffffffffffffffff8111156100a9576100a8610402565b5b6040519080825280602002602001820160405280156100e257816020015b6100cf6101ed565b8152602001906001900390816100c75790505b50905060405180604001604052806040518060400160405280600581526020017f756e6962690000000000000000000000000000000000000000000000000000008152508152602001620f42408152508160008151811061014657610145610431565b5b602002602001018190525061080273ffffffffffffffffffffffffffffffffffffffff166361ffaee486868686866040518663ffffffff1660e01b8152600401610194959493929190610689565b6000604051808303816000875af11580156101b3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906101dc91906107cb565b505050505050565b60008054905090565b604051806040016040528060608152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126102405761023f61021b565b5b8235905067ffffffffffffffff81111561025d5761025c610220565b5b60208301915083600182028301111561027957610278610225565b5b9250929050565b60008083601f8401126102965761029561021b565b5b8235905067ffffffffffffffff8111156102b3576102b2610220565b5b6020830191508360018202830111156102cf576102ce610225565b5b9250929050565b600080600080604085870312156102f0576102ef610211565b5b600085013567ffffffffffffffff81111561030e5761030d610216565b5b61031a8782880161022a565b9450945050602085013567ffffffffffffffff81111561033d5761033c610216565b5b61034987828801610280565b925092505092959194509250565b6000819050919050565b61036a81610357565b82525050565b60006020820190506103856000830184610361565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006103c582610357565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036103f7576103f661038b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b600061049d8385610460565b93506104aa838584610471565b6104b383610480565b840190509392505050565b600082825260208201905092915050565b60006104db83856104be565b93506104e8838584610471565b6104f183610480565b840190509392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610562578082015181840152602081019050610547565b60008484015250505050565b600061057982610528565b6105838185610533565b9350610593818560208601610544565b61059c81610480565b840191505092915050565b6105b081610357565b82525050565b600060408301600083015184820360008601526105d3828261056e565b91505060208301516105e860208601826105a7565b508091505092915050565b60006105ff83836105b6565b905092915050565b6000602082019050919050565b600061061f826104fc565b6106298185610507565b93508360208202850161063b85610518565b8060005b85811015610677578484038952815161065885826105f3565b945061066383610607565b925060208a0199505060018101905061063f565b50829750879550505050505092915050565b600060608201905081810360008301526106a4818789610491565b905081810360208301526106b98185876104cf565b905081810360408301526106cd8184610614565b90509695505050505050565b600080fd5b6106e782610480565b810181811067ffffffffffffffff8211171561070657610705610402565b5b80604052505050565b6000610719610207565b905061072582826106de565b919050565b600067ffffffffffffffff82111561074557610744610402565b5b61074e82610480565b9050602081019050919050565b600061076e6107698461072a565b61070f565b90508281526020810184848401111561078a576107896106d9565b5b610795848285610544565b509392505050565b600082601f8301126107b2576107b161021b565b5b81516107c284826020860161075b565b91505092915050565b6000602082840312156107e1576107e0610211565b5b600082015167ffffffffffffffff8111156107ff576107fe610216565b5b61080b8482850161079d565b9150509291505056fea26469706673582212208caac82ecde5bb31fb5b34bd6b569b73277f17eb9b132d65942a718f83178c9c64736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/x/evm/embeds/contracts/TestDirtyStateAttack4.sol b/x/evm/embeds/contracts/TestDirtyStateAttack4.sol new file mode 100644 index 000000000..c9dc1d1df --- /dev/null +++ b/x/evm/embeds/contracts/TestDirtyStateAttack4.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; +import "./Wasm.sol"; +import "./NibiruEvmUtils.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract TestDirtyStateAttack4 { + uint counter = 0; + + constructor() payable {} + + function attack(string calldata wasmAddr, bytes calldata msgArgs) external { + counter++; + + INibiruEvm.BankCoin[] memory funds = new INibiruEvm.BankCoin[](1); + funds[0] = INibiruEvm.BankCoin({denom: "unibi", amount: 1e6}); // 1 NIBI + + WASM_PRECOMPILE.execute(wasmAddr, msgArgs, funds); + } + + function getCounter() external view returns (uint) { + return counter; + } +} diff --git a/x/evm/embeds/embeds.go b/x/evm/embeds/embeds.go index 60f496843..69eff0fae 100644 --- a/x/evm/embeds/embeds.go +++ b/x/evm/embeds/embeds.go @@ -53,6 +53,8 @@ var ( testDirtyStateAttack2 []byte //go:embed artifacts/contracts/TestDirtyStateAttack3.sol/TestDirtyStateAttack3.json testDirtyStateAttack3 []byte + //go:embed artifacts/contracts/TestDirtyStateAttack4.sol/TestDirtyStateAttack4.json + testDirtyStateAttack4 []byte ) var ( @@ -175,6 +177,11 @@ var ( Name: "TestDirtyStateAttack3.sol", EmbedJSON: testDirtyStateAttack3, } + // SmartContract_TestDirtyStateAttack4 is a test contract that composes manual send and funtoken sendToBank with a reversion + SmartContract_TestDirtyStateAttack4 = CompiledEvmContract{ + Name: "TestDirtyStateAttack4.sol", + EmbedJSON: testDirtyStateAttack4, + } ) func init() { @@ -197,6 +204,7 @@ func init() { SmartContract_TestDirtyStateAttack1.MustLoad() SmartContract_TestDirtyStateAttack2.MustLoad() SmartContract_TestDirtyStateAttack3.MustLoad() + SmartContract_TestDirtyStateAttack4.MustLoad() } type CompiledEvmContract struct { diff --git a/x/evm/precompile/test/bank_transfer.wasm b/x/evm/precompile/test/bank_transfer.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7f1fa8f6fbac1000eadff96e94ea26c196d2bc10 GIT binary patch literal 195987 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%0Aq_^Aqb2uA~YmRGsu`o6*Z3$ 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 literal 0 HcmV?d00001 diff --git a/x/evm/precompile/test/counter.wasm b/x/evm/precompile/test/counter.wasm new file mode 100644 index 0000000000000000000000000000000000000000..0e1cba2095937e00235b004b096e35e7def014ad GIT binary patch literal 203070 zcmeFa3z%KkRp)sg_f_{%x+RsJvMu1;i+U)5gv&&c6x$u@)c84sLCu(HH)Ps!EP-8e z97R!#VH`_N6vq$~3~>@W35g*lHjpp|0=U62N-)8BkT?*6fefvHlh559_&gB6-JNvi z_g`zDbI+~1C6#Ok!pB&j>)f-?*{`+Nd#$}sboDD=7DrJO|6zRg-sH%U_=x^Sd($KK zI}Sgiy)_EBiSRvv_*TEz#bnxUn|9HqBTcw|E7;)-D=Ri`JjN z#G~ZME&6?no^(d9X)xW&tquPc{jD9jg(j1?B^%QHH{96V_tL8l?Z0|o)X-gvyB|Ds z-QoRFtlKGj__CMZxIapZmtT3!)i*>*ad*T1n+|)`-qri|9lGkqtFOOq-__K&=4Pyn z3NOFmx@&my!~3I1HT~UdU-h!9Zz#+9uiSsl!EbxP&I9LNb>sd+*M0vFc_(wD;zRqd zVI+sHI{2!W9@zgwkqv)(|GsZ~!3)lN;aHv7qVT0xAHL?=u}AfN`(OI1AMn|9Uh%5^ zhkod)Yp%Wex*L4F^{Zd{@it^y399g)>P)rU z^?GZj)#6EwR_aatSF`7xPE=3oyjD{)ag7(EsM$=S+Qx?W)@`H>;T@P)<63XlTJ?Hu zsx>uLtJ5ikwIuqlB zKg#0RCJ;xB*@pcWQ7_^(F2JLfs5{15YcSZfHXSunN+@WYF&#zIN$ zYPGrOtb|(4_+b19|LSQR%{0zRkHq=WqsODpktqM{J3e67r*v(;KkhbOw*O@>KlDRM z)ZBm5{%c+ZE?rl*m5N@~x$cHn9=`g9!`BJJZr*g=4Ttw1`u?l0*{>yj<#jK=;i}!y z>*Lnd*I)ngYxKtLaeLqX^6p3C{-OP^c-3`>_P_EfS~+mt4L`u!Gu5&~KcH&WLP+7z z)rVhxh{E<&SAp4AU$y^+eQDge>Z)t^Uw!bZmtOtK{b@4wvq>D~ap!m9pH22%v+cYc z&p&tJ+qQrE!dv2d;ywT7t?}LQ+v2y!?}&dYerNpR@BFU+kIzpg##B}^rD6H7Z&rSZ++?2H~r8Hzx$HQuK1oy|F{2rVJ|N%{J{6`-~Z`&;o!l8 z3;*X2|M0#akMD@z9RGU!8}Tp1565qee@v~sH(t0aUigXlP4S)aPpV+y|B8Px{_FU^ z#P8$Z!rp}!{)hOy`{G}Y&-<15*W!ob--;LZeK3Ac@+-;X@xFyWjsGP6QBRMMlQ*I-O<4rAhHe125xwrprcGmuAAThUCdn~pb=OlXEm zQU1ozcDKP@mTFE>7Vk`ITxxlK#u72ker3Zh1b5c!_tDtx12Efo;5} zhyi!9+Qq#Dz}51&e@i!cE?P|TY-kZDG|QEd^|N}G z>`b~`m{W_w`QZRuDK%0GdD2=Q)*Kts?a{ojp}F)LpmUu6j~>~Tu0#n# zjw8k2j7nSc{~ifLYFTZ2)Xix=IX~(Gr?14XsI;d>t-TEZCaaB*Db@1s$Wj4*fnjCK znMS0hGwM4M4O-!vW7x&J?@g~h>CF_>`e z6@%2{3x~|J($6Km^lZ^W%ED?ezh{pRt{Mcy;62s)!)kkUXU#&3-mET{4Fm8l>9x+z z(yi&9!6uczc(6g2iw6B-Xjwey=7~@>&7Y_YVBg9Cw7Q_TO|{nlMm4fH;9hM_hqhX} zy>QsmWp}T3HqFLmmEVg2nI4qw(%92-PNx__ zF{?c32p-UFiCA+&%pQmmkSS{q;($Ly3BnS7gY;75cm+ z5F1ne29%4u-oL>hI1zJupo5dwQ0u-3Y=s_!u3^Ezuw;a$w7U^R?y_pVZkr)YKv^Ma zoG0ZN?$j7Mj6v_OqCxMiAPUDiATIVF2)b1M@hB`v8A3zglog;fcYJpvv{Y^UQiNY zdM9drs%-wCn%`|zS*=a?3thby;-+0tqQt4zdkmb$sdmH2!6?WtOV5q|HC=rB^7bgo z`-cw|V4q^C!RZ3&hHcTVAX?zv^*)a=&PTJbo66c2(rH<;sX+b@8Ab&5DynE^v%As- zE}fmpHZDlfc`nQ`medtCs$MDUzX zu4FY@7x$u33t>gY;pdaXmG!u3FxAnLl|Vb>izm7m!}TfXpaGV&djL2rO6A>htm3)T zj3ya?J_a8_t6^aBsR>5t2w6989X=!|R@X=OAiUiGZLHQBZ+ zodYrI^U3_M=d2*gYs>Uo-DjN{1_jDX7?229~)12iN_sfI3#2zd&3!@!%6-6Pba zslXhVcBHjs5%toX$R!dYEO245w{bD-h=ej3cT8E~5W=HFcpN98_*S$}p&&UDQW-thh5(nZ8u$ofI63~PV57pJ*jtrB$Q+0{t zL}mQ#Gm;HQVyTRa%fmKcg*Z)PY`ew?R}((BU1Mw`EKvm_RH|r@jA@P8GF8X4MrmnT zcL{EE^ilme0<56Ekvy_rrOs#)3eGlIr8l-jo2^1`3@u7RTZ{cwqBRKgz#aoGN|JD4Q~ca@+D?rkI^t z-Ztz^CsAx_(}{}Ov^Ui6!J53`fwD>Vx);OhXv_th#lebw6Hcc^!A^U zJqL#ycct^lAufBpIR}rcaeEO+D*+6<&_WdO78e*(pae=Zra_$t&&Q}S^~{x?x)5hr zuPAB*nLbk0He^8yM{A=8MAV=u{<*>qfmjRaE4w(TYAqA(7{at|HiW5Zq3ug(J2aTV z@k(5p(a0y`k~&wN?sOoL5{2;ls9K@=Cy2TEq#~WtJb=$(S%rUn1b_dz3jVY_pX_B0 z2J%aK*oHoitPaQ-Zvi5RSwqi%RfE()1;t>QAGxuWE<#2G;JhOmSB+t+sbu0rtq7Z0*a|#oiqhV zSA@4}ChMAlv4SeutuY0sxr@QP5x{*8=Jb#RL@`6(L6>m6cm4b^M0=P3qW#?Hdjyz& zYnqYij8|$+wntYu>)6B6OkLdDBvEUk0UE2yQ>d_UekA+)`O8@&pS$t=2!hQZ)(g4x zcP1!tl6Nx1n-XuSq@0MifjW4BF)d%y4;iZpybUFqCSCVLwuu#tRGYn`|AWZ)Lbd6_ z2~cgiK24$Q6iXXMEUekFJd~ShC=Ht*wR{$Fp7J}d$u1l=yc}Wc!Z6M=$@|2-4rt1t zfMC!ElJ&!A@wapV15S>^*@h8=6ZN12B6cOzyJ9d>C$}b%-@^vP-27gYfomc-Bw~ko zL|4*}T|_;3Yaya!&!H$6q+`o=u@>o4U$%m+2_G->rY`d3TZ9H_u;-M0a(K>^YW$4g z$ugc)rgXpzBbB<;(7@KeN<9=4lumE`t|G0H6pi*I-wK8T`?T4g8|@d!eqe;@*E*>7 z4OqB>M5KLAgAIM5NCy<@1Qgjop;WGHgQG}CD8jo!k?8_Oq6&(XoG)mx*xo4LB15A6TUd2283W_8dC-8@ z^J8wDH}GZN$japH64 zg(`8z;({%xIS?mnIC;=zw;J~10rb~55g|G~H}*Q6*XFLCb079B%MzT|!Iuat&SOez zd174o+$hQ)e(Ujw>!m`+s+(F1FBdcw>XR#=ZH-l^Qy~K=@N<9?yu=mnw800rs8$mv zwY<~fuCm9>4}5926>0xM4q0d+kYfQ0k5A$*fliA?uhpRoy|iioF#!$A9%Y8*w>rGR!sHgcq^<_T8cQnwrGpxD zGhKO*V%(ua;CXy~sD>#~?TQYtv5F~~P37*(nt9H!sRjyjXeqUZ^zXWH&EqEq;Y|k8 zVXd%*P%oB_-tyX|_?Wo8{q78#OJ9j!yA*vlYpVemM9fo@_%i)&?A1NEv{>k{2?LZQ zOY%o6x(B6Olf_|Ex`%~qOe2AV$u336^7Nts>t!XPDMft7x|MAZFbs$!vUCa{EcoIW z7_>NgzCAh*TQ;EBsaDe({7=!ctdKE8R~Te3o;gPQ68e8x=;(Gyn@BlU2M} zlC|>Um`D(SOyqYyn`UaxdS0q*Lo;l~?T*vHC9ED_kvS$#?U9F2D+3d#l%l}Kws&w@Ey zn-GFz7Qr6waL0a z_}V2gs@5?z4}@#h4+6N8l`n{6^MWs`wa-g{bkJCe2DALXiLMkp#!+Z4!5-J?;1YC| z!w{#)D3BOJ1JvY^UVVO+ymExmnxFnTPI>%zE%1-ERSHEM)nijHB~`9B)@re)? z2gqu00lvs(n^{PcyAqExE^?-g8Ocn-V(eWoO(!m|imC zcNw7ZYZ*#ElQVe)o{0sS3ML&*0=b|x>0nWdc_f7#*TTaB9N61ca0I7pXE3!Cb(nBc zkb-~-=G(H&2ucFh442)@gN;J{;vee8DD(=2)XbwdUAn7!<_n4|jE_bNGN6-+Coje2 zrhcbb-ijyB+q|SVU7~|tbI`6thqe!^M1|P3ak=bPfzqY3V@Z&->wqhP1HqNc-f>V) zOY~KobQ&Q@e%w7=;({fHrSp?9j2LCHPAkwBWGm4Y{D;ZRl&B~#oMWWax=r`zvAjNO zG*se$K+0COaXlD0*d&R&>3$On@_fBc6KnLZryu0_Xl8pR&P=Ya9?FBez91w6PH5u> z?$!Yutcn@+^A-Nv@Y<7;D(}V>rGyR~13m;?PC`o9aFJ_Qfqw8X;A~Q9LzE=b+1QpC zCsR^9#;1h4v!RINoB}~Rktq$i=isiS9f*sdD5-YVQ$~WZ6$)Ak$fHmOlOz_Ixd9~w zx6)O^Z4<`foN$N8-`#oTi1+SFw$YlH%Is3>cG0pN6sdSuQ;S#Vk--f(n(JNpC^6NbVZFvE~Tb3Oq_6mG=xD| z2W21WBIBRHebI+(&Z8IiPJFSX!HT;mtdiDf)6(4SFT!B2KsT;pN&_v3m*#KFnx+le z;8{EM9^##->V+RjETj%gWKarS0(?PQ`CP*(Twg8ua6oSIfCM;v32Cu zuG5WoqIb$_vZq_eI{r2WU3h!;Mf_6d!1!zR&8SfR&enrczqRl_mifgv9jE3Mbj3~s-A5qI@ z8{GNeBUXmZmW+o)I8}HI0di!j^9ij?h%~FZV2sWWstsfF+-t}hN=YOdxmgOIta(Q4 z2{d+7U=0PJ12M-{hC;}I)WdjUDy%u&9yP{)kuVqX9oXH4;nlg~#{^eEx|N04}8D_MbWqitf&m zrDRuf5e1ZAp*lj5oth~>zlC2{+OHPB_E54-o$X%kzsx}=)*J{3d{n+gxtwPFJDNLLhlMDFT0%JSY}7ktS0qWzvnyb$ zo?ROpXSrEFg9M-x)W8r4MyyKoPo-xe7G>L~aU88M>2lI9fK%`tLJA{;9<<_LHILS; zOw8#THni+UXq?t%U+Ov|%i4W)6K(hREwyhMHn0=+Km+bxpl=AiaX+@ZRV0Nht6x6; z)RNZZ>s23S#d9?)-uo)8c(D;@G6PYu@=X|*arVxMCvFz^ti6nbjHvz z^FRO4TaPP;P#NiF(WoV!eoDphN%Oy<$dO|hnEA>+`*s<|s9l8PiiGkNjwfNNP!!w* zMa^0hidv}P?az1{!0AESSl+}qisO5LO#Q%gLdpzN%76RyfVW{#m)q4cxWpR#7cV@b z7wW~bkW)wKS_&)?6a8wGezF8=%1_>MTDB~qI^J^XEo0*#fYh?BYPnT_a`3gv1S}Zi zZz2IB7ijij|HUj=+aX}wfatQQ=qsjwcLUAyIRoE>lZUog%#9cMo*oNdA#PK~pZ zYCP9Cdq)!2C&j6AqIN+Sz?drHui~x9%)rN`J(^Stfx(e%cQtY4hO36uOL#4Oj~{(V zxG|_nTToapL@?#g^HSbQCE0NUhz+HAbXhOWZ@uRO5o#~{Lf}uY9wK4jdYE&lq<@l7 zYHXme1SD8;EC_KzOEW{r1pkF|vJGyb<%mr)=YId0NS$I=ja}C%eN60}EQ;^a2cBPJ z6I#-a+OcgEc(1U>>C`fMBy@(1erpuvzs57J-`$%!yP#nFDd{|qewjyHFU5a}Y9QX< z4pOM-p&qdzR8X$;&~RBn549CN;Fu@Fz@^!W9<+zedN52ar4eyVlkk%F2qnpTsiYpF zt}S<>1uc6RU(iYqUrWpRPp)ls?YL#s# za@4>ZFtxvYmQQZKf!dK{5{LdX^|7y{yWc|497IrzonR>u)5wgpv-9jTbd zA)t#UN_w7bV)O6FfmyU#MidE-P@yVwLtHcWh$35TRZC7C3y51}aWEcHOhO2$u5Df}Am|r&N zEX9heNvf<-kr%xptIi-47*WM8AwUfKH7Y5NXuT1_)Mgozt(TFn!rhBW-msR44oiy| zMS(;Mqc|v9hq>MPI~EVHq>O-*VBy~3)Gqvi?6%yM?(z2UP%%*tBbET@E=3`Ps2Ppr zB(Wm^7@j3BY6S~C-zm5Kn#ysqpkY62?_q1j)cqJ_!pi*Tj>33q{p*$Q9gnZQc@aL$ zd+wAAv|sPC3x%Q?ma`H;^bRiR^~>egYm=9Mx)`O}@ujz|nrlE(N^Y@EA&5vcgQAmz zwdY{vvWJnd0jfZyO|qQZ_gjvTgL(z7O&0?XD8v4SfHH%&MIi6DXKaz+SCzO z12gP<)K11E>na_#Sd9;X0Vl(1>0Hzqp>j3h45W@=hb6N?xn@r>W0WTVl%pmQ9ec?) z6%xS{gEqykPfY|*2*8$9(%^#0E^vC;0_E)a}gk!%MLDxo(1pZW0g)yxb4A1 ztxCd_T~+~rU!*!9Op>2w9k^O5vC67N7w=3MI&DBODC;|;YmDTS`X{LBm1}lJwtOt{ z&gcca+_bX-G|L5NM|v;7r5JL$2Mj4utqcRg4a3@wt?X#|<0`t9i|bNSLwd?w$@g@U zmb;R5w!@l&(Sjhyg<6xh+bwFYs|DeTBvWri^37UVom7*#NDd+}P?rE~A`p?F^wQLm zYAk`bR}Va}CPpKCg_~~{5iN{FV4B$Qb_|=w-SDBC%v0$KVl(icoYl3BUNbI}B*>`K zW>vndV0zGvk93eF=SDB&?t*e(lj&+Ze9mlF)(|grDY(GsQPQxlo4)OweI|`V+V8qj zMj4=xQP%KaDn(Qwla$&uCaAE=Oi;0BHE>F@TL5Fc9@%94kM&p~o4n0Sdc{6Re{J%* z)Yq{t69m%fEfUZ{9u@1NUHI^-V!nnCaHr#9(@i7;%K=^HyT+Gew-#V~w1d4TEWAd=&$k;Ax zLC<@E61%UA$J--9|Hk9jAP3WecRTzc2QlkZn&K&z%M1>Ld9lD`XPg^dthMwlQnn_S z`RbCSt<_y*b&aiC>))eyeHWa)d!@g7g}8b^BB0D~MZE&N1e#P^bV>-p<^>@pDhSyk z-~qr|3R`;O3ab`kIcvVJmT;DqY?krRaZnD;ua^=0OdxOl(@;rp81wGM@JdET2USZ0 zlqmKhOpYPTYzf@g2vBw%TvY}gb{!!eT1@+YfV6`#OSzLgoo5d^zQEKBgtcmT`mwCf zY9-^9YHVAS^5qtw?(_Tq}}QqDl3+ zusUoVl(*5eoM4Z-$@*0vnPslCP=K+I=hlrK`wiZJmE>YEVhbWeX$saCvEcUwpJ(Yl zm}7CIR;8Yf%+T%lnaG7IWC*aUD5G$2$oEy2D)87IDTyO;b4C@QHY)_Ll`hh%p39|f zv~t9K4IRj?6#c{&nerHwZ2=bj!yU@Nl?AGOG%SW$H@-7oJ^Rr#S|x^LM_QQi2Q&0p zIkH!BEp0C!qnPrReD8~I@Ead7sGA1I_PqN=Dh`pt9a1V;V>_k7rV!(*%0-haQ&=O? zuKGk7YBerp?o=U_WrKX6m$aRz6&@#lrj~CB3l=guNlDt`=95T|NS**(6KQi>aZA`S zC6vecUl;l0qoq-+gGQbXP-&5E%v213z&e-Ou!-lU`5ouL%Y-R|sbo=BvDyy@P-$K8 z)zq_=j3*-O+Bd<;6w2Hp^NB?AY)ac46H;ds_NSaKnrJQUti#*liAwqVQB*x`DnflN zXQfT?(UNeY1;-bz_+YDi&Nxhozs4;lCw3RiFZjlaLmuM5P|1!M+ve2BOaBXkmbXR_ zTcJY{xd@rv=37zLL|WB58*VSS0eSYAj=|0xqc7WNamBC>1kIwUD4iDt``8}&#t|$J zqgv64X%Hi~#YIDmL^5V%E6%%GISK5DZ~hDZldRR- z^H^@>s+YY%_9BC(_-dP0#(WrZ8lfDzp9BPv^4S?rt=7R9m-eQ0w2NRIkFQ2W@u|@H zD5tvRl}(y7z`1j|n^EcO2J6wLx26tY;!q(rSqXZqsdnbxSi0=;--CnL zxduGD(zCO#kb#0;Ef-BComXziqP{j{bF(m*(o5)F=u-I~N2O+MPpvtfDo}@>%7l26 z!JN1hI!0@gUS?_G7kbCLCCb5=(JVA%dMvS1qFsIjK;TMopgBQ&#N|w912@4RI~Azr z-p#Q^A1Td&G%StUN=cG-9#$}manQ;{CvTecTz8C1L9BMBA)>cS3Y6?olRvdz%{8>;j3$2rSqOm)0O=<#deDi@B04BPY2lN0NGlLxU9F;Mu41E?NSMC~4U�k0? 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�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 Z_v)R#S|=_h^?dm#rk$AHz%){x`WN~T82$hN literal 0 HcmV?d00001 diff --git a/x/evm/precompile/test/export.go b/x/evm/precompile/test/export.go index dc2e775d6..2bdc86994 100644 --- a/x/evm/precompile/test/export.go +++ b/x/evm/precompile/test/export.go @@ -45,6 +45,10 @@ func SetupWasmContracts(deps *evmtest.TestDeps, s *suite.Suite) ( InstantiateMsg: []byte(`{"count": 0}`), Label: "https://github.com/NibiruChain/nibiru-wasm/tree/ec3ab9f09587a11fbdfbd4021c7617eca3912044/contracts/00-hello-world-counter", }, + { + InstantiateMsg: []byte(`{}`), + Label: "https://github.com/k-yang/nibiru-wasm-plus/tree/main/contracts/bank-transfer/", + }, } for i, wasmCode := range wasmCodes { @@ -92,7 +96,11 @@ func deployWasmBytecode( // hello_world_counter.wasm is a compiled version of: // https://github.com/NibiruChain/nibiru-wasm/tree/ec3ab9f09587a11fbdfbd4021c7617eca3912044/contracts/00-hello-world-counter - "x/evm/precompile/hello_world_counter.wasm", + "x/evm/precompile/test/hello_world_counter.wasm", + + // bank_transfer.wasm is a compiled version of: + // https://github.com/k-yang/nibiru-wasm-plus/tree/main/contracts/bank-transfer/ + "x/evm/precompile/test/bank_transfer.wasm", // Add other wasm bytecode here if needed... } { diff --git a/x/evm/precompile/hello_world_counter.wasm b/x/evm/precompile/test/hello_world_counter.wasm similarity index 100% rename from x/evm/precompile/hello_world_counter.wasm rename to x/evm/precompile/test/hello_world_counter.wasm diff --git a/x/evm/precompile/test/infinite_loop.wasm b/x/evm/precompile/test/infinite_loop.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d58ca41005ce77b23f9013e222fdfee035b311ae GIT binary patch literal 193630 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

rm~p&GOT8ubno#tAXH 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 Y+4LnRCYSW|pKz7YdAhl-IluD%0;3hfVE_OC literal 0 HcmV?d00001 diff --git a/x/evm/precompile/test/wasteful_gas.wasm b/x/evm/precompile/test/wasteful_gas.wasm new file mode 100644 index 0000000000000000000000000000000000000000..873a071136d6f5ec0c4bdecd3c09947fd55407d2 GIT binary patch literal 195446 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 literal 0 HcmV?d00001 diff --git a/x/evm/precompile/wasm_test.go b/x/evm/precompile/wasm_test.go index 85173d992..540c271ce 100644 --- a/x/evm/precompile/wasm_test.go +++ b/x/evm/precompile/wasm_test.go @@ -8,6 +8,7 @@ import ( wasm "github.com/CosmWasm/wasmd/x/wasm/types" + "github.com/NibiruChain/nibiru/v2/eth" "github.com/NibiruChain/nibiru/v2/x/common/testutil" "github.com/NibiruChain/nibiru/v2/x/common/testutil/testapp" "github.com/NibiruChain/nibiru/v2/x/evm" @@ -595,3 +596,63 @@ func (s *WasmSuite) TestExecuteMultiPartialExecution() { // Verify that no state changes occurred test.AssertWasmCounterState(&s.Suite, deps, wasmContract, 0) } + +func (s *WasmSuite) TestWasmPrecompileDirtyStateAttack4() { + deps := evmtest.NewTestDeps() + + wasmContracts := test.SetupWasmContracts(&deps, &s.Suite) + wasmContract := wasmContracts[2] // bank_transfer.wasm + + s.T().Log("Deploy Test Contract") + deployResp, err := evmtest.DeployContract( + &deps, + embeds.SmartContract_TestDirtyStateAttack4, + ) + s.Require().NoError(err) + testContractAddr := deployResp.ContractAddr + + s.Run("Send 10 NIBI to test contract manually", func() { + s.Require().NoError(testapp.FundAccount( + deps.App.BankKeeper, + deps.Ctx, + eth.EthAddrToNibiruAddr(testContractAddr), + sdk.NewCoins(sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6))), + )) + }) + + alice := evmtest.NewEthPrivAcc() + + s.Run("call test contract", func() { + msgArgsBz := []byte(fmt.Sprintf(` + { + "bank_transfer": { + "recipient": "%s" + } + } + `, alice.NibiruAddr)) + contractInput, err := embeds.SmartContract_TestDirtyStateAttack4.ABI.Pack( + "attack", + wasmContract.String(), + msgArgsBz, + ) + s.Require().NoError(err) + + evmObj, _ := deps.NewEVM() + _, err = deps.EvmKeeper.CallContractWithInput( + deps.Ctx, + evmObj, + deps.Sender.EthAddr, + &testContractAddr, + true, + contractInput, + evmtest.FunTokenGasLimitSendToEvm, + ) + s.Require().NoError(err) + + balanceAlice := deps.App.BankKeeper.GetBalance(deps.Ctx, alice.NibiruAddr, evm.EVMBankDenom) + s.Require().Equal(balanceAlice.Amount.BigInt(), big.NewInt(1e6)) + + balanceTestContract := deps.App.BankKeeper.GetBalance(deps.Ctx, eth.EthAddrToNibiruAddr(testContractAddr), evm.EVMBankDenom) + s.Require().Equal(balanceTestContract.Amount.BigInt(), big.NewInt(9e6)) + }) +} From 5ae84be6ac7942d637208f27ad59491c3fb9d998 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 22 Jan 2025 14:34:16 -0800 Subject: [PATCH 10/15] Update wasm_test.go --- x/evm/precompile/wasm_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/x/evm/precompile/wasm_test.go b/x/evm/precompile/wasm_test.go index 540c271ce..71d370499 100644 --- a/x/evm/precompile/wasm_test.go +++ b/x/evm/precompile/wasm_test.go @@ -597,6 +597,18 @@ func (s *WasmSuite) TestExecuteMultiPartialExecution() { test.AssertWasmCounterState(&s.Suite, deps, wasmContract, 0) } +// TestDirtyStateAttack4 +// 1. Deploy a simple wasm contract that bank transfers NIBI to a recipient (Alice) +// 2. Calls the test contract +// a. call the wasm precompile which calls the wasm contract with a bank transfer +// +// INITIAL STATE: +// - Test contract funds: 10 NIBI +// CONTRACT CALL: +// - Sends 1 NIBI to Alice via wasm precompile +// EXPECTED: +// - Test contract funds: 9 NIBI +// - Alice: 1 NIBI func (s *WasmSuite) TestWasmPrecompileDirtyStateAttack4() { deps := evmtest.NewTestDeps() From 0988d4b9595561674f61ba48706cd05a6f040b0e Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 26 Jan 2025 11:50:08 -0500 Subject: [PATCH 11/15] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aec8bba4e..626db49c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -87,6 +87,7 @@ needed to include double quotes around the hexadecimal string. - [#2172](https://github.com/NibiruChain/nibiru/pull/2172) - chore: close iterator in IterateEpochInfo - [#2173](https://github.com/NibiruChain/nibiru/pull/2173) - fix(evm): clear `StateDB` between calls - [#2177](https://github.com/NibiruChain/nibiru/pull/2177) - fix(cmd): Continue from #2127 and unwire vesting flags and logic from genaccounts.go +- [#2176](https://github.com/NibiruChain/nibiru/pull/2176) - tests(evm): add dirty state tests from code4rena audit #### Nibiru EVM | Before Audit 2 - 2024-12-06 From 3f5be387ce3a659233be6190dd2b09b743ceb691 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 26 Jan 2025 12:50:55 -0500 Subject: [PATCH 12/15] test(evm): add wasm precompile staking test --- x/common/testutil/testapp/test_util.go | 11 +- x/common/testutil/testapp/testapp.go | 2 + .../TestDirtyStateAttack5.json | 34 ++++++ .../contracts/TestDirtyStateAttack5.sol | 20 ++++ x/evm/embeds/embeds.go | 8 ++ x/evm/keeper/bank_extension.go | 32 ++++++ x/evm/precompile/test/export.go | 8 ++ x/evm/precompile/test/staking.wasm | Bin 195769 -> 196726 bytes x/evm/precompile/wasm_test.go | 108 +++++++++++++++++- 9 files changed, 216 insertions(+), 7 deletions(-) create mode 100644 x/evm/embeds/artifacts/contracts/TestDirtyStateAttack5.sol/TestDirtyStateAttack5.json create mode 100644 x/evm/embeds/contracts/TestDirtyStateAttack5.sol diff --git a/x/common/testutil/testapp/test_util.go b/x/common/testutil/testapp/test_util.go index c4eecceea..8e26042aa 100644 --- a/x/common/testutil/testapp/test_util.go +++ b/x/common/testutil/testapp/test_util.go @@ -16,6 +16,7 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" nibiruapp "github.com/NibiruChain/nibiru/v2/app" + "github.com/NibiruChain/nibiru/v2/app/appconst" ) // GenesisStateWithSingleValidator initializes GenesisState with a single validator and genesis accounts @@ -41,7 +42,7 @@ func GenesisStateWithSingleValidator(codec codec.Codec, genesisState nibiruapp.G balances = append(balances, banktypes.Balance{ Address: acc.GetAddress().String(), - Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(100000000000000))), + Coins: sdk.NewCoins(sdk.NewCoin(appconst.BondDenom, math.NewInt(100000000000000))), }) genesisState, err = genesisStateWithValSet(codec, genesisState, valSet, []authtypes.GenesisAccount{acc}, balances...) @@ -93,7 +94,9 @@ func genesisStateWithValSet( delegations = append(delegations, stakingtypes.NewDelegation(genAccs[0].GetAddress(), val.Address.Bytes(), math.LegacyOneDec())) } // set validators and delegations - stakingGenesis := stakingtypes.NewGenesisState(stakingtypes.DefaultParams(), validators, delegations) + stakingParams := stakingtypes.DefaultParams() + stakingParams.BondDenom = appconst.BondDenom + stakingGenesis := stakingtypes.NewGenesisState(stakingParams, validators, delegations) genesisState[stakingtypes.ModuleName] = cdc.MustMarshalJSON(stakingGenesis) totalSupply := sdk.NewCoins() @@ -104,13 +107,13 @@ func genesisStateWithValSet( for range delegations { // add delegated tokens to total supply - totalSupply = totalSupply.Add(sdk.NewCoin(sdk.DefaultBondDenom, bondAmt)) + totalSupply = totalSupply.Add(sdk.NewCoin(appconst.BondDenom, bondAmt)) } // add bonded amount to bonded pool module account balances = append(balances, banktypes.Balance{ Address: authtypes.NewModuleAddress(stakingtypes.BondedPoolName).String(), - Coins: sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, bondAmt)}, + Coins: sdk.Coins{sdk.NewCoin(appconst.BondDenom, bondAmt)}, }) // update total supply diff --git a/x/common/testutil/testapp/testapp.go b/x/common/testutil/testapp/testapp.go index d8507b099..24f39951c 100644 --- a/x/common/testutil/testapp/testapp.go +++ b/x/common/testutil/testapp/testapp.go @@ -17,6 +17,7 @@ import ( "github.com/NibiruChain/nibiru/v2/app" "github.com/NibiruChain/nibiru/v2/app/appconst" + cryptocodec "github.com/NibiruChain/nibiru/v2/eth/crypto/codec" "github.com/NibiruChain/nibiru/v2/x/common/asset" "github.com/NibiruChain/nibiru/v2/x/common/denoms" "github.com/NibiruChain/nibiru/v2/x/common/testutil" @@ -126,6 +127,7 @@ func NewNibiruTestApp(gen app.GenesisState, baseAppOptions ...func(*baseapp.Base logger := log.NewNopLogger() encoding := app.MakeEncodingConfig() + cryptocodec.RegisterInterfaces(encoding.InterfaceRegistry) SetDefaultSudoGenesis(gen) app := app.NewNibiruApp( diff --git a/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack5.sol/TestDirtyStateAttack5.json b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack5.sol/TestDirtyStateAttack5.json new file mode 100644 index 000000000..80d00a824 --- /dev/null +++ b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack5.sol/TestDirtyStateAttack5.json @@ -0,0 +1,34 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TestDirtyStateAttack5", + "sourceName": "contracts/TestDirtyStateAttack5.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "payable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "wasmAddr", + "type": "string" + }, + { + "internalType": "bytes", + "name": "msgArgs", + "type": "bytes" + } + ], + "name": "attack", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x6080604052610760806100136000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806333c8899714610030575b600080fd5b61004a6004803603810190610045919061028d565b61004c565b005b6000600167ffffffffffffffff8111156100695761006861030e565b5b6040519080825280602002602001820160405280156100a257816020015b61008f6101a4565b8152602001906001900390816100875790505b50905060405180604001604052806040518060400160405280600581526020017f756e6962690000000000000000000000000000000000000000000000000000008152508152602001624c4b40815250816000815181106101065761010561033d565b5b602002602001018190525061080273ffffffffffffffffffffffffffffffffffffffff166361ffaee486868686866040518663ffffffff1660e01b815260040161015495949392919061059f565b6000604051808303816000875af1158015610173573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061019c91906106e1565b505050505050565b604051806040016040528060608152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126101f7576101f66101d2565b5b8235905067ffffffffffffffff811115610214576102136101d7565b5b6020830191508360018202830111156102305761022f6101dc565b5b9250929050565b60008083601f84011261024d5761024c6101d2565b5b8235905067ffffffffffffffff81111561026a576102696101d7565b5b602083019150836001820283011115610286576102856101dc565b5b9250929050565b600080600080604085870312156102a7576102a66101c8565b5b600085013567ffffffffffffffff8111156102c5576102c46101cd565b5b6102d1878288016101e1565b9450945050602085013567ffffffffffffffff8111156102f4576102f36101cd565b5b61030087828801610237565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006103a9838561036c565b93506103b683858461037d565b6103bf8361038c565b840190509392505050565b600082825260208201905092915050565b60006103e783856103ca565b93506103f483858461037d565b6103fd8361038c565b840190509392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561046e578082015181840152602081019050610453565b60008484015250505050565b600061048582610434565b61048f818561043f565b935061049f818560208601610450565b6104a88161038c565b840191505092915050565b6000819050919050565b6104c6816104b3565b82525050565b600060408301600083015184820360008601526104e9828261047a565b91505060208301516104fe60208601826104bd565b508091505092915050565b600061051583836104cc565b905092915050565b6000602082019050919050565b600061053582610408565b61053f8185610413565b93508360208202850161055185610424565b8060005b8581101561058d578484038952815161056e8582610509565b94506105798361051d565b925060208a01995050600181019050610555565b50829750879550505050505092915050565b600060608201905081810360008301526105ba81878961039d565b905081810360208301526105cf8185876103db565b905081810360408301526105e3818461052a565b90509695505050505050565b600080fd5b6105fd8261038c565b810181811067ffffffffffffffff8211171561061c5761061b61030e565b5b80604052505050565b600061062f6101be565b905061063b82826105f4565b919050565b600067ffffffffffffffff82111561065b5761065a61030e565b5b6106648261038c565b9050602081019050919050565b600061068461067f84610640565b610625565b9050828152602081018484840111156106a05761069f6105ef565b5b6106ab848285610450565b509392505050565b600082601f8301126106c8576106c76101d2565b5b81516106d8848260208601610671565b91505092915050565b6000602082840312156106f7576106f66101c8565b5b600082015167ffffffffffffffff811115610715576107146101cd565b5b610721848285016106b3565b9150509291505056fea2646970667358221220035e628d5c38012c486ab00ce495fa418401de59d5a1cbfe1e48245374f7d1be64736f6c63430008180033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c806333c8899714610030575b600080fd5b61004a6004803603810190610045919061028d565b61004c565b005b6000600167ffffffffffffffff8111156100695761006861030e565b5b6040519080825280602002602001820160405280156100a257816020015b61008f6101a4565b8152602001906001900390816100875790505b50905060405180604001604052806040518060400160405280600581526020017f756e6962690000000000000000000000000000000000000000000000000000008152508152602001624c4b40815250816000815181106101065761010561033d565b5b602002602001018190525061080273ffffffffffffffffffffffffffffffffffffffff166361ffaee486868686866040518663ffffffff1660e01b815260040161015495949392919061059f565b6000604051808303816000875af1158015610173573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061019c91906106e1565b505050505050565b604051806040016040528060608152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126101f7576101f66101d2565b5b8235905067ffffffffffffffff811115610214576102136101d7565b5b6020830191508360018202830111156102305761022f6101dc565b5b9250929050565b60008083601f84011261024d5761024c6101d2565b5b8235905067ffffffffffffffff81111561026a576102696101d7565b5b602083019150836001820283011115610286576102856101dc565b5b9250929050565b600080600080604085870312156102a7576102a66101c8565b5b600085013567ffffffffffffffff8111156102c5576102c46101cd565b5b6102d1878288016101e1565b9450945050602085013567ffffffffffffffff8111156102f4576102f36101cd565b5b61030087828801610237565b925092505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006103a9838561036c565b93506103b683858461037d565b6103bf8361038c565b840190509392505050565b600082825260208201905092915050565b60006103e783856103ca565b93506103f483858461037d565b6103fd8361038c565b840190509392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561046e578082015181840152602081019050610453565b60008484015250505050565b600061048582610434565b61048f818561043f565b935061049f818560208601610450565b6104a88161038c565b840191505092915050565b6000819050919050565b6104c6816104b3565b82525050565b600060408301600083015184820360008601526104e9828261047a565b91505060208301516104fe60208601826104bd565b508091505092915050565b600061051583836104cc565b905092915050565b6000602082019050919050565b600061053582610408565b61053f8185610413565b93508360208202850161055185610424565b8060005b8581101561058d578484038952815161056e8582610509565b94506105798361051d565b925060208a01995050600181019050610555565b50829750879550505050505092915050565b600060608201905081810360008301526105ba81878961039d565b905081810360208301526105cf8185876103db565b905081810360408301526105e3818461052a565b90509695505050505050565b600080fd5b6105fd8261038c565b810181811067ffffffffffffffff8211171561061c5761061b61030e565b5b80604052505050565b600061062f6101be565b905061063b82826105f4565b919050565b600067ffffffffffffffff82111561065b5761065a61030e565b5b6106648261038c565b9050602081019050919050565b600061068461067f84610640565b610625565b9050828152602081018484840111156106a05761069f6105ef565b5b6106ab848285610450565b509392505050565b600082601f8301126106c8576106c76101d2565b5b81516106d8848260208601610671565b91505092915050565b6000602082840312156106f7576106f66101c8565b5b600082015167ffffffffffffffff811115610715576107146101cd565b5b610721848285016106b3565b9150509291505056fea2646970667358221220035e628d5c38012c486ab00ce495fa418401de59d5a1cbfe1e48245374f7d1be64736f6c63430008180033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/x/evm/embeds/contracts/TestDirtyStateAttack5.sol b/x/evm/embeds/contracts/TestDirtyStateAttack5.sol new file mode 100644 index 000000000..443738520 --- /dev/null +++ b/x/evm/embeds/contracts/TestDirtyStateAttack5.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; +import "./Wasm.sol"; +import "./NibiruEvmUtils.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract TestDirtyStateAttack5 { + constructor() payable {} + + function attack(string calldata wasmAddr, bytes calldata msgArgs) external { + INibiruEvm.BankCoin[] memory funds = new INibiruEvm.BankCoin[](1); + funds[0] = INibiruEvm.BankCoin({denom: "unibi", amount: 5e6}); // 5 NIBI + + WASM_PRECOMPILE.execute(wasmAddr, msgArgs, funds); + } +} diff --git a/x/evm/embeds/embeds.go b/x/evm/embeds/embeds.go index 69eff0fae..6c415f378 100644 --- a/x/evm/embeds/embeds.go +++ b/x/evm/embeds/embeds.go @@ -55,6 +55,8 @@ var ( testDirtyStateAttack3 []byte //go:embed artifacts/contracts/TestDirtyStateAttack4.sol/TestDirtyStateAttack4.json testDirtyStateAttack4 []byte + //go:embed artifacts/contracts/TestDirtyStateAttack5.sol/TestDirtyStateAttack5.json + testDirtyStateAttack5 []byte ) var ( @@ -182,6 +184,11 @@ var ( Name: "TestDirtyStateAttack4.sol", EmbedJSON: testDirtyStateAttack4, } + // SmartContract_TestDirtyStateAttack5 is a test contract that calls a wasm contract with 5 NIBI + SmartContract_TestDirtyStateAttack5 = CompiledEvmContract{ + Name: "TestDirtyStateAttack5.sol", + EmbedJSON: testDirtyStateAttack5, + } ) func init() { @@ -205,6 +212,7 @@ func init() { SmartContract_TestDirtyStateAttack2.MustLoad() SmartContract_TestDirtyStateAttack3.MustLoad() SmartContract_TestDirtyStateAttack4.MustLoad() + SmartContract_TestDirtyStateAttack5.MustLoad() } type CompiledEvmContract struct { diff --git a/x/evm/keeper/bank_extension.go b/x/evm/keeper/bank_extension.go index aa4fe101c..587135ac2 100644 --- a/x/evm/keeper/bank_extension.go +++ b/x/evm/keeper/bank_extension.go @@ -89,6 +89,38 @@ func (bk NibiruBankKeeper) UndelegateCoins( ) } +func (bk NibiruBankKeeper) DelegateCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error { + return bk.ForceGasInvariant( + ctx, + func(ctx sdk.Context) error { + return bk.BaseKeeper.DelegateCoinsFromAccountToModule(ctx, senderAddr, recipientModule, amt) + }, + func(ctx sdk.Context) { + if findEtherBalanceChangeFromCoins(amt) { + bk.SyncStateDBWithAccount(ctx, senderAddr) + moduleBech32Addr := auth.NewModuleAddress(recipientModule) + bk.SyncStateDBWithAccount(ctx, moduleBech32Addr) + } + }, + ) +} + +func (bk NibiruBankKeeper) UndelegateCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error { + return bk.ForceGasInvariant( + ctx, + func(ctx sdk.Context) error { + return bk.BaseKeeper.UndelegateCoinsFromModuleToAccount(ctx, senderModule, recipientAddr, amt) + }, + func(ctx sdk.Context) { + if findEtherBalanceChangeFromCoins(amt) { + moduleBech32Addr := auth.NewModuleAddress(senderModule) + bk.SyncStateDBWithAccount(ctx, moduleBech32Addr) + bk.SyncStateDBWithAccount(ctx, recipientAddr) + } + }, + ) +} + func (bk NibiruBankKeeper) MintCoins( ctx sdk.Context, moduleName string, diff --git a/x/evm/precompile/test/export.go b/x/evm/precompile/test/export.go index 2bdc86994..01104f0bf 100644 --- a/x/evm/precompile/test/export.go +++ b/x/evm/precompile/test/export.go @@ -49,6 +49,10 @@ func SetupWasmContracts(deps *evmtest.TestDeps, s *suite.Suite) ( InstantiateMsg: []byte(`{}`), Label: "https://github.com/k-yang/nibiru-wasm-plus/tree/main/contracts/bank-transfer/", }, + { + InstantiateMsg: []byte(`{}`), + Label: "https://github.com/k-yang/nibiru-wasm-plus/tree/main/contracts/staking/", + }, } for i, wasmCode := range wasmCodes { @@ -102,6 +106,10 @@ func deployWasmBytecode( // https://github.com/k-yang/nibiru-wasm-plus/tree/main/contracts/bank-transfer/ "x/evm/precompile/test/bank_transfer.wasm", + // staking.wasm is a compiled version of: + // https://github.com/k-yang/nibiru-wasm-plus/tree/main/contracts/staking/ + "x/evm/precompile/test/staking.wasm", + // Add other wasm bytecode here if needed... } { binPath := path.Join(rootPath, wasmFile) diff --git a/x/evm/precompile/test/staking.wasm b/x/evm/precompile/test/staking.wasm index 38a6fc91e69b1f5322535c58505b9629f41501dd..d902c74af72b241c373d8ed8c7871744ea8fe806 100644 GIT binary patch delta 51585 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ⅇ+fR-CniL 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 P{5sGM?UVpa9d7zxOvG-2 diff --git a/x/evm/precompile/wasm_test.go b/x/evm/precompile/wasm_test.go index 71d370499..fea71d03b 100644 --- a/x/evm/precompile/wasm_test.go +++ b/x/evm/precompile/wasm_test.go @@ -6,7 +6,12 @@ import ( "math/big" "testing" + "cosmossdk.io/math" wasm "github.com/CosmWasm/wasmd/x/wasm/types" + sdk "github.com/cosmos/cosmos-sdk/types" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/stretchr/testify/suite" "github.com/NibiruChain/nibiru/v2/eth" "github.com/NibiruChain/nibiru/v2/x/common/testutil" @@ -17,9 +22,6 @@ import ( "github.com/NibiruChain/nibiru/v2/x/evm/precompile" "github.com/NibiruChain/nibiru/v2/x/evm/precompile/test" tokenfactory "github.com/NibiruChain/nibiru/v2/x/tokenfactory/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" ) // rough gas limits for wasm execution - used in tests only @@ -668,3 +670,103 @@ func (s *WasmSuite) TestWasmPrecompileDirtyStateAttack4() { s.Require().Equal(balanceTestContract.Amount.BigInt(), big.NewInt(9e6)) }) } + +// TestDirtyStateAttack5 +// 1. Deploy a simple wasm contract that stakes NIBI +// 2. Calls the test contract +// a. call the wasm precompile which calls the wasm contract that stakes 5 NIBI +// +// INITIAL STATE: +// - Test contract funds: 10 NIBI +// CONTRACT CALL: +// - Sends 5 NIBI to the wasm contract +// - The wasm contract stakes 5 NIBI +// EXPECTED: +// - Test contract funds: 5 NIBI +// - Staked NIBI from wasm contract: 5 NIBI +// - Wasm contract: 0 NIBI +func (s *WasmSuite) TestWasmPrecompileDirtyStateAttack5() { + deps := evmtest.NewTestDeps() + + wasmContracts := test.SetupWasmContracts(&deps, &s.Suite) + wasmContract := wasmContracts[3] // staking.wasm + + s.T().Log("Deploy Test Contract") + deployResp, err := evmtest.DeployContract( + &deps, + embeds.SmartContract_TestDirtyStateAttack5, + ) + s.Require().NoError(err) + testContractAddr := deployResp.ContractAddr + + s.Run("Mint 10 NIBI to test contract", func() { + s.Require().NoError(testapp.FundAccount( + deps.App.BankKeeper, + deps.Ctx, + eth.EthAddrToNibiruAddr(testContractAddr), + sdk.NewCoins(sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6))), + )) + }) + + validator := evmtest.NewEthPrivAcc() + s.Run("create validator", func() { + s.Require().NoError(testapp.FundAccount( + deps.App.BankKeeper, + deps.Ctx, + validator.NibiruAddr, + sdk.NewCoins(sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6))), + )) + + createValMsg, err := stakingtypes.NewMsgCreateValidator( + sdk.ValAddress(validator.NibiruAddr), + validator.PrivKey.PubKey(), + sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6)), + stakingtypes.NewDescription("validator0", "", "", "", ""), + stakingtypes.NewCommissionRates(sdk.NewDec(1), sdk.NewDec(1), sdk.NewDec(1)), + math.OneInt(), + ) + s.Require().NoError(err) + + stakingMsgServer := stakingkeeper.NewMsgServerImpl(deps.App.StakingKeeper) + resp, err := stakingMsgServer.CreateValidator(deps.Ctx, createValMsg) + s.Require().NoError(err) + s.Require().NotNil(resp) + }) + + s.Run("call test contract", func() { + msgArgsBz := []byte(fmt.Sprintf(`{"run": {"validator": "%s"}}`, sdk.ValAddress(validator.NibiruAddr).String())) + contractInput, err := embeds.SmartContract_TestDirtyStateAttack5.ABI.Pack( + "attack", + wasmContract.String(), + msgArgsBz, + ) + s.Require().NoError(err) + + evmObj, _ := deps.NewEVM() + _, err = deps.EvmKeeper.CallContractWithInput( + deps.Ctx, + evmObj, + deps.Sender.EthAddr, + &testContractAddr, + true, + contractInput, + evmtest.FunTokenGasLimitSendToEvm, + ) + s.Require().NoError(err) + + testContractBalance := deps.App.BankKeeper.GetBalance(deps.Ctx, eth.EthAddrToNibiruAddr(testContractAddr), evm.EVMBankDenom) + s.Require().Equal(testContractBalance.Amount.BigInt(), big.NewInt(5e6)) + + wasmContractBalance := deps.App.BankKeeper.GetBalance(deps.Ctx, wasmContract, evm.EVMBankDenom) + s.Require().Equal(wasmContractBalance.Amount.BigInt(), big.NewInt(0)) + + delegations := deps.App.StakingKeeper.GetAllDelegatorDelegations(deps.Ctx, wasmContract) + s.Require().Equal(len(delegations), 1) + s.Require().Equal(sdk.ValAddress(validator.NibiruAddr).String(), delegations[0].ValidatorAddress) + + // after converting the wasm contract address to an eth address, check the balances + wasmContractEthAddr := eth.NibiruAddrToEthAddr(wasmContract) + balance := deps.App.BankKeeper.GetBalance(deps.Ctx, eth.EthAddrToNibiruAddr(wasmContractEthAddr), evm.EVMBankDenom) + s.Require().Equal(big.NewInt(0), balance.Amount.BigInt()) + }) +} From 3525b2e269f584915119f96b7419e716c95efb20 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 26 Jan 2025 13:16:13 -0500 Subject: [PATCH 13/15] fix: total supply calc in tests --- x/common/testutil/testapp/test_util.go | 2 +- x/inflation/keeper/inflation_test.go | 8 ++++---- x/inflation/keeper/keeper_test.go | 6 +++--- x/tokenfactory/keeper/msg_server_test.go | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/x/common/testutil/testapp/test_util.go b/x/common/testutil/testapp/test_util.go index 8e26042aa..d94318da1 100644 --- a/x/common/testutil/testapp/test_util.go +++ b/x/common/testutil/testapp/test_util.go @@ -42,7 +42,7 @@ func GenesisStateWithSingleValidator(codec codec.Codec, genesisState nibiruapp.G balances = append(balances, banktypes.Balance{ Address: acc.GetAddress().String(), - Coins: sdk.NewCoins(sdk.NewCoin(appconst.BondDenom, math.NewInt(100000000000000))), + Coins: sdk.NewCoins(sdk.NewCoin(appconst.BondDenom, math.NewIntFromUint64(1e14))), }) genesisState, err = genesisStateWithValSet(codec, genesisState, valSet, []authtypes.GenesisAccount{acc}, balances...) diff --git a/x/inflation/keeper/inflation_test.go b/x/inflation/keeper/inflation_test.go index 00b8b9870..6831f656f 100644 --- a/x/inflation/keeper/inflation_test.go +++ b/x/inflation/keeper/inflation_test.go @@ -137,7 +137,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { }{ { "no epochs per period", - sdk.TokensFromConsensusPower(400_000_000, sdk.DefaultPowerReduction), + sdk.TokensFromConsensusPower(400_000_000-100_000_001, sdk.DefaultPowerReduction), func(nibiruApp *app.NibiruApp, ctx sdk.Context) { nibiruApp.InflationKeeper.Params.Set(ctx, types.Params{ EpochsPerPeriod: 0, @@ -150,7 +150,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { }, { "high supply", - sdk.TokensFromConsensusPower(800_000_000, sdk.DefaultPowerReduction), + sdk.TokensFromConsensusPower(800_000_000-100_000_001, sdk.DefaultPowerReduction), func(nibiruApp *app.NibiruApp, ctx sdk.Context) { params := nibiruApp.InflationKeeper.GetParams(ctx) params.InflationEnabled = true @@ -160,7 +160,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { }, { "low supply", - sdk.TokensFromConsensusPower(400_000_000, sdk.DefaultPowerReduction), + sdk.TokensFromConsensusPower(400_000_000-100_000_001, sdk.DefaultPowerReduction), func(nibiruApp *app.NibiruApp, ctx sdk.Context) { params := nibiruApp.InflationKeeper.GetParams(ctx) params.InflationEnabled = true @@ -184,7 +184,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { require.NoError(t, err) circulatingSupply := nibiruApp.InflationKeeper.GetCirculatingSupply(ctx, denoms.NIBI) - require.EqualValues(t, tc.supply, circulatingSupply) + require.EqualValues(t, tc.supply.Add(sdk.TokensFromConsensusPower(100_000_001, sdk.DefaultPowerReduction)), circulatingSupply) inflationRate := nibiruApp.InflationKeeper.GetInflationRate(ctx, denoms.NIBI) require.Equal(t, tc.expInflationRate, inflationRate) diff --git a/x/inflation/keeper/keeper_test.go b/x/inflation/keeper/keeper_test.go index 46f1619fc..b3f24b2ee 100644 --- a/x/inflation/keeper/keeper_test.go +++ b/x/inflation/keeper/keeper_test.go @@ -55,17 +55,17 @@ func TestBurn(t *testing.T) { ) supply := nibiruApp.BankKeeper.GetSupply(ctx, "unibi") - require.Equal(t, tc.mintCoin.Amount, supply.Amount) + require.Equal(t, tc.mintCoin.Amount.Add(sdk.TokensFromConsensusPower(100_000_001, sdk.DefaultPowerReduction)), supply.Amount) // Burn coins err := nibiruApp.InflationKeeper.Burn(ctx, sdk.NewCoins(tc.burnCoin), tc.sender) supply = nibiruApp.BankKeeper.GetSupply(ctx, "unibi") if tc.expectedErr != nil { require.EqualError(t, err, tc.expectedErr.Error()) - require.Equal(t, tc.mintCoin.Amount, supply.Amount) + require.Equal(t, tc.mintCoin.Amount.Add(sdk.TokensFromConsensusPower(100_000_001, sdk.DefaultPowerReduction)), supply.Amount) } else { require.NoError(t, err) - require.Equal(t, math.ZeroInt(), supply.Amount) + require.Equal(t, sdk.TokensFromConsensusPower(100_000_001, sdk.DefaultPowerReduction), supply.Amount) } }) } diff --git a/x/tokenfactory/keeper/msg_server_test.go b/x/tokenfactory/keeper/msg_server_test.go index 0d7ce4f04..a403a1618 100644 --- a/x/tokenfactory/keeper/msg_server_test.go +++ b/x/tokenfactory/keeper/msg_server_test.go @@ -662,7 +662,7 @@ func (s *TestSuite) TestBurnNative() { }, PostHook: func(ctx sdk.Context, bapp *app.NibiruApp) { s.Equal( - math.NewInt(0), s.app.BankKeeper.GetSupply(s.ctx, "unibi").Amount, + sdk.TokensFromConsensusPower(100_000_001, sdk.DefaultPowerReduction), s.app.BankKeeper.GetSupply(s.ctx, "unibi").Amount, ) s.Equal( @@ -696,7 +696,7 @@ func (s *TestSuite) TestBurnNative() { }, PostHook: func(ctx sdk.Context, bapp *app.NibiruApp) { s.Equal( - math.NewInt(123), s.app.BankKeeper.GetSupply(s.ctx, "unibi").Amount, + math.NewInt(123).Add(sdk.TokensFromConsensusPower(100_000_001, sdk.DefaultPowerReduction)), s.app.BankKeeper.GetSupply(s.ctx, "unibi").Amount, ) s.Equal( From d0ffddcdd8a5efbe2863a1a107ff683749fbd29a Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 27 Jan 2025 10:58:26 -0500 Subject: [PATCH 14/15] test(evm): remove dirty state attacks 1-3 due to being duplicates --- .../TestDirtyStateAttack1.json | 40 --- .../TestDirtyStateAttack2.json | 40 --- .../TestDirtyStateAttack3.json | 58 ---- .../contracts/TestDirtyStateAttack1.sol | 34 --- .../contracts/TestDirtyStateAttack2.sol | 37 --- .../contracts/TestDirtyStateAttack3.sol | 53 ---- x/evm/embeds/embeds.go | 24 -- x/evm/keeper/funtoken_from_coin_test.go | 287 ------------------ 8 files changed, 573 deletions(-) delete mode 100644 x/evm/embeds/artifacts/contracts/TestDirtyStateAttack1.sol/TestDirtyStateAttack1.json delete mode 100644 x/evm/embeds/artifacts/contracts/TestDirtyStateAttack2.sol/TestDirtyStateAttack2.json delete mode 100644 x/evm/embeds/artifacts/contracts/TestDirtyStateAttack3.sol/TestDirtyStateAttack3.json delete mode 100644 x/evm/embeds/contracts/TestDirtyStateAttack1.sol delete mode 100644 x/evm/embeds/contracts/TestDirtyStateAttack2.sol delete mode 100644 x/evm/embeds/contracts/TestDirtyStateAttack3.sol diff --git a/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack1.sol/TestDirtyStateAttack1.json b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack1.sol/TestDirtyStateAttack1.json deleted file mode 100644 index 190d3dc8a..000000000 --- a/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack1.sol/TestDirtyStateAttack1.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "TestDirtyStateAttack1", - "sourceName": "contracts/TestDirtyStateAttack1.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "erc20_", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "sendRecipient", - "type": "address" - }, - { - "internalType": "string", - "name": "bech32Recipient", - "type": "string" - } - ], - "name": "attack", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x608060405234801561001057600080fd5b506040516107da3803806107da833981810160405281019061003291906100db565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610108565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a88261007d565b9050919050565b6100b88161009d565b81146100c357600080fd5b50565b6000815190506100d5816100af565b92915050565b6000602082840312156100f1576100f0610078565b5b60006100ff848285016100c6565b91505092915050565b6106c3806101176000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e655beb414610030575b600080fd5b61004a6004803603810190610045919061040f565b61004c565b005b60008273ffffffffffffffffffffffffffffffffffffffff166108fc678ac7230489e800009081150290604051600060405180830381858888f193505050509050806100cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c4906104c8565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16629896808560405160240161012093929190610590565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101aa9190610615565b6000604051808303816000865af19150503d80600081146101e7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ec565b606091505b505090508060405160200161020090610652565b60405160208183030381529060405290610250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610247919061066b565b60405180910390fd5b5050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102968261026b565b9050919050565b6102a68161028b565b81146102b157600080fd5b50565b6000813590506102c38161029d565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61031c826102d3565b810181811067ffffffffffffffff8211171561033b5761033a6102e4565b5b80604052505050565b600061034e610257565b905061035a8282610313565b919050565b600067ffffffffffffffff82111561037a576103796102e4565b5b610383826102d3565b9050602081019050919050565b82818337600083830152505050565b60006103b26103ad8461035f565b610344565b9050828152602081018484840111156103ce576103cd6102ce565b5b6103d9848285610390565b509392505050565b600082601f8301126103f6576103f56102c9565b5b813561040684826020860161039f565b91505092915050565b6000806040838503121561042657610425610261565b5b6000610434858286016102b4565b925050602083013567ffffffffffffffff81111561045557610454610266565b5b610461858286016103e1565b9150509250929050565b600082825260208201905092915050565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b60006104b260148361046b565b91506104bd8261047c565b602082019050919050565b600060208201905081810360008301526104e1816104a5565b9050919050565b60006104f38261026b565b9050919050565b610503816104e8565b82525050565b6000819050919050565b61051c81610509565b82525050565b600081519050919050565b60005b8381101561054b578082015181840152602081019050610530565b60008484015250505050565b600061056282610522565b61056c818561046b565b935061057c81856020860161052d565b610585816102d3565b840191505092915050565b60006060820190506105a560008301866104fa565b6105b26020830185610513565b81810360408301526105c48184610557565b9050949350505050565b600081519050919050565b600081905092915050565b60006105ef826105ce565b6105f981856105d9565b935061060981856020860161052d565b80840191505092915050565b600061062182846105e4565b915081905092915050565b7f4661696c656420746f2063616c6c2062616e6b53656e64000000000000000000815250565b600061065d8261062c565b601782019150819050919050565b600060208201905081810360008301526106858184610557565b90509291505056fea2646970667358221220b1d6754ff01a90b91186ccf26633cba5add088b2b0240f20b7d32cd876e2820764736f6c63430008180033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e655beb414610030575b600080fd5b61004a6004803603810190610045919061040f565b61004c565b005b60008273ffffffffffffffffffffffffffffffffffffffff166108fc678ac7230489e800009081150290604051600060405180830381858888f193505050509050806100cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c4906104c8565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16629896808560405160240161012093929190610590565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101aa9190610615565b6000604051808303816000865af19150503d80600081146101e7576040519150601f19603f3d011682016040523d82523d6000602084013e6101ec565b606091505b505090508060405160200161020090610652565b60405160208183030381529060405290610250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610247919061066b565b60405180910390fd5b5050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102968261026b565b9050919050565b6102a68161028b565b81146102b157600080fd5b50565b6000813590506102c38161029d565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61031c826102d3565b810181811067ffffffffffffffff8211171561033b5761033a6102e4565b5b80604052505050565b600061034e610257565b905061035a8282610313565b919050565b600067ffffffffffffffff82111561037a576103796102e4565b5b610383826102d3565b9050602081019050919050565b82818337600083830152505050565b60006103b26103ad8461035f565b610344565b9050828152602081018484840111156103ce576103cd6102ce565b5b6103d9848285610390565b509392505050565b600082601f8301126103f6576103f56102c9565b5b813561040684826020860161039f565b91505092915050565b6000806040838503121561042657610425610261565b5b6000610434858286016102b4565b925050602083013567ffffffffffffffff81111561045557610454610266565b5b610461858286016103e1565b9150509250929050565b600082825260208201905092915050565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b60006104b260148361046b565b91506104bd8261047c565b602082019050919050565b600060208201905081810360008301526104e1816104a5565b9050919050565b60006104f38261026b565b9050919050565b610503816104e8565b82525050565b6000819050919050565b61051c81610509565b82525050565b600081519050919050565b60005b8381101561054b578082015181840152602081019050610530565b60008484015250505050565b600061056282610522565b61056c818561046b565b935061057c81856020860161052d565b610585816102d3565b840191505092915050565b60006060820190506105a560008301866104fa565b6105b26020830185610513565b81810360408301526105c48184610557565b9050949350505050565b600081519050919050565b600081905092915050565b60006105ef826105ce565b6105f981856105d9565b935061060981856020860161052d565b80840191505092915050565b600061062182846105e4565b915081905092915050565b7f4661696c656420746f2063616c6c2062616e6b53656e64000000000000000000815250565b600061065d8261062c565b601782019150819050919050565b600060208201905081810360008301526106858184610557565b90509291505056fea2646970667358221220b1d6754ff01a90b91186ccf26633cba5add088b2b0240f20b7d32cd876e2820764736f6c63430008180033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack2.sol/TestDirtyStateAttack2.json b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack2.sol/TestDirtyStateAttack2.json deleted file mode 100644 index f463fec12..000000000 --- a/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack2.sol/TestDirtyStateAttack2.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "TestDirtyStateAttack2", - "sourceName": "contracts/TestDirtyStateAttack2.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "erc20_", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "sendRecipient", - "type": "address" - }, - { - "internalType": "string", - "name": "bech32Recipient", - "type": "string" - } - ], - "name": "attack", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x608060405234801561001057600080fd5b50604051610960380380610960833981810160405281019061003291906100db565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610108565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a88261007d565b9050919050565b6100b88161009d565b81146100c357600080fd5b50565b6000815190506100d5816100af565b92915050565b6000602082840312156100f1576100f0610078565b5b60006100ff848285016100c6565b91505092915050565b610849806101176000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e655beb414610030575b600080fd5b61004a6004803603810190610045919061046d565b61004c565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83620f42406040518363ffffffff1660e01b81526004016100aa92919061056d565b6020604051808303816000875af11580156100c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ed91906105ce565b61012c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012390610658565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16628954408460405160240161017f93929190610716565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610209919061079b565b6000604051808303816000865af19150503d8060008114610246576040519150601f19603f3d011682016040523d82523d6000602084013e61024b565b606091505b505090508060405160200161025f906107d8565b604051602081830303815290604052906102af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102a691906107f1565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102f4826102c9565b9050919050565b610304816102e9565b811461030f57600080fd5b50565b600081359050610321816102fb565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61037a82610331565b810181811067ffffffffffffffff8211171561039957610398610342565b5b80604052505050565b60006103ac6102b5565b90506103b88282610371565b919050565b600067ffffffffffffffff8211156103d8576103d7610342565b5b6103e182610331565b9050602081019050919050565b82818337600083830152505050565b600061041061040b846103bd565b6103a2565b90508281526020810184848401111561042c5761042b61032c565b5b6104378482856103ee565b509392505050565b600082601f83011261045457610453610327565b5b81356104648482602086016103fd565b91505092915050565b60008060408385031215610484576104836102bf565b5b600061049285828601610312565b925050602083013567ffffffffffffffff8111156104b3576104b26102c4565b5b6104bf8582860161043f565b9150509250929050565b6000819050919050565b60006104ee6104e96104e4846102c9565b6104c9565b6102c9565b9050919050565b6000610500826104d3565b9050919050565b6000610512826104f5565b9050919050565b61052281610507565b82525050565b6000819050919050565b6000819050919050565b600061055761055261054d84610528565b6104c9565b610532565b9050919050565b6105678161053c565b82525050565b60006040820190506105826000830185610519565b61058f602083018461055e565b9392505050565b60008115159050919050565b6105ab81610596565b81146105b657600080fd5b50565b6000815190506105c8816105a2565b92915050565b6000602082840312156105e4576105e36102bf565b5b60006105f2848285016105b9565b91505092915050565b600082825260208201905092915050565b7f4552432d3230207472616e73666572206661696c656400000000000000000000600082015250565b60006106426016836105fb565b915061064d8261060c565b602082019050919050565b6000602082019050818103600083015261067181610635565b9050919050565b6000610683826102c9565b9050919050565b61069381610678565b82525050565b6106a281610532565b82525050565b600081519050919050565b60005b838110156106d15780820151818401526020810190506106b6565b60008484015250505050565b60006106e8826106a8565b6106f281856105fb565b93506107028185602086016106b3565b61070b81610331565b840191505092915050565b600060608201905061072b600083018661068a565b6107386020830185610699565b818103604083015261074a81846106dd565b9050949350505050565b600081519050919050565b600081905092915050565b600061077582610754565b61077f818561075f565b935061078f8185602086016106b3565b80840191505092915050565b60006107a7828461076a565b915081905092915050565b7f4661696c656420746f2063616c6c2073656e64546f42616e6b00000000000000815250565b60006107e3826107b2565b601982019150819050919050565b6000602082019050818103600083015261080b81846106dd565b90509291505056fea2646970667358221220f7c1135bb3f393a158817da7f32fcaeb3d691627a2718c4344d6401ed4e4d4a064736f6c63430008180033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063e655beb414610030575b600080fd5b61004a6004803603810190610045919061046d565b61004c565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83620f42406040518363ffffffff1660e01b81526004016100aa92919061056d565b6020604051808303816000875af11580156100c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ed91906105ce565b61012c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012390610658565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16628954408460405160240161017f93929190610716565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610209919061079b565b6000604051808303816000865af19150503d8060008114610246576040519150601f19603f3d011682016040523d82523d6000602084013e61024b565b606091505b505090508060405160200161025f906107d8565b604051602081830303815290604052906102af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102a691906107f1565b60405180910390fd5b50505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102f4826102c9565b9050919050565b610304816102e9565b811461030f57600080fd5b50565b600081359050610321816102fb565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61037a82610331565b810181811067ffffffffffffffff8211171561039957610398610342565b5b80604052505050565b60006103ac6102b5565b90506103b88282610371565b919050565b600067ffffffffffffffff8211156103d8576103d7610342565b5b6103e182610331565b9050602081019050919050565b82818337600083830152505050565b600061041061040b846103bd565b6103a2565b90508281526020810184848401111561042c5761042b61032c565b5b6104378482856103ee565b509392505050565b600082601f83011261045457610453610327565b5b81356104648482602086016103fd565b91505092915050565b60008060408385031215610484576104836102bf565b5b600061049285828601610312565b925050602083013567ffffffffffffffff8111156104b3576104b26102c4565b5b6104bf8582860161043f565b9150509250929050565b6000819050919050565b60006104ee6104e96104e4846102c9565b6104c9565b6102c9565b9050919050565b6000610500826104d3565b9050919050565b6000610512826104f5565b9050919050565b61052281610507565b82525050565b6000819050919050565b6000819050919050565b600061055761055261054d84610528565b6104c9565b610532565b9050919050565b6105678161053c565b82525050565b60006040820190506105826000830185610519565b61058f602083018461055e565b9392505050565b60008115159050919050565b6105ab81610596565b81146105b657600080fd5b50565b6000815190506105c8816105a2565b92915050565b6000602082840312156105e4576105e36102bf565b5b60006105f2848285016105b9565b91505092915050565b600082825260208201905092915050565b7f4552432d3230207472616e73666572206661696c656400000000000000000000600082015250565b60006106426016836105fb565b915061064d8261060c565b602082019050919050565b6000602082019050818103600083015261067181610635565b9050919050565b6000610683826102c9565b9050919050565b61069381610678565b82525050565b6106a281610532565b82525050565b600081519050919050565b60005b838110156106d15780820151818401526020810190506106b6565b60008484015250505050565b60006106e8826106a8565b6106f281856105fb565b93506107028185602086016106b3565b61070b81610331565b840191505092915050565b600060608201905061072b600083018661068a565b6107386020830185610699565b818103604083015261074a81846106dd565b9050949350505050565b600081519050919050565b600081905092915050565b600061077582610754565b61077f818561075f565b935061078f8185602086016106b3565b80840191505092915050565b60006107a7828461076a565b915081905092915050565b7f4661696c656420746f2063616c6c2073656e64546f42616e6b00000000000000815250565b60006107e3826107b2565b601982019150819050919050565b6000602082019050818103600083015261080b81846106dd565b90509291505056fea2646970667358221220f7c1135bb3f393a158817da7f32fcaeb3d691627a2718c4344d6401ed4e4d4a064736f6c63430008180033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack3.sol/TestDirtyStateAttack3.json b/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack3.sol/TestDirtyStateAttack3.json deleted file mode 100644 index 9b232ec8f..000000000 --- a/x/evm/embeds/artifacts/contracts/TestDirtyStateAttack3.sol/TestDirtyStateAttack3.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "TestDirtyStateAttack3", - "sourceName": "contracts/TestDirtyStateAttack3.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "erc20_", - "type": "address" - } - ], - "stateMutability": "payable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "sendRecipient", - "type": "address" - }, - { - "internalType": "string", - "name": "bech32Recipient", - "type": "string" - } - ], - "name": "attack", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "sendRecipient", - "type": "address" - }, - { - "internalType": "string", - "name": "bech32Recipient", - "type": "string" - } - ], - "name": "transferFunds", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x6080604052600060015560405161094c38038061094c833981810160405281019061002a91906100d3565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610100565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a082610075565b9050919050565b6100b081610095565b81146100bb57600080fd5b50565b6000815190506100cd816100a7565b92915050565b6000602082840312156100e9576100e8610070565b5b60006100f7848285016100be565b91505092915050565b61083d8061010f6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631054aea21461003b578063e655beb414610057575b600080fd5b610055600480360381019061005091906104d3565b610073565b005b610071600480360381019061006c91906104d3565b610277565b005b8173ffffffffffffffffffffffffffffffffffffffff166108fc678ac7230489e800009081150290604051600060405180830381858888f193505050506100ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e69061058c565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16629896808460405160240161014293929190610654565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101cc91906106d9565b6000604051808303816000865af19150503d8060008114610209576040519150601f19603f3d011682016040523d82523d6000602084013e61020e565b606091505b505090508060405160200161022290610716565b60405160208183030381529060405290610272576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610269919061072f565b60405180910390fd5b600080fd5b6001600081548092919061028a90610780565b91905055503073ffffffffffffffffffffffffffffffffffffffff16631054aea283836040518363ffffffff1660e01b81526004016102ca9291906107d7565b600060405180830381600087803b1580156102e457600080fd5b505af19250505080156102f5575060015b610316576001600081548092919061030c90610780565b9190505550610317565b5b5050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061035a8261032f565b9050919050565b61036a8161034f565b811461037557600080fd5b50565b60008135905061038781610361565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6103e082610397565b810181811067ffffffffffffffff821117156103ff576103fe6103a8565b5b80604052505050565b600061041261031b565b905061041e82826103d7565b919050565b600067ffffffffffffffff82111561043e5761043d6103a8565b5b61044782610397565b9050602081019050919050565b82818337600083830152505050565b600061047661047184610423565b610408565b90508281526020810184848401111561049257610491610392565b5b61049d848285610454565b509392505050565b600082601f8301126104ba576104b961038d565b5b81356104ca848260208601610463565b91505092915050565b600080604083850312156104ea576104e9610325565b5b60006104f885828601610378565b925050602083013567ffffffffffffffff8111156105195761051861032a565b5b610525858286016104a5565b9150509250929050565b600082825260208201905092915050565b7f455448207472616e73666572206661696c656400000000000000000000000000600082015250565b600061057660138361052f565b915061058182610540565b602082019050919050565b600060208201905081810360008301526105a581610569565b9050919050565b60006105b78261032f565b9050919050565b6105c7816105ac565b82525050565b6000819050919050565b6105e0816105cd565b82525050565b600081519050919050565b60005b8381101561060f5780820151818401526020810190506105f4565b60008484015250505050565b6000610626826105e6565b610630818561052f565b93506106408185602086016105f1565b61064981610397565b840191505092915050565b600060608201905061066960008301866105be565b61067660208301856105d7565b8181036040830152610688818461061b565b9050949350505050565b600081519050919050565b600081905092915050565b60006106b382610692565b6106bd818561069d565b93506106cd8185602086016105f1565b80840191505092915050565b60006106e582846106a8565b915081905092915050565b7f4661696c656420746f2063616c6c2062616e6b53656e64000000000000000000815250565b6000610721826106f0565b601782019150819050919050565b60006020820190508181036000830152610749818461061b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061078b826105cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036107bd576107bc610751565b5b600182019050919050565b6107d18161034f565b82525050565b60006040820190506107ec60008301856107c8565b81810360208301526107fe818461061b565b9050939250505056fea2646970667358221220c3d57175350dbc81f4b427386910dce09422042c0b464bd34bfcdb6940a4715964736f6c63430008180033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80631054aea21461003b578063e655beb414610057575b600080fd5b610055600480360381019061005091906104d3565b610073565b005b610071600480360381019061006c91906104d3565b610277565b005b8173ffffffffffffffffffffffffffffffffffffffff166108fc678ac7230489e800009081150290604051600060405180830381858888f193505050506100ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100e69061058c565b60405180910390fd5b600061080073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16629896808460405160240161014293929190610654565b6040516020818303038152906040527fe77a47bf000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101cc91906106d9565b6000604051808303816000865af19150503d8060008114610209576040519150601f19603f3d011682016040523d82523d6000602084013e61020e565b606091505b505090508060405160200161022290610716565b60405160208183030381529060405290610272576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610269919061072f565b60405180910390fd5b600080fd5b6001600081548092919061028a90610780565b91905055503073ffffffffffffffffffffffffffffffffffffffff16631054aea283836040518363ffffffff1660e01b81526004016102ca9291906107d7565b600060405180830381600087803b1580156102e457600080fd5b505af19250505080156102f5575060015b610316576001600081548092919061030c90610780565b9190505550610317565b5b5050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061035a8261032f565b9050919050565b61036a8161034f565b811461037557600080fd5b50565b60008135905061038781610361565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6103e082610397565b810181811067ffffffffffffffff821117156103ff576103fe6103a8565b5b80604052505050565b600061041261031b565b905061041e82826103d7565b919050565b600067ffffffffffffffff82111561043e5761043d6103a8565b5b61044782610397565b9050602081019050919050565b82818337600083830152505050565b600061047661047184610423565b610408565b90508281526020810184848401111561049257610491610392565b5b61049d848285610454565b509392505050565b600082601f8301126104ba576104b961038d565b5b81356104ca848260208601610463565b91505092915050565b600080604083850312156104ea576104e9610325565b5b60006104f885828601610378565b925050602083013567ffffffffffffffff8111156105195761051861032a565b5b610525858286016104a5565b9150509250929050565b600082825260208201905092915050565b7f455448207472616e73666572206661696c656400000000000000000000000000600082015250565b600061057660138361052f565b915061058182610540565b602082019050919050565b600060208201905081810360008301526105a581610569565b9050919050565b60006105b78261032f565b9050919050565b6105c7816105ac565b82525050565b6000819050919050565b6105e0816105cd565b82525050565b600081519050919050565b60005b8381101561060f5780820151818401526020810190506105f4565b60008484015250505050565b6000610626826105e6565b610630818561052f565b93506106408185602086016105f1565b61064981610397565b840191505092915050565b600060608201905061066960008301866105be565b61067660208301856105d7565b8181036040830152610688818461061b565b9050949350505050565b600081519050919050565b600081905092915050565b60006106b382610692565b6106bd818561069d565b93506106cd8185602086016105f1565b80840191505092915050565b60006106e582846106a8565b915081905092915050565b7f4661696c656420746f2063616c6c2062616e6b53656e64000000000000000000815250565b6000610721826106f0565b601782019150819050919050565b60006020820190508181036000830152610749818461061b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061078b826105cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036107bd576107bc610751565b5b600182019050919050565b6107d18161034f565b82525050565b60006040820190506107ec60008301856107c8565b81810360208301526107fe818461061b565b9050939250505056fea2646970667358221220c3d57175350dbc81f4b427386910dce09422042c0b464bd34bfcdb6940a4715964736f6c63430008180033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/x/evm/embeds/contracts/TestDirtyStateAttack1.sol b/x/evm/embeds/contracts/TestDirtyStateAttack1.sol deleted file mode 100644 index 93b7bb763..000000000 --- a/x/evm/embeds/contracts/TestDirtyStateAttack1.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.24; - -// Uncomment this line to use console.log -// import "hardhat/console.sol"; -import "./IFunToken.sol"; -import "@openzeppelin/contracts/utils/Strings.sol"; - -contract TestDirtyStateAttack1 { - address erc20; - - constructor(address erc20_) { - erc20 = erc20_; - } - - function attack( - address payable sendRecipient, - string memory bech32Recipient - ) public { - bool isSent = sendRecipient.send(10 ether); // 10 NIBI - require(isSent, "Failed to send ether"); - - (bool success, ) = FUNTOKEN_PRECOMPILE_ADDRESS.call( - abi.encodeWithSignature( - "sendToBank(address,uint256,string)", - erc20, - uint256(10e6), // 10 WNIBI - bech32Recipient - ) - ); - - require(success, string.concat("Failed to call bankSend")); - } -} diff --git a/x/evm/embeds/contracts/TestDirtyStateAttack2.sol b/x/evm/embeds/contracts/TestDirtyStateAttack2.sol deleted file mode 100644 index 04a13931f..000000000 --- a/x/evm/embeds/contracts/TestDirtyStateAttack2.sol +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.24; - -// Uncomment this line to use console.log -// import "hardhat/console.sol"; -import "./IFunToken.sol"; -import "@openzeppelin/contracts/utils/Strings.sol"; -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - -contract TestDirtyStateAttack2 { - address erc20; - - constructor(address erc20_) { - erc20 = erc20_; - } - - function attack( - address payable sendRecipient, - string memory bech32Recipient - ) public { - require( - ERC20(erc20).transfer(sendRecipient, 1e6), // 1 WNIBI - "ERC-20 transfer failed" - ); - - (bool success, ) = FUNTOKEN_PRECOMPILE_ADDRESS.call( - abi.encodeWithSignature( - "sendToBank(address,uint256,string)", - erc20, - uint256(9e6), // 9 WNIBI - bech32Recipient - ) - ); - - require(success, string.concat("Failed to call sendToBank")); - } -} diff --git a/x/evm/embeds/contracts/TestDirtyStateAttack3.sol b/x/evm/embeds/contracts/TestDirtyStateAttack3.sol deleted file mode 100644 index 16730b2de..000000000 --- a/x/evm/embeds/contracts/TestDirtyStateAttack3.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.24; - -// Uncomment this line to use console.log -// import "hardhat/console.sol"; -import "./IFunToken.sol"; -import "@openzeppelin/contracts/utils/Strings.sol"; -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - -contract TestDirtyStateAttack3 { - address erc20; - uint counter = 0; - - constructor(address erc20_) payable { - erc20 = erc20_; - } - - function attack( - address payable sendRecipient, - string memory bech32Recipient - ) external { - counter++; - try - TestDirtyStateAttack3(payable(address(this))).transferFunds( - sendRecipient, - bech32Recipient - ) - {} catch - { - counter++; - } - } - - function transferFunds( - address payable sendRecipient, - string memory bech32Recipient - ) external { - require(sendRecipient.send(10 ether), "ETH transfer failed"); // 10 NIBI - - (bool success, ) = FUNTOKEN_PRECOMPILE_ADDRESS.call( - abi.encodeWithSignature( - "sendToBank(address,uint256,string)", - erc20, - uint256(10e6), // 10 WNIBI - bech32Recipient - ) - ); - - require(success, string.concat("Failed to call bankSend")); - - revert(); - } -} diff --git a/x/evm/embeds/embeds.go b/x/evm/embeds/embeds.go index 6c415f378..1f0763311 100644 --- a/x/evm/embeds/embeds.go +++ b/x/evm/embeds/embeds.go @@ -47,12 +47,6 @@ var ( testMetadataBytes32 []byte //go:embed artifacts/contracts/TestPrecompileSendToBankThenERC20Transfer.sol/TestPrecompileSendToBankThenERC20Transfer.json testPrecompileSendToBankThenERC20Transfer []byte - //go:embed artifacts/contracts/TestDirtyStateAttack1.sol/TestDirtyStateAttack1.json - testDirtyStateAttack1 []byte - //go:embed artifacts/contracts/TestDirtyStateAttack2.sol/TestDirtyStateAttack2.json - testDirtyStateAttack2 []byte - //go:embed artifacts/contracts/TestDirtyStateAttack3.sol/TestDirtyStateAttack3.json - testDirtyStateAttack3 []byte //go:embed artifacts/contracts/TestDirtyStateAttack4.sol/TestDirtyStateAttack4.json testDirtyStateAttack4 []byte //go:embed artifacts/contracts/TestDirtyStateAttack5.sol/TestDirtyStateAttack5.json @@ -164,21 +158,6 @@ var ( Name: "TestPrecompileSendToBankThenERC20Transfer.sol", EmbedJSON: testPrecompileSendToBankThenERC20Transfer, } - // SmartContract_TestDirtyStateAttack1 is a test contract that composes manual send and funtoken sendToBank - SmartContract_TestDirtyStateAttack1 = CompiledEvmContract{ - Name: "TestDirtyStateAttack1.sol", - EmbedJSON: testDirtyStateAttack1, - } - // SmartContract_TestDirtyStateAttack2 is a test contract that composes erc20 transfer and funtoken sendToBank - SmartContract_TestDirtyStateAttack2 = CompiledEvmContract{ - Name: "TestDirtyStateAttack2.sol", - EmbedJSON: testDirtyStateAttack2, - } - // SmartContract_TestDirtyStateAttack3 is a test contract that composes manual send and funtoken sendToBank with a reversion - SmartContract_TestDirtyStateAttack3 = CompiledEvmContract{ - Name: "TestDirtyStateAttack3.sol", - EmbedJSON: testDirtyStateAttack3, - } // SmartContract_TestDirtyStateAttack4 is a test contract that composes manual send and funtoken sendToBank with a reversion SmartContract_TestDirtyStateAttack4 = CompiledEvmContract{ Name: "TestDirtyStateAttack4.sol", @@ -208,9 +187,6 @@ func init() { SmartContract_TestRandom.MustLoad() SmartContract_TestBytes32Metadata.MustLoad() SmartContract_TestPrecompileSendToBankThenERC20Transfer.MustLoad() - SmartContract_TestDirtyStateAttack1.MustLoad() - SmartContract_TestDirtyStateAttack2.MustLoad() - SmartContract_TestDirtyStateAttack3.MustLoad() SmartContract_TestDirtyStateAttack4.MustLoad() SmartContract_TestDirtyStateAttack5.MustLoad() } diff --git a/x/evm/keeper/funtoken_from_coin_test.go b/x/evm/keeper/funtoken_from_coin_test.go index e0e97203f..432d3ce5b 100644 --- a/x/evm/keeper/funtoken_from_coin_test.go +++ b/x/evm/keeper/funtoken_from_coin_test.go @@ -771,293 +771,6 @@ func (s *FunTokenFromCoinSuite) TestPrecompileSendToBankThenErc20Transfer() { }.Assert(s.T(), deps, evmObj) } -// TestDirtyStateAttack1 -// 1. Creates a funtoken from coin. -// 2. Calls the test contract -// a. manual send 10 NIBI to Alice -// b. FunToken.sendToBank 10 WNIBI to Alice -// -// INITIAL STATE: -// - Test contract funds: 10 WNIBI, 10 NIBI -// CONTRACT CALL: -// - Sends 10 NIBI to Alice manually -// - Sends 10 WNIBI to Alice via FunToken.sendToBank -// EXPECTED: -// - Test contract funds: 0 WNIBI, 0 NIBI -// - Alice: 20 NIBI -// - Module account: 0 NIBI escrowed -func (s *FunTokenFromCoinSuite) TestDirtyStateAttack1() { - deps := evmtest.NewTestDeps() - - // Initial setup - funToken := s.fundAndCreateFunToken(deps, 10e6) - - s.T().Log("Deploy Test Contract") - deployResp, err := evmtest.DeployContract( - &deps, - embeds.SmartContract_TestDirtyStateAttack1, - funToken.Erc20Addr.Address, - ) - s.Require().NoError(err) - testContractAddr := deployResp.ContractAddr - - s.Run("Convert bank coin to erc-20: give test contract 10 WNIBI (erc20)", func() { - _, err = deps.EvmKeeper.ConvertCoinToEvm( - sdk.WrapSDKContext(deps.Ctx), - &evm.MsgConvertCoinToEvm{ - Sender: deps.Sender.NibiruAddr.String(), - BankCoin: sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6)), - ToEthAddr: eth.EIP55Addr{Address: testContractAddr}, - }, - ) - s.Require().NoError(err) - }) - - s.Run("Send 10 NIBI to test contract manually", func() { - s.Require().NoError(testapp.FundAccount( - deps.App.BankKeeper, - deps.Ctx, - eth.EthAddrToNibiruAddr(testContractAddr), - sdk.NewCoins(sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6))), - )) - }) - - alice := evmtest.NewEthPrivAcc() - - s.Run("call test contract", func() { - contractInput, err := embeds.SmartContract_TestDirtyStateAttack1.ABI.Pack( - "attack", - alice.EthAddr, - alice.NibiruAddr.String(), - ) - s.Require().NoError(err) - evmObj, _ := deps.NewEVM() - _, err = deps.EvmKeeper.CallContractWithInput( - deps.Ctx, - evmObj, - deps.Sender.EthAddr, - &testContractAddr, - true, - contractInput, - evmtest.FunTokenGasLimitSendToEvm, - ) - s.Require().NoError(err) - - evmtest.FunTokenBalanceAssert{ - FunToken: funToken, - Account: alice.EthAddr, - BalanceBank: big.NewInt(20e6), - BalanceERC20: big.NewInt(0), - Description: "Alice has 20 NIBI / 0 WNIBI", - }.Assert(s.T(), deps, evmObj) - - evmtest.FunTokenBalanceAssert{ - FunToken: funToken, - Account: testContractAddr, - BalanceBank: big.NewInt(0), - BalanceERC20: big.NewInt(0), - Description: "Test contract has 0 WNIBI / 0 NIBI", - }.Assert(s.T(), deps, evmObj) - - evmtest.FunTokenBalanceAssert{ - FunToken: funToken, - Account: evm.EVM_MODULE_ADDRESS, - BalanceBank: big.NewInt(0), - BalanceERC20: big.NewInt(0), - Description: "Module account has 0 NIBI escrowed", - }.Assert(s.T(), deps, evmObj) - }) -} - -// TestDirtyStateAttack2 -// 1. Creates a funtoken from coin. -// 2. Calls the test contract -// a. erc20 transfer 1 WNIBI to Alice -// b. FunToken.sendToBank 9 WNIBI to Alice -// -// INITIAL STATE: -// - Test contract funds: 10 WNIBI -// CONTRACT CALL: -// - Sends 1 WNIBI to Alice via erc20 transfer -// - Sends 9 WNIBI to Alice via FunToken.sendToBank -// EXPECTED: -// - Test contract funds: 0 WNIBI -// - Alice: 9 NIBI, 1 WNIBI -// - Module account: 1 NIBI escrowed -func (s *FunTokenFromCoinSuite) TestDirtyStateAttack2() { - deps := evmtest.NewTestDeps() - - // Initial setup - funToken := s.fundAndCreateFunToken(deps, 10e6) - - s.T().Log("Deploy Test Contract") - deployResp, err := evmtest.DeployContract( - &deps, - embeds.SmartContract_TestDirtyStateAttack2, - funToken.Erc20Addr.Address, - ) - s.Require().NoError(err) - testContractAddr := deployResp.ContractAddr - - s.Run("Convert bank coin to erc-20: give test contract 10 WNIBI (erc20)", func() { - _, err = deps.EvmKeeper.ConvertCoinToEvm( - sdk.WrapSDKContext(deps.Ctx), - &evm.MsgConvertCoinToEvm{ - Sender: deps.Sender.NibiruAddr.String(), - BankCoin: sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6)), - ToEthAddr: eth.EIP55Addr{Address: testContractAddr}, - }, - ) - s.Require().NoError(err) - }) - - alice := evmtest.NewEthPrivAcc() - - s.Run("call test contract", func() { - contractInput, err := embeds.SmartContract_TestDirtyStateAttack2.ABI.Pack( - "attack", - alice.EthAddr, - alice.NibiruAddr.String(), - ) - s.Require().NoError(err) - evmObj, _ := deps.NewEVM() - _, err = deps.EvmKeeper.CallContractWithInput( - deps.Ctx, - evmObj, - deps.Sender.EthAddr, - &testContractAddr, - true, - contractInput, - evmtest.FunTokenGasLimitSendToEvm, - ) - s.Require().NoError(err) - - evmtest.FunTokenBalanceAssert{ - FunToken: funToken, - Account: alice.EthAddr, - BalanceBank: big.NewInt(9e6), - BalanceERC20: big.NewInt(1e6), - Description: "Alice has 9 NIBI / 1 WNIBI", - }.Assert(s.T(), deps, evmObj) - - evmtest.FunTokenBalanceAssert{ - FunToken: funToken, - Account: testContractAddr, - BalanceBank: big.NewInt(0), - BalanceERC20: big.NewInt(0), - Description: "Test contract has 0 WNIBI / 0 NIBI", - }.Assert(s.T(), deps, evmObj) - - evmtest.FunTokenBalanceAssert{ - FunToken: funToken, - Account: evm.EVM_MODULE_ADDRESS, - BalanceBank: big.NewInt(1e6), - BalanceERC20: big.NewInt(0), - Description: "Module account has 1 NIBI escrowed", - }.Assert(s.T(), deps, evmObj) - }) -} - -// TestDirtyStateAttack3 -// 1. Creates a funtoken from coin. -// 2. Calls the test contract -// a. manual send 10 NIBI to Alice -// b. FunToken.sendToBank 10 WNIBI to Alice -// c. reverts -// -// INITIAL STATE: -// - Test contract funds: 10 WNIBI, 10 NIBI -// CONTRACT CALL: -// - Sends 10 NIBI to Alice manually -// - Sends 10 WNIBI to Alice via FunToken.sendToBank -// - reverts -// EXPECTED: -// - Test contract funds: 10 WNIBI, 10 NIBI -// - Alice: 0 WNIBI, 0 NIBI -// - Module account: 10 NIBI escrowed -func (s *FunTokenFromCoinSuite) TestDirtyStateAttack3() { - deps := evmtest.NewTestDeps() - - // Initial setup - funToken := s.fundAndCreateFunToken(deps, 10e6) - - s.T().Log("Deploy Test Contract") - deployResp, err := evmtest.DeployContract( - &deps, - embeds.SmartContract_TestDirtyStateAttack3, - funToken.Erc20Addr.Address, - ) - s.Require().NoError(err) - testContractAddr := deployResp.ContractAddr - - s.Run("Convert bank coin to erc-20: give test contract 10 WNIBI (erc20)", func() { - _, err = deps.EvmKeeper.ConvertCoinToEvm( - sdk.WrapSDKContext(deps.Ctx), - &evm.MsgConvertCoinToEvm{ - Sender: deps.Sender.NibiruAddr.String(), - BankCoin: sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6)), - ToEthAddr: eth.EIP55Addr{Address: testContractAddr}, - }, - ) - s.Require().NoError(err) - }) - - s.Run("Send 10 NIBI to test contract manually", func() { - s.Require().NoError(testapp.FundAccount( - deps.App.BankKeeper, - deps.Ctx, - eth.EthAddrToNibiruAddr(testContractAddr), - sdk.NewCoins(sdk.NewCoin(evm.EVMBankDenom, sdk.NewInt(10e6))), - )) - }) - - alice := evmtest.NewEthPrivAcc() - - s.Run("call test contract", func() { - contractInput, err := embeds.SmartContract_TestDirtyStateAttack3.ABI.Pack( - "attack", - alice.EthAddr, - alice.NibiruAddr.String(), - ) - s.Require().NoError(err) - evmObj, _ := deps.NewEVM() - _, err = deps.EvmKeeper.CallContractWithInput( - deps.Ctx, - evmObj, - deps.Sender.EthAddr, - &testContractAddr, - true, - contractInput, - evmtest.FunTokenGasLimitSendToEvm, - ) - s.Require().NoError(err) - - evmtest.FunTokenBalanceAssert{ - FunToken: funToken, - Account: alice.EthAddr, - BalanceBank: big.NewInt(0), - BalanceERC20: big.NewInt(0), - Description: "Alice has 0 NIBI / 0 WNIBI", - }.Assert(s.T(), deps, evmObj) - - evmtest.FunTokenBalanceAssert{ - FunToken: funToken, - Account: testContractAddr, - BalanceBank: big.NewInt(10e6), - BalanceERC20: big.NewInt(10e6), - Description: "Test contract has 10 WNIBI / 10 NIBI", - }.Assert(s.T(), deps, evmObj) - - evmtest.FunTokenBalanceAssert{ - FunToken: funToken, - Account: evm.EVM_MODULE_ADDRESS, - BalanceBank: big.NewInt(10e6), - BalanceERC20: big.NewInt(0), - Description: "Module account has 10 NIBI escrowed", - }.Assert(s.T(), deps, evmObj) - }) -} - // fundAndCreateFunToken creates initial setup for tests func (s *FunTokenFromCoinSuite) fundAndCreateFunToken(deps evmtest.TestDeps, unibiAmount int64) evm.FunToken { bankDenom := evm.EVMBankDenom From a57e71974ba413243b01a46cd7c2ac0fd162c928 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 27 Jan 2025 14:31:08 -0500 Subject: [PATCH 15/15] refactor: variable names --- x/evm/precompile/wasm_test.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/x/evm/precompile/wasm_test.go b/x/evm/precompile/wasm_test.go index fea71d03b..6698e6439 100644 --- a/x/evm/precompile/wasm_test.go +++ b/x/evm/precompile/wasm_test.go @@ -183,7 +183,7 @@ func (s *WasmSuite) TestQueryRaw() { s.Require().NoError(err) evmObj, _ := deps.NewEVM() - ethTxResp, err := deps.EvmKeeper.CallContractWithInput( + queryResp, err := deps.EvmKeeper.CallContractWithInput( deps.Ctx, evmObj, deps.Sender.EthAddr, @@ -194,18 +194,18 @@ func (s *WasmSuite) TestQueryRaw() { ) s.Require().NoError(err) - s.Require().NotEmpty(ethTxResp.Ret) + s.Require().NotEmpty(queryResp.Ret) - var queryResp []byte + var respBz []byte err = embeds.SmartContract_Wasm.ABI.UnpackIntoInterface( - &queryResp, + &respBz, string(precompile.WasmMethod_queryRaw), - ethTxResp.Ret, + queryResp.Ret, ) - s.Require().NoError(err, "ethTxResp: %s", ethTxResp) + s.Require().NoError(err, "ethTxResp: %s", queryResp) var typedResp test.QueryMsgCountResp - s.NoError(json.Unmarshal(queryResp, &typedResp)) + s.NoError(json.Unmarshal(respBz, &typedResp)) s.EqualValues(0, typedResp.Count) s.EqualValues(deps.Sender.NibiruAddr.String(), typedResp.Owner) } @@ -223,7 +223,7 @@ func (s *WasmSuite) TestQuerySmart() { s.Require().NoError(err) evmObj, _ := deps.NewEVM() - ethTxResp, err := deps.EvmKeeper.CallContractWithInput( + queryResp, err := deps.EvmKeeper.CallContractWithInput( deps.Ctx, evmObj, deps.Sender.EthAddr, @@ -234,18 +234,18 @@ func (s *WasmSuite) TestQuerySmart() { ) s.Require().NoError(err) - s.Require().NotEmpty(ethTxResp.Ret) + s.Require().NotEmpty(queryResp.Ret) - var queryResp []byte + var respBz []byte err = embeds.SmartContract_Wasm.ABI.UnpackIntoInterface( - &queryResp, + &respBz, string(precompile.WasmMethod_query), - ethTxResp.Ret, + queryResp.Ret, ) - s.Require().NoError(err, "ethTxResp: %s", ethTxResp) + s.Require().NoError(err, "ethTxResp: %s", queryResp) var typedResp test.QueryMsgCountResp - s.Require().NoError(json.Unmarshal(queryResp, &typedResp)) + s.Require().NoError(json.Unmarshal(respBz, &typedResp)) s.Require().EqualValues(0, typedResp.Count) s.Require().EqualValues(deps.Sender.NibiruAddr.String(), typedResp.Owner) }