Skip to content

Commit 7d84d1f

Browse files
committed
feat(web3): check Solana fee balance in GasCheck before opening BrowserWallet sheet
1 parent 0cc0c37 commit 7d84d1f

1 file changed

Lines changed: 45 additions & 1 deletion

File tree

app/src/main/java/one/mixin/android/ui/home/web3/GasCheckBottomSheetDialogFragment.kt

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import one.mixin.android.util.viewBinding
4242
import one.mixin.android.web3.Rpc
4343
import one.mixin.android.web3.js.JsSignMessage
4444
import one.mixin.android.web3.js.Web3Signer
45+
import org.sol4kt.VersionedTransactionCompat
4546
import org.web3j.utils.Convert
4647
import org.web3j.utils.Numeric
4748
import timber.log.Timber
@@ -94,6 +95,49 @@ class GasCheckBottomSheetDialogFragment : BottomSheetDialogFragment() {
9495
}
9596
}
9697

98+
private suspend fun checkSolanaBalanceOrShowError() {
99+
if (!signMessage.isSolMessage()) {
100+
showBrowserWalletBottomSheet()
101+
return
102+
}
103+
if (signMessage.type != JsSignMessage.TYPE_RAW_TRANSACTION) {
104+
showBrowserWalletBottomSheet()
105+
return
106+
}
107+
val rawTx: String = signMessage.data ?: run {
108+
showError(getString(R.string.Data_error))
109+
return
110+
}
111+
val tx = runCatching { VersionedTransactionCompat.from(rawTx) }.getOrNull() ?: run {
112+
showError(getString(R.string.Data_error))
113+
return
114+
}
115+
val requiredFee: BigDecimal = tx.calcFee(Web3Signer.address)
116+
val solAsset = viewModel.web3TokenItemById(Web3Signer.currentWalletId, Chain.Solana.assetId)
117+
val solBalance: BigDecimal = solAsset?.balance?.toBigDecimalOrNull() ?: BigDecimal.ZERO
118+
if (solBalance >= requiredFee) {
119+
showBrowserWalletBottomSheet()
120+
return
121+
}
122+
val solTokenItem: Web3TokenItem? = chainToken ?: viewModel.web3TokenItemById(Web3Signer.currentWalletId, Chain.Solana.assetId)
123+
if (solTokenItem == null) {
124+
showError(getString(R.string.Data_error))
125+
return
126+
}
127+
TransferWeb3BalanceErrorBottomSheetDialogFragment
128+
.newInstance(
129+
Web3TokenFeeItem(
130+
solTokenItem,
131+
BigDecimal.ZERO,
132+
requiredFee
133+
)
134+
).showNow(
135+
parentFragmentManager,
136+
TransferWeb3BalanceErrorBottomSheetDialogFragment.TAG
137+
)
138+
dismiss()
139+
}
140+
97141
private val binding by viewBinding(FragmentBottomSheetBinding::inflate)
98142

99143
private lateinit var contentView: View
@@ -239,7 +283,7 @@ class GasCheckBottomSheetDialogFragment : BottomSheetDialogFragment() {
239283
chainToken: Web3TokenItem?,
240284
) {
241285
if (chain == Chain.Solana) {
242-
showBrowserWalletBottomSheet()
286+
checkSolanaBalanceOrShowError()
243287
return
244288
}
245289
val chainId = chain.getWeb3ChainId()

0 commit comments

Comments
 (0)