Token

Apa yang saya perlukan untuk memulai dengan SPL-Tokens?

Setiap kali anda berinteraksi dengan tokens di Solana, anda sebenarnya berinteraksi dengan Solana Program Library Token, atau SPL-Token standard. SPL-Token standard mensyaratkan sebuah library spesifik untuk digunakan, yang anda dapat temukan dibawah ini berdasarkan bahasa anda.

"@solana/spl-token": "^0.2.0"

Bagaimana cara untuk membuat sebuah Token baru

Membuat token-token didapat dengan menciptakan apa yang disebut dengan sebuah "akun mint". Akun mint ini nantinya akan digunakan untuk me-mint token-token ke sebuah akun token dan membuat supply awal.

Press </> button to view full source
// 1) use build-in function
let mintPubkey = await createMint(
  connection, // conneciton
  feePayer, // fee payer
  alice.publicKey, // mint authority
  alice.publicKey, // freeze authority (you can use `null` to disable it. when you disable it, you can't turn it on again)
  8 // decimals
);

// or

// 2) compose by yourself
let tx = new Transaction().add(
  // create mint account
  SystemProgram.createAccount({
    fromPubkey: feePayer.publicKey,
    newAccountPubkey: mint.publicKey,
    space: MINT_SIZE,
    lamports: await getMinimumBalanceForRentExemptMint(connection),
    programId: TOKEN_PROGRAM_ID,
  }),
  // init mint account
  createInitializeMintInstruction(
    mint.publicKey, // mint pubkey
    8, // decimals
    alice.publicKey, // mint authority
    alice.publicKey // freeze authority (you can use `null` to disable it. when you disable it, you can't turn it on again)
  )
);

Bagaimana cara mendapatkan sebuah token mint

Untuk mendapatkan supply yang berjalan, authority, atau decimals yang dimliki sebuah token, anda perlu mendapatkan account info untuk me-mint token.

Press </> button to view full source
let mintAccount = await getMint(connection, mintAccountPublicKey);

Bagaimana cara membuat sebuah akun token

Sebuah akun token diperlukan untuk menampung token-token. Setiap token mint mempunyai sebuah akun token berbeda yang diasosiasikan dengannya.

Associated Token Accounts secara deterministik membuat akun-akun untuk setiap keypair. ATA adalah method yang direkomendasi untuk mengature akun-akun token.

Press </> button to view full source
// 1) use build-in function
{
  let ata = await createAssociatedTokenAccount(
    connection, // connection
    feePayer, // fee payer
    mintPubkey, // mint
    alice.publicKey // owner,
  );
}

// or

// 2) composed by yourself
{
  let tx = new Transaction().add(
    createAssociatedTokenAccountInstruction(
      feePayer.publicKey, // payer
      ata, // ata
      alice.publicKey, // owner
      mintPubkey // mint
    )
  );
}

Bagaimana cara mendapatkan sebuah Akun Token

Setiap akun token mempunyai informasi di dalam token seperti pemilik, mint, jumlah (saldo), dan decimlas.

Press </> button to view full source
let tokenAccount = await getAccount(connection, tokenAccountPubkey);

Bagaimana cara mendapatkan saldo dari akun token

Akun token memiliki saldo token yang dapat diambil dengan sebuah single call.

Press </> button to view full source
let tokenAmount = await connection.getTokenAccountBalance(tokenAccount);
let balance = connection
        .get_token_account_balance(&token_account)
        .unwrap();

TIP

Sebuah akun token hanya dapat menampung satu jenis mint. Ketika anda menspesifikasikan sebuat akun token, anda juga menspesifikasikan mintnya juga.

Bagaimana cara untuk me-mint token-token

Ketika anda me-mint token-token, anda menambah supply dan mentransfer token-token baru ke sebuah akun token spesifik.

Press </> button to view full source
// 1) use build-in function
{
  let txhash = await mintToChecked(
    connection, // connection
    feePayer, // fee payer
    mintPubkey, // mint
    tokenAccountPubkey, // receiver (should be a token account)
    alice, // mint authority
    1e8, // amount. if your decimals is 8, you mint 10^8 for 1 token.
    8 // decimals
  );
}

