Token-logiikan testaaminen Solanassa tarkoittaa minttiä, token account -tilejä
ja valtuuksien määrittämistä ennen kuin voit testata varsinaista
siirtologiikkaa. tokenProgram()-laajennus paketista @solana-program/token
tiivistää tämän asetuksen muutamaan metodikutsuun — ja hallitsee ATA:n luomisen
automaattisesti.
Asennus
pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/token
Luo Mintti
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { litesvm } from "@solana/kit-plugin-litesvm";import { signer } from "@solana/kit-plugin-signer";import { tokenProgram } from "@solana-program/token";const mySigner = await generateKeyPairSigner();const client = createClient().use(signer(mySigner)).use(litesvm()).use(tokenProgram());client.svm.airdrop(client.payer.address, lamports(10_000_000_000n));const mintAuthority = await generateKeyPairSigner();const newMint = await generateKeyPairSigner();await client.token.instructions.createMint({newMint,decimals: 9,mintAuthority: mintAuthority.address}).sendTransaction();// Verifyconst mintAccount = await client.token.accounts.mint.fetch(newMint.address);console.log(mintAccount.data.supply); // 0nconsole.log(mintAccount.data.decimals); // 9
Luo Tokeneita
mintToATA lähettää tokeneita omistajan associated token account -tilille. Jos
ATA ei ole olemassa, se luodaan samassa transaktiossa.
await client.token.instructions.mintToATA({mint: newMint.address,owner: client.payer.address,mintAuthority,amount: 1_000_000_000_000n, // 1000 tokens (9 decimals)decimals: 9}).sendTransaction();
decimals-parametri on turvatarkistus — sen on vastattava mintin desimaaleja
täsmälleen, muuten Token Program hylkää transaktion virheellä 0x24. Tämä estää
vahingossa luomasta 1000-kertaa liian monta tokenia.
Siirrä Tokeneita
transferToATA siirtää tokeneita käyttäjien välillä. Vastaanottajan ATA luodaan
automaattisesti tarvittaessa.
const alice = await generateKeyPairSigner();const bob = await generateKeyPairSigner();// Mint to Aliceawait client.token.instructions.mintToATA({mint: newMint.address,owner: alice.address,mintAuthority,amount: 1_000_000_000_000n,decimals: 9}).sendTransaction();// Transfer 400 tokens from Alice to Bobawait client.token.instructions.transferToATA({mint: newMint.address,authority: alice,recipient: bob.address,amount: 400_000_000_000n,decimals: 9}).sendTransaction();
authority on allekirjoittaja, joka omistaa lähdetokeneja. Laajennus johtaa
sekä lähde- että kohde-ATA:t niiden osoitteista ja mintistä.
Saldojen Tarkistaminen
Lukeaksesi token-saldot takaisin, johda ATA-osoite käyttämällä
findAssociatedTokenPda ja hae dekoodattu tili:
import {findAssociatedTokenPda,TOKEN_PROGRAM_ADDRESS} from "@solana-program/token";const [aliceAta] = await findAssociatedTokenPda({owner: alice.address,mint: newMint.address,tokenProgram: TOKEN_PROGRAM_ADDRESS});const aliceAccount = await client.token.accounts.token.fetch(aliceAta);console.log(aliceAccount.data.amount); // 600_000_000_000nconsole.log(aliceAccount.data.mint); // newMint.addressconsole.log(aliceAccount.data.owner); // alice.address
Desimaalit
Token-määrät ovat aina raakayksiköissä. 1000 tokenia 9 desimaalilla on
1_000_000_000_000n, ei 1000n.
// USDC has 6 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst oneSOL = 10n ** 9n; // 1_000_000_000n
Käytä aina BigInt token-määrille. JavaScriptin Number menettää tarkkuuden
arvon 2^53 yläpuolella.
Laajennusviite
| Metodi | Kuvaus |
|---|---|
client.token.instructions.createMint() | Luo uusi SPL-token mint account |
client.token.instructions.mintToATA() | Lyö tokeneita omistajan ATA:han (luo ATA:n tarvittaessa) |
client.token.instructions.transferToATA() | Siirrä tokeneita vastaanottajan ATA:han (luo ATA:n tarvittaessa) |
client.token.accounts.mint.fetch() | Hae ja dekoodaa mint account |
client.token.accounts.token.fetch() | Hae ja dekoodaa token account |
Yleiset virheet
| Virhe | Syy | Korjaus |
|---|---|---|
custom program error: 0x24 | decimals ei vastaa minttiä | Käytä samaa desimaalien arvoa, jonka välitit createMint:lle |
AccountNotFound | Tiliä ei ole vielä olemassa | Varmista, että mint account on luotu ennen lyömistä |
InsufficientFunds | Ei tarpeeksi lamporteja rent-maksua varten | Airdrop lisää SOL maksajalle |
OwnerMismatch | Väärä ohjelma omistaa tilin | Tarkista ohjelmatunnus |
Is this page helpful?