defi-state-querier 0.5.23__py3-none-any.whl → 0.5.25__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/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/constants/chain_constant.py +2 -1
- defi_services/constants/entities/lending_constant.py +10 -5
- defi_services/constants/entities/lending_services.py +9 -1
- defi_services/services/lending/granary_services.py +3 -1
- defi_services/services/lending/ionic_service.py +167 -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 +79 -1
- defi_services/services/lending/lending_info/base/radiant_v2_base.py +57 -0
- defi_services/services/lending/lending_info/base/sonne_base.py +53 -0
- defi_services/services/lending/lending_info/base/zerolend_base.py +99 -99
- defi_services/services/lending/moonwell_service.py +120 -0
- defi_services/services/lending/radiant_v2_services.py +50 -10
- defi_services/services/lending/sonne_service.py +64 -0
- defi_services/services/lending/venus_services.py +9 -3
- defi_services/services/lending/zerolend_services.py +1 -1
- {defi_state_querier-0.5.23.dist-info → defi_state_querier-0.5.25.dist-info}/METADATA +1 -1
- {defi_state_querier-0.5.23.dist-info → defi_state_querier-0.5.25.dist-info}/RECORD +28 -15
- {defi_state_querier-0.5.23.dist-info → defi_state_querier-0.5.25.dist-info}/LICENSE +0 -0
- {defi_state_querier-0.5.23.dist-info → defi_state_querier-0.5.25.dist-info}/WHEEL +0 -0
- {defi_state_querier-0.5.23.dist-info → defi_state_querier-0.5.25.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
SONNE_BASE = {
|
2
|
+
"name": "Sonne Finance Lending Pool",
|
3
|
+
"rewardToken": "0x22a2488fe295047ba13bd8cccdbc8361dbd8cf7c",
|
4
|
+
"comptrollerAddress": "0x1db2466d9f5e10d7090e7152b68d62703a2245f0",
|
5
|
+
"lensAddress": "",
|
6
|
+
"poolToken": "0x22a2488fe295047ba13bd8cccdbc8361dbd8cf7c",
|
7
|
+
"type": "LENDING_POOL",
|
8
|
+
"forked": "compound",
|
9
|
+
"reservesList": {
|
10
|
+
"0x50c5725949a6f0c72e6c4a641f24049a917db0cb": {
|
11
|
+
"cToken": "0xb864ba2aab1f53bc3af7ae49a318202dd3fd54c2",
|
12
|
+
"exchangeRate": 0.023083559152306903,
|
13
|
+
"liquidationThreshold": 0.85,
|
14
|
+
"loanToValue": 0.85
|
15
|
+
},
|
16
|
+
"0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca": {
|
17
|
+
"cToken": "0x225886c9beb5eee254f79d58bbd80cf9f200d4d0",
|
18
|
+
"exchangeRate": 0.0250658201249789,
|
19
|
+
"liquidationThreshold": 0.85,
|
20
|
+
"loanToValue": 0.85
|
21
|
+
},
|
22
|
+
"0x4200000000000000000000000000000000000006": {
|
23
|
+
"cToken": "0x5f5c479fe590cd4442a05ae4a941dd991a633b8e",
|
24
|
+
"exchangeRate": 0.020423843905669113,
|
25
|
+
"liquidationThreshold": 0.7,
|
26
|
+
"loanToValue": 0.7
|
27
|
+
},
|
28
|
+
"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913": {
|
29
|
+
"cToken": "0xfd68f92b45b633bbe0f475294c1a86aecd62985a",
|
30
|
+
"exchangeRate": 0.0234603622944371,
|
31
|
+
"liquidationThreshold": 0.85,
|
32
|
+
"loanToValue": 0.85
|
33
|
+
},
|
34
|
+
"0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22": {
|
35
|
+
"cToken": "0x6c91beeceedda2089307fab818e12757948bf489",
|
36
|
+
"exchangeRate": 0.02066126030128981,
|
37
|
+
"liquidationThreshold": 0.65,
|
38
|
+
"loanToValue": 0.65
|
39
|
+
},
|
40
|
+
"0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452": {
|
41
|
+
"cToken": "0x7a6468053cdcd7e8fe507d7edb77336f5057d206",
|
42
|
+
"exchangeRate": 0.020397422935249394,
|
43
|
+
"liquidationThreshold": 0.6,
|
44
|
+
"loanToValue": 0.6
|
45
|
+
},
|
46
|
+
"0x940181a94a35a4569e4529a3cdfb74e38fd98631": {
|
47
|
+
"cToken": "0xfa78196ace4048c4ccce6d3d97890d7b6c8f59da",
|
48
|
+
"exchangeRate": 0.021779276987867538,
|
49
|
+
"liquidationThreshold": 0.3,
|
50
|
+
"loanToValue": 0.3
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
@@ -7,103 +7,103 @@ ZEROLEND_BASE = {
|
|
7
7
|
"type": "LENDING_POOL",
|
8
8
|
"forked": "aave-v3",
|
9
9
|
"reservesList": {
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
10
|
+
"0x4200000000000000000000000000000000000006": {
|
11
|
+
"tToken": "0x4677201dbb575d485ad69e5c5b1e7e7888c3ab29",
|
12
|
+
"sdToken": "0xb375197dc09e06382a05be306df6a551f08a3b7b",
|
13
|
+
"dToken": "0xfec889b48d8cb51bfd988bf211d4cfe854af085c",
|
14
|
+
"loanToValue": 0.8,
|
15
|
+
"liquidationThreshold": 0.825
|
16
|
+
},
|
17
|
+
"0x940181a94a35a4569e4529a3cdfb74e38fd98631": {
|
18
|
+
"tToken": "0x3c2b86d6308c24632bb8716ed013567c952b53ae",
|
19
|
+
"sdToken": "0xe37b9dd1cdf9f411a9f6bb8d0c1fa2af6b960a47",
|
20
|
+
"dToken": "0x98ef767a6184323bf2788a0936706432698d3400",
|
21
|
+
"loanToValue": 0.8,
|
22
|
+
"liquidationThreshold": 0.9
|
23
|
+
},
|
24
|
+
"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913": {
|
25
|
+
"tToken": "0xd09600475435cab0e40dabdb161fb5a3311efcb3",
|
26
|
+
"sdToken": "0x1d32fd6f0dda3f3ef74e5bc3da3166febdd698b5",
|
27
|
+
"dToken": "0xa397391b718f3c7f21c63e8beb09b66607419c38",
|
28
|
+
"loanToValue": 0.8,
|
29
|
+
"liquidationThreshold": 0.85
|
30
|
+
},
|
31
|
+
"0x0a27e060c0406f8ab7b64e3bee036a37e5a62853": {
|
32
|
+
"tToken": "0x2e1f66d89a95a88afe594f6ed936b1ca76efb74c",
|
33
|
+
"sdToken": "0x6017b28d5b8a46474673ad7a4914318ad5e6db5e",
|
34
|
+
"dToken": "0x5e4043a302a827bfa4cb51fa18c66109683d08ee",
|
35
|
+
"loanToValue": 0.0,
|
36
|
+
"liquidationThreshold": 0.0
|
37
|
+
},
|
38
|
+
"0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22": {
|
39
|
+
"tToken": "0x1f3f89ffc8cd686cecc845b5f52246598f1e3196",
|
40
|
+
"sdToken": "0x65d178978a458ff3ca39bc3df3ad9d0a0957d1bd",
|
41
|
+
"dToken": "0x371cfa36ef5e33c46d1e0ef2111862d5ff9f78cd",
|
42
|
+
"loanToValue": 0.8,
|
43
|
+
"liquidationThreshold": 0.825
|
44
|
+
},
|
45
|
+
"0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf": {
|
46
|
+
"tToken": "0x4433cf6e9458027ff0833f22a3cf73318908e48e",
|
47
|
+
"sdToken": "0xf29fab0a70ad1f8aa88b2b389d4c84083f73301e",
|
48
|
+
"dToken": "0x7e1b2ac5339e8bba83c67a9444e9ee981c46ce42",
|
49
|
+
"loanToValue": 0.7,
|
50
|
+
"liquidationThreshold": 0.75
|
51
|
+
},
|
52
|
+
"0x6cdcb1c4a4d1c3c6d054b27ac5b77e89eafb971d": {
|
53
|
+
"tToken": "0xb6ccd85f92fb9a8bbc99b55091855714aaeebfee",
|
54
|
+
"sdToken": "0xcd18e7d74d8ae9228c3405149725d7813363fcde",
|
55
|
+
"dToken": "0x80e898e5ad81940fe094ac3159b08a3494198570",
|
56
|
+
"loanToValue": 0.8,
|
57
|
+
"liquidationThreshold": 0.95
|
58
|
+
},
|
59
|
+
"0x1097dfe9539350cb466df9ca89a5e61195a520b0": {
|
60
|
+
"tToken": "0x89bb87137afe8bae03f4ab286de667a513ceebdd",
|
61
|
+
"sdToken": "0x6bb22ac00925f75e0a089178835cb98239b0ad30",
|
62
|
+
"dToken": "0x6b0b75c223ddd146b213ef4e35bc61d1de7b46a4",
|
63
|
+
"loanToValue": 0.8,
|
64
|
+
"liquidationThreshold": 0.95
|
65
|
+
},
|
66
|
+
"0x04d5ddf5f3a8939889f11e97f8c4bb48317f1938": {
|
67
|
+
"tToken": "0x9357e7f1c49e6d0094287f882fc47774fd3bc291",
|
68
|
+
"sdToken": "0xa5760c5e8927ddff5fe77719890522d5432a7c3a",
|
69
|
+
"dToken": "0x19887e3d984cbbd75805dfdbc9810efe923b897f",
|
70
|
+
"loanToValue": 0.75,
|
71
|
+
"liquidationThreshold": 0.8
|
72
|
+
},
|
73
|
+
"0xe31ee12bdfdd0573d634124611e85338e2cbf0cf": {
|
74
|
+
"tToken": "0xf382e613ff8ee69f3f7557424e7cfd48792286c5",
|
75
|
+
"sdToken": "0x1f69f0a0204f059527eae5df451460a1cbe4b54f",
|
76
|
+
"dToken": "0x591d8d962278bd35182decb2852de50f83dd29d0",
|
77
|
+
"loanToValue": 0.75,
|
78
|
+
"liquidationThreshold": 0.9
|
79
|
+
},
|
80
|
+
"0xdbfefd2e8460a6ee4955a68582f85708baea60a3": {
|
81
|
+
"tToken": "0xe48d605bb303f7e88561a9b09640af4323c5b921",
|
82
|
+
"sdToken": "0xe126b8ecaf14c5485b31dfdc29241d0f9141be73",
|
83
|
+
"dToken": "0xd6290195faab4b78f43eb38554e36f243218f334",
|
84
|
+
"loanToValue": 0.75,
|
85
|
+
"liquidationThreshold": 0.9
|
86
|
+
},
|
87
|
+
"0xf469fbd2abcd6b9de8e169d128226c0fc90a012e": {
|
88
|
+
"tToken": "0x4759417285100f0a11846304af76d1ed8d9ad253",
|
89
|
+
"sdToken": "0xe4616a793e4533c1b3069afd70161c31fd323b5a",
|
90
|
+
"dToken": "0x95beb0d11951e3e4140f1265b3df76f685740e18",
|
91
|
+
"loanToValue": 0.75,
|
92
|
+
"liquidationThreshold": 0.9
|
93
|
+
},
|
94
|
+
"0x7fcd174e80f264448ebee8c88a7c4476aaf58ea6": {
|
95
|
+
"tToken": "0x134efc999957fc7984c5ab91bc7ec0f0d373b71e",
|
96
|
+
"sdToken": "0xe3f7084849029144233f00036611245d638033ed",
|
97
|
+
"dToken": "0x1c7f3d9d02ad5fefd1a8feed65957be1ea5f649c",
|
98
|
+
"loanToValue": 0.8,
|
99
|
+
"liquidationThreshold": 0.9
|
100
|
+
},
|
101
|
+
"0xecac9c5f704e954931349da37f60e39f515c11c1": {
|
102
|
+
"tToken": "0xbbb4080b4d4510ace168d1ff8c5cc256ab74e1fb",
|
103
|
+
"sdToken": "0x33a0a85a3f184e75333b8c25307acfb9a5e4cb57",
|
104
|
+
"dToken": "0x8307952247925a2ed9f5729eaf67172a77e08999",
|
105
|
+
"loanToValue": 0.8,
|
106
|
+
"liquidationThreshold": 0.85
|
107
|
+
}
|
108
|
+
}
|
108
109
|
}
|
109
|
-
}
|
@@ -0,0 +1,120 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from defi_services.abis.lending.moonwell.moonwell_comptroller_abi import MOONWELL_COMPTROLLER_ABI
|
4
|
+
from defi_services.abis.lending.moonwell.moonwell_ctoken_abi import MOONWELL_CTOKEN_ABI
|
5
|
+
from defi_services.abis.token.erc20_abi import ERC20_ABI
|
6
|
+
from defi_services.constants.chain_constant import Chain
|
7
|
+
from defi_services.constants.entities.lending_constant import Lending
|
8
|
+
from defi_services.constants.token_constant import Token
|
9
|
+
from defi_services.jobs.queriers.state_querier import StateQuerier
|
10
|
+
from defi_services.services.lending.lending_info.base.moonwell_base import MOONWELL_BASE
|
11
|
+
from defi_services.services.lending.venus_services import VenusStateService
|
12
|
+
|
13
|
+
logger = logging.getLogger("MoonWell Lending Pool State Service")
|
14
|
+
|
15
|
+
|
16
|
+
class MoonWellInfo:
|
17
|
+
mapping = {
|
18
|
+
Chain.base: MOONWELL_BASE
|
19
|
+
}
|
20
|
+
|
21
|
+
|
22
|
+
class MoonWellStateService(VenusStateService):
|
23
|
+
def __init__(self, state_service: StateQuerier, chain_id: str = "0x38"):
|
24
|
+
super().__init__(state_service, chain_id)
|
25
|
+
self.name = f"{chain_id}_{Lending.moonwell}"
|
26
|
+
self.chain_id = chain_id
|
27
|
+
self.pool_info = MoonWellInfo.mapping.get(chain_id)
|
28
|
+
self.state_service = state_service
|
29
|
+
self.comptroller_abi = MOONWELL_COMPTROLLER_ABI
|
30
|
+
self.vtoken_abi = MOONWELL_CTOKEN_ABI
|
31
|
+
|
32
|
+
def get_service_info(self):
|
33
|
+
info = {
|
34
|
+
Lending.moonwell: {
|
35
|
+
"chain_id": self.chain_id,
|
36
|
+
"type": "lending",
|
37
|
+
"protocol_info": self.pool_info
|
38
|
+
}
|
39
|
+
}
|
40
|
+
return info
|
41
|
+
|
42
|
+
def get_apy_lending_pool_function_info(
|
43
|
+
self,
|
44
|
+
reserves_info: dict,
|
45
|
+
block_number: int = "latest"
|
46
|
+
):
|
47
|
+
rpc_calls = {}
|
48
|
+
for token_address, reserve_info in reserves_info.items():
|
49
|
+
if token_address != Token.native_token:
|
50
|
+
query_id = f"decimals_{token_address}_{block_number}".lower()
|
51
|
+
rpc_calls[query_id] = self.state_service.get_function_info(token_address, ERC20_ABI, "decimals", [], block_number)
|
52
|
+
|
53
|
+
ctoken = reserve_info.get("cToken")
|
54
|
+
for fn_name in ['decimals', 'totalSupply', 'totalBorrows', 'supplyRatePerTimestamp', 'borrowRatePerTimestamp', 'exchangeRateStored']:
|
55
|
+
query_id = f"{fn_name}_{ctoken}_{block_number}".lower()
|
56
|
+
rpc_calls[query_id] = self.get_ctoken_function_info(
|
57
|
+
ctoken=ctoken,
|
58
|
+
fn_name=fn_name,
|
59
|
+
block_number=block_number
|
60
|
+
)
|
61
|
+
|
62
|
+
return rpc_calls
|
63
|
+
|
64
|
+
def get_reserve_tokens_metadata(
|
65
|
+
self,
|
66
|
+
decoded_data: dict,
|
67
|
+
reserves_info: dict,
|
68
|
+
block_number: int = "latest"
|
69
|
+
):
|
70
|
+
reserve_tokens_info = []
|
71
|
+
for token_address, reserve_info in reserves_info.items():
|
72
|
+
if token_address != Token.native_token:
|
73
|
+
underlying_decimals_query_id = f"decimals_{token_address}_{block_number}".lower()
|
74
|
+
underlying_decimals = decoded_data.get(underlying_decimals_query_id)
|
75
|
+
else:
|
76
|
+
underlying_decimals = Chain.native_decimals.get(self.chain_id, 18)
|
77
|
+
|
78
|
+
ctoken = reserve_info.get("cToken")
|
79
|
+
ctoken_decimals_query_id = f"decimals_{ctoken}_{block_number}".lower()
|
80
|
+
total_supply_query_id = f"totalSupply_{ctoken}_{block_number}".lower()
|
81
|
+
total_borrow_query_id = f"totalBorrows_{ctoken}_{block_number}".lower()
|
82
|
+
supply_rate_query_id = f"supplyRatePerTimestamp_{ctoken}_{block_number}".lower()
|
83
|
+
borrow_rate_query_id = f"borrowRatePerTimestamp_{ctoken}_{block_number}".lower()
|
84
|
+
exchange_rate_query_id = f"exchangeRateStored_{ctoken}_{block_number}".lower()
|
85
|
+
|
86
|
+
reserve_tokens_info.append({
|
87
|
+
"token": ctoken,
|
88
|
+
"token_decimals": decoded_data.get(ctoken_decimals_query_id),
|
89
|
+
"borrow_rate": decoded_data.get(borrow_rate_query_id),
|
90
|
+
"supply_rate": decoded_data.get(supply_rate_query_id),
|
91
|
+
"supply": decoded_data.get(total_supply_query_id),
|
92
|
+
"borrow": decoded_data.get(total_borrow_query_id),
|
93
|
+
"exchange_rate": decoded_data.get(exchange_rate_query_id),
|
94
|
+
"underlying_decimals": underlying_decimals,
|
95
|
+
"underlying": token_address
|
96
|
+
})
|
97
|
+
return reserve_tokens_info
|
98
|
+
|
99
|
+
@classmethod
|
100
|
+
def _calculate_interest_rates(
|
101
|
+
cls, token_info: dict, pool_decimals: int, apx_block_speed_in_seconds: float):
|
102
|
+
exchange_rate = float(token_info["exchange_rate"]) / 10 ** (18 - 8 + token_info["underlying_decimals"])
|
103
|
+
|
104
|
+
total_borrow = float(token_info["borrow"]) / 10 ** int(token_info["underlying_decimals"])
|
105
|
+
total_supply = float(token_info["supply"]) * exchange_rate / 10 ** int(token_info["token_decimals"])
|
106
|
+
|
107
|
+
supply_apy = ((token_info["supply_rate"] / 10 ** pool_decimals) * 86400 + 1) ** 365 - 1
|
108
|
+
borrow_apy = ((token_info["borrow_rate"] / 10 ** pool_decimals) * 86400 + 1) ** 365 - 1
|
109
|
+
|
110
|
+
return {
|
111
|
+
'deposit_apy': supply_apy,
|
112
|
+
'borrow_apy': borrow_apy,
|
113
|
+
'total_deposit': total_supply,
|
114
|
+
'total_borrow': total_borrow
|
115
|
+
}
|
116
|
+
|
117
|
+
def get_ctoken_function_info(self, ctoken: str, fn_name: str, fn_paras: list = None, block_number: int = "latest"):
|
118
|
+
return self.state_service.get_function_info(
|
119
|
+
ctoken, self.vtoken_abi, fn_name, fn_paras, block_number
|
120
|
+
)
|
@@ -1,10 +1,13 @@
|
|
1
1
|
import logging
|
2
2
|
|
3
|
+
from defi_services.abis.lending.radiant_v2.radiant_reward_converter import RADIANT_REWARD_CONVERTER_ABI
|
3
4
|
from defi_services.abis.lending.radiant_v2.radiant_v2_incentive_abi import RADIANT_V2_INCENTIVE_ABI
|
5
|
+
from defi_services.abis.token.erc20_abi import ERC20_ABI
|
4
6
|
from defi_services.constants.chain_constant import Chain
|
5
7
|
from defi_services.constants.entities.lending_constant import Lending
|
6
8
|
from defi_services.jobs.queriers.state_querier import StateQuerier
|
7
9
|
from defi_services.services.lending.lending_info.arbitrum.radiant_arbitrum import RADIANT_ARB
|
10
|
+
from defi_services.services.lending.lending_info.base.radiant_v2_base import RADIANT_BASE
|
8
11
|
from defi_services.services.lending.lending_info.bsc.radiant_bsc import RADIANT_BSC
|
9
12
|
from defi_services.services.lending.lending_info.ethereum.radiant_eth import RADIANT_ETH
|
10
13
|
from defi_services.services.lending.valas_services import ValasStateService
|
@@ -17,7 +20,8 @@ class RadiantInfo:
|
|
17
20
|
mapping = {
|
18
21
|
Chain.arbitrum: RADIANT_ARB,
|
19
22
|
Chain.bsc: RADIANT_BSC,
|
20
|
-
Chain.ethereum: RADIANT_ETH
|
23
|
+
Chain.ethereum: RADIANT_ETH,
|
24
|
+
Chain.base: RADIANT_BASE
|
21
25
|
}
|
22
26
|
|
23
27
|
|
@@ -67,19 +71,55 @@ class RadiantStateService(ValasStateService):
|
|
67
71
|
block_number: int = "latest"
|
68
72
|
):
|
69
73
|
rpc_calls = {}
|
70
|
-
|
71
|
-
|
72
|
-
|
74
|
+
if self.chain_id != Chain.base:
|
75
|
+
key = f"allPendingRewards_{self.name}_{wallet}_{block_number}".lower()
|
76
|
+
rpc_calls[key] = self.get_function_incentive_info(
|
77
|
+
"allPendingRewards", [wallet], block_number)
|
78
|
+
else:
|
79
|
+
# key = f"viewPendingRewards_{self.name}_{wallet}_{block_number}".lower()
|
80
|
+
# rpc_calls[key] = self.get_function_reward_converter_info(
|
81
|
+
# "viewPendingRewards", [wallet], block_number)
|
82
|
+
for token in self.pool_info.get('rewardToken'):
|
83
|
+
key = f"decimals_{token}"
|
84
|
+
rpc_calls[key] = self.state_service.get_function_info(
|
85
|
+
token, ERC20_ABI, "decimals"
|
86
|
+
)
|
73
87
|
|
74
88
|
return rpc_calls
|
75
89
|
|
76
90
|
def calculate_rewards_balance(
|
77
91
|
self, wallet: str, reserves_info: dict, decoded_data: dict, block_number: int = "latest"):
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
92
|
+
if self.chain_id != Chain.base:
|
93
|
+
reward_token = self.pool_info['rewardToken']
|
94
|
+
key = f"allPendingRewards_{self.name}_{wallet}_{block_number}".lower()
|
95
|
+
rewards = decoded_data.get(key) / 10 ** 18
|
96
|
+
result = {
|
97
|
+
reward_token: {"amount": rewards}
|
98
|
+
}
|
99
|
+
else:
|
100
|
+
# key = f"viewPendingRewards_{self.name}_{wallet}_{block_number}".lower()
|
101
|
+
# rewards = decoded_data.get(key)
|
102
|
+
result = {}
|
103
|
+
w3 = self.state_service.get_w3()
|
104
|
+
contract = w3.eth.contract(w3.to_checksum_address(
|
105
|
+
self.pool_info.get('rewardConverter')), abi=RADIANT_REWARD_CONVERTER_ABI
|
106
|
+
)
|
107
|
+
rewards = contract.functions.viewPendingRewards(w3.to_checksum_address(wallet)).call()
|
108
|
+
amts = rewards[1]
|
109
|
+
tokens = rewards[0]
|
110
|
+
for idx in range(len(tokens)):
|
111
|
+
amount = amts[idx]
|
112
|
+
token = tokens[idx].lower()
|
113
|
+
if token not in self.pool_info.get('rewardToken', []):
|
114
|
+
continue
|
115
|
+
decimal_key = f"decimals_{token}"
|
116
|
+
result.update({
|
117
|
+
token.lower(): {"amount": amount / 10**decoded_data.get(decimal_key)}
|
118
|
+
})
|
84
119
|
|
85
120
|
return result
|
121
|
+
|
122
|
+
def get_function_reward_converter_info(self, fn_name: str, fn_paras=None, block_number: int = 'latest'):
|
123
|
+
return self.state_service.get_function_info(
|
124
|
+
self.pool_info['rewardConverter'], self.incentive_abi, fn_name, fn_paras, block_number
|
125
|
+
)
|
@@ -0,0 +1,64 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from defi_services.abis.lending.venus.venus_comptroller_abi import VENUS_COMPTROLLER_ABI
|
4
|
+
from defi_services.abis.lending.venus.vtoken_abi import VTOKEN_ABI
|
5
|
+
from defi_services.constants.chain_constant import Chain
|
6
|
+
from defi_services.constants.entities.lending_constant import Lending
|
7
|
+
from defi_services.jobs.queriers.state_querier import StateQuerier
|
8
|
+
from defi_services.services.lending.lending_info.base.sonne_base import SONNE_BASE
|
9
|
+
from defi_services.services.lending.venus_services import VenusStateService
|
10
|
+
|
11
|
+
logger = logging.getLogger("Ionic Lending Pool State Service")
|
12
|
+
|
13
|
+
|
14
|
+
class SonneInfo:
|
15
|
+
mapping = {
|
16
|
+
Chain.base: SONNE_BASE
|
17
|
+
}
|
18
|
+
|
19
|
+
|
20
|
+
class SonneStateService(VenusStateService):
|
21
|
+
def __init__(self, state_service: StateQuerier, chain_id: str = "0x38"):
|
22
|
+
super().__init__(state_service, chain_id)
|
23
|
+
self.name = f"{chain_id}_{Lending.sonne}"
|
24
|
+
self.chain_id = chain_id
|
25
|
+
self.pool_info = SonneInfo.mapping.get(chain_id)
|
26
|
+
self.state_service = state_service
|
27
|
+
self.comptroller_abi = VENUS_COMPTROLLER_ABI
|
28
|
+
self.vtoken_abi = VTOKEN_ABI
|
29
|
+
|
30
|
+
def get_service_info(self):
|
31
|
+
info = {
|
32
|
+
Lending.sonne: {
|
33
|
+
"chain_id": self.chain_id,
|
34
|
+
"type": "lending",
|
35
|
+
"protocol_info": self.pool_info
|
36
|
+
}
|
37
|
+
}
|
38
|
+
return info
|
39
|
+
|
40
|
+
def calculate_apy_lending_pool_function_call(
|
41
|
+
self,
|
42
|
+
reserves_info: dict,
|
43
|
+
decoded_data: dict,
|
44
|
+
token_prices: dict,
|
45
|
+
pool_token_price: float,
|
46
|
+
pool_decimals: int = 18,
|
47
|
+
block_number: int = "latest",
|
48
|
+
):
|
49
|
+
reserve_tokens_info = self.get_reserve_tokens_metadata(decoded_data, reserves_info, block_number)
|
50
|
+
|
51
|
+
data = {}
|
52
|
+
for token_info in reserve_tokens_info:
|
53
|
+
underlying_token = token_info['underlying']
|
54
|
+
c_token = token_info['token']
|
55
|
+
|
56
|
+
assets = {
|
57
|
+
underlying_token: self._calculate_interest_rates(
|
58
|
+
token_info, pool_decimals=pool_decimals,
|
59
|
+
apx_block_speed_in_seconds=1
|
60
|
+
)
|
61
|
+
}
|
62
|
+
data[c_token] = assets
|
63
|
+
|
64
|
+
return data
|
@@ -151,16 +151,22 @@ class VenusStateService(CompoundStateService):
|
|
151
151
|
|
152
152
|
def calculate_rewards_balance(
|
153
153
|
self, wallet: str, reserves_info: dict, decoded_data: dict, block_number: int = "latest"):
|
154
|
+
if not self.pool_info.get('lensAddress'):
|
155
|
+
return {}
|
156
|
+
|
154
157
|
w3 = self.state_service.get_w3()
|
155
|
-
contract = w3.eth.contract(address=w3.to_checksum_address(self.pool_info.get("lensAddress")), abi
|
158
|
+
contract = w3.eth.contract(address=w3.to_checksum_address(self.pool_info.get("lensAddress")), abi=self.lens_abi)
|
156
159
|
# get_reward_id = f"pendingRewards_{self.name}_{wallet}_{block_number}".lower()
|
157
|
-
return_data = contract.functions.pendingRewards(
|
160
|
+
return_data = contract.functions.pendingRewards(
|
161
|
+
w3.to_checksum_address(wallet),
|
162
|
+
w3.to_checksum_address(self.pool_info.get("comptrollerAddress"))).call(block_identifier=block_number)
|
163
|
+
|
158
164
|
rewards = return_data[2]
|
159
165
|
for item in return_data[-1]:
|
160
166
|
rewards += item[-1]
|
161
167
|
reward_token = self.pool_info.get("rewardToken")
|
162
168
|
result = {
|
163
|
-
reward_token: {"amount": rewards/10**18}
|
169
|
+
reward_token: {"amount": rewards / 10 ** 18}
|
164
170
|
}
|
165
171
|
return result
|
166
172
|
|