defi-state-querier 0.5.28__py3-none-any.whl → 0.5.29__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 (84) 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/moonwell/__init__.py +0 -0
  5. defi_services/abis/lending/moonwell/moonwell_comptroller_abi.py +1500 -0
  6. defi_services/abis/lending/moonwell/moonwell_ctoken_abi.py +1431 -0
  7. defi_services/abis/lending/radiant_v2/radiant_reward_converter.py +817 -0
  8. defi_services/abis/token/trc20_abi.py +304 -0
  9. defi_services/abis/vault/tcv_abi.py +1523 -0
  10. defi_services/constants/chain_constant.py +8 -1
  11. defi_services/constants/entities/dex_info_constant.py +2 -2
  12. defi_services/constants/entities/dex_services.py +13 -1
  13. defi_services/constants/entities/lending_constant.py +11 -5
  14. defi_services/constants/entities/lending_services.py +31 -4
  15. defi_services/constants/entities/vault_constant.py +2 -2
  16. defi_services/constants/entities/vault_services.py +7 -1
  17. defi_services/constants/network_constants.py +20 -361
  18. defi_services/constants/token_constant.py +3 -1
  19. defi_services/jobs/processors/cosmos_state_processor.py +3 -2
  20. defi_services/jobs/processors/ton_state_processor.py +5 -4
  21. defi_services/jobs/queriers/call_state_querier.py +2 -0
  22. defi_services/jobs/queriers/state_querier.py +3 -0
  23. defi_services/jobs/tcv.py +144 -0
  24. defi_services/services/dex/dex_info/uniswap_info.py +29 -1
  25. defi_services/services/dex/uniswap_v3_service.py +6 -2
  26. defi_services/services/lending/aave_v2_services.py +44 -29
  27. defi_services/services/lending/aave_v3_services.py +41 -20
  28. defi_services/services/lending/compound_v3_services.py +9 -5
  29. defi_services/services/lending/granary_services.py +6 -4
  30. defi_services/services/lending/ionic_service.py +167 -0
  31. defi_services/services/lending/justlend_service.py +4 -3
  32. defi_services/services/lending/lending_info/arbitrum/aave_v3_arbitrum.py +1 -1
  33. defi_services/services/lending/lending_info/arbitrum/compound_v3_arbitrum.py +96 -6
  34. defi_services/services/lending/lending_info/arbitrum/venus_arbitrum.py +10 -0
  35. defi_services/services/lending/lending_info/base/__init__.py +0 -0
  36. defi_services/services/lending/lending_info/base/aave_v3_base.py +61 -0
  37. defi_services/services/lending/lending_info/base/compound_v3_base.py +116 -0
  38. defi_services/services/lending/lending_info/base/granary_base.py +62 -0
  39. defi_services/services/lending/lending_info/base/ionic_base.py +173 -0
  40. defi_services/services/lending/lending_info/base/moonwell_base.py +89 -0
  41. defi_services/services/lending/lending_info/base/radiant_v2_base.py +57 -0
  42. defi_services/services/lending/lending_info/base/sonne_base.py +53 -0
  43. defi_services/services/lending/lending_info/base/zerolend_base.py +109 -0
  44. defi_services/services/lending/lending_info/bsc/aave_v3_bsc.py +68 -0
  45. defi_services/services/lending/lending_info/bsc/apeswap_bsc.py +1 -1
  46. defi_services/services/lending/lending_info/ethereum/aave_v3_eth.py +1 -140
  47. defi_services/services/lending/lending_info/ethereum/compound_v3_eth.py +180 -5
  48. defi_services/services/lending/lending_info/ethereum/old_aave_v3_eth.py +150 -0
  49. defi_services/services/lending/lending_info/ethereum/radiant_eth.py +69 -0
  50. defi_services/services/lending/lending_info/ethereum/venus_eth.py +10 -0
  51. defi_services/services/lending/lending_info/ethereum/zerolend_eth.py +96 -0
  52. defi_services/services/lending/lending_info/optimism/compound_v3_optimism.py +116 -0
  53. defi_services/services/lending/lending_info/optimism/moonwell_optimism.py +9 -0
  54. defi_services/services/lending/lending_info/polygon/compound_v3_polygon.py +35 -5
  55. defi_services/services/lending/lending_info/zksync/__init__.py +0 -0
  56. defi_services/services/lending/lending_info/zksync/aave_v3_zksync.py +47 -0
  57. defi_services/services/lending/lending_info/zksync/venus_zksync.py +10 -0
  58. defi_services/services/lending/lending_info/zksync/zerolend_zksync.py +138 -0
  59. defi_services/services/lending/moonwell_service.py +120 -0
  60. defi_services/services/lending/morpho_aave_v2_services.py +3 -3
  61. defi_services/services/lending/morpho_aave_v3_services.py +2 -2
  62. defi_services/services/lending/radiant_v2_services.py +52 -10
  63. defi_services/services/lending/sonne_service.py +64 -0
  64. defi_services/services/lending/trava_services.py +2 -2
  65. defi_services/services/lending/uwu_services.py +3 -3
  66. defi_services/services/lending/valas_services.py +2 -2
  67. defi_services/services/lending/venus_services.py +9 -3
  68. defi_services/services/lending/zerolend_services.py +36 -0
  69. defi_services/services/multicall/multicall_v2.py +0 -317
  70. defi_services/services/vault/tcv_vault_services.py +108 -0
  71. defi_services/services/vault/vault_info/arbitrum/__init__.py +0 -0
  72. defi_services/services/vault/vault_info/arbitrum/tcv_arb.py +58 -0
  73. {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.29.dist-info}/METADATA +1 -1
  74. {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.29.dist-info}/RECORD +84 -47
  75. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/__init__.py +0 -0
  76. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/aave_v2_event_abi.py +0 -0
  77. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/aave_v2_incentives_abi.py +0 -0
  78. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/lending_pool_abi.py +0 -0
  79. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/oracle_abi.py +0 -0
  80. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/staked_incentives_abi.py +0 -0
  81. /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/uwu_incentives_abi.py +0 -0
  82. {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.29.dist-info}/WHEEL +0 -0
  83. {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.29.dist-info}/licenses/LICENSE +0 -0
  84. {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.29.dist-info}/top_level.txt +0 -0
