From 7d84d1f10f623d9cf8c79c63d849b7bf23e43952 Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Wed, 28 Jan 2026 13:39:12 +0800 Subject: [PATCH] feat(web3): check Solana fee balance in GasCheck before opening BrowserWallet sheet --- .../web3/GasCheckBottomSheetDialogFragment.kt | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/one/mixin/android/ui/home/web3/GasCheckBottomSheetDialogFragment.kt b/app/src/main/java/one/mixin/android/ui/home/web3/GasCheckBottomSheetDialogFragment.kt index 4d572226ef..2493441396 100644 --- a/app/src/main/java/one/mixin/android/ui/home/web3/GasCheckBottomSheetDialogFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/home/web3/GasCheckBottomSheetDialogFragment.kt @@ -42,6 +42,7 @@ import one.mixin.android.util.viewBinding import one.mixin.android.web3.Rpc import one.mixin.android.web3.js.JsSignMessage import one.mixin.android.web3.js.Web3Signer +import org.sol4kt.VersionedTransactionCompat import org.web3j.utils.Convert import org.web3j.utils.Numeric import timber.log.Timber @@ -94,6 +95,49 @@ class GasCheckBottomSheetDialogFragment : BottomSheetDialogFragment() { } } + private suspend fun checkSolanaBalanceOrShowError() { + if (!signMessage.isSolMessage()) { + showBrowserWalletBottomSheet() + return + } + if (signMessage.type != JsSignMessage.TYPE_RAW_TRANSACTION) { + showBrowserWalletBottomSheet() + return + } + val rawTx: String = signMessage.data ?: run { + showError(getString(R.string.Data_error)) + return + } + val tx = runCatching { VersionedTransactionCompat.from(rawTx) }.getOrNull() ?: run { + showError(getString(R.string.Data_error)) + return + } + val requiredFee: BigDecimal = tx.calcFee(Web3Signer.address) + val solAsset = viewModel.web3TokenItemById(Web3Signer.currentWalletId, Chain.Solana.assetId) + val solBalance: BigDecimal = solAsset?.balance?.toBigDecimalOrNull() ?: BigDecimal.ZERO + if (solBalance >= requiredFee) { + showBrowserWalletBottomSheet() + return + } + val solTokenItem: Web3TokenItem? = chainToken ?: viewModel.web3TokenItemById(Web3Signer.currentWalletId, Chain.Solana.assetId) + if (solTokenItem == null) { + showError(getString(R.string.Data_error)) + return + } + TransferWeb3BalanceErrorBottomSheetDialogFragment + .newInstance( + Web3TokenFeeItem( + solTokenItem, + BigDecimal.ZERO, + requiredFee + ) + ).showNow( + parentFragmentManager, + TransferWeb3BalanceErrorBottomSheetDialogFragment.TAG + ) + dismiss() + } + private val binding by viewBinding(FragmentBottomSheetBinding::inflate) private lateinit var contentView: View @@ -239,7 +283,7 @@ class GasCheckBottomSheetDialogFragment : BottomSheetDialogFragment() { chainToken: Web3TokenItem?, ) { if (chain == Chain.Solana) { - showBrowserWalletBottomSheet() + checkSolanaBalanceOrShowError() return } val chainId = chain.getWeb3ChainId()