github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/app/app.go (about)

     1  package app
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"os"
     7  	"sync"
     8  
     9  	"github.com/fibonacci-chain/fbc/x/vmbridge"
    10  
    11  	ica "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/27-interchain-accounts"
    12  	icacontroller "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/27-interchain-accounts/controller"
    13  	icahost "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/27-interchain-accounts/host"
    14  	"github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/common"
    15  	"github.com/fibonacci-chain/fbc/x/icamauth"
    16  
    17  	ibccommon "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/common"
    18  
    19  	icacontrollertypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/27-interchain-accounts/controller/types"
    20  	icahosttypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/27-interchain-accounts/host/types"
    21  	icamauthtypes "github.com/fibonacci-chain/fbc/x/icamauth/types"
    22  
    23  	icacontrollerkeeper "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/27-interchain-accounts/controller/keeper"
    24  	icahostkeeper "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/27-interchain-accounts/host/keeper"
    25  	icamauthkeeper "github.com/fibonacci-chain/fbc/x/icamauth/keeper"
    26  
    27  	ibcfeekeeper "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/29-fee/keeper"
    28  
    29  	icatypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/27-interchain-accounts/types"
    30  	ibcfeetypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/29-fee/types"
    31  
    32  	ibcfee "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/29-fee"
    33  	"github.com/spf13/cobra"
    34  	"github.com/spf13/viper"
    35  	"google.golang.org/grpc/encoding"
    36  	"google.golang.org/grpc/encoding/proto"
    37  
    38  	"github.com/fibonacci-chain/fbc/app/utils/appstatus"
    39  
    40  	"github.com/fibonacci-chain/fbc/app/ante"
    41  	fbexchaincodec "github.com/fibonacci-chain/fbc/app/codec"
    42  	appconfig "github.com/fibonacci-chain/fbc/app/config"
    43  	"github.com/fibonacci-chain/fbc/app/refund"
    44  	fbchain "github.com/fibonacci-chain/fbc/app/types"
    45  	"github.com/fibonacci-chain/fbc/app/utils/sanity"
    46  	bam "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/baseapp"
    47  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    48  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server"
    49  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/simapp"
    50  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/mpt"
    51  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    52  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/module"
    53  	upgradetypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/upgrade"
    54  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/version"
    55  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    56  	authtypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/types"
    57  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank"
    58  	capabilityModule "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/capability"
    59  	capabilitykeeper "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/capability/keeper"
    60  	capabilitytypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/capability/types"
    61  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/crisis"
    62  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mint"
    63  	govclient "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/mint/client"
    64  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply"
    65  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/upgrade"
    66  	"github.com/fibonacci-chain/fbc/libs/iavl"
    67  	ibctransfer "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/transfer"
    68  	ibctransferkeeper "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/transfer/keeper"
    69  	ibctransfertypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/transfer/types"
    70  	ibc "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core"
    71  	ibcclient "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/02-client"
    72  	"github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/02-client/client"
    73  	ibcclienttypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/02-client/types"
    74  	ibcporttypes "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/05-port/types"
    75  	ibchost "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core/24-host"
    76  	"github.com/fibonacci-chain/fbc/libs/system"
    77  	"github.com/fibonacci-chain/fbc/libs/system/trace"
    78  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    79  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    80  	tmos "github.com/fibonacci-chain/fbc/libs/tendermint/libs/os"
    81  	sm "github.com/fibonacci-chain/fbc/libs/tendermint/state"
    82  	tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types"
    83  	dbm "github.com/fibonacci-chain/fbc/libs/tm-db"
    84  	"github.com/fibonacci-chain/fbc/x/ammswap"
    85  	commonversion "github.com/fibonacci-chain/fbc/x/common/version"
    86  	"github.com/fibonacci-chain/fbc/x/dex"
    87  	dexclient "github.com/fibonacci-chain/fbc/x/dex/client"
    88  	distr "github.com/fibonacci-chain/fbc/x/distribution"
    89  	"github.com/fibonacci-chain/fbc/x/erc20"
    90  	erc20client "github.com/fibonacci-chain/fbc/x/erc20/client"
    91  	"github.com/fibonacci-chain/fbc/x/evidence"
    92  	"github.com/fibonacci-chain/fbc/x/evm"
    93  	evmclient "github.com/fibonacci-chain/fbc/x/evm/client"
    94  	evmtypes "github.com/fibonacci-chain/fbc/x/evm/types"
    95  	"github.com/fibonacci-chain/fbc/x/farm"
    96  	farmclient "github.com/fibonacci-chain/fbc/x/farm/client"
    97  	"github.com/fibonacci-chain/fbc/x/feesplit"
    98  	fsclient "github.com/fibonacci-chain/fbc/x/feesplit/client"
    99  	"github.com/fibonacci-chain/fbc/x/genutil"
   100  	"github.com/fibonacci-chain/fbc/x/gov"
   101  	"github.com/fibonacci-chain/fbc/x/gov/keeper"
   102  	"github.com/fibonacci-chain/fbc/x/infura"
   103  	"github.com/fibonacci-chain/fbc/x/order"
   104  	"github.com/fibonacci-chain/fbc/x/params"
   105  	paramsclient "github.com/fibonacci-chain/fbc/x/params/client"
   106  	"github.com/fibonacci-chain/fbc/x/slashing"
   107  	"github.com/fibonacci-chain/fbc/x/staking"
   108  	"github.com/fibonacci-chain/fbc/x/token"
   109  	"github.com/fibonacci-chain/fbc/x/wasm"
   110  	wasmclient "github.com/fibonacci-chain/fbc/x/wasm/client"
   111  	wasmkeeper "github.com/fibonacci-chain/fbc/x/wasm/keeper"
   112  )
   113  
   114  func init() {
   115  	// set the address prefixes
   116  	config := sdk.GetConfig()
   117  	fbchain.SetBech32Prefixes(config)
   118  	fbchain.SetBip44CoinType(config)
   119  }
   120  
   121  const (
   122  	appName = "FBChain"
   123  )
   124  
   125  var (
   126  	// DefaultCLIHome sets the default home directories for the application CLI
   127  	DefaultCLIHome = os.ExpandEnv("$HOME/.fbchaincli")
   128  
   129  	// DefaultNodeHome sets the folder where the applcation data and configuration will be stored
   130  	DefaultNodeHome = os.ExpandEnv("$HOME/.fbchaind")
   131  
   132  	// ModuleBasics defines the module BasicManager is in charge of setting up basic,
   133  	// non-dependant module elements, such as codec registration
   134  	// and genesis verification.
   135  	ModuleBasics = module.NewBasicManager(
   136  		auth.AppModuleBasic{},
   137  		supply.AppModuleBasic{},
   138  		genutil.AppModuleBasic{},
   139  		bank.AppModuleBasic{},
   140  		staking.AppModuleBasic{},
   141  		mint.AppModuleBasic{},
   142  		distr.AppModuleBasic{},
   143  		gov.NewAppModuleBasic(
   144  			paramsclient.ProposalHandler,
   145  			paramsclient.UpgradeProposalHandler,
   146  			distr.CommunityPoolSpendProposalHandler,
   147  			distr.ChangeDistributionTypeProposalHandler,
   148  			distr.WithdrawRewardEnabledProposalHandler,
   149  			distr.RewardTruncatePrecisionProposalHandler,
   150  			dexclient.DelistProposalHandler, farmclient.ManageWhiteListProposalHandler,
   151  			evmclient.ManageContractDeploymentWhitelistProposalHandler,
   152  			evmclient.ManageContractBlockedListProposalHandler,
   153  			evmclient.ManageContractMethodGuFactorProposalHandler,
   154  			evmclient.ManageContractMethodBlockedListProposalHandler,
   155  			evmclient.ManageSysContractAddressProposalHandler,
   156  			govclient.ManageTreasuresProposalHandler,
   157  			govclient.ModifyNextBlockUpdateProposalHandler,
   158  			erc20client.TokenMappingProposalHandler,
   159  			erc20client.ProxyContractRedirectHandler,
   160  			erc20client.ContractTemplateProposalHandler,
   161  			client.UpdateClientProposalHandler,
   162  			fsclient.FeeSplitSharesProposalHandler,
   163  			wasmclient.MigrateContractProposalHandler,
   164  			wasmclient.UpdateContractAdminProposalHandler,
   165  			wasmclient.ClearContractAdminProposalHandler,
   166  			wasmclient.PinCodesProposalHandler,
   167  			wasmclient.UnpinCodesProposalHandler,
   168  			wasmclient.UpdateDeploymentWhitelistProposalHandler,
   169  			wasmclient.UpdateWASMContractMethodBlockedListProposalHandler,
   170  		),
   171  		params.AppModuleBasic{},
   172  		crisis.AppModuleBasic{},
   173  		slashing.AppModuleBasic{},
   174  		evidence.AppModuleBasic{},
   175  		upgrade.AppModuleBasic{},
   176  		evm.AppModuleBasic{},
   177  		token.AppModuleBasic{},
   178  		dex.AppModuleBasic{},
   179  		order.AppModuleBasic{},
   180  		ammswap.AppModuleBasic{},
   181  		farm.AppModuleBasic{},
   182  		infura.AppModuleBasic{},
   183  		capabilityModule.AppModuleBasic{},
   184  		ibc.AppModuleBasic{},
   185  		ibctransfer.AppModuleBasic{},
   186  		erc20.AppModuleBasic{},
   187  		wasm.AppModuleBasic{},
   188  		feesplit.AppModuleBasic{},
   189  		ica.AppModuleBasic{},
   190  		ibcfee.AppModuleBasic{},
   191  		icamauth.AppModuleBasic{},
   192  	)
   193  
   194  	// module account permissions
   195  	maccPerms = map[string][]string{
   196  		auth.FeeCollectorName:       nil,
   197  		distr.ModuleName:            nil,
   198  		mint.ModuleName:             {supply.Minter},
   199  		staking.BondedPoolName:      {supply.Burner, supply.Staking},
   200  		staking.NotBondedPoolName:   {supply.Burner, supply.Staking},
   201  		gov.ModuleName:              nil,
   202  		token.ModuleName:            {supply.Minter, supply.Burner},
   203  		dex.ModuleName:              nil,
   204  		order.ModuleName:            nil,
   205  		ammswap.ModuleName:          {supply.Minter, supply.Burner},
   206  		farm.ModuleName:             nil,
   207  		farm.YieldFarmingAccount:    nil,
   208  		farm.MintFarmingAccount:     {supply.Burner},
   209  		ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner},
   210  		erc20.ModuleName:            {authtypes.Minter, authtypes.Burner},
   211  		wasm.ModuleName:             nil,
   212  		feesplit.ModuleName:         nil,
   213  		ibcfeetypes.ModuleName:      nil,
   214  		icatypes.ModuleName:         nil,
   215  	}
   216  
   217  	onceLog sync.Once
   218  )
   219  
   220  var _ simapp.App = (*FBChainApp)(nil)
   221  
   222  // FBChainApp implements an extended ABCI application. It is an application
   223  // that may process transactions through Ethereum's EVM running atop of
   224  // Tendermint consensus.
   225  type FBChainApp struct {
   226  	*bam.BaseApp
   227  
   228  	invCheckPeriod uint
   229  
   230  	// keys to access the substores
   231  	keys  map[string]*sdk.KVStoreKey
   232  	tkeys map[string]*sdk.TransientStoreKey
   233  
   234  	// subspaces
   235  	subspaces map[string]params.Subspace
   236  
   237  	// keepers
   238  	AccountKeeper        auth.AccountKeeper
   239  	BankKeeper           bank.Keeper
   240  	SupplyKeeper         supply.Keeper
   241  	StakingKeeper        staking.Keeper
   242  	SlashingKeeper       slashing.Keeper
   243  	MintKeeper           mint.Keeper
   244  	DistrKeeper          distr.Keeper
   245  	GovKeeper            gov.Keeper
   246  	CrisisKeeper         crisis.Keeper
   247  	UpgradeKeeper        upgrade.Keeper
   248  	ParamsKeeper         params.Keeper
   249  	EvidenceKeeper       evidence.Keeper
   250  	EvmKeeper            *evm.Keeper
   251  	TokenKeeper          token.Keeper
   252  	DexKeeper            dex.Keeper
   253  	OrderKeeper          order.Keeper
   254  	SwapKeeper           ammswap.Keeper
   255  	FarmKeeper           farm.Keeper
   256  	WasmKeeper           wasm.Keeper
   257  	WasmPermissionKeeper wasm.ContractOpsKeeper
   258  	InfuraKeeper         infura.Keeper
   259  	FeeSplitKeeper       feesplit.Keeper
   260  
   261  	// the module manager
   262  	mm *module.Manager
   263  
   264  	// simulation manager
   265  	sm *module.SimulationManager
   266  
   267  	configurator module.Configurator
   268  	// ibc
   269  	ScopedIBCKeeper      capabilitykeeper.ScopedKeeper
   270  	ScopedTransferKeeper capabilitykeeper.ScopedKeeper
   271  	ScopedIBCMockKeeper  capabilitykeeper.ScopedKeeper
   272  	TransferKeeper       ibctransferkeeper.Keeper
   273  	CapabilityKeeper     *capabilitykeeper.Keeper
   274  	IBCKeeper            *ibc.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly
   275  	IBCFeeKeeper         ibcfeekeeper.Keeper
   276  	marshal              *codec.CodecProxy
   277  	heightTasks          map[int64]*upgradetypes.HeightTasks
   278  	Erc20Keeper          erc20.Keeper
   279  	ICAMauthKeeper       icamauthkeeper.Keeper
   280  	ICAControllerKeeper  icacontrollerkeeper.Keeper
   281  	ICAHostKeeper        icahostkeeper.Keeper
   282  	VMBridgeKeeper       *vmbridge.Keeper
   283  
   284  	WasmHandler wasmkeeper.HandlerOption
   285  }
   286  
   287  // NewFBChainApp returns a reference to a new initialized FBChain application.
   288  func NewFBChainApp(
   289  	logger log.Logger,
   290  	db dbm.DB,
   291  	traceStore io.Writer,
   292  	loadLatest bool,
   293  	skipUpgradeHeights map[int64]bool,
   294  	invCheckPeriod uint,
   295  	baseAppOptions ...func(*bam.BaseApp),
   296  ) *FBChainApp {
   297  	logger.Info("Starting "+system.ChainName,
   298  		"GenesisHeight", tmtypes.GetStartBlockHeight(),
   299  		"MercuryHeight", tmtypes.GetMercuryHeight(),
   300  		"VenusHeight", tmtypes.GetVenusHeight(),
   301  		"Venus1Height", tmtypes.GetVenus1Height(),
   302  		"Venus2Height", tmtypes.GetVenus2Height(),
   303  		"Venus3Height", tmtypes.GetVenus3Height(),
   304  		"Veneus4Height", tmtypes.GetVenus4Height(),
   305  		"Veneus5Height", tmtypes.GetVenus5Height(),
   306  		"EarthHeight", tmtypes.GetEarthHeight(),
   307  		"MarsHeight", tmtypes.GetMarsHeight(),
   308  		"JupiterHeight", tmtypes.GetJupiterHeight(),
   309  		"CometHeight", tmtypes.GetCometHeight(),
   310  	)
   311  	onceLog.Do(func() {
   312  		iavl.SetLogger(logger.With("module", "iavl"))
   313  		logStartingFlags(logger)
   314  	})
   315  
   316  	codecProxy, interfaceReg := fbexchaincodec.MakeCodecSuit(ModuleBasics)
   317  	vmbridge.RegisterInterface(interfaceReg)
   318  	// NOTE we use custom fbchaintransaction decoder that supports the sdk.Tx interface instead of sdk.StdTx
   319  	bApp := bam.NewBaseApp(appName, logger, db, evm.TxDecoder(codecProxy), baseAppOptions...)
   320  
   321  	bApp.SetCommitMultiStoreTracer(traceStore)
   322  	bApp.SetAppVersion(version.Version)
   323  	bApp.SetStartLogHandler(trace.StartTxLog)
   324  	bApp.SetEndLogHandler(trace.StopTxLog)
   325  
   326  	bApp.SetInterfaceRegistry(interfaceReg)
   327  
   328  	keys := sdk.NewKVStoreKeys(
   329  		bam.MainStoreKey, auth.StoreKey, staking.StoreKey,
   330  		supply.StoreKey, mint.StoreKey, distr.StoreKey, slashing.StoreKey,
   331  		gov.StoreKey, params.StoreKey, upgrade.StoreKey, evidence.StoreKey,
   332  		evm.StoreKey, token.StoreKey, token.KeyLock, dex.StoreKey, dex.TokenPairStoreKey,
   333  		order.OrderStoreKey, ammswap.StoreKey, farm.StoreKey, ibctransfertypes.StoreKey, capabilitytypes.StoreKey,
   334  		ibchost.StoreKey,
   335  		erc20.StoreKey,
   336  		mpt.StoreKey,
   337  		wasm.StoreKey,
   338  		feesplit.StoreKey,
   339  		icacontrollertypes.StoreKey, icahosttypes.StoreKey, ibcfeetypes.StoreKey,
   340  		icamauthtypes.StoreKey,
   341  	)
   342  
   343  	tkeys := sdk.NewTransientStoreKeys(params.TStoreKey)
   344  	memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
   345  
   346  	app := &FBChainApp{
   347  		BaseApp:        bApp,
   348  		invCheckPeriod: invCheckPeriod,
   349  		keys:           keys,
   350  		tkeys:          tkeys,
   351  		subspaces:      make(map[string]params.Subspace),
   352  		heightTasks:    make(map[int64]*upgradetypes.HeightTasks),
   353  	}
   354  	bApp.SetInterceptors(makeInterceptors())
   355  
   356  	// init params keeper and subspaces
   357  	app.ParamsKeeper = params.NewKeeper(codecProxy.GetCdc(), keys[params.StoreKey], tkeys[params.TStoreKey], logger)
   358  	app.subspaces[auth.ModuleName] = app.ParamsKeeper.Subspace(auth.DefaultParamspace)
   359  	app.subspaces[bank.ModuleName] = app.ParamsKeeper.Subspace(bank.DefaultParamspace)
   360  	app.subspaces[staking.ModuleName] = app.ParamsKeeper.Subspace(staking.DefaultParamspace)
   361  	app.subspaces[mint.ModuleName] = app.ParamsKeeper.Subspace(mint.DefaultParamspace)
   362  	app.subspaces[distr.ModuleName] = app.ParamsKeeper.Subspace(distr.DefaultParamspace)
   363  	app.subspaces[slashing.ModuleName] = app.ParamsKeeper.Subspace(slashing.DefaultParamspace)
   364  	app.subspaces[gov.ModuleName] = app.ParamsKeeper.Subspace(gov.DefaultParamspace)
   365  	app.subspaces[crisis.ModuleName] = app.ParamsKeeper.Subspace(crisis.DefaultParamspace)
   366  	app.subspaces[evidence.ModuleName] = app.ParamsKeeper.Subspace(evidence.DefaultParamspace)
   367  	app.subspaces[evm.ModuleName] = app.ParamsKeeper.Subspace(evm.DefaultParamspace)
   368  	app.subspaces[token.ModuleName] = app.ParamsKeeper.Subspace(token.DefaultParamspace)
   369  	app.subspaces[dex.ModuleName] = app.ParamsKeeper.Subspace(dex.DefaultParamspace)
   370  	app.subspaces[order.ModuleName] = app.ParamsKeeper.Subspace(order.DefaultParamspace)
   371  	app.subspaces[ammswap.ModuleName] = app.ParamsKeeper.Subspace(ammswap.DefaultParamspace)
   372  	app.subspaces[farm.ModuleName] = app.ParamsKeeper.Subspace(farm.DefaultParamspace)
   373  	app.subspaces[ibchost.ModuleName] = app.ParamsKeeper.Subspace(ibchost.ModuleName)
   374  	app.subspaces[ibctransfertypes.ModuleName] = app.ParamsKeeper.Subspace(ibctransfertypes.ModuleName)
   375  	app.subspaces[erc20.ModuleName] = app.ParamsKeeper.Subspace(erc20.DefaultParamspace)
   376  	app.subspaces[wasm.ModuleName] = app.ParamsKeeper.Subspace(wasm.ModuleName)
   377  	app.subspaces[feesplit.ModuleName] = app.ParamsKeeper.Subspace(feesplit.ModuleName)
   378  	app.subspaces[icacontrollertypes.SubModuleName] = app.ParamsKeeper.Subspace(icacontrollertypes.SubModuleName)
   379  	app.subspaces[icahosttypes.SubModuleName] = app.ParamsKeeper.Subspace(icahosttypes.SubModuleName)
   380  
   381  	//proxy := codec.NewMarshalProxy(cc, cdc)
   382  	app.marshal = codecProxy
   383  	// use custom FBchain account for contracts
   384  	app.AccountKeeper = auth.NewAccountKeeper(
   385  		codecProxy.GetCdc(), keys[auth.StoreKey], keys[mpt.StoreKey], app.subspaces[auth.ModuleName], fbchain.ProtoAccount,
   386  	)
   387  
   388  	bankKeeper := bank.NewBaseKeeperWithMarshal(
   389  		&app.AccountKeeper, codecProxy, app.subspaces[bank.ModuleName], app.ModuleAccountAddrs(),
   390  	)
   391  	app.BankKeeper = &bankKeeper
   392  	app.ParamsKeeper.SetBankKeeper(app.BankKeeper)
   393  	app.SupplyKeeper = supply.NewKeeper(
   394  		codecProxy.GetCdc(), keys[supply.StoreKey], &app.AccountKeeper, bank.NewBankKeeperAdapter(app.BankKeeper), maccPerms,
   395  	)
   396  
   397  	stakingKeeper := staking.NewKeeper(
   398  		codecProxy, keys[staking.StoreKey], app.SupplyKeeper, app.subspaces[staking.ModuleName],
   399  	)
   400  	app.ParamsKeeper.SetStakingKeeper(stakingKeeper)
   401  	app.MintKeeper = mint.NewKeeper(
   402  		codecProxy.GetCdc(), keys[mint.StoreKey], app.subspaces[mint.ModuleName], &stakingKeeper,
   403  		app.SupplyKeeper, auth.FeeCollectorName, farm.MintFarmingAccount,
   404  	)
   405  	app.DistrKeeper = distr.NewKeeper(
   406  		codecProxy.GetCdc(), keys[distr.StoreKey], app.subspaces[distr.ModuleName], &stakingKeeper,
   407  		app.SupplyKeeper, auth.FeeCollectorName, app.ModuleAccountAddrs(),
   408  	)
   409  	app.SlashingKeeper = slashing.NewKeeper(
   410  		codecProxy.GetCdc(), keys[slashing.StoreKey], &stakingKeeper, app.subspaces[slashing.ModuleName],
   411  	)
   412  	app.CrisisKeeper = crisis.NewKeeper(
   413  		app.subspaces[crisis.ModuleName], invCheckPeriod, app.SupplyKeeper, auth.FeeCollectorName,
   414  	)
   415  	app.UpgradeKeeper = upgrade.NewKeeper(skipUpgradeHeights, keys[upgrade.StoreKey], app.marshal.GetCdc())
   416  	app.ParamsKeeper.RegisterSignal(evmtypes.SetEvmParamsNeedUpdate)
   417  	app.EvmKeeper = evm.NewKeeper(
   418  		app.marshal.GetCdc(), keys[evm.StoreKey], app.subspaces[evm.ModuleName], &app.AccountKeeper, app.SupplyKeeper, app.BankKeeper, &stakingKeeper, logger)
   419  	(&bankKeeper).SetInnerTxKeeper(app.EvmKeeper)
   420  
   421  	app.TokenKeeper = token.NewKeeper(app.BankKeeper, app.subspaces[token.ModuleName], auth.FeeCollectorName, app.SupplyKeeper,
   422  		keys[token.StoreKey], keys[token.KeyLock], app.marshal.GetCdc(), false, &app.AccountKeeper)
   423  
   424  	app.DexKeeper = dex.NewKeeper(auth.FeeCollectorName, app.SupplyKeeper, app.subspaces[dex.ModuleName], app.TokenKeeper, &stakingKeeper,
   425  		app.BankKeeper, app.keys[dex.StoreKey], app.keys[dex.TokenPairStoreKey], app.marshal.GetCdc())
   426  
   427  	app.OrderKeeper = order.NewKeeper(
   428  		app.TokenKeeper, app.SupplyKeeper, app.DexKeeper, app.subspaces[order.ModuleName], auth.FeeCollectorName,
   429  		app.keys[order.OrderStoreKey], app.marshal.GetCdc(), false, orderMetrics)
   430  
   431  	app.SwapKeeper = ammswap.NewKeeper(app.SupplyKeeper, app.TokenKeeper, app.marshal.GetCdc(), app.keys[ammswap.StoreKey], app.subspaces[ammswap.ModuleName])
   432  
   433  	app.FarmKeeper = farm.NewKeeper(auth.FeeCollectorName, app.SupplyKeeper, app.TokenKeeper, app.SwapKeeper, *app.EvmKeeper, app.subspaces[farm.StoreKey],
   434  		app.keys[farm.StoreKey], app.marshal.GetCdc())
   435  	app.InfuraKeeper = infura.NewKeeper(app.EvmKeeper, logger, streamMetrics)
   436  	// create evidence keeper with router
   437  	evidenceKeeper := evidence.NewKeeper(
   438  		codecProxy.GetCdc(), keys[evidence.StoreKey], app.subspaces[evidence.ModuleName], &app.StakingKeeper, app.SlashingKeeper,
   439  	)
   440  	evidenceRouter := evidence.NewRouter()
   441  	evidenceKeeper.SetRouter(evidenceRouter)
   442  	app.EvidenceKeeper = *evidenceKeeper
   443  
   444  	// add capability keeper and ScopeToModule for ibc module
   445  	app.CapabilityKeeper = capabilitykeeper.NewKeeper(codecProxy, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey])
   446  	scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibchost.ModuleName)
   447  	scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName)
   448  	// NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do
   449  	// note replicate if you do not need to test core IBC or light clients.
   450  	scopedIBCMockKeeper := app.CapabilityKeeper.ScopeToModule("mock")
   451  	scopedICAControllerKeeper := app.CapabilityKeeper.ScopeToModule(icacontrollertypes.SubModuleName)
   452  	scopedICAHostKeeper := app.CapabilityKeeper.ScopeToModule(icahosttypes.SubModuleName)
   453  	scopedICAMauthKeeper := app.CapabilityKeeper.ScopeToModule(icamauthtypes.ModuleName)
   454  
   455  	v2keeper := ibc.NewKeeper(
   456  		codecProxy, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), &stakingKeeper, app.UpgradeKeeper, &scopedIBCKeeper, interfaceReg,
   457  	)
   458  	v4Keeper := ibc.NewV4Keeper(v2keeper)
   459  	facadedKeeper := ibc.NewFacadedKeeper(v2keeper)
   460  	facadedKeeper.RegisterKeeper(ibccommon.DefaultFactory(tmtypes.HigherThanVenus4, ibc.IBCV4, v4Keeper))
   461  	app.IBCKeeper = facadedKeeper
   462  	supplyKeeperAdapter := supply.NewSupplyKeeperAdapter(app.SupplyKeeper)
   463  	// Create Transfer Keepers
   464  	app.TransferKeeper = ibctransferkeeper.NewKeeper(
   465  		codecProxy, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName),
   466  		v2keeper.ChannelKeeper, &v2keeper.PortKeeper,
   467  		app.SupplyKeeper, supplyKeeperAdapter, scopedTransferKeeper, interfaceReg,
   468  	)
   469  	ibctransfertypes.SetMarshal(codecProxy)
   470  	app.IBCFeeKeeper = ibcfeekeeper.NewKeeper(codecProxy, keys[ibcfeetypes.StoreKey], app.GetSubspace(ibcfeetypes.ModuleName),
   471  		v2keeper.ChannelKeeper, // may be replaced with IBC middleware
   472  		v2keeper.ChannelKeeper,
   473  		&v2keeper.PortKeeper, app.SupplyKeeper, supplyKeeperAdapter,
   474  	)
   475  
   476  	// ICA Controller keeper
   477  	app.ICAControllerKeeper = icacontrollerkeeper.NewKeeper(
   478  		codecProxy, keys[icacontrollertypes.StoreKey], app.GetSubspace(icacontrollertypes.SubModuleName),
   479  		app.IBCFeeKeeper, // use ics29 fee as ics4Wrapper in middleware stack
   480  		app.IBCKeeper.V2Keeper.ChannelKeeper, &app.IBCKeeper.V2Keeper.PortKeeper,
   481  		scopedICAControllerKeeper, app.MsgServiceRouter(),
   482  	)
   483  
   484  	// ICA Host keeper
   485  	app.ICAHostKeeper = icahostkeeper.NewKeeper(
   486  		codecProxy, keys[icahosttypes.StoreKey], app.GetSubspace(icahosttypes.SubModuleName),
   487  		app.IBCKeeper.V2Keeper.ChannelKeeper, &app.IBCKeeper.V2Keeper.PortKeeper,
   488  		supplyKeeperAdapter, scopedICAHostKeeper, app.MsgServiceRouter(),
   489  	)
   490  
   491  	app.ICAMauthKeeper = icamauthkeeper.NewKeeper(
   492  		codecProxy,
   493  		keys[icamauthtypes.StoreKey],
   494  		app.ICAControllerKeeper,
   495  		scopedICAMauthKeeper,
   496  	)
   497  
   498  	app.Erc20Keeper = erc20.NewKeeper(app.marshal.GetCdc(), app.keys[erc20.ModuleName], app.subspaces[erc20.ModuleName],
   499  		app.AccountKeeper, app.SupplyKeeper, app.BankKeeper, app.EvmKeeper, app.TransferKeeper)
   500  
   501  	app.FeeSplitKeeper = feesplit.NewKeeper(
   502  		app.keys[feesplit.StoreKey], app.marshal.GetCdc(), app.subspaces[feesplit.ModuleName],
   503  		app.EvmKeeper, app.SupplyKeeper, app.AccountKeeper)
   504  	app.ParamsKeeper.RegisterSignal(feesplit.SetParamsNeedUpdate)
   505  
   506  	//wasm keeper
   507  	wasmDir := wasm.WasmDir()
   508  	wasmConfig := wasm.WasmConfig()
   509  
   510  	// The last arguments can contain custom message handlers, and custom query handlers,
   511  	// if we want to allow any custom callbacks
   512  	supportedFeatures := wasm.SupportedFeatures
   513  	app.WasmKeeper = wasm.NewKeeper(
   514  		app.marshal,
   515  		keys[wasm.StoreKey],
   516  		app.subspaces[wasm.ModuleName],
   517  		&app.AccountKeeper,
   518  		bank.NewBankKeeperAdapter(app.BankKeeper),
   519  		v2keeper.ChannelKeeper,
   520  		&v2keeper.PortKeeper,
   521  		nil,
   522  		app.TransferKeeper,
   523  		app.MsgServiceRouter(),
   524  		app.GRPCQueryRouter(),
   525  		wasmDir,
   526  		wasmConfig,
   527  		supportedFeatures,
   528  		vmbridge.GetWasmOpts(app.marshal.GetProtocMarshal()),
   529  	)
   530  	(&app.WasmKeeper).SetInnerTxKeeper(app.EvmKeeper)
   531  
   532  	app.ParamsKeeper.RegisterSignal(wasm.SetNeedParamsUpdate)
   533  
   534  	// register the proposal types
   535  	// 3.register the proposal types
   536  	govRouter := gov.NewRouter()
   537  	govRouter.AddRoute(gov.RouterKey, gov.ProposalHandler).
   538  		AddRoute(params.RouterKey, params.NewParamChangeProposalHandler(&app.ParamsKeeper)).
   539  		AddRoute(distr.RouterKey, distr.NewDistributionProposalHandler(app.DistrKeeper)).
   540  		AddRoute(dex.RouterKey, dex.NewProposalHandler(&app.DexKeeper)).
   541  		AddRoute(farm.RouterKey, farm.NewManageWhiteListProposalHandler(&app.FarmKeeper)).
   542  		AddRoute(evm.RouterKey, evm.NewManageContractDeploymentWhitelistProposalHandler(app.EvmKeeper)).
   543  		AddRoute(mint.RouterKey, mint.NewManageTreasuresProposalHandler(&app.MintKeeper)).
   544  		AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientUpdateProposalHandler(app.IBCKeeper.V2Keeper.ClientKeeper)).
   545  		AddRoute(erc20.RouterKey, erc20.NewProposalHandler(&app.Erc20Keeper)).
   546  		AddRoute(feesplit.RouterKey, feesplit.NewProposalHandler(&app.FeeSplitKeeper)).
   547  		AddRoute(wasm.RouterKey, wasm.NewWasmProposalHandler(&app.WasmKeeper, wasm.NecessaryProposals)).
   548  		AddRoute(params.UpgradeRouterKey, params.NewUpgradeProposalHandler(&app.ParamsKeeper))
   549  
   550  	govProposalHandlerRouter := keeper.NewProposalHandlerRouter()
   551  	govProposalHandlerRouter.AddRoute(params.RouterKey, &app.ParamsKeeper).
   552  		AddRoute(dex.RouterKey, &app.DexKeeper).
   553  		AddRoute(farm.RouterKey, &app.FarmKeeper).
   554  		AddRoute(evm.RouterKey, app.EvmKeeper).
   555  		AddRoute(mint.RouterKey, &app.MintKeeper).
   556  		AddRoute(erc20.RouterKey, &app.Erc20Keeper).
   557  		AddRoute(feesplit.RouterKey, &app.FeeSplitKeeper).
   558  		AddRoute(distr.RouterKey, &app.DistrKeeper).
   559  		AddRoute(params.UpgradeRouterKey, &app.ParamsKeeper)
   560  
   561  	app.GovKeeper = gov.NewKeeper(
   562  		app.marshal.GetCdc(), app.keys[gov.StoreKey], app.ParamsKeeper, app.subspaces[gov.DefaultParamspace],
   563  		app.SupplyKeeper, &stakingKeeper, gov.DefaultParamspace, govRouter,
   564  		app.BankKeeper, govProposalHandlerRouter, auth.FeeCollectorName,
   565  	)
   566  	app.ParamsKeeper.SetGovKeeper(app.GovKeeper)
   567  	app.DexKeeper.SetGovKeeper(app.GovKeeper)
   568  	app.FarmKeeper.SetGovKeeper(app.GovKeeper)
   569  	app.EvmKeeper.SetGovKeeper(app.GovKeeper)
   570  	app.MintKeeper.SetGovKeeper(app.GovKeeper)
   571  	app.Erc20Keeper.SetGovKeeper(app.GovKeeper)
   572  	app.FeeSplitKeeper.SetGovKeeper(app.GovKeeper)
   573  	app.DistrKeeper.SetGovKeeper(app.GovKeeper)
   574  
   575  	// Set IBC hooks
   576  	app.TransferKeeper = *app.TransferKeeper.SetHooks(erc20.NewIBCTransferHooks(app.Erc20Keeper))
   577  	transferModule := ibctransfer.NewAppModule(app.TransferKeeper, codecProxy)
   578  
   579  	left := common.NewDisaleProxyMiddleware()
   580  	middle := ibctransfer.NewIBCModule(app.TransferKeeper, transferModule)
   581  	right := ibcfee.NewIBCMiddleware(middle, app.IBCFeeKeeper)
   582  	transferStack := ibcporttypes.NewFacadedMiddleware(left,
   583  		ibccommon.DefaultFactory(tmtypes.HigherThanVenus4, ibc.IBCV4, right),
   584  		ibccommon.DefaultFactory(tmtypes.HigherThanVenus1, ibc.IBCV2, middle))
   585  
   586  	// Create static IBC router, add transfer route, then set and seal it
   587  	ibcRouter := ibcporttypes.NewRouter()
   588  
   589  	var icaControllerStack ibcporttypes.IBCModule
   590  	icaMauthIBCModule := icamauth.NewIBCModule(app.ICAMauthKeeper)
   591  	icaControllerStack = icaMauthIBCModule
   592  	icaControllerStack = icacontroller.NewIBCMiddleware(icaControllerStack, app.ICAControllerKeeper)
   593  	icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper)
   594  	var icaHostStack ibcporttypes.IBCModule
   595  	icaHostStack = icahost.NewIBCModule(app.ICAHostKeeper)
   596  	icaHostStack = ibcfee.NewIBCMiddleware(icaHostStack, app.IBCFeeKeeper)
   597  	ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferStack)
   598  	ibcRouter.AddRoute(icacontrollertypes.SubModuleName, icaControllerStack)
   599  	ibcRouter.AddRoute(icahosttypes.SubModuleName, icaHostStack)
   600  	ibcRouter.AddRoute(icamauthtypes.ModuleName, icaControllerStack)
   601  
   602  	//ibcRouter.AddRoute(ibcmock.ModuleName, mockModule)
   603  	v2keeper.SetRouter(ibcRouter)
   604  
   605  	// register the staking hooks
   606  	// NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks
   607  	app.StakingKeeper = *stakingKeeper.SetHooks(
   608  		staking.NewMultiStakingHooks(app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks()),
   609  	)
   610  
   611  	wasmModule := wasm.NewAppModule(*app.marshal, &app.WasmKeeper)
   612  	app.WasmPermissionKeeper = wasmModule.GetPermissionKeeper()
   613  	app.VMBridgeKeeper = vmbridge.NewKeeper(app.marshal, app.Logger(), app.EvmKeeper, app.WasmPermissionKeeper, app.AccountKeeper)
   614  
   615  	// Set EVM hooks
   616  	app.EvmKeeper.SetHooks(
   617  		evm.NewMultiEvmHooks(
   618  			evm.NewLogProcessEvmHook(
   619  				erc20.NewSendToIbcEventHandler(app.Erc20Keeper),
   620  				erc20.NewSendNative20ToIbcEventHandler(app.Erc20Keeper),
   621  				vmbridge.NewSendToWasmEventHandler(*app.VMBridgeKeeper),
   622  			),
   623  			app.FeeSplitKeeper.Hooks(),
   624  		),
   625  	)
   626  
   627  	// NOTE: Any module instantiated in the module manager that is later modified
   628  	// must be passed by reference here.
   629  	app.mm = module.NewManager(
   630  		genutil.NewAppModule(app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx),
   631  		auth.NewAppModule(app.AccountKeeper),
   632  		bank.NewAppModule(app.BankKeeper, app.AccountKeeper, app.SupplyKeeper),
   633  		crisis.NewAppModule(&app.CrisisKeeper),
   634  		supply.NewAppModule(app.SupplyKeeper, app.AccountKeeper),
   635  		gov.NewAppModule(app.GovKeeper, app.SupplyKeeper),
   636  		mint.NewAppModule(app.MintKeeper),
   637  		slashing.NewAppModule(app.SlashingKeeper, app.AccountKeeper, app.StakingKeeper),
   638  		distr.NewAppModule(app.DistrKeeper, app.SupplyKeeper),
   639  		staking.NewAppModule(app.StakingKeeper, app.AccountKeeper, app.SupplyKeeper),
   640  		evidence.NewAppModule(app.EvidenceKeeper),
   641  		evm.NewAppModule(app.EvmKeeper, &app.AccountKeeper),
   642  		token.NewAppModule(commonversion.ProtocolVersionV0, app.TokenKeeper, app.SupplyKeeper),
   643  		dex.NewAppModule(commonversion.ProtocolVersionV0, app.DexKeeper, app.SupplyKeeper),
   644  		order.NewAppModule(commonversion.ProtocolVersionV0, app.OrderKeeper, app.SupplyKeeper),
   645  		ammswap.NewAppModule(app.SwapKeeper),
   646  		farm.NewAppModule(app.FarmKeeper),
   647  		infura.NewAppModule(app.InfuraKeeper),
   648  		params.NewAppModule(app.ParamsKeeper),
   649  		// ibc
   650  		ibc.NewAppModule(app.IBCKeeper),
   651  		capabilityModule.NewAppModule(codecProxy, *app.CapabilityKeeper),
   652  		transferModule,
   653  		erc20.NewAppModule(app.Erc20Keeper),
   654  		wasmModule,
   655  		feesplit.NewAppModule(app.FeeSplitKeeper),
   656  		ibcfee.NewAppModule(app.IBCFeeKeeper),
   657  		ica.NewAppModule(codecProxy, &app.ICAControllerKeeper, &app.ICAHostKeeper),
   658  		icamauth.NewAppModule(codecProxy, app.ICAMauthKeeper),
   659  	)
   660  
   661  	// During begin block slashing happens after distr.BeginBlocker so that
   662  	// there is nothing left over in the validator fee pool, so as to keep the
   663  	// CanWithdrawInvariant invariant.
   664  	app.mm.SetOrderBeginBlockers(
   665  		infura.ModuleName,
   666  		bank.ModuleName, // we must sure bank.beginblocker must be first beginblocker for innerTx. infura can not gengerate tx, so infura can be first in the list.
   667  		capabilitytypes.ModuleName,
   668  		order.ModuleName,
   669  		token.ModuleName,
   670  		dex.ModuleName,
   671  		mint.ModuleName,
   672  		distr.ModuleName,
   673  		slashing.ModuleName,
   674  		staking.ModuleName,
   675  		farm.ModuleName,
   676  		evidence.ModuleName,
   677  		evm.ModuleName,
   678  		ibchost.ModuleName,
   679  		ibctransfertypes.ModuleName,
   680  		wasm.ModuleName,
   681  	)
   682  	app.mm.SetOrderEndBlockers(
   683  		crisis.ModuleName,
   684  		gov.ModuleName,
   685  		dex.ModuleName,
   686  		order.ModuleName,
   687  		staking.ModuleName,
   688  		wasm.ModuleName,
   689  		evm.ModuleName, // we must sure evm.endblocker must be last endblocker for innerTx.infura can not gengerate tx, so infura can be last in the list.
   690  		infura.ModuleName,
   691  	)
   692  
   693  	// NOTE: The genutils module must occur after staking so that pools are
   694  	// properly initialized with tokens from genesis accounts.
   695  	app.mm.SetOrderInitGenesis(
   696  		capabilitytypes.ModuleName,
   697  		auth.ModuleName, distr.ModuleName, staking.ModuleName, bank.ModuleName,
   698  		slashing.ModuleName, gov.ModuleName, mint.ModuleName, supply.ModuleName,
   699  		token.ModuleName, dex.ModuleName, order.ModuleName, ammswap.ModuleName, farm.ModuleName,
   700  		ibctransfertypes.ModuleName,
   701  		ibchost.ModuleName,
   702  		evm.ModuleName, crisis.ModuleName, genutil.ModuleName, params.ModuleName, evidence.ModuleName,
   703  		erc20.ModuleName,
   704  		wasm.ModuleName,
   705  		feesplit.ModuleName,
   706  		ibchost.ModuleName,
   707  		icatypes.ModuleName, ibcfeetypes.ModuleName,
   708  	)
   709  
   710  	app.mm.RegisterInvariants(&app.CrisisKeeper)
   711  	app.mm.RegisterRoutes(app.Router(), app.QueryRouter())
   712  	app.configurator = module.NewConfigurator(app.Codec(), app.MsgServiceRouter(), app.GRPCQueryRouter())
   713  	app.mm.RegisterServices(app.configurator)
   714  	app.setupUpgradeModules()
   715  
   716  	vmbridge.RegisterServices(app.configurator, *app.VMBridgeKeeper)
   717  
   718  	// create the simulation manager and define the order of the modules for deterministic simulations
   719  	//
   720  	// NOTE: this is not required apps that don't use the simulator for fuzz testing
   721  	// transactions
   722  	app.sm = module.NewSimulationManager(
   723  		auth.NewAppModule(app.AccountKeeper),
   724  		bank.NewAppModule(app.BankKeeper, app.AccountKeeper, app.SupplyKeeper),
   725  		supply.NewAppModule(app.SupplyKeeper, app.AccountKeeper),
   726  		gov.NewAppModule(app.GovKeeper, app.SupplyKeeper),
   727  		mint.NewAppModule(app.MintKeeper),
   728  		staking.NewAppModule(app.StakingKeeper, app.AccountKeeper, app.SupplyKeeper),
   729  		distr.NewAppModule(app.DistrKeeper, app.SupplyKeeper),
   730  		slashing.NewAppModule(app.SlashingKeeper, app.AccountKeeper, app.StakingKeeper),
   731  		params.NewAppModule(app.ParamsKeeper), // NOTE: only used for simulation to generate randomized param change proposals
   732  		ibc.NewAppModule(app.IBCKeeper),
   733  		wasm.NewAppModule(*app.marshal, &app.WasmKeeper),
   734  	)
   735  
   736  	app.sm.RegisterStoreDecoders()
   737  
   738  	// initialize stores
   739  	app.MountKVStores(keys)
   740  	app.MountTransientStores(tkeys)
   741  	app.MountMemoryStores(memKeys)
   742  
   743  	// initialize BaseApp
   744  	app.SetInitChainer(app.InitChainer)
   745  	app.SetBeginBlocker(app.BeginBlocker)
   746  	app.WasmHandler = wasmkeeper.HandlerOption{
   747  		WasmConfig:        &wasmConfig,
   748  		TXCounterStoreKey: keys[wasm.StoreKey],
   749  	}
   750  	app.SetAnteHandler(ante.NewAnteHandler(app.AccountKeeper, app.EvmKeeper, app.SupplyKeeper, validateMsgHook(app.OrderKeeper), app.WasmHandler, app.IBCKeeper, app.StakingKeeper, app.ParamsKeeper))
   751  	app.SetEndBlocker(app.EndBlocker)
   752  	app.SetGasRefundHandler(refund.NewGasRefundHandler(app.AccountKeeper, app.SupplyKeeper, app.EvmKeeper))
   753  	app.SetAccNonceHandler(NewAccNonceHandler(app.AccountKeeper))
   754  	app.AddCustomizeModuleOnStopLogic(NewEvmModuleStopLogic(app.EvmKeeper))
   755  	app.SetMptCommitHandler(NewMptCommitHandler(app.EvmKeeper))
   756  	app.SetUpdateFeeCollectorAccHandler(updateFeeCollectorHandler(app.BankKeeper, app.SupplyKeeper))
   757  	app.SetParallelTxLogHandlers(fixLogForParallelTxHandler(app.EvmKeeper))
   758  	app.SetPreDeliverTxHandler(preDeliverTxHandler(app.AccountKeeper))
   759  	app.SetPartialConcurrentHandlers(getTxFeeAndFromHandler(app.AccountKeeper))
   760  	app.SetGetTxFeeHandler(getTxFeeHandler())
   761  	app.SetEvmSysContractAddressHandler(NewEvmSysContractAddressHandler(app.EvmKeeper))
   762  	app.SetEvmWatcherCollector(app.EvmKeeper.Watcher.Collect)
   763  
   764  	if loadLatest {
   765  		err := app.LoadLatestVersion(app.keys[bam.MainStoreKey])
   766  		if err != nil {
   767  			tmos.Exit(err.Error())
   768  		}
   769  		ctx := app.BaseApp.NewContext(true, abci.Header{})
   770  		// Initialize pinned codes in wasmvm as they are not persisted there
   771  		if err := app.WasmKeeper.InitializePinnedCodes(ctx); err != nil {
   772  			tmos.Exit(fmt.Sprintf("failed initialize pinned codes %s", err))
   773  		}
   774  
   775  		if err := app.ParamsKeeper.ApplyEffectiveUpgrade(ctx); err != nil {
   776  			tmos.Exit(fmt.Sprintf("failed apply effective upgrade height info: %s", err))
   777  		}
   778  	}
   779  
   780  	app.ScopedIBCKeeper = scopedIBCKeeper
   781  	app.ScopedTransferKeeper = scopedTransferKeeper
   782  
   783  	// NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do
   784  	// note replicate if you do not need to test core IBC or light clients.
   785  	app.ScopedIBCMockKeeper = scopedIBCMockKeeper
   786  
   787  	enableAnalyzer := sm.DeliverTxsExecMode(viper.GetInt(sm.FlagDeliverTxsExecMode)) == sm.DeliverTxsExecModeSerial
   788  	trace.EnableAnalyzer(enableAnalyzer)
   789  
   790  	return app
   791  }
   792  
   793  func (app *FBChainApp) SetOption(req abci.RequestSetOption) (res abci.ResponseSetOption) {
   794  	if req.Key == "CheckChainID" {
   795  		if err := fbchain.IsValidateChainIdWithGenesisHeight(req.Value); err != nil {
   796  			app.Logger().Error(err.Error())
   797  			panic(err)
   798  		}
   799  		err := fbchain.SetChainId(req.Value)
   800  		if err != nil {
   801  			app.Logger().Error(err.Error())
   802  			panic(err)
   803  		}
   804  	}
   805  	return app.BaseApp.SetOption(req)
   806  }
   807  
   808  func (app *FBChainApp) LoadStartVersion(height int64) error {
   809  	return app.LoadVersion(height, app.keys[bam.MainStoreKey])
   810  }
   811  
   812  // Name returns the name of the App
   813  func (app *FBChainApp) Name() string { return app.BaseApp.Name() }
   814  
   815  // BeginBlocker updates every begin block
   816  func (app *FBChainApp) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock {
   817  	return app.mm.BeginBlock(ctx, req)
   818  }
   819  
   820  // EndBlocker updates every end block
   821  func (app *FBChainApp) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock {
   822  	return app.mm.EndBlock(ctx, req)
   823  }
   824  
   825  // InitChainer updates at chain initialization
   826  func (app *FBChainApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
   827  
   828  	var genesisState simapp.GenesisState
   829  	app.marshal.GetCdc().MustUnmarshalJSON(req.AppStateBytes, &genesisState)
   830  	return app.mm.InitGenesis(ctx, genesisState)
   831  }
   832  
   833  // LoadHeight loads state at a particular height
   834  func (app *FBChainApp) LoadHeight(height int64) error {
   835  	return app.LoadVersion(height, app.keys[bam.MainStoreKey])
   836  }
   837  
   838  // ModuleAccountAddrs returns all the app's module account addresses.
   839  func (app *FBChainApp) ModuleAccountAddrs() map[string]bool {
   840  	modAccAddrs := make(map[string]bool)
   841  	for acc := range maccPerms {
   842  		modAccAddrs[supply.NewModuleAddress(acc).String()] = true
   843  	}
   844  
   845  	return modAccAddrs
   846  }
   847  
   848  // SimulationManager implements the SimulationApp interface
   849  func (app *FBChainApp) SimulationManager() *module.SimulationManager {
   850  	return app.sm
   851  }
   852  
   853  // GetKey returns the KVStoreKey for the provided store key.
   854  //
   855  // NOTE: This is solely to be used for testing purposes.
   856  func (app *FBChainApp) GetKey(storeKey string) *sdk.KVStoreKey {
   857  	return app.keys[storeKey]
   858  }
   859  
   860  // Codec returns FBChain's codec.
   861  //
   862  // NOTE: This is solely to be used for testing purposes as it may be desirable
   863  // for modules to register their own custom testing types.
   864  func (app *FBChainApp) Codec() *codec.Codec {
   865  	return app.marshal.GetCdc()
   866  }
   867  
   868  func (app *FBChainApp) Marshal() *codec.CodecProxy {
   869  	return app.marshal
   870  }
   871  
   872  // GetSubspace returns a param subspace for a given module name.
   873  //
   874  // NOTE: This is solely to be used for testing purposes.
   875  func (app *FBChainApp) GetSubspace(moduleName string) params.Subspace {
   876  	return app.subspaces[moduleName]
   877  }
   878  
   879  var protoCodec = encoding.GetCodec(proto.Name)
   880  
   881  func makeInterceptors() map[string]bam.Interceptor {
   882  	m := make(map[string]bam.Interceptor)
   883  	m["/cosmos.tx.v1beta1.Service/Simulate"] = bam.NewRedirectInterceptor("app/simulate")
   884  	m["/cosmos.bank.v1beta1.Query/AllBalances"] = bam.NewRedirectInterceptor("custom/bank/grpc_balances")
   885  	m["/cosmos.staking.v1beta1.Query/Params"] = bam.NewRedirectInterceptor("custom/staking/params4ibc")
   886  	return m
   887  }
   888  
   889  // GetMaccPerms returns a copy of the module account permissions
   890  func GetMaccPerms() map[string][]string {
   891  	dupMaccPerms := make(map[string][]string)
   892  	for k, v := range maccPerms {
   893  		dupMaccPerms[k] = v
   894  	}
   895  
   896  	return dupMaccPerms
   897  }
   898  
   899  func validateMsgHook(orderKeeper order.Keeper) ante.ValidateMsgHandler {
   900  	return func(newCtx sdk.Context, msgs []sdk.Msg) error {
   901  
   902  		wrongMsgErr := sdk.ErrUnknownRequest(
   903  			"It is not allowed that a transaction with more than one message contains order or evm message")
   904  		var err error
   905  
   906  		for _, msg := range msgs {
   907  			switch assertedMsg := msg.(type) {
   908  			case order.MsgNewOrders:
   909  				if len(msgs) > 1 {
   910  					return wrongMsgErr
   911  				}
   912  				_, err = order.ValidateMsgNewOrders(newCtx, orderKeeper, assertedMsg)
   913  			case order.MsgCancelOrders:
   914  				if len(msgs) > 1 {
   915  					return wrongMsgErr
   916  				}
   917  				err = order.ValidateMsgCancelOrders(newCtx, orderKeeper, assertedMsg)
   918  			case *evmtypes.MsgEthereumTx:
   919  				if len(msgs) > 1 {
   920  					return wrongMsgErr
   921  				}
   922  			}
   923  
   924  			if err != nil {
   925  				return err
   926  			}
   927  		}
   928  		return nil
   929  	}
   930  }
   931  
   932  func NewAccNonceHandler(ak auth.AccountKeeper) sdk.AccNonceHandler {
   933  	return func(
   934  		ctx sdk.Context, addr sdk.AccAddress,
   935  	) uint64 {
   936  		if acc := ak.GetAccount(ctx, addr); acc != nil {
   937  			return acc.GetSequence()
   938  		}
   939  		return 0
   940  	}
   941  }
   942  
   943  func PreRun(ctx *server.Context, cmd *cobra.Command) error {
   944  	// check start flag conflicts
   945  	err := sanity.CheckStart()
   946  	if err != nil {
   947  		return err
   948  	}
   949  
   950  	// set config by node mode
   951  	err = setNodeConfig(ctx)
   952  	if err != nil {
   953  		return err
   954  	}
   955  
   956  	//download pprof
   957  	appconfig.PprofDownload(ctx)
   958  
   959  	// pruning options
   960  	_, err = server.GetPruningOptionsFromFlags()
   961  	if err != nil {
   962  		return err
   963  	}
   964  	// repair state on start
   965  	if viper.GetBool(FlagEnableRepairState) {
   966  		repairStateOnStart(ctx)
   967  	}
   968  
   969  	// init tx signature cache
   970  	tmtypes.InitSignatureCache()
   971  
   972  	isFastStorage := appstatus.IsFastStorageStrategy()
   973  	iavl.SetEnableFastStorage(isFastStorage)
   974  	viper.Set(iavl.FlagIavlEnableFastStorage, isFastStorage)
   975  
   976  	// set external package flags
   977  	server.SetExternalPackageValue(cmd)
   978  
   979  	ctx.Logger.Info("The database storage strategy", "fast-storage", iavl.GetEnableFastStorage())
   980  	// set the dynamic config
   981  	appconfig.RegisterDynamicConfig(ctx.Logger.With("module", "config"))
   982  
   983  	return nil
   984  }
   985  
   986  func NewEvmModuleStopLogic(ak *evm.Keeper) sdk.CustomizeOnStop {
   987  	return func(ctx sdk.Context) error {
   988  		if tmtypes.HigherThanMars(ctx.BlockHeight()) || mpt.TrieWriteAhead {
   989  			return ak.OnStop(ctx)
   990  		}
   991  		return nil
   992  	}
   993  }
   994  
   995  func NewMptCommitHandler(ak *evm.Keeper) sdk.MptCommitHandler {
   996  	return func(ctx sdk.Context) {
   997  		if tmtypes.HigherThanMars(ctx.BlockHeight()) || mpt.TrieWriteAhead {
   998  			ak.PushData2Database(ctx.BlockHeight(), ctx.Logger())
   999  		}
  1000  	}
  1001  }
  1002  
  1003  func NewEvmSysContractAddressHandler(ak *evm.Keeper) sdk.EvmSysContractAddressHandler {
  1004  	if ak == nil {
  1005  		panic("NewEvmSysContractAddressHandler ak is nil")
  1006  	}
  1007  	return func(
  1008  		ctx sdk.Context, addr sdk.AccAddress,
  1009  	) bool {
  1010  		if addr.Empty() {
  1011  			return false
  1012  		}
  1013  		return ak.IsMatchSysContractAddress(ctx, addr)
  1014  	}
  1015  }