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,313 @@
1
+ import logging
2
+
3
+ from web3 import Web3
4
+
5
+ from defi_services.abis.lending.seamless.seamless_incentive import SEAMLESS_INCENTIVE_ABI
6
+ from defi_services.abis.lending.seamless.seamless_lending_pool import SEAMLESS_LENDING_POOL_ABI
7
+ from defi_services.abis.lending.seamless.seamless_oracle import SEAMLESS_ORACLE_ABI
8
+ from defi_services.abis.token.erc20_abi import ERC20_ABI
9
+ from defi_services.constants.chain_constant import Chain
10
+ from defi_services.constants.db_constant import DBConst
11
+ from defi_services.constants.entities.lending_constant import Lending
12
+ from defi_services.constants.network_constants import NATIVE_TOKEN
13
+ from defi_services.constants.time_constant import TimeConstants
14
+ from defi_services.jobs.queriers.state_querier import StateQuerier
15
+ from defi_services.services.lending.aave_v2_services import AaveV2StateService
16
+ from defi_services.services.lending.lending_info.base.seamless_base import SEAMLESS_BASE
17
+
18
+ logger = logging.getLogger("Seamless Lending Pool State Service")
19
+
20
+
21
+ class SeamlessInfo:
22
+ mapping = {
23
+ Chain.base: SEAMLESS_BASE
24
+ }
25
+
26
+
27
+ class SeamlessStateService(AaveV2StateService):
28
+ def __init__(self, state_service: StateQuerier, chain_id: str = Chain.base):
29
+ super().__init__(state_service, chain_id)
30
+ self.name = f"{chain_id}_{Lending.seamless}"
31
+ self.chain_id = chain_id
32
+ self.pool_info = SeamlessInfo.mapping.get(chain_id)
33
+ self.lending_abi = SEAMLESS_LENDING_POOL_ABI
34
+ self.incentive_abi = SEAMLESS_INCENTIVE_ABI
35
+ self.oracle_abi = SEAMLESS_ORACLE_ABI
36
+ self.state_service = state_service
37
+
38
+ def get_service_info(self):
39
+ info = {
40
+ Lending.seamless: {
41
+ "chain_id": self.chain_id,
42
+ "type": "lending",
43
+ "protocol_info": self.pool_info
44
+ }
45
+ }
46
+ return info
47
+
48
+ def get_dapp_asset_info(self, block_number: int = 'latest'):
49
+ _w3 = self.state_service.get_w3()
50
+ pool_address = self.pool_info.get("address")
51
+ pool_contract = _w3.eth.contract(address=_w3.to_checksum_address(pool_address), abi=self.lending_abi)
52
+ reserve_list = pool_contract.functions.getReservesList().call(block_identifier=block_number)
53
+ reserves_info = {}
54
+ for token in reserve_list:
55
+ token = token.lower()
56
+ reserve_data = pool_contract.functions.getReserveData(
57
+ _w3.to_checksum_address(token)).call(block_identifier=block_number)
58
+ reserves_info[token] = {}
59
+ reserves_info[token]["tToken"] = reserve_data[8].lower()
60
+ reserves_info[token]["sdToken"] = reserve_data[9].lower()
61
+ reserves_info[token]["dToken"] = reserve_data[10].lower()
62
+
63
+ risk_param = bin(reserve_data[0][0])[2:]
64
+ reserves_info[token]["loanToValue"] = int(risk_param[-15:], 2) / 10 ** 4
65
+ reserves_info[token]["liquidationThreshold"] = int(risk_param[-31:-16], 2) / 10 ** 4
66
+
67
+ return reserves_info
68
+
69
+ # CALCULATE APY LENDING POOL
70
+ def get_reserve_tokens_metadata(
71
+ self,
72
+ decoded_data: dict,
73
+ reserves_info: dict,
74
+ block_number: int = "latest"
75
+ ):
76
+ reserve_tokens_info = []
77
+ for token_address, reserve_info in reserves_info.items():
78
+ get_reserve_data_call_id = f'getReserveData_{self.name}_{token_address}_{block_number}'.lower()
79
+ reserve_data = decoded_data.get(get_reserve_data_call_id)
80
+ atoken = reserve_data[8].lower()
81
+ debt_token = reserve_data[10].lower()
82
+ decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
83
+ atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
84
+ debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
85
+ sdebt_token = reserve_data[9].lower()
86
+
87
+
88
+ data = {
89
+ 'underlying': token_address,
90
+ 'underlying_decimals': decoded_data.get(decimals_call_id),
91
+ 'a_token_supply': decoded_data.get(atoken_total_supply_key),
92
+ 'd_token_supply': decoded_data.get(debt_token_total_supply_key),
93
+
94
+ 'supply_apy': reserve_data[2],
95
+ 'borrow_apy': reserve_data[4],
96
+
97
+ }
98
+ if sdebt_token != NATIVE_TOKEN:
99
+ sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
100
+ data['sd_token_supply'] = decoded_data.get(sdebt_token_total_supply_key)
101
+ data['stable_borrow_apy'] = reserve_data[5]
102
+ else:
103
+ data['sd_token_supply'] = 0
104
+ data['stable_borrow_apy'] = 0
105
+
106
+ reserve_tokens_info.append(data)
107
+
108
+ return reserve_tokens_info
109
+
110
+ def get_apy_lending_pool_function_info_deprecated(
111
+ self,
112
+ reserves_info: dict,
113
+ block_number: int = "latest",
114
+ ):
115
+ rpc_calls = {}
116
+ reward_tokens = self.pool_info.get("rewardTokensList")
117
+ for token_address, value in reserves_info.items():
118
+ reserve_key = f"getReserveData_{self.name}_{token_address}_{block_number}".lower()
119
+ atoken_total_supply_key = f'totalSupply_{value["tToken"]}_{block_number}'.lower()
120
+ debt_token_total_supply_key = f'totalSupply_{value["dToken"]}_{block_number}'.lower()
121
+ decimals_key = f"decimals_{token_address}_{block_number}".lower()
122
+ for reward_token in reward_tokens:
123
+ atoken_assets_key = f"getRewardsData_{value['tToken']}_{reward_token}_{block_number}".lower()
124
+ debt_token_assets_key = f"getRewardsData_{value['dToken']}_{reward_token}_{block_number}".lower()
125
+ rpc_calls[atoken_assets_key] = self.get_function_incentive_info(
126
+ "getRewardsData", [value['tToken'], reward_token], block_number)
127
+ rpc_calls[debt_token_assets_key] = self.get_function_incentive_info(
128
+ "getRewardsData", [value['dToken'], reward_token], block_number)
129
+ if value['sdToken'] != NATIVE_TOKEN:
130
+ sdebt_token_assets_key = f"getRewardsData_{value['sdToken']}_{reward_token}_{block_number}".lower()
131
+ rpc_calls[sdebt_token_assets_key] = self.get_function_incentive_info(
132
+ "getRewardsData", [value['sdToken'], reward_token], block_number)
133
+
134
+ rpc_calls[reserve_key] = self.get_function_lending_pool_info("getReserveData", [token_address])
135
+ rpc_calls[atoken_total_supply_key] = self.state_service.get_function_info(
136
+ value["tToken"], ERC20_ABI, "totalSupply", block_number=block_number)
137
+ rpc_calls[debt_token_total_supply_key] = self.state_service.get_function_info(
138
+ value["dToken"], ERC20_ABI, "totalSupply", block_number=block_number)
139
+ rpc_calls[decimals_key] = self.state_service.get_function_info(
140
+ token_address, ERC20_ABI, "decimals", block_number=block_number)
141
+
142
+ if value['sdToken'] != NATIVE_TOKEN:
143
+ sdebt_token_total_supply_key = f'totalSupply_{value["sdToken"]}_{block_number}'.lower()
144
+ rpc_calls[sdebt_token_total_supply_key] = self.state_service.get_function_info(
145
+ value["sdToken"], ERC20_ABI, "totalSupply", block_number=block_number)
146
+
147
+ return rpc_calls
148
+
149
+ def get_apy_lending_pool_deprecated(
150
+ self,
151
+ atokens: dict,
152
+ debt_tokens: dict,
153
+ decimals: dict,
154
+ reserves_info: dict,
155
+ asset_data_tokens: dict,
156
+ total_supply_tokens: dict,
157
+ interest_rate: dict,
158
+ token_prices: dict,
159
+ pool_token_price: float,
160
+ pool_decimals: int = 18,
161
+ ):
162
+ reward_tokens = self.pool_info.get("rewardTokensList")
163
+ for token_address in reserves_info:
164
+ atoken = atokens.get(token_address)
165
+ debt_token = debt_tokens.get(token_address)
166
+ decimal = decimals.get(token_address)
167
+ total_supply_t = total_supply_tokens.get(atoken, 0)
168
+ total_supply_d = total_supply_tokens.get(debt_token, 0)
169
+ # update deposit, borrow apy
170
+ total_supply_t = total_supply_t / 10 ** decimal
171
+ total_supply_d = total_supply_d / 10 ** decimal
172
+ token_price = token_prices.get(token_address)
173
+ interest_rate[token_address].update({
174
+ "utilization": total_supply_d / total_supply_t,
175
+ })
176
+ total_supply_t_in_usd = total_supply_t * token_price
177
+ total_supply_d_in_usd = total_supply_d * token_price
178
+ if reward_tokens:
179
+ interest_rate[token_address][DBConst.reward_deposit_apy] = {}
180
+ interest_rate[token_address][DBConst.reward_borrow_apy] = {}
181
+ asset_data_t = asset_data_tokens.get(atoken)
182
+ asset_data_d = asset_data_tokens.get(debt_token)
183
+ # update deposit, borrow apy
184
+ for reward_address in reward_tokens:
185
+ eps_t = asset_data_t[reward_address][1] / 10 ** 18
186
+ eps_d = asset_data_d[reward_address][1] / 10 ** 18
187
+ if total_supply_t:
188
+ deposit_apr = eps_t * TimeConstants.A_YEAR * pool_token_price / (
189
+ total_supply_t * token_price)
190
+ else:
191
+ deposit_apr = 0
192
+ if total_supply_d:
193
+ borrow_apr = eps_d * TimeConstants.A_YEAR * pool_token_price / (
194
+ total_supply_d * token_price)
195
+ else:
196
+ borrow_apr = 0
197
+ interest_rate[token_address][DBConst.reward_deposit_apy].update({
198
+ DBConst.reward_borrow_apy: deposit_apr}
199
+ )
200
+ interest_rate[token_address][DBConst.reward_borrow_apy].update({
201
+ reward_address: borrow_apr}
202
+ )
203
+ # update liquidity
204
+ liquidity_log = {
205
+ 'total_borrow': {
206
+ DBConst.amount: total_supply_d,
207
+ DBConst.value_in_usd: total_supply_d_in_usd},
208
+ 'total_deposit': {
209
+ DBConst.amount: total_supply_t,
210
+ DBConst.value_in_usd: total_supply_t_in_usd}
211
+ }
212
+ interest_rate[token_address].update({DBConst.liquidity_change_logs: liquidity_log})
213
+
214
+ return interest_rate
215
+
216
+ def calculate_apy_lending_pool_function_call_deprecated(
217
+ self,
218
+ reserves_info: dict,
219
+ decoded_data: dict,
220
+ token_prices: dict,
221
+ pool_token_price: float,
222
+ pool_decimals: int = 18,
223
+ block_number: int = 'latest',
224
+ ):
225
+ reserves_data = {}
226
+ for token in reserves_info:
227
+ get_reserve_data_call_id = f'getReserveData_{self.name}_{token}_{block_number}'.lower()
228
+ reserves_data[token.lower()] = decoded_data.get(get_reserve_data_call_id)
229
+ reward_tokens = self.pool_info.get("rewardTokensList")
230
+ interest_rate, atokens, debt_tokens, sdebt_tokens, decimals, asset_data_tokens = {}, {}, {}, {}, {}, {}
231
+ total_supply_tokens = {}
232
+ for token_address in reserves_info:
233
+ lower_address = token_address.lower()
234
+ reserve_data = reserves_data[lower_address]
235
+ interest_rate[lower_address] = {
236
+ 'deposit_apy': float(reserve_data[3]) / 10 ** 27,
237
+ 'borrow_apy': float(reserve_data[4]) / 10 ** 27,
238
+ 'stable_borrow_apy': float(reserve_data[5]) / 10 ** 27}
239
+ atoken = reserve_data[7].lower()
240
+ sdebt_token = reserve_data[8].lower()
241
+ debt_token = reserve_data[9].lower()
242
+ decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
243
+ atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
244
+ debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
245
+ asset_data_tokens[atoken] = {}
246
+ asset_data_tokens[debt_token] = {}
247
+ if sdebt_token != NATIVE_TOKEN:
248
+ asset_data_tokens[sdebt_token] = {}
249
+
250
+ total_supply_tokens[atoken] = {}
251
+ for reward_token in reward_tokens:
252
+ atoken_assets_key = f"getRewardsData_{atoken}_{reward_token}_{block_number}".lower()
253
+ debt_token_assets_key = f"getRewardsData_{debt_token}_{reward_token}_{block_number}".lower()
254
+ asset_data_tokens[atoken][reward_token] = decoded_data.get(atoken_assets_key)
255
+ asset_data_tokens[debt_token][reward_token] = decoded_data.get(debt_token_assets_key)
256
+ total_supply_tokens[atoken][reward_token] = decoded_data.get(atoken_total_supply_key)
257
+ if sdebt_token != NATIVE_TOKEN:
258
+ sdebt_token_assets_key = f"getRewardsData_{sdebt_tokens}_{reward_token}_{block_number}".lower()
259
+ asset_data_tokens[sdebt_token][reward_token] = decoded_data.get(sdebt_token_assets_key)
260
+
261
+ atokens[lower_address] = atoken
262
+ debt_tokens[lower_address] = debt_token
263
+ sdebt_tokens[lower_address] = sdebt_token
264
+ decimals[lower_address] = decoded_data.get(decimals_call_id)
265
+ total_supply_tokens[debt_token] = decoded_data.get(debt_token_total_supply_key)
266
+ if sdebt_token != NATIVE_TOKEN:
267
+ sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
268
+ total_supply_tokens[sdebt_token] = decoded_data.get(sdebt_token_total_supply_key)
269
+
270
+ asset_price_key = f"getAssetsPrices_{self.name}_{block_number}".lower()
271
+ if not token_prices and asset_price_key in decoded_data:
272
+ token_prices = {}
273
+ prices = decoded_data.get(asset_price_key)
274
+ for pos in range(len(reserves_info.keys())):
275
+ token_prices[reserves_info[pos].lower()] = prices[pos] / 10 ** pool_decimals
276
+
277
+ data = self.get_apy_lending_pool_deprecated(
278
+ atokens, debt_tokens, decimals, reserves_info, asset_data_tokens, total_supply_tokens, interest_rate,
279
+ token_prices, pool_token_price, pool_decimals
280
+ )
281
+
282
+ return data
283
+
284
+ # REWARDS BALANCE
285
+ def get_rewards_balance_function_info(
286
+ self,
287
+ wallet,
288
+ reserves_info: dict = None,
289
+ block_number: int = "latest"
290
+ ):
291
+ rpc_calls = {}
292
+ reward_tokens = self.pool_info.get("rewardTokensList")
293
+ for reward_token in reward_tokens:
294
+ decimals_call_id = f"decimals_{reward_token}_{block_number}".lower()
295
+ rpc_calls[decimals_call_id] = self.state_service.get_function_info(
296
+ reward_token, ERC20_ABI, "decimals", block_number=block_number)
297
+ tokens = []
298
+ for key, value in reserves_info.items():
299
+ tokens += [Web3.to_checksum_address(value["tToken"]), Web3.to_checksum_address(value["dToken"])]
300
+ key = f"getAllUserRewards_{self.name}_{wallet}_{block_number}".lower()
301
+ rpc_calls[key] = self.get_function_incentive_info("getAllUserRewards", [tokens, Web3.to_checksum_address(wallet)], block_number)
302
+ return rpc_calls
303
+
304
+ def calculate_rewards_balance(
305
+ self, wallet: str, reserves_info: dict, decoded_data: dict, block_number: int = "latest"):
306
+ key = f"getAllUserRewards_{self.name}_{wallet}_{block_number}".lower()
307
+ rewards = decoded_data.get(key)
308
+ result = dict(zip(*rewards))
309
+ for key, value in result.items():
310
+ decimals_call_id = f"decimals_{key}_{block_number}".lower()
311
+ value /= 10 ** decoded_data.get(decimals_call_id, 18)
312
+ result[key] = {"amount": value}
313
+ return result
@@ -0,0 +1,64 @@
1
+ import logging
2
+
3
+ from defi_services.abis.lending.venus.venus_comptroller_abi import VENUS_COMPTROLLER_ABI
4
+ from defi_services.abis.lending.venus.vtoken_abi import VTOKEN_ABI
5
+ from defi_services.constants.chain_constant import Chain
6
+ from defi_services.constants.entities.lending_constant import Lending
7
+ from defi_services.jobs.queriers.state_querier import StateQuerier
8
+ from defi_services.services.lending.lending_info.base.sonne_base import SONNE_BASE
9
+ from defi_services.services.lending.venus_services import VenusStateService
10
+
11
+ logger = logging.getLogger("Ionic Lending Pool State Service")
12
+
13
+
14
+ class SonneInfo:
15
+ mapping = {
16
+ Chain.base: SONNE_BASE
17
+ }
18
+
19
+
20
+ class SonneStateService(VenusStateService):
21
+ def __init__(self, state_service: StateQuerier, chain_id: str = "0x38"):
22
+ super().__init__(state_service, chain_id)
23
+ self.name = f"{chain_id}_{Lending.sonne}"
24
+ self.chain_id = chain_id
25
+ self.pool_info = SonneInfo.mapping.get(chain_id)
26
+ self.state_service = state_service
27
+ self.comptroller_abi = VENUS_COMPTROLLER_ABI
28
+ self.vtoken_abi = VTOKEN_ABI
29
+
30
+ def get_service_info(self):
31
+ info = {
32
+ Lending.sonne: {
33
+ "chain_id": self.chain_id,
34
+ "type": "lending",
35
+ "protocol_info": self.pool_info
36
+ }
37
+ }
38
+ return info
39
+
40
+ def calculate_apy_lending_pool_function_call(
41
+ self,
42
+ reserves_info: dict,
43
+ decoded_data: dict,
44
+ token_prices: dict,
45
+ pool_token_price: float,
46
+ pool_decimals: int = 18,
47
+ block_number: int = "latest",
48
+ ):
49
+ reserve_tokens_info = self.get_reserve_tokens_metadata(decoded_data, reserves_info, block_number)
50
+
51
+ data = {}
52
+ for token_info in reserve_tokens_info:
53
+ underlying_token = token_info['underlying']
54
+ c_token = token_info['token']
55
+
56
+ assets = {
57
+ underlying_token: self._calculate_interest_rates(
58
+ token_info, pool_decimals=pool_decimals,
59
+ apx_block_speed_in_seconds=1
60
+ )
61
+ }
62
+ data[c_token] = assets
63
+
64
+ return data
@@ -3,8 +3,8 @@ import time
3
3
 
