<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Nyam]]></title><description><![CDATA[Nyam]]></description><link>https://nyamanteikq.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 12 Nov 2026 08:12:54 GMT</lastBuildDate><atom:link href="https://nyamanteikq.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[solcheck.py: a free Python CLI that risk-flags Solana memecoins in under a minute]]></title><description><![CDATA[I got tired of opening five tabs every time a mint hit my feed. RugCheck for authorities and risks, DexScreener for age and liquidity, something for…]]></description><link>https://nyamanteikq.hashnode.dev/solcheck-py-a-free-python-cli-that-risk-flags-solana-memecoins-in-under-a-minute</link><guid isPermaLink="true">https://nyamanteikq.hashnode.dev/solcheck-py-a-free-python-cli-that-risk-flags-solana-memecoins-in-under-a-minute</guid><category><![CDATA[Python]]></category><category><![CDATA[crypto]]></category><category><![CDATA[Web3]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[Solana]]></category><dc:creator><![CDATA[Nyam]]></dc:creator><pubDate>Tue, 10 Nov 2026 15:22:42 GMT</pubDate><content:encoded><![CDATA[<p>I got tired of opening five tabs every time a mint hit my feed. RugCheck for authorities and risks, DexScreener for age and liquidity, something for holders, something else for LP lock. So I folded the free public APIs into one stdlib Python script.</p>
<p>You paste a mint, wait a few seconds, get a red/yellow/green summary. Full source lives here (copy and run): <a href="https://telegra.ph/solcheckpy-free-Solana-memecoin-quick-check-script-copy--run-11-05-2">solcheck.py on Telegraph</a>.</p>
<p>Technical walkthrough of how the checker is built. Not a buy bot. Not financial advice. Plenty of tokens still die after a clean-looking printout.</p>
<h2>Why bother with a CLI</h2>
<p>Browser tabs are fine once. A script is better when you re-check the same mint five minutes later, or want JSON for a sheet. With one command you can:</p>
<ul>
<li>re-check the same mint after five minutes</li>
<li>pipe <code>--json</code> into a spreadsheet or a daily snapshot</li>
<li>keep the logic versioned next to a personal checklist</li>
</ul>
<pre><code class="language-bash">python3 solcheck.py SoMeMiNtAdDrEsS...
python3 solcheck.py SoMeMiNtAdDrEsS... --json
</code></pre>
<p>Python 3 only. <code>urllib</code> + <code>json</code>. Zero pip dependencies, zero API keys, zero accounts.</p>
<h2>Architecture in one paragraph</h2>
<p>For each mint the script fans out five HTTP requests, merges the answers, computes a handful of derived fields (top-10 holders with pools stripped out, LP lock %, age, buy/sell skew), then scores each check into red / yellow / green. Failed sources become warnings and <code>n/a</code> fields; the process does not abort.</p>
<pre><code>mint
  ├─ RugCheck report ── holders, risks, LP, creator, score
  ├─ DexScreener tokens ── best-liquidity pair stats
  ├─ Jupiter price v3 ── fallback liquidity / createdAt
  ├─ Jupiter token search ── name/symbol/holderCount fallback
  └─ Solana RPC getAccountInfo ── mintAuthority, freezeAuthority
           │
           ▼
     merge → flags → text or JSON
</code></pre>
<h2>Request layer</h2>
<p>Rate limits happen. The helper retries 429 and 5xx with linear backoff and caps the error string so a stack trace never floods the terminal:</p>
<pre><code class="language-python">def fetch(url, body=None, retries=3, timeout=20):
    data = json.dumps(body).encode() if body is not None else None
    hdrs = dict(UA, **({"Content-Type": "application/json"} if data else {}))
    err = None
    for i in range(retries):
        try:
            req = urllib.request.Request(url, data=data, headers=hdrs)
            with urllib.request.urlopen(req, timeout=timeout) as r:
                return json.loads(r.read().decode()), None
        except urllib.error.HTTPError as e:
            err = f"HTTP {e.code}"
            if e.code in (429, 500, 502, 503, 504):
                time.sleep(1.5 * (i + 1))
                continue
            return None, err
        except Exception as e:
            err = type(e).__name__ + ": " + str(e)[:80]
            time.sleep(1)
    return None, err
</code></pre>
<p>DexScreener can return several pairs for one mint. Keep the one with the highest USD liquidity:</p>
<pre><code class="language-python">pair = max(
    ds,
    key=lambda p: (p.get("liquidity") or {}).get("usd") or 0,
) if isinstance(ds, list) and ds else {}
</code></pre>
<h2>Derived fields that matter</h2>
<h3>1. Authorities (RPC wins)</h3>
<pre><code class="language-python">info = (((rpc or {}).get("result") or {}).get("value") or {}).get("data", {})
info = info.get("parsed", {}).get("info", {}) if isinstance(info, dict) else {}
mint_auth = info.get("mintAuthority") if info else rc.get("mintAuthority")
freeze_auth = info.get("freezeAuthority") if info else rc.get("freezeAuthority")
</code></pre>
<p>Active mint authority = someone can print more supply. Active freeze authority = someone can freeze your token account. Both are hard reds when present.</p>
<h3>2. Top-10 holders without fake whales</h3>
<p>RugCheck's <code>knownAccounts</code> tags AMM and LOCKER addresses. Markets expose pool pubkeys. Drop those, then sum the first ten remaining percentages:</p>
<pre><code class="language-python">excl = {a for a, v in (rc.get("knownAccounts") or {}).items()
        if v.get("type") in ("AMM", "LOCKER")}
