mirror of
https://github.com/GMGNAI/gmgn-skills.git
synced 2026-07-28 09:17:45 +00:00
Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3046c6d6cd | |||
| ee4838d565 | |||
| f19a1919da | |||
| 4cfe0e0fb5 | |||
| 5755206b58 | |||
| 6ab9cb108b | |||
| 51d2214253 | |||
| 8d3541c2a3 | |||
| 39d80429f6 | |||
| fd226c654b | |||
| a08fc7b580 | |||
| f49c89e609 | |||
| ad4eab3852 | |||
| 6fd302af60 | |||
| cdcf4e11d3 | |||
| 319c4bbf33 | |||
| 2b61eb807a | |||
| 46c56b7e5d | |||
| b18738177c | |||
| cfb4270816 | |||
| 932bf8c82c | |||
| 4143e07266 | |||
| 4f96fedbb1 | |||
| eeb4a77cf7 | |||
| f7c051e2d1 |
@@ -93,8 +93,8 @@ EOF
|
||||
|
||||
| Mode | Commands | Requirements |
|
||||
|------|----------|--------------|
|
||||
| Normal | token / market / portfolio | `GMGN_API_KEY` only, no signature |
|
||||
| Critical | swap / order | `GMGN_API_KEY` + `GMGN_PRIVATE_KEY` — CLI handles signing automatically |
|
||||
| Normal | token / market / portfolio / track kol / track smartmoney | `GMGN_API_KEY` only, no signature |
|
||||
| Critical | swap / order / track follow-wallet | `GMGN_API_KEY` + `GMGN_PRIVATE_KEY` — CLI handles signing automatically |
|
||||
|
||||
## SKILL.md Authoring Rules
|
||||
|
||||
|
||||
@@ -471,6 +471,13 @@ gmgn-cli market trenches \
|
||||
gmgn-cli market trenches \
|
||||
--chain sol --type new_creation \
|
||||
--filter-preset safe --min-smart-degen-count 1 --sort-by smart_degen_count
|
||||
|
||||
# Token signals — smart money buys on SOL (single group)
|
||||
gmgn-cli market signal --chain sol --signal-type 12 --raw
|
||||
|
||||
# Token signals — multi-group: smart money OR large buys in parallel
|
||||
gmgn-cli market signal --chain sol \
|
||||
--groups '[{"signal_type":[12]},{"signal_type":[14,16]}]' --raw
|
||||
```
|
||||
|
||||
### Portfolio
|
||||
|
||||
@@ -298,6 +298,57 @@ npx gmgn-cli market trenches --chain <chain> [--type <type...>] [--launchpad-pla
|
||||
|
||||
---
|
||||
|
||||
## market signal
|
||||
|
||||
Query token signals — price spikes, smart money buys, large buys, Dex ads, CTO events, and more. Returns a list of `TokenSignalItem` sorted by `trigger_at` descending (most recent first). **Maximum 50 results per group.**
|
||||
|
||||
```bash
|
||||
# Single group (individual flags):
|
||||
gmgn-cli market signal --chain sol [--signal-type <n>...] [--mc-min <usd>] [--mc-max <usd>] [--raw]
|
||||
|
||||
# Multi-group override (JSON array):
|
||||
gmgn-cli market signal --chain sol --groups '<json_array>' [--raw]
|
||||
```
|
||||
|
||||
| Option | Required | Description |
|
||||
|--------|----------|-------------|
|
||||
| `--chain` | Yes | `sol` / `bsc` |
|
||||
| `--signal-type` | No | Signal type(s), repeatable (1–18, default: all). See Signal Types below. |
|
||||
| `--mc-min` | No | Min market cap at trigger time (USD) |
|
||||
| `--mc-max` | No | Max market cap at trigger time (USD) |
|
||||
| `--trigger-mc-min` | No | Min market cap at signal trigger moment (USD) |
|
||||
| `--trigger-mc-max` | No | Max market cap at signal trigger moment (USD) |
|
||||
| `--total-fee-min` | No | Min total fees paid (USD) |
|
||||
| `--total-fee-max` | No | Max total fees paid (USD) |
|
||||
| `--min-create-or-open-ts` | No | Min token creation or open timestamp (Unix seconds string) |
|
||||
| `--max-create-or-open-ts` | No | Max token creation or open timestamp (Unix seconds string) |
|
||||
| `--groups` | No | Multi-group JSON array — overrides all individual flags when provided |
|
||||
|
||||
**Signal Types:**
|
||||
|
||||
| Value | Name | Description |
|
||||
|-------|------|-------------|
|
||||
| 1 | SignalType1 | General signal (K-line price spike) |
|
||||
| 2 | SignalTypeDexAd | Dex ad placement |
|
||||
| 3 | SignalTypeDexUpdateLink | Dex social link updated |
|
||||
| 4 | SignalTypeDexTrendingBar | Dex trending bar |
|
||||
| 5 | SignalTypeDexBoost | Dex Boost |
|
||||
| 6 | SignalTypePriceUp | Price spike |
|
||||
| 7 | SignalTypePriceATH | All-time high price |
|
||||
| 8 | SignalTypeMcpKeyLevel | Market cap key level |
|
||||
| 9 | SignalTypeLive | Live stream |
|
||||
| 10 | SignalTypeBundlerSell | Bundler sell |
|
||||
| 11 | SignalTypeCto | Community takeover (CTO) |
|
||||
| 12 | SignalTypeSmartDegenBuy | Smart money buy |
|
||||
| 13 | SignalTypePlatformCall | Platform call |
|
||||
| 14 | SignalTypeLargeAmountBuy | Large amount buy |
|
||||
| 15 | SignalTypeMultiBuy | Multiple buys |
|
||||
| 16 | SignalTypeMultiLargeBuy | Multiple large buys |
|
||||
| 17 | SignalTypeBagsClaims | Bags Claim |
|
||||
| 18 | SignalTypePumpClaims | Pump Claim |
|
||||
|
||||
---
|
||||
|
||||
## portfolio follow-wallet
|
||||
|
||||
Query follow-wallet trade records. Returns trades from wallets you personally follow on the GMGN platform. The follow list is resolved automatically from the GMGN user account bound to the API Key — `--wallet` is optional. Normal auth (API Key only, no private key needed).
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "gmgn-cli",
|
||||
"version": "1.2.4",
|
||||
"version": "1.2.6",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "gmgn-cli",
|
||||
"version": "1.2.4",
|
||||
"version": "1.2.6",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"commander": "^12.1.0",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "gmgn-cli",
|
||||
"version": "1.2.4",
|
||||
"version": "1.2.6",
|
||||
"description": "GMGN OpenAPI CLI — call GMGN market, token, portfolio and swap APIs from the command line",
|
||||
"type": "module",
|
||||
"bin": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: gmgn-cooking
|
||||
description: "[FINANCIAL EXECUTION] Create tokens on launchpad platforms (Pump.fun, Raydium, PancakeSwap, Flap, FourMeme, Bonk, BAGS, etc.) or query token creation statistics by launchpad. Token creation executes irreversible on-chain transactions. Requires explicit user confirmation before every create. Supports sol / bsc / base / eth / ton."
|
||||
description: "[FINANCIAL EXECUTION] Create and launch meme coins and crypto tokens on launchpads (Pump.fun, PancakeSwap, FourMeme, Bonk, BAGS, Flap, Raydium, etc.) via bonding curve fair launch, or query token creation stats by launchpad via GMGN API. Requires explicit user confirmation. Use when user asks to create a token, launch a meme coin, cook a coin, deploy on a launchpad, or check launchpad creation stats on Solana, BSC, Base, ETH, or TON."
|
||||
argument-hint: "stats | [create --chain <chain> --dex <dex> --from <addr> --name <name> --symbol <sym> --buy-amt <n> (--image <base64> | --image-url <url>)]"
|
||||
metadata:
|
||||
cliHelp: "gmgn-cli cooking --help"
|
||||
|
||||
+113
-3
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: gmgn-market
|
||||
description: Query GMGN market data — token K-line (candlestick), trending token swap data, and Trenches token lists. Supports sol / bsc / base.
|
||||
argument-hint: "kline --chain <sol|bsc|base> --address <token_address> --resolution <1m|5m|15m|1h|4h|1d> [--from <unix_ts>] [--to <unix_ts>] | trending --chain <sol|bsc|base> --interval <1m|5m|1h|6h|24h> | trenches --chain <sol|bsc|base>"
|
||||
description: Get crypto and meme token price charts (K-line, candlestick, OHLCV), trending meme coin rankings by volume, and newly launched tokens on launchpads (pump.fun, fourmeme, letsbonk, Raydium, etc.) via GMGN API on Solana, BSC, or Base. Use when user asks for price chart, trending tokens, what's pumping, hot coins, new launches, token signals, or wants to discover early-stage opportunities.
|
||||
argument-hint: "kline --chain <sol|bsc|base> --address <token_address> --resolution <1m|5m|15m|1h|4h|1d> [--from <unix_ts>] [--to <unix_ts>] | trending --chain <sol|bsc|base> --interval <1m|5m|1h|6h|24h> | trenches --chain <sol|bsc|base> | signal --chain <sol|bsc>"
|
||||
metadata:
|
||||
cliHelp: "gmgn-cli market --help"
|
||||
---
|
||||
@@ -48,10 +48,11 @@ Use the `gmgn-cli` tool to query K-line data for a token, browse trending tokens
|
||||
| `market kline` | Token candlestick / OHLCV data and trading volume over a time range |
|
||||
| `market trending` | Trending tokens ranked by swap activity — use `--interval` to specify the time window (e.g. `1m` for 1-minute hottest, `1h` for 1-hour trending) |
|
||||
| `market trenches` | Newly launched launchpad platform tokens — **use this when the user asks for "new tokens", "just launched tokens", "latest tokens on pump.fun/letsbonk"**. Three categories: `new_creation` (just created), `near_completion` (bonding curve almost full), `completed` (graduated to open market / DEX) |
|
||||
| `market signal` | Real-time token signal feed — price spikes, smart money buys, large buys, Dex ads, CTO events, and more. Results sorted by `trigger_at` descending. **sol / bsc only. Max 50 results per group.** |
|
||||
|
||||
## Supported Chains
|
||||
|
||||
`sol` / `bsc` / `base`
|
||||
`sol` / `bsc` / `base` (signal: `sol` / `bsc` only)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
@@ -67,6 +68,7 @@ All market routes used by this skill go through GMGN's leaky-bucket limiter with
|
||||
| `market kline` | `GET /v1/market/token_kline` | 2 |
|
||||
| `market trending` | `GET /v1/market/rank` | 1 |
|
||||
| `market trenches` | `POST /v1/trenches` | 3 |
|
||||
| `market signal` | `POST /v1/market/token_signal` | 3 |
|
||||
|
||||
When a request returns `429`:
|
||||
|
||||
@@ -809,6 +811,114 @@ Present each category separately with a header:
|
||||
# | Symbol | Market Cap | Volume (1h) | Smart Degens | Social
|
||||
```
|
||||
|
||||
## `market signal` Parameters
|
||||
|
||||
Chains: `sol` / `bsc` only. **Maximum 50 results per group** — use multiple groups via `--groups` to cover different signal types in a single request.
|
||||
|
||||
**Single-group (individual flags):**
|
||||
|
||||
Do **not** pass signal types **14, 15, or 16** in `signal_type` / `--signal-type` / `--groups` JSON — OpenAPI returns **400** if any group includes them. Omitting `--signal-type` (empty filter) still queries all types upstream; responses may still include 14–16 in that case.
|
||||
|
||||
| Option | Required | Description |
|
||||
|--------|----------|-------------|
|
||||
| `--chain` | Yes | `sol` / `bsc` |
|
||||
| `--signal-type` | No | Signal type(s), repeatable (1–18, default: all). See Signal Types below. |
|
||||
| `--mc-min` | No | Min market cap at trigger time (USD) |
|
||||
| `--mc-max` | No | Max market cap at trigger time (USD) |
|
||||
| `--trigger-mc-min` | No | Min market cap at signal trigger moment (USD) |
|
||||
| `--trigger-mc-max` | No | Max market cap at signal trigger moment (USD) |
|
||||
| `--total-fee-min` | No | Min total fees paid (USD) |
|
||||
| `--total-fee-max` | No | Max total fees paid (USD) |
|
||||
| `--min-create-or-open-ts` | No | Min token creation or open timestamp (Unix seconds string) |
|
||||
| `--max-create-or-open-ts` | No | Max token creation or open timestamp (Unix seconds string) |
|
||||
|
||||
**Multi-group override:**
|
||||
|
||||
Pass `--groups '<json_array>'` to query multiple filter groups in a single request. The upstream executes all groups in parallel and merges results sorted by `trigger_at` descending. When `--groups` is present, all individual flags above are ignored.
|
||||
|
||||
```bash
|
||||
gmgn-cli market signal --chain sol \
|
||||
--groups '[{"signal_type":[12,13]},{"signal_type":[6,7],"mc_min":50000}]'
|
||||
```
|
||||
|
||||
### Signal Types
|
||||
|
||||
| Value | Name | Description |
|
||||
|-------|------|-------------|
|
||||
| 1 | SignalType1 | General signal (K-line price spike) |
|
||||
| 2 | SignalTypeDexAd | Dex ad placement |
|
||||
| 3 | SignalTypeDexUpdateLink | Dex social link updated |
|
||||
| 4 | SignalTypeDexTrendingBar | Dex trending bar |
|
||||
| 5 | SignalTypeDexBoost | Dex Boost |
|
||||
| 6 | SignalTypePriceUp | Price spike |
|
||||
| 7 | SignalTypePriceATH | All-time high price |
|
||||
| 8 | SignalTypeMcpKeyLevel | Market cap key level |
|
||||
| 9 | SignalTypeLive | Live stream |
|
||||
| 10 | SignalTypeBundlerSell | Bundler sell |
|
||||
| 11 | SignalTypeCto | Community takeover (CTO) |
|
||||
| 12 | SignalTypeSmartDegenBuy | Smart money buy |
|
||||
| 13 | SignalTypePlatformCall | Platform call |
|
||||
| 14 | SignalTypeLargeAmountBuy | Large amount buy |
|
||||
| 15 | SignalTypeMultiBuy | Multiple buys |
|
||||
| 16 | SignalTypeMultiLargeBuy | Multiple large buys |
|
||||
| 17 | SignalTypeBagsClaims | Bags Claim |
|
||||
| 18 | SignalTypePumpClaims | Pump Claim |
|
||||
|
||||
### `market signal` Response Fields
|
||||
|
||||
Each item in the response array is one signal event:
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `id` | string | Signal event ID |
|
||||
| `token_address` | string | Token contract address |
|
||||
| `signal_type` | number | Signal type (1–18, see Signal Types above) |
|
||||
| `trigger_at` | number | Unix timestamp (seconds) when the signal was triggered |
|
||||
| `trigger_mc` | number | Market cap at signal trigger time (USD) |
|
||||
| `first_trigger_mc` | number | Market cap at the very first trigger for this token (USD) |
|
||||
| `market_cap` | number | Current market cap (USD) |
|
||||
| `ath` | number | All-time high market cap (USD) |
|
||||
| `signal_times` | number | Total number of times this signal has triggered for this token |
|
||||
| `signal_times_by_type` | object | Signal trigger count broken down by type |
|
||||
| `cur_data` | object | Real-time token stats at query time (see below) |
|
||||
| `data` | object | Full upstream snapshot at trigger time (chain-specific, raw passthrough) |
|
||||
|
||||
**`cur_data` fields:**
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `top_10_holder_rate` | number | Top 10 holder concentration ratio (0–1) |
|
||||
| `holder_count` | number | Current holder count |
|
||||
| `liquidity` | number | Current liquidity (USD) |
|
||||
|
||||
### Usage Examples
|
||||
|
||||
```bash
|
||||
# All signals on SOL (no --signal-type: upstream returns all types, including 14–16 if present)
|
||||
gmgn-cli market signal --chain sol --raw
|
||||
|
||||
# Smart money buys only (type 12)
|
||||
gmgn-cli market signal --chain sol --signal-type 12 --raw
|
||||
|
||||
# Price spikes + ATH (types 6 and 7) with market cap filter
|
||||
gmgn-cli market signal --chain sol \
|
||||
--signal-type 6 --signal-type 7 \
|
||||
--mc-min 50000 --mc-max 5000000 --raw
|
||||
|
||||
# Smart money buys on BSC
|
||||
gmgn-cli market signal --chain bsc --signal-type 12 --raw
|
||||
|
||||
# Multi-group: parallel groups (do not use signal_type 14–16 — API returns 400)
|
||||
gmgn-cli market signal --chain sol \
|
||||
--groups '[{"signal_type":[12]},{"signal_type":[6,7]}]' --raw
|
||||
|
||||
# Multi-group: combine signal type filter with market cap range per group
|
||||
gmgn-cli market signal --chain sol \
|
||||
--groups '[{"signal_type":[12,13],"mc_min":100000},{"signal_type":[6,7],"mc_min":50000,"mc_max":1000000}]' --raw
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Notes
|
||||
|
||||
- `market kline`: `--from` and `--to` are Unix timestamps in **seconds** — CLI converts to milliseconds automatically
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: gmgn-portfolio
|
||||
description: Query GMGN wallet portfolio — API Key wallet info, holdings, transaction activity, trading stats, token balance, and developer-created tokens. Supports sol / bsc / base.
|
||||
description: Analyze any crypto wallet by address — holdings, realized/unrealized P&L, win rate, trading history, performance stats, specific token balance, and tokens created by a developer wallet (with ATH market cap and DEX graduation status) via GMGN API on Solana, BSC, or Base. Use when user asks about a wallet's holdings, P&L, win rate, what tokens a dev has launched, the highest ATH token a dev ever created, or wants a wallet report to decide whether to copy-trade or follow.
|
||||
argument-hint: "<info|holdings|activity|stats|token-balance|created-tokens> [--chain <sol|bsc|base>] [--wallet <wallet_address>]"
|
||||
metadata:
|
||||
cliHelp: "gmgn-cli portfolio --help"
|
||||
@@ -266,9 +266,11 @@ Top-level fields:
|
||||
| Field | Description |
|
||||
|-------|-------------|
|
||||
| `last_create_timestamp` | Unix timestamp of the most recent token creation |
|
||||
| `inner_count` | Number of tokens still on the bonding curve |
|
||||
| `inner_count` | Number of tokens still on the bonding curve (NOT graduated) |
|
||||
| `open_count` | Number of tokens that have graduated to DEX |
|
||||
| `open_ratio` | Graduation rate (string, e.g. `"0.25"`) |
|
||||
|
||||
> **Total created = `inner_count + open_count`**. Do NOT use `len(tokens)` as the total — the `tokens` array is capped at 100 entries and may be truncated.
|
||||
| `creator_ath_info` | Best-performing token created by this wallet (ATH market cap) |
|
||||
| `tokens` | Array of created tokens — see below |
|
||||
|
||||
@@ -364,3 +366,4 @@ For in-depth trading style analysis, copy-trade ROI estimation, and smart money
|
||||
- User asks "is this wallet worth following" → [`docs/workflow-wallet-analysis.md`](../../docs/workflow-wallet-analysis.md)
|
||||
- User asks "what's this wallet's trading style", "when does he take profit", "smart money profile", "if I copied this wallet what would my return be" → [`docs/workflow-smart-money-profile.md`](../../docs/workflow-smart-money-profile.md)
|
||||
- User wants to compare multiple smart money wallets by winrate/PnL → [`docs/workflow-smart-money-profile.md`](../../docs/workflow-smart-money-profile.md) Step 5 (leaderboard)
|
||||
- User asks "what tokens did this dev create", "dev 发过哪些币", "查一下这个 dev 的代币", "dev 创建记录" → use `portfolio created-tokens --chain <chain> --wallet <creator_address>` directly. Get the creator address first via `token info` if only a token address is given.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: gmgn-swap
|
||||
description: "[FINANCIAL EXECUTION] Submit a real blockchain token swap or query order status. Executes irreversible on-chain transactions. Requires explicit user confirmation before every swap. Supports sol / bsc / base."
|
||||
description: "[FINANCIAL EXECUTION] Buy and sell meme coins and crypto tokens on Solana, BSC, or Base — single swap, multi-wallet batch trading, limit orders, stop loss, take profit, trailing stop loss, trailing take profit via GMGN API. Requires explicit user confirmation. Use when user asks to buy, sell, or swap a token, trade from multiple wallets, set a limit order, stop loss, take profit, or check order status."
|
||||
argument-hint: "[--chain <chain> --from <wallet> --input-token <addr> --output-token <addr> --amount <n>] | [order get --chain <chain> --order-id <id>] | [order strategy list --chain <chain> --group-tag <LimitOrder|STMix>] | [order strategy create --chain <chain> --order-type limit_order --sub-order-type <buy_low|buy_high|stop_loss|take_profit> ...]"
|
||||
metadata:
|
||||
cliHelp: "gmgn-cli swap --help"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: gmgn-token
|
||||
description: Query GMGN token information — basic info, security, pool, top holders and top traders. Supports sol / bsc / base.
|
||||
description: Research any crypto or meme token by address — real-time price, market cap, liquidity, holder list, trader list, top Smart Money and KOL positions, security audit (honeypot, rug pull risk, dev wallet, renounced status), social links (Twitter/X, website) via GMGN API on Solana, BSC, or Base. Use when user asks about a token's price, safety, holders, traders, smart money exposure, or wants due diligence before buying.
|
||||
argument-hint: "<sub-command> --chain <sol|bsc|base> --address <token_address>"
|
||||
metadata:
|
||||
cliHelp: "gmgn-cli token --help"
|
||||
@@ -34,7 +34,7 @@ Use the `gmgn-cli` tool to query token information based on the user's request.
|
||||
|
||||
| Sub-command | Description |
|
||||
|-------------|-------------|
|
||||
| `token info` | Basic info + realtime price, liquidity, supply, holder count, social links (market cap = price × circulating_supply) |
|
||||
| `token info` | Basic info + realtime price, liquidity, market cap, total supply, holder count, social links (market cap = price × circulating_supply) |
|
||||
| `token security` | Security metrics (honeypot, taxes, holder concentration, contract risks) |
|
||||
| `token pool` | Liquidity pool info (DEX, reserves, liquidity depth) |
|
||||
| `token holders` | Top token holders list with profit/loss breakdown |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: gmgn-track
|
||||
description: Query GMGN on-chain tracking data — follow-wallet trade records, KOL trades, and Smart Money trades. Supports sol / bsc / base.
|
||||
description: Get real-time crypto buy/sell activity from Smart Money wallets, KOL influencer wallets, and personally followed wallets via GMGN API — alpha signals, whale tracking, meme token copy-trading ideas on Solana, BSC, or Base. Use when user asks what smart money or KOLs are buying, wants whale alerts, on-chain alpha, or copy-trade signals. (For a specific wallet address, use gmgn-portfolio.)
|
||||
argument-hint: "<follow-wallet|kol|smartmoney> [--chain <sol|bsc|base>] [--wallet <wallet_address>]"
|
||||
metadata:
|
||||
cliHelp: "gmgn-cli track --help"
|
||||
@@ -60,7 +60,8 @@ Use the `gmgn-cli` tool to query on-chain tracking data based on the user's requ
|
||||
## Prerequisites
|
||||
|
||||
- `gmgn-cli` installed globally — if missing, run: `npm install -g gmgn-cli`
|
||||
- `GMGN_API_KEY` configured in `~/.config/gmgn/.env` — required for all sub-commands; no private key needed
|
||||
- `GMGN_API_KEY` configured in `~/.config/gmgn/.env` — required for all sub-commands
|
||||
- `GMGN_PRIVATE_KEY` — required for `track follow-wallet` only (critical auth); not needed for `kol` or `smartmoney`
|
||||
|
||||
## Rate Limit Handling
|
||||
|
||||
@@ -88,11 +89,13 @@ When a request returns `429`:
|
||||
```
|
||||
Tell the user: *"This is your Ed25519 public key. Go to **https://gmgn.ai/ai**, paste it into the API key creation form, then send me the API Key value shown on the page."*
|
||||
|
||||
2. Wait for the user's API key, then configure:
|
||||
2. Wait for the user's API key, then configure (saves both API key and private key — private key is required for `track follow-wallet`):
|
||||
```bash
|
||||
mkdir -p ~/.config/gmgn
|
||||
echo 'GMGN_API_KEY=<key_from_user>' > ~/.config/gmgn/.env
|
||||
echo "GMGN_API_KEY=<key_from_user>" > ~/.config/gmgn/.env
|
||||
echo "GMGN_PRIVATE_KEY=$(awk '{printf "%s\\n", $0}' /tmp/gmgn_private.pem)" >> ~/.config/gmgn/.env
|
||||
chmod 600 ~/.config/gmgn/.env
|
||||
rm /tmp/gmgn_private.pem
|
||||
```
|
||||
|
||||
## Usage Examples
|
||||
@@ -308,7 +311,7 @@ To research any token surfaced by smart money activity, follow [`docs/workflow-t
|
||||
|
||||
## Notes
|
||||
|
||||
- All sub-commands use normal auth (API Key only, no signature required)
|
||||
- `track follow-wallet` uses critical auth (API Key + private key signature); `track kol` and `track smartmoney` use normal auth (API Key only)
|
||||
- `track follow-wallet` returns trades from wallets followed on the GMGN platform; the follow list is resolved automatically from the GMGN user account bound to the API Key — `--wallet` is optional
|
||||
- Use `--raw` to get single-line JSON for further processing
|
||||
- `track kol` / `track smartmoney` `--side` is a **client-side filter** — the CLI fetches all results then filters locally; it is NOT sent to the API
|
||||
|
||||
@@ -156,6 +156,18 @@ export interface StrategyCancelParams {
|
||||
close_sell_model?: string;
|
||||
}
|
||||
|
||||
export interface TokenSignalGroup {
|
||||
signal_type?: number[];
|
||||
mc_min?: number;
|
||||
mc_max?: number;
|
||||
trigger_mc_min?: number;
|
||||
trigger_mc_max?: number;
|
||||
total_fee_min?: number;
|
||||
total_fee_max?: number;
|
||||
min_create_or_open_ts?: string;
|
||||
max_create_or_open_ts?: string;
|
||||
}
|
||||
|
||||
export interface CreateTokenParams {
|
||||
chain: string;
|
||||
dex: string;
|
||||
@@ -284,6 +296,10 @@ export class OpenApiClient {
|
||||
return this.normalRequest("GET", "/v1/market/rank", { chain, interval, ...extra });
|
||||
}
|
||||
|
||||
async getTokenSignalV2(chain: string, groups: TokenSignalGroup[]): Promise<unknown> {
|
||||
return this.normalRequest("POST", "/v1/market/token_signal", {}, { chain, groups });
|
||||
}
|
||||
|
||||
// ---- User endpoints (normal auth) ----
|
||||
|
||||
async getUserInfo(): Promise<unknown> {
|
||||
@@ -291,7 +307,7 @@ export class OpenApiClient {
|
||||
}
|
||||
|
||||
async getFollowWallet(chain: string, extra: Record<string, string | number | string[]> = {}): Promise<unknown> {
|
||||
return this.normalRequest("GET", "/v1/trade/follow_wallet", { chain, ...extra });
|
||||
return this.criticalRequest("GET", "/v1/trade/follow_wallet", { chain, ...extra }, null);
|
||||
}
|
||||
|
||||
async getKol(chain?: string, limit?: number): Promise<unknown> {
|
||||
@@ -393,16 +409,16 @@ export class OpenApiClient {
|
||||
private async criticalRequest(
|
||||
method: string,
|
||||
subPath: string,
|
||||
queryExtra: Record<string, string | number>,
|
||||
queryExtra: Record<string, string | number | string[]>,
|
||||
body: unknown
|
||||
): Promise<unknown> {
|
||||
if (!this.privateKeyPem) {
|
||||
throw new Error("GMGN_PRIVATE_KEY is required for critical-auth commands (swap and all order commands)");
|
||||
throw new Error("GMGN_PRIVATE_KEY is required for critical-auth commands (swap, order, and follow-wallet commands)");
|
||||
}
|
||||
|
||||
return this.executePreparedRequest(() => {
|
||||
const { timestamp, client_id } = buildAuthQuery();
|
||||
const query: Record<string, string | number> = { ...queryExtra, timestamp, client_id };
|
||||
const query: Record<string, string | number | string[]> = { ...queryExtra, timestamp, client_id };
|
||||
const bodyStr = body !== null ? JSON.stringify(body) : "";
|
||||
const message = buildMessage(subPath, query, bodyStr, timestamp);
|
||||
const signature = sign(message, this.privateKeyPem!, detectAlgorithm(this.privateKeyPem!));
|
||||
|
||||
+10
-3
@@ -32,17 +32,24 @@ export function buildAuthQuery(): { timestamp: number; client_id: string } {
|
||||
/**
|
||||
* Build the signature message (critical auth)
|
||||
* Format: {sub_path}:{sorted_query_string}:{request_body}:{timestamp}
|
||||
* sorted_query_string: all query params (including timestamp, client_id) sorted alphabetically by key
|
||||
* sorted_query_string: all query params (including timestamp, client_id) sorted alphabetically by key.
|
||||
* Array values are serialized as repeated k=v pairs (same as buildUrl / URLSearchParams), sorted by value.
|
||||
*/
|
||||
export function buildMessage(
|
||||
subPath: string,
|
||||
queryParams: Record<string, string | number>,
|
||||
queryParams: Record<string, string | number | string[]>,
|
||||
body: string,
|
||||
timestamp: number
|
||||
): string {
|
||||
const sortedQs = Object.keys(queryParams)
|
||||
.sort()
|
||||
.map((k) => `${k}=${queryParams[k]}`)
|
||||
.flatMap((k) => {
|
||||
const v = queryParams[k];
|
||||
if (Array.isArray(v)) {
|
||||
return [...v].sort().map((item) => `${k}=${item}`);
|
||||
}
|
||||
return [`${k}=${v}`];
|
||||
})
|
||||
.join("&");
|
||||
return `${subPath}:${sortedQs}:${body}:${timestamp}`;
|
||||
}
|
||||
|
||||
+51
-1
@@ -1,5 +1,5 @@
|
||||
import { Command } from "commander";
|
||||
import { OpenApiClient } from "../client/OpenApiClient.js";
|
||||
import { OpenApiClient, TokenSignalGroup } from "../client/OpenApiClient.js";
|
||||
import { getConfig } from "../config.js";
|
||||
import { exitOnError, printResult } from "../output.js";
|
||||
import { validateAddress, validateChain } from "../validate.js";
|
||||
@@ -115,6 +115,56 @@ export function registerMarketCommands(program: Command): void {
|
||||
: data;
|
||||
printResult(result, opts.raw);
|
||||
});
|
||||
|
||||
market
|
||||
.command("signal")
|
||||
.description("Query token signals (price spikes, smart money buys, large buys, etc.) — max 50 results per group")
|
||||
.requiredOption("--chain <chain>", "Chain: sol / bsc")
|
||||
.option("--signal-type <n...>", "Signal type(s), repeatable: 1–18 (default: all types)", (v: string, acc: number[]) => { acc.push(parseInt(v, 10)); return acc; }, [] as number[])
|
||||
.option("--mc-min <usd>", "Min market cap at trigger time (USD)", parseFloat)
|
||||
.option("--mc-max <usd>", "Max market cap at trigger time (USD)", parseFloat)
|
||||
.option("--trigger-mc-min <usd>", "Min market cap at signal trigger (USD)", parseFloat)
|
||||
.option("--trigger-mc-max <usd>", "Max market cap at signal trigger (USD)", parseFloat)
|
||||
.option("--total-fee-min <usd>", "Min total fees paid (USD)", parseFloat)
|
||||
.option("--total-fee-max <usd>", "Max total fees paid (USD)", parseFloat)
|
||||
.option("--min-create-or-open-ts <ts>", "Min token creation or open timestamp (Unix seconds string)")
|
||||
.option("--max-create-or-open-ts <ts>", "Max token creation or open timestamp (Unix seconds string)")
|
||||
.option("--groups <json>", "Multi-group override: JSON array of group objects — overrides all individual flags when provided")
|
||||
.option("--raw", "Output raw JSON")
|
||||
.action(async (opts: Record<string, unknown>) => {
|
||||
validateChain(opts["chain"] as string);
|
||||
if (!["sol", "bsc"].includes(opts["chain"] as string)) {
|
||||
console.error(`[gmgn-cli] market signal only supports sol and bsc, got "${opts["chain"]}"`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
let groups: TokenSignalGroup[];
|
||||
if (opts["groups"] != null) {
|
||||
try {
|
||||
groups = JSON.parse(opts["groups"] as string) as TokenSignalGroup[];
|
||||
} catch {
|
||||
console.error(`[gmgn-cli] --groups must be a valid JSON array, e.g. '[{"signal_type":[12,14]},{"signal_type":[6,7],"mc_min":50000}]'`);
|
||||
process.exit(1);
|
||||
}
|
||||
} else {
|
||||
const group: TokenSignalGroup = {};
|
||||
const signalType = opts["signalType"] as number[] | undefined;
|
||||
if (signalType?.length) group.signal_type = signalType;
|
||||
if (opts["mcMin"] != null) group.mc_min = opts["mcMin"] as number;
|
||||
if (opts["mcMax"] != null) group.mc_max = opts["mcMax"] as number;
|
||||
if (opts["triggerMcMin"] != null) group.trigger_mc_min = opts["triggerMcMin"] as number;
|
||||
if (opts["triggerMcMax"] != null) group.trigger_mc_max = opts["triggerMcMax"] as number;
|
||||
if (opts["totalFeeMin"] != null) group.total_fee_min = opts["totalFeeMin"] as number;
|
||||
if (opts["totalFeeMax"] != null) group.total_fee_max = opts["totalFeeMax"] as number;
|
||||
if (opts["minCreateOrOpenTs"] != null) group.min_create_or_open_ts = opts["minCreateOrOpenTs"] as string;
|
||||
if (opts["maxCreateOrOpenTs"] != null) group.max_create_or_open_ts = opts["maxCreateOrOpenTs"] as string;
|
||||
groups = [group];
|
||||
}
|
||||
|
||||
const client = new OpenApiClient(getConfig());
|
||||
const data = await client.getTokenSignalV2(opts["chain"] as string, groups).catch(exitOnError);
|
||||
printResult(data, opts["raw"] as boolean | undefined);
|
||||
});
|
||||
}
|
||||
|
||||
// ---- Trenches filter field definitions ----
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ export interface Config {
|
||||
|
||||
let _config: Config | null = null;
|
||||
const PRIVATE_KEY_REQUIRED_MSG =
|
||||
"GMGN_PRIVATE_KEY is required for critical-auth commands (swap and all order commands)";
|
||||
"GMGN_PRIVATE_KEY is required for critical-auth commands (swap, order, and follow-wallet commands)";
|
||||
|
||||
export function getConfig(requirePrivateKey = false): Config {
|
||||
if (_config) {
|
||||
|
||||
Reference in New Issue
Block a user