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  }