CRYPTO

What the withdraw window checks before it sends

Illustration for “What the withdraw window checks before it sends”
Before the site sends a withdrawal it runs a short fixed list of checks in the browser and then one more on the server. The amount must be a positive number, no more than your balance in that coin, and at least the coin’s minimum withdrawal, which the window shows next to the network fee for the coin you chose. For coins that run on more than one network you must pick the network, and the request carries the base coin of that network so the funds cannot be sent down the wrong chain. For coins that use a destination tag or memo, the tag is a separate field and is sent alongside the address. If you have enabled a one-time code, the window requires a six-digit code and sends it with the request; the server verifies it. The request itself is one call, with the amount converted to the coin’s smallest unit, and it either succeeds with a confirmation toast or returns an error that is shown to you unchanged. None of these checks can catch a wrong address, which is why the address article exists.
BETKYO RESEARCHPUBLISHED 2026-09-11UPDATED 2026-09-117 MIN READ

The order of checks

The withdraw window is a form with an address, an amount, sometimes a network, sometimes a tag, and sometimes a code. Forms like it exist on every exchange and every wallet, and they all look the same, which hides how much of the decision has already been made by the time the button is enabled. This one is short enough to read in full, so here is what it does.

The checks the withdraw window runs on the amount, in order
CHECKWHAT PASSESWHAT YOU SEE IF IT FAILS
Is it a number greater than zero?Any positive amountAn amount error, and the button stays off
Do you have it?Amount ≤ your balance in that coin, converted from the coin’s smallest unit“Not enough balance”
Is it enough to send?Amount ≥ the coin’s minimum withdrawalThe minimum, with the coin symbol, in the message

The minimum and the fee are per coin and per network, and both are printed in the warning text under the form before you type anything.

ENGINE-VERIFIEDcomponent/common/popup/wallet/withdraw.tsx: the amount validator rejects a non-positive value (amountError), then compares Big(balance) ÷ 10^precision with the typed value (notEnoughBalance), then compares selectCoin.minWithdrawView with it (minWithdraw, with {min} and {symbol} substituted). The warning block renders withdrawWarn with {symbol}, {min: selectCoin.minWithdrawView} and {fee: selectCoin.feeView}. store/CoinStore.ts: minWithdrawView and feeView divide the stored minWithdraw and fee by 10^precision.

Network, tag and code

Three fields appear only when the coin needs them, and each one exists because of a way money has been lost. The network selector appears for coins that live on more than one chain: a stablecoin can travel as an ERC-20 token, a TRC-20 token, or on several other networks, and a transfer sent on a network the receiving wallet does not watch is not a transfer, it is a loss. When you choose a network the request carries the base coin of that network, so the server knows exactly which chain you asked for. The network article covers the other half of the problem.

The tag field appears for coins whose address identifies an exchange or a shared wallet rather than a person, and whose destination tag or memo identifies you inside it. Sending to the address without the tag lands the funds in the right building with no room number. The window sends the tag as its own field, and only for those coins.

The code field appears if you have turned on a one-time code for your account. The window accepts exactly six digits, includes the code in the request, and the server checks it before it does anything else. It is the one check on the list that protects you from someone who is not you, which is the reason it is the one worth switching on.

ENGINE-VERIFIEDwithdraw.tsx: the request body is { coinId, amount: Big(amount) × 10^precision as a string, address }; baseCoinId is added when isNetworkCoin && selectedNetwork; otpCode is added when the six-digit input (onTypeOtp: code.length === 6) is filled; tag is added when selectCoin.type === ECoinType.TAG and the field is non-empty. The request is api.post('/wallet/withdraw', body); a non-success code is thrown and shown, success shows requestWithdrawDone and closes the window.

What it cannot check

Every check above is about the amount, the route and the sender. None is about the destination, because none can be. An address is a string that is either well-formed or not, and a well-formed address belonging to a stranger is indistinguishable from a well-formed address belonging to you. The site can see that the string parses. It cannot see whose it is.

  • The site checks the amount, the balance, the minimum, the network, the tag and the code. Those are its job, and a failure in any of them stops the request before it leaves the browser.
  • You check the address. Copy it from the place that issued it, read the middle characters as well as the ends, and treat any recent tiny transfer in your history as a reason to look harder, not as a shortcut.
  • The fee is the network’s, shown up front. It is printed next to the minimum before you type, and the fee article explains why it moves.
  • After the button, the chain decides. A submitted withdrawal is processed by the wallet service and then confirmed by the network; what a confirmation is covers the waiting.
This article describes the client-side withdraw component as it appears in the repository; the wallet service performs its own checks on the server and is the authority on whether a withdrawal is sent. Limits, fees and minimums are per coin and can change; the window shows the current values.
FAQ

Why does the withdraw button stay disabled?

Because one of the checks failed: the amount is not positive, exceeds your balance, or is below the coin’s minimum, or a required field such as the network, tag or six-digit code is missing. The message under the amount says which.

Where do I see the minimum and the fee?

In the warning text under the form, for the coin and network you have selected. Both are stored per coin in the coin’s smallest unit and shown converted to normal units.

Why is there a network selector for some coins?

Because those coins exist on more than one chain. The request carries the base coin of the network you choose so the transfer goes down the chain your receiving wallet watches.

What is the tag field?

A destination tag or memo for coins whose address identifies a shared wallet. It is sent as its own field only for those coins; without it the funds arrive at the address but not at you.

Does the window check the address?

Only that it is present. It cannot tell whose address it is, which is why you should copy it from the place that issued it and read more than the first and last characters.

SOURCES & REFERENCES
  • Betkyo client source: component/common/popup/wallet/withdraw.tsx (validation, request body, OTP and tag handling), store/CoinStore.ts (minWithdrawView, feeView)
Betkyo Research — written by the team that builds these games. Every probability quoted in the Journal is derived from our engine source or a cited reference, never copied from another site. Figures are re-checked whenever the engines change.

18+ · PLAY RESPONSIBLY · THE JOURNAL IS EDITORIAL CONTENT, NOT BETTING ADVICE