mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 06:48:03 +00:00 
			
		
		
		
	update app package
This commit is contained in:
		
							parent
							
								
									6e4c8a51cd
								
							
						
					
					
						commit
						5acc23e6e5
					
				
							
								
								
									
										160
									
								
								app/app.go
									
									
									
									
									
								
							
							
						
						
									
										160
									
								
								app/app.go
									
									
									
									
									
								
							@ -6,8 +6,8 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	abci "github.com/tendermint/tendermint/abci/types"
 | 
						abci "github.com/tendermint/tendermint/abci/types"
 | 
				
			||||||
	cmn "github.com/tendermint/tendermint/libs/common"
 | 
						cmn "github.com/tendermint/tendermint/libs/common"
 | 
				
			||||||
	dbm "github.com/tendermint/tendermint/libs/db"
 | 
					 | 
				
			||||||
	"github.com/tendermint/tendermint/libs/log"
 | 
						"github.com/tendermint/tendermint/libs/log"
 | 
				
			||||||
 | 
						dbm "github.com/tendermint/tm-db"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bam "github.com/cosmos/cosmos-sdk/baseapp"
 | 
						bam "github.com/cosmos/cosmos-sdk/baseapp"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
						"github.com/cosmos/cosmos-sdk/codec"
 | 
				
			||||||
