defi-state-querier 0.0.9__py3-none-any.whl → 0.1.1__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 (42) hide show
  1. defi_services/__init__.py +1 -1
  2. defi_services/abis/lending/apeswape/__init__.py +0 -0
  3. defi_services/abis/lending/apeswape/apeswap_comptroller_abi.py +2235 -0
  4. defi_services/abis/lending/apeswape/apeswap_lens_abi.py +747 -0
  5. defi_services/abis/lending/apeswape/apswap_ctoken_abi.py +1485 -0
  6. defi_services/abis/lending/wepiggy/wepiggy_comptroller_abi.py +1684 -0
  7. defi_services/abis/lending/wepiggy/wepiggy_distribution_abi.py +959 -1041
  8. defi_services/abis/lending/wepiggy/wepiggy_lens_abi.py +1098 -0
  9. defi_services/constants/entities/lending_constant.py +3 -1
  10. defi_services/constants/entities/lending_services.py +28 -13
  11. defi_services/services/lending/apeswap_services.py +88 -0
  12. defi_services/services/lending/compound_service.py +1 -0
  13. defi_services/services/lending/{granary_v1_services.py → granary_services.py} +38 -18
  14. defi_services/services/lending/iron_bank_service.py +5 -1
  15. defi_services/services/lending/lending_info/arbitrum/granary_arbitrum.py +67 -0
  16. defi_services/services/lending/lending_info/arbitrum/wepiggy_arbitrum.py +36 -0
  17. defi_services/services/lending/lending_info/avalanche/granary_avalanche.py +55 -0
  18. defi_services/services/lending/lending_info/avalanche/iron_bank_avalanche.py +55 -0
  19. defi_services/services/lending/lending_info/bsc/apeswap_bsc.py +52 -0
  20. defi_services/services/lending/lending_info/bsc/granary_bsc.py +49 -0
  21. defi_services/services/lending/lending_info/bsc/liqee_bsc.py +85 -0
  22. defi_services/services/lending/lending_info/bsc/wepiggy_bsc.py +76 -0
  23. defi_services/services/lending/lending_info/ethereum/{granary_v1_eth.py → granary_eth.py} +1 -1
  24. defi_services/services/lending/lending_info/ethereum/iron_bank_eth.py +0 -1
  25. defi_services/services/lending/lending_info/ethereum/spark_eth.py +41 -94
  26. defi_services/services/lending/lending_info/ethereum/wepiggy_eth.py +18 -7
  27. defi_services/services/lending/lending_info/fantom/granary_ftm.py +67 -0
  28. defi_services/services/lending/lending_info/optimism/granary_optimism.py +84 -0
  29. defi_services/services/lending/lending_info/optimism/iron_bank_optimism.py +43 -0
  30. defi_services/services/lending/lending_info/optimism/wepiggy_optimism.py +40 -0
  31. defi_services/services/lending/lending_info/polygon/wepiggy_polygon.py +52 -0
  32. defi_services/services/lending/liqee_service.py +5 -3
  33. defi_services/services/lending/morpho_aave_v2_services.py +2 -2
  34. defi_services/services/lending/morpho_aave_v3_services.py +2 -2
  35. defi_services/services/lending/morpho_compound_services.py +1 -1
  36. defi_services/services/lending/spark_services.py +32 -0
  37. defi_services/services/lending/wepiggy_services.py +26 -237
  38. {defi_state_querier-0.0.9.dist-info → defi_state_querier-0.1.1.dist-info}/METADATA +1 -1
  39. {defi_state_querier-0.0.9.dist-info → defi_state_querier-0.1.1.dist-info}/RECORD +42 -21
  40. {defi_state_querier-0.0.9.dist-info → defi_state_querier-0.1.1.dist-info}/LICENSE +0 -0
  41. {defi_state_querier-0.0.9.dist-info → defi_state_querier-0.1.1.dist-info}/WHEEL +0 -0
  42. {defi_state_querier-0.0.9.dist-info → defi_state_querier-0.1.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,52 @@
1
+ WEPIGGY_POLYGON = {
2
+ "name": "Wepiggy Lending Pool",
3
+ "rewardToken": "0x6f620ec89b8479e97a6985792d0c64f237566746",
4
+ "comptrollerAddress": "0xffceacfd39117030314a07b2c86da36e51787948",
5
+ "lensAddress": "0x82413f75f0da101e0fe7f6ff6cba3461f7e04f29",
6
+ "distributionAddress": "0x16b321c99ab31a84d565ea484f035693718c3e71",
7
+ "poolToken": "0x6f620ec89b8479e97a6985792d0c64f237566746",
8
+ "type": "LENDING_POOL",
9
+ "forked": "compound",
10
+ "reservesList": {
11
+ "0x0000000000000000000000000000000000000000": {
12
+ "cToken": "0xc1b02e52e9512519edf99671931772e452fb4399",
13
+ "liquidationThreshold": 0.6
14
+ },
15
+ "0x2791bca1f2de4661ed88a30c99a7a9449aa84174": {
16
+ "cToken": "0x12d803497d1e58dd4d4a4f455d754f1d0f937c8b",
17
+ "liquidationThreshold": 0.9
18
+ },
19
+ "0xc2132d05d31c914a87c6611c10748aeb04b58e8f": {
20
+ "cToken": "0x0c8c1ab017c3c0c8a48dd9f1db2f59022d190f0b",
21
+ "liquidationThreshold": 0.9
22
+ },
23
+ "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063": {
24
+ "cToken": "0x5cfad792c4df1323188180778aec58e00eace32a",
25
+ "liquidationThreshold": 0.9
26
+ },
27
+ "0x7ceb23fd6bc0add59e62ac25578270cff1b9f619": {
28
+ "cToken": "0xf4b6d5d432f1c7a9efc9e0b04acde479f9fd1f72",
29
+ "liquidationThreshold": 0.8
30
+ },
31
+ "0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6": {
32
+ "cToken": "0xf19200b30a0416322d58e6b6b1d6b5f832936729",
33
+ "liquidationThreshold": 0.8
34
+ },
35
+ "0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39": {
36
+ "cToken": "0x3a9cad689a510a7c410ee1be17929cdf78efac8c",
37
+ "liquidationThreshold": 0.6
38
+ },
39
+ "0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a": {
40
+ "cToken": "0x1b1cd0fdb6592fe482026b8e47706eac1ee94a7c",
41
+ "liquidationThreshold": 0.0
42
+ },
43
+ "0x172370d5cd63279efa6d502dab29171933a610af": {
44
+ "cToken": "0xc28e11040c529a6828c20a641f8f75b7c0ea92e3",
45
+ "liquidationThreshold": 0.6
46
+ },
47
+ "0xf28164a485b0b2c90639e47b0f377b4a438a16b1": {
48
+ "cToken": "0xd0199ba93031ba37aa4e17c885a47edeeb23ae04",
49
+ "liquidationThreshold": 0.0
50
+ }
51
+ }
52
+ }
@@ -13,6 +13,7 @@ from defi_services.constants.entities.lending_constant import Lending
13
13
  from defi_services.constants.query_constant import Query
14
14
  from defi_services.constants.token_constant import Token
15
15
  from defi_services.jobs.queriers.state_querier import StateQuerier
16
+ from defi_services.services.lending.lending_info.bsc.liqee_bsc import LIQEE_BSC
16
17
  from defi_services.services.lending.lending_info.ethereum.liqee_eth import LIQEE_ETH
17
18
  from defi_services.services.protocol_services import ProtocolServices
18
19
 
@@ -21,7 +22,8 @@ logger = logging.getLogger("Liqee Lending Pool State Service")
21
22
 
22
23
  class LiqeeInfo:
23
24
  mapping = {
24
- Chain.ethereum: LIQEE_ETH
25
+ Chain.ethereum: LIQEE_ETH,
26
+ Chain.bsc: LIQEE_BSC
25
27
  }
26
28
 
27
29
 
@@ -145,11 +147,11 @@ class LiqeeStateService(ProtocolServices):
145
147
  ):
