Cheatcodes

Τα Cheatcodes είναι μεταλλάξεις κατάστασης που παρακάμπτουν τη φυσιολογική ροή συναλλαγών. Εκτελούνται άμεσα χωρίς να καταναλώνουν blockhash ή να πληρώνουν προμήθειες, κάτι που είναι ακριβώς αυτό που χρειάζεστε για την προετοιμασία δοκιμών.

Στη Rust, τα cheatcodes βρίσκονται υπό το Surfnet::cheatcodes(). Στη JS, είναι μέθοδοι απευθείας στο instance του Surfnet.

Χρηματοδότηση SOL

Το fundSol / fund_sol ορίζει το υπόλοιπο σε lamport για οποιονδήποτε λογαριασμό, δημιουργώντας τον λογαριασμό αν δεν υπάρχει.

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

Το fundToken / fund_token κόβει token σε ένα πορτοφόλι υπολογίζοντας το associated token account, δημιουργώντας το αν χρειαστεί, και ορίζοντας το ποσό.

Token-2022 mints

Από προεπιλογή το fundToken χρησιμοποιεί το κλασικό Token Program SPL. Για Token-2022 mints, περάστε το Token-2022 program ID (TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb) ως τελευταίο όρισμα.

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

Για να υπολογίσετε το ATA χωρίς χρηματοδότηση, χρησιμοποιήστε το getAta / get_ata:

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

Ορισμός Αυθαίρετης Κατάστασης Λογαριασμού

Η μέθοδος setAccount γράφει lamports, owner και ακατέργαστα bytes δεδομένων για οποιονδήποτε λογαριασμό σε μία κλήση. Το Rust SDK εκθέτει επιπλέον έναν builder SetAccount για πιο προχωρημένα πεδία όπως rent_epoch και 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

setTokenAccount ενημερώνει τα προηγμένα πεδία ενός υπάρχοντος token account — delegate, state, close authority, delegated amount. Χρησιμοποιήστε το όταν το fundToken μόνο του δεν είναι αρκετό.

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

Επαναφορά Λογαριασμών στην Upstream Κατάσταση

resetAccount απορρίπτει τυχόν τοπικές μεταβολές και ξανααντλεί τον λογαριασμό από το upstream RPC. Περάστε includeOwnedAccounts: true για να επαναφέρετε επίσης κάθε λογαριασμό που ανήκει στον στόχο — χρήσιμο όταν επαναφέρετε ένα πρόγραμμα και όλα τα PDAs του.

Χρειάζεται `remoteRpcUrl` για επαναφορά

Σε ένα offline Surfnet, το resetAccount διαγράφει το τοπικό αντίγραφο αλλά δεν έχει upstream από όπου να αντλήσει. Ρυθμίστε το remoteRpcUrl κατά την εκκίνηση για να επαναφέρουν τα resets την 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),
)?;

Ζωντανή Ροή Λογαριασμών

streamAccount καταχωρεί έναν λογαριασμό για ανάκτηση στο παρασκήνιο από το upstream RPC. Το τοπικό αντίγραφο του Surfnet παραμένει συγχρονισμένο με το mainnet χωρίς να χρειάζεται ο έλεγχος να κάνει ρητή αναμονή. Συνδυάστε το με includeOwnedAccounts για ροή κάθε PDA που ανήκει σε ένα πρόγραμμα.

Απαιτεί `remoteRpcUrl`

Το streamAccount λειτουργεί μόνο σε Surfnet που ξεκίνησε με remoteRpcUrlremote_rpc_url στη Rust). Χωρίς upstream RPC δεν υπάρχει τίποτα από όπου να γίνει ροή και η κλήση θα επιστρέψει σφάλμα.

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 εκθέτει typed builders κάτω από surfpool_sdk::cheatcodes::builders για περιπτώσεις όπου οι μέθοδοι ευκολίας δεν επαρκούν. Κάθε builder υλοποιεί το trait CheatcodeBuilder και εκτελείται μέσω 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

Για την πλήρη επιφάνεια JS, δείτε Αναφορά JS. Για την πλήρη επιφάνεια Rust, δείτε Αναφορά Rust.

Is this page helpful?

© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.