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 }