Back to writing
Article Jul 12, 2025 8m read

Ngoprek SPL Token di Solana: Bikin Token Sendiri

Pernah kepikiran buat bikin token sendiri di blockchain? Ternyata proses ini sangat mudah dilakukan pada Solana berkat adanya SPL Token, kita nggak perlu pusing bikin semuanya dari nol. Dalam artikel ini, kita akan ngoprek bareng-bareng, langkah demi langkah, menggunakan TypeScript untuk membuat token pertamamu.

Hutomo S. Kartiko
Hutomo S. Kartiko
Fullstack & Web3 Engineer
Ngoprek SPL Token di Solana: Bikin Token Sendiri

Apa Sih SPL Itu?

Bayangin kamu ingin bikin kue. Daripada bikin oven, mixer, dan loyang dari awal sendiri, kamu tinggal pakai peralatan yang sudah ada di dapur, kan?

Nah, SPL itu ibarat 'peralatan dapur' standar di Solana. SPL adalah kumpulan program siap pakai yang sudah ter-deploy di blockchain, sudah diaudit keamanannya, dan bisa digunakan oleh siapa pun. Program yang paling sering dipake adalah SPL Token, sebuah program yang ngurusin semua hal tentang token, mulai dari mint, transfer, sampai burning.

Dengan memakai SPL Token, kita bisa bikin token yang kompatibel dengan semua wallet dan aplikasi di ekosistem Solana.

Antomi Token di solana

Tiga 'aktor' utama dalam dunia pertokenan di Solana yaitu:

1. Mint Account: Ini adalah "master"-nya, "cetakan"-nya, atau seperti "akta kelahiran" dari sebuah token. Account ini menyimpan informasi paling penting tentang token tersebut, yaitu:

  • Supply: Total token yang sudah beredar.
  • Decimals: Berapa angka di belakang koma (misal, token-mu punya 2 desimal, jadi 100 unit terkecil = 1 token).
  • Mint Authority: Siapa yang punya wewenang untuk mencetak token baru. Ini seperti "kunci" mesin cetaknya.
  • Freeze Authority: Siapa yang punya wewenang untuk freeze (membekukan) Token Account.

Anggap saja Mint Account itu seperti Bank Indonesia. BI adalah satu-satunya lembaga yang mendefinisikan "Rupiah", mengatur total suplainya, dan bisa punya hak untuk mencetak Rupiah baru.

2. Token Account: Ini adalah "wallet" atau "rekening" yang spesifik untuk menyimpan SATU JENIS token. Kalau kamu punya token A dan token B di wallet-mu, sebenarnya kamu punya dua Token Account yang berbeda, yang kepemilikannya terikat pada alamat wallet utamamu.

Kalau Mint Account itu Bank Indonesia, maka Token Account itu seperti rekening BCA-mu. Rekening ini spesifik untuk menyimpan Rupiah, Kamu nggak bisa menyimpan Dolar di rekening Rupiah, kan?

3. Associated Token Account (ATA): Ini adalah jenis Token Account yang paling umum. ATA adalah cara standar untuk membuat dompet token bagi seorang pengguna. Alamatnya dibuat secara deterministik dari alamat wallet pengguna dan alamat Mint Account token-nya. Gampangnya, ini adalah alamat "resmi" untuk menyimpan token X bagi wallet Y.

Implementasi SPL Token dengan TypeScript

Kita akan membuat token dari nol, mint-nya, dan mengirimkannya ke wallet lain. Semua ini kita lakukan di Devnet, atau jaringan tes Solana.

Prerequisite:

  • NodeJS dan npm/pnpm/yarn library yang sudah ter-install
  • Solana wallet dengan Saldo Devnet (bisa claim di sini)

1. Setup Proyek dan Insialisasi Library

Buat folder baru dan init library yang dibutuhkan seperti berikut:

text
mkdir spl-token-playground
cd spl-token-playground
npm init -y
npm install @solana/web.js @solana/spl-token

2. Generate Wallet

Buat file baru dengan nama wallet_generator.ts dan tulis kode berikut:

text
import { Keypair } from "@solana/web3.js";

let kp = Keypair.generate();
console.log(`You've generated a new Solana wallet: ${kp.publicKey.toBase58()}`);

console.log(`[${kp.secretKey}]`);

Jalankan perintah ini di terminal untuk menjalankan kode tersebut

text
npm run wallet_generator

Maka akan menghasilkan

text
You've generated a new Solana wallet: 6Y13iouU4bXQTipVMmGaJzxECo8CBvXmEsQWnZtJZVx1
[30,202,227,160,224,141,69,127,81,88,201,230,241,178,253,246,170,84,51,37,145,142,102,120,73,136,198,4,209,43,160,85,82,59,126,37,58,107,22,16,22,71,161,225,150,109,189,219,17,213,75,69,162,133,220,108,255,216,129,251,99,85,177,214]

