LiteSVM Docs

Time-Based Testing

Test features that depend on slots or timestamps

Overview

This example shows how to test time-dependent features by manipulating slots and timestamps in LiteSVM.

Complete Test

tests/time_test.rs
use litesvm::LiteSVM;
use solana_sdk::clock::Clock;

#[test]
fn test_time_locked_feature() {
    let mut svm = LiteSVM::new();

    // Get current time
    let clock: Clock = svm.get_sysvar();
    println!("Starting slot: {}", clock.slot);
    println!("Starting timestamp: {}", clock.unix_timestamp);

    // Test something at current time
    // ... your test logic ...

    // Jump forward 100 slots
    svm.warp_to_slot(clock.slot + 100);

    // Verify time changed
    let new_clock: Clock = svm.get_sysvar();
    assert_eq!(new_clock.slot, clock.slot + 100);

    // Test time-locked feature is now available
    // ... your test logic ...

    println!("Time travel successful!");
}

Testing Slot-Based Features

#[test]
fn test_slot_based_unlock() {
    let mut svm = LiteSVM::new();

    // Get starting slot
    let start_slot = svm.get_sysvar::<Clock>().slot;

    // Deploy program with slot-based lock
    let program_id = deploy_locked_program(&mut svm);

    // Try to call before unlock slot (should fail)
    let result = call_program(&mut svm, program_id);
    assert!(result.is_err());

    // Warp to unlock slot
    svm.warp_to_slot(start_slot + 1000);

    // Now it should succeed
    let result = call_program(&mut svm, program_id);
    assert!(result.is_ok());
}

Testing Timestamp-Based Features

#[test]
fn test_timestamp_based_feature() {
    let mut svm = LiteSVM::new();

    // Get current timestamp
    let clock: Clock = svm.get_sysvar();
    let current_time = clock.unix_timestamp;

    // Warp forward 1 hour (3600 seconds)
    let target_slot = clock.slot + (3600.0 / 0.4) as u64; // ~0.4s per slot
    svm.warp_to_slot(target_slot);

    // Verify timestamp increased
    let new_clock: Clock = svm.get_sysvar();
    assert!(new_clock.unix_timestamp >= current_time + 3600);
}

Key Points

  1. Clock Sysvar: Use svm.get_sysvar::<Clock>() to get current time
  2. Slot Warping: Use warp_to_slot() to jump forward in time
  3. Timestamp Calculation: Slots roughly correspond to ~0.4 seconds on Solana
  4. Testing Unlocks: Test time-locked features by warping past the unlock time
  5. No Going Back: You can only warp forward, not backward in time

Common Use Cases

  • Vesting schedules
  • Time-locked withdrawals
  • Stake/unstake cooldown periods
  • Auction end times
  • Rental periods