Docs
Everything the format does, in the order you meet it. The demos below run the same math and the same rules as the program.
The format in one paragraph
An NTS-1 coin is a normal fungible token: a Token-2022 mint with one billion units and its own bonding curve, tradable from the first second. It is also member number N of a collection with a hard cap, because the mint carries the Token-2022 group extensions. The number, the cap, the seed and the traits live inside the mint. Nothing about identity is stored off-chain. The platform is the root collection; anyone can open a collection of their own, which is itself a numbered member of the root. (In the program, a collection is called a launchpad: a group that can host launches.)
Inside a mint
Three Token-2022 extension pairs on the same account. Explorers that understand them show the number; our app duplicates it in plain metadata for the ones that do not.
| Extension | Role | Fields |
|---|---|---|
| MetadataPointer + TokenMetadata | Identity and traits | name (“Dragon #042”), symbol, uri, additional_metadata: number, max, seed, traits, special, creator, claimed_at, nickname |
| GroupMemberPointer + TokenGroupMember | Membership and number | group (the collection mint), member_number (sequential, immutable) |
| GroupPointer + TokenGroup | Collections only | max_size (the cap), size (members so far), update_authority (the program) |
The seed is sha256(group_mint ‖ member_number ‖ slot), computed by the program. Traits are chosen from the seed with fixed rarity tables (80 / 17 / 3 %), the same code in Rust and in TypeScript. The image is rendered from the seed on request; it is never a source of truth. The uri is deterministic: base + mint.
Number and cap
The number is not a counter in our program. It is the member_number Token-2022 assigns when initialize_member adds the mint to the group, and the cap is max_size, enforced by the token program. Two launches in the same slot cannot share a number: the chain serializes. Try it with a collection capped at 10.
Click: the program calls initialize_member and Token-2022 hands out member_number = size + 1.
Special numbers get a readable extra trait: #1 is “first”, repeated digits are “repdigit”, mirrors are “palindrome”, multiples of 100 are “round”. Just rarity you can read, no game logic.
Lifecycle of a monster
- Launch
A visitor clicks. The backend signs with its payer wallet, the program creates the mint, joins the group (number), writes the metadata, mints the supply into the curve, and pays the backend back from the collection's budget. A wallet may also launch and pay its own rent; it is then the creator at once.
- Trade
Anyone buys or sells on the curve immediately. 1 % fee, split three ways. The curve is permanent.
- Claim
The visitor's browser holds a secret; only its sha256 is on-chain. Connect a wallet, present the secret, the program writes creator and claimed_at into the metadata. Creator fees become withdrawable. A nickname can be engraved once.
- Expire
Still unclaimed after the claim window (7 days) and never traded: anyone can call expire. The curve and the stock close, their rent returns to the collection budget, the supply goes to zero. The number stays consumed, the metadata stays on-chain. A traded monster never expires.
The bonding curve
One curve per monster, same formula for all: a virtual constant product. Parameters are copied from the config at launch, so a curve never changes after birth.
x = 30 virtual SOL + reserve, y = 1.073 B virtual tokens minus sold, x · y stays constant. Every rounding goes to the pool. Buying the whole billion costs about 411 SOL. The curve never graduates: no AMM migration, no lock, same math forever.
Fees
1 % on every buy and every sell, taken on the SOL side. The split is a config parameter the admin can change for future launches; each curve keeps the split it was born with.
- Platform0.0400 SOL
- Collection owner0.0300 SOL
- Creator0.0300 SOL
Fee 0.100 SOL on this trade. The platform share goes to the treasury at once. The owner share accrues on the collection's account, withdrawable by its owner. The creator share accrues on the curve and waits for the claim; it is withdrawable after. Same split on buys and sells, taken on the SOL side.
Collections inside the collection
A user collection is a group mint with its own cap (100 to 10,000), prefix, symbol and style, and it is a numbered member of the root. Its creator pays the rent, becomes the owner, and can transfer ownership later. The owner earns 0.30 % of every trade on members launched there.
Free launches cost rent. Every collection carries a budget of lamports: the backend pays the rent, the program reimburses it from the budget in the same transaction. No budget, no free launch (wallet launches still work). Anyone can top a budget up; expired launches give their rent back to it. The platform's exposure is exactly the budget of the root, nothing else.
| Who | Pays | Earns |
|---|---|---|
| Visitor | Nothing | The monster, after claim |
| Collection owner | Group rent (~0.01 SOL) + a launch budget | 0.30 % of trades in the collection |
| Creator (claimed) | A claim transaction | 0.30 % of trades on that monster |
| Platform | Root budget | 0.40 % (0.70 % on root members) |
Prompted styles
A collection owner describes it in a sentence. Claude turns it into a style: a shape family (monster, dragon, robot, ghost), 34 colours and a 42-word vocabulary for the traits. The style is encoded into a compact string (under 560 bytes) and written into the group's metadata at creation, so every member renders with it, here or anywhere else that reads the chain. The rarity tables and the seed logic never change; a style only picks colours, shapes and names.
Claim and secrets
At launch the backend draws a 32-byte secret, stores its sha256 in the Launch account, and gives the secret to the browser once (and in the claim link, in the URL fragment, which never reaches a server). To claim, the wallet signs a transaction carrying the secret; the program hashes and compares. Losing the secret means losing the right to claim, which is why the site nags about copying the link. Three unclaimed numbers per browser session, ten per IP per day, a short cooldown between clicks.
Who holds what
| Thing | Held by |
|---|---|
| Mint authority and update authority of every mint and group | The program's Config PDA, never a person |
| SOL reserves of the curves | Each Curve PDA, moved only by buy and sell |
| Launch budgets and owner fees | Each Group PDA |
| The backend payer wallet | A hot wallet with a small balance that only signs launches and is paid back |
| Fee split, curve parameters, claim window | Config, changeable by the admin for future launches only |
No transfer hook, no graduation, no admin path into a curve. The program will be audited before any mainnet use; this is devnet.
Reference
| Account | Seeds | Holds |
|---|---|---|
| Config | ["config"] | admin, payer, treasury, fee bps, curve params, claim_ttl, root mint, uri base |
| Group | ["group", group_mint] | owner, parent, number, max_size, size, budget, owner_fees, theme, prefix, symbol |
| Launch | ["launch", mint] | group, number, seed, claim_hash, creator, created_at, claimed_at, status |
| Curve | ["curve", mint] | virtual reserves, reserve, sold, trades, fee split, creator_fees (and the SOL itself) |
| Stock | ["stock", mint] | The unsold supply (token account owned by Config) |
| Instruction | Signer | What it does |
|---|---|---|
| init_config | admin | Config + the root group mint |
| create_group | creator | A user collection (a launchpad in program terms), member of the root, with cap, style and budget |
| fund_group / set_group | anyone / owner | Top up a budget; open or close launches; transfer ownership |
| launch | payer or any wallet | Mint + member number + metadata + supply into the curve; pending or claimed |
| claim / set_nickname | claimer / creator | Secret check, creator written; one nickname |
| expire | anyone | Close an untouched launch after the window, rent back to the budget |
| buy / sell | trader | Constant product swap with the 1 % split |
| withdraw_owner_fees / withdraw_creator_fees | owner / creator | Collect accrued shares |
Program 5ZmEp1vQj45R3itxEo6hgH8aX4E8UNCkRsTw13gjchco , Anchor, Token-2022 extensions (metadata, group, group member). Devnet.