External API Integrations
Kaito AI Integration
Kaito AI provides advanced social intelligence and sentiment analysis for cryptocurrency projects. The integration enables real-time monitoring of social sentiment, trending topics, and market manipulation detection.
Setup and Authentication
API Configuration
const KaitoClient = require('@kaito/api-client');
const kaitoConfig = {
apiKey: process.env.KAITO_API_KEY,
baseURL: 'https://api.kaito.ai/v1',
timeout: 30000,
retryAttempts: 3,
rateLimitWindow: 60000, // 1 minute
maxRequestsPerWindow: 100
};
const kaito = new KaitoClient(kaitoConfig);
Authentication Setup
# Environment variables
export KAITO_API_KEY="your_kaito_api_key_here"
export KAITO_WEBHOOK_SECRET="your_webhook_secret"
export KAITO_RATE_LIMIT="100" # requests per minute
Core Integration Methods
Social Sentiment Analysis
class KaitoIntegration {
async getSocialSentiment(tokenAddress, timeframe = '24h') {
try {
const response = await kaito.social.getSentiment({
token: tokenAddress,
timeframe: timeframe,
sources: ['twitter', 'reddit', 'telegram', 'discord'],
includeMetrics: true
});
return {
overallSentiment: response.sentiment.overall,
sentimentScore: response.sentiment.score, // -1 to 1
confidence: response.confidence,
volume: response.metrics.mentionVolume,
engagement: response.metrics.engagementRate,
influencerActivity: response.influencers.activity,
manipulationFlags: response.flags.manipulation
};
} catch (error) {
throw new Error(`Kaito sentiment analysis failed: ${error.message}`);
}
}
async getTrendingTopics(category = 'defi') {
const trending = await kaito.trends.getTopics({
category: category,
limit: 50,
timeframe: '1h',
includeMetrics: true
});
return trending.map(topic => ({
keyword: topic.keyword,
volume: topic.volume,
sentiment: topic.sentiment,
growth: topic.growthRate,
relatedTokens: topic.tokens
}));
}
async detectManipulation(tokenAddress) {
const manipulation = await kaito.analysis.detectManipulation({
token: tokenAddress,
analysisDepth: 'comprehensive',
timeframe: '7d'
});
return {
manipulationScore: manipulation.score, // 0-100
indicators: manipulation.indicators,
patterns: manipulation.patterns,
confidence: manipulation.confidence,
recommendations: manipulation.recommendations
};
}
}
Error Handling and Rate Limiting
Rate Limit Management
class KaitoRateLimiter {
constructor(maxRequests = 100, windowMs = 60000) {
this.maxRequests = maxRequests;
this.windowMs = windowMs;
this.requests = [];
}
async checkRateLimit() {
const now = Date.now();
this.requests = this.requests.filter(time => now - time < this.windowMs);
if (this.requests.length >= this.maxRequests) {
const oldestRequest = Math.min(...this.requests);
const waitTime = this.windowMs - (now - oldestRequest);
await this.sleep(waitTime);
}
this.requests.push(now);
}
sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
}
Arkham Intelligence Setup
Arkham Intelligence provides wallet attribution, fund flow tracking, and entity identification services essential for comprehensive risk assessment.
Configuration
API Setup
import arkham
from arkham import ArkhamClient
import os
class ArkhamIntegration:
def __init__(self):
self.client = ArkhamClient(
api_key=os.getenv('ARKHAM_API_KEY'),
base_url='https://api.arkhamintelligence.com/v1',
timeout=60,
max_retries=3
)
async def initialize_connection(self):
"""Initialize and test Arkham connection"""
try:
status = await self.client.health_check()
if status.ok:
print("Arkham Intelligence connection established")
return True
else:
raise ConnectionError("Arkham API health check failed")
except Exception as e:
print(f"Arkham initialization failed: {e}")
return False
Wallet Attribution Services
Entity Identification
async def get_wallet_attribution(self, wallet_address):
"""
Get comprehensive wallet attribution and entity information
"""
try:
attribution = await self.client.wallets.get_attribution(
address=wallet_address,
include_labels=True,
include_risk_score=True,
include_activity_summary=True
)
return {
'entity_name': attribution.entity.name if attribution.entity else None,
'entity_type': attribution.entity.type,
'risk_score': attribution.risk_score,
'labels': attribution.labels,
'confidence': attribution.confidence,
'last_activity': attribution.activity.last_seen,
'transaction_volume': attribution.activity.volume_30d,
'associated_addresses': attribution.related_addresses,
'sanctions_check': attribution.compliance.sanctions_status,
'pep_check': attribution.compliance.pep_status
}
except Exception as e:
return {'error': f'Attribution lookup failed: {e}'}
async def track_fund_flows(self, from_address, to_address, min_amount=1000):
"""
Track fund flows between addresses with risk analysis
"""
flows = await self.client.transactions.trace_funds(
source=from_address,
destination=to_address,
min_value_usd=min_amount,
max_hops=5,
timeframe='30d'
)
return {
'direct_transfers': flows.direct,
'indirect_paths': flows.paths,
'total_volume': flows.summary.total_volume,
'risk_indicators': flows.risk_analysis.indicators,
'suspicious_patterns': flows.risk_analysis.patterns,
'aml_flags': flows.compliance.aml_alerts
}
Intelligence Gathering
Advanced Analytics
async def get_deployer_intelligence(self, contract_address):
"""
Comprehensive deployer analysis and risk assessment
"""
deployer_data = await self.client.contracts.get_deployer_analysis(
contract=contract_address,
analysis_depth='comprehensive'
)
return {
'deployer_address': deployer_data.deployer.address,
'deployer_history': deployer_data.deployer.deployment_history,
'risk_assessment': {
'overall_score': deployer_data.risk.overall_score,
'previous_rugs': deployer_data.risk.rug_pull_history,
'honeypot_deployments': deployer_data.risk.honeypot_count,
'successful_projects': deployer_data.risk.legitimate_projects
},
'funding_sources': deployer_data.funding.sources,
'associated_entities': deployer_data.entities.associated,
'geographical_indicators': deployer_data.location.indicators
}
Alchemy Configuration
Alchemy provides robust blockchain infrastructure with enhanced APIs for Ethereum and Polygon networks.
Setup Configuration
Multi-Chain Setup
const { Alchemy, Network } = require('alchemy-sdk');
class AlchemyIntegration {
constructor() {
this.configs = {
ethereum: {
apiKey: process.env.ALCHEMY_ETH_API_KEY,
network: Network.ETH_MAINNET,
maxRetries: 3,
requestTimeout: 30000
},
polygon: {
apiKey: process.env.ALCHEMY_POLYGON_API_KEY,
network: Network.MATIC_MAINNET,
maxRetries: 3,
requestTimeout: 30000
},
arbitrum: {
apiKey: process.env.ALCHEMY_ARB_API_KEY,
network: Network.ARB_MAINNET,
maxRetries: 3,
requestTimeout: 30000
}
};
this.clients = {};
this.initializeClients();
}
initializeClients() {
Object.keys(this.configs).forEach(network => {
this.clients[network] = new Alchemy(this.configs[network]);
});
}
}
Enhanced Token Analysis
Token Metadata and Analytics
async getTokenAnalytics(tokenAddress, network = 'ethereum') {
const alchemy = this.clients[network];
try {
// Get token metadata
const metadata = await alchemy.core.getTokenMetadata(tokenAddress);
// Get token balances for top holders
const topHolders = await alchemy.core.getOwnersForToken(tokenAddress, {
withTokenBalances: true,
pageSize: 100
});
// Get transfer history
const transfers = await alchemy.core.getAssetTransfers({
fromBlock: '0x0',
toBlock: 'latest',
contractAddresses: [tokenAddress],
category: ['erc20'],
withMetadata: true,
excludeZeroValue: true,
maxCount: 1000
});
// Analyze holder distribution
const holderAnalysis = this.analyzeHolderDistribution(topHolders);
return {
token: {
name: metadata.name,
symbol: metadata.symbol,
decimals: metadata.decimals,
totalSupply: metadata.totalSupply
},
holders: {
total: topHolders.totalCount,
distribution: holderAnalysis.distribution,
concentration: holderAnalysis.concentration,
whalePercentage: holderAnalysis.whalePercentage
},
activity: {
totalTransfers: transfers.transfers.length,
uniqueAddresses: this.getUniqueAddresses(transfers.transfers),
avgTransferValue: this.calculateAvgTransferValue(transfers.transfers),
recentActivity: this.getRecentActivity(transfers.transfers)
}
};
} catch (error) {
throw new Error(`Alchemy token analysis failed: ${error.message}`);
}
}
async getContractSecurity(contractAddress, network = 'ethereum') {
const alchemy = this.clients[network];
// Get contract code
const code = await alchemy.core.getCode(contractAddress);
// Get contract creation transaction
const creationTx = await this.getContractCreation(contractAddress, alchemy);
// Analyze contract functions
const functions = await this.analyzeContractFunctions(contractAddress, alchemy);
return {
hasCode: code !== '0x',
codeSize: code.length,
creator: creationTx?.from,
creationBlock: creationTx?.blockNumber,
creationTime: creationTx?.timestamp,
isVerified: await this.checkVerificationStatus(contractAddress),
functions: functions,
securityFlags: this.identifySecurityConcerns(functions)
};
}
WebSocket Real-Time Monitoring
Real-Time Event Monitoring
class AlchemyWebSocketManager {
constructor(network = 'ethereum') {
this.alchemy = new Alchemy(this.configs[network]);
this.subscriptions = new Map();
}
async subscribeToTokenTransfers(tokenAddress, callback) {
const filter = {
address: tokenAddress,
topics: [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' // Transfer event
]
};
const subscription = await this.alchemy.ws.on(filter, (log) => {
const transferData = this.parseTransferLog(log);
callback(transferData);
});
this.subscriptions.set(`token_${tokenAddress}`, subscription);
return subscription;
}
async subscribeToNewBlocks(callback) {
const subscription = await this.alchemy.ws.on('block', (blockNumber) => {
callback({ blockNumber, timestamp: Date.now() });
});
this.subscriptions.set('blocks', subscription);
return subscription;
}
parseTransferLog(log) {
return {
from: '0x' + log.topics[1].slice(26),
to: '0x' + log.topics[2].slice(26),
value: parseInt(log.data, 16),
blockNumber: log.blockNumber,
transactionHash: log.transactionHash,
timestamp: Date.now()
};
}
}
Solana RPC Services
Solana integration provides access to the Solana blockchain for monitoring SPL tokens and DeFi protocols.
RPC Configuration
Connection Setup
const { Connection, PublicKey, clusterApiUrl } = require('@solana/web3.js');
const { TOKEN_PROGRAM_ID, getAccount } = require('@solana/spl-token');
class SolanaIntegration {
constructor() {
this.connections = {
mainnet: new Connection(
process.env.SOLANA_RPC_URL || clusterApiUrl('mainnet-beta'),
{
commitment: 'confirmed',
wsEndpoint: process.env.SOLANA_WS_URL,
httpHeaders: {
'Authorization': `Bearer ${process.env.SOLANA_API_KEY}`
}
}
),
devnet: new Connection(clusterApiUrl('devnet'), 'confirmed'),
testnet: new Connection(clusterApiUrl('testnet'), 'confirmed')
};
this.network = 'mainnet';
}
getConnection(network = this.network) {
return this.connections[network];
}
}
Token Analysis
SPL Token Monitoring
async getSPLTokenInfo(mintAddress, network = 'mainnet') {
const connection = this.getConnection(network);
const mintPublicKey = new PublicKey(mintAddress);
try {
// Get mint information
const mintInfo = await connection.getParsedAccountInfo(mintPublicKey);
const mintData = mintInfo.value?.data?.parsed?.info;
// Get largest token accounts
const largestAccounts = await connection.getTokenLargestAccounts(mintPublicKey);
// Get supply information
const supplyInfo = await connection.getTokenSupply(mintPublicKey);
// Analyze holder distribution
const holderAnalysis = await this.analyzeSolanaHolders(mintAddress, connection);
return {
mint: mintAddress,
decimals: mintData?.decimals,
supply: {
total: supplyInfo.value.amount,
circulating: supplyInfo.value.uiAmount,
decimals: supplyInfo.value.decimals
},
authority: {
mintAuthority: mintData?.mintAuthority,
freezeAuthority: mintData?.freezeAuthority,
isImmutable: !mintData?.mintAuthority
},
holders: holderAnalysis,
liquidity: await this.getSolanaLiquidityInfo(mintAddress, connection)
};
} catch (error) {
throw new Error(`Solana token analysis failed: ${error.message}`);
}
}
async analyzeSolanaHolders(mintAddress, connection) {
const mintPublicKey = new PublicKey(mintAddress);
// Get all token accounts for this mint
const tokenAccounts = await connection.getProgramAccounts(TOKEN_PROGRAM_ID, {
filters: [
{ dataSize: 165 }, // Token account data size
{ memcmp: { offset: 0, bytes: mintAddress } } // Filter by mint
]
});
const holders = [];
for (const account of tokenAccounts) {
try {
const accountInfo = await getAccount(connection, account.pubkey);
if (accountInfo.amount > 0) {
holders.push({
address: account.pubkey.toString(),
balance: accountInfo.amount.toString(),
owner: accountInfo.owner.toString()
});
}
} catch (error) {
// Skip invalid accounts
continue;
}
}
// Sort by balance
holders.sort((a, b) => BigInt(b.balance) - BigInt(a.balance));
return {
totalHolders: holders.length,
topHolders: holders.slice(0, 20),
concentration: this.calculateConcentration(holders)
};
}
Real-Time Monitoring
WebSocket Subscriptions
class SolanaWebSocketManager {
constructor(network = 'mainnet') {
this.connection = new Connection(
process.env.SOLANA_WS_URL || clusterApiUrl('mainnet-beta'),
{ commitment: 'confirmed' }
);
this.subscriptions = new Map();
}
async subscribeToAccountChanges(accountAddress, callback) {
const publicKey = new PublicKey(accountAddress);
const subscriptionId = this.connection.onAccountChange(
publicKey,
(accountInfo, context) => {
callback({
account: accountAddress,
lamports: accountInfo.lamports,
owner: accountInfo.owner.toString(),
executable: accountInfo.executable,
rentEpoch: accountInfo.rentEpoch,
data: accountInfo.data,
slot: context.slot
});
},
'confirmed'
);
this.subscriptions.set(accountAddress, subscriptionId);
return subscriptionId;
}
async subscribeToTokenAccountChanges(mintAddress, callback) {
const programId = TOKEN_PROGRAM_ID;
const subscriptionId = this.connection.onProgramAccountChange(
programId,
(keyedAccountInfo, context) => {
// Parse token account data
const accountData = this.parseTokenAccountData(keyedAccountInfo.accountInfo.data);
if (accountData.mint === mintAddress) {
callback({
account: keyedAccountInfo.accountId.toString(),
mint: accountData.mint,
owner: accountData.owner,
amount: accountData.amount,
slot: context.slot
});
}
},
'confirmed',
[
{ memcmp: { offset: 0, bytes: mintAddress } }
]
);
return subscriptionId;
}
}
Third-Party Data Sources
CoinGecko Integration
Market Data Provider
const CoinGecko = require('coingecko-api');
class CoinGeckoIntegration {
constructor() {
this.client = new CoinGecko();
this.rateLimiter = new RateLimiter(50, 60000); // 50 requests per minute
}
async getTokenPrice(contractAddress, vsCurrency = 'usd') {
await this.rateLimiter.checkRateLimit();
try {
const response = await this.client.simple.fetchTokenPrice({
contract_addresses: contractAddress,
vs_currencies: vsCurrency,
include_market_cap: true,
include_24hr_vol: true,
include_24hr_change: true,
include_last_updated_at: true
});
return response.data[contractAddress.toLowerCase()];
} catch (error) {
throw new Error(`CoinGecko price fetch failed: ${error.message}`);
}
}
async getMarketData(coinId, days = 7) {
await this.rateLimiter.checkRateLimit();
const marketData = await this.client.coins.fetchMarketChart(coinId, {
days: days,
vs_currency: 'usd'
});
return {
prices: marketData.data.prices,
market_caps: marketData.data.market_caps,
total_volumes: marketData.data.total_volumes
};
}
}
DeFiLlama Integration
TVL and Protocol Data
class DeFiLlamaIntegration {
constructor() {
this.baseURL = 'https://api.llama.fi';
this.timeout = 30000;
}
async getProtocolTVL(protocolSlug) {
try {
const response = await fetch(`${this.baseURL}/protocol/${protocolSlug}`, {
timeout: this.timeout
});
const data = await response.json();
return {
name: data.name,
symbol: data.symbol,
tvl: data.tvl,
chainTvls: data.chainTvls,
change_1d: data.change_1d,
change_7d: data.change_7d,
change_1m: data.change_1m,
mcap: data.mcap,
category: data.category
};
} catch (error) {
throw new Error(`DeFiLlama TVL fetch failed: ${error.message}`);
}
}
async getChainTVL(chain = 'ethereum') {
const response = await fetch(`${this.baseURL}/v2/historicalChainTvl/${chain}`);
const data = await response.json();
return data.map(entry => ({
date: entry.date,
tvl: entry.tvl
}));
}
}
Last updated