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

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