Backtesting Solana

Testez votre stratégiesur la chaîne qui a eu lieu.

Replay recorded Solana mainnet through your existing Yellowstone gRPC client. Same protocol, same ordering, 100μs precision. Apache-2.0.

Pourquoi le replay historique

Le mainnet est le seul backtest honnête.

Le devnet n'a ni MEV, ni congestion, ni vrais adversaires. Les simulateurs maison s'éloignent du comportement du validateur dès qu'un nouveau programme touche un nouvel edge case.

Sillage records mainnet as it was delivered — every account write, every transaction, every block — and streams it back through the same protocol your live bot already speaks. The chain that happened, on demand, at the timing it happened.

Comment ça marche

Trois étapes depuis une subscription live.

  1. 01
    Pointez votre client sur un endpoint sillage.

    Même Yellowstone gRPC, même SubscribeRequest, mêmes filtres. sillage.sh parle le protocole côté serveur.

  2. 02
    Pass a starting slot from the recorded window.

    Le stream démarre là et se rejoue à vitesse réelle, avec l'ordre intra-slot préservé à 100 microsecondes.

  3. 03
    Iterate without holding a live subscription open.

    Re-run the same window as many times as your tuning loop needs. The input never changes, so a difference in output is a difference in your code.

Drop-in

yellowstone-grpc-client, inchangé.

Seuls l'endpoint et le slot de départ changent. Votre SubscribeRequest, vos filtres et votre handling de messages restent intacts.

Backtest replay
let mut client = GeyserGrpcClient::build_from_shared(
    "https://replay.sillage.sh",
)?
    .x_token(Some(api_key))?
    .connect()
    .await?;

let req = SubscribeRequest {
    // any slot within the last 24 hours
    from_slot: Some(312_847_201),
    transactions: hashmap! {
        "swaps".into() => SubscribeRequestFilterTransactions {
            account_include: vec![JUPITER_V6.into()],
            ..Default::default()
        },
    },
    ..Default::default()
};

let (_, mut stream) =
    client.subscribe_with_request(Some(req)).await?;

while let Some(msg) = stream.next().await {
    handle(msg?);
}
Questions

Questions people ask first.

How do I get an endpoint?

Run one. Clone the repo and start a reader against a window you have recorded, or against the published sample archive. There is also a live demo endpoint at replay.sillage.sh if you want to see it working before setting anything up.

Faut-il changer le code de mon client ?

Non. sillage.sh parle le protocole Yellowstone gRPC côté serveur. Pointez votre client existant sur le nouvel endpoint et passez un slot de départ — votre SubscribeRequest, vos filtres et votre handling de messages fonctionnent tels quels.

À quel point le replay est-il précis ?

Chaque message porte le timestamp de sa réception lors de la capture live, préservé à 100 microsecondes près. L'ordre intra-slot, les délais de propagation et la texture du temps réseau réel sont rejoués tels qu'ils ont eu lieu.

How much history can I replay?

Whatever you record. Sillage is the recorder as well as the player — point the writer at a Geyser source for as long as you want history, and the reader serves exactly that back.

En quoi est-ce différent de faire tourner mon propre RPC ?

Un RPC vous donne des requêtes à la demande ; il ne vous donne pas un stream rejouable et ordonné dans le temps de chaque écriture de compte d'hier. sillage.sh oui, via le protocole auquel votre bot est déjà branché.

How does this compare to a live Yellowstone provider?

Helius, Triton, and QuickNode all stream the chain forward beautifully. None of them let you replay a specific past window through the same protocol, and none of them are something you can run yourself. That's the inverse Sillage was built for.

Backtest the real chain.

Clone it, run it, or try the live endpoint.