defi-state-querier 0.5.29__py3-none-any.whl → 0.5.31__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 (27) hide show
  1. defi_services/__init__.py +1 -1
  2. defi_services/abis/lending/kinza/__init__.py +0 -0
  3. defi_services/abis/lending/kinza/kinza_incentive.py +928 -0
  4. defi_services/abis/lending/kinza/kinza_lending_pool.py +1791 -0
  5. defi_services/abis/lending/seamless/__init__.py +0 -0
  6. defi_services/abis/lending/seamless/seamless_incentive.py +1049 -0
  7. defi_services/abis/lending/seamless/seamless_lending_pool.py +1738 -0
  8. defi_services/abis/lending/seamless/seamless_oracle.py +233 -0
  9. defi_services/constants/entities/lending_constant.py +6 -3
  10. defi_services/constants/entities/lending_services.py +14 -4
  11. defi_services/services/lending/avalon_services.py +34 -0
  12. defi_services/services/lending/kinza_services.py +315 -0
  13. defi_services/services/lending/lending_info/base/seamless_base.py +145 -0
  14. defi_services/services/lending/lending_info/base/xlend_base.py +91 -0
  15. defi_services/services/lending/lending_info/bsc/avalon_bsc.py +75 -0
  16. defi_services/services/lending/lending_info/bsc/kinza_bsc.py +182 -0
  17. defi_services/services/lending/lending_info/ethereum/kinza_eth.py +119 -0
  18. defi_services/services/lending/lending_info/optimism/xlend_optimism.py +112 -0
  19. defi_services/services/lending/liqee_service.py +2 -2
  20. defi_services/services/lending/onyx_service.py +2 -1
  21. defi_services/services/lending/seamless_services.py +313 -0
  22. defi_services/services/lending/xlend_services.py +325 -0
  23. {defi_state_querier-0.5.29.dist-info → defi_state_querier-0.5.31.dist-info}/METADATA +1 -1
  24. {defi_state_querier-0.5.29.dist-info → defi_state_querier-0.5.31.dist-info}/RECORD +27 -10
  25. {defi_state_querier-0.5.29.dist-info → defi_state_querier-0.5.31.dist-info}/WHEEL +0 -0
  26. {defi_state_querier-0.5.29.dist-info → defi_state_querier-0.5.31.dist-info}/licenses/LICENSE +0 -0
  27. {defi_state_querier-0.5.29.dist-info → defi_state_querier-0.5.31.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,233 @@
1
+ import json
2
+
3
+ SEAMLESS_ORACLE_ABI = json.loads('''
4
+ [
5
+ {
6
+ "inputs": [
7
+ {
8
+ "internalType": "contract IPoolAddressesProvider",
9
+ "name": "provider",
10
+ "type": "address"
11
+ },
12
+ {
13
+ "internalType": "address[]",
14
+ "name": "assets",
15
+ "type": "address[]"
16
+ },
17
+ {
18
+ "internalType": "address[]",
19
+ "name": "sources",
20
+ "type": "address[]"
21
+ },
22
+ {
23
+ "internalType": "address",
24
+ "name": "fallbackOracle",
25
+ "type": "address"
26
+ },
27
+ {
28
+ "internalType": "address",
29
+ "name": "baseCurrency",
30
+ "type": "address"
31
+ },
32
+ {
33
+ "internalType": "uint256",
34
+ "name": "baseCurrencyUnit",
35
+ "type": "uint256"
36
+ }
37
+ ],
38
+ "stateMutability": "nonpayable",
39
+ "type": "constructor"
40
+ },
41
+ {
42
+ "anonymous": false,
43
+ "inputs": [
44
+ {
45
+ "indexed": true,
46
+ "internalType": "address",
47
+ "name": "asset",
48
+ "type": "address"
49
+ },
50
+ {
51
+ "indexed": true,
52
+ "internalType": "address",
53
+ "name": "source",
54
+ "type": "address"
55
+ }
56
+ ],
57
+ "name": "AssetSourceUpdated",
58
+ "type": "event"
59
+ },
60
+ {
61
+ "anonymous": false,
62
+ "inputs": [
63
+ {
64
+ "indexed": true,
65
+ "internalType": "address",
66
+ "name": "baseCurrency",
67
+ "type": "address"
68
+ },
69
+ {
70
+ "indexed": false,
71
+ "internalType": "uint256",
72
+ "name": "baseCurrencyUnit",
73
+ "type": "uint256"
74
+ }
75
+ ],
76
+ "name": "BaseCurrencySet",
77
+ "type": "event"
78
+ },
79
+ {
80
+ "anonymous": false,
81
+ "inputs": [
82
+ {
83
+ "indexed": true,
84
+ "internalType": "address",
85
+ "name": "fallbackOracle",
86
+ "type": "address"
87
+ }
88
+ ],
89
+ "name": "FallbackOracleUpdated",
90
+ "type": "event"
91
+ },
92
+ {
93
+ "inputs": [],
94
+ "name": "ADDRESSES_PROVIDER",
95
+ "outputs": [
96
+ {
97
+ "internalType": "contract IPoolAddressesProvider",
98
+ "name": "",
99
+ "type": "address"
100
+ }
101
+ ],
102
+ "stateMutability": "view",
103
+ "type": "function"
104
+ },
105
+ {
106
+ "inputs": [],
107
+ "name": "BASE_CURRENCY",
108
+ "outputs": [
109
+ {
110
+ "internalType": "address",
111
+ "name": "",
112
+ "type": "address"
113
+ }
114
+ ],
115
+ "stateMutability": "view",
116
+ "type": "function"
117
+ },
118
+ {
119
+ "inputs": [],
120
+ "name": "BASE_CURRENCY_UNIT",
121
+ "outputs": [
122
+ {
123
+ "internalType": "uint256",
124
+ "name": "",
125
+ "type": "uint256"
126
+ }
127
+ ],
128
+ "stateMutability": "view",
129
+ "type": "function"
130
+ },
131
+ {
132
+ "inputs": [
133
+ {
134
+ "internalType": "address",
135
+ "name": "asset",
136
+ "type": "address"
137
+ }
138
+ ],
139
+ "name": "getAssetPrice",
140
+ "outputs": [
141
+ {
142
+ "internalType": "uint256",
143
+ "name": "",
144
+ "type": "uint256"
145
+ }
146
+ ],
147
+ "stateMutability": "view",
148
+ "type": "function"
149
+ },
150
+ {
151
+ "inputs": [
152
+ {
153
+ "internalType": "address[]",
154
+ "name": "assets",
155
+ "type": "address[]"
156
+ }
157
+ ],
158
+ "name": "getAssetsPrices",
159
+ "outputs": [
160
+ {
161
+ "internalType": "uint256[]",
162
+ "name": "",
163
+ "type": "uint256[]"
164
+ }
165
+ ],
166
+ "stateMutability": "view",
167
+ "type": "function"
168
+ },
169
+ {
170
+ "inputs": [],
171
+ "name": "getFallbackOracle",
172
+ "outputs": [
173
+ {
174
+ "internalType": "address",
175
+ "name": "",
176
+ "type": "address"
177
+ }
178
+ ],
179
+ "stateMutability": "view",
180
+ "type": "function"
181
+ },
182
+ {
183
+ "inputs": [
184
+ {
185
+ "internalType": "address",
186
+ "name": "asset",
187
+ "type": "address"
188
+ }
189
+ ],
190
+ "name": "getSourceOfAsset",
191
+ "outputs": [
192
+ {
193
+ "internalType": "address",
194
+ "name": "",
195
+ "type": "address"
196
+ }
197
+ ],
198
+ "stateMutability": "view",
199
+ "type": "function"
200
+ },
201
+ {
202
+ "inputs": [
203
+ {
204
+ "internalType": "address[]",
205
+ "name": "assets",
206
+ "type": "address[]"
207
+ },
208
+ {
209
+ "internalType": "address[]",
210
+ "name": "sources",
211
+ "type": "address[]"
212
+ }
213
+ ],
214
+ "name": "setAssetSources",
215
+ "outputs": [],
216
+ "stateMutability": "nonpayable",
217
+ "type": "function"
218
+ },
219
+ {
220
+ "inputs": [
221
+ {
222
+ "internalType": "address",
223
+ "name": "fallbackOracle",
224
+ "type": "address"
225
+ }
226
+ ],
227
+ "name": "setFallbackOracle",
228
+ "outputs": [],
229
+ "stateMutability": "nonpayable",
230
+ "type": "function"
231
+ }
232
+ ]
233
+ ''')
@@ -29,10 +29,13 @@ class Lending:
29
29
  moonwell = "moonwell"
30
30
  ionic = "ionic-protocol"
31
31
  sonne = "sonne-finance"
32
-
32
+ kinza = "kinza-finance"
33
+ seamless = "seamless-v1"
34
+ avalon = 'avalon-finance'
35
+ xlend = "extra-finance-xlend"
33
36
  all = [
34
37
  strike, aave_v2, aave_v3, radiant_v2, compound, flux, onyx, granary,
35
38
  iron_bank, trava, valas, geist, cream, venus, liqee, strike, uwu, wepiggy,
36
39
  morpho_compound, morpho_aave_v2, morpho_aave_v3, spark, ape_swap, silo, compound_v3,
37
- justlend, zerolend, moonwell, ionic, sonne
38
- ]
40
+ justlend, zerolend, moonwell, ionic, sonne, kinza, seamless, avalon, xlend
41
+ ]
@@ -2,14 +2,17 @@ from defi_services.constants.chain_constant import Chain
2
2
  from defi_services.constants.entities.lending_constant import Lending
