Cheatcodes sind Zustandsänderungen, die den normalen Transaktionsablauf umgehen. Sie werden sofort ausgeführt, ohne einen Blockhash zu verbrauchen oder Fee zu zahlen – genau das, was man für die Testeinrichtung benötigt.
In Rust befinden sich Cheatcodes unter Surfnet::cheatcodes(). In JS sind sie
Methoden direkt auf der Surfnet-Instanz.
SOL bereitstellen
fundSol / fund_sol setzt den lamport-Kontostand eines beliebigen Konten,
wobei das Konten erstellt wird, falls es noch nicht existiert.
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)])?;
Token bereitstellen
fundToken / fund_token prägt Token in eine Wallet, indem das zugehörige
token account berechnet, bei Bedarf erstellt und der Betrag gesetzt wird.
Token-2022 Mints
Standardmäßig verwendet fundToken das klassische SPL Token Program. Für
Token-2022 Mints wird die Token-2022-Programm-ID
(TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb) als letztes Argument
übergeben.
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)?;
Um die ATA ohne Bereitstellung abzuleiten, verwende getAta / get_ata:
let ata = cheats.get_ata(&wallet, &mint, None);
Beliebigen Konten-Zustand setzen
Die Methode setAccount schreibt lamports, Owner und rohe Datenbytes für ein
beliebiges Konten in einem einzigen Aufruf. Das Rust-SDK stellt zusätzlich einen
SetAccount-Builder für erweiterte Felder wie rent_epoch und executable
bereit.
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-Konten-Felder mutieren
setTokenAccount aktualisiert die erweiterten Felder eines bestehenden token
account — Delegate, Status, Close Authority, delegierter Betrag. Verwenden Sie
es, wenn fundToken allein nicht ausreicht.
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())?;
Konten auf den Upstream-Zustand zurücksetzen
resetAccount verwirft alle lokalen Änderungen und ruft die Konten erneut vom
Upstream-RPC ab. Übergeben Sie includeOwnedAccounts: true, um auch alle Konten
zurückzusetzen, die dem Ziel gehören – nützlich beim Zurücksetzen eines
Programms und all seiner PDAs.
Benötigt `remoteRpcUrl` zum erneuten Abrufen
In einem Offline-Surfnet löscht resetAccount die lokale Kopie, hat jedoch
keinen Upstream, von dem abgerufen werden kann. Konfigurieren Sie
remoteRpcUrl beim Start, damit Zurücksetzungen den Upstream-Zustand
wiederherstellen.
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),)?;
Konten live streamen
streamAccount registriert ein Konto für das Hintergrund-Polling vom Upstream-
RPC. Die lokale Surfnet-Kopie bleibt mit dem Mainnet synchronisiert, ohne dass
der Test explizit pollen muss. Kombinieren Sie dies mit includeOwnedAccounts,
um alle PDAs eines Programms zu streamen.
Erfordert `remoteRpcUrl`
streamAccount funktioniert nur auf einem Surfnet, das mit remoteRpcUrl
gestartet wurde (oder remote_rpc_url in Rust). Ohne einen Upstream-RPC gibt
es nichts zu streamen, und der Aufruf gibt einen Fehler zurück.
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-Builder (Rust)
Das Rust-SDK stellt typisierte Builder unter
surfpool_sdk::cheatcodes::builders bereit für Fälle, in denen die
Komfortmethoden nicht ausreichen. Jeder Builder implementiert das
CheatcodeBuilder-Trait und wird über cheats.execute(builder) ausgeführt.
| Builder | Konstruktor | Häufige Setter |
|---|---|---|
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 |
Die vollständige JS-Oberfläche finden Sie unter JS-Referenz. Die vollständige Rust-Oberfläche finden Sie unter Rust-Referenz.
Is this page helpful?