dritan-sdk 0.1.2 → 0.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -59,6 +59,15 @@ const agg = await client.getTokenAggregated("So111111111111111111111111111111111
59
59
  console.log(agg.price.priceUsd, agg.metadata?.name, agg.risk?.top10, agg.bondingCurvePercent);
60
60
  ```
61
61
 
62
+ ### Deployer stats
63
+
64
+ Given a token mint, returns the deployer/creator wallet along with how many tokens they've launched that have completed bonding (often called "graduated").
65
+
66
+ ```ts
67
+ const stats = await client.getDeployerStats("So11111111111111111111111111111111111111112");
68
+ console.log(stats.deployer, stats.bonded, stats.nonBonded);
69
+ ```
70
+
62
71
  ## Swap
63
72
 
64
73
  Dritan can build an unsigned swap transaction (base64) for you to sign, then you broadcast the signed transaction.
@@ -88,10 +97,10 @@ console.log(sent.signature);
88
97
 
89
98
  ## Websocket streams
90
99
 
91
- Connect to a dex stream (for example `pumpamm`, `pumpfun`, `launchlab`, `dbc`, `dlmm`, `damm2`, `damm1`).
100
+ Connect to a dex stream (for example `pumpamm` (PumpSwap), `pumpfun` (Pump.fun), `moonit` (Moonit), `launchlab` (Raydium LaunchLab), `amm`, `cpmm`, `clmm`, `orca` (Orca Whirlpools), `dbc` (Meteora DBC), `dlmm`, `damm2`, `damm1`).
92
101
 
93
102
  ```ts
94
- const stream = client.streamDex("pumpamm", {
103
+ const stream = client.streamDex("amm", {
95
104
  onMessage: (event) => {
96
105
  // `event` is parsed JSON when possible, otherwise raw string.
97
106
  console.log(event);
package/dist/index.cjs CHANGED
@@ -130,6 +130,20 @@ var DritanClient = class {
130
130
  bondingCurvePercent: raw?.bondingCurvePercent === void 0 ? null : raw?.bondingCurvePercent ?? null
131
131
  };
132
132
  }
133
+ async getDeployerStats(mint) {
134
+ const url = buildUrl(this.baseUrl, `/token/deployer-stats/${encodeURIComponent(mint)}`);
135
+ const res = await this.fetchImpl(url, {
136
+ method: "GET",
137
+ headers: {
138
+ "x-api-key": this.apiKey
139
+ }
140
+ });
141
+ if (!res.ok) {
142
+ const text = await res.text().catch(() => "");
143
+ throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);
144
+ }
145
+ return await res.json();
146
+ }
133
147
  async buildSwap(body) {
134
148
  const url = buildUrl(this.baseUrl, "/swap/build");
135
149
  const res = await this.fetchImpl(url, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["WebSocketImpl"],"mappings":"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","file":"index.cjs","sourcesContent":["import WebSocketImpl from \"isomorphic-ws\";\n\nexport type DritanClientOptions = {\n apiKey: string;\n baseUrl?: string;\n wsBaseUrl?: string;\n fetch?: typeof fetch;\n WebSocket?: typeof WebSocketImpl;\n};\n\nexport type KnownDexStream =\n | \"pumpamm\"\n | \"pumpfun\"\n | \"launchlab\"\n | \"dlmm\"\n | \"damm2\"\n | \"damm1\"\n | \"dbc\";\n\nexport type MeteoraThsClientOptions = {\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nexport type TokenPriceResponse = {\n mint: string;\n dex: string;\n priceUsd: number;\n marketCap: number | null;\n liquiditySol: number | null;\n};\n\nexport type TokenMetadataResponse = {\n mint: string;\n programId: string;\n name: string;\n symbol: string;\n uri: string;\n decimals: number;\n supply: string;\n};\n\nexport type RiskGroup = {\n count: number;\n totalPercentage: number;\n};\n\nexport type TokenRiskResponse = {\n mint: string;\n globalFeesPaid: number;\n bundlers: RiskGroup;\n insiders: RiskGroup;\n snipers: RiskGroup;\n top10: number;\n devPercentage: number | null;\n};\n\nexport type TokenFirstBuyersResponse = {\n mint: string;\n buyers: unknown;\n};\n\nexport type TokenAggregatedResponse = {\n mint: string;\n price: TokenPriceResponse;\n metadata: TokenMetadataResponse | null;\n risk: TokenRiskResponse | null;\n bondingCurvePercent: number | null;\n};\n\nexport type DritanStreamOptions = {\n query?: Record<string, string | number | boolean | undefined | null>;\n /**\n * When true, includes the api key as `?apiKey=...` in the websocket URL.\n * This is required when using native browser websockets (custom headers are not supported).\n */\n sendApiKeyInQuery?: boolean;\n onOpen?: () => void;\n onClose?: (ev: CloseEvent) => void;\n onError?: (ev: Event) => void;\n onMessage?: (data: unknown) => void;\n};\n\nexport type DritanStreamHandle = {\n socket: WebSocket;\n close: () => void;\n};\n\nexport type SwapBuildRequest = {\n userPublicKey: string;\n inputMint: string;\n outputMint: string;\n amount: number | string;\n slippageBps?: number;\n swapType?: string;\n feeWallet?: string;\n feeBps?: number;\n feePercent?: number;\n};\n\nexport type SwapBuildFees = {\n platformFeeBps: number;\n platformFeeLamports: number;\n userFeeBps: number;\n userFeeLamports: number;\n tipLamports: number;\n};\n\nexport type SwapBuildResponse = {\n transactionBase64: string;\n fees: SwapBuildFees;\n quote: unknown;\n};\n\nexport type SwapBroadcastResponse = {\n signature: string;\n};\n\nexport type ThsTotals = {\n buys: number;\n sells: number;\n};\n\nexport type ThsResponse = {\n wallet: string;\n score: number;\n realizedPnLUsd: number;\n realizedPnLWeightedUsd: number;\n totals: ThsTotals;\n analyzedTxns: number;\n matchedTxCount: number;\n unmatchedTxCount: number;\n avgHoldTimeDays: number;\n avgHoldTimeHours: number;\n avgHoldTimeMinutes: number;\n avgHoldTimeSeconds: number;\n avgHoldTimePretty: string;\n};\n\nfunction buildUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n}\n\nfunction buildWsUrl(\n wsBaseUrl: string,\n path: string,\n query?: Record<string, string | number | boolean | undefined | null>\n): string {\n const url = new URL(buildUrl(wsBaseUrl, path));\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nfunction safeJsonParse(payload: string): unknown {\n try {\n return JSON.parse(payload) as unknown;\n } catch {\n return payload;\n }\n}\n\nfunction isNodeRuntime(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof (process as any).versions?.node === \"string\"\n );\n}\n\nfunction messageToString(data: unknown): string | null {\n if (typeof data === \"string\") return data;\n\n // ws (node) can emit Buffer\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(data)) {\n return data.toString(\"utf8\");\n }\n\n // browser ws can emit ArrayBuffer\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(data));\n }\n\n return null;\n}\n\nexport class DritanClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly wsBaseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly WebSocketCtor: typeof WebSocketImpl;\n\n constructor(options: DritanClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://us-east.dritan.dev\";\n this.wsBaseUrl = options.wsBaseUrl ?? \"wss://us-east.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n this.WebSocketCtor = options.WebSocket ?? WebSocketImpl;\n }\n\n async getTokenPrice(mint: string): Promise<TokenPriceResponse> {\n const url = buildUrl(this.baseUrl, `/token/price/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenPriceResponse;\n }\n\n async getTokenMetadata(mint: string): Promise<TokenMetadataResponse> {\n const url = buildUrl(this.baseUrl, `/token/metadata/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenMetadataResponse;\n }\n\n async getTokenRisk(mint: string): Promise<TokenRiskResponse> {\n const url = buildUrl(this.baseUrl, `/token/risk/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenRiskResponse;\n }\n\n async getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse> {\n const url = buildUrl(this.baseUrl, `/token/first-buyers/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenFirstBuyersResponse;\n }\n\n async getTokenAggregated(mint: string): Promise<TokenAggregatedResponse> {\n const url = buildUrl(this.baseUrl, `/token/aggregated/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n const raw = (await res.json()) as any;\n return {\n mint: String(raw?.mint ?? mint),\n price: raw?.price as TokenPriceResponse,\n metadata: raw?.metadata ?? null,\n risk: raw?.risk ?? null,\n bondingCurvePercent:\n raw?.bondingCurvePercent === undefined ? null : (raw?.bondingCurvePercent ?? null)\n };\n }\n\n async buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/build\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(body ?? {})\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBuildResponse;\n }\n\n async broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/broadcast\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ signedTransactionBase64 })\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBroadcastResponse;\n }\n\n streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options: DritanStreamOptions = {}): DritanStreamHandle {\n const shouldSendKeyInQuery = options.sendApiKeyInQuery ?? !isNodeRuntime();\n const query = { ...(options.query ?? {}) } as Record<\n string,\n string | number | boolean | undefined | null\n >;\n if (shouldSendKeyInQuery && query.apiKey == null) {\n query.apiKey = this.apiKey;\n }\n\n const url = buildWsUrl(this.wsBaseUrl, `/${dex}`, query);\n const ws = shouldSendKeyInQuery\n ? new this.WebSocketCtor(url)\n : new this.WebSocketCtor(\n url,\n {\n headers: {\n \"x-api-key\": this.apiKey\n }\n } as any\n );\n\n ws.onopen = () => options.onOpen?.();\n ws.onclose = (ev: any) => options.onClose?.(ev as CloseEvent);\n ws.onerror = (ev: any) => options.onError?.(ev as Event);\n ws.onmessage = (msg: any) => {\n const raw = messageToString(msg.data);\n const data = raw ? safeJsonParse(raw) : msg.data;\n options.onMessage?.(data);\n };\n\n return {\n socket: ws as unknown as WebSocket,\n close: () => ws.close()\n };\n }\n}\n\nexport const createClient = (options: DritanClientOptions) => new DritanClient(options);\n\nexport class MeteoraThsClient {\n readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: MeteoraThsClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? \"https://ths.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async health(): Promise<boolean> {\n const url = buildUrl(this.baseUrl, \"/health\");\n const res = await this.fetchImpl(url, { method: \"GET\" });\n return res.ok;\n }\n\n async getThsScore(\n wallet: string,\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async getThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n for (const mint of tokenMints ?? []) {\n url.searchParams.append(\"tokenMints\", mint);\n }\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async postThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ tokenMints: tokenMints ?? [] })\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n}\n\nexport const createMeteoraThsClient = (options?: MeteoraThsClientOptions) =>\n new MeteoraThsClient(options);\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["WebSocketImpl"],"mappings":"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","file":"index.cjs","sourcesContent":["import WebSocketImpl from \"isomorphic-ws\";\n\nexport type DritanClientOptions = {\n apiKey: string;\n baseUrl?: string;\n wsBaseUrl?: string;\n fetch?: typeof fetch;\n WebSocket?: typeof WebSocketImpl;\n};\n\nexport type KnownDexStream =\n | \"pumpamm\"\n | \"pumpfun\"\n | \"moonit\"\n | \"launchlab\"\n | \"amm\"\n | \"cpmm\"\n | \"clmm\"\n | \"orca\"\n | \"dlmm\"\n | \"damm2\"\n | \"damm1\"\n | \"dbc\";\n\nexport type MeteoraThsClientOptions = {\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nexport type TokenPriceResponse = {\n mint: string;\n dex: string;\n priceUsd: number;\n marketCap: number | null;\n liquiditySol: number | null;\n};\n\nexport type TokenMetadataResponse = {\n mint: string;\n programId: string;\n name: string;\n symbol: string;\n uri: string;\n decimals: number;\n supply: string;\n};\n\nexport type RiskGroup = {\n count: number;\n totalPercentage: number;\n};\n\nexport type TokenRiskResponse = {\n mint: string;\n globalFeesPaid: number;\n bundlers: RiskGroup;\n insiders: RiskGroup;\n snipers: RiskGroup;\n top10: number;\n devPercentage: number | null;\n};\n\nexport type TokenFirstBuyersResponse = {\n mint: string;\n buyers: unknown;\n};\n\nexport type TokenAggregatedResponse = {\n mint: string;\n price: TokenPriceResponse;\n metadata: TokenMetadataResponse | null;\n risk: TokenRiskResponse | null;\n bondingCurvePercent: number | null;\n};\n\nexport type TokenDeployerStatsResponse = {\n mint: string;\n deployer: string;\n total: number;\n deployed: number;\n bonded: number;\n nonBonded: number;\n};\n\nexport type DritanStreamOptions = {\n query?: Record<string, string | number | boolean | undefined | null>;\n /**\n * When true, includes the api key as `?apiKey=...` in the websocket URL.\n * This is required when using native browser websockets (custom headers are not supported).\n */\n sendApiKeyInQuery?: boolean;\n onOpen?: () => void;\n onClose?: (ev: CloseEvent) => void;\n onError?: (ev: Event) => void;\n onMessage?: (data: unknown) => void;\n};\n\nexport type DritanStreamHandle = {\n socket: WebSocket;\n close: () => void;\n};\n\nexport type SwapBuildRequest = {\n userPublicKey: string;\n inputMint: string;\n outputMint: string;\n amount: number | string;\n slippageBps?: number;\n swapType?: string;\n feeWallet?: string;\n feeBps?: number;\n feePercent?: number;\n};\n\nexport type SwapBuildFees = {\n platformFeeBps: number;\n platformFeeLamports: number;\n userFeeBps: number;\n userFeeLamports: number;\n tipLamports: number;\n};\n\nexport type SwapBuildResponse = {\n transactionBase64: string;\n fees: SwapBuildFees;\n quote: unknown;\n};\n\nexport type SwapBroadcastResponse = {\n signature: string;\n};\n\nexport type ThsTotals = {\n buys: number;\n sells: number;\n};\n\nexport type ThsResponse = {\n wallet: string;\n score: number;\n realizedPnLUsd: number;\n realizedPnLWeightedUsd: number;\n totals: ThsTotals;\n analyzedTxns: number;\n matchedTxCount: number;\n unmatchedTxCount: number;\n avgHoldTimeDays: number;\n avgHoldTimeHours: number;\n avgHoldTimeMinutes: number;\n avgHoldTimeSeconds: number;\n avgHoldTimePretty: string;\n};\n\nfunction buildUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n}\n\nfunction buildWsUrl(\n wsBaseUrl: string,\n path: string,\n query?: Record<string, string | number | boolean | undefined | null>\n): string {\n const url = new URL(buildUrl(wsBaseUrl, path));\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nfunction safeJsonParse(payload: string): unknown {\n try {\n return JSON.parse(payload) as unknown;\n } catch {\n return payload;\n }\n}\n\nfunction isNodeRuntime(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof (process as any).versions?.node === \"string\"\n );\n}\n\nfunction messageToString(data: unknown): string | null {\n if (typeof data === \"string\") return data;\n\n // ws (node) can emit Buffer\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(data)) {\n return data.toString(\"utf8\");\n }\n\n // browser ws can emit ArrayBuffer\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(data));\n }\n\n return null;\n}\n\nexport class DritanClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly wsBaseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly WebSocketCtor: typeof WebSocketImpl;\n\n constructor(options: DritanClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://us-east.dritan.dev\";\n this.wsBaseUrl = options.wsBaseUrl ?? \"wss://us-east.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n this.WebSocketCtor = options.WebSocket ?? WebSocketImpl;\n }\n\n async getTokenPrice(mint: string): Promise<TokenPriceResponse> {\n const url = buildUrl(this.baseUrl, `/token/price/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenPriceResponse;\n }\n\n async getTokenMetadata(mint: string): Promise<TokenMetadataResponse> {\n const url = buildUrl(this.baseUrl, `/token/metadata/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenMetadataResponse;\n }\n\n async getTokenRisk(mint: string): Promise<TokenRiskResponse> {\n const url = buildUrl(this.baseUrl, `/token/risk/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenRiskResponse;\n }\n\n async getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse> {\n const url = buildUrl(this.baseUrl, `/token/first-buyers/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenFirstBuyersResponse;\n }\n\n async getTokenAggregated(mint: string): Promise<TokenAggregatedResponse> {\n const url = buildUrl(this.baseUrl, `/token/aggregated/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n const raw = (await res.json()) as any;\n return {\n mint: String(raw?.mint ?? mint),\n price: raw?.price as TokenPriceResponse,\n metadata: raw?.metadata ?? null,\n risk: raw?.risk ?? null,\n bondingCurvePercent:\n raw?.bondingCurvePercent === undefined ? null : (raw?.bondingCurvePercent ?? null)\n };\n }\n\n async getDeployerStats(mint: string): Promise<TokenDeployerStatsResponse> {\n const url = buildUrl(this.baseUrl, `/token/deployer-stats/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenDeployerStatsResponse;\n }\n\n async buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/build\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(body ?? {})\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBuildResponse;\n }\n\n async broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/broadcast\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ signedTransactionBase64 })\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBroadcastResponse;\n }\n\n streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options: DritanStreamOptions = {}): DritanStreamHandle {\n const shouldSendKeyInQuery = options.sendApiKeyInQuery ?? !isNodeRuntime();\n const query = { ...(options.query ?? {}) } as Record<\n string,\n string | number | boolean | undefined | null\n >;\n if (shouldSendKeyInQuery && query.apiKey == null) {\n query.apiKey = this.apiKey;\n }\n\n const url = buildWsUrl(this.wsBaseUrl, `/${dex}`, query);\n const ws = shouldSendKeyInQuery\n ? new this.WebSocketCtor(url)\n : new this.WebSocketCtor(\n url,\n {\n headers: {\n \"x-api-key\": this.apiKey\n }\n } as any\n );\n\n ws.onopen = () => options.onOpen?.();\n ws.onclose = (ev: any) => options.onClose?.(ev as CloseEvent);\n ws.onerror = (ev: any) => options.onError?.(ev as Event);\n ws.onmessage = (msg: any) => {\n const raw = messageToString(msg.data);\n const data = raw ? safeJsonParse(raw) : msg.data;\n options.onMessage?.(data);\n };\n\n return {\n socket: ws as unknown as WebSocket,\n close: () => ws.close()\n };\n }\n}\n\nexport const createClient = (options: DritanClientOptions) => new DritanClient(options);\n\nexport class MeteoraThsClient {\n readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: MeteoraThsClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? \"https://ths.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async health(): Promise<boolean> {\n const url = buildUrl(this.baseUrl, \"/health\");\n const res = await this.fetchImpl(url, { method: \"GET\" });\n return res.ok;\n }\n\n async getThsScore(\n wallet: string,\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async getThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n for (const mint of tokenMints ?? []) {\n url.searchParams.append(\"tokenMints\", mint);\n }\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async postThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ tokenMints: tokenMints ?? [] })\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n}\n\nexport const createMeteoraThsClient = (options?: MeteoraThsClientOptions) =>\n new MeteoraThsClient(options);\n"]}
package/dist/index.d.cts CHANGED
@@ -7,7 +7,7 @@ type DritanClientOptions = {
7
7
  fetch?: typeof fetch;
8
8
  WebSocket?: typeof WebSocketImpl;
9
9
  };
10
- type KnownDexStream = "pumpamm" | "pumpfun" | "launchlab" | "dlmm" | "damm2" | "damm1" | "dbc";
10
+ type KnownDexStream = "pumpamm" | "pumpfun" | "moonit" | "launchlab" | "amm" | "cpmm" | "clmm" | "orca" | "dlmm" | "damm2" | "damm1" | "dbc";
11
11
  type MeteoraThsClientOptions = {
12
12
  baseUrl?: string;
13
13
  fetch?: typeof fetch;
@@ -52,6 +52,14 @@ type TokenAggregatedResponse = {
52
52
  risk: TokenRiskResponse | null;
53
53
  bondingCurvePercent: number | null;
54
54
  };
55
+ type TokenDeployerStatsResponse = {
56
+ mint: string;
57
+ deployer: string;
58
+ total: number;
59
+ deployed: number;
60
+ bonded: number;
61
+ nonBonded: number;
62
+ };
55
63
  type DritanStreamOptions = {
56
64
  query?: Record<string, string | number | boolean | undefined | null>;
57
65
  /**
@@ -125,6 +133,7 @@ declare class DritanClient {
125
133
  getTokenRisk(mint: string): Promise<TokenRiskResponse>;
126
134
  getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse>;
127
135
  getTokenAggregated(mint: string): Promise<TokenAggregatedResponse>;
136
+ getDeployerStats(mint: string): Promise<TokenDeployerStatsResponse>;
128
137
  buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse>;
129
138
  broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse>;
130
139
  streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;
@@ -151,4 +160,4 @@ declare class MeteoraThsClient {
151
160
  }
152
161
  declare const createMeteoraThsClient: (options?: MeteoraThsClientOptions) => MeteoraThsClient;
153
162
 
154
- export { DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type RiskGroup, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenPriceResponse, type TokenRiskResponse, createClient, createMeteoraThsClient };
163
+ export { DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type RiskGroup, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenDeployerStatsResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenPriceResponse, type TokenRiskResponse, createClient, createMeteoraThsClient };
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@ type DritanClientOptions = {
7
7
  fetch?: typeof fetch;
8
8
  WebSocket?: typeof WebSocketImpl;
9
9
  };
10
- type KnownDexStream = "pumpamm" | "pumpfun" | "launchlab" | "dlmm" | "damm2" | "damm1" | "dbc";
10
+ type KnownDexStream = "pumpamm" | "pumpfun" | "moonit" | "launchlab" | "amm" | "cpmm" | "clmm" | "orca" | "dlmm" | "damm2" | "damm1" | "dbc";
11
11
  type MeteoraThsClientOptions = {
12
12
  baseUrl?: string;
13
13
  fetch?: typeof fetch;
@@ -52,6 +52,14 @@ type TokenAggregatedResponse = {
52
52
  risk: TokenRiskResponse | null;
53
53
  bondingCurvePercent: number | null;
54
54
  };
55
+ type TokenDeployerStatsResponse = {
56
+ mint: string;
57
+ deployer: string;
58
+ total: number;
59
+ deployed: number;
60
+ bonded: number;
61
+ nonBonded: number;
62
+ };
55
63
  type DritanStreamOptions = {
56
64
  query?: Record<string, string | number | boolean | undefined | null>;
57
65
  /**
@@ -125,6 +133,7 @@ declare class DritanClient {
125
133
  getTokenRisk(mint: string): Promise<TokenRiskResponse>;
126
134
  getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse>;
127
135
  getTokenAggregated(mint: string): Promise<TokenAggregatedResponse>;
136
+ getDeployerStats(mint: string): Promise<TokenDeployerStatsResponse>;
128
137
  buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse>;
129
138
  broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse>;
130
139
  streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;
@@ -151,4 +160,4 @@ declare class MeteoraThsClient {
151
160
  }
152
161
  declare const createMeteoraThsClient: (options?: MeteoraThsClientOptions) => MeteoraThsClient;
153
162
 
154
- export { DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type RiskGroup, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenPriceResponse, type TokenRiskResponse, createClient, createMeteoraThsClient };
163
+ export { DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type RiskGroup, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenDeployerStatsResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenPriceResponse, type TokenRiskResponse, createClient, createMeteoraThsClient };
package/dist/index.js CHANGED
@@ -124,6 +124,20 @@ var DritanClient = class {
124
124
  bondingCurvePercent: raw?.bondingCurvePercent === void 0 ? null : raw?.bondingCurvePercent ?? null
125
125
  };
126
126
  }
127
+ async getDeployerStats(mint) {
128
+ const url = buildUrl(this.baseUrl, `/token/deployer-stats/${encodeURIComponent(mint)}`);
129
+ const res = await this.fetchImpl(url, {
130
+ method: "GET",
131
+ headers: {
132
+ "x-api-key": this.apiKey
133
+ }
134
+ });
135
+ if (!res.ok) {
136
+ const text = await res.text().catch(() => "");
137
+ throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);
138
+ }
139
+ return await res.json();
140
+ }
127
141
  async buildSwap(body) {
128
142
  const url = buildUrl(this.baseUrl, "/swap/build");
129
143
  const res = await this.fetchImpl(url, {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import WebSocketImpl from \"isomorphic-ws\";\n\nexport type DritanClientOptions = {\n apiKey: string;\n baseUrl?: string;\n wsBaseUrl?: string;\n fetch?: typeof fetch;\n WebSocket?: typeof WebSocketImpl;\n};\n\nexport type KnownDexStream =\n | \"pumpamm\"\n | \"pumpfun\"\n | \"launchlab\"\n | \"dlmm\"\n | \"damm2\"\n | \"damm1\"\n | \"dbc\";\n\nexport type MeteoraThsClientOptions = {\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nexport type TokenPriceResponse = {\n mint: string;\n dex: string;\n priceUsd: number;\n marketCap: number | null;\n liquiditySol: number | null;\n};\n\nexport type TokenMetadataResponse = {\n mint: string;\n programId: string;\n name: string;\n symbol: string;\n uri: string;\n decimals: number;\n supply: string;\n};\n\nexport type RiskGroup = {\n count: number;\n totalPercentage: number;\n};\n\nexport type TokenRiskResponse = {\n mint: string;\n globalFeesPaid: number;\n bundlers: RiskGroup;\n insiders: RiskGroup;\n snipers: RiskGroup;\n top10: number;\n devPercentage: number | null;\n};\n\nexport type TokenFirstBuyersResponse = {\n mint: string;\n buyers: unknown;\n};\n\nexport type TokenAggregatedResponse = {\n mint: string;\n price: TokenPriceResponse;\n metadata: TokenMetadataResponse | null;\n risk: TokenRiskResponse | null;\n bondingCurvePercent: number | null;\n};\n\nexport type DritanStreamOptions = {\n query?: Record<string, string | number | boolean | undefined | null>;\n /**\n * When true, includes the api key as `?apiKey=...` in the websocket URL.\n * This is required when using native browser websockets (custom headers are not supported).\n */\n sendApiKeyInQuery?: boolean;\n onOpen?: () => void;\n onClose?: (ev: CloseEvent) => void;\n onError?: (ev: Event) => void;\n onMessage?: (data: unknown) => void;\n};\n\nexport type DritanStreamHandle = {\n socket: WebSocket;\n close: () => void;\n};\n\nexport type SwapBuildRequest = {\n userPublicKey: string;\n inputMint: string;\n outputMint: string;\n amount: number | string;\n slippageBps?: number;\n swapType?: string;\n feeWallet?: string;\n feeBps?: number;\n feePercent?: number;\n};\n\nexport type SwapBuildFees = {\n platformFeeBps: number;\n platformFeeLamports: number;\n userFeeBps: number;\n userFeeLamports: number;\n tipLamports: number;\n};\n\nexport type SwapBuildResponse = {\n transactionBase64: string;\n fees: SwapBuildFees;\n quote: unknown;\n};\n\nexport type SwapBroadcastResponse = {\n signature: string;\n};\n\nexport type ThsTotals = {\n buys: number;\n sells: number;\n};\n\nexport type ThsResponse = {\n wallet: string;\n score: number;\n realizedPnLUsd: number;\n realizedPnLWeightedUsd: number;\n totals: ThsTotals;\n analyzedTxns: number;\n matchedTxCount: number;\n unmatchedTxCount: number;\n avgHoldTimeDays: number;\n avgHoldTimeHours: number;\n avgHoldTimeMinutes: number;\n avgHoldTimeSeconds: number;\n avgHoldTimePretty: string;\n};\n\nfunction buildUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n}\n\nfunction buildWsUrl(\n wsBaseUrl: string,\n path: string,\n query?: Record<string, string | number | boolean | undefined | null>\n): string {\n const url = new URL(buildUrl(wsBaseUrl, path));\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nfunction safeJsonParse(payload: string): unknown {\n try {\n return JSON.parse(payload) as unknown;\n } catch {\n return payload;\n }\n}\n\nfunction isNodeRuntime(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof (process as any).versions?.node === \"string\"\n );\n}\n\nfunction messageToString(data: unknown): string | null {\n if (typeof data === \"string\") return data;\n\n // ws (node) can emit Buffer\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(data)) {\n return data.toString(\"utf8\");\n }\n\n // browser ws can emit ArrayBuffer\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(data));\n }\n\n return null;\n}\n\nexport class DritanClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly wsBaseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly WebSocketCtor: typeof WebSocketImpl;\n\n constructor(options: DritanClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://us-east.dritan.dev\";\n this.wsBaseUrl = options.wsBaseUrl ?? \"wss://us-east.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n this.WebSocketCtor = options.WebSocket ?? WebSocketImpl;\n }\n\n async getTokenPrice(mint: string): Promise<TokenPriceResponse> {\n const url = buildUrl(this.baseUrl, `/token/price/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenPriceResponse;\n }\n\n async getTokenMetadata(mint: string): Promise<TokenMetadataResponse> {\n const url = buildUrl(this.baseUrl, `/token/metadata/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenMetadataResponse;\n }\n\n async getTokenRisk(mint: string): Promise<TokenRiskResponse> {\n const url = buildUrl(this.baseUrl, `/token/risk/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenRiskResponse;\n }\n\n async getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse> {\n const url = buildUrl(this.baseUrl, `/token/first-buyers/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenFirstBuyersResponse;\n }\n\n async getTokenAggregated(mint: string): Promise<TokenAggregatedResponse> {\n const url = buildUrl(this.baseUrl, `/token/aggregated/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n const raw = (await res.json()) as any;\n return {\n mint: String(raw?.mint ?? mint),\n price: raw?.price as TokenPriceResponse,\n metadata: raw?.metadata ?? null,\n risk: raw?.risk ?? null,\n bondingCurvePercent:\n raw?.bondingCurvePercent === undefined ? null : (raw?.bondingCurvePercent ?? null)\n };\n }\n\n async buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/build\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(body ?? {})\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBuildResponse;\n }\n\n async broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/broadcast\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ signedTransactionBase64 })\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBroadcastResponse;\n }\n\n streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options: DritanStreamOptions = {}): DritanStreamHandle {\n const shouldSendKeyInQuery = options.sendApiKeyInQuery ?? !isNodeRuntime();\n const query = { ...(options.query ?? {}) } as Record<\n string,\n string | number | boolean | undefined | null\n >;\n if (shouldSendKeyInQuery && query.apiKey == null) {\n query.apiKey = this.apiKey;\n }\n\n const url = buildWsUrl(this.wsBaseUrl, `/${dex}`, query);\n const ws = shouldSendKeyInQuery\n ? new this.WebSocketCtor(url)\n : new this.WebSocketCtor(\n url,\n {\n headers: {\n \"x-api-key\": this.apiKey\n }\n } as any\n );\n\n ws.onopen = () => options.onOpen?.();\n ws.onclose = (ev: any) => options.onClose?.(ev as CloseEvent);\n ws.onerror = (ev: any) => options.onError?.(ev as Event);\n ws.onmessage = (msg: any) => {\n const raw = messageToString(msg.data);\n const data = raw ? safeJsonParse(raw) : msg.data;\n options.onMessage?.(data);\n };\n\n return {\n socket: ws as unknown as WebSocket,\n close: () => ws.close()\n };\n }\n}\n\nexport const createClient = (options: DritanClientOptions) => new DritanClient(options);\n\nexport class MeteoraThsClient {\n readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: MeteoraThsClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? \"https://ths.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async health(): Promise<boolean> {\n const url = buildUrl(this.baseUrl, \"/health\");\n const res = await this.fetchImpl(url, { method: \"GET\" });\n return res.ok;\n }\n\n async getThsScore(\n wallet: string,\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async getThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n for (const mint of tokenMints ?? []) {\n url.searchParams.append(\"tokenMints\", mint);\n }\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async postThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ tokenMints: tokenMints ?? [] })\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n}\n\nexport const createMeteoraThsClient = (options?: MeteoraThsClientOptions) =>\n new MeteoraThsClient(options);\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import WebSocketImpl from \"isomorphic-ws\";\n\nexport type DritanClientOptions = {\n apiKey: string;\n baseUrl?: string;\n wsBaseUrl?: string;\n fetch?: typeof fetch;\n WebSocket?: typeof WebSocketImpl;\n};\n\nexport type KnownDexStream =\n | \"pumpamm\"\n | \"pumpfun\"\n | \"moonit\"\n | \"launchlab\"\n | \"amm\"\n | \"cpmm\"\n | \"clmm\"\n | \"orca\"\n | \"dlmm\"\n | \"damm2\"\n | \"damm1\"\n | \"dbc\";\n\nexport type MeteoraThsClientOptions = {\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nexport type TokenPriceResponse = {\n mint: string;\n dex: string;\n priceUsd: number;\n marketCap: number | null;\n liquiditySol: number | null;\n};\n\nexport type TokenMetadataResponse = {\n mint: string;\n programId: string;\n name: string;\n symbol: string;\n uri: string;\n decimals: number;\n supply: string;\n};\n\nexport type RiskGroup = {\n count: number;\n totalPercentage: number;\n};\n\nexport type TokenRiskResponse = {\n mint: string;\n globalFeesPaid: number;\n bundlers: RiskGroup;\n insiders: RiskGroup;\n snipers: RiskGroup;\n top10: number;\n devPercentage: number | null;\n};\n\nexport type TokenFirstBuyersResponse = {\n mint: string;\n buyers: unknown;\n};\n\nexport type TokenAggregatedResponse = {\n mint: string;\n price: TokenPriceResponse;\n metadata: TokenMetadataResponse | null;\n risk: TokenRiskResponse | null;\n bondingCurvePercent: number | null;\n};\n\nexport type TokenDeployerStatsResponse = {\n mint: string;\n deployer: string;\n total: number;\n deployed: number;\n bonded: number;\n nonBonded: number;\n};\n\nexport type DritanStreamOptions = {\n query?: Record<string, string | number | boolean | undefined | null>;\n /**\n * When true, includes the api key as `?apiKey=...` in the websocket URL.\n * This is required when using native browser websockets (custom headers are not supported).\n */\n sendApiKeyInQuery?: boolean;\n onOpen?: () => void;\n onClose?: (ev: CloseEvent) => void;\n onError?: (ev: Event) => void;\n onMessage?: (data: unknown) => void;\n};\n\nexport type DritanStreamHandle = {\n socket: WebSocket;\n close: () => void;\n};\n\nexport type SwapBuildRequest = {\n userPublicKey: string;\n inputMint: string;\n outputMint: string;\n amount: number | string;\n slippageBps?: number;\n swapType?: string;\n feeWallet?: string;\n feeBps?: number;\n feePercent?: number;\n};\n\nexport type SwapBuildFees = {\n platformFeeBps: number;\n platformFeeLamports: number;\n userFeeBps: number;\n userFeeLamports: number;\n tipLamports: number;\n};\n\nexport type SwapBuildResponse = {\n transactionBase64: string;\n fees: SwapBuildFees;\n quote: unknown;\n};\n\nexport type SwapBroadcastResponse = {\n signature: string;\n};\n\nexport type ThsTotals = {\n buys: number;\n sells: number;\n};\n\nexport type ThsResponse = {\n wallet: string;\n score: number;\n realizedPnLUsd: number;\n realizedPnLWeightedUsd: number;\n totals: ThsTotals;\n analyzedTxns: number;\n matchedTxCount: number;\n unmatchedTxCount: number;\n avgHoldTimeDays: number;\n avgHoldTimeHours: number;\n avgHoldTimeMinutes: number;\n avgHoldTimeSeconds: number;\n avgHoldTimePretty: string;\n};\n\nfunction buildUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n}\n\nfunction buildWsUrl(\n wsBaseUrl: string,\n path: string,\n query?: Record<string, string | number | boolean | undefined | null>\n): string {\n const url = new URL(buildUrl(wsBaseUrl, path));\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nfunction safeJsonParse(payload: string): unknown {\n try {\n return JSON.parse(payload) as unknown;\n } catch {\n return payload;\n }\n}\n\nfunction isNodeRuntime(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof (process as any).versions?.node === \"string\"\n );\n}\n\nfunction messageToString(data: unknown): string | null {\n if (typeof data === \"string\") return data;\n\n // ws (node) can emit Buffer\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(data)) {\n return data.toString(\"utf8\");\n }\n\n // browser ws can emit ArrayBuffer\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(data));\n }\n\n return null;\n}\n\nexport class DritanClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly wsBaseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly WebSocketCtor: typeof WebSocketImpl;\n\n constructor(options: DritanClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://us-east.dritan.dev\";\n this.wsBaseUrl = options.wsBaseUrl ?? \"wss://us-east.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n this.WebSocketCtor = options.WebSocket ?? WebSocketImpl;\n }\n\n async getTokenPrice(mint: string): Promise<TokenPriceResponse> {\n const url = buildUrl(this.baseUrl, `/token/price/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenPriceResponse;\n }\n\n async getTokenMetadata(mint: string): Promise<TokenMetadataResponse> {\n const url = buildUrl(this.baseUrl, `/token/metadata/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenMetadataResponse;\n }\n\n async getTokenRisk(mint: string): Promise<TokenRiskResponse> {\n const url = buildUrl(this.baseUrl, `/token/risk/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenRiskResponse;\n }\n\n async getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse> {\n const url = buildUrl(this.baseUrl, `/token/first-buyers/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenFirstBuyersResponse;\n }\n\n async getTokenAggregated(mint: string): Promise<TokenAggregatedResponse> {\n const url = buildUrl(this.baseUrl, `/token/aggregated/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n const raw = (await res.json()) as any;\n return {\n mint: String(raw?.mint ?? mint),\n price: raw?.price as TokenPriceResponse,\n metadata: raw?.metadata ?? null,\n risk: raw?.risk ?? null,\n bondingCurvePercent:\n raw?.bondingCurvePercent === undefined ? null : (raw?.bondingCurvePercent ?? null)\n };\n }\n\n async getDeployerStats(mint: string): Promise<TokenDeployerStatsResponse> {\n const url = buildUrl(this.baseUrl, `/token/deployer-stats/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenDeployerStatsResponse;\n }\n\n async buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/build\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(body ?? {})\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBuildResponse;\n }\n\n async broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/broadcast\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ signedTransactionBase64 })\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBroadcastResponse;\n }\n\n streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options: DritanStreamOptions = {}): DritanStreamHandle {\n const shouldSendKeyInQuery = options.sendApiKeyInQuery ?? !isNodeRuntime();\n const query = { ...(options.query ?? {}) } as Record<\n string,\n string | number | boolean | undefined | null\n >;\n if (shouldSendKeyInQuery && query.apiKey == null) {\n query.apiKey = this.apiKey;\n }\n\n const url = buildWsUrl(this.wsBaseUrl, `/${dex}`, query);\n const ws = shouldSendKeyInQuery\n ? new this.WebSocketCtor(url)\n : new this.WebSocketCtor(\n url,\n {\n headers: {\n \"x-api-key\": this.apiKey\n }\n } as any\n );\n\n ws.onopen = () => options.onOpen?.();\n ws.onclose = (ev: any) => options.onClose?.(ev as CloseEvent);\n ws.onerror = (ev: any) => options.onError?.(ev as Event);\n ws.onmessage = (msg: any) => {\n const raw = messageToString(msg.data);\n const data = raw ? safeJsonParse(raw) : msg.data;\n options.onMessage?.(data);\n };\n\n return {\n socket: ws as unknown as WebSocket,\n close: () => ws.close()\n };\n }\n}\n\nexport const createClient = (options: DritanClientOptions) => new DritanClient(options);\n\nexport class MeteoraThsClient {\n readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: MeteoraThsClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? \"https://ths.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async health(): Promise<boolean> {\n const url = buildUrl(this.baseUrl, \"/health\");\n const res = await this.fetchImpl(url, { method: \"GET\" });\n return res.ok;\n }\n\n async getThsScore(\n wallet: string,\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async getThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n for (const mint of tokenMints ?? []) {\n url.searchParams.append(\"tokenMints\", mint);\n }\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async postThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ tokenMints: tokenMints ?? [] })\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n}\n\nexport const createMeteoraThsClient = (options?: MeteoraThsClientOptions) =>\n new MeteoraThsClient(options);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dritan-sdk",
3
- "version": "0.1.2",
3
+ "version": "0.3.10",
4
4
  "description": "TypeScript SDK for the Dritan data plane REST API and websocket streams.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -30,14 +30,24 @@
30
30
  "build": "tsup",
31
31
  "dev": "tsup --watch",
32
32
  "lint": "tsc -p tsconfig.json --noEmit",
33
- "prepublishOnly": "npm run build"
33
+ "prepublishOnly": "npm run build",
34
+ "release": "semantic-release"
34
35
  },
35
36
  "dependencies": {
36
37
  "isomorphic-ws": "^5.0.0",
37
38
  "ws": "^8.19.0"
38
39
  },
39
40
  "devDependencies": {
41
+ "@semantic-release/changelog": "^6.0.3",
42
+ "@semantic-release/commit-analyzer": "^13.0.1",
43
+ "@semantic-release/exec": "^7.1.0",
44
+ "@semantic-release/git": "^10.0.1",
45
+ "@semantic-release/github": "^11.0.6",
46
+ "@semantic-release/npm": "^12.0.2",
47
+ "@semantic-release/release-notes-generator": "^14.1.0",
40
48
  "@types/node": "^22.14.0",
49
+ "conventional-changelog-conventionalcommits": "^9.1.0",
50
+ "semantic-release": "^24.2.9",
41
51
  "tsup": "^8.0.2",
42
52
  "typescript": "^5.8.2"
43
53
  },