Cheatcodes

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.

BuilderKonstruktorHäufige Setter
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

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?

Inhaltsverzeichnis

Seite bearbeiten
© 2026 Solana Foundation. Alle Rechte vorbehalten.