Search Apps Documentation Source Content File Folder Download Copy Actions Download 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}