The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the PumpFun Claims Bot listing page.
Read-only Telegram channel feed that broadcasts PumpFun on-chain activity — GitHub social fee claims, token graduations, and more. Posts rich, intelligence-enriched cards to a Telegram channel in real time.
Website · Live Channel · MCP Server · Deploy Guide · Contributing
Looking for interactive monitoring? The telegram-bot supports watch management, group chats, REST API, SSE streaming, and webhooks. Use this channel-bot for simple broadcast-only channels.
| Feed | Description | Toggle |
|---|---|---|
| GitHub Social Fee Claims | GitHub devs claiming PumpFun social fee PDA rewards | FEED_CLAIMS |
| Token Graduations | Tokens graduating from bonding curve to PumpAMM | FEED_GRADUATIONS |
Every GitHub social fee claim card includes:
| Feature | Description |
|---|---|
| 🟢 Credibility Score | Deterministic 0-100 verdict (Strong/Moderate/Caution/High Risk) synthesised from every trust signal, with a transparent ±factor breakdown |
| 📊 Dev Track Record | Persistent per-developer reputation — a repeat dev's prior tokens and their average credibility, so a serial fee-farmer whose newest coin looks clean is exposed on sight |
| 🚨 First-Time Alert | 🚨🚨🚨 FIRST TIME CLAIM banner when a GitHub user claims for the first time ever |
| ⚠️ Fake Claim Detection | Detects when claim_social_fee_pda instruction is called but no fees are actually paid out |
| 📊 Claim Counter | Sequential claim number tracked persistently across restarts |
| 💹 Lifetime SOL | Total SOL claimed from the PDA over all time |
| 👤 GitHub Profile | Username, bio, repos, followers, account age, location, blog |
| 𝕏 Social Links | Twitter/X profile with follower counts (from GitHub profile) |
| 🏅 Influencer Badge | Tier-based badge for high-follower GitHub/X accounts |
| 📈 Token Intel | Graduated/bonding curve status, curve progress %, created age, reply count |
| 🔗 Token Socials | Twitter, Telegram, website links from token metadata |
| 🏷️ Token Flags | NSFW, banned, cashback status indicators |
| ⚠️ Trust Signals | Warnings for new GitHub accounts (< 30 days), zero repos, fake claims |
| 🔗 Trading Links | Axiom, GMGN, Padre links with affiliate codes |
| ️ Token Image | Token image or GitHub avatar as photo card |
Rich graduation cards include creator profile, top holders analysis, 24h trading volume, dev wallet activity, pool liquidity, and bundle detection.
Combines GitHub and X/Twitter follower data to classify claimers:
| Tier | Badge | X Followers | GitHub Followers |
|---|---|---|---|
| Mega | 🔥🔥 MEGA INFLUENCER | ≥ 100K | ≥ 10K |
| Influencer | 🔥 Influencer | ≥ 10K | ≥ 1K |
| Notable | ⭐ Notable | ≥ 1K | ≥ 100 |
Either threshold triggers the tier — a user with 50K X followers and 50 GitHub followers still qualifies as Influencer.
Every claim card leads with a deterministic 0-100 credibility verdict synthesised from the trust signals the bot already gathers, plus the claiming dev's persistent track record across prior tokens.
The score is deterministic and transparent — same inputs always produce the same number, no model call, and every point is attributed to a named factor shown under the headline:
| Tier | Badge | Score |
|---|---|---|
| Strong | 🟢 | 75-100 |
| Moderate | 🟡 | 55-74 |
| Caution | 🟠 | 35-54 |
| High Risk | 🔴 | 0-34 |
Scoring starts at a neutral 50 and adjusts by weighted factors: claim verification (+22, or -20 on a GitHub-owner mismatch), account age (+14 for 5y+ down to -18 for < 30 days), public repos, followers, starred non-fork repo, copycats (-10/-16), bundling, holder concentration, prior rugs, and bans.
Dev track record turns that one-shot score into memory. Every score is recorded against the claiming GitHub user id and persisted, so the next time that dev launches a token the card shows their history — exposing a serial fee-farmer whose newest coin looks clean, and crediting a builder with a real record:
Logic lives in src/credibility.ts (pure scoreCredibility) and src/dev-reputation.ts (persistent store), both fully covered by tests.
First-time claims get a one-line AI take generated by Groq (llama-3.3-70b-versatile):
Examples:
"Real GitHub project, dev claimed fast" · "Fork of popular repo, proceed with caution"
The RpcFallback class manages multiple Solana RPC endpoints with automatic rotation:
SOLANA_RPC_URLS (comma-separated)| Program | ID | Purpose |
|---|---|---|
| PumpFees | pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ | Fee sharing, social fee PDA claims |
| Pump | 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P | Bonding curve (graduations) |
| PumpAMM | pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA | AMM (graduated pool events) |
Run the MCP server instantly with npx — no clone needed:
Or install globally:
Add to your MCP client config (Claude Desktop, Cursor, VS Code Copilot):
npm package: pumpfun-claims-bot on npm
/newbot → follow prompts → copy the bot token@pumpfunclaims)| Variable | Required | Default | Description |
|---|---|---|---|
TELEGRAM_BOT_TOKEN | ✅ | — | Bot token — message @BotFather → /newbot |
CHANNEL_ID | ✅ | — | Channel to post to (@channelname or -100xxx) — get the numeric ID via @userinfobot |
SOLANA_RPC_URL | ✅ | https://api.mainnet-beta.solana.com | Primary Solana HTTP RPC — free tier at Helius, QuickNode, or Alchemy |
SOLANA_WS_URL | — | Derived from SOLANA_RPC_URL | Solana WebSocket URL — same provider as SOLANA_RPC_URL, replace https:// with wss:// |
SOLANA_RPC_URLS | — | — | Comma-separated fallback RPC URLs — auto-rotates on 429 / 5xx / timeout |
FEED_CLAIMS | — | true | Post GitHub social fee claim cards |
FEED_GRADUATIONS | — | false | Post token graduation cards |
FEED_LAUNCHES | — | false | Post new token launch cards |
FEED_WHALES | — | false | Post whale buy/sell alerts |
FEED_FEE_DISTRIBUTIONS | — | false | Post creator fee distribution events |
REQUIRE_GITHUB | — | true | Skip claims that have no GitHub social fee PDA |
GITHUB_TOKEN | — | — | GitHub PAT — create one here (no scopes needed) — raises rate limit from 60 → 5000 req/hr |
GROQ_API_KEY | — | — | Groq API key for AI one-liner summaries — get a free key at console.groq.com |
X_AUTH_TOKEN | — | — | X/Twitter auth_token cookie — open x.com, DevTools → Application → Cookies → copy auth_token |
X_CT0_TOKEN | — | — | X/Twitter ct0 cookie (CSRF token) — same place as above, copy ct0 |
AXIOM_REF | — | — | Affiliate ref code for Axiom trading links |
GMGN_REF | — | — | Affiliate ref code for GMGN trading links |
PADRE_REF | — | — | Affiliate ref code for Padre trading links |
POLL_INTERVAL_SECONDS | — | 30 | HTTP polling interval when WebSocket is unavailable |
WHALE_THRESHOLD_SOL | — | 10 | Minimum SOL trade size to trigger a whale alert |
LOG_LEVEL | — | info | Log verbosity: debug | info | warn | error |
PORT | — | 3000 | Health check HTTP server port — set automatically by Railway |
MCP_ENABLED | — | false | Enable the MCP (Model Context Protocol) server for AI assistant integrations |
MCP_PORT | — | 3001 | MCP server HTTP port (Streamable HTTP transport) |
Railway auto-deploys from GitHub and provides persistent volumes for claim tracking data.
See railway.json for the deployment config:
On startup, the bot fetches all SharingConfig accounts from the PumpFees program to build a reverse mapping from social fee PDA addresses to token mints. This enables resolving which token a social fee claim belongs to without additional RPC calls.
CreateFeeSharingConfig and UpdateFeeShares eventssocialFeeIndex.getMintForPda(pdaAddress) → token mintSome users call the claim_social_fee_pda instruction targeting random token PDAs where they have no fees to collect. The bot detects these by checking:
claim_social_fee_pdaSocialFeePdaClaimed event — OR the event shows amountLamports = 0Fake claims are posted with a ⚠️ FAKE CLAIM warning and a 🚩 Fake claim — no fees paid out trust signal.
The ClaimTracker maintains a persistent set of GitHub user IDs that have successfully claimed:
data/github-first-claims.jsonhasGithubUserClaimed() checks without side effects, markGithubUserClaimed() only called after successful Telegram postincrementGithubClaimCount() returns sequential claim number per userlifetimeClaimedLamports == amountLamports confirms it's truly the first claim on-chain@channel_name for public channels or the numeric ID (e.g., -100xxx) for private channels. To find the numeric ID, forward a channel message to @userinfobotLOG_LEVEL=debug to see all events the bot processesTelegram limits bots to ~30 messages per second to a channel. The grammY framework handles rate limiting automatically:
retry_after headersPOLL_INTERVAL_SECONDS to reduce event volumeSOLANA_RPC_URLS with multiple endpoints for automatic failoverPOLL_INTERVAL_SECONDSRpcFallback class provides round-robin across configured endpointsLOG_LEVEL=debug to see connection statusREQUIRE_GITHUB=true to only post GitHub social fee claimsFEED_CLAIMS=true is setSocialFeeIndex: loaded N mappingsGITHUB_TOKEN for 5,000 req/hrThe bot logs pipeline counters every 60 seconds:
Two React frontends are checked in, and they are not the same app:
| Directory | What it is | Build |
|---|---|---|
web/web/ | The full dashboard: SSE event stream, watch lists, SEO assets (robots.txt, sitemap.xml, llms.txt). Has its own lockfile, so npm ci works. | cd web/web && npm ci && npm run build |
packages/web/ | An earlier, smaller copy of the same UI. Its Dashboard renders generated sample events, with no SSE client. | cd packages/web && npm ci && npm run build |
The features listed below describe web/web/. Both directories build clean today;
consolidating them onto one is still open work.
Deep links (/dashboard, /docs, ...) are client-side routes, so any static host
must rewrite unknown paths to index.html. Each app now ships a vercel.json with
that rewrite; on a non-Vercel host, configure the equivalent SPA fallback.
| Page | Route | Description |
|---|---|---|
| Home | / | Landing page with project overview |
| Dashboard | /dashboard | Live event feed with SSE streaming |
| Create Coin | /create | Token creation interface |
| Docs | /docs | API documentation & Telegram commands |
| Packages | /packages | Package browser |
/api/v1/claims/stream with auto-reconnect (3s delay)GET/POST/DELETE /api/v1/watches)| Layer | Technology |
|---|---|
| Framework | React 18 |
| Router | React Router |
| Build | Vite 5 |
| Styling | Tailwind CSS |
| Language | TypeScript |
The bot includes a built-in Model Context Protocol (MCP) server that lets AI assistants (Claude, Copilot, Cursor, etc.) query PumpFun on-chain data conversationally.
| Tool | Description |
|---|---|
get_token_info | Token metadata, market cap, bonding curve progress, flags |
get_token_holders | Top holders with concentration metrics |
get_token_trades | Recent trade activity — volume, buy/sell counts |
get_pool_liquidity | PumpSwap AMM pool liquidity for graduated tokens |
get_bundle_info | Bundle detection (scam indicator) |
get_creator_profile | Creator launch history, scam estimate, recent coins |
get_github_user | GitHub profile by username or numeric ID |
get_claim_history | Claim status for a GitHub user — count, mints claimed |
get_sol_price | Current SOL/USD price |
Add to your MCP client config (e.g. claude_desktop_config.json):
Or run from source:
Run alongside the main bot by setting MCP_ENABLED=true:
The MCP endpoint is available at POST /mcp on the configured port. Clients connect using the Streamable HTTP transport.
Once connected, ask your AI assistant:
The bot exposes an HTTP health check server for Railway / Docker probes.
| Endpoint | Method | Description |
|---|---|---|
/health | GET | Health status with uptime and stats |
/ | GET | Alias for /health |
Response:
ok, 503 for degradedPORT or HEALTH_PORT env vars (default: 3000)The project uses Vitest: 203 tests across 11 suites, all green on npm test.
Every suite lives in src/__tests__/ (plus fixtures.ts, shared sample data).
| Suite | File | Coverage |
|---|---|---|
| Claim Tracker | claim-tracker.test.ts | First-claim detection, persistence, counters, lifetime totals |
| Claim Routing | claim-routing.test.ts | Which claims are posted, skipped, or routed to which feed |
| Credibility | credibility.test.ts | Deterministic 0-100 scoring, per-factor attribution, tier bounds |
| Dev Reputation | dev-reputation.test.ts | Persistent per-developer track record and averages |
| Formatters | formatters.test.ts | HTML card generation, escaping, null handling, edge cases |
| GitHub Client | github-client.test.ts | URL parsing, API response handling, cache behavior |
| Groq Client | groq-client.test.ts | AI summary generation, API key handling, HTML safety |
| Pump Client | pump-client.test.ts | Token, holder, trade, and creator API response handling |
| RPC Fallback | rpc-fallback.test.ts | Round-robin rotation, cooldowns, retryable error handling |
| X Client | x-client.test.ts | Influencer tier classification, follower formatting |
| E2E Pipeline | e2e.test.ts | End-to-end claim tracking, formatting, GitHub feed |
Set LOG_LEVEL=debug — all events are logged to stdout regardless of whether they're posted to Telegram.
| Component | Technology |
|---|---|
| Runtime | Node.js >= 20 (ESM) |
| Language | TypeScript 5.7 (strict mode) |
| Blockchain | Solana via @solana/web3.js |
| Telegram | grammY framework |
| AI | Groq API (llama-3.3-70b-versatile) |
| Frontend | React 18 + Vite 5 + Tailwind CSS |
| Testing | Vitest |
| Container | Docker (multi-stage Alpine, non-root) |
| MCP | @modelcontextprotocol/sdk (Streamable HTTP + stdio) |
| Hosting | Railway (auto-deploy from GitHub) |
| Dependencies | 6 production, 4 dev — intentionally minimal |
Contributions are welcome! See CONTRIBUTING.md for guidelines.
git checkout -b feat/my-feature)npm test) and typecheck (npm run typecheck)Found a vulnerability? Please report it responsibly — see SECURITY.md.
All rights reserved. See LICENSE.
Full documentation site: https://nirholas.github.io/pumpfun-claims-bot/