Skip to content

Commit

Permalink
Merge pull request #304 from baitcode/feature-standarize-mint-and-burn
Browse files Browse the repository at this point in the history
Feature standarize mint and burn
  • Loading branch information
djeck1432 authored Nov 23, 2024
2 parents 516be74 + 216f360 commit 1276307
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 9 deletions.
46 changes: 41 additions & 5 deletions apps/data_handler/handler_tools/data_parser/nostra.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
DebtBurnEventData,
InterestRateModelEventData,
DebtTransferEventData,
BearingCollateralMintEventData,
BearingCollateralBurnEventData
)


Expand Down Expand Up @@ -45,13 +47,47 @@ def parse_non_interest_bearing_collateral_mint_event(self):
def parse_non_interest_bearing_collateral_burn_event(self):
pass

def parse_interest_bearing_collateral_mint_event(self):
pass
def parse_interest_bearing_collateral_mint_event(self, event_data: list[Any]) -> BearingCollateralMintEventData:
"""
Parses the BearingCollateralMint event data into a human-readable format using the BearingCollateralMintEventData serializer.
The event data is fetched from on-chain logs and is structured in the following way:
- event_data[0]: The user address (as a hexadecimal string).
- event_data[1]: Token amount
def parse_interest_bearing_collateral_burn_event(self):
pass
Args:
event_data (list[Any]): A list containing the raw event data, typically with 3 or more elements:
user address, amount of tokens
Returns:
BearingCollateralMintEventData: A Pydantic model with the parsed and validated event data in a human-readable format.
"""
return BearingCollateralMintEventData(
user=event_data[0],
amount=event_data[1],
)

def parse_interest_bearing_collateral_burn_event(self, event_data: list[Any]) -> BearingCollateralBurnEventData:
"""
Parses the BearingCollateralMint event data into a human-readable format using the BearingCollateralMintEventData serializer.
The event data is fetched from on-chain logs and is structured in the following way:
- event_data[0]: The user address (as a hexadecimal string).
- event_data[1]: Token amount
Args:
event_data (list[Any]): A list containing the raw event data, typically with 3 or more elements:
user address, amount of tokens
Returns:
BearingCollateralMintEventData: A Pydantic model with the parsed and validated event data in a human-readable format.
"""
return BearingCollateralBurnEventData(
user=event_data[0],
amount=event_data[1],
)

def parse_debt_transfer_event(
def parse_debt_transfer_event(
cls, event_data: List[Any], from_address: str
) -> DebtTransferEventData:
"""
Expand Down
92 changes: 92 additions & 0 deletions apps/data_handler/handler_tools/data_parser/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,53 @@ def validate_numeric_string(cls, value: str, info: ValidationInfo) -> Decimal:
f"{info.field_name} field is not a valid hexadecimal number"
)


class BearingCollateralMintEventData(BaseModel):
user: str
amount: Decimal

@field_validator("user")
def validate_address(cls, value: str, info: ValidationInfo) -> str:
"""
Validates that the provided address starts with '0x' and
formats it with leading zeros.
Args:
value (str): The address string to validate.
Returns:
str: The validated and formatted address.
Raises:
ValueError: If the provided address does not start with '0x'.
"""
if not value.startswith("0x"):
raise ValueError(f"Invalid address provided for {info.field_name}")
return add_leading_zeros(value)

@field_validator("amount")
def validate_numeric_string(cls, value: str, info: ValidationInfo) -> Decimal:
"""
Validates that the provided amount is numeric and converts it to a Decimal.
Args:
value (str): The amount string to validate.
Returns:
Decimal: The validated and converted amount as a Decimal.
Raises:
ValueError: If the provided amount is not numeric.
"""
try:
return Decimal(int(value, 16))
except ValueError:
raise ValueError(
f"{info.field_name} field is not a valid hexadecimal number"
)


class DebtTransferEventData(BaseModel):
"""
Data model representing a debt transfer event.
Expand Down Expand Up @@ -515,4 +562,49 @@ def validate_numeric_string(cls, value: str, info: ValidationInfo) -> Decimal:
raise ValueError(
f"{info.field_name} field is not a valid hexadecimal number"
)


class BearingCollateralBurnEventData(BaseModel):
user: str
amount: Decimal

@field_validator("user")
def validate_address(cls, value: str, info: ValidationInfo) -> str:
"""
Validates that the provided address starts with '0x' and
formats it with leading zeros.
Args:
value (str): The address string to validate.
Returns:
str: The validated and formatted address.
Raises:
ValueError: If the provided address does not start with '0x'.
"""
if not value.startswith("0x"):
raise ValueError(f"Invalid address provided for {info.field_name}")
return add_leading_zeros(value)

@field_validator("amount")
def validate_numeric_string(cls, value: str, info: ValidationInfo) -> Decimal:
"""
Validates that the provided amount is numeric and converts it to a Decimal.
Args:
value (str): The amount string to validate.
Returns:
Decimal: The validated and converted amount as a Decimal.
Raises:
ValueError: If the provided amount is not numeric.
"""
try:
return Decimal(int(value, 16))
except ValueError:
raise ValueError(
f"{info.field_name} field is not a valid hexadecimal number"
)
14 changes: 10 additions & 4 deletions apps/data_handler/handlers/loan_states/nostra_alpha/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -534,11 +534,14 @@ def process_interest_bearing_collateral_mint_event(self, event: pd.Series) -> No
# The order of the values in the `data` column is: `user`, `amount`, ``.
# Example:
# https://starkscan.co/event/0x07d222d9a70edbe717001ab4305a7a8cfb05116a35da24a9406209dbb07b6d0b_5.
user = event["data"][0]
data = NostraDataParser.parse_interest_bearing_collateral_mint_event(event["data"])
user, face_amount = data.user, data.amount

if user == self.IGNORE_USER:
return

token = self.ADDRESSES_TO_TOKENS[event["from_address"]]
face_amount = decimal.Decimal(str(int(event["data"][1], base=16)))

raw_amount = face_amount / self.collateral_interest_rate_models.values[token]
# add additional info block and timestamp
self.loan_entities[user].extra_info.block = event["block_number"]
Expand Down Expand Up @@ -569,11 +572,14 @@ def process_interest_bearing_collateral_burn_event(self, event: pd.Series) -> No
# The order of the values in the `data` column is: `user`, `amount`, ``.
# Example:
# https://starkscan.co/event/0x0106494005bbab6f01e7779760891eb9ae20e01b905afdb16111f7cf3a28a53e_1.
user = event["data"][0]

data = NostraDataParser.parse_interest_bearing_collateral_mint_event(event["data"])
user, face_amount = data.user, data.amount

if user == self.IGNORE_USER:
return

token = self.ADDRESSES_TO_TOKENS[event["from_address"]]
face_amount = decimal.Decimal(str(int(event["data"][1], base=16)))
raw_amount = face_amount / self.collateral_interest_rate_models.values[token]
# add additional info block and timestamp
self.loan_entities[user].extra_info.block = event["block_number"]
Expand Down

0 comments on commit 1276307

Please sign in to comment.