|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const API_REGISTRY = { |
|
|
|
|
|
|
|
|
|
|
|
market: { |
|
|
coingecko: { |
|
|
name: 'CoinGecko', |
|
|
url: 'https://api.coingecko.com/api/v3', |
|
|
auth: { type: 'none' }, |
|
|
endpoints: { |
|
|
prices: '/simple/price?ids={ids}&vs_currencies=usd,eur,gbp', |
|
|
markets: '/coins/markets?vs_currency=usd&per_page=250&order=market_cap_desc', |
|
|
trending: '/search/trending', |
|
|
chart: '/coins/{id}/market_chart?vs_currency=usd&days={days}', |
|
|
global: '/global' |
|
|
}, |
|
|
rateLimit: '10-50 calls/min', |
|
|
priority: 1 |
|
|
}, |
|
|
binance: { |
|
|
name: 'Binance', |
|
|
url: 'https://api.binance.com/api/v3', |
|
|
auth: { type: 'none' }, |
|
|
endpoints: { |
|
|
ticker24h: '/ticker/24hr?symbol={symbol}', |
|
|
price: '/ticker/price?symbol={symbol}', |
|
|
klines: '/klines?symbol={symbol}&interval={interval}&limit=1000', |
|
|
exchangeInfo: '/exchangeInfo' |
|
|
}, |
|
|
rateLimit: '1200 requests per minute', |
|
|
priority: 1 |
|
|
}, |
|
|
coinmarketcap: { |
|
|
name: 'CoinMarketCap', |
|
|
url: 'https://pro-api.coinmarketcap.com/v1', |
|
|
auth: { type: 'api_key', param_name: 'X-CMC_PRO_API_KEY' }, |
|
|
key: '04cf4b5b-9868-465c-8ba0-9f2e78c92eb1', |
|
|
endpoints: { |
|
|
latest: '/cryptocurrency/quotes/latest?symbol={symbol}&convert=USD', |
|
|
listings: '/cryptocurrency/listings/latest?limit=100&convert=USD', |
|
|
map: '/cryptocurrency/map' |
|
|
}, |
|
|
rateLimit: '333 calls/day (free)', |
|
|
priority: 2 |
|
|
}, |
|
|
cryptoCompare: { |
|
|
name: 'CryptoCompare', |
|
|
url: 'https://min-api.cryptocompare.com/data', |
|
|
auth: { type: 'none' }, |
|
|
endpoints: { |
|
|
price: '/pricemulti?fsyms={symbols}&tsyms=USD,EUR', |
|
|
historical: '/histoday?fsym={from}&tsym={to}&limit=2000', |
|
|
mining: '/mining/equipment' |
|
|
}, |
|
|
rateLimit: '200 req/min', |
|
|
priority: 2 |
|
|
}, |
|
|
coinpaprika: { |
|
|
name: 'CoinPaprika', |
|
|
url: 'https://api.coinpaprika.com/v1', |
|
|
auth: { type: 'none' }, |
|
|
endpoints: { |
|
|
tickers: '/tickers', |
|
|
coins: '/coins', |
|
|
coin: '/coins/{id}', |
|
|
markets: '/coins/{id}/markets' |
|
|
}, |
|
|
rateLimit: 'Unlimited', |
|
|
priority: 2 |
|
|
}, |
|
|
coincap: { |
|
|
name: 'CoinCap', |
|
|
url: 'https://api.coincap.io/v2', |
|
|
auth: { type: 'none' }, |
|
|
endpoints: { |
|
|
assets: '/assets?limit=2000', |
|
|
asset: '/assets/{id}', |
|
|
history: '/assets/{id}/history?interval=d1&limit=365', |
|
|
markets: '/markets?exchangeId={id}&limit=2000' |
|
|
}, |
|
|
rateLimit: 'Unlimited', |
|
|
priority: 1 |
|
|
} |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
explorers: { |
|
|
etherscan: { |
|
|
name: 'Etherscan', |
|
|
url: 'https://api.etherscan.io/api', |
|
|
auth: { type: 'api_key', param_name: 'apikey' }, |
|
|
key: 'SZHYFZK2RR8H9TIMJBVW54V4H81K2Z2KR2', |
|
|
chain: 'ethereum', |
|
|
endpoints: { |
|
|
balance: '?module=account&action=balance&address={address}', |
|
|
transactions: '?module=account&action=txlist&address={address}', |
|
|
gasPrice: '?module=gastracker&action=gasoracle', |
|
|
tokenInfo: '?module=token&action=tokeninfo&contractaddress={contract}' |
|
|
}, |
|
|
rateLimit: '5 calls/sec', |
|
|
priority: 1 |
|
|
}, |
|
|
bscscan: { |
|
|
name: 'BscScan', |
|
|
url: 'https://api.bscscan.com/api', |
|
|
auth: { type: 'api_key', param_name: 'apikey' }, |
|
|
key: 'K62RKHGXTDCG53RU4MCG6XABIMJKTN19IT', |
|
|
chain: 'bsc', |
|
|
endpoints: { |
|
|
balance: '?module=account&action=balance&address={address}', |
|
|
tokenBalance: '?module=account&action=tokenbalance&address={address}' |
|
|
}, |
|
|
priority: 1 |
|
|
}, |
|
|
polygonscan: { |
|
|
name: 'PolygonScan', |
|
|
url: 'https://api.polygonscan.com/api', |
|
|
auth: { type: 'api_key', param_name: 'apikey' }, |
|
|
chain: 'polygon', |
|
|
endpoints: { |
|
|
balance: '?module=account&action=balance&address={address}' |
|
|
}, |
|
|
priority: 1 |
|
|
}, |
|
|
trongrid: { |
|
|
name: 'TronGrid', |
|
|
url: 'https://api.trongrid.io', |
|
|
auth: { type: 'none' }, |
|
|
chain: 'tron', |
|
|
endpoints: { |
|
|
account: '/wallet/getaccount', |
|
|
balance: '/wallet/getbalance', |
|
|
transactions: '/wallet/gettransactioncount' |
|
|
}, |
|
|
priority: 1 |
|
|
}, |
|
|
ethplorer: { |
|
|
name: 'Ethplorer', |
|
|
url: 'https://api.ethplorer.io', |
|
|
auth: { type: 'api_key', param_name: 'apiKey', key: 'freekey' }, |
|
|
chain: 'ethereum', |
|
|
endpoints: { |
|
|
address: '/getAddressInfo/{address}?apiKey=freekey', |
|
|
token: '/getTokenInfo/{token}?apiKey=freekey', |
|
|
tokenHistory: '/getTokenHistory/{token}?apiKey=freekey' |
|
|
}, |
|
|
priority: 2 |
|
|
} |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
news: { |
|
|
cryptopanic: { |
|
|
name: 'CryptoPanic', |
|
|
url: 'https://cryptopanic.com/api/v1', |
|
|
auth: { type: 'none' }, |
|
|
endpoints: { |
|
|
posts: '/posts/?auth_token={token}', |
|
|
currency: '/posts/?currencies={symbol}&auth_token={token}' |
|
|
}, |
|
|
priority: 1 |
|
|
}, |
|
|
newsapi: { |
|
|
name: 'NewsAPI', |
|
|
url: 'https://newsapi.org/v2', |
|
|
auth: { type: 'api_key', param_name: 'apiKey' }, |
|
|
key: 'pub_346789abc123def456789ghi012345jkl', |
|
|
endpoints: { |
|
|
everything: '/everything?q={query}&sortBy=publishedAt&apiKey={key}', |
|
|
headlines: '/top-headlines?category=business&apiKey={key}' |
|
|
}, |
|
|
priority: 1 |
|
|
}, |
|
|
cryptocontrol: { |
|
|
name: 'CryptoControl', |
|
|
url: 'https://cryptocontrol.io/api/v1/public', |
|
|
auth: { type: 'none' }, |
|
|
endpoints: { |
|
|
local: '/news/local?language=EN', |
|
|
latest: '/news?latest=true' |
|
|
}, |
|
|
priority: 2 |
|
|
}, |
|
|
coindesk: { |
|
|
name: 'CoinDesk RSS', |
|
|
url: 'https://www.coindesk.com/arc/outboundfeeds/rss/', |
|
|
auth: { type: 'none' }, |
|
|
type: 'rss', |
|
|
priority: 2 |
|
|
} |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sentiment: { |
|
|
fearAndGreed: { |
|
|
name: 'Fear & Greed Index', |
|
|
url: 'https://api.alternative.me/fng/', |
|
|
auth: { type: 'none' }, |
|
|
endpoints: { |
|
|
latest: '?limit=1', |
|
|
history: '?limit=30', |
|
|
date: '?date={date}&date_format=world' |
|
|
}, |
|
|
priority: 1 |
|
|
}, |
|
|
lunarcrush: { |
|
|
name: 'LunarCrush', |
|
|
url: 'https://api.lunarcrush.com/v2', |
|
|
auth: { type: 'api_key', param_name: 'key' }, |
|
|
endpoints: { |
|
|
assets: '?data=assets&key={key}', |
|
|
market: '?data=market&key={key}', |
|
|
influencers: '?data=influencers&key={key}' |
|
|
}, |
|
|
priority: 1 |
|
|
}, |
|
|
santiment: { |
|
|
name: 'Santiment', |
|
|
url: 'https://api.santiment.net/graphql', |
|
|
auth: { type: 'graphql' }, |
|
|
endpoints: { |
|
|
sentiment: 'query sentiment' |
|
|
}, |
|
|
priority: 2 |
|
|
}, |
|
|
cryptoquant: { |
|
|
name: 'CryptoQuant', |
|
|
url: 'https://api.cryptoquant.com/v1', |
|
|
auth: { type: 'api_key' }, |
|
|
endpoints: { |
|
|
onchain: '/on-chain/all/transactions' |
|
|
}, |
|
|
priority: 2 |
|
|
} |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
aiModels: { |
|
|
sentiment: [ |
|
|
{ |
|
|
id: 'crypto_bert', |
|
|
name: 'CryptoBERT', |
|
|
url: 'kk08/CryptoBERT', |
|
|
task: 'sentiment', |
|
|
language: 'cryptocurrency' |
|
|
}, |
|
|
{ |
|
|
id: 'finbert', |
|
|
name: 'FinBERT', |
|
|
url: 'ProsusAI/finbert', |
|
|
task: 'sentiment', |
|
|
language: 'financial' |
|
|
}, |
|
|
{ |
|
|
id: 'twitter_roberta', |
|
|
name: 'Twitter RoBERTa', |
|
|
url: 'cardiffnlp/twitter-roberta-base-sentiment-latest', |
|
|
task: 'sentiment', |
|
|
language: 'social' |
|
|
}, |
|
|
{ |
|
|
id: 'fintwitbert', |
|
|
name: 'FinTwitBERT', |
|
|
url: 'StephanAkkerman/FinTwitBERT-sentiment', |
|
|
task: 'sentiment', |
|
|
language: 'financial-social' |
|
|
} |
|
|
], |
|
|
trading: [ |
|
|
{ |
|
|
id: 'crypto_trader_lm', |
|
|
name: 'CryptoTrader LM', |
|
|
url: 'agarkovv/CryptoTrader-LM', |
|
|
task: 'trading-signals' |
|
|
} |
|
|
], |
|
|
summarization: [ |
|
|
{ |
|
|
id: 'crypto_news_summarizer', |
|
|
name: 'Crypto News Summarizer', |
|
|
url: 'FurkanGozukara/Crypto-Financial-News-Summarizer', |
|
|
task: 'summarization' |
|
|
} |
|
|
], |
|
|
generation: [ |
|
|
{ |
|
|
id: 'crypto_gpt', |
|
|
name: 'Crypto GPT O3 Mini', |
|
|
url: 'OpenC/crypto-gpt-o3-mini', |
|
|
task: 'text-generation' |
|
|
} |
|
|
] |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
whaleTracking: { |
|
|
whaleAlert: { |
|
|
name: 'Whale Alert', |
|
|
url: 'https://api.whale-alert.io/v1', |
|
|
auth: { type: 'api_key', param_name: 'api_key' }, |
|
|
endpoints: { |
|
|
transactions: '/transactions?api_key={key}&min_value=1000000', |
|
|
transactionsByTime: '/transactions?api_key={key}&start={timestamp}' |
|
|
}, |
|
|
priority: 1 |
|
|
}, |
|
|
nansen: { |
|
|
name: 'Nansen', |
|
|
url: 'https://api.nansen.ai/v1', |
|
|
auth: { type: 'api_key' }, |
|
|
endpoints: { |
|
|
smartMoney: '/smart-money', |
|
|
whaleWatching: '/whale-watching' |
|
|
}, |
|
|
priority: 2 |
|
|
} |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
onchain: { |
|
|
glassnode: { |
|
|
name: 'Glassnode', |
|
|
url: 'https://api.glassnode.com/v1', |
|
|
auth: { type: 'api_key', param_name: 'api_key' }, |
|
|
endpoints: { |
|
|
addresses: '/metrics/addresses/active_count', |
|
|
transactions: '/metrics/transactions/count', |
|
|
volume: '/metrics/spot_trading_volume' |
|
|
}, |
|
|
priority: 1 |
|
|
}, |
|
|
covalent: { |
|
|
name: 'Covalent', |
|
|
url: 'https://api.covalenthq.com/v1', |
|
|
auth: { type: 'api_key', param_name: 'key' }, |
|
|
endpoints: { |
|
|
balances: '/{chainId}/address/{address}/balances_v2/?key={key}', |
|
|
tokenHolders: '/{chainId}/tokens/{address}/token_holders/?key={key}', |
|
|
transactions: '/{chainId}/address/{address}/transactions_v2/?key={key}' |
|
|
}, |
|
|
priority: 1 |
|
|
}, |
|
|
theGraph: { |
|
|
name: 'The Graph', |
|
|
url: 'https://api.thegraph.com/subgraphs', |
|
|
auth: { type: 'none' }, |
|
|
endpoints: { |
|
|
uniswap: '/graphql?query={uniswap-query}' |
|
|
}, |
|
|
priority: 2 |
|
|
}, |
|
|
bitquery: { |
|
|
name: 'Bitquery', |
|
|
url: 'https://graphql.bitquery.io', |
|
|
auth: { type: 'graphql' }, |
|
|
endpoints: { |
|
|
trades: 'query trades' |
|
|
}, |
|
|
priority: 2 |
|
|
} |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
defi: { |
|
|
uniswap: { |
|
|
name: 'Uniswap', |
|
|
url: 'https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3', |
|
|
type: 'subgraph' |
|
|
}, |
|
|
aave: { |
|
|
name: 'Aave', |
|
|
url: 'https://api.thegraph.com/subgraphs/name/aave/protocol-v2', |
|
|
type: 'subgraph' |
|
|
}, |
|
|
curve: { |
|
|
name: 'Curve', |
|
|
url: 'https://api.curve.fi/api/pools' |
|
|
}, |
|
|
yearn: { |
|
|
name: 'Yearn', |
|
|
url: 'https://ydaemon.yearn.fi/1/vaults' |
|
|
} |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rpc: { |
|
|
ethereum: [ |
|
|
{ |
|
|
name: 'Infura', |
|
|
url: 'https://mainnet.infura.io/v3/{PROJECT_ID}', |
|
|
priority: 1 |
|
|
}, |
|
|
{ |
|
|
name: 'Alchemy', |
|
|
url: 'https://eth-mainnet.g.alchemy.com/v2/{API_KEY}', |
|
|
priority: 1 |
|
|
}, |
|
|
{ |
|
|
name: 'Ankr', |
|
|
url: 'https://rpc.ankr.com/eth', |
|
|
priority: 2 |
|
|
}, |
|
|
{ |
|
|
name: 'PublicNode', |
|
|
url: 'https://ethereum.publicnode.com', |
|
|
priority: 2 |
|
|
}, |
|
|
{ |
|
|
name: 'Cloudflare', |
|
|
url: 'https://cloudflare-eth.com', |
|
|
priority: 3 |
|
|
} |
|
|
], |
|
|
bsc: [ |
|
|
{ |
|
|
name: 'BSC Official', |
|
|
url: 'https://bsc-dataseed.binance.org', |
|
|
priority: 1 |
|
|
}, |
|
|
{ |
|
|
name: 'Ankr', |
|
|
url: 'https://rpc.ankr.com/bsc', |
|
|
priority: 1 |
|
|
}, |
|
|
{ |
|
|
name: 'PublicNode', |
|
|
url: 'https://bsc-rpc.publicnode.com', |
|
|
priority: 2 |
|
|
} |
|
|
], |
|
|
polygon: [ |
|
|
{ |
|
|
name: 'Polygon Official', |
|
|
url: 'https://polygon-rpc.com', |
|
|
priority: 1 |
|
|
}, |
|
|
{ |
|
|
name: 'Ankr', |
|
|
url: 'https://rpc.ankr.com/polygon', |
|
|
priority: 1 |
|
|
}, |
|
|
{ |
|
|
name: 'PublicNode', |
|
|
url: 'https://polygon-bor-rpc.publicnode.com', |
|
|
priority: 2 |
|
|
} |
|
|
], |
|
|
tron: [ |
|
|
{ |
|
|
name: 'TronGrid', |
|
|
url: 'https://api.trongrid.io', |
|
|
priority: 1 |
|
|
}, |
|
|
{ |
|
|
name: 'TronStack', |
|
|
url: 'https://api.tronstack.io', |
|
|
priority: 2 |
|
|
} |
|
|
] |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
corsProxies: [] |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const DATA_SOURCE_CATEGORIES = [ |
|
|
{ |
|
|
name: 'Market Data', |
|
|
count: 6, |
|
|
sources: ['CoinGecko', 'Binance', 'CoinMarketCap', 'CryptoCompare', 'CoinPaprika', 'CoinCap'] |
|
|
}, |
|
|
{ |
|
|
name: 'Blockchain Explorers', |
|
|
count: 5, |
|
|
sources: ['Etherscan', 'BscScan', 'PolygonScan', 'TronGrid', 'Ethplorer'] |
|
|
}, |
|
|
{ |
|
|
name: 'News & Media', |
|
|
count: 4, |
|
|
sources: ['CryptoPanic', 'NewsAPI', 'CryptoControl', 'CoinDesk RSS'] |
|
|
}, |
|
|
{ |
|
|
name: 'Sentiment Analysis', |
|
|
count: 4, |
|
|
sources: ['Fear & Greed', 'LunarCrush', 'Santiment', 'CryptoQuant'] |
|
|
}, |
|
|
{ |
|
|
name: 'AI/ML Models', |
|
|
count: 10, |
|
|
sources: ['CryptoBERT', 'FinBERT', 'Twitter RoBERTa', 'HuggingFace'] |
|
|
}, |
|
|
{ |
|
|
name: 'On-Chain Analytics', |
|
|
count: 4, |
|
|
sources: ['Glassnode', 'Covalent', 'The Graph', 'Bitquery'] |
|
|
}, |
|
|
{ |
|
|
name: 'Whale Tracking', |
|
|
count: 2, |
|
|
sources: ['Whale Alert', 'Nansen'] |
|
|
}, |
|
|
{ |
|
|
name: 'DeFi Protocols', |
|
|
count: 4, |
|
|
sources: ['Uniswap', 'Aave', 'Curve', 'Yearn'] |
|
|
}, |
|
|
{ |
|
|
name: 'RPC Nodes', |
|
|
count: 20, |
|
|
sources: ['Infura', 'Alchemy', 'Ankr', 'PublicNode', 'Cloudflare'] |
|
|
} |
|
|
]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function getTotalEndpointsCount() { |
|
|
let count = 0; |
|
|
|
|
|
|
|
|
for (const provider of Object.values(API_REGISTRY.market)) { |
|
|
if (provider.endpoints) count += Object.keys(provider.endpoints).length; |
|
|
} |
|
|
for (const provider of Object.values(API_REGISTRY.explorers)) { |
|
|
if (provider.endpoints) count += Object.keys(provider.endpoints).length; |
|
|
} |
|
|
for (const provider of Object.values(API_REGISTRY.news)) { |
|
|
if (provider.endpoints) count += Object.keys(provider.endpoints).length; |
|
|
} |
|
|
for (const provider of Object.values(API_REGISTRY.sentiment)) { |
|
|
if (provider.endpoints) count += Object.keys(provider.endpoints).length; |
|
|
} |
|
|
|
|
|
return count; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function getProvider(category, providerName) { |
|
|
const cat = API_REGISTRY[category]; |
|
|
if (!cat) return null; |
|
|
return cat[providerName] || null; |
|
|
} |
|
|
|
|
|
export default API_REGISTRY; |
|
|
|