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.
Files changed (28) hide show
  1. defi_services/__init__.py +1 -1
  2. defi_services/abis/lending/ionic/__init__.py +0 -0
  3. defi_services/abis/lending/ionic/ionic_ctoken_abi.py +1108 -0
  4. defi_services/abis/lending/moonwell/__init__.py +0 -0
  5. defi_services/abis/lending/moonwell/moonwell_comptroller_abi.py +1500 -0
  6. defi_services/abis/lending/moonwell/moonwell_ctoken_abi.py +1431 -0
  7. defi_services/abis/lending/radiant_v2/radiant_reward_converter.py +817 -0
  8. defi_services/constants/chain_constant.py +2 -1
  9. defi_services/constants/entities/lending_constant.py +10 -5
  10. defi_services/constants/entities/lending_services.py +9 -1
  11. defi_services/services/lending/granary_services.py +3 -1
  12. defi_services/services/lending/ionic_service.py +167 -0
  13. defi_services/services/lending/lending_info/base/granary_base.py +62 -0
  14. defi_services/services/lending/lending_info/base/ionic_base.py +173 -0
  15. defi_services/services/lending/lending_info/base/moonwell_base.py +79 -1
  16. defi_services/services/lending/lending_info/base/radiant_v2_base.py +57 -0
  17. defi_services/services/lending/lending_info/base/sonne_base.py +53 -0
  18. defi_services/services/lending/lending_info/base/zerolend_base.py +99 -99
  19. defi_services/services/lending/moonwell_service.py +120 -0
  20. defi_services/services/lending/radiant_v2_services.py +50 -10
  21. defi_services/services/lending/sonne_service.py +64 -0
  22. defi_services/services/lending/venus_services.py +9 -3
  23. defi_services/services/lending/zerolend_services.py +1 -1
  24. {defi_state_querier-0.5.23.dist-info → defi_state_querier-0.5.25.dist-info}/METADATA +1 -1
  25. {defi_state_querier-0.5.23.dist-info → defi_state_querier-0.5.25.dist-info}/RECORD +28 -15
  26. {defi_state_querier-0.5.23.dist-info → defi_state_querier-0.5.25.dist-info}/LICENSE +0 -0
  27. {defi_state_querier-0.5.23.dist-info → defi_state_querier-0.5.25.dist-info}/WHEEL +0 -0
  28. {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
- "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
- }
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
- key = f"allPendingRewards_{self.name}_{wallet}_{block_number}".lower()
71
- rpc_calls[key] = self.get_function_incentive_info(
72
- "allPendingRewards", [wallet], block_number)
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
- reward_token = self.pool_info['rewardToken']
79
- key = f"allPendingRewards_{self.name}_{wallet}_{block_number}".lower()
80
- rewards = decoded_data.get(key) / 10 ** 18
81
- result = {
82
- reward_token: {"amount": rewards}
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 = self.lens_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(w3.to_checksum_address(wallet), w3.to_checksum_address(self.pool_info.get("comptrollerAddress"))).call(block_identifier=block_number)
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
 
@@ -33,4 +33,4 @@ class ZeroLendStateService(AaveV3StateService):
33
33
  "protocol_info": self.pool_info
34
34
  }
35
35
  }
36
- return info
36
+ return info
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: defi-state-querier
3
- Version: 0.5.23
3
+ Version: 0.5.25
4
4
  Summary: Calculate apy, apr, and wallet information,... in decentralized applications.
5
5
  Home-page: https://github.com/Centic-io/defi-state-querier
6
6
  Author: Viet-Bang Pham