Trois façons d'écrire une même adresse
Sous le capot, toute adresse TON se résume à deux nombres : un workchain (0 pour la basechain, -1 pour la masterchain) et le hash sur 256 bits de l'état initial du contrat. La forme raw écrit exactement cela, 0:83dfd552…0f31a8. Elle est sans ambiguïté et c'est ce qu'attendent les get-methods et les outils bas niveau, mais elle n'a pas de somme de contrôle : un caractère faux donne une autre adresse à l'air parfaitement valide.
La forme user-friendly empaquette les deux mêmes nombres dans 36 octets — un octet de drapeaux, le workchain, le hash et une somme de contrôle CRC16 sur 2 octets — et les écrit en 48 caractères base64. La somme de contrôle est ce qui fait qu'une faute de frappe échoue à la validation au lieu d'envoyer des pièces dans le vide, et l'octet de drapeaux est ce qui fait que la chaîne commence par EQ, UQ, kQ ou 0Q :
| Préfixe | Drapeau | Signification |
|---|---|---|
EQ |
0x11 |
bounceable, mainnet |
UQ |
0x51 |
non-bounceable, mainnet |
kQ |
0x91 |
bounceable, testnet |
0Q |
0xd1 |
non-bounceable, testnet |
Les mêmes 36 octets peuvent s'écrire avec deux alphabets base64 : le standard (+ et /) et celui sûr pour les URL (- et _). Les portefeuilles et les explorateurs utilisent le second. L'outil accepte les deux et affiche les deux.
Bounceable ou non : ce que fait le drapeau
EQ et UQ ne sont pas deux adresses. Elles pointent vers le même contrat et le même solde ; le drapeau dit seulement au portefeuille de l'expéditeur quoi mettre dans le bit bounce du message sortant.
Un transfert bounceable dit : si la destination ne peut pas traiter ce message — le contrat n'est pas déployé, il lève une exception, il manque de gas —, renvoyez-moi les pièces, moins les frais. C'est le bon réglage par défaut pour envoyer vers des contrats intelligents, et c'est pourquoi les explorateurs et les interfaces de DEX affichent des adresses EQ.
Un transfert non-bounceable reste sur le compte de destination même s'il n'y a pas de code pour le traiter. C'est la bonne forme pour les portefeuilles, et la seule bonne forme pour le premier dépôt vers un portefeuille neuf : le contrat d'un portefeuille neuf est déployé par sa propre première transaction sortante, donc jusque-là il n'y a rien à l'adresse pour accepter un message bounceable, et les pièces reviennent aussitôt. L'article sur les formats d'adresse raconte toute l'histoire avec des exemples.
Ce que le validateur vérifie
Pour une adresse user-friendly : la longueur (48 caractères), l'alphabet, la somme de contrôle CRC16 sur les 34 premiers octets et l'octet de drapeaux. Pour une adresse raw : la plage du workchain et exactement 64 chiffres hexadécimaux. Chaque vérification a son propre message, de sorte qu'un collage tronqué et une faute de frappe n'ont pas le même aspect.
Ce qu'il ne peut pas vérifier, c'est la chaîne : si un compte à cette adresse est déployé, a un solde, ou est bien le contrat que vous croyez. Cela demande un nœud — un appel getAccountState via un liteserver — ou un explorateur.
Mode par lots
Passez en mode par lots, collez une adresse par ligne, et chaque ligne est convertie et validée indépendamment. Les lignes invalides restent à leur place avec leur erreur, si bien qu'une liste de mille adresses de dépôt se vérifie en un seul collage et que les mauvaises se retrouvent par numéro de ligne. Tout se passe dans votre navigateur ; la liste n'est jamais envoyée.
