github.com/okex/exchain@v1.8.0/libs/ibc-go/testing/simapp/app.go (about)

     1  package simapp
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"math/big"
     7  	"os"
     8  	"path/filepath"
     9  	"sort"
    10  	"strings"
    11  	"sync"
    12  
    13  	"github.com/spf13/viper"
    14  	"google.golang.org/grpc/encoding"
    15  	"google.golang.org/grpc/encoding/proto"
    16  
    17  	"github.com/okex/exchain/app/ante"
    18  	okexchaincodec "github.com/okex/exchain/app/codec"
    19  	appconfig "github.com/okex/exchain/app/config"
    20  	"github.com/okex/exchain/app/refund"
    21  	ethermint "github.com/okex/exchain/app/types"
    22  	okexchain "github.com/okex/exchain/app/types"
    23  	"github.com/okex/exchain/app/utils/sanity"
    24  	"github.com/okex/exchain/libs/cosmos-sdk/baseapp"
    25  	bam "github.com/okex/exchain/libs/cosmos-sdk/baseapp"
    26  	"github.com/okex/exchain/libs/cosmos-sdk/client"
    27  	"github.com/okex/exchain/libs/cosmos-sdk/codec"
    28  	"github.com/okex/exchain/libs/cosmos-sdk/server"
    29  	"github.com/okex/exchain/libs/cosmos-sdk/simapp"
    30  	"github.com/okex/exchain/libs/cosmos-sdk/store/mpt"
    31  	"github.com/okex/exchain/libs/cosmos-sdk/store/types"
    32  	sdk "github.com/okex/exchain/libs/cosmos-sdk/types"
    33  	"github.com/okex/exchain/libs/cosmos-sdk/types/module"
    34  	upgradetypes "github.com/okex/exchain/libs/cosmos-sdk/types/upgrade"
    35  	"github.com/okex/exchain/libs/cosmos-sdk/version"
    36  	"github.com/okex/exchain/libs/cosmos-sdk/x/auth"
    37  	authante "github.com/okex/exchain/libs/cosmos-sdk/x/auth/ante"
    38  	authtypes "github.com/okex/exchain/libs/cosmos-sdk/x/auth/types"
    39  	"github.com/okex/exchain/libs/cosmos-sdk/x/bank"
    40  	capabilityModule "github.com/okex/exchain/libs/cosmos-sdk/x/capability"
    41  	capabilitykeeper "github.com/okex/exchain/libs/cosmos-sdk/x/capability/keeper"
    42  	capabilitytypes "github.com/okex/exchain/libs/cosmos-sdk/x/capability/types"
    43  	"github.com/okex/exchain/libs/cosmos-sdk/x/crisis"
    44  	"github.com/okex/exchain/libs/cosmos-sdk/x/mint"
    45  	govclient "github.com/okex/exchain/libs/cosmos-sdk/x/mint/client"
    46  	"github.com/okex/exchain/libs/cosmos-sdk/x/params/subspace"
    47  	"github.com/okex/exchain/libs/cosmos-sdk/x/supply"
    48  	"github.com/okex/exchain/libs/cosmos-sdk/x/upgrade"
    49  	icacontroller "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/controller"
    50  	icacontrollerkeeper "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/controller/keeper"
    51  	icacontrollertypes "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/controller/types"
    52  	icahost "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/host"
    53  	icahostkeeper "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/host/keeper"
    54  	icahosttypes "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/host/types"
    55  	icatypes "github.com/okex/exchain/libs/ibc-go/modules/apps/27-interchain-accounts/types"
    56  	ibcfee "github.com/okex/exchain/libs/ibc-go/modules/apps/29-fee"
    57  	ibcfeekeeper "github.com/okex/exchain/libs/ibc-go/modules/apps/29-fee/keeper"
    58  	ibcfeetypes "github.com/okex/exchain/libs/ibc-go/modules/apps/29-fee/types"
    59  	"github.com/okex/exchain/libs/ibc-go/modules/apps/common"
    60  	ibctransfer "github.com/okex/exchain/libs/ibc-go/modules/apps/transfer"
    61  	ibctransferkeeper "github.com/okex/exchain/libs/ibc-go/modules/apps/transfer/keeper"
    62  	ibctransfertypes "github.com/okex/exchain/libs/ibc-go/modules/apps/transfer/types"
    63  	ibc "github.com/okex/exchain/libs/ibc-go/modules/core"
    64  	ibcclient "github.com/okex/exchain/libs/ibc-go/modules/core/02-client"
    65  	ibcclienttypes "github.com/okex/exchain/libs/ibc-go/modules/core/02-client/types"
    66  	ibcporttypes "github.com/okex/exchain/libs/ibc-go/modules/core/05-port/types"
    67  	ibchost "github.com/okex/exchain/libs/ibc-go/modules/core/24-host"
    68  	ibccommon "github.com/okex/exchain/libs/ibc-go/modules/core/common"
    69  	ibckeeper "github.com/okex/exchain/libs/ibc-go/modules/core/keeper"
    70  	"github.com/okex/exchain/libs/ibc-go/testing/mock"
    71  	"github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/capability"
    72  	"github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/core"
    73  	evm2 "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/evm"
    74  	"github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/fee"
    75  	ica2 "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/ica"
    76  	staking2 "github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/staking"
    77  	"github.com/okex/exchain/libs/ibc-go/testing/simapp/adapter/transfer"
    78  	"github.com/okex/exchain/libs/system/trace"
    79  	abci "github.com/okex/exchain/libs/tendermint/abci/types"
    80  	"github.com/okex/exchain/libs/tendermint/libs/cli"
    81  	"github.com/okex/exchain/libs/tendermint/libs/log"
    82  	tmos "github.com/okex/exchain/libs/tendermint/libs/os"
    83  	tmtypes "github.com/okex/exchain/libs/tendermint/types"
    84  	dbm "github.com/okex/exchain/libs/tm-db"
    85  	"github.com/okex/exchain/x/ammswap"
    86  	"github.com/okex/exchain/x/common/monitor"
    87  	commonversion "github.com/okex/exchain/x/common/version"
    88  	"github.com/okex/exchain/x/dex"
    89  	dexclient "github.com/okex/exchain/x/dex/client"
    90  	distr "github.com/okex/exchain/x/distribution"
    91  	"github.com/okex/exchain/x/erc20"
    92  	erc20client "github.com/okex/exchain/x/erc20/client"
    93  	"github.com/okex/exchain/x/evidence"
    94  	"github.com/okex/exchain/x/evm"
    95  	evmclient "github.com/okex/exchain/x/evm/client"
    96  	evmtypes "github.com/okex/exchain/x/evm/types"
    97  	"github.com/okex/exchain/x/farm"
    98  	farmclient "github.com/okex/exchain/x/farm/client"
    99  	"github.com/okex/exchain/x/genutil"
   100  	"github.com/okex/exchain/x/gov"
   101  	"github.com/okex/exchain/x/gov/keeper"
   102  	"github.com/okex/exchain/x/icamauth"
   103  	icamauthkeeper "github.com/okex/exchain/x/icamauth/keeper"
   104  	icamauthtypes "github.com/okex/exchain/x/icamauth/types"
   105  	"github.com/okex/exchain/x/order"
   106  	"github.com/okex/exchain/x/params"
   107  	paramsclient "github.com/okex/exchain/x/params/client"
   108  	"github.com/okex/exchain/x/slashing"
   109  	"github.com/okex/exchain/x/staking"
   110  	"github.com/okex/exchain/x/token"
   111  	"github.com/okex/exchain/x/wasm"
   112  	wasmclient "github.com/okex/exchain/x/wasm/client"
   113  	wasmkeeper "github.com/okex/exchain/x/wasm/keeper"
   114  )
   115  
   116  func init() {
   117  	// set the address prefixes
   118  	config := sdk.GetConfig()
   119  	config.SetCoinType(60)
   120  	okexchain.SetBech32Prefixes(config)
   121  	okexchain.SetBip44CoinType(config)
   122  }
   123  
   124  const (
   125  	appName = "OKExChain"
   126  )
   127  const (
   128  	MockFeePort string = mock.ModuleName + ibcfeetypes.ModuleName
   129  )
   130  
   131  var (
   132  	// DefaultCLIHome sets the default home directories for the application CLI
   133  	DefaultCLIHome = os.ExpandEnv("$HOME/.exchaincli")
   134  
   135  	// DefaultNodeHome sets the folder where the applcation data and configuration will be stored
   136  	DefaultNodeHome = os.ExpandEnv("$HOME/.exchaind")
   137  
   138  	// ModuleBasics defines the module BasicManager is in charge of setting up basic,
   139  	// non-dependant module elements, such as codec registration
   140  	// and genesis verification.
   141  	ModuleBasics = module.NewBasicManager(
   142  		auth.AppModuleBasic{},
   143  		supply.AppModuleBasic{},
   144  		genutil.AppModuleBasic{},
   145  		bank.AppModuleBasic{},
   146  		staking.AppModuleBasic{},
   147  		mint.AppModuleBasic{},
   148  		distr.AppModuleBasic{},
   149  		gov.NewAppModuleBasic(
   150  			paramsclient.ProposalHandler,
   151  			distr.CommunityPoolSpendProposalHandler,
   152  			distr.ChangeDistributionTypeProposalHandler,
   153  			distr.WithdrawRewardEnabledProposalHandler,
   154  			distr.RewardTruncatePrecisionProposalHandler,
   155  			dexclient.DelistProposalHandler, farmclient.ManageWhiteListProposalHandler,
   156  			evmclient.ManageContractDeploymentWhitelistProposalHandler,
   157  			evmclient.ManageContractBlockedListProposalHandler,
   158  			evmclient.ManageContractMethodGuFactorProposalHandler,
   159  			evmclient.ManageContractMethodBlockedListProposalHandler,
   160  			evmclient.ManageSysContractAddressProposalHandler,
   161  			evmclient.ManageContractByteCodeProposalHandler,
   162  			govclient.ManageTreasuresProposalHandler,
   163  			govclient.ModifyNextBlockUpdateProposalHandler,
   164  			erc20client.TokenMappingProposalHandler,
   165  			erc20client.ProxyContractRedirectHandler,
   166  			wasmclient.MigrateContractProposalHandler,
   167  			wasmclient.UpdateContractAdminProposalHandler,
   168  			wasmclient.PinCodesProposalHandler,
   169  			wasmclient.UnpinCodesProposalHandler,
   170  			wasmclient.UpdateDeploymentWhitelistProposalHandler,
   171  			wasmclient.UpdateWASMContractMethodBlockedListProposalHandler,
   172  			wasmclient.GetCmdExtraProposal,
   173  		),
   174  		params.AppModuleBasic{},
   175  		crisis.AppModuleBasic{},
   176  		slashing.AppModuleBasic{},
   177  		evidence.AppModuleBasic{},
   178  		upgrade.AppModuleBasic{},
   179  		evm.AppModuleBasic{},
   180  		token.AppModuleBasic{},
   181  		dex.AppModuleBasic{},
   182  		order.AppModuleBasic{},
   183  		ammswap.AppModuleBasic{},
   184  		farm.AppModuleBasic{},
   185  		capabilityModule.AppModuleBasic{},
   186  		core.CoreModule{},
   187  		capability.CapabilityModuleAdapter{},
   188  		transfer.TransferModule{},
   189  		erc20.AppModuleBasic{},
   190  		mock.AppModuleBasic{},
   191  		wasm.AppModuleBasic{},
   192  		ica2.TestICAModuleBaisc{},
   193  		fee.TestFeeAppModuleBaisc{},
   194  		icamauth.AppModuleBasic{},
   195  	)
   196  
   197  	// module account permissions
   198  	maccPerms = map[string][]string{
   199  		auth.FeeCollectorName:       nil,
   200  		distr.ModuleName:            nil,
   201  		mint.ModuleName:             {supply.Minter},
   202  		staking.BondedPoolName:      {supply.Burner, supply.Staking},
   203  		staking.NotBondedPoolName:   {supply.Burner, supply.Staking},
   204  		gov.ModuleName:              nil,
   205  		token.ModuleName:            {supply.Minter, supply.Burner},
   206  		dex.ModuleName:              nil,
   207  		order.ModuleName:            nil,
   208  		ammswap.ModuleName:          {supply.Minter, supply.Burner},
   209  		farm.ModuleName:             nil,
   210  		farm.YieldFarmingAccount:    nil,
   211  		farm.MintFarmingAccount:     {supply.Burner},
   212  		ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner},
   213  		erc20.ModuleName:            {authtypes.Minter, authtypes.Burner},
   214  		ibcfeetypes.ModuleName:      nil,
   215  		icatypes.ModuleName:         nil,
   216  		mock.ModuleName:             nil,
   217  	}
   218  
   219  	GlobalGpIndex = GasPriceIndex{}
   220  
   221  	onceLog sync.Once
   222  )
   223  
   224  type GasPriceIndex struct {
   225  	RecommendGp *big.Int `json:"recommend-gp"`
   226  }
   227  
   228  var _ simapp.App = (*SimApp)(nil)
   229  
   230  // SimApp implements an extended ABCI application. It is an application
   231  // that may process transactions through Ethereum's EVM running atop of
   232  // Tendermint consensus.
   233  type SimApp struct {
   234  	*bam.BaseApp
   235  
   236  	txconfig client.TxConfig
   237  
   238  	CodecProxy *codec.CodecProxy
   239  
   240  	invCheckPeriod uint
   241  
   242  	// keys to access the substores
   243  	keys    map[string]*sdk.KVStoreKey
   244  	tkeys   map[string]*sdk.TransientStoreKey
   245  	memKeys map[string]*sdk.MemoryStoreKey
   246  
   247  	// subspaces
   248  	subspaces map[string]params.Subspace
   249  
   250  	// keepers
   251  	AccountKeeper  auth.AccountKeeper
   252  	BankKeeper     *bank.BankKeeperAdapter
   253  	SupplyKeeper   *supply.KeeperAdapter
   254  	StakingKeeper  staking.Keeper
   255  	SlashingKeeper slashing.Keeper
   256  	MintKeeper     mint.Keeper
   257  	DistrKeeper    distr.Keeper
   258  	GovKeeper      gov.Keeper
   259  	CrisisKeeper   crisis.Keeper
   260  	UpgradeKeeper  upgrade.Keeper
   261  	ParamsKeeper   params.Keeper
   262  	EvidenceKeeper evidence.Keeper
   263  	EvmKeeper      *evm.Keeper
   264  	TokenKeeper    token.Keeper
   265  	DexKeeper      dex.Keeper
   266  	OrderKeeper    order.Keeper
   267  	SwapKeeper     ammswap.Keeper
   268  	FarmKeeper     farm.Keeper
   269  	wasmKeeper     wasm.Keeper
   270  
   271  	// the module manager
   272  	mm *module.Manager
   273  
   274  	// simulation manager
   275  	sm *module.SimulationManager
   276  
   277  	blockGasPrice []*big.Int
   278  
   279  	configurator module.Configurator
   280  	// ibc
   281  	ScopedIBCKeeper      capabilitykeeper.ScopedKeeper
   282  	ScopedTransferKeeper capabilitykeeper.ScopedKeeper
   283  	ScopedIBCMockKeeper  capabilitykeeper.ScopedKeeper
   284  	ScopedICAMockKeeper  capabilitykeeper.ScopedKeeper
   285  	ScopedICAHostKeeper  capabilitykeeper.ScopedKeeper
   286  	TransferKeeper       ibctransferkeeper.Keeper
   287  	CapabilityKeeper     *capabilitykeeper.Keeper
   288  	IBCKeeper            *ibc.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly
   289  	marshal              *codec.CodecProxy
   290  	heightTasks          map[int64]*upgradetypes.HeightTasks
   291  	Erc20Keeper          erc20.Keeper
   292  
   293  	ibcScopeKeep capabilitykeeper.ScopedKeeper
   294  	WasmHandler  wasmkeeper.HandlerOption
   295  
   296  	IBCFeeKeeper        ibcfeekeeper.Keeper
   297  	ICAMauthKeeper      icamauthkeeper.Keeper
   298  	ICAControllerKeeper icacontrollerkeeper.Keeper
   299  	ICAHostKeeper       icahostkeeper.Keeper
   300  	ICAAuthModule       mock.IBCModule
   301  
   302  	FeeMockModule mock.IBCModule
   303  }
   304  
   305  func NewSimApp(
   306  	logger log.Logger,
   307  	db dbm.DB,
   308  	traceStore io.Writer,
   309  	loadLatest bool,
   310  	skipUpgradeHeights map[int64]bool,
   311  	invCheckPeriod uint,
   312  	baseAppOptions ...func(*bam.BaseApp),
   313  ) *SimApp {
   314  	logger.Info("Starting OEC",
   315  		"GenesisHeight", tmtypes.GetStartBlockHeight(),
   316  		"MercuryHeight", tmtypes.GetMercuryHeight(),
   317  		"VenusHeight", tmtypes.GetVenusHeight(),
   318  	)
   319  	//onceLog.Do(func() {
   320  	//	iavl.SetLogger(logger.With("module", "iavl"))
   321  	//	logStartingFlags(logger)
   322  	//})
   323  
   324  	codecProxy, interfaceReg := okexchaincodec.MakeCodecSuit(ModuleBasics)
   325  
   326  	// NOTE we use custom OKExChain transaction decoder that supports the sdk.Tx interface instead of sdk.StdTx
   327  	bApp := bam.NewBaseApp(appName, logger, db, evm.TxDecoder(codecProxy), baseAppOptions...)
   328  
   329  	bApp.SetCommitMultiStoreTracer(traceStore)
   330  	bApp.SetAppVersion(version.Version)
   331  	bApp.SetStartLogHandler(trace.StartTxLog)
   332  	bApp.SetEndLogHandler(trace.StopTxLog)
   333  
   334  	bApp.SetInterfaceRegistry(interfaceReg)
   335  
   336  	keys := sdk.NewKVStoreKeys(
   337  		bam.MainStoreKey, auth.StoreKey, staking.StoreKey,
   338  		supply.StoreKey, mint.StoreKey, distr.StoreKey, slashing.StoreKey,
   339  		gov.StoreKey, params.StoreKey, upgrade.StoreKey, evidence.StoreKey,
   340  		evm.StoreKey, token.StoreKey, token.KeyLock, dex.StoreKey, dex.TokenPairStoreKey,
   341  		order.OrderStoreKey, ammswap.StoreKey, farm.StoreKey, ibctransfertypes.StoreKey, capabilitytypes.StoreKey,
   342  		ibchost.StoreKey,
   343  		erc20.StoreKey,
   344  		mpt.StoreKey, wasm.StoreKey,
   345  		icacontrollertypes.StoreKey, icahosttypes.StoreKey, ibcfeetypes.StoreKey,
   346  		icamauthtypes.StoreKey,
   347  	)
   348  
   349  	tkeys := sdk.NewTransientStoreKeys(params.TStoreKey)
   350  	memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
   351  
   352  	app := &SimApp{
   353  		BaseApp:        bApp,
   354  		invCheckPeriod: invCheckPeriod,
   355  		keys:           keys,
   356  		tkeys:          tkeys,
   357  		subspaces:      make(map[string]params.Subspace),
   358  		heightTasks:    make(map[int64]*upgradetypes.HeightTasks),
   359  		memKeys:        memKeys,
   360  	}
   361  	app.CodecProxy = codecProxy
   362  	bApp.SetInterceptors(makeInterceptors())
   363  
   364  	// init params keeper and subspaces
   365  	app.ParamsKeeper = params.NewKeeper(codecProxy.GetCdc(), keys[params.StoreKey], tkeys[params.TStoreKey], logger)
   366  	app.subspaces[auth.ModuleName] = app.ParamsKeeper.Subspace(auth.DefaultParamspace)
   367  	app.subspaces[bank.ModuleName] = app.ParamsKeeper.Subspace(bank.DefaultParamspace)
   368  	app.subspaces[staking.ModuleName] = app.ParamsKeeper.Subspace(staking.DefaultParamspace)
   369  	app.subspaces[mint.ModuleName] = app.ParamsKeeper.Subspace(mint.DefaultParamspace)
   370  	app.subspaces[distr.ModuleName] = app.ParamsKeeper.Subspace(distr.DefaultParamspace)
   371  	app.subspaces[slashing.ModuleName] = app.ParamsKeeper.Subspace(slashing.DefaultParamspace)
   372  	app.subspaces[gov.ModuleName] = app.ParamsKeeper.Subspace(gov.DefaultParamspace)
   373  	app.subspaces[crisis.ModuleName] = app.ParamsKeeper.Subspace(crisis.DefaultParamspace)
   374  	app.subspaces[evidence.ModuleName] = app.ParamsKeeper.Subspace(evidence.DefaultParamspace)
   375  	app.subspaces[evm.ModuleName] = app.ParamsKeeper.Subspace(evm.DefaultParamspace)
   376  	app.subspaces[token.ModuleName] = app.ParamsKeeper.Subspace(token.DefaultParamspace)
   377  	app.subspaces[dex.ModuleName] = app.ParamsKeeper.Subspace(dex.DefaultParamspace)
   378  	app.subspaces[order.ModuleName] = app.ParamsKeeper.Subspace(order.DefaultParamspace)
   379  	app.subspaces[ammswap.ModuleName] = app.ParamsKeeper.Subspace(ammswap.DefaultParamspace)
   380  	app.subspaces[farm.ModuleName] = app.ParamsKeeper.Subspace(farm.DefaultParamspace)
   381  	app.subspaces[ibchost.ModuleName] = app.ParamsKeeper.Subspace(ibchost.ModuleName)
   382  	app.subspaces[ibctransfertypes.ModuleName] = app.ParamsKeeper.Subspace(ibctransfertypes.ModuleName)
   383  	app.subspaces[erc20.ModuleName] = app.ParamsKeeper.Subspace(erc20.DefaultParamspace)
   384  	app.subspaces[wasm.ModuleName] = app.ParamsKeeper.Subspace(wasm.ModuleName)
   385  	app.subspaces[icacontrollertypes.SubModuleName] = app.ParamsKeeper.Subspace(icacontrollertypes.SubModuleName)
   386  	app.subspaces[icahosttypes.SubModuleName] = app.ParamsKeeper.Subspace(icahosttypes.SubModuleName)
   387  	app.subspaces[ibcfeetypes.ModuleName] = app.ParamsKeeper.Subspace(ibcfeetypes.ModuleName)
   388  
   389  	//proxy := codec.NewMarshalProxy(cc, cdc)
   390  	app.marshal = codecProxy
   391  	// use custom OKExChain account for contracts
   392  	app.AccountKeeper = auth.NewAccountKeeper(
   393  		codecProxy.GetCdc(), keys[auth.StoreKey], keys[mpt.StoreKey], app.subspaces[auth.ModuleName], okexchain.ProtoAccount,
   394  	)
   395  
   396  	bankKeeper := bank.NewBaseKeeperWithMarshal(
   397  		&app.AccountKeeper, codecProxy, app.subspaces[bank.ModuleName], app.ModuleAccountAddrs(),
   398  	)
   399  	app.BankKeeper = bank.NewBankKeeperAdapter(bankKeeper)
   400  	app.ParamsKeeper.SetBankKeeper(app.BankKeeper)
   401  	sup := supply.NewKeeper(
   402  		codecProxy.GetCdc(), keys[supply.StoreKey], &app.AccountKeeper, bank.NewBankKeeperAdapter(app.BankKeeper), maccPerms,
   403  	)
   404  	app.SupplyKeeper = supply.NewSupplyKeeperAdapter(sup)
   405  	stakingKeeper := staking2.NewStakingKeeper(
   406  		codecProxy, keys[staking.StoreKey], app.SupplyKeeper, app.subspaces[staking.ModuleName],
   407  	).Keeper
   408  	app.ParamsKeeper.SetStakingKeeper(stakingKeeper)
   409  	app.MintKeeper = mint.NewKeeper(
   410  		codecProxy.GetCdc(), keys[mint.StoreKey], app.subspaces[mint.ModuleName], stakingKeeper,
   411  		app.SupplyKeeper, auth.FeeCollectorName, farm.MintFarmingAccount,
   412  	)
   413  	app.DistrKeeper = distr.NewKeeper(
   414  		codecProxy.GetCdc(), keys[distr.StoreKey], app.subspaces[distr.ModuleName], stakingKeeper,
   415  		app.SupplyKeeper, auth.FeeCollectorName, app.ModuleAccountAddrs(),
   416  	)
   417  	app.SlashingKeeper = slashing.NewKeeper(
   418  		codecProxy.GetCdc(), keys[slashing.StoreKey], stakingKeeper, app.subspaces[slashing.ModuleName],
   419  	)
   420  	app.CrisisKeeper = crisis.NewKeeper(
   421  		app.subspaces[crisis.ModuleName], invCheckPeriod, app.SupplyKeeper, auth.FeeCollectorName,
   422  	)
   423  	app.UpgradeKeeper = upgrade.NewKeeper(skipUpgradeHeights, keys[upgrade.StoreKey], app.marshal.GetCdc())
   424  	app.ParamsKeeper.RegisterSignal(evmtypes.SetEvmParamsNeedUpdate)
   425  	app.EvmKeeper = evm.NewKeeper(
   426  		app.marshal.GetCdc(), keys[evm.StoreKey], app.subspaces[evm.ModuleName], &app.AccountKeeper, app.SupplyKeeper, app.BankKeeper, stakingKeeper, logger)
   427  	(&bankKeeper).SetInnerTxKeeper(app.EvmKeeper)
   428  
   429  	app.TokenKeeper = token.NewKeeper(app.BankKeeper, app.subspaces[token.ModuleName], auth.FeeCollectorName, app.SupplyKeeper,
   430  		keys[token.StoreKey], keys[token.KeyLock], app.marshal.GetCdc(), false, &app.AccountKeeper)
   431  
   432  	app.DexKeeper = dex.NewKeeper(auth.FeeCollectorName, app.SupplyKeeper, app.subspaces[dex.ModuleName], app.TokenKeeper, stakingKeeper,
   433  		app.BankKeeper, app.keys[dex.StoreKey], app.keys[dex.TokenPairStoreKey], app.marshal.GetCdc())
   434  
   435  	app.OrderKeeper = order.NewKeeper(
   436  		app.TokenKeeper, app.SupplyKeeper, app.DexKeeper, app.subspaces[order.ModuleName], auth.FeeCollectorName,
   437  		app.keys[order.OrderStoreKey], app.marshal.GetCdc(), false, monitor.NopOrderMetrics())
   438  
   439  	app.SwapKeeper = ammswap.NewKeeper(app.SupplyKeeper, app.TokenKeeper, app.marshal.GetCdc(), app.keys[ammswap.StoreKey], app.subspaces[ammswap.ModuleName])
   440  
   441  	app.FarmKeeper = farm.NewKeeper(auth.FeeCollectorName, app.SupplyKeeper.Keeper, app.TokenKeeper, app.SwapKeeper, *app.EvmKeeper, app.subspaces[farm.StoreKey],
   442  		app.keys[farm.StoreKey], app.marshal.GetCdc())
   443  
   444  	// create evidence keeper with router
   445  	evidenceKeeper := evidence.NewKeeper(
   446  		codecProxy.GetCdc(), keys[evidence.StoreKey], app.subspaces[evidence.ModuleName], &app.StakingKeeper, app.SlashingKeeper,
   447  	)
   448  	evidenceRouter := evidence.NewRouter()
   449  	evidenceKeeper.SetRouter(evidenceRouter)
   450  	app.EvidenceKeeper = *evidenceKeeper
   451  
   452  	// add capability keeper and ScopeToModule for ibc module
   453  	app.CapabilityKeeper = capabilitykeeper.NewKeeper(codecProxy, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey])
   454  	scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibchost.ModuleName)
   455  	app.ibcScopeKeep = scopedIBCKeeper
   456  	scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName)
   457  	// NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do
   458  	// note replicate if you do not need to test core IBC or light clients.
   459  	scopedIBCMockKeeper := app.CapabilityKeeper.ScopeToModule(mock.ModuleName)
   460  	scopedICAMockKeeper := app.CapabilityKeeper.ScopeToModule(mock.ModuleName + icacontrollertypes.SubModuleName)
   461  	scopedICAControllerKeeper := app.CapabilityKeeper.ScopeToModule(icacontrollertypes.SubModuleName)
   462  	scopedICAHostKeeper := app.CapabilityKeeper.ScopeToModule(icahosttypes.SubModuleName)
   463  	scopedICAMauthKeeper := app.CapabilityKeeper.ScopeToModule(icamauthtypes.ModuleName)
   464  	scopedFeeMockKeeper := app.CapabilityKeeper.ScopeToModule(MockFeePort)
   465  
   466  	v2keeper := ibc.NewKeeper(
   467  		codecProxy, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), &stakingKeeper, app.UpgradeKeeper, &scopedIBCKeeper, interfaceReg,
   468  	)
   469  	v4Keeper := ibc.NewV4Keeper(v2keeper)
   470  	facadedKeeper := ibc.NewFacadedKeeper(v2keeper)
   471  	facadedKeeper.RegisterKeeper(ibccommon.DefaultFactory(tmtypes.HigherThanVenus4, ibc.IBCV4, v4Keeper))
   472  	app.IBCKeeper = facadedKeeper
   473  
   474  	// Create Transfer Keepers
   475  	app.TransferKeeper = ibctransferkeeper.NewKeeper(
   476  		codecProxy, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName),
   477  		v2keeper.ChannelKeeper, &v2keeper.PortKeeper,
   478  		app.SupplyKeeper, app.SupplyKeeper, scopedTransferKeeper, interfaceReg,
   479  	)
   480  	ibctransfertypes.SetMarshal(codecProxy)
   481  
   482  	app.IBCFeeKeeper = ibcfeekeeper.NewKeeper(codecProxy, keys[ibcfeetypes.StoreKey], app.GetSubspace(ibcfeetypes.ModuleName),
   483  		v2keeper.ChannelKeeper, // may be replaced with IBC middleware
   484  		v2keeper.ChannelKeeper,
   485  		&v2keeper.PortKeeper, app.SupplyKeeper, app.SupplyKeeper,
   486  	)
   487  
   488  	// ICA Controller keeper
   489  	app.ICAControllerKeeper = icacontrollerkeeper.NewKeeper(
   490  		codecProxy, keys[icacontrollertypes.StoreKey], app.GetSubspace(icacontrollertypes.SubModuleName),
   491  		app.IBCFeeKeeper, // use ics29 fee as ics4Wrapper in middleware stack
   492  		app.IBCKeeper.V2Keeper.ChannelKeeper, &app.IBCKeeper.V2Keeper.PortKeeper,
   493  		scopedICAControllerKeeper, app.MsgServiceRouter(),
   494  	)
   495  
   496  	// ICA Host keeper
   497  	app.ICAHostKeeper = icahostkeeper.NewKeeper(
   498  		codecProxy, keys[icahosttypes.StoreKey], app.GetSubspace(icahosttypes.SubModuleName),
   499  		app.IBCKeeper.V2Keeper.ChannelKeeper, &app.IBCKeeper.V2Keeper.PortKeeper,
   500  		app.SupplyKeeper, scopedICAHostKeeper, app.MsgServiceRouter(),
   501  	)
   502  
   503  	app.ICAMauthKeeper = icamauthkeeper.NewKeeper(
   504  		codecProxy,
   505  		keys[icamauthtypes.StoreKey],
   506  		app.ICAControllerKeeper,
   507  		scopedICAMauthKeeper,
   508  	)
   509  
   510  	app.Erc20Keeper = erc20.NewKeeper(app.marshal.GetCdc(), app.keys[erc20.ModuleName], app.subspaces[erc20.ModuleName],
   511  		app.AccountKeeper, app.SupplyKeeper, app.BankKeeper, app.EvmKeeper, app.TransferKeeper)
   512  
   513  	// register the proposal types
   514  	// 3.register the proposal types
   515  	govRouter := gov.NewRouter()
   516  	govRouter.AddRoute(gov.RouterKey, gov.ProposalHandler).
   517  		AddRoute(params.RouterKey, params.NewParamChangeProposalHandler(&app.ParamsKeeper)).
   518  		AddRoute(distr.RouterKey, distr.NewDistributionProposalHandler(app.DistrKeeper)).
   519  		AddRoute(dex.RouterKey, dex.NewProposalHandler(&app.DexKeeper)).
   520  		AddRoute(farm.RouterKey, farm.NewManageWhiteListProposalHandler(&app.FarmKeeper)).
   521  		AddRoute(evm.RouterKey, evm.NewManageContractDeploymentWhitelistProposalHandler(app.EvmKeeper)).
   522  		AddRoute(mint.RouterKey, mint.NewManageTreasuresProposalHandler(&app.MintKeeper)).
   523  		AddRoute(ibchost.RouterKey, ibcclient.NewClientUpdateProposalHandler(v2keeper.ClientKeeper)).
   524  		AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientUpdateProposalHandler(v2keeper.ClientKeeper)).
   525  		AddRoute(erc20.RouterKey, erc20.NewProposalHandler(&app.Erc20Keeper))
   526  	govProposalHandlerRouter := keeper.NewProposalHandlerRouter()
   527  	govProposalHandlerRouter.AddRoute(params.RouterKey, &app.ParamsKeeper).
   528  		AddRoute(dex.RouterKey, &app.DexKeeper).
   529  		AddRoute(farm.RouterKey, &app.FarmKeeper).
   530  		AddRoute(evm.RouterKey, app.EvmKeeper).
   531  		AddRoute(mint.RouterKey, &app.MintKeeper).
   532  		AddRoute(erc20.RouterKey, &app.Erc20Keeper)
   533  	app.GovKeeper = gov.NewKeeper(
   534  		app.marshal.GetCdc(), app.keys[gov.StoreKey], app.ParamsKeeper, app.subspaces[gov.DefaultParamspace],
   535  		app.SupplyKeeper, stakingKeeper, gov.DefaultParamspace, govRouter,
   536  		app.BankKeeper, govProposalHandlerRouter, auth.FeeCollectorName,
   537  	)
   538  	app.ParamsKeeper.SetGovKeeper(app.GovKeeper)
   539  	app.DexKeeper.SetGovKeeper(app.GovKeeper)
   540  	app.FarmKeeper.SetGovKeeper(app.GovKeeper)
   541  	app.EvmKeeper.SetGovKeeper(app.GovKeeper)
   542  	app.MintKeeper.SetGovKeeper(app.GovKeeper)
   543  	app.Erc20Keeper.SetGovKeeper(app.GovKeeper)
   544  
   545  	// Create static IBC router, add transfer route, then set and seal it
   546  	ibcRouter := ibcporttypes.NewRouter()
   547  	// Set EVM hooks
   548  	//app.EvmKeeper.SetHooks(evm.NewLogProcessEvmHook(erc20.NewSendToIbcEventHandler(app.Erc20Keeper)))
   549  	// Set IBC hooks
   550  	//app.TransferKeeper = *app.TransferKeeper.SetHooks(erc20.NewIBCTransferHooks(app.Erc20Keeper))
   551  	//transferModule := ibctransfer.NewAppModule(app.TransferKeeper, codecProxy)
   552  
   553  	//middle := transfer2.NewIBCModule(app.TransferKeeper)
   554  	transferModule := transfer.TNewTransferModule(app.TransferKeeper, codecProxy)
   555  	left := common.NewDisaleProxyMiddleware()
   556  	middle := ibctransfer.NewIBCModule(app.TransferKeeper, transferModule.AppModule)
   557  	right := ibcfee.NewIBCMiddleware(middle, app.IBCFeeKeeper)
   558  	transferStack := ibcporttypes.NewFacadedMiddleware(left,
   559  		ibccommon.DefaultFactory(tmtypes.HigherThanVenus4, ibc.IBCV4, right),
   560  		ibccommon.DefaultFactory(tmtypes.HigherThanVenus1, ibc.IBCV2, middle))
   561  
   562  	ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferStack)
   563  
   564  	mockModule := mock.NewAppModule(scopedIBCMockKeeper, &v2keeper.PortKeeper)
   565  	mockIBCModule := mock.NewIBCModule(&mockModule, mock.NewMockIBCApp(mock.ModuleName, scopedIBCMockKeeper))
   566  	ibcRouter.AddRoute(mock.ModuleName, mockIBCModule)
   567  	// The mock module is used for testing IBC
   568  	//mockIBCModule := mock.NewIBCModule(&mockModule, mock.NewMockIBCApp(mock.ModuleName, scopedIBCMockKeeper))
   569  
   570  	var icaControllerStack ibcporttypes.IBCModule
   571  	icaControllerStack = mock.NewIBCModule(&mockModule, mock.NewMockIBCApp("", scopedICAMockKeeper))
   572  	app.ICAAuthModule = icaControllerStack.(mock.IBCModule)
   573  	icaControllerStack = icacontroller.NewIBCMiddleware(icaControllerStack, app.ICAControllerKeeper)
   574  	icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper)
   575  
   576  	var icaHostStack ibcporttypes.IBCModule
   577  	icaHostStack = icahost.NewIBCModule(app.ICAHostKeeper)
   578  	icaHostStack = ibcfee.NewIBCMiddleware(icaHostStack, app.IBCFeeKeeper)
   579  	// fee
   580  	feeMockModule := mock.NewIBCModule(&mockModule, mock.NewMockIBCApp(MockFeePort, scopedFeeMockKeeper))
   581  	app.FeeMockModule = feeMockModule
   582  	feeWithMockModule := ibcfee.NewIBCMiddleware(feeMockModule, app.IBCFeeKeeper)
   583  	ibcRouter.AddRoute(MockFeePort, feeWithMockModule)
   584  
   585  	ibcRouter.AddRoute(icacontrollertypes.SubModuleName, icaControllerStack)
   586  	ibcRouter.AddRoute(icahosttypes.SubModuleName, icaHostStack)
   587  	ibcRouter.AddRoute(icamauthtypes.ModuleName, icaControllerStack)
   588  	ibcRouter.AddRoute(mock.ModuleName+icacontrollertypes.SubModuleName, icaControllerStack) // ica with mock auth module stack route to ica (top level of middleware stack)
   589  	//ibcRouter.AddRoute(ibcmock.ModuleName, mockModule)
   590  	v2keeper.SetRouter(ibcRouter)
   591  
   592  	// register the staking hooks
   593  	// NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks
   594  	app.StakingKeeper = *stakingKeeper.SetHooks(
   595  		staking.NewMultiStakingHooks(app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks()),
   596  	)
   597  
   598  	homeDir := viper.GetString(cli.HomeFlag)
   599  	wasmDir := filepath.Join(homeDir, "wasm")
   600  	wasmConfig, err := wasm.ReadWasmConfig()
   601  	if err != nil {
   602  		panic(fmt.Sprintf("error while reading wasm config: %s", err))
   603  	}
   604  
   605  	// The last arguments can contain custom message handlers, and custom query handlers,
   606  	// if we want to allow any custom callbacks
   607  	supportedFeatures := wasm.SupportedFeatures
   608  	app.wasmKeeper = wasm.NewKeeper(
   609  		app.marshal,
   610  		keys[wasm.StoreKey],
   611  		app.subspaces[wasm.ModuleName],
   612  		&app.AccountKeeper,
   613  		bank.NewBankKeeperAdapter(app.BankKeeper),
   614  		v2keeper.ChannelKeeper,
   615  		&v2keeper.PortKeeper,
   616  		nil,
   617  		app.TransferKeeper,
   618  		app.MsgServiceRouter(),
   619  		app.GRPCQueryRouter(),
   620  		wasmDir,
   621  		wasmConfig,
   622  		supportedFeatures,
   623  	)
   624  
   625  	// NOTE: Any module instantiated in the module manager that is later modified
   626  	// must be passed by reference here.
   627  	app.mm = module.NewManager(
   628  		genutil.NewAppModule(app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx),
   629  		auth.NewAppModule(app.AccountKeeper),
   630  		bank.NewAppModule(app.BankKeeper, app.AccountKeeper, app.SupplyKeeper),
   631  		crisis.NewAppModule(&app.CrisisKeeper),
   632  		supply.NewAppModule(app.SupplyKeeper.Keeper, app.AccountKeeper),
   633  		gov.NewAppModule(app.GovKeeper, app.SupplyKeeper),
   634  		mint.NewAppModule(app.MintKeeper),
   635  		slashing.NewAppModule(app.SlashingKeeper, app.AccountKeeper, app.StakingKeeper),
   636  		distr.NewAppModule(app.DistrKeeper, app.SupplyKeeper),
   637  		staking2.TNewStakingModule(app.StakingKeeper, app.AccountKeeper, app.SupplyKeeper),
   638  		evidence.NewAppModule(app.EvidenceKeeper),
   639  		evm2.TNewEvmModuleAdapter(app.EvmKeeper, &app.AccountKeeper),
   640  		token.NewAppModule(commonversion.ProtocolVersionV0, app.TokenKeeper, app.SupplyKeeper),
   641  		dex.NewAppModule(commonversion.ProtocolVersionV0, app.DexKeeper, app.SupplyKeeper),
   642  		order.NewAppModule(commonversion.ProtocolVersionV0, app.OrderKeeper, app.SupplyKeeper),
   643  		ammswap.NewAppModule(app.SwapKeeper),
   644  		farm.NewAppModule(app.FarmKeeper),
   645  		params.NewAppModule(app.ParamsKeeper),
   646  		// ibc
   647  		//ibc.NewAppModule(app.IBCKeeper),
   648  		core.NewIBCCOreAppModule(app.IBCKeeper),
   649  		//capabilityModule.NewAppModule(codecProxy, *app.CapabilityKeeper),
   650  		capability.TNewCapabilityModuleAdapter(codecProxy, *app.CapabilityKeeper),
   651  		transferModule,
   652  		erc20.NewAppModule(app.Erc20Keeper),
   653  		mockModule,
   654  		wasm.NewAppModule(*app.marshal, &app.wasmKeeper),
   655  		fee.NewTestFeeAppModule(app.IBCFeeKeeper),
   656  		ica2.NewTestICAModule(codecProxy, &app.ICAControllerKeeper, &app.ICAHostKeeper),
   657  		icamauth.NewAppModule(codecProxy, app.ICAMauthKeeper),
   658  	)
   659  
   660  	// During begin block slashing happens after distr.BeginBlocker so that
   661  	// there is nothing left over in the validator fee pool, so as to keep the
   662  	// CanWithdrawInvariant invariant.
   663  	app.mm.SetOrderBeginBlockers(
   664  		bank.ModuleName,
   665  		capabilitytypes.ModuleName,
   666  		order.ModuleName,
   667  		token.ModuleName,
   668  		dex.ModuleName,
   669  		mint.ModuleName,
   670  		distr.ModuleName,
   671  		slashing.ModuleName,
   672  		staking.ModuleName,
   673  		farm.ModuleName,
   674  		evidence.ModuleName,
   675  		evm.ModuleName,
   676  		ibchost.ModuleName,
   677  		ibctransfertypes.ModuleName,
   678  		mock.ModuleName,
   679  		wasm.ModuleName,
   680  	)
   681  	app.mm.SetOrderEndBlockers(
   682  		crisis.ModuleName,
   683  		gov.ModuleName,
   684  		dex.ModuleName,
   685  		order.ModuleName,
   686  		staking.ModuleName,
   687  		evm.ModuleName,
   688  		mock.ModuleName,
   689  		wasm.ModuleName,
   690  	)
   691  
   692  	// NOTE: The genutils module must occur after staking so that pools are
   693  	// properly initialized with tokens from genesis accounts.
   694  	app.mm.SetOrderInitGenesis(
   695  		capabilitytypes.ModuleName,
   696  		auth.ModuleName, distr.ModuleName, staking.ModuleName, bank.ModuleName,
   697  		slashing.ModuleName, gov.ModuleName, mint.ModuleName, supply.ModuleName,
   698  		token.ModuleName, dex.ModuleName, order.ModuleName, ammswap.ModuleName, farm.ModuleName,
   699  		ibctransfertypes.ModuleName,
   700  		ibchost.ModuleName,
   701  		evm.ModuleName, crisis.ModuleName, genutil.ModuleName, params.ModuleName, evidence.ModuleName,
   702  		erc20.ModuleName,
   703  		mock.ModuleName,
   704  		wasm.ModuleName,
   705  		icatypes.ModuleName, ibcfeetypes.ModuleName,
   706  	)
   707  
   708  	app.mm.RegisterInvariants(&app.CrisisKeeper)
   709  	app.mm.RegisterRoutes(app.Router(), app.QueryRouter())
   710  	app.configurator = module.NewConfigurator(app.Codec(), app.MsgServiceRouter(), app.GRPCQueryRouter())
   711  	app.mm.RegisterServices(app.configurator)
   712  	app.setupUpgradeModules(false)
   713  
   714  	// create the simulation manager and define the order of the modules for deterministic simulations
   715  	//
   716  	// NOTE: this is not required apps that don't use the simulator for fuzz testing
   717  	// transactions
   718  	app.sm = module.NewSimulationManager(
   719  		auth.NewAppModule(app.AccountKeeper),
   720  		bank.NewAppModule(app.BankKeeper, app.AccountKeeper, app.SupplyKeeper),
   721  		supply.NewAppModule(app.SupplyKeeper.Keeper, app.AccountKeeper),
   722  		gov.NewAppModule(app.GovKeeper, app.SupplyKeeper),
   723  		mint.NewAppModule(app.MintKeeper),
   724  		staking.NewAppModule(app.StakingKeeper, app.AccountKeeper, app.SupplyKeeper),
   725  		distr.NewAppModule(app.DistrKeeper, app.SupplyKeeper),
   726  		slashing.NewAppModule(app.SlashingKeeper, app.AccountKeeper, app.StakingKeeper),
   727  		params.NewAppModule(app.ParamsKeeper), // NOTE: only used for simulation to generate randomized param change proposals
   728  		ibc.NewAppModule(app.IBCKeeper),
   729  		wasm.NewAppModule(*app.marshal, &app.wasmKeeper),
   730  	)
   731  
   732  	app.sm.RegisterStoreDecoders()
   733  
   734  	// initialize stores
   735  	app.MountKVStores(keys)
   736  	app.MountTransientStores(tkeys)
   737  	app.MountMemoryStores(memKeys)
   738  
   739  	// initialize BaseApp
   740  	app.SetInitChainer(app.InitChainer)
   741  	app.SetBeginBlocker(app.BeginBlocker)
   742  	app.WasmHandler = wasmkeeper.HandlerOption{
   743  		WasmConfig:        &wasmConfig,
   744  		TXCounterStoreKey: keys[wasm.StoreKey],
   745  	}
   746  	app.SetAnteHandler(ante.NewAnteHandler(app.AccountKeeper, app.EvmKeeper, app.SupplyKeeper, validateMsgHook(app.OrderKeeper), app.WasmHandler, app.IBCKeeper, app.StakingKeeper, app.ParamsKeeper))
   747  	app.SetEndBlocker(app.EndBlocker)
   748  	app.SetGasRefundHandler(refund.NewGasRefundHandler(app.AccountKeeper, app.SupplyKeeper, app.EvmKeeper))
   749  	app.SetAccNonceHandler(NewAccHandler(app.AccountKeeper))
   750  	app.SetUpdateWasmTxCount(fixCosmosTxCountInWasmForParallelTx(app.WasmHandler.TXCounterStoreKey))
   751  	app.SetUpdateFeeCollectorAccHandler(updateFeeCollectorHandler(app.BankKeeper, app.SupplyKeeper.Keeper))
   752  	app.SetGetFeeCollectorInfo(getFeeCollectorInfo(app.BankKeeper, app.SupplyKeeper.Keeper))
   753  	app.SetParallelTxLogHandlers(fixLogForParallelTxHandler(app.EvmKeeper))
   754  	app.SetPartialConcurrentHandlers(getTxFeeAndFromHandler(app.EvmKeeper))
   755  	app.SetGetTxFeeHandler(getTxFeeHandler())
   756  	app.SetEvmSysContractAddressHandler(NewEvmSysContractAddressHandler(app.EvmKeeper))
   757  	app.SetEvmWatcherCollector(func(...sdk.IWatcher) {})
   758  
   759  	if loadLatest {
   760  		err := app.LoadLatestVersion(app.keys[bam.MainStoreKey])
   761  		if err != nil {
   762  			tmos.Exit(err.Error())
   763  		}
   764  	}
   765  
   766  	app.ScopedIBCKeeper = scopedIBCKeeper
   767  	app.ScopedTransferKeeper = scopedTransferKeeper
   768  
   769  	// NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do
   770  	// note replicate if you do not need to test core IBC or light clients.
   771  	app.ScopedIBCMockKeeper = scopedIBCMockKeeper
   772  	app.ScopedICAMockKeeper = scopedICAMockKeeper
   773  	app.ScopedICAHostKeeper = scopedICAHostKeeper
   774  
   775  	return app
   776  }
   777  
   778  func updateFeeCollectorHandler(bk bank.Keeper, sk supply.Keeper) sdk.UpdateFeeCollectorAccHandler {
   779  	return func(ctx sdk.Context, balance sdk.Coins, txFeesplit []*sdk.FeeSplitInfo) error {
   780  		if !balance.Empty() {
   781  			return bk.SetCoins(ctx, sk.GetModuleAccount(ctx, auth.FeeCollectorName).GetAddress(), balance)
   782  		}
   783  		return nil
   784  	}
   785  }
   786  
   787  func getFeeCollectorInfo(bk bank.Keeper, sk supply.Keeper) sdk.GetFeeCollectorInfo {
   788  	return func(ctx sdk.Context, onlyGetFeeCollectorStoreKey bool) (sdk.Coins, []byte) {
   789  		if onlyGetFeeCollectorStoreKey {
   790  			return sdk.Coins{}, auth.AddressStoreKey(sk.GetModuleAddress(auth.FeeCollectorName))
   791  		}
   792  		return bk.GetCoins(ctx, sk.GetModuleAddress(auth.FeeCollectorName)), nil
   793  	}
   794  }
   795  
   796  func fixLogForParallelTxHandler(ek *evm.Keeper) sdk.LogFix {
   797  	return func(tx []sdk.Tx, logIndex []int, hasEnterEvmTx []bool, anteErrs []error, resp []abci.ResponseDeliverTx) (logs [][]byte) {
   798  		return ek.FixLog(tx, logIndex, hasEnterEvmTx, anteErrs, resp)
   799  	}
   800  }
   801  func evmTxVerifySigHandler(chainID string, blockHeight int64, evmTx *evmtypes.MsgEthereumTx) error {
   802  	chainIDEpoch, err := ethermint.ParseChainID(chainID)
   803  	if err != nil {
   804  		return err
   805  	}
   806  	err = evmTx.VerifySig(chainIDEpoch, blockHeight)
   807  	if err != nil {
   808  		return err
   809  	}
   810  	return nil
   811  }
   812  
   813  func getTxFeeAndFromHandler(ek ante.EVMKeeper) sdk.GetTxFeeAndFromHandler {
   814  	return func(ctx sdk.Context, tx sdk.Tx) (fee sdk.Coins, isEvm bool, isE2C bool, from string, to string, err error, supportPara bool) {
   815  		if evmTx, ok := tx.(*evmtypes.MsgEthereumTx); ok {
   816  			isEvm = true
   817  			supportPara = true
   818  			if ante.IsE2CTx(ek, &ctx, evmTx) {
   819  				isE2C = true
   820  				// E2C will include cosmos Msg in the Payload.
   821  				// Sometimes, this Msg do not support parallel execution.
   822  				if !isParaSupportedE2CMsg(evmTx.Data.Payload) {
   823  					supportPara = false
   824  				}
   825  			}
   826  			err = evmTxVerifySigHandler(ctx.ChainID(), ctx.BlockHeight(), evmTx)
   827  			if err != nil {
   828  				return
   829  			}
   830  			fee = evmTx.GetFee()
   831  			from = evmTx.BaseTx.From
   832  			if len(from) > 2 {
   833  				from = strings.ToLower(from[2:])
   834  			}
   835  			if evmTx.To() != nil {
   836  				to = strings.ToLower(evmTx.To().String()[2:])
   837  			}
   838  		} else if feeTx, ok := tx.(authante.FeeTx); ok {
   839  			fee = feeTx.GetFee()
   840  			if stdTx, ok := tx.(*auth.StdTx); ok && len(stdTx.Msgs) == 1 { // only support one message
   841  				if msg, ok := stdTx.Msgs[0].(interface{ CalFromAndToForPara() (string, string) }); ok {
   842  					from, to = msg.CalFromAndToForPara()
   843  					if tmtypes.HigherThanVenus6(ctx.BlockHeight()) {
   844  						supportPara = true
   845  					}
   846  				}
   847  			}
   848  		}
   849  
   850  		return
   851  	}
   852  }
   853  
   854  func getTxFeeHandler() sdk.GetTxFeeHandler {
   855  	return func(tx sdk.Tx) (fee sdk.Coins) {
   856  		if feeTx, ok := tx.(authante.FeeTx); ok {
   857  			fee = feeTx.GetFee()
   858  		}
   859  
   860  		return
   861  	}
   862  }
   863  
   864  func isParaSupportedE2CMsg(payload []byte) bool {
   865  	// Here, payload must be E2C's Data.Payload
   866  	p, err := evm.ParseContractParam(payload)
   867  	if err != nil {
   868  		return false
   869  	}
   870  	mw, err := baseapp.ParseMsgWrapper(p)
   871  	if err != nil {
   872  		return false
   873  	}
   874  	switch mw.Name {
   875  	case "wasm/MsgInstantiateContract":
   876  		return false
   877  	case "wasm/MsgMigrateContract":
   878  		return false
   879  	case "wasm/MsgUpdateAdmin":
   880  		return false
   881  	default:
   882  		return true
   883  	}
   884  }
   885  
   886  func (app *SimApp) SetOption(req abci.RequestSetOption) (res abci.ResponseSetOption) {
   887  	if req.Key == "CheckChainID" {
   888  		if err := okexchain.IsValidateChainIdWithGenesisHeight(req.Value); err != nil {
   889  			app.Logger().Error(err.Error())
   890  			panic(err)
   891  		}
   892  		err := okexchain.SetChainId(req.Value)
   893  		if err != nil {
   894  			app.Logger().Error(err.Error())
   895  			panic(err)
   896  		}
   897  	}
   898  	return app.BaseApp.SetOption(req)
   899  }
   900  
   901  func (app *SimApp) LoadStartVersion(height int64) error {
   902  	return app.LoadVersion(height, app.keys[bam.MainStoreKey])
   903  }
   904  
   905  // Name returns the name of the App
   906  func (app *SimApp) Name() string { return app.BaseApp.Name() }
   907  
   908  // BeginBlocker updates every begin block
   909  func (app *SimApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock {
   910  	return app.mm.BeginBlock(ctx, req)
   911  }
   912  
   913  // EndBlocker updates every end block
   914  func (app *SimApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock {
   915  	// if appconfig.GetOecConfig().GetEnableDynamicGp() {
   916  	// 	GlobalGpIndex = CalBlockGasPriceIndex(app.blockGasPrice, appconfig.GetOecConfig().GetDynamicGpWeight())
   917  	// 	app.blockGasPrice = app.blockGasPrice[:0]
   918  	// }
   919  
   920  	return app.mm.EndBlock(ctx, req)
   921  }
   922  
   923  // InitChainer updates at chain initialization
   924  func (app *SimApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
   925  
   926  	var genesisState simapp.GenesisState
   927  	//app.UpgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap())
   928  	app.marshal.GetCdc().MustUnmarshalJSON(req.AppStateBytes, &genesisState)
   929  	return app.mm.InitGenesis(ctx, genesisState)
   930  }
   931  
   932  // LoadHeight loads state at a particular height
   933  func (app *SimApp) LoadHeight(height int64) error {
   934  	return app.LoadVersion(height, app.keys[bam.MainStoreKey])
   935  }
   936  
   937  // ModuleAccountAddrs returns all the app's module account addresses.
   938  func (app *SimApp) ModuleAccountAddrs() map[string]bool {
   939  	modAccAddrs := make(map[string]bool)
   940  	for acc := range maccPerms {
   941  		if acc == mock.ModuleName {
   942  			continue
   943  		}
   944  		modAccAddrs[supply.NewModuleAddress(acc).String()] = true
   945  	}
   946  
   947  	return modAccAddrs
   948  }
   949  
   950  // SimulationManager implements the SimulationApp interface
   951  func (app *SimApp) SimulationManager() *module.SimulationManager {
   952  	return app.sm
   953  }
   954  
   955  // GetKey returns the KVStoreKey for the provided store key.
   956  //
   957  // NOTE: This is solely to be used for testing purposes.
   958  func (app *SimApp) GetKey(storeKey string) *sdk.KVStoreKey {
   959  	return app.keys[storeKey]
   960  }
   961  
   962  func (app *SimApp) GetMemKey(storeKey string) *sdk.MemoryStoreKey {
   963  	return app.memKeys[storeKey]
   964  }
   965  
   966  func (app *SimApp) GetBaseApp() *bam.BaseApp {
   967  	return app.BaseApp
   968  }
   969  
   970  func (app *SimApp) GetStakingKeeper() staking.Keeper {
   971  	return app.StakingKeeper
   972  }
   973  func (app *SimApp) GetIBCKeeper() *ibckeeper.Keeper {
   974  	return app.IBCKeeper.V2Keeper
   975  }
   976  func (app *SimApp) GetFacadedKeeper() *ibc.Keeper {
   977  	return app.IBCKeeper
   978  }
   979  
   980  func (app *SimApp) GetScopedIBCKeeper() (cap capabilitykeeper.ScopedKeeper) {
   981  	cap = app.ibcScopeKeep
   982  	return
   983  }
   984  
   985  func (app *SimApp) AppCodec() *codec.CodecProxy {
   986  	return app.marshal
   987  }
   988  
   989  func (app *SimApp) LastCommitID() sdk.CommitID {
   990  	return app.BaseApp.GetCMS().LastCommitID()
   991  }
   992  
   993  func (app *SimApp) LastBlockHeight() int64 {
   994  	return app.GetCMS().LastCommitID().Version
   995  }
   996  
   997  func (app *SimApp) Codec() *codec.Codec {
   998  	return app.marshal.GetCdc()
   999  }
  1000  
  1001  func (app *SimApp) Marshal() *codec.CodecProxy {
  1002  	return app.marshal
  1003  }
  1004  
  1005  // GetSubspace returns a param subspace for a given module name.
  1006  //
  1007  // NOTE: This is solely to be used for testing purposes.
  1008  func (app *SimApp) GetSubspace(moduleName string) params.Subspace {
  1009  	return app.subspaces[moduleName]
  1010  }
  1011  
  1012  var protoCodec = encoding.GetCodec(proto.Name)
  1013  
  1014  func makeInterceptors() map[string]bam.Interceptor {
  1015  	m := make(map[string]bam.Interceptor)
  1016  	m["/cosmos.tx.v1beta1.Service/Simulate"] = bam.NewRedirectInterceptor("app/simulate")
  1017  	m["/cosmos.bank.v1beta1.Query/AllBalances"] = bam.NewRedirectInterceptor("custom/bank/grpc_balances")
  1018  	m["/cosmos.staking.v1beta1.Query/Params"] = bam.NewRedirectInterceptor("custom/staking/params4ibc")
  1019  	return m
  1020  }
  1021  
  1022  // GetMaccPerms returns a copy of the module account permissions
  1023  func GetMaccPerms() map[string][]string {
  1024  	dupMaccPerms := make(map[string][]string)
  1025  	for k, v := range maccPerms {
  1026  		dupMaccPerms[k] = v
  1027  	}
  1028  
  1029  	return dupMaccPerms
  1030  }
  1031  
  1032  func validateMsgHook(orderKeeper order.Keeper) ante.ValidateMsgHandler {
  1033  	return func(newCtx sdk.Context, msgs []sdk.Msg) error {
  1034  
  1035  		wrongMsgErr := sdk.ErrUnknownRequest(
  1036  			"It is not allowed that a transaction with more than one message contains order or evm message")
  1037  		var err error
  1038  
  1039  		for _, msg := range msgs {
  1040  			switch assertedMsg := msg.(type) {
  1041  			case order.MsgNewOrders:
  1042  				if len(msgs) > 1 {
  1043  					return wrongMsgErr
  1044  				}
  1045  				_, err = order.ValidateMsgNewOrders(newCtx, orderKeeper, assertedMsg)
  1046  			case order.MsgCancelOrders:
  1047  				if len(msgs) > 1 {
  1048  					return wrongMsgErr
  1049  				}
  1050  				err = order.ValidateMsgCancelOrders(newCtx, orderKeeper, assertedMsg)
  1051  			case *evmtypes.MsgEthereumTx:
  1052  				if len(msgs) > 1 {
  1053  					return wrongMsgErr
  1054  				}
  1055  			}
  1056  
  1057  			if err != nil {
  1058  				return err
  1059  			}
  1060  		}
  1061  		return nil
  1062  	}
  1063  }
  1064  
  1065  func NewAccHandler(ak auth.AccountKeeper) sdk.AccNonceHandler {
  1066  	return func(
  1067  		ctx sdk.Context, addr sdk.AccAddress,
  1068  	) uint64 {
  1069  		return ak.GetAccount(ctx, addr).GetSequence()
  1070  	}
  1071  }
  1072  
  1073  func NewEvmSysContractAddressHandler(ak *evm.Keeper) sdk.EvmSysContractAddressHandler {
  1074  	if ak == nil {
  1075  		panic("NewEvmSysContractAddressHandler ak is nil")
  1076  	}
  1077  	return func(
  1078  		ctx sdk.Context, addr sdk.AccAddress,
  1079  	) bool {
  1080  		if addr.Empty() {
  1081  			return false
  1082  		}
  1083  		return ak.IsMatchSysContractAddress(ctx, addr)
  1084  	}
  1085  }
  1086  
  1087  func PreRun(ctx *server.Context) error {
  1088  	// set the dynamic config
  1089  	appconfig.RegisterDynamicConfig(ctx.Logger.With("module", "config"))
  1090  
  1091  	// check start flag conflicts
  1092  	err := sanity.CheckStart()
  1093  	if err != nil {
  1094  		return err
  1095  	}
  1096  
  1097  	// set config by node mode
  1098  	//setNodeConfig(ctx)
  1099  
  1100  	//download pprof
  1101  	appconfig.PprofDownload(ctx)
  1102  
  1103  	// pruning options
  1104  	_, err = server.GetPruningOptionsFromFlags()
  1105  	if err != nil {
  1106  		return err
  1107  	}
  1108  	// repair state on start
  1109  	// if viper.GetBool(FlagEnableRepairState) {
  1110  	// 	repairStateOnStart(ctx)
  1111  	// }
  1112  
  1113  	// init tx signature cache
  1114  	tmtypes.InitSignatureCache()
  1115  	return nil
  1116  }
  1117  
  1118  func (app *SimApp) setupUpgradeModules(onlyTask bool) {
  1119  	heightTasks, paramMap, cf, pf, vf := app.CollectUpgradeModules(app.mm)
  1120  
  1121  	app.heightTasks = heightTasks
  1122  	if onlyTask {
  1123  		return
  1124  	}
  1125  
  1126  	app.GetCMS().AppendCommitFilters(cf)
  1127  	app.GetCMS().AppendPruneFilters(pf)
  1128  	app.GetCMS().AppendVersionFilters(vf)
  1129  
  1130  	vs := app.subspaces
  1131  	for k, vv := range paramMap {
  1132  		supace, exist := vs[k]
  1133  		if !exist {
  1134  			continue
  1135  		}
  1136  		vs[k] = supace.LazyWithKeyTable(subspace.NewKeyTable(vv.ParamSetPairs()...))
  1137  	}
  1138  }
  1139  
  1140  func (o *SimApp) TxConfig() client.TxConfig {
  1141  	return o.txconfig
  1142  }
  1143  
  1144  func (o *SimApp) CollectUpgradeModules(m *module.Manager) (map[int64]*upgradetypes.HeightTasks,
  1145  	map[string]params.ParamSet, []types.StoreFilter, []types.StoreFilter, []types.VersionFilter) {
  1146  	hm := make(map[int64]*upgradetypes.HeightTasks)
  1147  	paramsRet := make(map[string]params.ParamSet)
  1148  	commitFiltreMap := make(map[*types.StoreFilter]struct{})
  1149  	pruneFilterMap := make(map[*types.StoreFilter]struct{})
  1150  	versionFilterMap := make(map[*types.VersionFilter]struct{})
  1151  
  1152  	for _, mm := range m.Modules {
  1153  		if ada, ok := mm.(upgradetypes.UpgradeModule); ok {
  1154  			set := ada.RegisterParam()
  1155  			if set != nil {
  1156  				if _, exist := paramsRet[ada.ModuleName()]; !exist {
  1157  					paramsRet[ada.ModuleName()] = set
  1158  				}
  1159  			}
  1160  			h := ada.UpgradeHeight()
  1161  			if h > 0 {
  1162  				h++
  1163  			}
  1164  
  1165  			cf := ada.CommitFilter()
  1166  			if cf != nil {
  1167  				if _, exist := commitFiltreMap[cf]; !exist {
  1168  					commitFiltreMap[cf] = struct{}{}
  1169  				}
  1170  			}
  1171  			pf := ada.PruneFilter()
  1172  			if pf != nil {
  1173  				if _, exist := pruneFilterMap[pf]; !exist {
  1174  					pruneFilterMap[pf] = struct{}{}
  1175  				}
  1176  			}
  1177  			vf := ada.VersionFilter()
  1178  			if vf != nil {
  1179  				if _, exist := versionFilterMap[vf]; !exist {
  1180  					versionFilterMap[vf] = struct{}{}
  1181  				}
  1182  			}
  1183  
  1184  			t := ada.RegisterTask()
  1185  			if t == nil {
  1186  				continue
  1187  			}
  1188  			if err := t.ValidateBasic(); nil != err {
  1189  				panic(err)
  1190  			}
  1191  			taskList := hm[h]
  1192  			if taskList == nil {
  1193  				v := make(upgradetypes.HeightTasks, 0)
  1194  				taskList = &v
  1195  				hm[h] = taskList
  1196  			}
  1197  			*taskList = append(*taskList, t)
  1198  		}
  1199  	}
  1200  
  1201  	for _, v := range hm {
  1202  		sort.Sort(*v)
  1203  	}
  1204  
  1205  	commitFilters := make([]types.StoreFilter, 0)
  1206  	pruneFilters := make([]types.StoreFilter, 0)
  1207  	versionFilters := make([]types.VersionFilter, 0)
  1208  	for pointerFilter, _ := range commitFiltreMap {
  1209  		commitFilters = append(commitFilters, *pointerFilter)
  1210  	}
  1211  	for pointerFilter, _ := range pruneFilterMap {
  1212  		pruneFilters = append(pruneFilters, *pointerFilter)
  1213  	}
  1214  	for pointerFilter, _ := range versionFilterMap {
  1215  		versionFilters = append(versionFilters, *pointerFilter)
  1216  	}
  1217  
  1218  	return hm, paramsRet, commitFilters, pruneFilters, versionFilters
  1219  }
  1220  
  1221  // GetModuleManager returns the app module manager
  1222  // NOTE: used for testing purposes
  1223  func (app *SimApp) GetModuleManager() *module.Manager {
  1224  	return app.mm
  1225  }
  1226  
  1227  func fixCosmosTxCountInWasmForParallelTx(storeKey sdk.StoreKey) sdk.UpdateCosmosTxCount {
  1228  	return func(ctx sdk.Context, txCount int) {
  1229  		wasmkeeper.UpdateTxCount(ctx, storeKey, txCount)
  1230  	}
  1231  }