Skip to content
This repository was archived by the owner on Aug 12, 2023. It is now read-only.

Commit 6c1afc7

Browse files
authored
Add change indicators to tokens (#395)
1 parent 349cfdf commit 6c1afc7

File tree

2 files changed

+142
-13
lines changed

2 files changed

+142
-13
lines changed

src/relayers/get-relayers-with-stats-for-dates.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ const getStatsForPreviousPeriod = async (relayerIds, dateFrom, dateTo) => {
2828
field: 'relayerId',
2929
missing: -1,
3030
order: { tradeVolume: 'desc' },
31-
size: 500,
31+
size: relayerIds.length,
3232
},
3333
aggs: {
3434
fillVolume: {

src/tokens/get-tokens-with-stats-for-dates.js

Lines changed: 141 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,110 @@
11
const _ = require('lodash');
2+
const moment = require('moment');
23

34
const { TOKEN_TYPE } = require('../constants');
45
const elasticsearch = require('../util/elasticsearch');
56
const getCdnTokenImageUrl = require('./get-cdn-token-image-url');
67
const getTokenPrices = require('./get-token-prices');
78
const Token = require('../model/token');
89

10+
const getPreviousPeriod = (dateFrom, dateTo) => {
11+
const diff = moment(dateTo).diff(dateFrom);
12+
const prevDateTo = moment(dateFrom)
13+
.subtract('millisecond', 1)
14+
.toDate();
15+
const prevDateFrom = moment(prevDateTo)
16+
.subtract('millisecond', diff)
17+
.toDate();
18+
19+
return { prevDateFrom, prevDateTo };
20+
};
21+
22+
const getStatsForPreviousPeriod = async (tokenAddresses, dateFrom, dateTo) => {
23+
const { prevDateFrom, prevDateTo } = getPreviousPeriod(dateFrom, dateTo);
24+
25+
const res = await elasticsearch.getClient().search({
26+
index: 'traded_tokens',
27+
body: {
28+
aggs: {
29+
tokenStats: {
30+
terms: {
31+
field: 'tokenAddress',
32+
size: tokenAddresses.length,
33+
},
34+
aggs: {
35+
fillCount: {
36+
value_count: { field: 'fillId' },
37+
},
38+
fillVolume: {
39+
sum: { field: 'filledAmount' },
40+
},
41+
fillVolumeUSD: {
42+
sum: { field: 'filledAmountUSD' },
43+
},
44+
tradeCount: {
45+
sum: { field: 'tradeCountContribution' },
46+
},
47+
tradeVolume: {
48+
sum: { field: 'tradedAmount' },
49+
},
50+
tradeVolumeUSD: {
51+
sum: { field: 'tradedAmountUSD' },
52+
},
53+
},
54+
},
55+
},
56+
size: 0,
57+
query: {
58+
bool: {
59+
filter: [
60+
{
61+
terms: {
62+
tokenAddress: tokenAddresses,
63+
},
64+
},
65+
{
66+
range: {
67+
date: {
68+
gte: prevDateFrom,
69+
lte: prevDateTo,
70+
},
71+
},
72+
},
73+
].filter(f => f !== undefined),
74+
},
75+
},
76+
},
77+
});
78+
79+
const { buckets } = res.body.aggregations.tokenStats;
80+
81+
return tokenAddresses.map(tokenAddress => {
82+
const bucket = buckets.find(b => b.key === tokenAddress);
83+
84+
return {
85+
fillCount: _.get(bucket, 'doc_count', 0),
86+
fillVolume: {
87+
token: _.get(bucket, 'fillVolume.value', 0),
88+
USD: _.get(bucket, 'fillVolumeUSD.value', 0),
89+
},
90+
tradeCount: _.get(bucket, 'tradeCount.value', 0),
91+
tradeVolume: {
92+
token: _.get(bucket, 'tradeVolume.value', 0),
93+
USD: _.get(bucket, 'tradeVolumeUSD.value', 0),
94+
},
95+
tokenAddress,
96+
};
97+
});
98+
};
99+
100+
const getPercentageChange = (valueA, valueB) => {
101+
if (valueA === 0) {
102+
return null;
103+
}
104+
105+
return ((valueB - valueA) / valueA) * 100;
106+
};
107+
9108
const getTokensWithStatsForDates = async (dateFrom, dateTo, options) => {
10109
const opts = _.defaults({}, options, {
11110
page: 1,
@@ -78,21 +177,23 @@ const getTokensWithStatsForDates = async (dateFrom, dateTo, options) => {
78177
},
79178
});
80179

81-
const tokenStats = res.body.aggregations.tokenStats.buckets;
82-
const tokenAddresses = tokenStats.map(x => x.key);
180+
const { buckets } = res.body.aggregations.tokenStats;
181+
const tokenAddresses = buckets.map(x => x.key);
83182
const tokenCount = res.body.aggregations.tokenCount.value;
84183

85-
const [tokens, prices] = await Promise.all([
184+
const [tokens, prices, previousStats] = await Promise.all([
86185
Token.find({
87186
address: { $in: tokenAddresses },
88187
}).lean(),
89188
getTokenPrices(tokenAddresses, { from: dateFrom, to: dateTo }),
189+
getStatsForPreviousPeriod(tokenAddresses, dateFrom, dateTo),
90190
]);
91191

92192
return {
93-
tokens: tokenStats.map(stats => {
94-
const token = tokens.find(t => t.address === stats.key);
95-
const price = prices.find(t => t.tokenAddress === stats.key);
193+
tokens: buckets.map(bucket => {
194+
const token = tokens.find(t => t.address === bucket.key);
195+
const price = prices.find(t => t.tokenAddress === bucket.key);
196+
const prev = previousStats.find(s => s.tokenAddress === bucket.key);
96197

97198
const {
98199
address,
@@ -145,15 +246,43 @@ const getTokensWithStatsForDates = async (dateFrom, dateTo, options) => {
145246
open: null,
146247
},
147248
stats: {
148-
fillCount: stats.fillCount.value,
249+
fillCount: bucket.fillCount.value,
250+
fillCountChange: getPercentageChange(
251+
prev.fillCount,
252+
bucket.fillCount.value,
253+
),
149254
fillVolume: {
150-
token: stats.fillVolume.value,
151-
USD: stats.fillVolumeUSD.value,
255+
token: bucket.fillVolume.value,
256+
USD: bucket.fillVolumeUSD.value,
152257
},
153-
tradeCount: stats.tradeCount.value,
258+
fillVolumeChange: {
259+
token: getPercentageChange(
260+
prev.fillVolume.token,
261+
bucket.fillVolume.value,
262+
),
263+
USD: getPercentageChange(
264+
prev.fillVolume.USD,
265+
bucket.fillVolumeUSD.value,
266+
),
267+
},
268+
tradeCount: bucket.tradeCount.value,
269+
tradeCountChange: getPercentageChange(
270+
prev.tradeCount,
271+
bucket.tradeCount.value,
272+
),
154273
tradeVolume: {
155-
token: stats.tradeVolume.value,
156-
USD: stats.tradeVolumeUSD.value,
274+
token: bucket.tradeVolume.value,
275+
USD: bucket.tradeVolumeUSD.value,
276+
},
277+
tradeVolumeChange: {
278+
token: getPercentageChange(
279+
prev.tradeVolume.token,
280+
bucket.tradeVolume.value,
281+
),
282+
USD: getPercentageChange(
283+
prev.tradeVolume.USD,
284+
bucket.tradeVolumeUSD.value,
285+
),
157286
},
158287
},
159288
symbol: _.isString(symbol) ? symbol : null,

0 commit comments

Comments
 (0)