In Web2 you read config files. On Solana you read accounts.
When you join a new team in Web2, your first task is reading configuration files. You open package.json, environment variables, database schemas. You do not start changing things until you understand what is already there. Reading and interpreting existing configuration is a core skill that separates developers who break things from developers who improve things.
On Solana, that same skill applies to on-chain accounts. Every token mint stores its configuration as public account data. The spl-token display command is your cat package.json — it decodes raw bytes into human-readable configuration.
The command
spl-token display [MINT_ADDRESS] \
--program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
The --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb flag tells the CLI to read from the Token Extensions program (Token-2022), not the original SPL Token program.
What the output tells you
Here is the output from an interest-bearing mint I created:
SPL Token Mint
Address: 7CjQNSGCiXuYAZu6UNn2xGXPEa5wxc1oxLQoj198jFdy
Program: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
Supply: 0
Decimals: 9
Mint authority: 2Cd1SqwosBfgoo8UrxBDBFquZRTt11Cmh1bcPDemn164
Extensions
Interest-bearing:
Current rate: 500bps
Average rate: 500bps
Rate authority: 2Cd1SqwosBfgoo8UrxBDBFquZRTt11Cmh1bcPDemn164
Each extension occupies its own block. The Interest-bearing block tells me:
- The current rate is 500 basis points (5%)
- The rate authority is a specific wallet address
Here is the output from a multi-extension mint (transfer fees + interest + metadata):
Extensions
Interest-bearing:
Current rate: 5bps
Rate authority: 2Cd1SqwosBfgoo8UrxBDBFquZRTt11Cmh1bcPDemn164
Transfer fees:
Current fee: 100bps
Current maximum: 50000
Config authority: 2Cd1SqwosBfgoo8UrxBDBFquZRTt11Cmh1bcPDemn164
Withdrawal authority: 2Cd1SqwosBfgoo8UrxBDBFquZRTt11Cmh1bcPDemn164
Metadata Pointer:
Authority: 2Cd1SqwosBfgoo8UrxBDBFquZRTt11Cmh1bcPDemn164
Metadata:
Name: ArcCoin
Symbol: ARC
URI: https://raw.githubusercontent.com/...
How to compare account sizes
Extensions are not free. Each one adds bytes to the account. You can measure this directly:
# Get the data size of any mint
solana account [MINT_ADDRESS] --output json | grep -o '"space":[ ]*[0-9]*' | grep -o '[0-9]*$'
# Calculate the rent cost
solana rent [DATA_SIZE]
I compared three mints and got this:
| Mint Type | Size | Rent Cost |
|---|---|---|
| Default-frozen (1 extension) | 171 bytes | 0.002081 SOL |
| Interest-bearing (1 extension) | 222 bytes | 0.002436 SOL |
| Multi-extension (3 extensions) | 599 bytes | 0.005060 SOL |
The multi-extension mint costs more than double the rent of the simplest. This is not a bug — it is a design tradeoff. More features mean more data, and more data means more SOL to keep the account rent-exempt.
What surprised me
You can see every authority. The display command shows who controls what — mint authority, freeze authority, rate authority, transfer fee config authority, metadata update authority. Some of these cannot be changed after creation. Reading the configuration before deploying to mainnet is how you avoid painting yourself into a corner.
Extensions are stored sequentially as TLV entries. Each extension uses a type-length-value format. The CLI parses them one by one and displays them as blocks. The order in the output matches the order in the raw account data.
Where to go deeper
Being able to read on-chain state is as important as being able to create it. The official docs explain the data model:
Next time you encounter an unfamiliar token on devnet, run spl-token display on it. You will learn more from reading one real configuration than from ten tutorials.
Top comments (0)