Контракт считает минимальные единицы, а не дроби

Функции `balanceOf` и `transfer` работают с целым `uint256`. Если токен использует шесть decimals, один отображаемый токен соответствует 1 000 000 минимальных единиц. Запись `1,25` существует в интерфейсе; в вызов смарт-контракта отправляется целое `1250000`. Это похоже на связь между сумами и тийинами только как модель масштаба: сам ERC-20 не задаёт валюту, цену или право погашения.

Один raw value при разных decimals
Raw amountDecimalsDisplayed amountЧто изменилось
1 234 50001 234 500Запятая не добавляется
1 234 500212 345Деление на 100
1 234 50061,2345Деление на 1 000 000
1 234 500180,0000000000012345Тот же integer показан в гораздо более мелком масштабе
Один raw value при разных decimals
Raw amount
1 234 500
Decimals
0
Displayed amount
1 234 500
Что изменилось
Запятая не добавляется
Raw amount
1 234 500
Decimals
2
Displayed amount
12 345
Что изменилось
Деление на 100
Raw amount
1 234 500
Decimals
6
Displayed amount
1,2345
Что изменилось
Деление на 1 000 000
Raw amount
1 234 500
Decimals
18
Displayed amount
0,0000000000012345
Что изменилось
Тот же integer показан в гораздо более мелком масштабе

Raw value и decimals должны относиться к одному контракту

Перед вычислением зафиксируйте chain ID, token contract и block state. Одинаковый ticker в двух сетях не связывает контракты, а bridged-версия способна иметь собственный address и правила. Прочитайте `balanceOf(owner)` и `decimals()` у одного contract address в одной сети. Если источник показывает только символ и картинку, данных для проверки недостаточно.

В EIP-20 функции `name`, `symbol` и `decimals` помечены optional. Поэтому интерфейс не должен превращать отсутствие metadata в уверенное число без обозначенного правила. Некоторые приложения используют token list или собственный индекс; это удобный слой отображения, но не замена чтению выбранного контракта.

Transfer event тоже хранит значение в raw units

Поле `value` в ERC-20 Transfer и аргумент `transfer` выражены в тех же минимальных единицах токена. Настроенный для этого контракта explorer обычно декодирует event и применяет decimals для показа. Поэтому строка `1,2345 TOKEN` может быть представлением raw `1234500`, а не дробным числом, записанным в EVM. Для проверки перевода сначала подтвердите transaction и contract, затем пересчитайте value.

Почему кошелёк, explorer и API расходятся
НаблюдениеВероятная причинаЧто сравнить
API отдаёт большое целоеЭто raw valueDecimals того же контракта и формулу клиента
Кошелёк показывает 0,00Мелкий ненулевой остаток округлёнБольше знаков после запятой и raw balance
Два интерфейса сдвинули запятуюРазные metadata или contract addressNetwork, contract и ответ decimals()
История показывает перевод, баланс прежнийСмотрят другой block state, owner или сетьOwner, block tag и finality
Ticker одинаковый, значения разныеЭто разные токены или bridged-версииОфициальный contract address в каждой сети
Почему кошелёк, explorer и API расходятся
Наблюдение
API отдаёт большое целое
Вероятная причина
Это raw value
Что сравнить
Decimals того же контракта и формулу клиента
Наблюдение
Кошелёк показывает 0,00
Вероятная причина
Мелкий ненулевой остаток округлён
Что сравнить
Больше знаков после запятой и raw balance
Наблюдение
Два интерфейса сдвинули запятую
Вероятная причина
Разные metadata или contract address
Что сравнить
Network, contract и ответ decimals()
Наблюдение
История показывает перевод, баланс прежний
Вероятная причина
Смотрят другой block state, owner или сеть
Что сравнить
Owner, block tag и finality
Наблюдение
Ticker одинаковый, значения разные
Вероятная причина
Это разные токены или bridged-версии
Что сравнить
Официальный contract address в каждой сети

Округление меняет экран, но не raw balance

Интерфейс может показывать два, шесть или больше знаков и округлять остаток для карточки. Значение меньше шага экрана станет `0,00`, хотя raw integer ненулевой. Для расчётов храните raw value как integer или используйте decimal-библиотеку; обычный binary floating point способен добавить погрешность на больших числах. Не обрезайте строку до записи onchain-операции.

Учебная сверка перевода
ПолеЗначение
ContractПроверенный адрес токена в выбранной EVM-сети
Decimals6
Raw transfer value25 075 000
Расчёт25 075 000 / 10^6
Displayed amount25,075
Учебная сверка перевода
Поле
Contract
Значение
Проверенный адрес токена в выбранной EVM-сети
Поле
Decimals
Значение
6
Поле
Raw transfer value
Значение
25 075 000
Поле
Расчёт
Значение
25 075 000 / 10^6
Поле
Displayed amount
Значение
25,075

Алгоритм расхождения без догадок

  1. 1
    Зафиксируйте сеть и контракт

    Возьмите contract address из официального источника проекта, а chain ID — из кошелька или RPC. Не начинайте с ticker.

  2. 2
    Получите raw value

    Для баланса это ответ balanceOf нужного owner; для перевода — value события или декодированного contract call. Декодированный call показывает запрошенную сумму, но не доказывает успешное исполнение: отдельно сверяют receipt/status, событие или изменение баланса. Запишите integer без форматирования.

  3. 3
    Прочитайте decimals

    Используйте тот же contract и сеть. Если функция отсутствует или вызов ошибочен, отметьте metadata как unknown, а не подставляйте 18 молча.

  4. 4
    Посчитайте точное представление

    Разделите integer на 10^decimals строковой или decimal-арифметикой. Отдельно примените правило округления конкретного экрана.

  5. 5
    Сравните одинаковый state

    RPC latest, старый indexed block и finalized view могут описывать разные моменты. При споре запишите block number или transaction hash.

Проверенный результат воспроизводится из четырёх полей

Сверка завершена, когда другой человек может взять network, contract, owner или transaction hash, raw integer и decimals и получить ту же отображаемую сумму. Если различается только число знаков на экране, это presentation issue. Если различаются contract, network, owner или raw value, проблема находится раньше формулы и требует отдельной проверки адреса или транзакции.

Источники

Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.

  1. ERC-20: Token Standard Ethereum Improvement Proposals · Проверено 19 августа 2026 г. в 20:22 GMT+5
  2. ethereum.org — ERC-20 token standard Ethereum Foundation community documentation · Проверено 19 августа 2026 г. в 20:22 GMT+5
  3. ethereum.org — annotated ERC-20 contract Ethereum Foundation community documentation · Проверено 19 августа 2026 г. в 20:22 GMT+5
  4. ethereum.org — JSON-RPC API Ethereum Foundation community documentation · Проверено 19 августа 2026 г. в 20:22 GMT+5
  5. OpenZeppelin Contracts 5.x — ERC-20 decimals OpenZeppelin · Проверено 19 августа 2026 г. в 20:22 GMT+5
Материал носит информационный характер и не является индивидуальной рекомендацией. Криптоактивы связаны с риском волатильности, технических сбоев, хищения и полной потери средств.