146
148
  fn_paras = [Web3.toChecksumAddress(wallet_address)]
147
149
  rpc_call = self.get_lending_function_info("getAccountRewardAmount", fn_paras, block_number)
148
- get_reward_id = f"getAccountRewardAmount_{wallet_address}_{block_number}".lower()
150
+ get_reward_id = f"getAccountRewardAmount_{self.name}_{wallet_address}_{block_number}".lower()
149
151
  return {get_reward_id: rpc_call}
150
152
 
151
153
  def calculate_rewards_balance(self, wallet_address: str, decoded_data: dict, block_number: int = "latest"):
152
- get_reward_id = f"getAccountRewardAmount_{wallet_address}_{block_number}".lower()
154
+ get_reward_id = f"getAccountRewardAmount_{self.name}_{wallet_address}_{block_number}".lower()
153
155
  rewards = decoded_data.get(get_reward_id) / 10 ** 18
154
156
  reward_token = self.pool_info.get("rewardToken")
155
157
  result = {
@@ -13,7 +13,7 @@ from defi_services.constants.entities.lending_constant import Lending
13
13
  from defi_services.jobs.queriers.state_querier import StateQuerier
14
14
  from defi_services.services.lending.lending_info.aave_v2_services import AaveInfo
15
15
  from defi_services.services.lending.lending_info.ethereum.morpho_aave_v2_eth import MORPHO_AAVE_V2_ETH
16
- from defi_services.services.lending.morpho_compound_services import MorphoCompoundServices
16
+ from defi_services.services.lending.morpho_compound_services import MorphoCompoundStateService
17
17
 
18
18
  logger = logging.getLogger("Compound Lending Pool State Service")
19
19
 
@@ -24,7 +24,7 @@ class MorphoAaveV2Info:
24
24
  }