4
4
  from web3 import Web3
5
5
 
6
- from defi_services.abis.lending.aave_v2_and_forlks.oracle_abi import ORACLE_ABI
7
- from defi_services.abis.lending.aave_v2_and_forlks.staked_incentives_abi import STAKED_INCENTIVES_ABI
6
+ from defi_services.abis.lending.aave_v2_and_forks.oracle_abi import ORACLE_ABI
7
+ from defi_services.abis.lending.aave_v2_and_forks.staked_incentives_abi import STAKED_INCENTIVES_ABI
8
8
  from defi_services.abis.lending.trava.trava_lending_pool_abi import TRAVA_LENDING_POOL_ABI
9
9
  from defi_services.abis.token.erc20_abi import ERC20_ABI
10
10
  from defi_services.constants.chain_constant import Chain
@@ -3,9 +3,9 @@ import time
3
3
 
4
4
  from web3 import Web3
5
5
 
6
- from defi_services.abis.lending.aave_v2_and_forlks.lending_pool_abi import LENDING_POOL_ABI
7
- from defi_services.abis.lending.aave_v2_and_forlks.oracle_abi import ORACLE_ABI
8
- from defi_services.abis.lending.aave_v2_and_forlks.uwu_incentives_abi import UWU_INCENTIVES_ABI
6
+ from defi_services.abis.lending.aave_v2_and_forks.lending_pool_abi import LENDING_POOL_ABI
7
+ from defi_services.abis.lending.aave_v2_and_forks.oracle_abi import ORACLE_ABI
8
+ from defi_services.abis.lending.aave_v2_and_forks.uwu_incentives_abi import UWU_INCENTIVES_ABI
9
9
  from defi_services.abis.token.erc20_abi import ERC20_ABI
