Cheatcodes

Cheatcodes adalah mutasi status yang melewati alur transaksi normal. Cheatcodes berjalan seketika tanpa menggunakan blockhash atau membayar biaya, yang merupakan hal yang tepat untuk persiapan pengujian.

Di Rust, cheatcodes berada di bawah Surfnet::cheatcodes(). Di JS, cheatcodes adalah metode langsung pada instance Surfnet.

Dana SOL

fundSol / fund_sol mengatur saldo lamport pada akun mana pun, membuat akun jika belum ada.

use surfpool_sdk::{Pubkey, Surfnet};
let surfnet = Surfnet::start().await?;
let cheats = surfnet.cheatcodes();
let wallet = Pubkey::new_unique();
cheats.fund_sol(&wallet, 1_000_000_000)?;
// Fund several accounts in one call.
let bob = Pubkey::new_unique();
let carol = Pubkey::new_unique();
cheats.fund_sol_many(&[(&bob, 2_000_000_000), (&carol, 3_000_000_000)])?;

Dana Token

fundToken / fund_token mencetak token ke dompet dengan menghitung token account terkait, membuatnya jika diperlukan, dan menetapkan jumlahnya.

Mint Token-2022

Secara default fundToken menggunakan Token Program SPL klasik. Untuk mint Token-2022, berikan ID program Token-2022 (TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb) sebagai argumen terakhir.

use surfpool_sdk::{Pubkey, Surfnet};
let surfnet = Surfnet::start().await?;
let cheats = surfnet.cheatcodes();
let wallet = Pubkey::new_unique();
let mint: Pubkey = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
.parse()
.unwrap();
// Classic SPL Token mint.
cheats.fund_token(&wallet, &mint, 5_000_000, None)?;
// Token-2022 mint — pass the program id explicitly.
let token_2022: Pubkey = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"
.parse()
.unwrap();
cheats.fund_token(&wallet, &mint, 5_000_000, Some(&token_2022))?;
// Fund many wallets with the same mint.
let mob = vec![Pubkey::new_unique(), Pubkey::new_unique()];
cheats.fund_token_many(&mob.iter().collect::<Vec<_>>(), &mint, 1_000_000, None)?;

Untuk menurunkan ATA tanpa pendanaan, gunakan getAta / get_ata:

let ata = cheats.get_ata(&wallet, &mint, None);

Atur Status Akun Sembarang

Metode setAccount menulis lamport, pemilik, dan byte data mentah untuk akun mana pun dalam satu panggilan. Rust SDK juga mengekspos builder SetAccount untuk kolom yang lebih canggih seperti rent_epoch dan executable.

use surfpool_sdk::cheatcodes::builders::SetAccount;
use surfpool_sdk::{Pubkey, Surfnet};
let surfnet = Surfnet::start().await?;
let cheats = surfnet.cheatcodes();
let address = Pubkey::new_unique();
let owner = Pubkey::new_unique();
// Direct method.
cheats.set_account(&address, 500_000, &[1, 2, 3], &owner)?;
// Builder when you need finer control.
cheats.execute(
SetAccount::new(address)
.lamports(500_000)
.owner(owner)
.data(vec![1, 2, 3])
.rent_epoch(0)
.executable(false),
)?;

Mutasi Bidang Token Account

setTokenAccount memperbarui bidang lanjutan dari token account yang sudah ada — delegasi, status, otoritas penutupan, jumlah yang didelegasikan. Gunakan ini ketika fundToken saja tidak cukup.

use surfpool_sdk::cheatcodes::builders::SetTokenAccount;
use surfpool_sdk::{Pubkey, Surfnet};
let cheats = Surfnet::start().await?.cheatcodes();
let owner = Pubkey::new_unique();
let mint: Pubkey = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v".parse()?;
let delegate = Pubkey::new_unique();
cheats.execute(
SetTokenAccount::new(owner, mint)
.amount(2_000_000)
.delegate(delegate)
.delegated_amount(500_000)
.state("initialized"),
)?;
// Later: clear the delegation.
cheats.execute(SetTokenAccount::new(owner, mint).clear_delegate())?;

Reset Akun ke Status Upstream

resetAccount membuang semua mutasi lokal dan mengambil ulang akun dari RPC upstream. Berikan includeOwnedAccounts: true untuk juga mereset setiap akun yang dimiliki oleh target — berguna saat mereset program beserta seluruh PDA-nya.

Membutuhkan `remoteRpcUrl` untuk mengambil ulang

Pada Surfnet offline, resetAccount menghapus salinan lokal tetapi tidak memiliki upstream untuk diambil. Konfigurasikan remoteRpcUrl saat startup agar reset memulihkan status upstream.

use surfpool_sdk::cheatcodes::builders::ResetAccount;
use surfpool_sdk::{Pubkey, Surfnet};
let cheats = Surfnet::start().await?.cheatcodes();
let token_program: Pubkey = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA".parse()?;
cheats.execute(
ResetAccount::new(token_program).include_owned_accounts(true),
)?;

Streaming Akun Secara Langsung

streamAccount mendaftarkan akun untuk polling latar belakang dari RPC upstream. Salinan lokal Surfnet tetap tersinkronisasi dengan mainnet tanpa pengujian harus melakukan polling secara eksplisit. Kombinasikan dengan includeOwnedAccounts untuk melakukan streaming setiap PDA yang dimiliki oleh suatu program.

Membutuhkan `remoteRpcUrl`

streamAccount hanya berfungsi pada Surfnet yang dijalankan dengan remoteRpcUrl (atau remote_rpc_url di Rust). Tanpa RPC upstream tidak ada yang bisa di-streaming dan panggilan akan mengembalikan error.

use surfpool_sdk::cheatcodes::builders::StreamAccount;
use surfpool_sdk::{Pubkey, Surfnet};
let cheats = Surfnet::builder()
.remote_rpc_url("https://api.mainnet-beta.solana.com")
.start()
.await?
.cheatcodes();
let oracle: Pubkey = "H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG".parse()?;
cheats.execute(StreamAccount::new(oracle).include_owned_accounts(false))?;

Cheatcode Builders (Rust)

Rust SDK mengekspos typed builders di bawah surfpool_sdk::cheatcodes::builders untuk kasus di mana metode kenyamanan tidak mencukupi. Setiap builder mengimplementasikan trait CheatcodeBuilder dan dieksekusi melalui cheats.execute(builder).

BuilderConstructorCommon setters
SetAccountnew(address: Pubkey)lamports, data, owner, rent_epoch, executable
SetTokenAccountnew(owner: Pubkey, mint: Pubkey)amount, delegate, clear_delegate, state, delegated_amount, close_authority, clear_close_authority, token_program
ResetAccountnew(address: Pubkey)include_owned_accounts(bool)
StreamAccountnew(address: Pubkey)include_owned_accounts(bool)
DeployProgramnew(program_id: Pubkey), from_keypair_path(path)so_path, so_bytes, idl_path

Untuk tampilan lengkap JS, lihat Referensi JS. Untuk tampilan lengkap Rust, lihat Referensi Rust.

Is this page helpful?

Daftar Isi

Edit Halaman
© 2026 Yayasan Solana. Semua hak dilindungi.