25
25
 
26
26
 
27
- class MorphoAaveV2Services(MorphoCompoundServices):
27
+ class MorphoAaveV2StateService(MorphoCompoundStateService):
28
28
  def __init__(self, state_service: StateQuerier, chain_id: str = "0x1"):
29
29
  super().__init__(state_service, chain_id)
30
30
  self.name = f"{chain_id}_{Lending.morpho_aave_v2}"
@@ -14,7 +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.aave_v3_services import AaveV3Info
16
16
  from defi_services.services.lending.lending_info.ethereum.morpho_aave_v3_eth import MORPHO_AAVE_V3_ETH
17
- from defi_services.services.lending.morpho_compound_services import MorphoCompoundServices
17
+ from defi_services.services.lending.morpho_compound_services import MorphoCompoundStateService
18
18
 
19
19
  logger = logging.getLogger("Compound Lending Pool State Service")
20
20
 
@@ -25,7 +25,7 @@ class MorphoAaveV3Info:
25
25
  }
26
26
 
27
27
 
28
- class MorphoAaveV3Services(MorphoCompoundServices):
28
+ class MorphoAaveV3StateService(MorphoCompoundStateService):
29
29
  def __init__(self, state_service: StateQuerier, chain_id: str = "0x1"):
30
30
  super().__init__(state_service, chain_id)
31
31
  self.name = f"{chain_id}_{Lending.morpho_aave_v3}"
@@ -26,7 +26,7 @@ class MorphoCompoundInfo:
26
26
  }
27
27
 
28
28
 
29
- class MorphoCompoundServices(ProtocolServices):
29
+ class MorphoCompoundStateService(ProtocolServices):
30
30
  def __init__(self, state_service: StateQuerier, chain_id: str = "0x1"):
31
31
  self.name = f"{chain_id}_{Lending.morpho_compound}"
32
32
  self.chain_id = chain_id
@@ -0,0 +1,32 @@
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.ethereum.spark_eth import SPARK_ETH
8
+
9
+ logger = logging.getLogger("Spark Lending Pool State Service")
10
+
11
+
12
+ class SparkInfo:
13
+ mapping = {
14
+ Chain.ethereum: SPARK_ETH
15
+ }
16
+
17
+
18
+ class SparkStateService(AaveV3StateService):
19
+ def __init__(self, state_service: StateQuerier, chain_id: str = "0x1"):
20
+ super().__init__(state_service, chain_id)
21
+ self.name = f"{chain_id}_{Lending.spark}"
22
+ self.pool_info = SparkInfo.mapping.get(chain_id)
23
+
24
+ def get_service_info(self):
25
+ info = {
26
+ Lending.spark: {
27
+ "chain_id": self.chain_id,
28
+ "type": "lending",
29
+ "protocol_info": self.pool_info
30
+ }
31
+ }
32
+ return info
@@ -3,18 +3,21 @@ import time
3
3
 
4
4
  from web3 import Web3
5
5
 
6
- from defi_services.abis.lending.cream.cream_comptroller_abi import CREAM_COMPTROLLER_ABI
7
- from defi_services.abis.lending.cream.cream_lens_abi import CREAM_LENS_ABI
6
+ from defi_services.abis.lending.wepiggy.wepiggy_comptroller_abi import WEPIGGY_COMPTROLLER_ABI
8
7
  from defi_services.abis.lending.wepiggy.wepiggy_distribution_abi import WEPIGGY_DISTRIBUTION_ABI
8
+ from defi_services.abis.lending.wepiggy.wepiggy_lens_abi import WEPIGGY_LENS_ABI
9
9
  from defi_services.abis.token.ctoken_abi import CTOKEN_ABI
10
10
  from defi_services.abis.token.erc20_abi import ERC20_ABI
11
11
  from defi_services.constants.chain_constant import Chain
12
- from defi_services.constants.db_constant import DBConst
13
12
  from defi_services.constants.entities.lending_constant import Lending
14
13
  from defi_services.constants.query_constant import Query