10
10
  from defi_services.constants.chain_constant import Chain
11
11
  from defi_services.constants.entities.lending_constant import Lending
@@ -3,8 +3,8 @@ import time
3
3
 
4
4
  from web3 import Web3
5
5
 
6
- from defi_services.abis.lending.aave_v2_and_forlks.lending_pool_abi import LENDING_POOL_ABI
7
- from defi_services.abis.lending.aave_v2_and_forlks.oracle_abi import ORACLE_ABI
6
+ from defi_services.abis.lending.aave_v2_and_forks.lending_pool_abi import LENDING_POOL_ABI
7
+ from defi_services.abis.lending.aave_v2_and_forks.oracle_abi import ORACLE_ABI
8
8
  from defi_services.abis.lending.valas.chef_incentives_controller import CHEF_INCENTIVES_CONTROLLER
9
9
  from defi_services.abis.lending.valas.valas_multi_fee_distribution import VALAS_MULTI_FEE_DISTRIBUTION
10
10
  from defi_services.abis.token.erc20_abi import ERC20_ABI
@@ -151,16 +151,22 @@ class VenusStateService(CompoundStateService):
151
151
 
152
152
  def calculate_rewards_balance(
153
153
  self, wallet: str, reserves_info: dict, decoded_data: dict, block_number: int = "latest"):
