@@ -115,6 +115,38 @@ func (ak accountKeeper) Params(c context.Context, req *types.QueryParamsRequest)
115115 return & types.QueryParamsResponse {Params : params }, nil
116116}
117117
118+ // ModuleAccounts returns all the existing Module Accounts
119+ func (ak AccountKeeper ) ModuleAccounts (c context.Context , req * types.QueryModuleAccountsRequest ) (* types.QueryModuleAccountsResponse , error ) {
120+ if req == nil {
121+ return nil , status .Error (codes .InvalidArgument , "empty request" )
122+ }
123+
124+ ctx := sdk .UnwrapSDKContext (c )
125+
126+ // For deterministic output, sort the permAddrs by module name.
127+ sortedPermAddrs := make ([]string , 0 , len (ak .permAddrs ))
128+ for moduleName := range ak .permAddrs {
129+ sortedPermAddrs = append (sortedPermAddrs , moduleName )
130+ }
131+ sort .Strings (sortedPermAddrs )
132+
133+ modAccounts := make ([]* codectypes.Any , 0 , len (ak .permAddrs ))
134+
135+ for _ , moduleName := range sortedPermAddrs {
136+ account := ak .GetModuleAccount (ctx , moduleName )
137+ if account == nil {
138+ return nil , status .Errorf (codes .NotFound , "account %s not found" , moduleName )
139+ }
140+ any , err := codectypes .NewAnyWithValue (account )
141+ if err != nil {
142+ return nil , status .Errorf (codes .Internal , err .Error ())
143+ }
144+ modAccounts = append (modAccounts , any )
145+ }
146+
147+ return & types.QueryModuleAccountsResponse {Accounts : modAccounts }, nil
148+ }
149+
118150// ModuleAccountByName returns module account by module name
119151func (ak AccountKeeper ) ModuleAccountByName (c context.Context , req * types.QueryModuleAccountByNameRequest ) (* types.QueryModuleAccountByNameResponse , error ) {
120152 if req == nil {
@@ -139,3 +171,39 @@ func (ak AccountKeeper) ModuleAccountByName(c context.Context, req *types.QueryM
139171
140172 return & types.QueryModuleAccountByNameResponse {Account : any }, nil
141173}
174+
175+ // Bech32Prefix returns the keeper internally stored bech32 prefix.
176+ func (ak AccountKeeper ) Bech32Prefix (ctx context.Context , req * types.Bech32PrefixRequest ) (* types.Bech32PrefixResponse , error ) {
177+ bech32Prefix , err := ak .getBech32Prefix ()
178+ if err != nil {
179+ return nil , err
180+ }
181+
182+ return & types.Bech32PrefixResponse {Bech32Prefix : bech32Prefix }, nil
183+ }
184+
185+ // AddressBytesToString converts an address from bytes to string, using the
186+ // keeper's bech32 prefix.
187+ func (ak AccountKeeper ) AddressBytesToString (ctx context.Context , req * types.AddressBytesToStringRequest ) (* types.AddressBytesToStringResponse , error ) {
188+ if req == nil {
189+ return nil , status .Errorf (codes .InvalidArgument , "empty request" )
190+ }
191+
192+ if len (req .Name ) == 0 {
193+ return nil , status .Error (codes .InvalidArgument , "module name is empty" )
194+ }
195+
196+ ctx := sdk .UnwrapSDKContext (c )
197+ moduleName := req .Name
198+
199+ account := ak .GetModuleAccount (ctx , moduleName )
200+ if account == nil {
201+ return nil , status .Errorf (codes .NotFound , "account %s not found" , moduleName )
202+ }
203+ any , err := codectypes .NewAnyWithValue (account )
204+ if err != nil {
205+ return nil , status .Errorf (codes .Internal , err .Error ())
206+ }
207+
208+ return & types.QueryModuleAccountByNameResponse {Account : any }, nil
209+ }
0 commit comments