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 import Token
|
||||||
from dexorder.database.model.token import OldTokenDict
|
from dexorder.database.model.token import OldTokenDict
|
||||||
from dexorder.metadata import get_metadata
|
from dexorder.metadata import get_metadata
|
||||||
|
from dexorder.util import hexstr
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
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,
|
return OldTokenDict(type='Token', chain=chain_id, address=address,
|
||||||
name=token.name, symbol=token.symbol, decimals=token.decimals,
|
name=token.name, symbol=token.symbol, decimals=token.decimals,
|
||||||
approved=token.approved)
|
approved=token.approved)
|
||||||
|
|
||||||
async def get_string_or_bytes32(func_name):
|
async def get_string_or_bytes32(func_name):
|
||||||
try:
|
try:
|
||||||
result = await getattr(contract, func_name)()
|
return await getattr(contract, func_name)()
|
||||||
except (InsufficientDataBytes, BadFunctionCallOutput, OverflowError):
|
except (InsufficientDataBytes, BadFunctionCallOutput, OverflowError):
|
||||||
# this happens when the token returns bytes32 instead of a string
|
# this happens when the token returns bytes32 instead of a string
|
||||||
try:
|
try:
|
||||||
rb: bytes = await ContractProxy(address, 'ERC20.sb').symbol()
|
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:
|
except CONTRACT_ERRORS:
|
||||||
log.warning(f'token {address} has broken {func_name}()')
|
log.warning(f'token {address} has broken {func_name}()')
|
||||||
return None
|
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()
|
dec_prom = contract.decimals()
|
||||||
symbol_prom = get_string_or_bytes32('symbol')
|
symbol_prom = get_string_or_bytes32('symbol')
|
||||||
|
|||||||
Reference in New Issue
Block a user