github.com/cosmos/cosmos-sdk@v0.50.10/x/auth/module.go (about) 1 package auth 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 8 gwruntime "github.com/grpc-ecosystem/grpc-gateway/runtime" 9 10 modulev1 "cosmossdk.io/api/cosmos/auth/module/v1" 11 "cosmossdk.io/core/address" 12 "cosmossdk.io/core/appmodule" 13 "cosmossdk.io/core/store" 14 "cosmossdk.io/depinject" 15 16 "github.com/cosmos/cosmos-sdk/client" 17 "github.com/cosmos/cosmos-sdk/codec" 18 codectypes "github.com/cosmos/cosmos-sdk/codec/types" 19 sdk "github.com/cosmos/cosmos-sdk/types" 20 "github.com/cosmos/cosmos-sdk/types/module" 21 simtypes "github.com/cosmos/cosmos-sdk/types/simulation" 22 "github.com/cosmos/cosmos-sdk/x/auth/exported" 23 "github.com/cosmos/cosmos-sdk/x/auth/keeper" 24 "github.com/cosmos/cosmos-sdk/x/auth/simulation" 25 "github.com/cosmos/cosmos-sdk/x/auth/types" 26 ) 27 28 // ConsensusVersion defines the current x/auth module consensus version. 29 const ( 30 ConsensusVersion = 5 31 GovModuleName = "gov" 32 ) 33 34 var ( 35 _ module.AppModuleBasic = AppModule{} 36 _ module.AppModuleSimulation = AppModule{} 37 _ module.HasGenesis = AppModule{} 38 _ module.HasServices = AppModule{} 39 40 _ appmodule.AppModule = AppModule{} 41 ) 42 43 // AppModuleBasic defines the basic application module used by the auth module. 44 type AppModuleBasic struct { 45 ac address.Codec 46 } 47 48 // Name returns the auth module's name. 49 func (AppModuleBasic) Name() string { 50 return types.ModuleName 51 } 52 53 // RegisterLegacyAminoCodec registers the auth module's types for the given codec. 54 func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { 55 types.RegisterLegacyAminoCodec(cdc) 56 } 57 58 // DefaultGenesis returns default genesis state as raw bytes for the auth 59 // module. 60 func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { 61 return cdc.MustMarshalJSON(types.DefaultGenesisState()) 62 } 63 64 // ValidateGenesis performs genesis state validation for the auth module. 65 func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { 66 var data types.GenesisState 67 if err := cdc.UnmarshalJSON(bz, &data); err != nil { 68 return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) 69 } 70 71 return types.ValidateGenesis(data) 72 } 73 74 // RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the auth module. 75 func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *gwruntime.ServeMux) { 76 if err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)); err != nil { 77 panic(err) 78 } 79 } 80 81 // RegisterInterfaces registers interfaces and implementations of the auth module. 82 func (AppModuleBasic) RegisterInterfaces(registry codectypes.InterfaceRegistry) { 83 types.RegisterInterfaces(registry) 84 } 85 86 // AppModule implements an application module for the auth module. 87 type AppModule struct { 88 AppModuleBasic 89 90 accountKeeper keeper.AccountKeeper 91 randGenAccountsFn types.RandomGenesisAccountsFn 92 93 // legacySubspace is used solely for migration of x/params managed parameters 94 legacySubspace exported.Subspace 95 } 96 97 // IsOnePerModuleType implements the depinject.OnePerModuleType interface. 98 func (am AppModule) IsOnePerModuleType() {} 99 100 // IsAppModule implements the appmodule.AppModule interface. 101 func (am AppModule) IsAppModule() {} 102 103 // NewAppModule creates a new AppModule object 104 func NewAppModule(cdc codec.Codec, accountKeeper keeper.AccountKeeper, randGenAccountsFn types.RandomGenesisAccountsFn, ss exported.Subspace) AppModule { 105 return AppModule{ 106 AppModuleBasic: AppModuleBasic{ac: accountKeeper.AddressCodec()}, 107 accountKeeper: accountKeeper, 108 randGenAccountsFn: randGenAccountsFn, 109 legacySubspace: ss, 110 } 111 } 112 113 // RegisterServices registers a GRPC query service to respond to the 114 // module-specific GRPC queries. 115 func (am AppModule) RegisterServices(cfg module.Configurator) { 116 types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.accountKeeper)) 117 types.RegisterQueryServer(cfg.QueryServer(), keeper.NewQueryServer(am.accountKeeper)) 118 119 m := keeper.NewMigrator(am.accountKeeper, cfg.QueryServer(), am.legacySubspace) 120 if err := cfg.RegisterMigration(types.ModuleName, 1, m.Migrate1to2); err != nil { 121 panic(fmt.Sprintf("failed to migrate x/%s from version 1 to 2: %v", types.ModuleName, err)) 122 } 123 124 if err := cfg.RegisterMigration(types.ModuleName, 2, m.Migrate2to3); err != nil { 125 panic(fmt.Sprintf("failed to migrate x/%s from version 2 to 3: %v", types.ModuleName, err)) 126 } 127 128 if err := cfg.RegisterMigration(types.ModuleName, 3, m.Migrate3to4); err != nil { 129 panic(fmt.Sprintf("failed to migrate x/%s from version 3 to 4: %v", types.ModuleName, err)) 130 } 131 132 if err := cfg.RegisterMigration(types.ModuleName, 4, m.Migrate4To5); err != nil { 133 panic(fmt.Sprintf("failed to migrate x/%s from version 4 to 5", types.ModuleName)) 134 } 135 } 136 137 // InitGenesis performs genesis initialization for the auth module. It returns 138 // no validator updates. 139 func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) { 140 var genesisState types.GenesisState 141 cdc.MustUnmarshalJSON(data, &genesisState) 142 am.accountKeeper.InitGenesis(ctx, genesisState) 143 } 144 145 // ExportGenesis returns the exported genesis state as raw bytes for the auth 146 // module. 147 func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { 148 gs := am.accountKeeper.ExportGenesis(ctx) 149 return cdc.MustMarshalJSON(gs) 150 } 151 152 // ConsensusVersion implements AppModule/ConsensusVersion. 153 func (AppModule) ConsensusVersion() uint64 { return ConsensusVersion } 154 155 // AppModuleSimulation functions 156 157 // GenerateGenesisState creates a randomized GenState of the auth module 158 func (am AppModule) GenerateGenesisState(simState *module.SimulationState) { 159 simulation.RandomizedGenState(simState, am.randGenAccountsFn) 160 } 161 162 // ProposalMsgs returns msgs used for governance proposals for simulations. 163 func (AppModule) ProposalMsgs(simState module.SimulationState) []simtypes.WeightedProposalMsg { 164 return simulation.ProposalMsgs() 165 } 166 167 // RegisterStoreDecoder registers a decoder for auth module's types 168 func (am AppModule) RegisterStoreDecoder(sdr simtypes.StoreDecoderRegistry) { 169 sdr[types.StoreKey] = simtypes.NewStoreDecoderFuncFromCollectionsSchema(am.accountKeeper.Schema) 170 } 171 172 // WeightedOperations doesn't return any auth module operation. 173 func (AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { 174 return nil 175 } 176 177 // 178 // App Wiring Setup 179 // 180 181 func init() { 182 appmodule.Register(&modulev1.Module{}, 183 appmodule.Provide(ProvideModule), 184 ) 185 } 186 187 type ModuleInputs struct { 188 depinject.In 189 190 Config *modulev1.Module 191 StoreService store.KVStoreService 192 Cdc codec.Codec 193 194 AddressCodec address.Codec 195 RandomGenesisAccountsFn types.RandomGenesisAccountsFn `optional:"true"` 196 AccountI func() sdk.AccountI `optional:"true"` 197 198 // LegacySubspace is used solely for migration of x/params managed parameters 199 LegacySubspace exported.Subspace `optional:"true"` 200 } 201 202 type ModuleOutputs struct { 203 depinject.Out 204 205 AccountKeeper keeper.AccountKeeper 206 Module appmodule.AppModule 207 } 208 209 func ProvideModule(in ModuleInputs) ModuleOutputs { 210 maccPerms := map[string][]string{} 211 for _, permission := range in.Config.ModuleAccountPermissions { 212 maccPerms[permission.Account] = permission.Permissions 213 } 214 215 // default to governance authority if not provided 216 authority := types.NewModuleAddress(GovModuleName) 217 if in.Config.Authority != "" { 218 authority = types.NewModuleAddressOrBech32Address(in.Config.Authority) 219 } 220 221 if in.RandomGenesisAccountsFn == nil { 222 in.RandomGenesisAccountsFn = simulation.RandomGenesisAccounts 223 } 224 225 if in.AccountI == nil { 226 in.AccountI = types.ProtoBaseAccount 227 } 228 229 k := keeper.NewAccountKeeper(in.Cdc, in.StoreService, in.AccountI, maccPerms, in.AddressCodec, in.Config.Bech32Prefix, authority.String()) 230 m := NewAppModule(in.Cdc, k, in.RandomGenesisAccountsFn, in.LegacySubspace) 231 232 return ModuleOutputs{AccountKeeper: k, Module: m} 233 }