4ea9b6dc6d
* add note fix note * add TestAppStateFn TestRandomAccounts * marshal int slice to json * add paramschange for enableCreate and enableCall * AppStateFn -> StateFn * add TestDecodeStore * update github actions to run evm simulation * add TestParamChanges * add TestRandomizedGenState * use go install for runsim * resolve conflict * use random gasCap to estimate gas * use estimateGas to calculate max transferableAmount * update godoc * TestAppStateFn -> TestStateFn * Update x/evm/simulation/genesis.go * comment Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Federico Kunze Küllmer <federico.kunze94@gmail.com>
112 lines
3.5 KiB
Go
112 lines
3.5 KiB
Go
package app
|
|
|
|
import (
|
|
"encoding/json"
|
|
"math/rand"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/cosmos/cosmos-sdk/types/module"
|
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
|
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
|
paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
|
|
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
|
evmtypes "github.com/tharsis/ethermint/x/evm/types"
|
|
|
|
"github.com/tharsis/ethermint/crypto/ethsecp256k1"
|
|
ethermint "github.com/tharsis/ethermint/types"
|
|
|
|
"github.com/cosmos/cosmos-sdk/simapp"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
)
|
|
|
|
var maxTestingAccounts = 100
|
|
var seed = int64(233)
|
|
|
|
func TestRandomGenesisAccounts(t *testing.T) {
|
|
r := rand.New(rand.NewSource(seed))
|
|
accs := RandomAccounts(r, rand.Intn(maxTestingAccounts))
|
|
|
|
encodingConfig := MakeEncodingConfig()
|
|
appCodec := encodingConfig.Marshaler
|
|
cdc := encodingConfig.Amino
|
|
|
|
paramsKeeper := initParamsKeeper(appCodec, cdc, sdk.NewKVStoreKey(paramstypes.StoreKey), sdk.NewTransientStoreKey(paramstypes.StoreKey))
|
|
subSpace, find := paramsKeeper.GetSubspace(authtypes.ModuleName)
|
|
require.True(t, find)
|
|
accountKeeper := authkeeper.NewAccountKeeper(
|
|
appCodec, sdk.NewKVStoreKey(authtypes.StoreKey), subSpace, ethermint.ProtoAccount, maccPerms,
|
|
)
|
|
authModule := auth.NewAppModule(appCodec, accountKeeper, RandomGenesisAccounts)
|
|
|
|
genesisState := simapp.NewDefaultGenesisState(appCodec)
|
|
simState := &module.SimulationState{Accounts: accs, Cdc: appCodec, Rand: r, GenState: genesisState}
|
|
authModule.GenerateGenesisState(simState)
|
|
|
|
authStateBz, find := genesisState[authtypes.ModuleName]
|
|
require.True(t, find)
|
|
|
|
authState := new(authtypes.GenesisState)
|
|
appCodec.MustUnmarshalJSON(authStateBz, authState)
|
|
accounts, err := authtypes.UnpackAccounts(authState.Accounts)
|
|
require.NoError(t, err)
|
|
for _, acc := range accounts {
|
|
_, ok := acc.(ethermint.EthAccountI)
|
|
require.True(t, ok)
|
|
}
|
|
}
|
|
|
|
func TestStateFn(t *testing.T) {
|
|
config, db, dir, logger, skip, err := simapp.SetupSimulation("leveldb-app-sim", "Simulation")
|
|
if skip {
|
|
t.Skip("skipping AppStateFn testing")
|
|
}
|
|
require.NoError(t, err, "simulation setup failed")
|
|
|
|
config.ChainID = SimAppChainID
|
|
config.Commit = true
|
|
|
|
defer func() {
|
|
db.Close()
|
|
require.NoError(t, os.RemoveAll(dir))
|
|
}()
|
|
|
|
app := NewEthermintApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, simapp.FlagPeriodValue, MakeEncodingConfig(), simapp.EmptyAppOptions{}, fauxMerkleModeOpt)
|
|
require.Equal(t, appName, app.Name())
|
|
|
|
appStateFn := StateFn(app.AppCodec(), app.SimulationManager())
|
|
r := rand.New(rand.NewSource(seed))
|
|
accounts := RandomAccounts(r, rand.Intn(maxTestingAccounts))
|
|
appState, _, _, _ := appStateFn(r, accounts, config)
|
|
|
|
rawState := make(map[string]json.RawMessage)
|
|
err = json.Unmarshal(appState, &rawState)
|
|
require.NoError(t, err)
|
|
|
|
stakingStateBz, ok := rawState[stakingtypes.ModuleName]
|
|
require.True(t, ok)
|
|
|
|
stakingState := new(stakingtypes.GenesisState)
|
|
app.AppCodec().MustUnmarshalJSON(stakingStateBz, stakingState)
|
|
bondDenom := stakingState.Params.BondDenom
|
|
|
|
evmStateBz, ok := rawState[evmtypes.ModuleName]
|
|
require.True(t, ok)
|
|
|
|
evmState := new(evmtypes.GenesisState)
|
|
app.AppCodec().MustUnmarshalJSON(evmStateBz, evmState)
|
|
require.Equal(t, bondDenom, evmState.Params.EvmDenom)
|
|
}
|
|
|
|
func TestRandomAccounts(t *testing.T) {
|
|
r := rand.New(rand.NewSource(seed))
|
|
accounts := RandomAccounts(r, rand.Intn(maxTestingAccounts))
|
|
for _, acc := range accounts {
|
|
_, ok := acc.PrivKey.(*ethsecp256k1.PrivKey)
|
|
require.True(t, ok)
|
|
}
|
|
}
|