Why Your Wallet Balance Is Not Always Enough to Send Crypto
A visible token balance does not always mean the full amount is ready to send. The network, native gas token and actual spendable balance all matter.

You open your wallet and see the token you want to send. The balance is there. The amount looks sufficient. But when you enter the transfer, the wallet shows insufficient funds, disables the confirm button or reduces the maximum amount you can send.
That can feel contradictory, but the balance shown on the asset screen is only one part of the transaction.
To send crypto successfully, a wallet may need to confirm at least three separate things:
1. the asset is on the network you are currently using;
2. the account has the network’s native token to pay the transaction fee; and
3. the amount entered is actually spendable after fees and other network requirements.
Understanding those distinctions makes the error easier to diagnose—and gives wallet interfaces a clearer job to do before asking for a signature.
A wallet balance is not one universal pool
A wallet interface may combine the value of assets across several networks into one portfolio total. That number is useful for seeing what the account owns, but it does not mean every asset can be spent from the same network or used to pay every fee.
Think of a wallet as a view across several separate ledgers rather than one bank account.
The same wallet address may hold:
• ETH on Ethereum;
• ETH or other assets on an EVM layer 2;
• USDC on more than one network;
• SOL and SPL tokens on Solana.
Those balances do not automatically move between networks. A token held on one network cannot normally pay for a transaction being submitted on another. MetaMask’s support guidance makes the network dependency explicit: a token appears on the network where it was sent, so users should first confirm that they are viewing the correct network.
This is the first distinction:
**Portfolio balance tells you what the wallet can see. Network balance tells you what a specific transaction can use.**
Token balance and gas balance are different
Most networks charge a fee for processing a transaction. That fee is usually paid in the network’s native token, not necessarily in the token being sent.
On Ethereum, gas fees are paid in ETH. Ethereum’s documentation describes gas as the computational work required for an operation and states that the fee is paid in ether. This applies when sending ETH, transferring a token or interacting with a smart contract.
So an account can hold USDC on Ethereum but still be unable to send it if the account does not have enough ETH for gas. MetaMask describes this as a common cause of the insufficient funds error: the token balance may be adequate, but the native-token balance is not enough to cover the network fee.
The same separation exists on Solana. Solana’s documentation states that every transaction requires a fee paid in SOL. A wallet can therefore hold an SPL token and still need SOL—or a supported sponsor acting as the fee payer—to submit the transfer.
The principle is simple:
**The asset being moved and the asset paying for execution may be different.**
Some wallets and applications support sponsored fees, gas abstraction or paying fees with another token. Those flows can reduce the need to manage native gas directly, but they are product-specific. Users should not assume that every send, swap or cross-chain route supports them.
Displayed balance is not always spendable balance
Even when the wallet holds the correct native token, the full displayed amount may not be available to send.
If you are sending the network’s native asset, the account generally needs to retain enough of that asset to cover the transaction fee. Entering the entire visible balance can leave nothing available for gas, which is why wallets often calculate a lower Max amount.
The exact spendable amount can also change while the transaction is being prepared. Network fees may move, a route quote may expire or an additional instruction may increase the required execution cost. A wallet should therefore treat the available amount as a transaction-specific estimate, not a permanent property of the account.
On Solana, some payments may also require a new token account for the recipient. Solana’s payment documentation lists account creation as a possible additional cost when a new token account is needed. It will not apply to every transfer, but it is another reason the visible token balance alone may not describe the full requirement.
A useful wallet should separate these figures:
• **Total balance:** the amount recorded for the asset on that network;
• **Estimated network fee:** the native-token cost currently expected to submit the transaction;
• **Other route or account costs:** only when they apply, clearly labelled;
• **Available to send:** the amount the current transaction can use after required costs;
• **Minimum received:** where price movement, slippage or route execution can change the destination amount.
That is more useful than showing a large balance at the top of the screen and explaining the missing requirement only after the user presses Confirm.
Why cross-chain sends make the distinction more important
A cross-chain action can contain more You open your wallet and see the token you want to send. The balance is there. The amount looks sufficient. But when you enter the transfer, the wallet shows insufficient funds, disables the confirm button or reduces the maximum amount you can send.
That can feel contradictory, but the balance shown on the asset screen is only one part of the transaction.
To send crypto successfully, a wallet may need to confirm at least three separate things:
1. the asset is on the network you are currently using;
2. the account has the network’s native token to pay the transaction fee; and
3. the amount entered is actually spendable after fees and other network requirements.
Understanding those distinctions makes the error easier to diagnose—and gives wallet interfaces a clearer job to do before asking for a signature.
A wallet balance is not one universal pool
A wallet interface may combine the value of assets across several networks into one portfolio total. That number is useful for seeing what the account owns, but it does not mean every asset can be spent from the same network or used to pay every fee.
Think of a wallet as a view across several separate ledgers rather than one bank account.
The same wallet address may hold:
• ETH on Ethereum;
• ETH or other assets on an EVM layer 2;
• USDC on more than one network;
• SOL and SPL tokens on Solana.
Those balances do not automatically move between networks. A token held on one network cannot normally pay for a transaction being submitted on another. MetaMask’s support guidance makes the network dependency explicit: a token appears on the network where it was sent, so users should first confirm that they are viewing the correct network.
This is the first distinction:
**Portfolio balance tells you what the wallet can see. Network balance tells you what a specific transaction can use.**
Token balance and gas balance are different
Most networks charge a fee for processing a transaction. That fee is usually paid in the network’s native token, not necessarily in the token being sent.
On Ethereum, gas fees are paid in ETH. Ethereum’s documentation describes gas as the computational work required for an operation and states that the fee is paid in ether. This applies when sending ETH, transferring a token or interacting with a smart contract.
So an account can hold USDC on Ethereum but still be unable to send it if the account does not have enough ETH for gas. MetaMask describes this as a common cause of the insufficient funds error: the token balance may be adequate, but the native-token balance is not enough to cover the network fee.
The same separation exists on Solana. Solana’s documentation states that every transaction requires a fee paid in SOL. A wallet can therefore hold an SPL token and still need SOL—or a supported sponsor acting as the fee payer—to submit the transfer.
The principle is simple:
**The asset being moved and the asset paying for execution may be different.**
Some wallets and applications support sponsored fees, gas abstraction or paying fees with another token. Those flows can reduce the need to manage native gas directly, but they are product-specific. Users should not assume that every send, swap or cross-chain route supports them.
Displayed balance is not always spendable balance
Even when the wallet holds the correct native token, the full displayed amount may not be available to send.
If you are sending the network’s native asset, the account generally needs to retain enough of that asset to cover the transaction fee. Entering the entire visible balance can leave nothing available for gas, which is why wallets often calculate a lower Max amount.
The exact spendable amount can also change while the transaction is being prepared. Network fees may move, a route quote may expire or an additional instruction may increase the required execution cost. A wallet should therefore treat the available amount as a transaction-specific estimate, not a permanent property of the account.
On Solana, some payments may also require a new token account for the recipient. Solana’s payment documentation lists account creation as a possible additional cost when a new token account is needed. It will not apply to every transfer, but it is another reason the visible token balance alone may not describe the full requirement.
A useful wallet should separate these figures:
• **Total balance:** the amount recorded for the asset on that network;
• **Estimated network fee:** the native-token cost currently expected to submit the transaction;
• **Other route or account costs:** only when they apply, clearly labelled;
• **Available to send:** the amount the current transaction can use after required costs;
• **Minimum received:** where price movement, slippage or route execution can change the destination amount.
That is more useful than showing a large balance at the top of the screen and explaining the missing requirement only after the user presses Confirm.
Why cross-chain sends make the distinction more important
A cross-chain action can contain more than a single transfer. Depending on the route, the user may need to approve a token, submit a source-network transaction, wait for routing or settlement, and then complete an action on the destination network.
The relevant balance is therefore not simply “How much crypto do I own?” It is closer to:
• Which network is the asset on now?
• Which asset pays for the source transaction?
• Is an approval required before execution?
• What amount is available after the estimated source costs?
• Will the destination require a native token for the next action?
Not every route requires every step, and a wallet should not bury users in unnecessary detail. But it should reveal the condition that blocks the transaction and explain what the user can do next.
“Insufficient funds” is technically short. It is not operationally complete.
What to check when your balance is visible but the send fails
Use this checklist before adding more funds or retrying the transaction:
1. Confirm the active network
Check which network the asset is actually held on and which network the wallet is using for the send. A similarly named token on another network is a separate balance.
2. Identify the native gas token
Find the token used to pay network fees. On Ethereum this is ETH; on Solana it is normally SOL. Other networks have their own native fee assets.
3. Compare total balance with the maximum spendable amount
If you are sending the native token itself, do not assume the full displayed balance can be transferred. Review the wallet’s fee estimate and the calculated maximum.
4. Recheck the transaction estimate
Fees and route conditions can change. Refresh the quote or transaction instead of repeatedly submitting an old estimate.
5. Inspect any additional requirement
A token approval, destination account creation or unsupported fee-payment method may be the real blocker. The interface should name it directly.
6. Read the outcome before signing
Confirm the source network, recipient, asset, estimated total cost and expected destination amount. A visible balance does not answer those questions by itself.
What better wallet UX should say
When a transaction cannot proceed, the wallet should explain the missing condition in plain language.
Instead of:
Insufficient funds
It could say:
You have enough USDC for this transfer, but not enough ETH on Ethereum to cover the estimated network fee.
Or:
Your balance is on a different network. Switch networks or choose the balance available on the current network.
Or:
Sending the full amount would leave no SOL for the transaction fee. Your current estimated maximum is shown below.
These messages separate what the wallet knows from what the user needs to decide. They also reduce the risk of someone adding the wrong asset, using the wrong network or retrying the same transaction without understanding the cause.
Balance should answer “available for what?”
A wallet balance is useful only when it has context.
The account may own the asset, but the transaction still depends on the network, the fee-paying token and the amount that remains spendable under current conditions. A good wallet should make those dependencies visible before the signature—not reveal them through a generic error afterwards.
Biti.pro is being built around clarity before signing for self-custody users moving assets from EVM networks into Solana. The broader design principle is straightforward: show the user what is available, what is required and what is expected to happen next.
Join the waitlist for product updates from Biti.pro. App & Chrome extension coming soon.
Sources
• [Ethereum.org — Gas and fees](https://ethereum.org/developers/docs/gas/)
• [MetaMask Support — How to fix an “insufficient funds” error](https://support.metamask.io/configure/transactions/how-to-fix-insufficient-funds-error-or-greyed-out-confirm-button/)
• [MetaMask Support — Why a balance may be incorrect or a token missing](https://support.metamask.io/manage-crypto/tokens/what-to-do-when-your-balance-of-tokens-is-incorrect/)
• [Solana Docs — Fees](https://solana.com/docs/core/fees)
• [Solana Docs — How payments work](https://solana.com/docs/payments/how-payments-work)
• [Solana Docs — Fee abstraction](https://solana.com/docs/payments/send-payments/payment-processing/fee-abstraction)than a single transfer. Depending on the route, the user may need to approve a token, submit a source-network transaction, wait for routing or settlement, and then complete an action on the destination network.
The relevant balance is therefore not simply “How much crypto do I own?” It is closer to:
• Which network is the asset on now?
• Which asset pays for the source transaction?
• Is an approval required before execution?
• What amount is available after the estimated source costs?
• Will the destination require a native token for the next action?
Not every route requires every step, and a wallet should not bury users in unnecessary detail. But it should reveal the condition that blocks the transaction and explain what the user can do next.
“Insufficient funds” is technically short. It is not operationally complete.
What to check when your balance is visible but the send fails
Use this checklist before adding more funds or retrying the transaction:
1. Confirm the active network
Check which network the asset is actually held on and which network the wallet is using for the send. A similarly named token on another network is a separate balance.
2. Identify the native gas token
Find the token used to pay network fees. On Ethereum this is ETH; on Solana it is normally SOL. Other networks have their own native fee assets.
3. Compare total balance with the maximum spendable amount
If you are sending the native token itself, do not assume the full displayed balance can be transferred. Review the wallet’s fee estimate and the calculated maximum.
4. Recheck the transaction estimate
Fees and route conditions can change. Refresh the quote or transaction instead of repeatedly submitting an old estimate.
5. Inspect any additional requirement
A token approval, destination account creation or unsupported fee-payment method may be the real blocker. The interface should name it directly.
6. Read the outcome before signing
Confirm the source network, recipient, asset, estimated total cost and expected destination amount. A visible balance does not answer those questions by itself.
What better wallet UX should say
When a transaction cannot proceed, the wallet should explain the missing condition in plain language.
Instead of:
Insufficient funds
It could say:
You have enough USDC for this transfer, but not enough ETH on Ethereum to cover the estimated network fee.
Or:
Your balance is on a different network. Switch networks or choose the balance available on the current network.
Or:
Sending the full amount would leave no SOL for the transaction fee. Your current estimated maximum is shown below.
These messages separate what the wallet knows from what the user needs to decide. They also reduce the risk of someone adding the wrong asset, using the wrong network or retrying the same transaction without understanding the cause.
Balance should answer “available for what?”
A wallet balance is useful only when it has context.
The account may own the asset, but the transaction still depends on the network, the fee-paying token and the amount that remains spendable under current conditions. A good wallet should make those dependencies visible before the signature—not reveal them through a generic error afterwards.
Biti.pro is being built around clarity before signing for self-custody users moving assets from EVM networks into Solana. The broader design principle is straightforward: show the user what is available, what is required and what is expected to happen next.
Join the waitlist for product updates from Biti.pro. App & Chrome extension coming soon.
Sources
• [Ethereum.org — Gas and fees](https://ethereum.org/developers/docs/gas/)
• [MetaMask Support — How to fix an “insufficient funds” error](https://support.metamask.io/configure/transactions/how-to-fix-insufficient-funds-error-or-greyed-out-confirm-button/)
• [MetaMask Support — Why a balance may be incorrect or a token missing](https://support.metamask.io/manage-crypto/tokens/what-to-do-when-your-balance-of-tokens-is-incorrect/)
• [Solana Docs — Fees](https://solana.com/docs/core/fees)
• [Solana Docs — How payments work](https://solana.com/docs/payments/how-payments-work)
• [Solana Docs — Fee abstraction](https://solana.com/docs/payments/send-payments/payment-processing/fee-abstraction)