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

4.11 Kb · 134 lines
  1package governance
  2
  3import (
  4	"chain"
  5	"time"
  6
  7	"gno.land/p/gnoswap/utils/v1"
  8
  9	"gno.land/r/gnoswap/access/v1"
 10	en "gno.land/r/gnoswap/emission"
 11	"gno.land/r/gnoswap/halt/v1"
 12
 13	"gno.land/r/gnoswap/gov/governance"
 14)
 15
 16// makeConfig creates a new governance configuration.
 17func makeConfig(
 18	votingStartDelay int64,
 19	votingPeriod int64,
 20	votingWeightSmoothingDuration int64,
 21	quorum int64,
 22	proposalCreationThreshold int64,
 23	executionDelay int64,
 24	executionWindow int64,
 25) governance.Config {
 26	// Create new configuration with provided parameters. Constructed via the
 27	// domain constructor so the Config value is allocated inside the governance
 28	// domain realm (satisfies the realm allocation check).
 29	return governance.NewConfig(
 30		votingStartDelay,
 31		votingPeriod,
 32		votingWeightSmoothingDuration,
 33		quorum,
 34		proposalCreationThreshold,
 35		executionDelay,
 36		executionWindow,
 37	)
 38}
 39
 40// Reconfigure updates governance configuration.
 41// Only admin or governance contract can call this function.
 42// Updates all governance parameters and emits a "Reconfigure" event.
 43//
 44// Parameters:
 45//   - _: Noncrossing implementation-call discriminator; pass 0.
 46//   - rlm: Current realm context forwarded unchanged by the governance proxy; validated before external calls.
 47//   - votingStartDelay: delay in seconds from proposal creation until voting starts
 48//   - votingPeriod: duration in seconds for which voting remains open
 49//   - votingWeightSmoothingDuration: duration in seconds used to smooth voting weight snapshots
 50//   - quorum: quorum percentage applied to the proposal's quorum-weight base
 51//   - proposalCreationThreshold: minimum voting weight required to create a proposal
 52//   - executionDelay: delay in seconds from voting end until execution becomes available
 53//   - executionWindow: duration in seconds during which an executable proposal may run
 54//
 55// Returns:
 56//   - int64: newly stored governance configuration version
 57func (gv *governanceV1) Reconfigure(
 58	_ int, rlm realm,
 59	votingStartDelay int64,
 60	votingPeriod int64,
 61	votingWeightSmoothingDuration int64,
 62	quorum int64,
 63	proposalCreationThreshold int64,
 64	executionDelay int64,
 65	executionWindow int64,
 66) int64 {
 67	access.AssertIsRlmCurrent(0, rlm)
 68
 69	// Check if system is halted before proceeding
 70	halt.AssertIsNotHaltedGovernance()
 71
 72	prev := rlm.Previous()
 73	caller := prev.Address()
 74	access.AssertIsAdminOrGovernance(caller)
 75
 76	assertIsValidSmoothingPeriod(votingWeightSmoothingDuration)
 77
 78	// Create and validate new configuration
 79	newCfg := makeConfig(
 80		votingStartDelay,
 81		votingPeriod,
 82		votingWeightSmoothingDuration,
 83		quorum,
 84		proposalCreationThreshold,
 85		executionDelay,
 86		executionWindow,
 87	)
 88
 89	currentTime := time.Now().Unix()
 90
 91	if err := newCfg.IsValid(currentTime); err != nil {
 92		panic(makeErrorWithDetails(errInvalidConfiguration, err.Error()))
 93	}
 94
 95	// Mint and distribute GNS tokens as part of the process
 96	en.MintAndDistributeGns(cross(rlm))
 97
 98	// Store previous version for event emission
 99	previousVersion := gv.getCurrentConfigVersion()
100
101	// Apply the new configuration
102	nextVersion := gv.reconfigure(0, rlm, newCfg)
103
104	chain.Emit(
105		"Reconfigure",
106		"prevAddr", caller.String(),
107		"prevRealm", prev.PkgPath(),
108		"votingStartDelay", utils.FormatInt(newCfg.VotingStartDelay),
109		"votingPeriod", utils.FormatInt(newCfg.VotingPeriod),
110		"votingWeightSmoothingDuration", utils.FormatInt(newCfg.VotingWeightSmoothingDuration),
111		"quorum", utils.FormatInt(newCfg.Quorum),
112		"proposalCreationThreshold", utils.FormatInt(newCfg.ProposalCreationThreshold),
113		"executionDelay", utils.FormatInt(newCfg.ExecutionDelay),
114		"executionPeriod", utils.FormatInt(newCfg.ExecutionWindow),
115		"newConfigVersion", utils.FormatInt(nextVersion),
116		"prevConfigVersion", utils.FormatInt(previousVersion),
117	)
118
119	return nextVersion
120}
121
122// reconfigure stores the validated configuration with incremented version number.
123func (gv *governanceV1) reconfigure(_ int, rlm realm, cfg governance.Config) int64 {
124	// Generate next version number
125	nextVersion := gv.nextConfigVersion(0, rlm)
126
127	// Store the new configuration with version
128	err := gv.setConfig(0, rlm, nextVersion, cfg)
129	if err != nil {
130		panic("failed to set config: " + err.Error())
131	}
132
133	return nextVersion
134}