A fair mining game with a SUI-backed floor.
GTStar turns play into mining. Every participant earns GTS, winners split the pot proportionally, and every token is backed by real SUI held in an on-chain reserve.
Abstract
GTStar is a 5×5 board game that runs entirely in smart contracts on Sui. In each round players deploy SUI onto tiles. When the round ends, one winning tile is drawn using Sui's native randomness (sui::random). Everyone on the winning tile gets their stake back plus a proportional share of the losing pot.
At the same time, a fixed amount of GTS is emitted each round and split among all participants by their share of deposits, winners and losers alike. The game is therefore also a fair launch: no premine, no team allocation, no presale. Every GTS in existence was mined through play.
Part of every fee flows into a reserve that backs the token. Any holder can burn GTS at any time for a proportional share of that reserve, which gives GTS an on-chain redemption value that does not depend on an external exchange.
Motivation
On-chain mining games such as ORE proved there is real demand for mechanisms where play produces a token. They share three structural problems:
- Single winners. Most participants leave most rounds with nothing, which pushes small players away.
- Perpetual emission. A fixed issuance rate means years of dilution for holders.
- Exchange-dependent value. Without external liquidity the token has no anchor.
GTStar addresses all three: proportional payouts on the winning tile, GTS for every participant, emission that halves toward a hard cap, and a reserve that provides built-in redemption value.
Game mechanics
sui::randomRound lifecycle
- A round starts with its first deposit and lasts 60 seconds. No deposits means no round and no emission.
- Deposits close 5 seconds before the end, which prevents last-second entries based on mempool information.
- The minimum deposit is 0.01 SUI per tile, which prevents dust spam.
- Once time is up, anyone can call
settle. A dedicated keeper does this automatically within seconds, and the app exposes a manual fallback.
Payout
losing_pot = total_deposits - winning_tile_total pot_after_fees = losing_pot * 95% payout = my_stake_on_winner + pot_after_fees * my_stake_on_winner / winning_tile_totalIf nobody deployed on the winning tile, the entire pot (after fees) goes to the reserve and benefits every GTS holder.
GTS and emission
Emission is time-based and front-loaded. Every round mints 1 GTS to miners, split across all participants by their share of deposits, plus 0.1 GTS to stakers, streamed over 7 days. Both halve every six months, counted from the first round ever played, and emission stops permanently on January 1, 2030.
miners(t) = 1 GTS >> floor((t - genesis) / 6 months) // 0 after 2030-01-01 stakers(t) = miners(t) * 10% my_gts = miners(t) * my_deposits / round_total_deposits| Period | Miners / round | Stakers / round | Max emitted | Max cumulative |
|---|---|---|---|---|
| Months 0 – 6 | 1 | 0.1 | 289,278 | 289,278 |
| Months 6 – 12 | 0.5 | 0.05 | 144,639 | 433,917 |
| Months 12 – 18 | 0.25 | 0.025 | 72,320 | 506,237 |
| Months 18 – 24 | 0.125 | 0.0125 | 36,160 | 542,397 |
| Months 24 – 30 | 0.0625 | 0.00625 | 18,080 | 560,477 |
| Months 30 – 36 | 0.03125 | 0.003125 | 9,040 | 569,517 |
| Month 36 – Jan 2030 | 0.015625 | 0.0015625 | ≤ 4,520 | ≤ 574,037 |
"Max" assumes a round every minute, around the clock. Rounds only happen when players deposit, so actual emission is lower whenever activity is lower, and GTS that is not mined in its period is never minted later. The code also enforces an absolute hard cap of 1,000,000 GTS on every mint, which the schedule can never reach.
The reserve
4% of every losing pot is added to an on-chain reserve (Treasury.vault). If nobody deployed on the winning tile, the whole pot goes there too. Any holder can burn GTS for a proportional share:
- Redemptions never lower the floor. Reserve and supply shrink in the same proportion, and rounding favours remaining holders.
- Fees raise the floor. Every round adds SUI to the reserve.
- Emission dilutes. New GTS enters circulation without matching SUI, so the floor rises when fee inflow outpaces emission, which becomes easier with every halving.
- No exchange dependency. Redemption value exists on-chain even without a liquidity pool.
The floor is a redemption value backed by assets actually held in the reserve. It is not a price guarantee and it moves with the balance between fee inflow and emission.
Fees
Fees are taken only from each round's losing pot, never from winners' stakes. The rates are fixed in the contract and can never change.
| Destination | Share of losing pot | Purpose |
|---|---|---|
| Winners | 95% | Split proportionally across the winning tile |
| Reserve | 4% | Backs every GTS and raises the redemption floor |
| Creator | 1% | Paid only to a fixed address set in the contract |
Stakers are not paid from fees; they earn newly mined GTS (see below), and they benefit from the reserve like every holder.
Staking
Holders stake GTS to earn yield in GTS, like ORE. There is no lock-up: deposit, withdraw and claim at any time, or claim and re-deposit in one step.
- Source of yield. Every round mints an extra 10% of its GTS reward to stakers.
- Streamed. Each round's staker reward streams over 7 days, so yield accrues every second and is split by stake size.
- No sniping. Staking right before a round settles and leaving right after earns only for the seconds actually staked.
- Nothing is lost. If nobody is staked, the stream pauses and resumes when the next staker arrives.
Architecture
| Module | Responsibility | Objects |
|---|---|---|
game | Board, deposits, settlement, claims, creator fee | Board shared, Miner owned |
gts_token::gts | Token, hard cap, emission ceiling, reserve, redemption (immutable) | Treasury shared |
staking | Deposits, withdrawals, streamed GTS yield | StakePool shared, StakePosition owned |
- Non-custodial. The app is a static site with no backend and no keys. Every action is signed in the player's wallet, and all funds live in contract objects.
- Composed transactions. Creating a miner, claiming the previous round and deploying into the next one happen in a single programmable transaction.
- Keeper. A keeper calls
settleat the end of each round. The function is permissionless, so any player can settle if the keeper is down. - Fully on-chain state. Board, reserve, supply and staking are read directly from the chain.
Security
Randomness
The winning tile is drawn from sui::random, a distributed randomness beacon produced by Sui validators. Settlement is a private entry function, so it cannot be wrapped by another contract that aborts when the outcome is unfavourable.
Internal review
| Finding | Severity | Status |
|---|---|---|
| Staking rewards received while the pool was empty were locked forever | High | Fixed |
| Staking just before settlement and exiting after could capture fees | High | Fixed, fees stream over 7 days |
| Token metadata frozen with an icon that could never be updated | Medium | Fixed |
| Creator fee transferred every round (gas and object bloat) | Low | Fixed, accrues in contract |
| Admin could change round timing and minimum deposit | Medium | Fixed, admin functions removed |
| A game upgrade could have minted extra GTS | High | Fixed, supply and reserve moved to an immutable token contract with an emission ceiling |
Testing
- 15 unit tests cover redemption and the floor price, the supply cap, the emission schedule to 2030, streamed staking rewards, sniping resistance, paused streams, multi-staker splits, withdrawals, two-player solvency, double claims, the freeze window, payment mismatches, minimum deposits and early settlement.
- End-to-end tests ran every action the app performs against a live network. See Verify on-chain.
Governance and upgrades
GTStar is split into two contracts so the economics are locked while the product can still improve.
| Contract | Contains | Upgradeable |
|---|---|---|
gts_token | GTS, the 1,000,000 hard cap, the emission ceiling, the SUI reserve and redemption | No. Immutable at launch |
gtstar | The game, fees and staking | Yes, for fixes and improvements |
- No extra minting, ever. The token contract only mints through a single minting right held by the game, and never beyond the published ceiling: 1.1 GTS per minute, halving every 6 months, zero from January 1, 2030. Burned GTS is never re-minted. No upgrade to the game can change this.
- The reserve is untouchable. SUI can only leave the reserve through redemption by GTS holders.
- No team allocation. There is no premine and no function that could create one.
- Upgrades. The game contract can be upgraded to fix bugs or add features. Every upgrade is published on-chain and announced in advance.
Risks
- Game risk. In any round you are likely to lose deposits on tiles that do not win. Only play with amounts you can afford to lose.
- Smart contract risk. The code has been reviewed and tested, but no code is guaranteed to be free of bugs. The game contract can be patched; the token contract cannot.
- Token value. Redemption value depends on activity and fee inflow. It is not guaranteed and can decrease.
- Operational dependency. Automatic settlement relies on a keeper. When it is unavailable any user can settle manually.
- Regulation. You are responsible for complying with the laws of your jurisdiction.
Roadmap
- Launch. Mainnet contracts, live app and settlement keeper.
- Stabilise. Monitoring, dedicated keeper infrastructure, official domain.
- Liquidity. A GTS/SUI pool on Cetus once demand exists, alongside reserve redemption.
- Community. Leaderboards, round history and statistics.
Verify on-chain
Everything in this document can be checked on-chain. This site is currently connected to the following contracts on Sui:
Transaction proofs
Real transactions from the end-to-end test of this release. Each link opens the transaction in the Suiscan explorer.
GTStar Whitepaper v1.0. This document describes the contracts as deployed. The on-chain code is the source of truth.