token symbol/name decoding fix

This commit is contained in:
tim
2024-08-23 18:24:27 -04:00
parent 005b72db92
commit f1492d9326

View File

@@ -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')