Search Apps Documentation Source Content File Folder Download Copy Actions Download

init.gno

5.35 Kb ยท 232 lines
  1package v1
  2
  3import (
  4	"chain/runtime"
  5	"time"
  6
  7	"gno.land/p/nt/avl"
  8	"gno.land/r/gnoswap/emission"
  9
 10	sr "gno.land/r/gnoswap/staker"
 11)
 12
 13const (
 14	defaultDepositGnsAmount    = int64(1_000_000_000)
 15	defaultMinimumRewardAmount = int64(1_000_000_000)
 16
 17	// unstakingFee is the fee charged when unstaking positions.
 18	// This parameter can be modified through governance.
 19	defaultUnstakingFee = int64(100) // 1%
 20)
 21
 22var defaultAllowedTokens = []string{GNS_PATH, GNOT_DENOM}
 23
 24func init() {
 25	registerStakerV1()
 26}
 27
 28func registerStakerV1() {
 29	sr.RegisterInitializer(cross, func(stakerStore sr.IStakerStore, poolAccessor sr.PoolAccessor, emissionAccessor sr.EmissionAccessor, nftAccessor sr.NFTAccessor) sr.IStaker {
 30		err := initStoreData(stakerStore, emissionAccessor)
 31		if err != nil {
 32			panic(err)
 33		}
 34
 35		instance := NewStakerV1(stakerStore, poolAccessor, emissionAccessor, nftAccessor)
 36
 37		instance.setupSwapHooks()
 38		emissionAccessor.SetOnDistributionPctChangeCallback(instance.emissionCacheUpdateHook)
 39
 40		return instance
 41	})
 42}
 43
 44func initStoreData(stakerStore sr.IStakerStore, emissionAccessor sr.EmissionAccessor) error {
 45	if !stakerStore.HasDepositGnsAmountStoreKey() {
 46		err := stakerStore.SetDepositGnsAmount(defaultDepositGnsAmount)
 47		if err != nil {
 48			return err
 49		}
 50	}
 51
 52	if !stakerStore.HasMinimumRewardAmountStoreKey() {
 53		err := stakerStore.SetMinimumRewardAmount(defaultMinimumRewardAmount)
 54		if err != nil {
 55			return err
 56		}
 57	}
 58
 59	if !stakerStore.HasDepositsStoreKey() {
 60		err := stakerStore.SetDeposits(avl.NewTree())
 61		if err != nil {
 62			return err
 63		}
 64	}
 65
 66	if !stakerStore.HasExternalIncentivesStoreKey() {
 67		err := stakerStore.SetExternalIncentives(avl.NewTree())
 68		if err != nil {
 69			return err
 70		}
 71	}
 72
 73	if !stakerStore.HasStakersStoreKey() {
 74		err := stakerStore.SetStakers(avl.NewTree())
 75		if err != nil {
 76			return err
 77		}
 78	}
 79
 80	if !stakerStore.HasTotalEmissionSentStoreKey() {
 81		err := stakerStore.SetTotalEmissionSent(0)
 82		if err != nil {
 83			return err
 84		}
 85	}
 86
 87	if !stakerStore.HasAllowedTokensStoreKey() {
 88		err := stakerStore.SetAllowedTokens(defaultAllowedTokens)
 89		if err != nil {
 90			return err
 91		}
 92	}
 93
 94	if !stakerStore.HasIncentiveCounterStoreKey() {
 95		err := stakerStore.SetIncentiveCounter(sr.NewCounter())
 96		if err != nil {
 97			return err
 98		}
 99	}
100
101	if !stakerStore.HasTokenSpecificMinimumRewardsStoreKey() {
102		err := stakerStore.SetTokenSpecificMinimumRewards(avl.NewTree())
103		if err != nil {
104			return err
105		}
106	}
107
108	if !stakerStore.HasUnstakingFeeStoreKey() {
109		err := stakerStore.SetUnstakingFee(defaultUnstakingFee)
110		if err != nil {
111			return err
112		}
113	}
114
115	if !stakerStore.HasWarmupTemplateStoreKey() {
116		err := stakerStore.SetWarmupTemplate(sr.DefaultWarmupTemplate())
117		if err != nil {
118			return err
119		}
120	}
121
122	if !stakerStore.HasExternalIncentivesByCreationTimeStoreKey() {
123		err := stakerStore.SetExternalIncentivesByCreationTime(sr.NewUintTree())
124		if err != nil {
125			return err
126		}
127	}
128
129	initializedPoolTier, initializedPools := initializePoolTier(stakerStore)
130
131	if !stakerStore.HasPoolsStoreKey() {
132		err := stakerStore.SetPools(initializedPools.tree)
133		if err != nil {
134			return err
135		}
136	}
137
138	if !stakerStore.HasPoolTierMembershipsStoreKey() {
139		err := stakerStore.SetPoolTierMemberships(initializedPoolTier.membership)
140		if err != nil {
141			return err
142		}
143	}
144
145	if !stakerStore.HasPoolTierRatioStoreKey() {
146		err := stakerStore.SetPoolTierRatio(initializedPoolTier.tierRatio)
147		if err != nil {
148			return err
149		}
150	}
151
152	if !stakerStore.HasPoolTierCountsStoreKey() {
153		err := stakerStore.SetPoolTierCounts(initializedPoolTier.counts)
154		if err != nil {
155			return err
156		}
157	}
158
159	if !stakerStore.HasPoolTierLastRewardCacheTimestampStoreKey() {
160		err := stakerStore.SetPoolTierLastRewardCacheTimestamp(initializedPoolTier.lastRewardCacheTimestamp)
161		if err != nil {
162			return err
163		}
164	}
165
166	if !stakerStore.HasPoolTierLastRewardCacheHeightStoreKey() {
167		err := stakerStore.SetPoolTierLastRewardCacheHeight(initializedPoolTier.lastRewardCacheHeight)
168		if err != nil {
169			return err
170		}
171	}
172
173	if !stakerStore.HasPoolTierCurrentEmissionStoreKey() {
174		err := stakerStore.SetPoolTierCurrentEmission(initializedPoolTier.currentEmission)
175		if err != nil {
176			return err
177		}
178	}
179
180	if !stakerStore.HasPoolTierGetEmissionStoreKey() {
181		getEmissionFn := func() int64 {
182			return emissionAccessor.GetStakerEmissionAmountPerSecond()
183		}
184
185		err := stakerStore.SetPoolTierGetEmission(getEmissionFn)
186		if err != nil {
187			return err
188		}
189	}
190
191	if !stakerStore.HasPoolTierGetHalvingBlocksInRangeStoreKey() {
192		getHalvingBlocksInRangeFn := func(start, end int64) ([]int64, []int64) {
193			return emissionAccessor.GetStakerEmissionAmountPerSecondInRange(start, end)
194		}
195
196		err := stakerStore.SetPoolTierGetHalvingBlocksInRange(getHalvingBlocksInRangeFn)
197		if err != nil {
198			return err
199		}
200	}
201
202	if !stakerStore.HasCurrentSwapBatchStoreKey() {
203		err := stakerStore.SetCurrentSwapBatch(nil)
204		if err != nil {
205			return err
206		}
207	}
208
209	return nil
210}
211
212func initializePoolTier(stakerStore sr.IStakerStore) (*PoolTier, *Pools) {
213	basicPoolPath := "gno.land/r/gnoland/wugnot:gno.land/r/gnoswap/gns:3000"
214
215	pools := NewPools()
216	pl := NewPools().GetPoolOrNil(basicPoolPath)
217	if pl == nil {
218		pl = sr.NewPool(basicPoolPath, time.Now().Unix())
219		pools.set(basicPoolPath, pl)
220	}
221
222	poolTier := NewPoolTier(
223		pools,
224		runtime.ChainHeight(),
225		time.Now().Unix(),
226		basicPoolPath,
227		emission.GetStakerEmissionAmountPerSecond,
228		emission.GetStakerEmissionAmountPerSecondInRange,
229	)
230
231	return poolTier, pools
232}