Updated on 2026-08-14
This commit is contained in:
parent
43d1e4a322
commit
288e63fa29
3 changed files with 91 additions and 8 deletions
|
|
@ -128,4 +128,8 @@ internal class EthereumCustomFeeConverter(
|
||||||
const val GAS_DECIMALS = 0
|
const val GAS_DECIMALS = 0
|
||||||
const val FEE_AMOUNT = 0
|
const val FEE_AMOUNT = 0
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun MutableList<SendTextField.CustomFee>.setEmpty(index: Int) {
|
||||||
|
set(index, this[index].copy(value = ""))
|
||||||
}
|
}
|
||||||
|
|
@ -12,6 +12,7 @@ import com.tangem.core.ui.utils.parseToBigDecimal
|
||||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||||
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
|
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
|
||||||
import com.tangem.features.send.impl.R
|
import com.tangem.features.send.impl.R
|
||||||
|
import com.tangem.features.send.impl.presentation.state.fee.checkExceedBalance
|
||||||
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.ETHEREUM_GAS_UNIT
|
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.ETHEREUM_GAS_UNIT
|
||||||
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.FEE_AMOUNT
|
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.FEE_AMOUNT
|
||||||
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.GAS_DECIMALS
|
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.GAS_DECIMALS
|
||||||
|
|
@ -85,15 +86,12 @@ internal class EthereumEIPCustomFeeConverter(
|
||||||
when (index) {
|
when (index) {
|
||||||
FEE_AMOUNT -> setOnAmountChange(value, index)
|
FEE_AMOUNT -> setOnAmountChange(value, index)
|
||||||
MAX_FEE -> setOnMaxFeeChange(value, index)
|
MAX_FEE -> setOnMaxFeeChange(value, index)
|
||||||
|
GAS_LIMIT -> setOnGasLimitChange(value, index)
|
||||||
else -> set(index, this[index].copy(value = value))
|
else -> set(index, this[index].copy(value = value))
|
||||||
}
|
}
|
||||||
}.toImmutableList()
|
}.toImmutableList()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun MutableList<SendTextField.CustomFee>.setEmpty(index: Int) {
|
|
||||||
set(index, this[index].copy(value = ""))
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun MutableList<SendTextField.CustomFee>.setOnAmountChange(value: String, index: Int) {
|
private fun MutableList<SendTextField.CustomFee>.setOnAmountChange(value: String, index: Int) {
|
||||||
val gasLimit = this[GAS_LIMIT].value.parseToBigDecimal(this[GAS_LIMIT].decimals)
|
val gasLimit = this[GAS_LIMIT].value.parseToBigDecimal(this[GAS_LIMIT].decimals)
|
||||||
if (value.isBlank()) {
|
if (value.isBlank()) {
|
||||||
|
|
@ -148,6 +146,48 @@ internal class EthereumEIPCustomFeeConverter(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun MutableList<SendTextField.CustomFee>.setOnGasLimitChange(value: String, index: Int) {
|
||||||
|
if (value.isBlank()) {
|
||||||
|
setEmpty(FEE_AMOUNT)
|
||||||
|
setEmpty(GAS_LIMIT)
|
||||||
|
} else {
|
||||||
|
val newGasLimit = value.parseToBigDecimal(this[GAS_LIMIT].decimals)
|
||||||
|
|
||||||
|
val maxFee = this[MAX_FEE].value.parseToBigDecimal(this[MAX_FEE].decimals)
|
||||||
|
.movePointLeft(this[MAX_FEE].decimals) // from GWEI to ETH
|
||||||
|
|
||||||
|
val newFeeAmount = newGasLimit * maxFee
|
||||||
|
|
||||||
|
set(
|
||||||
|
index = FEE_AMOUNT,
|
||||||
|
element = this[FEE_AMOUNT].copy(
|
||||||
|
value = newFeeAmount.parseBigDecimal(this[FEE_AMOUNT].decimals),
|
||||||
|
label = getFiatReference(
|
||||||
|
rate = feeCryptoCurrencyStatusProvider()?.value?.fiatRate,
|
||||||
|
value = newFeeAmount,
|
||||||
|
appCurrency = appCurrencyProvider(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
val isNotExceedBalance = checkExceedBalance(
|
||||||
|
feeBalance = feeCryptoCurrencyStatusProvider()?.value?.amount,
|
||||||
|
feeAmount = newFeeAmount,
|
||||||
|
)
|
||||||
|
|
||||||
|
set(
|
||||||
|
index = index,
|
||||||
|
element = this[index].copy(
|
||||||
|
value = value,
|
||||||
|
keyboardOptions = KeyboardOptions(
|
||||||
|
imeAction = if (!isNotExceedBalance) ImeAction.None else ImeAction.Done,
|
||||||
|
keyboardType = KeyboardType.Number,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
const val MAX_FEE = 1
|
const val MAX_FEE = 1
|
||||||
const val PRIORITY_FEE = 2
|
const val PRIORITY_FEE = 2
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import com.tangem.core.ui.utils.parseToBigDecimal
|
||||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||||
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
|
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
|
||||||
import com.tangem.features.send.impl.R
|
import com.tangem.features.send.impl.R
|
||||||
|
import com.tangem.features.send.impl.presentation.state.fee.checkExceedBalance
|
||||||
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.ETHEREUM_GAS_UNIT
|
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.ETHEREUM_GAS_UNIT
|
||||||
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.FEE_AMOUNT
|
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.FEE_AMOUNT
|
||||||
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.GAS_DECIMALS
|
import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter.Companion.GAS_DECIMALS
|
||||||
|
|
@ -76,15 +77,12 @@ internal class EthereumLegacyCustomFeeConverter(
|
||||||
when (index) {
|
when (index) {
|
||||||
FEE_AMOUNT -> setOnAmountChange(value, index)
|
FEE_AMOUNT -> setOnAmountChange(value, index)
|
||||||
GAS_PRICE -> setOnGasPriceChange(value, index)
|
GAS_PRICE -> setOnGasPriceChange(value, index)
|
||||||
|
GAS_LIMIT -> setOnGasLimitChange(value, index)
|
||||||
else -> set(index, this[index].copy(value = value))
|
else -> set(index, this[index].copy(value = value))
|
||||||
}
|
}
|
||||||
}.toImmutableList()
|
}.toImmutableList()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun MutableList<SendTextField.CustomFee>.setEmpty(index: Int) {
|
|
||||||
set(index, this[index].copy(value = ""))
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun MutableList<SendTextField.CustomFee>.setOnAmountChange(value: String, index: Int) {
|
private fun MutableList<SendTextField.CustomFee>.setOnAmountChange(value: String, index: Int) {
|
||||||
val gasLimit = this[GAS_LIMIT].value.parseToBigDecimal(this[GAS_LIMIT].decimals)
|
val gasLimit = this[GAS_LIMIT].value.parseToBigDecimal(this[GAS_LIMIT].decimals)
|
||||||
if (value.isBlank()) {
|
if (value.isBlank()) {
|
||||||
|
|
@ -133,6 +131,47 @@ internal class EthereumLegacyCustomFeeConverter(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun MutableList<SendTextField.CustomFee>.setOnGasLimitChange(value: String, index: Int) {
|
||||||
|
if (value.isBlank()) {
|
||||||
|
setEmpty(FEE_AMOUNT)
|
||||||
|
setEmpty(GAS_LIMIT)
|
||||||
|
} else {
|
||||||
|
val newGasLimit = value.parseToBigDecimal(this[GAS_LIMIT].decimals)
|
||||||
|
val gasPrice = this[GAS_PRICE].value.parseToBigDecimal(this[GAS_PRICE].decimals)
|
||||||
|
.movePointLeft(this[GAS_PRICE].decimals) // from GWEI to ETH
|
||||||
|
|
||||||
|
val newFeeAmount = newGasLimit * gasPrice
|
||||||
|
|
||||||
|
set(
|
||||||
|
index = FEE_AMOUNT,
|
||||||
|
element = this[FEE_AMOUNT].copy(
|
||||||
|
value = newFeeAmount.parseBigDecimal(this[FEE_AMOUNT].decimals),
|
||||||
|
label = getFiatReference(
|
||||||
|
rate = feeCryptoCurrencyStatusProvider()?.value?.fiatRate,
|
||||||
|
value = newFeeAmount,
|
||||||
|
appCurrency = appCurrencyProvider(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
val isNotExceedBalance = checkExceedBalance(
|
||||||
|
feeBalance = feeCryptoCurrencyStatusProvider()?.value?.amount,
|
||||||
|
feeAmount = newFeeAmount,
|
||||||
|
)
|
||||||
|
|
||||||
|
set(
|
||||||
|
index = index,
|
||||||
|
element = this[index].copy(
|
||||||
|
value = value,
|
||||||
|
keyboardOptions = KeyboardOptions(
|
||||||
|
imeAction = if (!isNotExceedBalance) ImeAction.None else ImeAction.Done,
|
||||||
|
keyboardType = KeyboardType.Number,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
const val GAS_PRICE = 1
|
const val GAS_PRICE = 1
|
||||||
const val GAS_LIMIT = 2
|
const val GAS_LIMIT = 2
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue