edwin-sdk
Version:
SDK for integrating AI agents with DeFi protocols
120 lines (109 loc) • 3.93 kB
text/typescript
import { SupportedChain } from '../../core/types';
import edwinLogger from '../../utils/logger';
import { AgentParameters } from './parameters';
interface AgentResponse {
ok: {
agentName: string;
contracts: {
chain: number;
contractAddress: string;
}[];
twitterUsernames: string[];
mindshare: number;
mindshareDeltaPercent: number;
marketCap: number;
marketCapDeltaPercent: number;
price: number;
priceDeltaPercent: number;
liquidity: number;
volume24Hours: number;
volume24HoursDeltaPercent: number;
holdersCount: number;
holdersCountDeltaPercent: number;
averageImpressionsCount: number;
averageImpressionsCountDeltaPercent: number;
averageEngagementsCount: number;
averageEngagementsCountDeltaPercent: number;
followersCount: number;
smartFollowersCount: number;
topTweets: {
tweetUrl: string;
tweetAuthorProfileImageUrl: string;
tweetAuthorDisplayName: string;
smartEngagementPoints: number;
impressionsCount: number;
}[];
};
success: boolean;
error: string | null;
}
interface GetAgentsPagedResponse {
ok: {
data: AgentResponse['ok'][];
currentPage: number;
totalPages: number;
totalCount: number;
};
success: boolean;
error: string | null;
}
export class CookieSwarmClient {
private apiKey: string;
private baseUrl: string;
supportedChains: SupportedChain[] = ['base'];
constructor(apiKey: string) {
this.apiKey = apiKey;
this.baseUrl = 'https://api.cookie.fun';
}
private async fetch<T>(endpoint: string): Promise<T> {
const response = await fetch(`${this.baseUrl}${endpoint}`, {
headers: {
'x-api-key': this.apiKey,
},
method: 'GET',
});
if (!response.ok) {
edwinLogger.error('API Error:', {
status: response.status,
statusText: response.statusText,
url: response.url,
});
throw new Error(`API request failed: ${response.statusText}`);
}
return response.json();
}
async getAgentByTwitter(params: AgentParameters): Promise<string> {
// Verify interval is valid
if (!['_3Days', '_7Days'].includes(params.interval)) {
throw new Error('Invalid interval');
}
// Note the trailing slash after username
const response = await this.fetch<AgentResponse>(
`/v2/agents/twitterUsername/${params.username}/?interval=${params.interval}`
);
return JSON.stringify(response);
}
async getAgentByContract(params: AgentParameters): Promise<string> {
// Verify interval is valid and cast to Interval
if (!['_3Days', '_7Days'].includes(params.interval)) {
throw new Error('Invalid interval');
}
const response = await this.fetch<AgentResponse>(
`/v2/agents/contractAddress/${params.contractAddress}?interval=${params.interval}`
);
return JSON.stringify(response);
}
async getAgentsPaged(params: AgentParameters): Promise<string> {
// Verify interval is valid and cast to Interval
if (!['_3Days', '_7Days'].includes(params.interval)) {
throw new Error('Invalid interval');
}
if (params.pageSize && (params.pageSize < 1 || params.pageSize > 25)) {
throw new Error('Page size must be between 1 and 25');
}
const response = await this.fetch<GetAgentsPagedResponse>(
`/v2/agents/agentsPaged?interval=${params.interval}&page=${params.page}&pageSize=${params.pageSize}`
);
return JSON.stringify(response);
}
}