defi-state-querier 0.0.7__py3-none-any.whl → 0.0.9__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. defi_services/__init__.py +1 -1
  2. defi_services/abis/lending/morpho/__init__.py +0 -0
  3. defi_services/abis/lending/morpho/morpho_aave_v2_comptroller_abi.py +2301 -0
  4. defi_services/abis/lending/morpho/morpho_aave_v2_lens_abi.py +1208 -0
  5. defi_services/abis/lending/morpho/morpho_aave_v3_comptroller_abi.py +2994 -0
  6. defi_services/abis/lending/morpho/morpho_compound_comptroller_abi.py +2301 -0
  7. defi_services/abis/lending/morpho/morpho_compound_lens_abi.py +1402 -0
  8. defi_services/abis/lending/morpho/morpho_compound_reward_manager_abi.py +307 -0
  9. defi_services/constants/entities/lending_constant.py +6 -1
  10. defi_services/constants/entities/lending_services.py +7 -1
  11. defi_services/constants/query_constant.py +1 -0
  12. defi_services/jobs/processors/substrate_state_processor.py +97 -0
  13. defi_services/jobs/queriers/substrate_state_querier.py +84 -0
  14. defi_services/services/lending/aave_v3_services.py +4 -2
  15. defi_services/services/lending/compound_service.py +20 -2
  16. defi_services/services/lending/flux_services.py +30 -22
  17. defi_services/services/lending/iron_bank_service.py +19 -10
  18. defi_services/services/lending/lending_info/aave_v2_services.py +1 -1
  19. defi_services/services/lending/lending_info/ethereum/morpho_aave_v2_eth.py +53 -0
  20. defi_services/services/lending/lending_info/ethereum/morpho_aave_v3_eth.py +51 -0
  21. defi_services/services/lending/lending_info/ethereum/morpho_compound_eth.py +44 -0
  22. defi_services/services/lending/morpho_aave_v2_services.py +89 -0
  23. defi_services/services/lending/morpho_aave_v3_services.py +159 -0
  24. defi_services/services/lending/morpho_compound_services.py +233 -0
  25. defi_services/services/lending/onyx_service.py +23 -3
  26. defi_services/services/lending/strike_service.py +22 -3
  27. defi_services/services/lending/venus_services.py +19 -0
  28. defi_services/services/substrate_token_services.py +70 -0
  29. {defi_state_querier-0.0.7.dist-info → defi_state_querier-0.0.9.dist-info}/METADATA +1 -1
  30. {defi_state_querier-0.0.7.dist-info → defi_state_querier-0.0.9.dist-info}/RECORD +33 -17
  31. {defi_state_querier-0.0.7.dist-info → defi_state_querier-0.0.9.dist-info}/LICENSE +0 -0
  32. {defi_state_querier-0.0.7.dist-info → defi_state_querier-0.0.9.dist-info}/WHEEL +0 -0
  33. {defi_state_querier-0.0.7.dist-info → defi_state_querier-0.0.9.dist-info}/top_level.txt +0 -0
@@ -28,7 +28,7 @@ class FluxStateService(ProtocolServices):
28
28
  def __init__(self, state_service: StateQuerier, chain_id: str = "0x1"):
29
29
  self.name = f"{chain_id}_{Lending.flux}"
30
30
  self.chain_id = chain_id
31
- self.flux_info = FluxInfo.mapping.get(chain_id)
31
+ self.pool_info = FluxInfo.mapping.get(chain_id)
32
32
  self.state_service = state_service
33
33
  self.lens_abi = CREAM_LENS_ABI
34
34
  self.comptroller_abi = CREAM_COMPTROLLER_ABI
@@ -39,7 +39,7 @@ class FluxStateService(ProtocolServices):
39
39
  Lending.flux: {
40
40
  "chain_id": self.chain_id,
41
41
  "type": "lending",
42
- "protocol_info": self.flux_info
42
+ "protocol_info": self.pool_info
43
43
  }
44
44
  }
45
45
  return info
@@ -49,7 +49,7 @@ class FluxStateService(ProtocolServices):
49
49
  block_number: int = "latest"):
50
50
  _w3 = self.state_service.get_w3()
