๐Ÿ“š Documentation

What PONSv2 Sniper does, what every filter means, and why the defaults are what they are.

OverviewShadow modeHow a snipe worksTasksEntryFiltersPositionsLaunch journalWallets & custodyFAQ

Overview

PONSv2 Sniper watches wallets on Robinhood Chain and acts on what they do. It runs two kinds of task, and the difference is what the watched wallet is doing:

They read different feeds and are judged by different filters, so a task is one or the other and cannot be switched after it is created.

Almost every default in this product is a replayed measurement rather than a round number. Where that is the case, the hint next to the field says what was measured and on what. If a default looks arbitrary, check the hint before changing it โ€” several of the obvious adjustments (a tighter stop, a turnover-based daily limit) were tried and were worse.

Shadow mode

When the amber Shadow mode banner is showing, the engine does everything except send: it reads the feed, evaluates every task, decides, and writes the decision to the journal โ€” but no transaction is built and no funds move. Positions recorded in this mode are what the engine would have entered.

This is the intended way to bring a new task up. Point it at the wallets you care about, leave it for a day, and read the journal: you will see what it would have bought and, more usefully, what it would have refused and why.

Shadow mode is a property of the whole deployment, not of a task. When the banner is green and reads Live, every active task is spending real funds.

How a snipe works

Worth understanding before tuning anything, because it explains why some filters are free and others are not.

The snipe tax is a clock, not a fee

A new launch charges a tax on buys that starts near 99% and decays to zero over about three seconds. It does not decay smoothly โ€” it steps down on whole seconds of the block timestamp. So the price you pay is decided by which second your transaction lands in, not by how many milliseconds you saved:

The engine therefore does not race to be as early as possible. It aims at a specific second boundary and puts several transactions across it, so that one of them is the first buy in the first cheap block. Being 200 ms earlier inside the same second buys nothing; being 80 ms late costs an entire tax step.

Being first in the block is most of the edge

Measured

Across 38 buys where the position in the entry block was recorded: entering as the first buyer after the dev averaged +20.7% ROI at a 68% win rate. Entering with anyone ahead of us averaged โˆ’9.3% at 43%. The Positions table shows this per position, in the Entry column.

Why filter order matters

One launch fans out to every task watching that dev, and each has to be decided before the boundary arrives. So filters are ordered by what they cost:

The post filters are in the free tier, which surprises people. The post link is embedded in the launch transaction itself, and the post id encodes its own creation time โ€” so authorship and age are known without ever calling the social network.

Tasks

A task is a set of watched wallets, a wallet to trade from, a filter stack and an exit rule. It is created as a draft: you can build it, save it, look it over, and nothing happens until you press Start.

Watched wallets are shared across the platform. One dev address is watched by many tasks and has one history, which is what makes the dev probe worth anything โ€” a dev's record does not restart every time somebody new starts watching them.

Measured

Fill in the X handle when you add a dev, even though it looks like a label. It is a second key: 7 of 48 handles in the source journal run more than one dev wallet, and one shared launcher wallet appears alongside nine different handles. Scoring a dev by handle was worth +0.20 ETH walk-forward, by wallet +0.29, and by both together +0.36.

Config epochs

Every task carries a config_epoch. Changing a filter or an exit rule bumps it, and each position records the epoch it was opened under. This exists so that trades made under different settings are never averaged together โ€” without it, a take-profit change halfway through a day quietly poisons every statistic that day produces.

What the statuses mean

Entry

Buy amount is the native amount spent per entry. The dev probe can reduce it for devs with a losing recent record, and a position entered that way is flagged as a probe so the two sizes never get averaged together.

Slippage is in basis points โ€” 500 means 5%. Note that the snipe tax is not slippage: it is a separate, declining fee with its own gate, and raising slippage will not get you past it.

Filters

Grouped the same way in the task form and here. Blank almost always means โ€œoffโ€.

Throughout, an unknown value does not block a trade โ€” unknown is not the same as a violation, and treating it as one would reject every genuinely fresh token. The exception is the safety group, where unverified is treated as unsafe.

B ยท Launch event

Decided from the factory event alone. No extra call, so these cost nothing and run first.

Measured

A missing quote route was, on its own, the largest single source of missed launches in the source journal โ€” 15 of 34 arms on one day, more than every other rejection combined. The engine now discovers and caches routes ahead of time, which is why that is no longer a filter you have to set.

C ยท Post check

The launch calldata carries the post that announced it. Because the post id encodes its own creation time, the engine knows who wrote it and how old it is without a single network call โ€” so these run in the free tier, before the send is even prepared.

Measured

Over 479 trades: launches carrying no post link averaged โˆ’17% at a 33% win rate. Launches quoting someone else's post averaged โˆ’4.1% at 33%. Launches with the dev's own post averaged +15.6% at a 68% win rate. Requiring the dev's own post is the single strongest social filter in the product.

Measured

A post more than 15 seconds stale at the moment of the launch averaged โˆ’30% and produced no runner at all. The attention it was going to get has already been spent.

Min post length is a proxy for effort, defaulting to 35 characters. It is a blunt one: a handful of handles do consistently well on very short posts, which is what per-handle overrides are for.

E ยท The target's trade (copy trade)

A ยท Dev probe

Devs go through streaks. The probe sizes down on a dev whose recent launches lost money instead of dropping them, and gives the full size back when they recover.

