github.com/Finschia/finschia-sdk@v0.48.1/x/bank/types/params.go (about) 1 package types 2 3 import ( 4 "fmt" 5 6 yaml "gopkg.in/yaml.v2" 7 8 sdk "github.com/Finschia/finschia-sdk/types" 9 paramtypes "github.com/Finschia/finschia-sdk/x/params/types" 10 ) 11 12 const ( 13 // DefaultSendEnabled enabled 14 DefaultSendEnabled = true 15 ) 16 17 var ( 18 // KeySendEnabled is store's key for SendEnabled Params 19 KeySendEnabled = []byte("SendEnabled") 20 // KeyDefaultSendEnabled is store's key for the DefaultSendEnabled option 21 KeyDefaultSendEnabled = []byte("DefaultSendEnabled") 22 ) 23 24 // ParamKeyTable for bank module. 25 func ParamKeyTable() paramtypes.KeyTable { 26 return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) 27 } 28 29 // NewParams creates a new parameter configuration for the bank module 30 func NewParams(defaultSendEnabled bool, sendEnabledParams SendEnabledParams) Params { 31 return Params{ 32 SendEnabled: sendEnabledParams, 33 DefaultSendEnabled: defaultSendEnabled, 34 } 35 } 36 37 // DefaultParams is the default parameter configuration for the bank module 38 func DefaultParams() Params { 39 return Params{ 40 SendEnabled: SendEnabledParams{}, 41 // The default send enabled value allows send transfers for all coin denoms 42 DefaultSendEnabled: true, 43 } 44 } 45 46 // Validate all bank module parameters 47 func (p Params) Validate() error { 48 if err := validateSendEnabledParams(p.SendEnabled); err != nil { 49 return err 50 } 51 return validateIsBool(p.DefaultSendEnabled) 52 } 53 54 // String implements the Stringer interface. 55 func (p Params) String() string { 56 out, _ := yaml.Marshal(p) 57 return string(out) 58 } 59 60 // SendEnabledDenom returns true if the given denom is enabled for sending 61 func (p Params) SendEnabledDenom(denom string) bool { 62 for _, pse := range p.SendEnabled { 63 if pse.Denom == denom { 64 return pse.Enabled 65 } 66 } 67 return p.DefaultSendEnabled 68 } 69 70 // SetSendEnabledParam returns an updated set of Parameters with the given denom 71 // send enabled flag set. 72 func (p Params) SetSendEnabledParam(denom string, sendEnabled bool) Params { 73 var sendParams SendEnabledParams 74 for _, p := range p.SendEnabled { 75 if p.Denom != denom { 76 sendParams = append(sendParams, NewSendEnabled(p.Denom, p.Enabled)) 77 } 78 } 79 sendParams = append(sendParams, NewSendEnabled(denom, sendEnabled)) 80 return NewParams(p.DefaultSendEnabled, sendParams) 81 } 82 83 // ParamSetPairs implements params.ParamSet 84 func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { 85 return paramtypes.ParamSetPairs{ 86 paramtypes.NewParamSetPair(KeySendEnabled, &p.SendEnabled, validateSendEnabledParams), 87 paramtypes.NewParamSetPair(KeyDefaultSendEnabled, &p.DefaultSendEnabled, validateIsBool), 88 } 89 } 90 91 // SendEnabledParams is a collection of parameters indicating if a coin denom is enabled for sending 92 type SendEnabledParams []*SendEnabled 93 94 func validateSendEnabledParams(i interface{}) error { 95 params, ok := i.([]*SendEnabled) 96 if !ok { 97 return fmt.Errorf("invalid parameter type: %T", i) 98 } 99 // ensure each denom is only registered one time. 100 registered := make(map[string]bool) 101 for _, p := range params { 102 if _, exists := registered[p.Denom]; exists { 103 return fmt.Errorf("duplicate send enabled parameter found: '%s'", p.Denom) 104 } 105 if err := validateSendEnabled(*p); err != nil { 106 return err 107 } 108 registered[p.Denom] = true 109 } 110 return nil 111 } 112 113 // NewSendEnabled creates a new SendEnabled object 114 // The denom may be left empty to control the global default setting of send_enabled 115 func NewSendEnabled(denom string, sendEnabled bool) *SendEnabled { 116 return &SendEnabled{ 117 Denom: denom, 118 Enabled: sendEnabled, 119 } 120 } 121 122 // String implements stringer insterface 123 func (se SendEnabled) String() string { 124 out, _ := yaml.Marshal(se) 125 return string(out) 126 } 127 128 func validateSendEnabled(i interface{}) error { 129 param, ok := i.(SendEnabled) 130 if !ok { 131 return fmt.Errorf("invalid parameter type: %T", i) 132 } 133 return sdk.ValidateDenom(param.Denom) 134 } 135 136 func validateIsBool(i interface{}) error { 137 _, ok := i.(bool) 138 if !ok { 139 return fmt.Errorf("invalid parameter type: %T", i) 140 } 141 return nil 142 }