Tres formas de escribir una misma dirección

Por debajo, toda dirección TON son dos números: un workchain (0 para la basechain, -1 para la masterchain) y el hash de 256 bits del estado inicial del contrato. La forma raw escribe exactamente eso, 0:83dfd552…0f31a8. Es inequívoca y es lo que esperan los get-methods y las herramientas de bajo nivel, pero no tiene suma de verificación: un carácter equivocado es otra dirección de aspecto perfectamente válido.

La forma user-friendly empaqueta los mismos dos números en 36 bytes — un byte de flags, el workchain, el hash y una suma de verificación CRC16 de 2 bytes — y los escribe como 48 caracteres base64. La suma de verificación es la razón por la que una errata falla en la validación en lugar de mandar monedas al vacío, y el byte de flags es la razón por la que la cadena empieza por EQ, UQ, kQ o 0Q:

Prefijo Flag Significado
EQ 0x11 bounceable, mainnet
UQ 0x51 non-bounceable, mainnet
kQ 0x91 bounceable, testnet
0Q 0xd1 non-bounceable, testnet

Los mismos 36 bytes pueden escribirse con dos alfabetos base64: el estándar (+ y /) y el seguro para URL (- y _). Los monederos y los exploradores usan el seguro para URL. La herramienta acepta ambos y muestra ambos.

Bounceable o no: qué hace el flag

EQ y UQ no son dos direcciones. Apuntan al mismo contrato y al mismo saldo; el flag solo le dice al monedero del remitente qué poner en el bit bounce del mensaje saliente.

Una transferencia bounceable dice: si el destino no puede procesar este mensaje — el contrato no está desplegado, lanza una excepción, se queda sin gas —, devuélveme las monedas, menos las comisiones. Es el valor correcto por defecto al enviar a contratos inteligentes, y por eso los exploradores y las interfaces de DEX muestran direcciones EQ.

Una transferencia non-bounceable se queda en la cuenta de destino aunque no haya código allí para manejarla. Es la forma correcta para monederos, y la única forma correcta para el primer depósito a un monedero nuevo: el contrato de un monedero recién creado se despliega con su propia primera transacción saliente, así que hasta entonces no hay nada en la dirección que acepte un mensaje bounceable, y las monedas vuelven directamente. El artículo sobre formatos de dirección recorre toda la historia con ejemplos.

Qué comprueba el validador

Para una dirección user-friendly: la longitud (48 caracteres), el alfabeto, la suma de verificación CRC16 sobre los primeros 34 bytes y el byte de flags. Para una dirección raw: el rango del workchain y exactamente 64 dígitos hexadecimales. Cada comprobación tiene su propio mensaje, así que un pegado truncado y una errata se ven distintos.

Lo que no puede comprobar es la cadena: si una cuenta en esa dirección está desplegada, tiene saldo o es el contrato que crees. Eso necesita un nodo — una llamada getAccountState a través de un liteserver — o un explorador.

Modo por lotes

Cambia a lote, pega una dirección por línea, y cada línea se convierte y valida de forma independiente. Las líneas inválidas se quedan en su sitio con su error, de modo que una lista de mil direcciones de depósito puede comprobarse en un solo pegado y las malas encontrarse por número de línea. Todo ocurre en tu navegador; la lista nunca se sube.