// or

// 2) compose by yourself
{
  let tx = new Transaction().add(
    createMintToCheckedInstruction(
      mintPubkey, // mint
      tokenAccountPubkey, // receiver (should be a token account)
      alice.publicKey, // mint authority
      1e8, // amount. if your decimals is 8, you mint 10^8 for 1 token.
      8 // decimals
      // [signer1, signer2 ...], // only multisig account will use
    )
  );
}

Bagaimana cara mentransfer token-token

Anda dapat mentransfer token-token dari satu akun token ke akun token lainnya.

Press </> button to view full source
// 1) use build-in function
{
  let txhash = await transferChecked(
    connection, // connection
    feePayer, // payer
    tokenAccountXPubkey, // from (should be a token account)
    mintPubkey, // mint
    tokenAccountYPubkey, // to (should be a token account)
    alice, // from's owner
    1e8, // amount, if your deciamls is 8, send 10^8 for 1 token
    8 // decimals
  );
}

// or

// 2) compose by yourself
{
  let tx = new Transaction().add(
    createTransferCheckedInstruction(
      tokenAccountXPubkey, // from (should be a token account)
      mintPubkey, // mint
      tokenAccountYPubkey, // to (should be a token account)
      alice.publicKey, // from's owner
      1e8, // amount, if your deciamls is 8, send 10^8 for 1 token
      8 // decimals
    )
  );
}

Bagaimana cara membakar token-token

Anda dapat membakar token jika anda adalah pemilik dari token tersebut.

Press </> button to view full source
// 1) use build-in function
{
  let txhash = await burnChecked(
    connection, // connection
    feePayer, // payer
    tokenAccountPubkey, // token account
    mintPubkey, // mint
    alice, // owner
    1e8, // amount, if your deciamls is 8, 10^8 for 1 token
    8
  );
}

// or

// 2) compose by yourself
{
  let tx = new Transaction().add(
    createBurnCheckedInstruction(
      tokenAccountPubkey, // token account
      mintPubkey, // mint
      alice.publicKey, // owner of token account
      1e8, // amount, if your deciamls is 8, 10^8 for 1 token
      8 // decimals
    )
  );
}

Bagaimana cara menutup akun-akun token

Anda dapat menutup akun token jika anda tidak ingin menggunakannya lagi. Ada dua situasi:

  1. Wrapped SOL - penutupan mengkonversi Wrapped SOL ke SOL
  2. Token-token lainnya - Anda dapat menutupnya hanya jika saldo akun adalah 0.
Press </> button to view full source
// 1) use build-in function
{
  let txhash = await closeAccount(
    connection, // connection
    feePayer, // payer
    tokenAccountPubkey, // token account which you want to close
    alice.publicKey, // destination
    alice // owner of token account
  );
}

// or

// 2) compose by yourself
{
  let tx = new Transaction().add(
    createCloseAccountInstruction(
      tokenAccountPubkey, // token account which you want to close
      alice.publicKey, // destination
      alice.publicKey // owner of token account
    )
  );
}

Bagaimana cara untuk men-set authority pada akun-akun token atau mints

Anda dapat men-set/men-update authority. Ada 4 jenis:

  1. MintTokens (mint account)
  2. FreezeAccount (mint account)
  3. AccountOwner (token account)
  4. CloseAccount (token account)
Press </> button to view full source
// 1) use build-in function
{
  let txhash = await setAuthority(
    connection, // connection
    feePayer, // payer
    mintPubkey, // mint account || token account
    alice, // current authority
    AuthorityType.MintTokens, // authority type
    randomGuy.publicKey // new authority (you can pass `null` to close it)
  );
}

// or

// 2) compose by yourself
{
  let tx = new Transaction().add(
    createSetAuthorityInstruction(
      mintPubkey, // mint acocunt || token account
      alice.publicKey, // current auth
      AuthorityType.MintTokens, // authority type
      randomGuy.publicKey // new auth (you can pass `null` to close it)
    )
  );
}

