meme-coin-audit について
meme-coin-auditは、EVMとSolanaのミームコインやトークンを対象とするセキュリティ監査スキルです。ソースコード検査とオンチェーン調査を組み合わせ、権限、流動性、送金制御のリスク評価を支援します。
主な機能
- 01トークン固有の8種類の脆弱性確認
- 02EVMとSolanaのソースコード検索ガイド
- 03オンチェーン権限と流動性の確認
- 04Solana Token-2022のリスク指標
- 05Foundryの概念実証テンプレート
活用シーン
- 01投資前のミームコイン選別
- 02トークンのミント権限や手数料制御の確認
- 03Solanaトークンの権限と拡張機能の確認
- 04トークンのセキュリティ指摘に関する概念実証の作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ elementalsouls/ claude-bughunter --skill meme-coin-auditインストール後、Claude Code で/meme-coin-auditを入力して読み込まれたか確認します。
詳細
ミームコインとトークンのセキュリティ監査
EVM および Solana のミームコインを対象とした、高速なラグプル検出と詳細なトークンセキュリティ分析です。
監査前の致命的なシグナル
コードを一行も読む前に、以下を確認してください。いずれかに該当する場合は監査を中止してください。そのトークンはラグである可能性が高いか、調査する価値がありません。
致命的な項目(即座に中止)
- コントラクトが検証されていない(Etherscan/Solscan)→ ソースを監査できないため、信頼できません
- デプロイヤーのウォレットにラグプルの履歴がある(Etherscan のデプロイヤーページを確認)
- トークンの経過時間が 1 時間未満で、既知のチームもいない → 時期尚早です。より多くのデータが得られるまで待ってください
- ミント権限が保持されている(Solana)うえ、上限もない → 無限にミントできるため、確実にラグです
- フリーズ権限が保持されている(Solana)ミームコイン → ハニーポットが確定しています
- Transfer Hook が存在する(Token-2022)うえ、フックプログラムが変更可能 → ハニーポットの攻撃経路です
- Permanent Delegate 拡張機能(Token-2022)→ 保有者のすべてのトークンを奪えます
注意が必要な項目(最大限の注意を払って続行)
- 最大保有者が供給量の 20% 超を保有している(DEX プールを除く)
- LP がバーンされておらず、検証済みコントラクトでロックもされていない
- コントラクトがアップグレード可能、または管理者権限が保持されたプロキシである
- プールの流動性が $5K 未満
- ソーシャルメディアでの存在感がなく、匿名のデプロイヤーにも履歴がない
唯一のルール
「すべての権限とオーナー関数を確認してください。保持された権限こそがラグの攻撃経路です。」
すべてのラグプルには、特権操作が必要です。ミント、ブラックリスト登録、手数料変更、LP の引き出し、または権限の悪用です。特権を見つけたら、バグを見つけたことになります。
バグの分類(トークン固有の 8 種類)
1. 隠れたミント/無制限の供給量
よくあるラグのパターンです。デプロイヤーがローンチ後にトークンをミントし、LP に売り浴びせます。
簡易 grep(EVM):
grep -rn "function mint\|_mint(\|_balances\[.*\] +=" src/ --include="*.sol" | grep -v "test\|lib\|node_modules"
簡易 grep(Solana):
grep -rn "MintTo\|mint_to\|mint_authority" src/ --include="*.rs" | grep -v "test\|target"
中止条件: すべてのミント経路で MAX_SUPPLY が適用されている、またはミント関数が完全に削除されていること。
2. ハニーポット/送金制限
よくある詐欺のパターンです。購入はできますが、売却はできません。
簡易 grep:
grep -rn "blacklist\|isBlacklisted\|_bots\|maxTxAmount\|approve.*override\|tradingEnabled" src/ --include="*.sol"
Solana での同等機能:
grep -rn "freeze_authority\|transfer_hook\|TransferHook\|permanent_delegate" src/ --include="*.rs"
中止条件: ブラックリストのマッピング、Transfer Hook、フリーズ権限がいずれも存在しないこと。
3. 手数料操作
よくあるラグのパターンです。最初の購入後に売却手数料が 99% に設定されます。
簡易 grep:
grep -rn "setFee\|setSellFee\|_taxFee\|_sellFee" src/ --include="*.sol"
grep -rn "function set.*Fee" -A5 src/ --include="*.sol" | grep -v "require\|MAX\|<="
中止条件: 手数料設定関数に require(fee <= MAX_FEE) があり、MAX_FEE が 10% 以下であること。
4. 流動性プールの枯渇
LP の引き出し、移行、または操作によって価格を暴落させます。
簡易 grep:
grep -rn "migrateLP\|emergencyWithdraw\|\.sync()\|setPair\|setRouter" src/ --include="*.sol"
中止条件: LP トークンがデッドアドレスにバーンされ、移行関数とペア設定関数がないこと。
5. ボンディングカーブの操作
pump.fun 型のボンディングカーブを悪用します。
簡易 grep:
grep -rn "virtualReserve\|setCurve\|graduate\|bonding_curve" src/ --include="*.sol" --include="*.rs"
中止条件: カーブのパラメーターが不変で、グラデュエーションがパーミッションレスであること。
6. 権限の保持(SOLANA)
Solana トークンでミント/フリーズ/更新の権限が保持されています。
簡易 grep:
grep -rn "mint_authority\|freeze_authority\|update_authority\|close_authority" src/ --include="*.rs"
grep -rn "set_authority.*None" src/ --include="*.rs" # Good sign: revocation
中止条件: すべての権限が None で、オンチェーンで検証されていること。
7. 偽装された権限放棄/隠された所有権
所有権を放棄したように見せながら、バックドアによる制御権を保持しています。
簡易 grep:
grep -rn "renounceOwnership.*override\|_shadowAdmin\|_backupOwner\|selfdestruct" src/ --include="*.sol"
中止条件: renounceOwnership がオーバーライドされておらず、2 つ目の管理者ロールも selfdestruct もないこと。
8. 設計によるサンドイッチ攻撃の増幅
保有者が最大限サンドイッチ攻撃を受けやすくなるよう、コントラクトが設計されています。
簡易 grep:
grep -rn "swapExactTokensForETH" -A5 src/ --include="*.sol" | grep "0,"
grep -rn "swapThreshold\|_rebase\|mandatoryPool" src/ --include="*.sol"
中止条件: 自動スワップで適切なスリッページが設定され、リベースの仕組みがないこと。
高速な危険信号のチェック
上記 8 種類のバグ分類の grep をソースツリー全体に実行し、危険信号を素早く検出してください。これらを組み合わせることで、次の項目を検出できます。
- 直接的なミント/残高操作
- ブラックリストおよび送金制限のパターン
- 上限のない手数料設定関数
- LP 移行および緊急引き出し関数
- 偽装された権限放棄のオーバーライド
- スリッページゼロの自動スワップ
- Solana のあらゆる権限パターン
- Token-2022 の危険な拡張機能
ソースの grep では確認できない項目(別途検証してください):
- オンチェーンの状態(権限の検証には Etherscan/Solscan を使用)
- 保有者の分布(DEXTools/Birdeye を使用)
- LP のロック状況(Unicrypt/PinkLock/Solscan を使用)
- デプロイヤーのウォレット履歴(手動で確認)
Foundry の PoC テンプレート(トークンのエクスプロイト)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "forge-std/Test.sol";
import "../src/Token.sol";
contract TokenExploitTest is Test {
Token token;
address owner = makeAddr("owner");
address victim = makeAddr("victim");
address attacker = makeAddr("attacker");
// Uniswap V2 router (mainnet fork)
address constant ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
address constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
function setUp() public {
vm.createSelectFork("mainnet");
// Deploy token as owner
vm.startPrank(owner);
token = new Token();
// Add liquidity...
vm.stopPrank();
}
function test_hiddenMint_rug() public {
// Step 1: Victim buys tokens
vm.startPrank(victim);
// ... buy tokens on Uniswap
vm.stopPrank();
// Step 2: Owner mints and dumps
vm.startPrank(owner);
uint256 supplyBefore = token.totalSupply();
token.mint(owner, 1_000_000_000e18);
assertGt(token.totalSupply(), supplyBefore, "Supply should increase");
// ... sell minted tokens
vm.stopPrank();
// Step 3: Victim's tokens are now worthless
// Assert token price crashed
}
function test_honeypot_blacklist() public {
// Step 1: Victim buys
vm.startPrank(victim);
// ... buy tokens
vm.stopPrank();
// Step 2: Owner blacklists victim
vm.startPrank(owner);
token.blacklist(victim);
vm.stopPrank();
// Step 3: Victim cannot sell
vm.startPrank(victim);
vm.expectRevert("Blacklisted");
token.transfer(address(1), 100e18);
vm.stopPrank();
}
function test_fee_manipulation_rug() public {
// Step 1: Verify initial fee is low
assertEq(token.sellFee(), 3); // 3%
// Step 2: Owner sets fee to 99%
vm.prank(owner);
token.setFees(3, 99); // Buy 3%, Sell 99%
// Step 3: Victim sells — loses 99% to fees
vm.startPrank(victim);
uint256 balanceBefore = address(victim).balance;
// ... sell tokens
// Assert: received almost nothing
vm.stopPrank();
}
}
Solana のクイックチェック(ソースコード不要)
ソースコードがない場合は、オンチェーンで確認してください。
1. MINT AUTHORITY → solana account <MINT> --output json | check mint_authority
- Should be null
- If Some(pubkey) → CRITICAL: can mint infinite tokens
2. FREEZE AUTHORITY → same as above, check freeze_authority
- Should be null
- If Some(pubkey) → CRITICAL: honeypot
3. LP STATUS → Check Raydium/Orca pool
- LP burned? (tokens sent to 1111...1111)
- LP locked? (in verified locker with no backdoor)
- LP held by deployer? → CRITICAL: instant rug
4. TOP HOLDERS → Birdeye/Solscan holders tab
- Top 10 < 30% of supply (excluding pools)
- Creator wallets (check first transactions)
5. PROGRAM UPGRADEABILITY
- Is the program upgradeable? → can change any logic
- Upgrade authority should be None for immutable programs
6. TOKEN-2022 EXTENSIONS
- Any transfer hook? → potential honeypot
- Permanent delegate? → CRITICAL
関連スキルとチェーン
web3-audit— 対象がトークンだけでなく、DeFi プロトコルの場合に使用します。ワークフローの基本要素:このスキルのトークン固有の 8 つのバグクラスは、web3-auditの対象範囲に含まれます。対象にトークンコントラクト自体以外のレンディング/Vault/オラクルのロジックがある場合は、より広範な 10 の DeFi バグクラスを確認するため、web3-auditも読み込みます。triage-validation— ラグプルに関する指摘がバグバウンティへの提出に該当するか判断する場合に使用します。ワークフローの基本要素:「ラグの可能性がある」という観察結果の多くは、ラグが発生する前の警告であり、デプロイ済みプロトコルの悪用可能なバグではありません。7Q ゲートを実行して、「デプロイヤーがラグを起こせる」(情報提供)と「コントラクトが現在悪用可能である」(報告対象)を区別します。report-writing— Immunefi/非公開バウンティ向けに、確認済みのトークンセキュリティ上の指摘を報告書にまとめる場合に使用します。ワークフローの基本要素:ここで使用する Foundry PoC テンプレートを、report-writingの Immunefi 本文テンプレートに活用できます。offensive-osint— トークンにオフチェーンのインフラ(プロジェクトのウェブサイト、Telegram、デプロイヤーの個人情報の特定)がある場合に使用します。ワークフローの基本要素:オンチェーン監査はこのスキルの領域です。デプロイヤーのウォレット履歴、ソーシャルメディアでの活動、プロジェクトの正当性の確認にはoffensive-osintを使用します。bb-methodology— エンゲージメントの種類を確認する場合に使用します。ワークフローの基本要素:PART 0 では、「投資前のデューデリジェンス」(このスキルの主な用途)と「Immunefi のバグバウンティへの提出」(報告方法と深刻度の基準が異なる)を区別し、監査後の適切な引き継ぎ先を判断します。
オペレーター向けメモ(Claude-BugHunter)
エンゲージメントから得た知見と、ベンダー提供の基盤に対する 2026 年固有の追加事項です。 実際の許可済みエンゲージメントで得た知見と、 このリポジトリの 31 以上のスキル領域のライブテストにわたるフェーズ 2 の検証に基づいています。上流のコンテンツが WHAT を扱うのに対し、 このレイヤーでは「機能する場合」と「機能しない場合」を扱います。
Solana 固有のシグナル — 2025~2026 年の実情
Token-2022 の Transfer Hook は、新たなラグプルの手段です。Hook 権限は単一のキーに設定できます。そのキーを持つ者は、ローンチ後に任意のアドレスを一時停止/ブラックリスト登録したり、任意のアドレスに送金時手数料を課したりできます。Token-2022 のミントでは、必ず Hook 権限と Permanent Delegate 権限を確認してください。
# get mint extensions for a Token-2022 mint
spl-token display <MINT_ADDRESS> --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
# look for: TransferHook { authority: ... }, PermanentDelegate { delegate: ... }
TransferHook が null 以外の場合、そのキーの保有者は取引中に送金権限を取り消せます。PermanentDelegate が null 以外の場合、そのデリゲートはいつでも任意の保有者のトークンを移動できます(実質的に、機能として没収が組み込まれています)。どちらか一方だけでも、ラグプル級の問題です。
pump.fun のボンディングカーブは、カーブの K パラメーターを介して操作できます。ボンディングカーブ完了後もミント権限を保持するのは、典型的な出口詐欺の形です。カーブ完了後に mintAuthority を確認してください。正当なローンチでは null にしますが、詐欺では卒業後の売り抜けに備えて保持します。
ハニーポットの検出 — 明白なケースの先へ
transfer() はドライランでは成功するものの、特定のアドレスでは失敗します(送信者の許可リスト/ブロックリスト)。次の手順でテストします。シミュレーションで購入 → 別のアドレスへシミュレーションで送金 → シミュレーションで売却。購入と送金は成功するのに売却が失敗する場合は、ハニーポットです。
簡易トリアージ表:
| テスト | ハニーポットのシグナル |
|---|---|
| ランダムなウォレットから購入 | 成功する(必須です。そうでなければ誰も手を出しません) |
| 2 つ目のランダムなウォレットへ送金 | ハニーポットでは失敗することがよくあります |
| 元のウォレットから売却 | 失敗するか、50% を超える税が適用される |
| チームが管理するウォレットから売却 | 成功する(これが決定的な手掛かりです) |
複数ソースで検証します。solana-rugcheck、rugcheck.xyz、dexscreener のリスクシグナル、honeypot.is(EVM)。単一のソースを決して信用しないでください。ラグチェッカーは、悪意を後から発動させるパターン(最初の 7 日間は問題がなく、その後 Hook が有効化される)に欺かれる可能性があります。
LPロックの請求内容 — 信用せず、検証する
DexScreenerのLPロックバッジは、オンチェーンで検証しなければ何の意味もありません。実際のロックコントラクト(Unicrypt、TeamFinance、Bonkbot、PinkLock)を確認してください。
- ロック解除日 — バッジの表示ではなく、オンチェーンのタイムスタンプ
- ロック所有者 — デプロイヤーのウォレットですか?複数のロッカーにLPが分散していませんか?
- 延長/短縮の権限 — ロックコントラクトによっては、所有者がロック期間を短縮できます。これはロックを装った逃げ道です
- ロックコントラクトのバイトコード — バックドア付きのフォークではなく、正規のロッカーであることを確認します
「ロック済み」のLPの中には、1日ロックを毎週更新しているものがあります。買い手には1年間のロックと同じように見えても、デプロイヤーはどの火曜日にも期限切れのまま放置できます。必ずチェーンエクスプローラーでロックコントラクトのソースを確認してください。
投資前のデューデリジェンスを5分以内で行う
6つの質問による簡易フィルター:
- Mint authorityはnullですか?
- Freeze authorityはnullですか?
- Update authorityはnullですか(メタデータの不変性を確保するため)?
- LPは検証済みコントラクトで6か月超ロックされていますか?
- 上位10保有者の集中度は30%未満ですか(プール/バーンアドレスを除く)?
- ボンディングカーブは完了していますか(pump.funの場合)?また、完了後のMint authorityはnullですか?
「いいえ」が5つなら、手を引いてください。「いいえ」が3つならリスクが高いため、手を引いても構わない規模でのみ参入してください。「いいえ」が2つで、強いナラティブと薄い流動性がある場合、それは典型的な個人投資家向けの罠です。
流動性の低いミントでのMEV/サンドイッチ攻撃の増幅
流動性が5万ドル未満のミントを買うと、サンドイッチ攻撃を受けることは避けられません。SolanaとEthereumのボットインフラは、2026年には制度化されています。Jito MEV-shareやプライベートな注文フローのオークションなどがその例です。取引サイズが利用可能な流動性の1%を超えると、サンドイッチ攻撃による損失は5%超になると見込んでください。流動性の5%を超える場合、サンドイッチ攻撃だけで20%超のスリッページが発生すると見込んでください。
対策(2026年時点の有効性順):
- Jitoバンドル(Solana)— 優先チップを付けて送信し、MEVが入り込む隙を与えずアトミックに実行します
- Flashbots Protect RPC(Ethereum)— プライベートメンプール経由で送信します
- MEV保護付きDEXアグリゲーター — Jupiterのスリッページ保護、1inch Fusion、CoWSwap
- 注文の分割 — 1回の大口取引ではなく、N回の小口取引に分けることで、各取引のサンドイッチ攻撃の利益を減らします
ミントの流動性が低すぎて、分割注文でもサンドイッチ攻撃を受けるなら、それはより優れたツールを使うべきというサインではなく、取引を見送るべきというサインです。