15
14
  from defi_services.constants.token_constant import ContractAddresses, Token
16
15
  from defi_services.jobs.queriers.state_querier import StateQuerier
16
+ from defi_services.services.lending.lending_info.arbitrum.wepiggy_arbitrum import WEPIGGY_ARB
17
+ from defi_services.services.lending.lending_info.bsc.wepiggy_bsc import WEPIGGY_BSC
17
18
  from defi_services.services.lending.lending_info.ethereum.wepiggy_eth import WEPIGGY_ETH
19
+ from defi_services.services.lending.lending_info.optimism.wepiggy_optimism import WEPIGGY_OPTIMISM
20
+ from defi_services.services.lending.lending_info.polygon.wepiggy_polygon import WEPIGGY_POLYGON
18
21
  from defi_services.services.protocol_services import ProtocolServices
19
22
 
20
23
  logger = logging.getLogger("Compound Lending Pool State Service")
@@ -22,7 +25,11 @@ logger = logging.getLogger("Compound Lending Pool State Service")
22
25
 
23
26
  class WepiggyInfo:
24
27
  mapping = {
25
- Chain.ethereum: WEPIGGY_ETH
28
+ Chain.ethereum: WEPIGGY_ETH,
29
+ Chain.bsc: WEPIGGY_BSC,
30
+ Chain.arbitrum: WEPIGGY_ARB,
31
+ Chain.polygon: WEPIGGY_POLYGON,
32
+ Chain.optimism: WEPIGGY_OPTIMISM
26
33
  }
27
34
 
28
35
 
@@ -32,9 +39,9 @@ class WepiggyStateService(ProtocolServices):
32
39
  self.chain_id = chain_id
33
40
  self.pool_info = WepiggyInfo.mapping.get(chain_id)
34
41
  self.state_service = state_service
35
- self.lens_abi = CREAM_LENS_ABI
42
+ self.lens_abi = WEPIGGY_LENS_ABI
36
43
  self.distribution_abi = WEPIGGY_DISTRIBUTION_ABI
37
- self.comptroller_abi = CREAM_COMPTROLLER_ABI
44
+ self.comptroller_abi = WEPIGGY_COMPTROLLER_ABI
38
45
 
39
46
  def get_service_info(self):
40
47
  info = {
@@ -63,10 +70,10 @@ class WepiggyStateService(ProtocolServices):
63
70
  address=Web3.toChecksumAddress(self.pool_info.get("lensAddress")), abi=self.lens_abi
64
71
  )
65
72
  tokens = [Web3.toChecksumAddress(i) for i in ctokens]
66
- metadata = lens_contract.functions.cTokenMetadataAll(tokens).call(block_identifier=block_number)
73
+ metadata = lens_contract.functions.pTokenMetadataAll(tokens).call(block_identifier=block_number)
67
74
  reserves_info = {}
68
75
  for data in metadata:
69
- underlying = data[11].lower()
76
+ underlying = data[2].lower()
70
77
  ctoken = data[0].lower()
71
78
  lt = data[10] / 10 ** 18
72
79
  reserves_info[underlying] = {
@@ -98,12 +105,10 @@ class WepiggyStateService(ProtocolServices):
98
105
  begin = time.time()
99
106
  reserves_info = kwargs.get("reserves_info", self.pool_info.get("reservesList"))
100
107
  token_prices = kwargs.get("token_prices", {})
101
- wrapped_native_token_price = token_prices.get(Token.wrapped_token.get(self.chain_id), 1)
102
- pool_decimals = kwargs.get("pool_decimals", 18)
103
108
  result = {}
104
109
  if Query.deposit_borrow in query_types and wallet:
105
110
  result.update(self.calculate_wallet_deposit_borrow_balance(
106
- wallet, reserves_info, decoded_data, token_prices, wrapped_native_token_price, block_number
111
+ wallet, reserves_info, decoded_data, token_prices, block_number
107
112
  ))
108
113
 
109
114
  if Query.protocol_reward in query_types and wallet:
@@ -111,10 +116,6 @@ class WepiggyStateService(ProtocolServices):
111
116
  wallet, decoded_data, block_number
112
117
  ))
113
118
 
114
- if Query.protocol_apy in query_types and wallet:
115
- result.update(self.calculate_apy_lending_pool_function_call(
116
- reserves_info, decoded_data, token_prices, pool_decimals, block_number
117
- ))
118
119
  logger.info(f"Process protocol data in {time.time() - begin}")
119
120
  return result
120
121
 
@@ -127,199 +128,32 @@ class WepiggyStateService(ProtocolServices):
127
128
  ):
128
129
  begin = time.time()
