Cheatcodes

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_epochexecutable.

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).

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

Để 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?

Mục lục

Chỉnh sửa trang