3
3
  from defi_services.services.lending.aave_v2_services import AaveV2StateService
4
4
  from defi_services.services.lending.apeswap_services import ApeSwapStateService
5
+ from defi_services.services.lending.avalon_services import AvalonStateService
5
6
  from defi_services.services.lending.compound_v3_services import CompoundV3StateService
6
7
  from defi_services.services.lending.granary_services import GranaryStateService
7
8
  from defi_services.services.lending.ionic_service import IonicStateService
8
9
  from defi_services.services.lending.justlend_service import JustLendStateService
10
+ from defi_services.services.lending.kinza_services import KinzaStateService
9
11
  from defi_services.services.lending.moonwell_service import MoonWellStateService
10
12
  from defi_services.services.lending.morpho_aave_v2_services import MorphoAaveV2StateService
11
13
  from defi_services.services.lending.morpho_aave_v3_services import MorphoAaveV3StateService
12
14
  from defi_services.services.lending.morpho_compound_services import MorphoCompoundStateService
15
+ from defi_services.services.lending.seamless_services import SeamlessStateService
13
16
  from defi_services.services.lending.silo_services import SiloStateService
14
17
  from defi_services.services.lending.sonne_service import SonneStateService
15
18
  from defi_services.services.lending.spark_services import SparkStateService
