github.com/lino-network/lino@v0.6.11/x/account/types/msg.go (about) 1 package types 2 3 import ( 4 "fmt" 5 6 sdk "github.com/cosmos/cosmos-sdk/types" 7 crypto "github.com/tendermint/tendermint/crypto" 8 9 "github.com/lino-network/lino/types" 10 ) 11 12 // TransferMsg - sender transfer money to receiver 13 type TransferMsg struct { 14 Sender types.AccountKey `json:"sender"` 15 Receiver types.AccountKey `json:"receiver"` 16 Amount types.LNO `json:"amount"` 17 Memo string `json:"memo"` 18 } 19 20 var _ types.Msg = TransferMsg{} 21 22 // NewTransferMsg - return a TransferMsg 23 func NewTransferMsg(sender, receiver string, amount types.LNO, memo string) TransferMsg { 24 return TransferMsg{ 25 Sender: types.AccountKey(sender), 26 Receiver: types.AccountKey(receiver), 27 Amount: amount, 28 Memo: memo, 29 } 30 } 31 32 // Route - implements sdk.Msg 33 func (msg TransferMsg) Route() string { return RouterKey } 34 35 // Type - implements sdk.Msg 36 func (msg TransferMsg) Type() string { return "TransferMsg" } 37 38 // ValidateBasic - implements sdk.Msg 39 func (msg TransferMsg) ValidateBasic() sdk.Error { 40 if len(msg.Sender) < types.MinimumUsernameLength || 41 len(msg.Sender) > types.MaximumUsernameLength || 42 len(msg.Receiver) < types.MinimumUsernameLength || 43 len(msg.Receiver) > types.MaximumUsernameLength { 44 return ErrInvalidUsername("illegal length") 45 } 46 _, err := types.LinoToCoin(msg.Amount) 47 if err != nil { 48 return err 49 } 50 51 if len(msg.Memo) > types.MaximumMemoLength { 52 return ErrInvalidMemo() 53 } 54 return nil 55 } 56 57 func (msg TransferMsg) String() string { 58 return fmt.Sprintf("TransferMsg{Sender:%v, Receiver:%v, Amount:%v, Memo:%v}", 59 msg.Sender, msg.Receiver, msg.Amount, msg.Memo) 60 } 61 62 // GetPermission - implements types.Msg 63 func (msg TransferMsg) GetPermission() types.Permission { 64 return types.TransactionPermission 65 } 66 67 // GetSignBytes - implements sdk.Msg 68 func (msg TransferMsg) GetSignBytes() []byte { 69 b, err := msgCdc.MarshalJSON(msg) // XXX: ensure some canonical form 70 if err != nil { 71 panic(err) 72 } 73 return b 74 } 75 76 // GetSigners - implements sdk.Msg 77 func (msg TransferMsg) GetSigners() []sdk.AccAddress { 78 return []sdk.AccAddress{sdk.AccAddress(msg.Sender)} 79 } 80 81 // GetConsumeAmount - implements types.Msg 82 func (msg TransferMsg) GetConsumeAmount() types.Coin { 83 return types.NewCoinFromInt64(0) 84 } 85 86 // TransferV2Msg - support account/addr to account/addr 87 type TransferV2Msg struct { 88 Sender types.AccOrAddr `json:"sender"` 89 Receiver types.AccOrAddr `json:"receiver"` 90 Amount types.LNO `json:"amount"` 91 Memo string `json:"memo"` 92 } 93 94 var _ types.AddrMsg = TransferV2Msg{} 95 96 // NewTransferV2Msg - return a TransferV2Msg 97 func NewTransferV2Msg(sender, receiver types.AccOrAddr, amount types.LNO, memo string) TransferV2Msg { 98 return TransferV2Msg{ 99 Sender: sender, 100 Receiver: receiver, 101 Amount: amount, 102 Memo: memo, 103 } 104 } 105 106 // Route - implements sdk.Msg 107 func (msg TransferV2Msg) Route() string { return RouterKey } 108 109 // Type - implements sdk.Msg 110 func (msg TransferV2Msg) Type() string { return "TransferV2Msg" } 111 112 // ValidateBasic - implements sdk.Msg 113 func (msg TransferV2Msg) ValidateBasic() sdk.Error { 114 if !msg.Sender.IsValid() { 115 return ErrInvalidUsername(msg.Sender.String()) 116 } 117 if !msg.Receiver.IsValid() { 118 return ErrInvalidUsername(msg.Receiver.String()) 119 } 120 _, err := types.LinoToCoin(msg.Amount) 121 if err != nil { 122 return err 123 } 124 125 if len(msg.Memo) > types.MaximumMemoLength { 126 return ErrInvalidMemo() 127 } 128 return nil 129 } 130 131 func (msg TransferV2Msg) String() string { 132 return fmt.Sprintf("TransferV2Msg{Sender:%s,Receiver:%s,Amount:%s,Memo:%s}", 133 msg.Sender, msg.Receiver, msg.Amount, msg.Memo) 134 } 135 136 // GetSignBytes - implements sdk.Msg 137 func (msg TransferV2Msg) GetSignBytes() []byte { 138 return getSignBytes(msg) 139 } 140 141 // GetSigners - implements sdk.Msg 142 func (msg TransferV2Msg) GetSigners() []sdk.AccAddress { 143 return []sdk.AccAddress{sdk.AccAddress(msg.Sender.String())} 144 } 145 146 // GetAccOrAddrSigners - implements types.AddrMsg 147 func (msg TransferV2Msg) GetAccOrAddrSigners() []types.AccOrAddr { 148 return []types.AccOrAddr{msg.Sender} 149 } 150 151 // RecoverMsg - replace two keys 152 type RecoverMsg struct { 153 Username types.AccountKey `json:"username"` 154 NewTxPubKey crypto.PubKey `json:"new_tx_public_key"` 155 NewSigningPubKey crypto.PubKey `json:"new_signing_public_key"` 156 } 157 158 var _ types.Msg = RecoverMsg{} 159 160 // NewRecoverMsg - return a recover msg 161 func NewRecoverMsg( 162 username string, transactionPubkey, signingPubkey crypto.PubKey) RecoverMsg { 163 return RecoverMsg{ 164 Username: types.AccountKey(username), 165 NewTxPubKey: transactionPubkey, 166 NewSigningPubKey: signingPubkey, 167 } 168 } 169 170 // Route - implements sdk.Msg 171 func (msg RecoverMsg) Route() string { return RouterKey } 172 173 // Type - implements sdk.Msg 174 func (msg RecoverMsg) Type() string { return "RecoverMsg" } 175 176 // ValidateBasic - implements sdk.Msg 177 func (msg RecoverMsg) ValidateBasic() sdk.Error { 178 if !msg.Username.IsValid() { 179 return ErrInvalidUsername("illegal username") 180 } 181 182 return nil 183 } 184 185 func (msg RecoverMsg) String() string { 186 return fmt.Sprintf( 187 "RecoverMsg{user:%v, new tx key:%v, new signing Key:%v}", 188 msg.Username, msg.NewTxPubKey, msg.NewSigningPubKey) 189 } 190 191 // GetPermission - implements types.Msg 192 func (msg RecoverMsg) GetPermission() types.Permission { 193 return types.TransactionPermission 194 } 195 196 // GetSignBytes - implements sdk.Msg 197 func (msg RecoverMsg) GetSignBytes() []byte { 198 return getSignBytes(msg) 199 } 200 201 // GetSigners - implements sdk.Msg 202 func (msg RecoverMsg) GetSigners() []sdk.AccAddress { 203 return []sdk.AccAddress{sdk.AccAddress(msg.Username), sdk.AccAddress(msg.NewTxPubKey.Address())} 204 } 205 206 // GetAccOrAddrSigners - implements types.AddrMsg 207 func (msg RecoverMsg) GetAccOrAddrSigners() []types.AccOrAddr { 208 return []types.AccOrAddr{ 209 types.NewAccOrAddrFromAcc(msg.Username), 210 types.NewAccOrAddrFromAddr(sdk.AccAddress(msg.NewTxPubKey.Address()))} 211 } 212 213 // GetConsumeAmount - implements types.Msg 214 func (msg RecoverMsg) GetConsumeAmount() types.Coin { 215 return types.NewCoinFromInt64(0) 216 } 217 218 // UpdateAccountMsg - update account JSON meta info 219 type UpdateAccountMsg struct { 220 Username types.AccountKey `json:"username"` 221 JSONMeta string `json:"json_meta"` 222 } 223 224 var _ types.Msg = UpdateAccountMsg{} 225 226 // NewUpdateAccountMsg - construct user update msg to update user JSON meta info. 227 func NewUpdateAccountMsg(username string, jsonMeta string) UpdateAccountMsg { 228 return UpdateAccountMsg{ 229 Username: types.AccountKey(username), 230 JSONMeta: jsonMeta, 231 } 232 } 233 234 // Type - implements sdk.Msg 235 func (msg UpdateAccountMsg) Route() string { return RouterKey } 236 237 // Type - implements sdk.Msg 238 func (msg UpdateAccountMsg) Type() string { return "UpdateAccountMsg" } 239 240 // ValidateBasic - implements sdk.Msg 241 func (msg UpdateAccountMsg) ValidateBasic() sdk.Error { 242 if !msg.Username.IsValid() { 243 return ErrInvalidUsername("illegal username") 244 } 245 246 if len(msg.JSONMeta) > types.MaximumJSONMetaLength { 247 return ErrInvalidJSONMeta() 248 } 249 250 return nil 251 } 252 253 func (msg UpdateAccountMsg) String() string { 254 return fmt.Sprintf("UpdateAccountMsg{User:%v, JSON meta:%v}", msg.Username, msg.JSONMeta) 255 } 256 257 // GetPermission - implements types.Msg 258 func (msg UpdateAccountMsg) GetPermission() types.Permission { 259 return types.TransactionPermission 260 } 261 262 // GetSignBytes - implements sdk.Msg 263 func (msg UpdateAccountMsg) GetSignBytes() []byte { 264 b, err := msgCdc.MarshalJSON(msg) // XXX: ensure some canonical form 265 if err != nil { 266 panic(err) 267 } 268 return b 269 } 270 271 // GetSigners - implements sdk.Msg 272 func (msg UpdateAccountMsg) GetSigners() []sdk.AccAddress { 273 return []sdk.AccAddress{sdk.AccAddress(msg.Username)} 274 } 275 276 // GetConsumeAmount - implements types.Msg 277 func (msg UpdateAccountMsg) GetConsumeAmount() types.Coin { 278 return types.NewCoinFromInt64(0) 279 } 280 281 // RegisterV2Msg - bind username with public key, need to be referred by others (pay for it) 282 type RegisterV2Msg struct { 283 Referrer types.AccOrAddr `json:"referrer"` 284 RegisterFee types.LNO `json:"register_fee"` 285 NewUser types.AccountKey `json:"new_username"` 286 NewTransactionPubKey crypto.PubKey `json:"new_transaction_public_key"` 287 NewSigningPubKey crypto.PubKey `json:"new_signing_public_key"` 288 } 289 290 var _ types.AddrMsg = RegisterV2Msg{} 291 292 // NewRegisterV2Msg - construct register msg. 293 func NewRegisterV2Msg( 294 referrer types.AccOrAddr, newUser string, registerFee types.LNO, 295 transactionPubkey, signingPubKey crypto.PubKey) RegisterV2Msg { 296 return RegisterV2Msg{ 297 Referrer: referrer, 298 NewUser: types.AccountKey(newUser), 299 RegisterFee: registerFee, 300 NewTransactionPubKey: transactionPubkey, 301 NewSigningPubKey: signingPubKey, 302 } 303 } 304 305 // Route - implements sdk.Msg 306 func (msg RegisterV2Msg) Route() string { return RouterKey } 307 308 // Type - implements sdk.Msg 309 func (msg RegisterV2Msg) Type() string { return "RegisterV2Msg" } 310 311 // ValidateBasic - implements sdk.Msg 312 func (msg RegisterV2Msg) ValidateBasic() sdk.Error { 313 if !msg.Referrer.IsValid() { 314 return ErrInvalidUsername(msg.Referrer.String()) 315 } 316 if !msg.NewUser.IsValid() { 317 return ErrInvalidUsername(string(msg.NewUser)) 318 } 319 320 _, coinErr := types.LinoToCoin(msg.RegisterFee) 321 if coinErr != nil { 322 return coinErr 323 } 324 return nil 325 } 326 327 func (msg RegisterV2Msg) String() string { 328 return fmt.Sprintf("RegisterV2Msg{Newuser:%v, Referrer: %s, Tx Key:%v, Signing Key:%v}", 329 msg.NewUser, msg.Referrer, msg.NewTransactionPubKey, msg.NewSigningPubKey) 330 } 331 332 // GetSignBytes - implements sdk.Msg 333 func (msg RegisterV2Msg) GetSignBytes() []byte { 334 return getSignBytes(msg) 335 } 336 337 // GetSigners - implements sdk.Msg 338 func (msg RegisterV2Msg) GetSigners() []sdk.AccAddress { 339 return []sdk.AccAddress{ 340 sdk.AccAddress(msg.Referrer.String()), 341 sdk.AccAddress(msg.NewTransactionPubKey.Address())} 342 } 343 344 // GetAccOrAddrSigners - implements types.AddrMsg 345 func (msg RegisterV2Msg) GetAccOrAddrSigners() []types.AccOrAddr { 346 return []types.AccOrAddr{ 347 msg.Referrer, 348 types.NewAccOrAddrFromAddr(sdk.AccAddress(msg.NewTransactionPubKey.Address()))} 349 } 350 351 // utils 352 func getSignBytes(msg sdk.Msg) []byte { 353 return sdk.MustSortJSON(msgCdc.MustMarshalJSON(msg)) 354 }