With the defaults: once a dev has at least 5 closed trades, if the sum of their last 10 is negative, entries on them are cut to 20% of the configured amount. Three consecutive profitable probes restore full size and wipe the slate.

Measured

Walk-forward over the journal, the probe was worth +0.36 ETH against flat sizing โ€” and most of that came not from avoiding the losses but from still being there when the dev recovered. A blacklist would have missed that.

D ยท Safety gates

Enforced by the engine on every entry and not configurable per task. They are shown in the task form read-only, because a gate you do not know about looks like a bug when it stops a trade.

F ยท Risk limits

Measured

The drawdown cap counts net loss, not turnover, and that distinction is not academic. A turnover-based cap once silenced the source sniper for five hours: 12 trades had cycled 0.960 ETH and returned 0.907 โ€” a real loss of 0.053 โ€” and the 1.0 turnover limit fired.

G ยท Exit

Exits are checked in a fixed order on every tick. The order is part of the contract, not an implementation detail: several conditions usually hold at once, and whichever fires first is the reason recorded against the position.

  1. Force exit โ€” a late verdict on the post, or the discovery that we were not first in the block.
  2. Hard cap โ€” the absolute holding-time backstop.
  3. Target exited โ€” copy trade only, when they sell.
  4. Take profit
  5. Stop loss
  6. Trailing stop
  7. Timer

Two consequences worth knowing. A stop tighter than the trailing stop means the trail can never fire. A hard cap shorter than the timer means the timer can never fire. The task form warns about both rather than silently letting you believe otherwise.

Measured

Over 144 replayed curves: no stop summed to +3.29 ETH, a 15% stop to +11.38. Tighter is not better โ€” the median first mark after entry is ร—0.92 from fees and our own impact alone, so a 10% stop mostly sells the cost of entering. A 20% stop gave +9.62 and a 30% stop +6.75.

The hard cap deserves its position at number two. It is the backstop for a position whose price feed has gone quiet โ€” which is exactly the situation in which every other exit is unable to fire.

Positions

Open positions are marked live as a multiple of the entry price. The Entry column shows where in the block the buy landed โ€” first means first after the dev, which is the outcome the whole boundary strategy is aiming at.

Expanding a position shows one row per send, not per trade. A spray puts several transactions across the second boundary deliberately, so a handful of dropped rows next to one landed row is the system working, not failing. The Offset column is milliseconds relative to the boundary the engine was aiming at.

Sell all and 50% exit by hand at any time. Positions survive a restart of the service: they are reloaded from the database along with their exit rules, so a deploy in the middle of a trade does not leave a token unattended.

Launch journal

Every launch the engine sees is recorded โ€” bought, skipped, or dropped by a filter โ€” with the filter that made the decision.

This is not a debug log, and it is the most useful page for tuning a task. A filter whose rejections were never written down cannot be re-checked afterwards, only argued about. Every measured claim in this documentation came out of a journal exactly like this one.

The Why nothing fired breakdown at the top of the page answers the most common question about any task that is quieter than expected. If one filter accounts for most of the rejections, that is the filter to reconsider.

Wallets & custody

A task trades from a wallet held by the service. The private key is encrypted with AES-256-GCM at rest, is never returned by any endpoint, and never reaches the browser again after you submit it.

The service can therefore sign without you. That is what makes sniping possible at all โ€” there is no time to approve anything inside a one-second window โ€” but it is a real trade-off, and it is stated plainly rather than buried. Fund these wallets with what a task is meant to trade, and nothing else.

Prefer generating a key over importing one. A generated key has never existed anywhere else, so it cannot have been copied from a machine you no longer trust.

Your own trading contract

By default a wallet trades through a shared router, which takes 1% on the way in and 1% on the way out.

Measured

On the source journal over three days, that 1%+1% came to roughly 0.80 ETH out of 3.22 ETH net โ€” about a quarter of the result. Deploying your own contract removes it entirely, and the address goes in the wallet's Own trading contract field.

One wallet, many tasks

A wallet can serve several tasks, and they share its nonce sequence. That is handled for you, but it is the reason a wallet cannot be removed while a task still points at it โ€” the error message names the tasks that are in the way.

FAQ

My task is active but has bought nothing.

Open the launch journal and read the Why nothing fired breakdown. In practice it is almost always one of three things: the watched wallets have not launched anything, the post filters are rejecting launches that carry no link, or a risk limit is already reached for the day.

Why did it skip a launch that went on to run?

The journal records the reason against that specific launch. Note that filters are judged on averages over hundreds of trades โ€” a filter that costs you one good launch while avoiding twenty bad ones is doing its job, and the journal is how you check that ratio rather than reacting to the one you remember.

Can I raise slippage to get past the snipe tax?

No. They are different mechanisms. The tax is charged by the launch contract and declines on its own schedule; slippage only governs how far the execution price may move. The engine waits for the tax to step down instead.

What happens to open positions if I stop a task?

They stay open and keep their exit rules โ€” take profit, stop, timer and hard cap all still fire. Stopping a task prevents new entries; it does not abandon existing ones. To close one immediately, sell it by hand from the Positions page.

What happens if the service restarts while I have a position open?

Positions are reloaded from the database with their exit rules intact. This is called out explicitly because the single-user sniper this product is built on did not do it, and a restart there left tokens unattended.

Why can I not change a task from snipe to copy trade?

They read different feeds and are decided by different filters โ€” a launch event and a swap are not the same thing. Create a second task instead; they can share a wallet.