bankr-token-scam-analysis/SKILL.md
Deep on-chain scam / rug / soft-rug analysis for EVM tokens (especially Clanker, Doppler, Bankr-style single-admin ERC-20s). Use when the user asks to "analyze this token for scam", "is this a rug", "should I trust this migration", "do a deep dive on holders and deployer", or provides one or more token addresses and wants a risk verdict backed by on-chain facts. Especially useful for migration narratives where a team claims they are "redeploying to fix tokenomics".
npx skillsauth add bankrbot/skills token-scam-analysisInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are performing a forensic on-chain analysis to determine whether a token (or set of tokens) is a scam, rug-pull, or soft-rug. The output is a written report saved to the user's file storage plus a verdict in chat.
Narrative is noise. On-chain state is signal. Every claim the team makes should be checked against what the contract and the deployer's wallet actually did. If the two conflict, the chain wins.
BUT: on-chain cleanliness ≠ not a scam. A team can deploy a perfectly clean LayerZero OFT or ERC-20, hand it to a multisig, and still run a textbook insider pump-and-dump via CEX coordination and concentrated supply. You MUST always run the off-chain intel pass (Step Final-1) before issuing a verdict, or you will under-call real manipulation cases.
Before making any claim about what a team "could not" or "should have" configured, read the deployment docs for the launch platform. Otherwise you will miss capabilities and bait on the team's narrative. Identify the platform by looking at the allData() context field (e.g., "interface":"clanker.world"), the deploy factory address, or the token ABI (admin/originalAdmin/allData/isVerified is Clanker-style).
Priority reads by platform:
allData() context = clanker.world, factory 0xe85a59c628f7d27878aceb4bf3b35733630083a9):
search_tool.import "@layerzerolabs/oft-evm/contracts/OFT.sol" and peers(uint32), setPeer, send, setEnforcedOptions): standard multichain pattern. setPeer by owner is the main live admin power — if signers collude they can add a malicious peer chain and mint via _credit. Existing peers matching across chain explorers = legit bridge config. LZ V2 endpoint on Base: 0x1a44076050125825900e736c501f859c50fE728c.Save this step to your report. The "Claim vs reality" section needs to quote a specific docs capability the team could have used and chose not to.
token_search (identifier_type=address, chain=...) — baseline market data: price, mcap, volume, 24h change, holder count, security scan flag. Set include_chart=false, include_market_data_image=false to keep context lean.
get_token_launch_info — if the token was deployed via Bankr/Doppler, you get the deployer wallet + twitter handle + tweet URL for free. Always try this first even if you think it's Clanker; the tool returns cleanly on non-match.
get_contract_abi (chain=...) — confirm the address is a real contract and enumerate read/write functions. Flag dangerous functions: mint, crosschainMint, setOwner, updateAdmin, blacklist, setFee, pause, updateImage, updateMetadata. For OFTs, note setPeer / setEnforcedOptions — these are owner-gated but not exit-scam primitives by themselves.
read_contract for on-chain state. For Clanker v4 tokens:
totalSupply() view returns (uint256) — expect 100_000_000_000 * 10^18.allData() view returns (address originalAdmin, address admin, string image, string metadata, string context) — the single richest read. Tells you deployer admin, current admin (if different = admin handoff happened), whether metadata/socials/audits are populated, and which interface launched it (clanker.world, Farcaster, etc.).isVerified() view returns (bool) — Clanker's own verification flag.balanceOf(address) view returns (uint256) — for any wallet you want to check (admin, top holders, pool manager).
For OFTs: owner(), peers(uint32) for each known eid (Ethereum=30101, BSC=30102, Arbitrum=30110, Base=30184, Polygon=30109, Optimism=30111), endpoint(), msgInspector(), preCrime().get_clanker_reward_ownership (tokenAddress, chain) — returns every reward recipient/admin slot for the token. This is the single best signal for "did the team actually allocate ecosystem/marketing/CEX rewards like they claim" — if it shows only one {admin, recipient} both equal to the deployer, the team did NOT configure multi-recipient tokenomics.
Direct viem reads via execute_cli when you need to batch-check balances, detect contract vs EOA (top holders with 48-byte bytecode are AA smart-wallet sniper proxies, not whales), or compute concentration. Install [email protected] and run a small analyze.mjs.
RPC configuration (custom env var is OPTIONAL):
get_env_vars to check if the user has set a custom RPC var for the chain you're analyzing (BASE_RPC_URL, MAINNET_RPC_URL, ARBITRUM_RPC_URL, etc.). If present, use it — it's almost always higher-rate-limit.transport URL). Example:
import { createPublicClient, http } from 'viem';
import { base } from 'viem/chains';
const rpcUrl = process.env.BASE_RPC_URL; // may be undefined
const client = createPublicClient({
chain: base,
transport: rpcUrl ? http(rpcUrl) : http(), // http() with no arg uses chain.rpcUrls.default
});
This works for base, mainnet, arbitrum, optimism, polygon, bnb, unichain, etc. out of the box.429 / timeouts when batching many reads, either (a) add small delays between calls, (b) chunk the reads, or (c) tell the user at the end of the report that a custom RPC env var would make re-runs faster and more reliable — don't block the analysis on it.Always use this viem step to:
totalSupply, admin, originalAdmin, isVerified, allData from the RPC directly (don't trust only indexer outputs).getBalance + getTransactionCount for each deployer and the claimed Twitter wallet.getBytecode on each top non-pool holder — 48 bytes = EIP-7702 / minimal-proxy smart wallet (sniper pattern); >100 bytes = real contract (could be Clanker vault/airdrop extension, or a Gnosis Safe); no code = regular EOA.VERSION() / getOwners() function — you can detect them specifically.market_intelligence with query_type="holders" (chain, token_id=contract address, limit up to 20) — top holder distribution. The #1 holder is almost always the Uniswap v4 PoolManager (0x498581ff718922c3f8e6a244956af099b2652b2b on Base). Always identify pool addresses first and exclude them from concentration math.
get_chain_activity_for_wallet on each interesting wallet:
get_evm_address_from_twitter_username / get_evm_address_from_farcaster_username — resolve the claimed social handle to a wallet. Then check with get_chain_activity_for_wallet and viem getTransactionCount whether that wallet is the admin of any contract or has any footprint on the deploy chain. Most rugs have social wallets with ZERO activity on the chain they're scamming.
browse_url on basescan/etherscan/polygonscan (https://basescan.org/address/{addr}) only as fallback when get_contract_abi fails or to confirm an address is a DEX/pool/infra contract. Many docs sites (gitbook-hosted root pages) return empty via firecrawl — go directly to the specific article URLs. After extracting the fact you need, immediately prune_messages(tool_names=["browse_url"], replacement="<one-line fact>").
perform_technical_analysis (only if user is Bankr Club — will error otherwise, don't retry).
A contract can be on-chain-clean and still be a running manipulation case. Before writing the TL;DR verdict, you MUST run a parallel off-chain pass. Run these three calls IN PARALLEL in one turn:
search_tool for investigator / press coverage:
"<TOKEN_SYMBOL>" <token_name> scam rug investigation twitterZachXBT <TOKEN_SYMBOL> manipulation (ZachXBT is the most-trusted on-chain investigator in crypto — always check for direct callouts by name)<TOKEN_SYMBOL> pump dump exchange investigation <current_year> (to catch Bitget/Binance/OKX/Gate investigation announcements)"<founder name>" <token_name> founder (to identify the team and any prior-project baggage)get_social_sentiment_for_ticker — pass the ticker and additionalContext describing the token, chain, and whether it's in a parabolic move. Returns community split, funding-rate context, and surfaced allegations.browse_url on the project's official X/Twitter account if known (format: https://x.com/<handle>) — look for self-warnings from the project itself. A team publicly "warning" its own community about "extreme volatility" during a parabolic move is often a soft acknowledgment of insider distribution about to begin.If you skip this step and issue a verdict based only on on-chain data, you will systematically under-call insider manipulation cases. This step is not optional.
Contract / configuration-level (AFTER reading platform docs):
isVerified() = false on the platform's own verification flag (Clanker).allData() metadata, socialMediaUrls, auditUrls are all empty.get_clanker_reward_ownership shows only ONE recipient = the admin itself (no ecosystem / marketing / multisig recipients), ESPECIALLY when the team's narrative claims those allocations exist.updateAdmin) with no multisig / timelock / renounce.setPeer can still be called by owner and there's no public timelock or DAO process around it.Deployer-level:
Holder-level:
Narrative vs reality:
Off-chain / market-integrity (from Step Final-1):
/reports/<token_or_project>_scam_analysis.md)vault, airdrop, multiple rewards recipients, Safe multisig admin, snapshot + claim contract, LP burn). Contrast with what the team actually did.Return to the user a 4–6 bullet summary with:
Do NOT dump the whole report inline.
These analyses pull a lot of data. After you have extracted the facts you need, call prune_messages on noisy tools like browse_url, get_contract_abi (if the ABI was huge), and get_chain_activity_for_wallet (these return long tx histories). Pass a short replacement summary so the facts aren't lost.
browse_url on gitbook docs root URLs — they often return empty via firecrawl. Go to specific article URLs (e.g., .../general/token-deployments, not .../). Use search_tool to find the article URL first.http() transport with no argument falls back to the chain's default public RPC (rate-limited but functional). Only require a custom *_RPC_URL if the user explicitly wants high-volume reads or you hit rate limits mid-analysis — then suggest setting one for next time.perform_technical_analysis will error. Don't retry — use browse_url, market_intelligence, and contract reads instead.data-ai
Discover, bet on, track, and settle Hunch prediction markets in natural language. Trigger when a user wants to bet, take a position, or get odds on a crypto outcome — token market-cap milestones and flips, launchpad races (Bankr vs pump.fun volume / #1-days / launches over a cap), token head-to-head outperformance, mcap strike-ladders, and up/down price rounds. Also trigger on "what can I bet on about $TOKEN", "odds on …", "take YES/NO on …", "show my Hunch bets", "did my market resolve". Settles in USDC on Base via x402 (≤ $10 / bet); every bet returns an on-chain proof.
tools
HSM-backed secret management for AI agents. Store API keys (including Bankr `bk_` keys), passwords, and credentials in an encrypted vault; retrieve them at runtime via MCP without keeping secrets in chat context. Bankr Dynamic Key Vending issues short-lived scoped `bk_usr_` keys from a partner key (`bk_ptr_`) without manual rotation. Policy-based access control, secret rotation, sharing, EVM transaction intents (sign/simulate/broadcast), multi-chain signing keys, treasury multisig proposals, OIDC federation for external service auth, built-in prompt injection detection, and optional Shroud TEE LLM proxy. Use when the agent needs secure credential storage, just-in-time secret access, guarded on-chain signing, or security scanning — not for Bankr trading prompts, portfolio checks, or x402 calls (use the bankr skill instead).
development
Give your Bankr agent its own brain and a wallet-signed line to every other agent — on any framework, with no API key. SIGNA is the keyless agent layer on Base: resolve any identity to a messageable wallet, send and read wallet-signed DMs, invoke capabilities on the network, and run a brain that reasons on decentralized inference and acts through those capabilities. The Bankr wallet is the only credential. Triggers: "message that agent", "DM this wallet/handle", "reach the agent behind @x", "what is the base market", "resolve @handle to a wallet", "ask the network", "let my agent think and report".
development
AI-powered crypto trading agent, wallet API, and LLM gateway via natural language. Use when the user wants to trade crypto, check portfolio balances (with PnL and NFTs), view token prices, search tokens, transfer crypto, manage NFTs, use leverage (Hyperliquid or Avantis), bet on Polymarket, deploy tokens, set up automated trading, sign and submit raw transactions, call or deploy x402 paid API endpoints, browse the web, or access LLM models through the Bankr LLM gateway funded by your Bankr wallet. Supports Base, Ethereum, Polygon, Solana, Unichain, World Chain, Arbitrum, and BNB Chain.