DEV Community

Gopichand
Gopichand

Posted on

How I Created My First Solana Token from Scratch (SPL Token Basics Explained)

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:

  1. Create a tokens table in your database
  2. Write API endpoints to create, read, update balances
  3. Handle edge cases like double-spending yourself
  4. 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
Enter fullscreen mode Exit fullscreen mode

I had 6.13 SOL on devnet — more than enough. No airdrop needed.

Step 1: Create the token mint

spl-token create-token
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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:

🔗 View on Solana Explorer

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)