129
130
  reserves_info = kwargs.get("reserves_info", {})
130
- is_oracle_price = kwargs.get("is_oracle_price", False) # get price by oracle
131
131
  if not reserves_info:
132
132
  reserves_info = self.pool_info['reservesList']
133
133
  rpc_calls = {}
134
134
  if Query.deposit_borrow in query_types and wallet:
135
135
  rpc_calls.update(self.get_wallet_deposit_borrow_balance_function_info(
136
- wallet, reserves_info, block_number, is_oracle_price
136
+ wallet, reserves_info, block_number
137
137
  ))
138
138
 
139
- if Query.protocol_apy in query_types:
140
- rpc_calls.update(self.get_apy_lending_pool_function_info(reserves_info, block_number, is_oracle_price))
141
-
142
139
  if Query.protocol_reward in query_types and wallet:
143
140
  rpc_calls.update(self.get_rewards_balance_function_info(wallet, block_number))
144
141
 
145
142
  logger.info(f"Get encoded rpc calls in {time.time() - begin}s")
146
143
  return rpc_calls
147
144
 
148
- # CALCULATE APY LENDING POOL
149
- def get_apy_lending_pool_function_info(
150
- self,
151
- reserves_info: dict,
152
- block_number: int = "latest",
153
- is_price_oracle: bool = False
154
- ):
155
- rpc_calls = {}
156
- for token, value in reserves_info.items():
157
- ctoken = value.get("ctoken")
158
- speed_key = f"compSpeeds_{ctoken}_{block_number}".lower()
159
- mint_key = f"mintGuardianPaused_{ctoken}_{block_number}".lower()
160
- borrow_key = f"borrowGuardianPaused_{token}_{block_number}".lower()
161
- metadata_key = f"cTokenMetadata_{ctoken}_{block_number}".lower()
162
- if is_price_oracle:
163
- price_key = f"cTokenUnderlyingPrice_{ctoken}_{block_number}".lower()
164
- rpc_calls[price_key] = self.get_comptroller_function_info('cTokenUnderlyingPrice', [ctoken],
165
- block_number)
166
- rpc_calls[speed_key] = self.get_comptroller_function_info('compSpeeds', [ctoken], block_number)
167
- rpc_calls[mint_key] = self.get_comptroller_function_info('mintGuardianPaused', [ctoken], block_number)
168
- rpc_calls[borrow_key] = self.get_comptroller_function_info('borrowGuardianPaused', [ctoken], block_number)
169
- rpc_calls[metadata_key] = self.get_comptroller_function_info('cTokenMetadata', [ctoken], block_number)
170
-
171
- return rpc_calls
172
-
173
- @staticmethod
174
- def get_apy_lending_pool(
175
- decoded_data: dict,
176
- reserves_info: dict,
177
- block_number: int = "latest",
178
- wrapped_native_token_price: float = 310,
179
- underlying_price: dict = None,
180
- is_oracle_price: bool = False
181
- ):
182
- underlying_prices, underlying_decimals, reserve_tokens_info = {}, {}, []
183
- ctoken_speeds, borrow_paused_tokens, mint_paused_tokens = {}, {}, {}
184
- for token, value in reserves_info.items():
185
- ctoken = value.get('cToken')
186
- speeds_call_id = f'compSpeeds_{ctoken}_{block_number}'.lower()
187
- borrow_guardian_paused_call_id = f'borrowGuardianPaused_{ctoken}_{block_number}'.lower()
188
- mint_guardian_paused_call_id = f'mintGuardianPaused_{ctoken}_{block_number}'.lower()
189
- ctoken_speeds[ctoken] = decoded_data.get(speeds_call_id)
190
- borrow_paused_tokens[ctoken] = decoded_data.get(borrow_guardian_paused_call_id)
191
- mint_paused_tokens[ctoken] = decoded_data.get(mint_guardian_paused_call_id)
192
- metadata_id = f"cTokenMetadata_{ctoken}_{block_number}".lower()
193
- reserve_tokens_info.append(decoded_data.get(metadata_id))
194
- if is_oracle_price:
195
- underlying_id = f"cTokenUnderlyingPrice_{ctoken}_{block_number}".lower()
196
- price_token = decoded_data.get(underlying_id)
197
- price_token = price_token[1] * wrapped_native_token_price
198
- else:
199
- price_token = underlying_price.get(token)
200
-
201
- underlying_decimals[ctoken] = decoded_data.get(metadata_id)[-1]
202
- underlying_prices[ctoken] = price_token
203
- return {
204
- "reserve_tokens_info": reserve_tokens_info,
205
- "ctoken_speeds": ctoken_speeds,
206
- "borrow_paused_tokens": borrow_paused_tokens,
207
- "mint_paused_tokens": mint_paused_tokens,
208
- "underlying_prices": underlying_prices,
209
- "underlying_decimals": underlying_decimals
210
- }
211
-
212
- def calculate_apy_lending_pool_function_call(
213
- self,
214
- reserves_info: dict,
215
- decoded_data: dict,
216
- token_prices: dict,
217
- pool_decimals: int = 18,
218
- block_number: int = "latest",
219
- is_oracle_price: bool = False,
220
- ):
221
- wrapped_native_token_price = token_prices.get(Token.wrapped_token.get(self.chain_id))
222
- pool_token_price = token_prices.get(self.pool_info.get("poolToken"))
223
- tokens_interest_rates = dict()
224
- decode_data = self.get_apy_lending_pool(
225
- decoded_data, reserves_info, block_number,
226
- wrapped_native_token_price, token_prices, is_oracle_price)
227
-
228
- mint_paused_tokens = decode_data["mint_paused_tokens"]
229
- borrow_paused_tokens = decode_data["borrow_paused_tokens"]
230
- reserve_tokens_info = decode_data["reserve_tokens_info"]
231
- ctoken_speeds = decode_data["ctoken_speeds"]
232
- for data in reserve_tokens_info:
233
- address = data[0].lower()
234
- underlying_token_price = float(decode_data["underlying_prices"][address])
235
- if is_oracle_price:
236
- underlying_token_price = underlying_token_price / 10 ** int(data[13])
237
-
238
- token_info = {
239
- "token": address,
240
- "token_decimals": data[12],
241
- "borrow_rate": data[3],
242
- "supply_rate": data[2],
243
- "supply": data[7],
244
- "borrow": data[5],
245
- "exchange_rate": data[1],
246
- "underlying": data[11].lower(),
247
- "underlying_price": underlying_token_price,
248
- "underlying_decimals": data[13],
249
- "speed": ctoken_speeds[address]
250
- }
251
- underlying_token = token_info['underlying']
252
- token_info["mint_paused"] = mint_paused_tokens[address]
253
- token_info["borrow_paused"] = borrow_paused_tokens[address]
254
- tokens_interest_rates[underlying_token] = self._calculate_interest_rates(
255
- token_info, pool_decimals, pool_token_price)
256
-
257
- return tokens_interest_rates
258
-
259
- @staticmethod
260
- def _calculate_interest_rates(token_info: dict, pool_decimals: int, pool_price: float,
261
- is_oracle_price: bool = False):
262
- apx_block_speed_in_seconds = 3
263
- exchange_rate = float(token_info["exchange_rate"]) / 10 ** (18 - 8 + token_info["underlying_decimals"])
264
- block_per_day = int(60 * 60 * 24 / apx_block_speed_in_seconds)
265
- venus_per_day = token_info["speed"] * block_per_day / 10 ** pool_decimals
266
- underlying_price = float(token_info["underlying_price"])
267
- if is_oracle_price:
268
- underlying_price /= 10 ** (36 - int(token_info["underlying_decimals"]))
269
- total_borrow = float(token_info["borrow"]) / 10 ** int(token_info["underlying_decimals"])
270
- total_supply = float(token_info["supply"]) * exchange_rate / 10 ** int(token_info["underlying_decimals"])
271
- total_borrow_usd = total_borrow * underlying_price
272
- total_supply_usd = total_supply * underlying_price
273
-
274
- if total_borrow_usd == 0:
275
- borrow_apr = 0
276
- else:
277
- borrow_apr = (1 + (pool_price * venus_per_day / total_borrow_usd)) ** 365 - 1
278
-
279
- if total_supply_usd == 0:
280
- supply_apr = 0
281
- else:
282
- supply_apr = (1 + (pool_price * venus_per_day / total_supply_usd)) ** 365 - 1
283
-
284
- supply_apy = ((token_info["supply_rate"] / 10 ** pool_decimals) * block_per_day + 1) ** 365 - 1
285
- borrow_apy = ((token_info["borrow_rate"] / 10 ** pool_decimals) * block_per_day + 1) ** 365 - 1
286
-
287
- liquidity_log = {
288
- DBConst.total_borrow: {
289
- DBConst.amount: total_borrow,
290
- DBConst.value_in_usd: total_borrow_usd
291
- },
292
- DBConst.total_deposit: {
293
- DBConst.amount: total_supply,
294
- DBConst.value_in_usd: total_supply_usd
295
- }
296
- }
297
- return {
298
- DBConst.reward_borrow_apy: borrow_apr,
299
- DBConst.reward_deposit_apy: supply_apr,
300
- DBConst.deposit_apy: supply_apy,
301
- DBConst.borrow_apy: borrow_apy,
302
- DBConst.liquidity_change_logs: liquidity_log,
303
- DBConst.mint_paused: token_info[DBConst.mint_paused],
304
- DBConst.borrow_paused: token_info[DBConst.borrow_paused]
305
- }
306
-
307
145
  # REWARDS BALANCE
