Web3.eth: OverflowError: Python int слишком велик для преобразования в C ssize_t

Я пытаюсь захватить символы различных контрактов токенов, но для некоторых из них выдает следующую ошибку:

OverflowError: Python int слишком велик для преобразования в C ssize_t

Вот минимальный воспроизводимый пример:

from web3 import Web3
import json

web3 = Web3(Web3.HTTPProvider('https://cloudflare-eth.com'))

address = '0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2'

abi = json.loads(
        '[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}]')  # noqa: 501


symbol = web3.eth.contract(address=address, abi=abi).functions.symbol().call()

Я понятия не имею, почему я получаю эту ошибку, особенно учитывая, что она работает для некоторых контрактов, но не работает для других. Любая помощь будет оценена по достоинству!


person rgswope    schedule 07.10.2020    source источник
comment
@ShivamJha Я немного не понимаю, где в моем коде я мог переключиться с int на float, а также почему он в настоящее время работает для некоторых контрактов, но не работает для других.   -  person rgswope    schedule 07.10.2020


Ответы (1)


Этот конкретный токен возвращал символ как bytes32, поэтому изменение типа функции символа устранило проблему.

person rgswope    schedule 08.10.2020
comment
И декодируйте байты в строку: name = t.name (). Decode ('utf-8') symbol = t.symbol (). Decode ('utf-8') - person twinsant; 02.07.2021