dex-skills
v0.1.3
Published
Unified SDK for DEX launchpad platforms across Solana, Base, BNB, and TRON
Readme
dex-skills
Token launch and query SDK for 7 DEX launchpad platforms across Solana, Base, BNB Chain, and TRON.
ca: 8UmPP5hLCLBrgZnznMGefXJSJCjYzbX1eDzpnZ9Cpump
| Platform | Chain | Launch | Buy/Sell | Query | Trending | Holders | |----------|-------|--------|----------|-------|----------|---------| | Pump.fun | Solana | Yes | Yes | Yes | Yes | Yes | | LetsBonk | Solana | Yes | Yes | Yes | -- | Yes | | Moonshot | Solana | Yes | Yes | Yes | Yes | -- | | Zora | Base | Yes | Yes | Yes | Yes | Yes | | Clanker | Base | Yes | Yes | Yes | Yes | Yes | | Four.meme | BNB | Yes | Yes | Yes | -- | Yes | | SunPump | TRON | Yes | Yes | Yes | Yes | Yes |
Install
npm install dex-skillsQuick Start
import { createSkills, getSkill } from "dex-skills";
const skills = createSkills({
wallets: {
solana: {
privateKey: "base58_private_key",
rpcUrl: "https://api.mainnet-beta.solana.com",
},
},
});
// Launch a token on Pump.fun
const result = await getSkill(skills, "pumpfun").launch({
name: "My Token",
symbol: "MTK",
description: "A token",
links: { twitter: "https://x.com/mytoken" },
});
console.log(result.tokenAddress);
console.log(result.txHash);
// Query token info (no private key needed for reads)
const info = await getSkill(skills, "pumpfun").getTokenInfo("TokenMintAddress...");
console.log(info.price, info.marketCap, info.bondingCurveProgress);
// List recent tokens
const tokens = await getSkill(skills, "pumpfun").listTokens({
limit: 10,
sortBy: "createdAt",
});Wallet Configuration
Each chain requires its own wallet config. Only configure chains you need.
const skills = createSkills({
wallets: {
solana: { privateKey: "...", rpcUrl: "https://api.mainnet-beta.solana.com" },
base: { privateKey: "0x...", rpcUrl: "https://mainnet.base.org" },
bnb: { privateKey: "0x...", rpcUrl: "https://bsc-dataseed1.binance.org" },
tron: { privateKey: "...", fullHost: "https://api.trongrid.io", apiKey: "..." },
},
bitqueryApiKey: "...", // optional, used for LetsBonk queries
});Platform-to-chain mapping:
- Solana: Pump.fun, LetsBonk, Moonshot
- Base: Zora, Clanker
- BNB: Four.meme
- TRON: SunPump
Launch Parameters
await skill.launch({
name: "Token Name", // required
symbol: "TKN", // required
description: "...", // optional
imageUrl: "https://...", // optional
bannerUrl: "https://...", // optional, Moonshot only
initialBuyAmount: "0.1", // optional, in native currency (SOL/ETH/BNB/TRX)
links: { // optional
twitter: "https://x.com/...",
telegram: "https://t.me/...",
website: "https://...",
discord: "https://...",
github: "https://...",
},
});Social link support varies by platform. All platforms accept twitter, telegram, and website. Moonshot and Clanker also accept discord. Zora accepts all fields via metadata URI.
Analysis Tools (v0.1.1)
Compare Platforms
import { comparePlatforms } from "dex-skills";
const result = comparePlatforms(["pumpfun", "clanker", "fourmeme"]);
console.log(result.recommendation);
// → { lowestLaunchFee: "clanker", lowestTradingFee: "fourmeme", bestCreatorRevenue: "pumpfun" }Token Safety Scanner
import { scanToken } from "dex-skills";
const result = await scanToken("pumpfun", "TokenMintAddress...");
console.log(result.riskScore); // 0-100
console.log(result.riskLevel); // "safe" | "low" | "medium" | "high" | "critical"
console.log(result.contractRisks); // { isHoneypot, isMintable, ... }Graduation Tracking
import { createSkills, getSkill, getGraduationStatus } from "dex-skills";
const skills = createSkills({ wallets: { solana: { privateKey: "...", rpcUrl: "..." } } });
const status = await getGraduationStatus(getSkill(skills, "pumpfun"), "TokenMintAddress...");
console.log(status.status); // "bonding" | "graduating" | "graduated"
console.log(status.bondingCurveProgress); // 42.5
console.log(status.migrationTarget); // "PumpSwap (Raydium fork)"v0.1.2 Features
Creator Revenue Tracking
import { getCreatorRevenue } from "dex-skills";
const rev = await getCreatorRevenue("clanker", "0xTokenAddr", "0xCreatorAddr", "https://mainnet.base.org");
console.log(rev.supported); // true
console.log(rev.mechanism); // "~40% of Uniswap V3/V4 LP fees..."
console.log(rev.revenue); // { amount: "0.05", currency: "ETH" }Supported: PumpFun (WSOL), Clanker (LP fees via FeeLocker), Zora (auto-distributed), Moonshot (USDC via Meteora).
Real-time Event Subscription
import { EventSubscriber } from "dex-skills";
const subscriber = new EventSubscriber({
baseRpcUrl: "https://mainnet.base.org",
bnbRpcUrl: "https://bsc-dataseed1.binance.org",
bitqueryToken: "...", // optional, for Moonshot/SunPump
});
const sub = subscriber.subscribe({
platforms: ["pumpfun", "clanker"],
events: ["newToken", "trade", "graduation"],
});
subscriber.on("event", (event) => {
console.log(event.type, event.platform, event.data);
});
// later: sub.unsubscribe(); subscriber.close();| Platform | Source | Config |
|----------|--------|--------|
| PumpFun / LetsBonk | PumpPortal WebSocket | None (free) |
| Clanker | Base eth_getLogs | BASE_RPC_URL |
| Zora | Base eth_getLogs (factory) | BASE_RPC_URL |
| FourMeme | BNB eth_getLogs | BNB_RPC_URL |
| Moonshot / SunPump | Bitquery GraphQL WS | BITQUERY_TOKEN |
Whale / Sniper Detection
import { createSkills, getSkill, detectWhales } from "dex-skills";
const skills = createSkills({ wallets: { solana: { privateKey: "...", rpcUrl: "..." } } });
const result = await detectWhales(getSkill(skills, "pumpfun"), "TokenMintAddress...");
console.log(result.summary.riskLevel); // "low" | "medium" | "high" | "critical"
console.log(result.whales); // holders > 1% supply, labeled whale/sniper-whale
console.log(result.snipers); // buyers within 30s of launchToken Lifecycle
import { createSkills, getSkill, getTokenLifecycle } from "dex-skills";
const skills = createSkills({ wallets: { solana: { privateKey: "...", rpcUrl: "..." } } });
const lc = await getTokenLifecycle(getSkill(skills, "pumpfun"), "TokenMintAddress...");
console.log(lc.currentPhase); // "created" | "bonding" | "graduating" | "graduated" | "trading"
console.log(lc.phases); // ordered lifecycle phases with timestamps
console.log(lc.metrics); // current price, marketCap, volume, holders
console.log(lc.bondingCurve); // progress, migrationTargetv0.1.3 Features
Smart Money Tracking
import { createSkills, getSkill, trackSmartMoney } from "dex-skills";
const skills = createSkills({ wallets: { solana: { privateKey: "...", rpcUrl: "..." } } });
const result = await trackSmartMoney(getSkill(skills, "pumpfun"), "TokenMintAddress...");
console.log(result.summary.signal); // "bullish" | "bearish" | "neutral"
console.log(result.summary.smartMoneyCount); // wallets with >50% profit
console.log(result.summary.smartMoneyHolding); // smart money still holding
console.log(result.smartMoney); // detailed PnL per walletPnL Calculator
import { createSkills, getSkill, calculatePnL } from "dex-skills";
const skills = createSkills({ wallets: { solana: { privateKey: "...", rpcUrl: "..." } } });
const pnl = await calculatePnL(getSkill(skills, "pumpfun"), "TokenMintAddress...", "WalletAddress...");
console.log(pnl.status); // "profit" | "loss" | "breakeven" | "no-trades"
console.log(pnl.totalPnL); // realized + unrealized PnL in native currency
console.log(pnl.roiPercent); // ROI percentage
console.log(pnl.realizedPnL); // PnL from completed sells (FIFO cost basis)
console.log(pnl.unrealizedPnL); // PnL from current holdingsToken Momentum Analysis
import { createSkills, getSkill, getTokenMomentum } from "dex-skills";
const skills = createSkills({ wallets: { solana: { privateKey: "...", rpcUrl: "..." } } });
const m = await getTokenMomentum(getSkill(skills, "pumpfun"), "TokenMintAddress...", { windowMinutes: 30 });
console.log(m.signal); // "strong-buy" | "buy" | "neutral" | "sell" | "strong-sell"
console.log(m.confidence); // 0-100
console.log(m.pressure.buySellRatio); // >0.5 = more buying
console.log(m.volume.isAccelerating); // volume increasing?
console.log(m.factors); // human-readable signal factorsIntegration Formats
dex-skills ships in multiple formats for different integration targets.
MCP Server (Claude Code, Cursor)
Run the MCP server for tool-use with AI coding assistants:
# Development
npx tsx src/mcp-server.ts
# Production (after build)
node dist/mcp-server.jsAdd to your .mcp.json:
{
"mcpServers": {
"dex-skills": {
"command": "npx",
"args": ["tsx", "path/to/dex-skills/src/mcp-server.ts"]
}
}
}Exposes 23 tools: dex_platforms, dex_launch, dex_get_token, dex_list_tokens, dex_buy, dex_sell, dex_trending, dex_trade_history, dex_holders, dex_estimate_price, dex_compare_platforms, dex_scan_token, dex_graduation_status, dex_creator_revenue, dex_token_lifecycle, dex_detect_whales, dex_subscribe, dex_events, dex_unsubscribe, dex_smart_money, dex_pnl, dex_token_momentum.
RPC endpoints are read from environment variables. Private keys are passed per-request to dex_launch and never stored.
OpenClaw Skill
Copy the openclaw/ directory to your OpenClaw skills folder:
cp -r openclaw/ ~/.openclaw/skills/dex-skills/Or install dependencies in the skill directory:
cd ~/.openclaw/skills/dex-skills && npm installThe skill registers as /dex-skills and responds to token launch, query, and listing requests.
Function Calling (OpenAI / Anthropic API)
Import tool definitions directly for use with tool_use or function_calling:
import { toolDefinitions } from "dex-skills";
// Anthropic
const response = await anthropic.messages.create({
model: "claude-sonnet-4-20250514",
tools: toolDefinitions,
messages: [{ role: "user", content: "Launch a token on pump.fun called Test" }],
});
// OpenAI (convert input_schema to parameters)
const tools = toolDefinitions.map(t => ({
type: "function",
function: { name: t.name, description: t.description, parameters: t.input_schema },
}));OpenAPI Spec
An OpenAPI 3.1 spec is available for building REST API wrappers:
import { openApiSpec } from "dex-skills";
// or load directly: dist/openapi.jsonEnvironment Variables
For MCP server and OpenClaw skill usage. All optional with defaults.
| Variable | Default | Used By |
|----------|---------|---------|
| SOLANA_RPC_URL | https://api.mainnet-beta.solana.com | Pump.fun, LetsBonk, Moonshot |
| BASE_RPC_URL | https://mainnet.base.org | Zora, Clanker |
| BNB_RPC_URL | https://bsc-dataseed1.binance.org | Four.meme |
| TRON_FULL_HOST | https://api.trongrid.io | SunPump |
| TRON_API_KEY | - | SunPump |
| BITQUERY_API_KEY | - | LetsBonk |
| BASE_WS_URL | - | Event subscription (Clanker/Zora, WebSocket) |
| BNB_WS_URL | - | Event subscription (FourMeme, WebSocket) |
| BITQUERY_TOKEN | - | Event subscription (Moonshot/SunPump) |
Return Types
LaunchResult
{
platform: "pumpfun";
chain: "solana";
tokenAddress: string;
txHash: string;
tokenName: string;
tokenSymbol: string;
creatorAddress: string;
timestamp: number;
}TokenInfo
{
platform: "pumpfun";
chain: "solana";
tokenAddress: string;
name: string;
symbol: string;
description?: string;
imageUrl?: string;
creatorAddress: string;
marketCap?: number;
price?: number;
priceUsd?: number;
totalSupply?: string;
holderCount?: number;
bondingCurveProgress?: number; // 0-100
isGraduated?: boolean;
liquidityUsd?: number;
volume24h?: number;
createdAt?: number;
}Build
npm run build # compile TypeScript to dist/License
MIT
