diff --git a/docs/workflow-early-project-screening.md b/docs/workflow-early-project-screening.md index ab6c2af..be5316f 100644 --- a/docs/workflow-early-project-screening.md +++ b/docs/workflow-early-project-screening.md @@ -31,10 +31,34 @@ gmgn-cli market trenches --chain --type completed From the results, note each token's `address`, `symbol`, `smart_degen_count`, `renowned_count`, `volume`, `swaps`, and `rug_ratio`. +**Tip — use filter flags to pre-screen at fetch time:** + +```bash +# Fetch with safe baseline filter (server-side) +gmgn-cli market trenches --chain \ + --type new_creation --type near_completion \ + --filter-preset safe --sort-by smart_degen_count + +# Strict: safe + require smart money + min 24h volume $1k +gmgn-cli market trenches --chain \ + --type new_creation --type near_completion \ + --filter-preset strict --sort-by smart_degen_count + +# Custom: manual range filters (all sent server-side) +gmgn-cli market trenches --chain \ + --type new_creation \ + --max-rug-ratio 0.3 --max-bundler-rate 0.3 --max-insider-ratio 0.3 \ + --min-smart-degen-count 1 --min-volume-24h 1000 +``` + +Using `--filter-preset safe` (or `strict`) tells the server to pre-filter results before returning — equivalent to Steps 2's "Discard immediately" criteria, applied before the response is sent. + --- ## Step 2 — First-Pass Filter (In-Response Scan) +> **If you used `--filter-preset safe` or `--filter-preset strict` in Step 1, the rug_ratio, bundler_rate, and insider_ratio checks below are already applied server-side.** Verify the remaining signals manually. + Before running any CLI commands per token, apply a quick in-response filter on the trenches results: **Discard immediately if:** diff --git a/skills/gmgn-market/SKILL.md b/skills/gmgn-market/SKILL.md index f4b80f6..208f132 100644 --- a/skills/gmgn-market/SKILL.md +++ b/skills/gmgn-market/SKILL.md @@ -479,7 +479,7 @@ All filter flags are sent as part of the API request body — the server filters | `--min-rug-ratio` / `--max-rug-ratio` | float | Rug pull risk score (0–1) | | `--min-bundler-rate` / `--max-bundler-rate` | float | Bundle-bot trading ratio (0–1) | | `--min-insider-ratio` / `--max-insider-ratio` | float | Insider trading ratio (0–1) | -| `--min-entrapment-ratio` / `--max-entrapment-ratio` | float | Entrapment trading ratio (0–1) | +| `--min-entrapment-ratio` / `--max-entrapment-ratio` | float | Entrapment/Phishing trading ratio (0–1) | | `--min-private-vault-hold-rate` / `--max-private-vault-hold-rate` | float | Private vault holding ratio (0–1) | | `--min-top70-sniper-hold-rate` / `--max-top70-sniper-hold-rate` | float | Top-70 sniper holding ratio (0–1) | | `--min-bot-count` / `--max-bot-count` | int | Bot wallet count | diff --git a/src/client/OpenApiClient.ts b/src/client/OpenApiClient.ts index 8c6200e..49474e2 100644 --- a/src/client/OpenApiClient.ts +++ b/src/client/OpenApiClient.ts @@ -126,8 +126,8 @@ export class OpenApiClient { return this.normalRequest("GET", "/v1/user/wallet_token_balance", { chain, wallet_address: walletAddress, token_address: tokenAddress }); } - async getTrenches(chain: string, types?: string[], platforms?: string[], limit?: number): Promise { - const body = buildTrenchesBody(chain, types, platforms, limit); + async getTrenches(chain: string, types?: string[], platforms?: string[], limit?: number, filters?: Record): Promise { + const body = buildTrenchesBody(chain, types, platforms, limit, filters); return this.normalRequest("POST", "/v1/trenches", { chain }, body); } @@ -342,17 +342,18 @@ const TRENCHES_QUOTE_ADDRESS_TYPES: Record = { base: [11, 3, 12, 13, 0], }; -function buildTrenchesBody(chain: string, types?: string[], platforms?: string[], limit?: number): Record { +function buildTrenchesBody(chain: string, types?: string[], platforms?: string[], limit?: number, filters?: Record): Record { const selectedTypes = types?.length ? types : ["new_creation", "near_completion", "completed"]; const launchpad_platform = platforms?.length ? platforms : (TRENCHES_PLATFORMS[chain] ?? []); const quote_address_type = TRENCHES_QUOTE_ADDRESS_TYPES[chain] ?? []; const actualLimit = limit ?? 80; - const section = { + const section: Record = { filters: ["offchain", "onchain"], launchpad_platform, quote_address_type, launchpad_platform_v2: true, limit: actualLimit, + ...filters, }; const body: Record = { version: "v2" }; for (const type of selectedTypes) {