Skip to content

Commit 1c9ff05

Browse files
authored
Merge pull request #593 from Dprof-in-tech/fix-issue-586-save-vesu-data-in-db
implemented save vesu data into db
2 parents 703f425 + acd2433 commit 1c9ff05

File tree

3 files changed

+42
-16
lines changed

3 files changed

+42
-16
lines changed

apps/data_handler/handlers/loan_states/vesu/events.py

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
"""
66

77
from decimal import Decimal
8+
from sqlalchemy import select
89

910
from shared.starknet_client import StarknetClient
11+
from shared.db import session
12+
from apps.data_handler.models import VesuPosition
1013
from starknet_py.hash.selector import get_selector_from_name
1114

1215

@@ -23,7 +26,8 @@ class VesuLoanEntity:
2326
def __init__(self):
2427
"""Initialize Starknet client and storage."""
2528
self.client = StarknetClient()
26-
self.mock_db = {}
29+
self.session = session
30+
# self.mock_db = {}
2731
self._cache = {}
2832
self.last_processed_block = 654244 # First VESU event block
2933

@@ -42,24 +46,27 @@ async def _get_token_decimals(self, token_address: int) -> Decimal:
4246
return Decimal(10) ** Decimal(decimals)
4347
return Decimal("Inf")
4448

45-
async def calculate_health_factor(self, user_address: int) -> dict:
49+
async def calculate_health_factor(self, user_address: int) -> dict[str, Decimal]:
4650
"""
4751
Calculate health factors for all positions of a user.
4852
4953
:param user_address: User address in int format
50-
51-
:return: Dictionary with pool IDs as keys and health factors as values
54+
:return: Dictionary with pool IDs (in hex) as keys and health factors as values
5255
"""
56+
result = await self.session.execute(
57+
select(VesuPosition).where(VesuPosition.user == str(user_address))
58+
)
59+
positions = result.scalars().all()
5360

54-
user_positions = {k: v for k, v in self.mock_db.items() if k[0] == user_address}
55-
56-
if not user_positions:
61+
if not positions:
5762
return {}
5863

5964
results = {}
60-
for (_, pool_id), position_data in user_positions.items():
61-
collateral_asset = position_data["collateral_asset"]
62-
debt_asset = position_data["debt_asset"]
65+
66+
for pos in positions:
67+
pool_id = int(pos.pool_id)
68+
collateral_asset = int(pos.collateral_asset)
69+
debt_asset = int(pos.debt_asset)
6370

6471
if collateral_asset == 0 or debt_asset == 0:
6572
results[hex(pool_id)] = Decimal("inf")
@@ -351,10 +358,15 @@ async def update_positions_data(self) -> None:
351358
user = event_keys[4]
352359
block_number = event.block_number
353360

354-
self.mock_db[(user, pool_id)] = {
355-
"pool_id": pool_id,
356-
"collateral_asset": collateral_asset,
357-
"debt_asset": debt_asset,
358-
"block_number": block_number,
359-
}
361+
position = VesuPosition(
362+
user=str(user),
363+
pool_id=str(pool_id),
364+
collateral_asset=str(collateral_asset),
365+
debt_asset=str(debt_asset),
366+
block_number=block_number,
367+
)
368+
self.session.add(position)
369+
360370
self.last_processed_block = max(self.last_processed_block, block_number)
371+
372+
await self.session.commit()

apps/data_handler/models/__init__.py

Whitespace-only changes.

apps/data_handler/models/base.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from sqlalchemy import Column, BigInteger, String
2+
from sqlalchemy.ext.declarative import declarative_base
3+
4+
Base = declarative_base()
5+
6+
class VesuPosition(Base):
7+
__tablename__ = "vesu_positions"
8+
9+
id = Column(BigInteger, primary_key=True, autoincrement=True)
10+
user = Column(String, index=True)
11+
pool_id = Column(String, index=True)
12+
collateral_asset = Column(String)
13+
debt_asset = Column(String)
14+
block_number = Column(BigInteger)

0 commit comments

Comments
 (0)