Skip to content

Commit

Permalink
Merge pull request #1412 from novasamatech/rc/7.9.3
Browse files Browse the repository at this point in the history
Rc/7.9.3
  • Loading branch information
valentunn committed Feb 28, 2024
2 parents bc5dd2a + 73750e9 commit 5c98c0f
Show file tree
Hide file tree
Showing 8 changed files with 93 additions and 13 deletions.
5 changes: 3 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
buildscript {
ext {
// App version
versionName = '7.9.2'
versionCode = 120
versionName = '7.9.3'
versionCode = 121

applicationId = "io.novafoundation.nova"
releaseApplicationSuffix = "market"
Expand Down Expand Up @@ -258,6 +258,7 @@ task ktlintFormat(type: JavaExec, group: "formatting") {
main = "com.pinterest.ktlint.Main"
args "-F", "$project.rootDir/**/src/main/**/*.kt"
args "--android"
jvmArgs "--add-opens=java.base/java.lang=ALL-UNNAMED"
}

task runTest(type: GradleBuild) {
Expand Down
1 change: 1 addition & 0 deletions common/src/main/res/values-ru/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1360,6 +1360,7 @@
<string name="wallet_search_empty_title">Убедитесь, что адрес\nиз правильной сети</string>
<string name="wallet_search_empty_title_v2_2_0">Неверный формат адреса.\nУбедитесь, что адрес \nсоответствует сети</string>
<string name="wallet_send_balance_minimal">Минимальный баланс</string>
<string name="wallet_send_cannot_dust_before_delivery_fee_message">Ваш доступный баланс %s, вам необходимо оставить минимум %s для доставки перевода и заплатить комиссию сети %s. Вы можете перевести не более %s</string>
<string name="wallet_send_cannot_pay_cross_chain_fee" formatted="false">У вас недостаточно токенов для оплаты межсетевой комиссии в размере %s.\nОстаток баланса после перевода: %s</string>
<string name="wallet_send_confirm_hint">Межсетевая комиссия добавляется к введенной сумме. Получатель может получить часть межсетевой комиссии</string>
<string name="wallet_send_confirm_transfer">Подтвердить</string>
Expand Down
1 change: 1 addition & 0 deletions common/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="TypographyEllipsis">
<string name="wallet_send_cannot_dust_before_delivery_fee_message">Your available balance is %s, you need to leave at least %s for transfer delivery and pay network fee of %s. You can transfer not more than %s</string>

<string name="common_too_small_balance_title">Your balance is too small</string>
<string name="wallet_send_insufficient_balance_commission">You need to have at least %s to pay this transaction fee and stay above the minimum network balance. Your current balance is: %s. You need to add %s to your balance to perform this operation.</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,6 @@ class SendInteractor(
)
}

suspend fun syncCrossChainConfig() = kotlin.runCatching {
crossChainTransfersRepository.syncConfiguration()
}

suspend fun getFee(amount: Balance, transfer: AssetTransfer): TransferFeeModel = withContext(Dispatchers.Default) {
if (transfer.isCrossChain) {
val config = crossChainTransfersRepository.getConfiguration().configurationFor(transfer)!!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.assets.t
import io.novafoundation.nova.feature_wallet_api.domain.model.OriginGenericFee
import io.novafoundation.nova.feature_wallet_api.domain.validation.handleFeeSpikeDetected
import io.novafoundation.nova.feature_wallet_api.domain.validation.handleNotEnoughFeeError
import io.novafoundation.nova.feature_wallet_api.presentation.formatters.formatPlanks
import io.novafoundation.nova.feature_wallet_api.presentation.formatters.formatTokenAmount
import io.novafoundation.nova.feature_wallet_api.presentation.mixin.fee.GenericFeeLoaderMixin
import io.novafoundation.nova.feature_wallet_api.presentation.validation.handleInsufficientBalanceCommission
Expand Down Expand Up @@ -76,6 +77,17 @@ fun CoroutineScope.mapAssetTransferValidationFailureToUI(
)
)

is AssetTransferValidationFailure.NotEnoughFunds.ToStayAboveEdBeforePayingDeliveryFees -> Default(
resourceManager.getString(R.string.common_not_enough_funds_title) to
resourceManager.getString(
R.string.wallet_send_cannot_dust_before_delivery_fee_message,
reason.balanceCountedTowardsEd.formatPlanks(reason.chainAsset),
reason.existentialDeposit.formatPlanks(reason.chainAsset),
reason.networkFee.formatPlanks(reason.chainAsset),
reason.maxPossibleTransferAmount.formatPlanks(reason.chainAsset)
)
)

is AssetTransferValidationFailure.NotEnoughFunds.ToStayAboveED -> handleInsufficientBalanceCommission(
reason,
resourceManager
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package io.novafoundation.nova.feature_wallet_api.data.network.blockhain.assets.
import io.novafoundation.nova.common.validation.Validation
import io.novafoundation.nova.common.validation.ValidationSystem
import io.novafoundation.nova.common.validation.ValidationSystemBuilder
import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.types.Balance
import io.novafoundation.nova.feature_wallet_api.domain.model.Asset
import io.novafoundation.nova.feature_wallet_api.domain.model.OriginDecimalFee
import io.novafoundation.nova.feature_wallet_api.domain.model.OriginGenericFee
Expand Down Expand Up @@ -56,6 +57,14 @@ sealed class AssetTransferValidationFailure {
val fee: BigDecimal,
val remainingBalanceAfterTransfer: BigDecimal,
) : NotEnoughFunds()

class ToStayAboveEdBeforePayingDeliveryFees(
val balanceCountedTowardsEd: Balance,
val existentialDeposit: Balance,
val networkFee: Balance,
val maxPossibleTransferAmount: Balance,
val chainAsset: Chain.Asset,
) : NotEnoughFunds()
}

class InvalidRecipientAddress(val chain: Chain) : AssetTransferValidationFailure()
Expand Down Expand Up @@ -100,13 +109,6 @@ val AssetTransferPayload.isSendingCommissionAsset
val AssetTransferPayload.isReceivingCommissionAsset
get() = transfer.destinationChainAsset == transfer.destinationChain.commissionAsset

val AssetTransferPayload.originFeeInUsedAsset: OriginDecimalFee?
get() = if (isSendingCommissionAsset) {
originFee
} else {
null
}

val AssetTransferPayload.receivingAmountInCommissionAsset: BigInteger
get() = if (isReceivingCommissionAsset) {
transfer.amountInPlanks
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import io.novafoundation.nova.feature_wallet_impl.data.network.blockchain.assets
import io.novafoundation.nova.feature_wallet_impl.data.network.blockchain.assets.transfers.validations.sufficientTransferableBalanceToPayOriginFee
import io.novafoundation.nova.feature_wallet_impl.data.network.blockchain.assets.transfers.validations.validAddress
import io.novafoundation.nova.feature_wallet_impl.data.network.crosschain.validations.canPayCrossChainFee
import io.novafoundation.nova.feature_wallet_impl.data.network.crosschain.validations.cannotDropBelowEdBeforePayingDeliveryFee
import io.novafoundation.nova.runtime.ext.accountIdOrDefault
import io.novafoundation.nova.runtime.multiNetwork.multiLocation.MultiLocation
import io.novasama.substrate_sdk_android.runtime.extrinsic.ExtrinsicBuilder
Expand Down Expand Up @@ -61,6 +62,8 @@ class RealCrossChainTransactor(
sufficientTransferableBalanceToPayOriginFee()
canPayCrossChainFee()

cannotDropBelowEdBeforePayingDeliveryFee(assetSourceRegistry)

doNotCrossExistentialDepositInUsedAsset(
assetSourceRegistry = assetSourceRegistry,
extraAmount = { it.transfer.amount + it.crossChainFee?.networkFeeDecimalAmount.orZero() }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package io.novafoundation.nova.feature_wallet_impl.data.network.crosschain.validations

import io.novafoundation.nova.common.utils.atLeastZero
import io.novafoundation.nova.common.utils.orZero
import io.novafoundation.nova.common.validation.ValidationStatus
import io.novafoundation.nova.common.validation.valid
import io.novafoundation.nova.common.validation.validationError
import io.novafoundation.nova.feature_account_api.data.model.amountByRequestedAccount
import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.assets.AssetSourceRegistry
import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.assets.existentialDepositInPlanks
import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.assets.tranfers.AssetTransferPayload
import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.assets.tranfers.AssetTransferValidationFailure
import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.assets.tranfers.AssetTransferValidationFailure.NotEnoughFunds.ToStayAboveEdBeforePayingDeliveryFees
import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.assets.tranfers.AssetTransfersValidation
import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.assets.tranfers.AssetTransfersValidationSystemBuilder
import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.assets.tranfers.amountInPlanks
import io.novafoundation.nova.feature_wallet_api.data.network.blockhain.assets.tranfers.isSendingCommissionAsset
import io.novafoundation.nova.feature_wallet_api.domain.model.deliveryFeePart
import io.novafoundation.nova.feature_wallet_api.domain.model.networkFeePart
import io.novasama.substrate_sdk_android.hash.isPositive

class CannotDropBelowEdBeforePayingDeliveryFeeValidation(
private val assetSourceRegistry: AssetSourceRegistry
) : AssetTransfersValidation {

override suspend fun validate(value: AssetTransferPayload): ValidationStatus<AssetTransferValidationFailure> {
if (!value.isSendingCommissionAsset) return valid()

val existentialDeposit = assetSourceRegistry.existentialDepositInPlanks(value.transfer.originChain, value.transfer.originChainAsset)

val deliveryFeePart = value.originFee.deliveryFeePart()?.networkFee?.amount.orZero()
val paysDeliveryFee = deliveryFeePart.isPositive()

val networkFeePlanks = value.originFee.networkFeePart().networkFee.amountByRequestedAccount
val sendingAmount = value.transfer.amountInPlanks + value.crossChainFee?.networkFee?.amountByRequestedAccount.orZero()
val requiredAmountBeforePayingDeliveryFee = sendingAmount + networkFeePlanks + existentialDeposit

val balanceCountedTowardsEd = value.originUsedAsset.balanceCountedTowardsEDInPlanks

return when {
!paysDeliveryFee -> valid()

requiredAmountBeforePayingDeliveryFee <= balanceCountedTowardsEd -> valid()

else -> {
val availableBalance = (balanceCountedTowardsEd - networkFeePlanks - existentialDeposit).atLeastZero()

validationError(
ToStayAboveEdBeforePayingDeliveryFees(
balanceCountedTowardsEd = balanceCountedTowardsEd,
existentialDeposit = existentialDeposit,
networkFee = networkFeePlanks,
maxPossibleTransferAmount = availableBalance,
chainAsset = value.transfer.originChainAsset
)
)
}
}
}
}

fun AssetTransfersValidationSystemBuilder.cannotDropBelowEdBeforePayingDeliveryFee(
assetSourceRegistry: AssetSourceRegistry
) = validate(CannotDropBelowEdBeforePayingDeliveryFeeValidation(assetSourceRegistry))

0 comments on commit 5c98c0f

Please sign in to comment.