Token launches
early:deploysSupported outer Pump and LaunchLab creates.
Early Solana signals
MadeOnSol ShredPrism is a filtered Solana WebSocket feed of supported instruction observations with separately correlated execution outcomes.
Put launches, wallet trades, locks, liquidity and migrations into one workflow. Choose your own wallets, save private lists and follow known tokens across the supported event families.
Included with ULTRA from €131/month. Business and Enterprise inherit access.
Ultra, Business and Enterprise. Solana only. MadeOnSol provides data; your application decides how to use it.
The problem
A launch alert shows only one part of a token's story. A wallet may buy, a pool may change, or a lock instruction may appear next. Bring the supported actions into one feed without mistaking an instruction for a completed transaction.
early:deploysSupported outer Pump and LaunchLab creates.
early:locksInitial supported Streamflow, Jupiter Lock and Bonfida instructions.
early:tradesSupported Pump and PumpSwap buys/sells, with custom wallets or KOL/dev/alpha labels.
early:liquiditySupported PumpSwap pool creation, deposit and withdrawal instructions.
early:migrationsSupported Pump migration v1/v2 instructions.
early:token_changesSupported base SPL Token and Token-2022 actions; extension-only behavior is outside this coverage.
Initial protocol coverage is partial. Unsupported wrappers, CPI/router-only legs and other venues are not inferred. Observations describe instruction intent; later transaction status is separate evidence.
Show me
Request a stream token with an eligible API key, connect to the returned early_ws_url, then send this control after the socket opens. Replace YOUR_WALLET with a valid Solana address.
This watches supported trades by the instruction actor. It is not complete wallet transaction history or a copy-trade execution service.
{
"type": "subscribe",
"sub_id": "my-wallets",
"channels": [
"early:trades"
],
"filters": {
"wallets": [
"YOUR_WALLET"
],
"directions": [
"buy"
]
}
}Keep intent and outcome separate
early:observed starts with unknown execution. early:outcome links through observed_event_id. A successful transaction status does not turn requested amounts into measured swap fills.
Save account-private wallet groups through WS/SDK, edit with revision checks and reuse them after reconnecting.
Combine wallets, mints, protocols and actions; narrow trades by buy/sell direction and exact raw-amount bounds.
The token helper combines the six families for your chosen mint, including quote/input/output mint matches.
Reduce repeated JSON keys while preserving full fields. Full JSON stays the default; compact is a bandwidth trade-off.
Use bounded reconnect, per-subscription checkpoints, awaited handlers and explicit recovery gaps.
Review raw local results below and measure your own client receipt. No fixed millisecond lead is promised.
Measured 8 October 2026 · three separate measurement categories
515 / 515
matched launches reached a customer client before the confirmed firehose
+290 ms
median lead (p95 +459 ms) observed in this benchmark
6 channels
delivered over the public endpoint; launches timed, the other families counted for delivery
One client in the Netherlands (residential ISP, through Cloudflare to madeonsol.com), Node v24.12.0, ws 8.21.3, against early-stream 84ea4aec (six channels). 30 minutes of admission in 3 separate windows. Early observations and the MadeOnSol DEX firehose (Kaldera Yellowstone gRPC, confirmed commitment, successful transactions only) arrived in the same process and were timestamped on one monotonic clock, then matched by transaction signature and slot.
| Compared with | p50 | p95 | p99 | Matched / ref. unmatched | Result |
|---|---|---|---|---|---|
| Processed | Not measured in this run | ||||
| Confirmed | 290.0 ms | 458.9 ms | 1448.9 ms * | 515 / not countable | 100% earlier |
Processed: Not measured on the customer path: our processed-commitment feed is only reachable inside our production network, and a measurement there would not be customer-side.
* p99 is uncertain: uncertain: n=515 (p99 rests on 6 sample(s)).
| Window | Early | Matched | Earlier | p50 | p95 | p99 |
|---|---|---|---|---|---|---|
| Window 1 (08:04 to 08:14 UTC) | 277 | 189 | 100% | 279.1 ms | 448.2 ms | 730.2 ms |
| Window 2 (08:15 to 08:25 UTC) | 221 | 162 | 100% | 303.0 ms | 424.8 ms | 762.7 ms |
| Window 3 (08:27 to 08:37 UTC) | 209 | 164 | 100% | 287.0 ms | 479.3 ms | 1832.2 ms |
192 early launches had no reference match (23 failed on chain, 169 succeeded). Failed launches never appear in the reference, which carries successful transactions only. Successful launches without a developer buy in the create transaction produce no trade frame, the likely reason for the rest (not proven per transaction).
| Sampled early trades | Matched | Earlier | p50 | p95 | p99 |
|---|---|---|---|---|---|
| 41,928 | 9,784 | 99.49% | 297.7 ms | 481.1 ms | 1668.6 ms |
Matched pairs only, from a 1-in-10 sample of pump.fun and PumpSwap transactions. 32,144 sampled early trades and 4,187 reference trades stayed unmatched (early trade intent includes failed instructions; venue tagging and outer-instruction scope differ), so this is not a coverage figure.
| Channel | Observations | Outcomes |
|---|---|---|
| early:trades | 496,191 | 494,708 |
| early:token_changes | 81,661 | 83,305 |
| early:deploys | 813 | 1,782 |
| early:liquidity | 140 | 138 |
| early:migrations | 47 | 47 |
| early:locks | 5 | 5 |
A channel with few or no events in a short window is no sample, not a broken channel or proof of coverage.
0 duplicate observations, 5 gap frames. All gap frames were lookup-table timeouts scoped to the trade-side channels, none for launches. Both sockets dropped once at the same moment (08:27:57 UTC, close code 1006, likely the client network path) and reconnected without resume, so window 3 has a short blind interval.
Download the raw customer measurement. One client, region and window: not a fixed or guaranteed head start.
A probe on our production host consumed the early stream and the confirmed DEX firehose over local ports with one clock. It shows the relative arrival of the two feeds inside our network, without Cloudflare or a customer connection. Per-transaction samples were not kept for these release checks; the file holds the summary distributions.
| Run | Matched | Earlier | Lead p5 | Lead p50 | Lead p95 | Receive to publish p50 |
|---|---|---|---|---|---|---|
| Deploys-only release check after the HTTP/2 flow-control window fix (2c4828ad, deploys) | 98 | 100% | 183 ms | 306 ms | 486 ms | 1 ms |
| Six-channel final validation (84ea4aec, all) | 118 | 100% | 172 ms | 303 ms | 445 ms | 1 ms |
Go-live monitor 2026-10-08T05:55:19Z to 2026-10-08T06:12:55Z: 0 restarts, no gap reasons, receive-to-publish p50 at most 1.981 ms, 511 launches and 312,153 other channel events decoded. Internal host path: no Cloudflare, no WAN, no customer network. Not a customer head start.
| Mode | p50 | p99 |
|---|---|---|
| Sniper / reference codec | 0.402 ms | 1.385 ms |
| Six families / reference codec | 1.753 ms | 3.037 ms |
| Six families / optimized codec | 0.422 ms | 1.060 ms |
300 measured batches, 19,200 unsigned synthetic transactions per mode after 30 warmups, mixed legacy/v0/v1 and identical output hashes for the six-channel modes. Node v24.19.0, INTEL(R) XEON(R) PLATINUM 8573C. Excludes provider transport, worker queues, sockets, real DB/RPC and cold address lookups. This measures decoder work, not the time a user receives a signal.
| Format / checkpoint | Run 1 | Run 2 | Run 3 | Observation bytes |
|---|---|---|---|---|
| Before / full | 73.823 ms | 179.848 ms | 110.826 ms | Not recorded |
| After / full | 54.727 ms | 65.468 ms | 60.448 ms | 3,894,756 |
| After / compact-v1 | 67.557 ms | 63.422 ms | 76.516 ms | 3,221,476 |
| After / mixed | 72.877 ms | 69.947 ms | 62.721 ms | 3,558,116 |
Each run submits eight simultaneous 60-transaction batches to a real worker/gateway/journal, with eight healthy clients plus one paused socket, mock DB/status RPC and no provider or WAN. Timing ends in a separate client message handler, including JSON parsing and compact expansion. All expected healthy-client observations arrived with zero reported gaps. Accounting success does not prove a production latency target; eight batches cannot establish sustained peak capacity.
Compact saved 17.3% of observation bytes in this corpus. Its median of the three p99 samples was 67.557 ms, versus 60.448 ms for full JSON. This is a bandwidth option, not a demonstrated latency improvement. Cold-host variance and all baseline outliers are retained.
The client-side benchmark used the public discovery and WebSocket endpoints from a machine outside our network; the core probe ran on our production host; the local checkpoints ran on a development machine with synthetic input. lead_ms = reference receipt minus early receipt on one monotonic clock; positive means the early observation arrived first. Solscan block timestamps provide chain context, not millisecond receipt evidence.
Try it
Use the developer dashboard for your API key and token discovery. Keep credentials on your backend. This feed requires an active ULTRA+ subscription.
Build outcomes
ULTRA is for internal use. Displaying MadeOnSol data to your own end users requires Business; redistribution and raw resale require Enterprise terms. Compare usage rights
Keep going
FAQ
Next step
Check the evidence, connect your account and choose a narrow subscription.