NEP-5001: State Tokens
Jadon Carter
April 22, 2026
Mainnet
View on GitHubState 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
Can send any amount
State Token
Balance stored as NFT
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:
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
| Aspect | BRC-20 | State Tokens |
|---|---|---|
| Chain | Bitcoin | Solana |
| State storage | Off-chain indexers | On-chain accounts |
| Balance format | JSON inscriptions | NFT ownership |
| Divisibility | Splittable | Indivisible per mint |
| Query method | Parse full history | Single RPC call |
| Transfer | Inscription tx | NFT transfer |
| Marketplace | Specialized | Any 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.