github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/staking/types/msg.go (about)

     1  package types
     2  
     3  import (
     4  	"encoding/json"
     5  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto"
     6  	"github.com/fibonacci-chain/fbc/x/common"
     7  
     8  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     9  )
    10  
    11  // ensure Msg interface compliance at compile time
    12  var (
    13  	_ sdk.Msg = &MsgCreateValidator{}
    14  	_ sdk.Msg = &MsgEditValidator{}
    15  )
    16  
    17  //______________________________________________________________________
    18  
    19  // MsgCreateValidator - struct for bonding transactions
    20  type MsgCreateValidator struct {
    21  	Description Description `json:"description" yaml:"description"`
    22  	//Commission        CommissionRates `json:"commission" yaml:"commission"`
    23  	MinSelfDelegation sdk.SysCoin    `json:"min_self_delegation" yaml:"min_self_delegation"`
    24  	DelegatorAddress  sdk.AccAddress `json:"delegator_address" yaml:"delegator_address"`
    25  	ValidatorAddress  sdk.ValAddress `json:"validator_address" yaml:"validator_address"`
    26  	PubKey            crypto.PubKey  `json:"pubkey" yaml:"pubkey"`
    27  }
    28  
    29  type msgCreateValidatorJSON struct {
    30  	Description Description `json:"description" yaml:"description"`
    31  	//Commission        CommissionRates `json:"commission" yaml:"commission"`
    32  	MinSelfDelegation sdk.SysCoin    `json:"min_self_delegation" yaml:"min_self_delegation"`
    33  	DelegatorAddress  sdk.AccAddress `json:"delegator_address" yaml:"delegator_address"`
    34  	ValidatorAddress  sdk.ValAddress `json:"validator_address" yaml:"validator_address"`
    35  	PubKey            string         `json:"pubkey" yaml:"pubkey"`
    36  }
    37  
    38  // NewMsgCreateValidator creates a msg of create-validator
    39  // Delegator address and validator address are the same
    40  func NewMsgCreateValidator(
    41  	valAddr sdk.ValAddress, pubKey crypto.PubKey,
    42  	description Description, minSelfDelegation sdk.SysCoin,
    43  ) MsgCreateValidator {
    44  
    45  	return MsgCreateValidator{
    46  		Description:       description,
    47  		DelegatorAddress:  sdk.AccAddress(valAddr),
    48  		ValidatorAddress:  valAddr,
    49  		PubKey:            pubKey,
    50  		MinSelfDelegation: minSelfDelegation,
    51  	}
    52  }
    53  
    54  // nolint
    55  func (msg MsgCreateValidator) Route() string { return RouterKey }
    56  func (msg MsgCreateValidator) Type() string  { return "create_validator" }
    57  
    58  // GetSigners returns address(es) that must sign over msg.GetSignBytes()
    59  func (msg MsgCreateValidator) GetSigners() []sdk.AccAddress {
    60  	// delegator is first signer so delegator pays fees
    61  	addrs := []sdk.AccAddress{msg.DelegatorAddress}
    62  
    63  	// TODO: the following will never be execute becoz ValidateBasic() raise error if DlgAddress != ValAddress
    64  	//if !bytes.Equal(msg.DelegatorAddress.Bytes(), msg.ValidatorAddress.Bytes()) {
    65  	//	// if validator addr is not same as delegator addr, validator must sign
    66  	//	// msg as well
    67  	//	addrs = append(addrs, sdk.AccAddress(msg.ValidatorAddress))
    68  	//}
    69  	return addrs
    70  }
    71  
    72  // MarshalJSON implements the json.Marshaler interface to provide custom JSON serialization
    73  func (msg MsgCreateValidator) MarshalJSON() ([]byte, error) {
    74  	return json.Marshal(msgCreateValidatorJSON{
    75  		Description:       msg.Description,
    76  		DelegatorAddress:  msg.DelegatorAddress,
    77  		ValidatorAddress:  msg.ValidatorAddress,
    78  		PubKey:            MustBech32ifyConsPub(msg.PubKey),
    79  		MinSelfDelegation: msg.MinSelfDelegation,
    80  	})
    81  }
    82  
    83  // UnmarshalJSON implements the json.Unmarshaler interface to provide custom JSON deserialization
    84  func (msg *MsgCreateValidator) UnmarshalJSON(bz []byte) error {
    85  	var msgCreateValJSON msgCreateValidatorJSON
    86  	if err := json.Unmarshal(bz, &msgCreateValJSON); err != nil {
    87  		return common.ErrUnMarshalJSONFailed(err.Error())
    88  	}
    89  
    90  	msg.Description = msgCreateValJSON.Description
    91  	msg.DelegatorAddress = msgCreateValJSON.DelegatorAddress
    92  	msg.ValidatorAddress = msgCreateValJSON.ValidatorAddress
    93  	var err error
    94  	msg.PubKey, err = GetConsPubKeyBech32(msgCreateValJSON.PubKey)
    95  	if err != nil {
    96  		return ErrGetConsPubKeyBech32()
    97  	}
    98  	msg.MinSelfDelegation = msgCreateValJSON.MinSelfDelegation
    99  
   100  	return nil
   101  }
   102  
   103  // GetSignBytes returns the message bytes to sign over
   104  func (msg MsgCreateValidator) GetSignBytes() []byte {
   105  	bz := ModuleCdc.MustMarshalJSON(msg)
   106  	return sdk.MustSortJSON(bz)
   107  }
   108  
   109  // ValidateBasic gives a quick validity check
   110  func (msg MsgCreateValidator) ValidateBasic() error {
   111  	// note that unmarshaling from bech32 ensures either empty or valid
   112  	if msg.DelegatorAddress.Empty() {
   113  		return ErrNilDelegatorAddr()
   114  	}
   115  	if msg.ValidatorAddress.Empty() {
   116  		return ErrNilValidatorAddr()
   117  	}
   118  	if !sdk.AccAddress(msg.ValidatorAddress).Equals(msg.DelegatorAddress) {
   119  		return ErrBadValidatorAddr()
   120  	}
   121  	if msg.MinSelfDelegation.Amount.LTE(sdk.ZeroDec()) || !msg.MinSelfDelegation.IsValid() {
   122  		return ErrMinSelfDelegationInvalid()
   123  	}
   124  	if msg.Description == (Description{}) {
   125  		return ErrDescriptionIsEmpty()
   126  	}
   127  
   128  	return nil
   129  }
   130  
   131  // MsgEditValidator - struct for editing a validator
   132  type MsgEditValidator struct {
   133  	Description
   134  	ValidatorAddress sdk.ValAddress `json:"address" yaml:"address"`
   135  }
   136  
   137  // NewMsgEditValidator creates a msg of edit-validator
   138  func NewMsgEditValidator(valAddr sdk.ValAddress, description Description) MsgEditValidator {
   139  	return MsgEditValidator{
   140  		Description:      description,
   141  		ValidatorAddress: valAddr,
   142  	}
   143  }
   144  
   145  // nolint
   146  func (msg MsgEditValidator) Route() string { return RouterKey }
   147  func (msg MsgEditValidator) Type() string  { return "edit_validator" }
   148  func (msg MsgEditValidator) GetSigners() []sdk.AccAddress {
   149  	return []sdk.AccAddress{sdk.AccAddress(msg.ValidatorAddress)}
   150  }
   151  
   152  // GetSignBytes gets the bytes for the message signer to sign on
   153  func (msg MsgEditValidator) GetSignBytes() []byte {
   154  	bz := ModuleCdc.MustMarshalJSON(msg)
   155  	return sdk.MustSortJSON(bz)
   156  }
   157  
   158  // ValidateBasic gives a quick validity check
   159  func (msg MsgEditValidator) ValidateBasic() error {
   160  	if msg.ValidatorAddress.Empty() {
   161  		return ErrNilValidatorAddr()
   162  	}
   163  
   164  	if msg.Description == (Description{}) {
   165  		return ErrNilValidatorAddr()
   166  	}
   167  
   168  	return nil
   169  }