Bagaimana cara untuk men-approve delegasi sebuah token

Anda dapat mengatur sebuah delegasi dengan jumlah yang diijinkan. Setelah anda atur, delegasi akan seperti pemilik lainnya dari akun token anda. Sebuah akun token hanya dapat didelegasikan ke satu akun di saat yang bersamaan

Press </> button to view full source
// 1) use build-in function
{
  let txhash = await approveChecked(
    connection, // connection
    feePayer, // fee payer
    mintPubkey, // mint
    tokenAccountPubkey, // token account
    randomGuy.publicKey, // delegate
    alice, // owner of token account
    1e8, // amount, if your deciamls is 8, 10^8 for 1 token
    8 // decimals
  );
}
// or

// 2) compose by yourself
{
  let tx = new Transaction().add(
    createApproveCheckedInstruction(
      tokenAccountPubkey, // token account
      mintPubkey, // mint
      randomGuy.publicKey, // delegate
      alice.publicKey, // owner of token account
      1e8, // amount, if your deciamls is 8, 10^8 for 1 token
      8 // decimals
    )
  );
}

Bagaimana cara menarik kembali delegasi token

Menarik kembali akan men-set delegate ke null dan men-set jumlah delegasi ke 0.

Press </> button to view full source
// 1) use build-in function
{
  let txhash = await revoke(
    connection, // connection
    feePayer, // payer
    tokenAccountPubkey, // token account
    alice // owner of token account
  );
}

// or

// 2) compose by yourself
{
  let tx = new Transaction().add(
    createRevokeInstruction(
      tokenAccountPubkey, // token account
      alice.publicKey // owner of token account
    )
  );
}

Bagaimana cara mengature wrapped SOL

Wrapped SOL seperti hanya token mint lainnya. Perbedaannya adalah menggunakan syncNative dan membuat akun-akun token khusus di alamat NATIVE_MINT.

Membuat Akun Token

Sperti Create Token Account tetapi menganti mint dengan NATIVE_MINT

import { NATIVE_MINT } from "@solana/spl-token";

Menambah Saldo

Ada dua cara untuk menambah saldo untuk Wrapped SOL

1. Dengan SOL Transfer

Press </> button to view full source
let tx = new Transaction().add(
  // trasnfer SOL
  SystemProgram.transfer({
    fromPubkey: alice.publicKey,
    toPubkey: ata,
    lamports: amount,
  }),
  // sync wrapped SOL balance
  createSyncNativeInstruction(ata)
);

2. Dengan Token Transfer

Press </> button to view full source
let tx = new Transaction().add(
  // create token account
  SystemProgram.createAccount({
    fromPubkey: alice.publicKey,
    newAccountPubkey: auxAccount.publicKey,
    space: ACCOUNT_SIZE,
    lamports:
      (await getMinimumBalanceForRentExemptAccount(connection)) + amount, // rent + amount
    programId: TOKEN_PROGRAM_ID,
  }),
  // init token account
  createInitializeAccountInstruction(
    auxAccount.publicKey,
    NATIVE_MINT,
    alice.publicKey
  ),
  // transfer WSOL
  createTransferInstruction(auxAccount.publicKey, ata, alice.publicKey, amount),
  // close aux account
  createCloseAccountInstruction(
    auxAccount.publicKey,
    alice.publicKey,
    alice.publicKey
  )
);

Bagaimana cara mendapatkan semua akun-akun token sebagai pemilik

Anda dapat mengambil akun-akun token sebagai pemilik. Ada 2 cara untuk mendapatkannya.

  1. Mendapatkan semua akun token
Press </> button to view full source
let response = await connection.getParsedTokenAccountsByOwner(owner, {
  programId: TOKEN_PROGRAM_ID,
});
  1. Filter Dengan Mint
Press </> button to view full source
let response = await connection.getParsedTokenAccountsByOwner(owner, {
  mint: mint,
});
Last Updated: 9/20/2022, 1:22:28 AM
Contributors: akangaziz