@@ -28,6 +31,7 @@ from defi_services.services.lending.liqee_service import LiqeeStateService
28
31
  from defi_services.services.lending.strike_service import StrikeStateService
29
32
  from defi_services.services.lending.onyx_service import OnyxStateService
30
33
  from defi_services.services.lending.wepiggy_services import WepiggyStateService
34
+ from defi_services.services.lending.xlend_services import XlendStateService
31
35
  from defi_services.services.lending.zerolend_services import ZeroLendStateService
32
36
 
33
37
 
@@ -53,7 +57,8 @@ class LendingServices:
53
57
  Lending.silo: SiloStateService,
54
58
  Lending.compound_v3: CompoundV3StateService,
55
59
  Lending.radiant_v2: RadiantStateService,
56
- Lending.zerolend: ZeroLendStateService
60
+ Lending.zerolend: ZeroLendStateService,
61
+ Lending.kinza: KinzaStateService
57
62
  }
58
63
  fantom = {
59
64
  Lending.trava: TravaStateService,
@@ -72,7 +77,9 @@ class LendingServices:
72
77
  Lending.wepiggy: WepiggyStateService,
73
78
  Lending.granary: GranaryStateService,
74
79
  Lending.ape_swap: ApeSwapStateService,
75
- Lending.aave_v3: AaveV3StateService
80
+ Lending.aave_v3: AaveV3StateService,
81
+ Lending.kinza: KinzaStateService,
82
+ Lending.avalon: AvalonStateService
76
83
  }
77
84
 
78
85
  avalanche = {
@@ -94,7 +101,8 @@ class LendingServices:
94
101
  Lending.granary: GranaryStateService,
95
102
  Lending.wepiggy: WepiggyStateService,
96
103
  Lending.iron_bank: IronBankStateService,
97
- Lending.compound_v3: CompoundV3StateService
104
+ Lending.compound_v3: CompoundV3StateService,
105
+ Lending.xlend: XlendStateService
98
106
  }
99
107
 
100
108
  arbitrum = {
@@ -118,7 +126,9 @@ class LendingServices:
118
126
  Lending.granary: GranaryStateService,
119
127
  Lending.radiant_v2: RadiantStateService,
120
128
  Lending.ionic: IonicStateService,
121
- Lending.sonne: SonneStateService
129
+ Lending.sonne: SonneStateService,
130
+ Lending.seamless: SeamlessStateService,
131
+ Lending.xlend: XlendStateService
122
132
  }
123
133
 
124
134
  zksync = {
@@ -0,0 +1,34 @@
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.bsc.avalon_bsc import AVALON_BSC
8
+
9
+ logger = logging.getLogger("Avalon Lending Pool State Service")
10
+
11
+
12
+ class AvalonInfo:
13
+ mapping = {
14
+ Chain.bsc: AVALON_BSC
15
+ }
16
+
17
+
18
+ class AvalonStateService(AaveV3StateService):
19
+ def __init__(self, state_service: StateQuerier, chain_id: str = "0x38"):
20
+ super().__init__(state_service, chain_id)
21
+ self.name = f"{chain_id}_{Lending.avalon}"
22
+ self.chain_id = chain_id
23
+ self.pool_info = AvalonInfo.mapping.get(chain_id)
24
+ self.state_service = state_service
25
+
26
+ def get_service_info(self):
27
+ info = {
28
+ Lending.avalon: {
29
+ "chain_id": self.chain_id,
30
+ "type": "lending",
31
+ "protocol_info": self.pool_info
32
+ }
33
+ }
34
+ return info
@@ -0,0 +1,315 @@
1
+ import logging
2
+
3
+ from web3 import Web3
4
+
5
+ from defi_services.abis.lending.aave.aave_v3.aave_v3_oracle_abi import AAVE_V3_ORACLE_ABI
6
+ from defi_services.abis.lending.kinza.kinza_incentive import KINZA_INCENTIVE_ABI
7
+ from defi_services.abis.lending.kinza.kinza_lending_pool import KINZA_LENDING_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.bsc.kinza_bsc import KINZA_BSC
17
+ from defi_services.services.lending.lending_info.ethereum.kinza_eth import KINZA_ETH
18
+
19
+ logger = logging.getLogger("Kinza Lending Pool State Service")
20
+
21
+
22
+ class KinzaInfo:
23
+ mapping = {
24
+ Chain.bsc: KINZA_BSC,
25
+ Chain.ethereum: KINZA_ETH
26
+ }
27
+
28
+
29
+ class KinzaStateService(AaveV2StateService):
30
+ def __init__(self, state_service: StateQuerier, chain_id: str = "0x38"):
31
+ super().__init__(state_service, chain_id)
32
+ self.name = f"{chain_id}_{Lending.kinza}"
33
+ self.chain_id = chain_id
34
+ self.pool_info = KinzaInfo.mapping.get(chain_id)
35
+ self.lending_abi = KINZA_LENDING_ABI
36
+ self.incentive_abi = KINZA_INCENTIVE_ABI
37
+ self.oracle_abi = AAVE_V3_ORACLE_ABI
38
+ self.state_service = state_service
39
+
40
+ def get_service_info(self):
41
+ info = {
42
+ Lending.kinza: {
43
+ "chain_id": self.chain_id,
44
+ "type": "lending",
45
+ "protocol_info": self.pool_info
46
+ }
47
+ }
48
+ return info
49
+
50
+ def get_dapp_asset_info(self, block_number: int = 'latest'):
51
+ _w3 = self.state_service.get_w3()
52
+ pool_address = self.pool_info.get("address")
53
+ pool_contract = _w3.eth.contract(address=_w3.to_checksum_address(pool_address), abi=self.lending_abi)
54
+ reserve_list = pool_contract.functions.getReservesList().call(block_identifier=block_number)
55
+ reserves_info = {}
56
+ for token in reserve_list:
57
+ token = token.lower()
58
+ reserve_data = pool_contract.functions.getReserveData(
59
+ _w3.to_checksum_address(token)).call(block_identifier=block_number)
60
+ reserves_info[token] = {}
61
+ reserves_info[token]["tToken"] = reserve_data[8].lower()
62
+ reserves_info[token]["sdToken"] = reserve_data[9].lower()
63
+ reserves_info[token]["dToken"] = reserve_data[10].lower()
64
+
65
+ risk_param = bin(reserve_data[0][0])[2:]
66
+ reserves_info[token]["loanToValue"] = int(risk_param[-15:], 2) / 10 ** 4
67
+ reserves_info[token]["liquidationThreshold"] = int(risk_param[-31:-16], 2) / 10 ** 4
68
+
69
+ return reserves_info
70
+
71
+ # CALCULATE APY LENDING POOL
72
+ def get_reserve_tokens_metadata(
73
+ self,
74
+ decoded_data: dict,
75
+ reserves_info: dict,
76
+ block_number: int = "latest"
77
+ ):
78
+ reserve_tokens_info = []
79
+ for token_address, reserve_info in reserves_info.items():
80
+ get_reserve_data_call_id = f'getReserveData_{self.name}_{token_address}_{block_number}'.lower()
81
+ reserve_data = decoded_data.get(get_reserve_data_call_id)
82
+ atoken = reserve_data[8].lower()
83
+ debt_token = reserve_data[10].lower()
84
+ decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
85
+ atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
86
+ debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
87
+ sdebt_token = reserve_data[9].lower()
88
+
89
+
90
+ data = {
91
+ 'underlying': token_address,
92
+ 'underlying_decimals': decoded_data.get(decimals_call_id),
93
+ 'a_token_supply': decoded_data.get(atoken_total_supply_key),
94
+ 'd_token_supply': decoded_data.get(debt_token_total_supply_key),
95
+
96
+ 'supply_apy': reserve_data[2],
97
+ 'borrow_apy': reserve_data[4],
98
+
99
+ }
100
+ if sdebt_token != NATIVE_TOKEN:
101
+ sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
102
+ data['sd_token_supply'] = decoded_data.get(sdebt_token_total_supply_key)
103
+ data['stable_borrow_apy'] = reserve_data[5]
104
+ else:
105
+ data['sd_token_supply'] = 0
106
+ data['stable_borrow_apy'] = 0
107
+
108
+ reserve_tokens_info.append(data)
109
+
110
+ return reserve_tokens_info
111
+
112
+ def get_apy_lending_pool_function_info_deprecated(
113
+ self,
114
+ reserves_info: dict,
115
+ block_number: int = "latest",
116
+ ):
117
+ rpc_calls = {}
118
+ reward_tokens = self.pool_info.get("rewardTokensList")
119
+ for token_address, value in reserves_info.items():
120
+ reserve_key = f"getReserveData_{self.name}_{token_address}_{block_number}".lower()
121
+ atoken_total_supply_key = f'totalSupply_{value["tToken"]}_{block_number}'.lower()
122
+ debt_token_total_supply_key = f'totalSupply_{value["dToken"]}_{block_number}'.lower()
123
+ decimals_key = f"decimals_{token_address}_{block_number}".lower()
124
+ for reward_token in reward_tokens:
125
+ atoken_assets_key = f"getRewardsData_{value['tToken']}_{reward_token}_{block_number}".lower()
126
+ debt_token_assets_key = f"getRewardsData_{value['dToken']}_{reward_token}_{block_number}".lower()
127
+ rpc_calls[atoken_assets_key] = self.get_function_incentive_info(
128
+ "getRewardsData", [value['tToken'], reward_token], block_number)
129
+ rpc_calls[debt_token_assets_key] = self.get_function_incentive_info(
130
+ "getRewardsData", [value['dToken'], reward_token], block_number)
131
+ if value['sdToken'] != NATIVE_TOKEN:
132
+ sdebt_token_assets_key = f"getRewardsData_{value['sdToken']}_{reward_token}_{block_number}".lower()
133
+ rpc_calls[sdebt_token_assets_key] = self.get_function_incentive_info(
134
+ "getRewardsData", [value['sdToken'], reward_token], block_number)
135
+
136
+ rpc_calls[reserve_key] = self.get_function_lending_pool_info("getReserveData", [token_address])
137
+ rpc_calls[atoken_total_supply_key] = self.state_service.get_function_info(
138
+ value["tToken"], ERC20_ABI, "totalSupply", block_number=block_number)
139
+ rpc_calls[debt_token_total_supply_key] = self.state_service.get_function_info(
140
+ value["dToken"], ERC20_ABI, "totalSupply", block_number=block_number)
141
+ rpc_calls[decimals_key] = self.state_service.get_function_info(
142
+ token_address, ERC20_ABI, "decimals", block_number=block_number)
143
+
144
+ if value['sdToken'] != NATIVE_TOKEN:
145
+ sdebt_token_total_supply_key = f'totalSupply_{value["sdToken"]}_{block_number}'.lower()
146
+ rpc_calls[sdebt_token_total_supply_key] = self.state_service.get_function_info(
147
+ value["sdToken"], ERC20_ABI, "totalSupply", block_number=block_number)
148
+
149
+ return rpc_calls
150
+
151
+ def get_apy_lending_pool_deprecated(
152
+ self,
153
+ atokens: dict,
154
+ debt_tokens: dict,
155
+ decimals: dict,
156
+ reserves_info: dict,
157
+ asset_data_tokens: dict,
158
+ total_supply_tokens: dict,
159
+ interest_rate: dict,
160
+ token_prices: dict,
161
+ pool_token_price: float,
162
+ pool_decimals: int = 18,
163
+ ):
164
+ reward_tokens = self.pool_info.get("rewardTokensList")
165
+ for token_address in reserves_info:
166
+ atoken = atokens.get(token_address)
167
+ debt_token = debt_tokens.get(token_address)
168
+ decimal = decimals.get(token_address)
169
+ total_supply_t = total_supply_tokens.get(atoken, 0)
170
+ total_supply_d = total_supply_tokens.get(debt_token, 0)
171
+ # update deposit, borrow apy
172
+ total_supply_t = total_supply_t / 10 ** decimal
173
+ total_supply_d = total_supply_d / 10 ** decimal
174
+ token_price = token_prices.get(token_address)
175
+ interest_rate[token_address].update({
176
+ "utilization": total_supply_d / total_supply_t,
177
+ })
178
+ total_supply_t_in_usd = total_supply_t * token_price
179
+ total_supply_d_in_usd = total_supply_d * token_price
180
+ if reward_tokens:
181
+ interest_rate[token_address][DBConst.reward_deposit_apy] = {}
182
+ interest_rate[token_address][DBConst.reward_borrow_apy] = {}
183
+ asset_data_t = asset_data_tokens.get(atoken)
184
+ asset_data_d = asset_data_tokens.get(debt_token)
185
+ # update deposit, borrow apy
186
+ for reward_address in reward_tokens:
187
+ eps_t = asset_data_t[reward_address][1] / 10 ** 18
188
+ eps_d = asset_data_d[reward_address][1] / 10 ** 18
189
+ if total_supply_t:
190
+ deposit_apr = eps_t * TimeConstants.A_YEAR * pool_token_price / (
191
+ total_supply_t * token_price)
192
+ else:
193
+ deposit_apr = 0
194
+ if total_supply_d:
195
+ borrow_apr = eps_d * TimeConstants.A_YEAR * pool_token_price / (
196
+ total_supply_d * token_price)
197
+ else:
198
+ borrow_apr = 0
199
+ interest_rate[token_address][DBConst.reward_deposit_apy].update({
200
+ DBConst.reward_borrow_apy: deposit_apr}
201
+ )
202
+ interest_rate[token_address][DBConst.reward_borrow_apy].update({
203
+ reward_address: borrow_apr}
204
+ )
205
+ # update liquidity
206
+ liquidity_log = {
207
+ 'total_borrow': {
208
+ DBConst.amount: total_supply_d,
209
+ DBConst.value_in_usd: total_supply_d_in_usd},
210
+ 'total_deposit': {
211
+ DBConst.amount: total_supply_t,
212
+ DBConst.value_in_usd: total_supply_t_in_usd}
213
+ }
214
+ interest_rate[token_address].update({DBConst.liquidity_change_logs: liquidity_log})
215
+
216
+ return interest_rate
217
+
218
+ def calculate_apy_lending_pool_function_call_deprecated(
219
+ self,
220
+ reserves_info: dict,
221
+ decoded_data: dict,
222
+ token_prices: dict,
223
+ pool_token_price: float,
224
+ pool_decimals: int = 18,
225
+ block_number: int = 'latest',
226
+ ):
227
+ reserves_data = {}
228
+ for token in reserves_info:
229
+ get_reserve_data_call_id = f'getReserveData_{self.name}_{token}_{block_number}'.lower()
230
+ reserves_data[token.lower()] = decoded_data.get(get_reserve_data_call_id)
231
+ reward_tokens = self.pool_info.get("rewardTokensList")
232
+ interest_rate, atokens, debt_tokens, sdebt_tokens, decimals, asset_data_tokens = {}, {}, {}, {}, {}, {}
233
+ total_supply_tokens = {}
234
+ for token_address in reserves_info:
235
+ lower_address = token_address.lower()
236
+ reserve_data = reserves_data[lower_address]
237
+ interest_rate[lower_address] = {
238
+ 'deposit_apy': float(reserve_data[3]) / 10 ** 27,
239
+ 'borrow_apy': float(reserve_data[4]) / 10 ** 27,
240
+ 'stable_borrow_apy': float(reserve_data[5]) / 10 ** 27}
241
+ atoken = reserve_data[7].lower()
242
+ sdebt_token = reserve_data[8].lower()
243
+ debt_token = reserve_data[9].lower()
244
+ decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
245
+ atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
246
+ debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
247
+ asset_data_tokens[atoken] = {}
248
+ asset_data_tokens[debt_token] = {}
249
+ if sdebt_token != NATIVE_TOKEN:
250
+ asset_data_tokens[sdebt_token] = {}
251
+
252
+ total_supply_tokens[atoken] = {}
253
+ for reward_token in reward_tokens:
254
+ atoken_assets_key = f"getRewardsData_{atoken}_{reward_token}_{block_number}".lower()
255
+ debt_token_assets_key = f"getRewardsData_{debt_token}_{reward_token}_{block_number}".lower()
256
+ asset_data_tokens[atoken][reward_token] = decoded_data.get(atoken_assets_key)
257
+ asset_data_tokens[debt_token][reward_token] = decoded_data.get(debt_token_assets_key)
258
+ total_supply_tokens[atoken][reward_token] = decoded_data.get(atoken_total_supply_key)
259
+ if sdebt_token != NATIVE_TOKEN:
260
+ sdebt_token_assets_key = f"getRewardsData_{sdebt_tokens}_{reward_token}_{block_number}".lower()
261
+ asset_data_tokens[sdebt_token][reward_token] = decoded_data.get(sdebt_token_assets_key)
262
+
263
+ atokens[lower_address] = atoken
264
+ debt_tokens[lower_address] = debt_token
265
+ sdebt_tokens[lower_address] = sdebt_token
266
+ decimals[lower_address] = decoded_data.get(decimals_call_id)
267
+ total_supply_tokens[debt_token] = decoded_data.get(debt_token_total_supply_key)
268
+ if sdebt_token != NATIVE_TOKEN:
269
+ sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
270
+ total_supply_tokens[sdebt_token] = decoded_data.get(sdebt_token_total_supply_key)
271
+
272
+ asset_price_key = f"getAssetsPrices_{self.name}_{block_number}".lower()
273
+ if not token_prices and asset_price_key in decoded_data:
274
+ token_prices = {}
275
+ prices = decoded_data.get(asset_price_key)
276
+ for pos in range(len(reserves_info.keys())):
277
+ token_prices[reserves_info[pos].lower()] = prices[pos] / 10 ** pool_decimals
278
+
279
+ data = self.get_apy_lending_pool_deprecated(
280
+ atokens, debt_tokens, decimals, reserves_info, asset_data_tokens, total_supply_tokens, interest_rate,
281
+ token_prices, pool_token_price, pool_decimals
282
+ )
283
+
284
+ return data
285
+
286
+ # REWARDS BALANCE
287
+ def get_rewards_balance_function_info(
288
+ self,
289
+ wallet,
290
+ reserves_info: dict = None,
291
+ block_number: int = "latest"
292
+ ):
293
+ rpc_calls = {}
294
+ reward_tokens = self.pool_info.get("rewardTokensList")
295
+ for reward_token in reward_tokens:
296
+ decimals_call_id = f"decimals_{reward_token}_{block_number}".lower()
297
+ rpc_calls[decimals_call_id] = self.state_service.get_function_info(
298
+ reward_token, ERC20_ABI, "decimals", block_number=block_number)
299
+ tokens = []
300
+ for key, value in reserves_info.items():
301
+ tokens += [Web3.to_checksum_address(value["tToken"]), Web3.to_checksum_address(value["dToken"])]
302
+ key = f"getAllUserRewards_{self.name}_{wallet}_{block_number}".lower()
303
+ rpc_calls[key] = self.get_function_incentive_info("getAllUserRewards", [tokens, Web3.to_checksum_address(wallet)], block_number)
304
+ return rpc_calls
305
+
306
+ def calculate_rewards_balance(
307
+ self, wallet: str, reserves_info: dict, decoded_data: dict, block_number: int = "latest"):
308
+ key = f"getAllUserRewards_{self.name}_{wallet}_{block_number}".lower()
309
+ rewards = decoded_data.get(key)
310
+ result = dict(zip(*rewards))
311
+ for key, value in result.items():
312
+ decimals_call_id = f"decimals_{key}_{block_number}".lower()
313
+ value /= 10 ** decoded_data.get(decimals_call_id, 18)
314
+ result[key] = {"amount": value}
315
+ return result