L'ordre des vérifications
La fenêtre de retrait est un formulaire avec une adresse, un montant, parfois un réseau, parfois une balise, et parfois un code. Des formulaires comme celui-ci existent sur chaque exchange et chaque portefeuille, et ils se ressemblent tous, ce qui cache combien de décisions ont déjà été prises au moment où le bouton est activé. Celui-ci est assez court pour être lu en entier, voici donc ce qu'il fait.
| VÉRIFICATION | CE QUI PASSE | CE QUE VOUS VOYEZ SI CELA ÉCHOUE |
|---|---|---|
| Est-ce un nombre supérieur à zéro? | N'importe quel montant positif | Une erreur de montant, et le bouton reste désactivé |
| L'avez-vous? | Montant ≤ votre solde dans cette pièce, converti à partir de la plus petite unité de la pièce | « Solde insuffisant » |
| Est-ce suffisant pour envoyer? | Montant ≥ le retrait minimum de la pièce | Le minimum, avec le symbole de la pièce, dans le message |
Le minimum et les frais sont par pièce et par réseau, et les deux sont affichés dans le texte d'avertissement sous le formulaire avant que vous ne tapiez quoi que ce soit.
ENGINE-VERIFIEDcomponent/common/popup/wallet/withdraw.tsx: le validateur de montant rejette une valeur non positive (amountError), puis compare Big(balance) ÷ 10^precision avec la valeur saisie (notEnoughBalance), puis compare selectCoin.minWithdrawView avec celle-ci (minWithdraw, avec {min} et {symbol} substitués). Le bloc d'avertissement affiche withdrawWarn avec {symbol}, {min: selectCoin.minWithdrawView} et {fee: selectCoin.feeView}. store/CoinStore.ts: minWithdrawView et feeView divisent les minWithdraw et fee stockés par 10^precision.
Réseau, balise et code
Trois champs n'apparaissent que lorsque la pièce en a besoin, et chacun existe à cause d'une manière dont l'argent a été perdu. Le sélecteur de réseau apparaît pour les pièces qui vivent sur plus d'une chaîne: une stablecoin peut voyager en tant que jeton ERC-20, jeton TRC-20, ou sur plusieurs autres réseaux, et un transfert envoyé sur un réseau que le portefeuille destinataire ne surveille pas n'est pas un transfert, c'est une perte. Quand vous choisissez un réseau, la demande porte la pièce de base de ce réseau, donc le serveur sait exactement quelle chaîne vous avez demandée. L'article sur le réseau couvre l'autre moitié du problème.
Le champ de balise apparaît pour les pièces dont l'adresse identifie un exchange ou un portefeuille partagé plutôt qu'une personne, et dont la balise de destination ou le mémo vous identifie à l'intérieur. Envoyer à l'adresse sans la balise place les fonds dans le bon bâtiment sans numéro de chambre. La fenêtre envoie la balise comme son propre champ, et seulement pour ces pièces.
Le champ de code apparaît si vous avez activé un code à usage unique pour votre compte. La fenêtre accepte exactement six chiffres, inclut le code dans la demande, et le serveur le vérifie avant de faire quoi que ce soit d'autre. C'est la seule vérification de la liste qui vous protège contre quelqu'un qui n'est pas vous, ce qui est la raison pour laquelle c'est celle qui vaut la peine d'activer.
ENGINE-VERIFIEDwithdraw.tsx: le corps de la demande est { coinId, amount: Big(amount) × 10^precision en tant que chaîne, address }; baseCoinId est ajouté quand isNetworkCoin && selectedNetwork; otpCode est ajouté quand l'entrée à six chiffres (onTypeOtp: code.length === 6) est remplie; tag est ajouté quand selectCoin.type === ECoinType.TAG et le champ est non-vide. La demande est api.post('/wallet/withdraw', body); un code non-succès est lancé et affiché, le succès affiche requestWithdrawDone et ferme la fenêtre.
Ce qu'il ne peut pas vérifier
Chaque vérification ci-dessus concerne le montant, l'itinéraire et l'expéditeur. Aucune ne concerne la destination, car aucune ne peut. Une adresse est une chaîne qui est soit bien formée, soit ne l'est pas, et une adresse bien formée appartenant à un étranger est indistinguishable d'une adresse bien formée vous appartenant. Le site peut voir que la chaîne est analysée. Il ne peut pas voir à qui elle appartient.
- Le site vérifie le montant, le solde, le minimum, le réseau, le tag et le code. C'est son travail, et un échec dans n'importe lequel d'eux arrête la demande avant qu'elle ne quitte le navigateur.
- Vous vérifiez l'adresse. Copiez-la de l'endroit qui l'a émise, lisez les caractères du milieu ainsi que les extrémités, et traitez tout petit transfert récent dans votre historique comme une raison de regarder plus attentivement, pas comme un raccourci.
- Les frais sont ceux du réseau, affichés à l'avance. Ils sont imprimés à côté du minimum avant que vous ne tapiez, et l'article sur les frais explique pourquoi cela bouge.
- Après le bouton, la chaîne décide. Un retrait soumis est traité par le service de portefeuille, puis confirmé par le réseau; ce qu'une confirmation est couvre l'attente.
Cet article décrit le composant de retrait côté client tel qu'il apparaît dans le référentiel; le service de portefeuille effectue ses propres vérifications sur le serveur et est l'autorité sur la question de savoir si un retrait est envoyé. Les limites, les frais et les minimums sont par pièce et peuvent changer; la fenêtre affiche les valeurs actuelles.
FAQ
Pourquoi le bouton de retrait reste-t-il désactivé?
Parce que l'une des vérifications a échoué: le montant n'est pas positif, dépasse votre solde, ou est inférieur au minimum de la pièce, ou un champ requis comme le réseau, tag ou code à six chiffres manque. Le message sous le montant indique lequel.
Où vois-je le minimum et les frais?
Dans le texte d'avertissement sous le formulaire, pour la pièce et le réseau que vous avez sélectionnés. Les deux sont stockés par pièce dans la plus petite unité de la pièce et affichés convertis en unités normales.
Pourquoi y a-t-il un sélecteur de réseau pour certaines pièces?
Parce que ces pièces existent sur plus d'une chaîne. La demande porte la pièce de base du réseau que vous choisissez afin que le transfert descende la chaîne que votre portefeuille récepteur regarde.
Qu'est-ce que le champ tag?
Un tag de destination ou un mémo pour les pièces dont l'adresse identifie un portefeuille partagé. Il est envoyé comme un champ distinct uniquement pour ces pièces; sans lui, les fonds arrivent à l'adresse mais pas à vous.
La fenêtre vérifie-t-elle l'adresse?
Seulement qu'elle est présente. Il ne peut pas dire à qui appartient l'adresse, ce qui est pourquoi vous devriez la copier de l'endroit qui l'a émise et lire plus que les premier et dernier caractères.
SOURCES & RÉFÉRENCES
- Source client Betkyo : component/common/popup/wallet/withdraw.tsx (validation, corps de la requête, gestion OTP et tag), store/CoinStore.ts (minWithdrawView, feeView)