Криптовалюты

Что такое decimals у токена и почему баланс выглядит необычно

Токен хранит баланс целым числом, а decimals задаёт отображение долей. Разбираем нули, округление и проверку параметра по контракту.

Что такое decimals у токена и почему баланс выглядит необычно

Короткий ответ: блокчейн хранит баланс ERC-20-токена целым числом базовых единиц. Параметр decimals подсказывает кошельку, где поставить десятичную запятую при отображении. Если decimals равен 6, значение 1 500 000 показывается как 1,5 токена. Сам параметр не меняет право владения и не доказывает ценность актива.

Почему контракт не хранит привычную дробь

В вычислениях смарт-контракта используются целые числа. Для передачи долей эмитент выбирает масштаб. При 18 decimals один отображаемый токен соответствует 10 в степени 18 базовых единиц, а при 6 – миллиону. Функции баланса и перевода работают именно с целым значением.

Decimals относится к метаданным отображения. В стандарте ERC-20 запрос этого значения предусмотрен как необязательный, поэтому приложение должно уметь обрабатывать необычные варианты или отсутствие ответа. Большинство популярных токенов сообщает параметр, но одинаковый тикер не означает одинаковый масштаб.

Технически два контракта могут иметь одинаковое название и символ, но возвращать разные decimals. Кошелёк должен читать сведения для конкретного адреса в конкретной сети, а не угадывать параметр по тикеру. Именно поэтому ручное добавление актива начинается с адреса контракта.

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

Как перевести raw balance в обычное число

Формула проста: отображаемый баланс равен целому значению, делённому на 10decimals. Например, raw balance 250 000 при decimals 6 соответствует 0,25 токена. При decimals 2 число 250 000 отображается как 2500.

Обратное преобразование используется при формировании перевода: желаемую сумму умножают на тот же масштаб. Интерфейс кошелька делает это автоматически. Вводить raw amount вручную стоит только в инструменте, где явно указаны базовые единицы, иначе легко ошибиться на несколько порядков.

Не округляйте промежуточные расчёты обычной плавающей запятой в скриптах. Для больших балансов нужны целочисленная арифметика или библиотеки точных чисел. В пользовательском кошельке мелкие остатки могут быть скрыты округлением, хотя контракт продолжает их учитывать.

При отправке всей суммы учитывайте, что приложение может запрещать ввод большего числа знаков, чем поддерживает токен. Лишние цифры должны быть отклонены или округлены явно. Если интерфейс молча меняет значение, сравните подготовленный raw amount до подписи.

Почему кошелёк показывает слишком много нулей

Частая причина – токен добавлен вручную с неверным decimals. Кошелёк получает правильный raw balance, но делит его не на тот коэффициент. Удаление пользовательской записи и повторное добавление проверенного контракта обычно исправляет вид, не перемещая средства.

Другая причина – выбран похожий токен. Мошенник может создать актив с тем же названием и символом, но другим адресом контракта, decimals и выпуском. Проверяйте прежде всего сеть и адрес. Пошаговая сверка есть в материале о том, как проверить адрес смарт-контракта.

Некоторые интерфейсы сначала используют данные из своего каталога, а затем обновляют их из сети. Сбой индексатора может временно показать старый параметр или не показать токен вовсе. Проверьте чтение контракта в обозревателе и сравните несколько кошельков, прежде чем считать баланс потерянным.

Как проверить decimals самостоятельно

  1. Уточните блокчейн, в котором находится токен.
  2. Скопируйте адрес контракта из доверенного списка самого проекта или уже проверенной транзакции.
  3. Откройте контракт в обозревателе этой сети и найдите значение decimals в доступных для чтения данных.
  4. Сравните raw balance адреса с отображаемым значением по формуле.
  5. Добавляйте токен в кошелёк только после совпадения сети, контракта, символа и decimals.

Адрес вашего аккаунта и адрес токена играют разные роли. Отправлять средства нужно на аккаунт получателя, а контракт используется для определения актива и вызова transfer. Ошибку помогает предотвратить руководство, чем адрес кошелька отличается от адреса контракта.

Что происходит на бирже и в мостах

Биржа может показывать заданное число знаков и округлять остаток согласно своим правилам учёта. Это не меняет decimals контракта. Перед депозитом проверьте поддерживаемую сеть и актив: одинаковый символ в двух сетях может относиться к разным контрактам.

Мост выпускает представление актива в другой сети, и его контракт может иметь собственные параметры. Не предполагайте совпадение только по названию. Если баланс не появился после перевода, сначала проверьте токен-контракт назначения и инструкцию, что делать, когда токен пришёл, но не отображается.

Decimals не защищает от поддельного токена

Совпадение 18 или 6 знаков ничего не говорит о подлинности. Любой контракт может вернуть популярный символ и привычный decimals. Не взаимодействуйте с неизвестным активом, который сам появился в кошельке: он способен рекламировать мошеннический сайт или провоцировать опасное одобрение. Причины таких поступлений разобраны в статье про неизвестный токен в кошельке.

Для поддержки достаточно назвать сеть, публичный адрес, адрес контракта, raw balance и ожидаемое отображение. Никому не передавайте seed-фразу, приватный ключ, пароль или 2FA. Эти секреты не влияют на decimals и не нужны для чтения публичного баланса.

Итог

Decimals – коэффициент отображения между целыми базовыми единицами и привычной суммой токена. При странном балансе не переводите актив наугад: проверьте сеть, контракт, raw balance и параметр decimals. Исправление записи в интерфейсе не требует импорта seed-фразы и не меняет данные блокчейна.