NAME
tfn: a Solana launchpad where a new coin's opening supply can't be bought. It can only be mined with proof-of-work.
SYNOPSIS
launch(1) name ticker image --dig 5|10|15 # about 0.04 SOL, no dev bag
mine(2) --coin TICKER # hash in the browser, earn shares
open(2) --coin TICKER # anyone, after the last block
claim(2) --coin TICKER # mint your tokens to your walletFor the first 5, 10 or 15 minutes of a coin's life the token doesn't exist. The only way to earn it is to submit proof-of-work. When the dig ends, the program creates a Meteora pool with the rest of the supply, trading starts, and miners claim. Bundlers and snipers have nothing to buy, and 200 wallets don't hash any faster than one.
LIFE OF A COIN
launch ──> the dig (30/60/90 blocks of 10 s, mined only) ──> open (Meteora pool, locked) ──> claim / collect| supply | amount | where it goes |
|---|---|---|
| total | 1,000,000,000 (6 decimals) | fixed by the program |
| mined | 200,000,000 (20%) | split across the blocks of the dig, paid to miners by shares |
| pool | 800,000,000 (80%) | deposited single-sided into the Meteora pool at open |
| dev bag | none | the launcher mines like everyone else |
The mint has no freeze authority. Its mint authority is the coin's program address, and the metadata is immutable. Once every earned token is claimed, anyone can call seal to drop the mint authority for good.
THE DIG
| dig length | blocks | reward per block |
|---|---|---|
| 5 minutes | 30 | about 6,666,667 tokens |
| 10 minutes (default) | 60 | about 3,333,333 tokens |
| 15 minutes | 90 | about 2,222,222 tokens |
- Blocks are 10 seconds. The dig starts at launch.
- Every block pays the same. No halvings, so showing up late isn't a penalty and nobody takes half the supply in the first minute.
- Shares, not one winner. Every hash below the target is one share. A block's reward is split by shares, so a laptop doing 1% of the work gets 1% of every block.
- Empty blocks roll over. A block with no shares passes its reward and the rounding dust to the next block.
- Unearned reward is never minted. Whatever is still unearned after the last block stays unminted.
- Late shares. A share for block n still counts until 3 s after n's window ends, unless someone already closed the block.
- Lazy close. The first submission or
crankafter a window closes the block, prices it (tokens per share), retargets, and opens the next block with a fresh challenge.
THE SHARE HASH
Each block has a challenge. Every share is a hash of that challenge, the miner's wallet and a nonce.
challenge = keccak256( mint[32] || u64_le(block_index)[8] || slot_hash[32] ) 72-byte preimage
share = keccak256( challenge[32] || beneficiary[32] || u64_le(nonce)[8] ) 72-byte preimage
value = u64 big-endian of share[0..8]
valid = value < coin.target
expected hashes per share = 2^64 / targetByte offsets of the share preimage
| bytes | content | why |
|---|---|---|
| 0 to 31 | challenge | new every block, from the newest slot hash, so nobody can work ahead |
| 32 to 63 | beneficiary wallet | a share can only ever pay this key, so copying it from the mempool gets a thief nothing |
| 64 to 71 | nonce, u64 little-endian | the only bytes that change per attempt |
- Keccak-256, not SHA3-256. Original Keccak with the
0x01pad byte and rate 136, the same as Ethereum and Solana'ssol_keccak256syscall. js-sha3'skeccak256is right,sha3_256is wrong. - block_index is 0-based, encoded as a u64 little-endian even though the account stores a u32. The site shows blocks 1-based.
- slot_hash is the newest entry in the SlotHashes sysvar when the block opened. Miners never compute it; they read
coin.challengefrom the Coin account. - Nonces go up. Within a block each beneficiary's nonces must be strictly increasing (each
>= miner.next_nonce), so the same share can't be sent twice. Up to 8 shares fit in one transaction. - Checked on chain. The program re-hashes every share with the keccak syscall: one hash per share, a few hundred compute units.
- Relayers are safe. Because the wallet is inside the hash, anyone can submit shares for you without being able to redirect them.
Check a share yourself
import { keccak256 } from 'js-sha3';
// challenge: 32 bytes from the Coin account, wallet: 32 raw pubkey bytes, nonce: BigInt
function shareHash(challenge, wallet, nonce) {
const msg = new Uint8Array(72);
msg.set(challenge, 0);
msg.set(wallet, 32);
for (let i = 0; i < 8; i++) msg[64 + i] = Number((nonce >> BigInt(8 * i)) & 0xffn);
const h = new Uint8Array(keccak256.arrayBuffer(msg));
const value = h.slice(0, 8).reduce((v, b) => (v << 8n) | BigInt(b), 0n); // big-endian top 8 bytes
return { h, value };
}
const { value } = shareHash(challenge, wallet, 41n);
const isShare = value < target; // target = coin.target (u64)The program's own tests check this hash against fixed test vectors. Recompute one yourself.
DIFFICULTY
Bitcoin keeps block time steady by moving difficulty. Our block time is fixed by Solana's clock, so the program keeps the number of shares per block steady instead: the target is S = - shares per block (read live from the config account), about - transactions of 8 shares per block per coin, whatever the miner count.
next_target = target × S × seconds_open / (shares × 10)
clamp : at most 4x easier or 4x harder per block
empty block : 4x easier
start : target 2^46 = 262,144 expected hashes per share- One CPU core running plain JS (about 210 kH/s measured) finds a share about every 1.25 s at the start target. WASM and WebGPU are much faster.
- With few miners the retarget makes shares easier, 4x per block, until shares per block reach S. With many miners it makes them harder.
- More miners means harder shares, not more transactions, so chain load per coin stays flat however big the dig gets.
- The dig page shows difficulty as expected hashes per share and as leading zero bits, live, block by block.
- S is a config value, and each coin keeps the S it launched with. The first mainnet run launched with S = 400. That needs about 5 landed transactions a second across all miners, more than public RPCs let two wallets send, so every block came in short and difficulty eased 4x per block to the easiest setting by the tenth block. S was lowered on chain with
update_config, with no redeploy. See the run.
REWARDS AND CLAIMING
tokens_per_share[b] = (reward_b + carry) / shares_b # dust rolls into carry
your_tokens = Σ your_shares[b] × tokens_per_share[b]- When your next submission lands in a newer block, your last block is settled into
pendingat that block's price. - After the last block,
claimsettles whatever is left. claimonly works afteropen. It mintspendingto your wallet's token account (created if needed) and closes your miner account, refunding its rent to whoever paid it.- There is no claim deadline in the program.
No token exists before the pool does. Nobody holds the coin during the dig, so nobody can sell it, send it or start a rival pool first.
OPENING ON METEORA
After the last block anyone can call open. In one transaction it closes the last block, mints the 800,000,000 pool tokens and creates a Meteora DAMM v2 customizable pool, coin against SOL.
| deposit | 800,000,000 tokens and 0 SOL, single-sided |
| price range | from the opening price up to Meteora's max price |
| opening value | 30 SOL fully diluted by default (0.00000003 SOL per token). The launcher can pick 10 to 1,000 SOL. |
| position | 100% of liquidity permanently locked inside Meteora, owned by a program address with no instruction to move it |
| trading | starts in the same transaction |
| anti-sniper fee | 25% at open, minus 3% every 30 s, 1% from minute 4 on. Meteora's linear time scheduler, on buys and sells. |
| fee token | SOL only (Meteora “OnlyB” mode) |
The opening price floor
The pool starts with zero SOL. Every SOL in it comes from a buyer, so the price in this pool can't go below the opening price. Miners can only sell into real buys. If nobody buys, there's nothing to dump into.
With 80% of supply in the pool, it behaves like a constant-product curve with about 24 SOL of virtual SOL: about 24 SOL of buys roughly 4x the price.
Aggregators pick the pool up by themselves: on the first mainnet run DexScreener and Jupiter listed it within 2 minutes of open, with nothing submitted to either. The dig page links its pool, mint and locked position.
FEES
| fee | amount | to |
|---|---|---|
| launch fee | 0.005 SOL | platform treasury |
| account rent | about 0.015 SOL | the coin account (2,290 bytes) and the mint. The name, ticker and image link live in the mint itself (Token-2022 metadata), so there is no Metaplex account and no Metaplex fee. |
| open reserve | 0.022 SOL | parked in the coin's vault and priced from the chain's rent at launch: exactly what open creates (the Meteora pool, position and token vaults, the vault's own token account) plus 0.001 SOL of margin. Whoever calls open pays only the network fee. What open doesn't use, about 0.0025 SOL, goes straight back to the launcher. About 0.0015 SOL stays in the vault for collect. |
| total launch cost | about 0.042 SOL | about 0.039 SOL after the refund at open. Before the open-reserve upgrade a launch cost about 0.112 SOL (the first mainnet launch: 0.1121 SOL). |
| mining | about 5,000 lamports per transaction of up to 8 shares | the Solana network. The platform takes nothing from mining. |
| first submission | about 0.0014 SOL | miner account rent, refunded at claim |
| Meteora's cut | 20% of every trading fee | Meteora |
| our locked position | the other 80% | split by collect below |
launcher : 80% of the position's fees = 0.64% of volume at the 1% base fee
platform : 20% of the position's fees = 0.16% of volume, buys back and burns $NONCE0
paid in : native SOL, by a permissionless crank anyone can callNobody has to trust a team bot to pay out. Uncollected fees stay in the position until someone cranks collect. A totally empty recipient wallet can't receive less than about 0.00089 SOL, so collect waits until fees build up.
MINERS
Browser miner
- WebGPU Keccak kernel when your browser has it, else WASM Web Workers, else plain JS workers. Every share is re-hashed on the main thread before it counts.
- A burner key in your browser signs the mining transactions, so there are no wallet popups while you mine. You top it up once (about 0.015 SOL), which covers the miner account rent (refunded at claim) and fees.
- Your main wallet gets the rewards, because it's the address inside every share.
- Intensity low, medium or high sets how much of your CPU or GPU it uses.
- Measured on a 3-core server: WASM about 2.2 MH/s at medium in Chromium, plain JS about 0.18 MH/s per worker. A real GPU is much faster.
Command line miner
A command line miner mined the first mainnet dig from two wallets (see Proof). It isn't released yet. It uses the same share format, so anything it finds can be checked the same way.
THE PROGRAM
An Anchor program. Every instruction except the admin ones is permissionless.
| instruction | who | what it does |
|---|---|---|
launch | launcher | creates the Token-2022 mint with its immutable metadata inside it, pays the fee and reserve, opens block 0 |
submit_shares | anyone | 1 to 8 nonces for one beneficiary; checks each hash and the nonce order; closes stale blocks |
crank | anyone | closes every block whose window passed, retargets, opens the next |
open | anyone | after the last block: creates the Meteora pool and locks the position, all paid from the coin's reserve; returns what's left of it to the launcher |
claim | anyone | after open: mints a miner's tokens to their wallet |
collect | anyone | claims the position's fees and pays 80% launcher, 20% treasury, plus any unused reserve to the launcher |
seal | anyone | once everything earned is claimed, removes the mint authority |
| account | seeds |
|---|---|
| Config | ["config"] |
| Coin | ["coin", mint], also the mint authority |
| vault | ["vault", coin], owns the locked Meteora position |
| Miner | ["miner", coin, beneficiary] |
Accounts each instruction takes, in order
launch(name, symbol, uri, dig_minutes, open_fdv_lamports)
launcher (w,s) config (w) mint (w,s) coin (w) vault (w) treasury (w) metadata (w) token_metadata_program slot_hashes token_program system_program. token_program is Token-2022 (metadata in the mint; what the site sends) or the classic token program (Metaplex metadata, costs about 0.0148 SOL more). metadata is the Metaplex PDA either way and is only created for classic mints.
submit_shares(block: u32, nonces: Vec<u64>)
payer (w,s) coin (w) beneficiary miner (w) slot_hashes system_program. 1 to 8 nonces, each at least miner.next_nonce and hashing below coin.target, or the transaction fails. A share for a block that already closed fails with BlockClosed, and one for a future block with BlockNotOpen, so a miner never pays for a share that earns nothing (preflight catches it first).
crank()
coin (w) slot_hashes. Closes every block whose 10 s window has passed, retargets, opens the next block.
open()
cranker (w,s) coin (w) mint (w) vault (w) vault_token_a (w) vault_wsol (w) native_mint position_nft_mint (w) position_nft_account (w) pool (w) position (w) token_a_vault (w) token_b_vault (w) pool_authority event_authority cp_amm_program slot_hashes token_program token_2022_program associated_token_program system_program, then optionally the coin's launcher (w) as a remaining account: the unused reserve goes back to it in the same transaction (otherwise at the next collect). vault_token_a is the vault's token account under the coin's token program.
claim()
payer (w,s) coin (w) mint (w) beneficiary miner (w) rent_payer (w) beneficiary_ata (w) token_program associated_token_program system_program. token_program and the ATA follow the coin's mint program.
collect()
cranker (s) config coin (w) mint vault (w) vault_token_a (w) fee_account (w) native_mint launcher (w) treasury (w) pool_authority pool position (w) token_a_vault (w) token_b_vault (w) position_nft_account event_authority cp_amm_program token_program system_program, then the Token-2022 program as a remaining account for Token-2022 coins. token_program stays the classic one (it handles the wSOL fee account).
seal()
coin mint (w) token_program. Only once every earned token is claimed. Removes the mint authority for good.
Account layouts
Anchor borsh: an 8-byte discriminator, then the fields in order.
| account | size | fields |
|---|---|---|
| Config | 218 bytes | admin, treasury, launch_fee_lamports, launcher_fee_bps, paused, share_target, start_target, default / min / max open FDV, fee_schedule, coins_launched, bump |
| Coin | 2,290 bytes | mint (offset 8), launcher (40), bump, vault_bump, state (74: 0 digging, 1 ended, 2 opened), dig_minutes (75), total_blocks, launcher_fee_bps, share_target, open_fdv_lamports, fee_schedule, launched_at, dig_start, dig_end, current_block, block_open_ts, challenge [32], target, shares_this_block, carry, total_shares, allocated, claimed, unmined, opened_at, pool, position, position_nft_mint, pool_liquidity, pool_sqrt_price, pool_tokens, collects, fees_collected, fees_to_launcher, fees_to_treasury, tokens_per_share [90], block_shares [90], block_targets [90], miners_total, token_2022 (bool), open_reserve_lamports, reserve_refunded, then 47 reserved bytes |
| Miner | 141 bytes | coin (8), beneficiary (40), rent_payer (72), block (104, 0xFFFFFFFF = none), block_shares, next_nonce, pending, total_shares, bump |
ADDRESSES
Solana mainnet. The program is unaudited and upgradeable, and its upgrade authority is the deployer key below. Check any of these on Solscan.
| Program | GUW16mLqFWfGjD5AFFSwDxQyGAFSDvPdEbryVa98TGs3 |
| Config | B665MTTAmazzvki2NUcxyfz3yorq5LTvARWngyNRNsN5 |
| Treasury | Hond8uF8MfJHJQ9xcy6GNc2zCffaTXgG4T5TP3NWs6Lt |
| Upgrade authority | Ayq6tRC3atGKuKP6wdt4fX1fSBe1wnBrzMAkCxMatCbG |
| Meteora DAMM v2 | cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG |
| $NONCE0 mint | CA coming soon |
| Metaplex Token Metadata | metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s |
The source of the on-chain program is public at github.com/thefirstnonce/first-nonce-program. That repository is the program only; the site, the miners and the SDK are not open source. Verified build: the deployed program matches this source byte for byte (OtterSec status, Solscan). Executable hash cfa2c3f8dea0f6625ec57a923d24b1c892e14825c0c57679d7d8c1cc5763cc8b.
$NONCE0 is the platform coin, launched separately as a normal Meteora launch, not a mined one. It trades with a 2.5% fee on Meteora, and the creator side of that fee goes to the dev wallet that launched it. 20% of the trading fees from every coin here buy it back and burn it. You don't need it to launch or mine, and holding it pays nothing else. We make no claim about its price.
CHECK IT YOURSELF
You don't have to trust this page. Each line below runs against the chain, not against us.
The program, its authority and its size
solana program show GUW16mLqFWfGjD5AFFSwDxQyGAFSDvPdEbryVa98TGs3 --url mainnet-beta
# Authority should read Ayq6tRC3atGKuKP6wdt4fX1fSBe1wnBrzMAkCxMatCbG (the deployer, so it is upgradeable)The source
git clone https://github.com/thefirstnonce/first-nonce-program
# the on-chain program only (Anchor). Solscan verified build: in progress.The config account
solana account B665MTTAmazzvki2NUcxyfz3yorq5LTvARWngyNRNsN5 --url mainnet-beta --output json
# 218 bytes, owned by the program: admin, treasury, launch fee, fee split, share target, start target …Live from that account right now: share target - per block, launch fee - SOL, opening value - SOL by default.
A coin and its live challenge
# Coin PDA = seeds ["coin", mint] under the program
solana account <coin address> --url mainnet-beta --output json
# challenge, target and current_block live in this account. The dig page shows the same values.Recompute a share
Type or paste a challenge, a wallet and a nonce. Your browser hashes them with keccak256 and compares the top 8 bytes to the target. Nothing is sent anywhere. “use the live dig” fills in the current challenge and target.
PROOF
It already ran on mainnet. On 2026-10-13 a test coin went through the whole life of a coin: a 5-minute dig mined by our command line miner from 2 wallets, 1,889 shares in 238 transactions, then open, a buy and a sell, collect, two claims and seal. No program bug turned up, and nothing was redeployed.
| test coin | First Nonce Test (TFNTEST), mint 7HDkng26hGovEYrrqtbdq14yckZoecjfhGeUrACdkxEa |
| coin account | 6pRNGDrPyVwJieNdrc5q5iVVesaB88nXQ3rSshB12fSM |
| Meteora pool | C68HcKg9pyYi9au88qMu3XqpF48kL88CFDkCq8xAsvtq (DexScreener, its dig page) |
| step | transaction | what it showed |
|---|---|---|
| launch | huX29C8K… | 0.05 SOL to the treasury, a 5-minute dig of 30 blocks, opening value 10 SOL |
| submit_shares | 3grTU7Ce… | the first accepted batch: 7 shares in block 1 |
| crank | 5a4PbJyT… | closes a block whose window passed, retargets, opens the next |
| open | 4Rmkb2EF… | the Meteora pool: 800,000,000 tokens and 0 SOL, 100% of liquidity permanently locked |
| buy | 5XYMFKDC… | 0.005 SOL, 7 s after open. The fee was exactly 25.00%, the anti-sniper start. |
| sell | 29Q2mteZ… | all of it back. The price returned to the opening price and the pool's SOL to 1 lamport: sellers only got SOL a buyer put in. |
| collect | GWkRSAYn… | 1,749,999 lamports of fees: 1,399,999 to the launcher (80%), 350,000 to the treasury (20%) |
| claim, miner 1 | 4et8dyKm… | 91,973,856.21 TFNTEST, exactly its shares × tokens per share |
| claim, miner 2 | 3aY1nMcZ… | 108,026,143.79 TFNTEST, the same check |
| seal | 4FJjGQMc… | mint authority removed for good |
- Supply adds up. After seal: supply 999,999,999.999367 + 0.000589 burned by Meteora at open + 0.000044 never mined = exactly 1,000,000,000.
- The dig. 30 blocks closed in order, by a live share inside the grace, by
crankand by the next submission. 6 empty blocks rolled their reward forward. Allocated plus never mined came to exactly 200,000,000. - Aggregators. DexScreener and Jupiter listed the pool by themselves within 2 minutes of
open. - Compute units on mainnet. launch 122k, submit_shares 57k to 63k, crank 48k to 50k, open 234k, claim 82k to 87k, collect 107k, seal 34k.
- Cost. The launch cost 0.1121 SOL. Each batch of shares paid 5,900 lamports with a small priority fee.
- What changed after it. The run launched with S = 400 shares per block. Two wallets couldn't land the 5 transactions a second that needs, so difficulty eased to the easiest setting. The config now says -, set with
update_config. See Difficulty.
The 19 failed submissions in the run were shares for a block the other miner had already closed (BlockClosed) and 4 that overtook each other (NonceNotIncreasing): expected client behaviour, 0.00014 SOL in fees in total. The test tokens are worthless and were never meant to trade.
FAQ
Can I buy a coin during its dig?
No. The token doesn't exist until the pool opens. The only way to get it during the dig is to mine it.
Does using many wallets help?
No. Rewards follow hashes, not wallets. 200 wallets doing 10 MH/s earn the same as one wallet doing 10 MH/s.
Can someone steal my shares?
No. Your wallet address is bytes 32 to 63 of every share hash. A copied share still pays you.
Does the launcher get free supply?
No. There's no dev bag. The launcher earns 80% of the pool's trading fees, and mines like everyone else if they want tokens.
What does mining cost me?
Network fees: about 5,000 lamports per transaction of up to 8 shares, plus about 0.0014 SOL of account rent on your first submission, refunded when you claim. The platform takes nothing from mining.
When can I claim?
Any time after the pool opens. There's no deadline.
Why can't the price drop below the opening price?
The pool starts with zero SOL, so every SOL in it came from a buyer. Sells can only take out SOL that buys put in. This holds for our pool only; someone can make another pool elsewhere at any price.
Is this ORE?
No. ORE did proof-of-work mining on Solana as a single coin with its own hash function. Here mining is the launch method for every coin, with plain keccak and share-based blocks. We're not affiliated with ORE.
CAVEATS
- GPUs beat laptops. More hashing power earns more shares. A browser earns its share, but it won't out-mine a GPU rig. The claim is that nobody takes the launch in one slot, not that laptops win.
- Unaudited and upgradeable. The program has not been audited. Its upgrade authority is the deployer key
Ayq6tRC3atGKuKP6wdt4fX1fSBe1wnBrzMAkCxMatCbG, which can change the program. Use amounts you can afford to lose. - Mining costs SOL. Small but real: network fees on every batch of shares.
- The floor belongs to our pool. It says nothing about the coin's value, and other pools for the same token can exist at any price.
- Preview mode. With
?network=mockthe site runs a simulated chain, labelled Demo data. The live site reads Solana mainnet. - ORE came first with proof-of-work on Solana. We're not affiliated.
SEE ALSO
explore(1), launch(1), X.
The First Nonce is an independent project. It is not affiliated with, endorsed by or operated by Meteora, ORE, DexScreener or Streamflow.