2019-06-05 16:26:17 -07:00
|
|
|
package types
|
2019-01-28 19:06:48 -08:00
|
|
|
|
|
|
|
import (
|
2019-12-10 08:48:57 -08:00
|
|
|
"fmt"
|
|
|
|
|
2020-07-08 13:00:34 -07:00
|
|
|
yaml "gopkg.in/yaml.v2"
|
|
|
|
|
2020-07-08 10:43:08 -07:00
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
2020-02-19 03:52:20 -08:00
|
|
|
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
|
2019-01-28 19:06:48 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2019-02-08 13:35:19 -08:00
|
|
|
// DefaultSendEnabled enabled
|
2019-01-28 19:06:48 -08:00
|
|
|
DefaultSendEnabled = true
|
|
|
|
)
|
|
|
|
|
2020-07-08 10:43:08 -07:00
|
|
|
var (
|
|
|
|
// KeySendEnabled is store's key for SendEnabled Params
|
|
|
|
KeySendEnabled = []byte("SendEnabled")
|
|
|
|
// KeyDefaultSendEnabled is store's key for the DefaultSendEnabled option
|
|
|
|
KeyDefaultSendEnabled = []byte("DefaultSendEnabled")
|
|
|
|
)
|
2019-01-28 19:06:48 -08:00
|
|
|
|
2020-07-08 10:43:08 -07:00
|
|
|
// ParamKeyTable for bank module.
|
2020-02-19 03:52:20 -08:00
|
|
|
func ParamKeyTable() paramtypes.KeyTable {
|
2020-07-08 10:43:08 -07:00
|
|
|
return paramtypes.NewKeyTable().RegisterParamSet(&Params{})
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewParams creates a new parameter configuration for the bank module
|
|
|
|
func NewParams(defaultSendEnabled bool, sendEnabledParams SendEnabledParams) Params {
|
|
|
|
return Params{
|
|
|
|
SendEnabled: sendEnabledParams,
|
|
|
|
DefaultSendEnabled: defaultSendEnabled,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// DefaultParams is the default parameter configuration for the bank module
|
|
|
|
func DefaultParams() Params {
|
|
|
|
return Params{
|
|
|
|
SendEnabled: SendEnabledParams{},
|
|
|
|
// The default send enabled value allows send transfers for all coin denoms
|
|
|
|
DefaultSendEnabled: true,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate all bank module parameters
|
|
|
|
func (p Params) Validate() error {
|
|
|
|
if err := validateSendEnabledParams(p.SendEnabled); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return validateIsBool(p.DefaultSendEnabled)
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements the Stringer interface.
|
|
|
|
func (p Params) String() string {
|
|
|
|
out, _ := yaml.Marshal(p)
|
|
|
|
return string(out)
|
|
|
|
}
|
|
|
|
|
|
|
|
// SendEnabledDenom returns true if the given denom is enabled for sending
|
|
|
|
func (p Params) SendEnabledDenom(denom string) bool {
|
|
|
|
for _, pse := range p.SendEnabled {
|
|
|
|
if pse.Denom == denom {
|
|
|
|
return pse.Enabled
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return p.DefaultSendEnabled
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetSendEnabledParam returns an updated set of Parameters with the given denom
|
|
|
|
// send enabled flag set.
|
|
|
|
func (p Params) SetSendEnabledParam(denom string, sendEnabled bool) Params {
|
|
|
|
var sendParams SendEnabledParams
|
|
|
|
for _, p := range p.SendEnabled {
|
|
|
|
if p.Denom != denom {
|
|
|
|
sendParams = append(sendParams, NewSendEnabled(p.Denom, p.Enabled))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sendParams = append(sendParams, NewSendEnabled(denom, sendEnabled))
|
|
|
|
return NewParams(p.DefaultSendEnabled, sendParams)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParamSetPairs implements params.ParamSet
|
|
|
|
func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs {
|
|
|
|
return paramtypes.ParamSetPairs{
|
|
|
|
paramtypes.NewParamSetPair(KeySendEnabled, &p.SendEnabled, validateSendEnabledParams),
|
|
|
|
paramtypes.NewParamSetPair(KeyDefaultSendEnabled, &p.DefaultSendEnabled, validateIsBool),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// SendEnabledParams is a collection of parameters indicating if a coin denom is enabled for sending
|
|
|
|
type SendEnabledParams []*SendEnabled
|
|
|
|
|
|
|
|
func validateSendEnabledParams(i interface{}) error {
|
|
|
|
params, ok := i.([]*SendEnabled)
|
|
|
|
if !ok {
|
|
|
|
return fmt.Errorf("invalid parameter type: %T", i)
|
|
|
|
}
|
|
|
|
// ensure each denom is only registered one time.
|
|
|
|
registered := make(map[string]bool)
|
|
|
|
for _, p := range params {
|
|
|
|
if _, exists := registered[p.Denom]; exists {
|
|
|
|
return fmt.Errorf("duplicate send enabled parameter found: '%s'", p.Denom)
|
|
|
|
}
|
|
|
|
if err := validateSendEnabled(*p); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
registered[p.Denom] = true
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewSendEnabled creates a new SendEnabled object
|
|
|
|
// The denom may be left empty to control the global default setting of send_enabled
|
|
|
|
func NewSendEnabled(denom string, sendEnabled bool) *SendEnabled {
|
|
|
|
return &SendEnabled{
|
|
|
|
Denom: denom,
|
|
|
|
Enabled: sendEnabled,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// String implements stringer insterface
|
|
|
|
func (se SendEnabled) String() string {
|
|
|
|
out, _ := yaml.Marshal(se)
|
|
|
|
return string(out)
|
2019-01-28 19:06:48 -08:00
|
|
|
}
|
2019-12-10 08:48:57 -08:00
|
|
|
|
|
|
|
func validateSendEnabled(i interface{}) error {
|
2020-07-08 10:43:08 -07:00
|
|
|
param, ok := i.(SendEnabled)
|
2019-12-10 08:48:57 -08:00
|
|
|
if !ok {
|
|
|
|
return fmt.Errorf("invalid parameter type: %T", i)
|
|
|
|
}
|
2020-07-08 10:43:08 -07:00
|
|
|
return sdk.ValidateDenom(param.Denom)
|
|
|
|
}
|
2019-12-10 08:48:57 -08:00
|
|
|
|
2020-07-08 10:43:08 -07:00
|
|
|
func validateIsBool(i interface{}) error {
|
|
|
|
_, ok := i.(bool)
|
|
|
|
if !ok {
|
|
|
|
return fmt.Errorf("invalid parameter type: %T", i)
|
|
|
|
}
|
2019-12-10 08:48:57 -08:00
|
|
|
return nil
|
|
|
|
}
|