-
Notifications
You must be signed in to change notification settings - Fork 200
/
params.go
139 lines (119 loc) · 4.66 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
128
129
130
131
132
133
134
135
136
137
138
139
package types
import (
"fmt"
time "time"
"gopkg.in/yaml.v2"
"github.com/NibiruChain/nibiru/x/common/asset"
"github.com/NibiruChain/nibiru/x/common/denoms"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// Parameter keys
var (
KeyVotePeriod = []byte("VotePeriod")
KeyVoteThreshold = []byte("VoteThreshold")
KeyMinVoters = []byte("MinVoters")
KeyRewardBand = []byte("RewardBand")
KeyWhitelist = []byte("Whitelist")
KeySlashFraction = []byte("SlashFraction")
KeySlashWindow = []byte("SlashWindow")
KeyMinValidPerWindow = []byte("MinValidPerWindow")
KeyTwapLookbackWindow = []byte("TwapLookbackWindow")
KeyValidatorFeeRatio = []byte("ValidatorFeeRatio")
)
// Default parameter values
// Assumes block times are 2s
const (
DefaultVotePeriod = 30 // vote every 1 minute
DefaultSlashWindow = 3600 // 2 hours
DefaultMinVoters = 4 // minimum of 4 voters for a pair to become valid
DefaultExpirationBlocks = 900 // 30 minutes
)
// Default parameter values
var (
DefaultVoteThreshold = sdk.OneDec().Quo(sdk.NewDec(3)) // 33.33%
DefaultRewardBand = sdk.NewDecWithPrec(2, 2) // 2% (-1, 1)
DefaultWhitelist = []asset.Pair{
// paired against NUSD
asset.Registry.Pair(denoms.NIBI, denoms.NUSD),
asset.Registry.Pair(denoms.BTC, denoms.NUSD),
asset.Registry.Pair(denoms.ETH, denoms.NUSD),
asset.Registry.Pair(denoms.ATOM, denoms.NUSD),
asset.Registry.Pair(denoms.BNB, denoms.NUSD),
asset.Registry.Pair(denoms.USDC, denoms.NUSD),
asset.Registry.Pair(denoms.USDT, denoms.NUSD),
// asset.Registry.Pair(denoms.OSMO, denoms.NUSD),
// asset.Registry.Pair(denoms.AVAX, denoms.NUSD),
// asset.Registry.Pair(denoms.SOL, denoms.NUSD),
// asset.Registry.Pair(denoms.ADA, denoms.NUSD),
// paired against the US fiat dollar
asset.Registry.Pair(denoms.NIBI, denoms.USD),
asset.Registry.Pair(denoms.BTC, denoms.USD),
asset.Registry.Pair(denoms.ETH, denoms.USD),
asset.Registry.Pair(denoms.ATOM, denoms.USD),
asset.Registry.Pair(denoms.BNB, denoms.USD),
asset.Registry.Pair(denoms.USDC, denoms.USD),
asset.Registry.Pair(denoms.USDT, denoms.USD),
// asset.Registry.Pair(denoms.OSMO, denoms.USD),
// asset.Registry.Pair(denoms.AVAX, denoms.USD),
// asset.Registry.Pair(denoms.SOL, denoms.USD),
// asset.Registry.Pair(denoms.ADA, denoms.USD),
}
DefaultSlashFraction = sdk.NewDecWithPrec(5, 3) // 0.5%
DefaultMinValidPerWindow = sdk.NewDecWithPrec(69, 2) // 69%
DefaultTwapLookbackWindow = time.Duration(15 * time.Minute) // 15 minutes
DefaultValidatorFeeRatio = sdk.NewDecWithPrec(5, 2) // 0.05%
)
// DefaultParams creates default oracle module parameters
func DefaultParams() Params {
return Params{
VotePeriod: DefaultVotePeriod,
VoteThreshold: DefaultVoteThreshold,
MinVoters: DefaultMinVoters,
ExpirationBlocks: DefaultExpirationBlocks,
RewardBand: DefaultRewardBand,
Whitelist: DefaultWhitelist,
SlashFraction: DefaultSlashFraction,
SlashWindow: DefaultSlashWindow,
MinValidPerWindow: DefaultMinValidPerWindow,
TwapLookbackWindow: DefaultTwapLookbackWindow,
ValidatorFeeRatio: DefaultValidatorFeeRatio,
}
}
// String implements fmt.Stringer interface
func (p Params) String() string {
out, _ := yaml.Marshal(p)
return string(out)
}
// Validate performs basic validation on oracle parameters.
func (p Params) Validate() error {
if p.VotePeriod == 0 {
return fmt.Errorf("oracle parameter VotePeriod must be > 0, is %d", p.VotePeriod)
}
if p.VoteThreshold.LTE(sdk.NewDecWithPrec(33, 2)) {
return fmt.Errorf("oracle parameter VoteThreshold must be greater than 33 percent")
}
if p.MinVoters <= 0 {
return fmt.Errorf("oracle parameter MinVoters must be greater than 0")
}
if p.RewardBand.GT(sdk.OneDec()) || p.RewardBand.IsNegative() {
return fmt.Errorf("oracle parameter RewardBand must be between [0, 1]")
}
if p.SlashFraction.GT(sdk.OneDec()) || p.SlashFraction.IsNegative() {
return fmt.Errorf("oracle parameter SlashFraction must be between [0, 1]")
}
if p.SlashWindow < p.VotePeriod {
return fmt.Errorf("oracle parameter SlashWindow must be greater than or equal with VotePeriod")
}
if p.MinValidPerWindow.GT(sdk.OneDec()) || p.MinValidPerWindow.IsNegative() {
return fmt.Errorf("oracle parameter MinValidPerWindow must be between [0, 1]")
}
if p.ValidatorFeeRatio.GT(sdk.OneDec()) || p.ValidatorFeeRatio.IsNegative() {
return fmt.Errorf("oracle parameter ValidatorFeeRatio must be between [0, 1]")
}
for _, pair := range p.Whitelist {
if err := pair.Validate(); err != nil {
return fmt.Errorf("oracle parameter Whitelist Pair invalid format: %w", err)
}
}
return nil
}