|
9 | 9 |
|
10 | 10 | from blockapi.utils.address import make_checksum_address |
11 | 11 | 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 |
13 | 13 | from blockapi.v2.api.debank_maps import ( |
14 | 14 | COINGECKO_IDS_BY_CONTRACTS, |
15 | 15 | DEBANK_APP_CHAIN_MAP, |
|
42 | 42 | DebankModelAppPortfolioItem, |
43 | 43 | DebankModelApp, |
44 | 44 | DebankModelPredictionDetail, |
| 45 | + DebankDepositToken, |
45 | 46 | ) |
46 | 47 |
|
47 | 48 | logger = logging.getLogger(__name__) |
@@ -609,19 +610,19 @@ def parse(self, response: list) -> list[DebankApp]: |
609 | 610 |
|
610 | 611 | apps = [] |
611 | 612 | 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 |
613 | 618 | if app: |
614 | 619 | apps.append(app) |
615 | 620 |
|
616 | 621 | return apps |
617 | 622 |
|
618 | 623 | def _parse_app(self, raw_app: dict) -> Optional[DebankApp]: |
619 | 624 | """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) |
625 | 626 |
|
626 | 627 | deposits = [] |
627 | 628 | predictions = [] |
@@ -679,17 +680,28 @@ def _parse_deposit( |
679 | 680 | self, item: DebankModelAppPortfolioItem, chain: Optional[Blockchain] |
680 | 681 | ) -> Optional[DebankAppDeposit]: |
681 | 682 | """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 | + |
682 | 687 | return DebankAppDeposit.from_api( |
683 | 688 | name=item.name, |
684 | 689 | asset_usd_value=item.stats.asset_usd_value, |
685 | 690 | debt_usd_value=item.stats.debt_usd_value, |
686 | 691 | 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], |
688 | 693 | chain=chain, |
689 | 694 | position_index=item.position_index, |
690 | 695 | update_at=item.update_at, |
691 | 696 | ) |
692 | 697 |
|
| 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 | + |
693 | 705 |
|
694 | 706 | class DebankApi(CustomizableBlockchainApi, BalanceMixin, IPortfolio): |
695 | 707 | """ |
|
0 commit comments