github.com/Finschia/finschia-sdk@v0.48.1/x/authz/msgs.go (about) 1 package authz 2 3 import ( 4 "time" 5 6 "github.com/gogo/protobuf/proto" 7 8 cdctypes "github.com/Finschia/finschia-sdk/codec/types" 9 sdk "github.com/Finschia/finschia-sdk/types" 10 sdkerrors "github.com/Finschia/finschia-sdk/types/errors" 11 "github.com/Finschia/finschia-sdk/x/auth/legacy/legacytx" 12 authzcodec "github.com/Finschia/finschia-sdk/x/authz/codec" 13 ) 14 15 var ( 16 _ sdk.Msg = &MsgGrant{} 17 _ sdk.Msg = &MsgRevoke{} 18 _ sdk.Msg = &MsgExec{} 19 20 // For amino support. 21 _ legacytx.LegacyMsg = &MsgGrant{} 22 _ legacytx.LegacyMsg = &MsgRevoke{} 23 _ legacytx.LegacyMsg = &MsgExec{} 24 25 _ cdctypes.UnpackInterfacesMessage = &MsgGrant{} 26 _ cdctypes.UnpackInterfacesMessage = &MsgExec{} 27 ) 28 29 // NewMsgGrant creates a new MsgGrant 30 // 31 //nolint:interfacer 32 func NewMsgGrant(granter sdk.AccAddress, grantee sdk.AccAddress, a Authorization, expiration time.Time) (*MsgGrant, error) { 33 m := &MsgGrant{ 34 Granter: granter.String(), 35 Grantee: grantee.String(), 36 Grant: Grant{Expiration: expiration}, 37 } 38 err := m.SetAuthorization(a) 39 if err != nil { 40 return nil, err 41 } 42 return m, nil 43 } 44 45 // GetSigners implements Msg 46 func (msg MsgGrant) GetSigners() []sdk.AccAddress { 47 granter, err := sdk.AccAddressFromBech32(msg.Granter) 48 if err != nil { 49 panic(err) 50 } 51 return []sdk.AccAddress{granter} 52 } 53 54 // ValidateBasic implements Msg 55 func (msg MsgGrant) ValidateBasic() error { 56 granter, err := sdk.AccAddressFromBech32(msg.Granter) 57 if err != nil { 58 return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "invalid granter address") 59 } 60 grantee, err := sdk.AccAddressFromBech32(msg.Grantee) 61 if err != nil { 62 return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "invalid granter address") 63 } 64 65 if granter.Equals(grantee) { 66 return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "granter and grantee cannot be same") 67 } 68 return msg.Grant.ValidateBasic() 69 } 70 71 // Type implements the LegacyMsg.Type method. 72 func (msg MsgGrant) Type() string { 73 return sdk.MsgTypeURL(&msg) 74 } 75 76 // Route implements the LegacyMsg.Route method. 77 func (msg MsgGrant) Route() string { 78 return sdk.MsgTypeURL(&msg) 79 } 80 81 // GetSignBytes implements the LegacyMsg.GetSignBytes method. 82 func (msg MsgGrant) GetSignBytes() []byte { 83 return sdk.MustSortJSON(authzcodec.ModuleCdc.MustMarshalJSON(&msg)) 84 } 85 86 // GetAuthorization returns the cache value from the MsgGrant.Authorization if present. 87 func (msg *MsgGrant) GetAuthorization() Authorization { 88 return msg.Grant.GetAuthorization() 89 } 90 91 // SetAuthorization converts Authorization to any and adds it to MsgGrant.Authorization. 92 func (msg *MsgGrant) SetAuthorization(a Authorization) error { 93 m, ok := a.(proto.Message) 94 if !ok { 95 return sdkerrors.Wrapf(sdkerrors.ErrPackAny, "can't proto marshal %T", m) 96 } 97 any, err := cdctypes.NewAnyWithValue(m) 98 if err != nil { 99 return err 100 } 101 msg.Grant.Authorization = any 102 return nil 103 } 104 105 // UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces 106 func (msg MsgExec) UnpackInterfaces(unpacker cdctypes.AnyUnpacker) error { 107 for _, x := range msg.Msgs { 108 var msgExecAuthorized sdk.Msg 109 err := unpacker.UnpackAny(x, &msgExecAuthorized) 110 if err != nil { 111 return err 112 } 113 } 114 115 return nil 116 } 117 118 // UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces 119 func (msg MsgGrant) UnpackInterfaces(unpacker cdctypes.AnyUnpacker) error { 120 return msg.Grant.UnpackInterfaces(unpacker) 121 } 122 123 // NewMsgRevoke creates a new MsgRevoke 124 // 125 //nolint:interfacer 126 func NewMsgRevoke(granter sdk.AccAddress, grantee sdk.AccAddress, msgTypeURL string) MsgRevoke { 127 return MsgRevoke{ 128 Granter: granter.String(), 129 Grantee: grantee.String(), 130 MsgTypeUrl: msgTypeURL, 131 } 132 } 133 134 // GetSigners implements Msg 135 func (msg MsgRevoke) GetSigners() []sdk.AccAddress { 136 granter, err := sdk.AccAddressFromBech32(msg.Granter) 137 if err != nil { 138 panic(err) 139 } 140 return []sdk.AccAddress{granter} 141 } 142 143 // ValidateBasic implements MsgRequest.ValidateBasic 144 func (msg MsgRevoke) ValidateBasic() error { 145 granter, err := sdk.AccAddressFromBech32(msg.Granter) 146 if err != nil { 147 return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "invalid granter address") 148 } 149 grantee, err := sdk.AccAddressFromBech32(msg.Grantee) 150 if err != nil { 151 return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "invalid grantee address") 152 } 153 154 if granter.Equals(grantee) { 155 return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "granter and grantee cannot be same") 156 } 157 158 if msg.MsgTypeUrl == "" { 159 return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "missing method name") 160 } 161 162 return nil 163 } 164 165 // Type implements the LegacyMsg.Type method. 166 func (msg MsgRevoke) Type() string { 167 return sdk.MsgTypeURL(&msg) 168 } 169 170 // Route implements the LegacyMsg.Route method. 171 func (msg MsgRevoke) Route() string { 172 return sdk.MsgTypeURL(&msg) 173 } 174 175 // GetSignBytes implements the LegacyMsg.GetSignBytes method. 176 func (msg MsgRevoke) GetSignBytes() []byte { 177 return sdk.MustSortJSON(authzcodec.ModuleCdc.MustMarshalJSON(&msg)) 178 } 179 180 // NewMsgExec creates a new MsgExecAuthorized 181 // 182 //nolint:interfacer 183 func NewMsgExec(grantee sdk.AccAddress, msgs []sdk.Msg) MsgExec { 184 msgsAny := make([]*cdctypes.Any, len(msgs)) 185 for i, msg := range msgs { 186 any, err := cdctypes.NewAnyWithValue(msg) 187 if err != nil { 188 panic(err) 189 } 190 191 msgsAny[i] = any 192 } 193 194 return MsgExec{ 195 Grantee: grantee.String(), 196 Msgs: msgsAny, 197 } 198 } 199 200 // GetMessages returns the cache values from the MsgExecAuthorized.Msgs if present. 201 func (msg MsgExec) GetMessages() ([]sdk.Msg, error) { 202 msgs := make([]sdk.Msg, len(msg.Msgs)) 203 for i, msgAny := range msg.Msgs { 204 msg, ok := msgAny.GetCachedValue().(sdk.Msg) 205 if !ok { 206 return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "messages contains %T which is not a sdk.MsgRequest", msgAny) 207 } 208 msgs[i] = msg 209 } 210 211 return msgs, nil 212 } 213 214 // GetSigners implements Msg 215 func (msg MsgExec) GetSigners() []sdk.AccAddress { 216 grantee, err := sdk.AccAddressFromBech32(msg.Grantee) 217 if err != nil { 218 panic(err) 219 } 220 return []sdk.AccAddress{grantee} 221 } 222 223 // ValidateBasic implements Msg 224 func (msg MsgExec) ValidateBasic() error { 225 _, err := sdk.AccAddressFromBech32(msg.Grantee) 226 if err != nil { 227 return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "invalid grantee address") 228 } 229 230 if len(msg.Msgs) == 0 { 231 return sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "messages cannot be empty") 232 } 233 234 return nil 235 } 236 237 // Type implements the LegacyMsg.Type method. 238 func (msg MsgExec) Type() string { 239 return sdk.MsgTypeURL(&msg) 240 } 241 242 // Route implements the LegacyMsg.Route method. 243 func (msg MsgExec) Route() string { 244 return sdk.MsgTypeURL(&msg) 245 } 246 247 // GetSignBytes implements the LegacyMsg.GetSignBytes method. 248 func (msg MsgExec) GetSignBytes() []byte { 249 return sdk.MustSortJSON(authzcodec.ModuleCdc.MustMarshalJSON(&msg)) 250 }