# also add market / LP account pubkeys from rc["markets"] ...
real = [h for h in (rc.get("topHolders") or [])
        if h.get("owner") not in excl and h.get("address") not in excl]
top10 = sum(h.get("pct") or 0 for h in real[:10]) if rc.get("topHolders") else None
</code></pre>
<p>Thresholds used by the flags: ≤15% green, 15–30% yellow, &gt;30% red. On huge old coins, CEX and treasury wallets can inflate this, so treat a red on BONK-class names with context.</p>
<h3>3. LP lock and bonding curve</h3>
<p>While a token is still on the pump.fun curve, "LP locked" is the wrong question. The script marks that as yellow (<code>still on pump.fun bonding curve</code>) and only applies the lock % after migration. Lock ≥90% green, 50–90% yellow, under 50% red.</p>
<h3>4. Dev and RugCheck extras</h3>
<ul>
<li>creator balance as % of supply (from RugCheck + RPC decimals)</li>
<li>count of other tokens the same creator launched (&gt;3 → yellow "serial launcher?")</li>
<li><code>graphInsidersDetected</code> and insider-flagged top holders → red</li>
<li>each RugCheck risk name, mapped by <code>level</code> (<code>danger</code> → red, else yellow)</li>
<li>age under one hour → yellow</li>
<li>liquidity under $10k after migration → yellow</li>
<li>buys/sells &gt; 8 → yellow (possible wash)</li>
</ul>
<h2>Sample outputs from a live batch</h2>
<p>On 2026-11-05 at about 20:11 Europe/Moscow I pointed the same code at 28 Solana mints from DexScreener boosts/latest profiles. Result that hour: 19 RED, 5 YELLOW, 4 GREEN.</p>
<p><strong>Clean-looking basics: <code>$DESSA</code></strong> (<code>npz2FhoufQ7pKqhGpaipYWacrAkidyW2yDpVWSvpump</code>):</p>
<ul>
<li>age 10.2 days, mcap ~$33.7M, liq ~$546k, holders 37.6k</li>
<li>mint/freeze revoked, top-10 ex pools 2.7%, LP locked 100%, graph insiders 0</li>
<li>verdict GREEN (still: check bundles on trench.bot / Bubblemaps yourself)</li>
</ul>
<p><strong>Caution: <code>$GHOST</code></strong> (<code>42qKoGmEPTRJsa5jWrYwpydL8RkBwMvg2ykYVoerpump</code>):</p>
<ul>
<li>age 23.1 h, mcap ~$210k, liq ~$38k</li>
<li>top-10 ex pools 19.5% (yellow) + RugCheck "High holder correlation" (yellow)</li>
<li>verdict YELLOW</li>
</ul>
<p><strong>Concentrated + insider graph: <code>$Raul</code></strong> (<code>C1dNqHWwrLC6Hmtbr75BL3FmH4UCN3ztam7VDtwhpump</code>):</p>
<ul>
<li>authorities revoked, LP 100%, but top-10 ex pools 38% and 6 graph insiders</li>
<li>verdict RED</li>
</ul>
<p>Authorities and LP alone would have looked fine on <code>$Raul</code>. The holder and insider steps catch what the chart does not.</p>
<h2>Gaps on purpose</h2>
<p>Bundle and sniper detection has no solid free API I trust. The script refuses to invent one. It prints:</p>
<pre><code>https://trench.bot/bundles/&lt;MINT&gt;
https://app.bubblemaps.io/sol/token/&lt;MINT&gt;
</code></pre>
<p>Social copycats, fake sites, and Telegram drama also stay outside the CLI. Pair the script with a short manual checklist and you are faster than either alone.</p>
<h2>Try it</h2>
<p>Grab the file from <a href="https://telegra.ph/solcheckpy-free-Solana-memecoin-quick-check-script-copy--run-11-05-2">the Telegraph script page</a>, then:</p>
<pre><code class="language-bash">python3 solcheck.py &lt;MINT&gt;
</code></pre>
<p>Re-run before you size a trade. Memecoin stats rot quickly.</p>
<h2>Disclaimer</h2>
<p>For education. Not financial advice. No profit claims. Trading memecoins can wipe the wallet.</p>
<p>Disclosure: Axiom referral link. New signups through it get Axiom's documented 10% trading-fee discount; I earn a share of fees. Open before you register: <a href="https://axiom.trade/@anteikq">https://axiom.trade/@anteikq</a></p>
]]></content:encoded></item></channel></rss>