npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dex-skills

v0.1.3

Published

Unified SDK for DEX launchpad platforms across Solana, Base, BNB, and TRON

Readme

dex-skills

npm license TypeScript Solana Base BNB TRON website X

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-skills

Quick 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 launch

Token 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, migrationTarget

v0.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 wallet

PnL 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 holdings

Token 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 factors

Integration 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.js

Add 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 install

The 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.json

Environment 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