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  }