github.com/InjectiveLabs/sdk-go@v1.53.0/chain/ocr/types/msgs.go (about)

     1  package types
     2  
     3  import (
     4  	"cosmossdk.io/errors"
     5  	sdk "github.com/cosmos/cosmos-sdk/types"
     6  	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
     7  )
     8  
     9  const (
    10  	TypeMsgCreateFeed             = "createFeed"
    11  	TypeMsgUpdateFeed             = "updateFeed"
    12  	TypeMsgTransmit               = "transmit"
    13  	TypeMsgFundFeedRewardPool     = "fundFeedRewardPool"
    14  	TypeMsgWithdrawFeedRewardPool = "withdrawFeedRewardPool"
    15  	TypeMsgSetPayees              = "setPayees"
    16  	TypeMsgTransferPayeeship      = "transferPayeeship"
    17  	TypeMsgAcceptPayeeship        = "acceptPayeeship"
    18  	TypeMsgUpdateParams           = "updateParams"
    19  )
    20  
    21  var (
    22  	_ sdk.Msg = &MsgCreateFeed{}
    23  	_ sdk.Msg = &MsgUpdateFeed{}
    24  	_ sdk.Msg = &MsgTransmit{}
    25  	_ sdk.Msg = &MsgFundFeedRewardPool{}
    26  	_ sdk.Msg = &MsgWithdrawFeedRewardPool{}
    27  	_ sdk.Msg = &MsgSetPayees{}
    28  	_ sdk.Msg = &MsgTransferPayeeship{}
    29  	_ sdk.Msg = &MsgAcceptPayeeship{}
    30  	_ sdk.Msg = &MsgUpdateParams{}
    31  )
    32  
    33  // Route implements the sdk.Msg interface. It should return the name of the module
    34  func (msg MsgUpdateParams) Route() string { return RouterKey }
    35  
    36  // Type implements the sdk.Msg interface. It should return the action.
    37  func (msg MsgUpdateParams) Type() string { return TypeMsgUpdateParams }
    38  
    39  // ValidateBasic implements the sdk.Msg interface for MsgUpdateParams.
    40  func (msg MsgUpdateParams) ValidateBasic() error {
    41  	if _, err := sdk.AccAddressFromBech32(msg.Authority); err != nil {
    42  		return errors.Wrap(err, "invalid authority address")
    43  	}
    44  
    45  	if err := msg.Params.Validate(); err != nil {
    46  		return err
    47  	}
    48  
    49  	return nil
    50  }
    51  
    52  // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing
    53  func (msg *MsgUpdateParams) GetSignBytes() []byte {
    54  	return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
    55  }
    56  
    57  // GetSigners implements the sdk.Msg interface. It defines whose signature is required
    58  func (msg MsgUpdateParams) GetSigners() []sdk.AccAddress {
    59  	sender, err := sdk.AccAddressFromBech32(msg.Authority)
    60  	if err != nil {
    61  		panic(err)
    62  	}
    63  
    64  	return []sdk.AccAddress{sender}
    65  }
    66  
    67  // Route implements the sdk.Msg interface. It should return the name of the module
    68  func (msg MsgCreateFeed) Route() string { return RouterKey }
    69  
    70  // Type implements the sdk.Msg interface. It should return the action.
    71  func (msg MsgCreateFeed) Type() string { return TypeMsgCreateFeed }
    72  
    73  // ValidateBasic implements the sdk.Msg interface for MsgCreateFeed.
    74  func (msg MsgCreateFeed) ValidateBasic() error {
    75  	if msg.Sender == "" {
    76  		return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender)
    77  	}
    78  
    79  	if err := msg.Config.ValidateBasic(); err != nil {
    80  		return err
    81  	}
    82  
    83  	return nil
    84  }
    85  
    86  // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing
    87  func (msg *MsgCreateFeed) GetSignBytes() []byte {
    88  	return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
    89  }
    90  
    91  // GetSigners implements the sdk.Msg interface. It defines whose signature is required
    92  func (msg MsgCreateFeed) GetSigners() []sdk.AccAddress {
    93  	sender, err := sdk.AccAddressFromBech32(msg.Sender)
    94  	if err != nil {
    95  		panic(err)
    96  	}
    97  
    98  	return []sdk.AccAddress{sender}
    99  }
   100  
   101  // Route implements the sdk.Msg interface. It should return the name of the module
   102  func (msg MsgUpdateFeed) Route() string { return RouterKey }
   103  
   104  // Type implements the sdk.Msg interface. It should return the action.
   105  func (msg MsgUpdateFeed) Type() string { return TypeMsgUpdateFeed }
   106  
   107  // ValidateBasic implements the sdk.Msg interface for MsgUpdateFeed.
   108  func (msg MsgUpdateFeed) ValidateBasic() error {
   109  	if msg.Sender == "" {
   110  		return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender)
   111  	}
   112  
   113  	if msg.FeedId == "" || len(msg.FeedId) > FeedIDMaxLength {
   114  		return errors.Wrap(sdkerrors.ErrInvalidRequest, "feedId not valid")
   115  	}
   116  
   117  	seenTransmitters := make(map[string]struct{}, len(msg.Transmitters))
   118  	for _, transmitter := range msg.Transmitters {
   119  		addr, err := sdk.AccAddressFromBech32(transmitter)
   120  		if err != nil {
   121  			return err
   122  		}
   123  
   124  		if _, ok := seenTransmitters[addr.String()]; ok {
   125  			return ErrRepeatedAddress
   126  		} else {
   127  			seenTransmitters[addr.String()] = struct{}{}
   128  		}
   129  	}
   130  
   131  	seenSigners := make(map[string]struct{}, len(msg.Signers))
   132  	for _, signer := range msg.Signers {
   133  		addr, err := sdk.AccAddressFromBech32(signer)
   134  		if err != nil {
   135  			return err
   136  		}
   137  
   138  		if _, ok := seenSigners[addr.String()]; ok {
   139  			return ErrRepeatedAddress
   140  		} else {
   141  			seenSigners[addr.String()] = struct{}{}
   142  		}
   143  	}
   144  
   145  	if msg.LinkPerTransmission != nil {
   146  		if msg.LinkPerTransmission.IsNil() || !msg.LinkPerTransmission.IsPositive() {
   147  			return errors.Wrap(ErrIncorrectConfig, "LinkPerTransmission must be positive")
   148  		}
   149  	}
   150  
   151  	if msg.LinkPerObservation != nil {
   152  		if msg.LinkPerObservation.IsNil() || !msg.LinkPerObservation.IsPositive() {
   153  			return errors.Wrap(ErrIncorrectConfig, "LinkPerObservation must be positive")
   154  		}
   155  	}
   156  
   157  	if msg.LinkDenom == "" {
   158  		return sdkerrors.ErrInvalidCoins
   159  	}
   160  
   161  	if msg.FeedAdmin != "" {
   162  		if _, err := sdk.AccAddressFromBech32(msg.FeedAdmin); err != nil {
   163  			return err
   164  		}
   165  	}
   166  
   167  	if msg.BillingAdmin != "" {
   168  		if _, err := sdk.AccAddressFromBech32(msg.BillingAdmin); err != nil {
   169  			return err
   170  		}
   171  	}
   172  
   173  	return nil
   174  }
   175  
   176  // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing
   177  func (msg *MsgUpdateFeed) GetSignBytes() []byte {
   178  	return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
   179  }
   180  
   181  // GetSigners implements the sdk.Msg interface. It defines whose signature is required
   182  func (msg MsgUpdateFeed) GetSigners() []sdk.AccAddress {
   183  	sender, err := sdk.AccAddressFromBech32(msg.Sender)
   184  	if err != nil {
   185  		panic(err)
   186  	}
   187  
   188  	return []sdk.AccAddress{sender}
   189  }
   190  
   191  // Route implements the sdk.Msg interface. It should return the name of the module
   192  func (msg MsgTransmit) Route() string { return RouterKey }
   193  
   194  // Type implements the sdk.Msg interface. It should return the action.
   195  func (msg MsgTransmit) Type() string { return TypeMsgTransmit }
   196  
   197  // ValidateBasic implements the sdk.Msg interface for MsgTransmit.
   198  func (msg MsgTransmit) ValidateBasic() error {
   199  	if msg.Transmitter == "" {
   200  		return ErrNoTransmitter
   201  	}
   202  
   203  	switch {
   204  	case len(msg.ConfigDigest) == 0:
   205  		return errors.Wrap(ErrIncorrectTransmissionData, "missing config digest")
   206  	case msg.FeedId == "":
   207  		return errors.Wrap(ErrIncorrectTransmissionData, "missing feed hash")
   208  	case msg.Report == nil:
   209  		return errors.Wrap(ErrIncorrectTransmissionData, "missing report")
   210  	}
   211  
   212  	if len(msg.Report.Observers) > MaxNumOracles {
   213  		return errors.Wrap(ErrIncorrectTransmissionData, "too many observers")
   214  	} else if len(msg.Report.Observations) != len(msg.Report.Observers) {
   215  		return errors.Wrap(ErrIncorrectTransmissionData, "wrong observations count")
   216  	}
   217  
   218  	if len(msg.Report.Observations) > MaxNumOracles {
   219  		return errors.Wrap(sdkerrors.ErrInvalidRequest, "num observations out of bounds")
   220  	}
   221  
   222  	for i := 0; i < len(msg.Report.Observations)-1; i++ {
   223  		inOrder := msg.Report.Observations[i].LTE(msg.Report.Observations[i+1])
   224  		if !inOrder {
   225  			return errors.Wrap(sdkerrors.ErrInvalidRequest, "observations not sorted")
   226  		}
   227  	}
   228  	return nil
   229  }
   230  
   231  // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing
   232  func (msg *MsgTransmit) GetSignBytes() []byte {
   233  	return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
   234  }
   235  
   236  // GetSigners implements the sdk.Msg interface. It defines whose signature is required
   237  func (msg MsgTransmit) GetSigners() []sdk.AccAddress {
   238  	transmitter, err := sdk.AccAddressFromBech32(msg.Transmitter)
   239  	if err != nil {
   240  		panic(err)
   241  	}
   242  
   243  	return []sdk.AccAddress{transmitter}
   244  }
   245  
   246  // Route implements the sdk.Msg interface. It should return the name of the module
   247  func (msg MsgFundFeedRewardPool) Route() string { return RouterKey }
   248  
   249  // Type implements the sdk.Msg interface. It should return the action.
   250  func (msg MsgFundFeedRewardPool) Type() string { return TypeMsgFundFeedRewardPool }
   251  
   252  // ValidateBasic implements the sdk.Msg interface for MsgFundFeedRewardPool.
   253  func (msg MsgFundFeedRewardPool) ValidateBasic() error {
   254  	if msg.Sender == "" {
   255  		return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender)
   256  	}
   257  
   258  	if msg.FeedId == "" || len(msg.FeedId) > FeedIDMaxLength {
   259  		return errors.Wrap(sdkerrors.ErrInvalidRequest, "feedId not valid")
   260  	}
   261  
   262  	if !msg.Amount.IsValid() {
   263  		return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String())
   264  	}
   265  
   266  	return nil
   267  }
   268  
   269  // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing
   270  func (msg *MsgFundFeedRewardPool) GetSignBytes() []byte {
   271  	return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
   272  }
   273  
   274  // GetSigners implements the sdk.Msg interface. It defines whose signature is required
   275  func (msg MsgFundFeedRewardPool) GetSigners() []sdk.AccAddress {
   276  	sender, err := sdk.AccAddressFromBech32(msg.Sender)
   277  	if err != nil {
   278  		panic(err)
   279  	}
   280  
   281  	return []sdk.AccAddress{sender}
   282  }
   283  
   284  // Route implements the sdk.Msg interface. It should return the name of the module
   285  func (msg MsgWithdrawFeedRewardPool) Route() string { return RouterKey }
   286  
   287  // Type implements the sdk.Msg interface. It should return the action.
   288  func (msg MsgWithdrawFeedRewardPool) Type() string { return TypeMsgWithdrawFeedRewardPool }
   289  
   290  // ValidateBasic implements the sdk.Msg interface for MsgWithdrawFeedRewardPool.
   291  func (msg MsgWithdrawFeedRewardPool) ValidateBasic() error {
   292  	if msg.Sender == "" {
   293  		return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender)
   294  	}
   295  
   296  	if msg.FeedId == "" || len(msg.FeedId) > FeedIDMaxLength {
   297  		return errors.Wrap(sdkerrors.ErrInvalidRequest, "feedId not valid")
   298  	}
   299  
   300  	if !msg.Amount.IsValid() {
   301  		return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String())
   302  	}
   303  
   304  	return nil
   305  }
   306  
   307  // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing
   308  func (msg *MsgWithdrawFeedRewardPool) GetSignBytes() []byte {
   309  	return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
   310  }
   311  
   312  // GetSigners implements the sdk.Msg interface. It defines whose signature is required
   313  func (msg MsgWithdrawFeedRewardPool) GetSigners() []sdk.AccAddress {
   314  	sender, err := sdk.AccAddressFromBech32(msg.Sender)
   315  	if err != nil {
   316  		panic(err)
   317  	}
   318  
   319  	return []sdk.AccAddress{sender}
   320  }
   321  
   322  // Route implements the sdk.Msg interface. It should return the name of the module
   323  func (msg MsgSetPayees) Route() string { return RouterKey }
   324  
   325  // Type implements the sdk.Msg interface. It should return the action.
   326  func (msg MsgSetPayees) Type() string { return TypeMsgSetPayees }
   327  
   328  // ValidateBasic implements the sdk.Msg interface for MsgSetPayees.
   329  func (msg MsgSetPayees) ValidateBasic() error {
   330  	if msg.Sender == "" {
   331  		return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender)
   332  	}
   333  
   334  	if msg.FeedId == "" || len(msg.FeedId) > FeedIDMaxLength {
   335  		return errors.Wrap(sdkerrors.ErrInvalidRequest, "feedId not valid")
   336  	}
   337  
   338  	if len(msg.Transmitters) != len(msg.Payees) || len(msg.Payees) == 0 {
   339  		return ErrInvalidPayees
   340  	}
   341  
   342  	seenTransmitters := make(map[string]struct{}, len(msg.Transmitters))
   343  	for _, transmitter := range msg.Transmitters {
   344  		addr, err := sdk.AccAddressFromBech32(transmitter)
   345  		if err != nil {
   346  			return err
   347  		}
   348  
   349  		if _, ok := seenTransmitters[addr.String()]; ok {
   350  			return ErrRepeatedAddress
   351  		} else {
   352  			seenTransmitters[addr.String()] = struct{}{}
   353  		}
   354  	}
   355  
   356  	seenPayees := make(map[string]struct{}, len(msg.Payees))
   357  	for _, payee := range msg.Payees {
   358  		addr, err := sdk.AccAddressFromBech32(payee)
   359  		if err != nil {
   360  			return err
   361  		}
   362  
   363  		if _, ok := seenPayees[addr.String()]; ok {
   364  			return ErrRepeatedAddress
   365  		} else {
   366  			seenPayees[addr.String()] = struct{}{}
   367  		}
   368  	}
   369  
   370  	return nil
   371  }
   372  
   373  // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing
   374  func (msg *MsgSetPayees) GetSignBytes() []byte {
   375  	return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
   376  }
   377  
   378  // GetSigners implements the sdk.Msg interface. It defines whose signature is required
   379  func (msg MsgSetPayees) GetSigners() []sdk.AccAddress {
   380  	sender, err := sdk.AccAddressFromBech32(msg.Sender)
   381  	if err != nil {
   382  		panic(err)
   383  	}
   384  
   385  	return []sdk.AccAddress{sender}
   386  }
   387  
   388  // Route implements the sdk.Msg interface. It should return the name of the module
   389  func (msg MsgTransferPayeeship) Route() string { return RouterKey }
   390  
   391  // Type implements the sdk.Msg interface. It should return the action.
   392  func (msg MsgTransferPayeeship) Type() string { return TypeMsgTransferPayeeship }
   393  
   394  // ValidateBasic implements the sdk.Msg interface for MsgTransferPayeeship.
   395  func (msg MsgTransferPayeeship) ValidateBasic() error {
   396  	if msg.Sender == "" {
   397  		return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender)
   398  	}
   399  
   400  	if msg.FeedId == "" || len(msg.FeedId) > FeedIDMaxLength {
   401  		return errors.Wrap(sdkerrors.ErrInvalidRequest, "feedId not valid")
   402  	}
   403  
   404  	if _, err := sdk.AccAddressFromBech32(msg.Transmitter); err != nil {
   405  		return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Transmitter)
   406  	}
   407  
   408  	if _, err := sdk.AccAddressFromBech32(msg.Proposed); err != nil {
   409  		return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Proposed)
   410  	}
   411  
   412  	if msg.Transmitter == msg.Proposed {
   413  		return errors.Wrap(sdkerrors.ErrInvalidAddress, "proposed cannot be the same as transmitter")
   414  	}
   415  
   416  	return nil
   417  }
   418  
   419  // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing
   420  func (msg *MsgTransferPayeeship) GetSignBytes() []byte {
   421  	return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
   422  }
   423  
   424  // GetSigners implements the sdk.Msg interface. It defines whose signature is required
   425  func (msg MsgTransferPayeeship) GetSigners() []sdk.AccAddress {
   426  	sender, err := sdk.AccAddressFromBech32(msg.Sender)
   427  	if err != nil {
   428  		panic(err)
   429  	}
   430  
   431  	return []sdk.AccAddress{sender}
   432  }
   433  
   434  // Route implements the sdk.Msg interface. It should return the name of the module
   435  func (msg MsgAcceptPayeeship) Route() string { return RouterKey }
   436  
   437  // Type implements the sdk.Msg interface. It should return the action.
   438  func (msg MsgAcceptPayeeship) Type() string { return TypeMsgAcceptPayeeship }
   439  
   440  // ValidateBasic implements the sdk.Msg interface for MsgAcceptPayeeship.
   441  func (msg MsgAcceptPayeeship) ValidateBasic() error {
   442  	if msg.Payee == "" {
   443  		return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Payee)
   444  	}
   445  
   446  	if msg.FeedId == "" || len(msg.FeedId) > FeedIDMaxLength {
   447  		return errors.Wrap(sdkerrors.ErrInvalidRequest, "feedId not valid")
   448  	}
   449  
   450  	if _, err := sdk.AccAddressFromBech32(msg.Transmitter); err != nil {
   451  		return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Transmitter)
   452  	}
   453  
   454  	return nil
   455  }
   456  
   457  // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing
   458  func (msg *MsgAcceptPayeeship) GetSignBytes() []byte {
   459  	return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
   460  }
   461  
   462  // GetSigners implements the sdk.Msg interface. It defines whose signature is required
   463  func (msg MsgAcceptPayeeship) GetSigners() []sdk.AccAddress {
   464  	sender, err := sdk.AccAddressFromBech32(msg.Payee)
   465  	if err != nil {
   466  		panic(err)
   467  	}
   468  
   469  	return []sdk.AccAddress{sender}
   470  }