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}