PumpFun Claims Bot について
PumpFun Claims Bot は、PumpFun のオンチェーン活動を Telegram チャンネルに配信する読み取り専用のボットで、信頼性スコアなどの付加情報を含みます。単独で利用できる MCP サーバーも提供しており、AI クライアントから PumpFun のオンチェーン情報を参照したい場合に適しています。
主な機能
- 01GitHub ソーシャル手数料の請求とトークン移行イベントの配信
- 02決定的ルールに基づく 0〜100 の信頼性スコア
- 03過去のトークンを含む開発者履歴の保存
- 04初回請求に対する Groq によるワンライン要約
- 05複数の Solana RPC エンドポイントへの自動フェイルオーバー
活用シーン
- 01PumpFun の請求イベントを Telegram チャンネルでリアルタイムに受け取る
- 02AI アシスタントから PumpFun のトークンと請求情報を照会する
- 03GitHub 開発者の過去のトークン履歴を確認する
MCP 対応
本プロジェクトは npx pumpfun-claims-bot で起動する MCP サーバーを提供し、Claude Desktop や Cursor などの MCP クライアントから PumpFun のオンチェーン情報を利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y pumpfun-claims-botGITHUB_TOKENシークレットGitHub personal access token — raises API rate limit from 60 to 5000 req/hrSOLANA_RPC_URLSolana RPC HTTP URL for on-chain queries (defaults to public mainnet)ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
9掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| mint | string | はい | トークンのミントアドレス |
詳細
PumpFun Claims Bot
PumpFun のオンチェーンアクティビティ(GitHub ソーシャル手数料の請求、トークンの卒業など)を配信する、読み取り専用の Telegram チャンネルフィードです。インテリジェンス情報を充実させたカードを Telegram チャンネルにリアルタイムで投稿します。
ウェブサイト · ライブチャンネル · MCP サーバー · デプロイガイド · コントリビューション
インタラクティブなモニタリングをお探しですか? telegram-bot は、監視対象の管理、グループチャット、REST API、SSE ストリーミング、Webhook に対応しています。シンプルな一方向配信専用チャンネルには、このチャンネルボットをご利用ください。
関連ソース
Pump.fun GitHub Claims — nirholas/pumpfun-github-claims
は、@pumpfunclaims フィード向けの、目的を絞った関連リポジトリです。
GitHub の開発者とコインごとの初回報酬請求について、過去に請求されたコインをコンテキストとして含めた、単独で動作するボットのソースコードとドキュメントを提供します。
実装状況
では、残っているコイン帰属処理の作業状況を追跡しています。このリポジトリは、ウェブダッシュボード、MCP サーバー、信頼性スコアリング、開発者の評判追跡など、より幅広いツールキットを提供します。どちらのリポジトリも引き続きソースとして利用できます。
機能
GitHub の主張が実際に証明すること
クレームカードは、Pump.fun の GitHub ソーシャル手数料アカウントから実際にオンチェーンで出金された記録を起点とします。これは有用な証拠ですが、それだけで GitHub ユーザーがコインを作成、所有、または支持していることが証明されるわけではありません。トークンのメタデータはユーザーが入力したものであり、類似アカウントも存在します。また、1 つのソーシャル手数料アカウントが複数のコインで共有されている場合があります。
| ラベル | 意味 |
|---|---|
| 検証済み GitHub 手数料クレーム | クレームを行った GitHub ユーザーが、トークンのメタデータにリンクされたリポジトリの所有者と完全に一致します。 |
| 作成者ウォレットの GitHub 手数料クレーム | 受取人のウォレットもトークンを作成していますが、リポジトリの所有権は確認されていません。 |
| 身元不一致 | クレームを行ったユーザー名がリンクされたリポジトリの所有者と異なります。類似アカウントには危険信号として注意してください。 |
| 未検証 | 出金は実際に行われていますが、GitHub とコインの関係は証明されていません。 |
| 未解決のプール済み状態 | 手数料アカウントが複数のコインに紐づいているため、主要な CA やコインごとの金額は選択されていません。 |
「初回」は GitHub 手数料アカウントを指し、必ずしも表示されているコインを指すものではありません。取引ボタンは、リポジトリとの関係または作成者ウォレットとの関係が検証された場合にのみ表示されます。フィードは発見のための証拠であり、推奨を意味するものではありません。
フィードの種類
| フィード | 説明 | 切り替え |
|---|---|---|
| GitHub ソーシャル手数料クレーム | GitHub 開発者が PumpFun のソーシャル手数料 PDA 報酬をクレーム | FEED_CLAIMS |
| トークンの卒業 | ボンディングカーブから PumpAMM に移行するトークン | FEED_GRADUATIONS |
クレームインテリジェンス
GitHub のソーシャル手数料クレームカードには、次の情報が含まれます。
| 機能 | 説明 |
|---|---|
| 🟢 信頼性スコア | すべての信頼シグナルを総合した、決定論的な 0~100 の判定(高い/中程度/注意/高リスク)。透明性のある ±要因の内訳も表示します。 |
| 📊 開発者の実績 | 開発者ごとの永続的な評判情報です。リピーター開発者の過去のトークンと平均信頼性を表示するため、最新のコインが問題なさそうに見えても、手数料稼ぎを繰り返す開発者をすぐに見分けられます。 |
| 🚨 初回アラート | GitHub ユーザーが初めてクレームを行ったときに、🚨🚨🚨 FIRST TIME CLAIM バナーを表示します。 |
| ⚠️ 偽クレームの検出 | claim_social_fee_pda 命令が呼び出されたにもかかわらず、実際には手数料が支払われていない場合を検出します。 |
| 📊 クレーム回数 | 再起動後も保持される連番のクレーム番号です。 |
| 💹 生涯 SOL | PDA からこれまでにクレームされた SOL の合計です。 |
| 👤 GitHub プロフィール | ユーザー名、自己紹介、リポジトリ、フォロワー数、アカウント作成からの期間、所在地、ブログです。 |
| 𝕏 ソーシャルリンク | GitHub プロフィールから取得した、フォロワー数付きの Twitter/X プロフィールです。 |
| 🏅 インフルエンサーバッジ | フォロワー数の多い GitHub/X アカウントに付与される、ティア別のバッジです。 |
| 📈 トークン情報 | 卒業済みかボンディングカーブ上かの状態、カーブの進捗率、作成からの経過時間、返信数です。 |
| 🔗 トークンのソーシャルリンク | トークンのメタデータに含まれる Twitter、Telegram、ウェブサイトへのリンクです。 |
| 🏷️ トークンフラグ | NSFW、禁止、キャッシュバックの状態を示します。 |
| ⚠️ 信頼シグナル | 作成から 30 日未満の新しい GitHub アカウント、リポジトリがないアカウント、偽クレームに対する警告です。 |
| 🔗 取引リンク | アフィリエイトコード付きの Axiom、GMGN、Padre へのリンクです。 |
| ️ トークン画像 | 写真カードとして表示する、トークン画像または GitHub アバターです。 |
卒業カード
情報が充実した卒業カードには、作成者のプロフィール、大口保有者の分析、24 時間の取引高、開発者ウォレットのアクティビティ、プールの流動性、バンドルの検出結果が含まれます。
インフルエンサーのティアシステム
GitHub と X/Twitter のフォロワー情報を組み合わせ、クレームを行ったユーザーを分類します。
| ティア | バッジ | X フォロワー数 | GitHub フォロワー数 |
|---|---|---|---|
| メガ | 🔥🔥 メガインフルエンサー | ≥ 100K | ≥ 10K |
| インフルエンサー | 🔥 インフルエンサー | ≥ 10K | ≥ 1K |
| 注目ユーザー | ⭐ 注目ユーザー | ≥ 1K | ≥ 100 |
どちらか一方の基準を満たすと、そのティアに該当します。X のフォロワーが 50K、GitHub のフォロワーが 50 人のユーザーも、インフルエンサーに該当します。
信頼性スコアと開発者の実績
各クレームカードには、ボットがすでに収集している信頼性シグナルに、申告した開発者の過去のトークンにおける継続的な実績を加味した、決定論的な0〜100の信頼性判定が最初に表示されます。
スコアは決定論的で透明性があります。同じ入力からは常に同じ数値が算出され、モデル呼び出しは行われません。また、各ポイントの根拠となる要因は、見出しの下に名称付きで表示されます。
| Tier | Badge | Score |
|---|---|---|
| 強い | 🟢 | 75-100 |
| 中程度 | 🟡 | 55-74 |
| 注意 | 🟠 | 35-54 |
| 高リスク | 🔴 | 0-34 |
スコアは中立値の50から始まり、重み付けされた要因に基づいて調整されます。クレームの検証(GitHub所有者の不一致時は +22、または -20)、アカウントの年齢(5年以上で +14、30日未満で -18)、公開リポジトリ数、フォロワー数、スターが付いた非フォークリポジトリ、模倣(-10/-16)、同梱、保有者の集中度、過去のラグ、BANが考慮されます。
開発者の実績により、この単発のスコアが記録として残ります。各スコアは申告したGitHubユーザーIDに紐付けて記録・保存されるため、次にその開発者がトークンを発行したとき、カードに過去の実績が表示されます。これにより、最新のコインが問題なさそうに見える連続的な手数料稼ぎを見抜ける一方、確かな実績を持つビルダーは正当に評価されます。
🟢 Credibility: 100/100 · Strong
↑ claim verified · GitHub 6y · 42 repos · repo 150★
📊 Dev track record: 3 prior tokens · avg 🔴 19/100 (High Risk)
ロジックは src/credibility.ts(純粋な scoreCredibility)と src/dev-reputation.ts(永続ストア)にあり、どちらもテストで十分にカバーされています。
AIを活用したクレームの要約
初回のクレームでは、Groq(llama-3.3-70b-versatile)が生成した1行のAI所見が表示されます。
- 30以上のシグナルを分析します。トークンのメタデータ、GitHubプロフィール、作成者の履歴、取引アクティビティなどが対象です。
- 最大120文字で、率直かつ明確な意見を、トレーダー向けに提示します。
- タイムアウトは5秒で、失敗時は適切にフォールバックします(空文字列)。
- 出力はHTMLサニタイズ済みで、Telegram上でも安全です。
例:
「実在するGitHubプロジェクト。開発者はすぐに申告」 · 「人気リポジトリのフォーク。注意して進めてください」
アーキテクチャ
Solana RPC (WebSocket + HTTP polling)
│
▼
┌───────────────────┐
│ SocialFeeIndex │──▶ Bootstraps ~148K SharingConfig → mint mappings
└────────┬──────────┘
│
┌────────▼──────────┐
│ ClaimMonitor │──▶ Decodes PumpFees program claim transactions
│ EventMonitor │──▶ Decodes Pump program logs (graduations)
└────────┬──────────┘
│ FeeClaimEvent / GraduationEvent
┌────────▼──────────┐
│ Enrichment Layer │
│ ├─ GitHub API │──▶ User profile, repos, followers
│ ├─ X/Twitter API │──▶ Follower counts, influencer tier
│ ├─ PumpFun API │──▶ Token info, creator profile, holders, trades
│ ├─ ClaimTracker │──▶ First-claim detection, persistent counts
│ └─ Fake Detect │──▶ Instruction called but no payout (amountLamports=0)
└────────┬──────────┘
│ ClaimFeedContext
┌────────▼──────────┐
│ Formatters │──▶ Rich HTML cards with sections & emoji layout
└────────┬──────────┘
│
┌────────▼──────────┐
│ grammY Bot │──▶ Posts photo + caption to Telegram channel
│ (retry + rate │ Falls back to text-only if photo fails
│ limiting) │
└───────────────────┘
複数RPCへのフェイルオーバー
RpcFallbackクラスは、複数のSolana RPCエンドポイントを管理し、自動的に切り替えます。
- いずれかのエンドポイントで失敗が3回連続すると、ラウンドロビン方式で切り替え
- 失敗したエンドポイントは、再試行まで60秒間クールダウン
- 有効期限が最も近いエンドポイントにフォールバック — すべてのエンドポイントがクールダウン中の場合、クールダウンの終了が最も近いものを選択します
- 成功時にリセット — 1回成功すると、失敗カウンターがリセットされます
SOLANA_RPC_URLS(カンマ区切り)で設定します
監視対象のプログラム
| プログラム | ID | 用途 |
|---|---|---|
| PumpFees | pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ | 手数料の共有、ソーシャル手数料 PDA の請求 |
| Pump | 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P | ボンディングカーブ(卒業) |
| PumpAMM | pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA | AMM(卒業済みプールのイベント) |
デコードされる請求命令(v1 と、2026 年 10 月のアップグレードで導入された V2 バリアント):
| 命令 | プログラム | 備考 |
|---|---|---|
claim_social_fee_pda, claim_social_fee_pda_v2 | PumpFees | GitHub ソーシャル手数料の請求。V2 では USDC などのクォートミントで支払えます |
collect_creator_fee, collect_creator_fee_v2 | Pump | クリエイターボールトからクリエイターへの支払い |
distribute_creator_fees, distribute_creator_fees_v2 | Pump | クリエイター手数料を株主に分配 |
transfer_creator_fees_to_pump, transfer_creator_fees_to_pump_v2 | PumpAMM | プールのクリエイター手数料を Pump ボールトに戻す(支払いイベントなし) |
collect_coin_creator_fee | PumpAMM | プールのクリエイター手数料をクリエイターに支払う |
claim_cashback, claim_cashback_v2 | Pump, PumpAMM | トレーダーへのキャッシュバック |
sweep_creator_fee と sweep_protocol_fee(Pump と PumpAMM)は認識されますが、請求としてカウントされることはありません。スイープでは、カーブまたはプールに残っている手数料をクリエイターボールトに移すだけで、誰にも支払われないためです。請求トランザクションでは通常、最初にスイープが実行され、その後に請求が行われます。報告されるのは請求(ボールトからクリエイターへの支払い)のみで、各請求はそれぞれのイベントで支払われるため、二重にカウントされることはありません。スイープだけのトランザクションは何も投稿しません。
イベントデコーダーは、既知のプレフィックスから必要なフィールドを読み取り、末尾のバイトを無視するため、アップグレード前のイベントと、2026 年 10 月のより長い形式の両方をデコードできます。トレードでは、buy_v3、sell_v3、buy_exact_quote_in_v3、multi_hop_swap という命令名が認識されます。アップグレード後は、1 つの命令でボンディングカーブの完了後に新しい PumpSwap プールでも買い続けることができます(migrate の実行前に行われる合成移行)。クジラフィードは、その PostCompleteBuyEvent の数量を購入者の合計に加算し、トレードがカーブを完了したことを示します。
インストール
npm(MCP サーバー — AI アシスタントに推奨)
npx を使えば、クローンせずに MCP サーバーをすぐに実行できます。
npx pumpfun-claims-bot
または、グローバルにインストールします。
npm install -g pumpfun-claims-bot
pumpfun-claims-bot
MCP クライアントの設定(Claude Desktop、Cursor、VS Code Copilot)に追加します。
{
"mcpServers": {
"pumpfun": {
"command": "npx",
"args": ["pumpfun-claims-bot"]
}
}
}
npm パッケージ: pumpfun-claims-bot on npm
ソースから(ボット本体 + Telegram フィード)
git clone https://github.com/nirholas/pumpfun-claims-bot.git
cd pumpfun-claims-bot && npm install
クイックスタート
1. Telegram ボットを作成する
- Telegram で @BotFather にメッセージを送ります
/newbot→ プロンプトに従う → ボットトークンをコピーします- 公開チャンネル(例:
@pumpfunclaims)を作成します - ボットをチャンネルの管理者として追加します(「メッセージの投稿」権限が必要です)
2. 環境を設定する
cp .env.example .env
# ── Required ──────────────────────────────────────────────
TELEGRAM_BOT_TOKEN=your-bot-token-from-botfather
CHANNEL_ID=@your_channel_name # or numeric chat ID like -100xxx
# ── Solana RPC ────────────────────────────────────────────
SOLANA_RPC_URL=https://mainnet.helius-rpc.com/?api-key=your-key
SOLANA_WS_URL=wss://mainnet.helius-rpc.com/?api-key=your-key
# Comma-separated fallback RPCs (rotates on 429/5xx/timeout)
SOLANA_RPC_URLS=https://mainnet.helius-rpc.com/?api-key=key1,https://your-other-rpc.com
# ── Feed Toggles (all default false except FEED_CLAIMS) ───
FEED_CLAIMS=true # GitHub social fee claims (default: true)
FEED_GRADUATIONS=false # Token graduations to PumpAMM (default: false)
FEED_LAUNCHES=false # New token launches (default: false)
FEED_WHALES=false # Large buy/sell whale alerts (default: false)
FEED_FEE_DISTRIBUTIONS=false # Creator fee distribution events (default: false)
# ── Claim Filter ──────────────────────────────────────────
REQUIRE_GITHUB=true # Only post claims with GitHub social fee PDA (default: true)
# ── Enrichment APIs ───────────────────────────────────────
GITHUB_TOKEN=ghp_your_token # Raises GitHub rate limit: 60 → 5000 req/hr
GROQ_API_KEY=gsk_your_key # Groq API for AI one-liner summaries
# X/Twitter follower counts & influencer detection
# Get cookies from x.com DevTools → Application → Cookies
# X_AUTH_TOKEN=your_auth_token_cookie
# X_CT0_TOKEN=your_ct0_cookie
# ── Affiliate Ref Codes ───────────────────────────────────
# Appended to Axiom / GMGN / Padre trading links in cards
# AXIOM_REF=your_ref
# GMGN_REF=your_ref
# PADRE_REF=your_ref
# ── Tuning ────────────────────────────────────────────────
POLL_INTERVAL_SECONDS=30 # HTTP polling fallback interval (default: 30)
WHALE_THRESHOLD_SOL=10 # Minimum SOL for whale alerts (default: 10)
LOG_LEVEL=info # debug | info | warn | error (default: info)
# ── Health Check ──────────────────────────────────────────
# PORT=3000 # Set automatically by Railway
環境変数リファレンス
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
TELEGRAM_BOT_TOKEN | ✅ | — | ボットトークン — @BotFather にメッセージを送り、/newbot を実行します |
CHANNEL_ID | ✅ | — | 投稿先のチャンネル(@channelname または -100xxx)— 数値 ID は @userinfobot で取得します |
SOLANA_RPC_URL | ✅ | https://api.mainnet-beta.solana.com | Solana のプライマリ HTTP RPC — Helius、QuickNode、Alchemy で無料プランを利用できます |
SOLANA_WS_URL | — | SOLANA_RPC_URL から導出 | Solana WebSocket URL — SOLANA_RPC_URL と同じプロバイダーを使用し、https:// を wss:// に置き換えます |
SOLANA_RPC_URLS | — | — | カンマ区切りのフォールバック RPC URL — 429/5xx/タイムアウト時に自動で切り替わります |
FEED_CLAIMS | — | true | GitHub のソーシャル手数料請求カードを投稿します |
FEED_GRADUATIONS | — | false | トークンのグラデュエーションカードを投稿します |
FEED_LAUNCHES | — | false | 新規トークンのローンチカードを投稿します |
FEED_WHALES | — | false | クジラの買い/売りアラートを投稿します |
FEED_FEE_DISTRIBUTIONS | — | false | クリエイター手数料の分配イベントを投稿します |
REQUIRE_GITHUB | — | true | GitHub のソーシャル手数料 PDA がない請求をスキップします |
GITHUB_TOKEN | — | — | GitHub PAT — こちらで作成(スコープは不要)— レート制限を 60 req/hr から 5000 req/hr に引き上げます |
GROQ_API_KEY | — | — | AI による一文要約用の Groq API キー — console.groq.com で無料キーを取得 |
X_AUTH_TOKEN | — | — | X/Twitter の auth_token Cookie — x.com を開き、DevTools → Application → Cookies から auth_token をコピーします |
X_CT0_TOKEN | — | — | X/Twitter の ct0 Cookie(CSRF トークン)— 上記と同じ場所から ct0 をコピーします |
AXIOM_REF | — | — | Axiom の取引リンク用アフィリエイト紹介コード |
GMGN_REF | — | — | GMGN の取引リンク用アフィリエイト紹介コード |
PADRE_REF | — | — | Padre の取引リンク用アフィリエイト紹介コード |
POLL_INTERVAL_SECONDS | — | 30 | WebSocket を利用できない場合の HTTP ポーリング間隔 |
WHALE_THRESHOLD_SOL | — | 10 | クジラアラートを発生させる最小 SOL 取引量 |
LOG_LEVEL | — | info | ログの詳細度:debug | info | warn | error |
PORT | — | 3000 | ヘルスチェック用 HTTP サーバーのポート — Railway によって自動設定されます |
MCP_ENABLED | — | false | AI アシスタントとの連携用に MCP(Model Context Protocol)サーバーを有効にします |
MCP_PORT | — | 3001 | MCP サーバーの HTTP ポート(Streamable HTTP トランスポート) |
3. 実行
# Install dependencies
npm install
# Development (hot reload via tsx)
npm run dev
# Production
npm run build
npm start
4. Docker でデプロイ
docker build -t pumpfun-channel-bot .
docker run -d --env-file .env pumpfun-channel-bot
5. Railway にデプロイ
Railway は GitHub から自動デプロイし、請求追跡データ用の永続ボリュームを提供します。
# Install Railway CLI
npm install -g @railway/cli
railway login
# Create & link project
railway init
railway link
# Set environment variables
railway variables set TELEGRAM_BOT_TOKEN=your-token
railway variables set CHANNEL_ID=@your_channel_name
railway variables set SOLANA_RPC_URL=https://mainnet.helius-rpc.com/?api-key=your-key
railway variables set SOLANA_WS_URL=wss://mainnet.helius-rpc.com/?api-key=your-key
railway variables set FEED_CLAIMS=true
railway variables set REQUIRE_GITHUB=true
# Create persistent volume for claim tracker data
railway volume create --mount /app/data
# Deploy
railway up
デプロイ設定については、railway.json を参照してください。
{
"$schema": "https://railway.app/railway.schema.json",
"build": {
"builder": "DOCKERFILE",
"dockerfilePath": "Dockerfile"
},
"deploy": {
"restartPolicyType": "ON_FAILURE",
"restartPolicyMaxRetries": 10
}
}
プロジェクト構成
pumpfun-claims-bot/
├── src/
│ ├── index.ts # Entry point — wires monitors, enrichment, & Telegram posting
│ ├── config.ts # Environment variable loading & validation
│ ├── mcp-server.ts # MCP server — exposes tools via Streamable HTTP or stdio
│ ├── mcp-stdio.ts # Standalone MCP entry point (stdio transport)
│ ├── claim-monitor.ts # PumpFees program monitor (WebSocket + HTTP polling)
│ ├── claim-routing.ts # Decides which claims are posted, skipped, or re-routed
│ ├── claim-tracker.ts # First-claim detection + claim counter (persisted to disk)
│ ├── credibility.ts # Deterministic 0-100 credibility scoring
│ ├── dev-reputation.ts # Persistent per-developer track record store
│ ├── event-monitor.ts # Pump program log decoder (graduations, launches)
│ ├── social-fee-index.ts # SocialFeeIndex — maps SharingConfig PDAs → mints (~148K)
│ ├── formatters.ts # Rich HTML card builders for Telegram
│ ├── pump-client.ts # PumpFun HTTP API client (token info, creator profiles)
│ ├── github-client.ts # GitHub API client (user profiles, rate-limited cache)
│ ├── x-client.ts # X/Twitter profile fetcher + influencer tier logic
│ ├── groq-client.ts # Groq AI one-liner summaries
│ ├── rpc-fallback.ts # Multi-RPC failover with round-robin
│ ├── health.ts # HTTP health check server
│ ├── types.ts # Program IDs, discriminators, event types
│ └── logger.ts # Leveled console logger
├── src/__tests__/ # Vitest suites (203 tests) + shared fixtures
├── packages/web/ # React dashboard, mock-data build (see Web Dashboard)
├── web/web/ # React dashboard, live-SSE build (see Web Dashboard)
├── leaderboard-bot/ # Separate Telegram bot: GitHub dev earnings leaderboard
├── data/ # Persisted state (gitignored, Railway volume mount)
│ └── github-first-claims.json
├── Dockerfile # Multi-stage Docker build
├── railway.json # Railway deployment config
├── package.json
└── tsconfig.json
仕組み
請求検出パイプライン
Transaction detected on PumpFees program
│
▼
Skip sweep_creator_fee / sweep_protocol_fee (not a payout)
│
▼
Identify instruction: claim_social_fee_pda or claim_social_fee_pda_v2?
│
├─ YES ──▶ Parse platform (2 = GitHub) + user_id from Anchor args
│ │
│ ▼
│ Check amountLamports from SocialFeePdaClaimed event
│ │
│ ├─ amountLamports > 0 ──▶ Real claim
│ │ ├─ Check ClaimTracker: first time for this GitHub user?
│ │ │ ├─ YES ──▶ 🚨 FIRST TIME CLAIM banner
│ │ │ └─ NO ──▶ Standard claim card
│ │ └─ Enrich: GitHub API + PumpFun API + X profile
│ │
│ └─ amountLamports = 0 ──▶ ⚠️ FAKE CLAIM (instruction called, no payout)
│
└─ NO ───▶ Other claim type (creator fee, cashback, etc.)
SocialFeeIndex の初期化
起動時に、ボットは PumpFees プログラムからすべての SharingConfig アカウントを取得し、ソーシャル手数料 PDA アドレスからトークンミントへの逆引きマッピングを構築します。これにより、追加の RPC 呼び出しなしで、ソーシャル手数料の請求がどのトークンに属するかを解決できます。
- 起動時に 約 148K 件のマッピングを読み込みます
CreateFeeSharingConfigおよびUpdateFeeSharesイベントの WebSocket サブスクリプションを通じて増分更新します- 検索:
socialFeeIndex.getMintForPda(pdaAddress)→ トークンミント - 1 つの PDA → 複数のミント — 複数のトークンで PDA を使い回す詐欺師にも対応します
偽の請求の検出
一部のユーザーは、手数料を回収できないランダムなトークン PDA を対象に claim_social_fee_pda 命令を呼び出します。ボットは次の方法でこれらを検出します。
- 命令の識別子が
claim_social_fee_pdaまたはclaim_social_fee_pda_v2と一致する - トランザクションログに
SocialFeePdaClaimedイベントが含まれていない、またはイベントのamountLamports = 0である - GitHub ユーザー ID とプラットフォームは、命令の引数(Anchor Borsh 形式)から引き続き解析される
偽の請求は、⚠️ FAKE CLAIM の警告と 🚩 Fake claim — no fees paid out の信頼性シグナルを付けて投稿されます。
初回請求の追跡
ClaimTracker は、請求に成功した GitHub ユーザー ID の永続的なセットを管理します。
- 処理中にすばやく検索できるメモリ内セット
data/github-first-claims.jsonへのディスク保存のデバウンス(5 秒の遅延)- 確認と記録を分けるパターン:
hasGithubUserClaimed()は副作用なしで確認し、markGithubUserClaimed()は Telegram への投稿成功後にのみ呼び出されます - 請求カウンター:
incrementGithubClaimCount()はユーザーごとの連番の請求番号を返します - 偽の請求では初回請求ステータスは設定されません
3 層の初回請求検証
- ローカルの重複排除 — すでに投稿済みの場合はスキップします(永続化された JSON により再起動後も維持されます)
- オンチェーン検証 —
lifetimeClaimedLamports == amountLamportsの場合、オンチェーンで実際に初回の請求であることを確認できます - 安全なフォールバック — 検証に失敗した場合は初回請求のバナーをスキップします(再デプロイ後の誤検出を防ぎます)
請求カードの例
🚨🚨🚨 FIRST TIME CLAIM 🚨🚨🚨
🐙 $PUMP — PumpCoin 💹 $45K
↳ GitHub dev claimed PumpFun social fees
📊 Claim #1 · 0.1043 SOL lifetime ($15.65)
🏦 0.1043 SOL ($15.65)
↳ 8mNp...4rWz
👤 nirholas (Nicholas)
↳ 📦 45 · 👁 200 · 📅 5y ago
TypeScript SDK builder
𝕏 nichxbt · 1.2K
📈 Bonding curve (72%) · Created 3h ago · 💬 12
𝕏 @pump_coin · 💬 TG · 🌐 pumpcoin.io
⚠️ GitHub account created 15d ago
CA: 7xKXt...p3Bz
Axiom · GMGN · Padre
🔍 TX
必要条件
- Node.js >= 20.0.0
- Telegram ボットトークン(@BotFather 経由)
- ボットを管理者として追加した Telegram チャンネル
- Solana RPC エンドポイント — 専用 RPC を推奨します(Helius、QuickNode、Triton)。パブリックメインネットも利用できますが、レート制限がかかる場合があります。
- GitHub トークン(任意)— API のレート制限が 60 req/hr から 5,000 req/hr に引き上げられます
トラブルシューティング
ボットがメッセージを投稿しない
- ボットの権限を確認する — ボットはチャンネルの管理者で、「メッセージを投稿」の権限を持っている必要があります
- CHANNEL_ID を確認する — 公開チャンネルには
@channel_name、非公開チャンネルには数値 ID(例:-100xxx)を使用します。数値 ID を確認するには、チャンネルのメッセージを @userinfobot に転送します - Telegram 403 エラー — ボットがチャンネルのメンバーまたは管理者ではないことを意味します。チャンネルの設定 → 管理者 → 管理者を追加から追加してください
- ログを確認する —
LOG_LEVEL=debugを設定すると、ボットが処理するすべてのイベントを確認できます
レート制限
Telegram は、ボットがチャンネルに送信できるメッセージを約 30 件/秒に制限しています。grammY フレームワークがレート制限を自動的に処理します。
- メッセージは遅延する場合がありますが、破棄されることはありません
- ボットには
retry_afterヘッダーを考慮した再試行ヘルパーが含まれています - アクティビティが非常に多い場合は、
POLL_INTERVAL_SECONDSを増やしてイベント量を減らしてください
RPC 接続の問題
- パブリック RPC エンドポイントにはレート制限があります。本番環境では専用 RPC を使用してください
- 自動フェイルオーバーのため、
SOLANA_RPC_URLSに複数のエンドポイントを設定してください - WebSocket が切断された場合、ボットは
POLL_INTERVAL_SECONDS間隔の HTTP ポーリングに切り替わります RpcFallbackクラスは、設定されたエンドポイントをラウンドロビン方式で使用します- 接続状態を確認するには、
LOG_LEVEL=debugを設定してください
請求が見つからない
- GitHub の請求のみですか? — GitHub のソーシャル手数料の請求のみを投稿するには、
REQUIRE_GITHUB=trueを設定します - フィードが無効ですか? —
FEED_CLAIMS=trueが設定されていることを確認してください - SocialFeeIndex の処理が遅いですか? — 初回のブートストラップでは約 148K 個のアカウントを取得します。起動時に 30~60 秒かかります。ログで
SocialFeeIndex: loaded N mappingsを確認してください - レート制限がかかっていますか? — GitHub API の認証なしでの利用は 60 req/hr までです。5,000 req/hr にするには
GITHUB_TOKENを設定してください
パイプライン統計
ボットは60秒ごとにパイプラインのカウンターを記録します。
Pipeline: 15 total → 8 social → 3 first / 5 repeat → 8 posted (skip: 7 cashback)
- total:受信したすべての請求イベント
- social:GitHub のソーシャルフィー PDA の請求
- first/repeat:初回請求者とリピーター
- posted:Telegram への投稿に成功した件数
- skip cashback:キャッシュバックの請求(ユーザーへの返金であり、クリエイターの活動ではありません)
Web ダッシュボード
React フロントエンドが2つチェックインされていますが、同じアプリではありません。
| ディレクトリ | 内容 | ビルド |
|---|---|---|
web/web/ | 完全版ダッシュボード:SSE イベントストリーム、ウォッチリスト、SEO アセット(robots.txt、sitemap.xml、llms.txt)。専用のロックファイルがあるため、npm ci を実行できます。 | cd web/web && npm ci && npm run build |
packages/web/ | 同じ UI の旧版の小規模なコピーです。ダッシュボードには生成されたサンプルイベントが表示され、SSE クライアントはありません。 | cd packages/web && npm ci && npm run build |
以下に記載する機能は web/web/ のものです。どちらのディレクトリも現在は問題なくビルドできますが、1つに統合する作業はまだ未完了です。
ディープリンク(/dashboard、/docs など)はクライアントサイドルートのため、静的ホストでは不明なパスを index.html にリライトする必要があります。各アプリには、このリライトを行う vercel.json が含まれています。Vercel 以外のホストでは、同等の SPA フォールバックを設定してください。
ページ
| ページ | ルート | 説明 |
|---|---|---|
| ホーム | / | プロジェクトの概要を紹介するランディングページ |
| ダッシュボード | /dashboard | SSE ストリーミングによるライブイベントフィード |
| コイン作成 | /create | トークン作成インターフェース |
| ドキュメント | /docs | API ドキュメントと Telegram コマンド |
| パッケージ | /packages | パッケージブラウザー |
ダッシュボードの機能
- Server-Sent Events(SSE) —
/api/v1/claims/stream経由のリアルタイムストリーミングと自動再接続(3秒の遅延) - イベントフィルター — すべて、ローンチ、クジラ、卒業、請求、分配
- ライブ統計バー — イベント種別ごとのカウンター
- ウォッチリスト — 監視するウォレットアドレスを追加・削除(
GET/POST/DELETE /api/v1/watches) - 詳細なイベントカード — トークンのローンチ、クジラの取引、卒業、手数料の請求をコンテキストとともに表示
- 接続ステータス — エラーメッセージ付きの視覚的なインジケーター
- モックデータへのフォールバック — SSE が利用できない場合にシミュレートされたフィードを表示
技術スタック
| レイヤー | テクノロジー |
|---|---|
| フレームワーク | React 18 |
| ルーター | React Router |
| ビルド | Vite 5 |
| スタイリング | Tailwind CSS |
| 言語 | TypeScript |
MCP サーバー
ボットには、AI アシスタント(Claude、Copilot、Cursor など)が PumpFun のオンチェーンデータを対話形式で照会できる、組み込みのModel Context Protocol(MCP)サーバーが含まれています。
MCP ツール
| ツール | 説明 |
|---|---|
get_token_info | トークンのメタデータ、時価総額、ボンディングカーブの進捗状況、フラグ |
get_token_holders | 保有比率の指標を含む上位保有者 |
get_token_trades | 最近の取引アクティビティ — 取引量、買い・売りの件数 |
get_pool_liquidity | 卒業済みトークンの PumpSwap AMM プール流動性 |
get_bundle_info | バンドル検出(詐欺の指標) |
get_creator_profile | クリエイターのローンチ履歴、詐欺の推定、最近のコイン |
get_github_user | ユーザー名または数値 ID による GitHub プロフィール |
get_claim_history | GitHub ユーザーの請求状況 — 件数、請求したミント |
get_sol_price | 現在の SOL/USD 価格 |
使用方法:Stdio トランスポート(Claude Desktop / Cursor / VS Code)
MCP クライアントの設定(例:claude_desktop_config.json)に追加します。
{
"mcpServers": {
"pumpfun": {
"command": "npx",
"args": ["pumpfun-claims-bot"]
}
}
}
または、ソースから実行します。
# Development (tsx)
npm run mcp:dev
# Production (compiled)
npm run build && npm run mcp
使用方法:Streamable HTTP トランスポート(組み込み)
MCP_ENABLED=true を設定して、メインボットとともに実行します。
MCP_ENABLED=true MCP_PORT=3001 npm run dev
MCP エンドポイントは、設定したポートの POST /mcp で利用できます。クライアントは Streamable HTTP トランスポートを使用して接続します。
質問の例
接続したら、AI アシスタントに次のように質問できます。
- 「ミントアドレス 7xKXt...p3Bz のトークン情報を調べて」
- 「GitHub ユーザー 12345 は PumpFun の手数料を請求したことがありますか?」
- 「このトークンの上位保有者は誰ですか?」
- 「このトークンのローンチがバンドルされていたか確認して」
- 「現在の SOL 価格はいくらですか?」
ヘルスチェック API
ボットは、Railway / Docker のプローブ向けに HTTP ヘルスチェックサーバーを公開します。
| エンドポイント | メソッド | 説明 |
|---|---|---|
/health | GET | 稼働時間と統計情報を含むヘルスステータス |
/ | GET | /health のエイリアス |
レスポンス:
{
"status": "ok",
"uptime": "12345s",
"uptimeMs": 12345000
}
okの場合は 200、degradedの場合は 503 を返します- コールバックを介して動的な統計情報を注入します(パイプラインのカウンター、接続ステータス)
- ポートは
PORTまたはHEALTH_PORT環境変数で設定できます(デフォルト:3000)
テスト
このプロジェクトでは Vitest を使用しています。12 個のスイートにわたる 204 件のテストがあり、npm test ですべて成功します。
# Run all tests
npm test
# Watch mode (re-runs on file changes)
npm run test:watch
テストスイート
各スイートは src/__tests__/ にあります(共有サンプルデータの fixtures.ts も含みます)。
| スイート | ファイル | カバレッジ |
|---|---|---|
| クレームトラッカー | claim-tracker.test.ts | 初回クレームの検出、永続化、カウンター、累計 |
| MCP Stdio | mcp-stdio.test.ts | CLI の初期化、ツールの検出、リリースバージョン、プロトコル出力の整合性 |
| クレームルーティング | claim-routing.test.ts | 投稿、スキップ、または振り分け先フィードが決まるクレーム |
| 信頼性 | credibility.test.ts | 決定論的な 0~100 のスコアリング、要因ごとの帰属、ティアの範囲 |
| 開発者の評判 | dev-reputation.test.ts | 開発者ごとの永続的な実績と平均値 |
| フォーマッター | formatters.test.ts | HTML カードの生成、エスケープ、null の処理、エッジケース |
| GitHub クライアント | github-client.test.ts | URL の解析、API レスポンスの処理、キャッシュの動作 |
| Groq クライアント | groq-client.test.ts | AI 要約の生成、API キーの処理、HTML の安全性 |
| Pump クライアント | pump-client.test.ts | トークン、保有者、取引、作成者に関する API レスポンスの処理 |
| RPC フォールバック | rpc-fallback.test.ts | ラウンドロビンのローテーション、クールダウン、再試行可能なエラーの処理 |
| X クライアント | x-client.test.ts | インフルエンサーのティア分類、フォロワー数のフォーマット |
| E2E パイプライン | e2e.test.ts | クレーム追跡、フォーマット、GitHub フィードのエンドツーエンドテスト |
ローカル開発
# Install dependencies
npm install
# Run with hot reload (tsx)
npm run dev
# Type-check without emitting
npm run typecheck
LOG_LEVEL=debug を設定すると、Telegram に投稿されるかどうかにかかわらず、すべてのイベントが stdout に記録されます。
技術スタック
| コンポーネント | 技術 |
|---|---|
| ランタイム | Node.js >= 20(ESM) |
| 言語 | TypeScript 5.7(strict モード) |
| ブロックチェーン | @solana/web3.js 経由の Solana |
| Telegram | grammY フレームワーク |
| AI | Groq API(llama-3.3-70b-versatile) |
| フロントエンド | React 18 + Vite 5 + Tailwind CSS |
| テスト | Vitest |
| コンテナ | Docker(マルチステージ Alpine、非 root) |
| MCP | @modelcontextprotocol/sdk(Streamable HTTP + stdio) |
| ホスティング | Railway(GitHub から自動デプロイ) |
| 依存関係 | 本番用 6 件、開発用 4 件 — 意図的に最小限にしています |
コントリビューション
コントリビューションを歓迎します!ガイドラインについては CONTRIBUTING.md をご覧ください。
- リポジトリをフォークします
- 機能ブランチを作成します(
git checkout -b feat/my-feature) - テスト(
npm test)と型チェック(npm run typecheck)を実行します - プルリクエストを作成します
セキュリティ
脆弱性を発見しましたか?責任ある方法でご報告ください。SECURITY.md をご覧ください。
ライセンス
All rights reserved. 詳細については LICENSE をご覧ください。
ドキュメント
ドキュメントサイト全文:https://nirholas.github.io/pumpfun-claims-bot/
スター履歴
プロジェクトを応援する
pumpfun-claims-bot が時間の節約に役立ったら、GitHub でスターを付けてください。スターがあることで、ほかの開発者や AI エージェントが信頼できるリポジトリを見つけやすくなります。クリックは 1 回で済みます。
使ってくれそうな人を知っていますか? X に投稿する · Bluesky で共有する · LinkedIn で共有する · Hacker News に投稿する · Reddit で共有する
AI エージェントにも対応
コーディングエージェントや LLM ツールは、このリポジトリを直接参照できます。AGENTS.md、llms.txt、llms-full.txt。エージェントに https://github.com/nirholas/pumpfun-claims-bot を指定すれば、必要なコンテキストを取得できます。
同じ作者によるその他のプロジェクト
- nirholas の全リポジトリ:トピック別に分類された全カタログ
- three.ws:Solana ウォレット、スキルマーケットプレイス、x402 決済を備えた 3D AI エージェント向けプラットフォーム
- 質問やアイデアはこちら:issue を作成するか、ディスカッションを開始する
コントリビューター
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。