308
146
  def get_rewards_balance_function_info(
309
147
  self,
310
148
  wallet_address: str,
311
149
  block_number: int = "latest",
312
150
  ):
313
- token = self.pool_info.get("poolToken")
314
- fn_paras = [Web3.toChecksumAddress(wallet_address),
315
- False,
316
- True]
317
- rpc_call = self.get_distribution_function_info("pendingWpcAccrued", fn_paras, block_number)
318
- get_reward_id = f"pendingWpcAccrued_{self.name}_{wallet_address}_{block_number}".lower()
151
+ rpc_call = self.get_distribution_function_info("wpcAccrued", [wallet_address], block_number)
152
+ get_reward_id = f"wpcAccrued_{self.name}_{wallet_address}_{block_number}".lower()
319
153
  return {get_reward_id: rpc_call}
320
154
 
321
155
  def calculate_rewards_balance(self, wallet_address: str, decoded_data: dict, block_number: int = "latest"):
322
- get_reward_id = f"pendingWpcAccrued_{self.name}_{wallet_address}_{block_number}".lower()
156
+ get_reward_id = f"wpcAccrued_{self.name}_{wallet_address}_{block_number}".lower()
323
157
  rewards = decoded_data.get(get_reward_id) / 10 ** 18
324
158
  reward_token = self.pool_info.get("rewardToken")
