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  }