defi-state-querier 0.4.24__py3-none-any.whl → 0.4.26__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- defi_services/__init__.py +1 -1
- defi_services/jobs/processors/multi_state_processor.py +2 -2
- defi_services/jobs/processors/state_processor.py +2 -2
- defi_services/jobs/queriers/state_querier.py +4 -4
- defi_services/services/dex/dex_info/pancakeswap_info.py +10 -1
- defi_services/services/dex/pancakeswap_service.py +1 -1
- defi_services/services/dex/pancakeswap_v2_service.py +1 -1
- defi_services/services/dex/pancakeswap_v3_service.py +25 -7
- defi_services/services/dex/quickswap_v3_service.py +14 -4
- defi_services/services/dex/uniswap_v2_service.py +1 -1
- defi_services/services/dex/uniswap_v3_service.py +16 -7
- defi_services/services/lending/aave_v2_services.py +2 -2
- defi_services/services/lending/aave_v3_services.py +4 -4
- defi_services/services/lending/apeswap_services.py +3 -3
- defi_services/services/lending/compound_service.py +3 -3
- defi_services/services/lending/compound_v3_services.py +1 -1
- defi_services/services/lending/flux_services.py +3 -3
- defi_services/services/lending/granary_services.py +1 -1
- defi_services/services/lending/iron_bank_service.py +4 -4
- defi_services/services/lending/justlend_service.py +3 -3
- defi_services/services/lending/liqee_service.py +3 -3
- defi_services/services/lending/morpho_aave_v2_services.py +2 -2
- defi_services/services/lending/morpho_aave_v3_services.py +2 -2
- defi_services/services/lending/morpho_compound_services.py +5 -5
- defi_services/services/lending/onyx_service.py +4 -4
- defi_services/services/lending/silo_services.py +3 -3
- defi_services/services/lending/strike_service.py +3 -3
- defi_services/services/lending/trava_services.py +2 -2
- defi_services/services/lending/uwu_services.py +2 -2
- defi_services/services/lending/valas_services.py +1 -1
- defi_services/services/lending/venus_services.py +7 -7
- defi_services/services/lending/wepiggy_services.py +4 -4
- defi_services/utils/convert_address.py +2 -2
- {defi_state_querier-0.4.24.dist-info → defi_state_querier-0.4.26.dist-info}/METADATA +1 -1
- {defi_state_querier-0.4.24.dist-info → defi_state_querier-0.4.26.dist-info}/RECORD +38 -38
- {defi_state_querier-0.4.24.dist-info → defi_state_querier-0.4.26.dist-info}/LICENSE +0 -0
- {defi_state_querier-0.4.24.dist-info → defi_state_querier-0.4.26.dist-info}/WHEEL +0 -0
- {defi_state_querier-0.4.24.dist-info → defi_state_querier-0.4.26.dist-info}/top_level.txt +0 -0
defi_services/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.4.
|
1
|
+
__version__ = "0.4.26"
|
@@ -31,11 +31,11 @@ class MultiStateProcessor:
|
|
31
31
|
|
32
32
|
@staticmethod
|
33
33
|
def check_address(address):
|
34
|
-
return Web3.
|
34
|
+
return Web3.is_address(address)
|
35
35
|
|
36
36
|
@staticmethod
|
37
37
|
def checksum_address(address):
|
38
|
-
return Web3.
|
38
|
+
return Web3.to_checksum_address(address)
|
39
39
|
|
40
40
|
def init_rpc_call_information(
|
41
41
|
self, wallet: str, query_id: str, entity_id: str, query_type: str, block_number: int = 'latest', **kwargs):
|
@@ -39,11 +39,11 @@ class StateProcessor:
|
|
39
39
|
|
40
40
|
@staticmethod
|
41
41
|
def check_address(address):
|
42
|
-
return Web3.
|
42
|
+
return Web3.is_address(address)
|
43
43
|
|
44
44
|
@staticmethod
|
45
45
|
def checksum_address(address):
|
46
|
-
return Web3.
|
46
|
+
return Web3.to_checksum_address(address)
|
47
47
|
|
48
48
|
def init_rpc_call_information(
|
49
49
|
self, wallet: str, query_id: str, entity_id: str, query_type: str, block_number: int = 'latest', **kwargs):
|
@@ -112,7 +112,7 @@ class StateQuerier:
|
|
112
112
|
@staticmethod
|
113
113
|
def add_native_token_balance_rpc_call(
|
114
114
|
fn_paras: str = None, call_id: str = None, block_number: int = "latest"):
|
115
|
-
eth_call = GetBalance(Web3.
|
115
|
+
eth_call = GetBalance(Web3.to_checksum_address(fn_paras), block_number, call_id)
|
116
116
|
return eth_call
|
117
117
|
|
118
118
|
def add_rpc_call(self, abi: dict, fn_name: str, contract_address: str,
|
@@ -120,12 +120,12 @@ class StateQuerier:
|
|
120
120
|
args = []
|
121
121
|
if fn_paras:
|
122
122
|
for item in fn_paras:
|
123
|
-
if self._w3.
|
124
|
-
item = self._w3.
|
123
|
+
if self._w3.is_address(item):
|
124
|
+
item = self._w3.to_checksum_address(item)
|
125
125
|
args.append(item)
|
126
126
|
|
127
127
|
data_call = encode_eth_call_data(abi=abi, fn_name=fn_name, args=args)
|
128
|
-
eth_call = EthCall(to=self._w3.
|
128
|
+
eth_call = EthCall(to=self._w3.to_checksum_address(contract_address), block_number=block_number,
|
129
129
|
data=data_call, abi=abi, fn_name=fn_name, id=call_id)
|
130
130
|
return eth_call
|
131
131
|
|
@@ -6,6 +6,9 @@ from defi_services.abis.dex.pancakeswap.pancakeswap_v2_factory_abi import PANCAK
|
|
6
6
|
from defi_services.abis.dex.pancakeswap.v3_pool_abi import PANCAKESWAP_V3_POOL_ABI
|
7
7
|
|
8
8
|
PANCAKESWAP_V0_BSC_INFO = {
|
9
|
+
"project_id": "pancakeswap",
|
10
|
+
"chain_id": "0x1",
|
11
|
+
"router_address": "0xeff92a263d31888d860bd50809a8d171709b7b1c",
|
9
12
|
'master_chef_address': '0x73feaa1ee314f8c655e354234017be2193c9e24e',
|
10
13
|
"reward_token": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82",
|
11
14
|
'forked': 'uniswap-v2'
|
@@ -13,15 +16,20 @@ PANCAKESWAP_V0_BSC_INFO = {
|
|
13
16
|
}
|
14
17
|
|
15
18
|
PANCAKESWAP_V2_BSC_INFO = {
|
19
|
+
"project_id": "pancakeswap-amm",
|
20
|
+
"chain_id": "0x38",
|
16
21
|
'factory_address': '0xca143ce32fe78f1f7019d7d551a6402fc5350c73',
|
17
22
|
'master_chef_address': '0xa5f8c5dbd5f286960b9d90548680ae5ebff07652',
|
18
23
|
"reward_token": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82",
|
19
24
|
'factory_abi': PANCAKESWAP_V2_FACTORY_ABI,
|
20
25
|
'master_chef_abi': PANCAKESWAP_MASTERCHEF_V2_ABI,
|
21
|
-
'forked': 'uniswap-v2'
|
26
|
+
'forked': 'uniswap-v2',
|
27
|
+
"router_address": "0x10ed43c718714eb63d5aa57b78b54704e256024e",
|
22
28
|
}
|
23
29
|
|
24
30
|
PANCAKESWAP_V3_BSC_INFO = {
|
31
|
+
"project_id": "pancakeswap-v3",
|
32
|
+
"chain_id": "0x38",
|
25
33
|
'factory_address': '0x0bfbcf9fa4f9c56b0f40a671ad40e0805a091865',
|
26
34
|
'factory_abi': PANCAKESWAP_V3_FACTORY_ABI,
|
27
35
|
'master_chef_address': '0x556b9306565093c855aea9ae92a594704c2cd59e',
|
@@ -31,5 +39,6 @@ PANCAKESWAP_V3_BSC_INFO = {
|
|
31
39
|
'pool_abi': PANCAKESWAP_V3_POOL_ABI,
|
32
40
|
'forked': 'uniswap-v3',
|
33
41
|
"reward_token": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82",
|
42
|
+
'router_address': "0x13f4ea83d0bd40e75c8222255bc855a974568dd4"
|
34
43
|
|
35
44
|
}
|
@@ -38,7 +38,7 @@ class PancakeSwapServices(PancakeSwapV2Services):
|
|
38
38
|
masterchef_addr = self.pool_info.get('master_chef_address')
|
39
39
|
|
40
40
|
master_chef_contract = web3.eth.contract(abi=self.masterchef_abi,
|
41
|
-
address=web3.
|
41
|
+
address=web3.to_checksum_address(masterchef_addr))
|
42
42
|
pool_length = master_chef_contract.functions.poolLength().call()
|
43
43
|
|
44
44
|
rpc_calls = {}
|
@@ -42,7 +42,7 @@ class PancakeSwapV2Services(UniswapV2Services):
|
|
42
42
|
masterchef_addr = self.pool_info.get('master_chef_address')
|
43
43
|
|
44
44
|
master_chef_contract = web3.eth.contract(abi=self.masterchef_abi,
|
45
|
-
address=web3.
|
45
|
+
address=web3.to_checksum_address(masterchef_addr))
|
46
46
|
pool_length = master_chef_contract.functions.poolLength().call()
|
47
47
|
|
48
48
|
rpc_calls = {}
|
@@ -126,6 +126,10 @@ class PancakeSwapV3Service(UniswapV3Services):
|
|
126
126
|
query_id = f'decimals_{token_address}_{block_number}'.lower()
|
127
127
|
rpc_calls[query_id] = self.state_service.get_function_info(
|
128
128
|
address=token_address, abi=ERC20_ABI, fn_name="decimals", block_number=block_number)
|
129
|
+
query_id = f'{token_key}_{lp_token}_{block_number}'.lower()
|
130
|
+
rpc_calls[query_id] = self.state_service.get_function_info(
|
131
|
+
address=lp_token, abi=self.pool_info['pool_abi'], fn_name=token_key, fn_paras=None,
|
132
|
+
block_number=block_number)
|
129
133
|
|
130
134
|
return rpc_calls
|
131
135
|
|
@@ -133,15 +137,21 @@ class PancakeSwapV3Service(UniswapV3Services):
|
|
133
137
|
lp_token_info = supplied_data['lp_token_info']
|
134
138
|
for lp_token, value in lp_token_info.items():
|
135
139
|
slot0 = response_data.get(f"slot0_{lp_token}_{block_number}".lower())
|
136
|
-
price = (slot0[0] / 2 ** 96) ** 2
|
137
140
|
token0_address = value.get('token0')
|
138
141
|
token1_address = value.get('token1')
|
139
|
-
|
140
|
-
|
142
|
+
if token0_address == response_data.get(f'token0_{lp_token}_{block_number}'.lower()):
|
143
|
+
token0_decimals = response_data.get(f'decimals_{token0_address}_{block_number}'.lower())
|
144
|
+
token1_decimals = response_data.get(f'decimals_{token1_address}_{block_number}'.lower())
|
145
|
+
else:
|
146
|
+
token1_decimals = response_data.get(f'decimals_{token0_address}_{block_number}'.lower())
|
147
|
+
token0_decimals = response_data.get(f'decimals_{token1_address}_{block_number}'.lower())
|
148
|
+
price = (slot0[0] / 2 ** 96) ** 2 * 10 ** (token0_decimals - token1_decimals)
|
141
149
|
unstake_liquidity = response_data.get(f"liquidity_{lp_token}_{block_number}".lower())
|
142
150
|
tick_spacing = response_data.get(f'tickSpacing_{lp_token}_{block_number}'.lower())
|
143
151
|
|
144
152
|
lp_token_info[lp_token].update({
|
153
|
+
"token0": token0_address,
|
154
|
+
"token1": token1_address,
|
145
155
|
'liquidity_in_range': unstake_liquidity,
|
146
156
|
"price": price,
|
147
157
|
'tick': slot0[1],
|
@@ -174,9 +184,12 @@ class PancakeSwapV3Service(UniswapV3Services):
|
|
174
184
|
tick_upper = (tick // tick_spacing + 1) * tick_spacing
|
175
185
|
amount0, amount1 = get_token_amount_of_pool(liquidity=liquidity_in_range,
|
176
186
|
tick_lower=tick_lower, tick_upper=tick_upper)
|
187
|
+
# stake_amount0, stake_amount1 = get_token_amount_of_pool(liquidity=value.get("stake_liquidity"), tick_lower= tick_lower, tick_upper=tick_upper)
|
177
188
|
lp_token_info[lp_token].update({
|
178
189
|
'token0_amount_in_range': amount0 / 10 ** value.get('token0_decimals'),
|
179
|
-
'token1_amount_in_range': amount1 / 10 ** value.get('token1_decimals')
|
190
|
+
'token1_amount_in_range': amount1 / 10 ** value.get('token1_decimals'),
|
191
|
+
# 'token0_amount_stake': stake_amount0 / 10 ** value.get('token0_decimals'),
|
192
|
+
# 'token1_amount_stake': stake_amount1 / 10 ** value.get('token1_decimals')
|
180
193
|
})
|
181
194
|
|
182
195
|
return lp_token_info
|
@@ -253,6 +266,7 @@ class PancakeSwapV3Service(UniswapV3Services):
|
|
253
266
|
'tick_upper': master_chef_position[3],
|
254
267
|
'reward': master_chef_position[5] / 10 ** 18,
|
255
268
|
'farming_pid': master_chef_position[7],
|
269
|
+
'reward_token': self.pool_info['reward_token'],
|
256
270
|
'pending_cake': decoded_data.get(
|
257
271
|
f'pendingCake_{self.masterchef_addr}_{token_id}_{block_number}'.lower()) / 10 ** 18,
|
258
272
|
'fee_growth_inside0_x128': nft_position[8],
|
@@ -284,9 +298,13 @@ class PancakeSwapV3Service(UniswapV3Services):
|
|
284
298
|
block_number)
|
285
299
|
for token_id, value in user_data['stake_token'].items():
|
286
300
|
pid = value.get('farming_pid')
|
287
|
-
|
301
|
+
pool_info = decoded_data.get(f'poolInfo_{self.masterchef_addr}_{pid}_{block_number}'.lower())
|
302
|
+
lp_token_address = pool_info[1]
|
288
303
|
user_data['stake_token'][token_id].update({
|
289
|
-
'pool_address': lp_token_address
|
304
|
+
'pool_address': lp_token_address,
|
305
|
+
'token0': pool_info[2],
|
306
|
+
'token1': pool_info[3],
|
307
|
+
'fee': pool_info[4]
|
290
308
|
})
|
291
309
|
liquidity = value.get('liquidity')
|
292
310
|
token0_decimals = lp_token_info.get(lp_token_address, {}).get("token0_decimals")
|
@@ -296,7 +314,7 @@ class PancakeSwapV3Service(UniswapV3Services):
|
|
296
314
|
tick_lower = value.get('tick_lower')
|
297
315
|
tick_upper = value.get('tick_upper')
|
298
316
|
if price and tick:
|
299
|
-
sqrt_price_x96 = math.sqrt(price) * 2 ** 96
|
317
|
+
sqrt_price_x96 = (math.sqrt(price / 10 ** (token0_decimals - token1_decimals))) * 2 ** 96
|
300
318
|
token0_amount, token1_amount = get_token_amount_of_user(liquidity=liquidity,
|
301
319
|
sqrt_price_x96=sqrt_price_x96,
|
302
320
|
tick=tick, tick_upper=tick_upper,
|
@@ -86,6 +86,10 @@ class QuickSwapV3Services(UniswapV3Services):
|
|
86
86
|
query_id = f'decimals_{token_address}_{block_number}'.lower()
|
87
87
|
rpc_calls[query_id] = self.state_service.get_function_info(
|
88
88
|
address=token_address, abi=ERC20_ABI, fn_name="decimals", block_number=block_number)
|
89
|
+
query_id = f'{token_key}_{lp_token}_{block_number}'.lower()
|
90
|
+
rpc_calls[query_id] = self.state_service.get_function_info(
|
91
|
+
address=lp_token, abi=self.pool_info['pool_abi'], fn_name=token_key, fn_paras=None,
|
92
|
+
block_number=block_number)
|
89
93
|
|
90
94
|
return rpc_calls
|
91
95
|
|
@@ -94,14 +98,20 @@ class QuickSwapV3Services(UniswapV3Services):
|
|
94
98
|
for lp_token, value in lp_token_info.items():
|
95
99
|
liquidity_in_range = response_data.get(f'liquidity_{lp_token}_{block_number}'.lower(), 0)
|
96
100
|
slot0 = response_data.get(f"globalState_{lp_token}_{block_number}".lower())
|
97
|
-
price = (slot0[0] / 2 ** 96) ** 2
|
98
101
|
token0_address = value.get('token0')
|
99
102
|
token1_address = value.get('token1')
|
100
|
-
|
101
|
-
|
103
|
+
if token0_address == response_data.get(f'token0_{lp_token}_{block_number}'.lower()):
|
104
|
+
token0_decimals = response_data.get(f'decimals_{token0_address}_{block_number}'.lower())
|
105
|
+
token1_decimals = response_data.get(f'decimals_{token1_address}_{block_number}'.lower())
|
106
|
+
else:
|
107
|
+
token1_decimals = response_data.get(f'decimals_{token0_address}_{block_number}'.lower())
|
108
|
+
token0_decimals = response_data.get(f'decimals_{token1_address}_{block_number}'.lower())
|
109
|
+
price = (slot0[0] / 2 ** 96) ** 2 * 10 ** (token0_decimals - token1_decimals)
|
102
110
|
tick_spacing = response_data.get(f'tickSpacing_{lp_token}_{block_number}'.lower())
|
103
111
|
|
104
112
|
lp_token_info[lp_token].update({
|
113
|
+
"token0": token0_address,
|
114
|
+
"token1": token1_address,
|
105
115
|
"liquidity_in_range": liquidity_in_range,
|
106
116
|
"price": price,
|
107
117
|
'tick': slot0[1],
|
@@ -213,4 +223,4 @@ class QuickSwapV3Services(UniswapV3Services):
|
|
213
223
|
'token1_reward': token1_reward
|
214
224
|
})
|
215
225
|
|
216
|
-
return user_data
|
226
|
+
return user_data
|
@@ -41,7 +41,7 @@ class UniswapV2Services(DexProtocolServices):
|
|
41
41
|
factory_addr = self.pool_info.get('factory_address')
|
42
42
|
|
43
43
|
factory_contract = web3.eth.contract(
|
44
|
-
address=web3.
|
44
|
+
address=web3.to_checksum_address(factory_addr), abi=self.factory_abi)
|
45
45
|
pool_length = factory_contract.functions.allPairsLength().call()
|
46
46
|
|
47
47
|
rpc_calls = {}
|
@@ -98,6 +98,10 @@ class UniswapV3Services(DexProtocolServices):
|
|
98
98
|
query_id = f'decimals_{token_address}_{block_number}'.lower()
|
99
99
|
rpc_calls[query_id] = self.state_service.get_function_info(
|
100
100
|
address=token_address, abi=ERC20_ABI, fn_name="decimals", block_number=block_number)
|
101
|
+
query_id = f'{token_key}_{lp_token}_{block_number}'.lower()
|
102
|
+
rpc_calls[query_id] = self.state_service.get_function_info(
|
103
|
+
address=lp_token, abi=self.pool_info['pool_abi'], fn_name=token_key, fn_paras=None,
|
104
|
+
block_number=block_number)
|
101
105
|
|
102
106
|
return rpc_calls
|
103
107
|
|
@@ -106,14 +110,19 @@ class UniswapV3Services(DexProtocolServices):
|
|
106
110
|
for lp_token, value in lp_token_info.items():
|
107
111
|
liquidity_in_range = response_data.get(f'liquidity_{lp_token}_{block_number}'.lower(), 0)
|
108
112
|
slot0 = response_data.get(f"slot0_{lp_token}_{block_number}".lower())
|
109
|
-
price = (slot0[0] / 2 ** 96) ** 2
|
110
113
|
token0_address = value.get('token0')
|
111
114
|
token1_address = value.get('token1')
|
112
|
-
|
113
|
-
|
115
|
+
if token0_address == response_data.get(f'token0_{lp_token}_{block_number}'.lower()):
|
116
|
+
token0_decimals = response_data.get(f'decimals_{token0_address}_{block_number}'.lower())
|
117
|
+
token1_decimals = response_data.get(f'decimals_{token1_address}_{block_number}'.lower())
|
118
|
+
else:
|
119
|
+
token1_decimals = response_data.get(f'decimals_{token0_address}_{block_number}'.lower())
|
120
|
+
token0_decimals = response_data.get(f'decimals_{token1_address}_{block_number}'.lower())
|
121
|
+
price = (slot0[0] / 2 ** 96) ** 2 * 10 ** (token0_decimals - token1_decimals)
|
114
122
|
tick_spacing = response_data.get(f'tickSpacing_{lp_token}_{block_number}'.lower())
|
115
|
-
|
116
123
|
lp_token_info[lp_token].update({
|
124
|
+
"token0": token0_address,
|
125
|
+
"token1": token1_address,
|
117
126
|
"liquidity_in_range": liquidity_in_range,
|
118
127
|
"price": price,
|
119
128
|
'tick': slot0[1],
|
@@ -272,7 +281,7 @@ class UniswapV3Services(DexProtocolServices):
|
|
272
281
|
tick_upper = value.get('tick_upper')
|
273
282
|
tick_lower = value.get('tick_lower')
|
274
283
|
if price and tick:
|
275
|
-
sqrt_price_x96 = (math.sqrt(price)) * 2 ** 96
|
284
|
+
sqrt_price_x96 = (math.sqrt(price / 10 ** (token0_decimals - token1_decimals))) * 2 ** 96
|
276
285
|
|
277
286
|
token0_amount, token1_amount = get_token_amount_of_user(
|
278
287
|
liquidity=liquidity,
|
@@ -352,6 +361,6 @@ class UniswapV3Services(DexProtocolServices):
|
|
352
361
|
return user_data
|
353
362
|
|
354
363
|
def checksum_address(self, address):
|
355
|
-
if self.
|
356
|
-
address = self.web3.
|
364
|
+
if self.Web3.is_address(address):
|
365
|
+
address = self.web3.to_checksum_address(address)
|
357
366
|
return address
|
@@ -54,7 +54,7 @@ class AaveV2StateService(ProtocolServices):
|
|
54
54
|
def get_dapp_asset_info(self, block_number: int = 'latest'):
|
55
55
|
begin = time.time()
|
56
56
|
_w3 = self.state_service.get_w3()
|
57
|
-
pool_address = Web3.
|
57
|
+
pool_address = Web3.to_checksum_address(self.pool_info['address'])
|
58
58
|
contract = _w3.eth.contract(address=pool_address, abi=self.lending_abi)
|
59
59
|
reserves_list = contract.functions.getReservesList().call(block_identifier=block_number)
|
60
60
|
reserves_info = {}
|
@@ -430,7 +430,7 @@ class AaveV2StateService(ProtocolServices):
|
|
430
430
|
rpc_calls = {}
|
431
431
|
tokens = []
|
432
432
|
for token, value in reserves_info.items():
|
433
|
-
atoken, debt_token = Web3.
|
433
|
+
atoken, debt_token = Web3.to_checksum_address(value['tToken']), Web3.to_checksum_address(value['dToken'])
|
434
434
|
tokens += [atoken, debt_token]
|
435
435
|
key = f"getRewardsBalance_{self.name}_{wallet}_{block_number}".lower()
|
436
436
|
rpc_calls[key] = self.get_function_incentive_info(
|
@@ -59,13 +59,13 @@ class AaveV3StateService(AaveV2StateService):
|
|
59
59
|
def get_dapp_asset_info(self, block_number: int = 'latest'):
|
60
60
|
_w3 = self.state_service.get_w3()
|
61
61
|
pool_address = self.pool_info.get("address")
|
62
|
-
pool_contract = _w3.eth.contract(address=_w3.
|
62
|
+
pool_contract = _w3.eth.contract(address=_w3.to_checksum_address(pool_address), abi=self.lending_abi)
|
63
63
|
reserve_list = pool_contract.functions.getReservesList().call(block_identifier=block_number)
|
64
64
|
reserves_info = {}
|
65
65
|
for token in reserve_list:
|
66
66
|
token = token.lower()
|
67
67
|
reserve_data = pool_contract.functions.getReserveData(
|
68
|
-
_w3.
|
68
|
+
_w3.to_checksum_address(token)).call(block_identifier=block_number)
|
69
69
|
reserves_info[token] = {}
|
70
70
|
reserves_info[token]["tToken"] = reserve_data[8].lower()
|
71
71
|
reserves_info[token]["sdToken"] = reserve_data[9].lower()
|
@@ -293,9 +293,9 @@ class AaveV3StateService(AaveV2StateService):
|
|
293
293
|
reward_token, ERC20_ABI, "decimals", block_number=block_number)
|
294
294
|
tokens = []
|
295
295
|
for key, value in reserves_info.items():
|
296
|
-
tokens += [Web3.
|
296
|
+
tokens += [Web3.to_checksum_address(value["tToken"]), Web3.to_checksum_address(value["dToken"])]
|
297
297
|
key = f"getAllUserRewards_{self.name}_{wallet}_{block_number}".lower()
|
298
|
-
rpc_calls[key] = self.get_function_incentive_info("getAllUserRewards", [tokens, Web3.
|
298
|
+
rpc_calls[key] = self.get_function_incentive_info("getAllUserRewards", [tokens, Web3.to_checksum_address(wallet)], block_number)
|
299
299
|
return rpc_calls
|
300
300
|
|
301
301
|
def calculate_rewards_balance(
|
@@ -43,7 +43,7 @@ class ApeSwapStateService(CompoundStateService):
|
|
43
43
|
block_number: int = "latest"):
|
44
44
|
_w3 = self.state_service.get_w3()
|
45
45
|
comptroller_contract = _w3.eth.contract(
|
46
|
-
address=_w3.
|
46
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
47
47
|
ctokens = []
|
48
48
|
for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
|
49
49
|
# if token in [ContractAddresses.LUNA.lower(), ContractAddresses.UST.lower(), ContractAddresses.LUNA,
|
@@ -52,9 +52,9 @@ class ApeSwapStateService(CompoundStateService):
|
|
52
52
|
ctokens.append(token)
|
53
53
|
|
54
54
|
lens_contract = _w3.eth.contract(
|
55
|
-
address=Web3.
|
55
|
+
address=Web3.to_checksum_address(self.pool_info.get("lensAddress")), abi=self.lens_abi
|
56
56
|
)
|
57
|
-
tokens = [Web3.
|
57
|
+
tokens = [Web3.to_checksum_address(i) for i in ctokens]
|
58
58
|
metadata = lens_contract.functions.cTokenMetadataAll(tokens).call(block_identifier=block_number)
|
59
59
|
reserves_info = {}
|
60
60
|
for data in metadata:
|
@@ -50,7 +50,7 @@ class CompoundStateService(ProtocolServices):
|
|
50
50
|
block_number: int = "latest"):
|
51
51
|
_w3 = self.state_service.get_w3()
|
52
52
|
comptroller_contract = _w3.eth.contract(
|
53
|
-
address=_w3.
|
53
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
54
54
|
ctokens = []
|
55
55
|
for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
|
56
56
|
# if token in [ContractAddresses.LUNA.lower(), ContractAddresses.UST.lower(), ContractAddresses.LUNA,
|
@@ -59,9 +59,9 @@ class CompoundStateService(ProtocolServices):
|
|
59
59
|
ctokens.append(token)
|
60
60
|
|
61
61
|
lens_contract = _w3.eth.contract(
|
62
|
-
address=Web3.
|
62
|
+
address=Web3.to_checksum_address(self.pool_info.get("lensAddress")), abi=self.lens_abi
|
63
63
|
)
|
64
|
-
tokens = [Web3.
|
64
|
+
tokens = [Web3.to_checksum_address(i) for i in ctokens]
|
65
65
|
metadata = lens_contract.functions.cTokenMetadataAll(tokens).call(block_identifier=block_number)
|
66
66
|
reserves_info = {}
|
67
67
|
for data in metadata:
|
@@ -51,7 +51,7 @@ class CompoundV3StateService(CompoundStateService):
|
|
51
51
|
if comets:
|
52
52
|
pools += comets
|
53
53
|
for pool in pools:
|
54
|
-
contract = w3.eth.contract(address=w3.
|
54
|
+
contract = w3.eth.contract(address=w3.to_checksum_address(pool), abi=self.comet_abi)
|
55
55
|
base_token = contract.functions.baseToken().call().lower()
|
56
56
|
number_assets = contract.functions.numAssets().call()
|
57
57
|
asset_data = {}
|
@@ -47,7 +47,7 @@ class FluxStateService(CompoundStateService):
|
|
47
47
|
block_number: int = "latest"):
|
48
48
|
_w3 = self.state_service.get_w3()
|
49
49
|
comptroller_contract = _w3.eth.contract(
|
50
|
-
address=_w3.
|
50
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
51
51
|
ctokens = []
|
52
52
|
for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
|
53
53
|
# if token in [ContractAddresses.LUNA.lower(), ContractAddresses.UST.lower(), ContractAddresses.LUNA,
|
@@ -56,9 +56,9 @@ class FluxStateService(CompoundStateService):
|
|
56
56
|
ctokens.append(token)
|
57
57
|
|
58
58
|
lens_contract = _w3.eth.contract(
|
59
|
-
address=Web3.
|
59
|
+
address=Web3.to_checksum_address(self.pool_info.get("lensAddress")), abi=self.lens_abi
|
60
60
|
)
|
61
|
-
tokens = [Web3.
|
61
|
+
tokens = [Web3.to_checksum_address(i) for i in ctokens]
|
62
62
|
metadata = lens_contract.functions.cTokenMetadataAll(tokens).call(block_identifier=block_number)
|
63
63
|
reserves_info = {}
|
64
64
|
for data in metadata:
|
@@ -61,7 +61,7 @@ class GranaryStateService(ProtocolServices):
|
|
61
61
|
def get_dapp_asset_info(self, block_number: int = 'latest'):
|
62
62
|
begin = time.time()
|
63
63
|
_w3 = self.state_service.get_w3()
|
64
|
-
pool_address = Web3.
|
64
|
+
pool_address = Web3.to_checksum_address(self.pool_info['address'])
|
65
65
|
contract = _w3.eth.contract(address=pool_address, abi=self.lending_abi)
|
66
66
|
reserves_list = contract.functions.getReservesList().call(block_identifier=block_number)
|
67
67
|
reserves_info = {}
|
@@ -53,7 +53,7 @@ class IronBankStateService(CompoundStateService):
|
|
53
53
|
block_number: int = "latest"):
|
54
54
|
_w3 = self.state_service.get_w3()
|
55
55
|
comptroller_contract = _w3.eth.contract(
|
56
|
-
address=_w3.
|
56
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
57
57
|
ctokens = []
|
58
58
|
for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
|
59
59
|
# if token in [ContractAddresses.LUNA.lower(), ContractAddresses.UST.lower(), ContractAddresses.LUNA,
|
@@ -62,9 +62,9 @@ class IronBankStateService(CompoundStateService):
|
|
62
62
|
ctokens.append(token)
|
63
63
|
|
64
64
|
lens_contract = _w3.eth.contract(
|
65
|
-
address=Web3.
|
65
|
+
address=Web3.to_checksum_address(self.pool_info.get("lensAddress")), abi=self.lens_abi
|
66
66
|
)
|
67
|
-
tokens = [Web3.
|
67
|
+
tokens = [Web3.to_checksum_address(i) for i in ctokens]
|
68
68
|
reserves_info = {}
|
69
69
|
queries = {}
|
70
70
|
for token in tokens:
|
@@ -91,7 +91,7 @@ class IronBankStateService(CompoundStateService):
|
|
91
91
|
liquidation_threshold = decoded_data.get(markets)[1] / 10 ** 18
|
92
92
|
|
93
93
|
if underlying != Token.native_token:
|
94
|
-
underlying_contract = _w3.eth.contract(address=Web3.
|
94
|
+
underlying_contract = _w3.eth.contract(address=Web3.to_checksum_address(underlying), abi=ERC20_ABI)
|
95
95
|
underlying_decimal = underlying_contract.functions.decimals().call()
|
96
96
|
else:
|
97
97
|
underlying_decimal = Chain.native_decimals.get(self.chain_id, 18)
|
@@ -42,12 +42,12 @@ class JustLendStateService(CompoundStateService):
|
|
42
42
|
block_number: int = "latest"):
|
43
43
|
_w3 = self.state_service.get_w3()
|
44
44
|
comptroller_contract = _w3.eth.contract(
|
45
|
-
address=_w3.
|
45
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
46
46
|
ctokens = []
|
47
47
|
for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
|
48
48
|
ctokens.append(token)
|
49
49
|
|
50
|
-
tokens = [Web3.
|
50
|
+
tokens = [Web3.to_checksum_address(i) for i in ctokens]
|
51
51
|
reserves_info = {}
|
52
52
|
queries = {}
|
53
53
|
for token in tokens:
|
@@ -74,7 +74,7 @@ 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.
|
77
|
+
underlying_contract = _w3.eth.contract(address=Web3.to_checksum_address(underlying), abi=ERC20_ABI)
|
78
78
|
underlying_decimal = underlying_contract.functions.decimals().call()
|
79
79
|
else:
|
80
80
|
underlying_decimal = Chain.native_decimals.get(self.chain_id, 18)
|
@@ -53,13 +53,13 @@ class LiqeeStateService(CompoundStateService):
|
|
53
53
|
block_number: int = "latest"):
|
54
54
|
_w3 = self.state_service.get_w3()
|
55
55
|
comptroller_contract = _w3.eth.contract(
|
56
|
-
address=_w3.
|
56
|
+
address=_w3.to_checksum_address(self.pool_info.get("controllerAddress")), abi=self.controller_abi)
|
57
57
|
ctokens = []
|
58
58
|
for token in comptroller_contract.functions.getAlliTokens().call(block_identifier=block_number):
|
59
59
|
ctokens.append(token)
|
60
60
|
reserves_info = {}
|
61
61
|
for token in ctokens:
|
62
|
-
address = _w3.
|
62
|
+
address = _w3.to_checksum_address(token)
|
63
63
|
contract = _w3.eth.contract(address=address, abi=self.lquee_token_abi)
|
64
64
|
underlying = contract.functions.underlying().call(block_identifier=block_number)
|
65
65
|
liquidation_threshold = comptroller_contract.functions.markets(address).call(block_identifier=block_number)
|
@@ -182,7 +182,7 @@ class LiqeeStateService(CompoundStateService):
|
|
182
182
|
reserves_info: dict = None,
|
183
183
|
block_number: int = "latest",
|
184
184
|
):
|
185
|
-
fn_paras = [Web3.
|
185
|
+
fn_paras = [Web3.to_checksum_address(wallet)]
|
186
186
|
rpc_call = self.get_lending_function_info("getAccountRewardAmount", fn_paras, block_number)
|
187
187
|
get_reward_id = f"getAccountRewardAmount_{self.name}_{wallet}_{block_number}".lower()
|
188
188
|
return {get_reward_id: rpc_call}
|
@@ -57,10 +57,10 @@ class MorphoAaveV2StateService(MorphoCompoundStateService):
|
|
57
57
|
block_number: int = "latest"):
|
58
58
|
begin = time.time()
|
59
59
|
_w3 = self.state_service.get_w3()
|
60
|
-
pool_address = Web3.
|
60
|
+
pool_address = Web3.to_checksum_address(self.aave_info['address'])
|
61
61
|
contract = _w3.eth.contract(address=pool_address, abi=self.lending_abi)
|
62
62
|
comptroller_contract = _w3.eth.contract(
|
63
|
-
address=_w3.
|
63
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
64
64
|
markets = comptroller_contract.functions.getMarketsCreated().call(block_identifier=block_number)
|
65
65
|
reserves_list = contract.functions.getReservesList().call(block_identifier=block_number)
|
66
66
|
reserves_info = {}
|
@@ -55,10 +55,10 @@ class MorphoAaveV3StateService(MorphoCompoundStateService):
|
|
55
55
|
block_number: int = "latest"):
|
56
56
|
begin = time.time()
|
57
57
|
_w3 = self.state_service.get_w3()
|
58
|
-
pool_address = Web3.
|
58
|
+
pool_address = Web3.to_checksum_address(self.aave_info['address'])
|
59
59
|
contract = _w3.eth.contract(address=pool_address, abi=self.lending_abi)
|
60
60
|
comptroller_contract = _w3.eth.contract(
|
61
|
-
address=_w3.
|
61
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
62
62
|
markets = comptroller_contract.functions.marketsCreated().call(block_identifier=block_number)
|
63
63
|
markets = [i.lower() for i in markets]
|
64
64
|
reserves_list = contract.functions.getReservesList().call(block_identifier=block_number)
|
@@ -56,7 +56,7 @@ class MorphoCompoundStateService(ProtocolServices):
|
|
56
56
|
block_number: int = "latest"):
|
57
57
|
_w3 = self.state_service.get_w3()
|
58
58
|
comptroller_contract = _w3.eth.contract(
|
59
|
-
address=_w3.
|
59
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
60
60
|
ctokens = []
|
61
61
|
for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
|
62
62
|
# if token in [ContractAddresses.LUNA.lower(), ContractAddresses.UST.lower(), ContractAddresses.LUNA,
|
@@ -65,9 +65,9 @@ class MorphoCompoundStateService(ProtocolServices):
|
|
65
65
|
ctokens.append(token)
|
66
66
|
|
67
67
|
compound_lens_contract = _w3.eth.contract(
|
68
|
-
address=Web3.
|
68
|
+
address=Web3.to_checksum_address(self.compound_info.get("lensAddress")), abi=self.compound_lens_abi
|
69
69
|
)
|
70
|
-
tokens = [Web3.
|
70
|
+
tokens = [Web3.to_checksum_address(i) for i in ctokens]
|
71
71
|
metadata = compound_lens_contract.functions.cTokenMetadataAll(tokens).call(block_identifier=block_number)
|
72
72
|
reserves_info = {}
|
73
73
|
for data in metadata:
|
@@ -196,8 +196,8 @@ class MorphoCompoundStateService(ProtocolServices):
|
|
196
196
|
if not reserves_info:
|
197
197
|
reserves_info = self.pool_info.get("reservesList")
|
198
198
|
params = [
|
199
|
-
[Web3.
|
200
|
-
Web3.
|
199
|
+
[Web3.to_checksum_address(value.get(self.market_key)) for key, value in reserves_info.items()],
|
200
|
+
Web3.to_checksum_address(wallet)
|
201
201
|
]
|
202
202
|
rpc_call = self.get_lens_function_info("getUserUnclaimedRewards", params, block_number)
|
203
203
|
get_reward_id = f"getUserUnclaimedRewards_{self.name}_{wallet}_{block_number}".lower()
|
@@ -49,7 +49,7 @@ class OnyxStateService(CompoundStateService):
|
|
49
49
|
block_number: int = "latest"):
|
50
50
|
_w3 = self.state_service.get_w3()
|
51
51
|
comptroller_contract = _w3.eth.contract(
|
52
|
-
address=_w3.
|
52
|
+
address=_w3.to_checksum_address(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,9 +58,9 @@ class OnyxStateService(CompoundStateService):
|
|
58
58
|
ctokens.append(token)
|
59
59
|
|
60
60
|
lens_contract = _w3.eth.contract(
|
61
|
-
address=Web3.
|
61
|
+
address=Web3.to_checksum_address(self.pool_info.get("lensAddress")), abi=self.lens_abi
|
62
62
|
)
|
63
|
-
tokens = [Web3.
|
63
|
+
tokens = [Web3.to_checksum_address(i) for i in ctokens]
|
64
64
|
metadata = lens_contract.functions.oTokenMetadataAll(tokens).call(block_identifier=block_number)
|
65
65
|
reserves_info = {}
|
66
66
|
for data in metadata:
|
@@ -199,7 +199,7 @@ class OnyxStateService(CompoundStateService):
|
|
199
199
|
)
|
200
200
|
key = f"oTokenBalances_{self.name}_{wallet}_{token}_{block_number}".lower()
|
201
201
|
rpc_calls[key] = self.get_lens_function_info(
|
202
|
-
"oTokenBalances", [value.get("cToken"), Web3.
|
202
|
+
"oTokenBalances", [value.get("cToken"), Web3.to_checksum_address(wallet)])
|
203
203
|
return rpc_calls
|
204
204
|
|
205
205
|
def calculate_wallet_deposit_borrow_balance(
|
@@ -64,15 +64,15 @@ class SiloStateService(ProtocolServices):
|
|
64
64
|
):
|
65
65
|
_w3 = self.state_service.get_w3()
|
66
66
|
repository_contract = _w3.eth.contract(
|
67
|
-
address=_w3.
|
67
|
+
address=_w3.to_checksum_address(self.pool_info.get("repositoryAddress")), abi=self.repository_abi)
|
68
68
|
result = {}
|
69
69
|
if not tokens:
|
70
70
|
tokens = self.pool_info.get("reservesList").keys()
|
71
71
|
for token in tokens:
|
72
|
-
silo_token = repository_contract.functions.getSilo(_w3.
|
72
|
+
silo_token = repository_contract.functions.getSilo(_w3.to_checksum_address(token)).call(block_identifier=block_number)
|
73
73
|
if not silo_token:
|
74
74
|
continue
|
75
|
-
contract = _w3.eth.contract(address=_w3.
|
75
|
+
contract = _w3.eth.contract(address=_w3.to_checksum_address(silo_token), abi=self.silo_abi)
|
76
76
|
assets = contract.functions.getAssets().call()
|
77
77
|
main_asset = contract.functions.siloAsset().call()
|
78
78
|
all_assets = [i.lower() for i in assets]
|
@@ -47,7 +47,7 @@ class StrikeStateService(CompoundStateService):
|
|
47
47
|
block_number: int = "latest"):
|
48
48
|
_w3 = self.state_service.get_w3()
|
49
49
|
comptroller_contract = _w3.eth.contract(
|
50
|
-
address=_w3.
|
50
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
51
51
|
ctokens = []
|
52
52
|
for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
|
53
53
|
# if token in [ContractAddresses.LUNA.lower(), ContractAddresses.UST.lower(), ContractAddresses.LUNA,
|
@@ -56,9 +56,9 @@ class StrikeStateService(CompoundStateService):
|
|
56
56
|
ctokens.append(token)
|
57
57
|
|
58
58
|
lens_contract = _w3.eth.contract(
|
59
|
-
address=Web3.
|
59
|
+
address=Web3.to_checksum_address(self.pool_info.get("lensAddress")), abi=self.lens_abi
|
60
60
|
)
|
61
|
-
tokens = [Web3.
|
61
|
+
tokens = [Web3.to_checksum_address(i) for i in ctokens]
|
62
62
|
metadata = lens_contract.functions.sTokenMetadataAll(tokens).call(block_identifier=block_number)
|
63
63
|
reserves_info = {}
|
64
64
|
for data in metadata:
|
@@ -53,7 +53,7 @@ class TravaStateService(ProtocolServices):
|
|
53
53
|
def get_dapp_asset_info(self, block_number: int = 'latest'):
|
54
54
|
begin = time.time()
|
55
55
|
_w3 = self.state_service.get_w3()
|
56
|
-
pool_address = Web3.
|
56
|
+
pool_address = Web3.to_checksum_address(self.pool_info['address'])
|
57
57
|
contract = _w3.eth.contract(address=pool_address, abi=self.lending_abi)
|
58
58
|
reserves_list = contract.functions.getReservesList().call(block_identifier=block_number)
|
59
59
|
reserves_info = {}
|
@@ -396,7 +396,7 @@ class TravaStateService(ProtocolServices):
|
|
396
396
|
rpc_calls = {}
|
397
397
|
tokens = []
|
398
398
|
for token, value in reserves_info.items():
|
399
|
-
atoken, debt_token = Web3.
|
399
|
+
atoken, debt_token = Web3.to_checksum_address(value['tToken']), Web3.to_checksum_address(value['dToken'])
|
400
400
|
tokens += [atoken, debt_token]
|
401
401
|
key = f"getRewardsBalance_{self.name}_{wallet}_{block_number}".lower()
|
402
402
|
rpc_calls[key] = self.get_function_incentive_info(
|
@@ -48,7 +48,7 @@ class UwuStateService(ProtocolServices):
|
|
48
48
|
def get_dapp_asset_info(self, block_number: int = 'latest'):
|
49
49
|
begin = time.time()
|
50
50
|
_w3 = self.state_service.get_w3()
|
51
|
-
pool_address = Web3.
|
51
|
+
pool_address = Web3.to_checksum_address(self.pool_info['address'])
|
52
52
|
contract = _w3.eth.contract(address=pool_address, abi=self.lending_abi)
|
53
53
|
reserves_list = contract.functions.getReservesList().call(block_identifier=block_number)
|
54
54
|
reserves_info = {}
|
@@ -287,7 +287,7 @@ class UwuStateService(ProtocolServices):
|
|
287
287
|
rpc_calls = {}
|
288
288
|
tokens = []
|
289
289
|
for token, value in reserves_info.items():
|
290
|
-
atoken, debt_token = Web3.
|
290
|
+
atoken, debt_token = Web3.to_checksum_address(value['tToken']), Web3.to_checksum_address(value['dToken'])
|
291
291
|
tokens += [atoken, debt_token]
|
292
292
|
key = f"claimableReward_{self.name}_{wallet}_{block_number}".lower()
|
293
293
|
rpc_calls[key] = self.get_function_incentive_info(
|
@@ -51,7 +51,7 @@ class ValasStateService(ProtocolServices):
|
|
51
51
|
def get_dapp_asset_info(self, block_number: int = 'latest'):
|
52
52
|
begin = time.time()
|
53
53
|
_w3 = self.state_service.get_w3()
|
54
|
-
pool_address = Web3.
|
54
|
+
pool_address = Web3.to_checksum_address(self.pool_info['address'])
|
55
55
|
contract = _w3.eth.contract(address=pool_address, abi=self.lending_abi)
|
56
56
|
reserves_list = contract.functions.getReservesList().call(block_identifier=block_number)
|
57
57
|
reserves_info = {}
|
@@ -50,7 +50,7 @@ class VenusStateService(CompoundStateService):
|
|
50
50
|
block_number: int = "latest"):
|
51
51
|
_w3 = self.state_service.get_w3()
|
52
52
|
comptroller_contract = _w3.eth.contract(
|
53
|
-
address=_w3.
|
53
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
54
54
|
ctokens = []
|
55
55
|
for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
|
56
56
|
# if token in [ContractAddresses.LUNA.lower(), ContractAddresses.UST.lower(), ContractAddresses.LUNA,
|
@@ -59,7 +59,7 @@ class VenusStateService(CompoundStateService):
|
|
59
59
|
ctokens.append(token)
|
60
60
|
|
61
61
|
reserves_info = {}
|
62
|
-
tokens = [Web3.
|
62
|
+
tokens = [Web3.to_checksum_address(i) for i in ctokens]
|
63
63
|
queries = {}
|
64
64
|
for token in tokens:
|
65
65
|
key = f"underlying_{token}_{block_number}".lower()
|
@@ -83,7 +83,7 @@ class VenusStateService(CompoundStateService):
|
|
83
83
|
ltv = liquidation_threshold
|
84
84
|
|
85
85
|
if underlying != Token.native_token:
|
86
|
-
underlying_contract = _w3.eth.contract(address=Web3.
|
86
|
+
underlying_contract = _w3.eth.contract(address=Web3.to_checksum_address(underlying), abi=ERC20_ABI)
|
87
87
|
underlying_decimal = underlying_contract.functions.decimals().call()
|
88
88
|
else:
|
89
89
|
underlying_decimal = Chain.native_decimals.get(self.chain_id, 18)
|
@@ -152,9 +152,9 @@ class VenusStateService(CompoundStateService):
|
|
152
152
|
def calculate_rewards_balance(
|
153
153
|
self, wallet: str, reserves_info: dict, decoded_data: dict, block_number: int = "latest"):
|
154
154
|
w3 = self.state_service.get_w3()
|
155
|
-
contract = w3.eth.contract(address=w3.
|
155
|
+
contract = w3.eth.contract(address=w3.to_checksum_address(self.pool_info.get("lensAddress")), abi = self.lens_abi)
|
156
156
|
# get_reward_id = f"pendingRewards_{self.name}_{wallet}_{block_number}".lower()
|
157
|
-
return_data = contract.functions.pendingRewards(w3.
|
157
|
+
return_data = contract.functions.pendingRewards(w3.to_checksum_address(wallet), w3.to_checksum_address(self.pool_info.get("comptrollerAddress"))).call(block_identifier=block_number)
|
158
158
|
rewards = return_data[2]
|
159
159
|
for item in return_data[-1]:
|
160
160
|
rewards += item[-1]
|
@@ -365,7 +365,7 @@ class VenusStateService(CompoundStateService):
|
|
365
365
|
reserves_info: dict = None,
|
366
366
|
block_number: int = "latest"
|
367
367
|
):
|
368
|
-
tokens = [Web3.
|
368
|
+
tokens = [Web3.to_checksum_address(value['cToken']) for key, value in reserves_info.items()]
|
369
369
|
key = f"vTokenMetadataAll_{self.pool_info.get('lensAddress')}_{block_number}".lower()
|
370
370
|
return {
|
371
371
|
key: self.get_lens_function_info("vTokenMetadataAll", tokens, block_number)
|
@@ -373,7 +373,7 @@ class VenusStateService(CompoundStateService):
|
|
373
373
|
|
374
374
|
def ctoken_underlying_price_all(
|
375
375
|
self, reserves_info, block_number: int = 'latest'):
|
376
|
-
tokens = [Web3.
|
376
|
+
tokens = [Web3.to_checksum_address(value['cToken']) for key, value in reserves_info.items()]
|
377
377
|
key = f"vTokenUnderlyingPriceAll_{self.pool_info.get('lensAddress')}_{block_number}".lower()
|
378
378
|
return {
|
379
379
|
key: self.get_lens_function_info("cTokenUnderlyingPriceAll", tokens, block_number)
|
@@ -56,7 +56,7 @@ class WepiggyStateService(CompoundStateService):
|
|
56
56
|
block_number: int = "latest"):
|
57
57
|
_w3 = self.state_service.get_w3()
|
58
58
|
comptroller_contract = _w3.eth.contract(
|
59
|
-
address=_w3.
|
59
|
+
address=_w3.to_checksum_address(self.pool_info.get("comptrollerAddress")), abi=self.comptroller_abi)
|
60
60
|
ctokens = []
|
61
61
|
for token in comptroller_contract.functions.getAllMarkets().call(block_identifier=block_number):
|
62
62
|
# if token in [ContractAddresses.LUNA.lower(), ContractAddresses.UST.lower(), ContractAddresses.LUNA,
|
@@ -65,16 +65,16 @@ class WepiggyStateService(CompoundStateService):
|
|
65
65
|
ctokens.append(token)
|
66
66
|
|
67
67
|
lens_contract = _w3.eth.contract(
|
68
|
-
address=Web3.
|
68
|
+
address=Web3.to_checksum_address(self.pool_info.get("lensAddress")), abi=self.lens_abi
|
69
69
|
)
|
70
|
-
tokens = [Web3.
|
70
|
+
tokens = [Web3.to_checksum_address(i) for i in ctokens]
|
71
71
|
reserves_info = {}
|
72
72
|
for token in tokens:
|
73
73
|
if token.lower() == '0xef86384cf696929c3227428f539e740ee12fcdc7':
|
74
74
|
reserves_info[token.lower()] = self.pool_info.get("reservesList").get(
|
75
75
|
"0xf88506b0f1d30056b9e5580668d5875b9cd30f23")
|
76
76
|
continue
|
77
|
-
data = lens_contract.functions.pTokenMetadata(Web3.
|
77
|
+
data = lens_contract.functions.pTokenMetadata(Web3.to_checksum_address(token)).call(
|
78
78
|
block_identifier=block_number)
|
79
79
|
underlying = data[2].lower()
|
80
80
|
ctoken = data[0].lower()
|
@@ -21,11 +21,11 @@ def convert_address_dict(data):
|
|
21
21
|
if isinstance(data, dict):
|
22
22
|
result = {}
|
23
23
|
for key, value in data.items():
|
24
|
-
if Web3.
|
24
|
+
if Web3.is_address(key):
|
25
25
|
key = hex_to_base58(key)
|
26
26
|
if isinstance(value, dict):
|
27
27
|
value = convert_address_dict(value)
|
28
|
-
if Web3.
|
28
|
+
if Web3.is_address(value):
|
29
29
|
value = hex_to_base58(value)
|
30
30
|
result[key] = value
|
31
31
|
return result
|
@@ -1,4 +1,4 @@
|
|
1
|
-
defi_services/__init__.py,sha256=
|
1
|
+
defi_services/__init__.py,sha256=lR0PxzTAjaaJQ_3Wm5vE1PfTgOS8pdhmsmn4OrIioB0,23
|
2
2
|
defi_services/abis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
defi_services/abis/dex/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
4
|
defi_services/abis/dex/biswap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -252,13 +252,13 @@ defi_services/constants/entities/vault_services.py,sha256=IMmQc15wS1KA7EuQqM_Ara
|
|
252
252
|
defi_services/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
253
253
|
defi_services/jobs/processors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
254
254
|
defi_services/jobs/processors/cosmos_state_processor.py,sha256=2S5fhqHQ4pUtRaLnbFJNUo4jKc5MHq7HA-0FHebOJyo,1334
|
255
|
-
defi_services/jobs/processors/multi_state_processor.py,sha256=
|
255
|
+
defi_services/jobs/processors/multi_state_processor.py,sha256=uMv1kVkkBV_GkYnMVaE8UgAhdnu7J_FzU6-fAoXCqjo,4752
|
256
256
|
defi_services/jobs/processors/solana_state_processor.py,sha256=szsBYrkEV8kBzuA_iaSVescnwKJ2MHoTbut5kORbWTs,4065
|
257
|
-
defi_services/jobs/processors/state_processor.py,sha256=
|
257
|
+
defi_services/jobs/processors/state_processor.py,sha256=Ze_5isU_l_APB262E-VV_4KZwEG6W0XE6PikJZIcAoM,7291
|
258
258
|
defi_services/jobs/processors/substrate_state_processor.py,sha256=KkiY1NkaxnizNJBTfn4twB-zuQo3fT3akOlbie8VF5g,3940
|
259
259
|
defi_services/jobs/queriers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
260
260
|
defi_services/jobs/queriers/solana_state_querier.py,sha256=TQELYo6GUoF8s-LfetqYbclNaH8bakQqC7y2ifACIb8,3239
|
261
|
-
defi_services/jobs/queriers/state_querier.py,sha256
|
261
|
+
defi_services/jobs/queriers/state_querier.py,sha256=-bx71x2ZobwuAlc2pVp5Ju_fxYt48wLrs8IdLN1KJVs,7306
|
262
262
|
defi_services/jobs/queriers/substrate_state_querier.py,sha256=_T0Dk06sP_uBKaxgj2J_EBtJDoq-hi8jU7Np4iuO0LA,3858
|
263
263
|
defi_services/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
264
264
|
defi_services/services/cosmos_token_services.py,sha256=6z_eE7lF5tY461VJ6uVoG18hOdXKeWR4NgDDP-MGI0k,1603
|
@@ -269,49 +269,49 @@ defi_services/services/solana_token_services.py,sha256=NQKUHGMBe9eQciOaY3N20rPbI
|
|
269
269
|
defi_services/services/substrate_token_services.py,sha256=HsjceBHo0fxQIcXgDaV0OBANLuggRwXAEPt7ASB0BKk,2904
|
270
270
|
defi_services/services/token_services.py,sha256=ncGdOpATIb9tGFa9cY1dQq3hFRwbhcYwIz0we9tNWNY,2766
|
271
271
|
defi_services/services/dex/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
272
|
-
defi_services/services/dex/pancakeswap_service.py,sha256=
|
273
|
-
defi_services/services/dex/pancakeswap_v2_service.py,sha256=
|
274
|
-
defi_services/services/dex/pancakeswap_v3_service.py,sha256=
|
272
|
+
defi_services/services/dex/pancakeswap_service.py,sha256=cN_L7897l8dh7DnNuHo6fcnYa-JLHI7yLLzBW1C9RlI,4637
|
273
|
+
defi_services/services/dex/pancakeswap_v2_service.py,sha256=ppRruxXHKeY3BQY5DxBQoNDjNIc6kqo3Wjgd6mO9CcA,13098
|
274
|
+
defi_services/services/dex/pancakeswap_v3_service.py,sha256=TR1OjlFeUEoxbYBJuyeshdciHuBmUiTJHMRog5OxwO0,21543
|
275
275
|
defi_services/services/dex/quickswap_v2_service.py,sha256=vpjBNcPlxwOW-WqTuxYKK2coVZhXDjK39nEq8X6awQU,1155
|
276
|
-
defi_services/services/dex/quickswap_v3_service.py,sha256=
|
276
|
+
defi_services/services/dex/quickswap_v3_service.py,sha256=21jGmrwoVrY8N2x0aiNBr8de88Ji2DtQ0xVYbHFw8Mg,11690
|
277
277
|
defi_services/services/dex/spookyswap_v2_service.py,sha256=CBM0_NZTsiqBxkIHm_Ll-oTzlPZsd0TYVh4itcBNBA0,6982
|
278
278
|
defi_services/services/dex/sushiswap_service.py,sha256=1_vCvLjQZmjOK55xUpotAgrQKqywL8txhPpBUQuFHMw,3099
|
279
279
|
defi_services/services/dex/sushiswap_v2_service.py,sha256=QyOVdTv06sWR_SYphxGGxla3eMN3Q8sRjXU6vPPTr4Q,3834
|
280
280
|
defi_services/services/dex/sushiswap_v3_service.py,sha256=fTBJfbyU4nSei_XCWxHKRZxzPRNwLrda3VORgKRAnYo,3141
|
281
|
-
defi_services/services/dex/uniswap_v2_service.py,sha256=
|
282
|
-
defi_services/services/dex/uniswap_v3_service.py,sha256=
|
281
|
+
defi_services/services/dex/uniswap_v2_service.py,sha256=ps8_-JW0ZjqFCLicap1zY0kenBoa3t43hZZNKI33WI0,10476
|
282
|
+
defi_services/services/dex/uniswap_v3_service.py,sha256=R-YbfXeCnGRPWlOY1zefrQ7oT-MsRMQH6Y3wkLE9R0s,18662
|
283
283
|
defi_services/services/dex/dex_info/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
284
|
-
defi_services/services/dex/dex_info/pancakeswap_info.py,sha256=
|
284
|
+
defi_services/services/dex/dex_info/pancakeswap_info.py,sha256=dLtYR9_ZpKN3dme5gDZ-Oi7gnYRx2GMRRI1D9eQ3y5w,2075
|
285
285
|
defi_services/services/dex/dex_info/quickswap_info.py,sha256=79ul5xG6rKa2IVj2ptJrQzTyG9A5vweHodU28B1lpro,963
|
286
286
|
defi_services/services/dex/dex_info/spookyswap_info.py,sha256=oNwWsFsXE0R7b72ZDCmrhDOKwN_-T7y3N0sX26TmhIA,535
|
287
287
|
defi_services/services/dex/dex_info/sushiswap_info.py,sha256=VnfZR6c4bsjWTTaTPxO1c1W2fjhspHQfanSP2uCFuu8,4219
|
288
288
|
defi_services/services/dex/dex_info/uniswap_info.py,sha256=RhEXmbERg_k5NsgMKnlrgRHE7LKbyWL0wxHUy3Vt4mM,897
|
289
289
|
defi_services/services/lending/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
290
|
-
defi_services/services/lending/aave_v2_services.py,sha256=
|
291
|
-
defi_services/services/lending/aave_v3_services.py,sha256=
|
292
|
-
defi_services/services/lending/apeswap_services.py,sha256=
|
293
|
-
defi_services/services/lending/compound_service.py,sha256=
|
294
|
-
defi_services/services/lending/compound_v3_services.py,sha256=
|
290
|
+
defi_services/services/lending/aave_v2_services.py,sha256=SiuBz9wKeUfg0rsGdSqt6c9TzElnbv8Xaqu71QN6WQw,21613
|
291
|
+
defi_services/services/lending/aave_v3_services.py,sha256=HKLKJR_x--I5bO-wW5I9_PxA0x-y2HN4K-SFUnhbz8M,16163
|
292
|
+
defi_services/services/lending/apeswap_services.py,sha256=UrLhXVzGvim_xfs54hSJ1qeTH6ber4xh01j5PWFl4C8,4737
|
293
|
+
defi_services/services/lending/compound_service.py,sha256=8r7pAs8KaaakDuHg4BUICW4zLD-ihm_DQETYwnAFc98,21917
|
294
|
+
defi_services/services/lending/compound_v3_services.py,sha256=wsUavP2LAJCxmr8A0MPXLDb_YmANT_3DcSlgEgXuJv4,17128
|
295
295
|
defi_services/services/lending/cream_services.py,sha256=vtah0kMHAxztenWbJp4CxEcBMF0XUBglGRk6p9d-oiU,1644
|
296
|
-
defi_services/services/lending/flux_services.py,sha256=
|
296
|
+
defi_services/services/lending/flux_services.py,sha256=C9WJ2MIBK4xTaXIHF3yBVu52xGCNzO4Ed5DWyxWTTeE,12617
|
297
297
|
defi_services/services/lending/geist_services.py,sha256=UI5D-MbMqplrt7D4krSFdpaREKOT81k8boD_XhGGpUQ,1035
|
298
|
-
defi_services/services/lending/granary_services.py,sha256=
|
299
|
-
defi_services/services/lending/iron_bank_service.py,sha256=
|
300
|
-
defi_services/services/lending/justlend_service.py,sha256=
|
301
|
-
defi_services/services/lending/liqee_service.py,sha256=
|
302
|
-
defi_services/services/lending/morpho_aave_v2_services.py,sha256=
|
303
|
-
defi_services/services/lending/morpho_aave_v3_services.py,sha256=
|
304
|
-
defi_services/services/lending/morpho_compound_services.py,sha256=
|
305
|
-
defi_services/services/lending/onyx_service.py,sha256=
|
298
|
+
defi_services/services/lending/granary_services.py,sha256=kmKaaZA1Poj4EwspijIQ5AQnykUgamvNmz-8gMMD_RI,16463
|
299
|
+
defi_services/services/lending/iron_bank_service.py,sha256=GuXoXEbR4gkkNYfAyFkDtVeI3-knq3kFnLBeWVuUvv8,15585
|
300
|
+
defi_services/services/lending/justlend_service.py,sha256=az1OxDAqDKjT7jZ2CiNS4sfKXjhS04kD6FWB4ZT16mQ,8874
|
301
|
+
defi_services/services/lending/liqee_service.py,sha256=dBMlQpREqSzZY2_JCpJDxnWl9A8fWxa56KhsDNd--as,17140
|
302
|
+
defi_services/services/lending/morpho_aave_v2_services.py,sha256=o1Ke6tS3sSbwN4WAg0s284VOiJlKTxAu_20rNY6NC4Y,8474
|
303
|
+
defi_services/services/lending/morpho_aave_v3_services.py,sha256=bW0TSP-VpMPd0nm-a_gaN1LvaRU_iEbmnaKs7DVkJQw,8270
|
304
|
+
defi_services/services/lending/morpho_compound_services.py,sha256=38AXwi-7yxSrRghS3OCRZrOy9cfJnC3k-yNf1Ep27Ds,14912
|
305
|
+
defi_services/services/lending/onyx_service.py,sha256=CqQcenVidyKYIxNlaTliaYmSI8zV7_zxK_wCQE5s-r4,15401
|
306
306
|
defi_services/services/lending/radiant_v2_services.py,sha256=ywjZ4sb2UQlbc4wBWz7mn9P6y19AvGVsgroDXl46fgc,3021
|
307
|
-
defi_services/services/lending/silo_services.py,sha256=
|
307
|
+
defi_services/services/lending/silo_services.py,sha256=yLw90u_IXEqE3NbfhVAhG1y8qQqo26xSbYXXlh4lL3g,16726
|
308
308
|
defi_services/services/lending/spark_services.py,sha256=68_egY0yOT7YIOVbd8rbHJBJEsL0sOr0zSsTSdw0BUY,1042
|
309
|
-
defi_services/services/lending/strike_service.py,sha256=
|
310
|
-
defi_services/services/lending/trava_services.py,sha256=
|
311
|
-
defi_services/services/lending/uwu_services.py,sha256=
|
312
|
-
defi_services/services/lending/valas_services.py,sha256=
|
313
|
-
defi_services/services/lending/venus_services.py,sha256=
|
314
|
-
defi_services/services/lending/wepiggy_services.py,sha256=
|
309
|
+
defi_services/services/lending/strike_service.py,sha256=ZQ9B6Xngo64njwqABOO3CH-ESFmUmQWbisCgVXYKjak,13797
|
310
|
+
defi_services/services/lending/trava_services.py,sha256=EpCzEweNuq-n38oxWtdPHZstrJf5BlY9rmwUjkMOxSs,19103
|
311
|
+
defi_services/services/lending/uwu_services.py,sha256=lRGQMsDmDrpzOhHqy4ELW7aFe4JUaBoWZbgVb7Yo6mY,13845
|
312
|
+
defi_services/services/lending/valas_services.py,sha256=gz4jgcJpOEbLH5NqPgwfcUlLCoSbjyHqz7B9Qf1rWWI,22447
|
313
|
+
defi_services/services/lending/venus_services.py,sha256=LhSG2H16kZn8AqIS7DAOy0kxP8N2O_ZUAEl9Eho4Ujo,16523
|
314
|
+
defi_services/services/lending/wepiggy_services.py,sha256=x10QkYpn47wgNvmDeMGgmzJxv7WPte6hqR3MCBRgMbM,15684
|
315
315
|
defi_services/services/lending/lending_info/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
316
316
|
defi_services/services/lending/lending_info/arbitrum/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
317
317
|
defi_services/services/lending/lending_info/arbitrum/aave_v3_arbitrum.py,sha256=8lpLYjXE2bKijTeWjRQH4XUFhG3s7df3J3r5oZEZcjA,3556
|
@@ -383,7 +383,7 @@ defi_services/services/vault/vault_info/fantom/__init__.py,sha256=47DEQpj8HBSa-_
|
|
383
383
|
defi_services/services/vault/vault_info/fantom/trava_ftm.py,sha256=dy8us4Lt0jrS9ZfaeXD4qz3OA4QwDPMRDkkxyNrJUUU,1165
|
384
384
|
defi_services/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
385
385
|
defi_services/utils/apy.py,sha256=zQ9wrID79uccLj9pJI5Q9KhTDWXeBt9JaEVjNnYmnyg,356
|
386
|
-
defi_services/utils/convert_address.py,sha256=
|
386
|
+
defi_services/utils/convert_address.py,sha256=56u9xFXGKKwEV0Ir8NTdJzSBWmbuNBo9WfufLS-uwG4,1072
|
387
387
|
defi_services/utils/get_fees.py,sha256=L8Xivqev5M73IC2s7FaEP97EDymoazw_YhJBOja73c8,1742
|
388
388
|
defi_services/utils/graph_operations.py,sha256=2-onMqflUqOrbVsy7JGFyeTMOcwTgPoZ3uGWruWMA_k,6271
|
389
389
|
defi_services/utils/init_dex_services.py,sha256=kbSoq4BR8lu8kURUoDOaOS4A-ynv4CgqS0kDA5IcZlA,529
|
@@ -393,8 +393,8 @@ defi_services/utils/market_service.py,sha256=imPtPHBkpEx5JnhqeIWYqbCjsIEm8IKBYHN
|
|
393
393
|
defi_services/utils/memory_storage.py,sha256=BOT8laB0iVSCGE-oDlpWJQLbSC6X2blKX4zuQbs4inc,851
|
394
394
|
defi_services/utils/sqrt_price_math.py,sha256=9lgUeWFT4wjl3Vq3b7-jZ2bGvvZx7dDBSfVnM3lsZ8o,5575
|
395
395
|
defi_services/utils/thread_proxy.py,sha256=5Z8biAyEReUkh3vfJSvEv7GwMe3CsE5M8CbghkQtePw,2951
|
396
|
-
defi_state_querier-0.4.
|
397
|
-
defi_state_querier-0.4.
|
398
|
-
defi_state_querier-0.4.
|
399
|
-
defi_state_querier-0.4.
|
400
|
-
defi_state_querier-0.4.
|
396
|
+
defi_state_querier-0.4.26.dist-info/LICENSE,sha256=6jmfxa8nUIwfKnzZUxAHJSJ_IS7h7mpbJq26cWjoo-o,1063
|
397
|
+
defi_state_querier-0.4.26.dist-info/METADATA,sha256=RWDX0wrAOkLX1vUu62d9bpuM2nFqm-kfqTJTHRp9RSY,4376
|
398
|
+
defi_state_querier-0.4.26.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
399
|
+
defi_state_querier-0.4.26.dist-info/top_level.txt,sha256=C-OTxHK6MknKK-nAbEzCPDUl1M6pktRhgJrmsozdf6g,14
|
400
|
+
defi_state_querier-0.4.26.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|