token symbol/name decoding fix
This commit is contained in:
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user