config.gno
6.70 Kb · 193 lines
1package governance
2
3import (
4 "errors"
5
6 bptree "gno.land/p/nt/bptree/v0"
7)
8
9// Config represents the configuration of the governor contract.
10// All parameters can be modified through Reconfigure by admin or governance.
11type Config struct {
12 // VotingStartDelay is the delay before voting starts after proposal creation (in seconds)
13 VotingStartDelay int64
14 // VotingPeriod is the duration during which votes are collected (in seconds)
15 VotingPeriod int64
16 // VotingWeightSmoothingDuration is the period over which voting weight is averaged
17 // for proposal creation and cancellation threshold calculations (in seconds).
18 VotingWeightSmoothingDuration int64
19 // Quorum is the percentage of total xGNS supply required for proposal approval.
20 // Total supply includes xGNS held by the launchpad.
21 Quorum int64
22 // ProposalCreationThreshold is the minimum xGNS amount required to create a proposal
23 ProposalCreationThreshold int64
24 // ExecutionDelay is the waiting period after voting ends before a proposal can be executed (in seconds)
25 ExecutionDelay int64
26 // ExecutionWindow is the time window during which an approved proposal can be executed (in seconds)
27 ExecutionWindow int64
28}
29
30// IsValid reports whether the configuration's durations, threshold, quorum, and
31// cumulative schedule values satisfy the governance validation constraints.
32//
33// Parameters:
34// - currentTime: current time value included when checking that the cumulative schedule does not become negative
35//
36// Returns:
37// - error: nil when all fields and cumulative values are valid; otherwise an error describing the first invalid value
38func (c Config) IsValid(currentTime int64) error {
39 if c.VotingStartDelay < 0 {
40 return errors.New("votingStartDelay cannot be negative")
41 }
42
43 if c.VotingPeriod < 0 {
44 return errors.New("votingPeriod cannot be negative")
45 }
46
47 if c.ExecutionDelay < 0 {
48 return errors.New("executionDelay cannot be negative")
49 }
50
51 if c.ExecutionWindow < 0 {
52 return errors.New("executionWindow cannot be negative")
53 }
54
55 if c.VotingWeightSmoothingDuration < 0 {
56 return errors.New("votingWeightSmoothingDuration cannot be negative")
57 }
58
59 if c.ProposalCreationThreshold < 0 {
60 return errors.New("proposalCreationThreshold cannot be negative")
61 }
62
63 if c.Quorum < 0 || c.Quorum > 100 {
64 return errors.New("quorum must be between 0 and 100")
65 }
66
67 sum := int64(0)
68
69 sum += c.VotingStartDelay
70 if sum < 0 {
71 return errors.New("votingStartDelay cannot be negative")
72 }
73
74 sum += c.VotingPeriod
75 if sum < 0 {
76 return errors.New("votingPeriod cannot be negative")
77 }
78
79 sum += c.ExecutionDelay
80 if sum < 0 {
81 return errors.New("executionDelay cannot be negative")
82 }
83
84 sum += c.ExecutionWindow
85 if sum < 0 {
86 return errors.New("executionWindow cannot be negative")
87 }
88
89 sum += currentTime
90 if sum < 0 {
91 return errors.New("total delay cannot be negative")
92 }
93
94 return nil
95}
96
97// NewConfig constructs a governance configuration from the supplied delays,
98// thresholds, quorum percentage, and execution window.
99//
100// Parameters:
101// - votingStartDelay: delay from proposal creation until voting opens, in seconds
102// - votingPeriod: duration for which voting remains open, in seconds
103// - votingWeightSmoothingDuration: interval used to smooth delegation weight, in seconds
104// - quorum: required approval percentage of total xGNS supply, from 0 through 100
105// - proposalCreationThreshold: minimum xGNS amount required to create a proposal
106// - executionDelay: delay after voting ends before execution, in seconds
107// - executionWindow: duration after the execution delay during which execution is allowed, in seconds
108//
109// Returns:
110// - Config: configuration value populated with the supplied governance parameters
111func NewConfig(
112 votingStartDelay,
113 votingPeriod,
114 votingWeightSmoothingDuration,
115 quorum,
116 proposalCreationThreshold,
117 executionDelay,
118 executionWindow int64,
119) Config {
120 return Config{
121 VotingStartDelay: votingStartDelay,
122 VotingPeriod: votingPeriod,
123 VotingWeightSmoothingDuration: votingWeightSmoothingDuration,
124 Quorum: quorum,
125 ProposalCreationThreshold: proposalCreationThreshold,
126 ExecutionDelay: executionDelay,
127 ExecutionWindow: executionWindow,
128 }
129}
130
131// NewConfigPtr constructs a Config and returns a pointer to it. The Config is
132// allocated within the governance domain realm, satisfying realm allocation
133// checks for callers (such as tests) that require a *Config value.
134//
135// Parameters:
136// - votingStartDelay: delay from proposal creation until voting opens, in seconds
137// - votingPeriod: duration for which voting remains open, in seconds
138// - votingWeightSmoothingDuration: interval used to smooth delegation weight, in seconds
139// - quorum: required approval percentage of total xGNS supply, from 0 through 100
140// - proposalCreationThreshold: minimum xGNS amount required to create a proposal
141// - executionDelay: delay after voting ends before execution, in seconds
142// - executionWindow: duration after the execution delay during which execution is allowed, in seconds
143//
144// Returns:
145// - *Config: pointer to a configuration value populated with the supplied governance parameters
146func NewConfigPtr(
147 votingStartDelay,
148 votingPeriod,
149 votingWeightSmoothingDuration,
150 quorum,
151 proposalCreationThreshold,
152 executionDelay,
153 executionWindow int64,
154) *Config {
155 c := NewConfig(
156 votingStartDelay,
157 votingPeriod,
158 votingWeightSmoothingDuration,
159 quorum,
160 proposalCreationThreshold,
161 executionDelay,
162 executionWindow,
163 )
164 return &c
165}
166
167// NewDefaultConfig returns the governance configuration's built-in defaults:
168// one day before voting, seven days of voting, one day of weight smoothing,
169// 50% quorum, a 1-billion-xGNS creation threshold, one day execution delay,
170// and a 30-day execution window.
171//
172// Returns:
173// - Config: default governance configuration value
174func NewDefaultConfig() Config {
175 return Config{
176 VotingStartDelay: 86400, // 1 day - delay before voting starts
177 VotingPeriod: 604800, // 7 days - duration for collecting votes
178 VotingWeightSmoothingDuration: 86400, // 1 day - period for averaging voting weight
179 Quorum: 50, // 50% of total xGNS supply required
180 ProposalCreationThreshold: 1_000_000_000, // 1 billion xGNS - minimum amount to create proposals
181 ExecutionDelay: 86400, // 1 day - waiting period before execution
182 ExecutionWindow: 2592000, // 30 days - window for executing proposals
183 }
184}
185
186// NewConfigTree creates an empty BPTree used to index configuration values by
187// their encoded int64 version.
188//
189// Returns:
190// - *bptree.BPTree: empty configuration index tree
191func NewConfigTree() *bptree.BPTree {
192 return bptree.NewBPTreeN(16)
193}