Skip to content

Commit 172e1fd

Browse files
committed
token metas
1 parent 724dbea commit 172e1fd

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed

src/routes.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import NetworkService from "./services/NetworkService";
1111
import LanguageService from "./services/LanguageService";
1212
import StatusService from "./services/StatusService";
1313
import FeeService from "./services/FeeService";
14+
import TokenService from "./services/TokenService";
1415
// import BackupService from './services/BackupService';
1516
import ExchangeService, {STABLETOKENS,BASETOKENS} from "./services/ExchangeService";
1617

@@ -37,6 +38,7 @@ ProxyService.setBucket(bucket);
3738
NetworkService.setBucket(bucket);
3839
LanguageService.setBucket(bucket);
3940
FeeService.setBucket(bucket);
41+
TokenService.setBucket(bucket);
4042
// BackupService.setBucket(bucket);
4143

4244

@@ -54,6 +56,7 @@ NetworkService.watch();
5456
LanguageService.watch();
5557
StatusService.watch();
5658
FeeService.watch();
59+
TokenService.watch();
5760

5861

5962

@@ -190,6 +193,10 @@ routes.get('/proxies', async (req, res) => {
190193
returnResult(proxies, req, res);
191194
});
192195

196+
routes.get('/tokenmeta', async (req, res) => {
197+
returnResult(await TokenService.getTokens(), req, res);
198+
});
199+
193200
routes.get('/languages', async (req, res) => {
194201
const {names, name} = req.query;
195202
returnResult(await LanguageService.getLanguages(!!names, name), req, res);

src/services/TokenService.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import "isomorphic-fetch"
2+
import {flattenBlockchainObject} from "../util/blockchains";
3+
import FeaturedApp from "../models/FeaturedApp";
4+
import ReflinkService from "./ReflinkService";
5+
6+
// Once every 30 minutes.
7+
const intervalTime = 60000 * 30;
8+
let interval;
9+
let bucket;
10+
const bucketKey = 'tokenmeta';
11+
const url = 'https://raw.githubusercontent.com/eoscafe/eos-airdrops/master/tokens.json';
12+
13+
const chainIds = {
14+
'eos':'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906',
15+
};
16+
17+
// Saving last prices in RAM, to alleviate DB calls.
18+
// Mimics eventually persistent behavior.
19+
let inRam;
20+
21+
export default class TokenService {
22+
23+
static setBucket(_b){
24+
bucket = _b;
25+
}
26+
27+
static async getTokens(){
28+
if(!inRam) inRam = (await bucket.get(bucketKey).catch(() => ({value:[]}))).value;
29+
return inRam;
30+
}
31+
32+
33+
static async watch(){
34+
clearInterval(interval);
35+
return new Promise(async resolve => {
36+
await this.getTokens();
37+
38+
const set = async () => {
39+
if(!bucket) return;
40+
41+
const tokens = await TokenService.getAll();
42+
if(tokens) {
43+
const tokenMetas = tokens
44+
// Mainnet only for now
45+
.filter(x => x.chain === 'eos')
46+
.reduce((acc,token) => {
47+
const unique = `eos:${token.account}:${token.symbol.toLowerCase()}:${chainIds[token.chain]}`;
48+
acc[unique] = token.logo;
49+
return acc;
50+
}, {});
51+
52+
53+
await bucket.upsert(bucketKey, tokenMetas);
54+
inRam = tokenMetas;
55+
}
56+
57+
resolve(true);
58+
};
59+
60+
await set();
61+
interval = setInterval(async () => {
62+
await set();
63+
}, intervalTime);
64+
})
65+
}
66+
67+
static getAll(){
68+
return Promise.race([
69+
new Promise(resolve => setTimeout(() => resolve(false), 2500)),
70+
fetch(url+`?rand=${Math.random() * 10000 + 1}`, {
71+
json: true,
72+
gzip: true
73+
}).then(x => x.json()).then(res => {
74+
return res;
75+
}).catch(err => {
76+
console.error(err);
77+
return null;
78+
})
79+
])
80+
}
81+
82+
}

0 commit comments

Comments
 (0)