github.com/InjectiveLabs/sdk-go@v1.53.0/chain/exchange/types/msgs.go (about) 1 package types 2 3 import ( 4 "bytes" 5 "encoding/json" 6 7 "cosmossdk.io/errors" 8 "cosmossdk.io/math" 9 sdk "github.com/cosmos/cosmos-sdk/types" 10 sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" 11 "github.com/ethereum/go-ethereum/common" 12 13 oracletypes "github.com/InjectiveLabs/sdk-go/chain/oracle/types" 14 wasmxtypes "github.com/InjectiveLabs/sdk-go/chain/wasmx/types" 15 ) 16 17 const RouterKey = ModuleName 18 19 var ( 20 _ sdk.Msg = &MsgDeposit{} 21 _ sdk.Msg = &MsgWithdraw{} 22 _ sdk.Msg = &MsgCreateSpotLimitOrder{} 23 _ sdk.Msg = &MsgBatchCreateSpotLimitOrders{} 24 _ sdk.Msg = &MsgCreateSpotMarketOrder{} 25 _ sdk.Msg = &MsgCancelSpotOrder{} 26 _ sdk.Msg = &MsgBatchCancelSpotOrders{} 27 _ sdk.Msg = &MsgCreateDerivativeLimitOrder{} 28 _ sdk.Msg = &MsgBatchCreateDerivativeLimitOrders{} 29 _ sdk.Msg = &MsgCreateDerivativeMarketOrder{} 30 _ sdk.Msg = &MsgCancelDerivativeOrder{} 31 _ sdk.Msg = &MsgBatchCancelDerivativeOrders{} 32 _ sdk.Msg = &MsgSubaccountTransfer{} 33 _ sdk.Msg = &MsgExternalTransfer{} 34 _ sdk.Msg = &MsgIncreasePositionMargin{} 35 _ sdk.Msg = &MsgDecreasePositionMargin{} 36 _ sdk.Msg = &MsgLiquidatePosition{} 37 _ sdk.Msg = &MsgEmergencySettleMarket{} 38 _ sdk.Msg = &MsgInstantSpotMarketLaunch{} 39 _ sdk.Msg = &MsgInstantPerpetualMarketLaunch{} 40 _ sdk.Msg = &MsgInstantExpiryFuturesMarketLaunch{} 41 _ sdk.Msg = &MsgBatchUpdateOrders{} 42 _ sdk.Msg = &MsgPrivilegedExecuteContract{} 43 _ sdk.Msg = &MsgRewardsOptOut{} 44 _ sdk.Msg = &MsgInstantBinaryOptionsMarketLaunch{} 45 _ sdk.Msg = &MsgCreateBinaryOptionsLimitOrder{} 46 _ sdk.Msg = &MsgCreateBinaryOptionsMarketOrder{} 47 _ sdk.Msg = &MsgCancelBinaryOptionsOrder{} 48 _ sdk.Msg = &MsgAdminUpdateBinaryOptionsMarket{} 49 _ sdk.Msg = &MsgBatchCancelBinaryOptionsOrders{} 50 _ sdk.Msg = &MsgUpdateParams{} 51 _ sdk.Msg = &MsgUpdateSpotMarket{} 52 _ sdk.Msg = &MsgUpdateDerivativeMarket{} 53 ) 54 55 // exchange message types 56 const ( 57 TypeMsgDeposit = "msgDeposit" 58 TypeMsgWithdraw = "msgWithdraw" 59 TypeMsgCreateSpotLimitOrder = "createSpotLimitOrder" 60 TypeMsgBatchCreateSpotLimitOrders = "batchCreateSpotLimitOrders" 61 TypeMsgCreateSpotMarketOrder = "createSpotMarketOrder" 62 TypeMsgCancelSpotOrder = "cancelSpotOrder" 63 TypeMsgBatchCancelSpotOrders = "batchCancelSpotOrders" 64 TypeMsgCreateDerivativeLimitOrder = "createDerivativeLimitOrder" 65 TypeMsgBatchCreateDerivativeLimitOrders = "batchCreateDerivativeLimitOrder" 66 TypeMsgCreateDerivativeMarketOrder = "createDerivativeMarketOrder" 67 TypeMsgCancelDerivativeOrder = "cancelDerivativeOrder" 68 TypeMsgBatchCancelDerivativeOrders = "batchCancelDerivativeOrder" 69 TypeMsgSubaccountTransfer = "subaccountTransfer" 70 TypeMsgExternalTransfer = "externalTransfer" 71 TypeMsgIncreasePositionMargin = "increasePositionMargin" 72 TypeMsgDecreasePositionMargin = "decreasePositionMargin" 73 TypeMsgLiquidatePosition = "liquidatePosition" 74 TypeMsgEmergencySettleMarket = "emergencySettleMarket" 75 TypeMsgInstantSpotMarketLaunch = "instantSpotMarketLaunch" 76 TypeMsgInstantPerpetualMarketLaunch = "instantPerpetualMarketLaunch" 77 TypeMsgInstantExpiryFuturesMarketLaunch = "instantExpiryFuturesMarketLaunch" 78 TypeMsgBatchUpdateOrders = "batchUpdateOrders" 79 TypeMsgPrivilegedExecuteContract = "privilegedExecuteContract" 80 TypeMsgRewardsOptOut = "rewardsOptOut" 81 TypeMsgInstantBinaryOptionsMarketLaunch = "instantBinaryOptionsMarketLaunch" 82 TypeMsgCreateBinaryOptionsLimitOrder = "createBinaryOptionsLimitOrder" 83 TypeMsgCreateBinaryOptionsMarketOrder = "createBinaryOptionsMarketOrder" 84 TypeMsgCancelBinaryOptionsOrder = "cancelBinaryOptionsOrder" 85 TypeMsgAdminUpdateBinaryOptionsMarket = "adminUpdateBinaryOptionsMarket" 86 TypeMsgBatchCancelBinaryOptionsOrders = "batchCancelBinaryOptionsOrders" 87 TypeMsgUpdateParams = "updateParams" 88 TypeMsgUpdateSpotMarket = "updateSpotMarket" 89 TypeMsgUpdateDerivativeMarket = "updateDerivativeMarket" 90 TypeMsgAuthorizeStakeGrants = "authorizeStakeGrant" 91 TypeMsgActivateStakeGrant = "acceptStakeGrant" 92 ) 93 94 func (msg MsgUpdateParams) Route() string { return RouterKey } 95 96 func (msg MsgUpdateParams) Type() string { return TypeMsgUpdateParams } 97 98 func (msg MsgUpdateParams) ValidateBasic() error { 99 if _, err := sdk.AccAddressFromBech32(msg.Authority); err != nil { 100 return errors.Wrap(err, "invalid authority address") 101 } 102 103 if err := msg.Params.Validate(); err != nil { 104 return err 105 } 106 107 return nil 108 } 109 110 func (msg *MsgUpdateParams) GetSignBytes() []byte { 111 return sdk.MustSortJSON(ModuleCdc.MustMarshal(msg)) 112 } 113 114 func (msg MsgUpdateParams) GetSigners() []sdk.AccAddress { 115 addr, _ := sdk.AccAddressFromBech32(msg.Authority) 116 return []sdk.AccAddress{addr} 117 } 118 119 func (msg *MsgUpdateSpotMarket) ValidateBasic() error { 120 if _, err := sdk.AccAddressFromBech32(msg.Admin); err != nil { 121 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Admin) 122 } 123 124 if !IsHexHash(msg.MarketId) { 125 return errors.Wrap(ErrMarketInvalid, msg.MarketId) 126 } 127 128 hasNoUpdate := !msg.HasTickerUpdate() && 129 !msg.HasMinPriceTickSizeUpdate() && 130 !msg.HasMinQuantityTickSizeUpdate() && 131 !msg.HasMinNotionalUpdate() 132 133 if hasNoUpdate { 134 return errors.Wrap(ErrBadField, "no update value present") 135 } 136 137 if len(msg.NewTicker) > MaxTickerLength { 138 return errors.Wrapf(ErrInvalidTicker, "ticker should not exceed %d characters", MaxTickerLength) 139 } 140 141 if msg.HasMinPriceTickSizeUpdate() { 142 if err := ValidateTickSize(msg.NewMinPriceTickSize); err != nil { 143 return errors.Wrap(ErrInvalidPriceTickSize, err.Error()) 144 } 145 } 146 147 if msg.HasMinQuantityTickSizeUpdate() { 148 if err := ValidateTickSize(msg.NewMinQuantityTickSize); err != nil { 149 return errors.Wrap(ErrInvalidQuantityTickSize, err.Error()) 150 } 151 } 152 153 if msg.HasMinNotionalUpdate() { 154 if err := ValidateMinNotional(msg.NewMinNotional); err != nil { 155 return errors.Wrap(ErrInvalidNotional, err.Error()) 156 } 157 } 158 159 return nil 160 } 161 162 func (msg *MsgUpdateSpotMarket) GetSigners() []sdk.AccAddress { 163 return []sdk.AccAddress{sdk.MustAccAddressFromBech32(msg.Admin)} 164 } 165 166 func (msg *MsgUpdateSpotMarket) GetSignBytes() []byte { 167 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 168 } 169 170 func (msg *MsgUpdateSpotMarket) Route() string { 171 return RouterKey 172 } 173 174 func (msg *MsgUpdateSpotMarket) Type() string { 175 return TypeMsgUpdateSpotMarket 176 } 177 178 func (msg *MsgUpdateSpotMarket) HasTickerUpdate() bool { 179 return msg.NewTicker != "" 180 } 181 182 func (msg *MsgUpdateSpotMarket) HasMinPriceTickSizeUpdate() bool { 183 return !msg.NewMinPriceTickSize.IsNil() && !msg.NewMinPriceTickSize.IsZero() 184 } 185 186 func (msg *MsgUpdateSpotMarket) HasMinQuantityTickSizeUpdate() bool { 187 return !msg.NewMinQuantityTickSize.IsNil() && !msg.NewMinQuantityTickSize.IsZero() 188 } 189 190 func (msg *MsgUpdateSpotMarket) HasMinNotionalUpdate() bool { 191 return !msg.NewMinNotional.IsNil() && !msg.NewMinNotional.IsZero() 192 } 193 194 func (msg *MsgUpdateDerivativeMarket) ValidateBasic() error { 195 if _, err := sdk.AccAddressFromBech32(msg.Admin); err != nil { 196 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Admin) 197 } 198 199 if !IsHexHash(msg.MarketId) { 200 return errors.Wrap(ErrMarketInvalid, msg.MarketId) 201 } 202 203 hasNoUpdate := !msg.HasTickerUpdate() && 204 !msg.HasMinPriceTickSizeUpdate() && 205 !msg.HasMinNotionalUpdate() && 206 !msg.HasMinQuantityTickSizeUpdate() && 207 !msg.HasInitialMarginRatioUpdate() && 208 !msg.HasMaintenanceMarginRatioUpdate() 209 210 if hasNoUpdate { 211 return errors.Wrap(ErrBadField, "no update value present") 212 } 213 214 if len(msg.NewTicker) > MaxTickerLength { 215 return errors.Wrapf(ErrInvalidTicker, "ticker should not exceed %d characters", MaxTickerLength) 216 } 217 218 if msg.HasMinPriceTickSizeUpdate() { 219 if err := ValidateTickSize(msg.NewMinPriceTickSize); err != nil { 220 return errors.Wrap(ErrInvalidPriceTickSize, err.Error()) 221 } 222 } 223 224 if msg.HasMinQuantityTickSizeUpdate() { 225 if err := ValidateTickSize(msg.NewMinQuantityTickSize); err != nil { 226 return errors.Wrap(ErrInvalidQuantityTickSize, err.Error()) 227 } 228 } 229 230 if msg.HasMinNotionalUpdate() { 231 if err := ValidateMinNotional(msg.NewMinNotional); err != nil { 232 return errors.Wrap(ErrInvalidNotional, err.Error()) 233 } 234 } 235 236 if msg.HasInitialMarginRatioUpdate() { 237 if err := ValidateMarginRatio(msg.NewInitialMarginRatio); err != nil { 238 return err 239 } 240 } 241 242 if msg.HasMaintenanceMarginRatioUpdate() { 243 if err := ValidateMarginRatio(msg.NewMaintenanceMarginRatio); err != nil { 244 return err 245 } 246 } 247 248 if msg.HasInitialMarginRatioUpdate() && msg.HasMaintenanceMarginRatioUpdate() { 249 if msg.NewInitialMarginRatio.LT(msg.NewMaintenanceMarginRatio) { 250 return ErrMarginsRelation 251 } 252 } 253 254 return nil 255 } 256 257 func (msg *MsgUpdateDerivativeMarket) GetSigners() []sdk.AccAddress { 258 return []sdk.AccAddress{sdk.MustAccAddressFromBech32(msg.Admin)} 259 } 260 261 func (msg *MsgUpdateDerivativeMarket) GetSignBytes() []byte { 262 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 263 } 264 265 func (msg *MsgUpdateDerivativeMarket) Route() string { 266 return RouterKey 267 } 268 269 func (msg *MsgUpdateDerivativeMarket) Type() string { 270 return TypeMsgUpdateDerivativeMarket 271 } 272 273 func (msg *MsgUpdateDerivativeMarket) HasTickerUpdate() bool { 274 return msg.NewTicker != "" 275 } 276 277 func (msg *MsgUpdateDerivativeMarket) HasMinPriceTickSizeUpdate() bool { 278 return !msg.NewMinPriceTickSize.IsNil() && !msg.NewMinPriceTickSize.IsZero() 279 } 280 281 func (msg *MsgUpdateDerivativeMarket) HasMinQuantityTickSizeUpdate() bool { 282 return !msg.NewMinQuantityTickSize.IsNil() && !msg.NewMinQuantityTickSize.IsZero() 283 } 284 285 func (msg *MsgUpdateDerivativeMarket) HasInitialMarginRatioUpdate() bool { 286 return !msg.NewInitialMarginRatio.IsNil() && !msg.NewInitialMarginRatio.IsZero() 287 } 288 289 func (msg *MsgUpdateDerivativeMarket) HasMaintenanceMarginRatioUpdate() bool { 290 return !msg.NewMaintenanceMarginRatio.IsNil() && !msg.NewMaintenanceMarginRatio.IsZero() 291 } 292 293 func (msg *MsgUpdateDerivativeMarket) HasMinNotionalUpdate() bool { 294 return !msg.NewMinNotional.IsNil() && !msg.NewMinNotional.IsZero() 295 } 296 297 func (o *SpotOrder) ValidateBasic(senderAddr sdk.AccAddress) error { 298 if !IsHexHash(o.MarketId) { 299 return errors.Wrap(ErrMarketInvalid, o.MarketId) 300 } 301 switch o.OrderType { 302 case OrderType_BUY, OrderType_SELL, OrderType_BUY_PO, OrderType_SELL_PO, OrderType_BUY_ATOMIC, OrderType_SELL_ATOMIC: 303 // do nothing 304 default: 305 return errors.Wrap(ErrUnrecognizedOrderType, string(o.OrderType)) 306 } 307 308 // for legacy support purposes, allow non-conditional orders to send a 0 trigger price 309 if o.TriggerPrice != nil && (o.TriggerPrice.IsNil() || o.TriggerPrice.IsNegative() || o.TriggerPrice.GT(MaxOrderPrice)) { 310 return ErrInvalidTriggerPrice 311 } 312 313 if o.OrderInfo.FeeRecipient != "" { 314 _, err := sdk.AccAddressFromBech32(o.OrderInfo.FeeRecipient) 315 if err != nil { 316 return errors.Wrap(sdkerrors.ErrInvalidAddress, o.OrderInfo.FeeRecipient) 317 } 318 } 319 return o.OrderInfo.ValidateBasic(senderAddr, false, false) 320 } 321 322 func (o *OrderInfo) ValidateBasic(senderAddr sdk.AccAddress, hasBinaryPriceBand, isDerivative bool) error { 323 if err := CheckValidSubaccountIDOrNonce(senderAddr, o.SubaccountId); err != nil { 324 return err 325 } 326 327 if o.Cid != "" && !IsValidCid(o.Cid) { 328 return errors.Wrap(ErrInvalidCid, o.Cid) 329 } 330 331 if o.Quantity.IsNil() || o.Quantity.LTE(math.LegacyZeroDec()) || o.Quantity.GT(MaxOrderQuantity) { 332 return errors.Wrap(ErrInvalidQuantity, o.Quantity.String()) 333 } 334 335 if hasBinaryPriceBand { 336 // o.Price.GT(MaxOrderPrice) is correct (as opposed to o.Price.GT(math.LegacyOneDec())), because the price here is scaled 337 // and we have no idea what the scale factor of the market is here when we execute ValidateBasic(), and thus we allow 338 // very high ceiling price to cover all cases 339 if o.Price.IsNil() || o.Price.LT(math.LegacyZeroDec()) || o.Price.GT(MaxOrderPrice) { 340 return errors.Wrap(ErrInvalidPrice, o.Price.String()) 341 } 342 } else { 343 if o.Price.IsNil() || o.Price.LTE(math.LegacyZeroDec()) || o.Price.GT(MaxOrderPrice) { 344 return errors.Wrap(ErrInvalidPrice, o.Price.String()) 345 } 346 } 347 348 if isDerivative && !hasBinaryPriceBand && o.Price.LT(MinDerivativeOrderPrice) { 349 return errors.Wrap(ErrInvalidPrice, o.Price.String()) 350 } 351 352 return nil 353 } 354 355 func (o *DerivativeOrder) ValidateBasic(senderAddr sdk.AccAddress, hasBinaryPriceBand bool) error { 356 if !IsHexHash(o.MarketId) { 357 return errors.Wrap(ErrMarketInvalid, o.MarketId) 358 } 359 360 switch o.OrderType { 361 case OrderType_BUY, OrderType_SELL, OrderType_BUY_PO, OrderType_SELL_PO, OrderType_STOP_BUY, OrderType_STOP_SELL, OrderType_TAKE_BUY, OrderType_TAKE_SELL, OrderType_BUY_ATOMIC, OrderType_SELL_ATOMIC: 362 // do nothing 363 default: 364 return errors.Wrap(ErrUnrecognizedOrderType, string(o.OrderType)) 365 } 366 367 if o.Margin.IsNil() || o.Margin.LT(math.LegacyZeroDec()) { 368 return errors.Wrap(ErrInsufficientMargin, o.Margin.String()) 369 } 370 371 if o.Margin.GT(MaxOrderMargin) { 372 return errors.Wrap(ErrTooMuchOrderMargin, o.Margin.String()) 373 } 374 375 // for legacy support purposes, allow non-conditional orders to send a 0 trigger price 376 if o.TriggerPrice != nil && (o.TriggerPrice.IsNil() || o.TriggerPrice.IsNegative() || o.TriggerPrice.GT(MaxOrderPrice)) { 377 return ErrInvalidTriggerPrice 378 } 379 380 if o.IsConditional() && (o.TriggerPrice == nil || o.TriggerPrice.LT(MinDerivativeOrderPrice)) { /*|| 381 !o.IsConditional() && o.TriggerPrice != nil */ // commented out this check since FE is sending to us 0.0 trigger price for all orders 382 return errors.Wrapf(ErrInvalidTriggerPrice, "Mismatch between triggerPrice: %v and orderType: %v, or triggerPrice is incorrect", o.TriggerPrice, o.OrderType) 383 } 384 385 if o.OrderInfo.FeeRecipient != "" { 386 _, err := sdk.AccAddressFromBech32(o.OrderInfo.FeeRecipient) 387 if err != nil { 388 return errors.Wrap(sdkerrors.ErrInvalidAddress, o.OrderInfo.FeeRecipient) 389 } 390 } 391 return o.OrderInfo.ValidateBasic(senderAddr, hasBinaryPriceBand, !hasBinaryPriceBand) 392 } 393 394 func (o *OrderData) ValidateBasic(senderAddr sdk.AccAddress) error { 395 if !IsHexHash(o.MarketId) { 396 return errors.Wrap(ErrMarketInvalid, o.MarketId) 397 } 398 399 if err := CheckValidSubaccountIDOrNonce(senderAddr, o.SubaccountId); err != nil { 400 return err 401 } 402 403 // order data must contain either an order hash or cid 404 if o.Cid == "" && o.OrderHash == "" { 405 return ErrOrderHashInvalid 406 } 407 408 if o.Cid != "" && !IsValidCid(o.Cid) { 409 return errors.Wrap(ErrInvalidCid, o.Cid) 410 } 411 412 if o.OrderHash != "" && !IsValidOrderHash(o.OrderHash) { 413 return errors.Wrap(ErrOrderHashInvalid, o.OrderHash) 414 } 415 return nil 416 } 417 418 func (o *OrderData) GetIdentifier() any { 419 return GetOrderIdentifier(o.OrderHash, o.Cid) 420 } 421 422 // Route implements the sdk.Msg interface. It should return the name of the module 423 func (msg MsgDeposit) Route() string { return RouterKey } 424 425 // Type implements the sdk.Msg interface. It should return the action. 426 func (msg MsgDeposit) Type() string { return TypeMsgDeposit } 427 428 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 429 func (msg MsgDeposit) ValidateBasic() error { 430 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 431 432 if err != nil { 433 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 434 } 435 436 if !msg.Amount.IsValid() { 437 return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) 438 } 439 440 if !msg.Amount.IsPositive() { 441 return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) 442 } 443 444 if IsNonceDerivedSubaccountID(msg.SubaccountId) { 445 subaccountID, err := GetSubaccountIDOrDeriveFromNonce(senderAddr, msg.SubaccountId) 446 if err != nil { 447 return errors.Wrap(ErrBadSubaccountID, msg.SubaccountId) 448 } 449 if IsDefaultSubaccountID(subaccountID) { 450 return errors.Wrap(ErrBadSubaccountID, msg.SubaccountId) 451 } 452 } else { 453 // deposits to externally owned subaccounts are allowed but they MUST be explicitly specified 454 _, ok := IsValidSubaccountID(msg.SubaccountId) 455 if !ok { 456 return errors.Wrap(ErrBadSubaccountID, msg.SubaccountId) 457 } 458 if IsDefaultSubaccountID(common.HexToHash(msg.SubaccountId)) { 459 return errors.Wrap(ErrBadSubaccountID, msg.SubaccountId) 460 } 461 } 462 463 return nil 464 } 465 466 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 467 func (msg *MsgDeposit) GetSignBytes() []byte { 468 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 469 } 470 471 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 472 func (msg MsgDeposit) GetSigners() []sdk.AccAddress { 473 sender, err := sdk.AccAddressFromBech32(msg.Sender) 474 if err != nil { 475 panic(err) 476 } 477 return []sdk.AccAddress{sender} 478 } 479 480 // Route implements the sdk.Msg interface. It should return the name of the module 481 func (msg MsgWithdraw) Route() string { return RouterKey } 482 483 // Type implements the sdk.Msg interface. It should return the action. 484 func (msg MsgWithdraw) Type() string { return TypeMsgWithdraw } 485 486 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 487 func (msg MsgWithdraw) ValidateBasic() error { 488 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 489 if err != nil { 490 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 491 } 492 493 if !msg.Amount.IsValid() { 494 return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) 495 } 496 497 if !msg.Amount.IsPositive() { 498 return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) 499 } 500 501 if err := CheckValidSubaccountIDOrNonce(senderAddr, msg.SubaccountId); err != nil { 502 return err 503 } 504 505 subaccountID, err := GetSubaccountIDOrDeriveFromNonce(senderAddr, msg.SubaccountId) 506 if err != nil { 507 return errors.Wrap(ErrBadSubaccountID, msg.SubaccountId) 508 } 509 510 if IsDefaultSubaccountID(subaccountID) { 511 return errors.Wrap(ErrBadSubaccountID, msg.SubaccountId) 512 } 513 return nil 514 } 515 516 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 517 func (msg *MsgWithdraw) GetSignBytes() []byte { 518 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 519 } 520 521 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 522 func (msg MsgWithdraw) GetSigners() []sdk.AccAddress { 523 sender, err := sdk.AccAddressFromBech32(msg.Sender) 524 if err != nil { 525 panic(err) 526 } 527 return []sdk.AccAddress{sender} 528 } 529 530 // Route implements the sdk.Msg interface. It should return the name of the module 531 func (msg MsgInstantSpotMarketLaunch) Route() string { return RouterKey } 532 533 // Type implements the sdk.Msg interface. It should return the action. 534 func (msg MsgInstantSpotMarketLaunch) Type() string { return TypeMsgInstantSpotMarketLaunch } 535 536 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 537 func (msg MsgInstantSpotMarketLaunch) ValidateBasic() error { 538 _, err := sdk.AccAddressFromBech32(msg.Sender) 539 if err != nil { 540 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 541 } 542 if msg.Ticker == "" || len(msg.Ticker) > MaxTickerLength { 543 return errors.Wrapf(ErrInvalidTicker, "ticker should not be empty or exceed %d characters", MaxTickerLength) 544 } 545 if msg.BaseDenom == "" { 546 return errors.Wrap(ErrInvalidBaseDenom, "base denom should not be empty") 547 } 548 if msg.QuoteDenom == "" { 549 return errors.Wrap(ErrInvalidQuoteDenom, "quote denom should not be empty") 550 } 551 if msg.BaseDenom == msg.QuoteDenom { 552 return ErrSameDenoms 553 } 554 555 if err := ValidateTickSize(msg.MinPriceTickSize); err != nil { 556 return errors.Wrap(ErrInvalidPriceTickSize, err.Error()) 557 } 558 if err := ValidateTickSize(msg.MinQuantityTickSize); err != nil { 559 return errors.Wrap(ErrInvalidQuantityTickSize, err.Error()) 560 } 561 if err := ValidateMinNotional(msg.MinNotional); err != nil { 562 return errors.Wrap(ErrInvalidNotional, err.Error()) 563 } 564 565 return nil 566 } 567 568 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 569 func (msg *MsgInstantSpotMarketLaunch) GetSignBytes() []byte { 570 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 571 } 572 573 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 574 func (msg MsgInstantSpotMarketLaunch) GetSigners() []sdk.AccAddress { 575 sender, err := sdk.AccAddressFromBech32(msg.Sender) 576 if err != nil { 577 panic(err) 578 } 579 return []sdk.AccAddress{sender} 580 } 581 582 // Route implements the sdk.Msg interface. It should return the name of the module 583 func (msg MsgInstantPerpetualMarketLaunch) Route() string { return RouterKey } 584 585 // Type implements the sdk.Msg interface. It should return the action. 586 func (msg MsgInstantPerpetualMarketLaunch) Type() string { return TypeMsgInstantPerpetualMarketLaunch } 587 588 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 589 func (msg MsgInstantPerpetualMarketLaunch) ValidateBasic() error { 590 _, err := sdk.AccAddressFromBech32(msg.Sender) 591 if err != nil { 592 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 593 } 594 if msg.Ticker == "" || len(msg.Ticker) > MaxTickerLength { 595 return errors.Wrapf(ErrInvalidTicker, "ticker should not be empty or exceed %d characters", MaxTickerLength) 596 } 597 if msg.QuoteDenom == "" { 598 return errors.Wrap(ErrInvalidQuoteDenom, "quote denom should not be empty") 599 } 600 oracleParams := NewOracleParams(msg.OracleBase, msg.OracleQuote, msg.OracleScaleFactor, msg.OracleType) 601 if err := oracleParams.ValidateBasic(); err != nil { 602 return err 603 } 604 if err := ValidateMakerFee(msg.MakerFeeRate); err != nil { 605 return err 606 } 607 if err := ValidateFee(msg.TakerFeeRate); err != nil { 608 return err 609 } 610 if err := ValidateMarginRatio(msg.InitialMarginRatio); err != nil { 611 return err 612 } 613 if err := ValidateMarginRatio(msg.MaintenanceMarginRatio); err != nil { 614 return err 615 } 616 if msg.MakerFeeRate.GT(msg.TakerFeeRate) { 617 return ErrFeeRatesRelation 618 } 619 if msg.InitialMarginRatio.LT(msg.MaintenanceMarginRatio) { 620 return ErrMarginsRelation 621 } 622 if err := ValidateTickSize(msg.MinPriceTickSize); err != nil { 623 return errors.Wrap(ErrInvalidPriceTickSize, err.Error()) 624 } 625 if err := ValidateTickSize(msg.MinQuantityTickSize); err != nil { 626 return errors.Wrap(ErrInvalidQuantityTickSize, err.Error()) 627 } 628 if err := ValidateMinNotional(msg.MinNotional); err != nil { 629 return errors.Wrap(ErrInvalidNotional, err.Error()) 630 } 631 632 return nil 633 } 634 635 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 636 func (msg *MsgInstantPerpetualMarketLaunch) GetSignBytes() []byte { 637 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 638 } 639 640 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 641 func (msg MsgInstantPerpetualMarketLaunch) GetSigners() []sdk.AccAddress { 642 sender, err := sdk.AccAddressFromBech32(msg.Sender) 643 if err != nil { 644 panic(err) 645 } 646 return []sdk.AccAddress{sender} 647 } 648 649 // Route implements the sdk.Msg interface. It should return the name of the module 650 func (msg MsgInstantBinaryOptionsMarketLaunch) Route() string { return RouterKey } 651 652 // Type implements the sdk.Msg interface. It should return the action. 653 func (msg MsgInstantBinaryOptionsMarketLaunch) Type() string { 654 return TypeMsgInstantBinaryOptionsMarketLaunch 655 } 656 657 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 658 func (msg MsgInstantBinaryOptionsMarketLaunch) ValidateBasic() error { 659 _, err := sdk.AccAddressFromBech32(msg.Sender) 660 if err != nil { 661 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 662 } 663 if msg.Ticker == "" || len(msg.Ticker) > MaxTickerLength { 664 return errors.Wrapf(ErrInvalidTicker, "ticker should not be empty or exceed %d characters", MaxTickerLength) 665 } 666 if msg.OracleSymbol == "" { 667 return errors.Wrap(ErrInvalidOracle, "oracle symbol should not be empty") 668 } 669 if msg.OracleProvider == "" { 670 return errors.Wrap(ErrInvalidOracle, "oracle provider should not be empty") 671 } 672 if msg.OracleType != oracletypes.OracleType_Provider { 673 return errors.Wrap(ErrInvalidOracleType, msg.OracleType.String()) 674 } 675 if msg.OracleScaleFactor > MaxOracleScaleFactor { 676 return ErrExceedsMaxOracleScaleFactor 677 } 678 if err := ValidateMakerFee(msg.MakerFeeRate); err != nil { 679 return err 680 } 681 if err := ValidateFee(msg.TakerFeeRate); err != nil { 682 return err 683 } 684 if msg.MakerFeeRate.GT(msg.TakerFeeRate) { 685 return ErrFeeRatesRelation 686 } 687 if msg.ExpirationTimestamp >= msg.SettlementTimestamp || msg.ExpirationTimestamp < 0 || msg.SettlementTimestamp < 0 { 688 return ErrInvalidExpiry 689 } 690 if msg.Admin != "" { 691 _, err := sdk.AccAddressFromBech32(msg.Admin) 692 if err != nil { 693 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Admin) 694 } 695 } 696 if msg.QuoteDenom == "" { 697 return errors.Wrap(ErrInvalidQuoteDenom, "quote denom should not be empty") 698 } 699 if err := ValidateTickSize(msg.MinPriceTickSize); err != nil { 700 return errors.Wrap(ErrInvalidPriceTickSize, err.Error()) 701 } 702 if err := ValidateTickSize(msg.MinQuantityTickSize); err != nil { 703 return errors.Wrap(ErrInvalidQuantityTickSize, err.Error()) 704 } 705 if err := ValidateMinNotional(msg.MinNotional); err != nil { 706 return errors.Wrap(ErrInvalidNotional, err.Error()) 707 } 708 709 return nil 710 } 711 712 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 713 func (msg *MsgInstantBinaryOptionsMarketLaunch) GetSignBytes() []byte { 714 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 715 } 716 717 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 718 func (msg MsgInstantBinaryOptionsMarketLaunch) GetSigners() []sdk.AccAddress { 719 sender, err := sdk.AccAddressFromBech32(msg.Sender) 720 if err != nil { 721 panic(err) 722 } 723 return []sdk.AccAddress{sender} 724 } 725 726 // Route implements the sdk.Msg interface. It should return the name of the module 727 func (msg MsgInstantExpiryFuturesMarketLaunch) Route() string { return RouterKey } 728 729 // Type implements the sdk.Msg interface. It should return the action. 730 func (msg MsgInstantExpiryFuturesMarketLaunch) Type() string { 731 return TypeMsgInstantExpiryFuturesMarketLaunch 732 } 733 734 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 735 func (msg MsgInstantExpiryFuturesMarketLaunch) ValidateBasic() error { 736 _, err := sdk.AccAddressFromBech32(msg.Sender) 737 if err != nil { 738 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 739 } 740 if msg.Ticker == "" || len(msg.Ticker) > MaxTickerLength { 741 return errors.Wrapf(ErrInvalidTicker, "ticker should not be empty or exceed %d characters", MaxTickerLength) 742 } 743 if msg.QuoteDenom == "" { 744 return errors.Wrap(ErrInvalidQuoteDenom, "quote denom should not be empty") 745 } 746 747 oracleParams := NewOracleParams(msg.OracleBase, msg.OracleQuote, msg.OracleScaleFactor, msg.OracleType) 748 if err := oracleParams.ValidateBasic(); err != nil { 749 return err 750 } 751 if msg.Expiry <= 0 { 752 return errors.Wrap(ErrInvalidExpiry, "expiry should not be empty") 753 } 754 if err := ValidateMakerFee(msg.MakerFeeRate); err != nil { 755 return err 756 } 757 if err := ValidateFee(msg.TakerFeeRate); err != nil { 758 return err 759 } 760 if err := ValidateMarginRatio(msg.InitialMarginRatio); err != nil { 761 return err 762 } 763 if err := ValidateMarginRatio(msg.MaintenanceMarginRatio); err != nil { 764 return err 765 } 766 if msg.MakerFeeRate.GT(msg.TakerFeeRate) { 767 return ErrFeeRatesRelation 768 } 769 if msg.InitialMarginRatio.LT(msg.MaintenanceMarginRatio) { 770 return ErrMarginsRelation 771 } 772 if err := ValidateTickSize(msg.MinPriceTickSize); err != nil { 773 return errors.Wrap(ErrInvalidPriceTickSize, err.Error()) 774 } 775 if err := ValidateTickSize(msg.MinQuantityTickSize); err != nil { 776 return errors.Wrap(ErrInvalidQuantityTickSize, err.Error()) 777 } 778 if err := ValidateMinNotional(msg.MinNotional); err != nil { 779 return errors.Wrap(ErrInvalidNotional, err.Error()) 780 } 781 782 return nil 783 } 784 785 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 786 func (msg *MsgInstantExpiryFuturesMarketLaunch) GetSignBytes() []byte { 787 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 788 } 789 790 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 791 func (msg MsgInstantExpiryFuturesMarketLaunch) GetSigners() []sdk.AccAddress { 792 sender, err := sdk.AccAddressFromBech32(msg.Sender) 793 if err != nil { 794 panic(err) 795 } 796 return []sdk.AccAddress{sender} 797 } 798 799 // Route implements the sdk.Msg interface. It should return the name of the module 800 func (msg MsgCreateSpotLimitOrder) Route() string { return RouterKey } 801 802 // Type implements the sdk.Msg interface. It should return the action. 803 func (msg MsgCreateSpotLimitOrder) Type() string { return TypeMsgCreateSpotLimitOrder } 804 805 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 806 func (msg MsgCreateSpotLimitOrder) ValidateBasic() error { 807 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 808 if err != nil { // We don't need to check if sender is empty. 809 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 810 } 811 if err := msg.Order.ValidateBasic(senderAddr); err != nil { 812 return err 813 } 814 return nil 815 } 816 817 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 818 func (msg *MsgCreateSpotLimitOrder) GetSignBytes() []byte { 819 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 820 } 821 822 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 823 func (msg MsgCreateSpotLimitOrder) GetSigners() []sdk.AccAddress { 824 sender, err := sdk.AccAddressFromBech32(msg.Sender) 825 if err != nil { 826 panic(err) 827 } 828 return []sdk.AccAddress{sender} 829 } 830 831 // Route implements the sdk.Msg interface. It should return the name of the module 832 func (msg MsgBatchCreateSpotLimitOrders) Route() string { return RouterKey } 833 834 // Type implements the sdk.Msg interface. It should return the action. 835 func (msg MsgBatchCreateSpotLimitOrders) Type() string { return TypeMsgBatchCreateSpotLimitOrders } 836 837 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 838 func (msg MsgBatchCreateSpotLimitOrders) ValidateBasic() error { 839 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 840 if err != nil { // We don't need to check if sender is empty. 841 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 842 } 843 844 if len(msg.Orders) == 0 { 845 return errors.Wrap(ErrOrderDoesntExist, "must create at least 1 order") 846 } 847 848 for idx := range msg.Orders { 849 order := msg.Orders[idx] 850 if err := order.ValidateBasic(senderAddr); err != nil { 851 return err 852 } 853 } 854 return nil 855 } 856 857 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 858 func (msg *MsgBatchCreateSpotLimitOrders) GetSignBytes() []byte { 859 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 860 } 861 862 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 863 func (msg MsgBatchCreateSpotLimitOrders) GetSigners() []sdk.AccAddress { 864 sender, err := sdk.AccAddressFromBech32(msg.Sender) 865 if err != nil { 866 panic(err) 867 } 868 return []sdk.AccAddress{sender} 869 } 870 871 // Route implements the sdk.Msg interface. It should return the name of the module 872 func (msg MsgCreateSpotMarketOrder) Route() string { return RouterKey } 873 874 // Type implements the sdk.Msg interface. It should return the action. 875 func (msg MsgCreateSpotMarketOrder) Type() string { return TypeMsgCreateSpotMarketOrder } 876 877 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 878 func (msg MsgCreateSpotMarketOrder) ValidateBasic() error { 879 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 880 if err != nil { 881 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 882 } 883 884 if msg.Order.OrderType == OrderType_BUY_PO || msg.Order.OrderType == OrderType_SELL_PO { 885 return errors.Wrap(ErrInvalidOrderTypeForMessage, "Spot market order can't be a post only order") 886 } 887 888 if err := msg.Order.ValidateBasic(senderAddr); err != nil { 889 return err 890 } 891 892 return nil 893 } 894 895 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 896 func (msg *MsgCreateSpotMarketOrder) GetSignBytes() []byte { 897 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 898 } 899 900 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 901 func (msg MsgCreateSpotMarketOrder) GetSigners() []sdk.AccAddress { 902 sender, err := sdk.AccAddressFromBech32(msg.Sender) 903 if err != nil { 904 panic(err) 905 } 906 return []sdk.AccAddress{sender} 907 } 908 909 // Route implements the sdk.Msg interface. It should return the name of the module 910 func (msg *MsgCancelSpotOrder) Route() string { return RouterKey } 911 912 // Type implements the sdk.Msg interface. It should return the action. 913 func (msg *MsgCancelSpotOrder) Type() string { return TypeMsgCancelSpotOrder } 914 915 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 916 func (msg *MsgCancelSpotOrder) ValidateBasic() error { 917 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 918 if err != nil { 919 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 920 } 921 922 orderData := OrderData{ 923 MarketId: msg.MarketId, 924 SubaccountId: msg.SubaccountId, 925 OrderHash: msg.OrderHash, 926 Cid: msg.Cid, 927 } 928 return orderData.ValidateBasic(senderAddr) 929 } 930 931 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 932 func (msg *MsgCancelSpotOrder) GetSignBytes() []byte { 933 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 934 } 935 936 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 937 func (msg *MsgCancelSpotOrder) GetSigners() []sdk.AccAddress { 938 sender, err := sdk.AccAddressFromBech32(msg.Sender) 939 if err != nil { 940 panic(err) 941 } 942 return []sdk.AccAddress{sender} 943 } 944 945 // Route implements the sdk.Msg interface. It should return the name of the module 946 func (msg *MsgBatchCancelSpotOrders) Route() string { return RouterKey } 947 948 // Type implements the sdk.Msg interface. It should return the action. 949 func (msg *MsgBatchCancelSpotOrders) Type() string { return TypeMsgBatchCancelSpotOrders } 950 951 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 952 func (msg *MsgBatchCancelSpotOrders) ValidateBasic() error { 953 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 954 if err != nil { 955 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 956 } 957 958 if len(msg.Data) == 0 { 959 return errors.Wrap(ErrOrderDoesntExist, "must cancel at least 1 order") 960 } 961 962 for idx := range msg.Data { 963 if err := msg.Data[idx].ValidateBasic(senderAddr); err != nil { 964 return err 965 } 966 } 967 968 return nil 969 } 970 971 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 972 func (msg *MsgBatchCancelSpotOrders) GetSignBytes() []byte { 973 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 974 } 975 976 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 977 func (msg *MsgBatchCancelSpotOrders) GetSigners() []sdk.AccAddress { 978 sender, err := sdk.AccAddressFromBech32(msg.Sender) 979 if err != nil { 980 panic(err) 981 } 982 return []sdk.AccAddress{sender} 983 } 984 985 // Route should return the name of the module 986 func (msg MsgCreateDerivativeLimitOrder) Route() string { return RouterKey } 987 988 // Type should return the action 989 func (msg MsgCreateDerivativeLimitOrder) Type() string { return TypeMsgCreateDerivativeLimitOrder } 990 991 // ValidateBasic runs stateless checks on the message 992 func (msg MsgCreateDerivativeLimitOrder) ValidateBasic() error { 993 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 994 if err != nil { 995 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 996 } 997 if msg.Order.OrderType == OrderType_BUY_ATOMIC || msg.Order.OrderType == OrderType_SELL_ATOMIC { 998 return errors.Wrap(ErrInvalidOrderTypeForMessage, "Derivative limit orders can't be atomic orders") 999 } 1000 if err := msg.Order.ValidateBasic(senderAddr, false); err != nil { 1001 return err 1002 } 1003 1004 return nil 1005 } 1006 1007 // GetSignBytes encodes the message for signing 1008 func (msg *MsgCreateDerivativeLimitOrder) GetSignBytes() []byte { 1009 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1010 } 1011 1012 // GetSigners defines whose signature is required 1013 func (msg MsgCreateDerivativeLimitOrder) GetSigners() []sdk.AccAddress { 1014 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1015 if err != nil { 1016 panic(err) 1017 } 1018 return []sdk.AccAddress{sender} 1019 } 1020 1021 func NewMsgCreateBinaryOptionsLimitOrder( 1022 sender sdk.AccAddress, 1023 market *BinaryOptionsMarket, 1024 subaccountID string, 1025 feeRecipient string, 1026 price, quantity math.LegacyDec, 1027 orderType OrderType, 1028 isReduceOnly bool, 1029 ) *MsgCreateBinaryOptionsLimitOrder { 1030 margin := GetRequiredBinaryOptionsOrderMargin(price, quantity, market.OracleScaleFactor, orderType, isReduceOnly) 1031 1032 return &MsgCreateBinaryOptionsLimitOrder{ 1033 Sender: sender.String(), 1034 Order: DerivativeOrder{ 1035 MarketId: market.MarketId, 1036 OrderInfo: OrderInfo{ 1037 SubaccountId: subaccountID, 1038 FeeRecipient: feeRecipient, 1039 Price: price, 1040 Quantity: quantity, 1041 }, 1042 OrderType: orderType, 1043 Margin: margin, 1044 TriggerPrice: nil, 1045 }, 1046 } 1047 } 1048 1049 // Route should return the name of the module 1050 func (msg MsgCreateBinaryOptionsLimitOrder) Route() string { return RouterKey } 1051 1052 // Type should return the action 1053 func (msg MsgCreateBinaryOptionsLimitOrder) Type() string { 1054 return TypeMsgCreateBinaryOptionsLimitOrder 1055 } 1056 1057 // ValidateBasic runs stateless checks on the message 1058 func (msg MsgCreateBinaryOptionsLimitOrder) ValidateBasic() error { 1059 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1060 if err != nil { 1061 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1062 } 1063 if msg.Order.OrderType.IsConditional() { 1064 return errors.Wrap(ErrUnrecognizedOrderType, string(msg.Order.OrderType)) 1065 } 1066 if err := msg.Order.ValidateBasic(senderAddr, true); err != nil { 1067 return err 1068 } 1069 1070 return nil 1071 } 1072 1073 // GetSignBytes encodes the message for signing 1074 func (msg *MsgCreateBinaryOptionsLimitOrder) GetSignBytes() []byte { 1075 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1076 } 1077 1078 // GetSigners defines whose signature is required 1079 func (msg MsgCreateBinaryOptionsLimitOrder) GetSigners() []sdk.AccAddress { 1080 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1081 if err != nil { 1082 panic(err) 1083 } 1084 return []sdk.AccAddress{sender} 1085 } 1086 1087 // Route should return the name of the module 1088 func (msg MsgBatchCreateDerivativeLimitOrders) Route() string { return RouterKey } 1089 1090 // Type should return the action 1091 func (msg MsgBatchCreateDerivativeLimitOrders) Type() string { 1092 return TypeMsgBatchCreateDerivativeLimitOrders 1093 } 1094 1095 // ValidateBasic runs stateless checks on the message 1096 func (msg MsgBatchCreateDerivativeLimitOrders) ValidateBasic() error { 1097 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1098 if err != nil { 1099 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1100 } 1101 1102 if len(msg.Orders) == 0 { 1103 return errors.Wrap(ErrOrderDoesntExist, "must create at least 1 order") 1104 } 1105 1106 for idx := range msg.Orders { 1107 order := msg.Orders[idx] 1108 if err := order.ValidateBasic(senderAddr, false); err != nil { 1109 return err 1110 } 1111 } 1112 return nil 1113 } 1114 1115 // GetSignBytes encodes the message for signing 1116 func (msg *MsgBatchCreateDerivativeLimitOrders) GetSignBytes() []byte { 1117 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1118 } 1119 1120 // GetSigners defines whose signature is required 1121 func (msg MsgBatchCreateDerivativeLimitOrders) GetSigners() []sdk.AccAddress { 1122 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1123 if err != nil { 1124 panic(err) 1125 } 1126 return []sdk.AccAddress{sender} 1127 } 1128 1129 // Route should return the name of the module 1130 func (msg MsgCreateDerivativeMarketOrder) Route() string { return RouterKey } 1131 1132 // Type should return the action 1133 func (msg MsgCreateDerivativeMarketOrder) Type() string { return TypeMsgCreateDerivativeMarketOrder } 1134 1135 // ValidateBasic runs stateless checks on the message 1136 func (msg MsgCreateDerivativeMarketOrder) ValidateBasic() error { 1137 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1138 if err != nil { 1139 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1140 } 1141 1142 if msg.Order.OrderType == OrderType_BUY_PO || msg.Order.OrderType == OrderType_SELL_PO { 1143 return errors.Wrap(ErrInvalidOrderTypeForMessage, "Derivative market order can't be a post only order") 1144 } 1145 1146 if err := msg.Order.ValidateBasic(senderAddr, false); err != nil { 1147 return err 1148 } 1149 return nil 1150 } 1151 1152 // GetSignBytes encodes the message for signing 1153 func (msg *MsgCreateDerivativeMarketOrder) GetSignBytes() []byte { 1154 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1155 } 1156 1157 // GetSigners defines whose signature is required 1158 func (msg MsgCreateDerivativeMarketOrder) GetSigners() []sdk.AccAddress { 1159 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1160 if err != nil { 1161 panic(err) 1162 } 1163 return []sdk.AccAddress{sender} 1164 } 1165 1166 func NewMsgCreateBinaryOptionsMarketOrder( 1167 sender sdk.AccAddress, 1168 market *BinaryOptionsMarket, 1169 subaccountID string, 1170 feeRecipient string, 1171 price, quantity math.LegacyDec, 1172 orderType OrderType, 1173 isReduceOnly bool, 1174 ) *MsgCreateBinaryOptionsMarketOrder { 1175 margin := GetRequiredBinaryOptionsOrderMargin(price, quantity, market.OracleScaleFactor, orderType, isReduceOnly) 1176 1177 return &MsgCreateBinaryOptionsMarketOrder{ 1178 Sender: sender.String(), 1179 Order: DerivativeOrder{ 1180 MarketId: market.MarketId, 1181 OrderInfo: OrderInfo{ 1182 SubaccountId: subaccountID, 1183 FeeRecipient: feeRecipient, 1184 Price: price, 1185 Quantity: quantity, 1186 }, 1187 OrderType: orderType, 1188 Margin: margin, 1189 TriggerPrice: nil, 1190 }, 1191 } 1192 } 1193 1194 // Route should return the name of the module 1195 func (msg MsgCreateBinaryOptionsMarketOrder) Route() string { return RouterKey } 1196 1197 // Type should return the action 1198 func (msg MsgCreateBinaryOptionsMarketOrder) Type() string { 1199 return TypeMsgCreateBinaryOptionsMarketOrder 1200 } 1201 1202 // ValidateBasic runs stateless checks on the message 1203 func (msg MsgCreateBinaryOptionsMarketOrder) ValidateBasic() error { 1204 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1205 if err != nil { 1206 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1207 } 1208 1209 if msg.Order.OrderType == OrderType_BUY_PO || msg.Order.OrderType == OrderType_SELL_PO { 1210 return errors.Wrap(ErrInvalidOrderTypeForMessage, "market order can't be a post only order") 1211 } 1212 if msg.Order.OrderType.IsConditional() { 1213 return errors.Wrap(ErrUnrecognizedOrderType, string(msg.Order.OrderType)) 1214 } 1215 1216 if err := msg.Order.ValidateBasic(senderAddr, true); err != nil { 1217 return err 1218 } 1219 return nil 1220 } 1221 1222 // GetSignBytes encodes the message for signing 1223 func (msg *MsgCreateBinaryOptionsMarketOrder) GetSignBytes() []byte { 1224 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1225 } 1226 1227 // GetSigners defines whose signature is required 1228 func (msg MsgCreateBinaryOptionsMarketOrder) GetSigners() []sdk.AccAddress { 1229 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1230 if err != nil { 1231 panic(err) 1232 } 1233 return []sdk.AccAddress{sender} 1234 } 1235 1236 // Route implements the sdk.Msg interface. It should return the name of the module 1237 func (msg *MsgCancelDerivativeOrder) Route() string { 1238 return RouterKey 1239 } 1240 1241 // Type implements the sdk.Msg interface. It should return the action. 1242 func (msg *MsgCancelDerivativeOrder) Type() string { 1243 return TypeMsgCancelDerivativeOrder 1244 } 1245 1246 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 1247 func (msg *MsgCancelDerivativeOrder) ValidateBasic() error { 1248 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1249 if err != nil { 1250 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1251 } 1252 1253 orderData := OrderData{ 1254 MarketId: msg.MarketId, 1255 SubaccountId: msg.SubaccountId, 1256 OrderHash: msg.OrderHash, 1257 Cid: msg.Cid, 1258 } 1259 return orderData.ValidateBasic(senderAddr) 1260 } 1261 1262 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 1263 func (msg *MsgCancelDerivativeOrder) GetSignBytes() []byte { 1264 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1265 } 1266 1267 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 1268 func (msg *MsgCancelDerivativeOrder) GetSigners() []sdk.AccAddress { 1269 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1270 if err != nil { 1271 panic(err) 1272 } 1273 return []sdk.AccAddress{sender} 1274 } 1275 1276 // Route implements the sdk.Msg interface. It should return the name of the module 1277 func (msg *MsgBatchCancelDerivativeOrders) Route() string { 1278 return RouterKey 1279 } 1280 1281 // Type implements the sdk.Msg interface. It should return the action. 1282 func (msg *MsgBatchCancelDerivativeOrders) Type() string { 1283 return TypeMsgBatchCancelDerivativeOrders 1284 } 1285 1286 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 1287 func (msg *MsgBatchCancelDerivativeOrders) ValidateBasic() error { 1288 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1289 if err != nil { 1290 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1291 } 1292 1293 if len(msg.Data) == 0 { 1294 return errors.Wrap(ErrOrderDoesntExist, "must cancel at least 1 order") 1295 } 1296 1297 for idx := range msg.Data { 1298 if err := msg.Data[idx].ValidateBasic(senderAddr); err != nil { 1299 return err 1300 } 1301 } 1302 1303 return nil 1304 } 1305 1306 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 1307 func (msg *MsgBatchCancelDerivativeOrders) GetSignBytes() []byte { 1308 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1309 } 1310 1311 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 1312 func (msg *MsgBatchCancelDerivativeOrders) GetSigners() []sdk.AccAddress { 1313 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1314 if err != nil { 1315 panic(err) 1316 } 1317 return []sdk.AccAddress{sender} 1318 } 1319 1320 // Route implements the sdk.Msg interface. It should return the name of the module 1321 func (msg *MsgCancelBinaryOptionsOrder) Route() string { 1322 return RouterKey 1323 } 1324 1325 // Type implements the sdk.Msg interface. It should return the action. 1326 func (msg *MsgCancelBinaryOptionsOrder) Type() string { 1327 return TypeMsgCancelBinaryOptionsOrder 1328 } 1329 1330 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 1331 func (msg *MsgCancelBinaryOptionsOrder) ValidateBasic() error { 1332 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1333 if err != nil { 1334 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1335 } 1336 1337 orderData := OrderData{ 1338 MarketId: msg.MarketId, 1339 SubaccountId: msg.SubaccountId, 1340 OrderHash: msg.OrderHash, 1341 Cid: msg.Cid, 1342 } 1343 return orderData.ValidateBasic(senderAddr) 1344 } 1345 1346 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 1347 func (msg *MsgCancelBinaryOptionsOrder) GetSignBytes() []byte { 1348 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1349 } 1350 1351 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 1352 func (msg *MsgCancelBinaryOptionsOrder) GetSigners() []sdk.AccAddress { 1353 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1354 if err != nil { 1355 panic(err) 1356 } 1357 return []sdk.AccAddress{sender} 1358 } 1359 1360 func (msg *MsgBatchCancelBinaryOptionsOrders) Route() string { 1361 return RouterKey 1362 } 1363 1364 // Type implements the sdk.Msg interface. It should return the action. 1365 func (msg *MsgBatchCancelBinaryOptionsOrders) Type() string { 1366 return TypeMsgBatchCancelBinaryOptionsOrders 1367 } 1368 1369 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 1370 func (msg *MsgBatchCancelBinaryOptionsOrders) ValidateBasic() error { 1371 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1372 if err != nil { 1373 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1374 } 1375 1376 if len(msg.Data) == 0 { 1377 return errors.Wrap(ErrOrderDoesntExist, "must cancel at least 1 order") 1378 } 1379 1380 for idx := range msg.Data { 1381 if err := msg.Data[idx].ValidateBasic(senderAddr); err != nil { 1382 return err 1383 } 1384 } 1385 1386 return nil 1387 } 1388 1389 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 1390 func (msg *MsgBatchCancelBinaryOptionsOrders) GetSignBytes() []byte { 1391 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1392 } 1393 1394 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 1395 func (msg *MsgBatchCancelBinaryOptionsOrders) GetSigners() []sdk.AccAddress { 1396 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1397 if err != nil { 1398 panic(err) 1399 } 1400 return []sdk.AccAddress{sender} 1401 } 1402 1403 func (msg *MsgSubaccountTransfer) Route() string { 1404 return RouterKey 1405 } 1406 1407 func (msg *MsgSubaccountTransfer) Type() string { 1408 return TypeMsgSubaccountTransfer 1409 } 1410 1411 func (msg *MsgSubaccountTransfer) ValidateBasic() error { 1412 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1413 if err != nil { 1414 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1415 } 1416 if !msg.Amount.IsValid() { 1417 return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) 1418 } 1419 1420 if !msg.Amount.IsPositive() { 1421 return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) 1422 } 1423 1424 if err := CheckValidSubaccountIDOrNonce(senderAddr, msg.SourceSubaccountId); err != nil { 1425 return err 1426 } 1427 1428 if err := CheckValidSubaccountIDOrNonce(senderAddr, msg.DestinationSubaccountId); err != nil { 1429 return err 1430 } 1431 1432 sourceSubaccount, err := GetSubaccountIDOrDeriveFromNonce(senderAddr, msg.SourceSubaccountId) 1433 if err != nil { 1434 return errors.Wrap(ErrBadSubaccountID, msg.SourceSubaccountId) 1435 } 1436 1437 destinationSubaccount, err := GetSubaccountIDOrDeriveFromNonce(senderAddr, msg.DestinationSubaccountId) 1438 if err != nil { 1439 return errors.Wrap(ErrBadSubaccountID, msg.DestinationSubaccountId) 1440 } 1441 1442 if IsDefaultSubaccountID(sourceSubaccount) { 1443 return errors.Wrap(ErrBadSubaccountID, msg.SourceSubaccountId) 1444 } 1445 1446 if IsDefaultSubaccountID(destinationSubaccount) { 1447 return errors.Wrap(ErrBadSubaccountID, msg.DestinationSubaccountId) 1448 } 1449 1450 if !bytes.Equal(SubaccountIDToSdkAddress(sourceSubaccount).Bytes(), SubaccountIDToSdkAddress(destinationSubaccount).Bytes()) { 1451 return errors.Wrap(ErrBadSubaccountID, msg.DestinationSubaccountId) 1452 } 1453 1454 return nil 1455 } 1456 1457 func (msg *MsgSubaccountTransfer) GetSignBytes() []byte { 1458 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1459 } 1460 1461 func (msg *MsgSubaccountTransfer) GetSigners() []sdk.AccAddress { 1462 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1463 if err != nil { 1464 panic(err) 1465 } 1466 return []sdk.AccAddress{sender} 1467 } 1468 1469 func (msg *MsgExternalTransfer) Route() string { 1470 return RouterKey 1471 } 1472 1473 func (msg *MsgExternalTransfer) Type() string { 1474 return TypeMsgExternalTransfer 1475 } 1476 1477 func (msg *MsgExternalTransfer) ValidateBasic() error { 1478 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1479 if err != nil { 1480 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1481 } 1482 1483 if !msg.Amount.IsValid() { 1484 return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) 1485 } 1486 1487 if !msg.Amount.IsPositive() { 1488 return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) 1489 } 1490 1491 if err := CheckValidSubaccountIDOrNonce(senderAddr, msg.SourceSubaccountId); err != nil { 1492 return err 1493 } 1494 1495 sourceSubaccountId, err := GetSubaccountIDOrDeriveFromNonce(senderAddr, msg.SourceSubaccountId) 1496 if err != nil { 1497 return errors.Wrap(ErrBadSubaccountID, msg.SourceSubaccountId) 1498 } 1499 1500 if IsDefaultSubaccountID(common.HexToHash(msg.SourceSubaccountId)) { 1501 return errors.Wrap(ErrBadSubaccountID, msg.SourceSubaccountId) 1502 } 1503 1504 if _, ok := IsValidSubaccountID(msg.DestinationSubaccountId); !ok { 1505 return errors.Wrap(ErrBadSubaccountID, msg.DestinationSubaccountId) 1506 } 1507 1508 if !bytes.Equal(SubaccountIDToSdkAddress(sourceSubaccountId).Bytes(), senderAddr.Bytes()) { 1509 return errors.Wrap(ErrBadSubaccountID, msg.DestinationSubaccountId) 1510 } 1511 return nil 1512 } 1513 1514 func (msg *MsgExternalTransfer) GetSignBytes() []byte { 1515 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1516 } 1517 1518 func (msg *MsgExternalTransfer) GetSigners() []sdk.AccAddress { 1519 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1520 if err != nil { 1521 panic(err) 1522 } 1523 return []sdk.AccAddress{sender} 1524 } 1525 1526 func (msg *MsgIncreasePositionMargin) Route() string { 1527 return RouterKey 1528 } 1529 1530 func (msg *MsgIncreasePositionMargin) Type() string { 1531 return TypeMsgIncreasePositionMargin 1532 } 1533 1534 func (msg *MsgIncreasePositionMargin) ValidateBasic() error { 1535 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1536 if err != nil { 1537 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1538 } 1539 1540 if !IsHexHash(msg.MarketId) { 1541 return errors.Wrap(ErrMarketInvalid, msg.MarketId) 1542 } 1543 1544 if !msg.Amount.IsPositive() { 1545 return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) 1546 } 1547 1548 if msg.Amount.GT(MaxOrderMargin) { 1549 return errors.Wrap(ErrTooMuchOrderMargin, msg.Amount.String()) 1550 } 1551 1552 if err := CheckValidSubaccountIDOrNonce(senderAddr, msg.SourceSubaccountId); err != nil { 1553 return err 1554 } 1555 1556 _, ok := IsValidSubaccountID(msg.DestinationSubaccountId) 1557 if !ok { 1558 return errors.Wrap(ErrBadSubaccountID, msg.DestinationSubaccountId) 1559 } 1560 1561 return nil 1562 } 1563 1564 func (msg *MsgIncreasePositionMargin) GetSignBytes() []byte { 1565 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1566 } 1567 1568 func (msg *MsgIncreasePositionMargin) GetSigners() []sdk.AccAddress { 1569 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1570 if err != nil { 1571 panic(err) 1572 } 1573 return []sdk.AccAddress{sender} 1574 } 1575 1576 func (msg *MsgDecreasePositionMargin) Route() string { 1577 return RouterKey 1578 } 1579 1580 func (msg *MsgDecreasePositionMargin) Type() string { 1581 return TypeMsgDecreasePositionMargin 1582 } 1583 1584 func (msg *MsgDecreasePositionMargin) ValidateBasic() error { 1585 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1586 if err != nil { 1587 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1588 } 1589 1590 if !IsHexHash(msg.MarketId) { 1591 return errors.Wrap(ErrMarketInvalid, msg.MarketId) 1592 } 1593 1594 if !msg.Amount.IsPositive() { 1595 return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) 1596 } 1597 1598 if msg.Amount.GT(MaxOrderMargin) { 1599 return errors.Wrap(ErrTooMuchOrderMargin, msg.Amount.String()) 1600 } 1601 1602 if err := CheckValidSubaccountIDOrNonce(senderAddr, msg.SourceSubaccountId); err != nil { 1603 return err 1604 } 1605 if err := CheckValidSubaccountIDOrNonce(senderAddr, msg.DestinationSubaccountId); err != nil { 1606 return err 1607 } 1608 1609 return nil 1610 } 1611 1612 func (msg *MsgDecreasePositionMargin) GetSignBytes() []byte { 1613 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1614 } 1615 1616 func (msg *MsgDecreasePositionMargin) GetSigners() []sdk.AccAddress { 1617 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1618 if err != nil { 1619 panic(err) 1620 } 1621 return []sdk.AccAddress{sender} 1622 } 1623 1624 func (msg *MsgPrivilegedExecuteContract) Route() string { 1625 return RouterKey 1626 } 1627 1628 func (msg *MsgPrivilegedExecuteContract) Type() string { 1629 return TypeMsgPrivilegedExecuteContract 1630 } 1631 1632 func (msg *MsgPrivilegedExecuteContract) ValidateBasic() error { 1633 _, err := sdk.AccAddressFromBech32(msg.Sender) 1634 if err != nil { 1635 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1636 } 1637 1638 // funds must either be "empty" or a valid funds coins string 1639 if !msg.HasEmptyFunds() { 1640 if coins, err := sdk.ParseDecCoins(msg.Funds); err != nil || !coins.IsAllPositive() { 1641 return errors.Wrap(sdkerrors.ErrInvalidCoins, msg.Funds) 1642 } 1643 } 1644 1645 _, err = sdk.AccAddressFromBech32(msg.ContractAddress) 1646 if err != nil { 1647 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.ContractAddress) 1648 } 1649 1650 var e wasmxtypes.ExecutionData 1651 if err := json.Unmarshal([]byte(msg.Data), &e); err != nil { 1652 return errors.Wrap(err, msg.Data) 1653 } 1654 1655 if e.Name == "" { 1656 return errors.Wrap(ErrBadField, "name should not be empty") 1657 } else if e.Origin != "" && e.Origin != msg.Sender { 1658 return errors.Wrap(ErrBadField, "origin must match sender or be empty") 1659 } 1660 1661 return nil 1662 } 1663 1664 func (msg *MsgPrivilegedExecuteContract) HasEmptyFunds() bool { 1665 return msg.Funds == "" || msg.Funds == "0" || msg.Funds == "0inj" 1666 } 1667 1668 func (msg *MsgPrivilegedExecuteContract) GetSignBytes() []byte { 1669 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1670 } 1671 1672 func (msg *MsgPrivilegedExecuteContract) GetSigners() []sdk.AccAddress { 1673 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1674 if err != nil { 1675 panic(err) 1676 } 1677 return []sdk.AccAddress{sender} 1678 } 1679 1680 func (msg *MsgRewardsOptOut) Route() string { 1681 return RouterKey 1682 } 1683 1684 func (msg *MsgRewardsOptOut) Type() string { 1685 return TypeMsgRewardsOptOut 1686 } 1687 1688 func (msg *MsgRewardsOptOut) ValidateBasic() error { 1689 1690 return nil 1691 } 1692 1693 func (msg *MsgRewardsOptOut) GetSignBytes() []byte { 1694 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1695 } 1696 1697 func (msg *MsgRewardsOptOut) GetSigners() []sdk.AccAddress { 1698 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1699 if err != nil { 1700 panic(err) 1701 } 1702 return []sdk.AccAddress{sender} 1703 } 1704 1705 func (msg *MsgLiquidatePosition) Route() string { 1706 return RouterKey 1707 } 1708 1709 func (msg *MsgLiquidatePosition) Type() string { 1710 return TypeMsgLiquidatePosition 1711 } 1712 1713 func (msg *MsgLiquidatePosition) ValidateBasic() error { 1714 senderAddr, err := sdk.AccAddressFromBech32(msg.Sender) 1715 1716 if err != nil { 1717 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1718 } 1719 1720 if !IsHexHash(msg.MarketId) { 1721 return errors.Wrap(ErrMarketInvalid, msg.MarketId) 1722 } 1723 1724 _, ok := IsValidSubaccountID(msg.SubaccountId) 1725 if !ok { 1726 return errors.Wrap(ErrBadSubaccountID, msg.SubaccountId) 1727 } 1728 1729 if msg.Order != nil { 1730 liquidatorSubaccountID, err := GetSubaccountIDOrDeriveFromNonce(senderAddr, msg.Order.OrderInfo.SubaccountId) 1731 if err != nil { 1732 return err 1733 } 1734 1735 // cannot liquidate own position with an order 1736 if liquidatorSubaccountID == common.HexToHash(msg.SubaccountId) { 1737 return ErrInvalidLiquidationOrder 1738 } 1739 1740 if err := msg.Order.ValidateBasic(senderAddr, false); err != nil { 1741 return err 1742 } 1743 } 1744 1745 return nil 1746 } 1747 1748 func (msg *MsgLiquidatePosition) GetSignBytes() []byte { 1749 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1750 } 1751 1752 func (msg *MsgLiquidatePosition) GetSigners() []sdk.AccAddress { 1753 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1754 if err != nil { 1755 panic(err) 1756 } 1757 return []sdk.AccAddress{sender} 1758 } 1759 1760 func (msg *MsgEmergencySettleMarket) Route() string { 1761 return RouterKey 1762 } 1763 1764 func (msg *MsgEmergencySettleMarket) Type() string { 1765 return TypeMsgEmergencySettleMarket 1766 } 1767 1768 func (msg *MsgEmergencySettleMarket) ValidateBasic() error { 1769 _, err := sdk.AccAddressFromBech32(msg.Sender) 1770 1771 if err != nil { 1772 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1773 } 1774 1775 if !IsHexHash(msg.MarketId) { 1776 return errors.Wrap(ErrMarketInvalid, msg.MarketId) 1777 } 1778 1779 _, ok := IsValidSubaccountID(msg.SubaccountId) 1780 if !ok { 1781 return errors.Wrap(ErrBadSubaccountID, msg.SubaccountId) 1782 } 1783 1784 return nil 1785 } 1786 1787 func (msg *MsgEmergencySettleMarket) GetSignBytes() []byte { 1788 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1789 } 1790 1791 func (msg *MsgEmergencySettleMarket) GetSigners() []sdk.AccAddress { 1792 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1793 if err != nil { 1794 panic(err) 1795 } 1796 return []sdk.AccAddress{sender} 1797 } 1798 1799 // Route implements the sdk.Msg interface. It should return the name of the module 1800 func (msg MsgBatchUpdateOrders) Route() string { return RouterKey } 1801 1802 // Type implements the sdk.Msg interface. It should return the action. 1803 func (msg MsgBatchUpdateOrders) Type() string { return TypeMsgBatchUpdateOrders } 1804 1805 // ValidateBasic implements the sdk.Msg interface. It runs stateless checks on the message 1806 func (msg MsgBatchUpdateOrders) ValidateBasic() error { 1807 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1808 if err != nil { 1809 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1810 } 1811 1812 hasCancelAllMarketId := len(msg.SpotMarketIdsToCancelAll) > 0 || len(msg.DerivativeMarketIdsToCancelAll) > 0 || len(msg.BinaryOptionsMarketIdsToCancelAll) > 0 1813 1814 // for MsgBatchUpdateOrders, empty subaccountIDs do not count as the default subaccount 1815 hasSubaccountIdForCancelAll := msg.SubaccountId != "" 1816 1817 if hasCancelAllMarketId && !hasSubaccountIdForCancelAll { 1818 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg contains cancel all marketIDs but no subaccountID") 1819 } 1820 1821 if hasSubaccountIdForCancelAll && !hasCancelAllMarketId { 1822 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg contains subaccountID but no cancel all marketIDs") 1823 } 1824 1825 if hasSubaccountIdForCancelAll { 1826 if err := CheckValidSubaccountIDOrNonce(sender, msg.SubaccountId); err != nil { 1827 return err 1828 } 1829 1830 hasDuplicateSpotMarketIDs := HasDuplicatesHexHash(msg.SpotMarketIdsToCancelAll) 1831 if hasDuplicateSpotMarketIDs { 1832 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg contains duplicate cancel all spot market ids") 1833 } 1834 1835 hasDuplicateDerivativesMarketIDs := HasDuplicatesHexHash(msg.DerivativeMarketIdsToCancelAll) 1836 if hasDuplicateDerivativesMarketIDs { 1837 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg contains duplicate cancel all derivative market ids") 1838 } 1839 hasDuplicateBinaryOptionsMarketIDs := HasDuplicatesHexHash(msg.BinaryOptionsMarketIdsToCancelAll) 1840 if hasDuplicateBinaryOptionsMarketIDs { 1841 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg contains duplicate cancel all binary options market ids") 1842 } 1843 } 1844 1845 if !hasSubaccountIdForCancelAll && 1846 len(msg.DerivativeOrdersToCancel) == 0 && 1847 len(msg.SpotOrdersToCancel) == 0 && 1848 len(msg.DerivativeOrdersToCreate) == 0 && 1849 len(msg.SpotOrdersToCreate) == 0 && 1850 len(msg.BinaryOptionsOrdersToCreate) == 0 && 1851 len(msg.BinaryOptionsOrdersToCancel) == 0 { 1852 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg is empty") 1853 } 1854 1855 hasDuplicateSpotOrderToCancel := HasDuplicatesOrder(msg.SpotOrdersToCancel) 1856 if hasDuplicateSpotOrderToCancel { 1857 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg contains duplicate spot order to cancel") 1858 } 1859 1860 hasDuplicateDerivativeOrderToCancel := HasDuplicatesOrder(msg.DerivativeOrdersToCancel) 1861 if hasDuplicateDerivativeOrderToCancel { 1862 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg contains duplicate derivative order to cancel") 1863 } 1864 1865 hasDuplicateBinaryOptionsOrderToCancel := HasDuplicatesOrder(msg.BinaryOptionsOrdersToCancel) 1866 if hasDuplicateBinaryOptionsOrderToCancel { 1867 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg contains duplicate binary options order to cancel") 1868 } 1869 1870 if len(msg.SpotMarketIdsToCancelAll) > 0 && len(msg.SpotOrdersToCancel) > 0 { 1871 seen := make(map[common.Hash]struct{}) 1872 for _, marketID := range msg.SpotMarketIdsToCancelAll { 1873 if !IsHexHash(marketID) { 1874 return errors.Wrap(ErrMarketInvalid, marketID) 1875 } 1876 seen[common.HexToHash(marketID)] = struct{}{} 1877 } 1878 1879 for idx := range msg.SpotOrdersToCancel { 1880 if _, ok := seen[common.HexToHash(msg.SpotOrdersToCancel[idx].MarketId)]; ok { 1881 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg contains order to cancel in a spot market that is also in cancel all") 1882 } 1883 } 1884 } 1885 1886 if len(msg.DerivativeMarketIdsToCancelAll) > 0 && len(msg.DerivativeOrdersToCancel) > 0 { 1887 seen := make(map[common.Hash]struct{}) 1888 for _, marketID := range msg.DerivativeMarketIdsToCancelAll { 1889 if !IsHexHash(marketID) { 1890 return errors.Wrap(ErrMarketInvalid, marketID) 1891 } 1892 seen[common.HexToHash(marketID)] = struct{}{} 1893 } 1894 1895 for idx := range msg.DerivativeOrdersToCancel { 1896 if _, ok := seen[common.HexToHash(msg.DerivativeOrdersToCancel[idx].MarketId)]; ok { 1897 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg contains order to cancel in a derivative market that is also in cancel all") 1898 } 1899 } 1900 } 1901 1902 if len(msg.BinaryOptionsMarketIdsToCancelAll) > 0 && len(msg.BinaryOptionsOrdersToCancel) > 0 { 1903 seen := make(map[common.Hash]struct{}) 1904 for _, marketID := range msg.BinaryOptionsMarketIdsToCancelAll { 1905 if !IsHexHash(marketID) { 1906 return errors.Wrap(ErrMarketInvalid, marketID) 1907 } 1908 seen[common.HexToHash(marketID)] = struct{}{} 1909 } 1910 1911 for idx := range msg.BinaryOptionsOrdersToCancel { 1912 if _, ok := seen[common.HexToHash(msg.BinaryOptionsOrdersToCancel[idx].MarketId)]; ok { 1913 return errors.Wrap(ErrInvalidBatchMsgUpdate, "msg contains order to cancel in a binary options market that is also in cancel all") 1914 } 1915 } 1916 } 1917 1918 for idx := range msg.SpotOrdersToCancel { 1919 if err := msg.SpotOrdersToCancel[idx].ValidateBasic(sender); err != nil { 1920 return err 1921 } 1922 } 1923 1924 for idx := range msg.DerivativeOrdersToCancel { 1925 if err := msg.DerivativeOrdersToCancel[idx].ValidateBasic(sender); err != nil { 1926 return err 1927 } 1928 } 1929 for idx := range msg.BinaryOptionsOrdersToCancel { 1930 if err := msg.BinaryOptionsOrdersToCancel[idx].ValidateBasic(sender); err != nil { 1931 return err 1932 } 1933 } 1934 1935 for idx := range msg.SpotOrdersToCreate { 1936 if err := msg.SpotOrdersToCreate[idx].ValidateBasic(sender); err != nil { 1937 return err 1938 } 1939 if msg.SpotOrdersToCreate[idx].OrderType.IsAtomic() { // must be checked separately as type is SpotOrder, so it won't check for atomic orders properly 1940 return errors.Wrap(ErrInvalidOrderTypeForMessage, "Spot limit orders can't be atomic orders") 1941 } 1942 } 1943 1944 for idx := range msg.DerivativeOrdersToCreate { 1945 if err := msg.DerivativeOrdersToCreate[idx].ValidateBasic(sender, false); err != nil { 1946 return err 1947 } 1948 if msg.DerivativeOrdersToCreate[idx].OrderType.IsAtomic() { 1949 return errors.Wrap(ErrInvalidOrderTypeForMessage, "Derivative limit orders can't be atomic orders") 1950 } 1951 } 1952 1953 for idx := range msg.BinaryOptionsOrdersToCreate { 1954 if err := msg.BinaryOptionsOrdersToCreate[idx].ValidateBasic(sender, true); err != nil { 1955 return err 1956 } 1957 if msg.BinaryOptionsOrdersToCreate[idx].OrderType.IsAtomic() { 1958 return errors.Wrap(ErrInvalidOrderTypeForMessage, "Binary limit orders can't be atomic orders") 1959 } 1960 } 1961 1962 return nil 1963 } 1964 1965 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 1966 func (msg *MsgBatchUpdateOrders) GetSignBytes() []byte { 1967 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 1968 } 1969 1970 // GetSigners implements the sdk.Msg interface. It defines whose signature is required 1971 func (msg MsgBatchUpdateOrders) GetSigners() []sdk.AccAddress { 1972 sender, err := sdk.AccAddressFromBech32(msg.Sender) 1973 if err != nil { 1974 panic(err) 1975 } 1976 return []sdk.AccAddress{sender} 1977 } 1978 1979 func (msg *MsgAdminUpdateBinaryOptionsMarket) Route() string { 1980 return RouterKey 1981 } 1982 1983 func (msg *MsgAdminUpdateBinaryOptionsMarket) Type() string { 1984 return TypeMsgAdminUpdateBinaryOptionsMarket 1985 } 1986 1987 func (msg *MsgAdminUpdateBinaryOptionsMarket) ValidateBasic() error { 1988 if _, err := sdk.AccAddressFromBech32(msg.Sender); err != nil { 1989 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 1990 } 1991 1992 if !IsHexHash(msg.MarketId) { 1993 return errors.Wrap(ErrMarketInvalid, msg.MarketId) 1994 } 1995 1996 if (msg.SettlementTimestamp > 0 && msg.ExpirationTimestamp >= msg.SettlementTimestamp) || 1997 msg.ExpirationTimestamp < 0 { 1998 return ErrInvalidExpiry 1999 } 2000 2001 if msg.SettlementTimestamp < 0 { 2002 return ErrInvalidSettlement 2003 } 2004 2005 // price is either nil (not set), -1 (demolish with refund) or [0..1] (demolish with settle) 2006 switch { 2007 case msg.SettlementPrice == nil, 2008 msg.SettlementPrice.IsNil(): 2009 // ok 2010 case msg.SettlementPrice.Equal(BinaryOptionsMarketRefundFlagPrice), 2011 msg.SettlementPrice.GTE(math.LegacyZeroDec()) && msg.SettlementPrice.LTE(MaxBinaryOptionsOrderPrice): 2012 if msg.Status != MarketStatus_Demolished { 2013 return errors.Wrapf(ErrInvalidMarketStatus, "status should be set to demolished when the settlement price is set, status: %s", msg.Status.String()) 2014 } 2015 // ok 2016 default: 2017 return errors.Wrap(ErrInvalidPrice, msg.SettlementPrice.String()) 2018 } 2019 // admin can only change status to demolished 2020 switch msg.Status { 2021 case 2022 MarketStatus_Unspecified, 2023 MarketStatus_Demolished: 2024 default: 2025 return errors.Wrap(ErrInvalidMarketStatus, msg.Status.String()) 2026 } 2027 2028 return nil 2029 } 2030 2031 func (msg *MsgAdminUpdateBinaryOptionsMarket) GetSignBytes() []byte { 2032 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 2033 } 2034 2035 func (msg *MsgAdminUpdateBinaryOptionsMarket) GetSigners() []sdk.AccAddress { 2036 sender, err := sdk.AccAddressFromBech32(msg.Sender) 2037 if err != nil { 2038 panic(err) 2039 } 2040 return []sdk.AccAddress{sender} 2041 } 2042 2043 func (msg *MsgAuthorizeStakeGrants) Route() string { return RouterKey } 2044 2045 func (msg *MsgAuthorizeStakeGrants) Type() string { return TypeMsgAuthorizeStakeGrants } 2046 2047 func (msg *MsgAuthorizeStakeGrants) ValidateBasic() error { 2048 if _, err := sdk.AccAddressFromBech32(msg.Sender); err != nil { 2049 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 2050 } 2051 2052 for idx := range msg.Grants { 2053 grant := msg.Grants[idx] 2054 2055 if _, err := sdk.AccAddressFromBech32(grant.Grantee); err != nil { 2056 return errors.Wrap(sdkerrors.ErrInvalidAddress, grant.Grantee) 2057 } 2058 2059 if grant.Amount.IsNegative() || grant.Amount.GT(MaxTokenInt) { 2060 return errors.Wrap(ErrInvalidStakeGrant, grant.Amount.String()) 2061 2062 } 2063 } 2064 return nil 2065 } 2066 2067 func (msg *MsgAuthorizeStakeGrants) GetSigners() []sdk.AccAddress { 2068 sender, err := sdk.AccAddressFromBech32(msg.Sender) 2069 if err != nil { 2070 panic(err) 2071 } 2072 return []sdk.AccAddress{sender} 2073 } 2074 2075 // GetSignBytes implements the sdk.Msg interface. It encodes the message for signing 2076 func (msg *MsgAuthorizeStakeGrants) GetSignBytes() []byte { 2077 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 2078 } 2079 2080 func (msg *MsgActivateStakeGrant) Route() string { return RouterKey } 2081 2082 func (msg *MsgActivateStakeGrant) Type() string { return TypeMsgActivateStakeGrant } 2083 2084 func (msg *MsgActivateStakeGrant) ValidateBasic() error { 2085 if _, err := sdk.AccAddressFromBech32(msg.Sender); err != nil { 2086 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Sender) 2087 } 2088 2089 if _, err := sdk.AccAddressFromBech32(msg.Granter); err != nil { 2090 return errors.Wrap(sdkerrors.ErrInvalidAddress, msg.Granter) 2091 } 2092 return nil 2093 } 2094 2095 func (msg *MsgActivateStakeGrant) GetSigners() []sdk.AccAddress { 2096 sender, err := sdk.AccAddressFromBech32(msg.Sender) 2097 if err != nil { 2098 panic(err) 2099 } 2100 return []sdk.AccAddress{sender} 2101 } 2102 2103 func (msg *MsgActivateStakeGrant) GetSignBytes() []byte { 2104 return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) 2105 }