/
params.go
127 lines (105 loc) · 2.84 KB
/
params.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package types
import (
"errors"
"fmt"
"strings"
yaml "gopkg.in/yaml.v2"
sdk "github.com/cosmos/cosmos-sdk/types"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
)
// Parameter store keys
var (
KeyMintDenom = []byte("MintDenom")
KeyMintPlans = []byte("MintPlans")
)
// ParamTable for minting module.
func ParamKeyTable() paramtypes.KeyTable {
return paramtypes.NewKeyTable().RegisterParamSet(&Params{})
}
// NewMintPlan create a new MintPlan object
func NewMintPlan(startHeight, endHeight uint64, rewardPerBlock sdk.Dec) MintPlan {
return MintPlan{
StartHeight: startHeight,
EndHeight: endHeight,
RewardPerBlock: rewardPerBlock,
}
}
// NewParams create a new Params object
func NewParams(
mintDenom string, mintPlan []MintPlan) Params {
return Params{
MintDenom: mintDenom,
MintPlans: mintPlan,
}
}
// DefaultParams default minting module parameters
func DefaultParams() Params {
return Params{
MintDenom: sdk.DefaultBondDenom,
DefaultRewardPerBlock: sdk.OneDec(),
MintPlans: []MintPlan{},
}
}
// validate params
func (p Params) Validate() error {
if err := validateMintDenom(p.MintDenom); err != nil {
return err
}
if err := validateMintPlan(p.MintPlans); err != nil {
return err
}
if p.DefaultRewardPerBlock.LTE(sdk.ZeroDec()) {
return fmt.Errorf("reward per block must be positive: %d", p.DefaultRewardPerBlock)
}
return nil
}
// String implements the Stringer interface.
func (p Params) String() string {
out, _ := yaml.Marshal(p)
return string(out)
}
// Implements params.ParamSet
func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs {
return paramtypes.ParamSetPairs{
paramtypes.NewParamSetPair(KeyMintDenom, &p.MintDenom, validateMintDenom),
paramtypes.NewParamSetPair(KeyMintPlans, &p.MintPlans, validateMintPlan),
}
}
// GetRewardByHeight return reward by block height
func (p *Params) GetRewardByHeight(height uint64) sdk.Dec {
for _, value := range p.MintPlans {
if value.StartHeight < height && value.EndHeight >= height {
return value.RewardPerBlock
}
}
return p.DefaultRewardPerBlock
//return sdk.OneDec()
}
func validateMintDenom(i interface{}) error {
v, ok := i.(string)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}
if strings.TrimSpace(v) == "" {
return errors.New("mint denom cannot be blank")
}
if err := sdk.ValidateDenom(v); err != nil {
return err
}
return nil
}
func validateMintPlan(i interface{}) error {
v, ok := i.([]MintPlan)
if !ok {
return fmt.Errorf("invalid parameter type: %T", i)
}
for _, value := range v {
if value.EndHeight < value.StartHeight {
return fmt.Errorf("end height:%d must great start height: %d", value.EndHeight, value.StartHeight)
}
if value.RewardPerBlock.LTE(sdk.ZeroDec()) {
return fmt.Errorf("reward per block must be positive: %d", value.RewardPerBlock)
}
}
return nil
}