dritan-sdk 0.5.0 → 0.7.0
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 +85 -3
- package/dist/index.cjs +41 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +93 -5
- package/dist/index.d.ts +93 -5
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -164,16 +164,98 @@ console.log(sent.signature);
|
|
|
164
164
|
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`).
|
|
165
165
|
|
|
166
166
|
```ts
|
|
167
|
-
|
|
167
|
+
import type { DexStreamPoolPayload } from "dritan-sdk";
|
|
168
|
+
|
|
169
|
+
const stream = client.streamDex<DexStreamPoolPayload>("amm", {
|
|
168
170
|
onMessage: (event) => {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
+
console.log(
|
|
172
|
+
event.poolId,
|
|
173
|
+
event.pricePerCoinUsd,
|
|
174
|
+
event.liquidity.totalLiquiditySolana,
|
|
175
|
+
event.liquidity.totalLiquidityUsdc
|
|
176
|
+
);
|
|
171
177
|
}
|
|
172
178
|
});
|
|
173
179
|
|
|
174
180
|
setTimeout(() => stream.close(), 10_000);
|
|
175
181
|
```
|
|
176
182
|
|
|
183
|
+
### Wallet stream
|
|
184
|
+
|
|
185
|
+
Wallet monitoring uses `/wallet-stream` and supports runtime subscription methods.
|
|
186
|
+
|
|
187
|
+
```ts
|
|
188
|
+
import { DritanClient, type WalletStreamEnvelope } from "dritan-sdk";
|
|
189
|
+
|
|
190
|
+
const client = new DritanClient({ apiKey: "YOUR_KEY" });
|
|
191
|
+
const walletStream = client.streamWallets<WalletStreamEnvelope>({
|
|
192
|
+
wallets: ["FV1r15rbNKkJanXLheoJA7fXEq6NDuMJ3bukXuhJWyV1"],
|
|
193
|
+
onMessage: (event) => {
|
|
194
|
+
if (event.type === "message" && event.data) {
|
|
195
|
+
console.log(event.data.wallet, event.data.type, event.data.tx);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
walletStream.subscribeWallets(["7Y...AnotherWallet"]);
|
|
201
|
+
walletStream.unsubscribeWallets(["7Y...AnotherWallet"]);
|
|
202
|
+
walletStream.listSubscriptions();
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Example wallet event payload:
|
|
206
|
+
|
|
207
|
+
```json
|
|
208
|
+
{
|
|
209
|
+
"type": "message",
|
|
210
|
+
"data": {
|
|
211
|
+
"tx": "5K8Hv...",
|
|
212
|
+
"wallet": "FV1r15rbNKkJanXLheoJA7fXEq6NDuMJ3bukXuhJWyV1",
|
|
213
|
+
"time": 1760272205000,
|
|
214
|
+
"slot": 398134973,
|
|
215
|
+
"type": "sell",
|
|
216
|
+
"solDelta": 1.2345,
|
|
217
|
+
"feeSol": 0.00001,
|
|
218
|
+
"from": {
|
|
219
|
+
"address": "2zMMhcVQEXDtdE6vsFS7S7D5oUodfJHE8vd1gnBouauv",
|
|
220
|
+
"amount": 33320.37,
|
|
221
|
+
"token": {
|
|
222
|
+
"address": "2zMMhcVQEXDtdE6vsFS7S7D5oUodfJHE8vd1gnBouauv",
|
|
223
|
+
"amount": -33320.37,
|
|
224
|
+
"decimals": 6,
|
|
225
|
+
"raw": "-33320371522"
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
"to": {
|
|
229
|
+
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
|
|
230
|
+
"amount": 751.75,
|
|
231
|
+
"token": {
|
|
232
|
+
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
|
|
233
|
+
"amount": 751.75,
|
|
234
|
+
"decimals": 6,
|
|
235
|
+
"raw": "751752741"
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
"tokenDeltas": [
|
|
239
|
+
{
|
|
240
|
+
"address": "2zMMhcVQEXDtdE6vsFS7S7D5oUodfJHE8vd1gnBouauv",
|
|
241
|
+
"amount": -33320.37,
|
|
242
|
+
"decimals": 6,
|
|
243
|
+
"raw": "-33320371522"
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
|
|
247
|
+
"amount": 751.75,
|
|
248
|
+
"decimals": 6,
|
|
249
|
+
"raw": "751752741"
|
|
250
|
+
}
|
|
251
|
+
],
|
|
252
|
+
"volume": {
|
|
253
|
+
"usd": 751.75
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
177
259
|
Note: browser websockets cannot send custom headers. If you use this SDK in the browser, pass `sendApiKeyInQuery: true` (this puts your API key in the websocket URL).
|
|
178
260
|
|
|
179
261
|
## Configuration
|
package/dist/index.cjs
CHANGED
|
@@ -339,6 +339,47 @@ var DritanClient = class {
|
|
|
339
339
|
close: () => ws.close()
|
|
340
340
|
};
|
|
341
341
|
}
|
|
342
|
+
streamWallets(options = {}) {
|
|
343
|
+
const initialWallets = (options.wallets ?? []).map((wallet) => wallet.trim()).filter((wallet) => wallet.length > 0);
|
|
344
|
+
const stream = this.streamDex("wallet-stream", {
|
|
345
|
+
...options,
|
|
346
|
+
onOpen: () => {
|
|
347
|
+
options.onOpen?.();
|
|
348
|
+
if (initialWallets.length > 0) {
|
|
349
|
+
try {
|
|
350
|
+
stream.socket.send(
|
|
351
|
+
JSON.stringify({
|
|
352
|
+
method: "subscribeWallets",
|
|
353
|
+
wallets: initialWallets
|
|
354
|
+
})
|
|
355
|
+
);
|
|
356
|
+
} catch {
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
const sendWalletCommand = (command) => {
|
|
362
|
+
const payload = JSON.stringify(command);
|
|
363
|
+
try {
|
|
364
|
+
stream.socket.send(payload);
|
|
365
|
+
} catch {
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
return {
|
|
369
|
+
...stream,
|
|
370
|
+
subscribeWallets: (wallets) => sendWalletCommand({
|
|
371
|
+
method: "subscribeWallets",
|
|
372
|
+
wallets
|
|
373
|
+
}),
|
|
374
|
+
unsubscribeWallets: (wallets) => sendWalletCommand({
|
|
375
|
+
method: "unsubscribeWallets",
|
|
376
|
+
wallets
|
|
377
|
+
}),
|
|
378
|
+
listSubscriptions: () => sendWalletCommand({
|
|
379
|
+
method: "listSubscriptions"
|
|
380
|
+
})
|
|
381
|
+
};
|
|
382
|
+
}
|
|
342
383
|
};
|
|
343
384
|
var createClient = (options) => new DritanClient(options);
|
|
344
385
|
var MeteoraThsClient = class {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["WebSocketImpl"],"mappings":";;;;;;;;;AA0PA,SAAS,QAAA,CAAS,SAAiB,IAAA,EAAsB;AACvD,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,EAAA,GAAK,GAAG,GAAG,IAAI,CAAA,CAAA;AAChF;AAEA,SAAS,UAAA,CACP,SAAA,EACA,IAAA,EACA,KAAA,EACQ;AACR,EAAA,MAAM,MAAM,IAAI,GAAA,CAAI,QAAA,CAAS,SAAA,EAAW,IAAI,CAAC,CAAA;AAC7C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,MAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,IAAA,EAAM;AACnC,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACnC;AAAA,EACF;AACA,EAAA,OAAO,IAAI,QAAA,EAAS;AACtB;AAEA,SAAS,cAAc,OAAA,EAA0B;AAC/C,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAA,GAAyB;AAChC,EAAA,OACE,OAAO,OAAA,KAAY,WAAA,IACnB,OAAQ,OAAA,CAAgB,UAAU,IAAA,KAAS,QAAA;AAE/C;AAEA,SAAS,gBAAgB,IAAA,EAA8B;AACrD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AAGrC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1D,IAAA,OAAO,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EAC7B;AAGA,EAAA,IAAI,gBAAgB,WAAA,EAAa;AAC/B,IAAA,OAAO,IAAI,WAAA,EAAY,CAAE,OAAO,IAAI,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,eAAN,MAAmB;AAAA,EACf,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACQ,SAAA;AAAA,EACA,aAAA;AAAA,EAEjB,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,4BAAA;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,0BAAA;AACtC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,KAAA,IAAS,KAAA;AAClC,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,SAAA,IAAaA,8BAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,cAAc,IAAA,EAA2C;AAC7D,IAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,OAAA,EAAS,gBAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AAC7E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAA8C;AACnE,IAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,OAAA,EAAS,mBAAmB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AAChF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,aAAa,IAAA,EAA0C;AAC3D,IAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,OAAA,EAAS,eAAe,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AAC5E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,eAAe,IAAA,EAAiD;AACpE,IAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,OAAA,EAAS,uBAAuB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AACpF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,mBAAmB,IAAA,EAAgD;AACvE,IAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,OAAA,EAAS,qBAAqB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AAClF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,MAAM,GAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA,CAAO,GAAA,EAAK,IAAA,IAAQ,IAAI,CAAA;AAAA,MAC9B,OAAO,GAAA,EAAK,KAAA;AAAA,MACZ,QAAA,EAAU,KAAK,QAAA,IAAY,IAAA;AAAA,MAC3B,IAAA,EAAM,KAAK,IAAA,IAAQ,IAAA;AAAA,MACnB,qBACE,GAAA,EAAK,mBAAA,KAAwB,MAAA,GAAY,IAAA,GAAQ,KAAK,mBAAA,IAAuB;AAAA,KACjF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAAmD;AACxE,IAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,OAAA,EAAS,yBAAyB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AACtF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,aAAA,CACJ,IAAA,EACA,SAAA,EACA,IAAA,EAC6B;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,IAAA,EAAM,UAAU,IAAA,EAAM,MAAA,CAAO,IAAI,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AACnE,IAAA,MAAM,EAAA,GAAK,OAAO,QAAA,EAAS;AAE3B,IAAA,MAAM,GAAA,GAAM,QAAA;AAAA,MACV,IAAA,CAAK,OAAA;AAAA,MACL,CAAA,aAAA,EAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,SAAS,CAAC,CAAA,EAAG,EAAA,GAAK,CAAA,CAAA,EAAI,EAAE,KAAK,EAAE,CAAA;AAAA,KAChG;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,oBAAA,CACJ,MAAA,EACA,IAAA,EAC4B;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAC,CAAA;AAC/F,IAAA,IAAI,IAAA,EAAM,mBAAmB,IAAA,EAAM;AACjC,MAAA,GAAA,CAAI,aAAa,GAAA,CAAI,iBAAA,EAAmB,IAAA,CAAK,eAAA,GAAkB,SAAS,OAAO,CAAA;AAAA,IACjF;AACA,IAAA,IAAI,IAAA,EAAM,gBAAgB,IAAA,EAAM;AAC9B,MAAA,GAAA,CAAI,aAAa,GAAA,CAAI,cAAA,EAAgB,IAAA,CAAK,YAAA,GAAe,SAAS,OAAO,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI,IAAA,EAAM,eAAe,IAAA,EAAM;AAC7B,MAAA,GAAA,CAAI,aAAa,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,WAAA,GAAc,SAAS,OAAO,CAAA;AAAA,IACzE;AAEA,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAS,EAAG;AAAA,MAC/C,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,yBAAA,CAA0B,MAAA,EAAgB,SAAA,EAAiD;AAC/F,IAAA,MAAM,GAAA,GAAM,QAAA;AAAA,MACV,IAAA,CAAK,OAAA;AAAA,MACL,uBAAuB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,SAAS,CAAC,CAAA;AAAA,KACpF;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,uBAAA,CACJ,MAAA,EACA,IAAA,EACuC;AACvC,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,CAAA,wBAAA,EAA2B,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAC,CAAA;AACnG,IAAA,IAAI,IAAA,EAAM,IAAA,IAAQ,IAAA,EAAM,GAAA,CAAI,YAAA,CAAa,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAEtE,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAS,EAAG;AAAA,MAC/C,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,0BAA0B,MAAA,EAAyD;AACvF,IAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,OAAA,EAAS,mBAAmB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAA;AAClF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,qBAAA,CACJ,MAAA,EACA,IAAA,EAC+B;AAC/B,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAC,CAAA;AACjG,IAAA,IAAI,MAAM,MAAA,EAAQ,GAAA,CAAI,aAAa,GAAA,CAAI,QAAA,EAAU,KAAK,MAAM,CAAA;AAE5D,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAS,EAAG;AAAA,MAC/C,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,kBAAkB,MAAA,EAAiD;AACvE,IAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,OAAA,EAAS,oBAAoB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAA;AACnF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,qBAAA,CAAsB,MAAA,EAAgB,IAAA,EAA+C;AACzF,IAAA,MAAM,GAAA,GAAM,QAAA;AAAA,MACV,IAAA,CAAK,OAAA;AAAA,MACL,CAAA,iBAAA,EAAoB,mBAAmB,MAAM,CAAC,SAAS,kBAAA,CAAmB,MAAA,CAAO,IAAI,CAAC,CAAC,CAAA;AAAA,KACzF;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK;AAAA;AACpB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,UAAU,IAAA,EAAoD;AAClE,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,aAAa,CAAA;AAChD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK,MAAA;AAAA,QAClB,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,IAAQ,EAAE;AAAA,KAChC,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,cAAc,uBAAA,EAAiE;AACnF,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,iBAAiB,CAAA;AACpD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAa,IAAA,CAAK,MAAA;AAAA,QAClB,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,yBAAyB;AAAA,KACjD,CAAA;AAED,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAIA,SAAA,CAAU,GAAA,EAAa,OAAA,GAA+B,EAAC,EAAuB;AAC5E,IAAA,MAAM,oBAAA,GAAuB,OAAA,CAAQ,iBAAA,IAAqB,CAAC,aAAA,EAAc;AACzE,IAAA,MAAM,QAAQ,EAAE,GAAI,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AAIzC,IAAA,IAAI,oBAAA,IAAwB,KAAA,CAAM,MAAA,IAAU,IAAA,EAAM;AAChD,MAAA,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA;AAAA,IACtB;AAEA,IAAA,MAAM,MAAM,UAAA,CAAW,IAAA,CAAK,WAAW,CAAA,CAAA,EAAI,GAAG,IAAI,KAAK,CAAA;AACvD,IAAA,MAAM,EAAA,GAAK,uBACP,IAAI,IAAA,CAAK,cAAc,GAAG,CAAA,GAC1B,IAAI,IAAA,CAAK,aAAA;AAAA,MACP,GAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS;AAAA,UACP,aAAa,IAAA,CAAK;AAAA;AACpB;AACF,KACF;AAEJ,IAAA,EAAA,CAAG,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,IAAS;AACnC,IAAA,EAAA,CAAG,OAAA,GAAU,CAAC,EAAA,KAAY,OAAA,CAAQ,UAAU,EAAgB,CAAA;AAC5D,IAAA,EAAA,CAAG,OAAA,GAAU,CAAC,EAAA,KAAY,OAAA,CAAQ,UAAU,EAAW,CAAA;AACvD,IAAA,EAAA,CAAG,SAAA,GAAY,CAAC,GAAA,KAAa;AAC3B,MAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,GAAA,GAAM,aAAA,CAAc,GAAG,IAAI,GAAA,CAAI,IAAA;AAC5C,MAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,EAAA;AAAA,MACR,KAAA,EAAO,MAAM,EAAA,CAAG,KAAA;AAAM,KACxB;AAAA,EACF;AACF;AAEO,IAAM,YAAA,GAAe,CAAC,OAAA,KAAiC,IAAI,aAAa,OAAO;AAE/E,IAAM,mBAAN,MAAuB;AAAA,EACnB,OAAA;AAAA,EACQ,SAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAAmC,EAAC,EAAG;AACjD,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,wBAAA;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,KAAA,IAAS,KAAA;AAAA,EACpC;AAAA,EAEA,MAAM,MAAA,GAA2B;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,SAAS,CAAA;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,MAAA,EAAQ,OAAO,CAAA;AACvD,IAAA,OAAO,GAAA,CAAI,EAAA;AAAA,EACb;AAAA,EAEA,MAAM,WAAA,CACJ,MAAA,EACA,OAAA,GAAoD,EAAC,EAC/B;AACtB,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,CAAA,KAAA,EAAQ,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAC,CAAA;AAChF,IAAA,IAAI,QAAQ,KAAA,EAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAS,GAAG,CAAA;AACpD,IAAA,IAAI,QAAQ,SAAA,EAAW,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,aAAa,GAAG,CAAA;AAE5D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAS,EAAG,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAClE,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACzF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,oBAAA,CACJ,MAAA,EACA,UAAA,EACA,OAAA,GAAoD,EAAC,EAC/B;AACtB,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,CAAA,KAAA,EAAQ,kBAAA,CAAmB,MAAM,CAAC,CAAA,OAAA,CAAS,CAAC,CAAA;AACvF,IAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,IAAc,EAAC,EAAG;AACnC,MAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,YAAA,EAAc,IAAI,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,QAAQ,KAAA,EAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAS,GAAG,CAAA;AACpD,IAAA,IAAI,QAAQ,SAAA,EAAW,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,aAAa,GAAG,CAAA;AAE5D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAS,EAAG,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAClE,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACzF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA,EAEA,MAAM,qBAAA,CACJ,MAAA,EACA,UAAA,EACA,OAAA,GAAoD,EAAC,EAC/B;AACtB,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,CAAA,KAAA,EAAQ,kBAAA,CAAmB,MAAM,CAAC,CAAA,OAAA,CAAS,CAAC,CAAA;AACvF,IAAA,IAAI,QAAQ,KAAA,EAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAS,GAAG,CAAA;AACpD,IAAA,IAAI,QAAQ,SAAA,EAAW,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,aAAa,GAAG,CAAA;AAE5D,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAS,EAAG;AAAA,MAC/C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,YAAY,UAAA,IAAc,IAAI;AAAA,KACtD,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACzF;AAEA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AACF;AAEO,IAAM,sBAAA,GAAyB,CAAC,OAAA,KACrC,IAAI,iBAAiB,OAAO","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 OhlcvBar = {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n};\n\nexport type TokenOhlcvResponse = {\n mint: string;\n timeframe: string;\n bucketSizeSec: number;\n bondingPoolId: string | null;\n graduatedPoolId: string | null;\n closed: OhlcvBar[];\n active: OhlcvBar | null;\n};\n\nexport type WalletPnlTokenStats = Record<string, unknown>;\n\nexport type WalletPnlResponse = {\n tokens?: Record<string, WalletPnlTokenStats>;\n summary?: Record<string, unknown>;\n [k: string]: unknown;\n};\n\nexport type WalletPortfolioChartResponse = {\n wallet: string;\n total: number;\n totalInvested: number;\n totalWins: number;\n totalLosses: number;\n winPercentage: number;\n history: Record<string, number>;\n};\n\nexport type BasicWalletInformationResponse = {\n wallet: string;\n totalSol: number;\n totalTokenValue: number;\n totalValue: number;\n holdings: number;\n totalHoldingValue: number;\n};\n\nexport type WalletTradeToken = {\n tokenAddress: string;\n name: string;\n symbol: string;\n decimals: number;\n amount: number;\n [k: string]: unknown;\n};\n\nexport type WalletTrade = {\n tx: string;\n wallet: string;\n from?: WalletTradeToken;\n to?: WalletTradeToken;\n program?: string;\n time?: number;\n type?: string;\n [k: string]: unknown;\n};\n\nexport type WalletTradesResponse = {\n trades: WalletTrade[];\n nextCursor?: string;\n hasNextPage?: boolean;\n};\n\nexport type WalletTokenInfo = {\n name: string;\n symbol: string;\n mint: string;\n decimals: number;\n [k: string]: unknown;\n};\n\nexport type WalletTokenPosition = {\n token: WalletTokenInfo;\n balance: number;\n value: number;\n [k: string]: unknown;\n};\n\nexport type WalletHoldingsResponse = {\n wallet: string;\n totalSol?: number;\n tokens: WalletTokenPosition[];\n total?: number;\n totalTokens?: number;\n hasNextPage?: boolean;\n [k: string]: unknown;\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 getTokenOhlcv(\n mint: string,\n timeframe: string,\n opts?: { timeTo?: number }\n ): Promise<TokenOhlcvResponse> {\n const search = new URLSearchParams();\n if (opts?.timeTo != null) search.set(\"time_to\", String(opts.timeTo));\n const qs = search.toString();\n\n const url = buildUrl(\n this.baseUrl,\n `/token/ohlcv/${encodeURIComponent(mint)}/${encodeURIComponent(timeframe)}${qs ? `?${qs}` : \"\"}`\n );\n\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 TokenOhlcvResponse;\n }\n\n async getWalletPerformance(\n wallet: string,\n opts?: { showHistoricPnL?: boolean; holdingCheck?: boolean; hideDetails?: boolean }\n ): Promise<WalletPnlResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/performance/${encodeURIComponent(wallet)}`));\n if (opts?.showHistoricPnL != null) {\n url.searchParams.set(\"showHistoricPnL\", opts.showHistoricPnL ? \"true\" : \"false\");\n }\n if (opts?.holdingCheck != null) {\n url.searchParams.set(\"holdingCheck\", opts.holdingCheck ? \"true\" : \"false\");\n }\n if (opts?.hideDetails != null) {\n url.searchParams.set(\"hideDetails\", opts.hideDetails ? \"true\" : \"false\");\n }\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletPnlResponse;\n }\n\n async getWalletTokenPerformance(wallet: string, tokenMint: string): Promise<WalletPnlTokenStats> {\n const url = buildUrl(\n this.baseUrl,\n `/wallet/performance/${encodeURIComponent(wallet)}/${encodeURIComponent(tokenMint)}`\n );\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 WalletPnlTokenStats;\n }\n\n async getWalletPortfolioChart(\n wallet: string,\n opts?: { days?: number }\n ): Promise<WalletPortfolioChartResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/portfolio-chart/${encodeURIComponent(wallet)}`));\n if (opts?.days != null) url.searchParams.set(\"days\", String(opts.days));\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletPortfolioChartResponse;\n }\n\n async getBasicWalletInformation(wallet: string): Promise<BasicWalletInformationResponse> {\n const url = buildUrl(this.baseUrl, `/wallet/summary/${encodeURIComponent(wallet)}`);\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 BasicWalletInformationResponse;\n }\n\n async getWalletTradeHistory(\n wallet: string,\n opts?: { cursor?: string }\n ): Promise<WalletTradesResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/trade-history/${encodeURIComponent(wallet)}`));\n if (opts?.cursor) url.searchParams.set(\"cursor\", opts.cursor);\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletTradesResponse;\n }\n\n async getWalletHoldings(wallet: string): Promise<WalletHoldingsResponse> {\n const url = buildUrl(this.baseUrl, `/wallet/holdings/${encodeURIComponent(wallet)}`);\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 WalletHoldingsResponse;\n }\n\n async getWalletHoldingsPage(wallet: string, page: number): Promise<WalletHoldingsResponse> {\n const url = buildUrl(\n this.baseUrl,\n `/wallet/holdings/${encodeURIComponent(wallet)}/page/${encodeURIComponent(String(page))}`\n );\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 WalletHoldingsResponse;\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 OhlcvBar = {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n};\n\nexport type TokenOhlcvResponse = {\n mint: string;\n timeframe: string;\n bucketSizeSec: number;\n bondingPoolId: string | null;\n graduatedPoolId: string | null;\n closed: OhlcvBar[];\n active: OhlcvBar | null;\n};\n\nexport type StreamLiquidity = {\n basePooled: number | null;\n quotePooled: number | null;\n totalLiquiditySolana: number | null;\n totalLiquidityUsdc: number | null;\n};\n\nexport type StreamMintPair = {\n base: string;\n quote: string;\n};\n\nexport type StreamDecimals = {\n base: number | null;\n quote: number | null;\n};\n\nexport type StreamReserves = {\n base: number | null;\n quote: number | null;\n};\n\nexport type DexStreamPoolPayload = {\n poolId: string;\n mints: StreamMintPair;\n decimals: StreamDecimals;\n marketCap: number | null;\n pricePerCoin: number | null;\n liquidity: StreamLiquidity;\n pricePerCoinUsd: number | null;\n tokenSupply: number | null;\n reserves: StreamReserves;\n slot: number;\n signature?: string;\n context?: string;\n curvePercentage?: number | null;\n complete?: boolean;\n};\n\nexport type WalletPnlTokenStats = Record<string, unknown>;\n\nexport type WalletPnlResponse = {\n tokens?: Record<string, WalletPnlTokenStats>;\n summary?: Record<string, unknown>;\n [k: string]: unknown;\n};\n\nexport type WalletPortfolioChartResponse = {\n wallet: string;\n total: number;\n totalInvested: number;\n totalWins: number;\n totalLosses: number;\n winPercentage: number;\n history: Record<string, number>;\n};\n\nexport type BasicWalletInformationResponse = {\n wallet: string;\n totalSol: number;\n totalTokenValue: number;\n totalValue: number;\n holdings: number;\n totalHoldingValue: number;\n};\n\nexport type WalletTradeToken = {\n tokenAddress: string;\n name: string;\n symbol: string;\n decimals: number;\n amount: number;\n [k: string]: unknown;\n};\n\nexport type WalletTrade = {\n tx: string;\n wallet: string;\n from?: WalletTradeToken;\n to?: WalletTradeToken;\n program?: string;\n time?: number;\n type?: string;\n [k: string]: unknown;\n};\n\nexport type WalletTradesResponse = {\n trades: WalletTrade[];\n nextCursor?: string;\n hasNextPage?: boolean;\n};\n\nexport type WalletTokenInfo = {\n name: string;\n symbol: string;\n mint: string;\n decimals: number;\n [k: string]: unknown;\n};\n\nexport type WalletTokenPosition = {\n token: WalletTokenInfo;\n balance: number;\n value: number;\n [k: string]: unknown;\n};\n\nexport type WalletHoldingsResponse = {\n wallet: string;\n totalSol?: number;\n tokens: WalletTokenPosition[];\n total?: number;\n totalTokens?: number;\n hasNextPage?: boolean;\n [k: string]: unknown;\n};\n\nexport type DritanStreamOptions<TMessage = unknown> = {\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: TMessage) => void;\n};\n\nexport type DritanStreamHandle = {\n socket: WebSocket;\n close: () => void;\n};\n\nexport type WalletStreamMethod =\n | \"subscribeWallets\"\n | \"unsubscribeWallets\"\n | \"listSubscriptions\";\n\nexport type WalletStreamCommand = {\n method: WalletStreamMethod;\n wallets?: string[];\n};\n\nexport type WalletStreamTokenDelta = {\n address: string;\n amount: number;\n decimals: number;\n raw: string;\n};\n\nexport type WalletStreamSide = {\n address: string;\n amount: number;\n token: WalletStreamTokenDelta;\n};\n\nexport type WalletStreamVolume = {\n usd?: number;\n sol?: number;\n};\n\nexport type WalletStreamData = {\n tx: string;\n wallet: string;\n time: number;\n slot: number;\n type: string;\n solDelta: number;\n feeSol: number;\n from?: WalletStreamSide;\n to?: WalletStreamSide;\n tokenDeltas: WalletStreamTokenDelta[];\n volume?: WalletStreamVolume;\n};\n\nexport type WalletStreamEnvelope = {\n type: string;\n data?: WalletStreamData;\n wallets?: string[];\n invalidWallets?: string[];\n subscriptions?: string[];\n subscriptionCount?: number;\n limitHit?: boolean;\n methods?: string[];\n maxWallets?: number;\n message?: string;\n};\n\nexport type WalletStreamOptions<TMessage = WalletStreamEnvelope> = DritanStreamOptions<TMessage> & {\n wallets?: string[];\n};\n\nexport type WalletStreamHandle = DritanStreamHandle & {\n subscribeWallets: (wallets: string[]) => void;\n unsubscribeWallets: (wallets: string[]) => void;\n listSubscriptions: () => 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 getTokenOhlcv(\n mint: string,\n timeframe: string,\n opts?: { timeTo?: number }\n ): Promise<TokenOhlcvResponse> {\n const search = new URLSearchParams();\n if (opts?.timeTo != null) search.set(\"time_to\", String(opts.timeTo));\n const qs = search.toString();\n\n const url = buildUrl(\n this.baseUrl,\n `/token/ohlcv/${encodeURIComponent(mint)}/${encodeURIComponent(timeframe)}${qs ? `?${qs}` : \"\"}`\n );\n\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 TokenOhlcvResponse;\n }\n\n async getWalletPerformance(\n wallet: string,\n opts?: { showHistoricPnL?: boolean; holdingCheck?: boolean; hideDetails?: boolean }\n ): Promise<WalletPnlResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/performance/${encodeURIComponent(wallet)}`));\n if (opts?.showHistoricPnL != null) {\n url.searchParams.set(\"showHistoricPnL\", opts.showHistoricPnL ? \"true\" : \"false\");\n }\n if (opts?.holdingCheck != null) {\n url.searchParams.set(\"holdingCheck\", opts.holdingCheck ? \"true\" : \"false\");\n }\n if (opts?.hideDetails != null) {\n url.searchParams.set(\"hideDetails\", opts.hideDetails ? \"true\" : \"false\");\n }\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletPnlResponse;\n }\n\n async getWalletTokenPerformance(wallet: string, tokenMint: string): Promise<WalletPnlTokenStats> {\n const url = buildUrl(\n this.baseUrl,\n `/wallet/performance/${encodeURIComponent(wallet)}/${encodeURIComponent(tokenMint)}`\n );\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 WalletPnlTokenStats;\n }\n\n async getWalletPortfolioChart(\n wallet: string,\n opts?: { days?: number }\n ): Promise<WalletPortfolioChartResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/portfolio-chart/${encodeURIComponent(wallet)}`));\n if (opts?.days != null) url.searchParams.set(\"days\", String(opts.days));\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletPortfolioChartResponse;\n }\n\n async getBasicWalletInformation(wallet: string): Promise<BasicWalletInformationResponse> {\n const url = buildUrl(this.baseUrl, `/wallet/summary/${encodeURIComponent(wallet)}`);\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 BasicWalletInformationResponse;\n }\n\n async getWalletTradeHistory(\n wallet: string,\n opts?: { cursor?: string }\n ): Promise<WalletTradesResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/trade-history/${encodeURIComponent(wallet)}`));\n if (opts?.cursor) url.searchParams.set(\"cursor\", opts.cursor);\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletTradesResponse;\n }\n\n async getWalletHoldings(wallet: string): Promise<WalletHoldingsResponse> {\n const url = buildUrl(this.baseUrl, `/wallet/holdings/${encodeURIComponent(wallet)}`);\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 WalletHoldingsResponse;\n }\n\n async getWalletHoldingsPage(wallet: string, page: number): Promise<WalletHoldingsResponse> {\n const url = buildUrl(\n this.baseUrl,\n `/wallet/holdings/${encodeURIComponent(wallet)}/page/${encodeURIComponent(String(page))}`\n );\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 WalletHoldingsResponse;\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<TMessage = unknown>(\n dex: KnownDexStream,\n options?: DritanStreamOptions<TMessage>\n ): DritanStreamHandle;\n streamDex<TMessage = unknown>(\n dex: string,\n options?: DritanStreamOptions<TMessage>\n ): DritanStreamHandle;\n streamDex<TMessage = unknown>(\n dex: string,\n options: DritanStreamOptions<TMessage> = {}\n ): 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 as TMessage);\n };\n\n return {\n socket: ws as unknown as WebSocket,\n close: () => ws.close()\n };\n }\n\n streamWallets<TMessage = WalletStreamEnvelope>(\n options: WalletStreamOptions<TMessage> = {}\n ): WalletStreamHandle {\n const initialWallets = (options.wallets ?? [])\n .map((wallet) => wallet.trim())\n .filter((wallet) => wallet.length > 0);\n\n const stream = this.streamDex<TMessage>(\"wallet-stream\", {\n ...options,\n onOpen: () => {\n options.onOpen?.();\n if (initialWallets.length > 0) {\n try {\n (stream.socket as any).send(\n JSON.stringify({\n method: \"subscribeWallets\",\n wallets: initialWallets\n } as WalletStreamCommand)\n );\n } catch {\n // no-op\n }\n }\n }\n });\n\n const sendWalletCommand = (command: WalletStreamCommand) => {\n const payload = JSON.stringify(command);\n try {\n (stream.socket as any).send(payload);\n } catch {\n // no-op\n }\n };\n\n return {\n ...stream,\n subscribeWallets: (wallets: string[]) =>\n sendWalletCommand({\n method: \"subscribeWallets\",\n wallets\n }),\n unsubscribeWallets: (wallets: string[]) =>\n sendWalletCommand({\n method: \"unsubscribeWallets\",\n wallets\n }),\n listSubscriptions: () =>\n sendWalletCommand({\n method: \"listSubscriptions\"\n })\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
|
@@ -77,6 +77,40 @@ type TokenOhlcvResponse = {
|
|
|
77
77
|
closed: OhlcvBar[];
|
|
78
78
|
active: OhlcvBar | null;
|
|
79
79
|
};
|
|
80
|
+
type StreamLiquidity = {
|
|
81
|
+
basePooled: number | null;
|
|
82
|
+
quotePooled: number | null;
|
|
83
|
+
totalLiquiditySolana: number | null;
|
|
84
|
+
totalLiquidityUsdc: number | null;
|
|
85
|
+
};
|
|
86
|
+
type StreamMintPair = {
|
|
87
|
+
base: string;
|
|
88
|
+
quote: string;
|
|
89
|
+
};
|
|
90
|
+
type StreamDecimals = {
|
|
91
|
+
base: number | null;
|
|
92
|
+
quote: number | null;
|
|
93
|
+
};
|
|
94
|
+
type StreamReserves = {
|
|
95
|
+
base: number | null;
|
|
96
|
+
quote: number | null;
|
|
97
|
+
};
|
|
98
|
+
type DexStreamPoolPayload = {
|
|
99
|
+
poolId: string;
|
|
100
|
+
mints: StreamMintPair;
|
|
101
|
+
decimals: StreamDecimals;
|
|
102
|
+
marketCap: number | null;
|
|
103
|
+
pricePerCoin: number | null;
|
|
104
|
+
liquidity: StreamLiquidity;
|
|
105
|
+
pricePerCoinUsd: number | null;
|
|
106
|
+
tokenSupply: number | null;
|
|
107
|
+
reserves: StreamReserves;
|
|
108
|
+
slot: number;
|
|
109
|
+
signature?: string;
|
|
110
|
+
context?: string;
|
|
111
|
+
curvePercentage?: number | null;
|
|
112
|
+
complete?: boolean;
|
|
113
|
+
};
|
|
80
114
|
type WalletPnlTokenStats = Record<string, unknown>;
|
|
81
115
|
type WalletPnlResponse = {
|
|
82
116
|
tokens?: Record<string, WalletPnlTokenStats>;
|
|
@@ -145,7 +179,7 @@ type WalletHoldingsResponse = {
|
|
|
145
179
|
hasNextPage?: boolean;
|
|
146
180
|
[k: string]: unknown;
|
|
147
181
|
};
|
|
148
|
-
type DritanStreamOptions = {
|
|
182
|
+
type DritanStreamOptions<TMessage = unknown> = {
|
|
149
183
|
query?: Record<string, string | number | boolean | undefined | null>;
|
|
150
184
|
/**
|
|
151
185
|
* When true, includes the api key as `?apiKey=...` in the websocket URL.
|
|
@@ -155,12 +189,65 @@ type DritanStreamOptions = {
|
|
|
155
189
|
onOpen?: () => void;
|
|
156
190
|
onClose?: (ev: CloseEvent) => void;
|
|
157
191
|
onError?: (ev: Event) => void;
|
|
158
|
-
onMessage?: (data:
|
|
192
|
+
onMessage?: (data: TMessage) => void;
|
|
159
193
|
};
|
|
160
194
|
type DritanStreamHandle = {
|
|
161
195
|
socket: WebSocket;
|
|
162
196
|
close: () => void;
|
|
163
197
|
};
|
|
198
|
+
type WalletStreamMethod = "subscribeWallets" | "unsubscribeWallets" | "listSubscriptions";
|
|
199
|
+
type WalletStreamCommand = {
|
|
200
|
+
method: WalletStreamMethod;
|
|
201
|
+
wallets?: string[];
|
|
202
|
+
};
|
|
203
|
+
type WalletStreamTokenDelta = {
|
|
204
|
+
address: string;
|
|
205
|
+
amount: number;
|
|
206
|
+
decimals: number;
|
|
207
|
+
raw: string;
|
|
208
|
+
};
|
|
209
|
+
type WalletStreamSide = {
|
|
210
|
+
address: string;
|
|
211
|
+
amount: number;
|
|
212
|
+
token: WalletStreamTokenDelta;
|
|
213
|
+
};
|
|
214
|
+
type WalletStreamVolume = {
|
|
215
|
+
usd?: number;
|
|
216
|
+
sol?: number;
|
|
217
|
+
};
|
|
218
|
+
type WalletStreamData = {
|
|
219
|
+
tx: string;
|
|
220
|
+
wallet: string;
|
|
221
|
+
time: number;
|
|
222
|
+
slot: number;
|
|
223
|
+
type: string;
|
|
224
|
+
solDelta: number;
|
|
225
|
+
feeSol: number;
|
|
226
|
+
from?: WalletStreamSide;
|
|
227
|
+
to?: WalletStreamSide;
|
|
228
|
+
tokenDeltas: WalletStreamTokenDelta[];
|
|
229
|
+
volume?: WalletStreamVolume;
|
|
230
|
+
};
|
|
231
|
+
type WalletStreamEnvelope = {
|
|
232
|
+
type: string;
|
|
233
|
+
data?: WalletStreamData;
|
|
234
|
+
wallets?: string[];
|
|
235
|
+
invalidWallets?: string[];
|
|
236
|
+
subscriptions?: string[];
|
|
237
|
+
subscriptionCount?: number;
|
|
238
|
+
limitHit?: boolean;
|
|
239
|
+
methods?: string[];
|
|
240
|
+
maxWallets?: number;
|
|
241
|
+
message?: string;
|
|
242
|
+
};
|
|
243
|
+
type WalletStreamOptions<TMessage = WalletStreamEnvelope> = DritanStreamOptions<TMessage> & {
|
|
244
|
+
wallets?: string[];
|
|
245
|
+
};
|
|
246
|
+
type WalletStreamHandle = DritanStreamHandle & {
|
|
247
|
+
subscribeWallets: (wallets: string[]) => void;
|
|
248
|
+
unsubscribeWallets: (wallets: string[]) => void;
|
|
249
|
+
listSubscriptions: () => void;
|
|
250
|
+
};
|
|
164
251
|
type SwapBuildRequest = {
|
|
165
252
|
userPublicKey: string;
|
|
166
253
|
inputMint: string;
|
|
@@ -239,8 +326,9 @@ declare class DritanClient {
|
|
|
239
326
|
getWalletHoldingsPage(wallet: string, page: number): Promise<WalletHoldingsResponse>;
|
|
240
327
|
buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse>;
|
|
241
328
|
broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse>;
|
|
242
|
-
streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;
|
|
243
|
-
streamDex(dex: string, options?: DritanStreamOptions): DritanStreamHandle;
|
|
329
|
+
streamDex<TMessage = unknown>(dex: KnownDexStream, options?: DritanStreamOptions<TMessage>): DritanStreamHandle;
|
|
330
|
+
streamDex<TMessage = unknown>(dex: string, options?: DritanStreamOptions<TMessage>): DritanStreamHandle;
|
|
331
|
+
streamWallets<TMessage = WalletStreamEnvelope>(options?: WalletStreamOptions<TMessage>): WalletStreamHandle;
|
|
244
332
|
}
|
|
245
333
|
declare const createClient: (options: DritanClientOptions) => DritanClient;
|
|
246
334
|
declare class MeteoraThsClient {
|
|
@@ -263,4 +351,4 @@ declare class MeteoraThsClient {
|
|
|
263
351
|
}
|
|
264
352
|
declare const createMeteoraThsClient: (options?: MeteoraThsClientOptions) => MeteoraThsClient;
|
|
265
353
|
|
|
266
|
-
export { type BasicWalletInformationResponse, DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type OhlcvBar, type RiskGroup, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenDeployerStatsResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenOhlcvResponse, type TokenPriceResponse, type TokenRiskResponse, type WalletHoldingsResponse, type WalletPnlResponse, type WalletPnlTokenStats, type WalletPortfolioChartResponse, type WalletTokenInfo, type WalletTokenPosition, type WalletTrade, type WalletTradeToken, type WalletTradesResponse, createClient, createMeteoraThsClient };
|
|
354
|
+
export { type BasicWalletInformationResponse, type DexStreamPoolPayload, DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type OhlcvBar, type RiskGroup, type StreamDecimals, type StreamLiquidity, type StreamMintPair, type StreamReserves, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenDeployerStatsResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenOhlcvResponse, type TokenPriceResponse, type TokenRiskResponse, type WalletHoldingsResponse, type WalletPnlResponse, type WalletPnlTokenStats, type WalletPortfolioChartResponse, type WalletStreamCommand, type WalletStreamData, type WalletStreamEnvelope, type WalletStreamHandle, type WalletStreamMethod, type WalletStreamOptions, type WalletStreamSide, type WalletStreamTokenDelta, type WalletStreamVolume, type WalletTokenInfo, type WalletTokenPosition, type WalletTrade, type WalletTradeToken, type WalletTradesResponse, createClient, createMeteoraThsClient };
|
package/dist/index.d.ts
CHANGED
|
@@ -77,6 +77,40 @@ type TokenOhlcvResponse = {
|
|
|
77
77
|
closed: OhlcvBar[];
|
|
78
78
|
active: OhlcvBar | null;
|
|
79
79
|
};
|
|
80
|
+
type StreamLiquidity = {
|
|
81
|
+
basePooled: number | null;
|
|
82
|
+
quotePooled: number | null;
|
|
83
|
+
totalLiquiditySolana: number | null;
|
|
84
|
+
totalLiquidityUsdc: number | null;
|
|
85
|
+
};
|
|
86
|
+
type StreamMintPair = {
|
|
87
|
+
base: string;
|
|
88
|
+
quote: string;
|
|
89
|
+
};
|
|
90
|
+
type StreamDecimals = {
|
|
91
|
+
base: number | null;
|
|
92
|
+
quote: number | null;
|
|
93
|
+
};
|
|
94
|
+
type StreamReserves = {
|
|
95
|
+
base: number | null;
|
|
96
|
+
quote: number | null;
|
|
97
|
+
};
|
|
98
|
+
type DexStreamPoolPayload = {
|
|
99
|
+
poolId: string;
|
|
100
|
+
mints: StreamMintPair;
|
|
101
|
+
decimals: StreamDecimals;
|
|
102
|
+
marketCap: number | null;
|
|
103
|
+
pricePerCoin: number | null;
|
|
104
|
+
liquidity: StreamLiquidity;
|
|
105
|
+
pricePerCoinUsd: number | null;
|
|
106
|
+
tokenSupply: number | null;
|
|
107
|
+
reserves: StreamReserves;
|
|
108
|
+
slot: number;
|
|
109
|
+
signature?: string;
|
|
110
|
+
context?: string;
|
|
111
|
+
curvePercentage?: number | null;
|
|
112
|
+
complete?: boolean;
|
|
113
|
+
};
|
|
80
114
|
type WalletPnlTokenStats = Record<string, unknown>;
|
|
81
115
|
type WalletPnlResponse = {
|
|
82
116
|
tokens?: Record<string, WalletPnlTokenStats>;
|
|
@@ -145,7 +179,7 @@ type WalletHoldingsResponse = {
|
|
|
145
179
|
hasNextPage?: boolean;
|
|
146
180
|
[k: string]: unknown;
|
|
147
181
|
};
|
|
148
|
-
type DritanStreamOptions = {
|
|
182
|
+
type DritanStreamOptions<TMessage = unknown> = {
|
|
149
183
|
query?: Record<string, string | number | boolean | undefined | null>;
|
|
150
184
|
/**
|
|
151
185
|
* When true, includes the api key as `?apiKey=...` in the websocket URL.
|
|
@@ -155,12 +189,65 @@ type DritanStreamOptions = {
|
|
|
155
189
|
onOpen?: () => void;
|
|
156
190
|
onClose?: (ev: CloseEvent) => void;
|
|
157
191
|
onError?: (ev: Event) => void;
|
|
158
|
-
onMessage?: (data:
|
|
192
|
+
onMessage?: (data: TMessage) => void;
|
|
159
193
|
};
|
|
160
194
|
type DritanStreamHandle = {
|
|
161
195
|
socket: WebSocket;
|
|
162
196
|
close: () => void;
|
|
163
197
|
};
|
|
198
|
+
type WalletStreamMethod = "subscribeWallets" | "unsubscribeWallets" | "listSubscriptions";
|
|
199
|
+
type WalletStreamCommand = {
|
|
200
|
+
method: WalletStreamMethod;
|
|
201
|
+
wallets?: string[];
|
|
202
|
+
};
|
|
203
|
+
type WalletStreamTokenDelta = {
|
|
204
|
+
address: string;
|
|
205
|
+
amount: number;
|
|
206
|
+
decimals: number;
|
|
207
|
+
raw: string;
|
|
208
|
+
};
|
|
209
|
+
type WalletStreamSide = {
|
|
210
|
+
address: string;
|
|
211
|
+
amount: number;
|
|
212
|
+
token: WalletStreamTokenDelta;
|
|
213
|
+
};
|
|
214
|
+
type WalletStreamVolume = {
|
|
215
|
+
usd?: number;
|
|
216
|
+
sol?: number;
|
|
217
|
+
};
|
|
218
|
+
type WalletStreamData = {
|
|
219
|
+
tx: string;
|
|
220
|
+
wallet: string;
|
|
221
|
+
time: number;
|
|
222
|
+
slot: number;
|
|
223
|
+
type: string;
|
|
224
|
+
solDelta: number;
|
|
225
|
+
feeSol: number;
|
|
226
|
+
from?: WalletStreamSide;
|
|
227
|
+
to?: WalletStreamSide;
|
|
228
|
+
tokenDeltas: WalletStreamTokenDelta[];
|
|
229
|
+
volume?: WalletStreamVolume;
|
|
230
|
+
};
|
|
231
|
+
type WalletStreamEnvelope = {
|
|
232
|
+
type: string;
|
|
233
|
+
data?: WalletStreamData;
|
|
234
|
+
wallets?: string[];
|
|
235
|
+
invalidWallets?: string[];
|
|
236
|
+
subscriptions?: string[];
|
|
237
|
+
subscriptionCount?: number;
|
|
238
|
+
limitHit?: boolean;
|
|
239
|
+
methods?: string[];
|
|
240
|
+
maxWallets?: number;
|
|
241
|
+
message?: string;
|
|
242
|
+
};
|
|
243
|
+
type WalletStreamOptions<TMessage = WalletStreamEnvelope> = DritanStreamOptions<TMessage> & {
|
|
244
|
+
wallets?: string[];
|
|
245
|
+
};
|
|
246
|
+
type WalletStreamHandle = DritanStreamHandle & {
|
|
247
|
+
subscribeWallets: (wallets: string[]) => void;
|
|
248
|
+
unsubscribeWallets: (wallets: string[]) => void;
|
|
249
|
+
listSubscriptions: () => void;
|
|
250
|
+
};
|
|
164
251
|
type SwapBuildRequest = {
|
|
165
252
|
userPublicKey: string;
|
|
166
253
|
inputMint: string;
|
|
@@ -239,8 +326,9 @@ declare class DritanClient {
|
|
|
239
326
|
getWalletHoldingsPage(wallet: string, page: number): Promise<WalletHoldingsResponse>;
|
|
240
327
|
buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse>;
|
|
241
328
|
broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse>;
|
|
242
|
-
streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;
|
|
243
|
-
streamDex(dex: string, options?: DritanStreamOptions): DritanStreamHandle;
|
|
329
|
+
streamDex<TMessage = unknown>(dex: KnownDexStream, options?: DritanStreamOptions<TMessage>): DritanStreamHandle;
|
|
330
|
+
streamDex<TMessage = unknown>(dex: string, options?: DritanStreamOptions<TMessage>): DritanStreamHandle;
|
|
331
|
+
streamWallets<TMessage = WalletStreamEnvelope>(options?: WalletStreamOptions<TMessage>): WalletStreamHandle;
|
|
244
332
|
}
|
|
245
333
|
declare const createClient: (options: DritanClientOptions) => DritanClient;
|
|
246
334
|
declare class MeteoraThsClient {
|
|
@@ -263,4 +351,4 @@ declare class MeteoraThsClient {
|
|
|
263
351
|
}
|
|
264
352
|
declare const createMeteoraThsClient: (options?: MeteoraThsClientOptions) => MeteoraThsClient;
|
|
265
353
|
|
|
266
|
-
export { type BasicWalletInformationResponse, DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type OhlcvBar, type RiskGroup, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenDeployerStatsResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenOhlcvResponse, type TokenPriceResponse, type TokenRiskResponse, type WalletHoldingsResponse, type WalletPnlResponse, type WalletPnlTokenStats, type WalletPortfolioChartResponse, type WalletTokenInfo, type WalletTokenPosition, type WalletTrade, type WalletTradeToken, type WalletTradesResponse, createClient, createMeteoraThsClient };
|
|
354
|
+
export { type BasicWalletInformationResponse, type DexStreamPoolPayload, DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type OhlcvBar, type RiskGroup, type StreamDecimals, type StreamLiquidity, type StreamMintPair, type StreamReserves, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenDeployerStatsResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenOhlcvResponse, type TokenPriceResponse, type TokenRiskResponse, type WalletHoldingsResponse, type WalletPnlResponse, type WalletPnlTokenStats, type WalletPortfolioChartResponse, type WalletStreamCommand, type WalletStreamData, type WalletStreamEnvelope, type WalletStreamHandle, type WalletStreamMethod, type WalletStreamOptions, type WalletStreamSide, type WalletStreamTokenDelta, type WalletStreamVolume, type WalletTokenInfo, type WalletTokenPosition, type WalletTrade, type WalletTradeToken, type WalletTradesResponse, createClient, createMeteoraThsClient };
|
package/dist/index.js
CHANGED
|
@@ -333,6 +333,47 @@ var DritanClient = class {
|
|
|
333
333
|
close: () => ws.close()
|
|
334
334
|
};
|
|
335
335
|
}
|
|
336
|
+
streamWallets(options = {}) {
|
|
337
|
+
const initialWallets = (options.wallets ?? []).map((wallet) => wallet.trim()).filter((wallet) => wallet.length > 0);
|
|
338
|
+
const stream = this.streamDex("wallet-stream", {
|
|
339
|
+
...options,
|
|
340
|
+
onOpen: () => {
|
|
341
|
+
options.onOpen?.();
|
|
342
|
+
if (initialWallets.length > 0) {
|
|
343
|
+
try {
|
|
344
|
+
stream.socket.send(
|
|
345
|
+
JSON.stringify({
|
|
346
|
+
method: "subscribeWallets",
|
|
347
|
+
wallets: initialWallets
|
|
348
|
+
})
|
|
349
|
+
);
|
|
350
|
+
} catch {
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
const sendWalletCommand = (command) => {
|
|
356
|
+
const payload = JSON.stringify(command);
|
|
357
|
+
try {
|
|
358
|
+
stream.socket.send(payload);
|
|
359
|
+
} catch {
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
return {
|
|
363
|
+
...stream,
|
|
364
|
+
subscribeWallets: (wallets) => sendWalletCommand({
|
|
365
|
+
method: "subscribeWallets",
|
|
366
|
+
wallets
|
|
367
|
+
}),
|
|
368
|
+
unsubscribeWallets: (wallets) => sendWalletCommand({
|
|
369
|
+
method: "unsubscribeWallets",
|
|
370
|
+
wallets
|
|
371
|
+
}),
|
|
372
|
+
listSubscriptions: () => sendWalletCommand({
|
|
373
|
+
method: "listSubscriptions"
|
|
374
|
+
})
|
|
375
|
+
};
|
|
376
|
+
}
|
|
336
377
|
};
|
|
337
378
|
var createClient = (options) => new DritanClient(options);
|
|
338
379
|
var MeteoraThsClient = class {
|
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 | \"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 OhlcvBar = {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n};\n\nexport type TokenOhlcvResponse = {\n mint: string;\n timeframe: string;\n bucketSizeSec: number;\n bondingPoolId: string | null;\n graduatedPoolId: string | null;\n closed: OhlcvBar[];\n active: OhlcvBar | null;\n};\n\nexport type WalletPnlTokenStats = Record<string, unknown>;\n\nexport type WalletPnlResponse = {\n tokens?: Record<string, WalletPnlTokenStats>;\n summary?: Record<string, unknown>;\n [k: string]: unknown;\n};\n\nexport type WalletPortfolioChartResponse = {\n wallet: string;\n total: number;\n totalInvested: number;\n totalWins: number;\n totalLosses: number;\n winPercentage: number;\n history: Record<string, number>;\n};\n\nexport type BasicWalletInformationResponse = {\n wallet: string;\n totalSol: number;\n totalTokenValue: number;\n totalValue: number;\n holdings: number;\n totalHoldingValue: number;\n};\n\nexport type WalletTradeToken = {\n tokenAddress: string;\n name: string;\n symbol: string;\n decimals: number;\n amount: number;\n [k: string]: unknown;\n};\n\nexport type WalletTrade = {\n tx: string;\n wallet: string;\n from?: WalletTradeToken;\n to?: WalletTradeToken;\n program?: string;\n time?: number;\n type?: string;\n [k: string]: unknown;\n};\n\nexport type WalletTradesResponse = {\n trades: WalletTrade[];\n nextCursor?: string;\n hasNextPage?: boolean;\n};\n\nexport type WalletTokenInfo = {\n name: string;\n symbol: string;\n mint: string;\n decimals: number;\n [k: string]: unknown;\n};\n\nexport type WalletTokenPosition = {\n token: WalletTokenInfo;\n balance: number;\n value: number;\n [k: string]: unknown;\n};\n\nexport type WalletHoldingsResponse = {\n wallet: string;\n totalSol?: number;\n tokens: WalletTokenPosition[];\n total?: number;\n totalTokens?: number;\n hasNextPage?: boolean;\n [k: string]: unknown;\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 getTokenOhlcv(\n mint: string,\n timeframe: string,\n opts?: { timeTo?: number }\n ): Promise<TokenOhlcvResponse> {\n const search = new URLSearchParams();\n if (opts?.timeTo != null) search.set(\"time_to\", String(opts.timeTo));\n const qs = search.toString();\n\n const url = buildUrl(\n this.baseUrl,\n `/token/ohlcv/${encodeURIComponent(mint)}/${encodeURIComponent(timeframe)}${qs ? `?${qs}` : \"\"}`\n );\n\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 TokenOhlcvResponse;\n }\n\n async getWalletPerformance(\n wallet: string,\n opts?: { showHistoricPnL?: boolean; holdingCheck?: boolean; hideDetails?: boolean }\n ): Promise<WalletPnlResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/performance/${encodeURIComponent(wallet)}`));\n if (opts?.showHistoricPnL != null) {\n url.searchParams.set(\"showHistoricPnL\", opts.showHistoricPnL ? \"true\" : \"false\");\n }\n if (opts?.holdingCheck != null) {\n url.searchParams.set(\"holdingCheck\", opts.holdingCheck ? \"true\" : \"false\");\n }\n if (opts?.hideDetails != null) {\n url.searchParams.set(\"hideDetails\", opts.hideDetails ? \"true\" : \"false\");\n }\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletPnlResponse;\n }\n\n async getWalletTokenPerformance(wallet: string, tokenMint: string): Promise<WalletPnlTokenStats> {\n const url = buildUrl(\n this.baseUrl,\n `/wallet/performance/${encodeURIComponent(wallet)}/${encodeURIComponent(tokenMint)}`\n );\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 WalletPnlTokenStats;\n }\n\n async getWalletPortfolioChart(\n wallet: string,\n opts?: { days?: number }\n ): Promise<WalletPortfolioChartResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/portfolio-chart/${encodeURIComponent(wallet)}`));\n if (opts?.days != null) url.searchParams.set(\"days\", String(opts.days));\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletPortfolioChartResponse;\n }\n\n async getBasicWalletInformation(wallet: string): Promise<BasicWalletInformationResponse> {\n const url = buildUrl(this.baseUrl, `/wallet/summary/${encodeURIComponent(wallet)}`);\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 BasicWalletInformationResponse;\n }\n\n async getWalletTradeHistory(\n wallet: string,\n opts?: { cursor?: string }\n ): Promise<WalletTradesResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/trade-history/${encodeURIComponent(wallet)}`));\n if (opts?.cursor) url.searchParams.set(\"cursor\", opts.cursor);\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletTradesResponse;\n }\n\n async getWalletHoldings(wallet: string): Promise<WalletHoldingsResponse> {\n const url = buildUrl(this.baseUrl, `/wallet/holdings/${encodeURIComponent(wallet)}`);\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 WalletHoldingsResponse;\n }\n\n async getWalletHoldingsPage(wallet: string, page: number): Promise<WalletHoldingsResponse> {\n const url = buildUrl(\n this.baseUrl,\n `/wallet/holdings/${encodeURIComponent(wallet)}/page/${encodeURIComponent(String(page))}`\n );\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 WalletHoldingsResponse;\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 OhlcvBar = {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n};\n\nexport type TokenOhlcvResponse = {\n mint: string;\n timeframe: string;\n bucketSizeSec: number;\n bondingPoolId: string | null;\n graduatedPoolId: string | null;\n closed: OhlcvBar[];\n active: OhlcvBar | null;\n};\n\nexport type StreamLiquidity = {\n basePooled: number | null;\n quotePooled: number | null;\n totalLiquiditySolana: number | null;\n totalLiquidityUsdc: number | null;\n};\n\nexport type StreamMintPair = {\n base: string;\n quote: string;\n};\n\nexport type StreamDecimals = {\n base: number | null;\n quote: number | null;\n};\n\nexport type StreamReserves = {\n base: number | null;\n quote: number | null;\n};\n\nexport type DexStreamPoolPayload = {\n poolId: string;\n mints: StreamMintPair;\n decimals: StreamDecimals;\n marketCap: number | null;\n pricePerCoin: number | null;\n liquidity: StreamLiquidity;\n pricePerCoinUsd: number | null;\n tokenSupply: number | null;\n reserves: StreamReserves;\n slot: number;\n signature?: string;\n context?: string;\n curvePercentage?: number | null;\n complete?: boolean;\n};\n\nexport type WalletPnlTokenStats = Record<string, unknown>;\n\nexport type WalletPnlResponse = {\n tokens?: Record<string, WalletPnlTokenStats>;\n summary?: Record<string, unknown>;\n [k: string]: unknown;\n};\n\nexport type WalletPortfolioChartResponse = {\n wallet: string;\n total: number;\n totalInvested: number;\n totalWins: number;\n totalLosses: number;\n winPercentage: number;\n history: Record<string, number>;\n};\n\nexport type BasicWalletInformationResponse = {\n wallet: string;\n totalSol: number;\n totalTokenValue: number;\n totalValue: number;\n holdings: number;\n totalHoldingValue: number;\n};\n\nexport type WalletTradeToken = {\n tokenAddress: string;\n name: string;\n symbol: string;\n decimals: number;\n amount: number;\n [k: string]: unknown;\n};\n\nexport type WalletTrade = {\n tx: string;\n wallet: string;\n from?: WalletTradeToken;\n to?: WalletTradeToken;\n program?: string;\n time?: number;\n type?: string;\n [k: string]: unknown;\n};\n\nexport type WalletTradesResponse = {\n trades: WalletTrade[];\n nextCursor?: string;\n hasNextPage?: boolean;\n};\n\nexport type WalletTokenInfo = {\n name: string;\n symbol: string;\n mint: string;\n decimals: number;\n [k: string]: unknown;\n};\n\nexport type WalletTokenPosition = {\n token: WalletTokenInfo;\n balance: number;\n value: number;\n [k: string]: unknown;\n};\n\nexport type WalletHoldingsResponse = {\n wallet: string;\n totalSol?: number;\n tokens: WalletTokenPosition[];\n total?: number;\n totalTokens?: number;\n hasNextPage?: boolean;\n [k: string]: unknown;\n};\n\nexport type DritanStreamOptions<TMessage = unknown> = {\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: TMessage) => void;\n};\n\nexport type DritanStreamHandle = {\n socket: WebSocket;\n close: () => void;\n};\n\nexport type WalletStreamMethod =\n | \"subscribeWallets\"\n | \"unsubscribeWallets\"\n | \"listSubscriptions\";\n\nexport type WalletStreamCommand = {\n method: WalletStreamMethod;\n wallets?: string[];\n};\n\nexport type WalletStreamTokenDelta = {\n address: string;\n amount: number;\n decimals: number;\n raw: string;\n};\n\nexport type WalletStreamSide = {\n address: string;\n amount: number;\n token: WalletStreamTokenDelta;\n};\n\nexport type WalletStreamVolume = {\n usd?: number;\n sol?: number;\n};\n\nexport type WalletStreamData = {\n tx: string;\n wallet: string;\n time: number;\n slot: number;\n type: string;\n solDelta: number;\n feeSol: number;\n from?: WalletStreamSide;\n to?: WalletStreamSide;\n tokenDeltas: WalletStreamTokenDelta[];\n volume?: WalletStreamVolume;\n};\n\nexport type WalletStreamEnvelope = {\n type: string;\n data?: WalletStreamData;\n wallets?: string[];\n invalidWallets?: string[];\n subscriptions?: string[];\n subscriptionCount?: number;\n limitHit?: boolean;\n methods?: string[];\n maxWallets?: number;\n message?: string;\n};\n\nexport type WalletStreamOptions<TMessage = WalletStreamEnvelope> = DritanStreamOptions<TMessage> & {\n wallets?: string[];\n};\n\nexport type WalletStreamHandle = DritanStreamHandle & {\n subscribeWallets: (wallets: string[]) => void;\n unsubscribeWallets: (wallets: string[]) => void;\n listSubscriptions: () => 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 getTokenOhlcv(\n mint: string,\n timeframe: string,\n opts?: { timeTo?: number }\n ): Promise<TokenOhlcvResponse> {\n const search = new URLSearchParams();\n if (opts?.timeTo != null) search.set(\"time_to\", String(opts.timeTo));\n const qs = search.toString();\n\n const url = buildUrl(\n this.baseUrl,\n `/token/ohlcv/${encodeURIComponent(mint)}/${encodeURIComponent(timeframe)}${qs ? `?${qs}` : \"\"}`\n );\n\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 TokenOhlcvResponse;\n }\n\n async getWalletPerformance(\n wallet: string,\n opts?: { showHistoricPnL?: boolean; holdingCheck?: boolean; hideDetails?: boolean }\n ): Promise<WalletPnlResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/performance/${encodeURIComponent(wallet)}`));\n if (opts?.showHistoricPnL != null) {\n url.searchParams.set(\"showHistoricPnL\", opts.showHistoricPnL ? \"true\" : \"false\");\n }\n if (opts?.holdingCheck != null) {\n url.searchParams.set(\"holdingCheck\", opts.holdingCheck ? \"true\" : \"false\");\n }\n if (opts?.hideDetails != null) {\n url.searchParams.set(\"hideDetails\", opts.hideDetails ? \"true\" : \"false\");\n }\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletPnlResponse;\n }\n\n async getWalletTokenPerformance(wallet: string, tokenMint: string): Promise<WalletPnlTokenStats> {\n const url = buildUrl(\n this.baseUrl,\n `/wallet/performance/${encodeURIComponent(wallet)}/${encodeURIComponent(tokenMint)}`\n );\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 WalletPnlTokenStats;\n }\n\n async getWalletPortfolioChart(\n wallet: string,\n opts?: { days?: number }\n ): Promise<WalletPortfolioChartResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/portfolio-chart/${encodeURIComponent(wallet)}`));\n if (opts?.days != null) url.searchParams.set(\"days\", String(opts.days));\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletPortfolioChartResponse;\n }\n\n async getBasicWalletInformation(wallet: string): Promise<BasicWalletInformationResponse> {\n const url = buildUrl(this.baseUrl, `/wallet/summary/${encodeURIComponent(wallet)}`);\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 BasicWalletInformationResponse;\n }\n\n async getWalletTradeHistory(\n wallet: string,\n opts?: { cursor?: string }\n ): Promise<WalletTradesResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/wallet/trade-history/${encodeURIComponent(wallet)}`));\n if (opts?.cursor) url.searchParams.set(\"cursor\", opts.cursor);\n\n const res = await this.fetchImpl(url.toString(), {\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 WalletTradesResponse;\n }\n\n async getWalletHoldings(wallet: string): Promise<WalletHoldingsResponse> {\n const url = buildUrl(this.baseUrl, `/wallet/holdings/${encodeURIComponent(wallet)}`);\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 WalletHoldingsResponse;\n }\n\n async getWalletHoldingsPage(wallet: string, page: number): Promise<WalletHoldingsResponse> {\n const url = buildUrl(\n this.baseUrl,\n `/wallet/holdings/${encodeURIComponent(wallet)}/page/${encodeURIComponent(String(page))}`\n );\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 WalletHoldingsResponse;\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<TMessage = unknown>(\n dex: KnownDexStream,\n options?: DritanStreamOptions<TMessage>\n ): DritanStreamHandle;\n streamDex<TMessage = unknown>(\n dex: string,\n options?: DritanStreamOptions<TMessage>\n ): DritanStreamHandle;\n streamDex<TMessage = unknown>(\n dex: string,\n options: DritanStreamOptions<TMessage> = {}\n ): 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 as TMessage);\n };\n\n return {\n socket: ws as unknown as WebSocket,\n close: () => ws.close()\n };\n }\n\n streamWallets<TMessage = WalletStreamEnvelope>(\n options: WalletStreamOptions<TMessage> = {}\n ): WalletStreamHandle {\n const initialWallets = (options.wallets ?? [])\n .map((wallet) => wallet.trim())\n .filter((wallet) => wallet.length > 0);\n\n const stream = this.streamDex<TMessage>(\"wallet-stream\", {\n ...options,\n onOpen: () => {\n options.onOpen?.();\n if (initialWallets.length > 0) {\n try {\n (stream.socket as any).send(\n JSON.stringify({\n method: \"subscribeWallets\",\n wallets: initialWallets\n } as WalletStreamCommand)\n );\n } catch {\n // no-op\n }\n }\n }\n });\n\n const sendWalletCommand = (command: WalletStreamCommand) => {\n const payload = JSON.stringify(command);\n try {\n (stream.socket as any).send(payload);\n } catch {\n // no-op\n }\n };\n\n return {\n ...stream,\n subscribeWallets: (wallets: string[]) =>\n sendWalletCommand({\n method: \"subscribeWallets\",\n wallets\n }),\n unsubscribeWallets: (wallets: string[]) =>\n sendWalletCommand({\n method: \"unsubscribeWallets\",\n wallets\n }),\n listSubscriptions: () =>\n sendWalletCommand({\n method: \"listSubscriptions\"\n })\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"]}
|