Triggers: "smart money", "聰明錢", "whale", "鯨魚", "大戶", "KOL", "follow", "跟單", "wallet tracking", "錢包追蹤", "who's buying", "邊個買緊"
Track onchain smart money (whales, funds, KOLs, MEV bots) activity. Detect position changes and evaluate whether to follow.
This skill enforces the MOST RESTRICTIVE safety rules of all skills.
Before executing any command, verify the following MCP servers are available.
| Server |
|---|
| Required |
|---|
| Purpose |
|---|
| OnchainOS CLI | Critical | Primary data source -- smart money signals, token data, wallet balances |
| GoPlus MCP | Critical | Token security check on EVERY tracked token; wallet address screening |
| DexScreener MCP | Optional | Additional market context, token pair data |
| Rug Munch MCP | Optional | Deployer history analysis, serial rugger detection |
| Nansen MCP | Optional | Premium wallet labels and entity classification |
Run the OnchainOS pre-flight check:
onchainos dex-market signal-chains
This returns the list of chains with signal support. If it fails, OnchainOS
is not properly configured -- see config/mcp-setup-guide.md.
| Command | Purpose | Read/Write |
|---|---|---|
scan | Discover recent smart money activity across chains | Read |
track-wallet | Monitor a specific wallet for position changes | Read |
evaluate | Deep analysis of whether a specific signal is worth following | Read |
leaderboard | Top performing wallets by realized PnL over a period | Read |
copy-plan | Generate a trade plan based on a signal -- REQUIRES HUMAN APPROVAL | Read |
All commands are read-only. No trades are executed.
Discover recent smart money activity.
smart-money-tracker scan --chains ethereum,solana,base --categories whale,fund --lookback-hours 24
| Parameter | Type | Required | Default | Enum | Validation |
|---|---|---|---|---|---|
--chains | string[] | No | ["ethereum","solana","base"] | All OnchainOS-supported chains | Supported by signal-chains |
--categories | string[] | No | all | whale, fund, kol, mev, dex_trader | Valid category name |
--lookback-hours | integer | No | 24 | 1 - 168 | Positive integer |
--min-amount-usd | number | No | 10000 | 0 - infinity | Positive number |
--action-filter | string | No | all | buy, sell, add_liquidity, remove_liquidity | Valid action |
--top-n | integer | No | 20 | 1 - 100 | Positive integer |
Return Schema:
SmartMoneySignal:
timestamp: integer # Unix ms
scan_params:
chains: string[]
categories: string[]
lookback_hours: integer
signals:
- wallet_address: string
wallet_type: string # "whale" | "fund" | "kol" | "mev" | "dex_trader"
wallet_label: string # Known label if available, else truncated address
chain: string
action: string # "buy" | "sell" | "add_liquidity" | "remove_liquidity"
token_address: string
token_symbol: string
amount_usd: number
tx_hash: string
signal_timestamp: integer # When the onchain action occurred (Unix ms)
signal_age_min: integer # (now - signal_timestamp) / 60000
signal_strength: string # "HIGH" | "MEDIUM" | "LOW" | "STALE"
strength_score: number # 0.0 - 1.0
security_check: # GoPlus result summary
is_honeypot: boolean
buy_tax_pct: number
sell_tax_pct: number
is_open_source: boolean
holder_concentration_pct: number
overall: string # "SAFE" | "WARN" | "BLOCK"
is_actionable: boolean # true only if: strength != STALE AND security == SAFE
Monitor a specific wallet address for position changes.
smart-money-tracker track-wallet --address 0x1234...5678 --chain ethereum --lookback-hours 72
| Parameter | Type | Required | Default | Enum | Validation |
|---|---|---|---|---|---|
--address | string | Yes | -- | Wallet address | Valid address format |
--chain | string | No | auto-detect | Supported chain | OnchainOS-supported |
--lookback-hours | integer | No | 72 | 1 - 720 | Positive integer |
Pre-checks before tracking:
check_address_security -- BLOCK if malicious, phishing, or blacklisted.wallet-portfolio all-balances -- retrieve current holdings.Return Schema:
WalletTrackResult:
wallet_address: string
wallet_label: string
address_security: object # GoPlus check_address_security result
chain: string
current_holdings:
- token_symbol: string
token_address: string
balance_usd: number
pct_of_portfolio: number
recent_activity:
- action: string
token_symbol: string
amount_usd: number
timestamp: integer
tx_hash: string
signal_age_min: integer
stats:
total_portfolio_usd: number
num_tokens: integer
largest_position_pct: number
activity_count_7d: integer
Deep analysis of whether a specific signal is worth following.
smart-money-tracker evaluate --signal-token 0xabcd...ef01 --signal-wallet 0x1234...5678 --chain ethereum
| Parameter | Type | Required | Default | Enum | Validation |
|---|---|---|---|---|---|
--signal-token | string | Yes | -- | Token address | Valid address |
--signal-wallet | string | Yes | -- | Wallet address | Valid address |
--chain | string | Yes | -- | Chain name | OnchainOS-supported |
--size-usd | number | No | 500 | 1 - 5,000 | Below max_copy_size |
Returns full evaluation: token security, signal decay status, wallet historical performance, liquidity analysis, and a FOLLOW / SKIP / BLOCK recommendation.
Top performing smart money wallets ranked by realized PnL.
smart-money-tracker leaderboard --chain solana --period 30d --category whale
| Parameter | Type | Required | Default | Enum | Validation |
|---|---|---|---|---|---|
--chain | string | No | all | Supported chain | OnchainOS-supported |
--period | string | No | 30d | 7d, 30d, 90d | Valid period |
--category | string | No | all | whale, fund, kol, mev, dex_trader | Valid category |
--top-n | integer | No | 10 | 1 - 50 | Positive integer |
Returns ranked list of wallets with: PnL, win rate, number of trades, average holding period, and best/worst trades.
Generate a trade plan based on a signal. This command ALWAYS outputs with
the [REQUIRES HUMAN APPROVAL] header. No exception. No override.
smart-money-tracker copy-plan --signal-token 0xabcd...ef01 --chain ethereum --size-usd 500
| Parameter | Type | Required | Default | Enum | Validation |
|---|---|---|---|---|---|
--signal-token | string | Yes | -- | Token address | Valid address |
--chain | string | Yes | -- | Chain name | OnchainOS-supported |
--size-usd | number | No | 500 | 1 - 1,000 (default cap) | Below max_copy_size |
--slippage-pct | number | No | 1.0 | 0.1 - 5.0 | Positive |
Pre-conditions (ALL must pass):
signal_max_age_min)max_copy_size_usd ($1,000 default)Returns: entry route, estimated costs, risk assessment, and the
mandatory [REQUIRES HUMAN APPROVAL] block.
Smart money signals lose alpha over time as the market absorbs the information. This skill applies a time-decay model to classify signal freshness.
| Tier | Age Range | Visual | Description |
|---|---|---|---|
| HIGH | 0-5 min | ████████▓░ | Fresh signal, highest alpha potential |
| MEDIUM | 5-30 min | █████▓░░░░ | Some alpha remaining, evaluate quickly |
| LOW | 30-120 min | ██▓░░░░░░░ | Most alpha likely captured by faster actors |
| STALE | 120+ min | ░░░░░░░░░░ | Do NOT recommend -- alpha gone |
signal_strength = initial_strength * exp(-decay_rate * time_elapsed_minutes)
Variables:
initial_strength = Original signal strength (0.0 to 1.0)
decay_rate = Decay constant (higher = faster decay)
time_elapsed_minutes = Minutes since signal was generated
Typical Decay Rates (Half-Life Table):
| Signal Type | Decay Rate | Half-Life |
|------------------------|------------|-------------|
| CEX-DEX arb spread | 0.15 | ~4.6 min |
| Funding rate anomaly | 0.01 | ~69 min |
| Basis mispricing | 0.005 | ~139 min |
| Smart money signal | 0.02 | ~35 min |
| Yield opportunity | 0.001 | ~693 min |
For this skill, the smart money signal type has a decay rate of 0.02 and half-life of ~35 min.
Worked Example:
initial_strength = 0.90 (strong smart money signal)
decay_rate = 0.02
time_elapsed_minutes = 20
signal_strength = 0.90 * exp(-0.02 * 20)
= 0.90 * exp(-0.40)
= 0.90 * 0.6703
= 0.603
Signal has decayed from 0.90 to 0.60 in 20 minutes -- still MEDIUM tier.
Caveats:
- Decay rates are empirical estimates; calibrate based on observed opportunity persistence.
- Signal strength below 0.3 generally means the opportunity has likely been arbitraged away.
- Combine signal decay with a freshness timestamp in output displays.
strength_score = max(0, 1 - (age_min / 120))
if age_min <= 5:
strength = "HIGH"
is_actionable = true (if security passes)
elif age_min <= 30:
strength = "MEDIUM"
is_actionable = true (if security passes)
elif age_min <= 120:
strength = "LOW"
is_actionable = false # Do NOT recommend