← All NEPs

NEP-5001: State Tokens

Jadon Carter

April 22, 2026

Mainnet

View on GitHub

State Tokens are Netrun's fungible token primitive—a system for deploying tokenized assets where each mint is represented as an indivisible NFT. Unlike traditional fungible tokens where balances are numbers in an account, State Tokens treat each mint as a discrete, non-splittable unit that can be transferred and traded as a whole.

Key principle: State Tokens are tokenized NFTs. If you mint 1,000 tokens, you receive one NFT representing 1,000 tokens. You cannot split it into 500 + 500. The mint amount travels as a single unit.


How State Tokens Work

Deployment

Anyone can deploy a new State Token with custom parameters:

// State Token deployment

symbol: "NETRUN" // 3-8 characters

max_supply: 21,000,000 // Total tokens possible

mint_limit: 1,000 // Tokens per mint

Upon deployment, the token receives a unique vanity addressstarting with 'net'—making State Tokens instantly recognizable on explorers and in wallets.

Example vanity address:

netRUN7xK9mV2pQwE4nT8bYcH3jF6sA...

Minting

When you mint a State Token, you receive an NFT that represents exactly the mint limit amount. This NFT is your proof of ownership for those tokens.

Traditional Fungible

Balance stored as number

balance: 1000

Can send any amount

State Token

Balance stored as NFT

NFT #4521 = 1000 tokens

Must send entire NFT

The Indivisibility Rule

This is the core difference from BRC-20 and traditional tokens: State Tokens cannot be split.

If mint_limit = 1,000:

Transfer 1,000 tokens (the whole NFT)
Transfer 500 tokens (cannot split)
Sell 250 tokens (cannot split)
Sell the NFT on marketplace (whole unit)

This design creates natural scarcity and simplifies the mental model: each mint is one collectible unit, regardless of the number it represents.


On-Chain State

Unlike BRC-20 where balances are reconstructed by indexers parsing transaction history, State Token data lives directly on-chain. Any state can be queried with a single RPC call.

TokenRegistry (on-chain)

symbol: String

max_supply: u64

mint_limit: u64

total_minted: u64

mint_count: u64 // Number of NFTs minted

deployer: Pubkey

vanity_address: Pubkey

MintNFT (each mint)

token_registry: Pubkey

mint_number: u64 // Sequential mint ID

amount: u64 // Always equals mint_limit

owner: Pubkey

Query Examples

getTokenRegistry(vanity_address)

Returns token metadata, supply info, mint count

getMintsByOwner(owner, token_registry)

Returns all mint NFTs owned by address

getTotalBalance(owner, token_registry)

Returns sum of all owned mint amounts


State Tokens vs BRC-20

AspectBRC-20State Tokens
ChainBitcoinSolana
State storageOff-chain indexersOn-chain accounts
Balance formatJSON inscriptionsNFT ownership
DivisibilitySplittableIndivisible per mint
Query methodParse full historySingle RPC call
TransferInscription txNFT transfer
MarketplaceSpecializedAny NFT marketplace

Use Cases

Fair Launch Tokens

Fixed mint limit ensures equal distribution. No whales minting millions in one transaction.

Collectible Fungibles

Each mint NFT has a unique number. Early mints (#1, #2, #3) become collectibles themselves.

Simplified Trading

List on any NFT marketplace. No need for specialized DEX or order books.

Batch Ownership

Own multiple mint NFTs to accumulate larger positions. Each mint stays distinct.


Program Instructions

deploy_token

Creates new TokenRegistry with vanity address. Validates symbol uniqueness, sets supply parameters.

mint_token

Creates MintNFT representing mint_limit tokens. Increments mint_count and total_minted.

transfer_mint

Transfers MintNFT to new owner. The full token amount moves with the NFT.

burn_mint

Destroys MintNFT. Reduces total_minted but not mint_count (preserves history).

State Tokens bridge the gap between fungible tokens and NFTs. They bring the fair-launch mechanics and collectibility of inscription tokens to Solana, while leveraging on-chain state for instant queries and native marketplace compatibility.