Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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}