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}