Solana charges for state, not for activity. Every account must hold a minimum balance proportional to its size — the rent-exempt minimum — for as long as it exists:
rent(len) = (128 + len) × lamports_per_byte
The 128 bytes are fixed overhead that every account pays once. The rate is a cluster parameter; the program reads it from the Rent sysvar at the moment of each operation and never hard-codes it.
Compared with a classic NFT
A Token Metadata NFT needs four accounts: a mint (82 bytes), a token account (165), a metadata account (679) and a master edition (282). With overhead that is 1,720 bytes per token. A GL-36 token is a 36-byte slot inside the collection account, so it pays no overhead of its own.
× less rent. You keep SOL.
| Per token | Bytes | At 5,080 lamports/byte | At 696 lamports/byte |
|---|---|---|---|
| GL-36 slot | 36 | 182,880 lamports · 0.00018 SOL | 25,056 lamports · 0.000025 SOL |
| Classic NFT | 1,720 | 8,737,600 lamports · 0.0087 SOL | 1,197,120 lamports · 0.0012 SOL |
The header adds 224 bytes plus 128 of overhead once per collection: about 0.0018 SOL today.
Compressed NFTs store only a Merkle root on chain and cost even less storage per token. In exchange, reading ownership needs an off-chain indexer (the DAS API), and every transfer carries a Merkle proof. GL-36 stores ownership directly, so it reads with one RPC call and trades without proofs.
Who pays
| What | Paid by | When |
|---|---|---|
| Header, 224 bytes | Creator | init creates the account at its rent-exempt minimum. |
| Each slot, 36 bytes | Minter | mint grows the account and tops it up to the new minimum. |
| Mint price | Minter → creator | mint, mint_price × count. |
| Market fee | Buyer → treasury | buy, price × fee_bps / 10,000. |
| Network fee | Fee payer | Every transaction: 5,000 lamports per signature. |
A mint transfers only the shortfall: rent_min(new_len) − lamports, never less than zero. If the account already holds surplus — for example after a rent cut — minters pay less until it is used up.
The SIMD-0437 cuts
SIMD-0437 lowers the rent rate in steps. Steps 1 and 2 are live on mainnet since September 2026 at 5,080 lamports per byte. Steps 3 to 5 (2,575 → 1,322 → 696) are scheduled with Agave 4.4.
Because rent is read at run time, nothing in a collection has to change when the rate drops. The account simply holds more than it needs. The creator calls withdraw_excess to move the difference out:
import { withdrawExcessIx } from "@gl36/sdk";
await send(creator, [withdrawExcessIx(PROGRAM, creator, COLLECTION)]);
withdraw_excess moves lamports − rent_min(len) to the creator and leaves the account exactly rent-exempt. It can be called any number of times; with nothing to withdraw it moves zero.
After a cut, the surplus includes rent that minters paid for their slots. withdraw_excess sends all of it to the creator, the only signer allowed to call it. Rent kept as the rent-exempt minimum stays in the account for as long as the collection exists.
Compute
Rent is the main cost, but compute is small too. Measured on devnet:
| Instruction | Compute units |
|---|---|
init |
3,253 |
mint × 1 |
2,971 |
mint × 10 |
3,189 |
transfer |
374 |
list |
452 |
buy |
2,901 |
reveal |
457 |
withdraw_excess |
401 |
The instructions that move SOL (init, mint, buy) spend most of their budget on System Program CPIs. The rest only rewrite bytes.