dexscreener-wrapper
Version:
A lightweight TypeScript wrapper for the DexScreener API
214 lines (213 loc) • 7.12 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DexScreener = void 0;
const axios_1 = __importDefault(require("axios"));
/** Base URL for the DexScreener API */
const DEXSCREENER_BASE_URL = 'https://api.dexscreener.com';
/**
* DexScreener API wrapper
* Provides methods to interact with the DexScreener API for retrieving token and pair information
*
* @example
* ```typescript
* const dexscreener = new DexScreener();
*
* // Search for pairs
* const pairs = await dexscreener.searchPairs('SOL', 'solana');
*
* // Get specific pair
* const pair = await dexscreener.getPair('pairAddress', 'solana');
*
* // Get token profiles
* const profiles = await dexscreener.getTokenProfiles();
* ```
*/
class DexScreener {
constructor() {
this.baseUrl = DEXSCREENER_BASE_URL;
}
/**
* Get the latest token profiles
* Rate limit: 60 requests per minute
*
* @returns Promise<TokenProfile[]> Array of token profiles
* @throws Error if the API request fails
*
* @example
* ```typescript
* const profiles = await dexscreener.getTokenProfiles();
* console.log(profiles[0].header); // "Solana (SOL)"
* ```
*/
async getTokenProfiles() {
try {
const response = await axios_1.default.get(`${this.baseUrl}/token-profiles/latest/v1`);
return response.data;
}
catch (error) {
console.error('DexScreener token profiles error:', error);
throw error;
}
}
/**
* Get the latest boosted tokens
* Rate limit: 60 requests per minute
*
* @returns Promise<TokenBoost[]> Array of token boosts
* @throws Error if the API request fails
*
* @example
* ```typescript
* const boosts = await dexscreener.getLatestBoosts();
* console.log(boosts[0].totalAmount); // 1000
* ```
*/
async getLatestBoosts() {
try {
const response = await axios_1.default.get(`${this.baseUrl}/token-boosts/latest/v1`);
return response.data;
}
catch (error) {
console.error('DexScreener token boosts error:', error);
throw error;
}
}
/**
* Get the tokens with most active boosts
* Rate limit: 60 requests per minute
*
* @returns Promise<TokenBoost[]> Array of token boosts
* @throws Error if the API request fails
*
* @example
* ```typescript
* const topBoosts = await dexscreener.getTopBoosts();
* console.log(topBoosts[0].totalAmount); // 5000
* ```
*/
async getTopBoosts() {
try {
const response = await axios_1.default.get(`${this.baseUrl}/token-boosts/top/v1`);
return response.data;
}
catch (error) {
console.error('DexScreener top boosts error:', error);
throw error;
}
}
/**
* Check orders paid for of token
* Rate limit: 60 requests per minute
*
* @param chainId The chain ID (e.g., 'solana', 'ethereum')
* @param tokenAddress The token address to get orders for
* @returns Promise<TokenOrder[]> Array of token orders
* @throws Error if the API request fails
*
* @example
* ```typescript
* const orders = await dexscreener.getTokenOrders('solana', 'So11111111111111111111111111111111111111112');
* console.log(orders[0].status); // "processing"
* ```
*/
async getTokenOrders(chainId, tokenAddress) {
try {
const response = await axios_1.default.get(`${this.baseUrl}/orders/v1/${chainId}/${tokenAddress}`);
return response.data;
}
catch (error) {
console.error('DexScreener orders error:', error);
throw error;
}
}
/**
* Search for pairs matching query
* Rate limit: 300 requests per minute
*
* @param query The search query (token address, symbol, or name)
* @param chainId Optional chain ID to filter results
* @returns Promise<DexScreenerPair[]> Array of matching pairs
* @throws Error if the API request fails
*
* @example
* ```typescript
* // Search by token symbol
* const solPairs = await dexscreener.searchPairs('SOL', 'solana');
*
* // Search by token address
* const pairs = await dexscreener.searchPairs('So11111111111111111111111111111111111111112');
* ```
*/
async searchPairs(query, chainId) {
try {
const endpoint = chainId
? `/latest/dex/search?q=${query}&chain=${chainId}`
: `/latest/dex/search?q=${query}`;
const response = await axios_1.default.get(`${this.baseUrl}${endpoint}`);
return response.data.pairs;
}
catch (error) {
console.error('DexScreener search error:', error);
throw error;
}
}
/**
* Get pairs by token address
* Rate limit: 300 requests per minute
*
* @param tokenAddress The token address to get pairs for
* @param chainId The chain ID (required)
* @returns Promise<DexScreenerPair[]> Array of pairs
* @throws Error if the API request fails or chainId is not provided
*
* @example
* ```typescript
* const pairs = await dexscreener.getPairs('So11111111111111111111111111111111111111112', 'solana');
* console.log(pairs[0].priceUsd); // "20.50"
* ```
*/
async getPairs(tokenAddress, chainId) {
try {
if (!chainId) {
throw new Error('chainId is required for getPairs');
}
const response = await axios_1.default.get(`${this.baseUrl}/latest/dex/search?q=${tokenAddress}&chain=${chainId}`);
return response.data.pairs;
}
catch (error) {
console.error('DexScreener getPairs error:', error);
throw error;
}
}
/**
* Get a specific pair by its address
* Rate limit: 300 requests per minute
*
* @param pairAddress The pair address to get
* @param chainId The chain ID (required)
* @returns Promise<DexScreenerPair | null> The pair information or null if not found
*
* @example
* ```typescript
* const pair = await dexscreener.getPair('JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN', 'solana');
* if (pair) {
* console.log(pair.baseToken.symbol); // "SOL"
* console.log(pair.quoteToken.symbol); // "USDC"
* }
* ```
*/
async getPair(pairAddress, chainId) {
try {
const response = await axios_1.default.get(`${this.baseUrl}/latest/dex/pairs/${chainId}/${pairAddress}`);
return response.data.pairs[0] || null;
}
catch (error) {
console.error('DexScreener getPair error:', error);
return null;
}
}
}
exports.DexScreener = DexScreener;