Zamana Dayalı Test

warpToSlot kullanarak zamana bağımlı program mantığını test etmeyi gösterir.

Temel Saat Manipülasyonu

import { createClient, generateKeyPairSigner } from "@solana/kit";
import { litesvm } from "@solana/kit-plugin-litesvm";
import { signer } from "@solana/kit-plugin-signer";
const mySigner = await generateKeyPairSigner();
const client = createClient().use(signer(mySigner)).use(litesvm());
// Enable sysvars for clock access
client.svm.withSysvars();
// Check initial clock
const initialClock = client.svm.getClock();
console.log("Initial state:");
console.log(" Slot:", initialClock.slot);
console.log(" Epoch:", initialClock.epoch);
console.log(" Unix timestamp:", initialClock.unixTimestamp);
// Warp to slot 1000
client.svm.warpToSlot(1000n);
const afterWarp = client.svm.getClock();
console.log("\nAfter warpToSlot(1000):");
console.log(" Slot:", afterWarp.slot);
console.log(" Epoch:", afterWarp.epoch);
// Warp further
client.svm.warpToSlot(100000n);
const afterWarp2 = client.svm.getClock();
console.log("\nAfter warpToSlot(100000):");
console.log(" Slot:", afterWarp2.slot);
console.log(" Epoch:", afterWarp2.epoch);

Zaman Kilitli Mantığı Test Etme

Zaman kilitli işlevselliği test etmek için örnek kalıp:

import {
createClient,
address,
generateKeyPairSigner,
lamports
} from "@solana/kit";
import { litesvm } from "@solana/kit-plugin-litesvm";
import { signer } from "@solana/kit-plugin-signer";
const mySigner = await generateKeyPairSigner();
const client = createClient().use(signer(mySigner)).use(litesvm());
client.svm.withSigverify(false).withBlockhashCheck(false).withSysvars();
// Fund payer
client.svm.airdrop(client.payer.address, lamports(10_000_000_000n));
// Set up a time-locked vault account
// Structure: [u8 discriminator, u64 unlock_slot, u64 amount]
const unlockSlot = 10000n;
const lockedAmount = 5_000_000_000n;
const vaultData = new Uint8Array(1 + 8 + 8);
const view = new DataView(vaultData.buffer);
vaultData[0] = 0x01; // discriminator
view.setBigUint64(1, unlockSlot, true); // unlock_slot
view.setBigUint64(9, lockedAmount, true); // amount
const programId = address("TimeLockedVault11111111111111111111111"); // replace or generateKeyPairSigner()
const vaultAddress = address("Vault111111111111111111111111111"); // replace or generateKeyPairSigner()
const minBalance = client.svm.minimumBalanceForRentExemption(
BigInt(vaultData.length)
);
client.svm.setAccount({
address: vaultAddress,
data: vaultData,
executable: false,
lamports: lamports(minBalance + lockedAmount),
programAddress: programId,
space: BigInt(vaultData.length)
});
console.log("Vault created with unlock slot:", unlockSlot);
console.log("Locked amount:", Number(lockedAmount) / 1e9, "SOL");
// Test 1: Try to withdraw before unlock (should fail)
console.log("\n--- Test 1: Before unlock ---");
const currentClock = client.svm.getClock();
console.log("Current slot:", currentClock.slot);
// In a real test, you would:
// 1. Build a withdraw instruction
// 2. Send it and expect it to fail
console.log("Withdrawal attempt: EXPECTED TO FAIL (too early)");
// Test 2: Warp to after unlock slot
console.log("\n--- Test 2: After unlock ---");
client.svm.warpToSlot(unlockSlot + 100n);
const newClock = client.svm.getClock();
console.log("Current slot:", newClock.slot);
// In a real test:
// 1. Build a withdraw instruction
// 2. Send it and expect it to succeed
console.log("Withdrawal attempt: EXPECTED TO SUCCEED (after unlock)");
// Verify vault state
const updatedVault = client.svm.getAccount(vaultAddress);
if (updatedVault.exists) {
console.log("\nVault balance:", updatedVault.lamports);
}

Epoch Programını Okuma

Kümedeki slot/epoch ilişkisini anlamak için epoch programını okuyabilirsiniz:

import { createClient, generateKeyPairSigner } from "@solana/kit";
import { litesvm } from "@solana/kit-plugin-litesvm";
import { signer } from "@solana/kit-plugin-signer";
const mySigner = await generateKeyPairSigner();
const client = createClient().use(signer(mySigner)).use(litesvm());
client.svm.withSysvars();
const epochSchedule = client.svm.getEpochSchedule();
console.log("Slots per epoch:", epochSchedule.slotsPerEpoch);
console.log("First normal epoch:", epochSchedule.firstNormalEpoch);
console.log("First normal slot:", epochSchedule.firstNormalSlot);

warpToSlot, saatin slot alanını ilerletir ancak epoch veya unixTimestamp alanlarını otomatik olarak güncellemez. Saat alanları üzerinde tam kontrol için setClock kullanın.

Manuel Saat Manipülasyonu

Programınız Clock sysvar'ından epoch veya unix_timestamp okurken, bu alanları doğrudan ayarlamak için setClock kullanın:

import { createClient, generateKeyPairSigner } from "@solana/kit";
import { litesvm } from "@solana/kit-plugin-litesvm";
import { signer } from "@solana/kit-plugin-signer";
const mySigner = await generateKeyPairSigner();
const client = createClient().use(signer(mySigner)).use(litesvm());
client.svm.withSysvars();
// Get clock, mutate, write back
const clock = client.svm.getClock();
clock.slot = 50000n;
clock.epoch = 5n;
clock.unixTimestamp = 1700000000n;
client.svm.setClock(clock);
const after = client.svm.getClock();
console.log("Slot:", after.slot); // 50000n
console.log("Epoch:", after.epoch); // 5n
console.log("Timestamp:", after.unixTimestamp); // 1700000000n

Bu, Rust'taki set_sysvar(&clock) kalıbını yansıtır. Basit slot ilerlemesi için warpToSlot, epoch veya zaman damgası kontrolüne ihtiyaç duyduğunuzda setClock kullanın.

Kullanım Senaryoları

Zaman manipülasyonu aşağıdakileri test etmek için kullanışlıdır:

SenaryoYaklaşım
Token vestingVesting eşiğini/kilometre taşlarını geçmek için ileri sarın
Açık artırma bitişleriAçık artırma bitiş slot'unu geçmek için ileri sarın
Staking ödülleriepoch ayarlamak için setClock kullanın
Zaman kilitli çekimlerKilit açma slot'unu geçmek için ileri sarın
Hız sınırlamaİzin verilen aralıklar arasında ileri sarın
Süresi dolan emirlerEmir son kullanma tarihini geçmek için ileri sarın

warpToSlot yalnızca slot'u değiştirir. Unix zaman damgası, SVM uygulamasına bağlı olarak orantılı biçimde güncellenmeyebilir.

Önemli Noktalar

  1. Sysvar'ları Etkinleştirin: Saat metodlarını kullanmadan önce withSysvars() çağırın
  2. İleri Sarın: Slot'u ilerletmek için warpToSlot(slot) kullanın
  3. Tam Kontrol: epoch, unixTimestamp veya diğer saat alanlarını ayarlamanız gerektiğinde setClock kullanın
  4. Saati Okuyun: Mevcut slot, epoch ve zaman damgasını okumak için getClock() kullanın
  5. Test Kalıbı: Zaman sınırlarından önce ve sonra test edin

Is this page helpful?

İçindekiler

Sayfayı Düzenle
© 2026 Solana Vakfı. Tüm hakları saklıdır.