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).
| Builder | Constructor | Common setters |
|---|---|---|
SetAccount | new(address: Pubkey) | lamports, data, owner, rent_epoch, executable |
SetTokenAccount | new(owner: Pubkey, mint: Pubkey) | amount, delegate, clear_delegate, state, delegated_amount, close_authority, clear_close_authority, token_program |
ResetAccount | new(address: Pubkey) | include_owned_accounts(bool) |
StreamAccount | new(address: Pubkey) | include_owned_accounts(bool) |
DeployProgram | new(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?