325
159
  result = {
@@ -332,8 +166,7 @@ class WepiggyStateService(ProtocolServices):
332
166
  self,
333
167
  wallet_address: str,
334
168
  reserves_info: dict,
335
- block_number: int = "latest",
336
- is_oracle_price: bool = False
169
+ block_number: int = "latest"
337
170
  ):
338
171
 
339
172
  rpc_calls = {}
@@ -342,13 +175,9 @@ class WepiggyStateService(ProtocolServices):
342
175
  ctoken = value.get('cToken')
343
176
  if token == Token.native_token:
344
177
  underlying = Token.wrapped_token.get(self.chain_id)
345
- underlying_price_key = f"cTokenUnderlyingPrice_{ctoken}_{block_number}".lower()
346
178
  underlying_borrow_key = f"borrowBalanceCurrent_{ctoken}_{wallet_address}_{block_number}".lower()
347
179
  underlying_balance_key = f"balanceOfUnderlying_{ctoken}_{wallet_address}_{block_number}".lower()
348
180
  underlying_decimals_key = f"decimals_{underlying}_{block_number}".lower()
349
- if is_oracle_price:
350
- rpc_calls[underlying_price_key] = self.get_lens_function_info(
351
- "cTokenUnderlyingPrice", [ctoken], block_number)
352
181
  rpc_calls[underlying_borrow_key] = self.get_ctoken_function_info(
353
182
  ctoken, "borrowBalanceCurrent", [wallet_address], block_number)
354
183
  rpc_calls[underlying_balance_key] = self.get_ctoken_function_info(
@@ -361,7 +190,7 @@ class WepiggyStateService(ProtocolServices):
361
190
 
362
191
  def calculate_wallet_deposit_borrow_balance(
363
192
  self, wallet_address: str, reserves_info: dict, decoded_data: dict, token_prices: dict = None,
364
- wrapped_native_token_price: int = 310, block_number: int = "latest", is_oracle_price: bool = False):
193
+ block_number: int = "latest"):
365
194
  if token_prices is None:
366
195
  token_prices = {}
367
196
  result = {}
@@ -380,11 +209,7 @@ class WepiggyStateService(ProtocolServices):
380
209
  "borrow_amount": borrow_amount,
381
210
  "deposit_amount": deposit_amount,
382
211
  }
383
- if is_oracle_price:
384
- get_underlying_token_price = f"cTokenUnderlyingPrice_{ctoken}_{block_number}".lower()
385
- token_price = decoded_data.get(get_underlying_token_price)[
386
- 1] * wrapped_native_token_price / 10 ** decimals
387
- elif token_prices:
212
+ if token_prices:
388
213
  token_price = token_prices.get(underlying)
389
214
  else:
390
215
  token_price = None
