Получить сумму токена с адреса ETH
Я пытаюсь получить количество токенов ETH-адреса в браузере. Я пробовал это с методом web3.getBalance(), но он получает только сумму ETH.
Мне нужно получить сумму токена по адресу ETH. Например, этот адрес имеет более 30 типов токенов, я должен получить сумму определенного: https://etherscan.io/address/0xe853c56864a2ebe4576a807d26fdc4a0ada51919
Какой метод я должен использовать или есть API, чтобы я мог получить эту информацию?
2 ответа
Посмотрите баланс конкретного токена
Выберите токен
этот адрес имеет более 30 типов токенов, я должен получить сумму определенного
Я интерпретирую это так, что вы уже знаете, какой токен вы хотите отслеживать.
Получить адрес токена
Вы знаете, по какому адресу находится токен? Если нет, есть несколько вариантов выяснения:
- Узнайте адрес от команды разработчиков - следите за мошенничеством / фальшивыми аккаунтами в твиттере / и т.д.
- Нажмите на токен в выпадающем списке Etherscan и прочитайте значение из поля "Контракт ERC20". (например, ~ для OmiseGo, контракт на
0xd26114cd6EE289AccF82350c8d8487fedB8A0C07
) - Посмотрите адрес через ENS, используя символ токена под
thetoken.eth
, лайкomg.thetoken.eth
, - Спросите других доверенных третьих сторон
Самый надежный метод - это перекрестная проверка нескольких источников.
Наиболее авторитетные команды установят имя ENS для своего токен-контракта, хотя это не обязательно thetoken.eth
,
Получить баланс из договора
Итак, теперь у вас есть адрес токен контракта. Далее предположим, что он совместим с ERC-20.
Так как вы сказали:
Я хотел бы услышать, если есть решение на других языках
Я буду использовать ethtoken.py
* для самого быстрого примера, затем погрузитесь в то, как это работает:
>>> from ethtoken import token
# Use the ENS name that points to your token contract here:
>>> omg = token("omg.thetoken.eth")
>>> omg.token_balance("0xE853c56864A2ebe4576a807D26Fdc4A0adA51919")
Decimal('246224.517546226920613329')
* ethtoken.py
это крошечный пакет с открытым исходным кодом, который я написал.
Как ethtoken
сделай это?
- Создать ERC20 ABI из спецификации
- Создать контракт, используя
omg = w3.eth.contract(address, abi)
из Web3.py v4-бета - Завернуть объект договора в
ConciseContract
для коротких контрактов - Получить баланс токена, используя
omg.balanceOf(address)
- Переместите десятичную точку баланса влево много раз:
omg.decimals()
Список "всех" токенов
Как упоминал Адам, остатки токенов хранятся в бухгалтерской книге в договоре, а не в состоянии на вашем счете. Существует (как правило) один контракт для каждого токена, и нет точного списка всех контрактов токена.
Но давайте предположим, что некоторый список токенов достаточно хорош, как, например , Big List-o-Tokens MyEtherWallet.
Вы можете перебирать список адресов токенов из этого списка и применять тот же подход, получая баланс для каждого из них.
Токены отличаются от ETH тем, что они содержатся как состояние внутри смарт-контракта, а не связаны непосредственно с адресом. Адрес Ethereum может быть либо контрактом, либо EOA (внешняя учетная запись). Оба этих типа адресов могут содержать ETH. С помощью web3.getBalance()
возвращает ETH, связанный с адресом (опять же, этот адрес может быть либо контрактом, либо EOA).
С другой стороны, токены хранятся как часть состояния внутри контракта. Обычно вы увидите что-то вроде mapping(address => uint256) balance
в самом договоре, в котором будут храниться все остатки для определенного токена.
В конечном итоге, если вы хотите узнать баланс токенов одного конкретного адреса по нескольким типам токенов, вам нужно вызвать контракт balanceOf
метод для адреса контракта каждого токена, который вас интересует.