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 }