51
51
  comptroller_contract = _w3.eth.contract(
52
- address=_w3.toChecksumAddress(self.flux_info.get("comptrollerAddress")), abi=self.comptroller_abi)
52
+ address=_w3.toChecksumAddress(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
53
53
  ctokens = []
54
54
  for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
55
55
  if token in [ContractAddresses.LUNA.lower(), ContractAddresses.UST.lower(), ContractAddresses.LUNA,
@@ -58,7 +58,7 @@ class FluxStateService(ProtocolServices):
58
58
  ctokens.append(token)
59
59
 
60
60
  lens_contract = _w3.eth.contract(
61
- address=Web3.toChecksumAddress(self.flux_info.get("lensAddress")), abi=self.lens_abi
61
+ address=Web3.toChecksumAddress(self.pool_info.get("lensAddress")), abi=self.lens_abi
62
62
  )
63
63
  tokens = [Web3.toChecksumAddress(i) for i in ctokens]
64
64
  metadata = lens_contract.functions.cTokenMetadataAll(tokens).call(block_identifier=block_number)
@@ -75,8 +75,8 @@ class FluxStateService(ProtocolServices):
75
75
 
76
76
  def get_token_list(self):
77
77
  begin = time.time()
78
- tokens = [self.flux_info.get('rewardToken'), self.flux_info.get("poolToken")]
79
- for token in self.flux_info.get("reservesList"):
78
+ tokens = [self.pool_info.get('rewardToken'), self.pool_info.get("poolToken")]
79
+ for token in self.pool_info.get("reservesList"):
80
80
  if token == Token.native_token:
81
81
  tokens.append(Token.wrapped_token.get(self.chain_id))
82
82
  continue
@@ -93,7 +93,7 @@ class FluxStateService(ProtocolServices):
93
93
  **kwargs
94
94
  ):
95
95
  begin = time.time()
96
- reserves_info = kwargs.get("reserves_info", self.flux_info.get("reservesList"))
96
+ reserves_info = kwargs.get("reserves_info", self.pool_info.get("reservesList"))
97
97
  token_prices = kwargs.get("token_prices", {})
98
98
  wrapped_native_token_price = token_prices.get(Token.wrapped_token.get(self.chain_id), 1)
99
99
  pool_decimals = kwargs.get("pool_decimals", 18)
@@ -104,7 +104,7 @@ class FluxStateService(ProtocolServices):
104
104
  ))
105
105
 
106
106
  if Query.protocol_reward in query_types and wallet:
