defi-state-querier 0.5.28__py3-none-any.whl → 0.5.30__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. defi_services/__init__.py +1 -1
  2. defi_services/abis/lending/ionic/__init__.py +0 -0
  3. defi_services/abis/lending/ionic/ionic_ctoken_abi.py +1108 -0
  4. defi_services/abis/lending/kinza/__init__.py +0 -0
  5. defi_services/abis/lending/kinza/kinza_incentive.py +928 -0
  6. defi_services/abis/lending/kinza/kinza_lending_pool.py +1791 -0
  7. defi_services/abis/lending/moonwell/__init__.py +0 -0
  8. defi_services/abis/lending/moonwell/moonwell_comptroller_abi.py +1500 -0
  9. defi_services/abis/lending/moonwell/moonwell_ctoken_abi.py +1431 -0
  10. defi_services/abis/lending/radiant_v2/radiant_reward_converter.py +817 -0
  11. defi_services/abis/lending/seamless/__init__.py +0 -0
  12. defi_services/abis/lending/seamless/seamless_incentive.py +1049 -0
  13. defi_services/abis/lending/seamless/seamless_lending_pool.py +1738 -0
  14. defi_services/abis/lending/seamless/seamless_oracle.py +233 -0
  15. defi_services/abis/token/trc20_abi.py +304 -0
  16. defi_services/abis/vault/tcv_abi.py +1523 -0
  17. defi_services/constants/chain_constant.py +8 -1
  18. defi_services/constants/entities/dex_info_constant.py +2 -2
  19. defi_services/constants/entities/dex_services.py +13 -1
  20. defi_services/constants/entities/lending_constant.py +14 -5
  21. defi_services/constants/entities/lending_services.py +41 -4
  22. defi_services/constants/entities/vault_constant.py +2 -2
  23. defi_services/constants/entities/vault_services.py +7 -1
  24. defi_services/constants/network_constants.py +20 -361
  25. defi_services/constants/token_constant.py +3 -1
  26. defi_services/jobs/processors/cosmos_state_processor.py +3 -2
  27. defi_services/jobs/processors/ton_state_processor.py +5 -4
  28. defi_services/jobs/queriers/call_state_querier.py +2 -0
  29. defi_services/jobs/queriers/state_querier.py +3 -0
  30. defi_services/jobs/tcv.py +144 -0
  31. defi_services/services/dex/dex_info/uniswap_info.py +29 -1
  32. defi_services/services/dex/uniswap_v3_service.py +6 -2
  33. defi_services/services/lending/aave_v2_services.py +44 -29
  34. defi_services/services/lending/aave_v3_services.py +41 -20
  35. defi_services/services/lending/avalon_services.py +34 -0
  36. defi_services/services/lending/compound_v3_services.py +9 -5
  37. defi_services/services/lending/granary_services.py +6 -4
  38. defi_services/services/lending/ionic_service.py +167 -0
  39. defi_services/services/lending/justlend_service.py +4 -3
  40. defi_services/services/lending/kinza_services.py +315 -0
  41. defi_services/services/lending/lending_info/arbitrum/aave_v3_arbitrum.py +1 -1
  42. defi_services/services/lending/lending_info/arbitrum/compound_v3_arbitrum.py +96 -6
  43. defi_services/services/lending/lending_info/arbitrum/venus_arbitrum.py +10 -0
  44. defi_services/services/lending/lending_info/base/__init__.py +0 -0
  45. defi_services/services/lending/lending_info/base/aave_v3_base.py +61 -0
  46. defi_services/services/lending/lending_info/base/compound_v3_base.py +116 -0
  47. defi_services/services/lending/lending_info/base/granary_base.py +62 -0
  48. defi_services/services/lending/lending_info/base/ionic_base.py +173 -0
  49. defi_services/services/lending/lending_info/base/moonwell_base.py +89 -0
  50. defi_services/services/lending/lending_info/base/radiant_v2_base.py +57 -0
  51. defi_services/services/lending/lending_info/base/seamless_base.py +145 -0
  52. defi_services/services/lending/lending_info/base/sonne_base.py +53 -0
  53. defi_services/services/lending/lending_info/base/xlend_base.py +91 -0
  54. defi_services/services/lending/lending_info/base/zerolend_base.py +109 -0
  55. defi_services/services/lending/lending_info/bsc/aave_v3_bsc.py +68 -0
  56. defi_services/services/lending/lending_info/bsc/apeswap_bsc.py +1 -1
  57. defi_services/services/lending/lending_info/bsc/avalon_bsc.py +75 -0
  58. defi_services/services/lending/lending_info/bsc/kinza_bsc.py +182 -0
  59. defi_services/services/lending/lending_info/ethereum/aave_v3_eth.py +1 -140
  60. defi_services/services/lending/lending_info/ethereum/compound_v3_eth.py +180 -5
  61. defi_services/services/lending/lending_info/ethereum/kinza_eth.py +119 -0
  62. defi_services/services/lending/lending_info/ethereum/old_aave_v3_eth.py +150 -0
  63. defi_services/services/lending/lending_info/ethereum/radiant_eth.py +69 -0
  64. defi_services/services/lending/lending_info/ethereum/venus_eth.py +10 -0
  65. defi_services/services/lending/lending_info/ethereum/zerolend_eth.py +96 -0
  66. defi_services/services/lending/lending_info/optimism/compound_v3_optimism.py +116 -0
  67. defi_services/services/lending/lending_info/optimism/moonwell_optimism.py +9 -0
  68. defi_services/services/lending/lending_info/optimism/xlend_optimism.py +112 -0
  69. defi_services/services/lending/lending_info/polygon/compound_v3_polygon.py +35 -5
  70. defi_services/services/lending/lending_info/zksync/__init__.py +0 -0
  71. defi_services/services/lending/lending_info/zksync/aave_v3_zksync.py +47 -0
  72. defi_services/services/lending/lending_info/zksync/venus_zksync.py +10 -0
  73. defi_services/services/lending/lending_info/zksync/zerolend_zksync.py +138 -0
  74. defi_services/services/lending/liqee_service.py +2 -2
  75. defi_services/services/lending/moonwell_service.py +120 -0
  76. defi_services/services/lending/morpho_aave_v2_services.py +3 -3
  77. defi_services/services/lending/morpho_aave_v3_services.py +2 -2
  78. defi_services/services/lending/onyx_service.py +2 -1
  79. defi_services/services/lending/radiant_v2_services.py +52 -10
  80. defi_services/services/lending/seamless_services.py +313 -0
  81. defi_services/services/lending/sonne_service.py +64 -0
  82. defi_services/services/lending/trava_services.py +2 -2
  83. defi_services/services/lending/uwu_services.py +3 -3
  84. defi_services/services/lending/valas_services.py +2 -2
  85. defi_services/services/lending/venus_services.py +9 -3
  86. defi_services/services/lending/xlend_services.py +325 -0
  87. defi_services/services/lending/zerolend_services.py +36 -0
  88. defi_services/services/multicall/multicall_v2.py +0 -317
  89. defi_services/services/vault/tcv_vault_services.py +108 -0
  90. defi_services/services/vault/vault_info/arbitrum/__init__.py +0 -0
  91. defi_services/services/vault/vault_info/arbitrum/tcv_arb.py +58 -0
  92. {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.30.dist-info}/METADATA +1 -1
  93. {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.30.dist-info}/RECORD +103 -49
  94. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/__init__.py +0 -0
  95. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/aave_v2_event_abi.py +0 -0
  96. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/aave_v2_incentives_abi.py +0 -0
  97. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/lending_pool_abi.py +0 -0
  98. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/oracle_abi.py +0 -0
  99. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/staked_incentives_abi.py +0 -0
  100. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/uwu_incentives_abi.py +0 -0
  101. {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.30.dist-info}/WHEEL +0 -0
  102. {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.30.dist-info}/licenses/LICENSE +0 -0
  103. {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.30.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,325 @@
1
+ import logging
2
+
3
+ from web3 import Web3
4
+
5
+ from defi_services.abis.lending.aave.aave_v3.aave_v3_incentives_abi import AAVE_V3_INCENTIVES_ABI
6
+ from defi_services.abis.lending.aave.aave_v3.aave_v3_lending_pool_abi import AAVE_V3_LENDING_POOL_ABI
7
+ from defi_services.abis.lending.aave.aave_v3.aave_v3_oracle_abi import AAVE_V3_ORACLE_ABI
8
+ from defi_services.abis.lending.morpho.morpho_aave_v3_comptroller_abi import MORPHO_AAVE_V3_COMPTROLLER_ABI
9
+ from defi_services.abis.token.erc20_abi import ERC20_ABI
10
+ from defi_services.constants.chain_constant import Chain
11
+ from defi_services.constants.db_constant import DBConst
12
+ from defi_services.constants.entities.lending_constant import Lending
13
+ from defi_services.constants.network_constants import NATIVE_TOKEN
14
+ from defi_services.constants.time_constant import TimeConstants
15
+ from defi_services.jobs.queriers.state_querier import StateQuerier
16
+ from defi_services.services.lending.aave_v2_services import AaveV2StateService
17
+ from defi_services.services.lending.lending_info.arbitrum.aave_v3_arbitrum import AAVE_V3_ARB
18
+ from defi_services.services.lending.lending_info.avalanche.aave_v3_avalanche import AAVE_V3_AVALANCHE
19
+ from defi_services.services.lending.lending_info.base.aave_v3_base import AAVE_V3_BASE
20
+ from defi_services.services.lending.lending_info.base.xlend_base import XLEND_BASE
21
+ from defi_services.services.lending.lending_info.bsc.aave_v3_bsc import AAVE_V3_BSC
22
+ from defi_services.services.lending.lending_info.ethereum.old_aave_v3_eth import AAVE_V3_ETH
23
+ from defi_services.services.lending.lending_info.fantom.aave_v3_ftm import AAVE_V3_FTM
24
+ from defi_services.services.lending.lending_info.optimism.aave_v3_optimism import AAVE_V3_OPTIMISM
25
+ from defi_services.services.lending.lending_info.polygon.aave_v3_polygon import AAVE_V3_POLYGON
26
+ from defi_services.services.lending.lending_info.zksync.aave_v3_zksync import AAVE_V3_ZKSYNC
27
+
28
+ logger = logging.getLogger("Xlend Lending Pool State Service")
29
+
30
+
31
+ class XlendInfo:
32
+ mapping = {
33
+ Chain.base: XLEND_BASE,
34
+ Chain.optimism: AAVE_V3_OPTIMISM
35
+ }
36
+
37
+
38
+ class XlendStateService(AaveV2StateService):
39
+ def __init__(self, state_service: StateQuerier, chain_id: str = "0x1"):
40
+ super().__init__(state_service, chain_id)
41
+ self.name = f"{chain_id}_{Lending.xlend}"
42
+ self.chain_id = chain_id
43
+ self.pool_info = XlendInfo.mapping.get(chain_id)
44
+ self.lending_abi = AAVE_V3_LENDING_POOL_ABI
45
+ self.incentive_abi = AAVE_V3_INCENTIVES_ABI
46
+ self.oracle_abi = AAVE_V3_ORACLE_ABI
47
+ self.comptroller_abi = MORPHO_AAVE_V3_COMPTROLLER_ABI
48
+ self.state_service = state_service
49
+
50
+ def get_service_info(self):
51
+ info = {
52
+ Lending.xlend: {
53
+ "chain_id": self.chain_id,
54
+ "type": "lending",
55
+ "protocol_info": self.pool_info
56
+ }
57
+ }
58
+ return info
59
+
60
+ def get_dapp_asset_info(self, block_number: int = 'latest'):
61
+ _w3 = self.state_service.get_w3()
62
+ pool_address = self.pool_info.get("address")
63
+ pool_contract = _w3.eth.contract(address=_w3.to_checksum_address(pool_address), abi=self.lending_abi)
64
+ reserve_list = pool_contract.functions.getReservesList().call(block_identifier=block_number)
65
+ reserves_info = {}
66
+ for token in reserve_list:
67
+ token = token.lower()
68
+ reserve_data = pool_contract.functions.getReserveData(
69
+ _w3.to_checksum_address(token)).call(block_identifier=block_number)
70
+ reserves_info[token] = {}
71
+ reserves_info[token]["tToken"] = reserve_data[8].lower()
72
+ reserves_info[token]["sdToken"] = reserve_data[9].lower()
73
+ reserves_info[token]["dToken"] = reserve_data[10].lower()
74
+
75
+ risk_param = bin(reserve_data[0][0])[2:]
76
+ reserves_info[token]["loanToValue"] = int(risk_param[-15:], 2) / 10 ** 4
77
+ reserves_info[token]["liquidationThreshold"] = int(risk_param[-31:-16], 2) / 10 ** 4
78
+
79
+ return reserves_info
80
+
81
+ # CALCULATE APY LENDING POOL
82
+ def get_reserve_tokens_metadata(
83
+ self,
84
+ decoded_data: dict,
85
+ reserves_info: dict,
86
+ block_number: int = "latest"
87
+ ):
88
+ reserve_tokens_info = []
89
+ for token_address, reserve_info in reserves_info.items():
90
+ get_reserve_data_call_id = f'getReserveData_{self.name}_{token_address}_{block_number}'.lower()
91
+ reserve_data = decoded_data.get(get_reserve_data_call_id)
92
+ atoken = reserve_data[8].lower()
93
+ debt_token = reserve_data[10].lower()
94
+ decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
95
+ atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
96
+ debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
97
+ sdebt_token = reserve_data[9].lower()
98
+
99
+
100
+ data = {
101
+ 'underlying': token_address,
102
+ 'underlying_decimals': decoded_data.get(decimals_call_id),
103
+ 'a_token_supply': decoded_data.get(atoken_total_supply_key),
104
+ 'd_token_supply': decoded_data.get(debt_token_total_supply_key),
105
+
106
+ 'supply_apy': reserve_data[2],
107
+ 'borrow_apy': reserve_data[4],
108
+
109
+ }
110
+ if sdebt_token != NATIVE_TOKEN:
111
+ sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
112
+ data['sd_token_supply'] = decoded_data.get(sdebt_token_total_supply_key)
113
+ data['stable_borrow_apy'] = reserve_data[5]
114
+ else:
115
+ data['sd_token_supply'] = 0
116
+ data['stable_borrow_apy'] = 0
117
+
118
+ reserve_tokens_info.append(data)
119
+
120
+ return reserve_tokens_info
121
+
122
+ def get_apy_lending_pool_function_info_deprecated(
123
+ self,
124
+ reserves_info: dict,
125
+ block_number: int = "latest",
126
+ ):
127
+ rpc_calls = {}
128
+ reward_tokens = self.pool_info.get("rewardTokensList")
129
+ for token_address, value in reserves_info.items():
130
+ reserve_key = f"getReserveData_{self.name}_{token_address}_{block_number}".lower()
131
+ atoken_total_supply_key = f'totalSupply_{value["tToken"]}_{block_number}'.lower()
132
+ debt_token_total_supply_key = f'totalSupply_{value["dToken"]}_{block_number}'.lower()
133
+ decimals_key = f"decimals_{token_address}_{block_number}".lower()
134
+ for reward_token in reward_tokens:
135
+ atoken_assets_key = f"getRewardsData_{value['tToken']}_{reward_token}_{block_number}".lower()
136
+ debt_token_assets_key = f"getRewardsData_{value['dToken']}_{reward_token}_{block_number}".lower()
137
+ rpc_calls[atoken_assets_key] = self.get_function_incentive_info(
138
+ "getRewardsData", [value['tToken'], reward_token], block_number)
139
+ rpc_calls[debt_token_assets_key] = self.get_function_incentive_info(
140
+ "getRewardsData", [value['dToken'], reward_token], block_number)
141
+ if value['sdToken'] != NATIVE_TOKEN:
142
+ sdebt_token_assets_key = f"getRewardsData_{value['sdToken']}_{reward_token}_{block_number}".lower()
143
+ rpc_calls[sdebt_token_assets_key] = self.get_function_incentive_info(
144
+ "getRewardsData", [value['sdToken'], reward_token], block_number)
145
+
146
+ rpc_calls[reserve_key] = self.get_function_lending_pool_info("getReserveData", [token_address])
147
+ rpc_calls[atoken_total_supply_key] = self.state_service.get_function_info(
148
+ value["tToken"], ERC20_ABI, "totalSupply", block_number=block_number)
149
+ rpc_calls[debt_token_total_supply_key] = self.state_service.get_function_info(
150
+ value["dToken"], ERC20_ABI, "totalSupply", block_number=block_number)
151
+ rpc_calls[decimals_key] = self.state_service.get_function_info(
152
+ token_address, ERC20_ABI, "decimals", block_number=block_number)
153
+
154
+ if value['sdToken'] != NATIVE_TOKEN:
155
+ sdebt_token_total_supply_key = f'totalSupply_{value["sdToken"]}_{block_number}'.lower()
156
+ rpc_calls[sdebt_token_total_supply_key] = self.state_service.get_function_info(
157
+ value["sdToken"], ERC20_ABI, "totalSupply", block_number=block_number)
158
+
159
+ return rpc_calls
160
+
161
+ def get_apy_lending_pool_deprecated(
162
+ self,
163
+ atokens: dict,
164
+ debt_tokens: dict,
165
+ decimals: dict,
166
+ reserves_info: dict,
167
+ asset_data_tokens: dict,
168
+ total_supply_tokens: dict,
169
+ interest_rate: dict,
170
+ token_prices: dict,
171
+ pool_token_price: float,
172
+ pool_decimals: int = 18,
173
+ ):
174
+ reward_tokens = self.pool_info.get("rewardTokensList")
175
+ for token_address in reserves_info:
176
+ atoken = atokens.get(token_address)
177
+ debt_token = debt_tokens.get(token_address)
178
+ decimal = decimals.get(token_address)
179
+ total_supply_t = total_supply_tokens.get(atoken, 0)
180
+ total_supply_d = total_supply_tokens.get(debt_token, 0)
181
+ # update deposit, borrow apy
182
+ total_supply_t = total_supply_t / 10 ** decimal
183
+ total_supply_d = total_supply_d / 10 ** decimal
184
+ token_price = token_prices.get(token_address)
185
+ interest_rate[token_address].update({
186
+ "utilization": total_supply_d / total_supply_t,
187
+ })
188
+ total_supply_t_in_usd = total_supply_t * token_price
189
+ total_supply_d_in_usd = total_supply_d * token_price
190
+ if reward_tokens:
191
+ interest_rate[token_address][DBConst.reward_deposit_apy] = {}
192
+ interest_rate[token_address][DBConst.reward_borrow_apy] = {}
193
+ asset_data_t = asset_data_tokens.get(atoken)
194
+ asset_data_d = asset_data_tokens.get(debt_token)
195
+ # update deposit, borrow apy
196
+ for reward_address in reward_tokens:
197
+ eps_t = asset_data_t[reward_address][1] / 10 ** 18
198
+ eps_d = asset_data_d[reward_address][1] / 10 ** 18
199
+ if total_supply_t:
200
+ deposit_apr = eps_t * TimeConstants.A_YEAR * pool_token_price / (
201
+ total_supply_t * token_price)
202
+ else:
203
+ deposit_apr = 0
204
+ if total_supply_d:
205
+ borrow_apr = eps_d * TimeConstants.A_YEAR * pool_token_price / (
206
+ total_supply_d * token_price)
207
+ else:
208
+ borrow_apr = 0
209
+ interest_rate[token_address][DBConst.reward_deposit_apy].update({
210
+ DBConst.reward_borrow_apy: deposit_apr}
211
+ )
212
+ interest_rate[token_address][DBConst.reward_borrow_apy].update({
213
+ reward_address: borrow_apr}
214
+ )
215
+ # update liquidity
216
+ liquidity_log = {
217
+ 'total_borrow': {
218
+ DBConst.amount: total_supply_d,
219
+ DBConst.value_in_usd: total_supply_d_in_usd},
220
+ 'total_deposit': {
221
+ DBConst.amount: total_supply_t,
222
+ DBConst.value_in_usd: total_supply_t_in_usd}
223
+ }
224
+ interest_rate[token_address].update({DBConst.liquidity_change_logs: liquidity_log})
225
+
226
+ return interest_rate
227
+
228
+ def calculate_apy_lending_pool_function_call_deprecated(
229
+ self,
230
+ reserves_info: dict,
231
+ decoded_data: dict,
232
+ token_prices: dict,
233
+ pool_token_price: float,
234
+ pool_decimals: int = 18,
235
+ block_number: int = 'latest',
236
+ ):
237
+ reserves_data = {}
238
+ for token in reserves_info:
239
+ get_reserve_data_call_id = f'getReserveData_{self.name}_{token}_{block_number}'.lower()
240
+ reserves_data[token.lower()] = decoded_data.get(get_reserve_data_call_id)
241
+ reward_tokens = self.pool_info.get("rewardTokensList")
242
+ interest_rate, atokens, debt_tokens, sdebt_tokens, decimals, asset_data_tokens = {}, {}, {}, {}, {}, {}
243
+ total_supply_tokens = {}
244
+ for token_address in reserves_info:
245
+ lower_address = token_address.lower()
246
+ reserve_data = reserves_data[lower_address]
247
+ interest_rate[lower_address] = {
248
+ 'deposit_apy': float(reserve_data[3]) / 10 ** 27,
249
+ 'borrow_apy': float(reserve_data[4]) / 10 ** 27,
250
+ 'stable_borrow_apy': float(reserve_data[5]) / 10 ** 27}
251
+ atoken = reserve_data[7].lower()
252
+ sdebt_token = reserve_data[8].lower()
253
+ debt_token = reserve_data[9].lower()
254
+ decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
255
+ atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
256
+ debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
257
+ asset_data_tokens[atoken] = {}
258
+ asset_data_tokens[debt_token] = {}
259
+ if sdebt_token != NATIVE_TOKEN:
260
+ asset_data_tokens[sdebt_token] = {}
261
+
262
+ total_supply_tokens[atoken] = {}
263
+ for reward_token in reward_tokens:
264
+ atoken_assets_key = f"getRewardsData_{atoken}_{reward_token}_{block_number}".lower()
265
+ debt_token_assets_key = f"getRewardsData_{debt_token}_{reward_token}_{block_number}".lower()
266
+ asset_data_tokens[atoken][reward_token] = decoded_data.get(atoken_assets_key)
267
+ asset_data_tokens[debt_token][reward_token] = decoded_data.get(debt_token_assets_key)
268
+ total_supply_tokens[atoken][reward_token] = decoded_data.get(atoken_total_supply_key)
269
+ if sdebt_token != NATIVE_TOKEN:
270
+ sdebt_token_assets_key = f"getRewardsData_{sdebt_tokens}_{reward_token}_{block_number}".lower()
271
+ asset_data_tokens[sdebt_token][reward_token] = decoded_data.get(sdebt_token_assets_key)
272
+
273
+ atokens[lower_address] = atoken
274
+ debt_tokens[lower_address] = debt_token
275
+ sdebt_tokens[lower_address] = sdebt_token
276
+ decimals[lower_address] = decoded_data.get(decimals_call_id)
277
+ total_supply_tokens[debt_token] = decoded_data.get(debt_token_total_supply_key)
278
+ if sdebt_token != NATIVE_TOKEN:
279
+ sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
280
+ total_supply_tokens[sdebt_token] = decoded_data.get(sdebt_token_total_supply_key)
281
+
282
+ asset_price_key = f"getAssetsPrices_{self.name}_{block_number}".lower()
283
+ if not token_prices and asset_price_key in decoded_data:
284
+ token_prices = {}
285
+ prices = decoded_data.get(asset_price_key)
286
+ for pos in range(len(reserves_info.keys())):
287
+ token_prices[reserves_info[pos].lower()] = prices[pos] / 10 ** pool_decimals
288
+
289
+ data = self.get_apy_lending_pool_deprecated(
290
+ atokens, debt_tokens, decimals, reserves_info, asset_data_tokens, total_supply_tokens, interest_rate,
291
+ token_prices, pool_token_price, pool_decimals
292
+ )
293
+
294
+ return data
295
+
296
+ # REWARDS BALANCE
297
+ def get_rewards_balance_function_info(
298
+ self,
299
+ wallet,
300
+ reserves_info: dict = None,
301
+ block_number: int = "latest"
302
+ ):
303
+ rpc_calls = {}
304
+ reward_tokens = self.pool_info.get("rewardTokensList")
305
+ for reward_token in reward_tokens:
306
+ decimals_call_id = f"decimals_{reward_token}_{block_number}".lower()
307
+ rpc_calls[decimals_call_id] = self.state_service.get_function_info(
308
+ reward_token, ERC20_ABI, "decimals", block_number=block_number)
309
+ tokens = []
310
+ for key, value in reserves_info.items():
311
+ tokens += [Web3.to_checksum_address(value["tToken"]), Web3.to_checksum_address(value["dToken"])]
312
+ key = f"getAllUserRewards_{self.name}_{wallet}_{block_number}".lower()
313
+ rpc_calls[key] = self.get_function_incentive_info("getAllUserRewards", [tokens, Web3.to_checksum_address(wallet)], block_number)
314
+ return rpc_calls
315
+
316
+ def calculate_rewards_balance(
317
+ self, wallet: str, reserves_info: dict, decoded_data: dict, block_number: int = "latest"):
318
+ key = f"getAllUserRewards_{self.name}_{wallet}_{block_number}".lower()
319
+ rewards = decoded_data.get(key)
320
+ result = dict(zip(*rewards))
321
+ for key, value in result.items():
322
+ decimals_call_id = f"decimals_{key}_{block_number}".lower()
323
+ value /= 10 ** decoded_data.get(decimals_call_id, 18)
324
+ result[key] = {"amount": value}
325
+ return result
@@ -0,0 +1,36 @@
1
+ import logging
2
+
3
+ from defi_services.constants.chain_constant import Chain
4
+ from defi_services.constants.entities.lending_constant import Lending
5
+ from defi_services.jobs.queriers.state_querier import StateQuerier
6
+ from defi_services.services.lending.aave_v3_services import AaveV3StateService
7
+ from defi_services.services.lending.lending_info.base.zerolend_base import ZEROLEND_BASE
8
+ from defi_services.services.lending.lending_info.ethereum.zerolend_eth import ZEROLEND_ETH
9
+ from defi_services.services.lending.lending_info.zksync.zerolend_zksync import ZEROLEND_ZKSYNC
10
+
11
+ logger = logging.getLogger("ZeroLend Lending Pool State Service")
12
+
13
+
14
+ class ZeroLendInfo:
15
+ mapping = {
16
+ Chain.zksync: ZEROLEND_ZKSYNC,
17
+ Chain.ethereum: ZEROLEND_ETH,
18
+ Chain.base: ZEROLEND_BASE
19
+ }
20
+
21
+
22
+ class ZeroLendStateService(AaveV3StateService):
23
+ def __init__(self, state_service: StateQuerier, chain_id: str = Chain.zksync):
24
+ super().__init__(state_service, chain_id)
25
+ self.name = f"{chain_id}_{Lending.zerolend}"
26
+ self.pool_info = ZeroLendInfo.mapping.get(chain_id)
27
+
28
+ def get_service_info(self):
29
+ info = {
30
+ Lending.zerolend: {
31
+ "chain_id": self.chain_id,
32
+ "type": "lending",
33
+ "protocol_info": self.pool_info
34
+ }
35
+ }
36
+ return info