Viaje en el Tiempo

El runtime de Surfpool expone tres helpers de viaje en el tiempo. Cada uno mueve el reloj local a un objetivo absoluto (no un desplazamiento relativo) y devuelve el EpochInfo actualizado para que las pruebas puedan verificar que el runtime realmente alcanzó el tiempo solicitado.

HelperObjetivoDevuelve
time_travel_to_slot / timeTravelToSlotNúmero de slot absolutoEpochInfo con el nuevo absolute_slot
time_travel_to_epoch / timeTravelToEpochNúmero de epoch absolutoEpochInfo con el nuevo epoch
time_travel_to_timestamp / timeTravelToTimestampMarca de tiempo Unix en milisegundosEpochInfo que refleja el slot implícito

Solo hacia adelante

El viaje en el tiempo solo puede mover el reloj hacia adelante. Llamar a estos métodos con un objetivo en el pasado no tiene efecto — el helper devuelve el EpochInfo actual sin cambios.

Saltar a un Slot

use surfpool_sdk::Surfnet;
let surfnet = Surfnet::start().await?;
let cheats = surfnet.cheatcodes();
let info = cheats.time_travel_to_slot(1_000_000)?;
assert!(info.absolute_slot >= 1_000_000);

Saltar a un Epoch

let info = cheats.time_travel_to_epoch(420)?;
assert_eq!(info.epoch, 420);

Saltar a una Marca de Tiempo Unix

Pasa la marca de tiempo en milisegundos, no en segundos. El runtime calcula el slot más cercano a esa marca de tiempo.

// 2030-01-01T00:00:00Z
let info = cheats.time_travel_to_timestamp(1_893_456_000_000)?;

Patrones Comunes

Probar un Bloqueo o Ventana de Adquisición

El ejemplo a continuación es un esquema — assertWithdrawFails e assertWithdrawSucceeds son marcadores de posición para los helpers del lado del cliente que utilice tu suite de pruebas para verificar el comportamiento de RPC.

import { Surfnet } from "@solana/surfpool";
const surfnet = Surfnet.start();
const beneficiary = Surfnet.newKeypair();
// 1. Set up a vesting account that unlocks at slot 1,000,000.
surfnet.setAccount(/* ...lockup program state... */);
// 2. Verify withdrawal fails before unlock.
await assertWithdrawFails(surfnet.rpcUrl, beneficiary);
// 3. Travel past the unlock slot.
surfnet.timeTravelToSlot(1_000_001);
// 4. Verify withdrawal succeeds.
await assertWithdrawSucceeds(surfnet.rpcUrl, beneficiary);
surfnet.stop();

Ejecutar un escenario de múltiples epoch

Los slot intermedios se omiten

El viaje en el tiempo salta directamente al destino: moverse del epoch 1 al epoch 5 omite los slot intermedios. Si tu programa necesita que se active cada límite de epoch intermedio (por ejemplo, para acreditar recompensas por epoch), llama a time_travel_to_epoch una vez por epoch con las transacciones necesarias entre medias.

for epoch in 2..=5 {
cheats.time_travel_to_epoch(epoch)?;
surfnet.rpc_client().send_transaction(&claim_rewards_tx)?;
}

Estructura de EpochInfo

Ambos SDKs devuelven un objeto con la forma EpochInfo con estos campos:

CampoRustJS
Slot absolutoabsolute_slot: u64absoluteSlot: number
Slot dentro del epochslot_index: u64slotIndex: number
Slot por epochslots_in_epoch: u64slotsInEpoch: number
Número de epochepoch: u64epoch: number
Altura del bloqueblock_height: u64blockHeight: number
Recuento de transaccionestransaction_count: Option<u64>transactionCount?: number

Is this page helpful?

Tabla de Contenidos

Editar Página