Skip to main content

On-chain rug-pull detection for Solana tokens — Safety Score 0-100, zero paid APIs required.

Project description

Solana Rug Guard $RUG

CI Python License

13-factor on-chain rug-pull detection for Solana tokens and wallets. No paid APIs. No registration. Just a Python script and a Hermes skill.

Run it as a one-shot CLI against any mint or wallet. Or install it as a Hermes Agent skill and ask in natural language: "Hey Hermes, is this token safe?" Every check is deterministic — the same input always produces the same score, with a full breakdown of why.


Install & Get Started

Prerequisites

  • Python 3.11+
  • Hermes Agent (optional — the CLI works standalone)
  • No API keys. The tool uses public Solana RPCs and the free DexScreener API.

Always install from a trusted source. Official packages are published to PyPI and GitHub Releases. The source is a single auditable Python file — no compiled binaries, no opaque dependencies. You can verify the checksums on the GitHub Releases page and compare against the source in this repo.

Option A: Install as a Hermes Skill (recommended)

# From the Hermes Agent repo:
hermes skills install official/blockchain/solana-rug

# Or from a local checkout:
cd optional-skills/blockchain/solana-rug/
hermes skills install ./SKILL.md

Then ask in natural language:

"Is token DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 safe?"
"Rug-check F4J5LKyEQraMem8nspPAzwHXaaKMMDsxyt7GUK94pump"
"Scan wallet 9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM for risky tokens"

Option B: Run the CLI Standalone

# Single file — no install needed (from GitHub Releases)
curl -OL https://github.com/rugpullnet/solana-rug/releases/latest/download/rugguard.py
python3 rugguard.py token DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --md
# Or clone the repo
git clone https://github.com/rugpullnet/solana-rug.git
cd solana-rug
python3 scripts/rugguard.py --help
# Or pip install from PyPI (trusted source)
pip install solana-rug
solana-rug token DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263

Verify It Works

python3 rugguard.py token DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --json

Expected: BONK returns safety_score: 100, zero warnings, market data showing $682k liquidity on Meteora.


How to Use

Token Analysis

# JSON output (default) — pipe through jq
python3 rugguard.py token <MINT_ADDRESS>

# Human-readable Markdown report
python3 rugguard.py token <MINT_ADDRESS> --md

# Full example
python3 rugguard.py token DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 --md

JSON output includes a market_data block with DexScreener enrichment:

{
  "safety_score": 100,
  "risk_level": "LOW",
  "flags": {
    "mint_authority_active": false,
    "freeze_authority_active": false,
    "sniper_detected": false,
    "suspicious_name": false,
    "sub_penny_price": false,
    "deployer_can_crash_price": false
  },
  "market_data": {
    "dex": "meteora",
    "liquidity_usd": 682156.92,
    "volume_24h": 936.68,
    "price_usd": 0.000004892,
    "price_change_24h": -2.92,
    "txns_24h": 212
  }
}

Wallet Scan

python3 rugguard.py wallet <ADDRESS>

Scans all SPL tokens held by a wallet. For each token with meaningful balance, checks mint authority. Returns a prioritized list of risky tokens ordered by safety score (lowest first).

Watch Mode, History, and Webhooks

# One check, store a SQLite history row, then exit
python3 rugguard.py watch <MINT_ADDRESS> --iterations 1

# Continuous monitoring every 60 seconds
python3 rugguard.py watch <MINT_ADDRESS> --interval 60

# Alert whenever score/flags/warnings change, or whenever safety <= 70
python3 rugguard.py watch <MINT_ADDRESS> --threshold 70 --webhook https://example.com/webhook

Watch mode stores every run in a local SQLite database and prints one JSON event per check:

{
  "mint": "...",
  "safety_score": 79,
  "risk_level": "LOW",
  "changed": true,
  "reasons": ["score changed 82 -> 79"],
  "history_db": "~/.solana-rug/history.sqlite3"
}

Webhook payloads use the same JSON event shape and are sent only when a change/threshold alert fires.

Environment