@ -18,7 +18,6 @@ import (
 | 
				
			|||||||
	"github.com/cosmos/cosmos-sdk/x/bank"
 | 
						"github.com/cosmos/cosmos-sdk/x/bank"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/x/crisis"
 | 
						"github.com/cosmos/cosmos-sdk/x/crisis"
 | 
				
			||||||
	distr "github.com/cosmos/cosmos-sdk/x/distribution"
 | 
						distr "github.com/cosmos/cosmos-sdk/x/distribution"
 | 
				
			||||||
	distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client"
 | 
					 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/x/genaccounts"
 | 
						"github.com/cosmos/cosmos-sdk/x/genaccounts"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/x/genutil"
 | 
						"github.com/cosmos/cosmos-sdk/x/genutil"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/x/gov"
 | 
						"github.com/cosmos/cosmos-sdk/x/gov"
 | 
				
			||||||
@ -41,7 +40,20 @@ var (
 | 
				
			|||||||
	DefaultNodeHome = os.ExpandEnv("$HOME/.kvd")
 | 
						DefaultNodeHome = os.ExpandEnv("$HOME/.kvd")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// ModuleBasics manages simple versions of full app modules. It's used for things such as codec registration and genesis file verification.
 | 
						// ModuleBasics manages simple versions of full app modules. It's used for things such as codec registration and genesis file verification.
 | 
				
			||||||
	ModuleBasics module.BasicManager
 | 
						ModuleBasics = module.NewBasicManager(
 | 
				
			||||||
 | 
							genaccounts.AppModuleBasic{},
 | 
				
			||||||
 | 
							genutil.AppModuleBasic{},
 | 
				
			||||||
 | 
							auth.AppModuleBasic{},
 | 
				
			||||||
 | 
							bank.AppModuleBasic{},
 | 
				
			||||||
 | 
							staking.AppModuleBasic{},
 | 
				
			||||||
 | 
							mint.AppModuleBasic{},
 | 
				
			||||||
 | 
							distr.AppModuleBasic{},
 | 
				
			||||||
 | 
							gov.NewAppModuleBasic(paramsclient.ProposalHandler, distr.ProposalHandler),
 | 
				
			||||||
 | 
							params.AppModuleBasic{},
 | 
				
			||||||
 | 
							crisis.AppModuleBasic{},
 | 
				
			||||||
 | 
							slashing.AppModuleBasic{},
 | 
				
			||||||
 | 
							supply.AppModuleBasic{},
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// module account permissions
 | 
						// module account permissions
 | 
				
			||||||
	mAccPerms = map[string][]string{
 | 
						mAccPerms = map[string][]string{
 | 
				
			||||||
@ -54,23 +66,6 @@ var (
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					 | 
				
			||||||
	ModuleBasics = module.NewBasicManager(
 | 
					 | 
				
			||||||
		genaccounts.AppModuleBasic{},
 | 
					 | 
				
			||||||
		genutil.AppModuleBasic{},
 | 
					 | 
				
			||||||
		auth.AppModuleBasic{},
 | 
					 | 
				
			||||||
		bank.AppModuleBasic{},
 | 
					 | 
				
			||||||
		staking.AppModuleBasic{},
 | 
					 | 
				
			||||||
		mint.AppModuleBasic{},
 | 
					 | 
				
			||||||
		distr.AppModuleBasic{},
 | 
					 | 
				
			||||||
		gov.NewAppModuleBasic(paramsclient.ProposalHandler, distrclient.ProposalHandler),
 | 
					 | 
				
			||||||
		params.AppModuleBasic{},
 | 
					 | 
				
			||||||
		crisis.AppModuleBasic{},
 | 
					 | 
				
			||||||
		slashing.AppModuleBasic{},
 | 
					 | 
				
			||||||
		supply.AppModuleBasic{},
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Extended ABCI application
 | 
					// Extended ABCI application
 | 
				
			||||||
type App struct {
 | 
					type App struct {
 | 
				
			||||||
	*bam.BaseApp
 | 
						*bam.BaseApp
 | 
				
			||||||
@ -79,18 +74,8 @@ type App struct {
 | 
				
			|||||||
	invCheckPeriod uint
 | 
						invCheckPeriod uint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// keys to access the substores
 | 
						// keys to access the substores
 | 
				
			||||||
	keyMain     *sdk.KVStoreKey
 | 
						keys  map[string]*sdk.KVStoreKey
 | 
				
			||||||
	keyAccount  *sdk.KVStoreKey
 | 
						tkeys map[string]*sdk.TransientStoreKey
 | 
				
			||||||
	keySupply   *sdk.KVStoreKey
 | 
					 | 
				
			||||||
	keyStaking  *sdk.KVStoreKey
 | 
					 | 
				
			||||||
	tkeyStaking *sdk.TransientStoreKey
 | 
					 | 
				
			||||||
	keySlashing *sdk.KVStoreKey
 | 
					 | 
				
			||||||
	keyMint     *sdk.KVStoreKey
 | 
					 | 
				
			||||||
	keyDistr    *sdk.KVStoreKey
 | 
					 | 
				
			||||||
	tkeyDistr   *sdk.TransientStoreKey
 | 
					 | 
				
			||||||
	keyGov      *sdk.KVStoreKey
 | 
					 | 
				
			||||||
	keyParams   *sdk.KVStoreKey
 | 
					 | 
				
			||||||
	tkeyParams  *sdk.TransientStoreKey
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// keepers from all the modules
 | 
						// keepers from all the modules
 | 
				
			||||||
	accountKeeper  auth.AccountKeeper
 | 
						accountKeeper  auth.AccountKeeper
 | 
				
			||||||
@ -106,6 +91,9 @@ type App struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// the module manager
 | 
						// the module manager
 | 
				
			||||||
	mm *module.Manager
 | 
						mm *module.Manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// simulation manager
 | 
				
			||||||
 | 
						sm *module.SimulationManager
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewApp returns a reference to an initialized App.
 | 
					// NewApp returns a reference to an initialized App.
 | 
				
			||||||
@ -119,77 +107,75 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool,
 | 
				
			|||||||
	bApp.SetCommitMultiStoreTracer(traceStore)
 | 
						bApp.SetCommitMultiStoreTracer(traceStore)
 | 
				
			||||||
	bApp.SetAppVersion(version.Version)
 | 
						bApp.SetAppVersion(version.Version)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						keys := sdk.NewKVStoreKeys(
 | 
				
			||||||
 | 
							bam.MainStoreKey, auth.StoreKey, staking.StoreKey,
 | 
				
			||||||
 | 
							supply.StoreKey, mint.StoreKey, distr.StoreKey, slashing.StoreKey,
 | 
				
			||||||
 | 
							gov.StoreKey, params.StoreKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						tkeys := sdk.NewTransientStoreKeys(staking.TStoreKey, params.TStoreKey)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var app = &App{
 | 
						var app = &App{
 | 
				
			||||||
		BaseApp:        bApp,
 | 
							BaseApp:        bApp,
 | 
				
			||||||
		cdc:            cdc,
 | 
							cdc:            cdc,
 | 
				
			||||||
		invCheckPeriod: invCheckPeriod,
 | 
							invCheckPeriod: invCheckPeriod,
 | 
				
			||||||
		keyMain:        sdk.NewKVStoreKey(bam.MainStoreKey),
 | 
							keys:           keys,
 | 
				
			||||||
		keyAccount:     sdk.NewKVStoreKey(auth.StoreKey),
 | 
							tkeys:          tkeys,
 | 
				
			||||||
		keySupply:      sdk.NewKVStoreKey(supply.StoreKey),
 | 
					 | 
				
			||||||
		keyStaking:     sdk.NewKVStoreKey(staking.StoreKey),
 | 
					 | 
				
			||||||
		tkeyStaking:    sdk.NewTransientStoreKey(staking.TStoreKey),
 | 
					 | 
				
			||||||
		keyMint:        sdk.NewKVStoreKey(mint.StoreKey),
 | 
					 | 
				
			||||||
		keyDistr:       sdk.NewKVStoreKey(distr.StoreKey),
 | 
					 | 
				
			||||||
		tkeyDistr:      sdk.NewTransientStoreKey(distr.TStoreKey),
 | 
					 | 
				
			||||||
		keySlashing:    sdk.NewKVStoreKey(slashing.StoreKey),
 | 
					 | 
				
			||||||
		keyGov:         sdk.NewKVStoreKey(gov.StoreKey),
 | 
					 | 
				
			||||||
		keyParams:      sdk.NewKVStoreKey(params.StoreKey),
 | 
					 | 
				
			||||||
		tkeyParams:     sdk.NewTransientStoreKey(params.TStoreKey),
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// init params keeper and subspaces
 | 
						// init params keeper and subspaces
 | 
				
			||||||
	app.paramsKeeper = params.NewKeeper(app.cdc, app.keyParams, app.tkeyParams, params.DefaultCodespace)
 | 
						app.paramsKeeper = params.NewKeeper(app.cdc, keys[params.StoreKey], tkeys[params.TStoreKey], params.DefaultCodespace)
 | 
				
			||||||
	authSubspace := app.paramsKeeper.Subspace(auth.DefaultParamspace)
 | 
						authSubspace := app.paramsKeeper.Subspace(auth.DefaultParamspace)
 | 
				
			||||||
	bankSubspace := app.paramsKeeper.Subspace(bank.DefaultParamspace)
 | 
						bankSubspace := app.paramsKeeper.Subspace(bank.DefaultParamspace)
 | 
				
			||||||
	stakingSubspace := app.paramsKeeper.Subspace(staking.DefaultParamspace)
 | 
						stakingSubspace := app.paramsKeeper.Subspace(staking.DefaultParamspace)
 | 
				
			||||||
	mintSubspace := app.paramsKeeper.Subspace(mint.DefaultParamspace)
 | 
						mintSubspace := app.paramsKeeper.Subspace(mint.DefaultParamspace)
 | 
				
			||||||
	distrSubspace := app.paramsKeeper.Subspace(distr.DefaultParamspace)
 | 
						distrSubspace := app.paramsKeeper.Subspace(distr.DefaultParamspace)
 | 
				
			||||||
	slashingSubspace := app.paramsKeeper.Subspace(slashing.DefaultParamspace)
 | 
						slashingSubspace := app.paramsKeeper.Subspace(slashing.DefaultParamspace)
 | 
				
			||||||
	govSubspace := app.paramsKeeper.Subspace(gov.DefaultParamspace)
 | 
						govSubspace := app.paramsKeeper.Subspace(gov.DefaultParamspace).WithKeyTable(gov.ParamKeyTable())
 | 
				
			||||||
	crisisSubspace := app.paramsKeeper.Subspace(crisis.DefaultParamspace)
 | 
						crisisSubspace := app.paramsKeeper.Subspace(crisis.DefaultParamspace)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// add keepers
 | 
						// add keepers
 | 
				
			||||||
	app.accountKeeper = auth.NewAccountKeeper(
 | 
						app.accountKeeper = auth.NewAccountKeeper(
 | 
				
			||||||
		app.cdc,
 | 
							app.cdc,
 | 
				
			||||||
		app.keyAccount,
 | 
							keys[auth.StoreKey],
 | 
				
			||||||
		authSubspace,
 | 
							authSubspace,
 | 
				
			||||||
		auth.ProtoBaseAccount)
 | 
							auth.ProtoBaseAccount)
 | 
				
			||||||
	app.bankKeeper = bank.NewBaseKeeper(
 | 
						app.bankKeeper = bank.NewBaseKeeper(
 | 
				
			||||||
		app.accountKeeper,
 | 
							app.accountKeeper,
 | 
				
			||||||
		bankSubspace,
 | 
							bankSubspace,
 | 
				
			||||||
		bank.DefaultCodespace)
 | 
							bank.DefaultCodespace,
 | 
				
			||||||
 | 
							app.ModuleAccountAddrs())
 | 
				
			||||||
	app.supplyKeeper = supply.NewKeeper(
 | 
						app.supplyKeeper = supply.NewKeeper(
 | 
				
			||||||
		app.cdc,
 | 
							app.cdc,
 | 
				
			||||||
		app.keySupply,
 | 
							keys[supply.StoreKey],
 | 
				
			||||||
		app.accountKeeper,
 | 
							app.accountKeeper,
 | 
				
			||||||
		app.bankKeeper,
 | 
							app.bankKeeper,
 | 
				
			||||||
		supply.DefaultCodespace,
 | 
					 | 
				
			||||||
		mAccPerms)
 | 
							mAccPerms)
 | 
				
			||||||
	stakingKeeper := staking.NewKeeper(
 | 
						stakingKeeper := staking.NewKeeper(
 | 
				
			||||||
		app.cdc,
 | 
							app.cdc,
 | 
				
			||||||
		app.keyStaking,
 | 
							keys[staking.StoreKey],
 | 
				
			||||||
		app.tkeyStaking,
 | 
							tkeys[staking.TStoreKey],
 | 
				
			||||||
		app.supplyKeeper,
 | 
							app.supplyKeeper,
 | 
				
			||||||
		stakingSubspace,
 | 
							stakingSubspace,
 | 
				
			||||||
		staking.DefaultCodespace)
 | 
							staking.DefaultCodespace)
 | 
				
			||||||
	app.mintKeeper = mint.NewKeeper(
 | 
						app.mintKeeper = mint.NewKeeper(
 | 
				
			||||||
		app.cdc,
 | 
							app.cdc,
 | 
				
			||||||
		app.keyMint,
 | 
							keys[mint.StoreKey],
 | 
				
			||||||
		mintSubspace,
 | 
							mintSubspace,
 | 
				
			||||||
		&stakingKeeper,
 | 
							&stakingKeeper,
 | 
				
			||||||
		app.supplyKeeper,
 | 
							app.supplyKeeper,
 | 
				
			||||||
		auth.FeeCollectorName)
 | 
							auth.FeeCollectorName)
 | 
				
			||||||
	app.distrKeeper = distr.NewKeeper(
 | 
						app.distrKeeper = distr.NewKeeper(
 | 
				
			||||||
		app.cdc,
 | 
							app.cdc,
 | 
				
			||||||
		app.keyDistr,
 | 
							keys[distr.StoreKey],
 | 
				
			||||||
		distrSubspace,
 | 
							distrSubspace,
 | 
				
			||||||
		&stakingKeeper,
 | 
							&stakingKeeper,
 | 
				
			||||||
		app.supplyKeeper,
 | 
							app.supplyKeeper,
 | 
				
			||||||
		distr.DefaultCodespace,
 | 
							distr.DefaultCodespace,
 | 
				
			||||||
		auth.FeeCollectorName)
 | 
							auth.FeeCollectorName,
 | 
				
			||||||
 | 
							app.ModuleAccountAddrs())
 | 
				
			||||||
	app.slashingKeeper = slashing.NewKeeper(
 | 
						app.slashingKeeper = slashing.NewKeeper(
 | 
				
			||||||
		app.cdc,
 | 
							app.cdc,
 | 
				
			||||||
		app.keySlashing,
 | 
							keys[slashing.StoreKey],
 | 
				
			||||||
		&stakingKeeper,
 | 
							&stakingKeeper,
 | 
				
			||||||
		slashingSubspace,
 | 
							slashingSubspace,
 | 
				
			||||||
		slashing.DefaultCodespace)
 | 
							slashing.DefaultCodespace)
 | 
				
			||||||
@ -205,8 +191,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool,
 | 
				
			|||||||
		AddRoute(distr.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.distrKeeper))
 | 
							AddRoute(distr.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.distrKeeper))
 | 
				
			||||||
	app.govKeeper = gov.NewKeeper(
 | 
						app.govKeeper = gov.NewKeeper(
 | 
				
			||||||
		app.cdc,
 | 
							app.cdc,
 | 
				
			||||||
		app.keyGov,
 | 
							keys[gov.StoreKey],
 | 
				
			||||||
		app.paramsKeeper,
 | 
					 | 
				
			||||||
		govSubspace,
 | 
							govSubspace,
 | 
				
			||||||
		app.supplyKeeper,
 | 
							app.supplyKeeper,
 | 
				
			||||||
		&stakingKeeper,
 | 
							&stakingKeeper,
 | 
				
			||||||
@ -218,19 +203,20 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool,
 | 
				
			|||||||
	app.stakingKeeper = *stakingKeeper.SetHooks(
 | 
						app.stakingKeeper = *stakingKeeper.SetHooks(
 | 
				
			||||||
		staking.NewMultiStakingHooks(app.distrKeeper.Hooks(), app.slashingKeeper.Hooks()))
 | 
							staking.NewMultiStakingHooks(app.distrKeeper.Hooks(), app.slashingKeeper.Hooks()))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// create the module manager
 | 
						// create the module manager (Note: Any module instantiated in the module manager that is later modified
 | 
				
			||||||
 | 
						// must be passed by reference here.)
 | 
				
			||||||
	app.mm = module.NewManager(
 | 
						app.mm = module.NewManager(
 | 
				
			||||||
		genaccounts.NewAppModule(app.accountKeeper),
 | 
							genaccounts.NewAppModule(app.accountKeeper),
 | 
				
			||||||
		genutil.NewAppModule(app.accountKeeper, app.stakingKeeper, app.BaseApp.DeliverTx),
 | 
							genutil.NewAppModule(app.accountKeeper, app.stakingKeeper, app.BaseApp.DeliverTx),
 | 
				
			||||||
		auth.NewAppModule(app.accountKeeper),
 | 
							auth.NewAppModule(app.accountKeeper),
 | 
				
			||||||
		bank.NewAppModule(app.bankKeeper, app.accountKeeper),
 | 
							bank.NewAppModule(app.bankKeeper, app.accountKeeper),
 | 
				
			||||||
		crisis.NewAppModule(app.crisisKeeper),
 | 
							crisis.NewAppModule(&app.crisisKeeper),
 | 
				
			||||||
		supply.NewAppModule(app.supplyKeeper, app.accountKeeper),
 | 
							supply.NewAppModule(app.supplyKeeper, app.accountKeeper),
 | 
				
			||||||
		distr.NewAppModule(app.distrKeeper, app.supplyKeeper),
 | 
							distr.NewAppModule(app.distrKeeper, app.supplyKeeper),
 | 
				
			||||||
		gov.NewAppModule(app.govKeeper, app.supplyKeeper),
 | 
							gov.NewAppModule(app.govKeeper, app.supplyKeeper),
 | 
				
			||||||
		mint.NewAppModule(app.mintKeeper),
 | 
							mint.NewAppModule(app.mintKeeper),
 | 
				
			||||||
		slashing.NewAppModule(app.slashingKeeper, app.stakingKeeper),
 | 
							slashing.NewAppModule(app.slashingKeeper, app.stakingKeeper),
 | 
				
			||||||
		staking.NewAppModule(app.stakingKeeper, app.distrKeeper, app.accountKeeper, app.supplyKeeper),
 | 
							staking.NewAppModule(app.stakingKeeper, app.accountKeeper, app.supplyKeeper),
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// During begin block slashing happens after distr.BeginBlocker so that
 | 
						// During begin block slashing happens after distr.BeginBlocker so that
 | 
				
			||||||
@ -238,7 +224,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool,
 | 
				
			|||||||
	// CanWithdrawInvariant invariant.
 | 
						// CanWithdrawInvariant invariant.
 | 
				
			||||||
	app.mm.SetOrderBeginBlockers(mint.ModuleName, distr.ModuleName, slashing.ModuleName)
 | 
						app.mm.SetOrderBeginBlockers(mint.ModuleName, distr.ModuleName, slashing.ModuleName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	app.mm.SetOrderEndBlockers(gov.ModuleName, staking.ModuleName)
 | 
						app.mm.SetOrderEndBlockers(crisis.ModuleName, gov.ModuleName, staking.ModuleName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// genutils must occur after staking so that pools are properly
 | 
						// genutils must occur after staking so that pools are properly
 | 
				
			||||||
	// initialized with tokens from genesis accounts.
 | 
						// initialized with tokens from genesis accounts.
 | 
				
			||||||
@ -249,10 +235,29 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool,
 | 
				
			|||||||
	app.mm.RegisterInvariants(&app.crisisKeeper)
 | 
						app.mm.RegisterInvariants(&app.crisisKeeper)
 | 
				
			||||||
	app.mm.RegisterRoutes(app.Router(), app.QueryRouter())
 | 
						app.mm.RegisterRoutes(app.Router(), app.QueryRouter())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// create the simulation manager and define the order of the modules for deterministic simulations
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// NOTE: This is not required for apps that don't use the simulator for fuzz testing
 | 
				
			||||||
 | 
						// transactions.
 | 
				
			||||||
 | 
						app.sm = module.NewSimulationManager(
 | 
				
			||||||
 | 
							genaccounts.NewAppModule(app.accountKeeper),
 | 
				
			||||||
 | 
							auth.NewAppModule(app.accountKeeper),
 | 
				
			||||||
 | 
							bank.NewAppModule(app.bankKeeper, app.accountKeeper),
 | 
				
			||||||
 | 
							supply.NewAppModule(app.supplyKeeper, app.accountKeeper),
 | 
				
			||||||
 | 
							gov.NewAppModule(app.govKeeper, app.supplyKeeper),
 | 
				
			||||||
 | 
							mint.NewAppModule(app.mintKeeper),
 | 
				
			||||||
 | 
							distr.NewAppModule(app.distrKeeper, app.supplyKeeper),
 | 
				
			||||||
 | 
							staking.NewAppModule(app.stakingKeeper, app.accountKeeper, app.supplyKeeper),
 | 
				
			||||||
 | 
							slashing.NewAppModule(app.slashingKeeper, app.stakingKeeper),
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						app.sm.RegisterStoreDecoders()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// initialize stores
 | 
				
			||||||
 | 
						app.MountKVStores(keys)
 | 
				
			||||||
 | 
						app.MountTransientStores(tkeys)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// initialize the app
 | 
						// initialize the app
 | 
				
			||||||
	app.MountStores(app.keyMain, app.keyAccount, app.keySupply, app.keyStaking,
 | 
					 | 
				
			||||||
		app.keyMint, app.keyDistr, app.keySlashing, app.keyGov, app.keyParams,
 | 
					 | 
				
			||||||
		app.tkeyParams, app.tkeyStaking, app.tkeyDistr)
 | 
					 | 
				
			||||||
	app.SetInitChainer(app.InitChainer)
 | 
						app.SetInitChainer(app.InitChainer)
 | 
				
			||||||
	app.SetBeginBlocker(app.BeginBlocker)
 | 
						app.SetBeginBlocker(app.BeginBlocker)
 | 
				
			||||||
	app.SetAnteHandler(auth.NewAnteHandler(app.accountKeeper, app.supplyKeeper, auth.DefaultSigVerificationGasConsumer))
 | 
						app.SetAnteHandler(auth.NewAnteHandler(app.accountKeeper, app.supplyKeeper, auth.DefaultSigVerificationGasConsumer))
 | 
				
			||||||
@ -260,7 +265,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// load store
 | 
						// load store
 | 
				
			||||||
	if loadLatest {
 | 
						if loadLatest {
 | 
				
			||||||
		err := app.LoadLatestVersion(app.keyMain)
 | 
							err := app.LoadLatestVersion(app.keys[bam.MainStoreKey])
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			cmn.Exit(err.Error())
 | 
								cmn.Exit(err.Error())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -272,10 +277,13 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool,
 | 
				
			|||||||
// custom tx codec
 | 
					// custom tx codec
 | 
				
			||||||
func MakeCodec() *codec.Codec {
 | 
					func MakeCodec() *codec.Codec {
 | 
				
			||||||
	var cdc = codec.New()
 | 
						var cdc = codec.New()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ModuleBasics.RegisterCodec(cdc)
 | 
						ModuleBasics.RegisterCodec(cdc)
 | 
				
			||||||
	sdk.RegisterCodec(cdc)
 | 
						sdk.RegisterCodec(cdc)
 | 
				
			||||||
	codec.RegisterCrypto(cdc)
 | 
						codec.RegisterCrypto(cdc)
 | 
				
			||||||
	return cdc
 | 
						codec.RegisterEvidences(cdc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return cdc.Seal()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func SetBech32AddressPrefixes(config *sdk.Config) {
 | 
					func SetBech32AddressPrefixes(config *sdk.Config) {
 | 
				
			||||||
@ -303,15 +311,29 @@ func (app *App) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.Res
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// load a particular height
 | 
					// load a particular height
 | 
				
			||||||
func (app *App) LoadHeight(height int64) error {
 | 
					func (app *App) LoadHeight(height int64) error {
 | 
				
			||||||
	return app.LoadVersion(height, app.keyMain)
 | 
						return app.LoadVersion(height, app.keys[bam.MainStoreKey])
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ModuleAccountAddrs returns all the app's module account addresses.
 | 
					// ModuleAccountAddrs returns all the app's module account addresses.
 | 
				
			||||||
func (app *App) ModuleAccountAddrs() map[string]bool {
 | 
					func (app *App) ModuleAccountAddrs() map[string]bool {
 | 
				
			||||||
	modAccAddrs := make(map[string]bool)
 | 
						modAccAddrs := make(map[string]bool)
 | 
				
			||||||
	for acc := range mAccPerms {
 | 
						for acc := range mAccPerms {
 | 
				
			||||||
		modAccAddrs[app.supplyKeeper.GetModuleAddress(acc).String()] = true
 | 
							modAccAddrs[supply.NewModuleAddress(acc).String()] = true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return modAccAddrs
 | 
						return modAccAddrs
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Codec returns the application's sealed codec.
 | 
				
			||||||
 | 
					func (app *App) Codec() *codec.Codec {
 | 
				
			||||||
 | 
						return app.cdc
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetMaccPerms returns a mapping of the application's module account permissions.
 | 
				
			||||||
 | 
					func GetMaccPerms() map[string][]string {
 | 
				
			||||||
 | 
						perms := make(map[string][]string)
 | 
				
			||||||
 | 
						for k, v := range mAccPerms {
 | 
				
			||||||
 | 
							perms[k] = v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return perms
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -5,8 +5,8 @@ import (
 | 
				
			|||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
	"github.com/tendermint/tendermint/libs/db"
 | 
					 | 
				
			||||||
	"github.com/tendermint/tendermint/libs/log"
 | 
						"github.com/tendermint/tendermint/libs/log"
 | 
				
			||||||
 | 
						db "github.com/tendermint/tm-db"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/codec"
 | 
						"github.com/cosmos/cosmos-sdk/codec"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -24,6 +24,16 @@ func TestExport(t *testing.T) {
 | 
				
			|||||||
	require.NoError(t, err, "ExportAppStateAndValidators should not have an error")
 | 
						require.NoError(t, err, "ExportAppStateAndValidators should not have an error")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ensure that black listed addresses are properly set in bank keeper
 | 
				
			||||||
 | 
					func TestBlackListedAddrs(t *testing.T) {
 | 
				
			||||||
 | 
						db := db.NewMemDB()
 | 
				
			||||||
 | 
						app := NewApp(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for acc := range mAccPerms {
 | 
				
			||||||
 | 
							require.True(t, app.bankKeeper.BlacklistedAddr(app.supplyKeeper.GetModuleAddress(acc)))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func setGenesis(app *App) error {
 | 
					func setGenesis(app *App) error {
 | 
				
			||||||
	genesisState := NewDefaultGenesisState()
 | 
						genesisState := NewDefaultGenesisState()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -124,7 +124,7 @@ func (app *App) prepForZeroHeightGenesis(ctx sdk.Context, jailWhiteList []string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Iterate through validators by power descending, reset bond heights, and
 | 
						// Iterate through validators by power descending, reset bond heights, and
 | 
				
			||||||
	// update bond intra-tx counters.
 | 
						// update bond intra-tx counters.
 | 
				
			||||||
	store := ctx.KVStore(app.keyStaking)
 | 
						store := ctx.KVStore(app.keys[staking.StoreKey])
 | 
				
			||||||
	iter := sdk.KVStoreReversePrefixIterator(store, staking.ValidatorsKey)
 | 
						iter := sdk.KVStoreReversePrefixIterator(store, staking.ValidatorsKey)
 | 
				
			||||||
	counter := int16(0)
 | 
						counter := int16(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										540
									
								
								app/sim_test.go
									
									
									
									
									
								
							
							
						
						
									
										540
									
								
								app/sim_test.go
									
									
									
									
									
								
							@ -2,33 +2,38 @@ package app
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"flag"
 | 
					 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"math/rand"
 | 
						"math/rand"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	abci "github.com/tendermint/tendermint/abci/types"
 | 
						abci "github.com/tendermint/tendermint/abci/types"
 | 
				
			||||||
	dbm "github.com/tendermint/tendermint/libs/db"
 | 
					 | 
				
			||||||
	"github.com/tendermint/tendermint/libs/log"
 | 
						"github.com/tendermint/tendermint/libs/log"
 | 
				
			||||||
 | 
						dbm "github.com/tendermint/tm-db"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/baseapp"
 | 
						"github.com/cosmos/cosmos-sdk/baseapp"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/simapp" // TODO replace with types from app/genesis.go ?
 | 
						"github.com/cosmos/cosmos-sdk/simapp"
 | 
				
			||||||
 | 
						"github.com/cosmos/cosmos-sdk/store"
 | 
				
			||||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
						sdk "github.com/cosmos/cosmos-sdk/types"
 | 
				
			||||||
	authsim "github.com/cosmos/cosmos-sdk/x/auth/simulation"
 | 
						"github.com/cosmos/cosmos-sdk/x/auth"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/x/bank"
 | 
						authsimops "github.com/cosmos/cosmos-sdk/x/auth/simulation/operations"
 | 
				
			||||||
	distrsim "github.com/cosmos/cosmos-sdk/x/distribution/simulation"
 | 
						banksimops "github.com/cosmos/cosmos-sdk/x/bank/simulation/operations"
 | 
				
			||||||
	govsim "github.com/cosmos/cosmos-sdk/x/gov/simulation"
 | 
						distr "github.com/cosmos/cosmos-sdk/x/distribution"
 | 
				
			||||||
	paramsim "github.com/cosmos/cosmos-sdk/x/params/simulation"
 | 
						distrsimops "github.com/cosmos/cosmos-sdk/x/distribution/simulation/operations"
 | 
				
			||||||
 | 
						"github.com/cosmos/cosmos-sdk/x/gov"
 | 
				
			||||||
 | 
						govsimops "github.com/cosmos/cosmos-sdk/x/gov/simulation/operations"
 | 
				
			||||||
 | 
						"github.com/cosmos/cosmos-sdk/x/mint"
 | 
				
			||||||
 | 
						"github.com/cosmos/cosmos-sdk/x/params"
 | 
				
			||||||
 | 
						paramsimops "github.com/cosmos/cosmos-sdk/x/params/simulation/operations"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/x/simulation"
 | 
						"github.com/cosmos/cosmos-sdk/x/simulation"
 | 
				
			||||||
	slashingsim "github.com/cosmos/cosmos-sdk/x/slashing/simulation"
 | 
						"github.com/cosmos/cosmos-sdk/x/slashing"
 | 
				
			||||||
 | 
						slashingsimops "github.com/cosmos/cosmos-sdk/x/slashing/simulation/operations"
 | 
				
			||||||
	"github.com/cosmos/cosmos-sdk/x/staking"
 | 
						"github.com/cosmos/cosmos-sdk/x/staking"
 | 
				
			||||||
	stakingsim "github.com/cosmos/cosmos-sdk/x/staking/simulation"
 | 
						stakingsimops "github.com/cosmos/cosmos-sdk/x/staking/simulation/operations"
 | 
				
			||||||
 | 
						"github.com/cosmos/cosmos-sdk/x/supply"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Simulation parameter constants
 | 
					// Simulation parameter constants
 | 
				
			||||||
@ -53,372 +58,276 @@ const (
 | 
				
			|||||||
	OpWeightMsgUnjail                                  = "op_weight_msg_unjail"
 | 
						OpWeightMsgUnjail                                  = "op_weight_msg_unjail"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	genesisFile   string
 | 
					 | 
				
			||||||
	paramsFile    string
 | 
					 | 
				
			||||||
	seed          int64
 | 
					 | 
				
			||||||
	numBlocks     int
 | 
					 | 
				
			||||||
	blockSize     int
 | 
					 | 
				
			||||||
	enabled       bool
 | 
					 | 
				
			||||||
	verbose       bool
 | 
					 | 
				
			||||||
	lean          bool
 | 
					 | 
				
			||||||
	commit        bool
 | 
					 | 
				
			||||||
	period        int
 | 
					 | 
				
			||||||
	onOperation   bool // TODO Remove in favor of binary search for invariant violation
 | 
					 | 
				
			||||||
	allInvariants bool
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	flag.StringVar(&genesisFile, "SimulationGenesis", "", "custom simulation genesis file; cannot be used with params file")
 | 
						simapp.GetSimulatorFlags()
 | 
				
			||||||
	flag.StringVar(¶msFile, "SimulationParams", "", "custom simulation params file which overrides any random params; cannot be used with genesis")
 | 
					 | 
				
			||||||
	flag.Int64Var(&seed, "SimulationSeed", 42, "simulation random seed")
 | 
					 | 
				
			||||||
	flag.IntVar(&numBlocks, "SimulationNumBlocks", 500, "number of blocks")
 | 
					 | 
				
			||||||
	flag.IntVar(&blockSize, "SimulationBlockSize", 200, "operations per block")
 | 
					 | 
				
			||||||
	flag.BoolVar(&enabled, "SimulationEnabled", false, "enable the simulation")
 | 
					 | 
				
			||||||
	flag.BoolVar(&verbose, "SimulationVerbose", false, "verbose log output")
 | 
					 | 
				
			||||||
	flag.BoolVar(&lean, "SimulationLean", false, "lean simulation log output")
 | 
					 | 
				
			||||||
	flag.BoolVar(&commit, "SimulationCommit", false, "have the simulation commit")
 | 
					 | 
				
			||||||
	flag.IntVar(&period, "SimulationPeriod", 1, "run slow invariants only once every period assertions")
 | 
					 | 
				
			||||||
	flag.BoolVar(&onOperation, "SimulateEveryOperation", false, "run slow invariants every operation")
 | 
					 | 
				
			||||||
	flag.BoolVar(&allInvariants, "PrintAllInvariants", false, "print all invariants if a broken invariant is found")
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// helper function for populating input for SimulateFromSeed
 | 
					func testAndRunTxs(app *App, config simulation.Config) []simulation.WeightedOperation {
 | 
				
			||||||
func getSimulateFromSeedInput(tb testing.TB, w io.Writer, app *App) (
 | 
					 | 
				
			||||||
	testing.TB, io.Writer, *baseapp.BaseApp, simulation.AppStateFn, int64,
 | 
					 | 
				
			||||||
	simulation.WeightedOperations, sdk.Invariants, int, int, bool, bool, bool, bool, map[string]bool,
 | 
					 | 
				
			||||||
) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return tb, w, app.BaseApp, appStateFn, seed,
 | 
					 | 
				
			||||||
		testAndRunTxs(app), invariants(app), numBlocks, blockSize, commit,
 | 
					 | 
				
			||||||
		lean, onOperation, allInvariants, app.ModuleAccountAddrs()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func appStateFn(
 | 
					 | 
				
			||||||
	r *rand.Rand, accs []simulation.Account, genesisTimestamp time.Time,
 | 
					 | 
				
			||||||
) (appState json.RawMessage, simAccs []simulation.Account, chainID string) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cdc := MakeCodec()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch {
 | 
					 | 
				
			||||||
	case paramsFile != "" && genesisFile != "":
 | 
					 | 
				
			||||||
		panic("cannot provide both a genesis file and a params file")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case genesisFile != "":
 | 
					 | 
				
			||||||
		appState, simAccs, chainID = simapp.AppStateFromGenesisFileFn(r, accs, genesisTimestamp)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case paramsFile != "":
 | 
					 | 
				
			||||||
		appParams := make(simulation.AppParams)
 | 
					 | 
				
			||||||
		bz, err := ioutil.ReadFile(paramsFile)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			panic(err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		cdc.MustUnmarshalJSON(bz, &appParams)
 | 
					 | 
				
			||||||
		appState, simAccs, chainID = appStateRandomizedFn(r, accs, genesisTimestamp, appParams)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		appParams := make(simulation.AppParams)
 | 
					 | 
				
			||||||
		appState, simAccs, chainID = appStateRandomizedFn(r, accs, genesisTimestamp, appParams)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return appState, simAccs, chainID
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// TODO refactor out random initialization code to the modules
 | 
					 | 
				
			||||||
func appStateRandomizedFn(
 | 
					 | 
				
			||||||
	r *rand.Rand, accs []simulation.Account, genesisTimestamp time.Time, appParams simulation.AppParams,
 | 
					 | 
				
			||||||
) (json.RawMessage, []simulation.Account, string) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cdc := MakeCodec()
 | 
					 | 
				
			||||||
	genesisState := simapp.NewDefaultGenesisState()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var (
 | 
					 | 
				
			||||||
		amount             int64
 | 
					 | 
				
			||||||
		numInitiallyBonded int64
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	appParams.GetOrGenerate(cdc, StakePerAccount, &amount, r,
 | 
					 | 
				
			||||||
		func(r *rand.Rand) { amount = int64(r.Intn(1e12)) })
 | 
					 | 
				
			||||||
	appParams.GetOrGenerate(cdc, InitiallyBondedValidators, &amount, r,
 | 
					 | 
				
			||||||
		func(r *rand.Rand) { numInitiallyBonded = int64(r.Intn(250)) })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	numAccs := int64(len(accs))
 | 
					 | 
				
			||||||
	if numInitiallyBonded > numAccs {
 | 
					 | 
				
			||||||
		numInitiallyBonded = numAccs
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fmt.Printf(
 | 
					 | 
				
			||||||
		`Selected randomly generated parameters for simulated genesis:
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  stake_per_account: "%v",
 | 
					 | 
				
			||||||
  initially_bonded_validators: "%v"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
`, amount, numInitiallyBonded,
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	simapp.GenGenesisAccounts(cdc, r, accs, genesisTimestamp, amount, numInitiallyBonded, genesisState)
 | 
					 | 
				
			||||||
	simapp.GenAuthGenesisState(cdc, r, appParams, genesisState)
 | 
					 | 
				
			||||||
	simapp.GenBankGenesisState(cdc, r, appParams, genesisState)
 | 
					 | 
				
			||||||
	simapp.GenSupplyGenesisState(cdc, amount, numInitiallyBonded, int64(len(accs)), genesisState)
 | 
					 | 
				
			||||||
	simapp.GenGovGenesisState(cdc, r, appParams, genesisState)
 | 
					 | 
				
			||||||
	simapp.GenMintGenesisState(cdc, r, appParams, genesisState)
 | 
					 | 
				
			||||||
	simapp.GenDistrGenesisState(cdc, r, appParams, genesisState)
 | 
					 | 
				
			||||||
	stakingGen := simapp.GenStakingGenesisState(cdc, r, accs, amount, numAccs, numInitiallyBonded, appParams, genesisState)
 | 
					 | 
				
			||||||
	simapp.GenSlashingGenesisState(cdc, r, stakingGen, appParams, genesisState)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	appState, err := MakeCodec().MarshalJSON(genesisState)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		panic(err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return appState, accs, "simulation"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func testAndRunTxs(app *App) []simulation.WeightedOperation {
 | 
					 | 
				
			||||||
	cdc := MakeCodec()
 | 
					 | 
				
			||||||
	ap := make(simulation.AppParams)
 | 
						ap := make(simulation.AppParams)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if paramsFile != "" {
 | 
						paramChanges := app.sm.GenerateParamChanges(config.Seed)
 | 
				
			||||||
		bz, err := ioutil.ReadFile(paramsFile)
 | 
					
 | 
				
			||||||
 | 
						if config.ParamsFile != "" {
 | 
				
			||||||
 | 
							bz, err := ioutil.ReadFile(config.ParamsFile)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			panic(err)
 | 
								panic(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		cdc.MustUnmarshalJSON(bz, &ap)
 | 
							app.cdc.MustUnmarshalJSON(bz, &ap)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// nolint: govet
 | 
				
			||||||
	return []simulation.WeightedOperation{
 | 
						return []simulation.WeightedOperation{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightDeductFee, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightDeductFee, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 5
 | 
											v = 5
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			authsim.SimulateDeductFee(app.accountKeeper, app.supplyKeeper),
 | 
								authsimops.SimulateDeductFee(app.accountKeeper, app.supplyKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightMsgSend, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightMsgSend, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 100
 | 
											v = 100
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			bank.SimulateMsgSend(app.accountKeeper, app.bankKeeper),
 | 
								banksimops.SimulateMsgSend(app.accountKeeper, app.bankKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightSingleInputMsgMultiSend, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightSingleInputMsgMultiSend, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 10
 | 
											v = 10
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			bank.SimulateSingleInputMsgMultiSend(app.accountKeeper, app.bankKeeper),
 | 
								banksimops.SimulateSingleInputMsgMultiSend(app.accountKeeper, app.bankKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightMsgSetWithdrawAddress, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightMsgSetWithdrawAddress, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 50
 | 
											v = 50
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			distrsim.SimulateMsgSetWithdrawAddress(app.accountKeeper, app.distrKeeper),
 | 
								distrsimops.SimulateMsgSetWithdrawAddress(app.distrKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightMsgWithdrawDelegationReward, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightMsgWithdrawDelegationReward, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 50
 | 
											v = 50
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			distrsim.SimulateMsgWithdrawDelegatorReward(app.accountKeeper, app.distrKeeper),
 | 
								distrsimops.SimulateMsgWithdrawDelegatorReward(app.distrKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightMsgWithdrawValidatorCommission, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightMsgWithdrawValidatorCommission, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 50
 | 
											v = 50
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			distrsim.SimulateMsgWithdrawValidatorCommission(app.accountKeeper, app.distrKeeper),
 | 
								distrsimops.SimulateMsgWithdrawValidatorCommission(app.distrKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightSubmitVotingSlashingTextProposal, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightSubmitVotingSlashingTextProposal, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 5
 | 
											v = 5
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			govsim.SimulateSubmittingVotingAndSlashingForProposal(app.govKeeper, govsim.SimulateTextProposalContent),
 | 
								govsimops.SimulateSubmittingVotingAndSlashingForProposal(app.govKeeper, govsimops.SimulateTextProposalContent),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightSubmitVotingSlashingCommunitySpendProposal, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightSubmitVotingSlashingCommunitySpendProposal, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 5
 | 
											v = 5
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			govsim.SimulateSubmittingVotingAndSlashingForProposal(app.govKeeper, distrsim.SimulateCommunityPoolSpendProposalContent(app.distrKeeper)),
 | 
								govsimops.SimulateSubmittingVotingAndSlashingForProposal(app.govKeeper, distrsimops.SimulateCommunityPoolSpendProposalContent(app.distrKeeper)),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightSubmitVotingSlashingParamChangeProposal, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightSubmitVotingSlashingParamChangeProposal, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 5
 | 
											v = 5
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			govsim.SimulateSubmittingVotingAndSlashingForProposal(app.govKeeper, paramsim.SimulateParamChangeProposalContent),
 | 
								govsimops.SimulateSubmittingVotingAndSlashingForProposal(app.govKeeper, paramsimops.SimulateParamChangeProposalContent(paramChanges)),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightMsgDeposit, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightMsgDeposit, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 100
 | 
											v = 100
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			govsim.SimulateMsgDeposit(app.govKeeper),
 | 
								govsimops.SimulateMsgDeposit(app.govKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightMsgCreateValidator, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightMsgCreateValidator, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 100
 | 
											v = 100
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			stakingsim.SimulateMsgCreateValidator(app.accountKeeper, app.stakingKeeper),
 | 
								stakingsimops.SimulateMsgCreateValidator(app.accountKeeper, app.stakingKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightMsgEditValidator, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightMsgEditValidator, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 5
 | 
											v = 5
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			stakingsim.SimulateMsgEditValidator(app.stakingKeeper),
 | 
								stakingsimops.SimulateMsgEditValidator(app.stakingKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightMsgDelegate, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightMsgDelegate, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 100
 | 
											v = 100
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			stakingsim.SimulateMsgDelegate(app.accountKeeper, app.stakingKeeper),
 | 
								stakingsimops.SimulateMsgDelegate(app.accountKeeper, app.stakingKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightMsgUndelegate, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightMsgUndelegate, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 100
 | 
											v = 100
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			stakingsim.SimulateMsgUndelegate(app.accountKeeper, app.stakingKeeper),
 | 
								stakingsimops.SimulateMsgUndelegate(app.accountKeeper, app.stakingKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightMsgBeginRedelegate, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightMsgBeginRedelegate, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 100
 | 
											v = 100
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			stakingsim.SimulateMsgBeginRedelegate(app.accountKeeper, app.stakingKeeper),
 | 
								stakingsimops.SimulateMsgBeginRedelegate(app.accountKeeper, app.stakingKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			func(_ *rand.Rand) int {
 | 
								func(_ *rand.Rand) int {
 | 
				
			||||||
				var v int
 | 
									var v int
 | 
				
			||||||
				ap.GetOrGenerate(cdc, OpWeightMsgUnjail, &v, nil,
 | 
									ap.GetOrGenerate(app.cdc, OpWeightMsgUnjail, &v, nil,
 | 
				
			||||||
					func(_ *rand.Rand) {
 | 
										func(_ *rand.Rand) {
 | 
				
			||||||
						v = 100
 | 
											v = 100
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				return v
 | 
									return v
 | 
				
			||||||
			}(nil),
 | 
								}(nil),
 | 
				
			||||||
			slashingsim.SimulateMsgUnjail(app.slashingKeeper),
 | 
								slashingsimops.SimulateMsgUnjail(app.slashingKeeper),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func invariants(app *App) []sdk.Invariant {
 | 
					// fauxMerkleModeOpt returns a BaseApp option to use a dbStoreAdapter instead of
 | 
				
			||||||
	// TODO: fix PeriodicInvariants, it doesn't seem to call individual invariants for a period of 1
 | 
					// an IAVLStore for faster simulation speed.
 | 
				
			||||||
	// Ref: https://github.com/cosmos/cosmos-sdk/issues/4631
 | 
					 | 
				
			||||||
	if period == 1 {
 | 
					 | 
				
			||||||
		return app.crisisKeeper.Invariants()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return simulation.PeriodicInvariants(app.crisisKeeper.Invariants(), period, 0)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Pass this in as an option to use a dbStoreAdapter instead of an IAVLStore for simulation speed.
 | 
					 | 
				
			||||||
func fauxMerkleModeOpt(bapp *baseapp.BaseApp) {
 | 
					func fauxMerkleModeOpt(bapp *baseapp.BaseApp) {
 | 
				
			||||||
	bapp.SetFauxMerkleMode()
 | 
						bapp.SetFauxMerkleMode()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// interBlockCacheOpt returns a BaseApp option function that sets the persistent
 | 
				
			||||||
 | 
					// inter-block write-through cache.
 | 
				
			||||||
 | 
					func interBlockCacheOpt() func(*baseapp.BaseApp) {
 | 
				
			||||||
 | 
						return baseapp.SetInterBlockCache(store.NewCommitKVStoreCacheManager())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Profile with:
 | 
					// Profile with:
 | 
				
			||||||
// /usr/local/go/bin/go test -benchmem -run=^$ github.com/cosmos/cosmos-sdk/GaiaApp -bench ^BenchmarkFullAppSimulation$ -SimulationCommit=true -cpuprofile cpu.out
 | 
					// /usr/local/go/bin/go test -benchmem -run=^$ github.com/cosmos/cosmos-sdk/GaiaApp -bench ^BenchmarkFullAppSimulation$ -Commit=true -cpuprofile cpu.out
 | 
				
			||||||
// TODO does this work
 | 
					 | 
				
			||||||
func BenchmarkFullAppSimulation(b *testing.B) {
 | 
					func BenchmarkFullAppSimulation(b *testing.B) {
 | 
				
			||||||
	logger := log.NewNopLogger()
 | 
						logger := log.NewNopLogger()
 | 
				
			||||||
 | 
						config := simapp.NewConfigFromFlags()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var db dbm.DB
 | 
						var db dbm.DB
 | 
				
			||||||
	dir, _ := ioutil.TempDir("", "goleveldb-app-sim")
 | 
						dir, _ := ioutil.TempDir("", "goleveldb-app-sim")
 | 
				
			||||||
	db, _ = sdk.NewLevelDB("Simulation", dir)
 | 
						db, _ = sdk.NewLevelDB("Simulation", dir)
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		db.Close()
 | 
							db.Close()
 | 
				
			||||||
		os.RemoveAll(dir)
 | 
							_ = os.RemoveAll(dir)
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
	app := NewApp(logger, db, nil, true, 0)
 | 
					
 | 
				
			||||||
 | 
						app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, interBlockCacheOpt())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Run randomized simulation
 | 
						// Run randomized simulation
 | 
				
			||||||
	// TODO parameterize numbers, save for a later PR
 | 
						// TODO: parameterize numbers, save for a later PR
 | 
				
			||||||
	_, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(b, os.Stdout, app))
 | 
						_, simParams, simErr := simulation.SimulateFromSeed(
 | 
				
			||||||
	if err != nil {
 | 
							b, os.Stdout, app.BaseApp, simapp.AppStateFn(app.Codec(), app.sm),
 | 
				
			||||||
 | 
							testAndRunTxs(app, config), app.ModuleAccountAddrs(), config,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// export state and params before the simulation error is checked
 | 
				
			||||||
 | 
						if config.ExportStatePath != "" {
 | 
				
			||||||
 | 
							if err := ExportStateToJSON(app, config.ExportStatePath); err != nil {
 | 
				
			||||||
			fmt.Println(err)
 | 
								fmt.Println(err)
 | 
				
			||||||
			b.Fail()
 | 
								b.Fail()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	if commit {
 | 
						}
 | 
				
			||||||
		fmt.Println("GoLevelDB Stats")
 | 
					
 | 
				
			||||||
 | 
						if config.ExportParamsPath != "" {
 | 
				
			||||||
 | 
							if err := simapp.ExportParamsToJSON(simParams, config.ExportParamsPath); err != nil {
 | 
				
			||||||
 | 
								fmt.Println(err)
 | 
				
			||||||
 | 
								b.Fail()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if simErr != nil {
 | 
				
			||||||
 | 
							fmt.Println(simErr)
 | 
				
			||||||
 | 
							b.FailNow()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if config.Commit {
 | 
				
			||||||
 | 
							fmt.Println("\nGoLevelDB Stats")
 | 
				
			||||||
		fmt.Println(db.Stats()["leveldb.stats"])
 | 
							fmt.Println(db.Stats()["leveldb.stats"])
 | 
				
			||||||
		fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
 | 
							fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestFullAppSimulation(t *testing.T) {
 | 
					func TestFullAppSimulation(t *testing.T) {
 | 
				
			||||||
	if !enabled {
 | 
						if !simapp.FlagEnabledValue {
 | 
				
			||||||
		t.Skip("Skipping application simulation")
 | 
							t.Skip("skipping application simulation")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var logger log.Logger
 | 
						var logger log.Logger
 | 
				
			||||||
 | 
						config := simapp.NewConfigFromFlags()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if verbose {
 | 
						if simapp.FlagVerboseValue {
 | 
				
			||||||
		logger = log.TestingLogger()
 | 
							logger = log.TestingLogger()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		logger = log.NewNopLogger()
 | 
							logger = log.NewNopLogger()
 | 
				
			||||||
@ -430,32 +339,49 @@ func TestFullAppSimulation(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		db.Close()
 | 
							db.Close()
 | 
				
			||||||
		os.RemoveAll(dir)
 | 
							_ = os.RemoveAll(dir)
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	app := NewApp(logger, db, nil, true, 0, fauxMerkleModeOpt)
 | 
						app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, fauxMerkleModeOpt)
 | 
				
			||||||
	require.Equal(t, "kava", app.Name())
 | 
						require.Equal(t, "GaiaApp", app.Name())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Run randomized simulation
 | 
						// Run randomized simulation
 | 
				
			||||||
	_, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app))
 | 
						_, simParams, simErr := simulation.SimulateFromSeed(
 | 
				
			||||||
	if commit {
 | 
							t, os.Stdout, app.BaseApp, simapp.AppStateFn(app.Codec(), app.sm),
 | 
				
			||||||
 | 
							testAndRunTxs(app, config), app.ModuleAccountAddrs(), config,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// export state and params before the simulation error is checked
 | 
				
			||||||
 | 
						if config.ExportStatePath != "" {
 | 
				
			||||||
 | 
							err := ExportStateToJSON(app, config.ExportStatePath)
 | 
				
			||||||
 | 
							require.NoError(t, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if config.ExportParamsPath != "" {
 | 
				
			||||||
 | 
							err := simapp.ExportParamsToJSON(simParams, config.ExportParamsPath)
 | 
				
			||||||
 | 
							require.NoError(t, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						require.NoError(t, simErr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if config.Commit {
 | 
				
			||||||
		// for memdb:
 | 
							// for memdb:
 | 
				
			||||||
		// fmt.Println("Database Size", db.Stats()["database.size"])
 | 
							// fmt.Println("Database Size", db.Stats()["database.size"])
 | 
				
			||||||
		fmt.Println("GoLevelDB Stats")
 | 
							fmt.Println("\nGoLevelDB Stats")
 | 
				
			||||||
		fmt.Println(db.Stats()["leveldb.stats"])
 | 
							fmt.Println(db.Stats()["leveldb.stats"])
 | 
				
			||||||
		fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
 | 
							fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	require.Nil(t, err)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestAppImportExport(t *testing.T) {
 | 
					func TestAppImportExport(t *testing.T) {
 | 
				
			||||||
	if !enabled {
 | 
						if !simapp.FlagEnabledValue {
 | 
				
			||||||
		t.Skip("Skipping application import/export simulation")
 | 
							t.Skip("skipping application import/export simulation")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var logger log.Logger
 | 
						var logger log.Logger
 | 
				
			||||||
	if verbose {
 | 
						config := simapp.NewConfigFromFlags()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if simapp.FlagVerboseValue {
 | 
				
			||||||
		logger = log.TestingLogger()
 | 
							logger = log.TestingLogger()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		logger = log.NewNopLogger()
 | 
							logger = log.NewNopLogger()
 | 
				
			||||||
@ -467,52 +393,65 @@ func TestAppImportExport(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		db.Close()
 | 
							db.Close()
 | 
				
			||||||
		os.RemoveAll(dir)
 | 
							_ = os.RemoveAll(dir)
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	app := NewApp(logger, db, nil, true, 0, fauxMerkleModeOpt)
 | 
						app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, fauxMerkleModeOpt)
 | 
				
			||||||
	require.Equal(t, "kava", app.Name())
 | 
						require.Equal(t, "SimApp", app.Name())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Run randomized simulation
 | 
						// Run randomized simulation
 | 
				
			||||||
	_, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app))
 | 
						_, simParams, simErr := simulation.SimulateFromSeed(
 | 
				
			||||||
 | 
							t, os.Stdout, app.BaseApp, simapp.AppStateFn(app.Codec(), app.sm),
 | 
				
			||||||
 | 
							testAndRunTxs(app, config), app.ModuleAccountAddrs(), config,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if commit {
 | 
						// export state and simParams before the simulation error is checked
 | 
				
			||||||
 | 
						if config.ExportStatePath != "" {
 | 
				
			||||||
 | 
							err := ExportStateToJSON(app, config.ExportStatePath)
 | 
				
			||||||
 | 
							require.NoError(t, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if config.ExportParamsPath != "" {
 | 
				
			||||||
 | 
							err := simapp.ExportParamsToJSON(simParams, config.ExportParamsPath)
 | 
				
			||||||
 | 
							require.NoError(t, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						require.NoError(t, simErr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if config.Commit {
 | 
				
			||||||
		// for memdb:
 | 
							// for memdb:
 | 
				
			||||||
		// fmt.Println("Database Size", db.Stats()["database.size"])
 | 
							// fmt.Println("Database Size", db.Stats()["database.size"])
 | 
				
			||||||
		fmt.Println("GoLevelDB Stats")
 | 
							fmt.Println("\nGoLevelDB Stats")
 | 
				
			||||||
		fmt.Println(db.Stats()["leveldb.stats"])
 | 
							fmt.Println(db.Stats()["leveldb.stats"])
 | 
				
			||||||
		fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
 | 
							fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	require.Nil(t, err)
 | 
						fmt.Printf("exporting genesis...\n")
 | 
				
			||||||
	fmt.Printf("Exporting genesis...\n")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	appState, _, err := app.ExportAppStateAndValidators(false, []string{})
 | 
						appState, _, err := app.ExportAppStateAndValidators(false, []string{})
 | 
				
			||||||
	require.NoError(t, err)
 | 
						require.NoError(t, err)
 | 
				
			||||||
	fmt.Printf("Importing genesis...\n")
 | 
						fmt.Printf("importing genesis...\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	newDir, _ := ioutil.TempDir("", "goleveldb-app-sim-2")
 | 
						newDir, _ := ioutil.TempDir("", "goleveldb-app-sim-2")
 | 
				
			||||||
	newDB, _ := sdk.NewLevelDB("Simulation-2", dir)
 | 
						newDB, _ := sdk.NewLevelDB("Simulation-2", dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		newDB.Close()
 | 
							newDB.Close()
 | 
				
			||||||
		os.RemoveAll(newDir)
 | 
							_ = os.RemoveAll(newDir)
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	newApp := NewApp(log.NewNopLogger(), newDB, nil, true, 0, fauxMerkleModeOpt)
 | 
						newApp := NewApp(log.NewNopLogger(), newDB, nil, true, simapp.FlagPeriodValue, fauxMerkleModeOpt)
 | 
				
			||||||
	require.Equal(t, "kava", newApp.Name())
 | 
						require.Equal(t, "SimApp", newApp.Name())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var genesisState simapp.GenesisState
 | 
						var genesisState simapp.GenesisState
 | 
				
			||||||
	err = app.cdc.UnmarshalJSON(appState, &genesisState)
 | 
						err = app.cdc.UnmarshalJSON(appState, &genesisState)
 | 
				
			||||||
	if err != nil {
 | 
						require.NoError(t, err)
 | 
				
			||||||
		panic(err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctxB := newApp.NewContext(true, abci.Header{})
 | 
						ctxB := newApp.NewContext(true, abci.Header{Height: app.LastBlockHeight()})
 | 
				
			||||||
	newApp.mm.InitGenesis(ctxB, genesisState)
 | 
						newApp.mm.InitGenesis(ctxB, genesisState)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fmt.Printf("Comparing stores...\n")
 | 
						fmt.Printf("comparing stores...\n")
 | 
				
			||||||
	ctxA := app.NewContext(true, abci.Header{})
 | 
						ctxA := app.NewContext(true, abci.Header{Height: app.LastBlockHeight()})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	type StoreKeysPrefixes struct {
 | 
						type StoreKeysPrefixes struct {
 | 
				
			||||||
		A        sdk.StoreKey
 | 
							A        sdk.StoreKey
 | 
				
			||||||
@ -521,38 +460,45 @@ func TestAppImportExport(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	storeKeysPrefixes := []StoreKeysPrefixes{
 | 
						storeKeysPrefixes := []StoreKeysPrefixes{
 | 
				
			||||||
		{app.keyMain, newApp.keyMain, [][]byte{}},
 | 
							{app.keys[baseapp.MainStoreKey], newApp.keys[baseapp.MainStoreKey], [][]byte{}},
 | 
				
			||||||
		{app.keyAccount, newApp.keyAccount, [][]byte{}},
 | 
							{app.keys[auth.StoreKey], newApp.keys[auth.StoreKey], [][]byte{}},
 | 
				
			||||||
		{app.keyStaking, newApp.keyStaking, [][]byte{staking.UnbondingQueueKey,
 | 
							{app.keys[staking.StoreKey], newApp.keys[staking.StoreKey],
 | 
				
			||||||
			staking.RedelegationQueueKey, staking.ValidatorQueueKey}}, // ordering may change but it doesn't matter
 | 
								[][]byte{
 | 
				
			||||||
		{app.keySlashing, newApp.keySlashing, [][]byte{}},
 | 
									staking.UnbondingQueueKey, staking.RedelegationQueueKey, staking.ValidatorQueueKey,
 | 
				
			||||||
		{app.keyMint, newApp.keyMint, [][]byte{}},
 | 
								}}, // ordering may change but it doesn't matter
 | 
				
			||||||
		{app.keyDistr, newApp.keyDistr, [][]byte{}},
 | 
							{app.keys[slashing.StoreKey], newApp.keys[slashing.StoreKey], [][]byte{}},
 | 
				
			||||||
		{app.keySupply, newApp.keySupply, [][]byte{}},
 | 
							{app.keys[mint.StoreKey], newApp.keys[mint.StoreKey], [][]byte{}},
 | 
				
			||||||
		{app.keyParams, newApp.keyParams, [][]byte{}},
 | 
							{app.keys[distr.StoreKey], newApp.keys[distr.StoreKey], [][]byte{}},
 | 
				
			||||||
		{app.keyGov, newApp.keyGov, [][]byte{}},
 | 
							{app.keys[supply.StoreKey], newApp.keys[supply.StoreKey], [][]byte{}},
 | 
				
			||||||
 | 
							{app.keys[params.StoreKey], newApp.keys[params.StoreKey], [][]byte{}},
 | 
				
			||||||
 | 
							{app.keys[gov.StoreKey], newApp.keys[gov.StoreKey], [][]byte{}},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, storeKeysPrefix := range storeKeysPrefixes {
 | 
						for _, storeKeysPrefix := range storeKeysPrefixes {
 | 
				
			||||||
		storeKeyA := storeKeysPrefix.A
 | 
							storeKeyA := storeKeysPrefix.A
 | 
				
			||||||
		storeKeyB := storeKeysPrefix.B
 | 
							storeKeyB := storeKeysPrefix.B
 | 
				
			||||||
		prefixes := storeKeysPrefix.Prefixes
 | 
							prefixes := storeKeysPrefix.Prefixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		storeA := ctxA.KVStore(storeKeyA)
 | 
							storeA := ctxA.KVStore(storeKeyA)
 | 
				
			||||||
		storeB := ctxB.KVStore(storeKeyB)
 | 
							storeB := ctxB.KVStore(storeKeyB)
 | 
				
			||||||
		kvA, kvB, count, equal := sdk.DiffKVStores(storeA, storeB, prefixes)
 | 
					 | 
				
			||||||
		fmt.Printf("Compared %d key/value pairs between %s and %s\n", count, storeKeyA, storeKeyB)
 | 
					 | 
				
			||||||
		require.True(t, equal, simapp.GetSimulationLog(storeKeyA.Name(), app.cdc, newApp.cdc, kvA, kvB))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							failedKVAs, failedKVBs := sdk.DiffKVStores(storeA, storeB, prefixes)
 | 
				
			||||||
 | 
							require.Equal(t, len(failedKVAs), len(failedKVBs), "unequal sets of key-values to compare")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fmt.Printf("compared %d key/value pairs between %s and %s\n", len(failedKVAs), storeKeyA, storeKeyB)
 | 
				
			||||||
 | 
							require.Len(t, failedKVAs, 0, simapp.GetSimulationLog(storeKeyA.Name(), app.sm.StoreDecoders, app.cdc, failedKVAs, failedKVBs))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestAppSimulationAfterImport(t *testing.T) {
 | 
					func TestAppSimulationAfterImport(t *testing.T) {
 | 
				
			||||||
	if !enabled {
 | 
						if !simapp.FlagEnabledValue {
 | 
				
			||||||
		t.Skip("Skipping application simulation after import")
 | 
							t.Skip("skipping application simulation after import")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var logger log.Logger
 | 
						var logger log.Logger
 | 
				
			||||||
	if verbose {
 | 
						config := simapp.NewConfigFromFlags()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if simapp.FlagVerboseValue {
 | 
				
			||||||
		logger = log.TestingLogger()
 | 
							logger = log.TestingLogger()
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		logger = log.NewNopLogger()
 | 
							logger = log.NewNopLogger()
 | 
				
			||||||
@ -563,25 +509,40 @@ func TestAppSimulationAfterImport(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		db.Close()
 | 
							db.Close()
 | 
				
			||||||
		os.RemoveAll(dir)
 | 
							_ = os.RemoveAll(dir)
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	app := NewApp(logger, db, nil, true, 0, fauxMerkleModeOpt)
 | 
						app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, fauxMerkleModeOpt)
 | 
				
			||||||
	require.Equal(t, "kava", app.Name())
 | 
						require.Equal(t, "GaiaApp", app.Name())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Run randomized simulation
 | 
						// Run randomized simulation
 | 
				
			||||||
	stopEarly, err := simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, app))
 | 
						// Run randomized simulation
 | 
				
			||||||
 | 
						stopEarly, simParams, simErr := simulation.SimulateFromSeed(
 | 
				
			||||||
 | 
							t, os.Stdout, app.BaseApp, simapp.AppStateFn(app.Codec(), app.sm),
 | 
				
			||||||
 | 
							testAndRunTxs(app, config), app.ModuleAccountAddrs(), config,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if commit {
 | 
						// export state and params before the simulation error is checked
 | 
				
			||||||
 | 
						if config.ExportStatePath != "" {
 | 
				
			||||||
 | 
							err := ExportStateToJSON(app, config.ExportStatePath)
 | 
				
			||||||
 | 
							require.NoError(t, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if config.ExportParamsPath != "" {
 | 
				
			||||||
 | 
							err := simapp.ExportParamsToJSON(simParams, config.ExportParamsPath)
 | 
				
			||||||
 | 
							require.NoError(t, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						require.NoError(t, simErr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if config.Commit {
 | 
				
			||||||
		// for memdb:
 | 
							// for memdb:
 | 
				
			||||||
		// fmt.Println("Database Size", db.Stats()["database.size"])
 | 
							// fmt.Println("Database Size", db.Stats()["database.size"])
 | 
				
			||||||
		fmt.Println("GoLevelDB Stats")
 | 
							fmt.Println("\nGoLevelDB Stats")
 | 
				
			||||||
		fmt.Println(db.Stats()["leveldb.stats"])
 | 
							fmt.Println(db.Stats()["leveldb.stats"])
 | 
				
			||||||
		fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
 | 
							fmt.Println("GoLevelDB cached block size", db.Stats()["leveldb.cachedblock"])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	require.Nil(t, err)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if stopEarly {
 | 
						if stopEarly {
 | 
				
			||||||
		// we can't export or import a zero-validator genesis
 | 
							// we can't export or import a zero-validator genesis
 | 
				
			||||||
		fmt.Printf("We can't export or import a zero-validator genesis, exiting test...\n")
 | 
							fmt.Printf("We can't export or import a zero-validator genesis, exiting test...\n")
 | 
				
			||||||
@ -602,64 +563,80 @@ func TestAppSimulationAfterImport(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		newDB.Close()
 | 
							newDB.Close()
 | 
				
			||||||
		os.RemoveAll(newDir)
 | 
							_ = os.RemoveAll(newDir)
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	newApp := NewApp(log.NewNopLogger(), newDB, nil, true, 0, fauxMerkleModeOpt)
 | 
						newApp := NewApp(log.NewNopLogger(), newDB, nil, true, 0, fauxMerkleModeOpt)
 | 
				
			||||||
	require.Equal(t, "kava", newApp.Name())
 | 
						require.Equal(t, "GaiaApp", newApp.Name())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	newApp.InitChain(abci.RequestInitChain{
 | 
						newApp.InitChain(abci.RequestInitChain{
 | 
				
			||||||
		AppStateBytes: appState,
 | 
							AppStateBytes: appState,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Run randomized simulation on imported app
 | 
						// Run randomized simulation on imported app
 | 
				
			||||||
	_, err = simulation.SimulateFromSeed(getSimulateFromSeedInput(t, os.Stdout, newApp))
 | 
						_, _, err = simulation.SimulateFromSeed(
 | 
				
			||||||
	require.Nil(t, err)
 | 
							t, os.Stdout, newApp.BaseApp, simapp.AppStateFn(app.Codec(), app.sm),
 | 
				
			||||||
 | 
							testAndRunTxs(newApp, config), newApp.ModuleAccountAddrs(), config,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						require.NoError(t, err)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO: Make another test for the fuzzer itself, which just has noOp txs
 | 
					// TODO: Make another test for the fuzzer itself, which just has noOp txs
 | 
				
			||||||
// and doesn't depend on the application.
 | 
					// and doesn't depend on the application.
 | 
				
			||||||
func TestAppStateDeterminism(t *testing.T) {
 | 
					func TestAppStateDeterminism(t *testing.T) {
 | 
				
			||||||
	if !enabled {
 | 
						if !simapp.FlagEnabledValue {
 | 
				
			||||||
		t.Skip("Skipping application simulation")
 | 
							t.Skip("skipping application simulation")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config := simapp.NewConfigFromFlags()
 | 
				
			||||||
 | 
						config.InitialBlockHeight = 1
 | 
				
			||||||
 | 
						config.ExportParamsPath = ""
 | 
				
			||||||
 | 
						config.OnOperation = false
 | 
				
			||||||
 | 
						config.AllInvariants = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	numSeeds := 3
 | 
						numSeeds := 3
 | 
				
			||||||
	numTimesToRunPerSeed := 5
 | 
						numTimesToRunPerSeed := 5
 | 
				
			||||||
	appHashList := make([]json.RawMessage, numTimesToRunPerSeed)
 | 
						appHashList := make([]json.RawMessage, numTimesToRunPerSeed)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for i := 0; i < numSeeds; i++ {
 | 
						for i := 0; i < numSeeds; i++ {
 | 
				
			||||||
		seed := rand.Int63()
 | 
							config.Seed = rand.Int63()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for j := 0; j < numTimesToRunPerSeed; j++ {
 | 
							for j := 0; j < numTimesToRunPerSeed; j++ {
 | 
				
			||||||
			logger := log.NewNopLogger()
 | 
								logger := log.NewNopLogger()
 | 
				
			||||||
			db := dbm.NewMemDB()
 | 
								db := dbm.NewMemDB()
 | 
				
			||||||
			app := NewApp(logger, db, nil, true, 0)
 | 
								app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, interBlockCacheOpt())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// run randomized simulation
 | 
								fmt.Printf(
 | 
				
			||||||
			simulation.SimulateFromSeed(
 | 
									"running non-determinism simulation; seed %d: %d/%d, attempt: %d/%d\n",
 | 
				
			||||||
				t, os.Stdout, app.BaseApp, appStateFn, seed,
 | 
									config.Seed, i+1, numSeeds, j+1, numTimesToRunPerSeed,
 | 
				
			||||||
				testAndRunTxs(app),
 | 
					 | 
				
			||||||
				[]sdk.Invariant{},
 | 
					 | 
				
			||||||
				50,
 | 
					 | 
				
			||||||
				100,
 | 
					 | 
				
			||||||
				true,
 | 
					 | 
				
			||||||
				false,
 | 
					 | 
				
			||||||
				false,
 | 
					 | 
				
			||||||
				false,
 | 
					 | 
				
			||||||
				app.ModuleAccountAddrs(),
 | 
					 | 
				
			||||||
			)
 | 
								)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								_, _, err := simulation.SimulateFromSeed(
 | 
				
			||||||
 | 
									t, os.Stdout, app.BaseApp, simapp.AppStateFn(app.Codec(), app.sm),
 | 
				
			||||||
 | 
									testAndRunTxs(app, config), app.ModuleAccountAddrs(), config,
 | 
				
			||||||
 | 
								)
 | 
				
			||||||
 | 
								require.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			appHash := app.LastCommitID().Hash
 | 
								appHash := app.LastCommitID().Hash
 | 
				
			||||||
			appHashList[j] = appHash
 | 
								appHashList[j] = appHash
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for k := 1; k < numTimesToRunPerSeed; k++ {
 | 
								if j != 0 {
 | 
				
			||||||
			require.Equal(t, appHashList[0], appHashList[k], "appHash list: %v", appHashList)
 | 
									require.Equal(
 | 
				
			||||||
 | 
										t, appHashList[0], appHashList[j],
 | 
				
			||||||
 | 
										"non-determinism in seed %d: %d/%d, attempt: %d/%d\n", config.Seed, i+1, numSeeds, j+1, numTimesToRunPerSeed,
 | 
				
			||||||
 | 
									)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func BenchmarkInvariants(b *testing.B) {
 | 
					func BenchmarkInvariants(b *testing.B) {
 | 
				
			||||||
	logger := log.NewNopLogger()
 | 
						logger := log.NewNopLogger()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config := simapp.NewConfigFromFlags()
 | 
				
			||||||
 | 
						config.AllInvariants = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dir, _ := ioutil.TempDir("", "goleveldb-app-invariant-bench")
 | 
						dir, _ := ioutil.TempDir("", "goleveldb-app-invariant-bench")
 | 
				
			||||||
	db, _ := sdk.NewLevelDB("simulation", dir)
 | 
						db, _ := sdk.NewLevelDB("simulation", dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -668,16 +645,31 @@ func BenchmarkInvariants(b *testing.B) {
 | 
				
			|||||||
		os.RemoveAll(dir)
 | 
							os.RemoveAll(dir)
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	app := NewApp(logger, db, nil, true, 0)
 | 
						app := NewApp(logger, db, nil, true, simapp.FlagPeriodValue, interBlockCacheOpt())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 2. Run parameterized simulation (w/o invariants)
 | 
						// 2. Run parameterized simulation (w/o invariants)
 | 
				
			||||||
	_, err := simulation.SimulateFromSeed(
 | 
						_, simParams, simErr := simulation.SimulateFromSeed(
 | 
				
			||||||
		b, ioutil.Discard, app.BaseApp, appStateFn, seed, testAndRunTxs(app),
 | 
							b, ioutil.Discard, app.BaseApp, simapp.AppStateFn(app.Codec(), app.sm),
 | 
				
			||||||
		[]sdk.Invariant{}, numBlocks, blockSize, commit, lean, onOperation, false,
 | 
							testAndRunTxs(app, config), app.ModuleAccountAddrs(), config,
 | 
				
			||||||
		app.ModuleAccountAddrs(),
 | 
					 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
	if err != nil {
 | 
					
 | 
				
			||||||
 | 
						// export state and params before the simulation error is checked
 | 
				
			||||||
 | 
						if config.ExportStatePath != "" {
 | 
				
			||||||
 | 
							if err := ExportStateToJSON(app, config.ExportStatePath); err != nil {
 | 
				
			||||||
			fmt.Println(err)
 | 
								fmt.Println(err)
 | 
				
			||||||
 | 
								b.Fail()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if config.ExportParamsPath != "" {
 | 
				
			||||||
 | 
							if err := simapp.ExportParamsToJSON(simParams, config.ExportParamsPath); err != nil {
 | 
				
			||||||
 | 
								fmt.Println(err)
 | 
				
			||||||
 | 
								b.Fail()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if simErr != nil {
 | 
				
			||||||
 | 
							fmt.Println(simErr)
 | 
				
			||||||
		b.FailNow()
 | 
							b.FailNow()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -690,7 +682,7 @@ func BenchmarkInvariants(b *testing.B) {
 | 
				
			|||||||
	for _, cr := range app.crisisKeeper.Routes() {
 | 
						for _, cr := range app.crisisKeeper.Routes() {
 | 
				
			||||||
		b.Run(fmt.Sprintf("%s/%s", cr.ModuleName, cr.Route), func(b *testing.B) {
 | 
							b.Run(fmt.Sprintf("%s/%s", cr.ModuleName, cr.Route), func(b *testing.B) {
 | 
				
			||||||
			if res, stop := cr.Invar(ctx); stop {
 | 
								if res, stop := cr.Invar(ctx); stop {
 | 
				
			||||||
				fmt.Printf("broken invariant at block %d of %d\n%s", ctx.BlockHeight()-1, numBlocks, res)
 | 
									fmt.Printf("broken invariant at block %d of %d\n%s", ctx.BlockHeight()-1, config.NumBlocks, res)
 | 
				
			||||||
				b.FailNow()
 | 
									b.FailNow()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										17
									
								
								app/utils.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								app/utils.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					package app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ExportStateToJSON util function to export the app state to JSON
 | 
				
			||||||
 | 
					func ExportStateToJSON(app *App, path string) error {
 | 
				
			||||||
 | 
						fmt.Println("exporting app state...")
 | 
				
			||||||
 | 
						appState, _, err := app.ExportAppStateAndValidators(false, nil)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ioutil.WriteFile(path, []byte(appState), 0644)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user