diff --git a/blockapi/test/v2/api/debank/test_debank_balance_parser.py b/blockapi/test/v2/api/debank/test_debank_balance_parser.py index 23b6eaa..7a900c4 100644 --- a/blockapi/test/v2/api/debank/test_debank_balance_parser.py +++ b/blockapi/test/v2/api/debank/test_debank_balance_parser.py @@ -232,7 +232,7 @@ def test_all_mapping(contract, symbol, coin, balance_parser): assert coin == balance_parser.get_coin(balance) -def test_skip_balance_with_unknown_chain(balance_parser): +def test_balance_with_unknown_chain_is_returned(balance_parser): balance = DebankModelBalanceItem( id="123", chain="does-not-exist", @@ -243,4 +243,24 @@ def test_skip_balance_with_unknown_chain(balance_parser): ) item = balance_parser.parse_item(balance) - assert not item + assert item.coin.blockchain == 'does-not-exist' + + +def test_parse_balance_with_unknown_chain(balance_parser): + parsed = balance_parser.parse( + [ + { + "id": "123", + "chain": "does-not-exist", + "name": "Unknown", + "symbol": "SYM", + "decimals": 18, + "amount": 2, + "raw_amount": 2, + "price": 3.5, + } + ] + ) + + assert len(parsed) == 1 + assert parsed[0].coin.blockchain == 'does-not-exist' diff --git a/blockapi/test/v2/api/debank/test_debank_portfolio_parser.py b/blockapi/test/v2/api/debank/test_debank_portfolio_parser.py index 6f6c32e..90e9dab 100644 --- a/blockapi/test/v2/api/debank/test_debank_portfolio_parser.py +++ b/blockapi/test/v2/api/debank/test_debank_portfolio_parser.py @@ -181,7 +181,8 @@ def test_require_pool_or_pool_id(): def test_portfolio_with_unknown_chain(portfolio_parser, unknown_chain_response): parsed = portfolio_parser.parse(unknown_chain_response) - assert parsed == [] + assert len(parsed) == 1 + assert parsed[0].protocol.chain == 'this-chain-will-never-exist' def test_parse_no_error(debank_api): diff --git a/blockapi/v2/api/debank.py b/blockapi/v2/api/debank.py index 982f0ed..ced2508 100644 --- a/blockapi/v2/api/debank.py +++ b/blockapi/v2/api/debank.py @@ -180,10 +180,7 @@ def parse(self, response: List) -> Dict[str, Protocol]: @staticmethod def parse_item(item: DebankModelProtocol) -> Optional[Protocol]: - blockchain = get_blockchain_from_debank_chain(item.chain) - if not blockchain: - logger.warning(f'No blockchain found for protocol {item.id}. Skipping.') - return None + blockchain = get_blockchain_from_debank_chain(item.chain) or item.chain return Protocol.from_api( protocol_id=item.id, @@ -329,12 +326,6 @@ def parse_item( ) return None - if not coin.blockchain: - logger.error( - f'DeBank: Skipping balance - could not parse blockchain "{balance_item.chain}". Amount={amount} (raw={raw_amount})' - ) - return None - if asset_type == AssetType.INVESTMENT and amount < 0: asset_type = AssetType.DEBT amount = -amount @@ -363,7 +354,9 @@ def parse_item( def get_coin(self, balance_item: DebankModelBalanceItem) -> Coin: contract = balance_item.id - blockchain = get_blockchain_from_debank_chain(balance_item.chain) + blockchain = ( + get_blockchain_from_debank_chain(balance_item.chain) or balance_item.chain + ) symbol = self.get_symbol(balance_item) coingecko_id = get_coingecko_id(contract, symbol) diff --git a/blockapi/v2/models.py b/blockapi/v2/models.py index bcbc4c8..dd919ef 100644 --- a/blockapi/v2/models.py +++ b/blockapi/v2/models.py @@ -561,7 +561,7 @@ class Coin: symbol: str name: str decimals: int - blockchain: Blockchain + blockchain: Union[Blockchain, str] address: Optional[str] = attr.ib(default=None) standards: Optional[List[str]] = attr.ib(default=None) protocol_id: Optional[str] = attr.ib(default=None) @@ -576,7 +576,7 @@ def is_nft(self) -> bool: @classmethod def from_api( cls, - blockchain: Blockchain, + blockchain: Union[Blockchain, str], decimals: Union[int, str], symbol: Optional[str] = None, name: Optional[str] = None, @@ -607,7 +607,7 @@ class CoingeckoMapping: @attr.s(auto_attribs=True, slots=True, frozen=True) class Protocol: protocol_id: str - chain: Blockchain + chain: Union[Blockchain, str] name: str user_deposit: Decimal site_url: Optional[str] = attr.ib(default=None) @@ -619,7 +619,7 @@ def from_api( cls, *, protocol_id: str, - chain: Blockchain, + chain: Union[Blockchain, str], name: str, user_deposit: Union[str, float, int], site_url: Optional[str] = None,