Контракт считает минимальные единицы, а не дроби
Функции `balanceOf` и `transfer` работают с целым `uint256`. Если токен использует шесть decimals, один отображаемый токен соответствует 1 000 000 минимальных единиц. Запись `1,25` существует в интерфейсе; в вызов смарт-контракта отправляется целое `1250000`. Это похоже на связь между сумами и тийинами только как модель масштаба: сам ERC-20 не задаёт валюту, цену или право погашения.
| Raw amount | Decimals | Displayed amount | Что изменилось |
|---|---|---|---|
| 1 234 500 | 0 | 1 234 500 | Запятая не добавляется |
| 1 234 500 | 2 | 12 345 | Деление на 100 |
| 1 234 500 | 6 | 1,2345 | Деление на 1 000 000 |
| 1 234 500 | 18 | 0,0000000000012345 | Тот же integer показан в гораздо более мелком масштабе |
- 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.
| Наблюдение | Вероятная причина | Что сравнить |
|---|---|---|
| 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 в каждой сети |
- Наблюдение
- 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-сети |
| Decimals | 6 |
| Raw transfer value | 25 075 000 |
| Расчёт | 25 075 000 / 10^6 |
| Displayed amount | 25,075 |
- Поле
- Contract
- Значение
- Проверенный адрес токена в выбранной EVM-сети
- Поле
- Decimals
- Значение
- 6
- Поле
- Raw transfer value
- Значение
- 25 075 000
- Поле
- Расчёт
- Значение
- 25 075 000 / 10^6
- Поле
- Displayed amount
- Значение
- 25,075
Алгоритм расхождения без догадок
- 1Зафиксируйте сеть и контракт
Возьмите contract address из официального источника проекта, а chain ID — из кошелька или RPC. Не начинайте с ticker.
- 2Получите raw value
Для баланса это ответ balanceOf нужного owner; для перевода — value события или декодированного contract call. Декодированный call показывает запрошенную сумму, но не доказывает успешное исполнение: отдельно сверяют receipt/status, событие или изменение баланса. Запишите integer без форматирования.
- 3Прочитайте decimals
Используйте тот же contract и сеть. Если функция отсутствует или вызов ошибочен, отметьте metadata как unknown, а не подставляйте 18 молча.
- 4Посчитайте точное представление
Разделите integer на 10^decimals строковой или decimal-арифметикой. Отдельно примените правило округления конкретного экрана.
- 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, проблема находится раньше формулы и требует отдельной проверки адреса или транзакции.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- ERC-20: Token Standard Ethereum Improvement Proposals · Проверено 19 августа 2026 г. в 20:22 GMT+5
- ethereum.org — ERC-20 token standard Ethereum Foundation community documentation · Проверено 19 августа 2026 г. в 20:22 GMT+5
- ethereum.org — annotated ERC-20 contract Ethereum Foundation community documentation · Проверено 19 августа 2026 г. в 20:22 GMT+5
- ethereum.org — JSON-RPC API Ethereum Foundation community documentation · Проверено 19 августа 2026 г. в 20:22 GMT+5
- OpenZeppelin Contracts 5.x — ERC-20 decimals OpenZeppelin · Проверено 19 августа 2026 г. в 20:22 GMT+5
