Три способа записать один адрес

Под капотом каждый TON-адрес — это два числа: воркчейн (0 для basechain, -1 для masterchain) и 256-битный хеш начального состояния контракта. Raw-форма записывает ровно это: 0:83dfd552…0f31a8. Она однозначна, её ожидают get-методы и низкоуровневые инструменты, но у неё нет контрольной суммы: одна ошибочная буква — и это уже другой, на вид совершенно корректный адрес.

User-friendly форма упаковывает те же два числа в 36 байт — байт флагов, воркчейн, хеш и 2-байтовую контрольную сумму CRC16 — и записывает их 48 символами base64. Благодаря контрольной сумме опечатка не проходит проверку, а не отправляет монеты в пустоту, а из-за байта флагов строка начинается с EQ, UQ, kQ или 0Q:

Префикс Флаг Значение
EQ 0x11 bounceable, mainnet
UQ 0x51 non-bounceable, mainnet
kQ 0x91 bounceable, testnet
0Q 0xd1 non-bounceable, testnet

Те же 36 байт можно записать двумя алфавитами base64: стандартным (+ и /) и URL-безопасным (- и _). Кошельки и обозреватели используют URL-безопасный. Инструмент принимает оба и выводит оба.

Bounceable или нет: что делает флаг

EQ и UQ — не два адреса. Они указывают на один контракт и один баланс; флаг лишь подсказывает кошельку отправителя, что поставить в бит bounce исходящего сообщения.

Bounceable перевод говорит: если получатель не может обработать это сообщение — контракт не задеплоен, бросает исключение, не хватает газа, — верните монеты мне за вычетом комиссий. Это правильное значение по умолчанию для отправки на смарт-контракты, поэтому обозреватели и интерфейсы DEX показывают адреса EQ.

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

Что проверяет валидатор

Для user-friendly адреса: длину (48 символов), алфавит, контрольную сумму CRC16 по первым 34 байтам и байт флагов. Для raw-адреса: диапазон воркчейна и ровно 64 hex-символа. У каждой проверки своё сообщение, поэтому обрезанная вставка и опечатка выглядят по-разному.

Чего он проверить не может — состояние сети: задеплоен ли аккаунт по этому адресу, есть ли на нём баланс, тот ли это контракт, о котором вы думаете. Для этого нужна нода — вызов getAccountState через liteserver — или обозреватель.

Пакетный режим

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