Package gns implements the GNS governance and utility token for GnoSwap.
GNS is a GRC20-compliant token with a deflationary emission schedule. The emission follows a 12-year schedule with halving every 2 years:
- Years 1-2: 225,000,000 GNS per year (100%)
- Years 3-4: 112,500,000 GNS per year (50%)
- Years 5-6: 56,250,000 GNS per year (25%)
- Years 7-8: 28,125,000 GNS per year (12.5%)
- Years 9-12: 14,062,500 GNS per year (6.25%)
Token Economics:
- Maximum Supply: 1,000,000,000 GNS
- Initial Mint: 100,000,000 GNS
- Total Emission: 900,000,000 GNS
Key Functions:
- InitEmissionState: Initializes emission schedule (emission contract only)
- MintGns: Mints tokens per emission schedule (emission contract only)
- Burn: Burns tokens from circulation (admin only)
- Transfer/TransferFrom/Approve: Standard GRC20 operations
The emission state tracks accumulated and remaining amounts per halving year, ensuring precise token distribution according to the schedule.
Functions
Allowance
func Allowance(owner, spender address) int64
Allowance returns the amount of GNS that a spender is allowed to transfer from an owner.
Approve allows spender to transfer GNS tokens from caller's account.
Parameters:
- spender: address authorized to spend
- amount: maximum amount spender can transfer
Command
# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.
gnokey maketx call -pkgpath "gno.land/r/gnoswap/gns" -func "Approve" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 5000000 -send "" -broadcast -chainid "test11" -remote "https://rpc.test11.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.test11.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/gnoswap/gns" -func "Approve" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 5000000 -send "" ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "test11" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.test11.testnets.gno.land" call.tx
BalanceOf
func BalanceOf(owner address) int64
BalanceOf returns the GNS balance of a specific address.
GetEmissionAccumulatedAmountByTimestamp returns the accumulated emission amount for the halving year at given timestamp. Returns 0 if timestamp is outside emission period.
GetEmissionAmountPerSecondInRange returns halving timestamps and emission rates for the given time range. Returns two slices: timestamps when halving periods start and corresponding emission rates per second.
GetEmissionLeftAmountByTimestamp returns the remaining emission amount for the halving year at given timestamp. Returns 0 if timestamp is outside emission period.
GetHalvingYearInfo returns the halving year, start timestamp, and end timestamp for a given timestamp. Returns (year, startTimestamp, endTimestamp). Year is 0 if outside emission period.
InitEmissionState initializes emission schedule with start timestamp. Only callable by emission contract. Sets up 12-year emission schedule with halving every 2 years. Panics if caller is not emission contract.
Command
# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.
gnokey maketx call -pkgpath "gno.land/r/gnoswap/gns" -func "InitEmissionState" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 5000000 -send "" -broadcast -chainid "test11" -remote "https://rpc.test11.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.test11.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/gnoswap/gns" -func "InitEmissionState" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 5000000 -send "" ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "test11" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.test11.testnets.gno.land" call.tx
IsEmissionActive
func IsEmissionActive() bool
IsEmissionActive returns true if emission is currently active based on current time.
MintGns mints new GNS tokens according to the emission schedule.
Parameters:
- address: recipient address for minted tokens
Returns amount minted. Only callable by emission contract.
Note: Halt check is performed by the caller (emission.MintAndDistributeGns) to allow graceful handling. This function assumes caller has already verified halt status before invoking.
Command
# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.
gnokey maketx call -pkgpath "gno.land/r/gnoswap/gns" -func "MintGns" -args $'' -gas-fee 1000000ugnot -gas-wanted 5000000 -send "" -broadcast -chainid "test11" -remote "https://rpc.test11.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.test11.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/gnoswap/gns" -func "MintGns" -args $'' -gas-fee 1000000ugnot -gas-wanted 5000000 -send "" ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "test11" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.test11.testnets.gno.land" call.tx
MintedEmissionAmount
func MintedEmissionAmount() int64
MintedEmissionAmount returns the total GNS tokens minted through emission, excluding the initial mint amount.
NewEmissionState creates a new EmissionState with specified start height and timestamp. Calculates emission end time based on 12-year schedule and initializes halving data.
NewHalvingData creates a new HalvingData instance with emission schedule. Initializes 12 years of halving periods with timestamps, amounts, and rates based on startTimestamp.