Cheatcodes

Los cheatcodes son mutaciones de estado que evitan el flujo normal de transacciones. Se ejecutan al instante sin consumir un blockhash ni pagar comisiones, lo cual es exactamente lo que necesitas para configurar pruebas.

En Rust, los cheatcodes se encuentran bajo Surfnet::cheatcodes(). En JS, son métodos directamente en la instancia Surfnet.

Fondear SOL

fundSol / fund_sol establece el saldo en lamport de cualquier cuenta, creándola si no existe.

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

Fondear Tokens

fundToken / fund_token acuña tokens en una wallet calculando el token account asociado, creándolo si es necesario, y estableciendo el monto.

Mints de Token-2022

Por defecto, fundToken utiliza el Token Program clásico de SPL. Para mints de Token-2022, pasa el ID del programa Token-2022 (TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb) como último argumento.

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

Para derivar la ATA sin fondear, usa getAta / get_ata:

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

Establecer Estado de Cuenta Arbitrario

El método setAccount escribe lamports, propietario y bytes de datos sin procesar para cualquier cuenta en una sola llamada. El SDK de Rust además expone un constructor SetAccount para campos más avanzados como rent_epoch y 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),
)?;

Modificar Campos del Token Account

setTokenAccount actualiza los campos avanzados de un token account existente — delegado, estado, autoridad de cierre y cantidad delegada. Úsalo cuando fundToken por sí solo no es suficiente.

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

Restablecer Cuentas al Estado Original

resetAccount descarta cualquier modificación local y vuelve a obtener la cuenta desde el RPC de origen. Pasa includeOwnedAccounts: true para restablecer también todas las cuentas propiedad del objetivo — útil al reiniciar un programa y todos sus PDAs.

Requiere `remoteRpcUrl` para volver a obtener datos

En una Surfnet sin conexión, resetAccount borra la copia local pero no tiene un origen desde el que obtener datos. Configura remoteRpcUrl al inicio para que los restablecimientos restauren el estado original.

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

Transmitir Cuentas en Tiempo Real

streamAccount registra una cuenta para sondeo en segundo plano desde el RPC de origen. La copia local de Surfnet se mantiene sincronizada con mainnet sin que la prueba tenga que realizar sondeos de forma explícita. Combínalo con includeOwnedAccounts para transmitir todos los PDAs propiedad de un programa.

Requiere `remoteRpcUrl`

streamAccount solo funciona en una Surfnet iniciada con remoteRpcUrl (o remote_rpc_url en Rust). Sin un RPC de origen no hay nada que transmitir y la llamada devolverá un error.

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

Constructores de Cheatcode (Rust)

El SDK de Rust expone constructores tipados bajo surfpool_sdk::cheatcodes::builders para los casos en que los métodos de conveniencia no son suficientes. Cada constructor implementa el trait CheatcodeBuilder y se ejecuta mediante cheats.execute(builder).

ConstructorConstructorSetters comunes
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

Para la superficie JS completa, consulta la Referencia JS. Para la superficie Rust completa, consulta la Referencia Rust.

Is this page helpful?

Tabla de Contenidos

Editar Página