github.com/Finschia/finschia-sdk@v0.48.1/x/foundation/keeper/internal/proposal_handler.go (about) 1 package internal 2 3 import ( 4 sdk "github.com/Finschia/finschia-sdk/types" 5 sdkerrors "github.com/Finschia/finschia-sdk/types/errors" 6 authtypes "github.com/Finschia/finschia-sdk/x/auth/types" 7 "github.com/Finschia/finschia-sdk/x/foundation" 8 govtypes "github.com/Finschia/finschia-sdk/x/gov/types" 9 ) 10 11 // NewFoundationProposalsHandler creates a handler for the gov proposals. 12 func NewFoundationProposalsHandler(k Keeper) govtypes.Handler { 13 return func(ctx sdk.Context, content govtypes.Content) error { 14 switch c := content.(type) { 15 case *foundation.FoundationExecProposal: 16 return handleFoundationExecProposal(ctx, k, *c) 17 18 default: 19 return sdkerrors.ErrUnknownRequest.Wrapf("unrecognized param proposal content type: %T", c) 20 } 21 } 22 } 23 24 func handleFoundationExecProposal(ctx sdk.Context, k Keeper, proposal foundation.FoundationExecProposal) error { 25 msgs := foundation.GetMessagesFromFoundationExecProposal(proposal) 26 27 authority := authtypes.NewModuleAddress(govtypes.ModuleName) 28 if err := ensureMsgAuthz(msgs, authority); err != nil { 29 return err 30 } 31 32 // allow the following messages 33 allowedUrls := map[string]bool{ 34 sdk.MsgTypeURL((*foundation.MsgUpdateCensorship)(nil)): true, 35 sdk.MsgTypeURL((*foundation.MsgGrant)(nil)): true, 36 sdk.MsgTypeURL((*foundation.MsgRevoke)(nil)): true, 37 } 38 39 for i, msg := range msgs { 40 url := sdk.MsgTypeURL(msg) 41 if !allowedUrls[url] { 42 return sdkerrors.ErrInvalidRequest.Wrapf("%s not allowed", url) 43 } 44 45 handler := k.router.Handler(msg) 46 if handler == nil { 47 return sdkerrors.ErrUnknownRequest.Wrapf("no message handler found for %q", url) 48 } 49 _, err := handler(ctx, msg) 50 if err != nil { 51 return sdkerrors.Wrapf(err, "message %q at position %d", msg, i) 52 } 53 } 54 55 return nil 56 }