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  }