defi-state-querier 0.5.18__py3-none-any.whl → 0.5.20__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- defi_services/__init__.py +1 -1
- defi_services/constants/chain_constant.py +6 -1
- defi_services/constants/network_constants.py +20 -361
- defi_services/constants/token_constant.py +3 -1
- defi_services/jobs/processors/cosmos_state_processor.py +3 -2
- defi_services/jobs/processors/ton_state_processor.py +4 -3
- defi_services/jobs/tcv.py +93 -59
- defi_services/services/lending/aave_v2_services.py +3 -3
- defi_services/services/lending/granary_services.py +3 -3
- defi_services/services/lending/morpho_aave_v2_services.py +3 -3
- defi_services/services/lending/morpho_aave_v3_services.py +2 -2
- defi_services/services/lending/trava_services.py +2 -2
- defi_services/services/lending/uwu_services.py +3 -3
- defi_services/services/lending/valas_services.py +2 -2
- defi_services/services/multicall/multicall_v2.py +0 -317
- defi_services/services/vault/tcv_vault_services.py +1 -2
- defi_services/services/vault/vault_info/arbitrum/tcv_arb.py +6 -6
- {defi_state_querier-0.5.18.dist-info → defi_state_querier-0.5.20.dist-info}/METADATA +1 -1
- {defi_state_querier-0.5.18.dist-info → defi_state_querier-0.5.20.dist-info}/RECORD +29 -29
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/__init__.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/aave_v2_event_abi.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/aave_v2_incentives_abi.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/lending_pool_abi.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/oracle_abi.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/staked_incentives_abi.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/uwu_incentives_abi.py +0 -0
- {defi_state_querier-0.5.18.dist-info → defi_state_querier-0.5.20.dist-info}/LICENSE +0 -0
- {defi_state_querier-0.5.18.dist-info → defi_state_querier-0.5.20.dist-info}/WHEEL +0 -0
- {defi_state_querier-0.5.18.dist-info → defi_state_querier-0.5.20.dist-info}/top_level.txt +0 -0
defi_services/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.5.
|
1
|
+
__version__ = "0.5.20"
|
@@ -30,7 +30,12 @@ class Chain:
|
|
30
30
|
moonriver = '0x505'
|
31
31
|
blast = '0xee'
|
32
32
|
oasis_sapphire = '0x5afe'
|
33
|
-
|
33
|
+
zetachain = '0x1b58'
|
34
|
+
zksync = '0x144'
|
35
|
+
oraichain = 'orai'
|
36
|
+
bitcoin = 'bitcoin'
|
37
|
+
cosmos = 'cosmos'
|
38
|
+
ton = 'ton'
|
34
39
|
|
35
40
|
native_decimals = {
|
36
41
|
tron: 6,
|
@@ -1,8 +1,5 @@
|
|
1
|
-
import os
|
2
1
|
|
3
|
-
import
|
4
|
-
|
5
|
-
dotenv.load_dotenv()
|
2
|
+
from defi_services.constants.chain_constant import Chain
|
6
3
|
|
7
4
|
POLYGON_AAVE_ADDRESS = '0x8dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf'
|
8
5
|
ETHEREUM_AAVE_ADDRESS = '0x7d2768de32b0b80b7a3454c06bdac94a69ddc7a9'
|
@@ -21,353 +18,18 @@ FTM_GEIST_ADDRESS = '0x9fad24f572045c7869117160a571b2e50b10d068'
|
|
21
18
|
ETH_COMPOUND_ADDRESS = '0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b'
|
22
19
|
ETH_CREAM_ADDRESS = ''
|
23
20
|
|
24
|
-
|
25
|
-
class Chains:
|
26
|
-
bsc = '0x38'
|
27
|
-
ethereum = '0x1'
|
28
|
-
fantom = '0xfa'
|
29
|
-
polygon = '0x89'
|
30
|
-
arbitrum = '0xa4b1'
|
31
|
-
optimism = '0xa'
|
32
|
-
avalanche = '0xa86a'
|
33
|
-
tron = '0x2b6653dc'
|
34
|
-
cronos = '0x19'
|
35
|
-
solana = 'solana'
|
36
|
-
polkadot = 'polkadot'
|
37
|
-
bitcoin = 'bitcoin'
|
38
|
-
cosmos = 'cosmos'
|
39
|
-
base = '0x2105'
|
40
|
-
kava = '0x8ae'
|
41
|
-
gnosis = '0x64'
|
42
|
-
klaytn = '0x2019'
|
43
|
-
mantle = '0x1388'
|
44
|
-
celo = '0xa4ec'
|
45
|
-
moonbeam = '0x504'
|
46
|
-
manta = '0xa9'
|
47
|
-
pulse = '0x171'
|
48
|
-
rootstock = '0x1e'
|
49
|
-
astar = '0x250'
|
50
|
-
metis = '0x440'
|
51
|
-
canto = '0x1e14'
|
52
|
-
heco = '0x80'
|
53
|
-
linea = '0xe708'
|
54
|
-
okc = '0x42'
|
55
|
-
aurora = '0x4e454152'
|
56
|
-
moonriver = '0x505'
|
57
|
-
oasis_sapphire = '0x5afe'
|
58
|
-
oasis_sapphire_testnet = '0x5aff'
|
59
|
-
blast = '0xee'
|
60
|
-
oraichain = 'orai'
|
61
|
-
ton = 'ton'
|
62
|
-
|
63
|
-
none_wrapped_token = [arbitrum, fantom, optimism]
|
64
|
-
all = [
|
65
|
-
bsc, ethereum, fantom, polygon, arbitrum, optimism,
|
66
|
-
avalanche, tron, cronos, solana, polkadot, bitcoin, cosmos,
|
67
|
-
oraichain, ton
|
68
|
-
]
|
69
|
-
|
70
|
-
mapping = {
|
71
|
-
'bsc': bsc,
|
72
|
-
'ethereum': ethereum,
|
73
|
-
'fantom': fantom,
|
74
|
-
'polygon': polygon,
|
75
|
-
'arbitrum': arbitrum,
|
76
|
-
'optimism': optimism,
|
77
|
-
'avalanche': avalanche,
|
78
|
-
'tron': tron,
|
79
|
-
'cronos': cronos,
|
80
|
-
'solana': solana,
|
81
|
-
'polkadot': polkadot,
|
82
|
-
'oasis_sapphire': oasis_sapphire,
|
83
|
-
'oasis_sapphire_testnet': oasis_sapphire_testnet,
|
84
|
-
'ton': ton
|
85
|
-
}
|
86
|
-
|
87
|
-
names = {
|
88
|
-
bsc: 'bsc',
|
89
|
-
ethereum: "ethereum",
|
90
|
-
fantom: 'fantom',
|
91
|
-
polygon: 'polygon',
|
92
|
-
arbitrum: 'arbitrum',
|
93
|
-
optimism: 'optimism',
|
94
|
-
avalanche: 'avalanche',
|
95
|
-
tron: 'tron',
|
96
|
-
cronos: 'cronos',
|
97
|
-
solana: 'solana',
|
98
|
-
polkadot: 'polkadot',
|
99
|
-
oasis_sapphire: 'oasis_sapphire',
|
100
|
-
oasis_sapphire_testnet: 'oasis_sapphire_testnet',
|
101
|
-
ton: 'ton'
|
102
|
-
}
|
103
|
-
|
104
|
-
abi_mapping = {
|
105
|
-
bsc: 'bep20_abi',
|
106
|
-
ethereum: 'erc20_abi',
|
107
|
-
fantom: 'erc20_abi',
|
108
|
-
polygon: 'erc20_abi',
|
109
|
-
arbitrum: 'erc20_abi',
|
110
|
-
optimism: 'erc20_abi',
|
111
|
-
avalanche: 'erc20_abi',
|
112
|
-
tron: 'trc20_abi',
|
113
|
-
cronos: 'crc20_abi'
|
114
|
-
}
|
115
|
-
|
116
|
-
block_time = {
|
117
|
-
bsc: 3,
|
118
|
-
ethereum: 12,
|
119
|
-
fantom: 1,
|
120
|
-
polygon: 2,
|
121
|
-
arbitrum: 0.3,
|
122
|
-
avalanche: 2,
|
123
|
-
ton: 3
|
124
|
-
}
|
125
|
-
wrapped_native_token = {
|
126
|
-
bsc: "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
|
127
|
-
ethereum: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
|
128
|
-
polygon: "0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270",
|
129
|
-
fantom: "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
|
130
|
-
arbitrum: "0x82af49447d8a07e3bd95bd0d56f35241523fbab1",
|
131
|
-
optimism: "0x4200000000000000000000000000000000000006",
|
132
|
-
avalanche: "0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7",
|
133
|
-
tron: "0x891cdb91d149f23b1a45d9c5ca78a88d0cb44c18",
|
134
|
-
cronos: "0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23",
|
135
|
-
}
|
136
|
-
|
137
|
-
evm = {
|
138
|
-
ethereum: True, bsc: True, polygon: True, fantom: True,
|
139
|
-
arbitrum: True, optimism: True, avalanche: True, tron: True, cronos: True,
|
140
|
-
base: True, kava: True, gnosis: True, klaytn: True, mantle: True, celo: True, moonbeam: True, manta: True,
|
141
|
-
pulse: True, rootstock: True, astar: True, metis: True, canto: True, heco: True, linea: True, okc: True,
|
142
|
-
aurora: True, moonriver: True, oasis_sapphire: True, blast: True
|
143
|
-
}
|
144
|
-
|
145
|
-
def get_abi_name(self, chain_id):
|
146
|
-
"""Map chain_id with the corresponding abi key
|
147
|
-
e.g.: '0x38' -> 'bep20_abi' or '0x1' -> 'erc20_abi'
|
148
|
-
"""
|
149
|
-
return self.abi_mapping.get(chain_id, '')
|
150
|
-
|
151
|
-
|
152
|
-
class ChainsAnkr:
|
153
|
-
"""Chain name for Ankr API"""
|
154
|
-
bsc = '0x38'
|
155
|
-
eth = '0x1'
|
156
|
-
fantom = '0xfa'
|
157
|
-
polygon = '0x89'
|
158
|
-
|
159
|
-
reversed_mapping = {
|
160
|
-
bsc: 'bsc',
|
161
|
-
eth: 'eth',
|
162
|
-
fantom: 'fantom',
|
163
|
-
polygon: 'polygon',
|
164
|
-
}
|
165
|
-
|
166
|
-
def get_chain_name(self, chain_id):
|
167
|
-
return self.reversed_mapping.get(chain_id)
|
168
|
-
|
169
|
-
|
170
|
-
class Scans:
|
171
|
-
mapping = {
|
172
|
-
'bscscan': Chains.bsc,
|
173
|
-
'etherscan': Chains.ethereum,
|
174
|
-
'ftmscan': Chains.fantom,
|
175
|
-
'polygonscan': Chains.polygon,
|
176
|
-
'arbiscan': Chains.arbitrum,
|
177
|
-
'optimistic': Chains.optimism,
|
178
|
-
'snowtrace': Chains.avalanche,
|
179
|
-
'cronoscan': Chains.cronos
|
180
|
-
}
|
181
|
-
|
182
|
-
api_keys = {
|
183
|
-
Chains.bsc: 'GKRVTEQHSGWX335P21994DKNSTJVDYYXJ1',
|
184
|
-
Chains.ethereum: 'YQVXQAJAYNS7AC48ZXS1NT45RKYRPY7P7E',
|
185
|
-
Chains.fantom: 'Y85XY5DDDN4Z7C7Z4ZX8N62M5WET7D8NYC',
|
186
|
-
Chains.polygon: 'EYADI5Q4VK4VF99KFEJURMVE9CNE54YEYW',
|
187
|
-
Chains.arbitrum: 'BU5VN8872FE119RDX898MS5EZHE11FPZSC',
|
188
|
-
Chains.optimism: '1JW9PDV2HZZI3WRFQRVGWUDD2T1RV8GWX3',
|
189
|
-
Chains.avalanche: 'JWNM6Y5UA1499PWVA2T55MEH3TZDGAKJWJ',
|
190
|
-
Chains.cronos: 'F5J6423D42PM21CDP61SUD6H7DE4FXH2DE'
|
191
|
-
}
|
192
|
-
|
193
|
-
api_bases = {
|
194
|
-
Chains.bsc: 'https://api.bscscan.com/api',
|
195
|
-
Chains.ethereum: 'https://api.etherscan.io/api',
|
196
|
-
Chains.fantom: 'https://api.ftmscan.com/api',
|
197
|
-
Chains.polygon: 'https://api.polygonscan.com/api',
|
198
|
-
Chains.arbitrum: 'https://api.arbiscan.io/api',
|
199
|
-
Chains.optimism: 'https://api-optimistic.etherscan.io/api',
|
200
|
-
Chains.avalanche: 'https://api.snowtrace.io/api',
|
201
|
-
Chains.cronos: 'https://cronoscan.com/api',
|
202
|
-
Chains.ton: 'https://toncenter.com/api/'
|
203
|
-
}
|
204
|
-
|
205
|
-
scan_base_urls = {
|
206
|
-
Chains.ethereum: 'https://etherscan.io/',
|
207
|
-
Chains.bsc: 'https://bscscan.com/',
|
208
|
-
Chains.fantom: 'https://ftmscan.com/',
|
209
|
-
Chains.polygon: 'https://polygonscan.com/',
|
210
|
-
Chains.arbitrum: 'https://arbiscan.io/',
|
211
|
-
Chains.optimism: 'https://optimistic.etherscan.io/',
|
212
|
-
Chains.avalanche: 'https://snowtrace.io/',
|
213
|
-
Chains.cronos: 'https://cronoscan.com/',
|
214
|
-
Chains.ton: 'https://toncenter.com/api/'
|
215
|
-
}
|
216
|
-
|
217
|
-
all_base_urls = {
|
218
|
-
Chains.bsc: [
|
219
|
-
'https://bscscan.com/token',
|
220
|
-
'https://bscscan-com.translate.goog/token'
|
221
|
-
],
|
222
|
-
Chains.polygon: [
|
223
|
-
'https://polygonscan.com/token',
|
224
|
-
'https://polygonscan-com.translate.goog/token'
|
225
|
-
],
|
226
|
-
Chains.ethereum: [
|
227
|
-
'https://etherscan.io/token',
|
228
|
-
'https://etherscan-io.translate.goog/token',
|
229
|
-
],
|
230
|
-
Chains.fantom: [
|
231
|
-
'https://ftmscan.com/token',
|
232
|
-
'https://ftmscan-com.translate.goog/token'
|
233
|
-
],
|
234
|
-
Chains.arbitrum: [
|
235
|
-
# 'https://arbiscan-io.translate.goog/token',
|
236
|
-
'https://arbiscan.io/token'
|
237
|
-
],
|
238
|
-
Chains.optimism: [
|
239
|
-
# 'https://optimistic-etherscan-io.translate.goog/token',
|
240
|
-
'https://optimistic.etherscan.io/token'
|
241
|
-
],
|
242
|
-
# Chains.avalanche: [
|
243
|
-
# 'https://snowtrace.io/token'
|
244
|
-
# ],
|
245
|
-
Chains.cronos: ['https://cronoscan.com/token']
|
246
|
-
}
|
247
|
-
|
248
|
-
gg_translate_suffix = '?_x_tr_sl=vi&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp'
|
249
|
-
|
250
|
-
|
251
|
-
class Networks:
|
252
|
-
bsc = 'bsc'
|
253
|
-
ethereum = 'ethereum'
|
254
|
-
fantom = 'fantom'
|
255
|
-
polygon = 'polygon'
|
256
|
-
arbitrum = 'arbitrum'
|
257
|
-
optimism = 'optimism'
|
258
|
-
avalanche = 'avalanche'
|
259
|
-
tron = 'tron'
|
260
|
-
cronos = 'cronos'
|
261
|
-
solana = 'solana'
|
262
|
-
polkadot = 'polkadot'
|
263
|
-
oasis_sapphire = 'oasis_sapphire'
|
264
|
-
oasis_sapphire_testnet = 'oasis_sapphire_testnet'
|
265
|
-
cosmos = 'cosmos'
|
266
|
-
oraichain = 'oraichain'
|
267
|
-
ton = 'ton'
|
268
|
-
|
269
|
-
providers = {
|
270
|
-
bsc: os.getenv('BSC_PROVIDER_URI', 'https://bsc-dataseed1.binance.org/'),
|
271
|
-
ethereum: os.getenv('ETHEREUM_PROVIDER_URI', 'https://rpc.ankr.com/eth'),
|
272
|
-
fantom: os.getenv('FANTOM_PROVIDER_URI', 'https://rpc.ftm.tools/'),
|
273
|
-
polygon: os.getenv('POLYGON_PROVIDER_URI', 'https://polygon-rpc.com'),
|
274
|
-
arbitrum: os.getenv('ARBITRUM_PROVIDER_URI', 'https://endpoints.omniatech.io/v1/arbitrum/one/public'),
|
275
|
-
optimism: os.getenv('OPTIMISM_PROVIDER_URI', 'https://rpc.ankr.com/optimism'),
|
276
|
-
avalanche: os.getenv('AVALANCHE_PROVIDER_URI', 'https://rpc.ankr.com/avalanche'),
|
277
|
-
tron: os.getenv('TRON_PROVIDER_URI', 'https://rpc.ankr.com/tron_jsonrpc'),
|
278
|
-
cronos: os.getenv('CRONOS_PROVIDER_URI', 'https://evm.cronos.org/'),
|
279
|
-
solana: os.getenv('SOLANA_PROVIDER_URI', 'https://crimson-multi-putty.solana-mainnet.quiknode.pro/997174ce6ab5cc9d42cb037e931d18ae1a98346a/'),
|
280
|
-
polkadot: os.getenv('POLKADOT_PROVIDER_URI', 'https://late-yolo-diagram.dot-mainnet.quiknode.pro/51a1aaf2372854dfd211fca3ab375e5451222be4/'),
|
281
|
-
oasis_sapphire: os.getenv('OASIS_SAPPHIRE_PROVIDER_URI'),
|
282
|
-
oasis_sapphire_testnet: os.getenv('OASIS_SAPPHIRE_PROVIDER_URI'),
|
283
|
-
ton: os.getenv('TON_PROVIDER_URI')
|
284
|
-
}
|
285
|
-
|
286
|
-
archive_node = {
|
287
|
-
bsc: os.getenv('BSC_PROVIDER_ARCHIVE_URI', 'https://rpc.ankr.com/bsc'),
|
288
|
-
ethereum: os.getenv('ETHEREUM_PROVIDER_ARCHIVE_URI', 'https://rpc.ankr.com/eth'),
|
289
|
-
fantom: os.getenv('FANTOM_PROVIDER_ARCHIVE_URI', 'https://rpc.ankr.com/fantom'),
|
290
|
-
polygon: os.getenv('POLYGON_PROVIDER_ARCHIVE_URI', 'https://rpc.ankr.com/polygon'),
|
291
|
-
arbitrum: os.getenv('ARBITRUM_PROVIDER_ARCHIVE_URI', 'https://rpc.ankr.com/arbitrum'),
|
292
|
-
optimism: os.getenv('OPTIMISM_PROVIDER_ARCHIVE_URI', 'https://rpc.ankr.com/optimism'),
|
293
|
-
avalanche: os.getenv('AVALANCHE_PROVIDER_ARCHIVE_URI', 'https://rpc.ankr.com/avalanche'),
|
294
|
-
tron: os.getenv('TRON_PROVIDER_ARCHIVE_URI', 'https://rpc.ankr.com/tron_jsonrpc'),
|
295
|
-
cronos: os.getenv('CRONOS_PROVIDER_ARCHIVE_URI'),
|
296
|
-
solana: os.getenv('SOLANA_PROVIDER_ARCHIVE_URI'),
|
297
|
-
polkadot: os.getenv('POLKADOT_PROVIDER_ARCHIVE_URI'),
|
298
|
-
oasis_sapphire: os.getenv('OASIS_SAPPHIRE_PROVIDER_ARCHIVE_URI'),
|
299
|
-
oasis_sapphire_testnet: os.getenv('OASIS_SAPPHIRE_PROVIDER_ARCHIVE_URI'),
|
300
|
-
ton: os.getenv('TON_PROVIDER_ARCHIVE_URI', 'https://toncenter.com/api/')
|
301
|
-
}
|
302
|
-
|
303
|
-
|
304
|
-
class DefiLlama:
|
305
|
-
chains = {
|
306
|
-
'Binance': Chains.bsc,
|
307
|
-
'Ethereum': Chains.ethereum,
|
308
|
-
'Fantom': Chains.fantom,
|
309
|
-
'Polygon': Chains.polygon,
|
310
|
-
'Arbitrum': Chains.arbitrum,
|
311
|
-
'Optimism': Chains.optimism,
|
312
|
-
'Avalanche': Chains.avalanche,
|
313
|
-
'Tron': Chains.tron,
|
314
|
-
'Cronos': Chains.cronos,
|
315
|
-
'Solana': Chains.solana,
|
316
|
-
'Polkadot': Chains.polkadot,
|
317
|
-
'Base': Chains.base,
|
318
|
-
'Kava': Chains.kava,
|
319
|
-
'xDai': Chains.gnosis,
|
320
|
-
'Klaytn': Chains.klaytn,
|
321
|
-
'Mantle': Chains.mantle,
|
322
|
-
'Celo': Chains.celo,
|
323
|
-
'Moonbeam': Chains.moonbeam,
|
324
|
-
'Manta': Chains.manta,
|
325
|
-
'Pulse': Chains.pulse,
|
326
|
-
'RSK': Chains.rootstock,
|
327
|
-
'Astar': Chains.astar,
|
328
|
-
'Metis': Chains.metis,
|
329
|
-
'Canto': Chains.canto,
|
330
|
-
'Heco': Chains.heco,
|
331
|
-
'Linea': Chains.linea,
|
332
|
-
'OKExChain': Chains.okc,
|
333
|
-
'Aurora': Chains.aurora,
|
334
|
-
'Moonriver': Chains.moonriver,
|
335
|
-
'Oasis Sapphire': Chains.oasis_sapphire,
|
336
|
-
'Blast': Chains.blast,
|
337
|
-
'Oraichain': Chains.oraichain,
|
338
|
-
'Ton': Chains.ton
|
339
|
-
}
|
340
|
-
|
341
|
-
|
342
|
-
class Opensea:
|
343
|
-
chains = {
|
344
|
-
Chains.bsc: 'BSC',
|
345
|
-
Chains.ethereum: 'ETHEREUM',
|
346
|
-
Chains.polygon: 'MATIC',
|
347
|
-
Chains.fantom: 'FANTOM',
|
348
|
-
Chains.arbitrum: 'ARBITRUM',
|
349
|
-
Chains.optimism: 'OPTIMISM',
|
350
|
-
Chains.avalanche: 'AVALANCHE',
|
351
|
-
Chains.tron: 'TRON',
|
352
|
-
Chains.solana: 'SOLANA',
|
353
|
-
Chains.base: 'BASE',
|
354
|
-
Chains.klaytn: 'KLAYTN',
|
355
|
-
Chains.ton: 'TON'
|
356
|
-
}
|
357
|
-
|
358
|
-
|
359
21
|
NATIVE_TOKEN = '0x0000000000000000000000000000000000000000'
|
360
22
|
|
361
23
|
NATIVE_TOKENS = {
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
24
|
+
Chain.bsc: '0x0000000000000000000000000000000000000000',
|
25
|
+
Chain.ethereum: '0x0000000000000000000000000000000000000000',
|
26
|
+
Chain.fantom: '0x0000000000000000000000000000000000000000',
|
27
|
+
Chain.polygon: '0x0000000000000000000000000000000000000000',
|
28
|
+
Chain.arbitrum: '0x0000000000000000000000000000000000000000',
|
29
|
+
Chain.optimism: '0x0000000000000000000000000000000000000000',
|
30
|
+
Chain.avalanche: '0x0000000000000000000000000000000000000000',
|
31
|
+
Chain.tron: '0x0000000000000000000000000000000000000000',
|
32
|
+
Chain.ton: 'EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c'
|
371
33
|
}
|
372
34
|
|
373
35
|
|
@@ -377,16 +39,16 @@ class MulticallContract:
|
|
377
39
|
"""
|
378
40
|
|
379
41
|
on_chains_v3 = {
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
42
|
+
Chain.ethereum: '0xca11bde05977b3631167028862be2a173976ca11',
|
43
|
+
Chain.bsc: '0xca11bde05977b3631167028862be2a173976ca11',
|
44
|
+
Chain.polygon: '0xca11bde05977b3631167028862be2a173976ca11',
|
45
|
+
Chain.avalanche: '0xca11bde05977b3631167028862be2a173976ca11',
|
46
|
+
Chain.fantom: '0xca11bde05977b3631167028862be2a173976ca11',
|
47
|
+
Chain.arbitrum: '0xca11bde05977b3631167028862be2a173976ca11',
|
48
|
+
Chain.optimism: '0xca11bde05977b3631167028862be2a173976ca11',
|
49
|
+
Chain.tron: '0x32a4f47a74a6810bd0bf861cabab99656a75de9e',
|
50
|
+
Chain.oasis_sapphire: '0xca11bde05977b3631167028862be2a173976ca11',
|
51
|
+
Chain.zksync: '0xf9cda624fbc7e059355ce98a31693d299facd963'
|
390
52
|
}
|
391
53
|
|
392
54
|
default_address = '0xca11bde05977b3631167028862be2a173976ca11'
|
@@ -394,6 +56,3 @@ class MulticallContract:
|
|
394
56
|
@classmethod
|
395
57
|
def get_multicall_contract(cls, chain_id):
|
396
58
|
return cls.on_chains_v3.get(chain_id, cls.default_address)
|
397
|
-
|
398
|
-
|
399
|
-
EMPTY_TOKEN_IMG = 'https://firebasestorage.googleapis.com/v0/b/token-c515a.appspot.com/o/tokens_v2%2Fempty-token.png?alt=media&token=2f9dfcc1-88a0-472c-a51f-4babc0c583f0'
|
@@ -45,7 +45,9 @@ class Token:
|
|
45
45
|
Chain.aurora: '0xc9bdeed33cd01541e1eed10f90519d2c06fe3feb',
|
46
46
|
Chain.moonriver: '0x98878b06940ae243284ca214f92bb71a2b032b8a',
|
47
47
|
Chain.blast: '0x4300000000000000000000000000000000000004',
|
48
|
-
Chain.oasis_sapphire: '0x8bc2b030b299964eefb5e1e0b36991352e56d2d3'
|
48
|
+
Chain.oasis_sapphire: '0x8bc2b030b299964eefb5e1e0b36991352e56d2d3',
|
49
|
+
Chain.zetachain: '0x5f0b1a82749cb4e2278ec87f8bf6b618dc71a8bf',
|
50
|
+
Chain.zksync: '0xf00dad97284d0c6f06dc4db3c32454d4292c6813'
|
49
51
|
}
|
50
52
|
|
51
53
|
|
@@ -1,13 +1,14 @@
|
|
1
1
|
import logging
|
2
2
|
|
3
|
+
from defi_services.constants.chain_constant import Chain
|
3
4
|
from defi_services.constants.cosmos_decimals_constant import Denoms, MulticallContract
|
4
|
-
from defi_services.constants.network_constants import Chains
|
5
5
|
from defi_services.services.cosmos_token_services import CosmosTokenServices
|
6
6
|
|
7
7
|
logger = logging.getLogger("CosmosStateProcessor")
|
8
8
|
|
9
|
+
|
9
10
|
class CosmosStateProcessor:
|
10
|
-
def __init__(self, lcd: str, rest_uri: str = None, chain_id: str =
|
11
|
+
def __init__(self, lcd: str, rest_uri: str = None, chain_id: str = Chain.oraichain):
|
11
12
|
self.chain_id = chain_id
|
12
13
|
self.lcd = lcd
|
13
14
|
self.rest_uri = rest_uri
|
@@ -1,18 +1,19 @@
|
|
1
1
|
import logging
|
2
2
|
|
3
|
+
from defi_services.constants.chain_constant import Chain
|
3
4
|
from defi_services.constants.ton_decimals_constant import TonTokens
|
4
|
-
from defi_services.constants.network_constants import
|
5
|
+
from defi_services.constants.network_constants import NATIVE_TOKENS
|
5
6
|
from defi_services.jobs.queriers.ton_state_querier import TonStateQuerier
|
6
7
|
|
7
8
|
logger = logging.getLogger("CosmosStateProcessor")
|
8
9
|
|
10
|
+
|
9
11
|
class TonStateProcessor:
|
10
|
-
def __init__(self, provider_uri: str, chain_id: str =
|
12
|
+
def __init__(self, provider_uri: str, chain_id: str = Chain.ton):
|
11
13
|
self.chain_id = chain_id
|
12
14
|
self.provider_uri = provider_uri
|
13
15
|
self.state_querier = TonStateQuerier(self.provider_uri)
|
14
16
|
|
15
|
-
|
16
17
|
def get_token_balance(self, address, tokens):
|
17
18
|
result = {}
|
18
19
|
if NATIVE_TOKENS[self.chain_id] in tokens:
|
defi_services/jobs/tcv.py
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
from collections import defaultdict
|
2
|
+
|
1
3
|
from defi_services.constants.entities.dex_constant import Dex
|
2
4
|
from defi_services.constants.query_constant import Query
|
3
5
|
from defi_services.jobs.processors.state_processor import StateProcessor
|
@@ -13,98 +15,130 @@ class TCV:
|
|
13
15
|
reserves_info,
|
14
16
|
block_number: int = "latest",
|
15
17
|
):
|
18
|
+
lp_token_dict = {information["pool"]: information["poolInfo"] for information in reserves_info.values()}
|
19
|
+
tcv_liquidity_user, dex_lp_info = self.get_tcv_liquidity_user_and_lp_token_info(
|
20
|
+
wallet=address,
|
21
|
+
dex_protocol=Dex.uniswap_v3, lp_token_list=lp_token_dict,
|
22
|
+
block_number=block_number
|
23
|
+
)
|
24
|
+
|
25
|
+
tcv_nfts = {}
|
26
|
+
for vault_address, liquidity_info in tcv_liquidity_user.items():
|
27
|
+
# For optimize
|
28
|
+
liquidity_user = liquidity_info.get('liquidity_user')
|
29
|
+
if not liquidity_user:
|
30
|
+
liquidity_info.update({'tvl': {}})
|
31
|
+
continue
|
32
|
+
|
33
|
+
vault_nft = self.get_user_nft(vault_address, Dex.uniswap_v3, block_number=block_number)
|
34
|
+
tcv_nfts.update(vault_nft)
|
35
|
+
|
36
|
+
nfts_info = self.get_nfts_info(address, Dex.uniswap_v3, tcv_nfts, block_number=block_number)
|
37
|
+
user_balance = self.get_user_token_balance(address, Dex.uniswap_v3, nfts_info, dex_lp_info, block_number=block_number)
|
38
|
+
|
39
|
+
for token_id, info in user_balance.items():
|
40
|
+
pool_address = info['pool_address']
|
41
|
+
addresses = [vault_address_ for vault_address_, info in reserves_info.items() if info['pool'] == pool_address]
|
42
|
+
vault_address = addresses[0] if addresses else None
|
43
|
+
|
44
|
+
if (not vault_address) or (vault_address not in tcv_liquidity_user):
|
45
|
+
continue
|
46
|
+
|
47
|
+
if tcv_liquidity_user[vault_address].get('tvl') is None:
|
48
|
+
tcv_liquidity_user[vault_address]['tvl'] = defaultdict(lambda: 0)
|
49
|
+
|
50
|
+
tcv_liquidity_user[vault_address]['tvl'][info['token0']] += info['token0_amount']
|
51
|
+
tcv_liquidity_user[vault_address]['tvl'][info['token1']] += info['token1_amount']
|
52
|
+
|
53
|
+
return tcv_liquidity_user
|
54
|
+
|
55
|
+
def get_user_nft(self, wallet, dex_protocol, block_number: int = 'latest'):
|
16
56
|
queries = [
|
17
57
|
{
|
18
|
-
|
19
|
-
"entity_id": "tcv-vault",
|
20
|
-
"query_type": Query.staking_reward
|
21
|
-
},
|
22
|
-
]
|
23
|
-
res = self.state_processor.run(address, queries, block_number)
|
24
|
-
result = res[0].get("staking_reward")
|
25
|
-
for token, information in reserves_info.items():
|
26
|
-
pool = information.get("pool")
|
27
|
-
lp_token_dict = {
|
28
|
-
pool: reserves_info[token]["poolInfo"]
|
29
|
-
}
|
30
|
-
dex_lp_info = self.get_lp_token_info(token, Dex.uniswap_v3, lp_token_dict)
|
31
|
-
token_nfts = self.get_user_nft(token, Dex.uniswap_v3)
|
32
|
-
token_info = self.get_user_info(token, Dex.uniswap_v3, token_nfts)
|
33
|
-
token_balance = self.get_user_token_balance(token, Dex.uniswap_v3, token_info, dex_lp_info)
|
34
|
-
tvl = {}
|
35
|
-
for balance_info in token_balance:
|
36
|
-
for token_id, info in balance_info['dex_user_token_balance'].items():
|
37
|
-
if info['token0'] not in tvl:
|
38
|
-
tvl[info['token0']] = 0
|
39
|
-
if info['token1'] not in tvl:
|
40
|
-
tvl[info['token1']] = 0
|
41
|
-
tvl[info['token0']] += info['token0_amount']
|
42
|
-
tvl[info['token1']] += info['token1_amount']
|
43
|
-
result[token].update({"tvl": tvl})
|
44
|
-
return result
|
45
|
-
|
46
|
-
def get_user_nft(self, wallet, dex_protocol):
|
47
|
-
queries = [
|
48
|
-
{
|
49
|
-
'query_id': f'{dex_protocol}_usernft',
|
58
|
+
'query_id': f'{dex_protocol}_{Query.dex_user_nft}',
|
50
59
|
"entity_id": dex_protocol,
|
51
60
|
'query_type': Query.dex_user_nft
|
52
61
|
}
|
53
62
|
]
|
54
63
|
|
55
|
-
res = self.state_processor.run(
|
56
|
-
|
64
|
+
res = self.state_processor.run(
|
65
|
+
wallet, queries, block_number=block_number,
|
66
|
+
batch_size=100, max_workers=8, ignore_error=True
|
67
|
+
)
|
68
|
+
user_nfts = res[0][Query.dex_user_nft]
|
69
|
+
return user_nfts
|
57
70
|
|
58
|
-
def
|
71
|
+
def get_nfts_info(self, wallet, dex_protocol, user_nfts, block_number: int = 'latest'):
|
59
72
|
queries = [
|
60
73
|
{
|
61
|
-
'query_id': f'{dex_protocol}
|
74
|
+
'query_id': f'{dex_protocol}_{Query.dex_user_info}',
|
62
75
|
"entity_id": dex_protocol,
|
63
76
|
'query_type': Query.dex_user_info,
|
64
77
|
'supplied_data': {
|
65
|
-
'user_data': user_nfts
|
78
|
+
'user_data': user_nfts,
|
66
79
|
}
|
67
80
|
}
|
68
81
|
]
|
69
82
|
|
70
|
-
res = self.state_processor.run(
|
71
|
-
|
83
|
+
res = self.state_processor.run(
|
84
|
+
wallet, queries, block_number=block_number,
|
85
|
+
batch_size=100, max_workers=8, ignore_error=True
|
86
|
+
)
|
87
|
+
nfts_info = res[0][Query.dex_user_info]
|
88
|
+
return nfts_info
|
72
89
|
|
73
|
-
def get_user_token_balance(self, wallet, dex_protocol,
|
90
|
+
def get_user_token_balance(self, wallet, dex_protocol, nfts_info, lp_token_info, block_number: int = 'latest'):
|
74
91
|
queries = [
|
75
92
|
{
|
76
|
-
'query_id': f'{dex_protocol}
|
93
|
+
'query_id': f'{dex_protocol}_{Query.dex_user_token_balance}',
|
77
94
|
"entity_id": dex_protocol,
|
78
95
|
'query_type': Query.dex_user_token_balance,
|
79
96
|
'supplied_data': {
|
80
|
-
'user_data':
|
81
|
-
'lp_token_info':
|
82
|
-
|
97
|
+
'user_data': nfts_info,
|
98
|
+
'lp_token_info': lp_token_info
|
83
99
|
}
|
84
100
|
}
|
85
101
|
]
|
86
102
|
|
87
|
-
res = self.state_processor.run(
|
88
|
-
|
103
|
+
res = self.state_processor.run(
|
104
|
+
wallet, queries, block_number=block_number,
|
105
|
+
batch_size=100, max_workers=8, ignore_error=True
|
106
|
+
)
|
107
|
+
user_balance = res[0][Query.dex_user_token_balance]
|
108
|
+
return user_balance
|
89
109
|
|
90
|
-
def
|
110
|
+
def get_tcv_liquidity_user_and_lp_token_info(self, wallet, dex_protocol, lp_token_list, block_number: int = 'latest'):
|
91
111
|
queries = [
|
92
112
|
{
|
93
|
-
|
94
|
-
"entity_id":
|
95
|
-
|
96
|
-
'supplied_data': {
|
97
|
-
'lp_token_info': lp_token_list}
|
113
|
+
"query_id": f"tcv-vault_{Query.staking_reward}",
|
114
|
+
"entity_id": "tcv-vault",
|
115
|
+
"query_type": Query.staking_reward
|
98
116
|
},
|
99
117
|
{
|
100
|
-
'query_id': f'{dex_protocol}
|
118
|
+
'query_id': f'{dex_protocol}_{Query.lp_token_info}',
|
101
119
|
"entity_id": dex_protocol,
|
102
|
-
'query_type': Query.
|
120
|
+
'query_type': Query.lp_token_info,
|
103
121
|
'supplied_data': {
|
104
|
-
'lp_token_info': lp_token_list
|
105
|
-
|
122
|
+
'lp_token_info': lp_token_list
|
123
|
+
}
|
124
|
+
},
|
125
|
+
# {
|
126
|
+
# 'query_id': f'{dex_protocol}_{Query.token_pair_balance}',
|
127
|
+
# "entity_id": dex_protocol,
|
128
|
+
# 'query_type': Query.token_pair_balance,
|
129
|
+
# 'supplied_data': {
|
130
|
+
# 'lp_token_info': lp_token_list
|
131
|
+
# }
|
132
|
+
# }
|
106
133
|
]
|
107
|
-
res = self.state_processor.run(
|
108
|
-
|
109
|
-
|
134
|
+
res = self.state_processor.run(
|
135
|
+
address=wallet, queries=queries,
|
136
|
+
block_number=block_number,
|
137
|
+
batch_size=100, max_workers=8,
|
138
|
+
ignore_error=True
|
139
|
+
)
|
140
|
+
data = {r['query_id']: r for r in res}
|
110
141
|
|
142
|
+
tcv_liquidity_user = data.get(f'tcv-vault_{Query.staking_reward}', {}).get(Query.staking_reward)
|
143
|
+
lp_token_info = data.get(f'{dex_protocol}_{Query.lp_token_info}', {}).get(Query.lp_token_info)
|
144
|
+
return tcv_liquidity_user, lp_token_info
|