init.gno

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)
}