Itu akan menampilkan alamat public (6Y13iouU4bXQTipVMmGaJzxECo8CBvXmEsQWnZtJZVx1) dan private key wallet kamu tapi dalam format bytes. Kamu bisa menggunakan ini untuk menandatangani transaksi. Kemudian simpan private key itu ke file baru dengan nama dev-wallet.json di root folder kamu.

3. Claim Balance Devnet

Untuk membuat transaksi pada Solana diperlukan native token/coin yaitu SOL. Karena kita menggunakan devnet, jadi SOL yang dibutuhkan juga dalam devnet. Buat file baru dengan nama airdrop.ts dan tulis kode berikut:

text
import { Connection, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js";
import wallet from "./dev-wallet.json";

let keypair = Keypair.fromSecretKey(new Uint8Array(wallet));

const connection = new Connection("https://api.devnet.solana.com");

(async () => {
  try {
    const txHash = await connection.requestAirdrop(keypair.publicKey, 2 * LAMPORTS_PER_SOL);
    console.log(`Success! Check out your TX here: https://explorer.solana.com/tx/${txHash}?cluster=devnet`);
  } catch (e) {
    console.error(`Oops, something went wrong: ${e}`);
  }
})();

Pada kode itu, kita melakukan import wallet dan disimpan sebagai keypair. Link https://api.devnet.solana.com adalah RPC khusus untuk devnet di Solana. Ketika kamu running kode tersebut (sama seperti langkah 2 yaitu: npm run airdrop) maka akan menghasilnya:

text
Success! Check out your TX here: https://explorer.solana.com/tx/hRELhzaWUS2HQmg1ibF1F8tAYdwiwR1Yoyoaa9UDD39omhQctaiUJjYTj4GKf5wwwA4kr1jfqpr4cdcJKzgMmjW?cluster=devnet

Kalau hasilnya success, akan menampilkan link log transaksi. Kalau kamu buka link log itu akan menampilkan beberapa data seperti jumlah SOL, dan banyak Account (ini akan dibahas pada artikel selanjutnya). Tapi kalau ada error, bisa di-solve sesuai dengan pesan error-nya, kemungkinan besar karena wallet yang salam import atau link RPC yang bermasalah.

4. Membuat Token (Create Mint)

Sekarang kita masuk ke pembuatan token. Ini adalah "Akta Kelahiran" token kita. Buat file baru dengan nama spl_init.ts

text
import { Keypair, Connection, Commitment } from "@solana/web3.js";
import { createMint } from "@solana/spl-token";
import wallet from "./dev-wallet.json";

// Import our keypair from the wallet file
const keypair = Keypair.fromSecretKey(new Uint8Array(wallet));

//Create a Solana devnet connection
const commitment: Commitment = "confirmed";
const connection = new Connection("https://api.devnet.solana.com", commitment);

(async () => {
  try {
    // Start here
    const mint = await createMint(
      connection,
      keypair,
      keypair.publicKey,
      null,
      6
    );

    console.info("This is your mint account for the token: ", mint.toBase58());
  } catch (error) {
    console.log(`Oops, something went wrong: ${error}`);
  }
})();

Setelah anda running akan menghasil alamat mint kita. Kita gunakan ini untuk tahap berikutnya.

5. Membuat "Dompet" untuk Token (Associated Token Account)

Tokennya sudah ada, tapi belum ada tempat penyimpanannya. Kita perlu membuat Associated Token Account (ATA) untuk wallet kita. Buat file baru dengan nama spl_ata.ts

text
import { Keypair, PublicKey, Connection, Commitment } from "@solana/web3.js";
import { getOrCreateAssociatedTokenAccount, mintTo } from "@solana/spl-token";
import wallet from "./wallet/turbin3-wallet.json";

// Import our keypair from the wallet file
const keypair = Keypair.fromSecretKey(new Uint8Array(wallet));

//Create a Solana devnet connection
const commitment: Commitment = "confirmed";
const connection = new Connection("https://api.devnet.solana.com", commitment);

// Mint address
const mint = new PublicKey("EHHYEEf2SYTRw3HFttWxhrjsQ32uG228EiLQ4rznEmmC");

(async () => {
  try {
    // Create an ATA
    const ata = await getOrCreateAssociatedTokenAccount(
      connection,
      keypair,
      mint,
      keypair.publicKey
    );
    console.log(`Your ata is: ${ata.address.toBase58()}`);
  } catch (error) {
    console.log(`Oops, something went wrong: ${error}`);
  }
})();

Ganti mint dengan alamat mint yang sudah dibuat pada tahap 4. Kode tersebut akan menghasilkan alamat ATA.

6. Mencetak Token (Minting)

Kita akan mencetak supply baru untuk token kita dengan memasukkannya ke ATA yang baru saja kita buat. Buat file baru dengan nama spl_mint.ts.

text
import { Keypair, PublicKey, Connection, Commitment } from "@solana/web3.js";
import { getOrCreateAssociatedTokenAccount, mintTo } from "@solana/spl-token";
import wallet from "./dev-wallet.json";

// Import our keypair from the wallet file
const keypair = Keypair.fromSecretKey(new Uint8Array(wallet));

//Create a Solana devnet connection
const commitment: Commitment = "confirmed";
const connection = new Connection("https://api.devnet.solana.com", commitment);

const token_decimals = 1_000_000;

// Mint address
const mint = new PublicKey("EHHYEEf2SYTRw3HFttWxhrjsQ32uG228EiLQ4rznEmmC");

(async () => {
  try {
    let ata = new PublicKey("DGrqW47DoVKAMq8noPVovibV9E6N1VYSUG9DZbMfZ8MX");

    // Mint to ATA
    const mintTx = await mintTo(
      connection,
      keypair,
      mint,
      ata,
      keypair.publicKey,
      100 * token_decimals  
    );

    console.log(`Your mint txid: ${mintTx}`);
  } catch (error) {
    console.log(`Oops, something went wrong: ${error}`);
  }
})();

Pada kode tersebut kita membuat 100 token.

7. Mengirim Token ke Wallet Lain

Setelah token dibuat, token haru bisa dikirim. Silahkan buat wallet baru untuk menerima token yang baru kita buat. Kamu bisa ikuti step 2 untuk generat wallet.

text
import {
  Commitment,
  Connection,
  Keypair,
  LAMPORTS_PER_SOL,
  PublicKey,
} from "@solana/web3.js";
import wallet from "./wallet/turbin3-wallet.json";
import { getOrCreateAssociatedTokenAccount, transfer } from "@solana/spl-token";
import { printTxHash } from "../tools/print_tx_hash";

// We're going to import our keypair from the wallet file
const keypair = Keypair.fromSecretKey(new Uint8Array(wallet));

//Create a Solana devnet connection
const commitment: Commitment = "confirmed";
const connection = new Connection("https://api.devnet.solana.com", commitment);

const token_decimals = 1_000_000;

// Mint address
const mint = new PublicKey("EHHYEEf2SYTRw3HFttWxhrjsQ32uG228EiLQ4rznEmmC");

// Recipient address
const to = new PublicKey("HJW63ZWjbxsGM3QH8VxbB98tSrpFJNjWHKJ1uwRr6RR4");

(async () => {
  try {
    // Get the token account of the fromWallet address, and if it does not exist,
    const fromATA = await getOrCreateAssociatedTokenAccount(
      connection,
      keypair,
      mint,
      keypair.publicKey
    );

    // Get the token account of the toWallet address, and if it does not exist,
    const toATA = await getOrCreateAssociatedTokenAccount(
      connection,
      keypair,
      mint,
      to
    );

    // Transfer the new token to the "toTokenAccount" we just created
    const txHash = await transfer(
      connection,
      keypair,
      fromATA.address,
      toATA.address,
      keypair,
      10 * token_decimals
    );

    console.log(`Success! Check out your TX here: https://explorer.solana.com/tx/${txHash}?cluster=devnet`);
  } catch (e) {
    console.error(`Oops, something went wrong: ${e}`);
  }
})();

Ganti mint address menjadi address mint kamu. Kemudian bisa juga ganti recipient address dengan alamat baru yang baru kamu generate. Setelah kamu running kode tersebut, wallet yang kita gunakan untuk membuat token akan mengirim token berjumlah 10 ke wallet recipient.

Tokennya Kok Nggak Ada Gambar atau Bahkan Nama?

Ingat, SPL Token itu hanya ngurusin angka dan kepemilikan. Dia tidak peduli dengan data "cantik" seperti nama atau gambar.

Untuk menambahkan metadata, kita butuh program lain, yaitu Token Metadata Program dari Metaplex. Program ini akan menautkan sebuah Metadata Account ke Mint Account kita. Penautan ini menggunakan teknologi keren yang disebut Program Derived Address (PDA).

Ini adalah topik yang penting, yang akan kita bedah tuntas di artikel ini!

Key Takeaways (TL;DR)

  • SPL itu "Kumpulan Program" yang siap pakai.
  • Mint Account adalah "Cetakan" yang mendefinisikan sebuah token.
  • Token Account adalah "Dompet" untuk menyimpan token.
  • Metadata tidak diatur dari SPL Token tapi menggunakan program lain seperti Metaplex.