github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/token/types/msgs.go (about) 1 // nolint 2 package types 3 4 import ( 5 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 6 "github.com/fibonacci-chain/fbc/x/common" 7 ) 8 9 const ( 10 DescLenLimit = 256 11 MultiSendLimit = 1000 12 13 // 90 billion 14 TotalSupplyUpperbound = int64(9 * 1e10) 15 ) 16 17 type MsgTokenIssue struct { 18 Description string `json:"description"` 19 Symbol string `json:"symbol"` 20 OriginalSymbol string `json:"original_symbol"` 21 WholeName string `json:"whole_name"` 22 TotalSupply string `json:"total_supply"` 23 Owner sdk.AccAddress `json:"owner"` 24 Mintable bool `json:"mintable"` 25 } 26 27 func NewMsgTokenIssue(tokenDescription, symbol, originalSymbol, wholeName, totalSupply string, owner sdk.AccAddress, mintable bool) MsgTokenIssue { 28 return MsgTokenIssue{ 29 Description: tokenDescription, 30 Symbol: symbol, 31 OriginalSymbol: originalSymbol, 32 WholeName: wholeName, 33 TotalSupply: totalSupply, 34 Owner: owner, 35 Mintable: mintable, 36 } 37 } 38 39 func (msg MsgTokenIssue) Route() string { return RouterKey } 40 41 func (msg MsgTokenIssue) Type() string { return "issue" } 42 43 func (msg MsgTokenIssue) ValidateBasic() sdk.Error { 44 // check owner 45 if msg.Owner.Empty() { 46 return ErrAddressIsRequired() 47 } 48 49 // check original symbol 50 if len(msg.OriginalSymbol) == 0 { 51 return ErrUserInputSymbolIsEmpty() 52 } 53 if !ValidOriginalSymbol(msg.OriginalSymbol) { 54 return ErrNotAllowedOriginalSymbol(msg.OriginalSymbol) 55 } 56 57 // check wholeName 58 isValid := wholeNameValid(msg.WholeName) 59 if !isValid { 60 return ErrWholeNameIsNotValidl() 61 } 62 // check desc 63 if len(msg.Description) > DescLenLimit { 64 return ErrDescLenBiggerThanLimit() 65 } 66 // check totalSupply 67 totalSupply, err := sdk.NewDecFromStr(msg.TotalSupply) 68 if err != nil { 69 return err 70 } 71 if totalSupply.GT(sdk.NewDec(TotalSupplyUpperbound)) || totalSupply.LTE(sdk.ZeroDec()) { 72 return ErrTotalSupplyOutOfRange() 73 } 74 return nil 75 } 76 77 func (msg MsgTokenIssue) GetSignBytes() []byte { 78 bz := ModuleCdc.MustMarshalJSON(msg) 79 return sdk.MustSortJSON(bz) 80 } 81 82 func (msg MsgTokenIssue) GetSigners() []sdk.AccAddress { 83 return []sdk.AccAddress{msg.Owner} 84 } 85 86 type MsgTokenBurn struct { 87 Amount sdk.SysCoin `json:"amount"` 88 Owner sdk.AccAddress `json:"owner"` 89 } 90 91 func NewMsgTokenBurn(amount sdk.SysCoin, owner sdk.AccAddress) MsgTokenBurn { 92 return MsgTokenBurn{ 93 Amount: amount, 94 Owner: owner, 95 } 96 } 97 98 func (msg MsgTokenBurn) Route() string { return RouterKey } 99 100 func (msg MsgTokenBurn) Type() string { return "burn" } 101 102 func (msg MsgTokenBurn) ValidateBasic() sdk.Error { 103 // check owner 104 if msg.Owner.Empty() { 105 return ErrAddressIsRequired() 106 } 107 if !msg.Amount.IsValid() { 108 return common.ErrInsufficientCoins(DefaultParamspace, msg.Amount.String()) 109 } 110 111 return nil 112 } 113 114 func (msg MsgTokenBurn) GetSignBytes() []byte { 115 bz := ModuleCdc.MustMarshalJSON(msg) 116 return sdk.MustSortJSON(bz) 117 } 118 119 func (msg MsgTokenBurn) GetSigners() []sdk.AccAddress { 120 return []sdk.AccAddress{msg.Owner} 121 } 122 123 type MsgTokenMint struct { 124 Amount sdk.SysCoin `json:"amount"` 125 Owner sdk.AccAddress `json:"owner"` 126 } 127 128 func NewMsgTokenMint(amount sdk.SysCoin, owner sdk.AccAddress) MsgTokenMint { 129 return MsgTokenMint{ 130 Amount: amount, 131 Owner: owner, 132 } 133 } 134 135 func (msg MsgTokenMint) Route() string { return RouterKey } 136 137 func (msg MsgTokenMint) Type() string { return "mint" } 138 139 func (msg MsgTokenMint) ValidateBasic() sdk.Error { 140 if msg.Owner.Empty() { 141 return ErrAddressIsRequired() 142 } 143 144 amount := msg.Amount.Amount 145 if amount.GT(sdk.NewDec(TotalSupplyUpperbound)) { 146 return ErrAmountBiggerThanTotalSupplyUpperbound() 147 } 148 if !msg.Amount.IsValid() { 149 return ErrAmountIsNotValid(msg.Amount.String()) 150 } 151 return nil 152 } 153 154 func (msg MsgTokenMint) GetSignBytes() []byte { 155 bz := ModuleCdc.MustMarshalJSON(msg) 156 157 return sdk.MustSortJSON(bz) 158 } 159 160 func (msg MsgTokenMint) GetSigners() []sdk.AccAddress { 161 return []sdk.AccAddress{msg.Owner} 162 } 163 164 type MsgMultiSend struct { 165 From sdk.AccAddress `json:"from"` 166 Transfers []TransferUnit `json:"transfers"` 167 } 168 169 func NewMsgMultiSend(from sdk.AccAddress, transfers []TransferUnit) MsgMultiSend { 170 return MsgMultiSend{ 171 From: from, 172 Transfers: transfers, 173 } 174 } 175 176 func (msg MsgMultiSend) Route() string { return RouterKey } 177 178 func (msg MsgMultiSend) Type() string { return "multi-send" } 179 180 func (msg MsgMultiSend) ValidateBasic() sdk.Error { 181 if msg.From.Empty() { 182 return ErrAddressIsRequired() 183 } 184 185 // check transfers 186 if len(msg.Transfers) > MultiSendLimit { 187 return ErrMsgTransfersAmountBiggerThanSendLimit() 188 } 189 for _, transfer := range msg.Transfers { 190 if !transfer.Coins.IsAllPositive() || !transfer.Coins.IsValid() { 191 return ErrInvalidCoins(transfer.Coins.String()) 192 } 193 194 if transfer.To.Empty() { 195 return ErrAddressIsRequired() 196 } 197 } 198 return nil 199 } 200 201 func (msg MsgMultiSend) GetSignBytes() []byte { 202 bz := ModuleCdc.MustMarshalJSON(msg) 203 return sdk.MustSortJSON(bz) 204 } 205 206 func (msg MsgMultiSend) GetSigners() []sdk.AccAddress { 207 return []sdk.AccAddress{msg.From} 208 } 209 210 // MsgSend - high level transaction of the coin module 211 type MsgSend struct { 212 FromAddress sdk.AccAddress `json:"from_address"` 213 ToAddress sdk.AccAddress `json:"to_address"` 214 Amount sdk.SysCoins `json:"amount"` 215 } 216 217 func NewMsgTokenSend(from, to sdk.AccAddress, coins sdk.SysCoins) MsgSend { 218 return MsgSend{ 219 FromAddress: from, 220 ToAddress: to, 221 Amount: coins, 222 } 223 } 224 225 func (msg MsgSend) Route() string { return RouterKey } 226 227 func (msg MsgSend) Type() string { return "send" } 228 229 func (msg MsgSend) ValidateBasic() sdk.Error { 230 if msg.FromAddress.Empty() { 231 return ErrAddressIsRequired() 232 } 233 if msg.ToAddress.Empty() { 234 return ErrAddressIsRequired() 235 } 236 if !msg.Amount.IsValid() { 237 return ErrInvalidCoins(msg.Amount.String()) 238 } 239 if !msg.Amount.IsAllPositive() { 240 return common.ErrInsufficientCoins(DefaultParamspace, msg.Amount.String()) 241 } 242 return nil 243 } 244 245 func (msg MsgSend) GetSignBytes() []byte { 246 bz := ModuleCdc.MustMarshalJSON(msg) 247 return sdk.MustSortJSON(bz) 248 } 249 250 func (msg MsgSend) GetSigners() []sdk.AccAddress { 251 return []sdk.AccAddress{msg.FromAddress} 252 } 253 254 // MsgTransferOwnership - high level transaction of the coin module 255 type MsgTransferOwnership struct { 256 FromAddress sdk.AccAddress `json:"from_address"` 257 ToAddress sdk.AccAddress `json:"to_address"` 258 Symbol string `json:"symbol"` 259 } 260 261 func NewMsgTransferOwnership(from, to sdk.AccAddress, symbol string) MsgTransferOwnership { 262 return MsgTransferOwnership{ 263 FromAddress: from, 264 ToAddress: to, 265 Symbol: symbol, 266 } 267 } 268 269 func (msg MsgTransferOwnership) Route() string { return RouterKey } 270 271 func (msg MsgTransferOwnership) Type() string { return "transfer" } 272 273 func (msg MsgTransferOwnership) ValidateBasic() sdk.Error { 274 if msg.FromAddress.Empty() { 275 return ErrAddressIsRequired() 276 } 277 if msg.ToAddress.Empty() { 278 return ErrAddressIsRequired() 279 } 280 if len(msg.Symbol) == 0 { 281 return ErrMsgSymbolIsEmpty() 282 } 283 284 if sdk.ValidateDenom(msg.Symbol) != nil { 285 return ErrConfirmOwnershipNotExistOrBlockTimeAfter() 286 } 287 return nil 288 } 289 290 func (msg MsgTransferOwnership) GetSignBytes() []byte { 291 bz := ModuleCdc.MustMarshalJSON(msg) 292 return sdk.MustSortJSON(bz) 293 } 294 295 func (msg MsgTransferOwnership) GetSigners() []sdk.AccAddress { 296 return []sdk.AccAddress{msg.FromAddress} 297 } 298 299 type MsgTokenModify struct { 300 Owner sdk.AccAddress `json:"owner"` 301 Symbol string `json:"symbol"` 302 Description string `json:"description"` 303 WholeName string `json:"whole_name"` 304 IsDescriptionModified bool `json:"description_modified"` 305 IsWholeNameModified bool `json:"whole_name_modified"` 306 } 307 308 func NewMsgTokenModify(symbol, desc, wholeName string, isDescEdit, isWholeNameEdit bool, owner sdk.AccAddress) MsgTokenModify { 309 return MsgTokenModify{ 310 Symbol: symbol, 311 IsDescriptionModified: isDescEdit, 312 Description: desc, 313 IsWholeNameModified: isWholeNameEdit, 314 WholeName: wholeName, 315 Owner: owner, 316 } 317 } 318 319 func (msg MsgTokenModify) Route() string { return RouterKey } 320 321 func (msg MsgTokenModify) Type() string { return "edit" } 322 323 func (msg MsgTokenModify) ValidateBasic() sdk.Error { 324 // check owner 325 if msg.Owner.Empty() { 326 return ErrAddressIsRequired() 327 } 328 // check symbol 329 if len(msg.Symbol) == 0 { 330 return ErrMsgSymbolIsEmpty() 331 } 332 if sdk.ValidateDenom(msg.Symbol) != nil { 333 return ErrNotAllowedOriginalSymbol(msg.Symbol) 334 } 335 // check wholeName 336 if msg.IsWholeNameModified { 337 isValid := wholeNameValid(msg.WholeName) 338 if !isValid { 339 return ErrWholeNameIsNotValidl() 340 } 341 } 342 // check desc 343 if msg.IsDescriptionModified { 344 if len(msg.Description) > DescLenLimit { 345 return ErrDescLenBiggerThanLimit() 346 } 347 } 348 return nil 349 } 350 351 func (msg MsgTokenModify) GetSignBytes() []byte { 352 bz := ModuleCdc.MustMarshalJSON(msg) 353 return sdk.MustSortJSON(bz) 354 } 355 356 func (msg MsgTokenModify) GetSigners() []sdk.AccAddress { 357 return []sdk.AccAddress{msg.Owner} 358 } 359 360 // MsgConfirmOwnership - high level transaction of the coin module 361 type MsgConfirmOwnership struct { 362 Symbol string `json:"symbol"` 363 Address sdk.AccAddress `json:"new_owner"` 364 } 365 366 func NewMsgConfirmOwnership(newOwner sdk.AccAddress, symbol string) MsgConfirmOwnership { 367 return MsgConfirmOwnership{ 368 Symbol: symbol, 369 Address: newOwner, 370 } 371 } 372 373 func (msg MsgConfirmOwnership) Route() string { return RouterKey } 374 375 func (msg MsgConfirmOwnership) Type() string { return "confirm" } 376 377 func (msg MsgConfirmOwnership) ValidateBasic() sdk.Error { 378 if msg.Address.Empty() { 379 return ErrAddressIsRequired() 380 } 381 382 if len(msg.Symbol) == 0 { 383 return ErrMsgSymbolIsEmpty() 384 } 385 386 if sdk.ValidateDenom(msg.Symbol) != nil { 387 return ErrNotAllowedOriginalSymbol(msg.Symbol) 388 } 389 return nil 390 } 391 392 func (msg MsgConfirmOwnership) GetSignBytes() []byte { 393 bz := ModuleCdc.MustMarshalJSON(msg) 394 return sdk.MustSortJSON(bz) 395 } 396 397 func (msg MsgConfirmOwnership) GetSigners() []sdk.AccAddress { 398 return []sdk.AccAddress{msg.Address} 399 }