@@ -42,6 +42,7 @@ import one.mixin.android.util.viewBinding
4242import one.mixin.android.web3.Rpc
4343import one.mixin.android.web3.js.JsSignMessage
4444import one.mixin.android.web3.js.Web3Signer
45+ import org.sol4kt.VersionedTransactionCompat
4546import org.web3j.utils.Convert
4647import org.web3j.utils.Numeric
4748import 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