@@ -26,6 +26,9 @@ class StateQuerier:
26
26
  def get_client_querier(self):
27
27
  return self.client_querier
28
28
 
29
+ def get_provider(self):
30
+ return self.provider_uri
31
+
29
32
  @staticmethod
30
33
  def get_function_info(address: str, abi: list, fn_name: str, fn_paras: list = None, block_number: int = 'latest'):
31
34
  if fn_paras is None:
@@ -0,0 +1,144 @@
1
+ from collections import defaultdict
2
+
3
+ from defi_services.constants.entities.dex_constant import Dex
4
+ from defi_services.constants.query_constant import Query
5
+ from defi_services.jobs.processors.state_processor import StateProcessor
6
+
7
+
8
+ class TCV:
9
+ def __init__(self, provider_uri, chain_id):
10
+ self.state_processor = StateProcessor(provider_uri, chain_id)
11
+
12
+ def get_tvl_info(
13
+ self,
14
+ address,
15
+ reserves_info,
16
+ block_number: int = "latest",
17
+ ):
18
+ lp_token_dict = {information["pool"]: information["poolInfo"] for information in reserves_info.values()}
19
+ tcv_liquidity_user, dex_lp_info = self.get_tcv_liquidity_user_and_lp_token_info(
20
+ wallet=address,
21
+ dex_protocol=Dex.uniswap_v3, lp_token_list=lp_token_dict,
22
+ block_number=block_number
23
+ )
24
+
25
+ tcv_nfts = {}
26
+ for vault_address, liquidity_info in tcv_liquidity_user.items():
27
+ # For optimize
28
+ liquidity_user = liquidity_info.get('liquidity_user')
29
+ if not liquidity_user:
30
+ liquidity_info.update({'tvl': {}})
31
+ continue
32
+
33
+ vault_nft = self.get_user_nft(vault_address, Dex.uniswap_v3, block_number=block_number)
34
+ tcv_nfts.update(vault_nft)
35
+
36
+ nfts_info = self.get_nfts_info(address, Dex.uniswap_v3, tcv_nfts, block_number=block_number)
37
+ user_balance = self.get_user_token_balance(address, Dex.uniswap_v3, nfts_info, dex_lp_info, block_number=block_number)
38
+
39
+ for token_id, info in user_balance.items():
40
+ pool_address = info['pool_address']
41
+ addresses = [vault_address_ for vault_address_, info in reserves_info.items() if info['pool'] == pool_address]
42
+ vault_address = addresses[0] if addresses else None
43
+
44
+ if (not vault_address) or (vault_address not in tcv_liquidity_user):
45
+ continue
46
+
47
+ if tcv_liquidity_user[vault_address].get('tvl') is None:
48
+ tcv_liquidity_user[vault_address]['tvl'] = defaultdict(lambda: 0)
49
+
50
+ tcv_liquidity_user[vault_address]['tvl'][info['token0']] += info['token0_amount']
51
+ tcv_liquidity_user[vault_address]['tvl'][info['token1']] += info['token1_amount']
52
+
53
+ return tcv_liquidity_user
54
+
55
+ def get_user_nft(self, wallet, dex_protocol, block_number: int = 'latest'):
56
+ queries = [
57
+ {
58
+ 'query_id': f'{dex_protocol}_{Query.dex_user_nft}',
59
+ "entity_id": dex_protocol,
60
+ 'query_type': Query.dex_user_nft
61
+ }
62
+ ]
63
+
64
+ res = self.state_processor.run(
65
+ wallet, queries, block_number=block_number,
66
+ batch_size=100, max_workers=8, ignore_error=True
67
+ )
68
+ user_nfts = res[0][Query.dex_user_nft]
69
+ return user_nfts
70
+
71
+ def get_nfts_info(self, wallet, dex_protocol, user_nfts, block_number: int = 'latest'):
72
+ queries = [
73
+ {
74
+ 'query_id': f'{dex_protocol}_{Query.dex_user_info}',
75
+ "entity_id": dex_protocol,
76
+ 'query_type': Query.dex_user_info,
77
+ 'supplied_data': {
78
+ 'user_data': user_nfts,
79
+ }
80
+ }
81
+ ]
82
+
83
+ res = self.state_processor.run(
84
+ wallet, queries, block_number=block_number,
85
+ batch_size=100, max_workers=8, ignore_error=True
86
+ )
87
+ nfts_info = res[0][Query.dex_user_info]
88
+ return nfts_info
89
+
90
+ def get_user_token_balance(self, wallet, dex_protocol, nfts_info, lp_token_info, block_number: int = 'latest'):
91
+ queries = [
92
+ {
93
+ 'query_id': f'{dex_protocol}_{Query.dex_user_token_balance}',
94
+ "entity_id": dex_protocol,
95
+ 'query_type': Query.dex_user_token_balance,
96
+ 'supplied_data': {
97
+ 'user_data': nfts_info,
98
+ 'lp_token_info': lp_token_info
99
+ }
100
+ }
101
+ ]
102
+
103
+ res = self.state_processor.run(
104
+ wallet, queries, block_number=block_number,
105
+ batch_size=100, max_workers=8, ignore_error=True
106
+ )
107
+ user_balance = res[0][Query.dex_user_token_balance]
108
+ return user_balance
109
+
110
+ def get_tcv_liquidity_user_and_lp_token_info(self, wallet, dex_protocol, lp_token_list, block_number: int = 'latest'):
111
+ queries = [
112
+ {
113
+ "query_id": f"tcv-vault_{Query.staking_reward}",
114
+ "entity_id": "tcv-vault",
115
+ "query_type": Query.staking_reward
116
+ },
117
+ {
118
+ 'query_id': f'{dex_protocol}_{Query.lp_token_info}',
119
+ "entity_id": dex_protocol,
120
+ 'query_type': Query.lp_token_info,
121
+ 'supplied_data': {
122
+ 'lp_token_info': lp_token_list
123
+ }
124
+ },
125
+ # {
126
+ # 'query_id': f'{dex_protocol}_{Query.token_pair_balance}',
127
+ # "entity_id": dex_protocol,
128
+ # 'query_type': Query.token_pair_balance,
129
+ # 'supplied_data': {
130
+ # 'lp_token_info': lp_token_list
131
+ # }
132
+ # }
133
+ ]
134
+ res = self.state_processor.run(
135
+ address=wallet, queries=queries,
136
+ block_number=block_number,
137
+ batch_size=100, max_workers=8,
138
+ ignore_error=True
139
+ )
140
+ data = {r['query_id']: r for r in res}
141
+
142
+ tcv_liquidity_user = data.get(f'tcv-vault_{Query.staking_reward}', {}).get(Query.staking_reward)
143
+ lp_token_info = data.get(f'{dex_protocol}_{Query.lp_token_info}', {}).get(Query.lp_token_info)
144
+ return tcv_liquidity_user, lp_token_info
@@ -7,7 +7,6 @@ UNISWAP_ETH_INFO = {
7
7
  'factory_address': '0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f',
8
8
  'factory_abi': UNISWAP_FACTORY_ABI,
9
9
  'forked': 'uniswap-v2'
10
-
11
10
  }
