Skip to content

Commit 349c759

Browse files
waveform06jthiller
andauthored
Update hnt-token with more emissions dates and net emissions pool (#1968)
* Update hnt-token with more emissions dates and net emissions pool * Update hnt-token.mdx * Update hnt-token.mdx to confirm includes all HNT burn * Update hnt-token.mdx clarified meaning of Target clarified meaning of Target * Update hnt-token.mdx, - text formatting * Copy cleanup * most cursed madlib --------- Co-authored-by: Joey Hiller <[email protected]>
1 parent 74a9360 commit 349c759

File tree

3 files changed

+256
-29
lines changed

3 files changed

+256
-29
lines changed

docs/tokens/NetEmissions.jsx

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
import React, { useState } from 'react'
2+
import BrowserOnly from '@docusaurus/BrowserOnly'
3+
import styles from './NetEmissions.module.css'
4+
5+
export const NetEmissions = () => (
6+
<BrowserOnly>
7+
{() => {
8+
const EMISSIONS_CAP = 1643.83561643
9+
const formatter = new Intl.NumberFormat(navigator.language, {
10+
minimumFractionDigits: 0,
11+
maximumFractionDigits: 8,
12+
})
13+
14+
const [yesterday, setYesterday] = useState(400)
15+
const [today, setToday] = useState(9500)
16+
17+
const uncappedTarget = (yesterday * 6) / 7 + (today * 1) / 7
18+
const isCapped = uncappedTarget > EMISSIONS_CAP
19+
const netEmissions = Math.min(uncappedTarget, EMISSIONS_CAP)
20+
const burned = Math.max(today - netEmissions, 0)
21+
22+
const setPreset = (y, t) => {
23+
setYesterday(y)
24+
setToday(t)
25+
}
26+
27+
return (
28+
<div className={styles.container}>
29+
<div className={styles.buttons}>
30+
<button onClick={() => setPreset(400, 9500)} className={styles.button}>
31+
Example
32+
<div className={styles.example}>
33+
Target: 400 HNT
34+
<br />
35+
Burn: 9500 HNT
36+
</div>
37+
</button>
38+
<button onClick={() => setPreset(1650, 200)} className={styles.button}>
39+
Example
40+
<div className={styles.example}>
41+
Target: 1650 HNT
42+
<br />
43+
Burn: 200 HNT
44+
</div>
45+
</button>
46+
<button onClick={() => setPreset(1440, 2000)} className={styles.button}>
47+
Example
48+
<div className={styles.example}>
49+
Target: 1440 HNT
50+
<br />
51+
Burn: 2000 HNT
52+
</div>
53+
</button>
54+
</div>
55+
56+
<div className={styles.box}>
57+
<div className={styles.inputRow}>
58+
<input
59+
type="range"
60+
min="0"
61+
max="10000"
62+
step="1"
63+
value={yesterday}
64+
onChange={(e) => setYesterday(Number(e.target.value))}
65+
/>
66+
</div>
67+
<p>
68+
Yesterday's Net Emissions Target: <strong>{formatter.format(yesterday)}</strong> HNT
69+
</p>
70+
71+
<div className={styles.inputRow}>
72+
<input
73+
type="range"
74+
min="0"
75+
max="10000"
76+
step="1"
77+
value={today}
78+
onChange={(e) => setToday(Number(e.target.value))}
79+
/>
80+
</div>
81+
<p>
82+
Today's HNT Burned: <strong>{formatter.format(today)}</strong> HNT
83+
</p>
84+
</div>
85+
86+
<div className={styles.box}>
87+
<p>
88+
If yesterday's Net Emissions Target was <strong>{yesterday.toLocaleString()}</strong>{' '}
89+
HNT and today's HNT Burned is <strong>{formatter.format(today)}</strong> HNT, then
90+
today's Net Emissions Target is calculated as follows:
91+
</p>
92+
<p>
93+
(<strong>{formatter.format(yesterday)}</strong> × 6/7) + (
94+
<strong>{formatter.format(today)}</strong> × 1/7) ={' '}
95+
<strong>{formatter.format(uncappedTarget)}</strong> HNT{''}
96+
{isCapped && (
97+
<>
98+
<br />
99+
However, this will be capped at <strong>
100+
{formatter.format(EMISSIONS_CAP)}
101+
</strong>{' '}
102+
HNT as today's Net Emissions.
103+
</>
104+
)}
105+
{!isCapped && <> which is below the emissions cap.</>}
106+
</p>
107+
108+
<p>
109+
The difference between the burn and emission represents the change in HNT supply.
110+
<br />
111+
Today's HNT Burned value <strong>{today}</strong> HNT minus today's Net Emissions{' '}
112+
<strong>{formatter.format(netEmissions)}</strong> HNT equals{' '}
113+
<strong>{formatter.format(burned)}</strong> HNT permanently burned.
114+
</p>
115+
116+
<p>
117+
Tomorrow, the uncapped number{' '}
118+
<code>
119+
Net Emissions Target<sub>Today</sub>
120+
</code>{' '}
121+
(<strong>{formatter.format(uncappedTarget)}</strong>) will become{' '}
122+
<code>
123+
Net Emissions Target<sub>Yesterday</sub>
124+
</code>
125+
.
126+
</p>
127+
</div>
128+
</div>
129+
)
130+
}}
131+
</BrowserOnly>
132+
)

docs/tokens/NetEmissions.module.css

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
.container {
2+
padding: 16px 16px 0;
3+
width: 100%;
4+
}
5+
6+
.box {
7+
background: white;
8+
border-radius: 8px;
9+
padding: 16px;
10+
margin-bottom: 1em;
11+
box-shadow: 0 3px 8px -3px rgba(0, 0, 0, 0.08);
12+
}
13+
14+
[data-theme='dark'] .box {
15+
background: rgba(255, 255, 255, 0.05);
16+
}
17+
18+
.inputRow {
19+
display: flex;
20+
margin: 0.5em 0;
21+
}
22+
23+
input[type='range'] {
24+
flex: 1;
25+
}
26+
27+
.buttons {
28+
display: flex;
29+
justify-content: space-evenly;
30+
gap: 1em;
31+
margin-bottom: 1em;
32+
}
33+
34+
.button {
35+
display: flex;
36+
align-items: center;
37+
appearance: none;
38+
background: white;
39+
border: none;
40+
cursor: pointer;
41+
color: #5a719a;
42+
font-size: 1rem;
43+
font-weight: 500;
44+
padding: 1em;
45+
gap: 1em;
46+
text-decoration: none;
47+
border-radius: 8px;
48+
box-shadow: 0 3px 8px -3px rgba(0, 0, 0, 0.08);
49+
}
50+
51+
.example {
52+
font-weight: normal;
53+
text-align: left;
54+
}
55+
56+
[data-theme='dark'] .button {
57+
color: #fff;
58+
background: #53627c;
59+
}
60+
61+
.button:hover {
62+
color: rgb(18, 49, 103);
63+
}
64+
65+
[data-theme='dark'] .button:hover {
66+
color: #fff;
67+
}

docs/tokens/hnt-token.mdx

Lines changed: 57 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,20 @@ import { TopLedgerEmbed } from '@site/src/theme/TopLedgerEmbed'
1414
<img className="docsheader" src={useBaseUrl('img/blockchain/heliumtoken.png')} />
1515

1616
The Helium Network Token (HNT) is the native cryptocurrency and protocol token of the Helium
17-
Network.
17+
Network. The first HNT was emitted on July 29th, 2019. There was no pre-mine of HNT before the
18+
launch of the Network.
1819

19-
The original Helium blockchain produced the first HNT on July 29th, 2019, on block 93. There was no
20-
pre-mine of HNT before the launch of the Network. The Helium network migrated to the Solana
21-
Blockchain on April 18, 2023.
22-
23-
The mint address for HNT is [`hntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux`][hnt-mint-addr] on the
24-
Solana blockchain.
25-
26-
Navigate to [https://explorer.helium.com/stats][explorer-stats] for up-to-date information on
27-
Network tokens.
20+
The Helium network migrated from its own purpose-built blockchain to the Solana Blockchain on April
21+
18, 2023. The mint address for HNT is [`hntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux`][hnt-mint-addr]
22+
on the Solana blockchain.
2823

2924
## HNT Usage
3025

3126
HNT serves the needs of the two primary parties in the Helium Ecosystem:
3227

33-
1. **Hotspot Hosts and Operators**. Hosts are rewarded in network tokens like [IOT][iot] or
34-
[MOBILE][mobile] while deploying and maintaining network coverage. These network tokens are
35-
redeemable for HNT.
36-
2. **Enterprises and Developers use the Helium Network** to connect devices and build IoT
28+
1. **Hotspot Hosts and Operators**. Hosts are rewarded in HNT network tokens while deploying and
29+
maintaining network coverage. Operators, and some network mappers are also rewarded in HNT.
30+
2. **Enterprises and Developers use the Helium Network** to connect devices and build Network
3731
applications. [Data Credits][datacredit], which are a \$USD-pegged utility token derived from
3832
HNT, are used to pay transaction fees for wireless data transmissions on the Network.
3933

@@ -53,8 +47,10 @@ needs and relatively scarce, with a known maximum.
5347
### Max Supply
5448

5549
The Network targeted the distribution of 5,000,000 HNT per month at launch. Following the community
56-
approval of HIP-20, the Network uses a two-year halving schedule, resulting in a maximum HNT supply
57-
of 223,000,000 HNT.
50+
approval of HIP-20, the Network uses a two-year halving schedule, resulting in an initial maximum
51+
HNT supply of 240,000,000 HNT, but slow blockchain times in year 1 resulted in an issuance that was
52+
~17,000,000 HNT less than the schedule targeted. Thus, at the time HIP 20 was approved, max supply
53+
had decreased to ~223,000,000 HNT.
5854

5955
| Year | Year Start | HNT at Year Start | Target HNT Emission |
6056
| :--: | ---------------: | ----------------: | ------------------: |
@@ -66,6 +62,8 @@ of 223,000,000 HNT.
6662
| 6 | August 1st, 2024 | 195,000,000 | 15,000,000 |
6763
| 7 | August 1st, 2025 | 210,000,000 | 7,500,000 |
6864
| 8 | August 1st, 2026 | 217,500,000 | 7,500,000 |
65+
| 7 | August 1st, 2027 | 225,000,000 | 3,750,000 |
66+
| 8 | August 1st, 2028 | 228,750,000 | 3,750,000 |
6967

7068
> The full token emission schedule can be viewed in the HNT section of this document: [Token
7169
> Emissions as of Solana Migration][sol-emissions].
@@ -89,30 +87,60 @@ continue transmitting data and ensure a healthy, robust network, the Net Emissio
8987
instituted in August 2021.
9088

9189
Net Emissions give the protocol enough HNT for rewards in perpetuity by monitoring the number of HNT
92-
burned for DC in a given epoch and adding that to the number of HNT to mint that epoch. Because HNT
90+
burned in a given epoch and adding that to the number of HNT to mint that epoch. Because HNT
9391
produced via Net Emissions do not add to the total outstanding, they do not violate max supply.
9492
However, to ensure that the deflationary pressure is still present, the Net Emission is capped at 1%
9593
of the epoch emissions at the time when HIP 20 was approved.
9694

97-
For instance, in October 2024, the Net Emissions cap is 1,643.83561643 HNT per epoch, and the
98-
up-to-date value can be verified
99-
[on chain at](https://solscan.io/account/BQ3MCuTT5zVBhNfQ4SjMh3NPVhFy73MPV8rjfq5d1zie#data). Move
100-
decimal point 8 positions left to measure in HNT.
101-
102-
If less than 1,643.83561643 HNT is burned for DC within an epoch, the full amount burned will be
103-
re-minted and added to the day's usual scheduled emissions for that day's epoch. However, if more
104-
than 1,643.83561643 HNT is burned for DC within a single epoch, any HNT burn for DC over
105-
1,643.83561643 will be permanently burned and removed from the max supply, while 1,643.83561643 will
106-
be re-minted and distributed in scheduled emissions.
95+
Initially, Net Emissions counted only HNT burned for Data Credits but now accounts for all HNT
96+
burned, but does not include HNT not emitted.
10797

10898
Review the [complete Net Emissions discussion in the HIP][hip-20] for more information. Note that in
10999
HIP-20, the cap was 34.24 HNT because the epoch was every 30 minutes at the time HIP-20 was written.
110-
The current epoch is only 24 hour basis, yielding a cap of 1,643.83561643 HNT.
100+
The current epoch is only 24 hour basis, yielding a cap of 1,643.83561643 HNT. The cap is not
101+
affected by the 2 year emissions halvings.
102+
103+
The up-to-date value can be verified
104+
[on chain at.](https://explorer.solana.com/address/BQ3MCuTT5zVBhNfQ4SjMh3NPVhFy73MPV8rjfq5d1zie/anchor-account)
105+
Move the decimal point 8 positions left to measure `Net Emissions Cap` in HNT.
106+
107+
HIP-20 proposed a Net Emissions Pool, which would smooth out the effects of large individual burn
108+
events occurring infrequently over several days. Without smoothing, large HNT burns for DC would be
109+
extremely capped as the burn and cap would happen only on one day. This pool was implemented as part
110+
of [HRP 2025-03][hrp-2025-03] using a similar smoothing calculation to that for the Utility Score
111+
described in [HIP-141][hip-141]. With smoothing, this has an effect that large burns on one day can
112+
increase Net Emissions over several days, rather than just one day.
113+
114+
Every day, a Net Emissions Target is calculated, which takes into account the daily burn of HNT, and
115+
the Net Emissions Target of the previous day and smooths it. The target amount of HNT is then
116+
re-emitted as Net Emissions, up to the cap of 1,643.83561643 HNT.
117+
118+
The smoothing calculation multiplies yesterday's uncapped and smoothed HNT burned amount number and
119+
multiplies it by 6/7 and then adds it to today's actual HNT burned amount, multiplied by 1/7 and the
120+
resulting number then has the Net Emissions Cap applied to provide the calculated Net Emission HNT
121+
number for today.
122+
123+
$$
124+
\text{Net Emissions Target}_{\text{Today}} = \text{Net Emissions Target}_{\text{Yesterday}} \cdot \frac{6}{7} + \text{HNT Burn}_{\text{Today}} \cdot \frac{1}{7}
125+
$$
126+
127+
$$
128+
\text{HNT Net Emissions}_{\text{Today}} = \min\left( \text{Net Emissions Target}_{\text{Today}},\ 1643.83561643 \right)
129+
$$
130+
131+
import { NetEmissions } from './NetEmissions'
132+
133+
<figure className="screensnippet-wrapper">
134+
<NetEmissions />
135+
</figure>
111136

112137
[bme]: https://multicoin.capital/2018/02/13/new-models-utility-tokens/
113138
[datacredit]: /tokens/data-credit
114-
[explorer-stats]: https://explorer.helium.com/stats
115139
[hip-20]: https://github.com/helium/HIP/blob/master/0020-hnt-max-supply.md#net-emissions
140+
[hip-141]:
141+
https://github.com/helium/HIP/blob/main/0141-single-token-governance-and-release-proposals.md#smoothing-function
142+
[hrp-2025-03]:
143+
https://github.com/helium/helium-release-proposals/blob/main/releases/20250312-core-devs.md#1-hnt-token-net-emissions-smoothing
116144
[iot]: /tokens/iot-token
117145
[mobile]: /tokens/mobile-token
118146
[sol-emissions]:

0 commit comments

Comments
 (0)