init.gno

package staker

import (
	"gno.land/r/gnoswap/gov/staker"
)

func init(cur realm) {
	registerGovStakerV1(cur)
}

func registerGovStakerV1(cur realm) {
	staker.RegisterInitializer(cross(cur), func(_ int, rlm realm, store staker.IGovStakerStore) staker.IGovStaker {
		// `rlm` here is the gov/staker proxy realm threaded in by
		// staker.RegisterInitializer. Per-version store bootstrap writes
		// therefore pass the proxy's KV-store ACL.
		err := initStoreData(0, rlm, store)
		if err != nil {
			panic(err)
		}

		return NewGovStakerV1(store)
	})
}

func initStoreData(_ int, rlm realm, store staker.IGovStakerStore) error {
	// Initialize basic configuration
	if !store.HasUnDelegationLockupPeriodStoreKey() {
		err := store.SetUnDelegationLockupPeriod(0, rlm, int64(7*24*60*60)) // 7 days default
		if err != nil {
			return err
		}
	}

	if !store.HasTotalDelegatedAmountStoreKey() {
		err := store.SetTotalDelegatedAmount(0, rlm, int64(0))
		if err != nil {
			return err
		}
	}

	if !store.HasTotalLockedAmountStoreKey() {
		err := store.SetTotalLockedAmount(0, rlm, int64(0))
		if err != nil {
			return err
		}
	}

	// Initialize delegation management
	if !store.HasDelegationCounterStoreKey() {
		err := store.SetDelegationCounter(0, rlm, staker.NewCounter())
		if err != nil {
			return err
		}
	}

	if !store.HasDelegationsStoreKey() {
		err := store.SetDelegations(0, rlm, staker.NewDelegationTree())
		if err != nil {
			return err
		}
	}

	// Initialize total delegation history (timestamp -> int64)
	if !store.HasTotalDelegationHistoryStoreKey() {
		err := store.SetTotalDelegationHistory(0, rlm, staker.NewUintTree())
		if err != nil {
			return err
		}
	}

	// Initialize user delegation history (address -> *UintTree[timestamp -> int64])
	if !store.HasUserDelegationHistoryStoreKey() {
		err := store.SetUserDelegationHistory(0, rlm, staker.NewUserDelegationTree())
		if err != nil {
			return err
		}
	}

	// Initialize EmissionRewardManager
	if !store.HasEmissionRewardManagerStoreKey() {
		emissionRewardManager := staker.NewEmissionRewardManager()
		err := store.SetEmissionRewardManager(0, rlm, emissionRewardManager)
		if err != nil {
			return err
		}
	}

	// Initialize ProtocolFeeRewardManager
	if !store.HasProtocolFeeRewardManagerStoreKey() {
		protocolFeeRewardManager := staker.NewProtocolFeeRewardManager()
		err := store.SetProtocolFeeRewardManager(0, rlm, protocolFeeRewardManager)
		if err != nil {
			return err
		}
	}

	// Initialize LaunchpadProjectDeposits
	if !store.HasLaunchpadProjectDepositsStoreKey() {
		launchpadDeposits := staker.NewLaunchpadProjectDeposits()
		err := store.SetLaunchpadProjectDeposits(0, rlm, launchpadDeposits)
		if err != nil {
			return err
		}
	}

	// Initialize DelegationManager
	if !store.HasDelegationManagerStoreKey() {
		delegationManager := staker.NewDelegationManager()
		err := store.SetDelegationManager(0, rlm, delegationManager)
		if err != nil {
			return err
		}
	}

	return nil
}