mirror of
https://github.com/GMGNAI/gmgn-skills.git
synced 2026-07-27 16:57:44 +00:00
docs: add Core Concepts, AI Agent install guide, and workflow docs
- README: add Quick Start (AI Agent) section with step-by-step key generation and .env configuration guidance; add Upgrade (AI Agent) section - README.zh.md: sync all changes from English README - skills/gmgn-market: add Core Concepts (10 terms: volume/amount distinction, rug_ratio, smart_degen_count, hot_level, renounced authorities, honeypot, creator_token_status, cto_flag, trenches lifecycle, wash/rat/bundler signals); add "Do NOT guess fields" IMPORTANT rule - skills/gmgn-portfolio: add Core Concepts (7 terms: realized/unrealized profit, profit_change multiplier, pnl ratio, winrate, cost vs usd_value, pagination); complete Response Field Reference tables for holdings/activity/stats - skills/gmgn-swap: add Core Concepts (8 terms: smallest unit, slippage decimal, amount vs percent mutex, currency tokens, anti-MEV, critical auth, order polling, filled amount conversion); add "Do NOT guess fields" IMPORTANT rule - skills/gmgn-track: add Core Concepts (8 terms: follow-wallet vs kol vs smartmoney, KOL vs smart_degen, is_open_or_close divergence, price_change ratio, base/quote address, tags array, cluster signal); add Safety Constraints section; add Output Format section; add "Do NOT guess fields" IMPORTANT rule - skills/gmgn-token: add --amount/--percent and --slippage/--auto-slippage mutex rules; add --tag + --order-by valid combination guide table for traders - src/index.ts: add track to CLI description - docs/token-due-diligence.md: new — full 4-step token due diligence workflow - docs/market-discover-opportunities.md: new — market discovery workflow Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -28,14 +28,96 @@ With GMGN Agent Skills, you can use AI agents to query real-time trending token
|
||||
|
||||
### Quick Start
|
||||
|
||||
Ready to install skills? [Jump to Installation →](#get-started)
|
||||
> **Note for AI assistants:** If you are an AI Agent helping the user install or configure gmgn-cli, jump directly to [Quick Start (AI Agent)](#quick-start-ai-agent) — it contains all the steps you need to complete, including how to guide the user through API key generation. If the user asks to upgrade, jump to [Upgrade (AI Agent)](#upgrade-ai-agent).
|
||||
|
||||
Already installed? [Update Skills and CLI →](#9-upgrade-skills-and-cli)
|
||||
Ready to install? [Jump to Installation →](#1-installation)
|
||||
|
||||
> **Tip:** If your AI agent tries to open or scrape the gmgn.ai website instead of using the CLI, add this to your prompt:
|
||||
> ```
|
||||
> Use gmgn-cli commands. Do not call gmgn.ai web endpoints directly.
|
||||
> ```
|
||||
Already installed? [Upgrade Skills and CLI →](#9-upgrade-skills-and-cli)
|
||||
|
||||
> **Tip:** If your AI agent tries to open or scrape the gmgn.ai website instead of using the CLI, add this to your prompt: `Use gmgn-cli commands. Do not call gmgn.ai web endpoints directly.`
|
||||
|
||||
---
|
||||
|
||||
## Quick Start (AI Agent)
|
||||
|
||||
> The following steps are for AI Agents. Some steps require the user to complete actions in a browser.
|
||||
|
||||
**Step 1 — Install CLI and Skills**
|
||||
|
||||
```bash
|
||||
npx skills add GMGNAI/gmgn-skills
|
||||
```
|
||||
|
||||
**Step 2 — Verify with public key (no registration needed)**
|
||||
|
||||
```bash
|
||||
GMGN_API_KEY=gmgn_solbscbaseethmonadtron gmgn-cli market trending --chain sol --interval 1h --limit 3
|
||||
```
|
||||
|
||||
If JSON output appears, the CLI is working.
|
||||
|
||||
**Step 3 — Guide user to get their own API key**
|
||||
|
||||
Tell the user: "To use your own API key, go to **https://gmgn.ai/ai** and apply. You will need an Ed25519 public key. I can generate a key pair for you — just say the word."
|
||||
|
||||
When the user asks, run:
|
||||
|
||||
```bash
|
||||
openssl genpkey -algorithm ed25519 -out /tmp/gmgn_private.pem 2>/dev/null && \
|
||||
openssl pkey -in /tmp/gmgn_private.pem -pubout 2>/dev/null
|
||||
```
|
||||
|
||||
Show the **public key** to the user with the following instructions:
|
||||
|
||||
> This is your Ed25519 public key. Please complete these two steps:
|
||||
> 1. Go to **https://gmgn.ai/ai**, paste the public key above into the API Key creation form, and submit.
|
||||
> 2. Once created, copy the **API Key** shown on the page and send it back to me — I'll handle Step 4 configuration for you.
|
||||
|
||||
Wait for the user to reply with their API Key before continuing to Step 4.
|
||||
|
||||
**Step 4 — Configure credentials**
|
||||
|
||||
After the user receives their API key, write it to the global config:
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.config/gmgn
|
||||
# Write API key (replace with the actual key the user provides)
|
||||
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:
|
||||
|
||||
```bash
|
||||
# Append private key (use the PEM content from Step 3)
|
||||
echo 'GMGN_PRIVATE_KEY="<pem_content>"' >> ~/.config/gmgn/.env
|
||||
```
|
||||
|
||||
**Step 5 — Verify**
|
||||
|
||||
```bash
|
||||
gmgn-cli market trending --chain sol --interval 1h --limit 3
|
||||
```
|
||||
|
||||
If output appears without error, setup is complete.
|
||||
|
||||
---
|
||||
|
||||
## Upgrade (AI Agent)
|
||||
|
||||
> Run this command to upgrade both the CLI and Skills to the latest version.
|
||||
|
||||
```bash
|
||||
npx skills add GMGNAI/gmgn-skills
|
||||
```
|
||||
|
||||
Check the installed version after upgrading:
|
||||
|
||||
```bash
|
||||
gmgn-cli --version
|
||||
```
|
||||
|
||||
> For the full upgrade reference, see [Section 9 — Upgrade Skills and CLI](#9-upgrade-skills-and-cli).
|
||||
|
||||
---
|
||||
|
||||
@@ -64,17 +146,10 @@ Check the first token's K-line, analyze entry timing, plot price + volume chart,
|
||||
|
||||
---
|
||||
|
||||
## Get Started
|
||||
|
||||
Before installing, create your API Key at **https://gmgn.ai/ai**. The API key is used for:
|
||||
|
||||
1. Read data: tokens, trending lists, K-line, and featured on-chain metrics
|
||||
2. Submit trades: market orders, limit orders, strategy orders, and more
|
||||
|
||||
---
|
||||
|
||||
## 1. Installation
|
||||
|
||||
> **Prerequisites:** Before installing, create your API Key at **https://gmgn.ai/ai** (see [Section 3](#3-get-your-own-api-key) for the full setup guide).
|
||||
|
||||
Choose one of the following methods:
|
||||
|
||||
### 1.1 Via Agent (recommended)
|
||||
@@ -101,23 +176,13 @@ node dist/index.js <command> [options]
|
||||
|
||||
## 2. Verify Connection
|
||||
|
||||
### Option 1: Via AI Agent
|
||||
|
||||
Send this prompt to your AI Agent:
|
||||
|
||||
```
|
||||
Run this CLI command: GMGN_API_KEY=gmgn_solbscbaseethmonadtron npx gmgn-cli market trending --chain sol --interval 1h --limit 3
|
||||
```
|
||||
|
||||
### Option 2: Via CLI
|
||||
|
||||
Test with the public API key — no registration required:
|
||||
|
||||
```bash
|
||||
GMGN_API_KEY=gmgn_solbscbaseethmonadtron gmgn-cli market trending --chain sol --interval 1h --limit 3
|
||||
```
|
||||
|
||||
If you see JSON output, the CLI is working. The public key supports all read-only commands (token / market / portfolio). The public key is for testing only — apply for your own API key to use any feature (see step 3).
|
||||
If you see JSON output, the CLI is working. The public key supports all read-only commands (token / market / portfolio) and is for testing only — apply for your own API key to use any feature (see step 3).
|
||||
|
||||
## 3. Get Your Own API Key
|
||||
|
||||
@@ -351,37 +416,21 @@ npx gmgn-cli order get --chain sol --order-id <order-id>
|
||||
|
||||
## 9. Upgrade Skills and CLI
|
||||
|
||||
To upgrade `gmgn-cli` and Skills to the latest version:
|
||||
|
||||
**Via AI Agent (recommended)**
|
||||
|
||||
Send this to your AI agent:
|
||||
|
||||
```
|
||||
Run these two commands to update gmgn-cli and the skills:
|
||||
1. npm install -g gmgn-cli
|
||||
2. npx skills add GMGNAI/gmgn-skills
|
||||
```
|
||||
|
||||
**Via CLI**
|
||||
|
||||
```bash
|
||||
# Upgrade gmgn-cli
|
||||
npm install -g gmgn-cli
|
||||
|
||||
# Upgrade Skills
|
||||
# Upgrade CLI and Skills
|
||||
npx skills add GMGNAI/gmgn-skills
|
||||
```
|
||||
|
||||
**Check the current version**
|
||||
|
||||
```bash
|
||||
# Check current version
|
||||
gmgn-cli --version
|
||||
```
|
||||
|
||||
> **Via AI Agent:** Tell your agent — "Upgrade gmgn-cli and the skills to the latest version." See also [Upgrade (AI Agent)](#upgrade-ai-agent).
|
||||
|
||||
---
|
||||
|
||||
## 10. Security & Disclaimer
|
||||
## 10. Security & Disclaimer (Read Before Use)
|
||||
|
||||
This tool can be invoked by an AI Agent to submit real on-chain transactions automatically. It carries inherent risks including model hallucination, uncontrolled execution, and prompt injection. Once authorized, the AI Agent will submit transactions on behalf of your linked wallet address — **on-chain transactions are irreversible once confirmed** and may result in financial loss. Use with caution.
|
||||
|
||||
**About `GMGN_PRIVATE_KEY`**
|
||||
|
||||
@@ -392,11 +441,13 @@ gmgn-cli --version
|
||||
- Restrict config file permissions: `chmod 600 ~/.config/gmgn/.env`
|
||||
- Never commit your `.env` file to version control — add it to `.gitignore`
|
||||
- Do not share `GMGN_API_KEY` or `GMGN_PRIVATE_KEY` in logs, screenshots, or chat messages
|
||||
- Before every swap, carefully review the trade summary presented by the AI (chain, wallet, token addresses, amount) and confirm only when it matches your intent
|
||||
- Test with small amounts first before executing larger trades
|
||||
- Always use the latest version of gmgn-cli (`npm install -g gmgn-cli`). To check your current version: `gmgn-cli --version`
|
||||
|
||||
**Disclaimer**
|
||||
|
||||
Use of this tool and any financial decisions made based on its output are entirely at your own risk. GMGN is not liable for any trading losses, errors, or unauthorized access resulting from improper credential management.
|
||||
Use of this tool and any financial decisions made based on its output are entirely at your own risk. GMGN is not liable for any trading losses, errors, or unauthorized access resulting from model hallucination, prompt injection, improper credential management, or user confirmation errors. By using this tool, you acknowledge that you have fully understood the above risks and voluntarily accept all responsibility.
|
||||
|
||||
The npm package is published with provenance attestation, linking each release to a specific git commit and CI pipeline run. Verify with:
|
||||
```bash
|
||||
|
||||
+119
-28
@@ -28,8 +28,12 @@
|
||||
|
||||
### 快速开始安装
|
||||
|
||||
> **AI Agent 注意:** 如果你是正在协助用户安装或配置 gmgn-cli 的 AI Agent,请直接跳转到 [AI Agent 快速开始](#ai-agent-快速开始) — 其中包含你需要完成的所有步骤,包括如何引导用户完成 API Key 申请。如果用户要求升级,请跳转到 [AI Agent 升级](#ai-agent-升级)。
|
||||
|
||||
已准备好?[点击这里开始安装 Skills →](#开始安装-skills)
|
||||
|
||||
已安装?[升级 Skills 和 CLI →](#9-升级-skills-和-cli)
|
||||
|
||||
> **提示:** 如果你的 AI Agent 尝试直接打开 gmgn.ai 网站而不是使用 CLI,请在提示词中加上:
|
||||
> ```
|
||||
> 用 gmgn-cli 命令,不要直接请求gmgn.ai网页接口。
|
||||
@@ -37,6 +41,89 @@
|
||||
|
||||
---
|
||||
|
||||
## AI Agent 快速开始
|
||||
|
||||
> 以下步骤面向 AI Agent。部分步骤需要用户在浏览器中配合完成。
|
||||
|
||||
**第 1 步 — 安装 CLI 和 Skills**
|
||||
|
||||
```bash
|
||||
npx skills add GMGNAI/gmgn-skills
|
||||
```
|
||||
|
||||
**第 2 步 — 用公共 Key 验证(无需注册)**
|
||||
|
||||
```bash
|
||||
GMGN_API_KEY=gmgn_solbscbaseethmonadtron gmgn-cli market trending --chain sol --interval 1h --limit 3
|
||||
```
|
||||
|
||||
看到 JSON 输出即表示 CLI 正常工作。
|
||||
|
||||
**第 3 步 — 引导用户申请个人 API Key**
|
||||
|
||||
告知用户:"需要个人 API Key,请前往 **https://gmgn.ai/ai** 申请。申请时需要一个 Ed25519 公钥,我可以帮你生成密钥对,告诉我一声就行。"
|
||||
|
||||
用户确认后运行:
|
||||
|
||||
```bash
|
||||
openssl genpkey -algorithm ed25519 -out /tmp/gmgn_private.pem 2>/dev/null && \
|
||||
openssl pkey -in /tmp/gmgn_private.pem -pubout 2>/dev/null
|
||||
```
|
||||
|
||||
将**公钥**展示给用户,并附上以下说明:
|
||||
|
||||
> 以上是你的 Ed25519 公钥。接下来请你完成以下两步:
|
||||
> 1. 打开 **https://gmgn.ai/ai**,将上方公钥填入 API Key 生成表单,完成创建。
|
||||
> 2. 创建完成后,将页面上显示的 **API Key** 复制并发送给我,我来帮你完成第 4 步配置。
|
||||
|
||||
等用户回复 API Key 后,再继续第 4 步。
|
||||
|
||||
**第 4 步 — 配置凭证**
|
||||
|
||||
用户收到 API Key 后,写入全局配置:
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.config/gmgn
|
||||
# 写入 API Key(替换为用户提供的实际 Key)
|
||||
echo 'GMGN_API_KEY=<user_api_key>' > ~/.config/gmgn/.env
|
||||
chmod 600 ~/.config/gmgn/.env
|
||||
```
|
||||
|
||||
如果用户需要 swap 能力,追加私钥:
|
||||
|
||||
```bash
|
||||
# 追加私钥(使用第 3 步输出的 PEM 内容)
|
||||
echo 'GMGN_PRIVATE_KEY="<pem_content>"' >> ~/.config/gmgn/.env
|
||||
```
|
||||
|
||||
**第 5 步 — 验证**
|
||||
|
||||
```bash
|
||||
gmgn-cli market trending --chain sol --interval 1h --limit 3
|
||||
```
|
||||
|
||||
有输出且无报错即配置完成。
|
||||
|
||||
---
|
||||
|
||||
## AI Agent 升级
|
||||
|
||||
> 运行以下命令,将 CLI 和 Skills 同时升级到最新版本。
|
||||
|
||||
```bash
|
||||
npx skills add GMGNAI/gmgn-skills
|
||||
```
|
||||
|
||||
升级后检查版本:
|
||||
|
||||
```bash
|
||||
gmgn-cli --version
|
||||
```
|
||||
|
||||
> 完整升级说明请参阅[第 9 节 — 升级 Skills 和 CLI](#9-升级-skills-和-cli)。
|
||||
|
||||
---
|
||||
|
||||
## 使用案例
|
||||
|
||||
### 查询热门代币榜
|
||||
@@ -284,23 +371,23 @@ solana 上的 <token_address> 安全吗,值得买入吗?
|
||||
|
||||
```bash
|
||||
# 基本信息 + 实时价格
|
||||
npx gmgn-cli token info --chain sol --address <addr>
|
||||
gmgn-cli token info --chain sol --address <addr>
|
||||
|
||||
# 安全指标(蜜罐、税率、集中度、rug 风险)
|
||||
npx gmgn-cli token security --chain sol --address <addr>
|
||||
gmgn-cli token security --chain sol --address <addr>
|
||||
|
||||
# 流动池信息(DEX、储备量、深度)
|
||||
npx gmgn-cli token pool --chain sol --address <addr>
|
||||
gmgn-cli token pool --chain sol --address <addr>
|
||||
|
||||
# 持仓大户(按持仓比例排序)
|
||||
npx gmgn-cli token holders --chain sol --address <addr> --limit 50
|
||||
gmgn-cli token holders --chain sol --address <addr> --limit 50
|
||||
|
||||
# 聪明钱持仓大户(按买入量排序)
|
||||
npx gmgn-cli token holders --chain sol --address <addr> \
|
||||
gmgn-cli token holders --chain sol --address <addr> \
|
||||
--tag smart_degen --order-by buy_volume_cur --limit 20
|
||||
|
||||
# 交易大户(KOL,按已实现盈利排序)
|
||||
npx gmgn-cli token traders --chain sol --address <addr> \
|
||||
gmgn-cli token traders --chain sol --address <addr> \
|
||||
--tag renowned --order-by profit --limit 20
|
||||
```
|
||||
|
||||
@@ -309,21 +396,21 @@ npx gmgn-cli token traders --chain sol --address <addr> \
|
||||
```bash
|
||||
# K 线数据(1h 周期,最近 24 小时)
|
||||
# macOS:
|
||||
npx gmgn-cli market kline \
|
||||
gmgn-cli market kline \
|
||||
--chain sol --address <addr> \
|
||||
--resolution 1h \
|
||||
--from $(date -v-24H +%s) --to $(date +%s)
|
||||
# Linux: $(date -d '24 hours ago' +%s)
|
||||
|
||||
# 热门代币榜(SOL,1h,按交易量排序)
|
||||
npx gmgn-cli market trending \
|
||||
gmgn-cli market trending \
|
||||
--chain sol \
|
||||
--interval 1h \
|
||||
--order-by volume --limit 20 \
|
||||
--filter not_risk --filter not_honeypot
|
||||
|
||||
# 战壕新币列表
|
||||
npx gmgn-cli market trenches \
|
||||
gmgn-cli market trenches \
|
||||
--chain sol \
|
||||
--type new_creation --type near_completion --type completed \
|
||||
--launchpad-platform Pump.fun --launchpad-platform pump_mayhem --launchpad-platform letsbonk \
|
||||
@@ -334,42 +421,42 @@ npx gmgn-cli market trenches \
|
||||
|
||||
```bash
|
||||
# 钱包持仓
|
||||
npx gmgn-cli portfolio holdings --chain sol --wallet <addr>
|
||||
gmgn-cli portfolio holdings --chain sol --wallet <addr>
|
||||
|
||||
# 交易记录
|
||||
npx gmgn-cli portfolio activity --chain sol --wallet <addr>
|
||||
gmgn-cli portfolio activity --chain sol --wallet <addr>
|
||||
|
||||
# 交易统计(支持多钱包)
|
||||
npx gmgn-cli portfolio stats --chain sol --wallet <addr1> --wallet <addr2>
|
||||
gmgn-cli portfolio stats --chain sol --wallet <addr1> --wallet <addr2>
|
||||
|
||||
# API Key 绑定的钱包及主币余额
|
||||
npx gmgn-cli portfolio info
|
||||
gmgn-cli portfolio info
|
||||
|
||||
# 单个 token 余额
|
||||
npx gmgn-cli portfolio token-balance --chain sol --wallet <addr> --token <token_addr>
|
||||
gmgn-cli portfolio token-balance --chain sol --wallet <addr> --token <token_addr>
|
||||
```
|
||||
|
||||
### Track
|
||||
|
||||
```bash
|
||||
# 追踪关注钱包的交易动态(需要 GMGN_PRIVATE_KEY)
|
||||
npx gmgn-cli track follow-wallet --chain sol
|
||||
npx gmgn-cli track follow-wallet --chain sol --wallet <wallet_address> --side buy
|
||||
gmgn-cli track follow-wallet --chain sol
|
||||
gmgn-cli track follow-wallet --chain sol --wallet <wallet_address> --side buy
|
||||
|
||||
# KOL 交易动态
|
||||
npx gmgn-cli track kol --limit 100 --raw
|
||||
npx gmgn-cli track kol --chain sol --side buy --limit 50 --raw
|
||||
gmgn-cli track kol --limit 100 --raw
|
||||
gmgn-cli track kol --chain sol --side buy --limit 50 --raw
|
||||
|
||||
# 聪明钱交易动态
|
||||
npx gmgn-cli track smartmoney --limit 100 --raw
|
||||
npx gmgn-cli track smartmoney --chain sol --side sell --limit 50 --raw
|
||||
gmgn-cli track smartmoney --limit 100 --raw
|
||||
gmgn-cli track smartmoney --chain sol --side sell --limit 50 --raw
|
||||
```
|
||||
|
||||
### Swap(需要私钥)
|
||||
|
||||
```bash
|
||||
# 提交兑换(固定滑点)
|
||||
npx gmgn-cli swap \
|
||||
gmgn-cli swap \
|
||||
--chain sol \
|
||||
--from <wallet-address> \
|
||||
--input-token <input-token-addr> \
|
||||
@@ -378,7 +465,7 @@ npx gmgn-cli swap \
|
||||
--slippage 0.01
|
||||
|
||||
# 提交兑换(自动滑点)
|
||||
npx gmgn-cli swap \
|
||||
gmgn-cli swap \
|
||||
--chain sol \
|
||||
--from <wallet-address> \
|
||||
--input-token <input-token-addr> \
|
||||
@@ -387,7 +474,7 @@ npx gmgn-cli swap \
|
||||
--auto-slippage
|
||||
|
||||
# 按持仓比例卖出(例:卖出 50%)
|
||||
npx gmgn-cli swap \
|
||||
gmgn-cli swap \
|
||||
--chain sol \
|
||||
--from <wallet-address> \
|
||||
--input-token <token-addr> \
|
||||
@@ -396,7 +483,7 @@ npx gmgn-cli swap \
|
||||
--auto-slippage
|
||||
|
||||
# 获取报价(不提交交易)
|
||||
npx gmgn-cli order quote \
|
||||
gmgn-cli order quote \
|
||||
--chain sol \
|
||||
--from <wallet-address> \
|
||||
--input-token <input-token-addr> \
|
||||
@@ -405,7 +492,7 @@ npx gmgn-cli order quote \
|
||||
--slippage 0.01
|
||||
|
||||
# 查询订单状态
|
||||
npx gmgn-cli order get --chain sol --order-id <order-id>
|
||||
gmgn-cli order get --chain sol --order-id <order-id>
|
||||
```
|
||||
|
||||
## 8. 支持的链
|
||||
@@ -449,7 +536,9 @@ gmgn-cli --version
|
||||
|
||||
---
|
||||
|
||||
## 10. 安全与免责
|
||||
## 10. 安全与免责(使用前必读)
|
||||
|
||||
本工具可供 AI Agent 调用以自动执行链上交易,存在模型幻觉、执行不可控、提示词注入等固有风险。AI Agent 在获得授权后,将以您绑定的钱包地址提交真实的链上交易,**交易一经上链即不可撤销**,可能导致资金损失,请您谨慎使用。
|
||||
|
||||
**关于 `GMGN_PRIVATE_KEY`**
|
||||
|
||||
@@ -460,8 +549,10 @@ gmgn-cli --version
|
||||
- 限制配置文件权限:`chmod 600 ~/.config/gmgn/.env`
|
||||
- 不要将 `.env` 文件提交到版本控制系统,请将其加入 `.gitignore`
|
||||
- 不要在日志、截图或聊天中泄露 `GMGN_API_KEY` 或 `GMGN_PRIVATE_KEY`
|
||||
- 请使用最新的 gmgn-cli(`npm install -g gmgn-cli`),查看当前版本请使用 `gmgn-cli --version`。
|
||||
- 每次 swap 前,仔细核对 AI 呈现的交易摘要(链、钱包、代币地址、金额),确认无误后再回复确认
|
||||
- 建议先用小额资金验证配置后再进行大额操作
|
||||
- 请使用最新的 gmgn-cli(`npm install -g gmgn-cli`),查看当前版本请使用 `gmgn-cli --version`
|
||||
|
||||
**免责声明**
|
||||
|
||||
使用本工具及根据其输出做出的任何财务决策,风险由用户自行承担。GMGN 对因凭证管理不当导致的任何交易损失、错误或未授权访问不承担责任。
|
||||
使用本工具及根据其输出做出的任何财务决策,风险由用户自行承担。GMGN 对因模型幻觉、提示词注入、凭证管理不当或用户操作失误导致的任何交易损失、错误或未授权访问不承担责任。使用本工具即视为您已充分知悉上述风险并自愿承担全部责任。
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
# Discover Trading Opportunities via Trending — Workflow
|
||||
|
||||
Use this workflow to surface high-potential tokens from trending data.
|
||||
|
||||
## Step 1 — Fetch trending data
|
||||
|
||||
Fetch a broad pool with safe filters:
|
||||
|
||||
```bash
|
||||
gmgn-cli market trending \
|
||||
--chain <chain> --interval 1h \
|
||||
--order-by volume --limit 50 \
|
||||
--filter not_honeypot --filter has_social --raw
|
||||
```
|
||||
|
||||
## Step 2 — AI multi-factor analysis
|
||||
|
||||
Analyze each record in the response using the following signals (apply judgment, not rigid rules):
|
||||
|
||||
| Signal | Field(s) | Weight | Notes |
|
||||
|--------|----------|--------|-------|
|
||||
| Smart money interest | `smart_degen_count`, `renowned_count` | High | Key conviction indicator |
|
||||
| Bluechip ownership | `bluechip_owner_percentage` | Medium | Quality of holder base |
|
||||
| Real trading activity | `volume`, `swaps` | Medium | Distinguishes genuine interest from wash trading |
|
||||
| Price momentum | `change1h`, `change5m` | Medium | Prefer positive, non-parabolic moves |
|
||||
| Pool safety | `liquidity` | Medium | Low liquidity = high slippage risk |
|
||||
| Token maturity | `creation_timestamp` | Low | Avoid tokens less than ~1h old unless other signals are very strong |
|
||||
|
||||
Select the **top 5** tokens with the best composite profile. Prefer tokens that perform well across multiple signals rather than excelling in just one.
|
||||
|
||||
## Step 3 — Present top 5 to user
|
||||
|
||||
Present results as a concise table, then give a one-line rationale for each pick:
|
||||
|
||||
```
|
||||
Top 5 Trending Tokens — SOL / 1h
|
||||
|
||||
# | Symbol | Address (short) | Smart Degens | Volume | 1h Chg | Reasoning
|
||||
1 | ... | ... | ... | ... | ... | Smart money accumulating + high volume
|
||||
2 | ...
|
||||
...
|
||||
```
|
||||
|
||||
## Step 4 — Follow-up actions
|
||||
|
||||
For each token, offer:
|
||||
- **Deep dive**: `token info` + `token security` for full due diligence (see [token-due-diligence.md](token-due-diligence.md))
|
||||
- **Swap**: execute directly if the user is satisfied with the trending data alone
|
||||
@@ -0,0 +1,58 @@
|
||||
# Full Token Due Diligence — 4-Step Workflow
|
||||
|
||||
Use this workflow before deciding to buy a token. Run all four steps in sequence.
|
||||
|
||||
## Step 1 — Get basic info
|
||||
|
||||
```bash
|
||||
gmgn-cli token info --chain sol --address <token_address> --raw
|
||||
```
|
||||
|
||||
Check: `price`, `liquidity`, `holder_count`, `wallet_tags_stat.smart_wallets`, `wallet_tags_stat.renowned_wallets`, `link.website` / `link.twitter_username` / `link.telegram`.
|
||||
|
||||
**Red flags**: all `link.*` social fields empty, very low liquidity (<$10k), zero `wallet_tags_stat.smart_wallets` and `renowned_wallets`.
|
||||
|
||||
## Step 2 — Check security
|
||||
|
||||
```bash
|
||||
gmgn-cli token security --chain sol --address <token_address> --raw
|
||||
```
|
||||
|
||||
Check these fields and their safe thresholds:
|
||||
|
||||
| Field | Safe | Warning | Danger |
|
||||
|-------|------|---------|--------|
|
||||
| `is_honeypot` | `"no"` | — | `"yes"` → Do not buy |
|
||||
| `open_source` | `"yes"` | `"unknown"` | `"no"` |
|
||||
| `owner_renounced` | `"yes"` | `"unknown"` | `"no"` |
|
||||
| `renounced_mint` (SOL) | `true` | — | `false` → mint risk |
|
||||
| `renounced_freeze_account` (SOL) | `true` | — | `false` → freeze risk |
|
||||
| `buy_tax` / `sell_tax` | `0` | `0.01–0.05` | `>0.10` → high tax |
|
||||
| `top_10_holder_rate` | `<0.20` | `0.20–0.40` | `>0.50` → whale risk |
|
||||
| `rug_ratio` | `<0.10` | `0.10–0.30` | `>0.30` → high rug risk |
|
||||
| `creator_token_status` | `creator_close` | — | `creator_hold` → dev not sold |
|
||||
| `sniper_count` | `<5` | `5–20` | `>20` → heavily sniped |
|
||||
|
||||
## Step 3 — Check liquidity pool
|
||||
|
||||
```bash
|
||||
gmgn-cli token pool --chain sol --address <token_address> --raw
|
||||
```
|
||||
|
||||
Check: liquidity amount, which DEX (`exchange`), pool age (`creation_timestamp`). Low liquidity means high slippage risk when buying or selling.
|
||||
|
||||
## Step 4 — Check smart money signals
|
||||
|
||||
```bash
|
||||
# Is smart money accumulating?
|
||||
gmgn-cli token holders --chain sol --address <token_address> \
|
||||
--tag smart_degen --order-by buy_volume_cur --direction desc --limit 20 --raw
|
||||
|
||||
# Have KOLs already taken profit?
|
||||
gmgn-cli token traders --chain sol --address <token_address> \
|
||||
--tag renowned --order-by profit --direction desc --limit 20 --raw
|
||||
```
|
||||
|
||||
**Bullish signals**: smart_degen wallets buying heavily, unrealized_profit is large (still holding), renowned wallets accumulating, low sell_volume_cur.
|
||||
|
||||
**Bearish signals**: sell_volume_cur > buy_volume_cur for smart money, large realized profits already taken (they may be done), top holders with very high amount_percentage starting to sell.
|
||||
+66
-43
@@ -2,14 +2,40 @@
|
||||
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>"
|
||||
metadata:
|
||||
cliHelp: "gmgn-cli market --help"
|
||||
---
|
||||
|
||||
**IMPORTANT: Always use `gmgn-cli` commands below. Do NOT use web search, WebFetch, curl, or visit gmgn.ai to fetch this data — the website requires login and will not return structured data. The CLI is the only correct method.**
|
||||
|
||||
**IMPORTANT: Do NOT guess field names or values. When a field's meaning is unclear, look it up in the Response Fields sections below before using it.**
|
||||
|
||||
**⚠️ IPv6 NOT SUPPORTED: GMGN CLI commands do not support IPv6. If you get a `401` or `403` error and credentials look correct, the outbound connection is likely going via IPv6. Run `curl -s https://api64.ipify.org` to check — if the result is an IPv6 address, tell the user to ensure their network routes requests over IPv4.**
|
||||
|
||||
Use the `gmgn-cli` tool to query K-line data for a token, browse trending tokens, or view Trenches token lists.
|
||||
|
||||
## Core Concepts
|
||||
|
||||
- **`volume` vs `amount` (kline)** — Naming is counterintuitive. `volume` = USD dollar value of trades; `amount` = token units traded. For a token priced at $0.0002, these differ by 5,000×. Always use `volume` for "how much USD was traded" and `amount` for "how many tokens changed hands."
|
||||
|
||||
- **`rug_ratio`** — A 0–1 score estimating rug pull likelihood. Values above `0.3` are high-risk. Do not treat as binary — combine with `top_10_holder_rate`, `dev_team_hold_rate`, and `is_honeypot` for a full picture.
|
||||
|
||||
- **`smart_degen_count` / `renowned_count`** — Number of platform-tagged smart money wallets (`smart_degen`) and KOL wallets (`renowned`) holding or trading this token. High values are bullish signals. These are GMGN-tagged wallet lists, not user-defined.
|
||||
|
||||
- **`hot_level`** — Trending intensity score. Higher = more actively traded right now. Not normalized — compare relative values within the same result set, not across time windows.
|
||||
|
||||
- **`renounced_mint` / `renounced_freeze_account`** — SOL-specific. Indicate whether the creator gave up the ability to mint more tokens or freeze wallets. Both being `1` is a safety baseline on Solana. Always `false` on EVM chains (concept does not apply).
|
||||
|
||||
- **`is_honeypot`** — EVM-specific (BSC / Base). Indicates whether the token contract prevents selling. Always empty/null on SOL — do not interpret an empty value as "not a honeypot" on Solana.
|
||||
|
||||
- **`creator_token_status`** — Dev holding status. `creator_hold` = dev still holds tokens (sell pressure risk). `creator_close` = dev has sold or burned their allocation (exit signal confirmed).
|
||||
|
||||
- **`cto_flag`** — Community Takeover flag. `1` = original dev abandoned the project and a community group took over marketing/development. Neutral to positive signal; evaluate in context.
|
||||
|
||||
- **Trenches categories** — Three lifecycle stages of launchpad tokens: `new_creation` (just created, still on bonding curve), `near_completion` (bonding curve nearly full, about to graduate), `completed` (graduated to open market / DEX). In the response, `near_completion` is always returned under the key `data.pump` regardless of the input `--type`.
|
||||
|
||||
- **`wash_trading` / `rat_trader_amount_rate` / `bundler_rate`** — Risk signals for artificial activity. `is_wash_trading` = coordinated fake volume detected. `rat_trader_amount_rate` = ratio of insider/sneak trading. `bundler_rate` = ratio of bot-bundled buys at launch. High values (> 0.3) suggest manipulated price action.
|
||||
|
||||
## Sub-commands
|
||||
|
||||
| Sub-command | Description |
|
||||
@@ -314,50 +340,9 @@ The response is `data.rank` — an array of rank items. Each item represents one
|
||||
|
||||
## Workflow: Discover Trading Opportunities via Trending
|
||||
|
||||
### Step 1 — Fetch trending data
|
||||
> Full workflow: [`docs/market-discover-opportunities.md`](../../docs/market-discover-opportunities.md)
|
||||
|
||||
Fetch a broad pool with safe filters:
|
||||
|
||||
```bash
|
||||
gmgn-cli market trending \
|
||||
--chain <chain> --interval 1h \
|
||||
--order-by volume --limit 50 \
|
||||
--filter not_honeypot --filter has_social --raw
|
||||
```
|
||||
|
||||
### Step 2 — AI multi-factor analysis
|
||||
|
||||
Analyze each record in the response using the following signals (apply judgment, not rigid rules):
|
||||
|
||||
| Signal | Field(s) | Weight | Notes |
|
||||
|--------|----------|--------|-------|
|
||||
| Smart money interest | `smart_degen_count`, `renowned_count` | High | Key conviction indicator |
|
||||
| Bluechip ownership | `bluechip_owner_percentage` | Medium | Quality of holder base |
|
||||
| Real trading activity | `volume`, `swaps` | Medium | Distinguishes genuine interest from wash trading |
|
||||
| Price momentum | `change1h`, `change5m` | Medium | Prefer positive, non-parabolic moves |
|
||||
| Pool safety | `liquidity` | Medium | Low liquidity = high slippage risk |
|
||||
| Token maturity | `creation_timestamp` | Low | Avoid tokens less than ~1h old unless other signals are very strong |
|
||||
|
||||
Select the **top 5** tokens with the best composite profile. Prefer tokens that perform well across multiple signals rather than excelling in just one.
|
||||
|
||||
### Step 3 — Present top 5 to user
|
||||
|
||||
Present results as a concise table, then give a one-line rationale for each pick:
|
||||
|
||||
```
|
||||
Top 5 Trending Tokens — SOL / 1h
|
||||
|
||||
# | Symbol | Address (short) | Smart Degens | Volume | 1h Chg | Reasoning
|
||||
1 | ... | ... | ... | ... | ... | Smart money accumulating + high volume
|
||||
2 | ...
|
||||
...
|
||||
```
|
||||
|
||||
### Step 4 — Follow-up actions
|
||||
|
||||
For each token, offer:
|
||||
- **Deep dive**: `token info` + `token security` for full due diligence
|
||||
- **Swap**: execute directly if the user is satisfied with the trending data alone
|
||||
Steps: fetch trending (50 results, safe filters) → AI multi-factor analysis (smart money, volume, momentum, liquidity, maturity) → present top 5 table with rationale → offer deep dive or swap.
|
||||
|
||||
## `market trenches` Parameters
|
||||
|
||||
@@ -547,6 +532,44 @@ gmgn-cli market trenches --chain base --raw \
|
||||
--limit 80
|
||||
```
|
||||
|
||||
## Output Format
|
||||
|
||||
### `market kline` — Price Summary
|
||||
|
||||
After fetching candles, present a brief price analysis. Do not dump raw candle arrays.
|
||||
|
||||
```
|
||||
{symbol} — {resolution} chart ({from} → {to})
|
||||
Open: ${open of first candle} | Close: ${close of last candle} | Range: ${min low} – ${max high}
|
||||
Total volume: ${sum of all volume fields} USD
|
||||
Trend: [brief description — e.g. "steady uptrend", "sharp drop then recovery", "sideways"]
|
||||
```
|
||||
|
||||
### `market trending` — Top Tokens Table
|
||||
|
||||
Present the top results (default: top 10, or as requested) as a table:
|
||||
|
||||
```
|
||||
# | Symbol | Price | Market Cap | Volume ({interval}) | 1h Chg | Smart Degens | Liquidity | Platform
|
||||
```
|
||||
|
||||
Then give a one-line highlight for any standout tokens (e.g. "TOKEN1 has 12 smart money holders and +85% in 1h").
|
||||
|
||||
### `market trenches` — Grouped by Category
|
||||
|
||||
Present each category separately with a header:
|
||||
|
||||
```
|
||||
🆕 New Creation ({count} tokens)
|
||||
# | Symbol | Created | Liquidity | Swaps (1h) | Smart Degens | Social
|
||||
|
||||
⏳ Near Completion ({count} tokens)
|
||||
# | Symbol | Market Cap | Swaps (1h) | Smart Degens | Social
|
||||
|
||||
✅ Graduated ({count} tokens)
|
||||
# | Symbol | Market Cap | Volume (1h) | Smart Degens | Social
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- `market kline`: `--from` and `--to` are Unix timestamps in **seconds** — CLI converts to milliseconds automatically
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
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>]"
|
||||
metadata:
|
||||
cliHelp: "gmgn-cli portfolio --help"
|
||||
---
|
||||
|
||||
**IMPORTANT: Always use `gmgn-cli` commands below. Do NOT use web search, WebFetch, curl, or visit gmgn.ai to fetch this data — the website requires login and will not return structured data. The CLI is the only correct method.**
|
||||
@@ -10,6 +12,22 @@ argument-hint: "<info|holdings|activity|stats|token-balance> [--chain <sol|bsc|b
|
||||
|
||||
Use the `gmgn-cli` tool to query wallet portfolio data based on the user's request.
|
||||
|
||||
## Core Concepts
|
||||
|
||||
- **`realized_profit` vs `unrealized_profit`** — `realized_profit` = profit locked in from completed sells (cash in hand). `unrealized_profit` = paper gains on positions still held, calculated at current price. These are separate numbers — do not add them unless answering "total P&L including open positions."
|
||||
|
||||
- **`profit_change`** — A multiplier ratio, not a dollar amount. `1.5` = +150% return. `0` = break-even. `-0.5` = -50% loss. Computed as `total_profit / cost`. Do not display this as a raw decimal — convert to percentage for user-facing output.
|
||||
|
||||
- **`pnl`** — Profit/loss ratio from `portfolio stats`: `realized_profit / total_cost`. Same multiplier format as `profit_change`. A `pnl` of `2.0` means the wallet doubled its money on completed trades over the period.
|
||||
|
||||
- **`winrate`** — Ratio of profitable trades over the period (0–1). `0.6` = 60% of trades were profitable. Does not reflect the size of wins vs losses — a wallet can have high winrate but net negative if losses are large.
|
||||
|
||||
- **`cost` vs `usd_value`** — In holdings: `cost` is the historical amount spent buying this token (your cost basis); `usd_value` is the current market value of the position. The difference is unrealized P&L.
|
||||
|
||||
- **`history_bought_cost` vs `cost`** — `history_bought_cost` is the all-time cumulative spend on this token (including positions already sold). `cost` is the cost basis of the current open position only.
|
||||
|
||||
- **Pagination (`cursor`)** — Activity results are paginated. The response includes a `next` field; pass it as `--cursor` to fetch the next page. An empty or missing `next` means you are on the last page.
|
||||
|
||||
## Sub-commands
|
||||
|
||||
| Sub-command | Description |
|
||||
@@ -103,6 +121,102 @@ The activity response includes a `next` field. Pass it to `--cursor` to fetch th
|
||||
|--------|-------------|
|
||||
| `--period <period>` | Stats period: `7d` / `30d` (default `7d`) |
|
||||
|
||||
## Response Field Reference
|
||||
|
||||
### `portfolio holdings` — Key Fields
|
||||
|
||||
The response has a `holdings` array. Each item is one token position.
|
||||
|
||||
| Field | Description |
|
||||
|-------|-------------|
|
||||
| `token.address` | Token contract address |
|
||||
| `token.symbol` / `token.name` | Token ticker and full name |
|
||||
| `token.price` | Current token price in USD |
|
||||
| `balance` | Current token balance (human-readable units) |
|
||||
| `usd_value` | Current USD value of this position |
|
||||
| `cost` | Total amount spent buying this token (USD) |
|
||||
| `realized_profit` | Profit from completed sells (USD) |
|
||||
| `unrealized_profit` | Profit on current unsold holdings at current price (USD) |
|
||||
| `total_profit` | `realized_profit + unrealized_profit` (USD) |
|
||||
| `profit_change` | Total profit ratio = `total_profit / cost` (e.g. `1.5` = +150%) |
|
||||
| `avg_cost` | Average buy price per token (USD) |
|
||||
| `buy_tx_count` | Number of buy transactions |
|
||||
| `sell_tx_count` | Number of sell transactions |
|
||||
| `last_active_timestamp` | Unix timestamp of the most recent transaction |
|
||||
| `history_bought_cost` | Total USD spent buying (all-time) |
|
||||
| `history_sold_income` | Total USD received from selling (all-time) |
|
||||
|
||||
### `portfolio activity` — Key Fields
|
||||
|
||||
The response has a `activities` array and a `next` cursor field for pagination.
|
||||
|
||||
| Field | Description |
|
||||
|-------|-------------|
|
||||
| `transaction_hash` | On-chain transaction hash |
|
||||
| `type` | Transaction type: `buy` / `sell` / `add` / `remove` / `transfer` |
|
||||
| `token.address` | Token contract address |
|
||||
| `token.symbol` | Token ticker |
|
||||
| `token_amount` | Token quantity in this transaction |
|
||||
| `cost_usd` | USD value of this transaction |
|
||||
| `price` | Token price in USD at time of transaction |
|
||||
| `timestamp` | Unix timestamp of the transaction |
|
||||
| `next` | Pagination cursor — pass to `--cursor` to fetch the next page |
|
||||
|
||||
### `portfolio stats` — Key Fields
|
||||
|
||||
The response is an object (or array for batch). Key fields:
|
||||
|
||||
| Field | Description |
|
||||
|-------|-------------|
|
||||
| `realized_profit` | Total realized profit over the period (USD) |
|
||||
| `unrealized_profit` | Total unrealized profit on open positions (USD) |
|
||||
| `winrate` | Win rate — ratio of profitable trades (0–1) |
|
||||
| `total_cost` | Total amount spent buying in the period (USD) |
|
||||
| `buy_count` | Number of buy transactions |
|
||||
| `sell_count` | Number of sell transactions |
|
||||
| `pnl` | Profit/loss ratio = `realized_profit / total_cost` |
|
||||
|
||||
**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
|
||||
|
||||
### `portfolio holdings` — Holdings Table
|
||||
|
||||
Present a table sorted by `usd_value` (descending). Show total portfolio value at the top.
|
||||
|
||||
```
|
||||
Wallet: {wallet} | Chain: {chain}
|
||||
Total value: ~${sum of usd_value across all positions}
|
||||
|
||||
# | Token | Balance | USD Value | Total P&L | P&L% | Avg Cost | Buys / Sells
|
||||
```
|
||||
|
||||
Flag positions where `profit_change` is strongly negative (e.g. < -50%) or positive (e.g. > 200%) with a brief note.
|
||||
|
||||
### `portfolio activity` — Activity Feed
|
||||
|
||||
Present as a chronological list (newest first). Use human-readable timestamps.
|
||||
|
||||
```
|
||||
{type} {token.symbol} | {token_amount} tokens | ${cost_usd} | {timestamp} | tx: {short hash}
|
||||
```
|
||||
|
||||
Group by token if the user asks about a specific token.
|
||||
|
||||
### `portfolio stats` — Stats Summary
|
||||
|
||||
```
|
||||
Wallet: {wallet} | Period: {period}
|
||||
Realized P&L: ${realized_profit}
|
||||
Unrealized P&L: ${unrealized_profit}
|
||||
Win Rate: {winrate × 100}%
|
||||
Total Spent: ${total_cost}
|
||||
Buys / Sells: {buy_count} / {sell_count}
|
||||
PnL Ratio: {pnl}x
|
||||
```
|
||||
|
||||
For batch queries (multiple wallets), present one summary block per wallet.
|
||||
|
||||
## Notes
|
||||
|
||||
- All portfolio commands use normal auth (API Key only, no signature required)
|
||||
|
||||
+60
-17
@@ -2,27 +2,36 @@
|
||||
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>]"
|
||||
metadata:
|
||||
cliHelp: "gmgn-cli swap --help"
|
||||
---
|
||||
|
||||
**IMPORTANT: Always use `gmgn-cli` commands below. Do NOT use web search, WebFetch, curl, or visit gmgn.ai — all swap operations must go through the CLI. The CLI handles signing and submission automatically.**
|
||||
|
||||
**IMPORTANT: Do NOT guess field names or values. When a field's meaning is unclear, look it up in the Response Fields sections below before using it.**
|
||||
|
||||
**⚠️ IPv6 NOT SUPPORTED: GMGN CLI commands do not support IPv6. If you get a `401` or `403` error and credentials look correct, the outbound connection is likely going via IPv6. Run `curl -s https://api64.ipify.org` to check — if the result is an IPv6 address, tell the user to ensure their network routes requests over IPv4.**
|
||||
|
||||
## ⚠️ IPv6 Not Supported — CRITICAL
|
||||
|
||||
**The `swap` sub-command does NOT support IPv6. Requests MUST go out over IPv4.**
|
||||
|
||||
If you receive a `401` or `403` error, the **first thing to check** is whether the machine is sending requests via IPv6. This is a known cause of auth failures even with valid credentials.
|
||||
|
||||
**How to diagnose:**
|
||||
```bash
|
||||
curl -s https://api64.ipify.org # shows your outbound IP — if it's an IPv6 address, that's the problem
|
||||
```
|
||||
|
||||
**Rule for AI models:** If `swap` or `order` commands return 401/403 and credentials look correct — stop and tell the user: "Your outbound connection may be using IPv6, which is not supported by this command. Please check your network configuration and ensure requests go out 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`).
|
||||
|
||||
## Core Concepts
|
||||
|
||||
- **Smallest unit** — `--amount` is always in the token's smallest indivisible unit, not human-readable amounts. For SOL: 1 SOL = 1,000,000,000 lamports. For EVM tokens: depends on decimals (most ERC-20 tokens use 18 decimals). Always convert before passing to the command — do not pass human amounts directly.
|
||||
|
||||
- **`slippage`** — Price tolerance expressed as a decimal, not a percentage. `0.01` = 1% slippage. `0.5` = 50% slippage. If the price moves beyond this threshold before the transaction confirms, the swap is rejected. Use `--auto-slippage` for volatile tokens to let GMGN set an appropriate value automatically.
|
||||
|
||||
- **`--amount` vs `--percent`** — Mutually exclusive. `--amount` specifies an exact input quantity (in smallest unit). `--percent` sells a percentage of the current balance and is only valid when `input_token` is NOT a currency (SOL/BNB/ETH/USDC). Never use `--percent` to spend a fraction of SOL/BNB/ETH.
|
||||
|
||||
- **Currency tokens** — Each chain has designated currency tokens (SOL, BNB, ETH, USDC). These are the base assets used to buy other tokens or receive swap proceeds. Their contract addresses are fixed — look them up in the Chain Currencies table, never guess them.
|
||||
|
||||
- **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. Enabled by default.
|
||||
|
||||
- **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.
|
||||
|
||||
- **`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.
|
||||
|
||||
## Financial Risk Notice
|
||||
|
||||
**This skill executes REAL, IRREVERSIBLE blockchain transactions.**
|
||||
@@ -158,10 +167,10 @@ gmgn-cli order get --chain sol --order-id <order_id>
|
||||
| `--from` | Yes | Wallet address (must match API Key binding) |
|
||||
| `--input-token` | Yes | Input token contract address |
|
||||
| `--output-token` | Yes | Output token contract address |
|
||||
| `--amount` | No* | Input amount in smallest unit. Required unless `--percent` is used. |
|
||||
| `--percent <pct>` | No* | Sell percentage of `input_token`, e.g. `50` = 50%, `1` = 1%. Sets `input_amount` to `0` automatically. **Only valid when `input_token` is NOT a currency (SOL/BNB/ETH/USDC).** |
|
||||
| `--slippage <n>` | No | Slippage tolerance, e.g. `0.01` = 1% |
|
||||
| `--auto-slippage` | No | Enable automatic slippage |
|
||||
| `--amount` | No* | Input amount in smallest unit. **Mutually exclusive with `--percent`** — provide one or the other, never both. Required unless `--percent` is used. |
|
||||
| `--percent <pct>` | No* | Sell percentage of `input_token`, e.g. `50` = 50%, `1` = 1%. Sets `input_amount` to `0` automatically. **Mutually exclusive with `--amount`. Only valid when `input_token` is NOT a currency (SOL/BNB/ETH/USDC).** |
|
||||
| `--slippage <n>` | No | Slippage tolerance, e.g. `0.01` = 1%. **Mutually exclusive with `--auto-slippage`** — use one or the other. |
|
||||
| `--auto-slippage` | No | Enable automatic slippage. **Mutually exclusive with `--slippage`.** |
|
||||
| `--min-output <n>` | No | Minimum output amount |
|
||||
| `--anti-mev` | No | Enable anti-MEV protection (default true) |
|
||||
| `--priority-fee <sol>` | No | Priority fee in SOL (≥ 0.00001, SOL only) |
|
||||
@@ -185,6 +194,40 @@ gmgn-cli order get --chain sol --order-id <order_id>
|
||||
| `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 |
|
||||
|
||||
## Output Format
|
||||
|
||||
### Pre-swap Confirmation
|
||||
|
||||
Before executing, always display a confirmation summary:
|
||||
|
||||
```
|
||||
⚠️ Swap Confirmation Required
|
||||
|
||||
Chain: {chain}
|
||||
Wallet: {--from}
|
||||
Sell: {input amount in human units} {input token symbol}
|
||||
Buy: {output token symbol}
|
||||
Slippage: {slippage}% (or "auto")
|
||||
Est. output: ~{output_amount from quote} {output token symbol}
|
||||
|
||||
Reply "confirm" to proceed.
|
||||
```
|
||||
|
||||
### Post-swap Receipt
|
||||
|
||||
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}
|
||||
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.
|
||||
|
||||
## Notes
|
||||
|
||||
- Swap uses **critical auth** (API Key + signature) — CLI handles signing automatically, no manual processing needed
|
||||
|
||||
+78
-55
@@ -2,14 +2,34 @@
|
||||
name: gmgn-token
|
||||
description: Query GMGN token information — basic info, security, pool, top holders and top traders. Supports sol / bsc / base.
|
||||
argument-hint: "<sub-command> --chain <sol|bsc|base> --address <token_address>"
|
||||
metadata:
|
||||
cliHelp: "gmgn-cli token --help"
|
||||
---
|
||||
|
||||
**IMPORTANT: Always use `gmgn-cli` commands below. Do NOT use web search, WebFetch, curl, or visit gmgn.ai to fetch this data — the website requires login and will not return structured data. The CLI is the only correct method.**
|
||||
|
||||
**⚠️ IPv6 NOT SUPPORTED: GMGN CLI commands do not support IPv6. If you get a `401` or `403` error and credentials look correct, the outbound connection is likely going via IPv6. Run `curl -s https://api64.ipify.org` to check — if the result is an IPv6 address, tell the user to ensure their network routes requests over IPv4.**
|
||||
|
||||
**IMPORTANT: Do NOT guess field names or values. When a field's meaning is unclear, look it up in the Response Field Reference tables below before using it.**
|
||||
|
||||
Use the `gmgn-cli` tool to query token information based on the user's request.
|
||||
|
||||
## Core Concepts
|
||||
|
||||
- **Token address** — The on-chain contract address that uniquely identifies a token on its chain. Required for all token sub-commands. Format: base58 (SOL) or `0x...` hex (BSC/Base).
|
||||
- **Chain** — The blockchain network: `sol` = Solana, `bsc` = BNB Smart Chain, `base` = Base (Coinbase L2).
|
||||
- **Market cap** — Not returned directly by `token info`. Calculate as `price × circulating_supply` (both are top-level fields in the response, already in human-readable units).
|
||||
- **Liquidity** — USD value of token reserves in the main trading pool. Low liquidity (< $10k) means high price impact / slippage when buying or selling.
|
||||
- **Holder** — A wallet that currently holds the token. `token holders` returns wallets ranked by current balance.
|
||||
- **Trader** — Any wallet that has transacted with the token (bought or sold), regardless of current holdings. `token traders` covers both current holders and past traders.
|
||||
- **Smart money (`smart_degen`)** — Wallets with a proven track record of profitable trading, tagged by GMGN's algorithm. High `smart_degen_count` is a bullish signal.
|
||||
- **KOL (`renowned`)** — Known influencer, fund, or public figure wallets, tagged by GMGN. Their positions are publicly tracked.
|
||||
- **Honeypot** — A token where buy transactions succeed but sell transactions always fail. User funds become permanently trapped. Only detectable on BSC/Base (`is_honeypot`); not applicable on SOL.
|
||||
- **Renounced (mint / freeze / ownership)** — The developer has permanently given up that authority. On SOL: `renounced_mint` (cannot create new supply) and `renounced_freeze_account` (cannot freeze wallets) both `true` is the safe baseline. On EVM: `owner_renounced` `"yes"` means no admin backdoors.
|
||||
- **rug_ratio** — A 0–1 risk score estimating the likelihood of a rug pull. Values above `0.3` are high-risk. Do not treat as a binary safe/unsafe flag — use in combination with other signals.
|
||||
- **Bonding curve** — Price discovery mechanism used by launchpads (e.g. Pump.fun, letsbonk). Token price rises as more is bought. When the curve fills, the token "graduates" to an open DEX pool. `is_on_curve: true` means the token has not graduated yet.
|
||||
- **Wallet tags** — GMGN-assigned labels on wallets: `smart_degen` (smart money), `renowned` (KOL), `sniper` (launched at token open), `bundler` (bot-bundled buy), `rat_trader` (insider/sneak trading). Use `--tag` to filter `token holders` / `token traders` by these labels.
|
||||
|
||||
## Sub-commands
|
||||
|
||||
| Sub-command | Description |
|
||||
@@ -67,6 +87,23 @@ Use the `gmgn-cli` tool to query token information based on the user's request.
|
||||
| `renowned` | KOL / well-known wallets (influencers, funds, public figures) |
|
||||
| `smart_degen` | Smart money wallets (historically high-performing traders) |
|
||||
|
||||
### `--tag` + `--order-by` Combination Guide
|
||||
|
||||
`--tag` and `--order-by` are independent — all `--order-by` values are valid with or without `--tag`. Omitting `--tag` returns all wallets (no filter).
|
||||
|
||||
Recommended combinations for common use cases:
|
||||
|
||||
| Goal | `--tag` | `--order-by` |
|
||||
|------|---------|--------------|
|
||||
| Largest smart money holders by supply | `smart_degen` | `amount_percentage` |
|
||||
| Smart money with highest realized profit | `smart_degen` | `profit` |
|
||||
| Smart money sitting on unrealized gains | `smart_degen` | `unrealized_profit` |
|
||||
| Smart money aggressively accumulating | `smart_degen` | `buy_volume_cur` |
|
||||
| Smart money distributing (exit signal) | `smart_degen` | `sell_volume_cur` |
|
||||
| KOLs who already took profit | `renowned` | `profit` |
|
||||
| KOLs still holding with paper gains | `renowned` | `unrealized_profit` |
|
||||
| Largest holders overall (no filter) | *(omit)* | `amount_percentage` |
|
||||
|
||||
## Response Field Reference
|
||||
|
||||
### `token info` — Key Fields
|
||||
@@ -430,65 +467,51 @@ gmgn-cli token traders --chain bsc --address 0x2170Ed0880ac9A755fd29B2688956BD95
|
||||
|
||||
## Workflow: Full Token Due Diligence
|
||||
|
||||
Use this workflow before deciding to buy a token.
|
||||
> Full 4-step workflow: [`docs/token-due-diligence.md`](../../docs/token-due-diligence.md)
|
||||
|
||||
### Step 1 — Get basic info
|
||||
|
||||
```bash
|
||||
gmgn-cli token info --chain sol --address <token_address> --raw
|
||||
```
|
||||
|
||||
Check: `price`, `liquidity`, `holder_count`, `wallet_tags_stat.smart_wallets`, `wallet_tags_stat.renowned_wallets`, `link.website` / `link.twitter_username` / `link.telegram`.
|
||||
|
||||
**Red flags**: all `link.*` social fields empty, very low liquidity (<$10k), zero `wallet_tags_stat.smart_wallets` and `renowned_wallets`.
|
||||
|
||||
### Step 2 — Check security
|
||||
|
||||
```bash
|
||||
gmgn-cli token security --chain sol --address <token_address> --raw
|
||||
```
|
||||
|
||||
Check these fields and their safe thresholds:
|
||||
|
||||
| Field | Safe | Warning | Danger |
|
||||
|-------|------|---------|--------|
|
||||
| `is_honeypot` | `"no"` | — | `"yes"` → Do not buy |
|
||||
| `open_source` | `"yes"` | `"unknown"` | `"no"` |
|
||||
| `owner_renounced` | `"yes"` | `"unknown"` | `"no"` |
|
||||
| `renounced_mint` (SOL) | `true` | — | `false` → mint risk |
|
||||
| `renounced_freeze_account` (SOL) | `true` | — | `false` → freeze risk |
|
||||
| `buy_tax` / `sell_tax` | `0` | `0.01–0.05` | `>0.10` → high tax |
|
||||
| `top_10_holder_rate` | `<0.20` | `0.20–0.40` | `>0.50` → whale risk |
|
||||
| `rug_ratio` | `<0.10` | `0.10–0.30` | `>0.30` → high rug risk |
|
||||
| `creator_token_status` | `creator_close` | — | `creator_hold` → dev not sold |
|
||||
| `sniper_count` | `<5` | `5–20` | `>20` → heavily sniped |
|
||||
|
||||
### Step 3 — Check liquidity pool
|
||||
|
||||
```bash
|
||||
gmgn-cli token pool --chain sol --address <token_address> --raw
|
||||
```
|
||||
|
||||
Check: liquidity amount, which DEX (`exchange`), pool age (`creation_timestamp`). Low liquidity means high slippage risk when buying or selling.
|
||||
|
||||
### Step 4 — Check smart money signals
|
||||
|
||||
```bash
|
||||
# Is smart money accumulating?
|
||||
gmgn-cli token holders --chain sol --address <token_address> \
|
||||
--tag smart_degen --order-by buy_volume_cur --direction desc --limit 20 --raw
|
||||
|
||||
# Have KOLs already taken profit?
|
||||
gmgn-cli token traders --chain sol --address <token_address> \
|
||||
--tag renowned --order-by profit --direction desc --limit 20 --raw
|
||||
```
|
||||
|
||||
**Bullish signals**: smart_degen wallets buying heavily, unrealized_profit is large (still holding), renowned wallets accumulating, low sell_volume_cur.
|
||||
|
||||
**Bearish signals**: sell_volume_cur > buy_volume_cur for smart money, large realized profits already taken (they may be done), top holders with very high amount_percentage starting to sell.
|
||||
Steps: `token info` → `token security` → `token pool` → `token holders/traders` (smart money signals).
|
||||
|
||||
---
|
||||
|
||||
## Output Format
|
||||
|
||||
### `token info` — Summary Card
|
||||
|
||||
Present as a concise card. Do not dump raw JSON.
|
||||
|
||||
```
|
||||
{symbol} ({name})
|
||||
Price: ${price} | Market Cap: ~${price × circulating_supply} | Liquidity: ${liquidity}
|
||||
Holders: {holder_count} | Smart Money: {wallet_tags_stat.smart_wallets} | KOLs: {wallet_tags_stat.renowned_wallets}
|
||||
Social: @{link.twitter_username} | {link.website} | {link.telegram}
|
||||
```
|
||||
|
||||
If any social fields are empty, omit them rather than showing `null`.
|
||||
|
||||
### `token security` — Risk Summary
|
||||
|
||||
Present as a risk table with a clear verdict:
|
||||
|
||||
```
|
||||
Security check: {symbol}
|
||||
✅ / ⚠️ / ❌ Honeypot: {is_honeypot}
|
||||
✅ / ⚠️ / ❌ Open source: {open_source}
|
||||
✅ / ⚠️ / ❌ Renounced: {owner_renounced} (or renounced_mint + renounced_freeze for SOL)
|
||||
✅ / ⚠️ / ❌ Buy/Sell tax: {buy_tax} / {sell_tax}
|
||||
✅ / ⚠️ / ❌ Top-10 concentration: {top_10_holder_rate}
|
||||
✅ / ⚠️ / ❌ Rug ratio: {rug_ratio}
|
||||
```
|
||||
|
||||
Then give a one-line verdict: "Safe to proceed", "Proceed with caution", or "High risk — do not buy".
|
||||
|
||||
### `token holders` / `token traders` — Ranked Table
|
||||
|
||||
```
|
||||
# | Wallet (name or short addr) | Hold% | Avg Buy | Realized P&L | Unrealized P&L | Tags
|
||||
```
|
||||
|
||||
Show top rows only. Highlight wallets tagged `kol`, `smart_degen`, or flagged `bundler` / `rat_trader` in `maker_token_tags`.
|
||||
|
||||
## Notes
|
||||
|
||||
- **Market cap is not returned directly** — calculate it as `price × circulating_supply` (both fields are top-level; `circulating_supply` is already in human-readable token units, no decimal adjustment needed). Example: `price=3.11` × `circulating_supply=999999151` ≈ $3.11B market cap.
|
||||
|
||||
+47
-14
@@ -2,27 +2,39 @@
|
||||
name: gmgn-track
|
||||
description: Query GMGN on-chain tracking data — follow-wallet trade records, KOL trades, and Smart Money trades. Supports sol / bsc / base.
|
||||
argument-hint: "<follow-wallet|kol|smartmoney> [--chain <sol|bsc|base>] [--wallet <wallet_address>]"
|
||||
metadata:
|
||||
cliHelp: "gmgn-cli track --help"
|
||||
---
|
||||
|
||||
**IMPORTANT: Always use `gmgn-cli` commands below. Do NOT use web search, WebFetch, curl, or visit gmgn.ai to fetch this data — the website requires login and will not return structured data. The CLI is the only correct method.**
|
||||
|
||||
**IMPORTANT: Do NOT guess field names or values. When a field's meaning is unclear, look it up in the Response Fields sections below before using it.**
|
||||
|
||||
**⚠️ IPv6 NOT SUPPORTED: GMGN CLI commands do not support IPv6. If you get a `401` or `403` error and credentials look correct, the outbound connection is likely going via IPv6. Run `curl -s https://api64.ipify.org` to check — if the result is an IPv6 address, tell the user to ensure their network routes requests over IPv4.**
|
||||
|
||||
## ⚠️ IPv6 Not Supported — CRITICAL
|
||||
|
||||
**The `track follow-wallet` sub-command does NOT support IPv6. Requests MUST go out over IPv4.**
|
||||
|
||||
This sub-command is known to fail with `401` or `403` when the outbound connection uses IPv6 — even when credentials are valid.
|
||||
|
||||
**How to diagnose:**
|
||||
```bash
|
||||
curl -s https://api64.ipify.org # if result is an IPv6 address, that's the problem
|
||||
```
|
||||
|
||||
**Rule for AI models:** If `track follow-wallet` returns 401/403 and credentials look correct — stop and tell the user: "Your outbound connection may be using IPv6, which is not supported by this command. Please check your network configuration and ensure requests go out over IPv4."
|
||||
|
||||
Use the `gmgn-cli` tool to query on-chain tracking data based on the user's request.
|
||||
|
||||
## 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.
|
||||
|
||||
- **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.
|
||||
|
||||
- **Smart Money (`smart_degen`)** — Wallets with a statistically proven record of profitable trading, identified by GMGN's algorithm. Same concept as `smart_degen` in gmgn-token. Their trades are a stronger alpha signal than KOL trades.
|
||||
|
||||
- **`is_open_or_close`** — Indicates whether a trade is a full position event. Interpretation differs by sub-command:
|
||||
- `follow-wallet`: `1` = full position open or close; `0` = partial add or reduce.
|
||||
- `kol` / `smartmoney`: `0` = position opened / added; `1` = position closed / reduced.
|
||||
Do not apply the same interpretation to both sub-commands.
|
||||
|
||||
- **`price_change`** — Ratio of price change since the trade was made. `6.66` = the token is now 6.66× what it was when the wallet traded (i.e. +566%). `0.5` = price halved since the trade (-50%). Use this to assess "how well did this trade age."
|
||||
|
||||
- **`base_address` vs `quote_address`** — In a trading pair, `base_address` is the token being bought/sold; `quote_address` is what it was priced in (typically SOL native address on Solana). To get the token of interest, always read `base_address`.
|
||||
|
||||
- **`maker_info.tags`** — Array of platform labels on the wallet (e.g. `["kol", "gmgn"]`, `["smart_degen", "photon"]`). A wallet can carry multiple tags. Use `tag_rank` (follow-wallet only) to see the wallet's rank within each tag category.
|
||||
|
||||
- **Cluster signal** — When multiple followed/tracked wallets trade the same token in the same direction within a short time window, this is a stronger conviction signal than a single wallet. Highlight this pattern when it appears in results.
|
||||
|
||||
**When to use which sub-command:**
|
||||
- `track follow-wallet` — user asks "what did the wallets I follow trade?", "show me my follow list trades", "追踪关注的钱包交易动态" → requires wallets followed via GMGN platform
|
||||
- `track kol` — user asks "what are KOLs buying?", "KOL 最近在买什么", "show me influencer trades" → returns trades from known KOL wallets
|
||||
@@ -150,7 +162,7 @@ Each item in `list` contains:
|
||||
|
||||
## `track kol` / `track smartmoney` Response Fields
|
||||
|
||||
Each item in `list` contains:
|
||||
The response is an object with a `list` array. Each item in `list` contains:
|
||||
|
||||
| Field | Description |
|
||||
|-------|-------------|
|
||||
@@ -169,6 +181,27 @@ Each item in `list` contains:
|
||||
| `maker_info.twitter_username` | KOL's Twitter username |
|
||||
| `maker_info.tags` | Wallet tags (e.g. `kol`, `smart_degen`, `photon`) |
|
||||
|
||||
## Output Format
|
||||
|
||||
### `track follow-wallet` / `track kol` / `track smartmoney` — Trade Feed
|
||||
|
||||
Present as a reverse-chronological trade feed. Do not dump raw JSON.
|
||||
|
||||
```
|
||||
{timestamp} {side} {base_token.symbol} ${amount_usd} by {maker_info.name or short address}
|
||||
[{tags}] Price: ${price_usd} | Price now: ${price_now} ({price_change}x since trade)
|
||||
```
|
||||
|
||||
Group by token if multiple trades hit the same token. Highlight tokens where several followed wallets traded in the same direction within a short window (cluster signal).
|
||||
|
||||
For `follow-wallet`, also show `is_open_or_close`: flag full position opens/closes distinctly from partial adds/reduces.
|
||||
|
||||
## 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)
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ const program = new Command();
|
||||
program
|
||||
.name("gmgn-cli")
|
||||
.version(version)
|
||||
.description("GMGN OpenAPI CLI — market data, token info, portfolio and swap");
|
||||
.description("GMGN OpenAPI CLI — market data, token info, portfolio, track KOL/smart money trades, and swap");
|
||||
|
||||
registerTokenCommands(program);
|
||||
registerMarketCommands(program);
|
||||
|
||||
Reference in New Issue
Block a user