github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/dex/types/proposal.go (about)

     1  package types
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	govtypes "github.com/fibonacci-chain/fbc/x/gov/types"
     9  )
    10  
    11  const (
    12  	proposalTypeDelist = "Delist"
    13  )
    14  
    15  func init() {
    16  	govtypes.RegisterProposalType(proposalTypeDelist)
    17  	govtypes.RegisterProposalTypeCodec(DelistProposal{}, "fbexchain/dex/DelistProposal")
    18  
    19  }
    20  
    21  // Assert DelistProposal implements govtypes.Content at compile-time
    22  var _ govtypes.Content = (*DelistProposal)(nil)
    23  
    24  // DelistProposal represents delist proposal object
    25  type DelistProposal struct {
    26  	Title       string         `json:"title" yaml:"title"`
    27  	Description string         `json:"description" yaml:"description"`
    28  	Proposer    sdk.AccAddress `json:"proposer" yaml:"proposer"`
    29  	BaseAsset   string         `json:"base_asset" yaml:"base_asset"`
    30  	QuoteAsset  string         `json:"quote_asset" yaml:"quote_asset"`
    31  }
    32  
    33  // NewDelistProposal create a new delist proposal object
    34  func NewDelistProposal(title, description string, proposer sdk.AccAddress, baseAsset, quoteAsset string) DelistProposal {
    35  	return DelistProposal{
    36  		Title:       title,
    37  		Description: description,
    38  		Proposer:    proposer,
    39  		BaseAsset:   baseAsset,
    40  		QuoteAsset:  quoteAsset,
    41  	}
    42  }
    43  
    44  // GetTitle returns title of delist proposal object
    45  func (drp DelistProposal) GetTitle() string {
    46  	return drp.Title
    47  }
    48  
    49  // GetDescription returns description of delist proposal object
    50  func (drp DelistProposal) GetDescription() string {
    51  	return drp.Description
    52  }
    53  
    54  // ProposalRoute returns route key of delist proposal object
    55  func (DelistProposal) ProposalRoute() string {
    56  	return RouterKey
    57  }
    58  
    59  // ProposalType returns type of delist proposal object
    60  func (DelistProposal) ProposalType() string {
    61  	return proposalTypeDelist
    62  }
    63  
    64  // ValidateBasic validates delist proposal
    65  func (drp DelistProposal) ValidateBasic() sdk.Error {
    66  	if len(strings.TrimSpace(drp.Title)) == 0 {
    67  		return govtypes.ErrInvalidProposalContent("title is required")
    68  	}
    69  	if len(drp.Title) > govtypes.MaxTitleLength {
    70  		return govtypes.ErrInvalidProposalContent("title length is longer than the max")
    71  	}
    72  
    73  	if len(drp.Description) == 0 {
    74  		return govtypes.ErrInvalidProposalContent("description is required")
    75  	}
    76  
    77  	if len(drp.Description) > govtypes.MaxDescriptionLength {
    78  		return govtypes.ErrInvalidProposalContent("description length is longer than the max")
    79  	}
    80  
    81  	if drp.ProposalType() != proposalTypeDelist {
    82  		return govtypes.ErrInvalidProposalType(drp.ProposalType())
    83  	}
    84  
    85  	if drp.Proposer.Empty() {
    86  		return sdk.ErrInvalidAddress(drp.Proposer.String())
    87  	}
    88  
    89  	if drp.BaseAsset == drp.QuoteAsset {
    90  		return sdk.ErrInvalidCoins(fmt.Sprintf("failed to submit delist proposal because baseasset is same as quoteasset"))
    91  	}
    92  
    93  	return nil
    94  }
    95  
    96  // String converts delist proposal object to string
    97  func (drp DelistProposal) String() string {
    98  	return fmt.Sprintf(`DelistProposal:
    99   Title:               %s
   100   Description:         %s
   101   Type:                %s
   102   Proposer:            %s
   103   ListAsset            %s
   104   QuoteAsset           %s
   105  `, drp.Title, drp.Description,
   106  		drp.ProposalType(), drp.Proposer,
   107  		drp.BaseAsset, drp.QuoteAsset,
   108  	)
   109  }