Kind Realm (renderable)
Name gns
Namespace gnoswap
Exported functions 43
Module gno.land/r/gnoswap/gns
gno 0.9 This realm implements a recognized token. GNS → emission_state.gno gno
⧉
1 package gns 2 3 import ( 4 "chain/runtime" 5 "time" 6 7 gnsmath "gno.land/p/gnoswap/gnsmath/v1" 8 Allowance (owner string, spender string) int64
Approve (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, spender string, amount int64)
BalanceOf (owner string) int64
CalculateMintGnsAmount (fromTimestamp int64, toTimestamp int64) int64
Decimals () int
GetAmountPerSecondPerHalvingYear (year int64) int64
GetCurrentYear () int64
GetEmissionAccumulatedAmountByTimestamp (timestamp int64) int64
GetEmissionAmountPerSecondByTimestamp (timestamp int64) int64
GetEmissionAmountPerSecondInRange (fromTime int64, toTime int64) ([]int64, []int64)
GetEmissionCreatedHeight () int64
GetEmissionEndTimestamp () int64
GetEmissionLeftAmountByTimestamp (timestamp int64) int64
GetEmissionStartTimestamp () int64
GetHalvingAmountsPerYear (year int64) int64
GetHalvingInfo () *gno.land/r/gnoswap/gns.HalvingData
GetHalvingYear (timestamp int64) int64
GetHalvingYearEndTimestamp (year int64) int64
GetHalvingYearInfo (timestamp int64) (int64, int64, int64)
GetHalvingYearLeftAmount (year int64) int64
GetHalvingYearMaxAmount (year int64) int64
GetHalvingYearMintedAmount (year int64) int64
GetHalvingYearStartTimestamp (year int64) int64
GetInitialMintAmount () int64
GetMaxEmissionAmount () int64
GetMaximumSupply () int64
InitEmissionState (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, createdHeight int64, startTimestamp int64)
IsEmissionActive () bool
IsEmissionEnded () bool
IsEmissionInitialized () bool
KnownAccounts () int
LastMintedTimestamp () int64
LeftEmissionAmount () int64
MintedEmissionAmount () int64
MintGns (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, address string) int64
Name () string
NewEmissionState (createdHeight int64, startTimestamp int64) *gno.land/r/gnoswap/gns.EmissionState
NewHalvingData (startTimestamp int64) *gno.land/r/gnoswap/gns.HalvingData
Render (path string) string
Symbol () string
TotalSupply () int64
Transfer (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, to string, amount int64)
TransferFrom (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, from string, to string, amount int64)
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.
ufmt "gno.land/p/nt/ufmt/v0"
9 )
10
11 var emissionState *EmissionState
12
13 func init() {
14 emissionState = NewEmissionState( 0 , 0 )
15 }
16
17 // EmissionState manages emission state and halving data.
18 // Tracks emission timing, status, and halving year information for 12-year schedule.
19 type EmissionState struct {
20 createdHeight int64
21 startTimestamp int64
22 endTimestamp int64
23 halvingData *HalvingData
24 }
25
26 // isInitialized returns true if emission state has been initialized with valid height and timestamp.
27 func (e *EmissionState) isInitialized() bool {
28 return e.createdHeight != 0 && e.startTimestamp != 0
29 }
30
31 // isActive returns true if emission is currently active at the given timestamp.
32 // Returns false if not initialized or timestamp is outside emission period.
33 func (e *EmissionState) isActive(timestamp int64 ) bool {
34 if !e.isInitialized() {
35 return false
36 }
37
38 if e.startTimestamp > timestamp {
39 return false
40 }
41
42 if e.endTimestamp < timestamp {
43 return false
44 }
45
46 return true
47 }
48
49 // isEnded returns true if emission has ended at the given timestamp.
50 func (e *EmissionState) isEnded(timestamp int64 ) bool {
51 return e.endTimestamp < timestamp
52 }
53
54 // getCurrentYear returns the halving year (1-12) for the given timestamp, or 0 if outside emission period.
55 func (e *EmissionState) getCurrentYear(timestamp int64 ) int64 {
56 if timestamp < e.startTimestamp {
57 return 0
58 }
59
60 if timestamp > e.endTimestamp {
61 return 0
62 }
63
64 year := (timestamp - e.startTimestamp) / SECONDS_IN_YEAR
65 return year + 1
66 }
67
68 // getCreatedHeight returns the blockchain height when emission started.
69 func (e *EmissionState) getCreatedHeight() int64 {
70 return e.createdHeight
71 }
72
73 // getStartTimestamp returns the timestamp when emission started.
74 func (e *EmissionState) getStartTimestamp() int64 {
75 return e.startTimestamp
76 }
77
78 // getEndTimestamp returns the timestamp when emission ends.
79 func (e *EmissionState) getEndTimestamp() int64 {
80 return e.endTimestamp
81 }
82
83 // getHalvingData returns the halving data containing emission schedule details.
84 func (e *EmissionState) getHalvingData() *HalvingData {
85 return e.halvingData
86 }
87
88 // getHalvingYearStartTimestamp returns the start timestamp for the specified halving year.
89 func (e *EmissionState) getHalvingYearStartTimestamp(year int64 ) int64 {
90 return e.halvingData.getStartTimestamp(year)
91 }
92
93 // getHalvingYearEndTimestamp returns the end timestamp for the specified halving year.
94 func (e *EmissionState) getHalvingYearEndTimestamp(year int64 ) int64 {
95 return e.halvingData.getEndTimestamp(year)
96 }
97
98 // getHalvingYearAmountPerSecond returns the emission rate per second for the specified halving year.
99 func (e *EmissionState) getHalvingYearAmountPerSecond(year int64 ) int64 {
100 return e.halvingData.getAmountPerSecond(year)
101 }
102
103 // getHalvingYearMintedAmount returns the minted emission amount for the specified halving year.
104 func (e *EmissionState) getHalvingYearMintedAmount(year int64 ) int64 {
105 return e.halvingData.getMintedAmount(year)
106 }
107
108 // getHalvingYearLeftAmount returns the remaining emission amount for the specified halving year.
109 func (e *EmissionState) getHalvingYearLeftAmount(year int64 ) int64 {
110 return e.halvingData.getLeftAmount(year)
111 }
112
113 // addHalvingYearMintedAmount adds to the minted emission amount for the specified halving year.
114 // Returns error if year is invalid (0 or outside 1-12 range).
115 func (e *EmissionState) addHalvingYearMintedAmount(year int64 , amount int64 ) error {
116 if year == 0 {
117 return makeErrorWithDetails(errInvalidYear, ufmt.Sprintf( "year: %d" , year))
118 }
119
120 mintedAmount := e.halvingData.getMintedAmount(year)
121 mintedAmount = gnsmath.SafeAddInt64(mintedAmount, amount)
122
123 return e.halvingData.setMintedAmount(year, mintedAmount)
124 }
125
126 // subHalvingYearLeftAmount subtracts from the remaining emission amount for the specified halving year.
127 // Returns error if year is invalid (0 or outside 1-12 range).
128 func (e *EmissionState) subHalvingYearLeftAmount(year int64 , amount int64 ) error {
129 if year == 0 {
130 return makeErrorWithDetails(errInvalidYear, ufmt.Sprintf( "year: %d" , year))
131 }
132
133 leftAmount := e.halvingData.getLeftAmount(year)
134 leftAmount = gnsmath.SafeSubInt64(leftAmount, amount)
135
136 return e.halvingData.setLeftAmount(year, leftAmount)
137 }
138
139 // Clone returns a deep copy of the emission state, including independent halving data.
140 //
141 // Returns:
142 // - clone: independent EmissionState copy with the same schedule values.
143 func (e *EmissionState) Clone() *EmissionState {
144 return &EmissionState{
145 createdHeight: e.createdHeight,
146 startTimestamp: e.startTimestamp,
147 endTimestamp: e.endTimestamp,
148 halvingData: e.halvingData.Clone(),
149 }
150 }
151
152 // NewEmissionState creates an emission state and its 12-year halving schedule.
153 //
154 // Parameters:
155 // - createdHeight: blockchain height recorded as the schedule's creation height.
156 // - startTimestamp: Unix timestamp at which the first halving year begins.
157 //
158 // Returns:
159 // - state: newly allocated emission state with an end timestamp and initialized halving data.
160 func NewEmissionState(createdHeight int64 , startTimestamp int64 ) *EmissionState {
161 emissionEndTime := gnsmath.SafeAddInt64(startTimestamp, SECONDS_IN_YEAR*HALVING_END_YEAR- 1 )
162
163 return &EmissionState{
164 createdHeight: createdHeight,
165 startTimestamp: startTimestamp,
166 endTimestamp: emissionEndTime,
167 halvingData: NewHalvingData(startTimestamp),
168 }
169 }
170
171 // getEmissionState returns the singleton emission state instance.
172 func getEmissionState() *EmissionState {
173 if emissionState == nil {
174 emissionState = NewEmissionState(runtime.ChainHeight(), time.Now().Unix())
175 }
176
177 return emissionState
178 }
179