From f1492d93267787ce86b0a3aaec3d4f58298e18a0 Mon Sep 17 00:00:00 2001 From: tim Date: Fri, 23 Aug 2024 18:24:27 -0400 Subject: [PATCH] token symbol/name decoding fix --- src/dexorder/tokens.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/dexorder/tokens.py b/src/dexorder/tokens.py index 22616f8..a9e94a8 100644 --- a/src/dexorder/tokens.py +++ b/src/dexorder/tokens.py @@ -11,6 +11,7 @@ from dexorder.contract import ERC20, ContractProxy, CONTRACT_ERRORS from dexorder.database.model import Token from dexorder.database.model.token import OldTokenDict from dexorder.metadata import get_metadata +from dexorder.util import hexstr log = logging.getLogger(__name__) @@ -35,21 +36,25 @@ async def load_token(address: str) -> Optional[OldTokenDict]: return OldTokenDict(type='Token', chain=chain_id, address=address, name=token.name, symbol=token.symbol, decimals=token.decimals, approved=token.approved) + async def get_string_or_bytes32(func_name): try: - result = await getattr(contract, func_name)() + return await getattr(contract, func_name)() except (InsufficientDataBytes, BadFunctionCallOutput, OverflowError): # this happens when the token returns bytes32 instead of a string try: rb: bytes = await ContractProxy(address, 'ERC20.sb').symbol() - end = rb.find(b'\x00') - if end == -1: - end = 32 - result = rb[:end].decode('utf8') except CONTRACT_ERRORS: log.warning(f'token {address} has broken {func_name}()') return None - return result + end = rb.find(b'\x00') + if end == -1: + end = 32 + try: + return rb[:end].decode('utf8') + except UnicodeDecodeError: + log.warning(f'token {address} has an invalid {func_name}() {rb}') + return None dec_prom = contract.decimals() symbol_prom = get_string_or_bytes32('symbol')