On Day 29 of my #100DaysOfSolana challenge, I created my first-ever token
on Solana's devnet. Not by deploying a smart contract. Not by writing a
single line of code. Just a CLI and 5 commands.
Here's what I learned — and why Solana's token model is fundamentally
different from anything in Web2.
The Web2 Mental Model (and Why It Breaks Here)
In Web2, when you build a rewards or credits system, you:
- Create a
tokenstable in your database - Write API endpoints to create, read, update balances
- Handle edge cases like double-spending yourself
- Maintain a server to keep it all running
On Solana, none of that exists. The SPL Token Program is a shared,
audited, on-chain program that any developer can use — no custom backend,
no smart contract needed. You just call it.
The Two Key Accounts You Need to Understand
Before touching the CLI, understand this mental model:
Mint Account = the global definition of your token
- Stores total supply
- Stores decimal precision
- Stores who has authority to mint more
- One per token type
Token Account = a wallet's individual balance for ONE specific token
- Think of your wallet as a filing cabinet
- Each token account is a separate folder inside it
- One folder per token type you hold
This separation is unusual coming from Web2 — but it's how Solana keeps
its data organized and its runtime blazing fast.
Step-by-Step: Creating My First SPL Token
Prerequisites
solana config set --url devnet
solana address # confirm your wallet
solana balance # confirm you have SOL for fees
I had 6.13 SOL on devnet — more than enough. No airdrop needed.
Step 1: Create the token mint
spl-token create-token
Output: Creating token 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq
under program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Address: 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq
Decimals: 9
This created a Mint account on-chain. Supply is zero. Decimals default
to 9. My wallet is the mint authority — the only one who can create more.
Step 2: Create a token account
spl-token create-account 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq
Output: Creating account B4SSsjUA1fcJmjMhmYis3EpLTSBD9GGo1DBEZAwjae7c
You cannot receive tokens directly into your wallet. You need a
dedicated token account for each token type. This is the "folder in the
filing cabinet."
Step 3: Mint some supply
spl-token mint 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq 100
Output: Minting 100 tokens
Token: 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq
Recipient: B4SSsjUA1fcJmjMhmYis3EpLTSBD9GGo1DBEZAwjae7c
Step 4: Inspect everything
spl-token supply 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq
# → 100
spl-token accounts
# Token Balance
# 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq 100
spl-token display 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq
# SPL Token Mint
# Address: 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq
# Program: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
# Supply: 100000000000
# Decimals: 9
# Mint authority: AWKYsCGBcfGLSz6QpmXzRn7EJ9fRhiJsjYSLDV3c9L9y
# Freeze authority: (not set)
The Decimals Trick
Notice the supply shows 100000000000 even though I minted 100.
That's because decimals = 9, so:
100 tokens × 10^9 = 100,000,000,000 raw units
This is identical to how SOL works with lamports: 1 SOL = 1,000,000,000 lamports
All on-chain arithmetic is integer math — no floating point, no rounding
errors. The CLI handles the conversion for you.
What "Mint Authority" Actually Means
The mint authority field is your wallet address — meaning only you
can call spl-token mint to create more supply.
This is the on-chain equivalent of "only the admin can issue new credits"
in a Web2 system. Except here, it's enforced by cryptography, not by
an if (user.role === 'admin') check in your backend.
You can also permanently disable minting (set supply to fixed) by
running spl-token authorize YOUR_MINT mint --disable. Once done,
it's irreversible.
Freeze Authority: What It Is and Why I Left It Unset
Freeze authority: (not set) means no one can freeze token accounts
holding this token. If freeze authority were set, the authority could
prevent specific wallets from sending or receiving the token — useful
for compliance in real-world asset tokens, but not needed here.
The Big Picture
You just created a digital asset. Not a database row, not an API response
— a real token living on a public blockchain that anyone in the world
can verify right now:
Tomorrow (Day 30), I upgraded this with Token-2022 — giving the token
a real name, symbol, and on-chain metadata. The difference is dramatic.
🔗 Full code: GitHub
Building daily → @GopichandAI | #100DaysOfSolana Day 29/100
Top comments (0)