Skip to content

Commit

Permalink
feat: automatically canonize user address arg in routers
Browse files Browse the repository at this point in the history
  • Loading branch information
pik694 committed Mar 27, 2024
1 parent b474e57 commit 1737fe6
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 23 deletions.
29 changes: 28 additions & 1 deletion backend/app/infrastructure/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from flask_restx import Resource

from eth_utils import to_checksum_address

from gql import Client
from gql.transport.requests import RequestsHTTPTransport

Expand All @@ -19,12 +21,37 @@ class OctantResource(Resource):
def __init__(self, *args, **kwargs):
Resource.__init__(self, *args, *kwargs)

@classmethod
def canonize_address(cls, field_name: str, force=True):
def _add_address_canonization(handler):
def _decorated(*args, **kwargs):
field_value = kwargs.get(field_name)
if force or field_value is not None:
updated_field = to_checksum_address(field_value)
kwargs.update([(field_name, updated_field)])

return handler(*args, **kwargs)

return _decorated

return _add_address_canonization

@classmethod
def _default_address_canonizer(cls, attr):
user_address_canonizer = OctantResource.canonize_address(
field_name="user_address", force=False
)
proposal_address_canonizer = OctantResource.canonize_address(
field_name="proposal_address", force=False
)
return user_address_canonizer(proposal_address_canonizer(attr))

def __getattribute__(self, name):
attr = object.__getattribute__(self, name)

decorator = default_decorators.get(name)
if decorator is not None:
attr = decorator(attr)
attr = OctantResource._default_address_canonizer(decorator(attr))

return attr

Expand Down
29 changes: 16 additions & 13 deletions backend/app/infrastructure/routes/deposits.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from eth_utils import to_checksum_address
from flask import current_app as app
from flask_restx import Namespace, fields

Expand Down Expand Up @@ -92,44 +91,48 @@ def get(self, epoch):
return {"lockedRatio": locked_ratio}


@ns.route("/users/<string:address>/<int:epoch>")
@ns.route("/users/<string:user_address>/<int:epoch>")
@ns.doc(
description="Returns user's effective deposit for a finialized or pending epoch.",
params={
"epoch": "Epoch number",
"address": "User ethereum address in hexadecimal form (case-insensitive, prefixed with 0x)",
"user_address": "User ethereum address in hexadecimal form (case-insensitive, prefixed with 0x)",
},
)
class UserEffectiveDeposit(OctantResource):
@ns.marshal_with(user_effective_deposit_model)
@ns.response(200, "User effective deposit successfully retrieved")
def get(self, address: str, epoch: int):
app.logger.debug(f"Getting user {address} effective deposit in epoch {epoch}")
result = get_user_effective_deposit(to_checksum_address(address), epoch)
app.logger.debug(f"User {address} effective deposit in epoch {epoch}: {result}")
def get(self, user_address: str, epoch: int):
app.logger.debug(
f"Getting user {user_address} effective deposit in epoch {epoch}"
)
result = get_user_effective_deposit(user_address, epoch)
app.logger.debug(
f"User {user_address} effective deposit in epoch {epoch}: {result}"
)

return {
"effectiveDeposit": result,
}


@ns.route("/users/<string:address>/estimated_effective_deposit")
@ns.route("/users/<string:user_address>/estimated_effective_deposit")
@ns.doc(
description="Returns user's estimated effective deposit for the current epoch.",
params={
"address": "User ethereum address in hexadecimal form (case-insensitive, prefixed with 0x)",
"user_address": "User ethereum address in hexadecimal form (case-insensitive, prefixed with 0x)",
},
)
class UserEstimatedEffectiveDeposit(OctantResource):
@ns.marshal_with(user_effective_deposit_model)
@ns.response(200, "User estimated effective deposit successfully retrieved")
def get(self, address: str):
def get(self, user_address: str):
app.logger.debug(
f"Getting user {address} estimated effective deposit in the current epoch"
f"Getting user {user_address} estimated effective deposit in the current epoch"
)
result = estimate_user_effective_deposit(to_checksum_address(address))
result = estimate_user_effective_deposit(user_address)
app.logger.debug(
f"User {address} estimated effective deposit in the current epoch: {result}"
f"User {user_address} estimated effective deposit in the current epoch: {result}"
)

return {
Expand Down
8 changes: 3 additions & 5 deletions backend/app/infrastructure/routes/rewards.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from eth_utils import to_checksum_address
from flask import current_app as app
from flask_restx import Namespace, fields

Expand Down Expand Up @@ -188,10 +187,9 @@ class UserBudget(OctantResource):
@ns.marshal_with(user_budget_model)
@ns.response(200, "Budget successfully retrieved")
def get(self, user_address, epoch):
checksum_address = to_checksum_address(user_address)
app.logger.debug(f"Getting user {checksum_address} budget in epoch {epoch}")
budget = get_budget(checksum_address, epoch)
app.logger.debug(f"User {checksum_address} budget in epoch {epoch}: {budget}")
app.logger.debug(f"Getting user {user_address} budget in epoch {epoch}")
budget = get_budget(user_address, epoch)
app.logger.debug(f"User {user_address} budget in epoch {epoch}: {budget}")

return {"budget": budget}

Expand Down
4 changes: 0 additions & 4 deletions backend/app/infrastructure/routes/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from flask_restx import Namespace, fields
from flask_restx import reqparse

from eth_utils import to_checksum_address

import app.legacy.controllers.user as user_controller
from app.extensions import api
Expand Down Expand Up @@ -128,8 +127,6 @@ class PatronMode(OctantResource):
@ns.marshal_with(user_patron_mode_status_model)
@ns.response(200, "User's patron mode status retrieved")
def get(self, user_address: str):
user_address = to_checksum_address(user_address)

app.logger.debug(f"Getting user {user_address} patron mode status")
patron_mode_status = user_controller.get_patron_mode_status(user_address)
app.logger.debug(
Expand All @@ -146,7 +143,6 @@ def get(self, user_address: str):
@ns.response(204, "User's patron mode status updated.")
@ns.response(400, "Could not update patron mode status.")
def patch(self, user_address: str):
user_address = to_checksum_address(user_address)
signature = ns.payload.get("signature")

app.logger.info(f"Updating user {user_address} patron mode status")
Expand Down

0 comments on commit 1737fe6

Please sign in to comment.