Skip to content

Commit 8af9f12

Browse files
committed
Fix debank token parsing
1 parent 8edaa28 commit 8af9f12

2 files changed

Lines changed: 55 additions & 10 deletions

File tree

blockapi/v2/api/debank.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from blockapi.utils.address import make_checksum_address
1111
from blockapi.utils.datetime import parse_dt
12-
from blockapi.utils.num import decimals_to_raw, to_decimal
12+
from blockapi.utils.num import decimals_to_raw
1313
from blockapi.v2.api.debank_maps import (
1414
COINGECKO_IDS_BY_CONTRACTS,
1515
DEBANK_APP_CHAIN_MAP,
@@ -42,6 +42,7 @@
4242
DebankModelAppPortfolioItem,
4343
DebankModelApp,
4444
DebankModelPredictionDetail,
45+
DebankDepositToken,
4546
)
4647

4748
logger = logging.getLogger(__name__)
@@ -609,19 +610,19 @@ def parse(self, response: list) -> list[DebankApp]:
609610

610611
apps = []
611612
for item in response:
612-
app = self._parse_app(item)
613+
try:
614+
app = self._parse_app(item)
615+
except Exception as e:
616+
logger.error(f'Failed to parse app: {e}')
617+
continue
613618
if app:
614619
apps.append(app)
615620

616621
return apps
617622

618623
def _parse_app(self, raw_app: dict) -> Optional[DebankApp]:
619624
"""Parse a single app from the response."""
620-
try:
621-
model = DebankModelApp(**raw_app)
622-
except Exception as e:
623-
logger.error(f'Failed to parse app: {e}')
624-
return None
625+
model = DebankModelApp(**raw_app)
625626

626627
deposits = []
627628
predictions = []
@@ -679,17 +680,28 @@ def _parse_deposit(
679680
self, item: DebankModelAppPortfolioItem, chain: Optional[Blockchain]
680681
) -> Optional[DebankAppDeposit]:
681682
"""Parse a deposit/common type portfolio item."""
683+
parsed_tokens = [
684+
self._parse_token(t.model_dump()) for t in item.asset_token_list or []
685+
]
686+
682687
return DebankAppDeposit.from_api(
683688
name=item.name,
684689
asset_usd_value=item.stats.asset_usd_value,
685690
debt_usd_value=item.stats.debt_usd_value,
686691
net_usd_value=item.stats.net_usd_value,
687-
tokens=item.asset_token_list,
692+
tokens=[t for t in parsed_tokens if t is not None],
688693
chain=chain,
689694
position_index=item.position_index,
690695
update_at=item.update_at,
691696
)
692697

698+
def _parse_token(self, raw_token: dict) -> Optional[DebankDepositToken]:
699+
try:
700+
return DebankDepositToken.from_api(**raw_token)
701+
except Exception as e:
702+
logger.error(f'Failed to parse deposit token: {e}')
703+
return None
704+
693705

694706
class DebankApi(CustomizableBlockchainApi, BalanceMixin, IPortfolio):
695707
"""

blockapi/v2/models.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,7 +1197,7 @@ class DebankModelPredictionDetail(BaseModel):
11971197
event_end_at: Optional[float] = None
11981198

11991199

1200-
class DebankDepositToken(BaseModel):
1200+
class DebankModelDepositToken(BaseModel):
12011201
"""Token within deposit/common type portfolio items."""
12021202

12031203
id: str
@@ -1218,7 +1218,7 @@ class DebankModelAppPortfolioItem(BaseModel):
12181218
detail: dict
12191219
position_index: str
12201220
asset_dict: Optional[dict] = None
1221-
asset_token_list: list[DebankDepositToken] = Field(default_factory=list)
1221+
asset_token_list: list[DebankModelDepositToken] = Field(default_factory=list)
12221222
update_at: Optional[float] = None
12231223
proxy_detail: Optional[dict] = None
12241224

@@ -1281,6 +1281,39 @@ def from_api(
12811281
)
12821282

12831283

1284+
@attr.s(auto_attribs=True, slots=True, frozen=True)
1285+
class DebankDepositToken:
1286+
id: str
1287+
symbol: str
1288+
name: str
1289+
amount: Decimal
1290+
app_id: str
1291+
price: Decimal
1292+
logo_url: Optional[str]
1293+
1294+
@classmethod
1295+
def from_api(
1296+
cls,
1297+
*,
1298+
id: str,
1299+
symbol: str,
1300+
name: str,
1301+
amount: Union[str, float, int],
1302+
app_id: str,
1303+
price: Union[str, float, int],
1304+
logo_url: Optional[str] = None,
1305+
) -> 'DebankDepositToken':
1306+
return cls(
1307+
id=id,
1308+
symbol=symbol,
1309+
name=name,
1310+
amount=to_decimal(amount),
1311+
app_id=app_id,
1312+
price=to_decimal(price),
1313+
logo_url=logo_url,
1314+
)
1315+
1316+
12841317
@attr.s(auto_attribs=True, slots=True, frozen=True)
12851318
class DebankAppDeposit:
12861319
"""Represents a deposit/holding within a Debank App (e.g., Polymarket cash deposit)."""

0 commit comments

Comments
 (0)