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 }