-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfetchAndSaveLatestTokens.js
More file actions
91 lines (80 loc) · 2.71 KB
/
fetchAndSaveLatestTokens.js
File metadata and controls
91 lines (80 loc) · 2.71 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
const splToken = require("@solana/spl-token");
const fs = require("fs");
const axios = require("axios");
const TokenAddress = require("./models/tokenAddressModel");
const { token } = require("@coral-xyz/anchor/dist/cjs/utils");
const fetchAndSaveLatestTokens = async () => {
setInterval(async () => {
try {
// Get Latest Token list
console.log("app starting");
const data = await fetchLatest();
if (!data || data?.length === 0) {
console.log("No New Tokens");
return;
}
// Save List
saveToList(data);
} catch (err) {
console.log("Error occured: ", err);
}
}, [parseInt(process.env.FETCH_INTERVAL) * 1000]);
};
//fetch latest data and only take updated data compared to the last-saved data.
const fetchLatest = async () => {
try {
const res = await axios.get(process.env.FETCH_LATEST);
const data = res.data;
console.log("latest number", data.length);
// Get the last token from DB
const lastTokenData = await TokenAddress.find().sort({_id: -1}).limit(1);
const index =
data.length > 0 && lastTokenData.length > 0
? data.map((d) => d.tokenAddress).indexOf(lastTokenData[0].tokenAddress)
: data.length;
console.log("Index: ", index);
let newData = [];
if (index < 0) newData = data;
else {
newData = data.slice(0, index);
}
// Populate with timestamp
newData = newData.map((d) => ({ ...d, timeStamp: new Date() })); //updated tokens
newData = newData.reverse(); //Latest orders increase from right to left, so reverse them before storing in the database.
console.log("New tokens: ", newData.length);
// Populate with Pair
const tokens = newData.map((d) => d.tokenAddress); //updated token addresses
const pairs = await fetchPairByGroup(tokens); //pairs list
return pairs;
} catch (err) {
console.log("fetchLatest error:", err);
return false;
}
};
const fetchPairByGroup = async (tokens) => {
const promises = Promise.all(tokens.map((t) => fetchPair(t)));
let res = await promises.then();
res = res.flat();
return res;
};
const fetchPair = async (token) => {
const res = await axios.get(`${process.env.FETCH_PAIR}/${token}`);
const data = res.data;
return data.pairs;
};
const saveToList = async (data) => {
try {
for (let tokenInfo of data) {
//now only save the solana tokens on database
if (tokenInfo.chainId === "solana" && tokenInfo.dexId === "raydium" && !tokenInfo.labels) {
const token = new TokenAddress({
tokenAddress: tokenInfo.baseToken.address,
});
await token.save();
}
}
} catch (err) {
console.log("save error:", err);
}
};
module.exports = fetchAndSaveLatestTokens;