-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathdatastream.ts
More file actions
355 lines (297 loc) · 13 KB
/
datastream.ts
File metadata and controls
355 lines (297 loc) · 13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
// examples/datastream.ts
import { Datastream } from '@solana-tracker/data-api';
// Initialize the Datastream with configuration
const dataStream = new Datastream({
wsUrl: 'YOUR_WS_URL', // Get this from your Solana Tracker Dashboard
autoReconnect: true, // Auto reconnect on disconnect (default: true)
reconnectDelay: 2500, // Initial reconnect delay in ms (default: 2500)
reconnectDelayMax: 4500, // Maximum reconnect delay in ms (default: 4500)
randomizationFactor: 0.5, // Randomization factor for reconnect delay (default: 0.5)
useWorker: true, // Use Web Worker for background processing (default: false)
});
// ************************************
// Basic connection management examples
// ************************************
// Connect to the WebSocket server
const connect = async () => {
try {
await dataStream.connect();
console.log('Successfully connected to Datastream');
} catch (error) {
console.error('Failed to connect:', error);
}
};
// Check connection status
const checkConnection = () => {
const isConnected = dataStream.isConnected();
console.log(`Datastream connection status: ${isConnected ? 'Connected' : 'Disconnected'}`);
return isConnected;
};
// Disconnect from the WebSocket server
const disconnect = () => {
dataStream.disconnect();
console.log('Disconnected from Datastream');
};
// Register connection event handlers
dataStream.on('connected', () => console.log('Event: Connected to Datastream'));
dataStream.on('disconnected', (type) => console.log(`Event: Disconnected from Datastream (${type})`));
dataStream.on('reconnecting', (attempts) => console.log(`Event: Reconnecting to Datastream (attempt ${attempts})`));
dataStream.on('error', (error) => console.error('Event: Datastream error:', error));
// Connect to start receiving data
connect();
// Example token and pool addresses for demonstration
const TOKEN_ADDRESS = '4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R'; // Example token
const POOL_ADDRESS = 'FJtaAZd6tXNCFGNqXj83JUZqZ5jKQrLpjPTUmAgBGsX4'; // Example pool
const WALLET_ADDRESS = 'YourWalletAddressHere'; // Replace with actual wallet address
// ************************************
// Top-level subscription examples
// ************************************
// Subscribe to latest tokens and pools
const subscribeToLatest = () => {
const subscription = dataStream.subscribe.latest().on((data) => {
console.log('Latest token/pool update:', data);
console.log(`Token: ${data.pools[0].tokenAddress}`);
console.log(`Market Cap: $${data.pools[0].marketCap?.usd.toLocaleString()}`);
});
return subscription; // Contains unsubscribe() method
};
// Subscribe to graduating tokens
const subscribeToGraduating = (marketCapThresholdSOL?: number) => {
const subscription = dataStream.subscribe.graduating(marketCapThresholdSOL).on((data) => {
console.log('Graduating token:', data);
console.log(`Token: ${data.pools[0].tokenAddress}`);
console.log(`Market Cap: $${data.pools[0].marketCap?.usd.toLocaleString()}`);
});
return subscription;
};
// Subscribe to graduated tokens
const subscribeToGraduated = () => {
const subscription = dataStream.subscribe.graduated().on((data) => {
console.log('Graduated token:', data);
console.log(`Token: ${data.pools[0].tokenAddress}`);
console.log(`Market Cap: $${data.pools[0].marketCap?.usd.toLocaleString()}`);
});
return subscription;
};
// Subscribe to token metadata updates
const subscribeToMetadata = (tokenAddress: string = TOKEN_ADDRESS) => {
const subscription = dataStream.subscribe.metadata(tokenAddress).on((data) => {
console.log('Token metadata update:', data);
console.log(`Name: ${data.name}`);
console.log(`Symbol: ${data.symbol}`);
console.log(`Description: ${data.description || 'N/A'}`);
});
return subscription;
};
// Subscribe to holder count updates
const subscribeToHolders = (tokenAddress: string = TOKEN_ADDRESS) => {
const subscription = dataStream.subscribe.holders(tokenAddress).on((data) => {
console.log('Holder count update:', data);
console.log(`Total holders: ${data.total}`);
});
return subscription;
};
// Subscribe to token changes (any pool)
const subscribeToTokenChanges = (tokenAddress: string = TOKEN_ADDRESS) => {
const subscription = dataStream.subscribe.token(tokenAddress).on((data) => {
console.log('Token update:', data);
console.log(`Price: $${data.price?.usd}`);
console.log(`Liquidity: $${data.liquidity?.usd}`);
console.log(`Market Cap: $${data.marketCap?.usd}`);
});
return subscription;
};
// Subscribe to pool changes
const subscribeToPoolChanges = (poolId: string = POOL_ADDRESS) => {
const subscription = dataStream.subscribe.pool(poolId).on((data) => {
console.log('Pool update:', data);
console.log(`Pool ID: ${data.poolId}`);
console.log(`Token: ${data.tokenAddress}`);
console.log(`Price: $${data.price?.usd}`);
console.log(`Liquidity: $${data.liquidity?.usd}`);
});
return subscription;
};
// ************************************
// Volume + total stats subscription examples
// ************************************
// Subscribe to USD volume aggregated per pool
const subscribeToPoolVolume = (poolId: string = POOL_ADDRESS) => {
const subscription = dataStream.subscribe.volume.pool(poolId).on((data) => {
console.log('Pool volume update:', data);
console.log(`Pool: ${data.pool}`);
console.log(`Token: ${data.token}`);
console.log(`Volume (USD): $${data.volume.toFixed(2)}`);
console.log(`Tx Count: ${data.txCount}`);
console.log(`Timestamp: ${new Date(data.timestamp).toLocaleTimeString()}`);
});
return subscription;
};
// Subscribe to USD volume aggregated per token
const subscribeToTokenVolume = (tokenAddress: string = TOKEN_ADDRESS) => {
const subscription = dataStream.subscribe.volume.token(tokenAddress).on((data) => {
console.log('Token volume update:', data);
console.log(`Token: ${data.token}`);
console.log(`Volume (USD): $${data.volume.toFixed(2)}`);
console.log(`Tx Count: ${data.txCount}`);
console.log(`Timestamp: ${new Date(data.timestamp).toLocaleTimeString()}`);
});
return subscription;
};
// Subscribe to total stats object for a pool
const subscribeToPoolStatsTotal = (poolId: string = POOL_ADDRESS) => {
const subscription = dataStream.subscribe.stats.total.pool(poolId).on((stats) => {
console.log('Pool total stats update:', stats);
console.log(`Buys: ${stats.buys}`);
console.log(`Sells: ${stats.sells}`);
console.log(`Total tx: ${stats.total}`);
console.log(`Volume (USD): $${stats.volume.toFixed(2)}`);
});
return subscription;
};
// Subscribe to total stats object for a token
const subscribeToTokenStatsTotal = (tokenAddress: string = TOKEN_ADDRESS) => {
const subscription = dataStream.subscribe.stats.total.token(tokenAddress).on((stats) => {
console.log('Token total stats update:', stats);
console.log(`Buys: ${stats.buys}`);
console.log(`Sells: ${stats.sells}`);
console.log(`Total tx: ${stats.total}`);
console.log(`Volume (USD): $${stats.volume.toFixed(2)}`);
});
return subscription;
};
// ************************************
// Price subscription examples
// ************************************
// Subscribe to token price updates (main/largest pool)
const subscribeToTokenPrice = (tokenAddress: string = TOKEN_ADDRESS) => {
const subscription = dataStream.subscribe.price.token(tokenAddress).on((data) => {
console.log('Token price update:', data);
console.log(`Price: $${data.price}`);
console.log(`Token: ${data.token}`);
console.log(`Pool: ${data.pool}`);
console.log(`Time: ${new Date(data.time).toLocaleTimeString()}`);
});
return subscription;
};
// Subscribe to all price updates for a token (across all pools)
const subscribeToAllTokenPrices = (tokenAddress: string = TOKEN_ADDRESS) => {
const subscription = dataStream.subscribe.price.allPoolsForToken(tokenAddress).on((data) => {
console.log('Token price update (all pools):', data);
console.log(`Price: $${data.price}`);
console.log(`Quote price: ${data.price_quote}`);
console.log(`Pool: ${data.pool}`);
console.log(`Time: ${new Date(data.time).toLocaleTimeString()}`);
});
return subscription;
};
// Subscribe to price updates for a specific pool
const subscribeToPoolPrice = (poolId: string = POOL_ADDRESS) => {
const subscription = dataStream.subscribe.price.pool(poolId).on((data) => {
console.log('Pool price update:', data);
console.log(`Price: $${data.price}`);
console.log(`Token: ${data.token}`);
console.log(`Pool: ${data.pool}`);
console.log(`Time: ${new Date(data.time).toLocaleTimeString()}`);
});
return subscription;
};
// ************************************
// Transaction subscription examples
// ************************************
// Subscribe to transactions for a token (across all pools)
const subscribeToTokenTransactions = (tokenAddress: string = TOKEN_ADDRESS) => {
const subscription = dataStream.subscribe.tx.token(tokenAddress).on((data) => {
// The Datastream will automatically handle arrays of transactions
console.log(`${data.type.toUpperCase()} transaction`);
console.log(`Transaction ID: ${data.tx}`);
console.log(`Amount: ${data.amount}`);
console.log(`Price: $${data.priceUsd}`);
console.log(`Volume: $${data.volume}`);
console.log(`Wallet: ${data.wallet}`);
console.log(`Time: ${new Date(data.time).toLocaleTimeString()}`);
console.log('---');
});
return subscription;
};
// Subscribe to transactions for a specific token and pool
const subscribeToPoolTransactions = (
tokenAddress: string = TOKEN_ADDRESS,
poolId: string = POOL_ADDRESS
) => {
const subscription = dataStream.subscribe.tx.pool(tokenAddress, poolId).on((data) => {
console.log(`Pool ${data.type.toUpperCase()} transaction`);
console.log(`Transaction ID: ${data.tx}`);
console.log(`Amount: ${data.amount}`);
console.log(`Price: $${data.priceUsd}`);
console.log(`Volume: $${data.volume}`);
console.log(`Wallet: ${data.wallet}`);
console.log(`Time: ${new Date(data.time).toLocaleTimeString()}`);
console.log('---');
});
return subscription;
};
const subscribeToPumpFunCurvePercentage = () => {
const subscription = dataStream.subscribe.curvePercentage('pumpfun', 30);
subscription.on((data) => {
console.log(`Token ${data.token.symbol} reached 30% on Pump.fun`);
console.log(`Market cap: ${data.pools[0].marketCap.usd}`);
});
}
const subscribeToSnipers = (tokenAddress: string = TOKEN_ADDRESS) => {
dataStream.subscribe.latest().on((data) => {
const subscription = dataStream.subscribe.snipers(data.pools[0].tokenAddress).on((data) => {
console.log('Sniper update:');
console.log(`Wallet: ${data.wallet}`);
console.log(`Token Amount: ${data.tokenAmount.toLocaleString()}`);
console.log(`Percentage: ${data.percentage.toFixed(2)}%`);
console.log(`Previous Amount: ${data.previousAmount.toLocaleString()}`);
console.log(`Previous Percentage: ${data.previousPercentage.toFixed(2)}%`);
console.log(`Total Sniper Percentage: ${data.totalSniperPercentage.toFixed(2)}%`);
console.log(`Total Insider Percentage: ${data.totalInsiderPercentage.toFixed(2)}%`);
console.log('---');
});
});
};
// Subscribe to insider updates for a token
const subscribeToInsiders = (tokenAddress: string = TOKEN_ADDRESS) => {
dataStream.subscribe.latest().on((data) => {
const subscription = dataStream.subscribe.insiders(data.pools[0].tokenAddress).on((data) => {
console.log('Insider update:');
console.log(`Wallet: ${data.wallet}`);
console.log(`Token Amount: ${data.tokenAmount.toLocaleString()}`);
console.log(`Percentage: ${data.percentage.toFixed(2)}%`);
console.log(`Previous Amount: ${data.previousAmount.toLocaleString()}`);
console.log(`Previous Percentage: ${data.previousPercentage.toFixed(2)}%`);
console.log(`Total Sniper Percentage: ${data.totalSniperPercentage.toFixed(2)}%`);
console.log(`Total Insider Percentage: ${data.totalInsiderPercentage.toFixed(2)}%`);
console.log('---');
});
});
};
// ************************************
// Example execution
// ************************************
// To run any of the examples, uncomment the relevant line below
// or call the functions in your application
// subscribeToLatest();
// subscribeToSnipers();
// subscribeToInsiders();
// subscribeToGraduating();
// subscribeToGraduated();
// subscribeToMetadata(TOKEN_ADDRESS);
// subscribeToHolders(TOKEN_ADDRESS);
// subscribeToTokenChanges(TOKEN_ADDRESS);
// subscribeToPoolChanges(POOL_ADDRESS);
// subscribeToPoolVolume(POOL_ADDRESS);
// subscribeToTokenVolume(TOKEN_ADDRESS);
// subscribeToPoolStatsTotal(POOL_ADDRESS);
// subscribeToTokenStatsTotal(TOKEN_ADDRESS);
// subscribeToTokenPrice(TOKEN_ADDRESS);
// subscribeToAllTokenPrices(TOKEN_ADDRESS);
// subscribeToPoolPrice(POOL_ADDRESS);
// subscribeToTokenTransactions(TOKEN_ADDRESS);
// subscribeToPoolTransactions(TOKEN_ADDRESS, POOL_ADDRESS);
// subscribeToWalletTransactions(WALLET_ADDRESS);
// OR run the combined example:
// runCombinedExample();