107
- result.update(self.calculate_rewards_balance(
107
+ result.update(self.calculate_claimable_rewards_balance(
108
108
  wallet, decoded_data, block_number
109
109
  ))
110
110
 
@@ -122,7 +122,7 @@ class FluxStateService(ProtocolServices):
122
122
  reserves_info = kwargs.get("reserves_info", {})
123
123
  is_oracle_price = kwargs.get("is_oracle_price", False) # get price by oracle
124
124
  if not reserves_info:
125
- reserves_info = self.flux_info['reservesList']
125
+ reserves_info = self.pool_info['reservesList']
126
126
  rpc_calls = {}
127
127
  if Query.deposit_borrow in query_types and wallet:
128
128
  rpc_calls.update(self.get_wallet_deposit_borrow_balance_function_info(
@@ -130,21 +130,30 @@ class FluxStateService(ProtocolServices):
130
130
  ))
131
131
 
132
132
  if Query.protocol_reward in query_types and wallet:
133
- rpc_calls.update(self.get_rewards_balance_function_info(wallet, block_number))
133
+ rpc_calls.update(self.get_claimable_rewards_balance_function_info(wallet, block_number))
134
134
 
135
135
  logger.info(f"Get encoded rpc calls in {time.time() - begin}s")
136
136
  return rpc_calls
137
137
 
138
138
  # REWARDS BALANCE
139
- def get_rewards_balance_function_info(
139
+ def get_claimable_rewards_balance_function_info(
140
140
  self,
141
141
  wallet_address: str,
142
142
  block_number: int = "latest",
143
143
  ):
144
- return {}
145
-
146
- def calculate_rewards_balance(self, wallet_address: str, decoded_data: dict, block_number: int = "latest"):
147
- return {}
144
+ rpc_call = self.get_comptroller_function_info("compAccrued", [wallet_address], block_number)
145
+ get_reward_id = f"compAccrued_{self.name}_{wallet_address}_{block_number}".lower()
146
+ return {get_reward_id: rpc_call}
147
+
148
+ def calculate_claimable_rewards_balance(self, wallet_address: str, decoded_data: dict,
149
+ block_number: int = "latest"):
150
+ get_reward_id = f"compAccrued_{self.name}_{wallet_address}_{block_number}".lower()
151
+ rewards = decoded_data.get(get_reward_id) / 10 ** 18
152
+ reward_token = self.pool_info.get("rewardToken")
153
+ result = {
154
+ reward_token: {"amount": rewards}
155
+ }
156
+ return result
148
157
 
149
158
  # WALLET DEPOSIT BORROW BALANCE
150
159
  def get_wallet_deposit_borrow_balance_function_info(
@@ -291,15 +300,14 @@ class FluxStateService(ProtocolServices):
291
300
  result[token]['deposit_amount_in_usd'] += deposit_amount_in_usd
292
301
  return result
293
302
 
294
-
295
303
  def get_lens_function_info(self, fn_name: str, fn_paras: list, block_number: int = "latest"):
296
304
  return self.state_service.get_function_info(
297
- self.flux_info['lensAddress'], self.lens_abi, fn_name, fn_paras, block_number
305
+ self.pool_info['lensAddress'], self.lens_abi, fn_name, fn_paras, block_number
298
306
  )
299
307
 
300
308
  def get_comptroller_function_info(self, fn_name: str, fn_paras: list, block_number: int = "latest"):
301
309
  return self.state_service.get_function_info(
302
- self.flux_info['comptrollerAddress'], self.comptroller_abi, fn_name, fn_paras, block_number
310
+ self.pool_info['comptrollerAddress'], self.comptroller_abi, fn_name, fn_paras, block_number
303
311
  )
304
312
 
305
313
  def get_ctoken_function_info(self, ctoken: str, fn_name: str, fn_paras: list, block_number: int = "latest"):
@@ -313,7 +321,7 @@ class FluxStateService(ProtocolServices):
313
321
  block_number: int = "latest"
314
322
  ):
315
323
  tokens = [Web3.toChecksumAddress(value['cToken']) for key, value in reserves_info.items()]
316
- key = f"cTokenMetadataAll_{self.flux_info.get('lensAddress')}_{block_number}".lower()
324
+ key = f"cTokenMetadataAll_{self.pool_info.get('lensAddress')}_{block_number}".lower()
317
325
  return {
318
326
  key: self.get_lens_function_info("cTokenMetadataAll", tokens, block_number)
319
327
  }
@@ -321,14 +329,14 @@ class FluxStateService(ProtocolServices):
321
329
  def ctoken_underlying_price_all(
322
330
  self, reserves_info, block_number: int = 'latest'):
323
331
  tokens = [Web3.toChecksumAddress(value['cToken']) for key, value in reserves_info.items()]
324
- key = f"cTokenUnderlyingPriceAll_{self.flux_info.get('lensAddress')}_{block_number}".lower()
332
+ key = f"cTokenUnderlyingPriceAll_{self.pool_info.get('lensAddress')}_{block_number}".lower()
325
333
  return {
326
334
  key: self.get_lens_function_info("cTokenUnderlyingPriceAll", tokens, block_number)
327
335
  }
328
336
 
329
337
  def get_all_markets(
330
338
  self, block_number: int = 'latest'):
331
- key = f"getAllMarkets_{self.flux_info.get('comptrollerAddress')}_{block_number}".lower()
339
+ key = f"getAllMarkets_{self.pool_info.get('comptrollerAddress')}_{block_number}".lower()
332
340
  return {
333
341
  key: self.get_comptroller_function_info("getAllMarkets", [], block_number)
334
- }
342
+ }
@@ -8,6 +8,7 @@ from defi_services.abis.lending.iron_bank.iron_lens_abi import IRON_LENS_ABI
8
8
  from defi_services.abis.token.ctoken_abi import CTOKEN_ABI
9
9
  from defi_services.abis.token.erc20_abi import ERC20_ABI
10
10
  from defi_services.constants.chain_constant import Chain
11
+ from defi_services.constants.entities.lending_constant import Lending
11
12
  from defi_services.constants.query_constant import Query
12
13
  from defi_services.constants.token_constant import ContractAddresses, Token
13
14
  from defi_services.jobs.queriers.state_querier import StateQuerier
@@ -25,7 +26,7 @@ class IronBankInfo:
25
26
 
26
27
  class IronBankStateService(ProtocolServices):
27
28
  def __init__(self, state_service: StateQuerier, chain_id: str = "0x1"):
28
- self.name = f"{chain_id}_iron-bank"
29
+ self.name = f"{chain_id}_{Lending.iron_bank}"
29
30
  self.chain_id = chain_id
30
31
  self.iron_bank_info = IronBankInfo.mapping.get(chain_id)
31
32
  self.state_service = state_service
@@ -35,7 +36,7 @@ class IronBankStateService(ProtocolServices):
35
36
  # BASIC FUNCTIONS
36
37
  def get_service_info(self):
37
38
  info = {
38
- "iron-bank": {
39
+ Lending.iron_bank: {
39
40
  "chain_id": self.chain_id,
40
41
  "type": "lending",
41
42
  "protocol_info": self.iron_bank_info
@@ -105,7 +106,7 @@ class IronBankStateService(ProtocolServices):
105
106
  ))
106
107
 
107
108
  if Query.protocol_reward in query_types and wallet:
108
- result.update(self.calculate_rewards_balance(
109
+ result.update(self.calculate_claimable_rewards_balance(
109
110
  wallet, decoded_data, block_number
110
111
  ))
111
112
 
@@ -138,22 +139,30 @@ class IronBankStateService(ProtocolServices):
138
139
  # rpc_calls.update(self.get_apy_lending_pool_function_info(reserves_info, block_number, is_oracle_price))
139
140
 
140
141
  if Query.protocol_reward in query_types and wallet:
141
- rpc_calls.update(self.get_rewards_balance_function_info(wallet, reserves_info, block_number))
142
+ rpc_calls.update(self.get_claimable_rewards_balance_function_info(wallet, block_number))
142
143
 
143
144
  logger.info(f"Get encoded rpc calls in {time.time() - begin}s")
144
145
  return rpc_calls
145
146
 
146
147
  # REWARDS BALANCE
147
- def get_rewards_balance_function_info(
148
+ def get_claimable_rewards_balance_function_info(
148
149
  self,
149
150
  wallet_address: str,
150
- reserves_info: dict,
151
151
  block_number: int = "latest",
152
152
  ):
153
- return {}
154
-
155
- def calculate_rewards_balance(self, wallet_address: str, decoded_data: dict, block_number: int = "latest"):
156
- return {}
153
+ rpc_call = self.get_comptroller_function_info("compAccrued", [wallet_address], block_number)
154
+ get_reward_id = f"compAccrued_{self.name}_{wallet_address}_{block_number}".lower()
155
+ return {get_reward_id: rpc_call}
156
+
157
+ def calculate_claimable_rewards_balance(self, wallet_address: str, decoded_data: dict,
158
+ block_number: int = "latest"):
159
+ get_reward_id = f"compAccrued_{self.name}_{wallet_address}_{block_number}".lower()
160
+ rewards = decoded_data.get(get_reward_id) / 10 ** 18
161
+ reward_token = self.iron_bank_info.get("rewardToken")
162
+ result = {
163
+ reward_token: {"amount": rewards}
164
+ }
165
+ return result
157
166
 
158
167
  # WALLET DEPOSIT BORROW BALANCE
159
168
  def get_wallet_deposit_borrow_balance_function_info(
@@ -75,7 +75,7 @@ class AaveV2StateService(ProtocolServices):
75
75
  logger.info(f"Get token list related in {time.time()-begin}s")
76
76
  return tokens
77
77
 
78
- def (
78
+ def get_data(
79
79
  self,
80
80
  query_types: list,
81
81
  wallet: str,
@@ -0,0 +1,53 @@
1
+ MORPHO_AAVE_V2_ETH = {
2
+ "name": "Compound Lending Pool",
3
+ "rewardToken": "0x4da27a545c0c5b758a6ba100e3a049001de870f5",
4
+ "comptrollerAddress": "0x777777c9898d384f785ee44acfe945efdff5f3e0",
5
+ "lensAddress": "0x507fa343d0a90786d86c7cd885f5c49263a91ff4",
6
+ "poolToken": "0x9994e35db50125e0df82e4c2dde62496ce330999",
7
+ "type": "LENDING_POOL",
8
+ "forked": "morpho",
9
+ "reservesList": {
10
+ "0x6b175474e89094c44da98b954eedeac495271d0f": {
11
+ "tToken": "0x028171bca77440897b824ca71d1c56cac55b68a3",
12
+ "dToken": "0x6c3c78838c761c6ac7be9f59fe808ea2a6e4379d",
13
+ "sdToken": "0x778a13d3eeb110a4f7bb6529f99c000119a08e92",
14
+ "liquidationThreshold": 0.87
15
+ },
16
+ "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": {
17
+ "tToken": "0x030ba81f1c18d280636f32af80b9aad02cf0854e",
18
+ "dToken": "0xf63b34710400cad3e044cffdcab00a0f32e33ecf",
19
+ "sdToken": "0x4e977830ba4bd783c0bb7f15d3e243f73ff57121",
20
+ "liquidationThreshold": 0.86
21
+ },
22
+ "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": {
23
+ "tToken": "0xbcca60bb61934080951369a648fb03df4f96263c",
24
+ "dToken": "0x619beb58998ed2278e08620f97007e1116d5d25b",
25
+ "sdToken": "0xe4922afab0bbadd8ab2a88e0c79d884ad337fca6",
26
+ "liquidationThreshold": 0.875
27
+ },
28
+ "0xdac17f958d2ee523a2206206994597c13d831ec7": {
29
+ "tToken": "0x3ed3b47dd13ec9a98b44e6204a523e766b225811",
30
+ "dToken": "0x531842cebbdd378f8ee36d171d6cc9c4fcf475ec",
31
+ "sdToken": "0xe91d55ab2240594855abd11b3faae801fd4c4687",
32
+ "liquidationThreshold": 0.0
33
+ },
34
+ "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599": {
35
+ "tToken": "0x9ff58f4ffb29fa2266ab25e75e2a8b3503311656",
36
+ "dToken": "0x9c39809dec7f95f5e0713634a4d0701329b3b4d2",
37
+ "sdToken": "0x51b039b9afe64b78758f8ef091211b5387ea717c",
38
+ "liquidationThreshold": 0.82
39
+ },
40
+ "0xae7ab96520de3a18e5e111b5eaab095312d7fe84": {
41
+ "tToken": "0x1982b2f5814301d4e9a8b0201555376e62f82428",
42
+ "dToken": "0xa9deac9f00dc4310c35603fcd9d34d1a750f81db",
43
+ "sdToken": "0x66457616dd8489df5d0afd8678f4a260088aaf55",
44
+ "liquidationThreshold": 0.83
45
+ },
46
+ "0xd533a949740bb3306d119cc777fa900ba034cd52": {
47
+ "tToken": "0x8dae6cb04688c62d939ed9b68d32bc62e49970b1",
48
+ "dToken": "0x00ad8ebf64f141f1c81e9f8f792d3d1631c6c684",
49
+ "sdToken": "0x9288059a74f589c919c7cf1db433251cdfeb874b",
50
+ "liquidationThreshold": 0.58
51
+ },
52
+ }
53
+ }
@@ -0,0 +1,51 @@
1
+ MORPHO_AAVE_V3_ETH = {
2
+ "name": "Compound Lending Pool",
3
+ "comptrollerAddress": "0x33333aea097c193e66081e930c33020272b33333",
4
+ "poolToken": "0x9994e35db50125e0df82e4c2dde62496ce330999",
5
+ "type": "LENDING_POOL",
6
+ "forked": "morpho-aave-v3",
7
+ "reservesList": {
8
+ "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": {
9
+ "tToken": "0x4d5f47fa6a74757f35c14fd3a6ef8e3c9bc514e8",
10
+ "sdToken": "0x102633152313c81cd80419b6ecf66d14ad68949a",
11
+ "dToken": "0xea51d7853eefb32b6ee06b1c12e6dcca88be0ffe",
12
+ "liquidationThreshold": 0.83
13
+ },
14
+ "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0": {
15
+ "tToken": "0x0b925ed163218f6662a35e0f0371ac234f9e9371",
16
+ "sdToken": "0x39739943199c0fbfe9e5f1b5b160cd73a64cb85d",
17
+ "dToken": "0xc96113eed8cab59cd8a66813bcb0ceb29f06d2e4",
18
+ "liquidationThreshold": 0.8
19
+ },
20
+ "0x6b175474e89094c44da98b954eedeac495271d0f": {
21
+ "tToken": "0x018008bfb33d285247a21d44e50697654f754e63",
22
+ "sdToken": "0x413adac9e2ef8683adf5ddaece8f19613d60d1bb",
23
+ "dToken": "0xcf8d0c70c850859266f5c338b38f9d663181c314",
24
+ "liquidationThreshold": 0.8
25
+ },
26
+ "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": {
27
+ "tToken": "0x98c23e9d8f34fefb1b7bd6a91b7ff122f4e16f5c",
28
+ "sdToken": "0xb0fe3d292f4bd50de902ba5bdf120ad66e9d7a39",
29
+ "dToken": "0x72e95b8931767c79ba4eee721354d6e99a61d004",
30
+ "liquidationThreshold": 0.8
31
+ },
32
+ "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599": {
33
+ "tToken": "0x5ee5bf7ae06d1be5997a1a72006fe6c607ec6de8",
34
+ "sdToken": "0xa1773f1ccf6db192ad8fe826d15fe1d328b03284",
35
+ "dToken": "0x40aabef1aa8f0eec637e0e7d92fbffb2f26a8b7b",
36
+ "liquidationThreshold": 0.78
37
+ },
38
+ "0xae78736cd615f374d3085123a210448e74fc6393": {
39
+ "tToken": "0xcc9ee9483f662091a1de4795249e24ac0ac2630f",
40
+ "sdToken": "0x1d1906f909cae494c7441604dafdddbd0485a925",
41
+ "dToken": "0xae8593dd575fe29a9745056aa91c4b746eee62c8",
42
+ "liquidationThreshold": 0.74
43
+ },
44
+ "0xbe9895146f7af43049ca1c1ae358b0541ea49704": {
45
+ "tToken": "0x977b6fc5de62598b08c85ac8cf2b745874e8b78c",
46
+ "sdToken": "0x82be6012cea6d147b968ebaea5ceecf6a5b4f493",
47
+ "dToken": "0x0c91bca95b5fe69164ce583a2ec9429a569798ed",
48
+ "liquidationThreshold": 0.74
49
+ },
50
+ }
51
+ }
@@ -0,0 +1,44 @@
1
+ MORPHO_COMPOUND_ETH = {
2
+ "name": "Compound Lending Pool",
3
+ "rewardToken": "0xc00e94cb662c3520282e6f5717214004a7f26888",
4
+ "comptrollerAddress": "0x8888882f8f843896699869179fb6e4f7e3b58888",
5
+ "lensAddress": "0x930f1b46e1d081ec1524efd95752be3ece51ef67",
6
+ "rewardManager": '0x78681e63b6f3ad81ecd64aecc404d765b529c80d',
7
+ "poolToken": "0x9994e35db50125e0df82e4c2dde62496ce330999",
8
+ "type": "LENDING_POOL",
9
+ "forked": "morpho",
10
+ "reservesList": {
11
+ "0x6b175474e89094c44da98b954eedeac495271d0f": {
12
+ "cToken": "0x5d3a536e4d6dbd6114cc1ead35777bab948e3643",
13
+ "liquidationThreshold": 0.835
14
+ },
15
+ "0xc00e94cb662c3520282e6f5717214004a7f26888": {
16
+ "cToken": "0x70e36f6bf80a52b3b46b3af8e106cc0ed743e8e4",
17
+ "liquidationThreshold": 0.6
18
+ },
19
+ "0x0000000000000000000000000000000000000000": {
20
+ "cToken": "0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5",
21
+ "liquidationThreshold": 0.825
22
+ },
23
+ "0x956f47f50a910163d8bf957cf5846d573e7f87ca": {
24
+ "cToken": "0x7713dd9ca933848f6819f38b8352d9a15ea73f67",
25
+ "liquidationThreshold": 0.0
26
+ },
27
+ "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984": {
28
+ "cToken": "0x35a18000230da775cac24873d00ff85bccded550",
29
+ "liquidationThreshold": 0.75
30
+ },
31
+ "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": {
32
+ "cToken": "0x39aa39c021dfbae8fac545936693ac917d5e7563",
33
+ "liquidationThreshold": 0.855
34
+ },
35
+ "0xdac17f958d2ee523a2206206994597c13d831ec7": {
36
+ "cToken": "0xf650c3d88d12db855b8bf7d11be6c55a4e07dcc9",
37
+ "liquidationThreshold": 0.0
38
+ },
39
+ "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599": {
40
+ "cToken": "0xccf4429db6322d5c611ee964527d42e5d685dd6a",
41
+ "liquidationThreshold": 0.7
42
+ },
43
+ }
44
+ }
@@ -0,0 +1,89 @@
1
+ import logging
2
+ import time
3
+
4
+ from web3 import Web3
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
9
+ from defi_services.abis.lending.morpho.morpho_aave_v2_comptroller_abi import MORPHO_AAVE_V2_COMPTROLLER
10
+ from defi_services.abis.lending.morpho.morpho_aave_v2_lens_abi import MORPHO_AAVE_V2_LENS_ABI
11
+ from defi_services.constants.chain_constant import Chain
12
+ from defi_services.constants.entities.lending_constant import Lending
13
+ from defi_services.jobs.queriers.state_querier import StateQuerier
14
+ from defi_services.services.lending.lending_info.aave_v2_services import AaveInfo
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
17
+
18
+ logger = logging.getLogger("Compound Lending Pool State Service")
19
+
20
+
21
+ class MorphoAaveV2Info:
22
+ mapping = {
23
+ Chain.ethereum: MORPHO_AAVE_V2_ETH
24
+ }
25
+
26
+
27
+ class MorphoAaveV2Services(MorphoCompoundServices):
28
+ def __init__(self, state_service: StateQuerier, chain_id: str = "0x1"):
29
+ super().__init__(state_service, chain_id)
30
+ self.name = f"{chain_id}_{Lending.morpho_aave_v2}"
31
+ self.chain_id = chain_id
32
+ self.compound_info = AaveInfo.mapping.get(chain_id)
33
+ self.pool_info = MorphoAaveV2Info.mapping.get(chain_id)
34
+ self.state_service = state_service
35
+ self.lending_abi = LENDING_POOL_ABI
36
+ self.incentive_abi = AAVE_V2_INCENTIVES_ABI
37
+ self.oracle_abi = ORACLE_ABI
38
+ self.lens_abi = MORPHO_AAVE_V2_LENS_ABI
39
+ self.comptroller_abi = MORPHO_AAVE_V2_COMPTROLLER
40
+ self.market_key = 'tToken'
41
+
42
+ # BASIC FUNCTIONS
43
+ def get_service_info(self):
44
+ info = {
45
+ Lending.morpho_aave_v2: {
46
+ "chain_id": self.chain_id,
47
+ "type": "lending",
48
+ "protocol_info": self.pool_info
49
+ }
50
+ }
51
+ return info
52
+
53
+ def get_dapp_asset_info(
54
+ self,
55
+ block_number: int = "latest"):
56
+ begin = time.time()
57
+ _w3 = self.state_service.get_w3()
58
+ pool_address = Web3.toChecksumAddress(self.pool_info['address'])
59
+ contract = _w3.eth.contract(address=pool_address, abi=self.lending_abi)
60
+ comptroller_contract = _w3.eth.contract(
61
+ address=_w3.toChecksumAddress(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
62
+ markets = comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number)
63
+ reserves_list = contract.functions.getReservesList().call(block_identifier=block_number)
64
+ reserves_info = {}
65
+ for token in reserves_list:
66
+ value = contract.functions.getReserveData(token).call(block_identifier=block_number)
67
+ key = token.lower()
68
+ ttoken = value[7]
69
+ if ttoken in markets:
70
+ reserves_info[key] = {}
71
+ reserves_info[key]["tToken"] = ttoken.lower()
72
+ reserves_info[key]["dToken"] = value[9].lower()
73
+ reserves_info[key]["sdToken"] = value[8].lower()
74
+ risk_param = bin(value[0][0])[2:]
75
+ reserves_info[key]["liquidationThreshold"] = int(risk_param[-31:-16], 2) / 10 ** 4
76
+ logger.info(f"Get reserves information in {time.time() - begin}s")
77
+ return reserves_info
78
+
79
+ # REWARDS BALANCE
80
+ def get_claimable_rewards_balance_function_info(
81
+ self,
82
+ wallet_address: str,
83
+ block_number: int = "latest",
84
+ ):
85
+ return {}
86
+
87
+ def calculate_claimable_rewards_balance(self, wallet_address: str, decoded_data: dict,
88
+ block_number: int = "latest"):
89
+ return {}
@@ -0,0 +1,159 @@
1
+ import logging
2
+ import time
3
+
4
+ from web3 import Web3
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
9
+ from defi_services.abis.lending.morpho.morpho_aave_v3_comptroller_abi import MORPHO_AAVE_V3_COMPTROLLER_ABI
10
+ from defi_services.abis.token.erc20_abi import ERC20_ABI
11
+ from defi_services.constants.chain_constant import Chain
12
+ from defi_services.constants.entities.lending_constant import Lending
13
+ from defi_services.constants.token_constant import Token
14
+ from defi_services.jobs.queriers.state_querier import StateQuerier
15
+ from defi_services.services.lending.aave_v3_services import AaveV3Info
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
18
+
19
+ logger = logging.getLogger("Compound Lending Pool State Service")
20
+
21
+
22
+ class MorphoAaveV3Info:
23
+ mapping = {
24
+ Chain.ethereum: MORPHO_AAVE_V3_ETH
25
+ }
26
+
27
+
28
+ class MorphoAaveV3Services(MorphoCompoundServices):
29
+ def __init__(self, state_service: StateQuerier, chain_id: str = "0x1"):
30
+ super().__init__(state_service, chain_id)
31
+ self.name = f"{chain_id}_{Lending.morpho_aave_v3}"
32
+ self.chain_id = chain_id
33
+ self.aave_info = AaveV3Info.mapping.get(chain_id)
34
+ self.pool_info = MorphoAaveV3Info.mapping.get(chain_id)
35
+ self.state_service = state_service
36
+ self.lending_abi = LENDING_POOL_ABI
37
+ self.incentive_abi = AAVE_V2_INCENTIVES_ABI
38
+ self.oracle_abi = ORACLE_ABI
39
+ self.comptroller_abi = MORPHO_AAVE_V3_COMPTROLLER_ABI
40
+ self.market_key = 'tToken'
41
+
42
+ # BASIC FUNCTIONS
43
+ def get_service_info(self):
44
+ info = {
45
+ Lending.morpho_aave_v3: {
46
+ "chain_id": self.chain_id,
47
+ "type": "lending",
48
+ "protocol_info": self.pool_info
49
+ }
50
+ }
51
+ return info
52
+
53
+ def get_dapp_asset_info(
54
+ self,
55
+ block_number: int = "latest"):
56
+ begin = time.time()
57
+ _w3 = self.state_service.get_w3()
58
+ pool_address = Web3.toChecksumAddress(self.aave_info['address'])
59
+ contract = _w3.eth.contract(address=pool_address, abi=self.lending_abi)
60
+ comptroller_contract = _w3.eth.contract(
61
+ address=_w3.toChecksumAddress(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
62
+ markets = comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number)
63
+ markets = [i.lower() for i in markets]
64
+ reserves_list = contract.functions.getReservesList().call(block_identifier=block_number)
65
+ reserves_info = {}
66
+ for token in reserves_list:
67
+ value = contract.functions.getReserveData(token).call(block_identifier=block_number)
68
+ key = token.lower()
69
+ if token in markets:
70
+ reserves_info[key] = {}
71
+ reserves_info[key]["tToken"] = value[8].lower()
72
+ reserves_info[key]["dToken"] = value[9].lower()
73
+ reserves_info[key]["sdToken"] = value[10].lower()
74
+ risk_param = bin(value[0][0])[2:]
75
+ reserves_info[key]["liquidationThreshold"] = int(risk_param[-31:-16], 2) / 10 ** 4
76
+ logger.info(f"Get reserves information in {time.time() - begin}s")
77
+ return reserves_info
78
+
79
+ def get_token_list(self):
80
+ begin = time.time()
81
+ tokens = [self.aave_info.get("poolToken")]
82
+ for token in self.aave_info.get("reservesList"):
83
+ if token == Token.native_token:
84
+ tokens.append(Token.wrapped_token.get(self.chain_id))
85
+ continue
86
+ tokens.append(token)
87
+ logger.info(f"Get token list related in {time.time()-begin}s")
88
+ return tokens
89
+
90
+ # REWARDS BALANCE
91
+ def get_claimable_rewards_balance_function_info(
92
+ self,
93
+ wallet_address: str,
94
+ block_number: int = "latest",
95
+ ):
96
+ return {}
97
+
98
+ def calculate_claimable_rewards_balance(self, wallet_address: str, decoded_data: dict,
99
+ block_number: int = "latest"):
100
+ return {}
101
+
102
+ # WALLET DEPOSIT BORROW BALANCE
103
+ def get_wallet_deposit_borrow_balance_function_info(
104
+ self,
105
+ wallet_address: str,
106
+ reserves_info: dict,
107
+ block_number: int = "latest"
108
+ ):
109
+
110
+ rpc_calls = {}
111
+ for token, value in reserves_info.items():
112
+ underlying = token
113
+ ctoken = value.get(self.market_key)
114
+ if token == Token.native_token:
115
+ underlying = Token.wrapped_token.get(self.chain_id)
116
+ underlying_borrow_key = f"borrowBalance_{self.name}_{ctoken}_{wallet_address}_{block_number}".lower()
117
+ underlying_balance_key = f"collateralBalance_{self.name}_{ctoken}_{wallet_address}_{block_number}".lower()
118
+ underlying_decimals_key = f"decimals_{underlying}_{block_number}".lower()
119
+ rpc_calls[underlying_borrow_key] = self.get_comptroller_function_info(
120
+ "borrowBalance", [token, wallet_address], block_number)
121
+ rpc_calls[underlying_balance_key] = self.get_comptroller_function_info(
122
+ "collateralBalance", [token, wallet_address], block_number)
123
+ rpc_calls[underlying_decimals_key] = self.state_service.get_function_info(
124
+ underlying, ERC20_ABI, "decimals", [], block_number
125
+ )
126
+
127
+ return rpc_calls
128
+
129
+ def calculate_wallet_deposit_borrow_balance(
130
+ self, wallet_address: str, reserves_info: dict, decoded_data: dict, token_prices: dict = None,
131
+ block_number: int = "latest"):
132
+ if token_prices is None:
133
+ token_prices = {}
134
+ result = {}
135
+ for token, value in reserves_info.items():
136
+ underlying = token
137
+ ctoken = value.get(self.market_key)
138
+ if token == Token.native_token:
139
+ underlying = Token.wrapped_token.get(self.chain_id)
140
+ get_total_deposit_id = f"collateralBalance_{self.name}_{ctoken}_{wallet_address}_{block_number}".lower()
141
+ get_total_borrow_id = f"borrowBalance_{self.name}_{ctoken}_{wallet_address}_{block_number}".lower()
142
+ get_decimals_id = f"decimals_{underlying}_{block_number}".lower()
143
+ decimals = decoded_data[get_decimals_id]
144
+ deposit_amount = decoded_data[get_total_deposit_id] / 10 ** decimals
145
+ borrow_amount = decoded_data[get_total_borrow_id] / 10 ** decimals
146
+ result[token] = {
147
+ "borrow_amount": borrow_amount,
148
+ "deposit_amount": deposit_amount,
149
+ }
150
+ if token_prices:
151
+ token_price = token_prices.get(underlying)
152
+ else:
153
+ token_price = None
154
+ if token_price is not None:
155
+ deposit_amount_in_usd = deposit_amount * token_price
156
+ borrow_amount_in_usd = borrow_amount * token_price
157
+ result[token]['borrow_amount_in_usd'] += borrow_amount_in_usd
158
+ result[token]['deposit_amount_in_usd'] += deposit_amount_in_usd
159
+ return result