package governance
import (
"strconv"
"gno.land/r/gnoswap/gov/governance"
)
func init(cur realm) {
registerGovernanceV1(cur)
}
func registerGovernanceV1(cur realm) {
governance.RegisterInitializer(cross(cur), func(_ int, rlm realm, governanceStore governance.IGovernanceStore, stakerAccessor governance.GovStakerAccessor) governance.IGovernance {
// `rlm` here is the governance proxy realm threaded in by
// governance.RegisterInitializer. Per-version store bootstrap
// writes therefore pass the proxy's KV-store ACL.
err := initStoreData(0, rlm, governanceStore)
if err != nil {
panic(err)
}
return NewGovernanceV1(governanceStore, stakerAccessor)
})
}
func initStoreData(_ int, rlm realm, governanceStore governance.IGovernanceStore) error {
// Initialize counters if not already set
if !governanceStore.HasConfigCounterStoreKey() {
err := governanceStore.SetConfigCounter(0, rlm, governance.NewCounter())
if err != nil {
return err
}
}
if !governanceStore.HasProposalCounterStoreKey() {
err := governanceStore.SetProposalCounter(0, rlm, governance.NewCounter())
if err != nil {
return err
}
}
// Initialize Configs with default configuration if not already set
if !governanceStore.HasConfigsStoreKey() {
configs := governance.NewConfigTree()
counter := governanceStore.GetConfigCounter()
nextConfigVersion := counter.Next()
configs.Set(formatConfigKey(nextConfigVersion), governance.NewDefaultConfig())
err := governanceStore.SetConfigs(0, rlm, configs)
if err != nil {
return err
}
// Persist the mutated counter so the bumped version survives the
// boundary into the proxy's KV store.
if err := governanceStore.SetConfigCounter(0, rlm, counter); err != nil {
return err
}
}
if !governanceStore.HasProposalsStoreKey() {
err := governanceStore.SetProposals(0, rlm, governance.NewProposalTree())
if err != nil {
return err
}
}
if !governanceStore.HasProposalUserVotingInfosStoreKey() {
err := governanceStore.SetProposalUserVotingInfos(0, rlm, governance.NewProposalUserVotingInfoTree())
if err != nil {
return err
}
}
if !governanceStore.HasUserProposalsStoreKey() {
err := governanceStore.SetUserProposals(0, rlm, governance.NewUserProposalTree())
if err != nil {
return err
}
}
return nil
}
func formatConfigKey(version int64) string {
return strconv.FormatInt(version, 10)
}