Bot Titles
PLS-V1V2-ARB-V2Performance So Far
PLS-V1V2-ARB-V2Recent Fire Attempts
PLS-V1V2-ARB-V2Token Reverters (24h)
PLS-V1V2-ARB-V2Biggest Block
PLS-V1V2-ARB-V2Biggest block (2026-06-16): a structural latency disadvantage on the V1↔V2 niche — not a broken bot. The opportunity it hunts (same token cheaper on PulseX V1 than V2, atomic buy-low/sell-high in one tx) is real and shows up in the scan, but it is a crowded lane: a faster competitor ("The Machine", 0x82cd9533…) sits on the identical V1↔V2 routes with a pre-warmed custom contract and almost certainly private-mempool inclusion, so by the time our public broadcast lands the spread is gone or the pool has moved (K-invariant revert). That is why a healthy-scanning bot can sit at ~0 broadcasts for long stretches — the gate is correctly refusing to fire into a race it will lose at a gas-only loss.
What was actually broken (and is now fixed, 2026-06-16 hardening): the bot had been built WITHOUT the champion's safety scaffolding, so it mis-fired and burned gas. Six fixes shipped: (A) ethers-v5 tx.wait() throws CALL_EXCEPTION on a mined-but-reverted tx instead of returning status===0 — the catch now recovers the receipt and books the gas as a real loss (previously every revert silently bypassed both fail-safes); (B) sims now run against the pending block with a real gasLimit, not the head block (head-block sims false-passed ~99.6%); (C) a fat-margin gate (sim NET must clear gas×2 after a 55% sim-drift haircut) so it only fires trades fat enough to survive the latency gap; (D) a per-token revert-bench (3 reverts → 6h bench) so it stops re-firing a token that keeps losing; (E) free reverts / send-errors that cost no on-chain gas are NOT counted toward the daily-loss halt or breaker; (F) an owner==wallet boot check before it ever ARMs. Daily-loss halt 5K WPLS; notional probation cap 25K.
2026-07-02 — revived on its own stack, coupling removed: the bot now runs a DEDICATED wallet (0xfc7E301D) + DEDICATED PulseAtomicArb (0xe9e93586, funded 500K WPLS), so the shared-wallet nonce-coupling that caused the 06-21 pause (it was starving the champion) is gone — and 16 of its historical failures were exactly that shared-wallet nonce-stomp class, which is now eliminated.
The genuine remaining lever is the same as the champion's: this is WPLS profit on a tiny book, and we're racing a faster incumbent on a public mempool. It now dual-broadcasts through our local sentinel node (partial inclusion-latency help), but to fully win this niche we'd need private/bundle submission (PulseChain has no Flashbots equivalent) or a pre-warmed contract + colocated node — neither justified at current capital. It runs hardened, fires only the rare fat winners, and we measure whether even those land vs The Machine.
Fantasy
PLS-V1V2-ARB-V2If our V1↔V2 fire could reach a PulseChain validator the same way the competitor "The Machine" (0x82cd9533) almost certainly does — top-of-block, before the public mempool sees it — the structural disadvantage that makes us lose nearly every race would vanish, and the fat gaps our gate already finds would actually LAND instead of reverting on a closed spread. The whole edge on this niche is inclusion speed, not trade cleverness; whoever the block builder includes first wins, full stop. The closest real-world thing accessible to us: pulse-sentinel already peers with PulseChain nodes via devp2p and can dual-broadcast through rpc.pulsechain.box — porting the champion's multi-RPC first-accept-wins racer here is the cheap first step. The true unlock is a private-builder/preconf relationship that bypasses the public gas auction entirely, but PulseChain has no Flashbots-equivalent relay market yet, so there is no clean API to buy this today. Until that exists (or we run a colocated node with a pre-warmed contract like the incumbent does), the honest ceiling on this bot is "win the occasional gap fat enough that even a slower public broadcast still lands" — which is exactly what the fat-margin gate is now tuned to catch.
Suggestions for Improvement
PLS-V1V2-ARB-V2- 01HIGHMeasure whether the fat fires that DO clear the gate actually LAND vs the competitor — this is the make-or-break question. Now that the trade log is wired, let it run until it fires a handful of times, then read logs/pulse-v1v2-bot-trades.ndjson: if our fat-margin fires still revert (lost the race to 0x82cd9533) or land at a loss, the niche is structurally unwinnable on the public mempool and we should retire the slot. If they land green, scale the cap. Decide on DATA, not on the 0-fire scan state.
- 02HIGHThe only winnable axis here is latency/inclusion, not a smarter trade (the edge is the competitor's, and it is structural — faster inclusion + pre-warmed contract + likely private mempool). Concretely: (a) port the champion's multi-RPC parallel broadcast (sign once, fan out to all 4 PLS RPCs, first-accept wins) to shave the broadcast leg; (b) investigate any private/bundle inclusion path on PulseChain (devp2p via rpc.pulsechain.box is the closest thing — see Fantasy). Without an inclusion edge, no parameter tuning makes this bot win the race.
Conclusion
PLS-V1V2-ARB-V2Recalibrated 2026-07-04: now honestly instrumented, and the first clean data is sobering. Added reason-split counters (which check filters each opportunity) + live-priced gas + a shorter re-look interval + RPC auto-pick/watchdog, all behind env flags. First honest read: at correctly-priced gas, ~80% of evaluations have NO edge at all, and every gate-block is simple de-duplication — i.e. the niche may just be too thin at our size, not mis-tuned. A latent stale-nonce relic (shared-wallet leftover) also had to be retired today; its floor file had pinned the champion's sends for hours. Likely near-term call after a day of data: fold this into the champion or drop it to maintenance. Prior verdict below.
Verdict (updated 2026-07-02): LIVE on its OWN stack — the revival was done properly. This V1↔V2 direct-pool bot (pulse-v1v2-bot.js, tmux pulse-v1v2-live) targets the measured ~$15-23K/day long-tail V1↔V2 pool. It was PAUSED on 2026-06-21 because it shared the champion's wallet + contract and, once it started firing, starved the champion (champion trades collapsed 24→2/day in lockstep). On 2026-07-02 (Chef-approved) it was revived the right way: its OWN dedicated wallet (0xfc7E301D) + its OWN PulseAtomicArb contract (0xe9e93586, owner = the v1v2 wallet, funded 500K WPLS from idle champion-EOA reserve). No shared nonce, no V1V2_COORD, zero collision risk — it can never starve the champion again. The 2026-06-16 hardening carries over: pending-block simulation, a fat-margin gate (net ≥ ~2× gas after a 55% haircut), per-token revert-bench, fixed fail-safe accounting, and an owner==wallet boot check — now running at a tight 25,000-WPLS probation cap with a 5,000-WPLS daily-loss halt. It also dual-broadcasts through the local sentinel for faster inclusion. It scans ~1k opps/5min but fires rarely BY DESIGN.
History: the predecessor cross-family build last traded 2026-05-09 and was swept in a May consolidation. Live-since-06-16 on the shared wallet: 4 wins / 42 reverts / 16 timeouts, −4,577 WPLS realized — but 16 of those were shared-wallet nonce-stomp timeouts (now eliminated) and the rest were the pre-hardening day-one bleed. The dedicated stack begins with a clean slate.
State on this page: LIVE in tmux pulse-v1v2-live at the 25K probation cap, 0 fires since the revival (~97-98% of scanned opps are correctly gate-blocked; last actual fire was 2026-06-24 on the old shared contract). The make-or-break question is unchanged: when a fat gap DOES clear the gate, does our public-mempool fire LAND vs the faster incumbent (The Machine, 0x82cd9533), or revert on latency? The per-trade Execution Funnel + Per-Size Breakdown stay empty until that first fire on the new stack — decide scale-vs-retire on that data, not on the 0-fire scan state.
Active Tests & Monitors
PLS-V1V2-ARB-V2Compromises
PLS-V1V2-ARB-V2| Decision | Aggressive ← | Current Position | → Conservative | Notes |
|---|---|---|---|---|
| Fat-margin fire gate (MIN_LIVE_NET ≥ 2× gas, 55% sim haircut) | Aggressive · fire thin gaps, more reverts | Conservative · only fat, clearly-winnable gaps | The core 2026-06-16 hardening. The old build fired on thin edges and burned gas; now a candidate must clear ~2× gas in NET after a 55% sim-drift haircut. This is WHY the bot scans constantly but fires rarely — by design. Sits well to the conservative end on purpose while we prove it lands. | |
| Per-trade notional cap (LIVE_MAX_NOTIONAL = 25K WPLS) | Small · bounded per-fire loss | Large · bigger absolute wins, bigger revert pain | Reset to the 25K probation default on the 2026-07-02 dedicated-stack revival (was 100K in the shared-wallet era). The dedicated contract holds 500K WPLS so capital is not the limit; this is a deliberately tight per-fire risk ceiling while we re-prove the bot lands on its own wallet. Raise back toward 100K only after a clean win record on the new stack. | |
| Simulation block (PENDING + gasLimit, fix B) | Head block · fast but lies about live state | Pending block · accurate, slightly slower | Old build simmed against the head block and false-passed ~99.6%. Now sims against the PENDING block with a real gas limit so the sim reflects what the tx will actually hit. Correctness over speed — the single biggest misfire fix. | |
| Fail-safe accounting (mined reverts count, gas-free do not — fixes A+E) | Count every revert · over-trips the breaker | Count only real-cost reverts · honest leash | ethers v5 THROWS CALL_EXCEPTION on a mined-but-reverted tx; the old catch silently bypassed both fail-safes. Now the catch recovers the receipt and books the gas as a real loss (counts toward breaker + daily-loss halt). Gas-free send-errors/reverts are explicitly excluded (Chef's directive) so a free revert never trips a halt. | |
| Per-token revert bench (3 reverts → 6h, fix D) | Permissive · keep retrying any token | Strict · bench repeat-reverters fast | A token that reverts 3× is benched 6h so the bot stops re-burning gas on it every 60s. A win clears the count. Leans strict because the failure mode we are fixing is exactly repeated gas-burn on a token that will not land. | |
| Mempool stance (public RPC, racing a faster incumbent) | Public · visible, frontrun-able, lose races | Private relay · hidden until inclusion | We broadcast on the public PulseChain mempool. The competitor "The Machine" (0x82cd9533) runs the same V1↔V2 routes with a pre-warmed contract + likely private inclusion, so we lose most head-to-head races by design. PulseChain has no Flashbots equivalent — this is the structural disadvantage (see Biggest Obstacle + Fantasy). Sits far left until/unless private inclusion is built. | |
| Dedicated wallet + contract (isolated from the champion) | Isolated · own wallet/contract, zero collision risk | Shared · reuse proven funded infra, must coordinate | FLIPPED 2026-07-02: the bot now runs its OWN wallet (0xfc7E301D) + its OWN PulseAtomicArb (0xe9e93586, funded 500K WPLS), deployed with the v1v2 wallet as owner. V1V2_COORD nonce-coordination is GONE — no shared-nonce lock, zero collision risk with the champion. This is the fix that let the bot be revived: the shared-wallet era (until 06-21) starved the champion, and 16 of its historical timeouts were shared-nonce stomps that this eliminates. Fix F owner==wallet boot-check still guards it. | |
| Daily-loss halt (5K WPLS) | Tight · hard daily risk leash | Loose · room to test without nuisance halts | Reset to the 5K default on the 2026-07-02 revival (was raised to 10K in the shared-wallet testing era). Realized losses in a UTC day hitting 5K halts the bot to midnight. Gas-free reverts excluded so only real realized losses count toward it. Tight on purpose while we re-prove the dedicated stack. |
Parameters
PLS-V1V2-ARB-V2| Parameter | Value | Reasoning | Potential Adjustment(s) |
|---|---|---|---|
| LIVE_MAX_NOTIONAL_WPLS | 25,000 WPLS | Per-trade notional cap (env-set). Reset to the 25K probation default on the 2026-07-02 dedicated-stack revival (was 100K in the shared-wallet era). The dedicated contract (0xe9e93586) holds 500K WPLS so capital is not the constraint — this is a deliberately tight per-fire risk ceiling while the bot re-proves itself on its own wallet. | Hold at 25K until we see fat trades actually land vs the competitor on the new stack. Raise toward 100K only once a clean win record exists. |
| MIN_LIVE_NET_WPLS (fat-margin gate) | 400 WPLS (= GAS_WPLS × 2) | Fix C, the core anti-misfire gate: a candidate must clear ~2× the gas cost in NET profit AFTER the 55% sim-drift haircut before it fires. This is what makes the bot "fire rarely by design" — thin edges that the old build burned gas on are now rejected here. | Raise the multiple (3-4× gas) if even the fat fires lose the race and revert. Lower toward 1.5× only after a proven clean-landing streak. |
| SIM_DISCOUNT_PCT | 55% | Sim over-predicts net (same as the champion's 0.55). The live gate is applied to sim_net × 0.55, so the on-chain reality has to be comfortably above gas even after the haircut. Tunable via env. | Tighten toward 45-50% if landed nets keep coming in below sim. Loosen toward 65% only if sims prove accurate over many fires. |
| GAS_WPLS (per-trade gas assumption) | 200 WPLS | The deployed PulseAtomicArb runs a full 2-hop in ~181.7K gas units (traced 2026-06-12), ≈185 WPLS at champion-era gas prices; 200 is the rounded working figure that feeds the fat-margin gate. | Re-measure from real landed fires; if PulseChain gas rises, bump this so the gate stays honest. |
| FRESHNESS_DECAY_MIN | 0.5 | A re-checked opportunity must still be worth ≥50% of the net the quote engine originally claimed, or it is killed as stale (the staleKilled counter). Guards against firing on a gap that has already half-closed in the seconds since detection. | Raise toward 0.7 to be stricter about decayed edges; lower toward 0.3 only if too many live gaps are being binned as stale. |
| DAILY_LOSS_HALT_WPLS | 5,000 WPLS | Realized losses in a UTC day hitting this halts the bot until midnight. Reset to the 5K default on the 2026-07-02 revival (was 10K in the shared-wallet testing era). Fix E: gas-free reverts/send-errors do NOT count toward this. | Keep at 5K while the dedicated stack is re-proven; loosen only if nuisance halts block a clean testing window. |
| CONSEC_REVERT_BREAKER | 3 reverts → 1h halt | Three on-chain (gas-costing) reverts in a row trips a 1-hour circuit breaker. Counts only real-cost reverts (fix A recovers the reverted receipt and books the gas); gas-free send-errors are excluded (fix E). | Lower to 2 for a tighter leash during testing; raise to 5 once landings are reliable. |
| Per-token revert bench (REVERT_SKIP_N / _MS) | 3 reverts → 6h bench | Fix D: a token that reverts 3 times gets benched for 6 hours so the bot stops re-firing (and re-burning gas on) the same losing token every 60s. A win clears the token's revert count. | Shorten the bench to 1-2h if benched tokens recover quickly; lengthen if repeat-offenders keep wasting gas. |
| PER_TOKEN_COOLDOWN_MS / MAX_FIRES_PER_HOUR | 60,000 ms · 30/hr | A token can fire at most once per 60s, and the bot at most 30 times per hour — bounds a runaway cascade. Both are inert today (0 fires) but are the rate rails if volume picks up. | Inert until the bot fires regularly; tighten the hourly cap if a cascade ever appears. |
| Simulation block (fix B) | PENDING block + gasLimit 400,000 | callStatic now runs against the PENDING block (not the head block) with a real gas limit, so the sim reflects the state the tx will actually execute against. Head-block sims false-passed ~99.6% of the time on the old build — the single biggest misfire source. | No tuning; this is a correctness fix, not a knob. |
| Notional tiers (probation / whitelist) | 25,000 / 200,000 WPLS | The verdict/probation doctrine clamps fresh or WATCH/UNCLASSIFIED tokens to 25K and only lets champion-proven whitelisted tokens reach 200K. The live LIVE_MAX_NOTIONAL_WPLS (100K) caps the top end during testing. | Owned by lib/token-verdict + probation; don't raise the 25K fresh-token cap without a tax/honeypot pre-flight. |
| Contract / wallet (DEDICATED, isolated) | PulseAtomicArb 0xe9e93586…0E08 (500K WPLS) · wallet 0xfc7E301D…ab8A | FLIPPED 2026-07-02: dedicated wallet + dedicated contract (owner = the v1v2 wallet), funded 500K WPLS from idle champion-EOA reserve. V1V2_COORD is OFF — no shared-nonce lock, zero collision risk with the champion (the shared-wallet coupling was what starved the champion and forced the 06-21 pause). Fix F: an owner==wallet boot check runs before the bot ever ARMs. | No tuning; the isolation + owner-check are safety invariants, not knobs. |
Revisions
PLS-V1V2-ARB-V2| Revision | Summary |
|---|---|
| V1 (2026-04 → 05) | Original standalone "Cross-Family V2 Pool-to-Pool" bot (pulse-v1v2-arb.js). Ran mostly in paper/sim (21 wins / 90 reverts); swept 2026-05-19 in a capital consolidation on a "friction > edge" verdict — later found INVALID (a broken buy path, never a real edge test). |
| V2 (CURRENT) | 2026-06-15 — resurrected LIVE as the "census spin-off" (pulse-v1v2-bot.js, tmux pulse-v1v2-live). New pipeline: ~1s quote engine over 150 WPLS pairs + mempool-anticipation, verdict + tax gated, TRUE eth_call sim vs the funded PulseAtomicArb (0x03E2…6d66). Shares the champion wallet + contract, nonce-coordinated (V1V2_COORD) so they never clash. Flipped live 2026-06-15; hardened + recapped to 100k 2026-06-16 after a logic review (pending-block sim, fat-margin gate, per-token revert-bench, fixed CALL_EXCEPTION fail-safe accounting, 10k daily-loss halt) — now scans normally but fires rarely by design (only fat, winnable gaps clear the gate). |
| ⛔ PAUSED 2026-06-21 | PAUSED (Chef-approved) — it was STARVING the champion. It signed from the SAME wallet as the champion (pulse-arb-combined.js) via the 06-15 nonce-lock band-aid; once it fired 5-11/day from 06-16, wallet/nonce contention collapsed the champion 24→13→2 trades/day (pre-06-16, with v1v2 silent, the champion did 5-34/day). It also lost money on its own: lifetime 30 trades = 25 reverted / 3 won / 2 timeout (10% WR); TRUE NET -1,783 WPLS (the +5,427 counter only nets the 3 winners, ignoring 7,212 WPLS gas burned on the 27 non-winners). REVIVAL (V1V2_FIX_PLAN.md) required ALL of: (a) its OWN wallet + own deployed atomic contract + funding; (b) the champion safety rails ported; (c) a faster inclusion stack. Resolved in the next entry. |
| ✅ REVIVED 2026-07-02 (CURRENT) current | Revived LIVE the right way (Chef voice-approved). Requirement (a) satisfied properly: DEDICATED wallet 0xfc7E301D + DEDICATED PulseAtomicArb 0xe9e93586 (owner = the v1v2 wallet), funded 500K WPLS from idle champion-EOA reserve — no shared nonce, no V1V2_COORD, so it can NEVER starve the champion again (that coupling was the whole reason for the 06-21 pause; 16 of its historical timeouts were shared-nonce stomps, now eliminated). Requirement (b) carried over — pending-block sim @55% haircut, fix-A CALL_EXCEPTION accounting, 3-revert breaker — now at a 25K probation notional cap + 5K daily-loss halt. Requirement (c) partially addressed via sentinel dual-broadcast (USE_SENTINEL_SUBMIT=1 at launch). Armed 03:28Z, owner==wallet check passed, sentinel connected; 0 fires since (gates correctly block ~97-98% of opps). The open question: when a fat gap clears the gate, does the public-mempool fire LAND vs The Machine? Watch trades-*.ndjson — that data decides scale-vs-retire. |