Получить сумму токена с адреса ETH

Я пытаюсь получить количество токенов ETH-адреса в браузере. Я пробовал это с методом web3.getBalance(), но он получает только сумму ETH.

Мне нужно получить сумму токена по адресу ETH. Например, этот адрес имеет более 30 типов токенов, я должен получить сумму определенного: https://etherscan.io/address/0xe853c56864a2ebe4576a807d26fdc4a0ada51919

Какой метод я должен использовать или есть API, чтобы я мог получить эту информацию?

2 ответа

Посмотрите баланс конкретного токена

Выберите токен

этот адрес имеет более 30 типов токенов, я должен получить сумму определенного

Я интерпретирую это так, что вы уже знаете, какой токен вы хотите отслеживать.

Получить адрес токена

Вы знаете, по какому адресу находится токен? Если нет, есть несколько вариантов выяснения:

  1. Узнайте адрес от команды разработчиков - следите за мошенничеством / фальшивыми аккаунтами в твиттере / и т.д.
  2. Нажмите на токен в выпадающем списке Etherscan и прочитайте значение из поля "Контракт ERC20". (например, ~ для OmiseGo, контракт на 0xd26114cd6EE289AccF82350c8d8487fedB8A0C07)
  3. Посмотрите адрес через ENS, используя символ токена под thetoken.eth, лайк omg.thetoken.eth,
  4. Спросите других доверенных третьих сторон

Самый надежный метод - это перекрестная проверка нескольких источников.

Наиболее авторитетные команды установят имя 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 сделай это?

  1. Создать ERC20 ABI из спецификации
  2. Создать контракт, используя omg = w3.eth.contract(address, abi) из Web3.py v4-бета
  3. Завернуть объект договора в ConciseContract для коротких контрактов
  4. Получить баланс токена, используя omg.balanceOf(address)
  5. Переместите десятичную точку баланса влево много раз: omg.decimals()

Список "всех" токенов

Как упоминал Адам, остатки токенов хранятся в бухгалтерской книге в договоре, а не в состоянии на вашем счете. Существует (как правило) один контракт для каждого токена, и нет точного списка всех контрактов токена.

Но давайте предположим, что некоторый список токенов достаточно хорош, как, например , Big List-o-Tokens MyEtherWallet.

Вы можете перебирать список адресов токенов из этого списка и применять тот же подход, получая баланс для каждого из них.

Токены отличаются от ETH тем, что они содержатся как состояние внутри смарт-контракта, а не связаны непосредственно с адресом. Адрес Ethereum может быть либо контрактом, либо EOA (внешняя учетная запись). Оба этих типа адресов могут содержать ETH. С помощью web3.getBalance() возвращает ETH, связанный с адресом (опять же, этот адрес может быть либо контрактом, либо EOA).

С другой стороны, токены хранятся как часть состояния внутри контракта. Обычно вы увидите что-то вроде mapping(address => uint256) balance в самом договоре, в котором будут храниться все остатки для определенного токена.

В конечном итоге, если вы хотите узнать баланс токенов одного конкретного адреса по нескольким типам токенов, вам нужно вызвать контракт balanceOf метод для адреса контракта каждого токена, который вас интересует.

Другие вопросы по тегам