diff --git a/Podfile b/Podfile index f4a1b0ea66..59f2f8b663 100644 --- a/Podfile +++ b/Podfile @@ -8,7 +8,7 @@ abstract_target 'novawalletAll' do pod 'SwiftLint' pod 'R.swift', :inhibit_warnings => true pod 'SoraKeystore', '~> 1.0.0' - pod 'SoraUI', :git => 'https://github.com/ERussel/UIkit-iOS.git', :tag => '1.11.1' + pod 'SoraUI', :git => 'https://github.com/ERussel/UIkit-iOS.git', :tag => '1.12.0' pod 'RobinHood', '~> 2.6.0' pod 'SoraFoundation', :git => 'https://github.com/ERussel/Foundation-iOS.git', :tag => '1.1.0' pod 'SwiftyBeaver' diff --git a/Podfile.lock b/Podfile.lock index 7581bee044..368977c09a 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -60,38 +60,38 @@ PODS: - SoraFoundation/NotificationHandlers - SoraFoundation/ViewModel (1.1.0) - SoraKeystore (1.0.0) - - SoraUI (1.11.1): - - SoraUI/AdaptiveDesign (= 1.11.1) - - SoraUI/Animator (= 1.11.1) - - SoraUI/Camera (= 1.11.1) - - SoraUI/Controls (= 1.11.1) - - SoraUI/DetailsView (= 1.11.1) - - SoraUI/EmptyState (= 1.11.1) - - SoraUI/Helpers (= 1.11.1) - - SoraUI/LoadingView (= 1.11.1) - - SoraUI/ModalPresentation (= 1.11.1) - - SoraUI/PageLoader (= 1.11.1) - - SoraUI/PinView (= 1.11.1) - - SoraUI/Skrull (= 1.11.1) - - SoraUI/AdaptiveDesign (1.11.1) - - SoraUI/Animator (1.11.1) - - SoraUI/Camera (1.11.1) - - SoraUI/Controls (1.11.1): + - SoraUI (1.12.0): + - SoraUI/AdaptiveDesign (= 1.12.0) + - SoraUI/Animator (= 1.12.0) + - SoraUI/Camera (= 1.12.0) + - SoraUI/Controls (= 1.12.0) + - SoraUI/DetailsView (= 1.12.0) + - SoraUI/EmptyState (= 1.12.0) + - SoraUI/Helpers (= 1.12.0) + - SoraUI/LoadingView (= 1.12.0) + - SoraUI/ModalPresentation (= 1.12.0) + - SoraUI/PageLoader (= 1.12.0) + - SoraUI/PinView (= 1.12.0) + - SoraUI/Skrull (= 1.12.0) + - SoraUI/AdaptiveDesign (1.12.0) + - SoraUI/Animator (1.12.0) + - SoraUI/Camera (1.12.0) + - SoraUI/Controls (1.12.0): - SoraUI/Animator - - SoraUI/DetailsView (1.11.1): + - SoraUI/DetailsView (1.12.0): - SoraUI/Controls - - SoraUI/EmptyState (1.11.1): + - SoraUI/EmptyState (1.12.0): - SoraUI/Animator - - SoraUI/Helpers (1.11.1) - - SoraUI/LoadingView (1.11.1): + - SoraUI/Helpers (1.12.0) + - SoraUI/LoadingView (1.12.0): - SoraUI/Controls - - SoraUI/ModalPresentation (1.11.1): + - SoraUI/ModalPresentation (1.12.0): - SoraUI/Animator - SoraUI/Controls - - SoraUI/PageLoader (1.11.1) - - SoraUI/PinView (1.11.1): + - SoraUI/PageLoader (1.12.0) + - SoraUI/PinView (1.12.0): - SoraUI/Controls - - SoraUI/Skrull (1.11.1) + - SoraUI/Skrull (1.12.0) - Sourcery (1.4.1) - Starscream (4.0.8) - SubstrateSdk (1.14.0): @@ -159,7 +159,7 @@ DEPENDENCIES: - SnapKit (~> 5.0.0) - SoraFoundation (from `https://github.com/ERussel/Foundation-iOS.git`, tag `1.1.0`) - SoraKeystore (~> 1.0.0) - - SoraUI (from `https://github.com/ERussel/UIkit-iOS.git`, tag `1.11.1`) + - SoraUI (from `https://github.com/ERussel/UIkit-iOS.git`, commit `a4eb0139a27d77f11b8e5083e125c38ea82d8e5e`) - Sourcery (~> 1.4) - Starscream (from `https://github.com/ERussel/Starscream.git`, tag `4.0.8`) - SubstrateSdk (from `https://github.com/nova-wallet/substrate-sdk-ios.git`, tag `1.14.0`) @@ -213,8 +213,8 @@ EXTERNAL SOURCES: :git: https://github.com/ERussel/Foundation-iOS.git :tag: 1.1.0 SoraUI: + :commit: a4eb0139a27d77f11b8e5083e125c38ea82d8e5e :git: https://github.com/ERussel/UIkit-iOS.git - :tag: 1.11.1 Starscream: :git: https://github.com/ERussel/Starscream.git :tag: 4.0.8 @@ -244,8 +244,8 @@ CHECKOUT OPTIONS: :git: https://github.com/ERussel/Foundation-iOS.git :tag: 1.1.0 SoraUI: + :commit: a4eb0139a27d77f11b8e5083e125c38ea82d8e5e :git: https://github.com/ERussel/UIkit-iOS.git - :tag: 1.11.1 Starscream: :git: https://github.com/ERussel/Starscream.git :tag: 4.0.8 @@ -285,7 +285,7 @@ SPEC CHECKSUMS: SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb SoraFoundation: 5b9d3c82d602150d2c2e65481c5eca5f5987c12c SoraKeystore: 92cff6e2a12f212dd64ed089970ff7c365247b1c - SoraUI: e5ceb2cffe40145e589aa464e2e0a8d054011e0b + SoraUI: a3c1163a95c9dd1b6758ca90eb5bda2f4639d634 Sourcery: db66600e8b285c427701821598d07cf3c7e6c476 Starscream: b676ee89781677a2d8d36029a78c970710e2d3eb SubstrateSdk: 1cb78eac5b05f2c259487f3027c3ae807f24c097 @@ -303,6 +303,6 @@ SPEC CHECKSUMS: ZMarkupParser: a92d31ba40695b790f1da5fec98c3d4505341aff ZNSTextAttachment: 4a9b4e8ee1ed087fc893ae6657dfb678f1a00340 -PODFILE CHECKSUM: f37e3724d47617fb7ce7ed5e0a583491617b5899 +PODFILE CHECKSUM: 812e09964099216590d3e74fcb350c38b2ccbd38 COCOAPODS: 1.13.0 diff --git a/novawallet/Modules/AssetDetails/View/AssetDetailsViewLayout.swift b/novawallet/Modules/AssetDetails/View/AssetDetailsViewLayout.swift index 98ad858b5f..6e0c4e899d 100644 --- a/novawallet/Modules/AssetDetails/View/AssetDetailsViewLayout.swift +++ b/novawallet/Modules/AssetDetails/View/AssetDetailsViewLayout.swift @@ -182,7 +182,7 @@ final class AssetDetailsViewLayout: UIView { ) receiveButton.invalidateLayout() - swapButton.imageWithTitleView?.title = R.string.localizable.commonSwap( + swapButton.imageWithTitleView?.title = R.string.localizable.commonSwapAction( preferredLanguages: languages ) swapButton.invalidateLayout() diff --git a/novawallet/Modules/AssetList/Models/AssetListAssetModel.swift b/novawallet/Modules/AssetList/Models/AssetListAssetModel.swift index d4c42baca7..65d93d0508 100644 --- a/novawallet/Modules/AssetList/Models/AssetListAssetModel.swift +++ b/novawallet/Modules/AssetList/Models/AssetListAssetModel.swift @@ -12,14 +12,31 @@ struct AssetListAssetModel: Identifiable { let externalBalancesResult: Result? let externalBalancesValue: Decimal? - var totalAmount: BigUInt? { + let totalAmountDecimal: Decimal? + let totalAmount: BigUInt? + + init( + assetModel: AssetModel, + balanceResult: Result?, + balanceValue: Decimal?, + externalBalancesResult: Result?, + externalBalancesValue: Decimal? + ) { + self.assetModel = assetModel + self.balanceResult = balanceResult + self.balanceValue = balanceValue + self.externalBalancesResult = externalBalancesResult + self.externalBalancesValue = externalBalancesValue + let maybeBalanceAmount = try? balanceResult?.get() let maybeExternalBalances = try? externalBalancesResult?.get() if let balanceAmount = maybeBalanceAmount, let externalBalancesAmount = maybeExternalBalances { - return balanceAmount + externalBalancesAmount + totalAmount = balanceAmount + externalBalancesAmount } else { - return maybeBalanceAmount ?? maybeExternalBalances + totalAmount = maybeBalanceAmount ?? maybeExternalBalances } + + totalAmountDecimal = totalAmount?.decimal(precision: assetModel.precision) } var totalValue: Decimal? { diff --git a/novawallet/Modules/AssetList/Models/AssetListModelHelpers.swift b/novawallet/Modules/AssetList/Models/AssetListModelHelpers.swift index 784af8215d..2d8d8961c1 100644 --- a/novawallet/Modules/AssetList/Models/AssetListModelHelpers.swift +++ b/novawallet/Modules/AssetList/Models/AssetListModelHelpers.swift @@ -55,8 +55,8 @@ enum AssetListModelHelpers { from assets: [AssetListAssetModel] ) -> ListDifferenceCalculator { let sortingBlock: (AssetListAssetModel, AssetListAssetModel) -> Bool = { model1, model2 in - let balance1 = (try? model1.balanceResult?.get()) ?? 0 - let balance2 = (try? model2.balanceResult?.get()) ?? 0 + let balance1 = model1.totalAmountDecimal ?? 0 + let balance2 = model2.totalAmountDecimal ?? 0 let assetValue1 = model1.totalValue ?? 0 let assetValue2 = model2.totalValue ?? 0 @@ -68,7 +68,7 @@ enum AssetListModelHelpers { } else if assetValue2 > 0 { return false } else if balance1 > 0, balance2 > 0 { - return model1.assetModel.assetId < model2.assetModel.assetId + return balance1 > balance2 } else if balance1 > 0 { return true } else if balance2 > 0 { diff --git a/novawallet/Modules/AssetList/View/AssetListTotalBalanceCell.swift b/novawallet/Modules/AssetList/View/AssetListTotalBalanceCell.swift index 5a841e9e48..c6cc91cd3d 100644 --- a/novawallet/Modules/AssetList/View/AssetListTotalBalanceCell.swift +++ b/novawallet/Modules/AssetList/View/AssetListTotalBalanceCell.swift @@ -54,7 +54,7 @@ final class AssetListTotalBalanceCell: UICollectionViewCell { icon: R.image.iconReceive() ) lazy var swapButton = createActionButton( - title: R.string.localizable.commonSwap( + title: R.string.localizable.commonSwapAction( preferredLanguages: locale.rLanguages ), icon: R.image.iconActionChange() @@ -217,7 +217,7 @@ final class AssetListTotalBalanceCell: UICollectionViewCell { buyButton.imageWithTitleView?.title = R.string.localizable.walletAssetBuy( preferredLanguages: locale.rLanguages ) - swapButton.imageWithTitleView?.title = R.string.localizable.commonSwap( + swapButton.imageWithTitleView?.title = R.string.localizable.commonSwapAction( preferredLanguages: locale.rLanguages ) } diff --git a/novawallet/Modules/Swaps/Confirm/SwapConfirmViewController.swift b/novawallet/Modules/Swaps/Confirm/SwapConfirmViewController.swift index 5e8658d657..cd6ceb36ce 100644 --- a/novawallet/Modules/Swaps/Confirm/SwapConfirmViewController.swift +++ b/novawallet/Modules/Swaps/Confirm/SwapConfirmViewController.swift @@ -35,7 +35,7 @@ final class SwapConfirmViewController: UIViewController, ViewHolder { private func setupLocalization() { rootView.setup(locale: selectedLocale) - title = R.string.localizable.commonSwap( + title = R.string.localizable.commonSwapTitle( preferredLanguages: selectedLocale.rLanguages ) } diff --git a/novawallet/Modules/Swaps/Setup/SwapSetupViewController.swift b/novawallet/Modules/Swaps/Setup/SwapSetupViewController.swift index 78fe7fc840..def687e843 100644 --- a/novawallet/Modules/Swaps/Setup/SwapSetupViewController.swift +++ b/novawallet/Modules/Swaps/Setup/SwapSetupViewController.swift @@ -96,7 +96,7 @@ final class SwapSetupViewController: UIViewController, ViewHolder { } private func setupLocalization() { - title = R.string.localizable.commonSwap(preferredLanguages: selectedLocale.rLanguages) + title = R.string.localizable.commonSwapTitle(preferredLanguages: selectedLocale.rLanguages) rootView.setup(locale: selectedLocale) setupAccessoryView() } diff --git a/novawallet/Modules/TransactionHistory/HistoryFilter/ViewModel/WalletHistoryFilterViewModel.swift b/novawallet/Modules/TransactionHistory/HistoryFilter/ViewModel/WalletHistoryFilterViewModel.swift index d78214a508..83023f212e 100644 --- a/novawallet/Modules/TransactionHistory/HistoryFilter/ViewModel/WalletHistoryFilterViewModel.swift +++ b/novawallet/Modules/TransactionHistory/HistoryFilter/ViewModel/WalletHistoryFilterViewModel.swift @@ -24,7 +24,7 @@ enum WalletHistoryFilterRow: Int, CaseIterable { } case .swaps: return LocalizableResource { locale in - R.string.localizable.commonSwap(preferredLanguages: locale.rLanguages) + R.string.localizable.commonSwapTitle(preferredLanguages: locale.rLanguages) } } } diff --git a/novawallet/Modules/TransactionHistory/Model/TransactionHistoryViewModelFactory.swift b/novawallet/Modules/TransactionHistory/Model/TransactionHistoryViewModelFactory.swift index b49ab0b83b..35cf41400d 100644 --- a/novawallet/Modules/TransactionHistory/Model/TransactionHistoryViewModelFactory.swift +++ b/novawallet/Modules/TransactionHistory/Model/TransactionHistoryViewModelFactory.swift @@ -129,7 +129,7 @@ final class TransactionHistoryViewModelFactory { return .init( identifier: data.identifier, timestamp: data.timestamp, - title: R.string.localizable.commonSwap(preferredLanguages: locale.rLanguages), + title: R.string.localizable.commonSwapTitle(preferredLanguages: locale.rLanguages), subtitle: subtitle, amount: balance.amount, amountDetails: amountDetails, diff --git a/novawallet/en.lproj/InfoPlist.strings b/novawallet/en.lproj/InfoPlist.strings index 9c21500255..99fa3b86ad 100644 --- a/novawallet/en.lproj/InfoPlist.strings +++ b/novawallet/en.lproj/InfoPlist.strings @@ -2,4 +2,4 @@ "NSFaceIDUsageDescription" = "Face ID is used to authorize in Nova Wallet"; "NSPhotoLibraryUsageDescription" = "Photo library access is used to allow selection of QR code with addresses, Polkadot Vault transactions, or connect via WalletConnect"; "NSPhotoLibraryAddUsageDescription" = "Save transfer request as a qr code"; -"NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with Ledger Nano X devices"; +"NSBluetoothAlwaysUsageDescription" = "Bluetooth is used to communicate with Ledger Nano X devices"; \ No newline at end of file diff --git a/novawallet/en.lproj/Localizable.strings b/novawallet/en.lproj/Localizable.strings index 0ecf15cac1..8fa251540d 100644 --- a/novawallet/en.lproj/Localizable.strings +++ b/novawallet/en.lproj/Localizable.strings @@ -114,7 +114,6 @@ "settings.preferences" = "Preferences"; "settings.security" = "Security"; "settings.community" = "Community"; -"settings.wiki" = "Wiki"; "confirmation.skip.action" = "Skip process"; "account.info.title" = "Account"; "account.info.name.title" = "Name"; @@ -535,6 +534,7 @@ "common.unknown" = "Unknown"; "staking.month.period.title" = "Monthly"; "staking.year.period.title" = "Yearly"; +"common.positive.amount" = "Amount must be positive"; "qr.scan.error.no.info" = "QR can't be decoded"; "qr.scan.upload.gallery" = "Upload from gallery"; "staking.unstake.crossed.min.message" = "When unstaking partially, you should leave at least %@ in stake. Do you want to perform full unstake by unstaking remaining %@ as well?"; @@ -952,7 +952,6 @@ "with.yield.boost" = "with Yield Boost"; "without.yield.boost" = "without Yield Boost"; "common.no.changes" = "No changes"; -"common.not.enough.fee.message_v3.8.0" = "You don’t have enough balance to pay the network fee of %@.\nAvailable balance to pay fee after operation: %@"; "yield.boost.not.enough.execution.fee.message" = "You don’t have enough balance to pay the network fee of %@ and the yield boost execution fee of %@.\nAvailable balance to pay the fee: %@"; "yield.boost.not.enough.execution.fee.title" = "Not enough tokens to pay first execution fee"; "yield.boost.not.enough.threshold.message" = "You don’t have enough balance to pay the network fee of %@ and not drop below the threshold %@.\nAvailable balance to pay the fee: %@"; @@ -1375,57 +1374,58 @@ "wallet.list.empty.action.title" = "Buy tokens"; "asset.operation.send.empty.state.message" = "You don’t have tokens to send.\nBuy or Receive tokens to your\naccount."; "governance.referendums.status.deciding" = "Deciding"; -"common.swap" = "Swap"; -"swaps.setup.asset.select.subtitle" = "Select a token"; -"swaps.setup.asset.pay.title" = "Pay"; -"swaps.setup.asset.receive.title" = "Receive"; -"swaps.setup.asset.action.select.tokens" = "Select tokens to swap"; -"swaps.setup.asset.action.select.receive" = "Select a token to receive"; -"swaps.setup.asset.action.select.pay" = "Select a token to pay"; -"swaps.setup.asset.action.enter.amount" = "Enter amount"; -"swaps.setup.asset.select.pay.title" = "You pay"; -"swaps.setup.asset.select.receive.title" = "You receive"; -"swaps.setup.asset.max" = "Max:"; -"swaps.setup.details.rate" = "Rate"; -"swaps.setup.details.title" = "Swap details"; -"swaps.pay.token.selection.title" = "Token to pay"; -"swaps.receive.token.selection.title" = "Token to receive"; -"swaps.setup.settings.title" = "Swap settings"; -"swaps.setup.slippage" = "Slippage"; -"swaps.setup.price.difference" = "Price difference"; -"swaps.setup.slippage.error.amount.bounds" = "Enter a value between %@ and %@"; -"swaps.setup.slippage.warning.low.amount" = "Transaction might be reverted because of low slippage tolerance."; -"swaps.setup.slippage.warning.high.amount" = "Transaction might be frontrun because of high slippage."; -"swaps.setup.slippage.description" = "Swap slippage is a common occurrence in decentralized trading where the final price of a swap transaction might slightly differ from the expected price, due to changing market conditions."; -"swaps.rate.description" = "Exchange rate between two different cryptocurrencies. It represents how much of one cryptocurrency you can get in exchange for a certain amount of another cryptocurrency."; -"swaps.network.fee.description" = "A network fees charged by the blockchain to process and validate any transactions. May vary depending on network conditions or transaction speed."; -"swaps.setup.error.not.enough.liquidity.title" = "Pool doesn’t have enough liquidity to swap"; -"swaps.setup.error.insufficient.balance.fee.swap.message" = "You can swap up to %@ since you need to pay %@ for network fee and also convert %@ to %@ to meet %@ minimum balance."; -"swaps.setup.error.insufficient.balance.fee.native.message" = "You can swap up to %@ since you need to pay %@ for network fee."; -"common.swap.max" = "Swap max"; "common.alert.external.link.disclaimer.title" = "Continue in browser?"; "common.alert.external.link.disclaimer.message" = "To continue the purchase you will be redirected from Nova Wallet app to %@"; "polkadot.staking.promotion.title" = "Boost your DOT 🚀"; "polkadot.staking.promotion.message" = "Received your DOT back from crowdloans? Start staking your DOT today to get the maximum possible rewards!"; -"swaps.setup.network.fee.token.title" = "Token for paying network fee"; -"swaps.setup.network.fee.token.hint" = "Network fee is added on top of entered amount"; +"swaps.violating.consumers.message" = "You should keep at least %@ after paying %@ network fee as you are holding non sufficient tokens"; +"common.receive.not.sufficient.native.asset.error" = "You must keep at least %@ to receive %@ token"; +"swaps.rate.description" = "Exchange rate between two different cryptocurrencies. It represents how much of one cryptocurrency you can get in exchange for a certain amount of another cryptocurrency."; "swaps.setup.price.difference.description" = "Price difference refers to the difference in price between two different assets. When making a swap in crypto, the price difference is usually the difference between the price of the asset you are swapping for and the price of the asset you are swapping with."; +"swaps.setup.slippage.description" = "Swap slippage is a common occurrence in decentralized trading where the final price of a swap transaction might slightly differ from the expected price, due to changing market conditions."; +"swaps.network.fee.description" = "A network fees charged by the blockchain to process and validate any transactions. May vary depending on network conditions or transaction speed."; +"swaps.setup.asset.action.select.pay" = "Select a token to pay"; +"swaps.not.enough.liquidity" = "Not enough liquidity"; +"swaps.not.enough.tokens" = "Not enough tokens to swap"; +"common.receive.at.least.ed.error" = "You can’t receive less than %@"; "swaps.error.rate.was.updated.title" = "Swap rate was updated"; -"swaps.error.rate.was.updated.message" = "Old rate: %@.\nNew rate: %@"; -"common.action.repeat.operation" = "Repeat the operation"; +"swaps.setup.error.not.enough.liquidity.title" = "Pool doesn’t have enough liquidity to swap"; +"common.dust.remains.title" = "Too small amount remains on your balance"; +"swaps.dust.remains.fee.native.asset.message" = "You should leave at least %1$@ on your balance. Do you want to perform full swap by adding remaining %2$@ as well?"; +"swaps.dust.remains.fee.pay.asset.message" = "You should keep at least %1$@ after paying %2$@ network fee and converting %3$@ to %4$@ to meet %5$@ minimum balance.\n\nDo you want to fully swap by adding remaining %6$@ as well?"; +"swaps.setup.error.insufficient.balance.fee.native.message" = "You can swap up to %1$@ since you need to pay %2$@ for network fee."; +"swaps.setup.error.insufficient.balance.fee.swap.message" = "You can swap up to %1$@ since you need to pay %2$@ for network fee and also convert %3$@ to %4$@ to meet %5$@ minimum balance."; +"common.swap.max" = "Swap max"; "swaps.setup.deposit.by.cross.chain.transfer.title" = "Cross-chain transfer"; +"swaps.setup.deposit.title" = "Get %@ using"; "swaps.setup.deposit.by.cross.chain.transfer.subtitle" = "Transfer %@ from another network"; "swaps.setup.deposit.by.receive.subtitle" = "Receive %@ with QR or your address"; "swaps.setup.deposit.by.buy.subtitle" = "Instantly buy %@ with a credit card"; -"swaps.setup.deposit.title" = "Get %@ using"; -"common.dust.remains.title" = "Too small amount remains on your balance"; -"swaps.dust.remains.fee.native.asset.message" = "You should leave at least %@ on your balance. Do you want to perform full swap by adding remaining %@ as well?"; -"swaps.dust.remains.fee.pay.asset.message" = "You should keep at least %@ after paying %@ network fee and converting %@ to %@ to meet %@ minimum balance.\n\nDo you want to fully swap by adding remaining %@ as well?"; -"common.receive.at.least.ed.error" = "You can’t receive less than %@"; -"common.receive.not.sufficient.native.asset.error" = "You must keep at least %@ to receive %@ token"; -"swaps.violating.consumers.message" = "You should keep at least %@ after paying %@ network fee as you are holding non sufficient tokens."; -"swaps.not.enough.tokens" = "Not enough tokens to swap"; -"swaps.not.enough.liquidity" = "Not enough liquidity"; -"swaps.pay.asset.fee.ed.message" = "To pay network fee with %@, Nova will automatically swap %@ for %@ to maintain your account's minimum %@ balance."; "swaps.setup.deposit.button.title" = "Get %@"; -"common.positive.amount" = "Amount must be positive"; +"swaps.setup.network.fee.token.title" = "Token for paying network fee"; +"swaps.setup.network.fee.token.hint" = "Network fee is added on top of entered amount"; +"swaps.pay.asset.fee.ed.message" = "To pay network fee with %@, Nova will automatically swap %@ for %@ to maintain your account\'s minimum %@ balance."; +"swaps.setup.slippage.error.amount.bounds" = "Enter a value between %@ and %@"; +"swaps.setup.slippage.warning.low.amount" = "Transaction might be reverted because of low slippage tolerance."; +"swaps.setup.slippage.warning.high.amount" = "Transaction might be frontrun because of high slippage."; +"swaps.setup.slippage" = "Slippage"; +"swaps.setup.settings.title" = "Swap settings"; +"swaps.pay.token.selection.title" = "Token to pay"; +"swaps.receive.token.selection.title" = "Token to receive"; +"swaps.setup.asset.select.subtitle" = "Select a token"; +"swaps.setup.asset.pay.title" = "Pay"; +"swaps.setup.asset.receive.title" = "Receive"; +"swaps.setup.details.rate" = "Rate"; +"swaps.setup.price.difference" = "Price difference"; +"swaps.setup.asset.max" = "Max:"; +"swaps.setup.asset.select.pay.title" = "You pay"; +"swaps.setup.asset.select.receive.title" = "You receive"; +"swaps.setup.details.title" = "Swap details"; +"swaps.setup.asset.action.select.receive" = "Select a token to receive"; +"common.swap.action" = "Swap"; +"swaps.setup.asset.action.enter.amount" = "Enter amount"; +"common.swap.title" = "Swap"; +"common.action.repeat.operation" = "Repeat the operation"; +"swaps.error.rate.was.updated.message" = "Old rate: %@.\nNew rate: %@"; +"settings.wiki" = "Wiki"; +"common.not.enough.fee.message_v3.8.0" = "You don’t have enough balance to pay the network fee of %@.\nAvailable balance to pay fee after operation: %@"; \ No newline at end of file diff --git a/novawallet/ru.lproj/InfoPlist.strings b/novawallet/ru.lproj/InfoPlist.strings index 3a4b45f510..56ce3b8975 100644 --- a/novawallet/ru.lproj/InfoPlist.strings +++ b/novawallet/ru.lproj/InfoPlist.strings @@ -2,4 +2,4 @@ "NSFaceIDUsageDescription" = "Face ID используется для авторизации в Nova Wallet"; "NSPhotoLibraryUsageDescription" = "Доступ к фотогалерее используется для выбора QR-кода с адресами, транзакциями Polkadot Vault или подключения через WalletConnect"; "NSPhotoLibraryAddUsageDescription" = "Вы можете сохранить запрос на перевод в виде QR кода"; -"NSBluetoothAlwaysUsageDescription" = "Bluetooth используется для взаимодействия с устройствами Ledger Nano X"; +"NSBluetoothAlwaysUsageDescription" = "Bluetooth используется для взаимодействия с устройствами Ledger Nano X"; \ No newline at end of file diff --git a/novawallet/ru.lproj/Localizable.strings b/novawallet/ru.lproj/Localizable.strings index d185e8a65c..71e0a226f9 100644 --- a/novawallet/ru.lproj/Localizable.strings +++ b/novawallet/ru.lproj/Localizable.strings @@ -114,7 +114,6 @@ "settings.preferences" = "Предпочтения"; "settings.security" = "Безопасность"; "settings.community" = "Сообщество"; -"settings.wiki" = "Руководство пользователя"; "confirmation.skip.action" = "Пропустить"; "account.info.title" = "Аккаунт"; "account.info.name.title" = "Имя"; @@ -535,6 +534,7 @@ "common.unknown" = "Неизвестно"; "staking.month.period.title" = "Eжемесячно"; "staking.year.period.title" = "Eжегодно"; +"common.positive.amount" = "Сумма должна быть больше нуля"; "qr.scan.error.no.info" = "Не удается декодировать QR"; "qr.scan.upload.gallery" = "Из галереи"; "staking.unstake.crossed.min.message" = "При частичном выводе средств вы должны оставить в стейке не менее %@. Хотите ли вы полностью вывести средства, также разблокировав оставшиеся %@?"; @@ -952,7 +952,6 @@ "with.yield.boost" = "с Yield Boost"; "without.yield.boost" = "без Yield Boost"; "common.no.changes" = "Нет изменений"; -"common.not.enough.fee.message_v3.8.0" = "У вас недостаточно средств для оплаты комиссии сети в размере %@.\nДоступный баланс для оплаты комиссии после операции: %@"; "yield.boost.not.enough.execution.fee.message" = "У вас недостаточно средств для оплаты сетевой комиссии в размере %@ и комиссии за выполнение первой Yield Boost операции в размере %@. \nДоступный баланс для оплаты комиссии: %@"; "yield.boost.not.enough.execution.fee.title" = "Недостаточно токенов для оплаты комиссии за первое исполнение"; "yield.boost.not.enough.threshold.message" = "У вас недостаточно средств, чтобы оплатить комиссию сети в размере %@ и не опуститься ниже порога %@.\nДоступный баланс для оплаты комиссии: %@"; @@ -1375,57 +1374,58 @@ "wallet.list.empty.action.title" = "Купить токены"; "asset.operation.send.empty.state.message" = "У вас нет токенов для отправки.\nКупите или получите токены\nна свой аккаунт."; "governance.referendums.status.deciding" = "Решение"; -"common.swap" = "Обмен"; -"swaps.setup.asset.select.subtitle" = "Выберите токeн"; -"swaps.setup.asset.pay.title" = "Оплата в"; -"swaps.setup.asset.receive.title" = "Получение"; -"swaps.setup.asset.action.select.tokens" = "Выберите токены для обмена"; -"swaps.setup.asset.action.select.receive" = "Выберите получаемый токен"; -"swaps.setup.asset.action.select.pay" = "Выберите отдаваемый токен"; -"swaps.setup.asset.action.enter.amount" = "Введите сумму"; -"swaps.setup.asset.select.pay.title" = "Вы платите"; -"swaps.setup.asset.select.receive.title" = "Вы получаете"; -"swaps.setup.asset.max" = "Максимум:"; -"swaps.setup.details.rate" = "Курс"; -"swaps.setup.details.title" = "Детали обмена"; -"swaps.pay.token.selection.title" = "Токен для оплаты"; -"swaps.receive.token.selection.title" = "Токен для получения"; -"swaps.setup.settings.title" = "Настройки обмена"; -"swaps.setup.slippage" = "Slippage"; -"swaps.setup.price.difference" = "Ценовая разница"; -"swaps.setup.slippage.error.amount.bounds" = "Введите значение между %@ и %@"; -"swaps.setup.slippage.warning.low.amount" = "Транзакция может быть отменена из-за низкого значения проскальзывания."; -"swaps.setup.slippage.warning.high.amount" = "Транзакция может быть приостановлена из-за высокого значения проскальзывания."; -"swaps.setup.slippage.description" = "Обменное проскальзывание - обычное явление в децентрализованной торговле, где окончательная цена транзакции обмена может незначительно отличаться от ожидаемой цены из-за изменения рыночных условий."; -"swaps.rate.description" = "Обменный курс между двумя различными криптовалютами. Он представляет, сколько одной криптовалюты вы можете получить в обмен на определенное количество другой криптовалюты."; -"swaps.network.fee.description" = "Это комиссия сети, взимаемая блокчейном за обработку и подтверждение любых транзакций. Она может изменяться в зависимости от условий в сети или скорости выполнения транзакции."; -"swaps.setup.error.not.enough.liquidity.title" = "В пуле недостаточно ликвидности для обмена"; -"swaps.setup.error.insufficient.balance.fee.swap.message" = "You can swap up to %@ since you need to pay %@ for network fee and also convert %@ to %@ to meet %@ minimum balance."; -"swaps.setup.error.insufficient.balance.fee.native.message" = "You can swap up to %@ since you need to pay %@ for network fee."; -"common.swap.max" = "Swap max"; "common.alert.external.link.disclaimer.title" = "Продолжить в браузере?"; "common.alert.external.link.disclaimer.message" = "Для продолжения покупки вы будете перенаправлены из приложения Nova Wallet на сайт %@"; -"polkadot.staking.promotion.title" = "Максимизируйте\nнаграды от DOT 🚀"; +"polkadot.staking.promotion.title" = "Максимизируйте награды от DOT 🚀"; "polkadot.staking.promotion.message" = "Получили свои DOT из краудлоунов? Начните стейкать DOT уже сегодня, чтобы получить максимальные вознаграждения!"; +"swaps.violating.consumers.message" = "Вы должны сохранить как минимум %@ после оплаты сетевой комиссии %@, поскольку вы храните не самодостаточные токены"; +"common.receive.not.sufficient.native.asset.error" = "Вы должны сохранить как минимум %@, чтобы получить %@ токены"; +"swaps.rate.description" = "Курс обмена двух разных криптовалют. Он показывает, сколько криптовалюты вы можете получить в обмен на определенное количество другой криптовалюты."; +"swaps.setup.price.difference.description" = "Разница в цене представляет собой разницу между двумя различными активами. При обмене криптовалюты под разницей в цене обычно имеется ввиду разница между ценой актива, которую вы получаете и ценой актива, которую вы платите."; +"swaps.setup.slippage.description" = "Проскальзывание - распространенное явление в децентрализованной торговле, когда конечная цена сделки по обмену может незначительно отличаться от ожидаемой в связи с изменением рыночных условий."; +"swaps.network.fee.description" = "Комиссия сети, взимается блокчейном за обработку и проверку транзакций. Может варьироваться в зависимости от условий сети или скорости транзакции."; +"swaps.setup.asset.action.select.pay" = "Выберите токен для оплаты"; +"swaps.not.enough.liquidity" = "Недостаточно ликвидности"; +"swaps.not.enough.tokens" = "Недостаточно токенов для обмена"; +"common.receive.at.least.ed.error" = "Вы не можете получить меньше %@"; +"swaps.error.rate.was.updated.title" = "Обменный курс изменился"; +"swaps.setup.error.not.enough.liquidity.title" = "В пуле недостаточно ликвидности для обмена"; +"common.dust.remains.title" = "На вашем балансе остается слишком маленькая сумма"; +"swaps.dust.remains.fee.native.asset.message" = "На вашем балансе должно оставаться не менее %1$@. Хотите обменять максимум, добавив также оставшиеся %2$@?"; +"swaps.dust.remains.fee.pay.asset.message" = "На вашем балансе должно оставаться как минимум %1$@ после оплаты сетевой комиссии %2$@ и конвертации %3$@ в %4$@, для достижения минимального баланса %5$@.\n\nХотите обменять максимум, добавив еще %6$@?"; +"swaps.setup.error.insufficient.balance.fee.native.message" = "Вы можете обменять до %1$@ так как вам нужно заплатить комиссию сети в размере %2$@."; +"swaps.setup.error.insufficient.balance.fee.swap.message" = "Вы можете обменять до %1$@ так как вам нужно заплатить комиссию сети в размере %2$@, а также конвертировать %3$@ в %4$@, чтобы сохранить минимальный баланс %5$@."; +"common.swap.max" = "Использовать максимум"; +"swaps.setup.deposit.by.cross.chain.transfer.title" = "Межсетевой перевод"; +"swaps.setup.deposit.title" = "Получить %@ с помощью"; +"swaps.setup.deposit.by.cross.chain.transfer.subtitle" = "Перевести %@ из другой сети"; +"swaps.setup.deposit.by.receive.subtitle" = "Получить %@ по QR или вашему адресу"; +"swaps.setup.deposit.by.buy.subtitle" = "Мгновенная покупка %@ с помощью кредитной карты"; +"swaps.setup.deposit.button.title" = "Получить %@"; "swaps.setup.network.fee.token.title" = "Токен для оплаты комиссии сети"; -"swaps.setup.network.fee.token.hint" = "Комиссия сети добавляется к введенной сумме."; -"swaps.setup.price.difference.description" = "Разница в цене относится к разнице в цене между двумя различными активами. При совершении обмена в криптовалюте разница в цене обычно представляет собой разницу между ценой актива, на который вы меняете, и ценой актива, на который вы меняетесь."; -"swaps.error.rate.was.updated.title" = "Обменный курс был обновлен"; -"swaps.error.rate.was.updated.message" = "Было: %@.\nСтало: %@"; +"swaps.setup.network.fee.token.hint" = "Комиссия сети добавится к введенной сумме"; +"swaps.pay.asset.fee.ed.message" = "Чтобы оплатить комиссию сети с помощью %@, Nova автоматически обменяет %@ на %@, чтобы поддерживать минимальный %@ баланс вашей учетной записи."; +"swaps.setup.slippage.error.amount.bounds" = "Введите значение между %@ и %@"; +"swaps.setup.slippage.warning.low.amount" = "Транзакция может быть отменена из-за низкой устойчивости к проскальзыванию."; +"swaps.setup.slippage.warning.high.amount" = "Транзакция может подвергнуться фронтрану из-за высокого проскальзывания"; +"swaps.setup.slippage" = "Проскальзывание"; +"swaps.setup.settings.title" = "Настройки обмена"; +"swaps.pay.token.selection.title" = "Токен для оплаты"; +"swaps.receive.token.selection.title" = "Токен для получения"; +"swaps.setup.asset.select.subtitle" = "Выберите токен"; +"swaps.setup.asset.pay.title" = "Заплатить"; +"swaps.setup.asset.receive.title" = "Получить"; +"swaps.setup.details.rate" = "Курс"; +"swaps.setup.price.difference" = "Разница в цене"; +"swaps.setup.asset.max" = "Макс:"; +"swaps.setup.asset.select.pay.title" = "Вы платите"; +"swaps.setup.asset.select.receive.title" = "Вы получаете"; +"swaps.setup.details.title" = "Детали обмена"; +"swaps.setup.asset.action.select.receive" = "Выберите токен для получения"; +"common.swap.action" = "Обменять"; +"swaps.setup.asset.action.enter.amount" = "Введите сумму"; +"common.swap.title" = "Обмен"; "common.action.repeat.operation" = "Повторить операцию"; -"swaps.setup.deposit.by.cross.chain.transfer.title" = "Перевод между сетями"; -"swaps.setup.deposit.by.cross.chain.transfer.subtitle" = "Перевести %@ из другой сети"; -"swaps.setup.deposit.by.receive.subtitle" = "Получить %@ используя QR-код или адрес"; -"swaps.setup.deposit.by.buy.subtitle" = "Купить %@ используя банковскую карту"; -"swaps.setup.deposit.title" = "Пополнить %@"; -"common.dust.remains.title" = "Баланс ниже минимального"; -"swaps.dust.remains.fee.native.asset.message" = "Вам необходимо оставить минимум %@ на вашем балансе. Вы хотите добавить к обмену оставшиеся %@ тоже?"; -"swaps.dust.remains.fee.pay.asset.message" = "Вам необходимо оставить минимум %@ после оплаты %@ комиссии сети и обмена %@ на %@ для поддержания минимального баланса %@.\n\nВы хотите добавить к обмену оставшиеся %@ тоже?"; -"common.receive.at.least.ed.error" = "Вы не можете получить меньше чем %@"; -"common.receive.not.sufficient.native.asset.error" = "У вас должно быть минимум %@ для получения %@ токена"; -"swaps.violating.consumers.message" = "Вам необходимо оставить минимум %@ после уплаты %@ комиссии сети так как вы владеете несамодостаточными токенами."; -"swaps.not.enough.tokens" = "Недостаточно токенов для обмена"; -"swaps.not.enough.liquidity" = "Недостаточно ликвидности"; -"swaps.pay.asset.fee.ed.message" = "Для оплаты комиссии сети %@ токеном, Nova автоматически поменяет %@ в %@ для сохранения минимального %@ баланса аккаунта."; -"swaps.setup.deposit.button.title" = "Пополнить %@"; -"common.positive.amount" = "Значение должно быть положительным"; +"swaps.error.rate.was.updated.message" = "Было: %@.\nСтало: %@"; +"settings.wiki" = "Руководство пользователя"; +"common.not.enough.fee.message_v3.8.0" = "У вас недостаточно средств для оплаты комиссии сети в размере %@.\nДоступный баланс для оплаты комиссии после операции: %@";