init.gno
2.35 Kb · 88 lines
1package v1
2
3import (
4 "strconv"
5
6 "gno.land/r/gnoswap/gov/governance"
7)
8
9func init(cur realm) {
10 registerGovernanceV1(cur)
11}
12
13func registerGovernanceV1(cur realm) {
14 governance.RegisterInitializer(cross(cur), func(_ int, rlm realm, governanceStore governance.IGovernanceStore, stakerAccessor governance.GovStakerAccessor) governance.IGovernance {
15 // `rlm` here is the governance proxy realm threaded in by
16 // governance.RegisterInitializer. Per-version store bootstrap
17 // writes therefore pass the proxy's KV-store ACL.
18 err := initStoreData(0, rlm, governanceStore)
19 if err != nil {
20 panic(err)
21 }
22
23 return NewGovernanceV1(governanceStore, stakerAccessor)
24 })
25}
26
27func initStoreData(_ int, rlm realm, governanceStore governance.IGovernanceStore) error {
28 // Initialize counters if not already set
29 if !governanceStore.HasConfigCounterStoreKey() {
30 err := governanceStore.SetConfigCounter(0, rlm, governance.NewCounter())
31 if err != nil {
32 return err
33 }
34 }
35
36 if !governanceStore.HasProposalCounterStoreKey() {
37 err := governanceStore.SetProposalCounter(0, rlm, governance.NewCounter())
38 if err != nil {
39 return err
40 }
41 }
42
43 // Initialize Configs with default configuration if not already set
44 if !governanceStore.HasConfigsStoreKey() {
45 configs := governance.NewConfigTree()
46 counter := governanceStore.GetConfigCounter()
47 nextConfigVersion := counter.Next()
48
49 configs.Set(formatConfigKey(nextConfigVersion), governance.NewDefaultConfig())
50
51 err := governanceStore.SetConfigs(0, rlm, configs)
52 if err != nil {
53 return err
54 }
55 // Persist the mutated counter so the bumped version survives the
56 // boundary into the proxy's KV store.
57 if err := governanceStore.SetConfigCounter(0, rlm, counter); err != nil {
58 return err
59 }
60 }
61
62 if !governanceStore.HasProposalsStoreKey() {
63 err := governanceStore.SetProposals(0, rlm, governance.NewProposalTree())
64 if err != nil {
65 return err
66 }
67 }
68
69 if !governanceStore.HasProposalUserVotingInfosStoreKey() {
70 err := governanceStore.SetProposalUserVotingInfos(0, rlm, governance.NewProposalUserVotingInfoTree())
71 if err != nil {
72 return err
73 }
74 }
75
76 if !governanceStore.HasUserProposalsStoreKey() {
77 err := governanceStore.SetUserProposals(0, rlm, governance.NewUserProposalTree())
78 if err != nil {
79 return err
80 }
81 }
82
83 return nil
84}
85
86func formatConfigKey(version int64) string {
87 return strconv.FormatInt(version, 10)
88}