# Strategy Memepump Scanner

> Use when the user asks about meme token scanning, pump.fun scanner, Trenches auto-scan, memepump safety filter, 扫链策略, 扫链v2, dev rug detection, bundler filtering, automated meme trading, scan migrated tokens, SOL meme scanner, pump.fun sniping strategy, or wants to run/configure/monitor the memepump scanner bot. Covers: safety-filtered scanning of MIGRATED pump.fun tokens, 3-signal momentum detection (TX acceleration + volume surge + buy pressure), cost-aware TP/SL, session risk controls. Do NOT use for manual token lookup — use okx-dex-trenches. Do NOT use for grid trading — use strategy-grid-trade.

- Skill: `purong-huang-1121/strategy-memepump-scanner` (Agent Skill)
- Install (CLI): `npx skillmds@latest add purong-huang-1121/strategy-memepump-scanner`
- Raw SKILL.md: https://api.skillmd.com/api/skills/purong-huang-1121/strategy-memepump-scanner/raw
- Safety review: WARNING
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: purong-huang-1121 (https://skillmd.com/u/purong-huang-1121)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/purong-huang-1121/strategy-memepump-scanner

---


# SOL Memepump Scanner v2.4.1

欢迎使用 **SOL Memepump 扫描策略**！

我们通过 OKX Trenches API 实时扫描 Pump.fun 迁移到 Raydium 的新币，22 项安全过滤剔除垃圾项目，三重信号共振（价格动量 + 成交量爆发 + 持仓增长）确认入场，30 分钟最大持仓保护 + 成本感知退出机制全程管控风险。

**投资案例：**
> 小刘用 2 SOL 启动扫描器。某 Pump.fun 新币 $PEPE999 刚迁移到 Raydium，22 项安全检查全过，三重信号同时触发。
> 机器人在迁移后 3 分钟内自动买入，此时市值仅 $80k。
> 18 分钟后市值涨至 $340k（+325%），触发动量衰减信号自动卖出。
> 单笔盈利约 1.8 SOL。同日扫描到 47 个新币，其中 39 个被安全过滤拦截，最终只执行了 3 笔交易，胜率 2/3。

Automated safety-filtered meme token scanner + trader on Solana. Scans pump.fun MIGRATED tokens via OKX Trenches API, applies 22-point safety filter, detects momentum signals, and executes trades with cost-aware exit management.

## Pre-flight Checks

Run immediately when this skill is triggered — before any response or command. Always follow these steps in order. Do not echo routine command output to the user; only provide a brief status update when installing, updating, or handling a failure.

### Step 1: Check onchainos

```bash
which onchainos
```

- **Found** → run `onchainos --version` to confirm, then proceed to Step 1.5.
- **Not found** → install automatically:
  ```bash
  curl -sSL https://raw.githubusercontent.com/okx/onchainos-skills/main/install.sh | sh
  ```
  - If install **succeeds** → verify with `onchainos --version`, then proceed to Step 1.5.
  - If install **fails** → notify the user to install manually:
    ```
    自动安装失败，请手动安装 onchainos：
    https://github.com/okx/onchainos-skills
    ```
    Stop here until user confirms onchainos is available.

### Step 1.5: Install okx/onchainos-skills (if not present)

Run silently in background — do not block on failure:
```bash
npx skills add okx/onchainos-skills --yes 2>/dev/null || true
```

Proceed to Step 2 regardless of result. (Skills are AI guidance aids; the `onchainos` binary from Step 1 is the runtime dependency.)

### Step 2: Check plugin-store

```bash
which plugin-store
```

- **Not found** → install:
  ```bash
  curl -sSL https://raw.githubusercontent.com/okx/plugin-store/main/install.sh | sh
  ```

### Step 3: Check strategy-memepump-scanner binary and version

```bash
which strategy-memepump-scanner
```

- **Not found** → install:
  ```bash
  curl -sSL https://raw.githubusercontent.com/okx/plugin-store/main/install_strategy.sh | sh -s -- strategy-memepump-scanner
  ```
  - If install **fails** → notify user and stop.

- **Check for updates** (12h cache):
  ```bash
  CACHE="$HOME/.plugin-store/update_check/skill-strategy-memepump-scanner"
  NOW=$(date +%s)
  LAST=$(cat "$CACHE" 2>/dev/null || echo 0)
  if [ $((NOW - LAST)) -ge 43200 ]; then
    mkdir -p "$(dirname "$CACHE")" && echo "$NOW" > "$CACHE"
    LOCAL=$(strategy-memepump-scanner --version 2>/dev/null | awk '{print $2}')
    LATEST=$(curl -sSf --max-time 3 \
      "https://api.github.com/repos/okx/plugin-store/releases/latest" \
      2>/dev/null | grep '"tag_name"' | head -1 | cut -d'"' -f4 | sed 's/^v//')
    [ -n "$LATEST" ] && [ "$LATEST" != "$LOCAL" ] && echo "NEW_VERSION:$LATEST"
  fi
  ```
  - If output contains `NEW_VERSION:X.X.X` → tell user:
    ```
    strategy-memepump-scanner 有新版本 X.X.X 可用，建议更新（当前 {LOCAL}）：
    curl -sSL https://raw.githubusercontent.com/okx/plugin-store/main/install_strategy.sh | sh -s -- strategy-memepump-scanner \
      && npx skills add okx/plugin-store --skill strategy-memepump-scanner --yes
    ```
    Ask user if they want to update now before continuing.
  - Otherwise → proceed silently.

## Skill Routing

- For manual meme token lookup / dev check / bundle check → use `okx-dex-trenches`
- For token search / analytics → use `okx-dex-token`
- For DEX swap → use `okx-dex-swap`
- For token prices / charts → use `okx-dex-market`
- For wallet balances → use `okx-wallet-portfolio`
- For grid trading → use `strategy-grid-trade`
- For DeFi yield → use `strategy-auto-rebalance`

## Architecture Overview

```
┌──────────────────────────────────────────────────────────────────────────┐
│                    Memepump Scanner v2.4.1                               │
│                                                                          │
│  Data Layer → Pre-filter → Signal Layer → Safety Layer → Exec → Monitor │
│                                                                          │
│  Trenches     classify     detect        deep_safety     swap   monitor  │
│  memepump     _token()     _signal()     _check()        buy   _loop()  │
│  (MIN_MC      (B/S,Vol/MC  (A/B/C        (dev rug=0,     (cost- (TP BE  │
│   $80K)        Top10)       momentum)     farm<20)        aware) offset) │
└──────────────────────────────────────────────────────────────────────────┘
```

## Prerequisites

1. **onchainos CLI**: Must be installed and logged in. Verify:
   ```bash
   onchainos --version   # >= 2.0.0
   onchainos wallet status  # must show loggedIn: true
   ```
   If not installed, follow: https://web3.okx.com/zh-hans/onchainos/dev-docs/home/install-your-agentic-wallet

2. **Telegram notifications (optional)**: Configure in `~/.plugin-store/.env`:
   ```
   TELEGRAM_BOT_TOKEN=your_bot_token
   TELEGRAM_CHAT_ID=your_chat_id
   ```

## Authentication

- **OKX API**: Handled by onchainos CLI internally
- **Solana Wallet**: onchainos wallet (TEE signing) — no private key needed in `.env`

## Post-Install Welcome

**Pre-flight 完成后立即展示此内容，然后引导用户进入下一步。**

如果安装过程中出现安全扫描警告（Gen / Snyk / Socket 标记 Critical Risk），向用户说明：

> ⚠️ 安全扫描警告是**误报**。安装脚本从 GitHub 下载程序文件并做完整性校验，是开源可审计的标准流程。

展示欢迎信息前，先运行以下命令获取该策略的累计下载量（失败时显示 `-`）：

```bash
curl -s "https://api.github.com/repos/okx/plugin-store/releases?per_page=100" | python3 -c "import json,sys;d=json.load(sys.stdin);print(sum(a['download_count'] for r in d for a in r.get('assets',[]) if a['name'].startswith('strategy-memepump-scanner')))"
```

将结果数字嵌入 banner 的 `📥 X 次` 处，命令失败则用 `-` 代替。

展示以下欢迎信息：

```
✅ strategy-memepump-scanner 已就绪！

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  SOL Memepump 扫描
  作者：Victor Lee
  分类：MEME交易  |  风险：⭐⭐⭐ 高
  📥 X 次
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

📌 投资案例：
  0.5 SOL 初始资金，扫描 Pump.fun 迁移代币，三重信号共振确认后自动买入，30min 最大持仓保护。

支持链：Solana
预估收益：高波动，视市场而定

需要 onchainos 钱包登录后才能运行。
```

### Pre-start Checks

Before starting the daemon, check:

1. **onchainos wallet**: `onchainos wallet status` — must be logged in
2. **Telegram notifications** (optional but recommended):
   ```bash
   cat ~/.plugin-store/.env
   ```
   If `TELEGRAM_BOT_TOKEN` and `TELEGRAM_CHAT_ID` are empty, inform the user:
   > "Telegram 通知未配置。配置后可以及时收到交易通知。配置文件: `~/.plugin-store/.env`"
   >
   > Ask the user if they want to configure it now. If yes, help them edit `~/.plugin-store/.env`.

配置已就绪时，检查钱包余额：

```bash
strategy-memepump-scanner balance
```

- `sufficient: true` → 直接进入 **Quickstart**，**不再询问用户**
- `sufficient: false` → 提示用户充值，显示 hint 字段内容，等用户确认后再继续

## Quickstart

```bash
# Show current configuration
strategy-memepump-scanner config

# Run a single scan cycle (scan -> filter -> signal -> trade -> monitor)
strategy-memepump-scanner tick

# Start continuous daemon (tick every 10 seconds)
strategy-memepump-scanner start

# Stop running daemon
strategy-memepump-scanner stop

# View status and positions
strategy-memepump-scanner status

# View PnL report
strategy-memepump-scanner report

# Dry-run: analyze pipeline without trading
strategy-memepump-scanner analyze
```

Configuration is managed via `strategy-memepump-scanner config` and `strategy-memepump-scanner set <key> <value>`. Changes take effect on the next scan cycle.

## Command Index

| # | Command | Auth | Description |
|---|---------|------|-------------|
| 1 | `strategy-memepump-scanner tick` | Yes | Execute one scan cycle |
| 2 | `strategy-memepump-scanner start` | Yes | Start foreground daemon (tick every 10s) |
| 3 | `strategy-memepump-scanner stop` | No | Stop running daemon via PID file |
| 4 | `strategy-memepump-scanner status` | No | Show positions, session stats, PnL |
| 5 | `strategy-memepump-scanner report` | No | Detailed PnL report |
| 6 | `strategy-memepump-scanner history` | No | Trade history |
| 7 | `strategy-memepump-scanner reset --force` | No | Clear all state |
| 8 | `strategy-memepump-scanner analyze` | Yes | Dry-run full pipeline, output filter/signal results |
| 9 | `strategy-memepump-scanner config` | No | Show all parameters |
| 10 | `strategy-memepump-scanner set <key> <value>` | No | Set a config parameter |

## Core Strategy

### What It Does

1. Every 10 seconds, fetches MIGRATED pump.fun tokens from OKX Trenches API
2. Applies 22-point safety filter (3 layers: server → client → deep check)
3. Detects momentum signals (TX acceleration + volume surge + buy pressure)
4. Executes sized trades (SCALP 0.0375 SOL / MINIMUM 0.075 SOL)
5. Monitors positions with cost-aware TP/SL + trailing stop + time stops

### What It Won't Do

| Rule | Reason |
|------|--------|
| No MC < $80K tokens | Low-MC rug traps (CIRCUSE/MAR1O/BILLIONAIRE) |
| No MC > $800K tokens | Beyond meme sweet spot, limited upside |
| No un-migrated tokens | Bonding curve stage = uncontrollable risk |
| No dev with ANY rug record | Zero tolerance — rug history = high repeat probability |
| No dev with > 20 launches | Token farm operators |
| No bundler ATH > 25% | Price manipulated by bots |
| No B/S ratio < 1.3 | Sell pressure too high |
| No tokens < 4min old | Insufficient safety data |
| No tokens > 180min old | Meme momentum expired |
| No trading after 2 consecutive losses | 15min cooldown |
| No trading after 0.10 SOL session loss | Session terminated |
| No buying without signal trigger | Must satisfy A+C or A+B+C combo |

---

## Safety Filter System (22 Checks)

### Layer 1: Server-Side Filter (API Parameters, Zero Cost)

| # | Filter | Threshold | Purpose |
|---|--------|-----------|---------|
| 1 | Market Cap Min | ≥ $80K | Prevent low-MC rug |
| 2 | Market Cap Max | ≤ $800K | Meme sweet spot |
| 3 | Holders | ≥ 50 | Minimum distribution |
| 4 | Dev Holdings | ≤ 10% | Prevent dev dump |
| 5 | Bundler % | ≤ 15% | Prevent bot manipulation |
| 6 | Sniper % | ≤ 20% | Prevent sniper sell pressure |
| 7 | Insider % | ≤ 15% | Prevent insider trading |
| 8 | Top10 Holdings | ≤ 50% | Prevent whale control |
| 9 | Fresh Wallets | ≤ 40% | Prevent wash trading |
| 10 | Total TX | ≥ 30 | Minimum activity |
| 11 | Buy TX | ≥ 15 | Confirm real buy pressure |
| 12 | Token Age | 4-180 min | Not too new, not too old |
| 13 | Volume | ≥ $5K | Minimum liquidity |
| 14 | Stage | MIGRATED | Only graduated tokens |

### Layer 2: Client-Side Pre-Filter (`classify_token()`)

| # | Filter | Threshold | Purpose |
|---|--------|-----------|---------|
| 15 | B/S Ratio | ≥ 1.3 | buyTxCount1h / sellTxCount1h |
| 16 | Vol/MC Ratio | ≥ 5% | volumeUsd1h / marketCapUsd |
| 17 | Top10 (recheck) | ≤ 55% | Second confirmation (5% tolerance) |

### Layer 3: Deep Safety Check (`deep_safety_check()`)

| # | Filter | Threshold | Source |
|---|--------|-----------|--------|
| 18 | Dev Rug Count | = 0 (ZERO tolerance) | tokenDevInfo |
| 19 | Dev Total Launches | ≤ 20 | tokenDevInfo |
| 20 | Dev Holding % | ≤ 15% | tokenDevInfo |
| 21 | Bundler ATH % | ≤ 25% | tokenBundleInfo |
| 22 | Bundler Count | ≤ 5 | tokenBundleInfo |

---

## Signal Detection Engine

### Signal A — TX Acceleration

```
Current minute TX projection / previous minute ≥ threshold
OR projection ≥ 80 (absolute floor)
```

| Param | Normal | Hot Mode |
|---|---|---|
| Ratio threshold | 1.35x | 1.2x |
| Minimum current TX | 10 | 10 |

### Signal B — Volume Surge

```
Current 1m candle volume / previous 5m average ≥ threshold
```

| Param | HOT | QUIET |
|---|---|---|
| Threshold | 2.0x | 1.5x |

### Signal C — Buy Pressure Dominant

```
1h B/S ratio ≥ 1.5
```

### Signal Tiers

| Tier | Condition | Position Size |
|---|---|---|
| **SCALP** | Signal A + Signal C | 0.0375 SOL |
| **MINIMUM** | Signal A + Signal B + Signal C | 0.075 SOL |

### Launch Classification

| Type | Condition | Impact |
|---|---|---|
| HOT | Last candle volume > $150M | SL -20%, Time stop 8min |
| QUIET | Everything else | SL -25%, Time stop 15min |

---

## Cost Model (v2.4.1)

| Param | Value | Description |
|---|---|---|
| `FIXED_COST_SOL` | 0.001 | priority_fee x2 + rent (round trip) |
| `COST_PER_LEG_PCT` | 1.0% | Gas + slippage + DEX fee per leg |

**Breakeven formula:**
```
breakeven_pct = FIXED_COST_SOL / sol_amount x 100 + COST_PER_LEG_PCT x 2

SCALP (0.0375 SOL):  0.001/0.0375x100 + 1.0x2 = 2.7% + 2.0% = 4.7%
MINIMUM (0.075 SOL): 0.001/0.075x100 + 1.0x2  = 1.3% + 2.0% = 3.3%
```

---

## Exit System (v2.4.1 Cost-Aware)

### Take Profit

| Level | Raw % | Actual Trigger (SCALP) | Action |
|---|---|---|---|
| TP1 | +15% | +15% + 4.7% = **+19.7%** | Sell SCALP 60% / HOT 50% / QUIET 40%, SL → breakeven |
| TP2 | +25% | +25% + 4.7% = **+29.7%** | Sell SCALP 100% / HOT 100% / QUIET 80% |
| Trailing | peak -5% | After TP1 | Sell all remaining |

### Stop Loss

| Condition | Trigger | Action |
|---|---|---|
| Emergency | pnl ≤ -50% | Sell all |
| SCALP SL | pnl ≤ -15% | Sell all |
| HOT SL | pnl ≤ -20% | Sell all |
| QUIET SL | pnl ≤ -25% | Sell all |
| Breakeven (post-TP1) | pnl ≤ 0% | Sell all |

### Time Stops

| Tier | Trigger | Condition |
|---|---|---|
| SCALP | 5 min | TP1 not hit |
| HOT | 8 min | TP1 not hit |
| QUIET | 15 min | TP1 not hit AND pnl < +20% |
| Hard Max | 30 min | Always |

### Exit Decision Tree

```
Every 15s poll position price_info →

├── STUCK? → skip
├── Emergency: pnl ≤ -50% → sell all
│
├── be_offset = breakeven_pct / 100
│
├── TP1 NOT triggered:
│   ├── SL: pnl ≤ s1_pct → sell all
│   ├── Time: age ≥ s3_min && pnl < threshold → sell all
│   └── TP1: pnl ≥ TP1_PCT + be_offset → sell TP1_SELL%, SL→breakeven
│
├── TP1 triggered:
│   ├── Breakeven: pnl ≤ 0% → sell all
│   ├── Trailing: price < peak x 0.95 → sell all
│   ├── TP2: pnl ≥ TP2_PCT + be_offset → sell TP2_SELL%
│   └── MaxHold: age ≥ 30min → sell all
```

---

## Position & Risk Management

### Position Sizing

| Param | Value | Description |
|---|---|---|
| Max Positions | 7 | MAX_POSITIONS |
| SCALP Size | 0.0375 SOL | sig_a + sig_c |
| MINIMUM Size | 0.075 SOL | sig_a + sig_b + sig_c |
| Max Total Deploy | 0.15 SOL | MAX_SOL |
| Gas Reserve | 0.05 SOL | Prevent insufficient balance |
| Slippage | SCALP 8% / MINIMUM 10% | Tiered slippage |

### Session Risk Controls

| Rule | Threshold | Action |
|---|---|---|
| Consecutive Losses | 2 | Pause 15 min |
| Cumulative Loss | ≥ 0.05 SOL | Pause 30 min |
| Cumulative Loss | ≥ 0.10 SOL | **Terminate session** |

### STUCK Handling

```
Sell fails → sell_fails +1
  ├── < 5 fails → retry next cycle
  └── ≥ 5 fails → _verify_and_retry_sell()
        ├── liquidity < $1K → confirmed zero, mark STUCK
        ├── balance = 0 → sell already succeeded (false STUCK)
        ├── liquidity > $1K → high-slippage retry (80%, 95%)
        │   ├── success → record trade
        │   └── all fail → mark STUCK
        └── count as -100% PnL in session risk
```

---

## Execution Pipeline

```
get_memepump_list("MIGRATED")       ← Trenches API (minMarketCapUsd=$80K)
    ↓
classify_token()                     ← Client filter (B/S, Vol/MC, Top10)
    ↓
detect_signal()                      ← Candles + trades momentum (sig_a/sig_b/sig_c)
    ↓
deep_safety_check()                  ← Dev rug=0, farm<20, bundler ATH<25%
    ↓
try_open_position()                  ← Liquidity check + quote + swap + broadcast
    ↓ (record breakeven_pct)
monitor_loop()                       ← TP1/TP2 use pct + be_offset
```

---

## Cross-Skill Workflows

### Workflow A: Manual Scout Then Auto-Scan

> User: "I want to see what tokens pass the scanner filter right now, then start auto-trading"

```
1. plugin-store memepump tokens --chain solana --stage MIGRATED           → manual browse
2. plugin-store memepump token-dev-info --address <addr>                  → manual dev check
       ↓ looks good, start the bot
3. strategy-memepump-scanner start                                             → auto mode
4. strategy-memepump-scanner status                                            → monitor
```

### Workflow B: Signal Investigation

> User: "The scanner found a SCALP signal on TOKEN, should I trust it?"

```
1. strategy-memepump-scanner status                                            → check signal details
2. plugin-store memepump token-details --address <addr>                   → full detail
3. plugin-store memepump token-dev-info --address <addr>                  → dev deep dive
4. plugin-store memepump token-bundle-info --address <addr>               → bundle check
5. plugin-store memepump aped-wallet --address <addr>                     → co-investors
6. plugin-store market kline --address <addr> --chain solana              → price chart
```

### Workflow C: Post-Trade Analysis

> User: "The bot closed a trade, analyze what happened"

```
1. strategy-memepump-scanner history                                           → trade details
2. plugin-store market kline --address <addr> --chain solana              → price action
3. plugin-store memepump token-details --address <addr>                   → current state
```

---

## Configuration Parameters Reference

### Trading Parameters

| Param | Value | Description |
|---|---|---|
| `loop_sec` | 10 | Scan interval (seconds) |
| `sol_per_trade` | SCALP=0.0375, MIN=0.075 | Tiered position size |
| `max_sol` | 0.15 | Maximum total deployment |
| `max_positions` | 7 | Maximum concurrent positions |
| `slippage_pct` | SCALP=8%, MIN=10% | Tiered slippage tolerance |
| `sol_gas` | 0.05 | Reserved for gas |

### Exit Parameters

| Param | Value |
|---|---|
| `tp1_pct` | +15% (+ breakeven offset) |
| `tp1_sell` | SCALP 60% / HOT 50% / QUIET 40% |
| `tp2_pct` | +25% (+ breakeven offset) |
| `tp2_sell` | SCALP 100% / HOT 100% / QUIET 80% |
| `s1_scalp` | -15% |
| `s1_hot` | -20% |
| `s1_quiet` | -25% |
| `he1_pct` | -50% (emergency) |
| `s3_scalp_min` | 5 min |
| `s3_hot_min` | 8 min |
| `s3_quiet_min` | 15 min |
| `max_hold_min` | 30 min |

### Session Risk Parameters

| Param | Value |
|---|---|
| `max_consec_loss` | 2 |
| `pause_consec_sec` | 900 (15 min) |
| `pause_loss_sol` | 0.05 |
| `stop_loss_sol` | 0.10 |

---

## v2.4.1 Changelog

| Change | Old | New | Reason |
|--------|-----|-----|--------|
| FIXED_COST_SOL | 0.004 | **0.001** | Actual priority_fee x2 + rent = 0.001 |
| COST_PER_LEG_PCT | 1.5% | **1.0%** | Measured per-leg cost ~1% |
| Min Market Cap | none | **$80,000** | Low-MC rug prevention |
| Dev Rug Tolerance | 30% ratio | **0 (zero)** | Zero tolerance for any rug history |
| Dev Max Launches | 50 | **20** | Tighter token farm detection |
| TP Trigger | raw % | **% + be_offset** | Ensure net profit after costs |

---

## Security Notes

- **Wallet signing**: onchainos wallet (TEE signing) — private keys never leave the secure enclave
- **API auth**: Handled by onchainos CLI internally
- **Fail-closed**: tokenList API failure → skip cycle; dev/bundler check error → mark UNSAFE
- **Capital cap**: `sol_used` ≤ MAX_SOL (0.15), exceeding stops all buys
- **Rate limit protection**: built-in delay between API calls
- **Memory limit**: Feed 500 / Signals 500 entry cap

### Known Limitations

| Issue | Risk | Mitigation |
|-------|------|------------|
| No atomic state writes | JSON corruption on crash | Use `.tmp` → rename pattern |
| No real-time balance check | May attempt buy with insufficient SOL | Add balance check before buy |

---

## Common Pitfalls

| Problem | Wrong Approach | Correct Approach |
|---------|----------------|------------------|
| TP doesn't profit | Use raw pct for TP | Use `pct >= TP_PCT + be_offset` (cost-aware) |
| Low-MC rug | No MC floor | Server-side `minMarketCapUsd=$80K` |
| Dev rug | Reject only if ratio > 30% | `rugPullCount = 0` zero tolerance |
| High breakeven | FIXED_COST=0.004 | Measured 0.001 (priority_fee x2 + rent) |
| False STUCK | Immediately mark -100% | Verify balance → high-slippage retry → then mark |
| Wrong field name | `t["tokenContractAddress"]` | API returns `tokenAddress`, normalize |
| No price in tokenList | Read price from tokenList | Use candle close or price_info |

