2019-06-20 13:37:57 +00:00
package app
import (
"io"
"os"
2019-11-29 10:55:10 +00:00
"github.com/kava-labs/kava/x/auction"
"github.com/kava-labs/kava/x/cdp"
"github.com/kava-labs/kava/x/pricefeed"
2019-10-02 13:10:28 +00:00
validatorvesting "github.com/kava-labs/kava/x/validator-vesting"
2019-06-20 13:37:57 +00:00
abci "github.com/tendermint/tendermint/abci/types"
cmn "github.com/tendermint/tendermint/libs/common"
"github.com/tendermint/tendermint/libs/log"
2019-09-11 22:33:20 +00:00
dbm "github.com/tendermint/tm-db"
2019-06-20 13:37:57 +00:00
bam "github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
2019-07-18 17:36:31 +00:00
"github.com/cosmos/cosmos-sdk/types/module"
"github.com/cosmos/cosmos-sdk/version"
2019-06-20 13:37:57 +00:00
"github.com/cosmos/cosmos-sdk/x/auth"
2019-10-04 17:55:49 +00:00
"github.com/cosmos/cosmos-sdk/x/auth/vesting"
2019-06-20 13:37:57 +00:00
"github.com/cosmos/cosmos-sdk/x/bank"
"github.com/cosmos/cosmos-sdk/x/crisis"
distr "github.com/cosmos/cosmos-sdk/x/distribution"
2019-07-18 17:36:31 +00:00
"github.com/cosmos/cosmos-sdk/x/genutil"
2019-06-20 13:37:57 +00:00
"github.com/cosmos/cosmos-sdk/x/gov"
"github.com/cosmos/cosmos-sdk/x/mint"
"github.com/cosmos/cosmos-sdk/x/params"
2019-07-18 17:36:31 +00:00
paramsclient "github.com/cosmos/cosmos-sdk/x/params/client"
2019-06-20 13:37:57 +00:00
"github.com/cosmos/cosmos-sdk/x/slashing"
"github.com/cosmos/cosmos-sdk/x/staking"
2019-07-18 17:36:31 +00:00
"github.com/cosmos/cosmos-sdk/x/supply"
2019-06-20 13:37:57 +00:00
)
const (
2019-07-18 17:36:31 +00:00
appName = "kava"
2019-07-02 20:06:16 +00:00
Bech32MainPrefix = "kava"
2020-02-13 00:49:32 +00:00
Bip44CoinType = 459 // see https://github.com/satoshilabs/slips/blob/master/slip-0044.md
2019-06-20 13:37:57 +00:00
)
var (
2019-07-18 17:36:31 +00:00
// default home directories for expected binaries
2019-06-20 17:08:58 +00:00
DefaultCLIHome = os . ExpandEnv ( "$HOME/.kvcli" )
DefaultNodeHome = os . ExpandEnv ( "$HOME/.kvd" )
2019-07-18 17:36:31 +00:00
2019-07-19 14:06:33 +00:00
// ModuleBasics manages simple versions of full app modules. It's used for things such as codec registration and genesis file verification.
2019-07-18 17:36:31 +00:00
ModuleBasics = module . NewBasicManager (
genutil . AppModuleBasic { } ,
auth . AppModuleBasic { } ,
2019-10-02 13:10:28 +00:00
validatorvesting . AppModuleBasic { } ,
2019-07-18 17:36:31 +00:00
bank . AppModuleBasic { } ,
staking . AppModuleBasic { } ,
mint . AppModuleBasic { } ,
distr . AppModuleBasic { } ,
2019-09-11 22:33:20 +00:00
gov . NewAppModuleBasic ( paramsclient . ProposalHandler , distr . ProposalHandler ) ,
2019-07-18 17:36:31 +00:00
params . AppModuleBasic { } ,
crisis . AppModuleBasic { } ,
slashing . AppModuleBasic { } ,
supply . AppModuleBasic { } ,
2019-11-29 10:55:10 +00:00
auction . AppModuleBasic { } ,
cdp . AppModuleBasic { } ,
pricefeed . AppModuleBasic { } ,
2019-07-18 17:36:31 +00:00
)
2019-09-11 22:33:20 +00:00
// module account permissions
mAccPerms = map [ string ] [ ] string {
2019-10-02 13:10:28 +00:00
auth . FeeCollectorName : nil ,
distr . ModuleName : nil ,
mint . ModuleName : { supply . Minter } ,
staking . BondedPoolName : { supply . Burner , supply . Staking } ,
staking . NotBondedPoolName : { supply . Burner , supply . Staking } ,
gov . ModuleName : { supply . Burner } ,
validatorvesting . ModuleName : { supply . Burner } ,
2020-01-12 15:12:22 +00:00
auction . ModuleName : nil ,
2020-01-12 15:35:34 +00:00
cdp . ModuleName : { supply . Minter , supply . Burner } ,
cdp . LiquidatorMacc : { supply . Minter , supply . Burner } ,
2019-09-11 22:33:20 +00:00
}
)
2019-07-18 17:36:31 +00:00
2019-06-20 13:37:57 +00:00
// Extended ABCI application
2019-06-20 17:02:29 +00:00
type App struct {
2019-06-20 13:37:57 +00:00
* bam . BaseApp
cdc * codec . Codec
invCheckPeriod uint
// keys to access the substores
2019-09-11 22:33:20 +00:00
keys map [ string ] * sdk . KVStoreKey
tkeys map [ string ] * sdk . TransientStoreKey
2019-06-20 13:37:57 +00:00
2019-07-26 12:11:23 +00:00
// keepers from all the modules
2020-01-12 15:35:34 +00:00
accountKeeper auth . AccountKeeper
bankKeeper bank . Keeper
supplyKeeper supply . Keeper
stakingKeeper staking . Keeper
slashingKeeper slashing . Keeper
mintKeeper mint . Keeper
distrKeeper distr . Keeper
govKeeper gov . Keeper
crisisKeeper crisis . Keeper
paramsKeeper params . Keeper
vvKeeper validatorvesting . Keeper
auctionKeeper auction . Keeper
cdpKeeper cdp . Keeper
pricefeedKeeper pricefeed . Keeper
2019-07-18 17:36:31 +00:00
// the module manager
mm * module . Manager
2019-09-11 22:33:20 +00:00
// simulation manager
sm * module . SimulationManager
2019-06-20 13:37:57 +00:00
}
2019-06-20 17:02:29 +00:00
// NewApp returns a reference to an initialized App.
func NewApp ( logger log . Logger , db dbm . DB , traceStore io . Writer , loadLatest bool ,
2019-06-20 13:37:57 +00:00
invCheckPeriod uint ,
2019-06-20 17:02:29 +00:00
baseAppOptions ... func ( * bam . BaseApp ) ) * App {
2019-06-20 13:37:57 +00:00
cdc := MakeCodec ( )
bApp := bam . NewBaseApp ( appName , logger , db , auth . DefaultTxDecoder ( cdc ) , baseAppOptions ... )
bApp . SetCommitMultiStoreTracer ( traceStore )
2019-07-18 17:36:31 +00:00
bApp . SetAppVersion ( version . Version )
2019-06-20 13:37:57 +00:00
2019-09-11 22:33:20 +00:00
keys := sdk . NewKVStoreKeys (
bam . MainStoreKey , auth . StoreKey , staking . StoreKey ,
supply . StoreKey , mint . StoreKey , distr . StoreKey , slashing . StoreKey ,
2019-10-02 13:10:28 +00:00
gov . StoreKey , params . StoreKey , validatorvesting . StoreKey ,
2020-01-12 15:35:34 +00:00
auction . StoreKey , cdp . StoreKey , pricefeed . StoreKey ,
2019-09-11 22:33:20 +00:00
)
2019-09-25 19:00:44 +00:00
tkeys := sdk . NewTransientStoreKeys ( params . TStoreKey )
2019-09-11 22:33:20 +00:00
2019-06-20 17:02:29 +00:00
var app = & App {
2019-07-18 17:36:31 +00:00
BaseApp : bApp ,
cdc : cdc ,
invCheckPeriod : invCheckPeriod ,
2019-09-11 22:33:20 +00:00
keys : keys ,
tkeys : tkeys ,
2019-06-20 13:37:57 +00:00
}
2019-07-18 17:36:31 +00:00
// init params keeper and subspaces
2019-09-11 22:33:20 +00:00
app . paramsKeeper = params . NewKeeper ( app . cdc , keys [ params . StoreKey ] , tkeys [ params . TStoreKey ] , params . DefaultCodespace )
2019-07-18 17:36:31 +00:00
authSubspace := app . paramsKeeper . Subspace ( auth . DefaultParamspace )
bankSubspace := app . paramsKeeper . Subspace ( bank . DefaultParamspace )
stakingSubspace := app . paramsKeeper . Subspace ( staking . DefaultParamspace )
mintSubspace := app . paramsKeeper . Subspace ( mint . DefaultParamspace )
distrSubspace := app . paramsKeeper . Subspace ( distr . DefaultParamspace )
slashingSubspace := app . paramsKeeper . Subspace ( slashing . DefaultParamspace )
2019-09-11 22:33:20 +00:00
govSubspace := app . paramsKeeper . Subspace ( gov . DefaultParamspace ) . WithKeyTable ( gov . ParamKeyTable ( ) )
2019-07-18 17:36:31 +00:00
crisisSubspace := app . paramsKeeper . Subspace ( crisis . DefaultParamspace )
2019-11-29 10:55:10 +00:00
auctionSubspace := app . paramsKeeper . Subspace ( auction . DefaultParamspace )
cdpSubspace := app . paramsKeeper . Subspace ( cdp . DefaultParamspace )
2019-12-05 15:56:24 +00:00
pricefeedSubspace := app . paramsKeeper . Subspace ( pricefeed . DefaultParamspace )
2019-07-18 17:36:31 +00:00
// add keepers
2019-06-20 13:37:57 +00:00
app . accountKeeper = auth . NewAccountKeeper (
app . cdc ,
2019-09-11 22:33:20 +00:00
keys [ auth . StoreKey ] ,
2019-07-18 17:36:31 +00:00
authSubspace ,
auth . ProtoBaseAccount )
2019-06-20 13:37:57 +00:00
app . bankKeeper = bank . NewBaseKeeper (
app . accountKeeper ,
2019-07-18 17:36:31 +00:00
bankSubspace ,
2019-09-11 22:33:20 +00:00
bank . DefaultCodespace ,
app . ModuleAccountAddrs ( ) )
2019-07-18 17:36:31 +00:00
app . supplyKeeper = supply . NewKeeper (
2019-06-20 13:37:57 +00:00
app . cdc ,
2019-09-11 22:33:20 +00:00
keys [ supply . StoreKey ] ,
2019-07-18 17:36:31 +00:00
app . accountKeeper ,
app . bankKeeper ,
mAccPerms )
2019-06-20 13:37:57 +00:00
stakingKeeper := staking . NewKeeper (
app . cdc ,
2019-09-11 22:33:20 +00:00
keys [ staking . StoreKey ] ,
2019-07-18 17:36:31 +00:00
app . supplyKeeper ,
stakingSubspace ,
staking . DefaultCodespace )
app . mintKeeper = mint . NewKeeper (
app . cdc ,
2019-09-11 22:33:20 +00:00
keys [ mint . StoreKey ] ,
2019-07-18 17:36:31 +00:00
mintSubspace ,
& stakingKeeper ,
app . supplyKeeper ,
auth . FeeCollectorName )
2019-06-20 13:37:57 +00:00
app . distrKeeper = distr . NewKeeper (
app . cdc ,
2019-09-11 22:33:20 +00:00
keys [ distr . StoreKey ] ,
2019-07-18 17:36:31 +00:00
distrSubspace ,
& stakingKeeper ,
app . supplyKeeper ,
2019-06-20 13:37:57 +00:00
distr . DefaultCodespace ,
2019-09-11 22:33:20 +00:00
auth . FeeCollectorName ,
app . ModuleAccountAddrs ( ) )
2019-06-20 13:37:57 +00:00
app . slashingKeeper = slashing . NewKeeper (
app . cdc ,
2019-09-11 22:33:20 +00:00
keys [ slashing . StoreKey ] ,
2019-07-18 17:36:31 +00:00
& stakingKeeper ,
slashingSubspace ,
slashing . DefaultCodespace )
app . crisisKeeper = crisis . NewKeeper (
crisisSubspace ,
invCheckPeriod ,
app . supplyKeeper ,
auth . FeeCollectorName )
govRouter := gov . NewRouter ( )
govRouter .
AddRoute ( gov . RouterKey , gov . ProposalHandler ) .
AddRoute ( params . RouterKey , params . NewParamChangeProposalHandler ( app . paramsKeeper ) ) .
AddRoute ( distr . RouterKey , distr . NewCommunityPoolSpendProposalHandler ( app . distrKeeper ) )
2019-06-20 13:37:57 +00:00
app . govKeeper = gov . NewKeeper (
app . cdc ,
2019-09-11 22:33:20 +00:00
keys [ gov . StoreKey ] ,
2019-07-18 17:36:31 +00:00
govSubspace ,
app . supplyKeeper ,
& stakingKeeper ,
2019-06-20 13:37:57 +00:00
gov . DefaultCodespace ,
2019-07-18 17:36:31 +00:00
govRouter )
2019-10-02 13:10:28 +00:00
app . vvKeeper = validatorvesting . NewKeeper (
app . cdc ,
keys [ validatorvesting . StoreKey ] ,
app . accountKeeper ,
app . bankKeeper ,
app . supplyKeeper ,
& stakingKeeper )
2019-11-29 10:55:10 +00:00
app . pricefeedKeeper = pricefeed . NewKeeper (
app . cdc ,
keys [ pricefeed . StoreKey ] ,
pricefeedSubspace ,
pricefeed . DefaultCodespace )
2020-01-12 15:35:34 +00:00
// NewKeeper(cdc *codec.Codec, key sdk.StoreKey, paramstore subspace.Subspace, pfk types.PricefeedKeeper, sk types.SupplyKeeper, codespace sdk.CodespaceType)
2020-01-15 14:19:33 +00:00
app . auctionKeeper = auction . NewKeeper (
app . cdc ,
keys [ auction . StoreKey ] ,
app . supplyKeeper ,
auctionSubspace )
2019-11-29 10:55:10 +00:00
app . cdpKeeper = cdp . NewKeeper (
app . cdc ,
keys [ cdp . StoreKey ] ,
cdpSubspace ,
app . pricefeedKeeper ,
2020-01-15 14:19:33 +00:00
app . auctionKeeper ,
2020-01-12 15:35:34 +00:00
app . supplyKeeper ,
cdp . DefaultCodespace )
2019-06-20 13:37:57 +00:00
// register the staking hooks
2019-07-18 17:36:31 +00:00
// NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks
2019-06-20 13:37:57 +00:00
app . stakingKeeper = * stakingKeeper . SetHooks (
2019-07-18 17:36:31 +00:00
staking . NewMultiStakingHooks ( app . distrKeeper . Hooks ( ) , app . slashingKeeper . Hooks ( ) ) )
2019-09-11 22:33:20 +00:00
// create the module manager (Note: Any module instantiated in the module manager that is later modified
// must be passed by reference here.)
2019-07-18 17:36:31 +00:00
app . mm = module . NewManager (
genutil . NewAppModule ( app . accountKeeper , app . stakingKeeper , app . BaseApp . DeliverTx ) ,
auth . NewAppModule ( app . accountKeeper ) ,
bank . NewAppModule ( app . bankKeeper , app . accountKeeper ) ,
2019-09-11 22:33:20 +00:00
crisis . NewAppModule ( & app . crisisKeeper ) ,
2019-07-18 17:36:31 +00:00
supply . NewAppModule ( app . supplyKeeper , app . accountKeeper ) ,
distr . NewAppModule ( app . distrKeeper , app . supplyKeeper ) ,
gov . NewAppModule ( app . govKeeper , app . supplyKeeper ) ,
mint . NewAppModule ( app . mintKeeper ) ,
slashing . NewAppModule ( app . slashingKeeper , app . stakingKeeper ) ,
2019-09-11 22:33:20 +00:00
staking . NewAppModule ( app . stakingKeeper , app . accountKeeper , app . supplyKeeper ) ,
2019-10-02 13:10:28 +00:00
validatorvesting . NewAppModule ( app . vvKeeper , app . accountKeeper ) ,
2020-01-14 14:00:37 +00:00
auction . NewAppModule ( app . auctionKeeper , app . supplyKeeper ) ,
2019-11-29 10:55:10 +00:00
cdp . NewAppModule ( app . cdpKeeper , app . pricefeedKeeper ) ,
pricefeed . NewAppModule ( app . pricefeedKeeper ) ,
2019-06-20 13:37:57 +00:00
)
2019-07-18 17:36:31 +00:00
// During begin block slashing happens after distr.BeginBlocker so that
// there is nothing left over in the validator fee pool, so as to keep the
// CanWithdrawInvariant invariant.
2020-02-28 22:16:22 +00:00
// Auction.BeginBlocker will close out expired auctions and pay debt back to cdp. So it should be run before cdp.BeginBlocker which cancels out debt with stable and starts more auctions.
app . mm . SetOrderBeginBlockers ( mint . ModuleName , distr . ModuleName , slashing . ModuleName , validatorvesting . ModuleName , auction . ModuleName , cdp . ModuleName )
2019-07-18 17:36:31 +00:00
2020-02-28 22:16:22 +00:00
app . mm . SetOrderEndBlockers ( crisis . ModuleName , gov . ModuleName , staking . ModuleName , pricefeed . ModuleName )
2019-07-18 17:36:31 +00:00
2019-09-27 18:05:21 +00:00
// Note: genutils must occur after staking so that pools are properly
2019-07-18 17:36:31 +00:00
// initialized with tokens from genesis accounts.
2019-09-27 18:05:21 +00:00
//
// Note: Changing the order of the auth module and modules that use module accounts
// results in subtle changes to the way accounts are loaded from genesis.
2019-09-25 19:50:03 +00:00
app . mm . SetOrderInitGenesis (
2019-10-02 13:10:28 +00:00
auth . ModuleName , validatorvesting . ModuleName , distr . ModuleName ,
2019-09-25 19:50:03 +00:00
staking . ModuleName , bank . ModuleName , slashing . ModuleName ,
gov . ModuleName , mint . ModuleName , supply . ModuleName , crisis . ModuleName , genutil . ModuleName ,
2020-01-12 15:35:34 +00:00
pricefeed . ModuleName , cdp . ModuleName , auction . ModuleName , // TODO is this order ok?
2019-09-25 19:50:03 +00:00
)
2019-07-18 17:36:31 +00:00
app . mm . RegisterInvariants ( & app . crisisKeeper )
app . mm . RegisterRoutes ( app . Router ( ) , app . QueryRouter ( ) )
2019-09-11 22:33:20 +00:00
// 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 (
auth . NewAppModule ( app . accountKeeper ) ,
2019-10-02 13:10:28 +00:00
validatorvesting . NewAppModule ( app . vvKeeper , app . accountKeeper ) ,
2019-09-11 22:33:20 +00:00
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 ) ,
2020-02-25 15:11:09 +00:00
cdp . NewAppModule ( app . cdpKeeper , app . pricefeedKeeper ) , // TODO how is the order be decided here? Is this order correct?
pricefeed . NewAppModule ( app . pricefeedKeeper ) ,
auction . NewAppModule ( app . auctionKeeper , app . supplyKeeper ) ,
2019-09-11 22:33:20 +00:00
)
app . sm . RegisterStoreDecoders ( )
// initialize stores
app . MountKVStores ( keys )
app . MountTransientStores ( tkeys )
2019-07-18 17:36:31 +00:00
// initialize the app
app . SetInitChainer ( app . InitChainer )
2019-06-20 13:37:57 +00:00
app . SetBeginBlocker ( app . BeginBlocker )
2019-07-18 17:36:31 +00:00
app . SetAnteHandler ( auth . NewAnteHandler ( app . accountKeeper , app . supplyKeeper , auth . DefaultSigVerificationGasConsumer ) )
2019-06-20 13:37:57 +00:00
app . SetEndBlocker ( app . EndBlocker )
2019-07-18 17:36:31 +00:00
// load store
2019-06-20 13:37:57 +00:00
if loadLatest {
2019-09-11 22:33:20 +00:00
err := app . LoadLatestVersion ( app . keys [ bam . MainStoreKey ] )
2019-06-20 13:37:57 +00:00
if err != nil {
cmn . Exit ( err . Error ( ) )
}
}
return app
}
// custom tx codec
func MakeCodec ( ) * codec . Codec {
var cdc = codec . New ( )
2019-09-11 22:33:20 +00:00
2019-07-18 17:36:31 +00:00
ModuleBasics . RegisterCodec ( cdc )
2019-10-04 17:55:49 +00:00
vesting . RegisterCodec ( cdc )
2019-06-20 13:37:57 +00:00
sdk . RegisterCodec ( cdc )
codec . RegisterCrypto ( cdc )
2019-09-11 22:33:20 +00:00
codec . RegisterEvidences ( cdc )
return cdc . Seal ( )
2019-06-20 13:37:57 +00:00
}
2020-02-13 00:49:32 +00:00
// SetBech32AddressPrefixes sets the global prefix to be used when serializing addresses to bech32 strings.
2019-06-25 13:29:56 +00:00
func SetBech32AddressPrefixes ( config * sdk . Config ) {
config . SetBech32PrefixForAccount ( Bech32MainPrefix , Bech32MainPrefix + sdk . PrefixPublic )
config . SetBech32PrefixForValidator ( Bech32MainPrefix + sdk . PrefixValidator + sdk . PrefixOperator , Bech32MainPrefix + sdk . PrefixValidator + sdk . PrefixOperator + sdk . PrefixPublic )
config . SetBech32PrefixForConsensusNode ( Bech32MainPrefix + sdk . PrefixValidator + sdk . PrefixConsensus , Bech32MainPrefix + sdk . PrefixValidator + sdk . PrefixConsensus + sdk . PrefixPublic )
}
2020-02-13 00:49:32 +00:00
// SetBip44CoinType sets the global coin type to be used in hierarchical deterministic wallets.
func SetBip44CoinType ( config * sdk . Config ) {
config . SetCoinType ( Bip44CoinType )
}
2019-06-20 13:37:57 +00:00
// application updates every end block
2019-06-20 17:02:29 +00:00
func ( app * App ) BeginBlocker ( ctx sdk . Context , req abci . RequestBeginBlock ) abci . ResponseBeginBlock {
2019-07-18 17:36:31 +00:00
return app . mm . BeginBlock ( ctx , req )
2019-06-20 13:37:57 +00:00
}
// application updates every end block
2019-06-20 17:02:29 +00:00
func ( app * App ) EndBlocker ( ctx sdk . Context , req abci . RequestEndBlock ) abci . ResponseEndBlock {
2019-07-18 17:36:31 +00:00
return app . mm . EndBlock ( ctx , req )
2019-06-20 13:37:57 +00:00
}
2019-06-20 17:28:21 +00:00
// custom logic for app initialization
2019-07-18 17:36:31 +00:00
func ( app * App ) InitChainer ( ctx sdk . Context , req abci . RequestInitChain ) abci . ResponseInitChain {
2019-06-20 13:37:57 +00:00
var genesisState GenesisState
2019-07-18 17:36:31 +00:00
app . cdc . MustUnmarshalJSON ( req . AppStateBytes , & genesisState )
return app . mm . InitGenesis ( ctx , genesisState )
2019-06-20 13:37:57 +00:00
}
// load a particular height
2019-06-20 17:02:29 +00:00
func ( app * App ) LoadHeight ( height int64 ) error {
2019-09-11 22:33:20 +00:00
return app . LoadVersion ( height , app . keys [ bam . MainStoreKey ] )
2019-06-20 13:37:57 +00:00
}
2019-07-18 17:36:31 +00:00
// ModuleAccountAddrs returns all the app's module account addresses.
func ( app * App ) ModuleAccountAddrs ( ) map [ string ] bool {
modAccAddrs := make ( map [ string ] bool )
for acc := range mAccPerms {
2019-09-11 22:33:20 +00:00
modAccAddrs [ supply . NewModuleAddress ( acc ) . String ( ) ] = true
2019-07-18 17:36:31 +00:00
}
2019-06-20 13:37:57 +00:00
2019-07-18 17:36:31 +00:00
return modAccAddrs
2019-06-20 13:37:57 +00:00
}
2019-09-11 22:33:20 +00:00
// 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
}