Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

getter.gno

10.67 Kb · 330 lines
  1package gns
  2
  3import (
  4	"time"
  5
  6	gnsmath "gno.land/p/gnoswap/gnsmath/v1"
  7)
  8
  9// GetMaxEmissionAmount returns the configured lifetime GNS emission cap in base units.
 10//
 11// Returns:
 12//   - maxAmount: maximum number of GNS base units available for emission
 13func GetMaxEmissionAmount() int64 {
 14	return MAX_EMISSION_AMOUNT
 15}
 16
 17// GetMaximumSupply returns the maximum possible GNS token supply in base units.
 18//
 19// Returns:
 20//   - maximumSupply: configured total supply cap, including the initial mint and emissions
 21func GetMaximumSupply() int64 {
 22	return MAXIMUM_SUPPLY
 23}
 24
 25// GetInitialMintAmount returns the initial GNS allocation minted before emissions.
 26//
 27// Returns:
 28//   - initialAmount: number of GNS base units in the initial mint
 29func GetInitialMintAmount() int64 {
 30	return INITIAL_MINT_AMOUNT
 31}
 32
 33// IsEmissionInitialized reports whether the emission state has non-zero creation
 34// height and start timestamp.
 35//
 36// Returns:
 37//   - initialized: true when both initialization fields are set; false otherwise
 38func IsEmissionInitialized() bool {
 39	return getEmissionState().isInitialized()
 40}
 41
 42// IsEmissionActive reports whether emission is initialized and the current Unix
 43// time lies within the inclusive emission schedule.
 44//
 45// Returns:
 46//   - active: true during the configured schedule, including its endpoints; false otherwise
 47func IsEmissionActive() bool {
 48	return getEmissionState().isActive(time.Now().Unix())
 49}
 50
 51// IsEmissionEnded reports whether the current Unix time is after the emission end timestamp.
 52//
 53// Returns:
 54//   - ended: true after the configured schedule's end; false at or before that timestamp
 55func IsEmissionEnded() bool {
 56	return getEmissionState().isEnded(time.Now().Unix())
 57}
 58
 59// GetHalvingYear returns the halving year containing timestamp.
 60//
 61// Parameters:
 62//   - timestamp: Unix timestamp to classify against the inclusive 12-year emission schedule
 63//
 64// Returns:
 65//   - year: halving year in [1, 12], or 0 when timestamp is before the start or after the end
 66func GetHalvingYear(timestamp int64) int64 {
 67	return getEmissionState().getCurrentYear(timestamp)
 68}
 69
 70// GetCurrentYear returns the halving year containing the current Unix time.
 71//
 72// Returns:
 73//   - year: current halving year in [1, 12], or 0 when the current time is outside the schedule
 74func GetCurrentYear() int64 {
 75	return getEmissionState().getCurrentYear(time.Now().Unix())
 76}
 77
 78// GetEmissionAmountPerSecondInRange returns paired emission-rate change points
 79// whose timestamps fall within the requested range.
 80//
 81// Parameters:
 82//   - fromTime: inclusive Unix timestamp lower bound
 83//   - toTime: inclusive Unix timestamp upper bound; a lower value yields nil slices
 84//
 85// Returns:
 86//   - timestamps: schedule timestamps in the range where the rate changes, including the post-end zero-rate point when applicable
 87//   - amounts: GNS base units emitted per second at each corresponding timestamp; same length and order as timestamps
 88func GetEmissionAmountPerSecondInRange(fromTime, toTime int64) ([]int64, []int64) {
 89	if fromTime > toTime {
 90		return nil, nil
 91	}
 92
 93	halvingData := getEmissionState().getHalvingData()
 94	halvingTimes := make([]int64, 0, HALVING_END_YEAR+1)
 95	halvingEmissions := make([]int64, 0, HALVING_END_YEAR+1)
 96
 97	for year := HALVING_START_YEAR; year <= HALVING_END_YEAR; year++ {
 98		startTimestamp := halvingData.getStartTimestamp(year)
 99		if startTimestamp < fromTime {
100			continue
101		}
102
103		if toTime < startTimestamp {
104			break
105		}
106
107		halvingTimes = append(halvingTimes, startTimestamp)
108		halvingEmissions = append(halvingEmissions, halvingData.getAmountPerSecond(year))
109	}
110
111	emissionEndTimestamp := halvingData.getEndTimestamp(HALVING_END_YEAR)
112	if fromTime <= emissionEndTimestamp && emissionEndTimestamp < toTime {
113		halvingTimes = append(halvingTimes, gnsmath.SafeAddInt64(emissionEndTimestamp, 1))
114		halvingEmissions = append(halvingEmissions, 0)
115	}
116
117	return halvingTimes, halvingEmissions
118}
119
120// GetEmissionAmountPerSecondByTimestamp returns the configured GNS emission
121// rate for the halving year containing timestamp.
122//
123// Parameters:
124//   - timestamp: Unix timestamp whose schedule rate is queried
125//
126// Returns:
127//   - amount: GNS base units emitted per second for timestamp's halving year, or 0 outside the schedule
128func GetEmissionAmountPerSecondByTimestamp(timestamp int64) int64 {
129	state := getEmissionState()
130	year := state.getCurrentYear(timestamp)
131	return state.getHalvingYearAmountPerSecond(year)
132}
133
134// GetEmissionLeftAmountByTimestamp returns the stored unminted allocation for
135// the halving year containing timestamp.
136//
137// Parameters:
138//   - timestamp: Unix timestamp used to select a halving year
139//
140// Returns:
141//   - amount: remaining GNS base units recorded for that halving year, or 0 outside the schedule
142func GetEmissionLeftAmountByTimestamp(timestamp int64) int64 {
143	state := getEmissionState()
144	year := state.getCurrentYear(timestamp)
145	return state.getHalvingYearLeftAmount(year)
146}
147
148// GetEmissionAccumulatedAmountByTimestamp returns the stored minted allocation
149// for the halving year containing timestamp.
150//
151// Parameters:
152//   - timestamp: Unix timestamp used to select a halving year
153//
154// Returns:
155//   - amount: minted GNS base units recorded for that halving year, or 0 outside the schedule
156func GetEmissionAccumulatedAmountByTimestamp(timestamp int64) int64 {
157	state := getEmissionState()
158	year := state.getCurrentYear(timestamp)
159	return state.getHalvingYearMintedAmount(year)
160}
161
162// GetHalvingYearStartTimestamp returns the inclusive start Unix timestamp for
163// a configured halving year.
164//
165// Parameters:
166//   - year: halving year number in [1, 12]
167//
168// Returns:
169//   - timestamp: inclusive start timestamp for year, or 0 when year is invalid
170func GetHalvingYearStartTimestamp(year int64) int64 {
171	halvingData := getEmissionState().getHalvingData()
172	return halvingData.getStartTimestamp(year)
173}
174
175// GetHalvingYearEndTimestamp returns the inclusive end Unix timestamp for a
176// configured halving year.
177//
178// Parameters:
179//   - year: halving year number in [1, 12]
180//
181// Returns:
182//   - timestamp: inclusive end timestamp for year, or 0 when year is invalid
183func GetHalvingYearEndTimestamp(year int64) int64 {
184	halvingData := getEmissionState().getHalvingData()
185	return halvingData.getEndTimestamp(year)
186}
187
188// GetHalvingYearMaxAmount returns the maximum GNS allocation for a halving year.
189//
190// Parameters:
191//   - year: halving year number in [1, 12]
192//
193// Returns:
194//   - amount: maximum GNS base units allocated to year, or 0 when year is invalid
195func GetHalvingYearMaxAmount(year int64) int64 {
196	halvingData := getEmissionState().getHalvingData()
197	return halvingData.getMaxAmount(year)
198}
199
200// GetHalvingYearLeftAmount returns the remaining GNS allocation recorded for a
201// halving year.
202//
203// Parameters:
204//   - year: halving year number in [1, 12]
205//
206// Returns:
207//   - amount: unminted GNS base units for year, or 0 when year is invalid
208func GetHalvingYearLeftAmount(year int64) int64 {
209	halvingData := getEmissionState().getHalvingData()
210	return halvingData.getLeftAmount(year)
211}
212
213// GetHalvingYearMintedAmount returns the minted GNS allocation recorded for a
214// halving year.
215//
216// Parameters:
217//   - year: halving year number in [1, 12]
218//
219// Returns:
220//   - amount: minted GNS base units for year, or 0 when year is invalid
221func GetHalvingYearMintedAmount(year int64) int64 {
222	halvingData := getEmissionState().getHalvingData()
223	return halvingData.getMintedAmount(year)
224}
225
226// GetAmountPerSecondPerHalvingYear returns the configured GNS emission rate for
227// a halving year.
228//
229// Parameters:
230//   - year: halving year number in [1, 12]
231//
232// Returns:
233//   - amountPerSecond: GNS base units emitted per second in year, or 0 when year is invalid
234func GetAmountPerSecondPerHalvingYear(year int64) int64 {
235	halvingData := getEmissionState().getHalvingData()
236	return halvingData.getAmountPerSecond(year)
237}
238
239// GetHalvingAmountsPerYear returns the total GNS allocation configured for a
240// halving year.
241//
242// Parameters:
243//   - year: halving year number in [1, 12]
244//
245// Returns:
246//   - amount: total GNS base units allocated to year, or 0 when year is invalid
247func GetHalvingAmountsPerYear(year int64) int64 {
248	if validYear(year) != nil {
249		return 0
250	}
251	return halvingAmountsPerYear[year-1]
252}
253
254// GetEmissionCreatedHeight returns the blockchain height recorded when the
255// emission schedule was created.
256//
257// Returns:
258//   - height: schedule creation height, or the uninitialized state's stored value
259func GetEmissionCreatedHeight() int64 {
260	return getEmissionState().getCreatedHeight()
261}
262
263// GetEmissionStartTimestamp returns the inclusive Unix timestamp at which the
264// configured emission schedule begins.
265//
266// Returns:
267//   - timestamp: schedule start timestamp
268func GetEmissionStartTimestamp() int64 {
269	return getEmissionState().getStartTimestamp()
270}
271
272// GetEmissionEndTimestamp returns the inclusive Unix timestamp at which the
273// configured emission schedule ends.
274//
275// Returns:
276//   - timestamp: schedule end timestamp
277func GetEmissionEndTimestamp() int64 {
278	return getEmissionState().getEndTimestamp()
279}
280
281// GetHalvingYearInfo returns the configured halving interval containing timestamp.
282//
283// Parameters:
284//   - timestamp: Unix timestamp to classify against the inclusive emission schedule
285//
286// Returns:
287//   - year: halving year in [1, 12], or 0 outside the schedule
288//   - startTimestamp: inclusive start timestamp of year, or 0 when timestamp is outside the schedule
289//   - endTimestamp: inclusive end timestamp of year, or 0 when timestamp is outside the schedule
290func GetHalvingYearInfo(timestamp int64) (int64, int64, int64) {
291	state := getEmissionState()
292	year := state.getCurrentYear(timestamp)
293
294	// If outside emission period, return 0 values
295	if year == 0 {
296		return 0, 0, 0
297	}
298
299	// Use cached timestamps from HalvingData
300	halvingData := state.getHalvingData()
301	return year, halvingData.getStartTimestamp(year), halvingData.getEndTimestamp(year)
302}
303
304// GetHalvingInfo returns an independent copy of the configured 12-year halving schedule.
305//
306// Returns:
307//   - halvingData: deep copy of schedule timestamps, allocations, minted amounts, remaining amounts, and rates
308func GetHalvingInfo() *HalvingData {
309	return getEmissionState().getHalvingData().Clone()
310}
311
312// CalculateMintGnsAmount calculates the GNS base units allocated over an
313// inclusive timestamp range without mutating the live emission state.
314//
315// Parameters:
316//   - fromTimestamp: inclusive Unix timestamp at which allocation begins
317//   - toTimestamp: inclusive Unix timestamp at which allocation ends
318//
319// Returns:
320//   - amount: GNS base units allocated in the overlapping schedule interval, or 0 for an invalid or non-overlapping range
321func CalculateMintGnsAmount(fromTimestamp, toTimestamp int64) int64 {
322	state := getEmissionState().Clone()
323
324	amountToMint, err := calculateAmountToMint(state, fromTimestamp, toTimestamp)
325	if err != nil {
326		return 0
327	}
328
329	return amountToMint
330}