NTS—1
Open a collection

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.

ExtensionRoleFields
MetadataPointer + TokenMetadataIdentity and traitsname (“Dragon #042”), symbol, uri, additional_metadata: number, max, seed, traits, special, creator, claimed_at, nickname
GroupMemberPointer + TokenGroupMemberMembership and numbergroup (the collection mint), member_number (sequential, immutable)
GroupPointer + TokenGroupCollections onlymax_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.

size 0 / max_size 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

  1. 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.

  2. Trade

    Anyone buys or sells on the curve immediately. 1 % fee, split three ways. The curve is permanent.

  3. 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.

  4. 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.

0 soldall sold, ×15
Price now
×1.00
vs birth
Market cap
27.96 SOL
0.00 sold
You receive
34.28M
for 1.00 SOL
Fee
0.010 SOL
1 %, split three ways

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.

0.4 %
0.3 %
0.3 %
  • 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.

WhoPaysEarns
VisitorNothingThe monster, after claim
Collection ownerGroup rent (~0.01 SOL) + a launch budget0.30 % of trades in the collection
Creator (claimed)A claim transaction0.30 % of trades on that monster
PlatformRoot budget0.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

ThingHeld by
Mint authority and update authority of every mint and groupThe program's Config PDA, never a person
SOL reserves of the curvesEach Curve PDA, moved only by buy and sell
Launch budgets and owner feesEach Group PDA
The backend payer walletA hot wallet with a small balance that only signs launches and is paid back
Fee split, curve parameters, claim windowConfig, 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

AccountSeedsHolds
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)
InstructionSignerWhat it does
init_configadminConfig + the root group mint
create_groupcreatorA user collection (a launchpad in program terms), member of the root, with cap, style and budget
fund_group / set_groupanyone / ownerTop up a budget; open or close launches; transfer ownership
launchpayer or any walletMint + member number + metadata + supply into the curve; pending or claimed
claim / set_nicknameclaimer / creatorSecret check, creator written; one nickname
expireanyoneClose an untouched launch after the window, rent back to the budget
buy / selltraderConstant product swap with the 1 % split
withdraw_owner_fees / withdraw_creator_feesowner / creatorCollect accrued shares

Program 5ZmEp1vQj45R3itxEo6hgH8aX4E8UNCkRsTw13gjchco , Anchor, Token-2022 extensions (metadata, group, group member). Devnet.