Compare commits

...

52 Commits

Author SHA1 Message Date
GMGN.AI 3046c6d6cd 1.2.6 2026-04-20 11:46:18 +08:00
GMGN.AI ee4838d565 Merge pull request #108 from GumpOnchain/fix/follow-wallet-critical-auth
fix(track): switch follow-wallet to critical auth (fix HTTP 401 AUTH_INVALID)
2026-04-20 11:44:20 +08:00
GMGN.AI f19a1919da fix(track): switch follow-wallet to critical auth and fix signer array support
GET /v1/trade/follow_wallet requires X-Signature (critical auth) but was
called via normalRequest (API Key only), causing HTTP 401 AUTH_INVALID
with "missing signature".

- OpenApiClient: getFollowWallet now calls criticalRequest; criticalRequest
  queryExtra type widened to accept string[] to support the --filter option
- signer: buildMessage handles string[] values as sorted repeated k=v pairs,
  consistent with buildUrl / URLSearchParams serialization
- config: update PRIVATE_KEY_REQUIRED_MSG to include follow-wallet
- SKILL.md: prerequisites note GMGN_PRIVATE_KEY for follow-wallet; first-time
  setup now saves private key to ~/.config/gmgn/.env and removes /tmp copy;
  Notes section corrected to reflect split auth modes
- CLAUDE.md: Auth Modes table updated — follow-wallet moved to Critical row

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 11:42:56 +08:00
davidsx 4cfe0e0fb5 Merge pull request #107 from GMGNAI/docs/market-signal-disallow-types-14-16
docs(gmgn-market): document token_signal types 14–16 rejected by API
2026-04-20 11:42:04 +08:00
David Lau 5755206b58 docs(gmgn-market): document token_signal types 14–16 rejected by API
Align SKILL with OpenAPI validation: signal_type must not include 14, 15,
or 16 (400 BAD_REQUEST). Update examples and clarify behavior when
--signal-type is omitted.

Made-with: Cursor
2026-04-20 11:41:40 +08:00
davidsx 6ab9cb108b Update SKILL.md 2026-04-17 14:37:42 +08:00
GMGN.AI 51d2214253 1.2.5 2026-04-17 14:34:03 +08:00
GMGN.AI 8d3541c2a3 Merge pull request #104 from GMGNAI/feat-market-signal
feat(market): add market signal command for token signal feed
2026-04-17 14:29:25 +08:00
David Lau 39d80429f6 feat(market): add market signal command for token signal feed
- Add POST /v1/market/token_signal client method and TokenSignalGroup interface
- Add market signal sub-command with individual flags for single-group queries
- Support --groups <json> override for multi-group parallel queries
- Document max 50 results per group limit
- Update SKILL.md, cli-usage.md, and README with signal types, response fields, and examples

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 14:00:52 +08:00
GMGN.AI fd226c654b Merge pull request #103 from GumpOnchain/feat/description-frontload
docs(portfolio): add created-tokens and dev wallet capabilities to description
2026-04-15 21:05:41 +08:00
GMGN.AI a08fc7b580 docs(portfolio): add created-tokens and dev wallet capabilities to description
Previous description omitted portfolio created-tokens (dev wallet token
history, ATH market cap, graduation status) and token-balance sub-commands.
Added "tokens created by a developer wallet (with ATH market cap and DEX
graduation status)" and corresponding trigger phrases so agents match
queries like "what tokens has this dev launched" or "highest ATH token
this dev ever created".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 21:04:39 +08:00
GMGN.AI f49c89e609 Merge pull request #102 from GumpOnchain/feat/description-frontload
docs(skills): front-load key terms and trim descriptions for search optimization
2026-04-15 20:59:28 +08:00
GMGN.AI ad4eab3852 docs(skills): front-load key terms and trim descriptions for search optimization
Shorten all 6 descriptions to 60-80 words with high-value terms in the
first 50 words (highest embedding weight). Add "crypto", "meme coin",
"meme token" where missing. Remove redundant chain-name repetition in
"Use when" sections. Keeps discriminating boundary hints (e.g. gmgn-track
→ gmgn-portfolio redirect for single-wallet queries).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 20:58:22 +08:00
GMGN.AI 6fd302af60 Merge pull request #101 from GumpOnchain/feat/skill-description-vector-search
docs(skills): optimize descriptions for vector search and keyword search
2026-04-15 20:46:03 +08:00
GMGN.AI cdcf4e11d3 docs(skills): optimize descriptions for vector search and keyword search
Rewrote all 6 SKILL.md descriptions to improve discoverability on
clawhub.ai via both vector (semantic) and keyword search:
- gmgn-token: add "due diligence", "is it a rug", "dev wallet", "before buying" semantics
- gmgn-market: clarify "without a specific token address" to distinguish from gmgn-token; add "pumping", "fresh listings"
- gmgn-portfolio: add "by address", "decide whether to copy-trade" trigger context
- gmgn-swap: add "single swap" vs multi-wallet distinction; clarify execution verbs
- gmgn-track: add "alpha signals", "on-chain alpha"; explicit boundary note vs gmgn-portfolio
- gmgn-cooking: add "bonding curve fair launch", "cook a token", ETH/TON chain support

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 20:43:44 +08:00
GMGN.AI 319c4bbf33 Merge pull request #100 from GumpOnchain/feat/track-description-refine
docs(track): clarify description with "crypto token trading activity"
2026-04-15 19:54:27 +08:00
GMGN.AI 2b61eb807a docs(track): clarify description with "crypto token trading activity"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 19:52:58 +08:00
GMGN.AI 46c56b7e5d Merge pull request #99 from GumpOnchain/feat/market-description-fourmeme
docs(market): add fourmeme to launchpad list in description
2026-04-15 19:46:55 +08:00
GMGN.AI b18738177c docs(market): add fourmeme to launchpad list in description
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 19:45:53 +08:00
GMGN.AI cfb4270816 Merge pull request #98 from GumpOnchain/feat/swap-description-refine
docs(swap): refine description to highlight meme coin trading, multi-wallet, and trailing orders
2026-04-15 19:40:01 +08:00
GMGN.AI 932bf8c82c docs(swap): refine description to highlight meme coin trading, multi-wallet, and trailing orders
Surface key features upfront: buying/selling meme coins, multi-wallet
trading, trailing stop loss, and trailing take profit — so clawhub.ai
skill search matches more user intents precisely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 19:38:14 +08:00
GMGN.AI 4143e07266 Merge pull request #97 from GumpOnchain/feat/skill-description-optimization
docs(skills): optimize SKILL.md descriptions for clawhub.ai discoverability
2026-04-15 19:35:04 +08:00
GMGN.AI 4f96fedbb1 docs(skills): optimize SKILL.md descriptions for clawhub.ai discoverability
Rewrite description fields across all 6 skills to follow a consistent
"Get [capabilities] via GMGN API. Use when user asks for [intents]."
pattern, aligned with how Openclaw agents search clawhub.ai. Adds
natural-language intent keywords (price, market cap, holder list,
Smart Money, KOL trades, copy-trading, etc.) so skills surface higher
in skill-search results.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 19:32:03 +08:00
GMGN.AI eeb4a77cf7 Merge pull request #96 from gina888666/fix/portfolio-created-tokens-docs
docs(portfolio): clarify created-tokens total count and add routing guidance
2026-04-15 17:47:19 +08:00
gina888666 f7c051e2d1 docs(portfolio): clarify created-tokens total count and add routing guidance
- Clarify `inner_count` description: add "(NOT graduated)" to distinguish from `open_count`
- Add explicit note that total created = `inner_count + open_count` (tokens array is capped at 100 and may be truncated)
- Add routing guidance for dev token queries: direct AI to use `portfolio created-tokens` when user asks about tokens a dev created

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 17:35:28 +08:00
GMGN.AI 8bc1b2be6b 1.2.4 2026-04-14 16:48:22 +08:00
GMGN.AI 990601d031 Merge pull request #94 from GMGNAI/feat/portfolio-created-tokens
feat(portfolio): add created-tokens command for developer wallet token history
2026-04-14 16:46:09 +08:00
David Lau db55c77a26 feat(portfolio): add created-tokens command for developer wallet token history
Add GET /v1/user/created_tokens support: portfolio created-tokens CLI command,
OpenApiClient method, SKILL.md docs, cli-usage.md, and Readme examples.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-14 16:43:25 +08:00
GMGN.AI 91473cc366 Merge pull request #93 from GMGNAI/feat/multi-swap-follow-wallet
feat(swap): add multi-swap command
2026-04-14 16:40:01 +08:00
David Lau 38bff1aecb feat(swap): add multi-swap command; fix(track): downgrade follow-wallet to normal auth
- Add POST /v1/trade/multi_swap support: new MultiSwapParams interface,
  multiSwap() method, and multi-swap CLI command with full options
  (accounts, input/output amounts, slippage, fees, condition-orders, etc.)
