Адреса в TON: raw vs user-friendly, bounceable vs non-bounceable

Разбери raw и user-friendly адреса, флаги bounceable/test-only и когда какой формат использовать.

Адреса в TON

Адрес аккаунта в TON — это пара (workchain_id, account_id), где account_id — 256-битный хеш. Один и тот же аккаунт можно записать в raw-виде или в user-friendly (base64), с разными флагами.


Raw vs user-friendly

Raw — понятный для кода и логов формат:

text
0:a1b2c3d4...   // workchain:hex(32 bytes)

User-friendly — строка base64 (часто с URL-safe алфавитом), удобная для UI и копирования:

text
EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N
UQ...  // non-bounceable вариант того же аккаунта
typescript
// @ton/core ^0.59.0
import { Address } from "@ton/core";

const addr = Address.parse(
  "EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N",
);

console.log(addr.toRawString());
// 0:83dfd552e63729b472fcbcc8c45ebcc6691702558b68ec7527e1ba403a0f31a8

console.log(addr.toString({ bounceable: true, urlSafe: true }));
console.log(addr.toString({ bounceable: false, urlSafe: true }));

Address.parse() принимает оба формата. Сравнение адресов делай через объект Address, а не через строки с разными флагами.


Bounceable vs non-bounceable

Флаг bounceable влияет на поведение неудачной доставки:

ФорматТипичный префиксПоведение при ошибке
BounceableEQ... (mainnet)Средства могут вернуться отправителю (bounce)
Non-bounceableUQ... (mainnet)Bounce отключён — удобно для первого депозита на ещё не инициализированный кошелёк

Test-only флаг помечает testnet-адрес (часто выглядит как kQ... / 0Q...). Не отправляй mainnet-средства на test-only адрес и наоборот.


Как это работает

  1. Адрес контракта обычно = хеш StateInit (code + data) + workchain.
  2. User-friendly добавляет checksum и флаги к raw-паре.
  3. EQ и UQ могут указывать на один аккаунт — отличаются только флагами строки.
  4. Для депозита на новый кошелёк часто рекомендуют non-bounceable, чтобы монеты не отскочили, если контракт ещё не задеплоен.

Частые ошибки

Сравнивать строки EQ... и UQ... как разные аккаунты → это один адрес с разными флагами; сравнивай через Address.equals.

Слать bounceable-перевод на неинициализированный кошелёк → сумма может вернуться bounce-сообщением; для первого пополнения бери non-bounceable.

Перепутать testnet и mainnet по префиксу → проверяй сеть RPC и флаг test-only, не только «похожесть» строки.


Что дальше

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация