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
@@ -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.aave_v2_incentives_abi import AAVE_V2_INCENTIVES_ABI
7
- from defi_services.abis.lending.aave_v2_and_forlks.lending_pool_abi import LENDING_POOL_ABI
8
- from defi_services.abis.lending.aave_v2_and_forlks.oracle_abi import ORACLE_ABI
6
+ from defi_services.abis.lending.aave_v2_and_forks.aave_v2_incentives_abi import AAVE_V2_INCENTIVES_ABI
7
+ from defi_services.abis.lending.aave_v2_and_forks.lending_pool_abi import LENDING_POOL_ABI
8
+ from defi_services.abis.lending.aave_v2_and_forks.oracle_abi import ORACLE_ABI
9
9
  from defi_services.abis.lending.granary.granary_rewarder_abi import GRANARY_REWARDER_ABI
10
10
  from defi_services.abis.token.erc20_abi import ERC20_ABI
11
11
  from defi_services.constants.chain_constant import Chain
@@ -14,6 +14,7 @@ from defi_services.constants.token_constant import Token
14
14
  from defi_services.jobs.queriers.state_querier import StateQuerier
15
15
  from defi_services.services.lending.lending_info.arbitrum.granary_arbitrum import GRANARY_ARBITRUM
16
16
  from defi_services.services.lending.lending_info.avalanche.granary_avalanche import GRANARY_AVALANCHE
17
+ from defi_services.services.lending.lending_info.base.granary_base import GRANARY_BASE
17
18
  from defi_services.services.lending.lending_info.bsc.granary_bsc import GRANARY_BSC
18
19
  from defi_services.services.lending.lending_info.ethereum.granary_eth import GRANARY_V1_ETH
19
20
  from defi_services.services.lending.lending_info.fantom.granary_ftm import GRANARY_FTM
@@ -31,7 +32,8 @@ class GranaryV1Info:
31
32
  Chain.optimism: GRANARY_OPTIMISM,
32
33
  Chain.fantom: GRANARY_FTM,
33
34
  Chain.avalanche: GRANARY_AVALANCHE,
34
- Chain.arbitrum: GRANARY_ARBITRUM
35
+ Chain.arbitrum: GRANARY_ARBITRUM,
36
+ Chain.base: GRANARY_BASE
35
37
  }
36
38
 
37
39
 
@@ -0,0 +1,167 @@
1
+ import logging
2
+
3
+ from web3 import Web3
4
+
5
+ from defi_services.abis.lending.ionic.ionic_ctoken_abi import IONIC_CTOKEN_ABI
6
+ from defi_services.abis.lending.moonwell.moonwell_comptroller_abi import MOONWELL_COMPTROLLER_ABI
7
+ from defi_services.abis.token.erc20_abi import ERC20_ABI
8
+ from defi_services.constants.chain_constant import Chain
9
+ from defi_services.constants.entities.lending_constant import Lending
10
+ from defi_services.constants.token_constant import Token
11
+ from defi_services.jobs.queriers.state_querier import StateQuerier
12
+ from defi_services.services.lending.lending_info.base.ionic_base import IONIC_BASE
13
+ from defi_services.services.lending.venus_services import VenusStateService
14
+
15
+ logger = logging.getLogger("Ionic Lending Pool State Service")
16
+
17
+
18
+ class IonicInfo:
19
+ mapping = {
20
+ Chain.base: IONIC_BASE
21
+ }
22
+
23
+
24
+ class IonicStateService(VenusStateService):
25
+ def __init__(self, state_service: StateQuerier, chain_id: str = "0x38"):
26
+ super().__init__(state_service, chain_id)
27
+ self.name = f"{chain_id}_{Lending.ionic}"
28
+ self.chain_id = chain_id
29
+ self.pool_info = IonicInfo.mapping.get(chain_id)
30
+ self.state_service = state_service
31
+ self.comptroller_abi = MOONWELL_COMPTROLLER_ABI
32
+ self.vtoken_abi = IONIC_CTOKEN_ABI
33
+
34
+ def get_service_info(self):
35
+ info = {
36
+ Lending.ionic: {
37
+ "chain_id": self.chain_id,
38
+ "type": "lending",
39
+ "protocol_info": self.pool_info
40
+ }
41
+ }
42
+ return info
43
+
44
+ def get_dapp_asset_info(self, block_number: int = "latest"):
45
+ _w3 = self.state_service.get_w3()
46
+ comptroller_contract = _w3.eth.contract(
47
+ address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
48
+ ctokens = []
49
+ for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
50
+ ctokens.append(token)
51
+
52
+ reserves_info = {}
53
+ tokens = [Web3.to_checksum_address(i) for i in ctokens]
54
+ queries = {}
55
+ for token in tokens:
56
+ key = f"underlying_{token}_{block_number}".lower()
57
+ queries[key] = {
58
+ "address": token, "abi": self.vtoken_abi, "params": [],
59
+ "function": "underlying", "block_number": block_number
60
+ }
61
+
62
+ exchange_rate_query_id = f'exchangeRateCurrent_{token}_{block_number}'
63
+ queries[exchange_rate_query_id] = self.get_ctoken_function_info(
64
+ ctoken=token, fn_name='exchangeRateCurrent', block_number=block_number)
65
+
66
+ markets = f"markets_{token}_{block_number}".lower()
67
+ queries[markets] = self.get_comptroller_function_info("markets", [token])
68
+
69
+ decoded_data = self.state_service.query_state_data(queries)
70
+ for token in tokens:
71
+ key = f"underlying_{token}_{block_number}".lower()
72
+ underlying = decoded_data.get(key).lower()
73
+ markets = f"markets_{token}_{block_number}".lower()
74
+ liquidation_threshold = decoded_data.get(markets)[1] / 10 ** 18
75
+ ltv = liquidation_threshold
76
+
77
+ exchange_rate_query_id = f'exchangeRateCurrent_{token}_{block_number}'
78
+ exchange_rate = decoded_data.get(exchange_rate_query_id) / 10 ** 18
79
+
80
+ reserves_info[underlying] = {
81
+ 'cToken': token.lower(),
82
+ "exchangeRate": exchange_rate,
83
+ "liquidationThreshold": liquidation_threshold,
84
+ "loanToValue": ltv
85
+ }
86
+ return reserves_info
87
+
88
+ def get_apy_lending_pool_function_info(
89
+ self,
90
+ reserves_info: dict,
91
+ block_number: int = "latest"
92
+ ):
93
+ rpc_calls = {}
94
+ for token_address, reserve_info in reserves_info.items():
95
+ if token_address != Token.native_token:
96
+ query_id = f"decimals_{token_address}_{block_number}".lower()
97
+ rpc_calls[query_id] = self.state_service.get_function_info(token_address, ERC20_ABI, "decimals", [], block_number)
98
+
99
+ ctoken = reserve_info.get("cToken")
100
+ for fn_name in ['decimals', 'totalSupply', 'totalBorrows', 'supplyRatePerBlock', 'borrowRatePerBlock', 'exchangeRateCurrent']:
101
+ query_id = f"{fn_name}_{ctoken}_{block_number}".lower()
102
+ rpc_calls[query_id] = self.get_ctoken_function_info(
103
+ ctoken=ctoken,
104
+ fn_name=fn_name,
105
+ block_number=block_number
106
+ )
107
+
108
+ return rpc_calls
109
+
110
+ def get_reserve_tokens_metadata(
111
+ self,
112
+ decoded_data: dict,
113
+ reserves_info: dict,
114
+ block_number: int = "latest"
115
+ ):
116
+ reserve_tokens_info = []
117
+ for token_address, reserve_info in reserves_info.items():
118
+ if token_address != Token.native_token:
119
+ underlying_decimals_query_id = f"decimals_{token_address}_{block_number}".lower()
120
+ underlying_decimals = decoded_data.get(underlying_decimals_query_id)
121
+ else:
122
+ underlying_decimals = Chain.native_decimals.get(self.chain_id, 18)
123
+
124
+ ctoken = reserve_info.get("cToken")
125
+ ctoken_decimals_query_id = f"decimals_{ctoken}_{block_number}".lower()
126
+ total_supply_query_id = f"totalSupply_{ctoken}_{block_number}".lower()
127
+ total_borrow_query_id = f"totalBorrows_{ctoken}_{block_number}".lower()
128
+ supply_rate_query_id = f"supplyRatePerBlock_{ctoken}_{block_number}".lower()
129
+ borrow_rate_query_id = f"borrowRatePerBlock_{ctoken}_{block_number}".lower()
130
+ exchange_rate_query_id = f"exchangeRateCurrent_{ctoken}_{block_number}".lower()
131
+
132
+ reserve_tokens_info.append({
133
+ "token": ctoken,
134
+ "token_decimals": decoded_data.get(ctoken_decimals_query_id),
135
+ "borrow_rate": decoded_data.get(borrow_rate_query_id),
136
+ "supply_rate": decoded_data.get(supply_rate_query_id),
137
+ "supply": decoded_data.get(total_supply_query_id),
138
+ "borrow": decoded_data.get(total_borrow_query_id),
139
+ "exchange_rate": decoded_data.get(exchange_rate_query_id),
140
+ "underlying_decimals": underlying_decimals,
141
+ "underlying": token_address
142
+ })
143
+ return reserve_tokens_info
144
+
145
+ @classmethod
146
+ def _calculate_interest_rates(
147
+ cls, token_info: dict, pool_decimals: int, apx_block_speed_in_seconds: float):
148
+ block_per_day = int(86400 / apx_block_speed_in_seconds)
149
+ exchange_rate = float(token_info["exchange_rate"]) / 10 ** 18
150
+
151
+ total_borrow = float(token_info["borrow"]) / 10 ** int(token_info["underlying_decimals"])
152
+ total_supply = float(token_info["supply"]) * exchange_rate / 10 ** int(token_info["token_decimals"])
153
+
154
+ supply_apy = ((token_info["supply_rate"] / 10 ** pool_decimals) * block_per_day + 1) ** 365 - 1
155
+ borrow_apy = ((token_info["borrow_rate"] / 10 ** pool_decimals) * block_per_day + 1) ** 365 - 1
156
+
157
+ return {
158
+ 'deposit_apy': supply_apy,
159
+ 'borrow_apy': borrow_apy,
160
+ 'total_deposit': total_supply,
161
+ 'total_borrow': total_borrow
162
+ }
163
+
164
+ def get_ctoken_function_info(self, ctoken: str, fn_name: str, fn_paras: list = None, block_number: int = "latest"):
165
+ return self.state_service.get_function_info(
166
+ ctoken, self.vtoken_abi, fn_name, fn_paras, block_number
167
+ )
@@ -2,7 +2,7 @@ from web3 import Web3
2
2
 
3
3
  from defi_services.abis.lending.justlend.just_token_abi import JUST_TOKEN_ABI
4
4
  from defi_services.abis.lending.justlend.justlend_comptroller_abi import JUSTLEND_COMPTROLLER_ABI
5
- from defi_services.abis.token.erc20_abi import ERC20_ABI
5
+ from defi_services.abis.token.trc20_abi import TRC20_ABI
6
6
  from defi_services.constants.chain_constant import Chain
7
7
  from defi_services.constants.entities.lending_constant import Lending
8
8
  from defi_services.constants.token_constant import Token
@@ -74,8 +74,9 @@ class JustLendStateService(CompoundStateService):
74
74
  liquidation_threshold = decoded_data.get(markets)[1] / 10 ** 18
75
75
 
76
76
  if underlying != Token.native_token:
77
- underlying_contract = _w3.eth.contract(address=Web3.to_checksum_address(underlying), abi=ERC20_ABI)
77
+ underlying_contract = _w3.eth.contract(address=Web3.to_checksum_address(underlying), abi=TRC20_ABI)
78
78
  underlying_decimal = underlying_contract.functions.decimals().call()
79
+
79
80
  else:
80
81
  underlying_decimal = Chain.native_decimals.get(self.chain_id, 18)
81
82
  exchange_rate_query_id = f'exchangeRateStored_{token}_{block_number}'
@@ -139,7 +140,7 @@ class JustLendStateService(CompoundStateService):
139
140
  rpc_calls[underlying_balance_key] = self.get_ctoken_function_info(
140
141
  ctoken, "balanceOfUnderlying", [wallet])
141
142
  rpc_calls[underlying_decimals_key] = self.state_service.get_function_info(
142
- underlying, ERC20_ABI, "decimals", []
143
+ underlying, TRC20_ABI, "decimals", []
143
144
  )
144
145
 
145
146
  return rpc_calls
@@ -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
@@ -1,6 +1,6 @@
1
1
  AAVE_V3_ARB = {
2
2
  "address": "0x794a61358d6845594f94dc1db02a252b5b4814ad",
3
- "name": "Radiant Lending Pool",
3
+ "name": "AAVE Lending Pool",
4
4
  "stakedIncentiveAddress": '0x929ec64c34a17401f460460d4b9390518e5b473e',
5
5
  "oracleAddress": "0xb56c2F0B653B2e0b10C9b928C8580Ac5Df02C7C7",
6
6
  "rewardTokensList": [],
@@ -37,23 +37,113 @@ COMPOUND_V3_ARBITRUM = {
37
37
  "assets": {
38
38
  "0x912ce59144191c1204e64559fe8253a0e49e6548": {
39
39
  "priceFeed": "0xb2a824043730fe05f3da2efafa1cbbe83fa548d6",
40
- "loanToValue": 0.55,
41
- "liquidationThreshold": 0.6
40
+ "loanToValue": 0.7,
41
+ "liquidationThreshold": 0.8
42
42
  },
43
43
  "0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a": {
44
44
  "priceFeed": "0xdb98056fecfff59d032ab628337a4887110df3db",
45
- "loanToValue": 0.4,
46
- "liquidationThreshold": 0.45
45
+ "loanToValue": 0.6,
46
+ "liquidationThreshold": 0.75
47
47
  },
48
48
  "0x82af49447d8a07e3bd95bd0d56f35241523fbab1": {
49
49
  "priceFeed": "0x639fe6ab55c921f74e7fac1ee960c0b6293ba612",
50
- "loanToValue": 0.78,
50
+ "loanToValue": 0.83,
51
+ "liquidationThreshold": 0.9
52
+ },
53
+ "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f": {
54
+ "priceFeed": "0xd0c7101eacbb49f3decccc166d238410d6d46d57",
55
+ "loanToValue": 0.75,
56
+ "liquidationThreshold": 0.85
57
+ },
58
+ "0x5979d7b546e38e414f7e9822514be443a4800529": {
59
+ "priceFeed": "0xe165155c34fe4cbfc55fc554437907bdb1af7e3e",
60
+ "loanToValue": 0.8,
61
+ "liquidationThreshold": 0.85
62
+ },
63
+ "0x2416092f143378750bb29b79ed961ab195cceea5": {
64
+ "priceFeed": "0xc49399814452b41da8a7cd76a159f5515cb3e493",
65
+ "loanToValue": 0.8,
66
+ "liquidationThreshold": 0.85
67
+ },
68
+ "0x57f5e098cad7a3d1eed53991d4d66c45c9af7812": {
69
+ "priceFeed": "0x13cdfb7db5e2f58e122b2e789b59de13645349c4",
70
+ "loanToValue": 0.88,
71
+ "liquidationThreshold": 0.9
72
+ }
73
+ }
74
+ },
75
+ "0x82af49447d8a07e3bd95bd0d56f35241523fbab1": {
76
+ "comet": "0x6f7d514bbd4aff3bcd1140b7344b32f063dee486",
77
+ "assets": {
78
+ "0x35751007a407ca6feffe80b3cb397736d2cf4dbe": {
79
+ "priceFeed": "0xd3cf278f135d9831d2bf28f6672a4575906ca724",
80
+ "loanToValue": 0.9,
81
+ "liquidationThreshold": 0.93
82
+ },
83
+ "0xec70dcb4a1efa46b8f2d97c310c9c4790ba5ffa8": {
84
+ "priceFeed": "0x970ffd8e335b8fa4cd5c869c7cac3a90671d5dc3",
85
+ "loanToValue": 0.9,
86
+ "liquidationThreshold": 0.93
87
+ },
88
+ "0x5979d7b546e38e414f7e9822514be443a4800529": {
89
+ "priceFeed": "0x6c987dde50db1dcdd32cd4175778c2a291978e2a",
90
+ "loanToValue": 0.88,
91
+ "liquidationThreshold": 0.93
92
+ },
93
+ "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f": {
94
+ "priceFeed": "0xfa454de61b317b6535a0c462267208e8fdb89f45",
95
+ "loanToValue": 0.8,
96
+ "liquidationThreshold": 0.85
97
+ },
98
+ "0x4186bfc76e2e237523cbc30fd220fe055156b41f": {
99
+ "priceFeed": "0x3870fac3de911c12a57e5a2532d15ad8ca275a60",
100
+ "loanToValue": 0.88,
101
+ "liquidationThreshold": 0.91
102
+ },
103
+ "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9": {
104
+ "priceFeed": "0x84e93ec6170ed630f5ebd89a1aae72d4f63f2713",
105
+ "loanToValue": 0.8,
106
+ "liquidationThreshold": 0.85
107
+ },
108
+ "0xaf88d065e77c8cc2239327c5edb3a432268e5831": {
109
+ "priceFeed": "0x443ea0340cb75a160f31a440722dec7b5bc3c2e9",
110
+ "loanToValue": 0.8,
111
+ "liquidationThreshold": 0.85
112
+ },
113
+ "0x2416092f143378750bb29b79ed961ab195cceea5": {
114
+ "priceFeed": "0x72e9b6f907365d76c6192ad49c0c5ba356b7fa48",
115
+ "loanToValue": 0.88,
116
+ "liquidationThreshold": 0.91
117
+ }
118
+ }
119
+ },
120
+ "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9": {
121
+ "comet": "0xd98be00b5d27fc98112bde293e487f8d4ca57d07",
122
+ "assets": {
123
+ "0x912ce59144191c1204e64559fe8253a0e49e6548": {
124
+ "priceFeed": "0xb2a824043730fe05f3da2efafa1cbbe83fa548d6",
125
+ "loanToValue": 0.7,
126
+ "liquidationThreshold": 0.8
127
+ },
128
+ "0x82af49447d8a07e3bd95bd0d56f35241523fbab1": {
129
+ "priceFeed": "0x639fe6ab55c921f74e7fac1ee960c0b6293ba612",
130
+ "loanToValue": 0.85,
131
+ "liquidationThreshold": 0.9
132
+ },
133
+ "0x5979d7b546e38e414f7e9822514be443a4800529": {
134
+ "priceFeed": "0xe165155c34fe4cbfc55fc554437907bdb1af7e3e",
135
+ "loanToValue": 0.8,
51
136
  "liquidationThreshold": 0.85
52
137
  },
53
138
  "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f": {
54
139
  "priceFeed": "0xd0c7101eacbb49f3decccc166d238410d6d46d57",
55
140
  "loanToValue": 0.7,
56
- "liquidationThreshold": 0.77
141
+ "liquidationThreshold": 0.8
142
+ },
143
+ "0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a": {
144
+ "priceFeed": "0xdb98056fecfff59d032ab628337a4887110df3db",
145
+ "loanToValue": 0.6,
146
+ "liquidationThreshold": 0.7
57
147
  }
58
148
  }
59
149
  }