Cheatcodes là các thay đổi trạng thái bỏ qua luồng giao dịch thông thường. Chúng chạy tức thì mà không tiêu thụ blockhash hay trả phí, đây chính xác là điều bạn cần cho việc thiết lập kiểm thử.
Trong Rust, cheatcodes nằm trong Surfnet::cheatcodes(). Trong JS, chúng là các
phương thức trực tiếp trên instance Surfnet.
Nạp SOL
fundSol / fund_sol đặt số dư lamport cho bất kỳ tài khoản nào, tạo tài khoản
nếu nó chưa tồn tại.
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)])?;
Nạp Token
fundToken / fund_token đúc token vào ví bằng cách tính toán associated token
account, tạo nếu cần, và đặt số lượng.
Token-2022 mints
Theo mặc định fundToken sử dụng chương trình SPL Token cổ điển. Đối với các
mint Token-2022, truyền ID chương trình Token-2022
(TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb) làm đối số cuối cùng.
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)?;
Để lấy ATA mà không nạp tiền, sử dụng getAta / get_ata:
let ata = cheats.get_ata(&wallet, &mint, None);
Đặt Trạng Thái Tài Khoản Tùy Ý
Phương thức setAccount ghi lamports, chủ sở hữu và các byte dữ liệu thô cho
bất kỳ tài khoản nào trong một lần gọi. Rust SDK còn cung cấp thêm builder
SetAccount cho các trường nâng cao hơn như rent_epoch và 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),)?;
Thay Đổi Các Trường Của Token Account
setTokenAccount cập nhật các trường nâng cao của một token account hiện có —
ủy quyền, trạng thái, quyền đóng, số lượng được ủy quyền. Sử dụng khi
fundToken đơn lẻ không đủ.
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())?;
Đặt Lại Tài Khoản Về Trạng Thái Upstream
resetAccount loại bỏ mọi thay đổi cục bộ và tải lại tài khoản từ RPC upstream.
Truyền includeOwnedAccounts: true để đồng thời đặt lại mọi tài khoản thuộc sở
hữu của mục tiêu — hữu ích khi đặt lại một chương trình và tất cả PDA của nó.
Cần `remoteRpcUrl` để tải lại
Trên một Surfnet ngoại tuyến, resetAccount xóa bản sao cục bộ nhưng không có
upstream để tải từ đó. Hãy cấu hình remoteRpcUrl lúc khởi động để các lần
đặt lại có thể khôi phục trạng thái 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),)?;
Truyền Trực Tiếp Tài Khoản
streamAccount đăng ký một tài khoản để polling nền từ RPC upstream. Bản sao
Surfnet cục bộ luôn đồng bộ với mainnet mà không cần bài kiểm tra phải tự
polling. Kết hợp với includeOwnedAccounts để truyền trực tiếp mọi PDA thuộc sở
hữu của một chương trình.
Yêu cầu `remoteRpcUrl`
streamAccount chỉ hoạt động trên Surfnet được khởi động với remoteRpcUrl
(hoặc remote_rpc_url trong Rust). Nếu không có RPC upstream thì không có gì
để truyền và lệnh gọi sẽ trả về lỗi.
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))?;
Các Builder Cheatcode (Rust)
Rust SDK cung cấp các builder có kiểu dữ liệu dưới
surfpool_sdk::cheatcodes::builders cho những trường hợp mà các phương thức
tiện lợi không đủ dùng. Mỗi builder đều triển khai trait CheatcodeBuilder và
được thực thi thông qua 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 |
Để xem toàn bộ giao diện JS, hãy xem Tài liệu tham khảo JS. Để xem toàn bộ giao diện Rust, hãy xem Tài liệu tham khảo Rust.
Is this page helpful?