-
Notifications
You must be signed in to change notification settings - Fork 20
/
getTokens.ts
112 lines (104 loc) · 3.14 KB
/
getTokens.ts
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
import {WETH9} from '@uniswap/sdk-core';
import {Token} from '@uniswap/sdk-core';
import {Token as TokenSushi, WETH} from '@sushiswap/sdk';
import {checksum, _log} from '../configs/utils';
import {MAINNET, _WETH_ADDRESS, _ETH_ADDRESS} from '../../utils/web3/utils';
import {getContractData} from './getContractData';
import {models} from '../mongo/config';
import {saveToken, updateToken} from '../mongo/saveToken';
const newTokenUni = (data: any): Token | null => {
try {
if (data)
return new Token(
MAINNET,
checksum(data.address),
data.decimals,
data.symbol,
data.name
);
} catch (e: any) {}
return null;
};
const newTokenSushi = (data: any): TokenSushi | null => {
try {
if (data)
return new TokenSushi(
MAINNET,
checksum(data.address),
Number(data.decimals),
data.symbol,
data.name
);
} catch (e: any) {
_log.warn('newTokenSushi catch', data);
}
return null;
};
const getTokens = async (
checkedPath: Array<string>,
pName: string,
dexSpace: string,
providers: Array<any>
) => {
try {
if (checkedPath && pName && dexSpace) {
const tks = [];
for (const address of checkedPath) {
if (!address) {
_log.warn('getTokens bad checkedPath??', checkedPath);
return null;
} else if (address === _WETH_ADDRESS || address === _ETH_ADDRESS) {
if (dexSpace === 'v2sh') tks.push(WETH[MAINNET]);
else tks.push(WETH9[MAINNET]);
} else {
const t = await models.g.tokens.findOne({address}, null, {});
if (!t) {
const contractToken = await getContractData(address, providers);
if (contractToken) {
if (dexSpace === 'v2sh') {
tks.push(newTokenSushi(contractToken));
} else {
tks.push(newTokenUni(contractToken));
}
saveToken(contractToken, pName, dexSpace);
}
} else {
const tokenData = t._doc;
if (dexSpace === 'v2sh') {
tks.push(newTokenSushi(tokenData));
if (tokenData.isV2Sushi === false) {
updateToken(tokenData, pName, dexSpace);
}
}
if (dexSpace === 'v2') {
tks.push(newTokenUni(tokenData));
if (tokenData.isV2 === false) {
updateToken(tokenData, pName, dexSpace);
}
}
if (dexSpace === 'v3') {
tks.push(newTokenUni(tokenData));
if (tokenData.isV3 === false) {
updateToken(tokenData, pName, dexSpace);
}
}
}
}
}
if (tks.length === checkedPath.length) {
return tks;
} else {
_log.warn(
'getTokens tks.length === checkedPath.length',
tks.length === checkedPath.length
);
}
} else {
_log.error('getTokens data error', checkedPath, pName, dexSpace);
}
} catch (e: any) {
_log.error('getTokens catch', e.message);
}
return null;
};
export {getTokens, newTokenSushi, newTokenUni};