Variable Default Description
SOLANA_RPC_URL https://api.mainnet-beta.solana.com Override RPC endpoint. Set to a private node (Helius, QuickNode) for production reliability.
SOLANA_RUG_HISTORY_DB ~/.solana-rug/history.sqlite3 SQLite path for watch-mode score history.
SOLANA_RUG_WEBHOOK_URL empty Optional webhook URL for watch-mode alerts.
SOLANA_RUG_WATCH_INTERVAL 60 Default watch interval in seconds.
SOLANA_RUG_HISTORY_RETENTION_DAYS 90 Auto-prune history entries older than this many days.
SOLANA_RUG_LIQ_THRESHOLD_CRITICAL 1000 Liquidity below this USD amount is scored as critical risk (5pts).
SOLANA_RUG_LIQ_THRESHOLD_HIGH 5000 Liquidity below this is scored as high risk (4pts).
SOLANA_RUG_LIQ_THRESHOLD_MEDIUM 20000 Liquidity below this is scored as medium risk (3pts).
SOLANA_RUG_LIQ_THRESHOLD_LOW 100000 Liquidity below this is scored as low risk (1pt).
SOLANA_RUG_LIQ_VOL_RATIO_WARNING 15 Volume/liquidity ratio above this triggers a wash-trading warning (+3pts).
SOLANA_RUG_LIQ_VOL_RATIO_MIN 0.05 Volume/liquidity ratio below this flags an inactive/dead pool (+3pts).
WALLET_SCAN_WORKERS 4 Max concurrency limit for wallet token scanning (max 10).

Architecture

Data Flow

User Input (mint address)
        │
        ▼
┌─────────────────────┐
│  fetch_token_meta   │──► Solana RPC: getAccountInfo (jsonParsed)
│  (on-chain data)    │──► Token-2022 extension detection
└─────────┬───────────┘
          │
          ▼
┌─────────────────────┐
│  check_authorities  │──► Mint authority, freeze authority, token program
└─────────┬───────────┘
          │
          ▼
┌─────────────────────┐
│  fetch_token_holders│──► RPC: getTokenLargestAccounts
│                     │──► Falls back to DexScreener tx-count estimates
└─────────┬───────────┘
          │
          ▼
┌─────────────────────┐
│  detect_liquidity   │──► RPC: getProgramAccounts (Raydium, pumpSwap, Orca)
│                     │──► Falls back to DexScreener for pool data
└─────────┬───────────┘
          │
          ▼
┌─────────────────────┐
│  check_sniper_pat.  │──► First 15 mint signatures → rapid-buy detection
│  estimate_token_age │──► Signature pagination + DexScreener fallback
│  check_suspicious   │──► Name/symbol keyword blacklist
│  check_honeypot     │──► Jupiter quote API (optional check)
│  compute_dump_risk  │──► Deployer % vs pool liquidity
└─────────┬───────────┘
          │
          ▼
┌─────────────────────┐
│  DexScreener enrich │──► Price, volume, liquidity, 24h change, tx count
└─────────┬───────────┘
          │
          ▼
┌─────────────────────┐
│  Scoring Engine     │──► 13 risk factors → 0-100 safety score
│  + Markdown/JSON    │──► Human-readable report or structured data
└─────────────────────┘

Directory Layout

solana-rug/
├── SKILL.md                    # Hermes skill definition (docs all 13 checks)
├── scripts/
│   └── rugguard.py            # Core engine (~1470 lines, stdlib-only)
├── solana_rug/                 # PyPI package wrapper
│   ├── __init__.py
│   └── py.typed
├── pyproject.toml
├── tests/
│   └── test_checks.py         # 20 tests (13 unit + 7 blockchain integration)
├── README.md
├── CONTRIBUTING.md
└── LICENSE                     # MIT

The 13 Risk Factors

Each factor contributes zero or more points to the total risk score. Higher total risk = lower safety score.