- Fix track follow-wallet: switch from criticalRequest to normalRequest;
  --wallet is now optional (API Key's bound user resolves the follow list)
- Update SKILL.md, cli-usage.md, Readme.md, Readme.zh.md to reflect both changes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 20:43:32 +08:00
GMGN.AI 6d09536349 Merge pull request #92 from GumpOnchain/docs/swap-skill-argument-hint
docs(gmgn-swap): add order strategy commands to argument-hint
2026-04-10 20:26:17 +08:00
gumponchain cd9b285b3f docs(gmgn-swap): add order strategy commands to argument-hint
Add order strategy list (with required --group-tag) and order strategy
create (with required --order-type) to the frontmatter argument-hint,
reflecting newly required parameters added after 2026-04-07.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 20:24:31 +08:00
GMGN.AI c6141c880f Merge pull request #91 from GMGNAI/feat/token-info-extra-fields
docs(gmgn-token): add launchpad, migration, ath_price, locked_ratio a…
2026-04-10 16:04:47 +08:00
David Lau 3551bc3a25 docs(gmgn-token): add launchpad, migration, ath_price, locked_ratio and dev.ath_token_info fields
- Document 9 new top-level fields in token info response:
  launchpad, launchpad_status, launchpad_progress, launchpad_platform,
  migrated_pool, migration_market_cap, migration_market_cap_quote,
  ath_price, locked_ratio
- Document dev.ath_token_info sub-fields (creator all-time-high token)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 17:47:20 +08:00
GMGN.AI 8448787176 Merge pull request #90 from gina888666/fix/portfolio-stats-created-at-doc
docs(gmgn-portfolio): add created_at field to portfolio stats common object
2026-04-09 15:35:18 +08:00
gina888666 04389b98f0 docs(gmgn-portfolio): add created_at field to portfolio stats common object 2026-04-09 14:50:29 +08:00
deepfeature 2949ea7de3 1.2.3 2026-04-09 12:50:11 +08:00
GMGN.AI 4dde77c481 Merge pull request #88 from gina888666/fix/private-vault-hold-rate-doc
docs(gmgn-token): add private_vault_hold_rate field to stat object reference
2026-04-08 21:04:22 +08:00
GMGN.AI 02d497df92 Merge pull request #89 from GMGNAI/feat/expose-order-report
feat(swap): expose execution report fields in order get response
2026-04-08 21:00:37 +08:00
David Lau 48a06cd9b4 feat(swap): expose execution report fields in order get response
Replace top-level filled_input_amount/filled_output_amount with the
report object returned when state=30 and status=successful. Document
all report fields (amounts, tokens, decimals, price, gas) and update
order polling, post-swap receipt template, and cooking status polling
to reference report.input_amount / report.output_amount.

Closes GMGNAI/gmgn-skills#34

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 20:40:53 +08:00
gina888666 9e90bb9c07 docs(gmgn-token): add private_vault_hold_rate field to stat object reference 2026-04-08 20:21:36 +08:00
GMGN.AI 31fababfd8 Merge pull request #87 from GMGNAI/feat-wallet-stat-common
docs(portfolio): document common identity field in wallet stats response
2026-04-08 19:24:04 +08:00
GMGN.AI 6833ff19cd Merge pull request #82 from GMGNAI/feat-token-info-expose-dev
docs(token): document dev object in token info response
2026-04-08 19:22:54 +08:00
David Lau ccf3dc1c23 docs(portfolio): document common identity field in wallet stats response
- Add common object fields table to portfolio stats key fields section
- Update stats summary output template with optional Identity line
- Document graceful degradation when common is absent

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 18:45:48 +08:00
GMGN.AI 3c1ffdd7eb Merge pull request #86 from GumpOnchain/docs/readme-swap-order-types
docs(readme): add supported order types table under Trade Faster section
2026-04-08 18:10:46 +08:00
gumponchain 10d9c592d2 docs(readme): add supported order types table under Trade Faster section
List all swap skill order types: market, limit, take-profit/stop-loss,
trailing take-profit/stop-loss, and multi-wallet batch trading.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 18:07:43 +08:00
deepfeature ff3f52f3d8 Merge pull request #85 from GMGNAI/codex/fix-bsc-order-quote-auth
[codex] Require critical auth for order quote
2026-04-08 18:04:48 +08:00
deepfeature 1ea71149d9 require critical auth for order quote 2026-04-08 17:24:35 +08:00
deepfeature ca3c640afc fix bsc order quote auth 2026-04-08 17:19:16 +08:00
David Lau 2073b5fdaf docs(token): document dev object in token info response
- Add dev nested object table to Response Field Reference with all 21 fields
  (creator wallet, DEXScreener activity, CTO flag, funding source, etc.)
- Update nested objects description to include dev as the 5th object

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 16:09:17 +08:00
deepfeature fce314b9ab Merge pull request #81 from GMGNAI/feat/condition-order-trace-types
docs(swap): require group_tag in order strategy list; add list examples
2026-04-08 15:26:55 +08:00
David Lau dbe3eec697 docs(swap): require group_tag in order strategy list; add list examples
- Mark --group-tag as required (LimitOrder or STMix)
- Add usage examples: STMix for condition orders, LimitOrder for limit orders

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 15:05:01 +08:00
19 changed files with 852 additions and 111 deletions
+2 -2
View File
@@ -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
+42 -4
View File
@@ -42,6 +42,14 @@ Data across SOL / BSC / Base is live on every query. Supports multi-parameter cu
- Market orders, limit orders, and strategy orders (take-profit / stop-loss) in a single command.
- Sell by position percentage (`--percent 50`) without calculating exact amounts.
| Order Type | Description |
|------------|-------------|
| Market Order | Instant execution at current market price |
| Limit Order | Trigger buy or sell at a specified price |
| Take-Profit / Stop-Loss | Fixed-price exit conditions attached to a swap |
| Trailing Take-Profit / Trailing Stop-Loss | Tracks price peak; fires after a specified drawdown % — rides momentum while protecting gains |
| Multi-Wallet Batch Trading | Buy with multiple wallets simultaneously, each with its own take-profit / stop-loss / trailing take-profit / trailing stop-loss orders |
### 3. More comprehensive token data
No more scraping web pages or getting blocked by Cloudflare. Query all the professional analytics needed for high-frequency Meme token trading, with high concurrency in real time (including but not limited to):
@@ -158,7 +166,7 @@ echo 'GMGN_API_KEY=<user_api_key>' > ~/.config/gmgn/.env
chmod 600 ~/.config/gmgn/.env
```
If the user also needs swap capability, append the private key:
If the user also needs swap or order capability, append the private key:
```bash
# Append private key (use the PEM content from Step 3)
@@ -463,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
@@ -482,14 +497,17 @@ gmgn-cli portfolio info
# Single token balance
gmgn-cli portfolio token-balance --chain sol --wallet <addr> --token <token_addr>
# Tokens created by a developer wallet
gmgn-cli portfolio created-tokens --chain sol --wallet <addr>
```
### Track
```bash
# Follow-wallet trade records (requires GMGN_PRIVATE_KEY)
# Follow-wallet trade records
gmgn-cli track follow-wallet --chain sol
gmgn-cli track follow-wallet --chain sol --wallet <wallet_address> --side buy
gmgn-cli track follow-wallet --chain sol --limit 20 --min-amount-usd 1000
# KOL trade records
gmgn-cli track kol --limit 100 --raw
@@ -500,7 +518,7 @@ gmgn-cli track smartmoney --limit 100 --raw
gmgn-cli track smartmoney --chain sol --side sell --limit 50 --raw
```
### Swap (requires private key)
### Swap / Quote / Query
```bash
# Submit swap with fixed slippage
@@ -539,10 +557,30 @@ gmgn-cli order quote \
--amount 1000000 \
--slippage 0.01
# Quotes use critical auth and require GMGN_PRIVATE_KEY on every chain
gmgn-cli order quote \
--chain bsc \
--from <wallet-address> \
--input-token <input-token-addr> \
--output-token <output-token-addr> \
--amount 1000000000000000000 \
--slippage 0.01
# Query order
gmgn-cli order get --chain sol --order-id <order-id>
# Multi-wallet concurrent swap
gmgn-cli multi-swap \
--chain sol \
--accounts <addr1>,<addr2> \
--input-token <input-token-addr> \
--output-token <output-token-addr> \
--input-amount '{"<addr1>":"1000000","<addr2>":"2000000"}' \
--slippage 0.01
```
> `order quote` uses critical auth on `sol` / `bsc` / `base` and requires `GMGN_PRIVATE_KEY`.
### Swap with Take-Profit / Stop-Loss Orders (requires private key)
**`hold_amount` mode** — each condition order fires based on current holdings at trigger time:
+35 -5
View File
@@ -45,6 +45,14 @@ SOL / BSC / Base 多链数据每次查询均为实时,支持多参数个性化
- 单条命令支持市价单、限价单、策略单(止盈 / 止损)。
- 支持按仓位比例卖出(`--percent 50`),无需手动计算数量。
| 订单类型 | 说明 |
|----------|------|
| 市价单 | 以当前市价即时成交 |
| 限价单 | 设定触发价格,到价买入或卖出 |
| 止盈 / 止损 | 随买单附带固定价格的退出条件 |
| 追踪止盈 / 追踪止损 | 跟踪价格峰值,回撤达到指定比例后触发,吃满行情同时保护收益 |
| 多钱包批量交易 | 多个钱包同时买入,每个钱包分别创建对应的止盈 / 止损 / 追踪止盈 / 追踪止损订单 |
### 3. 特色数据更全
不用再爬网页,不会被Claudeflare拦截,现在就可以快速/多并发实时查询多链的 Meme 代币高频交易所需的所有专业分析指标数据 (包括不限于):
@@ -164,7 +172,7 @@ echo 'GMGN_API_KEY=<user_api_key>' > ~/.config/gmgn/.env
chmod 600 ~/.config/gmgn/.env
```
如果用户需要 swap 能力,追加私钥:
如果用户需要 swap 或 order 能力,追加私钥:
```bash
# 追加私钥(使用第 3 步输出的 PEM 内容)
@@ -443,7 +451,6 @@ solana 上的 <token_address> 安全吗,值得买入吗?
完整参数说明:[docs/cli-usage.md](docs/cli-usage.md)。所有命令均支持 `--raw` 输出单行 JSON(方便 `jq` 等工具处理)。
### Token
```bash
# 基本信息 + 实时价格
gmgn-cli token info --chain sol --address <addr>
@@ -514,14 +521,17 @@ gmgn-cli portfolio info
# 单个 token 余额
gmgn-cli portfolio token-balance --chain sol --wallet <addr> --token <token_addr>
# 查询开发者钱包创建的代币列表
gmgn-cli portfolio created-tokens --chain sol --wallet <addr>
```
### Track
```bash
# 追踪关注钱包的交易动态(需要 GMGN_PRIVATE_KEY
# 追踪关注钱包的交易动态
gmgn-cli track follow-wallet --chain sol
gmgn-cli track follow-wallet --chain sol --wallet <wallet_address> --side buy
gmgn-cli track follow-wallet --chain sol --limit 20 --min-amount-usd 1000
# KOL 交易动态
gmgn-cli track kol --limit 100 --raw
@@ -532,7 +542,7 @@ gmgn-cli track smartmoney --limit 100 --raw
gmgn-cli track smartmoney --chain sol --side sell --limit 50 --raw
```
### Swap(需要私钥)
### Swap / Quote / Query
```bash
# 提交兑换(固定滑点)
@@ -571,10 +581,30 @@ gmgn-cli order quote \
--amount 1000000 \
--slippage 0.01
# 所有链上的 quote 都走关键鉴权,需要 GMGN_PRIVATE_KEY
gmgn-cli order quote \
--chain bsc \
--from <wallet-address> \
--input-token <input-token-addr> \
--output-token <output-token-addr> \
--amount 1000000000000000000 \
--slippage 0.01
# 查询订单状态
gmgn-cli order get --chain sol --order-id <order-id>
# 多钱包并发 Swap
gmgn-cli multi-swap \
--chain sol \
--accounts <addr1>,<addr2> \
--input-token <input-token-addr> \
--output-token <output-token-addr> \
--input-amount '{"<addr1>":"1000000","<addr2>":"2000000"}' \
--slippage 0.01
```
> `order quote` 在 `sol` / `bsc` / `base` 上都走关键鉴权,必须配置 `GMGN_PRIVATE_KEY`。
### 带止盈止损的 Swap(需要私钥)
**`hold_amount` 模式** — 按触发时的实际持仓比例卖出:
+155 -25
View File
@@ -255,6 +255,30 @@ npx gmgn-cli portfolio token-balance \
---
## portfolio created-tokens
Query tokens created by a developer wallet.
```bash
npx gmgn-cli portfolio created-tokens \
--chain <chain> \
--wallet <wallet_address> \
[--order-by <field>] \
[--direction asc|desc] \
[--migrate-state <state>] \
[--raw]
```
| Option | Required | Description |
|--------|----------|-------------|
| `--chain` | Yes | `sol` / `bsc` / `base` |
| `--wallet` | Yes | Developer wallet address |
| `--order-by` | No | Sort field: `market_cap` / `token_ath_mc` |
| `--direction` | No | Sort direction: `asc` / `desc` |
| `--migrate-state` | No | Filter: `migrated` / `non_migrated` |
---
## market trenches
Query Trenches token lists (new creation, near completion, completed).
@@ -274,77 +298,120 @@ npx gmgn-cli market trenches --chain <chain> [--type <type...>] [--launchpad-pla
---
## portfolio follow-wallet
## market signal
Query follow-wallet trade records.
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
npx gmgn-cli portfolio follow-wallet \
# 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 (118, 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).
```bash
gmgn-cli track follow-wallet \
--chain <chain> \
[--wallet <wallet_address>] \
[--base-token <token_address>] \
[--page-token <cursor>] \
[--limit <n>] \
[--side <side>] \
[--cost <cost>] \
[--filter <tag>] \
[--with-balance] \
[--with-security] \
[--min-amount-usd <n>] \
[--max-amount-usd <n>] \
[--is-gray] \
[--raw]
```
| Option | Required | Description |
|--------|----------|-------------|
| `--chain` | Yes | `sol` / `bsc` / `base` / `eth` |
| `--wallet` | No | Filter by wallet address |
| `--base-token` | No | Filter by base token address |
| `--page-token` | No | Pagination cursor |
| `--limit` | No | Page size (1200, default 100) |
| `--side` | No | Trade direction filter |
| `--cost` | No | Cost filter |
| `--chain` | Yes | `sol` / `bsc` / `base` |
| `--wallet` | No | Wallet address (optional; follow list resolved from API Key's bound user account) |
| `--limit` | No | Page size (1100, default 10) |
| `--side` | No | Trade direction: `buy` / `sell` |
| `--filter` | No | Filter conditions (repeatable) |
| `--with-balance` | No | Include balance in response |
| `--with-security` | No | Include security info in response |
| `--min-amount-usd` | No | Minimum trade amount (USD) |
| `--max-amount-usd` | No | Maximum trade amount (USD) |
| `--is-gray` | No | Gray mode filter |
---
## portfolio kol
Query KOL trade records (SOL chain).
Query KOL trade records.
```bash
npx gmgn-cli portfolio kol [--limit <n>] [--raw]
gmgn-cli track kol [--chain <chain>] [--limit <n>] [--side <side>] [--raw]
```
| Option | Required | Description |
|--------|----------|-------------|
| `--chain` | No | `sol` / `bsc` / `base` (default `sol`) |
| `--limit` | No | Page size (1200, default 100) |
| `--side` | No | Filter by trade direction: `buy` / `sell` (client-side filter) |
---
## portfolio smartmoney
Query Smart Money trade records (SOL chain).
Query Smart Money trade records.
```bash
npx gmgn-cli portfolio smartmoney [--limit <n>] [--raw]
gmgn-cli track smartmoney [--chain <chain>] [--limit <n>] [--side <side>] [--raw]
```
| Option | Required | Description |
|--------|----------|-------------|
| `--chain` | No | `sol` / `bsc` / `base` (default `sol`) |
| `--limit` | No | Page size (1200, default 100) |
| `--side` | No | Filter by trade direction: `buy` / `sell` (client-side filter) |
---
## order quote
Get a swap quote without submitting a transaction. Uses normal auth — no private key required.
Get a swap quote without submitting a transaction. All supported quote chains use critical auth and require `GMGN_PRIVATE_KEY`.
```bash
npx gmgn-cli order quote \
@@ -359,7 +426,7 @@ npx gmgn-cli order quote \
| Option | Required | Description |
|--------|----------|-------------|
| `--chain` | Yes | `sol` / `bsc` / `base` |
| `--chain` | Yes | `sol` / `bsc` / `base` (all require `GMGN_PRIVATE_KEY` for quote) |
| `--from` | Yes | Wallet address (must match API Key binding) |
| `--input-token` | Yes | Input token contract address |
| `--output-token` | Yes | Output token contract address |
@@ -455,6 +522,69 @@ npx gmgn-cli swap \
---
## multi-swap
Submit token swaps across multiple wallets concurrently. Each wallet executes independently. Up to 100 wallets per request, all must be bound to the API Key. **Requires `GMGN_PRIVATE_KEY` configured in `.env`.**
```bash
gmgn-cli multi-swap \
--chain <chain> \
--accounts <addr1>,<addr2> \
--input-token <input_token_address> \
--output-token <output_token_address> \
[--input-amount <json>] \
[--input-amount-bps <json>] \
[--output-amount <json>] \
[--slippage <n>] \
[--auto-slippage] \
[--anti-mev] \
[--priority-fee <sol>] \
[--tip-fee <amount>] \
[--auto-tip-fee] \
[--max-auto-fee <amount>] \
[--gas-price <gwei>] \
[--max-fee-per-gas <amount>] \
[--max-priority-fee-per-gas <amount>] \
[--condition-orders <json>] \
[--sell-ratio-type <buy_amount|hold_amount>] \
[--raw]
```
| Option | Required | Description |
|--------|----------|-------------|
| `--chain` | Yes | `sol` / `bsc` / `base` |
| `--accounts` | Yes | Comma-separated wallet addresses (1100, all bound to API Key) |
| `--input-token` | Yes | Input token contract address |
| `--output-token` | Yes | Output token contract address |
| `--input-amount` | No* | JSON map `{"addr":"amount"}` in smallest unit; one of the three amount fields is required |
| `--input-amount-bps` | No* | JSON map `{"addr":"bps"}` where 5000 = 50%; only valid when input token is not a currency |
| `--output-amount` | No* | JSON map `{"addr":"amount"}` target output in smallest unit |
| `--slippage` | No | Slippage tolerance, e.g. `0.01` = 1% |
| `--auto-slippage` | No | Enable automatic slippage |
| `--anti-mev` | No | Enable anti-MEV protection |
| `--priority-fee` | No | Priority fee in SOL (≥ 0.00001, SOL only) |
| `--tip-fee` | No | Tip fee (SOL ≥ 0.00001 / BSC ≥ 0.000001 BNB) |
| `--auto-tip-fee` | No | Enable automatic tip fee |
| `--max-auto-fee` | No | Max automatic fee cap |
| `--gas-price` | No | Gas price in gwei (BSC ≥ 0.05 / BASE/ETH ≥ 0.01) |
| `--max-fee-per-gas` | No | EIP-1559 max fee per gas (Base only) |
| `--max-priority-fee-per-gas` | No | EIP-1559 max priority fee per gas (Base only) |
| `--condition-orders` | No | JSON array of take-profit/stop-loss conditions, attached to each successful wallet's swap (best-effort) |
| `--sell-ratio-type` | No | Sell ratio base: `buy_amount` (default) / `hold_amount` |
**Response fields (data):** Array of per-wallet results:
| Field | Type | Description |
|-------|------|-------------|
| `account` | string | Wallet address |
| `success` | bool | Whether this wallet's swap succeeded |
| `error` | string | Error message on failure |
| `error_code` | string | Error code on failure |
| `result` | object | OrderResponse on success (same fields as `swap` response) |
| `result.strategy_order_id` | string | Strategy order ID; only present when `--condition-orders` passed and strategy creation succeeded |
---
## order get
Query order status. **Requires `GMGN_PRIVATE_KEY` configured in `.env`.**
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "gmgn-cli",
"version": "1.2.2",
"version": "1.2.6",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "gmgn-cli",
"version": "1.2.2",
"version": "1.2.6",
"license": "MIT",
"dependencies": {
"commander": "^12.1.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "gmgn-cli",
"version": "1.2.2",
"version": "1.2.6",
"description": "GMGN OpenAPI CLI — call GMGN market, token, portfolio and swap APIs from the command line",
"type": "module",
"bin": {
+2 -2
View File
@@ -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"
@@ -167,7 +167,7 @@ Token creation is **asynchronous**. If the initial `cooking create` response sho
```bash
gmgn-cli order get --chain <chain> --order-id <order_id>
```
2. The new token's contract / mint address is in the **`output_token`** field of the `order get` response — it is NOT returned by `cooking create` directly.
2. The new token's contract / mint address is in the **`report.output_token`** field of the `order get` response (only present when `state = 30` and `status = "successful"`) — it is NOT returned by `cooking create` directly.
3. Stop polling once `status` is `confirmed`, `failed`, or `expired`.
4. On `confirmed`: display `output_token` as the token address and include the block explorer link.
5. On `failed` / `expired`: report the `error_status` and do not retry automatically.
+113 -3
View File
@@ -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 1416 in that case.
| Option | Required | Description |
|--------|----------|-------------|
| `--chain` | Yes | `sol` / `bsc` |
| `--signal-type` | No | Signal type(s), repeatable (118, 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 (118, 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 (01) |
| `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 1416 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 1416 — 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
+97 -3
View File
@@ -1,7 +1,7 @@
---
name: gmgn-portfolio
description: Query GMGN wallet portfolio — API Key wallet info, holdings, transaction activity, trading stats, and token balance. Supports sol / bsc / base.
argument-hint: "<info|holdings|activity|stats|token-balance> [--chain <sol|bsc|base>] [--wallet <wallet_address>]"
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"
---
@@ -39,6 +39,7 @@ Use the `gmgn-cli` tool to query wallet portfolio data based on the user's reque
| `portfolio activity` | Transaction history |
| `portfolio stats` | Trading statistics (supports batch) |
| `portfolio token-balance` | Token balance for a specific token |
| `portfolio created-tokens` | Tokens created by a developer wallet, with market cap and ATH info |
## Supported Chains
@@ -60,6 +61,7 @@ All portfolio routes used by this skill go through GMGN's leaky-bucket limiter w
| `portfolio activity` | `GET /v1/user/wallet_activity` | 3 |
| `portfolio stats` | `GET /v1/user/wallet_stats` | 3 |
| `portfolio token-balance` | `GET /v1/user/wallet_token_balance` | 1 |
| `portfolio created-tokens` | `GET /v1/user/created_tokens` | 2 |
When a request returns `429`:
@@ -125,8 +127,28 @@ gmgn-cli portfolio stats --chain sol \
# Token balance
gmgn-cli portfolio token-balance \
--chain sol --wallet <wallet_address> --token <token_address>
# Tokens created by a developer wallet
gmgn-cli portfolio created-tokens --chain sol --wallet <wallet_address>
# Created tokens sorted by all-time high market cap
gmgn-cli portfolio created-tokens \
--chain sol --wallet <wallet_address> \
--order-by token_ath_mc --direction desc
# Only migrated tokens
gmgn-cli portfolio created-tokens \
--chain sol --wallet <wallet_address> --migrate-state migrated
```
## `portfolio created-tokens` Options
| Option | Description |
|--------|-------------|
| `--order-by <field>` | Sort field: `market_cap` / `token_ath_mc` |
| `--direction <asc\|desc>` | Sort direction (default `desc`) |
| `--migrate-state <state>` | Filter by migration status: `migrated` (graduated to DEX) / `non_migrated` (still on bonding curve) |
## `portfolio holdings` Options
| Option | Description |
@@ -212,6 +234,76 @@ The response is an object (or array for batch). Key fields:
| `sell_count` | Number of sell transactions |
| `pnl` | Profit/loss ratio = `realized_profit / total_cost` |
The response also includes a `common` object when available (absent if the upstream identity service is unavailable):
| Field | Description |
|-------|-------------|
| `common.avatar` | Wallet avatar URL |
| `common.name` | Display name |
| `common.ens` | ENS domain (EVM chains only) |
| `common.tag` | Primary wallet tag |
| `common.tags` | All wallet tags (e.g. `["smart_money"]`) |
| `common.twitter_username` | Twitter handle |
| `common.twitter_name` | Twitter display name |
| `common.followers_count` | Twitter follower count |
| `common.is_blue_verified` | Twitter blue-verified badge |
| `common.follow_count` | Number of GMGN users following this wallet |
| `common.remark_count` | Number of GMGN users who have remarked this wallet |
| `common.created_token_count` | Tokens created by this wallet |
| `common.created_at` | Wallet creation time (Unix seconds) — records when the first funding transaction arrived; use this as the wallet's age indicator |
| `common.fund_from` | Funding source label |
| `common.fund_from_address` | Address that funded this wallet |
| `common.fund_amount` | Funding amount |
Use `common.tags` and `common.twitter_username` when building a wallet profile narrative. If `common` is absent in the response, omit identity fields silently — do not report it as an error.
### `portfolio created-tokens` — Key Fields
The response `data` object has a `tokens` array plus aggregate stats.
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 (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 |
`creator_ath_info` fields:
| Field | Description |
|-------|-------------|
| `creator` | Wallet address |
| `ath_token` | Token address with highest ATH market cap |
| `ath_mc` | ATH market cap (USD string) |
| `token_symbol` / `token_name` | Token ticker and name |
| `token_logo` | Logo URL |
Per-token fields (`tokens[*]`):
| Field | Description |
|-------|-------------|
| `token_address` | Token contract address |
| `symbol` | Token ticker |
| `chain` | Chain name |
| `create_timestamp` | Unix timestamp of creation |
| `is_open` | `true` if graduated to DEX |
| `market_cap` | Current market cap (USD string) |
| `token_ath_mc` | All-time high market cap (USD string) |
| `pool_liquidity` | Current liquidity (USD string) |
| `holders` | Current holder count |
| `swap_1h` | Swap count in the last hour |
| `volume_1h` | Trading volume in the last hour (USD string) |
| `launchpad_platform` | Launch platform name (e.g. `Pump.fun`) |
| `is_pump` | `true` if launched on Pump.fun |
| `bundler_rate` | Bundler participation rate (01) |
| `cto_flag` | `true` if community-takeover token |
**Do NOT guess field names not listed here.** If a field appears in the response but is not in this table, do not interpret it without reading the raw output first.
## Output Format
@@ -251,9 +343,10 @@ Win Rate: {winrate × 100}%
Total Spent: ${total_cost}
Buys / Sells: {buy_count} / {sell_count}
PnL Ratio: {pnl}x
[Identity: {common.name or common.twitter_username} | Tags: {common.tags}]
```
For batch queries (multiple wallets), present one summary block per wallet.
Show the `[Identity: ...]` line only if `common` is present in the response. For batch queries (multiple wallets), present one summary block per wallet.
## Notes
@@ -273,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.
+132 -30
View File
@@ -1,7 +1,7 @@
---
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."
argument-hint: "[--chain <chain> --from <wallet> --input-token <addr> --output-token <addr> --amount <n>] | [order get --chain <chain> --order-id <id>]"
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"
---
@@ -12,7 +12,7 @@ metadata:
**⚠️ IPv6 NOT SUPPORTED: If you get a `401` or `403` error and credentials look correct, check for IPv6 immediately: (1) list all network interfaces and their IPv6 addresses — run `ifconfig | grep inet6` (macOS) or `ip addr show | grep inet6` (Linux); (2) send a test request to `https://ipv6.icanhazip.com` — if the response is an IPv6 address, outbound traffic is going via IPv6. Tell the user immediately: "Please disable IPv6 on your network interface — gmgn-cli commands only work over IPv4."**
Use the `gmgn-cli` tool to submit a token swap or query an existing order. **Requires private key** (`GMGN_PRIVATE_KEY` in `.env`).
Use the `gmgn-cli` tool to submit a token swap or query an existing order. `GMGN_API_KEY` is always required. `GMGN_PRIVATE_KEY` is required for critical-auth commands such as `swap` and all `order` subcommands, including `order quote`.
## Core Concepts
@@ -26,11 +26,11 @@ Use the `gmgn-cli` tool to submit a token swap or query an existing order. **Req
- **Anti-MEV** — MEV (Miner/Maximal Extractable Value) refers to frontrunning and sandwich attacks where bots exploit pending transactions. `--anti-mev` routes the transaction through protected channels to reduce this risk. **Recommended: always enable.** Default: on.
- **Critical auth** — `swap` requires both `GMGN_API_KEY` and `GMGN_PRIVATE_KEY`. The private key never leaves the machine — the CLI uses it only for local signing and sends only the resulting signature. Normal commands (like `order quote`) use API Key alone.
- **Critical auth** — `swap` and all `order` subcommands require both `GMGN_API_KEY` and `GMGN_PRIVATE_KEY`. The private key never leaves the machine — the CLI uses it only for local signing and sends only the resulting signature.
- **`order_id` / `status`** — After submitting a swap, the response includes an `order_id`. Use `order get --order-id` to poll for final status. Possible values: `pending``processed``confirmed` (success) or `failed` / `expired`. Do not report success until status is `confirmed`.
- **`filled_input_amount` / `filled_output_amount`** — Actual amounts consumed/received, in smallest unit. Convert to human-readable using token decimals before displaying to the user.
- **`report.input_amount` / `report.output_amount`** — Actual amounts consumed/received, in smallest unit. Only present when `state = 30` and `status = "successful"`. Convert to human-readable using `report.input_token_decimals` / `report.output_token_decimals` before displaying to the user.
## Financial Risk Notice
@@ -46,7 +46,8 @@ Use the `gmgn-cli` tool to submit a token swap or query an existing order. **Req
| Sub-command | Description |
|-------------|-------------|
| `swap` | Submit a token swap |
| `order quote` | Get a swap quote (no transaction submitted) |
| `multi-swap` | Submit token swaps across multiple wallets concurrently (up to 100) |
| `order quote` | Get a swap quote (no transaction submitted; requires critical auth) |
| `order get` | Query order status |
| `order strategy create` | Create a limit/strategy order (requires private key) |
| `order strategy list` | List strategy orders (requires private key) |
@@ -70,7 +71,7 @@ Currency tokens are the base/native assets of each chain. They are used to buy o
## Prerequisites
Both `GMGN_API_KEY` and `GMGN_PRIVATE_KEY` must be configured in `~/.config/gmgn/.env`. The private key must correspond to the wallet bound to the API Key.
`GMGN_API_KEY` must be configured in `~/.config/gmgn/.env`. `GMGN_PRIVATE_KEY` is additionally required for `swap` and all `order` subcommands. The private key must correspond to the wallet bound to the API Key.
- `gmgn-cli` installed globally — if missing, run: `npm install -g gmgn-cli`
@@ -81,6 +82,7 @@ All swap-related routes used by this skill go through GMGN's leaky-bucket limite
| Command | Route | Weight |
|---------|-------|--------|
| `swap` | `POST /v1/trade/swap` | 5 |
| `multi-swap` | `POST /v1/trade/multi_swap` | 5 |
| `order quote` | `GET /v1/trade/quote` | 2 |
| `order get` | `GET /v1/trade/query_order` | 1 |
@@ -163,9 +165,82 @@ gmgn-cli swap \
--percent 50
```
## `multi-swap` Usage
Submit a token swap across multiple wallets concurrently. Each wallet executes independently — one wallet's failure does not affect others. Up to 100 wallets per request. All wallets must be bound to the API Key. Requires `GMGN_PRIVATE_KEY`.
```bash
# Basic multi-wallet swap
gmgn-cli multi-swap \
--chain sol \
--accounts <addr1>,<addr2> \
--input-token <input_token_address> \
--output-token <output_token_address> \
--input-amount '{"<addr1>":"1000000","<addr2>":"2000000"}' \
--slippage 0.01
# Sell a percentage of each wallet's balance (use --input-amount-bps)
gmgn-cli multi-swap \
--chain sol \
--accounts <addr1>,<addr2> \
--input-token <token_address> \
--output-token <sol_address> \
--input-amount-bps '{"<addr1>":"5000","<addr2>":"10000"}' \
--slippage 0.01
# With per-wallet take-profit / stop-loss (condition_orders)
gmgn-cli multi-swap \
--chain sol \
--accounts <addr1>,<addr2> \
--input-token So11111111111111111111111111111111111111112 \
--output-token <token_address> \
--input-amount '{"<addr1>":"1000000","<addr2>":"2000000"}' \
--slippage 0.3 \
--priority-fee 0.00001 \
--tip-fee 0.00001 \
--condition-orders '[{"order_type":"profit_stop","side":"sell","price_scale":"100","sell_ratio":"100"},{"order_type":"loss_stop","side":"sell","price_scale":"50","sell_ratio":"100"}]'
```
## `multi-swap` Parameters
| Parameter | Required | Description |
|-----------|----------|-------------|
| `--chain` | Yes | `sol` / `bsc` / `base` |
| `--accounts` | Yes | Comma-separated wallet addresses (1100, all must be bound to the API Key) |
| `--input-token` | Yes | Input token contract address |
| `--output-token` | Yes | Output token contract address |
| `--input-amount` | No* | JSON map of `wallet_address → input amount` (smallest unit). One of `--input-amount`, `--input-amount-bps`, or `--output-amount` is required. |
| `--input-amount-bps` | No* | JSON map of `wallet_address → percent in bps` (110000; 5000 = 50%). Only valid when `input_token` is NOT a currency. |
| `--output-amount` | No* | JSON map of `wallet_address → target output amount` (smallest unit). |
| `--slippage <n>` | No | Slippage tolerance, e.g. `0.01` = 1%. Mutually exclusive with `--auto-slippage`. |
| `--auto-slippage` | No | Enable automatic slippage. |
| `--anti-mev` | No | Enable anti-MEV protection. |
| `--priority-fee <sol>` | No | Priority fee in SOL (≥ 0.00001, SOL only). Required when using `--condition-orders` on SOL. |
| `--tip-fee <amount>` | No | Tip fee (SOL ≥ 0.00001 / BSC ≥ 0.000001 BNB). Required when using `--condition-orders` on SOL. |
| `--auto-tip-fee` | No | Enable automatic tip fee. |
| `--max-auto-fee <amount>` | No | Max automatic fee cap. |
| `--gas-price <gwei>` | No | Gas price in gwei (BSC ≥ 0.05 / BASE/ETH ≥ 0.01). Required when using `--condition-orders` on BSC. |
| `--max-fee-per-gas <amount>` | No | EIP-1559 max fee per gas (Base only). |
| `--max-priority-fee-per-gas <amount>` | No | EIP-1559 max priority fee per gas (Base only). |
| `--condition-orders <json>` | No | JSON array of condition sub-orders (take-profit / stop-loss) attached to each successful wallet's swap. Same structure as `swap --condition-orders`. Strategy creation is best-effort per wallet. |
| `--sell-ratio-type <type>` | No | Sell ratio base for `--condition-orders`: `buy_amount` (default) / `hold_amount`. |
## `multi-swap` Response Fields
The response `data` is an array — one element per wallet:
| Field | Type | Description |
|-------|------|-------------|
| `account` | string | Wallet address |
| `success` | bool | Whether this wallet's swap succeeded |
| `error` | string | Error message on failure; absent on success |
| `error_code` | string | Error code on failure; absent on success |
| `result` | object | On success: OrderResponse (same fields as `swap` response). On failure: absent. |
| `result.strategy_order_id` | string | Strategy order ID; only present when `--condition-orders` was passed and strategy creation succeeded (best-effort) |
## `order quote` Usage
Get an estimated output amount before submitting a swap. Uses normal auth — no private key required.
Get an estimated output amount before submitting a swap. All supported quote chains use critical auth and require `GMGN_PRIVATE_KEY`.
```bash
gmgn-cli order quote \
@@ -273,26 +348,47 @@ gmgn-cli swap \
> `buy_amount`: each take-profit sells 50% of the **original** bought amount. Stop-loss sells 100% of the original bought amount.
## `swap` Response Fields
## `swap` / `order get` Response Fields
| Field | Type | Description |
|-------|------|-------------|
| `order_id` | string | Order ID for follow-up queries |
| `hash` | string | Transaction hash |
| `status` | string | Order status: `pending` / `processed` / `confirmed` / `failed` / `expired` |
| `error_code` | string | Error code on failure |
| `error_status` | string | Error description on failure |
| `input_token` | string | Input token contract address |
| `output_token` | string | Output token contract address |
| `filled_input_amount` | string | Actual input consumed (smallest unit); empty if not filled |
| `filled_output_amount` | string | Actual output received (smallest unit); empty if not filled |
| Field | Type | Description |
| ------------------- | ------ | ---- |
| `order_id` | string | Order ID for follow-up queries |
| `hash` | string | Transaction hash |
| `status` | string | Order status: `pending` / `processed` / `confirmed` / `failed` / `expired` |
| `error_code` | string | Error code on failure |
| `error_status` | string | Error description on failure |
| `strategy_order_id` | string | Strategy order ID; only present when `--condition-orders` was passed and strategy creation succeeded (best-effort) |
| `report` | object | Execution report; only present when `state = 30` and `status = "successful"`. See Report Fields below. |
### Report Fields (present only when `status = "successful"`)
| Field | Type | Description |
| ----------------------- | ------- | ---- |
| `input_token` | string | Input token contract address |
| `input_token_decimals` | integer | Input token decimal places |
| `swap_mode` | string | Swap mode: `ExactIn` / `ExactOut` |
| `input_amount` | string | Actual input consumed (smallest unit) |
| `output_token` | string | Output token contract address |
| `output_token_decimals` | integer | Output token decimal places |
| `output_amount` | string | Actual output received (smallest unit) |
| `quote_token` | string | Quote token contract address |
| `quote_decimals` | integer | Quote token decimal places |
| `quote_amount` | string | Quote amount (smallest unit) |
| `base_token` | string | Base token contract address |
| `base_decimals` | integer | Base token decimal places |
| `base_amount` | string | Base token amount (smallest unit) |
| `price` | string | Execution price (quote/base token) |
| `price_usd` | string | Execution price in USD |
| `height` | integer | Block height of execution |
| `order_height` | integer | Block height when order was placed |
| `gas_native` | string | Gas fee in native token |
| `gas_usd` | string | Gas fee in USD |
## Output Format
### Pre-swap Confirmation
Before displaying the confirmation, run `order quote` to get the estimated output (uses normal auth — no private key required):
Before displaying the confirmation, run `order quote` to get the estimated output (requires critical auth and `GMGN_PRIVATE_KEY` on every supported quote chain):
```bash
gmgn-cli order quote \
@@ -334,13 +430,13 @@ After a confirmed swap, display:
```
✅ Swap Confirmed
Spent: {filled_input_amount in human units} {input symbol}
Received: {filled_output_amount in human units} {output symbol}
Spent: {report.input_amount in human units} {input symbol}
Received: {report.output_amount in human units} {output symbol}
Tx: {explorer link for hash}
Order ID: {order_id}
```
Convert `filled_input_amount` and `filled_output_amount` from smallest unit using token decimals before displaying.
Convert `report.input_amount` and `report.output_amount` from smallest unit using `report.input_token_decimals` and `report.output_token_decimals` before displaying.
## `order strategy create` Parameters
@@ -380,7 +476,7 @@ Convert `filled_input_amount` and `filled_output_amount` from smallest unit usin
| `--chain` | Yes | `sol` / `bsc` / `base` |
| `--type` | No | `open` (default) / `history` |
| `--from` | No | Filter by wallet address |
| `--group-tag` | No | Filter by order group: `LimitOrder` (limit orders only) / `STMix` (mixed strategy orders: take-profit, stop-loss, trailing take-profit, trailing stop-loss) |
| `--group-tag` | Yes | Filter by order group: `LimitOrder` (limit orders only) / `STMix` (mixed strategy orders: take-profit, stop-loss, trailing take-profit, trailing stop-loss) |
| `--base-token` | No | Filter by token address |
| `--page-token` | No | Pagination cursor from previous response |
| `--limit` | No | Results per page (default 10 for history) |
@@ -430,11 +526,17 @@ gmgn-cli order strategy create \
--amount-in-percent 100 \
--slippage 0.01
# List open strategy orders
gmgn-cli order strategy list --chain sol
# List open condition orders (profit_stop / loss_stop / trace types) — use STMix
gmgn-cli order strategy list --chain sol --group-tag STMix
# List history orders with pagination
gmgn-cli order strategy list --chain sol --type history --limit 20
# List open limit orders (buy_low / buy_high / stop_loss / take_profit) — use LimitOrder
gmgn-cli order strategy list --chain sol --group-tag LimitOrder
# List condition order history with pagination
gmgn-cli order strategy list --chain sol --group-tag STMix --type history --limit 20
# Filter by token
gmgn-cli order strategy list --chain sol --group-tag STMix --base-token <token_address>
# Cancel a strategy order
gmgn-cli order strategy cancel \
@@ -496,7 +598,7 @@ For full token research before swapping, see [`docs/workflow-token-research.md`]
- **Percentage sell restriction** — `--percent` is ONLY valid when `input_token` is NOT a currency. Do NOT use `--percent` when `input_token` is SOL/BNB/ETH (native) or USDC. This includes: "sell 50% of my SOL", "use 30% of my BNB to buy X", "spend 50% of my USDC on X" — all unsupported. Explain the restriction to the user and ask for an explicit absolute amount instead.
- **Chain-wallet compatibility** — SOL addresses are incompatible with EVM chains (bsc/base). Warn the user and abort if the address format does not match the chain.
- **Credential sensitivity** — `GMGN_API_KEY` and `GMGN_PRIVATE_KEY` can directly execute trades on the linked wallet. Never log, display, or expose these values.
- **Order polling** — After a swap, if `status` is not yet `confirmed` / `failed` / `expired`, poll with `order get` up to 3 times at 5-second intervals before reporting a timeout. Once confirmed, display the trade result using `filled_input_amount` and `filled_output_amount` (convert from smallest unit using token decimals), e.g. "Spent 0.1 SOL → received 98.5 USDC" or "Sold 1000 TOKEN → received 0.08 SOL".
- **Order polling** — After a swap, if `status` is not yet `confirmed` / `failed` / `expired`, poll with `order get` up to 3 times at 5-second intervals before reporting a timeout. Once confirmed, display the trade result using `report.input_amount` and `report.output_amount` (convert from smallest unit using `report.input_token_decimals` / `report.output_token_decimals`), e.g. "Spent 0.1 SOL → received 98.5 USDC" or "Sold 1000 TOKEN → received 0.08 SOL".
- **Block explorer links** — After a successful swap, display a clickable explorer link for the returned `hash`:
| Chain | Explorer |
+45 -3
View File
@@ -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 |
@@ -142,7 +142,7 @@ Recommended combinations for common use cases:
### `token info` — Key Fields
The response has four nested objects: `pool`, `link`, `stat`, `wallet_tags_stat`. Access fields with dot notation when parsing (e.g. `link.website`, `stat.top_10_holder_rate`).
The response has five nested objects: `pool`, `dev`, `link`, `stat`, `wallet_tags_stat`. Access fields with dot notation when parsing (e.g. `link.website`, `stat.top_10_holder_rate`, `dev.creator_address`).
**Top-level Fields**
@@ -162,6 +162,15 @@ The response has four nested objects: `pool`, `link`, `stat`, `wallet_tags_stat`
| `open_timestamp` | Time the token opened for trading (Unix seconds) |
| `biggest_pool_address` | Address of the main liquidity pool |
| `og` | Whether the token is flagged as an OG token (`true` / `false`) |
| `launchpad` | Launchpad identifier (e.g. `pump`, `moonshot`) |
| `launchpad_status` | Launchpad state: `0` = not opened, `1` = live, `2` = migrated |
| `launchpad_progress` | Launchpad bonding-curve progress (01) |
| `launchpad_platform` | Launchpad platform name |
| `migrated_pool` | Pool address after migration |
| `migration_market_cap` | Market cap at migration time (USD, float) |
| `migration_market_cap_quote` | Quote currency for `migration_market_cap` |
| `ath_price` | All-time-high price (USD, float) |
| `locked_ratio` | Ratio of supply locked (01, float) |
**`pool` Object** — Main liquidity pool details
@@ -179,6 +188,38 @@ The response has four nested objects: `pool`, `link`, `stat`, `wallet_tags_stat`
| `pool.fee_ratio` | Pool trading fee ratio (e.g. `0.1` = 0.1%) |
| `pool.creation_timestamp` | Pool creation time (Unix seconds) |
**`dev` Object** — Token creator / developer info
| Field | Description |
|-------|-------------|
| `dev.creator_address` | Creator wallet address |
| `dev.creator_token_balance` | Creator's current token balance |
| `dev.creator_token_status` | Creator holding status: `hold` (still holding) / `sell` (sold/exited) |
| `dev.top_10_holder_rate` | Ratio of supply held by top 10 wallets (01) |
| `dev.twitter_name_change_history` | Array of past Twitter username changes (each entry has `twitter_username`, `rename_timestamp`) |
| `dev.dexscr_ad` | Creator bought a DEXScreener ad: `1` = yes, `0` = no |
| `dev.dexscr_update_link` | Creator updated DEXScreener socials/links: `1` = yes, `0` = no |
| `dev.dexscr_boost_fee` | Creator used DEXScreener Boost: `1` = yes, `0` = no |
| `dev.dexscr_trending_bar` | Token appeared in DEXScreener trending bar: `1` = yes, `0` = no |
| `dev.dexscr_ad_ts` | Timestamp of DEXScreener ad purchase (Unix seconds) |
| `dev.dexscr_update_link_ts` | Timestamp of DEXScreener link update (Unix seconds) |
| `dev.dexscr_boost_ts` | Timestamp of DEXScreener Boost (Unix seconds) |
| `dev.dexscr_trending_bar_ts` | Timestamp of DEXScreener trending bar appearance (Unix seconds) |
| `dev.cto_flag` | Token has been Community Takeover'd (original dev abandoned): `1` = yes, `0` = no |
| `dev.fund_from` | Address that funded the creator wallet |
| `dev.fund_from_ts` | Timestamp of that funding event (Unix seconds) |
| `dev.creator_open_count` | Number of tokens this creator has previously launched |
| `dev.twitter_del_post_token_count` | Number of posts the creator deleted from Twitter |
| `dev.twitter_create_token_count` | Number of tokens the creator has promoted on Twitter |
| `dev.offchain` | Whether the token is an offchain token |
| `dev.ath_token_info` | Creator's all-time-high token info object (optional); see sub-fields below |
| `dev.ath_token_info.ath_token` | Contract address of the creator's best-performing token ever |
| `dev.ath_token_info.ath_mc` | All-time-high market cap of that token (USD, string) |
| `dev.ath_token_info.avatar` | Token logo URL |
| `dev.ath_token_info.symbol` | Token symbol |
| `dev.ath_token_info.name` | Token name |
| `dev.ath_token_info.creation_timestamp` | Token creation time (Unix seconds) |
**`link` Object** — Social and explorer links
| Field | Description |
@@ -212,6 +253,7 @@ The response has four nested objects: `pool`, `link`, `stat`, `wallet_tags_stat`
| `stat.bot_degen_count` | Number of bot degen wallets |
| `stat.bot_degen_rate` | Ratio of bot degen wallets |
| `stat.fresh_wallet_rate` | Ratio of fresh/new wallets among holders |
| `stat.private_vault_hold_rate` | Ratio held by private vault (vanish) addresses — displayed as "vanish" in GMGN UI (01) |
**`wallet_tags_stat` Object** — Wallet type breakdown
+10 -13
View File
@@ -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"
@@ -16,7 +16,7 @@ Use the `gmgn-cli` tool to query on-chain tracking data based on the user's requ
## Core Concepts
- **`follow-wallet` vs `kol` vs `smartmoney`** — Three distinct data sources. `follow-wallet` returns trades from wallets the user has personally followed on the GMGN platform (user-specific, requires private key). `kol` and `smartmoney` return trades from platform-tagged public wallet lists (not user-specific, API Key only). Never substitute one for another.
- **`follow-wallet` vs `kol` vs `smartmoney`** — Three distinct data sources. `follow-wallet` returns trades from wallets the user has personally followed on the GMGN platform (user-specific; the follow list is resolved from the GMGN user account bound to the API Key). `kol` and `smartmoney` return trades from platform-tagged public wallet lists (not user-specific). Never substitute one for another.
- **KOL (Key Opinion Leader)** — Wallets publicly identified as influencers or well-known traders on GMGN. Tagged as `renowned` in the platform's wallet label system. Their trades carry social/marketing signal, not necessarily alpha.
@@ -60,8 +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`
- `GMGN_PRIVATE_KEY` required only for `track follow-wallet`; not needed for `track kol` / `track smartmoney`
- `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
@@ -89,15 +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
```
If the user also needs `track follow-wallet`, append the private key:
```bash
echo 'GMGN_PRIVATE_KEY="<pem_content_from_step_1>"' >> ~/.config/gmgn/.env
rm /tmp/gmgn_private.pem
```
## Usage Examples
@@ -308,13 +306,12 @@ To research any token surfaced by smart money activity, follow [`docs/workflow-t
## Safety Constraints
- **`track follow-wallet` requires `GMGN_PRIVATE_KEY`** — this signing key is linked to your GMGN account. It is used for authentication only (no on-chain access), but must be protected like any credential. Never expose it in logs or command output.
- **`follow-wallet` reveals your following list** — results expose which wallets you have followed on GMGN. Do not share raw output in public channels.
- **`track kol` / `track smartmoney` expose no personal data** — these use API Key auth only and return platform-tagged public wallet activity. Safe to share raw output.
## Notes
- `track kol` / `track smartmoney` use normal auth (API Key only, no signature required)
- `track follow-wallet` requires `GMGN_PRIVATE_KEY` for signature auth — and wallets must be followed via the GMGN platform first
- `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
+53 -7
View File
@@ -3,7 +3,7 @@
*
* Auth modes:
* Normal (market/token/portfolio): X-APIKEY + timestamp + client_id
* Critical (swap/order): normal auth + X-Signature (private key signature)
* Critical (swap and order routes): normal auth + X-Signature (private key signature)
*/
import { buildAuthQuery, buildMessage, detectAlgorithm, sign } from "./signer.js";
@@ -97,6 +97,29 @@ export interface StrategyConditionOrder {
drawdown_rate?: string;
}
export interface MultiSwapParams {
chain: string;
accounts: string[];
input_token: string;
output_token: string;
input_amount?: Record<string, string>;
input_amount_bps?: Record<string, string>;
output_amount?: Record<string, string>;
swap_mode?: string;
slippage?: number;
auto_slippage?: boolean;
is_anti_mev?: boolean;
priority_fee?: string;
tip_fee?: string;
auto_tip_fee?: boolean;
max_auto_fee?: string;
gas_price?: string;
max_fee_per_gas?: string;
max_priority_fee_per_gas?: string;
condition_orders?: StrategyConditionOrder[];
sell_ratio_type?: string;
}
export interface StrategyCreateParams {
chain: string;
from_address: string;
@@ -133,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;
@@ -261,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> {
@@ -285,6 +324,10 @@ export class OpenApiClient {
return this.normalRequest("GET", "/v1/user/smartmoney", query);
}
async getCreatedTokens(chain: string, walletAddress: string, extra: Record<string, string | number> = {}): Promise<unknown> {
return this.normalRequest("GET", "/v1/user/created_tokens", { chain, wallet_address: walletAddress, ...extra });
}
async quoteOrder(
chain: string,
from_address: string,
@@ -293,9 +336,8 @@ export class OpenApiClient {
input_amount: string,
slippage: number
): Promise<unknown> {
return this.normalRequest("GET", "/v1/trade/quote", {
chain, from_address, input_token, output_token, input_amount, slippage,
});
const query = { chain, from_address, input_token, output_token, input_amount, slippage };
return this.criticalRequest("GET", "/v1/trade/quote", query, null);
}
// ---- Swap endpoints (critical auth) ----
@@ -304,6 +346,10 @@ export class OpenApiClient {
return this.criticalRequest("POST", "/v1/trade/swap", {}, params);
}
async multiSwap(params: MultiSwapParams): Promise<unknown> {
return this.criticalRequest("POST", "/v1/trade/multi_swap", {}, params);
}
async queryOrder(orderId: string, chain: string): Promise<unknown> {
return this.criticalRequest("GET", "/v1/trade/query_order", { order_id: orderId, chain }, null);
}
@@ -363,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 swap/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
View File
@@ -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
View File
@@ -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: 118 (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 ----
+21
View File
@@ -109,5 +109,26 @@ export function registerPortfolioCommands(program: Command): void {
printResult(data, opts.raw);
});
portfolio
.command("created-tokens")
.description("Get tokens created by a developer wallet")
.requiredOption("--chain <chain>", "Chain: sol / bsc / base")
.requiredOption("--wallet <address>", "Developer wallet address")
.option("--order-by <field>", "Sort field: market_cap / token_ath_mc")
.option("--direction <dir>", "Sort direction: asc / desc")
.option("--migrate-state <state>", "Filter: migrated / non_migrated")
.option("--raw", "Output raw JSON")
.action(async (opts) => {
validateChain(opts.chain);
validateAddress(opts.wallet, opts.chain, "--wallet");
const extra: Record<string, string | number> = {};
if (opts.orderBy) extra["order_by"] = opts.orderBy;
if (opts.direction) extra["direction"] = opts.direction;
if (opts.migrateState) extra["migrate_state"] = opts.migrateState;
const client = new OpenApiClient(getConfig());
const data = await client.getCreatedTokens(opts.chain, opts.wallet, extra).catch(exitOnError);
printResult(data, opts.raw);
});
}
+76 -4
View File
@@ -1,5 +1,5 @@
import { Command } from "commander";
import { OpenApiClient, SwapParams, StrategyCreateParams, StrategyCancelParams } from "../client/OpenApiClient.js";
import { OpenApiClient, SwapParams, MultiSwapParams, StrategyCreateParams, StrategyCancelParams } from "../client/OpenApiClient.js";
import { getConfig } from "../config.js";
import { exitOnError, printResult } from "../output.js";
import { validateAddress, validateChain, validatePercent, validatePositiveInt } from "../validate.js";
@@ -75,8 +75,8 @@ export function registerSwapCommands(program: Command): void {
order
.command("quote")
.description("Get a swap quote without submitting a transaction")
.requiredOption("--chain <chain>", "Chain: sol / bsc / base")
.description("Get a swap quote without submitting a transaction (requires critical auth)")
.requiredOption("--chain <chain>", "Chain: sol / bsc / base (requires GMGN_PRIVATE_KEY)")
.requiredOption("--from <address>", "Wallet address (must match API Key binding)")
.requiredOption("--input-token <address>", "Input token contract address")
.requiredOption("--output-token <address>", "Output token contract address")
@@ -89,7 +89,7 @@ export function registerSwapCommands(program: Command): void {
validateAddress(opts.inputToken, opts.chain, "--input-token");
validateAddress(opts.outputToken, opts.chain, "--output-token");
validatePositiveInt(opts.amount, "--amount");
const client = new OpenApiClient(getConfig());
const client = new OpenApiClient(getConfig(true));
const data = await client
.quoteOrder(opts.chain, opts.from, opts.inputToken, opts.outputToken, opts.amount, opts.slippage)
.catch(exitOnError);
@@ -109,6 +109,78 @@ export function registerSwapCommands(program: Command): void {
printResult(data, opts.raw);
});
program
.command("multi-swap")
.description("Submit token swaps across multiple wallets concurrently (up to 100 wallets)")
.requiredOption("--chain <chain>", "Chain: sol / bsc / base")
.requiredOption("--accounts <addresses>", "Comma-separated wallet addresses (all must be bound to the API Key)")
.requiredOption("--input-token <address>", "Input token contract address")
.requiredOption("--output-token <address>", "Output token contract address")
.option("--input-amount <json>", 'JSON map of wallet→amount (smallest unit), e.g. \'{"addr1":"1000000","addr2":"2000000"}\'')
.option("--input-amount-bps <json>", 'JSON map of wallet→percent in bps (110000, e.g. 5000=50%), e.g. \'{"addr1":"5000"}\'')
.option("--output-amount <json>", "JSON map of wallet→target output amount")
.option("--slippage <n>", "Slippage tolerance (e.g. 0.01 = 1%)", parseFloat)
.option("--auto-slippage", "Enable automatic slippage")
.option("--anti-mev", "Enable anti-MEV protection")
.option("--priority-fee <sol>", "Priority fee in SOL (SOL only, ≥ 0.00001)")
.option("--tip-fee <amount>", "Tip fee (SOL ≥ 0.00001 / BSC ≥ 0.000001 BNB)")
.option("--auto-tip-fee", "Enable automatic tip fee")
.option("--max-auto-fee <amount>", "Max auto fee cap")
.option("--gas-price <gwei>", "Gas price in gwei (BSC ≥ 0.05 / BASE/ETH ≥ 0.01)")
.option("--max-fee-per-gas <amount>", "EIP-1559 max fee per gas (Base only)")
.option("--max-priority-fee-per-gas <amount>", "EIP-1559 max priority fee per gas (Base only)")
.option("--condition-orders <json>", "JSON array of take-profit/stop-loss conditions attached to each successful wallet's swap")
.option("--sell-ratio-type <type>", "Sell ratio base: buy_amount (default) / hold_amount; only used with --condition-orders")
.option("--raw", "Output raw JSON")
.action(async (opts) => {
if (!opts.inputAmount && !opts.inputAmountBps && !opts.outputAmount) {
console.error("[gmgn-cli] At least one of --input-amount, --input-amount-bps, or --output-amount must be provided");
process.exit(1);
}
validateChain(opts.chain);
const accounts = (opts.accounts as string).split(",").map((a: string) => a.trim()).filter(Boolean);
if (accounts.length === 0 || accounts.length > 100) {
console.error("[gmgn-cli] --accounts must be 1100 comma-separated wallet addresses");
process.exit(1);
}
const params: MultiSwapParams = {
chain: opts.chain,
accounts,
input_token: opts.inputToken,
output_token: opts.outputToken,
};
if (opts.inputAmount) {
try { params.input_amount = JSON.parse(opts.inputAmount); }
catch { console.error("[gmgn-cli] --input-amount must be valid JSON"); process.exit(1); }
}
if (opts.inputAmountBps) {
try { params.input_amount_bps = JSON.parse(opts.inputAmountBps); }
catch { console.error("[gmgn-cli] --input-amount-bps must be valid JSON"); process.exit(1); }
}
if (opts.outputAmount) {
try { params.output_amount = JSON.parse(opts.outputAmount); }
catch { console.error("[gmgn-cli] --output-amount must be valid JSON"); process.exit(1); }
}
if (opts.slippage != null) params.slippage = opts.slippage;
if (opts.autoSlippage) params.auto_slippage = true;
if (opts.antiMev) params.is_anti_mev = true;
if (opts.priorityFee) params.priority_fee = opts.priorityFee;
if (opts.tipFee) params.tip_fee = opts.tipFee;
if (opts.autoTipFee) params.auto_tip_fee = true;
if (opts.maxAutoFee) params.max_auto_fee = opts.maxAutoFee;
if (opts.gasPrice) params.gas_price = String(Math.round(parseFloat(opts.gasPrice) * 1e9));
if (opts.maxFeePerGas) params.max_fee_per_gas = opts.maxFeePerGas;
if (opts.maxPriorityFeePerGas) params.max_priority_fee_per_gas = opts.maxPriorityFeePerGas;
if (opts.conditionOrders) {
try { params.condition_orders = JSON.parse(opts.conditionOrders); }
catch { console.error("[gmgn-cli] --condition-orders must be valid JSON"); process.exit(1); }
}
if (opts.sellRatioType) params.sell_ratio_type = opts.sellRatioType;
const client = new OpenApiClient(getConfig(true));
const data = await client.multiSwap(params).catch(exitOnError);
printResult(data, opts.raw);
});
const strategy = order.command("strategy").description("Limit/strategy order management");
strategy
+1 -1
View File
@@ -27,7 +27,7 @@ export function registerTrackCommands(program: Command): void {
if (opts.filter?.length) extra["filters"] = opts.filter;
if (opts.minAmountUsd != null) extra["min_amount_usd"] = opts.minAmountUsd;
if (opts.maxAmountUsd != null) extra["max_amount_usd"] = opts.maxAmountUsd;
const client = new OpenApiClient(getConfig(true));
const client = new OpenApiClient(getConfig());
const data = await client.getFollowWallet(opts.chain, extra).catch(exitOnError);
printResult(data, opts.raw);
});
+4 -2
View File
@@ -14,11 +14,13 @@ export interface Config {
}
let _config: Config | null = null;
const PRIVATE_KEY_REQUIRED_MSG =
"GMGN_PRIVATE_KEY is required for critical-auth commands (swap, order, and follow-wallet commands)";
export function getConfig(requirePrivateKey = false): Config {
if (_config) {
if (requirePrivateKey && !_config.privateKeyPem) {
die("GMGN_PRIVATE_KEY is required for swap/order commands");
die(PRIVATE_KEY_REQUIRED_MSG);
}
return _config;
}
@@ -34,7 +36,7 @@ export function getConfig(requirePrivateKey = false): Config {
// Support escaped newlines (e.g. from single-line .env values)
privateKeyPem = privateKey.replace(/\\n/g, "\n");
} else if (requirePrivateKey) {
die("GMGN_PRIVATE_KEY is required for swap/order commands");
die(PRIVATE_KEY_REQUIRED_MSG);
}
const host = process.env.GMGN_HOST ?? "https://openapi.gmgn.ai";