@@ -399,8 +224,7 @@ class WepiggyStateService(ProtocolServices):
399
224
  def get_token_deposit_borrow_balance_function_info(
400
225
  self,
401
226
  reserves_info: dict,
402
- block_number: int = "latest",
403
- is_oracle_price: bool = False
227
+ block_number: int = "latest"
404
228
  ):
405
229
  rpc_calls = {}
406
230
  for token, value in reserves_info.items():
@@ -408,15 +232,11 @@ class WepiggyStateService(ProtocolServices):
408
232
  if token == Token.native_token:
409
233
  underlying = Token.wrapped_token.get(self.chain_id)
410
234
  ctoken = value.get('cToken')
411
- underlying_price_key = f"cTokenUnderlyingPrice_{ctoken}_{block_number}".lower()
412
235
  underlying_borrow_key = f"totalBorrows_{ctoken}_{block_number}".lower()
413
236
  underlying_balance_key = f"totalSupply_{ctoken}_{block_number}".lower()
414
237
  underlying_decimals_key = f"decimals_{underlying}_{block_number}".lower()
415
238
  ctoken_decimals_key = f"decimals_{ctoken}_{block_number}".lower()
416
239
  exchange_rate_key = f"exchangeRateCurrent_{ctoken}_{block_number}".lower()
417
- if is_oracle_price:
418
- rpc_calls[underlying_price_key] = self.get_lens_function_info(
419
- "cTokenUnderlyingPrice", [ctoken], block_number)
420
240
  rpc_calls[underlying_borrow_key] = self.get_ctoken_function_info(
421
241
  ctoken, "totalBorrows", [], block_number)
422
242
  rpc_calls[underlying_balance_key] = self.get_ctoken_function_info(
@@ -434,7 +254,7 @@ class WepiggyStateService(ProtocolServices):
434
254
 
435
255
  def calculate_token_deposit_borrow_balance(
436
256
  self, decoded_data: dict, reserves_info: dict, token_prices: dict = None,
437
- block_number: int = "latest", is_oracle_price: bool = False, wrapped_native_token_price: int = 310
257
+ block_number: int = "latest"
438
258
  ):
439
259
  result = {}
440
260
  for token, value in reserves_info.items():
@@ -456,12 +276,7 @@ class WepiggyStateService(ProtocolServices):
456
276
  "borrow_amount": borrow_amount,
457
277
  "deposit_amount": deposit_amount
458
278
  }
459
- if is_oracle_price:
460
- get_underlying_token_price = f"cTokenUnderlyingPrice_{ctoken}_{block_number}".lower()
461
- token_price = decoded_data.get(get_underlying_token_price)[1] / 10 ** (36 - decimals)
462
- if wrapped_native_token_price:
463
- token_price *= wrapped_native_token_price
464
- elif token_prices:
279
+ if token_prices:
465
280
  token_price = token_prices.get(underlying)
466
281
  else:
467
282
  token_price = None
@@ -491,29 +306,3 @@ class WepiggyStateService(ProtocolServices):
491
306
  return self.state_service.get_function_info(
492
307
  ctoken, CTOKEN_ABI, fn_name, fn_paras, block_number
493
308
  )
494
-
495
- def get_ctoken_metadata_all(
496
- self,
497
- reserves_info: dict = None,
498
- block_number: int = "latest"
499
- ):
500
- tokens = [Web3.toChecksumAddress(value['cToken']) for key, value in reserves_info.items()]
501
- key = f"cTokenMetadataAll_{self.pool_info.get('lensAddress')}_{block_number}".lower()
502
- return {
503
- key: self.get_lens_function_info("cTokenMetadataAll", tokens, block_number)
504
- }
505
-
506
- def ctoken_underlying_price_all(
507
- self, reserves_info, block_number: int = 'latest'):
508
- tokens = [Web3.toChecksumAddress(value['cToken']) for key, value in reserves_info.items()]
509
- key = f"cTokenUnderlyingPriceAll_{self.pool_info.get('lensAddress')}_{block_number}".lower()
510
- return {
511
- key: self.get_lens_function_info("cTokenUnderlyingPriceAll", tokens, block_number)
512
- }
513
-
514
- def get_all_markets(
515
- self, block_number: int = 'latest'):
516
- key = f"getAllMarkets_{self.pool_info.get('comptrollerAddress')}_{block_number}".lower()
517
- return {
518
- key: self.get_comptroller_function_info("getAllMarkets", [], block_number)
519
- }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: defi-state-querier
3
- Version: 0.0.9
3
+ Version: 0.1.1
4
4
  Summary: Calculate apy, apr, and wallet information,... in decentralized applications.
5
5
  Home-page: https://github.com/Centic-io/defi-state-querier
6
6
  Author: Viet-Bang Pham