Cheatcodes

Cheatcodes zijn toestandsmutaties die de normale transactiestroom omzeilen. Ze worden meteen uitgevoerd zonder een blockhash te verbruiken of kosten te betalen, wat precies is wat je nodig hebt voor testvoorbereiding.

In Rust leven cheatcodes onder Surfnet::cheatcodes(). In JS zijn het methoden direct op de Surfnet-instantie.

SOL financieren

fundSol / fund_sol stelt het lamport-saldo in op elk account en maakt het account aan als het nog niet bestaat.

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)])?;

Tokens financieren

fundToken / fund_token mint tokens naar een wallet door het bijbehorende token account te berekenen, het aan te maken indien nodig, en het bedrag in te stellen.

Token-2022 mints

Standaard gebruikt fundToken het klassieke SPL Token program. Voor Token-2022 mints, geef het Token-2022 programma-ID (TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb) mee als laatste argument.

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)?;

Om de ATA af te leiden zonder te financieren, gebruik getAta / get_ata:

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

Willekeurige accounttoestand instellen

De methode setAccount schrijft lamports, eigenaar en ruwe databytes voor elk account in één aanroep. De Rust SDK biedt daarnaast een SetAccount-builder voor meer geavanceerde velden zoals rent_epoch en 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),
)?;

Token Account-velden Wijzigen

setTokenAccount werkt de geavanceerde velden van een bestaand token account bij — gedelegeerde, status, sluitingsautoriteit, gedelegeerd bedrag. Gebruik het wanneer fundToken alleen niet voldoende is.

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())?;

Accounts Terugzetten naar Upstream-status

resetAccount verwijdert lokale wijzigingen en haalt het account opnieuw op van de upstream RPC. Geef includeOwnedAccounts: true mee om ook elk account dat eigendom is van het doel te resetten — handig bij het resetten van een programma en al zijn PDA's.

Heeft `remoteRpcUrl` nodig om opnieuw op te halen

Op een offline Surfnet wist resetAccount de lokale kopie, maar er is geen upstream om van op te halen. Configureer remoteRpcUrl bij het opstarten om resets de upstream-status te laten herstellen.

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),
)?;

Live Accounts Streamen

streamAccount registreert een account voor achtergrondpolling vanuit de upstream RPC. De lokale Surfnet-kopie blijft gesynchroniseerd met mainnet zonder dat de test expliciet hoeft te pollen. Combineer met includeOwnedAccounts om elke PDA die eigendom is van een programma te streamen.

Vereist `remoteRpcUrl`

streamAccount werkt alleen op een Surfnet gestart met remoteRpcUrl (of remote_rpc_url in Rust). Zonder een upstream RPC is er niets om van te streamen en zal de aanroep een fout retourneren.

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)

De Rust SDK biedt getypeerde builders onder surfpool_sdk::cheatcodes::builders voor gevallen waarin de handige methoden niet voldoende zijn. Elke builder implementeert de CheatcodeBuilder-trait en wordt uitgevoerd via 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

Voor het volledige JS-oppervlak, zie JS Referentie. Voor het volledige Rust-oppervlak, zie Rust Referentie.

Is this page helpful?

Inhoudsopgave

Pagina Bewerken
© 2026 Solana Foundation. Alle rechten voorbehouden.