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