# Factor Max What It Catches Data Source
1 Mint Authority 15 Dev can print unlimited new tokens RPC
2 Freeze Authority 5 Dev can freeze accounts RPC
3 LP Locked/Burned 15 LP tokens can be pulled, no pool exists RPC + DexScreener
4 Liquidity Size 5 Pool under $20k → high price impact DexScreener
5 Holder Concentration 10 Top 10 wallets own >50% of supply RPC + DexScreener
6 Dev Risk 5 Dev holds >15% of supply RPC
7 Token Age 5 Under 7 days old → statistically riskier DexScreener
8 Mint History 5 Dev minted more tokens after launch RPC
9 Honeypot 10 Sell simulation fails Jupiter API
10 Sniper Bots 10 Bots bought within first 20 seconds RPC sig analysis
11 Suspicious Name 5 Name contains "rug", "scam", "ponzi", etc. On-chain + DexScreener
12 Sub-Penny Price 5 Price < $0.0001 on a young or thin token DexScreener
13 Deployer Dump Risk 5 Dev could crash price by selling DexScreener + RPC

How Risks Are Scored

Each check is independent and deterministic. The total risk sum has no upper cap — a token with every flag maxed out scores 0/100. The 13 factors are split across:

  • 3 on-chain structural checks (mint authority, freeze authority, LP locked/burned) — the classic rug vectors
  • 4 market-health checks (liquidity size, holder concentration, age, mint history) — sustainability signals
  • 3 behavioral checks (honeypot, snipers, name stigma) — adversarial pattern detection
  • 3 position checks (dev risk, sub-penny price, deployer dump risk) — who holds what and what that means

Score bands:

Score Risk Meaning
80-100 LOW On-chain mechanics clean. Standard DeFi risks only.
50-79 MEDIUM Some risk factors present. Review flagged warnings.
20-49 HIGH Multiple red flags. Likely a risky token.
0-19 CRITICAL Strong evidence of malicious setup.

Data Sources (in order of preference)

  1. Solana public RPC — Mint accounts, token holders, signatures, program accounts. Retries across 4 public endpoints with round-robin fallback.
  2. DexScreener API — Real pool data when getProgramAccounts is rate-limited. Provides price, liquidity, volume, pair info, and creation time.
  3. Jupiter quote API — Optional honeypot check. Simulates a buy/sell to detect trade restrictions.

All calls are cached in-memory with a 5-minute TTL to avoid redundant network requests.


Support

Solana Rug Guard is free, open-source MIT software. No paywalls, no API keys, no registration.

If the tool saved you from a bad trade or helped you understand what happened to a coin you created, consider supporting the project by grabbing a small bag of $RUG on PumpSwap.

Token: F4J5LKyEQraMem8nspPAzwHXaaKMMDsxyt7GUK94pump
DEX:   pumpSwap (RUG/SOL pair)

Or check the current chart on DexScreener:

https://dexscreener.com/solana/4sHKYieWsGtrmtqjdXPRzSdVywXZ1jUQGbM8QbkBXMB9

Every buy adds liquidity to the pool and helps keep this project sustainable.


MIT License · Built for Hermes Agent · No paid APIs required

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

solana_rug-0.3.0.tar.gz (48.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

solana_rug-0.3.0-py3-none-any.whl (42.9 kB view details)

Uploaded Python 3

File details

Details for the file solana_rug-0.3.0.tar.gz.

File metadata

  • Download URL: solana_rug-0.3.0.tar.gz
  • Upload date:
  • Size: 48.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for solana_rug-0.3.0.tar.gz
Algorithm Hash digest
SHA256 ec15376dea5415fad9fcb0c911bdbeea2833447cce0ff622f822bb5a53d405c6
MD5 ed16b68f3fc438177ddc65d31f70f663
BLAKE2b-256 4408dc4040f4dd3f44e89db8a284615390e5b36d7b38bc3cb878419653a026e5

See more details on using hashes here.

File details

Details for the file solana_rug-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: solana_rug-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 42.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for solana_rug-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1287793609163bdc5e2204bccbbd981f4e228350cc873194b4ed25cb20acb176
MD5 2af98cd4bd6c9dd5147e4c9a0b81f6e3
BLAKE2b-256 264e397c4f122108f4dccd1890325040d82cfaf728b0c80ee1ffa2b55a9a367d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page