defi-state-querier 0.5.28__py3-none-any.whl → 0.5.30__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- defi_services/__init__.py +1 -1
- defi_services/abis/lending/ionic/__init__.py +0 -0
- defi_services/abis/lending/ionic/ionic_ctoken_abi.py +1108 -0
- defi_services/abis/lending/kinza/__init__.py +0 -0
- defi_services/abis/lending/kinza/kinza_incentive.py +928 -0
- defi_services/abis/lending/kinza/kinza_lending_pool.py +1791 -0
- defi_services/abis/lending/moonwell/__init__.py +0 -0
- defi_services/abis/lending/moonwell/moonwell_comptroller_abi.py +1500 -0
- defi_services/abis/lending/moonwell/moonwell_ctoken_abi.py +1431 -0
- defi_services/abis/lending/radiant_v2/radiant_reward_converter.py +817 -0
- defi_services/abis/lending/seamless/__init__.py +0 -0
- defi_services/abis/lending/seamless/seamless_incentive.py +1049 -0
- defi_services/abis/lending/seamless/seamless_lending_pool.py +1738 -0
- defi_services/abis/lending/seamless/seamless_oracle.py +233 -0
- defi_services/abis/token/trc20_abi.py +304 -0
- defi_services/abis/vault/tcv_abi.py +1523 -0
- defi_services/constants/chain_constant.py +8 -1
- defi_services/constants/entities/dex_info_constant.py +2 -2
- defi_services/constants/entities/dex_services.py +13 -1
- defi_services/constants/entities/lending_constant.py +14 -5
- defi_services/constants/entities/lending_services.py +41 -4
- defi_services/constants/entities/vault_constant.py +2 -2
- defi_services/constants/entities/vault_services.py +7 -1
- defi_services/constants/network_constants.py +20 -361
- defi_services/constants/token_constant.py +3 -1
- defi_services/jobs/processors/cosmos_state_processor.py +3 -2
- defi_services/jobs/processors/ton_state_processor.py +5 -4
- defi_services/jobs/queriers/call_state_querier.py +2 -0
- defi_services/jobs/queriers/state_querier.py +3 -0
- defi_services/jobs/tcv.py +144 -0
- defi_services/services/dex/dex_info/uniswap_info.py +29 -1
- defi_services/services/dex/uniswap_v3_service.py +6 -2
- defi_services/services/lending/aave_v2_services.py +44 -29
- defi_services/services/lending/aave_v3_services.py +41 -20
- defi_services/services/lending/avalon_services.py +34 -0
- defi_services/services/lending/compound_v3_services.py +9 -5
- defi_services/services/lending/granary_services.py +6 -4
- defi_services/services/lending/ionic_service.py +167 -0
- defi_services/services/lending/justlend_service.py +4 -3
- defi_services/services/lending/kinza_services.py +315 -0
- defi_services/services/lending/lending_info/arbitrum/aave_v3_arbitrum.py +1 -1
- defi_services/services/lending/lending_info/arbitrum/compound_v3_arbitrum.py +96 -6
- defi_services/services/lending/lending_info/arbitrum/venus_arbitrum.py +10 -0
- defi_services/services/lending/lending_info/base/__init__.py +0 -0
- defi_services/services/lending/lending_info/base/aave_v3_base.py +61 -0
- defi_services/services/lending/lending_info/base/compound_v3_base.py +116 -0
- defi_services/services/lending/lending_info/base/granary_base.py +62 -0
- defi_services/services/lending/lending_info/base/ionic_base.py +173 -0
- defi_services/services/lending/lending_info/base/moonwell_base.py +89 -0
- defi_services/services/lending/lending_info/base/radiant_v2_base.py +57 -0
- defi_services/services/lending/lending_info/base/seamless_base.py +145 -0
- defi_services/services/lending/lending_info/base/sonne_base.py +53 -0
- defi_services/services/lending/lending_info/base/xlend_base.py +91 -0
- defi_services/services/lending/lending_info/base/zerolend_base.py +109 -0
- defi_services/services/lending/lending_info/bsc/aave_v3_bsc.py +68 -0
- defi_services/services/lending/lending_info/bsc/apeswap_bsc.py +1 -1
- defi_services/services/lending/lending_info/bsc/avalon_bsc.py +75 -0
- defi_services/services/lending/lending_info/bsc/kinza_bsc.py +182 -0
- defi_services/services/lending/lending_info/ethereum/aave_v3_eth.py +1 -140
- defi_services/services/lending/lending_info/ethereum/compound_v3_eth.py +180 -5
- defi_services/services/lending/lending_info/ethereum/kinza_eth.py +119 -0
- defi_services/services/lending/lending_info/ethereum/old_aave_v3_eth.py +150 -0
- defi_services/services/lending/lending_info/ethereum/radiant_eth.py +69 -0
- defi_services/services/lending/lending_info/ethereum/venus_eth.py +10 -0
- defi_services/services/lending/lending_info/ethereum/zerolend_eth.py +96 -0
- defi_services/services/lending/lending_info/optimism/compound_v3_optimism.py +116 -0
- defi_services/services/lending/lending_info/optimism/moonwell_optimism.py +9 -0
- defi_services/services/lending/lending_info/optimism/xlend_optimism.py +112 -0
- defi_services/services/lending/lending_info/polygon/compound_v3_polygon.py +35 -5
- defi_services/services/lending/lending_info/zksync/__init__.py +0 -0
- defi_services/services/lending/lending_info/zksync/aave_v3_zksync.py +47 -0
- defi_services/services/lending/lending_info/zksync/venus_zksync.py +10 -0
- defi_services/services/lending/lending_info/zksync/zerolend_zksync.py +138 -0
- defi_services/services/lending/liqee_service.py +2 -2
- defi_services/services/lending/moonwell_service.py +120 -0
- defi_services/services/lending/morpho_aave_v2_services.py +3 -3
- defi_services/services/lending/morpho_aave_v3_services.py +2 -2
- defi_services/services/lending/onyx_service.py +2 -1
- defi_services/services/lending/radiant_v2_services.py +52 -10
- defi_services/services/lending/seamless_services.py +313 -0
- defi_services/services/lending/sonne_service.py +64 -0
- defi_services/services/lending/trava_services.py +2 -2
- defi_services/services/lending/uwu_services.py +3 -3
- defi_services/services/lending/valas_services.py +2 -2
- defi_services/services/lending/venus_services.py +9 -3
- defi_services/services/lending/xlend_services.py +325 -0
- defi_services/services/lending/zerolend_services.py +36 -0
- defi_services/services/multicall/multicall_v2.py +0 -317
- defi_services/services/vault/tcv_vault_services.py +108 -0
- defi_services/services/vault/vault_info/arbitrum/__init__.py +0 -0
- defi_services/services/vault/vault_info/arbitrum/tcv_arb.py +58 -0
- {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.30.dist-info}/METADATA +1 -1
- {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.30.dist-info}/RECORD +103 -49
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/__init__.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/aave_v2_event_abi.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/aave_v2_incentives_abi.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/lending_pool_abi.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/oracle_abi.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/staked_incentives_abi.py +0 -0
- /defi_services/abis/lending/{aave_v2_and_forlks → aave_v2_and_forks}/uwu_incentives_abi.py +0 -0
- {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.30.dist-info}/WHEEL +0 -0
- {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.30.dist-info}/licenses/LICENSE +0 -0
- {defi_state_querier-0.5.28.dist-info → defi_state_querier-0.5.30.dist-info}/top_level.txt +0 -0
@@ -3,9 +3,9 @@ import time
|
|
3
3
|
|
4
4
|
from web3 import Web3
|
5
5
|
|
6
|
-
from defi_services.abis.lending.
|
7
|
-
from defi_services.abis.lending.
|
8
|
-
from defi_services.abis.lending.
|
6
|
+
from defi_services.abis.lending.aave_v2_and_forks.aave_v2_incentives_abi import AAVE_V2_INCENTIVES_ABI
|
7
|
+
from defi_services.abis.lending.aave_v2_and_forks.lending_pool_abi import LENDING_POOL_ABI
|
8
|
+
from defi_services.abis.lending.aave_v2_and_forks.oracle_abi import ORACLE_ABI
|
9
9
|
from defi_services.abis.lending.granary.granary_rewarder_abi import GRANARY_REWARDER_ABI
|
10
10
|
from defi_services.abis.token.erc20_abi import ERC20_ABI
|
11
11
|
from defi_services.constants.chain_constant import Chain
|
@@ -14,6 +14,7 @@ from defi_services.constants.token_constant import Token
|
|
14
14
|
from defi_services.jobs.queriers.state_querier import StateQuerier
|
15
15
|
from defi_services.services.lending.lending_info.arbitrum.granary_arbitrum import GRANARY_ARBITRUM
|
16
16
|
from defi_services.services.lending.lending_info.avalanche.granary_avalanche import GRANARY_AVALANCHE
|
17
|
+
from defi_services.services.lending.lending_info.base.granary_base import GRANARY_BASE
|
17
18
|
from defi_services.services.lending.lending_info.bsc.granary_bsc import GRANARY_BSC
|
18
19
|
from defi_services.services.lending.lending_info.ethereum.granary_eth import GRANARY_V1_ETH
|
19
20
|
from defi_services.services.lending.lending_info.fantom.granary_ftm import GRANARY_FTM
|
@@ -31,7 +32,8 @@ class GranaryV1Info:
|
|
31
32
|
Chain.optimism: GRANARY_OPTIMISM,
|
32
33
|
Chain.fantom: GRANARY_FTM,
|
33
34
|
Chain.avalanche: GRANARY_AVALANCHE,
|
34
|
-
Chain.arbitrum: GRANARY_ARBITRUM
|
35
|
+
Chain.arbitrum: GRANARY_ARBITRUM,
|
36
|
+
Chain.base: GRANARY_BASE
|
35
37
|
}
|
36
38
|
|
37
39
|
|
@@ -0,0 +1,167 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from web3 import Web3
|
4
|
+
|
5
|
+
from defi_services.abis.lending.ionic.ionic_ctoken_abi import IONIC_CTOKEN_ABI
|
6
|
+
from defi_services.abis.lending.moonwell.moonwell_comptroller_abi import MOONWELL_COMPTROLLER_ABI
|
7
|
+
from defi_services.abis.token.erc20_abi import ERC20_ABI
|
8
|
+
from defi_services.constants.chain_constant import Chain
|
9
|
+
from defi_services.constants.entities.lending_constant import Lending
|
10
|
+
from defi_services.constants.token_constant import Token
|
11
|
+
from defi_services.jobs.queriers.state_querier import StateQuerier
|
12
|
+
from defi_services.services.lending.lending_info.base.ionic_base import IONIC_BASE
|
13
|
+
from defi_services.services.lending.venus_services import VenusStateService
|
14
|
+
|
15
|
+
logger = logging.getLogger("Ionic Lending Pool State Service")
|
16
|
+
|
17
|
+
|
18
|
+
class IonicInfo:
|
19
|
+
mapping = {
|
20
|
+
Chain.base: IONIC_BASE
|
21
|
+
}
|
22
|
+
|
23
|
+
|
24
|
+
class IonicStateService(VenusStateService):
|
25
|
+
def __init__(self, state_service: StateQuerier, chain_id: str = "0x38"):
|
26
|
+
super().__init__(state_service, chain_id)
|
27
|
+
self.name = f"{chain_id}_{Lending.ionic}"
|
28
|
+
self.chain_id = chain_id
|
29
|
+
self.pool_info = IonicInfo.mapping.get(chain_id)
|
30
|
+
self.state_service = state_service
|
31
|
+
self.comptroller_abi = MOONWELL_COMPTROLLER_ABI
|
32
|
+
self.vtoken_abi = IONIC_CTOKEN_ABI
|
33
|
+
|
34
|
+
def get_service_info(self):
|
35
|
+
info = {
|
36
|
+
Lending.ionic: {
|
37
|
+
"chain_id": self.chain_id,
|
38
|
+
"type": "lending",
|
39
|
+
"protocol_info": self.pool_info
|
40
|
+
}
|
41
|
+
}
|
42
|
+
return info
|
43
|
+
|
44
|
+
def get_dapp_asset_info(self, block_number: int = "latest"):
|
45
|
+
_w3 = self.state_service.get_w3()
|
46
|
+
comptroller_contract = _w3.eth.contract(
|
47
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
48
|
+
ctokens = []
|
49
|
+
for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
|
50
|
+
ctokens.append(token)
|
51
|
+
|
52
|
+
reserves_info = {}
|
53
|
+
tokens = [Web3.to_checksum_address(i) for i in ctokens]
|
54
|
+
queries = {}
|
55
|
+
for token in tokens:
|
56
|
+
key = f"underlying_{token}_{block_number}".lower()
|
57
|
+
queries[key] = {
|
58
|
+
"address": token, "abi": self.vtoken_abi, "params": [],
|
59
|
+
"function": "underlying", "block_number": block_number
|
60
|
+
}
|
61
|
+
|
62
|
+
exchange_rate_query_id = f'exchangeRateCurrent_{token}_{block_number}'
|
63
|
+
queries[exchange_rate_query_id] = self.get_ctoken_function_info(
|
64
|
+
ctoken=token, fn_name='exchangeRateCurrent', block_number=block_number)
|
65
|
+
|
66
|
+
markets = f"markets_{token}_{block_number}".lower()
|
67
|
+
queries[markets] = self.get_comptroller_function_info("markets", [token])
|
68
|
+
|
69
|
+
decoded_data = self.state_service.query_state_data(queries)
|
70
|
+
for token in tokens:
|
71
|
+
key = f"underlying_{token}_{block_number}".lower()
|
72
|
+
underlying = decoded_data.get(key).lower()
|
73
|
+
markets = f"markets_{token}_{block_number}".lower()
|
74
|
+
liquidation_threshold = decoded_data.get(markets)[1] / 10 ** 18
|
75
|
+
ltv = liquidation_threshold
|
76
|
+
|
77
|
+
exchange_rate_query_id = f'exchangeRateCurrent_{token}_{block_number}'
|
78
|
+
exchange_rate = decoded_data.get(exchange_rate_query_id) / 10 ** 18
|
79
|
+
|
80
|
+
reserves_info[underlying] = {
|
81
|
+
'cToken': token.lower(),
|
82
|
+
"exchangeRate": exchange_rate,
|
83
|
+
"liquidationThreshold": liquidation_threshold,
|
84
|
+
"loanToValue": ltv
|
85
|
+
}
|
86
|
+
return reserves_info
|
87
|
+
|
88
|
+
def get_apy_lending_pool_function_info(
|
89
|
+
self,
|
90
|
+
reserves_info: dict,
|
91
|
+
block_number: int = "latest"
|
92
|
+
):
|
93
|
+
rpc_calls = {}
|
94
|
+
for token_address, reserve_info in reserves_info.items():
|
95
|
+
if token_address != Token.native_token:
|
96
|
+
query_id = f"decimals_{token_address}_{block_number}".lower()
|
97
|
+
rpc_calls[query_id] = self.state_service.get_function_info(token_address, ERC20_ABI, "decimals", [], block_number)
|
98
|
+
|
99
|
+
ctoken = reserve_info.get("cToken")
|
100
|
+
for fn_name in ['decimals', 'totalSupply', 'totalBorrows', 'supplyRatePerBlock', 'borrowRatePerBlock', 'exchangeRateCurrent']:
|
101
|
+
query_id = f"{fn_name}_{ctoken}_{block_number}".lower()
|
102
|
+
rpc_calls[query_id] = self.get_ctoken_function_info(
|
103
|
+
ctoken=ctoken,
|
104
|
+
fn_name=fn_name,
|
105
|
+
block_number=block_number
|
106
|
+
)
|
107
|
+
|
108
|
+
return rpc_calls
|
109
|
+
|
110
|
+
def get_reserve_tokens_metadata(
|
111
|
+
self,
|
112
|
+
decoded_data: dict,
|
113
|
+
reserves_info: dict,
|
114
|
+
block_number: int = "latest"
|
115
|
+
):
|
116
|
+
reserve_tokens_info = []
|
117
|
+
for token_address, reserve_info in reserves_info.items():
|
118
|
+
if token_address != Token.native_token:
|
119
|
+
underlying_decimals_query_id = f"decimals_{token_address}_{block_number}".lower()
|
120
|
+
underlying_decimals = decoded_data.get(underlying_decimals_query_id)
|
121
|
+
else:
|
122
|
+
underlying_decimals = Chain.native_decimals.get(self.chain_id, 18)
|
123
|
+
|
124
|
+
ctoken = reserve_info.get("cToken")
|
125
|
+
ctoken_decimals_query_id = f"decimals_{ctoken}_{block_number}".lower()
|
126
|
+
total_supply_query_id = f"totalSupply_{ctoken}_{block_number}".lower()
|
127
|
+
total_borrow_query_id = f"totalBorrows_{ctoken}_{block_number}".lower()
|
128
|
+
supply_rate_query_id = f"supplyRatePerBlock_{ctoken}_{block_number}".lower()
|
129
|
+
borrow_rate_query_id = f"borrowRatePerBlock_{ctoken}_{block_number}".lower()
|
130
|
+
exchange_rate_query_id = f"exchangeRateCurrent_{ctoken}_{block_number}".lower()
|
131
|
+
|
132
|
+
reserve_tokens_info.append({
|
133
|
+
"token": ctoken,
|
134
|
+
"token_decimals": decoded_data.get(ctoken_decimals_query_id),
|
135
|
+
"borrow_rate": decoded_data.get(borrow_rate_query_id),
|
136
|
+
"supply_rate": decoded_data.get(supply_rate_query_id),
|
137
|
+
"supply": decoded_data.get(total_supply_query_id),
|
138
|
+
"borrow": decoded_data.get(total_borrow_query_id),
|
139
|
+
"exchange_rate": decoded_data.get(exchange_rate_query_id),
|
140
|
+
"underlying_decimals": underlying_decimals,
|
141
|
+
"underlying": token_address
|
142
|
+
})
|
143
|
+
return reserve_tokens_info
|
144
|
+
|
145
|
+
@classmethod
|
146
|
+
def _calculate_interest_rates(
|
147
|
+
cls, token_info: dict, pool_decimals: int, apx_block_speed_in_seconds: float):
|
148
|
+
block_per_day = int(86400 / apx_block_speed_in_seconds)
|
149
|
+
exchange_rate = float(token_info["exchange_rate"]) / 10 ** 18
|
150
|
+
|
151
|
+
total_borrow = float(token_info["borrow"]) / 10 ** int(token_info["underlying_decimals"])
|
152
|
+
total_supply = float(token_info["supply"]) * exchange_rate / 10 ** int(token_info["token_decimals"])
|
153
|
+
|
154
|
+
supply_apy = ((token_info["supply_rate"] / 10 ** pool_decimals) * block_per_day + 1) ** 365 - 1
|
155
|
+
borrow_apy = ((token_info["borrow_rate"] / 10 ** pool_decimals) * block_per_day + 1) ** 365 - 1
|
156
|
+
|
157
|
+
return {
|
158
|
+
'deposit_apy': supply_apy,
|
159
|
+
'borrow_apy': borrow_apy,
|
160
|
+
'total_deposit': total_supply,
|
161
|
+
'total_borrow': total_borrow
|
162
|
+
}
|
163
|
+
|
164
|
+
def get_ctoken_function_info(self, ctoken: str, fn_name: str, fn_paras: list = None, block_number: int = "latest"):
|
165
|
+
return self.state_service.get_function_info(
|
166
|
+
ctoken, self.vtoken_abi, fn_name, fn_paras, block_number
|
167
|
+
)
|
@@ -2,7 +2,7 @@ from web3 import Web3
|
|
2
2
|
|
3
3
|
from defi_services.abis.lending.justlend.just_token_abi import JUST_TOKEN_ABI
|
4
4
|
from defi_services.abis.lending.justlend.justlend_comptroller_abi import JUSTLEND_COMPTROLLER_ABI
|
5
|
-
from defi_services.abis.token.
|
5
|
+
from defi_services.abis.token.trc20_abi import TRC20_ABI
|
6
6
|
from defi_services.constants.chain_constant import Chain
|
7
7
|
from defi_services.constants.entities.lending_constant import Lending
|
8
8
|
from defi_services.constants.token_constant import Token
|
@@ -74,8 +74,9 @@ class JustLendStateService(CompoundStateService):
|
|
74
74
|
liquidation_threshold = decoded_data.get(markets)[1] / 10 ** 18
|
75
75
|
|
76
76
|
if underlying != Token.native_token:
|
77
|
-
underlying_contract = _w3.eth.contract(address=Web3.to_checksum_address(underlying), abi=
|
77
|
+
underlying_contract = _w3.eth.contract(address=Web3.to_checksum_address(underlying), abi=TRC20_ABI)
|
78
78
|
underlying_decimal = underlying_contract.functions.decimals().call()
|
79
|
+
|
79
80
|
else:
|
80
81
|
underlying_decimal = Chain.native_decimals.get(self.chain_id, 18)
|
81
82
|
exchange_rate_query_id = f'exchangeRateStored_{token}_{block_number}'
|
@@ -139,7 +140,7 @@ class JustLendStateService(CompoundStateService):
|
|
139
140
|
rpc_calls[underlying_balance_key] = self.get_ctoken_function_info(
|
140
141
|
ctoken, "balanceOfUnderlying", [wallet])
|
141
142
|
rpc_calls[underlying_decimals_key] = self.state_service.get_function_info(
|
142
|
-
underlying,
|
143
|
+
underlying, TRC20_ABI, "decimals", []
|
143
144
|
)
|
144
145
|
|
145
146
|
return rpc_calls
|
@@ -0,0 +1,315 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from web3 import Web3
|
4
|
+
|
5
|
+
from defi_services.abis.lending.aave.aave_v3.aave_v3_oracle_abi import AAVE_V3_ORACLE_ABI
|
6
|
+
from defi_services.abis.lending.kinza.kinza_incentive import KINZA_INCENTIVE_ABI
|
7
|
+
from defi_services.abis.lending.kinza.kinza_lending_pool import KINZA_LENDING_ABI
|
8
|
+
from defi_services.abis.token.erc20_abi import ERC20_ABI
|
9
|
+
from defi_services.constants.chain_constant import Chain
|
10
|
+
from defi_services.constants.db_constant import DBConst
|
11
|
+
from defi_services.constants.entities.lending_constant import Lending
|
12
|
+
from defi_services.constants.network_constants import NATIVE_TOKEN
|
13
|
+
from defi_services.constants.time_constant import TimeConstants
|
14
|
+
from defi_services.jobs.queriers.state_querier import StateQuerier
|
15
|
+
from defi_services.services.lending.aave_v2_services import AaveV2StateService
|
16
|
+
from defi_services.services.lending.lending_info.bsc.kinza_bsc import KINZA_BSC
|
17
|
+
from defi_services.services.lending.lending_info.ethereum.kinza_eth import KINZA_ETH
|
18
|
+
|
19
|
+
logger = logging.getLogger("Kinza Lending Pool State Service")
|
20
|
+
|
21
|
+
|
22
|
+
class KinzaInfo:
|
23
|
+
mapping = {
|
24
|
+
Chain.bsc: KINZA_BSC,
|
25
|
+
Chain.ethereum: KINZA_ETH
|
26
|
+
}
|
27
|
+
|
28
|
+
|
29
|
+
class KinzaStateService(AaveV2StateService):
|
30
|
+
def __init__(self, state_service: StateQuerier, chain_id: str = "0x38"):
|
31
|
+
super().__init__(state_service, chain_id)
|
32
|
+
self.name = f"{chain_id}_{Lending.kinza}"
|
33
|
+
self.chain_id = chain_id
|
34
|
+
self.pool_info = KinzaInfo.mapping.get(chain_id)
|
35
|
+
self.lending_abi = KINZA_LENDING_ABI
|
36
|
+
self.incentive_abi = KINZA_INCENTIVE_ABI
|
37
|
+
self.oracle_abi = AAVE_V3_ORACLE_ABI
|
38
|
+
self.state_service = state_service
|
39
|
+
|
40
|
+
def get_service_info(self):
|
41
|
+
info = {
|
42
|
+
Lending.kinza: {
|
43
|
+
"chain_id": self.chain_id,
|
44
|
+
"type": "lending",
|
45
|
+
"protocol_info": self.pool_info
|
46
|
+
}
|
47
|
+
}
|
48
|
+
return info
|
49
|
+
|
50
|
+
def get_dapp_asset_info(self, block_number: int = 'latest'):
|
51
|
+
_w3 = self.state_service.get_w3()
|
52
|
+
pool_address = self.pool_info.get("address")
|
53
|
+
pool_contract = _w3.eth.contract(address=_w3.to_checksum_address(pool_address), abi=self.lending_abi)
|
54
|
+
reserve_list = pool_contract.functions.getReservesList().call(block_identifier=block_number)
|
55
|
+
reserves_info = {}
|
56
|
+
for token in reserve_list:
|
57
|
+
token = token.lower()
|
58
|
+
reserve_data = pool_contract.functions.getReserveData(
|
59
|
+
_w3.to_checksum_address(token)).call(block_identifier=block_number)
|
60
|
+
reserves_info[token] = {}
|
61
|
+
reserves_info[token]["tToken"] = reserve_data[8].lower()
|
62
|
+
reserves_info[token]["sdToken"] = reserve_data[9].lower()
|
63
|
+
reserves_info[token]["dToken"] = reserve_data[10].lower()
|
64
|
+
|
65
|
+
risk_param = bin(reserve_data[0][0])[2:]
|
66
|
+
reserves_info[token]["loanToValue"] = int(risk_param[-15:], 2) / 10 ** 4
|
67
|
+
reserves_info[token]["liquidationThreshold"] = int(risk_param[-31:-16], 2) / 10 ** 4
|
68
|
+
|
69
|
+
return reserves_info
|
70
|
+
|
71
|
+
# CALCULATE APY LENDING POOL
|
72
|
+
def get_reserve_tokens_metadata(
|
73
|
+
self,
|
74
|
+
decoded_data: dict,
|
75
|
+
reserves_info: dict,
|
76
|
+
block_number: int = "latest"
|
77
|
+
):
|
78
|
+
reserve_tokens_info = []
|
79
|
+
for token_address, reserve_info in reserves_info.items():
|
80
|
+
get_reserve_data_call_id = f'getReserveData_{self.name}_{token_address}_{block_number}'.lower()
|
81
|
+
reserve_data = decoded_data.get(get_reserve_data_call_id)
|
82
|
+
atoken = reserve_data[8].lower()
|
83
|
+
debt_token = reserve_data[10].lower()
|
84
|
+
decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
|
85
|
+
atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
|
86
|
+
debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
|
87
|
+
sdebt_token = reserve_data[9].lower()
|
88
|
+
|
89
|
+
|
90
|
+
data = {
|
91
|
+
'underlying': token_address,
|
92
|
+
'underlying_decimals': decoded_data.get(decimals_call_id),
|
93
|
+
'a_token_supply': decoded_data.get(atoken_total_supply_key),
|
94
|
+
'd_token_supply': decoded_data.get(debt_token_total_supply_key),
|
95
|
+
|
96
|
+
'supply_apy': reserve_data[2],
|
97
|
+
'borrow_apy': reserve_data[4],
|
98
|
+
|
99
|
+
}
|
100
|
+
if sdebt_token != NATIVE_TOKEN:
|
101
|
+
sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
|
102
|
+
data['sd_token_supply'] = decoded_data.get(sdebt_token_total_supply_key)
|
103
|
+
data['stable_borrow_apy'] = reserve_data[5]
|
104
|
+
else:
|
105
|
+
data['sd_token_supply'] = 0
|
106
|
+
data['stable_borrow_apy'] = 0
|
107
|
+
|
108
|
+
reserve_tokens_info.append(data)
|
109
|
+
|
110
|
+
return reserve_tokens_info
|
111
|
+
|
112
|
+
def get_apy_lending_pool_function_info_deprecated(
|
113
|
+
self,
|
114
|
+
reserves_info: dict,
|
115
|
+
block_number: int = "latest",
|
116
|
+
):
|
117
|
+
rpc_calls = {}
|
118
|
+
reward_tokens = self.pool_info.get("rewardTokensList")
|
119
|
+
for token_address, value in reserves_info.items():
|
120
|
+
reserve_key = f"getReserveData_{self.name}_{token_address}_{block_number}".lower()
|
121
|
+
atoken_total_supply_key = f'totalSupply_{value["tToken"]}_{block_number}'.lower()
|
122
|
+
debt_token_total_supply_key = f'totalSupply_{value["dToken"]}_{block_number}'.lower()
|
123
|
+
decimals_key = f"decimals_{token_address}_{block_number}".lower()
|
124
|
+
for reward_token in reward_tokens:
|
125
|
+
atoken_assets_key = f"getRewardsData_{value['tToken']}_{reward_token}_{block_number}".lower()
|
126
|
+
debt_token_assets_key = f"getRewardsData_{value['dToken']}_{reward_token}_{block_number}".lower()
|
127
|
+
rpc_calls[atoken_assets_key] = self.get_function_incentive_info(
|
128
|
+
"getRewardsData", [value['tToken'], reward_token], block_number)
|
129
|
+
rpc_calls[debt_token_assets_key] = self.get_function_incentive_info(
|
130
|
+
"getRewardsData", [value['dToken'], reward_token], block_number)
|
131
|
+
if value['sdToken'] != NATIVE_TOKEN:
|
132
|
+
sdebt_token_assets_key = f"getRewardsData_{value['sdToken']}_{reward_token}_{block_number}".lower()
|
133
|
+
rpc_calls[sdebt_token_assets_key] = self.get_function_incentive_info(
|
134
|
+
"getRewardsData", [value['sdToken'], reward_token], block_number)
|
135
|
+
|
136
|
+
rpc_calls[reserve_key] = self.get_function_lending_pool_info("getReserveData", [token_address])
|
137
|
+
rpc_calls[atoken_total_supply_key] = self.state_service.get_function_info(
|
138
|
+
value["tToken"], ERC20_ABI, "totalSupply", block_number=block_number)
|
139
|
+
rpc_calls[debt_token_total_supply_key] = self.state_service.get_function_info(
|
140
|
+
value["dToken"], ERC20_ABI, "totalSupply", block_number=block_number)
|
141
|
+
rpc_calls[decimals_key] = self.state_service.get_function_info(
|
142
|
+
token_address, ERC20_ABI, "decimals", block_number=block_number)
|
143
|
+
|
144
|
+
if value['sdToken'] != NATIVE_TOKEN:
|
145
|
+
sdebt_token_total_supply_key = f'totalSupply_{value["sdToken"]}_{block_number}'.lower()
|
146
|
+
rpc_calls[sdebt_token_total_supply_key] = self.state_service.get_function_info(
|
147
|
+
value["sdToken"], ERC20_ABI, "totalSupply", block_number=block_number)
|
148
|
+
|
149
|
+
return rpc_calls
|
150
|
+
|
151
|
+
def get_apy_lending_pool_deprecated(
|
152
|
+
self,
|
153
|
+
atokens: dict,
|
154
|
+
debt_tokens: dict,
|
155
|
+
decimals: dict,
|
156
|
+
reserves_info: dict,
|
157
|
+
asset_data_tokens: dict,
|
158
|
+
total_supply_tokens: dict,
|
159
|
+
interest_rate: dict,
|
160
|
+
token_prices: dict,
|
161
|
+
pool_token_price: float,
|
162
|
+
pool_decimals: int = 18,
|
163
|
+
):
|
164
|
+
reward_tokens = self.pool_info.get("rewardTokensList")
|
165
|
+
for token_address in reserves_info:
|
166
|
+
atoken = atokens.get(token_address)
|
167
|
+
debt_token = debt_tokens.get(token_address)
|
168
|
+
decimal = decimals.get(token_address)
|
169
|
+
total_supply_t = total_supply_tokens.get(atoken, 0)
|
170
|
+
total_supply_d = total_supply_tokens.get(debt_token, 0)
|
171
|
+
# update deposit, borrow apy
|
172
|
+
total_supply_t = total_supply_t / 10 ** decimal
|
173
|
+
total_supply_d = total_supply_d / 10 ** decimal
|
174
|
+
token_price = token_prices.get(token_address)
|
175
|
+
interest_rate[token_address].update({
|
176
|
+
"utilization": total_supply_d / total_supply_t,
|
177
|
+
})
|
178
|
+
total_supply_t_in_usd = total_supply_t * token_price
|
179
|
+
total_supply_d_in_usd = total_supply_d * token_price
|
180
|
+
if reward_tokens:
|
181
|
+
interest_rate[token_address][DBConst.reward_deposit_apy] = {}
|
182
|
+
interest_rate[token_address][DBConst.reward_borrow_apy] = {}
|
183
|
+
asset_data_t = asset_data_tokens.get(atoken)
|
184
|
+
asset_data_d = asset_data_tokens.get(debt_token)
|
185
|
+
# update deposit, borrow apy
|
186
|
+
for reward_address in reward_tokens:
|
187
|
+
eps_t = asset_data_t[reward_address][1] / 10 ** 18
|
188
|
+
eps_d = asset_data_d[reward_address][1] / 10 ** 18
|
189
|
+
if total_supply_t:
|
190
|
+
deposit_apr = eps_t * TimeConstants.A_YEAR * pool_token_price / (
|
191
|
+
total_supply_t * token_price)
|
192
|
+
else:
|
193
|
+
deposit_apr = 0
|
194
|
+
if total_supply_d:
|
195
|
+
borrow_apr = eps_d * TimeConstants.A_YEAR * pool_token_price / (
|
196
|
+
total_supply_d * token_price)
|
197
|
+
else:
|
198
|
+
borrow_apr = 0
|
199
|
+
interest_rate[token_address][DBConst.reward_deposit_apy].update({
|
200
|
+
DBConst.reward_borrow_apy: deposit_apr}
|
201
|
+
)
|
202
|
+
interest_rate[token_address][DBConst.reward_borrow_apy].update({
|
203
|
+
reward_address: borrow_apr}
|
204
|
+
)
|
205
|
+
# update liquidity
|
206
|
+
liquidity_log = {
|
207
|
+
'total_borrow': {
|
208
|
+
DBConst.amount: total_supply_d,
|
209
|
+
DBConst.value_in_usd: total_supply_d_in_usd},
|
210
|
+
'total_deposit': {
|
211
|
+
DBConst.amount: total_supply_t,
|
212
|
+
DBConst.value_in_usd: total_supply_t_in_usd}
|
213
|
+
}
|
214
|
+
interest_rate[token_address].update({DBConst.liquidity_change_logs: liquidity_log})
|
215
|
+
|
216
|
+
return interest_rate
|
217
|
+
|
218
|
+
def calculate_apy_lending_pool_function_call_deprecated(
|
219
|
+
self,
|
220
|
+
reserves_info: dict,
|
221
|
+
decoded_data: dict,
|
222
|
+
token_prices: dict,
|
223
|
+
pool_token_price: float,
|
224
|
+
pool_decimals: int = 18,
|
225
|
+
block_number: int = 'latest',
|
226
|
+
):
|
227
|
+
reserves_data = {}
|
228
|
+
for token in reserves_info:
|
229
|
+
get_reserve_data_call_id = f'getReserveData_{self.name}_{token}_{block_number}'.lower()
|
230
|
+
reserves_data[token.lower()] = decoded_data.get(get_reserve_data_call_id)
|
231
|
+
reward_tokens = self.pool_info.get("rewardTokensList")
|
232
|
+
interest_rate, atokens, debt_tokens, sdebt_tokens, decimals, asset_data_tokens = {}, {}, {}, {}, {}, {}
|
233
|
+
total_supply_tokens = {}
|
234
|
+
for token_address in reserves_info:
|
235
|
+
lower_address = token_address.lower()
|
236
|
+
reserve_data = reserves_data[lower_address]
|
237
|
+
interest_rate[lower_address] = {
|
238
|
+
'deposit_apy': float(reserve_data[3]) / 10 ** 27,
|
239
|
+
'borrow_apy': float(reserve_data[4]) / 10 ** 27,
|
240
|
+
'stable_borrow_apy': float(reserve_data[5]) / 10 ** 27}
|
241
|
+
atoken = reserve_data[7].lower()
|
242
|
+
sdebt_token = reserve_data[8].lower()
|
243
|
+
debt_token = reserve_data[9].lower()
|
244
|
+
decimals_call_id = f"decimals_{token_address}_{block_number}".lower()
|
245
|
+
atoken_total_supply_key = f'totalSupply_{atoken}_{block_number}'.lower()
|
246
|
+
debt_token_total_supply_key = f'totalSupply_{debt_token}_{block_number}'.lower()
|
247
|
+
asset_data_tokens[atoken] = {}
|
248
|
+
asset_data_tokens[debt_token] = {}
|
249
|
+
if sdebt_token != NATIVE_TOKEN:
|
250
|
+
asset_data_tokens[sdebt_token] = {}
|
251
|
+
|
252
|
+
total_supply_tokens[atoken] = {}
|
253
|
+
for reward_token in reward_tokens:
|
254
|
+
atoken_assets_key = f"getRewardsData_{atoken}_{reward_token}_{block_number}".lower()
|
255
|
+
debt_token_assets_key = f"getRewardsData_{debt_token}_{reward_token}_{block_number}".lower()
|
256
|
+
asset_data_tokens[atoken][reward_token] = decoded_data.get(atoken_assets_key)
|
257
|
+
asset_data_tokens[debt_token][reward_token] = decoded_data.get(debt_token_assets_key)
|
258
|
+
total_supply_tokens[atoken][reward_token] = decoded_data.get(atoken_total_supply_key)
|
259
|
+
if sdebt_token != NATIVE_TOKEN:
|
260
|
+
sdebt_token_assets_key = f"getRewardsData_{sdebt_tokens}_{reward_token}_{block_number}".lower()
|
261
|
+
asset_data_tokens[sdebt_token][reward_token] = decoded_data.get(sdebt_token_assets_key)
|
262
|
+
|
263
|
+
atokens[lower_address] = atoken
|
264
|
+
debt_tokens[lower_address] = debt_token
|
265
|
+
sdebt_tokens[lower_address] = sdebt_token
|
266
|
+
decimals[lower_address] = decoded_data.get(decimals_call_id)
|
267
|
+
total_supply_tokens[debt_token] = decoded_data.get(debt_token_total_supply_key)
|
268
|
+
if sdebt_token != NATIVE_TOKEN:
|
269
|
+
sdebt_token_total_supply_key = f'totalSupply_{sdebt_token}_{block_number}'.lower()
|
270
|
+
total_supply_tokens[sdebt_token] = decoded_data.get(sdebt_token_total_supply_key)
|
271
|
+
|
272
|
+
asset_price_key = f"getAssetsPrices_{self.name}_{block_number}".lower()
|
273
|
+
if not token_prices and asset_price_key in decoded_data:
|
274
|
+
token_prices = {}
|
275
|
+
prices = decoded_data.get(asset_price_key)
|
276
|
+
for pos in range(len(reserves_info.keys())):
|
277
|
+
token_prices[reserves_info[pos].lower()] = prices[pos] / 10 ** pool_decimals
|
278
|
+
|
279
|
+
data = self.get_apy_lending_pool_deprecated(
|
280
|
+
atokens, debt_tokens, decimals, reserves_info, asset_data_tokens, total_supply_tokens, interest_rate,
|
281
|
+
token_prices, pool_token_price, pool_decimals
|
282
|
+
)
|
283
|
+
|
284
|
+
return data
|
285
|
+
|
286
|
+
# REWARDS BALANCE
|
287
|
+
def get_rewards_balance_function_info(
|
288
|
+
self,
|
289
|
+
wallet,
|
290
|
+
reserves_info: dict = None,
|
291
|
+
block_number: int = "latest"
|
292
|
+
):
|
293
|
+
rpc_calls = {}
|
294
|
+
reward_tokens = self.pool_info.get("rewardTokensList")
|
295
|
+
for reward_token in reward_tokens:
|
296
|
+
decimals_call_id = f"decimals_{reward_token}_{block_number}".lower()
|
297
|
+
rpc_calls[decimals_call_id] = self.state_service.get_function_info(
|
298
|
+
reward_token, ERC20_ABI, "decimals", block_number=block_number)
|
299
|
+
tokens = []
|
300
|
+
for key, value in reserves_info.items():
|
301
|
+
tokens += [Web3.to_checksum_address(value["tToken"]), Web3.to_checksum_address(value["dToken"])]
|
302
|
+
key = f"getAllUserRewards_{self.name}_{wallet}_{block_number}".lower()
|
303
|
+
rpc_calls[key] = self.get_function_incentive_info("getAllUserRewards", [tokens, Web3.to_checksum_address(wallet)], block_number)
|
304
|
+
return rpc_calls
|
305
|
+
|
306
|
+
def calculate_rewards_balance(
|
307
|
+
self, wallet: str, reserves_info: dict, decoded_data: dict, block_number: int = "latest"):
|
308
|
+
key = f"getAllUserRewards_{self.name}_{wallet}_{block_number}".lower()
|
309
|
+
rewards = decoded_data.get(key)
|
310
|
+
result = dict(zip(*rewards))
|
311
|
+
for key, value in result.items():
|
312
|
+
decimals_call_id = f"decimals_{key}_{block_number}".lower()
|
313
|
+
value /= 10 ** decoded_data.get(decimals_call_id, 18)
|
314
|
+
result[key] = {"amount": value}
|
315
|
+
return result
|
@@ -1,6 +1,6 @@
|
|
1
1
|
AAVE_V3_ARB = {
|
2
2
|
"address": "0x794a61358d6845594f94dc1db02a252b5b4814ad",
|
3
|
-
"name": "
|
3
|
+
"name": "AAVE Lending Pool",
|
4
4
|
"stakedIncentiveAddress": '0x929ec64c34a17401f460460d4b9390518e5b473e',
|
5
5
|
"oracleAddress": "0xb56c2F0B653B2e0b10C9b928C8580Ac5Df02C7C7",
|
6
6
|
"rewardTokensList": [],
|
@@ -37,23 +37,113 @@ COMPOUND_V3_ARBITRUM = {
|
|
37
37
|
"assets": {
|
38
38
|
"0x912ce59144191c1204e64559fe8253a0e49e6548": {
|
39
39
|
"priceFeed": "0xb2a824043730fe05f3da2efafa1cbbe83fa548d6",
|
40
|
-
"loanToValue": 0.
|
41
|
-
"liquidationThreshold": 0.
|
40
|
+
"loanToValue": 0.7,
|
41
|
+
"liquidationThreshold": 0.8
|
42
42
|
},
|
43
43
|
"0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a": {
|
44
44
|
"priceFeed": "0xdb98056fecfff59d032ab628337a4887110df3db",
|
45
|
-
"loanToValue": 0.
|
46
|
-
"liquidationThreshold": 0.
|
45
|
+
"loanToValue": 0.6,
|
46
|
+
"liquidationThreshold": 0.75
|
47
47
|
},
|
48
48
|
"0x82af49447d8a07e3bd95bd0d56f35241523fbab1": {
|
49
49
|
"priceFeed": "0x639fe6ab55c921f74e7fac1ee960c0b6293ba612",
|
50
|
-
"loanToValue": 0.
|
50
|
+
"loanToValue": 0.83,
|
51
|
+
"liquidationThreshold": 0.9
|
52
|
+
},
|
53
|
+
"0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f": {
|
54
|
+
"priceFeed": "0xd0c7101eacbb49f3decccc166d238410d6d46d57",
|
55
|
+
"loanToValue": 0.75,
|
56
|
+
"liquidationThreshold": 0.85
|
57
|
+
},
|
58
|
+
"0x5979d7b546e38e414f7e9822514be443a4800529": {
|
59
|
+
"priceFeed": "0xe165155c34fe4cbfc55fc554437907bdb1af7e3e",
|
60
|
+
"loanToValue": 0.8,
|
61
|
+
"liquidationThreshold": 0.85
|
62
|
+
},
|
63
|
+
"0x2416092f143378750bb29b79ed961ab195cceea5": {
|
64
|
+
"priceFeed": "0xc49399814452b41da8a7cd76a159f5515cb3e493",
|
65
|
+
"loanToValue": 0.8,
|
66
|
+
"liquidationThreshold": 0.85
|
67
|
+
},
|
68
|
+
"0x57f5e098cad7a3d1eed53991d4d66c45c9af7812": {
|
69
|
+
"priceFeed": "0x13cdfb7db5e2f58e122b2e789b59de13645349c4",
|
70
|
+
"loanToValue": 0.88,
|
71
|
+
"liquidationThreshold": 0.9
|
72
|
+
}
|
73
|
+
}
|
74
|
+
},
|
75
|
+
"0x82af49447d8a07e3bd95bd0d56f35241523fbab1": {
|
76
|
+
"comet": "0x6f7d514bbd4aff3bcd1140b7344b32f063dee486",
|
77
|
+
"assets": {
|
78
|
+
"0x35751007a407ca6feffe80b3cb397736d2cf4dbe": {
|
79
|
+
"priceFeed": "0xd3cf278f135d9831d2bf28f6672a4575906ca724",
|
80
|
+
"loanToValue": 0.9,
|
81
|
+
"liquidationThreshold": 0.93
|
82
|
+
},
|
83
|
+
"0xec70dcb4a1efa46b8f2d97c310c9c4790ba5ffa8": {
|
84
|
+
"priceFeed": "0x970ffd8e335b8fa4cd5c869c7cac3a90671d5dc3",
|
85
|
+
"loanToValue": 0.9,
|
86
|
+
"liquidationThreshold": 0.93
|
87
|
+
},
|
88
|
+
"0x5979d7b546e38e414f7e9822514be443a4800529": {
|
89
|
+
"priceFeed": "0x6c987dde50db1dcdd32cd4175778c2a291978e2a",
|
90
|
+
"loanToValue": 0.88,
|
91
|
+
"liquidationThreshold": 0.93
|
92
|
+
},
|
93
|
+
"0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f": {
|
94
|
+
"priceFeed": "0xfa454de61b317b6535a0c462267208e8fdb89f45",
|
95
|
+
"loanToValue": 0.8,
|
96
|
+
"liquidationThreshold": 0.85
|
97
|
+
},
|
98
|
+
"0x4186bfc76e2e237523cbc30fd220fe055156b41f": {
|
99
|
+
"priceFeed": "0x3870fac3de911c12a57e5a2532d15ad8ca275a60",
|
100
|
+
"loanToValue": 0.88,
|
101
|
+
"liquidationThreshold": 0.91
|
102
|
+
},
|
103
|
+
"0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9": {
|
104
|
+
"priceFeed": "0x84e93ec6170ed630f5ebd89a1aae72d4f63f2713",
|
105
|
+
"loanToValue": 0.8,
|
106
|
+
"liquidationThreshold": 0.85
|
107
|
+
},
|
108
|
+
"0xaf88d065e77c8cc2239327c5edb3a432268e5831": {
|
109
|
+
"priceFeed": "0x443ea0340cb75a160f31a440722dec7b5bc3c2e9",
|
110
|
+
"loanToValue": 0.8,
|
111
|
+
"liquidationThreshold": 0.85
|
112
|
+
},
|
113
|
+
"0x2416092f143378750bb29b79ed961ab195cceea5": {
|
114
|
+
"priceFeed": "0x72e9b6f907365d76c6192ad49c0c5ba356b7fa48",
|
115
|
+
"loanToValue": 0.88,
|
116
|
+
"liquidationThreshold": 0.91
|
117
|
+
}
|
118
|
+
}
|
119
|
+
},
|
120
|
+
"0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9": {
|
121
|
+
"comet": "0xd98be00b5d27fc98112bde293e487f8d4ca57d07",
|
122
|
+
"assets": {
|
123
|
+
"0x912ce59144191c1204e64559fe8253a0e49e6548": {
|
124
|
+
"priceFeed": "0xb2a824043730fe05f3da2efafa1cbbe83fa548d6",
|
125
|
+
"loanToValue": 0.7,
|
126
|
+
"liquidationThreshold": 0.8
|
127
|
+
},
|
128
|
+
"0x82af49447d8a07e3bd95bd0d56f35241523fbab1": {
|
129
|
+
"priceFeed": "0x639fe6ab55c921f74e7fac1ee960c0b6293ba612",
|
130
|
+
"loanToValue": 0.85,
|
131
|
+
"liquidationThreshold": 0.9
|
132
|
+
},
|
133
|
+
"0x5979d7b546e38e414f7e9822514be443a4800529": {
|
134
|
+
"priceFeed": "0xe165155c34fe4cbfc55fc554437907bdb1af7e3e",
|
135
|
+
"loanToValue": 0.8,
|
51
136
|
"liquidationThreshold": 0.85
|
52
137
|
},
|
53
138
|
"0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f": {
|
54
139
|
"priceFeed": "0xd0c7101eacbb49f3decccc166d238410d6d46d57",
|
55
140
|
"loanToValue": 0.7,
|
56
|
-
"liquidationThreshold": 0.
|
141
|
+
"liquidationThreshold": 0.8
|
142
|
+
},
|
143
|
+
"0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a": {
|
144
|
+
"priceFeed": "0xdb98056fecfff59d032ab628337a4887110df3db",
|
145
|
+
"loanToValue": 0.6,
|
146
|
+
"liquidationThreshold": 0.7
|
57
147
|
}
|
58
148
|
}
|
59
149
|
}
|