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  }