154
+ if not self.pool_info.get('lensAddress'):
155
+ return {}
156
+
154
157
  w3 = self.state_service.get_w3()
155
- contract = w3.eth.contract(address=w3.to_checksum_address(self.pool_info.get("lensAddress")), abi = self.lens_abi)
158
+ contract = w3.eth.contract(address=w3.to_checksum_address(self.pool_info.get("lensAddress")), abi=self.lens_abi)
156
159
  # get_reward_id = f"pendingRewards_{self.name}_{wallet}_{block_number}".lower()
157
- return_data = contract.functions.pendingRewards(w3.to_checksum_address(wallet), w3.to_checksum_address(self.pool_info.get("comptrollerAddress"))).call(block_identifier=block_number)
160
+ return_data = contract.functions.pendingRewards(
161
+ w3.to_checksum_address(wallet),
162
+ w3.to_checksum_address(self.pool_info.get("comptrollerAddress"))).call(block_identifier=block_number)
163
+
158
164
  rewards = return_data[2]
159
165
  for item in return_data[-1]:
160
166
  rewards += item[-1]
161
167
  reward_token = self.pool_info.get("rewardToken")
162
168
  result = {
163
- reward_token: {"amount": rewards/10**18}
169
+ reward_token: {"amount": rewards / 10 ** 18}
164
170
  }
165
171
  return result
166
172