12
11
 
13
12
  UNISWAP_V3_ETH_INFO = {
@@ -18,5 +17,34 @@ UNISWAP_V3_ETH_INFO = {
18
17
  'NFT_manager_abi': UNISWAP_V3_NFT_TOKEN_MANGAGER_ABI,
19
18
  'pool_abi': UNISWAP_V3_POOL_ABI,
20
19
  'forked': 'uniswap-v3'
20
+ }
21
+
22
+ UNISWAP_V3_ARBITRUM_INFO = {
23
+ 'factory_address': '0x1f98431c8ad98523631ae4a59f267346ea31f984',
24
+ 'factory_abi': UNISWAP_V3_FACTORY_ABI,
25
+ 'staker_address': '0xe34139463ba50bd61336e0c446bd8c0867c6fe65',
26
+ 'NFT_manager_address': '0xc36442b4a4522e871399cd717abdd847ab11fe88',
27
+ 'NFT_manager_abi': UNISWAP_V3_NFT_TOKEN_MANGAGER_ABI,
28
+ 'pool_abi': UNISWAP_V3_POOL_ABI,
29
+ 'forked': 'uniswap-v3'
30
+ }
31
+
32
+ UNISWAP_V3_BASE_INFO = {
33
+ 'factory_address': '0x33128a8fC17869897dcE68Ed026d694621f6FDfD',
34
+ 'factory_abi': UNISWAP_V3_FACTORY_ABI,
35
+ 'staker_address': '0x42bE4D6527829FeFA1493e1fb9F3676d2425C3C1',
36
+ 'NFT_manager_address': '0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1',
37
+ 'NFT_manager_abi': UNISWAP_V3_NFT_TOKEN_MANGAGER_ABI,
38
+ 'pool_abi': UNISWAP_V3_POOL_ABI,
39
+ 'forked': 'uniswap-v3'
40
+ }
21
41
 
42
+ UNISWAP_V3_ZKSYNC_INFO = {
43
+ 'factory_address': '0x8FdA5a7a8dCA67BBcDd10F02Fa0649A937215422',
44
+ 'factory_abi': UNISWAP_V3_FACTORY_ABI,
45
+ 'staker_address': '0xf84268FA8EB857c2e4298720C1C617178F5e78e1',
46
+ 'NFT_manager_address': '0x0616e5762c1E7Dc3723c50663dF10a162D690a86',
47
+ 'NFT_manager_abi': UNISWAP_V3_NFT_TOKEN_MANGAGER_ABI,
48
+ 'pool_abi': UNISWAP_V3_POOL_ABI,
49
+ 'forked': 'uniswap-v3'
22
50
  }
@@ -5,7 +5,8 @@ from defi_services.abis.token.erc20_abi import ERC20_ABI
5
5
  from defi_services.constants.chain_constant import Chain
6
6
  from defi_services.constants.entities.dex_constant import Dex
7
7
  from defi_services.jobs.queriers.state_querier import StateQuerier
8
- from defi_services.services.dex.dex_info.uniswap_info import UNISWAP_V3_ETH_INFO
8
+ from defi_services.services.dex.dex_info.uniswap_info import UNISWAP_V3_ETH_INFO, UNISWAP_V3_ARBITRUM_INFO, \
9
+ UNISWAP_V3_ZKSYNC_INFO, UNISWAP_V3_BASE_INFO
9
10
  from defi_services.services.dex_protocol_services import DexProtocolServices
10
11
  from defi_services.utils.get_fees import get_fees
11
12
  from defi_services.utils.sqrt_price_math import get_token_amount_of_user, get_token_amount_of_pool
@@ -15,7 +16,10 @@ logger = logging.getLogger("UniSwap V3 State Service")
15
16
 
16
17
  class UniswapV3Info:
17
18
  mapping = {
18
- Chain.ethereum: UNISWAP_V3_ETH_INFO
19
+ Chain.ethereum: UNISWAP_V3_ETH_INFO,
20
+ Chain.arbitrum: UNISWAP_V3_ARBITRUM_INFO,
21
+ Chain.zksync: UNISWAP_V3_ZKSYNC_INFO,
22
+ Chain.base: UNISWAP_V3_BASE_INFO
19
23
  }
20
24
 
21
25
 
@@ -3,13 +3,14 @@ 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.token.erc20_abi import ERC20_ABI
10
10
  from defi_services.constants.chain_constant import Chain
11
11
  from defi_services.constants.db_constant import DBConst
12
12
  from defi_services.constants.entities.lending_constant import Lending
13
+ from defi_services.constants.network_constants import NATIVE_TOKEN
13
14
  from defi_services.constants.time_constant import TimeConstants
14
15
  from defi_services.jobs.queriers.state_querier import StateQuerier
15
16
  from defi_services.services.lending.lending_info.avalanche.aave_v2_avalanche import AAVE_V2_AVALANCHE
@@ -83,19 +84,20 @@ class AaveV2StateService(ProtocolServices):
83
84
  reserve_key = f"getReserveData_{self.name}_{token_address}_{block_number}".lower()
84
85
  atoken_total_supply_key = f'totalSupply_{value["tToken"]}_{block_number}'.lower()
85
86
  debt_token_total_supply_key = f'totalSupply_{value["dToken"]}_{block_number}'.lower()
86
- sdebt_token_total_supply_key = f'totalSupply_{value["sdToken"]}_{block_number}'.lower()
87
87
  decimals_key = f"decimals_{token_address}_{block_number}".lower()
88
-
89
88
  rpc_calls[reserve_key] = self.get_function_lending_pool_info("getReserveData", [token_address])
90
89
  rpc_calls[atoken_total_supply_key] = self.state_service.get_function_info(
91
90
  value["tToken"], ERC20_ABI, "totalSupply", block_number=block_number)
92
91
  rpc_calls[debt_token_total_supply_key] = self.state_service.get_function_info(
93
92
  value["dToken"], ERC20_ABI, "totalSupply", block_number=block_number)
94
- rpc_calls[sdebt_token_total_supply_key] = self.state_service.get_function_info(
95
- value["sdToken"], ERC20_ABI, "totalSupply", block_number=block_number)
96
93
  rpc_calls[decimals_key] = self.state_service.get_function_info(
97
94
  token_address, ERC20_ABI, "decimals", block_number=block_number)
98
95
 
96
+ if value["sdToken"] != NATIVE_TOKEN:
97
+ sdebt_token_total_supply_key = f'totalSupply_{value["sdToken"]}_{block_number}'.lower()
98
+ rpc_calls[sdebt_token_total_supply_key] = self.state_service.get_function_info(
99
+ value["sdToken"], ERC20_ABI, "totalSupply", block_number=block_number)
100
+
99
101
  return rpc_calls
100
102
 
101
103
  @staticmethod
@@ -173,18 +175,23 @@ class AaveV2StateService(ProtocolServices):
173
175
  decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
174
176
  atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
175
177
  debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
176
- sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
177
-
178
- reserve_tokens_info.append({
178
+ data = {
179
179
  'underlying': token_address,
180
180
  'underlying_decimals': decoded_data.get(decimals_call_id),
181
181
  'a_token_supply': decoded_data.get(atoken_total_supply_key),
182
182
  'd_token_supply': decoded_data.get(debt_token_total_supply_key),
183
- 'sd_token_supply': decoded_data.get(sdebt_token_total_supply_key),
184
183
  'supply_apy': reserve_data[3],
185
- 'borrow_apy': reserve_data[4],
186
- 'stable_borrow_apy': reserve_data[5]
187
- })
184
+ 'borrow_apy': reserve_data[4]
185
+ }
186
+ if sdebt_token != NATIVE_TOKEN:
187
+ sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
188
+ data['sd_token_supply'] = decoded_data.get(sdebt_token_total_supply_key)
189
+ data['stable_borrow_apy'] = reserve_data[5]
190
+ else:
191
+ data['sd_token_supply'] = 0
192
+ data['stable_borrow_apy'] = 0
193
+
194
+ reserve_tokens_info.append(data)
188
195
 
189
196
  return reserve_tokens_info
190
197
 
@@ -208,19 +215,19 @@ class AaveV2StateService(ProtocolServices):
208
215
 
209
216
  @classmethod
210
217
  def _calculate_interest_rates(cls, token_info: dict):
211
- total_supply_t = token_info.get('a_token_supply')
212
- total_supply_d = token_info.get('d_token_supply')
213
- total_supply_sd = token_info.get('sd_token_supply')
218
+ total_supply_t = token_info.get('a_token_supply', 0)
219
+ total_supply_d = token_info.get('d_token_supply', 0)
220
+ total_supply_sd = token_info.get('sd_token_supply', 0)
214
221
  total_borrow = total_supply_d + total_supply_sd
215
222
 
216
223
  total_supply = total_supply_t / 10 ** token_info['underlying_decimals']
217
224
  total_borrow = total_borrow / 10 ** token_info['underlying_decimals']
218
225
 
219
- supply_apr = float(token_info['supply_apy']) / 10 ** 27
226
+ supply_apr = float(token_info.get('supply_apy', 0)) / 10 ** 27
220
227
  supply_apy = apr_to_apy(supply_apr)
221
- borrow_apr = float(token_info['borrow_apy']) / 10 ** 27
228
+ borrow_apr = float(token_info.get('borrow_apy', 0)) / 10 ** 27
222
229
  borrow_apy = apr_to_apy(borrow_apr)
223
- stable_borrow_apr = float(token_info['stable_borrow_apy']) / 10 ** 27
230
+ stable_borrow_apr = float(token_info.get('stable_borrow_apy', 0)) / 10 ** 27
224
231
  stable_borrow_apy = apr_to_apy(stable_borrow_apr)
225
232
 
226
233
  return {
@@ -260,21 +267,23 @@ class AaveV2StateService(ProtocolServices):
260
267
  decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
261
268
  atoken_assets_key = f"assets_{atoken}_{block_number}".lower()
262
269
  debt_token_assets_key = f"assets_{debt_token}_{block_number}".lower()
263
- sdebt_token_assets_key = f"assets_{sdebt_token}_{block_number}".lower()
264
270
  atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
265
271
  debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
266
- sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
267
-
268
272
  atokens[lower_address] = atoken
269
273
  debt_tokens[lower_address] = debt_token
270
274
  sdebt_tokens[lower_address] = sdebt_token
271
275
  decimals[lower_address] = decoded_data.get(decimals_call_id)
272
276
  asset_data_tokens[atoken] = decoded_data.get(atoken_assets_key)
273
277
  asset_data_tokens[debt_token] = decoded_data.get(debt_token_assets_key)
274
- asset_data_tokens[sdebt_token] = decoded_data.get(sdebt_token_assets_key)
275
278
  total_supply_tokens[atoken] = decoded_data.get(atoken_total_supply_key)
276
279
  total_supply_tokens[debt_token] = decoded_data.get(debt_token_total_supply_key)
277
- total_supply_tokens[sdebt_token] = decoded_data.get(sdebt_token_total_supply_key)
280
+ if sdebt_token != NATIVE_TOKEN:
281
+ sdebt_token_assets_key = f"assets_{sdebt_token}_{block_number}".lower()
282
+ sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
283
+ asset_data_tokens[sdebt_token] = decoded_data.get(sdebt_token_assets_key)
284
+ total_supply_tokens[sdebt_token] = decoded_data.get(sdebt_token_total_supply_key)
285
+ interest_rate[lower_address]['stable_borrow_apy'] = float(reserve_data[5]) / 10 ** 27
286
+
278
287
 
279
288
  asset_price_key = f"getAssetsPrices_{self.name}_{block_number}".lower()
280
289
  if not token_prices and asset_price_key in decoded_data:
@@ -303,17 +312,19 @@ class AaveV2StateService(ProtocolServices):
303
312
  value = reserves_info[token]
304
313
  atoken_balance_of_key = f'balanceOf_{value["tToken"]}_{wallet}_{block_number}'.lower()
305
314
  debt_token_balance_of_key = f'balanceOf_{value["dToken"]}_{wallet}_{block_number}'.lower()
306
- sdebt_token_balance_of_key = f'balanceOf_{value["sdToken"]}_{wallet}_{block_number}'.lower()
307
315
  decimals_key = f"decimals_{token}_{block_number}".lower()
308
316
 
309
317
  rpc_calls[atoken_balance_of_key] = self.state_service.get_function_info(
310
318
  value["tToken"], ERC20_ABI, "balanceOf", [wallet], block_number=block_number)
311
319
  rpc_calls[debt_token_balance_of_key] = self.state_service.get_function_info(
312
320
  value["dToken"], ERC20_ABI, "balanceOf", [wallet], block_number=block_number)
313
- rpc_calls[sdebt_token_balance_of_key] = self.state_service.get_function_info(
314
- value["sdToken"], ERC20_ABI, "balanceOf", [wallet], block_number=block_number)
315
321
  rpc_calls[decimals_key] = self.state_service.get_function_info(
316
322
  token, ERC20_ABI, "decimals", block_number=block_number)
323
+ if value["sdToken"] != NATIVE_TOKEN:
324
+ sdebt_token_balance_of_key = f'balanceOf_{value["sdToken"]}_{wallet}_{block_number}'.lower()
325
+ rpc_calls[sdebt_token_balance_of_key] = self.state_service.get_function_info(
326
+ value["sdToken"], ERC20_ABI, "balanceOf", [wallet], block_number=block_number)
327
+
317
328
  if health_factor:
318
329
  rpc_calls.update(self.get_health_factor_function_info(wallet, reserves_info, block_number))
319
330
 
@@ -375,8 +386,12 @@ class AaveV2StateService(ProtocolServices):
375
386
  get_decimals_id = f"decimals_{token}_{block_number}".lower()
376
387
  deposit_amount[token] = decoded_data.get(get_total_deposit_id)
377
388
  borrow_amount[token] = decoded_data.get(get_total_borrow_id)
378
- stable_borrow_amount[token] = decoded_data.get(get_total_stable_borrow_id)
379
389
  decimals[token] = decoded_data.get(get_decimals_id)
390
+ if value['sdToken'] != NATIVE_TOKEN:
391
+ stable_borrow_amount[token] = decoded_data.get(get_total_stable_borrow_id)
392
+ else:
393
+ stable_borrow_amount[token] = 0
394
+
380
395
  data = self.get_wallet_deposit_borrow_balance(
381
396
  reserves_info, token_prices, decimals, deposit_amount,
382
397
  borrow_amount, stable_borrow_amount
@@ -10,15 +10,19 @@ 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.db_constant import DBConst
12
12
  from defi_services.constants.entities.lending_constant import Lending
13
+ from defi_services.constants.network_constants import NATIVE_TOKEN
13
14
  from defi_services.constants.time_constant import TimeConstants
14
15
  from defi_services.jobs.queriers.state_querier import StateQuerier
15
16
  from defi_services.services.lending.aave_v2_services import AaveV2StateService
16
17
  from defi_services.services.lending.lending_info.arbitrum.aave_v3_arbitrum import AAVE_V3_ARB
17
18
  from defi_services.services.lending.lending_info.avalanche.aave_v3_avalanche import AAVE_V3_AVALANCHE
18
- from defi_services.services.lending.lending_info.ethereum.aave_v3_eth import AAVE_V3_ETH
19
+ from defi_services.services.lending.lending_info.base.aave_v3_base import AAVE_V3_BASE
20
+ from defi_services.services.lending.lending_info.bsc.aave_v3_bsc import AAVE_V3_BSC
21
+ from defi_services.services.lending.lending_info.ethereum.old_aave_v3_eth import AAVE_V3_ETH
19
22
  from defi_services.services.lending.lending_info.fantom.aave_v3_ftm import AAVE_V3_FTM
20
23
  from defi_services.services.lending.lending_info.optimism.aave_v3_optimism import AAVE_V3_OPTIMISM
21
24
  from defi_services.services.lending.lending_info.polygon.aave_v3_polygon import AAVE_V3_POLYGON
25
+ from defi_services.services.lending.lending_info.zksync.aave_v3_zksync import AAVE_V3_ZKSYNC
22
26
 
23
27
  logger = logging.getLogger("Aave V3 Lending Pool State Service")
24
28
 
@@ -30,7 +34,10 @@ class AaveV3Info:
30
34
  Chain.avalanche: AAVE_V3_AVALANCHE,
31
35
  Chain.fantom: AAVE_V3_FTM,
32
36
  Chain.optimism: AAVE_V3_OPTIMISM,
33
- Chain.arbitrum: AAVE_V3_ARB
37
+ Chain.arbitrum: AAVE_V3_ARB,
38
+ Chain.base: AAVE_V3_BASE,
39
+ Chain.zksync: AAVE_V3_ZKSYNC,
40
+ Chain.bsc: AAVE_V3_BSC
34
41
  }
35
42
 
36
43
 
@@ -88,25 +95,33 @@ class AaveV3StateService(AaveV2StateService):
88
95
  for token_address, reserve_info in reserves_info.items():
89
96
  get_reserve_data_call_id = f'getReserveData_{self.name}_{token_address}_{block_number}'.lower()
90
97
  reserve_data = decoded_data.get(get_reserve_data_call_id)
91
-
92
98
  atoken = reserve_data[8].lower()
93
- sdebt_token = reserve_data[9].lower()
94
99
  debt_token = reserve_data[10].lower()
95
100
  decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
96
101
  atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
97
102
  debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
98
- sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
103
+ sdebt_token = reserve_data[9].lower()
99
104
 
100
- reserve_tokens_info.append({
105
+
106
+ data = {
101
107
  'underlying': token_address,
102
108
  'underlying_decimals': decoded_data.get(decimals_call_id),
103
109
  'a_token_supply': decoded_data.get(atoken_total_supply_key),
104
110
  'd_token_supply': decoded_data.get(debt_token_total_supply_key),
105
- 'sd_token_supply': decoded_data.get(sdebt_token_total_supply_key),
111
+
106
112
  'supply_apy': reserve_data[2],
107
113
  'borrow_apy': reserve_data[4],
108
- 'stable_borrow_apy': reserve_data[5]
109
- })
114
+
115
+ }
116
+ if sdebt_token != NATIVE_TOKEN:
117
+ sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
118
+ data['sd_token_supply'] = decoded_data.get(sdebt_token_total_supply_key)
119
+ data['stable_borrow_apy'] = reserve_data[5]
120
+ else:
121
+ data['sd_token_supply'] = 0
122
+ data['stable_borrow_apy'] = 0
123
+
124
+ reserve_tokens_info.append(data)
110
125
 
111
126
  return reserve_tokens_info
112
127
 
@@ -121,17 +136,17 @@ class AaveV3StateService(AaveV2StateService):
121
136
  reserve_key = f"getReserveData_{self.name}_{token_address}_{block_number}".lower()
122
137
  atoken_total_supply_key = f'totalSupply_{value["tToken"]}_{block_number}'.lower()
123
138
  debt_token_total_supply_key = f'totalSupply_{value["dToken"]}_{block_number}'.lower()
124
- sdebt_token_total_supply_key = f'totalSupply_{value["sdToken"]}_{block_number}'.lower()
125
139
  decimals_key = f"decimals_{token_address}_{block_number}".lower()
126
140
  for reward_token in reward_tokens:
127
141
  atoken_assets_key = f"getRewardsData_{value['tToken']}_{reward_token}_{block_number}".lower()
128
142
  debt_token_assets_key = f"getRewardsData_{value['dToken']}_{reward_token}_{block_number}".lower()
129
- sdebt_token_assets_key = f"getRewardsData_{value['sdToken']}_{reward_token}_{block_number}".lower()
130
143
  rpc_calls[atoken_assets_key] = self.get_function_incentive_info(
131
144
  "getRewardsData", [value['tToken'], reward_token], block_number)
132
145
  rpc_calls[debt_token_assets_key] = self.get_function_incentive_info(
133
146
  "getRewardsData", [value['dToken'], reward_token], block_number)
134
- rpc_calls[sdebt_token_assets_key] = self.get_function_incentive_info(
147
+ if value['sdToken'] != NATIVE_TOKEN:
148
+ sdebt_token_assets_key = f"getRewardsData_{value['sdToken']}_{reward_token}_{block_number}".lower()
149
+ rpc_calls[sdebt_token_assets_key] = self.get_function_incentive_info(
135
150
  "getRewardsData", [value['sdToken'], reward_token], block_number)
136
151
 
137
152
  rpc_calls[reserve_key] = self.get_function_lending_pool_info("getReserveData", [token_address])
@@ -139,11 +154,14 @@ class AaveV3StateService(AaveV2StateService):
139
154
  value["tToken"], ERC20_ABI, "totalSupply", block_number=block_number)
140
155
  rpc_calls[debt_token_total_supply_key] = self.state_service.get_function_info(
141
156
  value["dToken"], ERC20_ABI, "totalSupply", block_number=block_number)
142
- rpc_calls[sdebt_token_total_supply_key] = self.state_service.get_function_info(
143
- value["sdToken"], ERC20_ABI, "totalSupply", block_number=block_number)
144
157
  rpc_calls[decimals_key] = self.state_service.get_function_info(
145
158
  token_address, ERC20_ABI, "decimals", block_number=block_number)
146
159
 
160
+ if value['sdToken'] != NATIVE_TOKEN:
161
+ sdebt_token_total_supply_key = f'totalSupply_{value["sdToken"]}_{block_number}'.lower()
162
+ rpc_calls[sdebt_token_total_supply_key] = self.state_service.get_function_info(
163
+ value["sdToken"], ERC20_ABI, "totalSupply", block_number=block_number)
164
+
147
165
  return rpc_calls
148
166
 
149
167
  def get_apy_lending_pool_deprecated(
@@ -240,29 +258,32 @@ class AaveV3StateService(AaveV2StateService):
240
258
  sdebt_token = reserve_data[8].lower()
241
259
  debt_token = reserve_data[9].lower()
242
260
  decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
243
-
244
261
  atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
245
262
  debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
246
- sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
247
263
  asset_data_tokens[atoken] = {}
248
264
  asset_data_tokens[debt_token] = {}
249
- asset_data_tokens[sdebt_token] = {}
265
+ if sdebt_token != NATIVE_TOKEN:
266
+ asset_data_tokens[sdebt_token] = {}
267
+
250
268
  total_supply_tokens[atoken] = {}
251
269
  for reward_token in reward_tokens:
252
270
  atoken_assets_key = f"getRewardsData_{atoken}_{reward_token}_{block_number}".lower()
253
271
  debt_token_assets_key = f"getRewardsData_{debt_token}_{reward_token}_{block_number}".lower()
254
- sdebt_token_assets_key = f"getRewardsData_{sdebt_tokens}_{reward_token}_{block_number}".lower()
255
272
  asset_data_tokens[atoken][reward_token] = decoded_data.get(atoken_assets_key)
256
273
  asset_data_tokens[debt_token][reward_token] = decoded_data.get(debt_token_assets_key)
257
- asset_data_tokens[sdebt_token][reward_token] = decoded_data.get(sdebt_token_assets_key)
258
274
  total_supply_tokens[atoken][reward_token] = decoded_data.get(atoken_total_supply_key)
275
+ if sdebt_token != NATIVE_TOKEN:
276
+ sdebt_token_assets_key = f"getRewardsData_{sdebt_tokens}_{reward_token}_{block_number}".lower()
277
+ asset_data_tokens[sdebt_token][reward_token] = decoded_data.get(sdebt_token_assets_key)
259
278
 
260
279
  atokens[lower_address] = atoken
261
280
  debt_tokens[lower_address] = debt_token
262
281
  sdebt_tokens[lower_address] = sdebt_token
263
282
  decimals[lower_address] = decoded_data.get(decimals_call_id)
264
283
  total_supply_tokens[debt_token] = decoded_data.get(debt_token_total_supply_key)
265
- total_supply_tokens[sdebt_token] = decoded_data.get(sdebt_token_total_supply_key)
284
+ if sdebt_token != NATIVE_TOKEN:
285
+ sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
286
+ total_supply_tokens[sdebt_token] = decoded_data.get(sdebt_token_total_supply_key)
266
287
 
267
288
  asset_price_key = f"getAssetsPrices_{self.name}_{block_number}".lower()
268
289
  if not token_prices and asset_price_key in decoded_data:
@@ -9,7 +9,9 @@ from defi_services.constants.token_constant import Token
9
9
  from defi_services.jobs.queriers.state_querier import StateQuerier
10
10
  from defi_services.services.lending.compound_service import CompoundStateService
11
11
  from defi_services.services.lending.lending_info.arbitrum.compound_v3_arbitrum import COMPOUND_V3_ARBITRUM
12
+ from defi_services.services.lending.lending_info.base.compound_v3_base import COMPOUND_V3_BASE
12
13
  from defi_services.services.lending.lending_info.ethereum.compound_v3_eth import COMPOUND_V3_ETH
14
+ from defi_services.services.lending.lending_info.optimism.compound_v3_optimism import COMPOUND_V3_OPTIMISM
13
15
  from defi_services.services.lending.lending_info.polygon.compound_v3_polygon import COMPOUND_V3_POLYGON
14
16
 
15
17
 
@@ -17,7 +19,9 @@ class CompoundV3Info:
17
19
  mapping = {
18
20
  Chain.ethereum: COMPOUND_V3_ETH,
19
21
  Chain.polygon: COMPOUND_V3_POLYGON,
20
- Chain.arbitrum: COMPOUND_V3_ARBITRUM
22
+ Chain.arbitrum: COMPOUND_V3_ARBITRUM,
23
+ Chain.base: COMPOUND_V3_BASE,
24
+ Chain.optimism: COMPOUND_V3_OPTIMISM
21
25
  }
22
26
 
23
27
 
@@ -25,7 +29,7 @@ class CompoundV3StateService(CompoundStateService):
25
29
  def __init__(self, state_service: StateQuerier, chain_id: str = "0x1"):
26
30
  super().__init__(state_service, chain_id)
27
31
  self.name = f"{chain_id}_{Lending.compound_v3}"
28
- self.pool_info = CompoundV3Info.mapping.get(chain_id)
32
+ self.pool_info = CompoundV3Info.mapping.get(chain_id, {})
29
33
  self.comet_abi = COMET_ABI
30
34
  self.comet_ext = COMET_EXT_ABI
31
35
  self.reward_abi = REWARD_ABI
@@ -47,7 +51,7 @@ class CompoundV3StateService(CompoundStateService):
47
51
  ):
48
52
  result = {}
49
53
  w3 = self.state_service.get_w3()
50
- pools = [value.get('comet') for key, value in self.pool_info.get('reservesList').items()]
54
+ pools = [value.get('comet') for key, value in self.pool_info.get('reservesList', {}).items()]
51
55
  if comets:
52
56
  pools += comets
53
57
  for pool in pools:
@@ -185,7 +189,7 @@ class CompoundV3StateService(CompoundStateService):
185
189
 
186
190
  assets = {
187
191
  underlying_token: {
188
- 'deposit_apy': 0,
192
+ 'deposit_apy': asset_info['deposit_apy'],
189
193
  'borrow_apy': asset_info['borrow_apy'],
190
194
  'total_deposit': 0,
191
195
  'total_borrow': asset_info['total_borrow'],
@@ -203,7 +207,7 @@ class CompoundV3StateService(CompoundStateService):
203
207
  'is_base': False
204
208
  }
205
209
  assets[collateral_address]['total_deposit'] += total_supply
206
- assets[collateral_address]['deposit_apy'] = asset_info['deposit_apy']
210
+ # assets[collateral_address]['deposit_apy'] = asset_info['deposit_apy']
207
211
 
208
212
  comet = token_info['token']
209
213
  data[comet] = assets
@@ -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