Skip to content

Commit b0826af

Browse files
authored
feat: Multi token volume fetch enabled
feat: Stream or Query Volume of multiple tokens
2 parents 942327b + 13516aa commit b0826af

File tree

4 files changed

+161
-13
lines changed

4 files changed

+161
-13
lines changed

Readme.md

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ A **Crypto Price API** allows developers to access real-time and historical cryp
1717
- Get price change percentage for ROI calculations
1818
- Get token volume data with configurable time intervals
1919
- Stream live token volume updates
20+
- Get volume data for multiple tokens simultaneously
21+
- Stream live volume updates for multiple tokens simultaneously
2022
- Convert token addresses into `currencyId` for queries
2123
- Extendable query SDK workflow for adding new APIs
2224
- Open source & developer-friendly
@@ -148,17 +150,64 @@ const ws = getTokenVolumeStream("<Access Token>", "TOKEN ADDRESS", {
148150

149151
---
150152

153+
### 7. Get volume data for multiple tokens
154+
155+
```js
156+
const { getMultipleTokenVolume } = require("bitquery-crypto-price");
157+
158+
(async () => {
159+
const tokenAddresses = [
160+
"0x4d15a3a2286d883af0aa1b3f21367843fac63e07", // WETH
161+
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // USDC
162+
"0xdac17f958d2ee523a2206206994597c13d831ec7" // USDT
163+
];
164+
const data = await getMultipleTokenVolume("<Access Token>", tokenAddresses, 3600); // 3600 = 1 hour interval
165+
console.log(JSON.stringify(data, null, 2));
166+
})();
167+
```
168+
169+
---
170+
171+
### 8. Stream live volume updates for multiple tokens
172+
173+
```js
174+
const { getMultipleTokenVolumeStream } = require("bitquery-crypto-price");
175+
176+
const tokenAddresses = [
177+
"0x4d15a3a2286d883af0aa1b3f21367843fac63e07", // WETH
178+
"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // USDC
179+
"0xdac17f958d2ee523a2206206994597c13d831ec7" // USDT
180+
];
181+
182+
const ws = getMultipleTokenVolumeStream("<Access Token>", tokenAddresses, {
183+
interval: 3600, // optional: time interval in seconds (default: 3600)
184+
autoCloseMs: 30000, // optional: auto-close after 30 seconds
185+
onData: (data) => {
186+
console.log("Live multiple token volumes:", JSON.stringify(data, null, 2));
187+
},
188+
onError: (err) => {
189+
console.error("Stream error:", err);
190+
},
191+
});
192+
193+
// ws.close() // manually close if needed
194+
```
195+
196+
---
197+
151198
## 🛠️ Available Functions
152199

153-
| Function | Description |
154-
| ----------------------- | ------------------------------------------------------------- |
155-
| `getCurrencyId` | Get `currencyId` from a token address (required for queries) |
156-
| `getTokenPrice` | Fetch the latest token price (point-in-time query) |
157-
| `getTokenPriceStream` | Subscribe to real-time token price updates (WebSocket stream) |
158-
| `getPriceChange` | Get top tokens by price change percentage (point-in-time query) |
159-
| `getPriceChangeStream` | Subscribe to real-time price change updates (WebSocket stream) |
160-
| `getTokenVolume` | Fetch token volume data (point-in-time query) |
161-
| `getTokenVolumeStream` | Subscribe to real-time token volume updates (WebSocket stream) |
200+
| Function | Description |
201+
| ------------------------------- | ---------------------------------------------------------------- |
202+
| `getCurrencyId` | Get `currencyId` from a token address (required for queries) |
203+
| `getTokenPrice` | Fetch the latest token price (point-in-time query) |
204+
| `getTokenPriceStream` | Subscribe to real-time token price updates (WebSocket stream) |
205+
| `getPriceChange` | Get top tokens by price change percentage (point-in-time query) |
206+
| `getPriceChangeStream` | Subscribe to real-time price change updates (WebSocket stream) |
207+
| `getTokenVolume` | Fetch token volume data (point-in-time query) |
208+
| `getTokenVolumeStream` | Subscribe to real-time token volume updates (WebSocket stream) |
209+
| `getMultipleTokenVolume` | Fetch volume data for multiple tokens (point-in-time query) |
210+
| `getMultipleTokenVolumeStream` | Subscribe to real-time volume updates for multiple tokens (WebSocket stream) |
162211

163212
---
164213

index.js

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const { streamRunner } = require("./stream-runner.js");
33
const {tokenPriceQuery, tokenPriceStream} = require('./queries/token-price-query.js');
44
const {priceChangeQuery, priceChangeStream} = require('./queries/price-change-query.js');
55
const {currencyIdQuery} = require('./queries/currency-id-query.js');
6-
const {tokenVolumeQuery, tokenVolumeStream} = require('./queries/token-volume-query.js');
6+
const {tokenVolumeQuery, tokenVolumeStream, multipleTokenVolumeQuery, multipleTokenVolumeStream} = require('./queries/token-volume-query.js');
77

88
/**
99
*
@@ -133,6 +133,16 @@ const getTokenVolume = async (token, address, interval = 3600) => {
133133
}
134134
};
135135

136+
const getMultipleTokenVolume = async (token, addresses, interval = 3600) => {
137+
try {
138+
const query = multipleTokenVolumeQuery(addresses, interval);
139+
const data = await queryRunner(query, token);
140+
return data;
141+
} catch (error) {
142+
console.error(error);
143+
throw error;
144+
}
145+
};
136146
/**
137147
* getTokenVolumeStream
138148
* Stream live token volume data
@@ -156,7 +166,22 @@ const getTokenVolumeStream = async (token, address, options = {}) => {
156166
}
157167
};
158168

159-
module.exports = {getCurrencyId, getTokenPrice, getTokenPriceStream, getPriceChange, getPriceChangeStream, getTokenVolume, getTokenVolumeStream};
169+
const getMultipleTokenVolumeStream = async (token, addresses, options = {}) => {
170+
try {
171+
const interval = options.interval || 3600;
172+
const subscription = multipleTokenVolumeStream(addresses, interval);
173+
return streamRunner(subscription, token, {
174+
autoCloseMs: options.autoCloseMs,
175+
onData: options.onData,
176+
onError: options.onError,
177+
});
178+
} catch (error) {
179+
console.error(error);
180+
throw error;
181+
}
182+
};
183+
184+
module.exports = {getCurrencyId, getTokenPrice, getTokenPriceStream, getPriceChange, getPriceChangeStream, getTokenVolume, getTokenVolumeStream, getMultipleTokenVolume, getMultipleTokenVolumeStream};
160185

161186
/* Usage
162187

queries/token-volume-query.js

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,44 @@ const tokenVolumeQuery = (address, interval) => {
3535
`
3636
}
3737

38+
const multipleTokenVolumeQuery = (addresses, interval) => {
39+
const addressesString = addresses.map(addr => `"${addr}"`).join(', ');
40+
return `
41+
{
42+
Trading {
43+
Tokens(
44+
where: {Interval: {Time: {Duration: {eq: ${interval}}}}, Token: {Address: {in: [${addressesString}]}}}
45+
orderBy: {descending: Block_Time}
46+
limit: {count: 1}
47+
) {
48+
Token {
49+
Address
50+
Id
51+
IsNative
52+
Name
53+
Network
54+
Name
55+
Symbol
56+
TokenId
57+
}
58+
Interval {
59+
Time {
60+
Start
61+
Duration
62+
End
63+
}
64+
}
65+
Volume {
66+
Base
67+
Quote
68+
Usd
69+
}
70+
}
71+
}
72+
}
73+
`
74+
}
75+
3876
const tokenVolumeStream = (address, interval) => {
3977
return `
4078
subscription{
@@ -70,4 +108,40 @@ const tokenVolumeStream = (address, interval) => {
70108
`
71109
}
72110

73-
module.exports = { tokenVolumeQuery, tokenVolumeStream };
111+
const multipleTokenVolumeStream = (addresses, interval) => {
112+
const addressesString = addresses.map(addr => `"${addr}"`).join(', ');
113+
return `
114+
subscription {
115+
Trading {
116+
Tokens(
117+
where: {Interval: {Time: {Duration: {eq: ${interval}}}}, Token: {Address: {in: [${addressesString}]}}}
118+
) {
119+
Token {
120+
Address
121+
Id
122+
IsNative
123+
Name
124+
Network
125+
Name
126+
Symbol
127+
TokenId
128+
}
129+
Interval {
130+
Time {
131+
Start
132+
Duration
133+
End
134+
}
135+
}
136+
Volume {
137+
Base
138+
Quote
139+
Usd
140+
}
141+
}
142+
}
143+
}
144+
`
145+
}
146+
147+
module.exports = { tokenVolumeQuery, tokenVolumeStream, multipleTokenVolumeQuery, multipleTokenVolumeStream };

stream-runner.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const streamRunner = (subscriptionQuery, token, options = {}) => {
1919
} = options;
2020

2121
const bitqueryConnection = new WebSocket(
22-
`wss://streaming.bitquery.io/eap?token=${token}`,
22+
`wss://streaming.bitquery.io/graphql?token=${token}`,
2323
["graphql-ws"]
2424
);
2525

0 commit comments

Comments
 (0)