feat: Add memo support for swap (#3229)
What changed, and why it matters
This commit adds support for memos and destination tags when swapping to currencies that require them (like XRP, XLM, TON, EOS, HBAR). Previously, these currencies were excluded from swap receiving options. The change lets users enter a memo/destination tag, passes it to exchange providers that support it, filters out providers that don't support it, and stores it with the trade record. It also fixes a UI crash when selecting a receive currency that isn't a wallet type.
No immediate security action required; this is a feature addition. Reviewers should verify that memo/destination tag values are properly sanitized/escaped by each exchange provider's API client, confirm the SQLite migration handles existing Trade rows correctly, and ensure the provider capability flags accurately reflect each exchange's support to prevent failed or misdirected swaps.
Security signals we found
New user-supplied input field (memo/destination tag) flows to multiple third-party exchange APIs
Provider capability flag used to filter providers when memo-required currency selected
SQLite schema migration adds `toAddressExtraId` column to Trade table
Previously excluded receive currencies (XLM, XRP, BNB) re-enabled for swaps
UI crash fix in receive wallet selection wrapped in try/catch
Input length limits applied: 20 for destination tag, 256 for memo
Evidence from the diff
The patch introduces a toAddressExtraId field across the swap flow: UI input (SwapAmountBox), request model (TradeRequest), trade model (Trade), local SQLite storage (schema v7), and provider-specific API payloads. It adds supportsMemoOrDestinationTag flags to exchange providers, defaulting to true, with false overrides for Chainflip, Jupiter, NearIntents, SwapsXyz, SwapTrade, and ThorChain. Provider-specific parameter names include extraId (ChangeNow), withdrawalExtraId (Exolix), withdrawal_extra_id (LetsExchange), settleMemo (SideShift), extra_id_to (SimpleSwap), extra_id (StealthEx), address_memo (Trocador), and toAddressTag (XOSwap). The UI now shows memo/destination tag input only for currencies requiring it, excludes incompatible providers from rate calculations, and displays the value in confirmation and trade history sheets.
Changed components
cw_core/lib/currencies_with_memo.dartcw_core/lib/db/sqlite.dartlib/exchange/provider/*_exchange_provider.dartlib/exchange/trade.dartlib/exchange/trade_request.dartlib/new-ui/pages/swap_page.dartlib/new-ui/widgets/send_page/send_memo_input.dartlib/new-ui/widgets/swap_page/swap_confirm_sheet.dartlib/view_model/exchange/exchange_view_model.dartlib/view_model/trade_details_view_model.dartInspect captured patch +330 / −55
diff --git a/cw_core/lib/currencies_with_memo.dart b/cw_core/lib/currencies_with_memo.dart
new file mode 100644
index 00000000..e12a14b3
--- /dev/null
+++ b/cw_core/lib/currencies_with_memo.dart
@@ -0,0 +1,13 @@
+import 'package:cw_core/crypto_currency.dart';
+
+enum MemoLabelType { destinationTag, memo }
+
+const Map<CryptoCurrency, MemoLabelType> _currenciesRequiringMemo = {
+ CryptoCurrency.xrp: MemoLabelType.destinationTag,
+ CryptoCurrency.xlm: MemoLabelType.memo,
+ CryptoCurrency.ton: MemoLabelType.memo,
+ CryptoCurrency.eos: MemoLabelType.memo,
+ CryptoCurrency.hbar: MemoLabelType.memo,
+};
+
+MemoLabelType? memoLabelTypeFor(CryptoCurrency currency) => _currenciesRequiringMemo[currency];
diff --git a/cw_core/lib/db/sqlite.dart b/cw_core/lib/db/sqlite.dart
index 311344a9..593b1b14 100644
--- a/cw_core/lib/db/sqlite.dart
+++ b/cw_core/lib/db/sqlite.dart
@@ -41,7 +41,7 @@ Future<void> initDb({String? pathOverride}) async {
}
}
await db?.close();
- db = await openDatabase(dbFile.path, version: 6,
+ db = await openDatabase(dbFile.path, version: 7,
onUpgrade: (Database db, int oldVersion, int newVersion) async {
printV("migrating: $oldVersion, $newVersion");
if (oldVersion <= 1) {
@@ -96,6 +96,14 @@ CREATE TABLE IF NOT EXISTS BalanceCardStyleSettings (
if (oldVersion <= 5) {
await _createTradeTable(db);
}
+ if (oldVersion <= 6) {
+ await _addColumnIfNotExists(
+ db,
+ table: 'Trade',
+ column: 'toAddressExtraId',
+ definition: 'TEXT',
+ );
+ }
},
onCreate: (Database db, int version) async {
await db.execute(
@@ -234,6 +242,7 @@ CREATE TABLE IF NOT EXISTS Trade (
refundAddress TEXT,
walletId TEXT,
payoutAddress TEXT,
+ toAddressExtraId TEXT,
password TEXT,
providerId TEXT,
providerName TEXT,
diff --git a/lib/exchange/provider/chainflip_exchange_provider.dart b/lib/exchange/provider/chainflip_exchange_provider.dart
index 2d8acf8a..e82fa6d4 100644
--- a/lib/exchange/provider/chainflip_exchange_provider.dart
+++ b/lib/exchange/provider/chainflip_exchange_provider.dart
@@ -51,6 +51,9 @@ class ChainflipExchangeProvider extends ExchangeProvider {
@override
bool get supportsFixedRate => false;
+ @override
+ bool get supportsMemoOrDestinationTag => false;
+
@override
ExchangeProviderDescription get description =>
ExchangeProviderDescription.chainflip;
diff --git a/lib/exchange/provider/changenow_exchange_provider.dart b/lib/exchange/provider/changenow_exchange_provider.dart
index d32a7d27..15913b29 100644
--- a/lib/exchange/provider/changenow_exchange_provider.dart
+++ b/lib/exchange/provider/changenow_exchange_provider.dart
@@ -189,6 +189,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
if (!isFixedRateMode) 'fromAmount': request.fromAmount,
if (isFixedRateMode) 'toAmount': request.toAmount,
'address': request.toAddress,
+ if (request.toAddressExtraId.isNotEmpty) 'extraId': request.toAddressExtraId,
'flow': _getFlow(isFixedRateMode),
'type': type,
'refundAddress': request.refundAddress,
@@ -248,6 +249,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
state: TradeState.created,
payoutAddress: payoutAddress,
isSendAll: isSendAll,
+ toAddressExtraId: request.toAddressExtraId,
);
}
diff --git a/lib/exchange/provider/exchange_provider.dart b/lib/exchange/provider/exchange_provider.dart
index 55f422a9..cdcfe3a5 100644
--- a/lib/exchange/provider/exchange_provider.dart
+++ b/lib/exchange/provider/exchange_provider.dart
@@ -19,6 +19,8 @@ abstract class ExchangeProvider {
bool get supportsOnionAddress => false;
+ bool get supportsMemoOrDestinationTag => true;
+
@override
String toString() => title;
diff --git a/lib/exchange/provider/exolix_exchange_provider.dart b/lib/exchange/provider/exolix_exchange_provider.dart
index fe019159..6cd5fea7 100644
--- a/lib/exchange/provider/exolix_exchange_provider.dart
+++ b/lib/exchange/provider/exolix_exchange_provider.dart
@@ -198,6 +198,8 @@ class ExolixExchangeProvider extends ExchangeProvider {
'networkFrom': _networkFor(request.fromCurrency),
'networkTo': _networkFor(request.toCurrency),
'withdrawalAddress': await _normalizeAddress(request.toAddress),
+ if (request.toAddressExtraId.isNotEmpty)
+ 'withdrawalExtraId': request.toAddressExtraId,
'refundAddress': await _normalizeAddress(request.refundAddress),
'rateType': _getRateType(isFixedRateMode),
'apiToken': apiKey,
@@ -315,6 +317,7 @@ class ExolixExchangeProvider extends ExchangeProvider {
state: TradeState.created,
payoutAddress: payoutAddress,
isSendAll: isSendAll,
+ toAddressExtraId: request.toAddressExtraId,
);
}
diff --git a/lib/exchange/provider/jupiter_exchange_provider.dart b/lib/exchange/provider/jupiter_exchange_provider.dart
index 6fc47e97..9fa954ed 100644
--- a/lib/exchange/provider/jupiter_exchange_provider.dart
+++ b/lib/exchange/provider/jupiter_exchange_provider.dart
@@ -41,6 +41,9 @@ class JupiterExchangeProvider extends ExchangeProvider {
@override
bool get supportsFixedRate => false; // Jupiter doesn't support fixed rate
+ @override
+ bool get supportsMemoOrDestinationTag => false;
+
@override
ExchangeProviderDescription get description => ExchangeProviderDescription.jupiter;
diff --git a/lib/exchange/provider/letsexchange_exchange_provider.dart b/lib/exchange/provider/letsexchange_exchange_provider.dart
index 8e5f4970..14012f1e 100644
--- a/lib/exchange/provider/letsexchange_exchange_provider.dart
+++ b/lib/exchange/provider/letsexchange_exchange_provider.dart
@@ -174,7 +174,7 @@ class LetsExchangeExchangeProvider extends ExchangeProvider {
if (!isFixedRateMode) 'deposit_amount': request.fromAmount.toString(),
'withdrawal': withdrawalAddress,
if (isFixedRateMode) 'withdrawal_amount': request.toAmount.toString(),
- 'withdrawal_extra_id': '',
+ 'withdrawal_extra_id': request.toAddressExtraId,
'return': returnAddress,
'rate_id': rateId,
if (networkFrom != null) 'network_from': networkFrom,
@@ -302,6 +302,7 @@ class LetsExchangeExchangeProvider extends ExchangeProvider {
expiredAt: expiredAt,
extraId: extraId,
isSendAll: isSendAll,
+ toAddressExtraId: request.toAddressExtraId,
);
} catch (e, s) {
ExchangeProviderLogger.logError(
diff --git a/lib/exchange/provider/near_Intents_exchange_provider.dart b/lib/exchange/provider/near_Intents_exchange_provider.dart
index 544bd3f3..dbe6ebdc 100644
--- a/lib/exchange/provider/near_Intents_exchange_provider.dart
+++ b/lib/exchange/provider/near_Intents_exchange_provider.dart
@@ -88,6 +88,9 @@ class NearIntentsExchangeProvider extends ExchangeProvider {
@override
bool get supportsFixedRate => true;
+ @override
+ bool get supportsMemoOrDestinationTag => false;
+
@override
ExchangeProviderDescription get description =>
ExchangeProviderDescription.nearIntents;
diff --git a/lib/exchange/provider/sideshift_exchange_provider.dart b/lib/exchange/provider/sideshift_exchange_provider.dart
index 2a49c0bc..e1c18ccb 100644
--- a/lib/exchange/provider/sideshift_exchange_provider.dart
+++ b/lib/exchange/provider/sideshift_exchange_provider.dart
@@ -216,6 +216,7 @@ class SideShiftExchangeProvider extends ExchangeProvider {
final body = {
'affiliateId': affiliateId,
'settleAddress': request.toAddress,
+ if (request.toAddressExtraId.isNotEmpty) 'settleMemo': request.toAddressExtraId,
'refundAddress': request.refundAddress,
};
@@ -336,6 +337,7 @@ class SideShiftExchangeProvider extends ExchangeProvider {
createdAt: DateTime.now(),
isSendAll: isSendAll,
extraId: depositMemo,
+ toAddressExtraId: request.toAddressExtraId,
);
}
diff --git a/lib/exchange/provider/simpleswap_exchange_provider.dart b/lib/exchange/provider/simpleswap_exchange_provider.dart
index 85ee57ca..de59f3e8 100644
--- a/lib/exchange/provider/simpleswap_exchange_provider.dart
+++ b/lib/exchange/provider/simpleswap_exchange_provider.dart
@@ -180,7 +180,8 @@ class SimpleSwapExchangeProvider extends ExchangeProvider {
"amount": request.fromAmount,
"fixed": isFixedRateMode,
"user_refund_address": _normalizeAddress(request.refundAddress),
- "address_to": _normalizeAddress(request.toAddress)
+ "address_to": _normalizeAddress(request.toAddress),
+ if (request.toAddressExtraId.isNotEmpty) "extra_id_to": request.toAddressExtraId,
};
final uri = Uri.https(apiAuthority, createExchangePath, params);
@@ -289,6 +290,7 @@ class SimpleSwapExchangeProvider extends ExchangeProvider {
payoutAddress: payoutAddress,
createdAt: DateTime.now(),
isSendAll: isSendAll,
+ toAddressExtraId: request.toAddressExtraId,
);
}
diff --git a/lib/exchange/provider/stealth_ex_exchange_provider.dart b/lib/exchange/provider/stealth_ex_exchange_provider.dart
index 22c4be96..a6064715 100644
--- a/lib/exchange/provider/stealth_ex_exchange_provider.dart
+++ b/lib/exchange/provider/stealth_ex_exchange_provider.dart
@@ -186,6 +186,7 @@ class StealthExExchangeProvider extends ExchangeProvider {
'amount':
isFixedRateMode ? double.parse(request.toAmount) : double.parse(request.fromAmount),
'address': _normalizeAddress(request.toAddress),
+ if (request.toAddressExtraId.isNotEmpty) 'extra_id': request.toAddressExtraId,
'refund_address': _normalizeAddress(request.refundAddress),
'additional_fee_percent': _additionalFeePercent,
};
@@ -299,6 +300,7 @@ class StealthExExchangeProvider extends ExchangeProvider {
expiredAt: expiredAt,
extraId: extraId,
isSendAll: isSendAll,
+ toAddressExtraId: request.toAddressExtraId,
);
} catch (e, s) {
ExchangeProviderLogger.logError(
diff --git a/lib/exchange/provider/swapsxyz_exchange_provider.dart b/lib/exchange/provider/swapsxyz_exchange_provider.dart
index 0d9d8728..6eb1b161 100644
--- a/lib/exchange/provider/swapsxyz_exchange_provider.dart
+++ b/lib/exchange/provider/swapsxyz_exchange_provider.dart
@@ -54,6 +54,9 @@ class SwapsXyzExchangeProvider extends ExchangeProvider {
@override
bool get supportsFixedRate => false;
+ @override
+ bool get supportsMemoOrDestinationTag => false;
+
@override
ExchangeProviderDescription get description =>
ExchangeProviderDescription.swapsXyz;
diff --git a/lib/exchange/provider/swaptrade_exchange_provider.dart b/lib/exchange/provider/swaptrade_exchange_provider.dart
index 91233446..847f6a42 100644
--- a/lib/exchange/provider/swaptrade_exchange_provider.dart
+++ b/lib/exchange/provider/swaptrade_exchange_provider.dart
@@ -37,6 +37,9 @@ class SwapTradeExchangeProvider extends ExchangeProvider {
@override
bool get supportsFixedRate => false;
+ @override
+ bool get supportsMemoOrDestinationTag => false;
+
@override
ExchangeProviderDescription get description => ExchangeProviderDescription.swapTrade;
diff --git a/lib/exchange/provider/thorchain_exchange.provider.dart b/lib/exchange/provider/thorchain_exchange.provider.dart
index aacf04b3..1d05a4fa 100644
--- a/lib/exchange/provider/thorchain_exchange.provider.dart
+++ b/lib/exchange/provider/thorchain_exchange.provider.dart
@@ -36,6 +36,9 @@ class ThorChainExchangeProvider extends ExchangeProvider {
@override
bool get supportsFixedRate => false;
+ @override
+ bool get supportsMemoOrDestinationTag => false;
+
@override
ExchangeProviderDescription get description => ExchangeProviderDescription.thorChain;
diff --git a/lib/exchange/provider/trocador_exchange_provider.dart b/lib/exchange/provider/trocador_exchange_provider.dart
index 99e8b05a..a9d977dd 100644
--- a/lib/exchange/provider/trocador_exchange_provider.dart
+++ b/lib/exchange/provider/trocador_exchange_provider.dart
@@ -235,6 +235,7 @@ class TrocadorExchangeProvider extends ExchangeProvider {
if (!isFixedRateMode) 'amount_from': request.fromAmount,
if (isFixedRateMode) 'amount_to': request.toAmount,
'address': request.toAddress,
+ if (request.toAddressExtraId.isNotEmpty) 'address_memo': request.toAddressExtraId,
'refund': request.refundAddress,
'refund_memo': '0',
};
@@ -392,6 +393,7 @@ class TrocadorExchangeProvider extends ExchangeProvider {
payoutAddress: payoutAddress,
isSendAll: isSendAll,
extraId: addressProviderMemo,
+ toAddressExtraId: request.toAddressExtraId,
);
}
diff --git a/lib/exchange/provider/xoswap_exchange_provider.dart b/lib/exchange/provider/xoswap_exchange_provider.dart
index 35ede0bf..0c8dff7c 100644
--- a/lib/exchange/provider/xoswap_exchange_provider.dart
+++ b/lib/exchange/provider/xoswap_exchange_provider.dart
@@ -321,6 +321,7 @@ class XOSwapExchangeProvider extends ExchangeProvider {
'fromAddress': request.refundAddress,
'toAmount': request.toAmount,
'toAddress': request.toAddress,
+ if (request.toAddressExtraId.isNotEmpty) 'toAddressTag': request.toAddressExtraId,
'pairId': pairId,
};
@@ -424,6 +425,7 @@ class XOSwapExchangeProvider extends ExchangeProvider {
payoutAddress: payoutAddress,
extraId: extraId,
isSendAll: isSendAll,
+ toAddressExtraId: request.toAddressExtraId,
);
} catch (e, s) {
ExchangeProviderLogger.logError(
diff --git a/lib/exchange/trade.dart b/lib/exchange/trade.dart
index b6052c2f..42968a4f 100644
--- a/lib/exchange/trade.dart
+++ b/lib/exchange/trade.dart
@@ -27,6 +27,7 @@ class Trade {
this.refundAddress,
this.walletId,
this.payoutAddress,
+ this.toAddressExtraId,
this.password,
this.providerId,
this.providerName,
@@ -86,6 +87,9 @@ class Trade {
String? refundAddress;
String? walletId;
String? payoutAddress;
+
+ // holds the receive address memo or destination tag that was passed for this trade
+ String? toAddressExtraId;
String? password;
String? providerId;
String? providerName;
@@ -221,6 +225,7 @@ class Trade {
'refundAddress': refundAddress,
'walletId': walletId,
'payoutAddress': payoutAddress,
+ 'toAddressExtraId': toAddressExtraId,
'password': password,
'providerId': providerId,
'providerName': providerName,
@@ -264,6 +269,7 @@ class Trade {
refundAddress: row['refundAddress'] as String?,
walletId: row['walletId'] as String?,
payoutAddress: row['payoutAddress'] as String?,
+ toAddressExtraId: row['toAddressExtraId'] as String?,
password: row['password'] as String?,
providerId: row['providerId'] as String?,
providerName: row['providerName'] as String?,
diff --git a/lib/exchange/trade_request.dart b/lib/exchange/trade_request.dart
index 826bd873..833e4b12 100644
--- a/lib/exchange/trade_request.dart
+++ b/lib/exchange/trade_request.dart
@@ -8,6 +8,7 @@ class TradeRequest {
required this.refundAddress,
required this.fromAmount,
this.toAmount = '',
+ this.toAddressExtraId = '',
this.isFixedRate = false});
final CryptoCurrency fromCurrency;
@@ -16,5 +17,6 @@ class TradeRequest {
final String refundAddress;
final String fromAmount;
final String toAmount;
+ final String toAddressExtraId;
final bool isFixedRate;
}
diff --git a/lib/new-ui/pages/swap_page.dart b/lib/new-ui/pages/swap_page.dart
index 64292941..30f0d155 100644
--- a/lib/new-ui/pages/swap_page.dart
+++ b/lib/new-ui/pages/swap_page.dart
@@ -12,6 +12,7 @@ import 'package:cake_wallet/new-ui/widgets/keyboard_hide_overlay.dart';
import 'package:cake_wallet/new-ui/widgets/modern_button.dart';
import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
import 'package:cake_wallet/new-ui/widgets/send_page/fiat_amount_bar.dart';
+import 'package:cake_wallet/new-ui/widgets/send_page/send_memo_input.dart';
import 'package:cake_wallet/new-ui/widgets/send_page/send_syncing_indicator.dart';
import 'package:cake_wallet/new-ui/widgets/swap_page/provider_selector_page.dart';
import 'package:cake_wallet/new-ui/widgets/swap_page/refund_address_modal.dart';
@@ -37,6 +38,7 @@ import 'package:cake_wallet/view_model/exchange/exchange_trade_view_model.dart';
import 'package:cake_wallet/view_model/exchange/exchange_view_model.dart';
import 'package:cake_wallet/view_model/wallet_switcher_view_model.dart';
import 'package:cw_core/crypto_currency.dart';
+import 'package:cw_core/currencies_with_memo.dart';
import 'package:cw_core/currency.dart';
import 'package:cw_core/sync_status.dart';
import 'package:cw_core/utils/print_verbose.dart';
@@ -837,12 +839,43 @@ class SwapAmountBoxState extends State<SwapAmountBox> {
final amountController = TextEditingController();
final fiatAmountController = TextEditingController();
final amountFocusNode = FocusNode();
+ final memoController = TextEditingController();
+ ReactionDisposer? _memoReactionDisposer;
+ VoidCallback? _memoListener;
@override
void initState() {
_selectedCurrency = widget.initialCurrency;
super.initState();
+
+ if (widget.isReceiverCard) {
+ memoController.text = widget.exchangeViewModel.receiveAddressExtraId;
+
+ _memoListener = () {
+ if (widget.exchangeViewModel.receiveAddressExtraId != memoController.text) {
+ widget.exchangeViewModel.receiveAddressExtraId = memoController.text;
+ }
+ };
+ memoController.addListener(_memoListener!);
+
+ _memoReactionDisposer =
+ reaction((_) => widget.exchangeViewModel.receiveAddressExtraId, (String value) {
+ if (memoController.text != value) {
+ memoController.text = value;
+ }
+ });
+ }
+ }
+
+ @override
+ void dispose() {
+ if (_memoListener != null) {
+ memoController.removeListener(_memoListener!);
+ }
+ _memoReactionDisposer?.call();
+ memoController.dispose();
+ super.dispose();
}
late Currency _selectedCurrency;
@@ -1128,7 +1161,29 @@ class SwapAmountBoxState extends State<SwapAmountBox> {
],
);
},
- )
+ ),
+ if (widget.isReceiverCard)
+ Observer(builder: (_) {
+ final selected = widget.exchangeViewModel.receiveCurrency;
+ final labelType = memoLabelTypeFor(selected);
+ if (labelType == null) return const SizedBox.shrink();
+
+ final isDestinationTag = labelType == MemoLabelType.destinationTag;
+ final hint = isDestinationTag
+ ? S.of(context).destination_tag_optional
+ : S.of(context).memo_optional;
+ final disclaimer = isDestinationTag
+ ? S.of(context).destination_tag_swap_disclaimer
+ : S.of(context).memo_swap_disclaimer;
+
+ return NewSendMemoInput(
+ memoController: memoController,
+ maxMemoLength: isDestinationTag ? 20 : 256,
+ memoLength: memoController.text.length,
+ hintText: hint,
+ disclaimerText: disclaimer,
+ );
+ }),
],
),
),
diff --git a/lib/new-ui/widgets/send_page/send_memo_input.dart b/lib/new-ui/widgets/send_page/send_memo_input.dart
index dd5e2168..ccc990d7 100644
--- a/lib/new-ui/widgets/send_page/send_memo_input.dart
+++ b/lib/new-ui/widgets/send_page/send_memo_input.dart
@@ -8,11 +8,15 @@ class NewSendMemoInput extends StatelessWidget {
{super.key,
required this.memoController,
required this.maxMemoLength,
- required this.memoLength});
+ required this.memoLength,
+ this.hintText,
+ this.disclaimerText});
final TextEditingController memoController;
final int maxMemoLength;
final int memoLength;
+ final String? hintText;
+ final String? disclaimerText;
@override
Widget build(BuildContext context) {
@@ -30,8 +34,8 @@ class NewSendMemoInput extends StatelessWidget {
child: TextField(
maxLength: maxMemoLength,
controller: memoController,
- decoration:
- InputDecoration(hintText: S.of(context).memo_optional, counterText: ""),
+ decoration: InputDecoration(
+ hintText: hintText ?? S.of(context).memo_optional, counterText: ""),
),
),
SizedBox(width: 12),
@@ -52,9 +56,12 @@ class NewSendMemoInput extends StatelessWidget {
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Text(S.of(context).memo_disclaimer,
- style: TextStyle(
- fontSize: 12, color: Theme.of(context).colorScheme.onSurfaceVariant)),
+ Expanded(
+ child: Text(disclaimerText ?? S.of(context).memo_disclaimer,
+ style: TextStyle(
+ fontSize: 12,
+ color: Theme.of(context).colorScheme.onSurfaceVariant)),
+ ),
Text("${memoController.text.length} / ${maxMemoLength}",
style: TextStyle(fontSize: 12, color: Theme.of(context).colorScheme.primary))
],
diff --git a/lib/new-ui/widgets/swap_page/swap_confirm_sheet.dart b/lib/new-ui/widgets/swap_page/swap_confirm_sheet.dart
index 43db8c20..9ccfb145 100644
--- a/lib/new-ui/widgets/swap_page/swap_confirm_sheet.dart
+++ b/lib/new-ui/widgets/swap_page/swap_confirm_sheet.dart
@@ -14,6 +14,7 @@ import 'package:cake_wallet/src/widgets/new_list_row/new_list_section.dart';
import 'package:cake_wallet/view_model/exchange/exchange_trade_view_model.dart';
import 'package:cake_wallet/view_model/exchange/exchange_view_model.dart';
import 'package:cake_wallet/view_model/send/send_view_model_state.dart';
+import 'package:cw_core/currencies_with_memo.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
@@ -191,7 +192,19 @@ class SwapTransactionDetails extends StatelessWidget {
showArrow: false,
trailingText: exchangeViewModel.receiveAddressDisplayName ??
middleTruncate(
- exchangeTradeViewModel.trade.payoutAddress ?? "", 8, 8))
+ exchangeTradeViewModel.trade.payoutAddress ?? "", 8, 8)),
+ if ((exchangeTradeViewModel.trade.toAddressExtraId ?? '').isNotEmpty)
+ ListItemRegularRow(
+ keyValue: "receive memo",
+ showArrow: false,
+ label: memoLabelTypeFor(exchangeViewModel.receiveCurrency) ==
+ MemoLabelType.destinationTag
+ ? S.of(context).destination_tag
+ : S.of(context).memo,
+ trailingText: middleTruncate(
+ exchangeTradeViewModel.trade.toAddressExtraId ?? "", 8, 8),
+ copyableText: exchangeTradeViewModel.trade.toAddressExtraId,
+ ),
],
"${S.of(context).swap_id} (${S.of(context).tap_to_copy})": [
ListItemRegularRow(
diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart
index 9811a999..108c78ff 100644
--- a/lib/view_model/exchange/exchange_view_model.dart
+++ b/lib/view_model/exchange/exchange_view_model.dart
@@ -57,6 +57,7 @@ import 'package:cake_wallet/view_model/send/fees_view_model.dart';
import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart';
import 'package:cw_core/crypto_amount_format.dart';
import 'package:cw_core/crypto_currency.dart';
+import 'package:cw_core/currencies_with_memo.dart';
import 'package:cw_core/erc20_token.dart';
import 'package:cw_core/spl_token.dart';
import 'package:cw_core/sync_status.dart';
@@ -124,12 +125,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
_useTorOnly = _settingsStore.exchangeStatus == ExchangeApiMode.torOnly;
_setProviders();
const excludeDepositCurrencies = [CryptoCurrency.btt];
- const excludeReceiveCurrencies = [
- CryptoCurrency.xlm,
- CryptoCurrency.xrp,
- CryptoCurrency.bnb,
- CryptoCurrency.btt
- ];
+ const excludeReceiveCurrencies = [CryptoCurrency.btt];
_initialPairBasedOnWallet();
unspentCoinsListViewModel.initialSetup().then((_) {
@@ -391,6 +387,9 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
@observable
String receiveAddress;
+ @observable
+ String receiveAddressExtraId = '';
+
@observable
String? receiveAddressDisplayName;
@@ -436,13 +435,18 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
@computed
Future<List<WalletInfo>> get receiveWallets async {
- WalletType? type;
- type = cryptoCurrencyOrTokenToWalletType(receiveCurrency);
- if (type == null) {
- type = cryptoCurrencyOrTokenToWalletType(CryptoCurrency.fromString(receiveCurrency.tag ?? ""));
- }
+ try {
+ WalletType? type;
+ type = cryptoCurrencyOrTokenToWalletType(receiveCurrency);
+ if (type == null) {
+ type =
+ cryptoCurrencyOrTokenToWalletType(CryptoCurrency.fromString(receiveCurrency.tag ?? ""));
+ }
- return await WalletInfo.selectList("type = ?", [type!.index]);
+ return await WalletInfo.selectList("type = ?", [type!.index]);
+ } catch (e) {
+ return [];
+ }
}
Future<List<WalletInfoAddressInfo>> addressesForAccountsWallet(WalletInfo wallet) async {
@@ -761,6 +765,9 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
currency == receiveCurrency)) {
receiveAddress = "";
}
+ if (currency != receiveCurrency) {
+ receiveAddressExtraId = "";
+ }
receiveCurrency = currency;
isFixedRateMode = false;
@@ -884,6 +891,9 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
(provider.description == ExchangeProviderDescription.swapsXyz ||
provider.description == ExchangeProviderDescription.nearIntents);
+ bool _excludeProviderForReceiveExtraId(ExchangeProvider provider) =>
+ memoLabelTypeFor(receiveCurrency) != null && !provider.supportsMemoOrDestinationTag;
+
Future<void> calculateBestRate() async {
if (depositCurrency == receiveCurrency) {
bestRate = 0.0;
@@ -895,6 +905,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
final validProvidersForAmount = _tradeAvailableProviders.where((provider) {
if (_excludeProviderForSwapAll(provider)) return false;
+ if (_excludeProviderForReceiveExtraId(provider)) return false;
final limits = _providerLimits[provider];
@@ -972,6 +983,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
try {
final futures = selectedProviders
.where((provider) => providerList.contains(provider))
+ .where((provider) => !_excludeProviderForReceiveExtraId(provider))
.map((provider) async {
final limits = await provider
.fetchLimits(
@@ -1050,6 +1062,13 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
}
}
+ if (forcedProvider != null && _excludeProviderForReceiveExtraId(forcedProvider!)) {
+ tradeState = TradeIsCreatedFailure(
+ title: S.current.trade_not_created,
+ error: S.current.none_of_selected_providers_can_exchange);
+ return;
+ }
+
Map<double, ExchangeProvider> providers;
if (forcedProvider != null) {
providers = {forcedProviderRate: forcedProvider!};
@@ -1138,6 +1157,10 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
if (isFixedRateMode && provider.supportsFixedRate == false) {
continue;
}
+
+ if (_excludeProviderForReceiveExtraId(provider)) {
+ continue;
+ }
// Skip Swaps.xyz when sending from external
if (isSendFromExternal &&
@@ -1160,6 +1183,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
toAmount: _receiveAmount.replaceAll(',', '.'),
refundAddress: depositAddress,
toAddress: receiveAddress,
+ toAddressExtraId: receiveAddressExtraId.trim(),
isFixedRate: isFixedRateMode,
);
@@ -1260,6 +1284,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
depositCurrency == wallet.currency ? wallet.walletAddresses.addressForExchange : '';
receiveAddress =
receiveCurrency == wallet.currency ? wallet.walletAddresses.addressForExchange : '';
+ receiveAddressExtraId = '';
isDepositAddressEnabled = !(depositCurrency == wallet.currency);
isFixedRateMode = false;
_onPairChange();
diff --git a/lib/view_model/trade_details_view_model.dart b/lib/view_model/trade_details_view_model.dart
index 54f7615e..c2639fc0 100644
--- a/lib/view_model/trade_details_view_model.dart
+++ b/lib/view_model/trade_details_view_model.dart
@@ -26,6 +26,7 @@ import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.d
import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/utils/date_formatter.dart';
import 'package:cake_wallet/utils/show_bar.dart';
+import 'package:cw_core/currencies_with_memo.dart';
import 'package:cw_core/utils/print_verbose.dart';
import 'package:flutter/services.dart';
import 'package:mobx/mobx.dart';
@@ -182,6 +183,18 @@ abstract class TradeDetailsViewModelBase with Store {
));
}
+ final destinationMemo = trade.toAddressExtraId;
+ final destinationCurrency = trade.to;
+ if (destinationMemo != null &&
+ destinationMemo.isNotEmpty &&
+ destinationCurrency != null) {
+ final isDestinationTag =
+ memoLabelTypeFor(destinationCurrency) == MemoLabelType.destinationTag;
+ items.add(StandartListItem(
+ title: isDestinationTag ? S.current.destination_tag : S.current.memo,
+ value: destinationMemo));
+ }
+
items.add(StandartListItem(
title: S.current.trade_details_provider, value: trade.provider.toString()));
diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb
index 8077e97f..d779be35 100644
--- a/res/values/strings_ar.arb
+++ b/res/values/strings_ar.arb
@@ -308,6 +308,8 @@
"descending": "تنازلي",
"description": "الوصف",
"destination_tag": "وسم الوجهة:",
+ "destination_tag_optional": "علامة الوجهة (اختياري)",
+ "destination_tag_swap_disclaimer": "مطلوب من قبل المتلقي لإيداع أموالك. العلامة المفقودة أو الخاطئة تعني فقدان الأموال.",
"deuro_about_deuro": "حول dEURO",
"deuro_collect_interest": "تحصيل",
"deuro_reinvest_interest": "إعادة الاستثمار",
@@ -616,6 +618,7 @@
"memo": "مذكرة",
"memo_disclaimer": "ستكون هذه المذكرة مرئية للمستلم",
"memo_optional": "مذكرة (اختيارية)",
+ "memo_swap_disclaimer": "مطلوب من قبل المتلقي لإيداع أموالك. المذكرة المفقودة أو الخاطئة تعني فقدان الأموال.",
"message": "رسالة",
"message_verified": "تم التحقق من الرسالة بنجاح",
"messages": "الرسائل",
@@ -1374,4 +1377,4 @@
"zcash_card_missing_funds": "هل أموالك مفقودة؟",
"zcash_card_scan": "مسح",
"zcash_card_warning": "لا تُغلق التطبيق حتى يكتمل الإجراء، لأنك إن فعلت ذلك فستحتاج هذه العملية إلى البدء من جديد من البداية."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb
index 9fb31cff..b10eb982 100644
--- a/res/values/strings_bg.arb
+++ b/res/values/strings_bg.arb
@@ -308,6 +308,8 @@
"descending": "Низходящо",
"description": "Описание",
"destination_tag": "Таг на получателя:",
+ "destination_tag_optional": "Етикет за дестинация (по избор)",
+ "destination_tag_swap_disclaimer": "Изисква се от получателя, за да кредитира вашите средства. Липсващ или грешен етикет означава загубени средства.",
"deuro_about_deuro": "Относно dEURO",
"deuro_collect_interest": "Събери",
"deuro_reinvest_interest": "Реинвестирай",
@@ -616,6 +618,7 @@
"memo": "Мемо",
"memo_disclaimer": "Това поле „memo“ ще бъде видимо за получателя",
"memo_optional": "Мемо (по избор)",
+ "memo_swap_disclaimer": "Изисква се от получателя, за да кредитира вашите средства. Липсваща или грешна бележка означава загуба на средства.",
"message": "Съобщение",
"message_verified": "Съобщението беше успешно потвърдено",
"messages": "Съобщения",
@@ -1374,4 +1377,4 @@
"zcash_card_missing_funds": "Липсват средства?",
"zcash_card_scan": "Сканирай",
"zcash_card_warning": "Не затваряйте приложението, докато процедурата не приключи. Ако го направите, процесът ще трябва да започне отначало."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb
index b8eaafbc..46197778 100644
--- a/res/values/strings_cs.arb
+++ b/res/values/strings_cs.arb
@@ -308,6 +308,8 @@
"descending": "Sestupně",
"description": "Popis",
"destination_tag": "Cílový tag:",
+ "destination_tag_optional": "Cílová značka (volitelné)",
+ "destination_tag_swap_disclaimer": "Požadováno příjemcem k připsání vašich prostředků. Chybějící nebo nesprávný štítek znamená ztracené prostředky.",
"deuro_about_deuro": "O dEURO",
"deuro_collect_interest": "Vybrat",
"deuro_reinvest_interest": "Reinvestovat",
@@ -616,6 +618,7 @@
"memo": "Memo",
"memo_disclaimer": "Tato poznámka bude viditelná příjemci",
"memo_optional": "Memo (volitelné)",
+ "memo_swap_disclaimer": "Požadováno příjemcem k připsání vašich prostředků. Chybějící nebo nesprávný záznam znamená ztracené finanční prostředky.",
"message": "Zpráva",
"message_verified": "Zpráva byla úspěšně ověřena",
"messages": "Zprávy",
@@ -1374,4 +1377,4 @@
"zcash_card_missing_funds": "Chybějící prostředky?",
"zcash_card_scan": "Skenovat",
"zcash_card_warning": "Nezavírejte aplikaci, dokud se postup nedokončí. Pokud tak učiníte, bude nutné tento proces spustit znovu od začátku."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb
index cf20f6db..c8a562a3 100644
--- a/res/values/strings_de.arb
+++ b/res/values/strings_de.arb
@@ -308,6 +308,8 @@
"descending": "Absteigend",
"description": "Beschreibung",
"destination_tag": "Ziel-Tag:",
+ "destination_tag_optional": "Ziel-Tag (optional)",
+ "destination_tag_swap_disclaimer": "Wird vom Empfänger benötigt, um Ihr Geld gutzuschreiben. Fehlendes oder falsches Etikett bedeutet verlorenes Geld.",
"deuro_about_deuro": "Über dEURO",
"deuro_collect_interest": "Einziehen",
"deuro_reinvest_interest": "Reinvestieren",
@@ -616,6 +618,7 @@
"memo": "Memo",
"memo_disclaimer": "Dieses Memo wird für den Empfänger sichtbar sein",
"memo_optional": "Memo (optional)",
+ "memo_swap_disclaimer": "Wird vom Empfänger benötigt, um Ihr Geld gutzuschreiben. Ein fehlendes oder falsches Memo bedeutet verlorenes Geld.",
"message": "Nachricht",
"message_verified": "Die Nachricht wurde erfolgreich verifiziert",
"messages": "Nachrichten",
@@ -1378,4 +1381,4 @@
"zcash_card_missing_funds": "Fehlende Gelder?",
"zcash_card_scan": "Scannen",
"zcash_card_warning": "Schließen Sie die App nicht, bis der Vorgang abgeschlossen ist. Andernfalls muss der Vorgang von Grund auf neu gestartet werden."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb
index a4a49797..deb88f4c 100644
--- a/res/values/strings_en.arb
+++ b/res/values/strings_en.arb
@@ -310,6 +310,8 @@
"descending": "Descending",
"description": "Description",
"destination_tag": "Destination tag:",
+ "destination_tag_optional": "Destination tag (optional)",
+ "destination_tag_swap_disclaimer": "Required by the receiver to credit your funds. Missing or wrong tag means lost funds.",
"deuro_about_deuro": "About dEURO",
"deuro_collect_interest": "Collect",
"deuro_reinvest_interest": "Reinvest",
@@ -620,6 +622,7 @@
"memo": "Memo",
"memo_disclaimer": "This memo will be visible to the receiver",
"memo_optional": "Memo (optional)",
+ "memo_swap_disclaimer": "Required by the receiver to credit your funds. Missing or wrong memo means lost funds.",
"message": "Message",
"message_verified": "The message was successfully verified",
"messages": "Messages",
diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb
index 9c9fe3d8..7c972bd0 100644
--- a/res/values/strings_es.arb
+++ b/res/values/strings_es.arb
@@ -308,6 +308,8 @@
"descending": "Descendente",
"description": "Descripción",
"destination_tag": "Etiqueta de destino:",
+ "destination_tag_optional": "Etiqueta de destino (opcional)",
+ "destination_tag_swap_disclaimer": "Requerido por el receptor para acreditar sus fondos. La etiqueta faltante o incorrecta significa fondos perdidos.",
"deuro_about_deuro": "Acerca de dEURO",
"deuro_collect_interest": "Cobrar",
"deuro_reinvest_interest": "Reinvertir",
@@ -616,6 +618,7 @@
"memo": "Memo",
"memo_disclaimer": "Este memo será visible para el destinatario",
"memo_optional": "Memo (opcional)",
+ "memo_swap_disclaimer": "Requerido por el receptor para acreditar sus fondos. Una nota faltante o incorrecta significa fondos perdidos.",
"message": "Mensaje",
"message_verified": "El mensaje se verificó correctamente",
"messages": "Mensajes",
@@ -1376,4 +1379,4 @@
"zcash_card_missing_funds": "¿Faltan fondos?",
"zcash_card_scan": "Escanear",
"zcash_card_warning": "No cierre la aplicación hasta que se complete el procedimiento; si lo hace, este proceso deberá reiniciarse desde cero."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_fa.arb b/res/values/strings_fa.arb
index 167c4fa5..937d906a 100644
--- a/res/values/strings_fa.arb
+++ b/res/values/strings_fa.arb
@@ -306,6 +306,8 @@
"descending": "نزولی",
"description": "توضیحات",
"destination_tag": "برچسب مقصد:",
+ "destination_tag_optional": "برچسب مقصد (اختیاری)",
+ "destination_tag_swap_disclaimer": "توسط گیرنده برای اعتبار وجوه شما مورد نیاز است. برچسب گم شده یا اشتباه به معنای از دست رفتن وجوه است.",
"deuro_about_deuro": "درباره dEURO",
"deuro_collect_interest": "دریافت",
"deuro_reinvest_interest": "سرمایهگذاری مجدد",
@@ -614,6 +616,7 @@
"memo": "یادداشت",
"memo_disclaimer": "این یادداشت برای گیرنده قابل مشاهده خواهد بود",
"memo_optional": "یادداشت (اختیاری)",
+ "memo_swap_disclaimer": "توسط گیرنده برای اعتبار وجوه شما مورد نیاز است. یادداشت گم شده یا اشتباه به معنای از دست رفتن وجوه است.",
"message": "پیام",
"message_verified": "پیام با موفقیت تأیید شد",
"messages": "پیامها",
@@ -1371,4 +1374,4 @@
"zcash_card_missing_funds": "موجودی گم شده؟",
"zcash_card_scan": "اسکن",
"zcash_card_warning": "تا زمانی که این فرایند کامل نشده است، برنامه را نبندید؛ در غیر این صورت، این فرایند باید از ابتدا دوباره شروع شود."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb
index 7fb51b38..ecfb6ad4 100644
--- a/res/values/strings_fr.arb
+++ b/res/values/strings_fr.arb
@@ -308,6 +308,8 @@
"descending": "Décroissant",
"description": "Description",
"destination_tag": "Tag de destination :",
+ "destination_tag_optional": "Balise de destination (facultatif)",
+ "destination_tag_swap_disclaimer": "Requis par le destinataire pour créditer vos fonds. Une étiquette manquante ou erronée signifie une perte de fonds.",
"deuro_about_deuro": "À propos de dEURO",
"deuro_collect_interest": "Collecter",
"deuro_reinvest_interest": "Réinvestir",
@@ -616,6 +618,7 @@
"memo": "Mémo",
"memo_disclaimer": "Ce mémo sera visible par le destinataire",
"memo_optional": "Mémo (facultatif)",
+ "memo_swap_disclaimer": "Requis par le destinataire pour créditer vos fonds. Un mémo manquant ou erroné signifie une perte de fonds.",
"message": "Message",
"message_verified": "Le message a été vérifié avec succès",
"messages": "Messages",
@@ -1374,4 +1377,4 @@
"zcash_card_missing_funds": "Fonds manquants ?",
"zcash_card_scan": "Scanner",
"zcash_card_warning": "Ne fermez pas l'application tant que la procédure n'est pas terminée. Si vous le faites, ce processus devra redémarrer depuis le début."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_gn.arb b/res/values/strings_gn.arb
index e17fd274..36418cfa 100644
--- a/res/values/strings_gn.arb
+++ b/res/values/strings_gn.arb
@@ -249,6 +249,8 @@
"descending": "Oguejy",
"description": "Ñemombe’u",
"destination_tag": "Teramoĩha hag̃ua:",
+ "destination_tag_optional": "Etiqueta destino rehegua (opcional) .",
+ "destination_tag_swap_disclaimer": "Ojeruréva receptor oacredita haguã nde fondo. Etiqueta ofaltáva térã ojavýva he'ise fondo okañýva.",
"dfx_option_description": "Ejogua cripto EUR ha CHF reheve. Oipurukuaa hag̃ua ñemuhára michĩ ha mba’apohaguasu Europape.",
"did_you_back_up_seeds": "¿Rejapo raʼe backup opaite nde raʼỹi rehegua?",
"didnt_get_code": "¿Nererejapýi kódigo?",
@@ -479,6 +481,7 @@
"memo": "Mandu’a",
"memo_disclaimer": "Ko memo ojehecháta ohupytývape",
"memo_optional": "Memo (opcional)",
+ "memo_swap_disclaimer": "Ojeruréva receptor oacredita haguã nde fondo. Memo ofaltáva térã ojavýva he'ise fondo okañýva.",
"message": "Marandu",
"message_verified": "Pe marandu ojehechajey porã",
"methods": "Mba’éichapa",
@@ -1113,4 +1116,4 @@
"zcash_card_missing_funds": "¿Nde fondo okañy?",
"zcash_card_scan": "Escanear",
"zcash_card_warning": "Ani remboty pe app pe procedimiento opa hag̃ua, rejapo ramo upéicha ko proceso tekotevẽta oñepyrũ jey cero guive."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb
index c0a4d515..e966ac2e 100644
--- a/res/values/strings_ha.arb
+++ b/res/values/strings_ha.arb
@@ -308,6 +308,8 @@
"descending": "Mai saukowa",
"description": "Bayanin",
"destination_tag": "Alamar makoma:",
+ "destination_tag_optional": "Alamar wuri (na zaɓi)",
+ "destination_tag_swap_disclaimer": "Mai karɓa ya buƙaci ya ba da kuɗin ku. Bacewa ko kuskuren tag yana nufin asarar kuɗi.",
"deuro_about_deuro": "Game da dEURO",
"deuro_collect_interest": "Karɓa",
"deuro_reinvest_interest": "Sake saka",
@@ -616,6 +618,7 @@
"memo": "Memo",
"memo_disclaimer": "Wannan memo zai kasance a bayyane ga mai karɓa",
"memo_optional": "Memo (na zaɓi)",
+ "memo_swap_disclaimer": "Mai karɓa ya buƙaci ya ba da kuɗin ku. Memo na ɓace ko kuskure yana nufin asarar kuɗi.",
"message": "Saƙo",
"message_verified": "An tabbatar da saƙon cikin nasara",
"messages": "Saƙonni",
@@ -1377,4 +1380,4 @@
"zcash_card_missing_funds": "Kuɗi sun ɓace?",
"zcash_card_scan": "Duba",
"zcash_card_warning": "Kada ku rufe manhajar har sai an kammala aikin; idan kun yi haka, wannan tsari zai buƙaci a sake farawa daga farko."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb
index a1ce0c33..67fd75d5 100644
--- a/res/values/strings_hi.arb
+++ b/res/values/strings_hi.arb
@@ -308,6 +308,8 @@
"descending": "अवरोही",
"description": "विवरण",
"destination_tag": "गंतव्य टैग:",
+ "destination_tag_optional": "गंतव्य टैग (वैकल्पिक)",
+ "destination_tag_swap_disclaimer": "प्राप्तकर्ता द्वारा आपके फंड को क्रेडिट करना आवश्यक है। गुम या गलत टैग का अर्थ है खोया हुआ धन।",
"deuro_about_deuro": "dEURO के बारे में",
"deuro_collect_interest": "एकत्र करें",
"deuro_reinvest_interest": "पुनर्निवेश करें",
@@ -616,6 +618,7 @@
"memo": "मेमो",
"memo_disclaimer": "यह मेमो प्राप्तकर्ता को दिखाई देगा",
"memo_optional": "मेमो (वैकल्पिक)",
+ "memo_swap_disclaimer": "प्राप्तकर्ता द्वारा आपके फंड को क्रेडिट करना आवश्यक है। मेमो के गुम या गलत होने का अर्थ है धन की हानि।",
"message": "संदेश",
"message_verified": "संदेश सफलतापूर्वक सत्यापित हो गया",
"messages": "संदेश",
@@ -733,8 +736,8 @@
"payjoin_unavailable_sheet_title": "Payjoin उपलब्ध क्यों नहीं है?",
"payment_id": "भुगतान आईडी: ",
"payment_made_easy": "भुगतान करना आसान",
- "Payment_was_received": "आपका भुगतान प्राप्त हो गया था।",
"payment_was_received": "आपका भुगतान प्राप्त हो गया।",
+ "Payment_was_received": "आपका भुगतान प्राप्त हो गया था।",
"payments": "भुगतान",
"pending": " (लंबित)",
"percentageOf": "${amount} का",
@@ -1376,4 +1379,4 @@
"zcash_card_missing_funds": "फंड गायब हैं?",
"zcash_card_scan": "स्कैन",
"zcash_card_warning": "प्रक्रिया पूरी होने तक ऐप बंद न करें। यदि आप ऐसा करते हैं, तो यह प्रक्रिया शुरू से फिर से शुरू करनी होगी।"
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb
index a8e281b3..6b449111 100644
--- a/res/values/strings_hr.arb
+++ b/res/values/strings_hr.arb
@@ -308,6 +308,8 @@
"descending": "Silazno",
"description": "Opis",
"destination_tag": "Odredišna oznaka:",
+ "destination_tag_optional": "Oznaka odredišta (nije obavezno)",
+ "destination_tag_swap_disclaimer": "Primatelj zahtijeva da kreditira vaša sredstva. Nedostatak ili pogrešna oznaka znači gubitak sredstava.",
"deuro_about_deuro": "O dEURO-u",
"deuro_collect_interest": "Preuzmi",
"deuro_reinvest_interest": "Reinvestiraj",
@@ -616,6 +618,7 @@
"memo": "Memo",
"memo_disclaimer": "Ova će bilješka biti vidljiva primatelju",
"memo_optional": "Memo (nije obavezno)",
+ "memo_swap_disclaimer": "Primatelj zahtijeva da kreditira vaša sredstva. Nedostatak ili pogrešan dopis znači gubitak sredstava.",
"message": "Poruka",
"message_verified": "Poruka je uspješno verificirana",
"messages": "Poruke",
@@ -1374,4 +1377,4 @@
"zcash_card_missing_funds": "Nedostaju sredstva?",
"zcash_card_scan": "Skeniraj",
"zcash_card_warning": "Ne zatvarajte aplikaciju dok se postupak ne dovrši; ako to učinite, postupak će se morati ponovno pokrenuti ispočetka."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb
index c003dc3b..21182981 100644
--- a/res/values/strings_hy.arb
+++ b/res/values/strings_hy.arb
@@ -308,6 +308,8 @@
"descending": "Նվազման կարգով",
"description": "Նկարագրություն",
"destination_tag": "Նշանակման թեգը:",
+ "destination_tag_optional": "Նպատակակետի պիտակ (ըստ ցանկության)",
+ "destination_tag_swap_disclaimer": "Ստացողի կողմից պահանջվում է ձեր միջոցները վարկավորելու համար: Բացակայող կամ սխալ պիտակ նշանակում է կորցրած միջոցներ:",
"deuro_about_deuro": "dEURO-ի մասին",
"deuro_collect_interest": "Հավաքել",
"deuro_reinvest_interest": "Վերաներդնել",
@@ -616,6 +618,7 @@
"memo": "Մեմո",
"memo_disclaimer": "Այս հուշագիրը տեսանելի կլինի ստացողին",
"memo_optional": "Մեմո (ըստ ցանկության)",
+ "memo_swap_disclaimer": "Ստացողի կողմից պահանջվում է ձեր միջոցները վարկավորելու համար: Հուշագրի բացակայությունը կամ սխալը նշանակում է կորցրած միջոցներ:",
"message": "Հաղորդագրություն",
"message_verified": "Հաղորդագրությունը հաջողությամբ ստուգվեց",
"messages": "Հաղորդագրություններ",
@@ -1372,4 +1375,4 @@
"zcash_card_missing_funds": "Միջոցները բացակա՞յում են",
"zcash_card_scan": "Սկանավորել",
"zcash_card_warning": "Մի փակեք հավելվածը մինչև ընթացակարգի ավարտը, քանի որ հակառակ դեպքում այս գործընթացը պետք է վերագործարկվի զրոյից։"
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb
index b89942b1..7dff8cb8 100644
--- a/res/values/strings_id.arb
+++ b/res/values/strings_id.arb
@@ -308,6 +308,8 @@
"descending": "Menurun",
"description": "Deskripsi",
"destination_tag": "Tag tujuan:",
+ "destination_tag_optional": "Tag tujuan (opsional)",
+ "destination_tag_swap_disclaimer": "Diperlukan oleh penerima untuk mengkreditkan dana Anda. Tag yang hilang atau salah berarti dana hilang.",
"deuro_about_deuro": "Tentang dEURO",
"deuro_collect_interest": "Kumpulkan",
"deuro_reinvest_interest": "Investasikan kembali",
@@ -616,6 +618,7 @@
"memo": "Memo",
"memo_disclaimer": "Memo ini akan terlihat oleh penerima",
"memo_optional": "Memo (opsional)",
+ "memo_swap_disclaimer": "Diperlukan oleh penerima untuk mengkreditkan dana Anda. Memo yang hilang atau salah berarti dana hilang.",
"message": "Pesan",
"message_verified": "Pesan berhasil diverifikasi",
"messages": "Pesan",
@@ -1377,4 +1380,4 @@
"zcash_card_missing_funds": "Dana hilang?",
"zcash_card_scan": "Pindai",
"zcash_card_warning": "Jangan tutup aplikasi sampai prosedur selesai. Jika Anda melakukannya, proses ini harus dimulai ulang dari awal."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb
index b90718c4..30cc7479 100644
--- a/res/values/strings_it.arb
+++ b/res/values/strings_it.arb
@@ -308,6 +308,8 @@
"descending": "Decrescente",
"description": "Descrizione",
"destination_tag": "Tag di destinazione:",
+ "destination_tag_optional": "Tag di destinazione (facoltativo)",
+ "destination_tag_swap_disclaimer": "Richiesto dal destinatario per accreditare i tuoi fondi. Tag mancante o sbagliato significa perdita di fondi.",
"deuro_about_deuro": "Informazioni su dEURO",
"deuro_collect_interest": "Raccogli",
"deuro_reinvest_interest": "Reinvesti",
@@ -616,6 +618,7 @@
"memo": "Memo",
"memo_disclaimer": "Questo memo sarà visibile al destinatario",
"memo_optional": "Memo (facoltativo)",
+ "memo_swap_disclaimer": "Richiesto dal destinatario per accreditare i tuoi fondi. Una nota mancante o errata significa perdita di fondi.",
"message": "Messaggio",
"message_verified": "Il messaggio è stato verificato con successo",
"messages": "Messaggi",
@@ -1376,4 +1379,4 @@
"zcash_card_missing_funds": "Fondi mancanti?",
"zcash_card_scan": "Scansiona",
"zcash_card_warning": "Non chiudere l'app finché la procedura non è completata, altrimenti sarà necessario riavviare il processo da zero."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb
index 0db5a061..aefc4fa7 100644
--- a/res/values/strings_ja.arb
+++ b/res/values/strings_ja.arb
@@ -308,6 +308,8 @@
"descending": "降順",
"description": "説明",
"destination_tag": "宛先タグ:",
+ "destination_tag_optional": "宛先タグ (オプション)",
+ "destination_tag_swap_disclaimer": "受取人があなたの資金を入金するために必要とします。タグが欠落しているか間違っていると、資金が失われます。",
"deuro_about_deuro": "dEUROについて",
"deuro_collect_interest": "受け取る",
"deuro_reinvest_interest": "再投資",
@@ -617,6 +619,7 @@
"memo": "メモ",
"memo_disclaimer": "このメモは受取人に表示されます",
"memo_optional": "メモ(任意)",
+ "memo_swap_disclaimer": "受取人があなたの資金を入金するために必要とします。メモの紛失または間違ったメモは資金の損失を意味します。",
"message": "メッセージ",
"message_verified": "メッセージは正常に検証されました",
"messages": "メッセージ",
@@ -1374,4 +1377,4 @@
"zcash_card_missing_funds": "資金が見当たりませんか?",
"zcash_card_scan": "スキャン",
"zcash_card_warning": "手順が完了するまでアプリを閉じないでください。閉じると、このプロセスを最初からやり直す必要があります。"
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb
index 2cbfd964..5f762a9f 100644
--- a/res/values/strings_ko.arb
+++ b/res/values/strings_ko.arb
@@ -308,6 +308,8 @@
"descending": "내림차순",
"description": "설명",
"destination_tag": "목적지 태그:",
+ "destination_tag_optional": "대상 태그(선택사항)",
+ "destination_tag_swap_disclaimer": "귀하의 자금을 입금하기 위해 수신자가 필요합니다. 태그가 없거나 잘못된 경우 자금 손실이 발생합니다.",
"deuro_about_deuro": "dEURO 소개",
"deuro_collect_interest": "수령",
"deuro_reinvest_interest": "재투자",
@@ -616,6 +618,7 @@
"memo": "메모",
"memo_disclaimer": "이 메모는 수신자에게 표시됩니다.",
"memo_optional": "메모(선택)",
+ "memo_swap_disclaimer": "귀하의 자금을 입금하기 위해 수신자가 필요합니다. 누락되거나 잘못된 메모는 자금 손실을 의미합니다.",
"message": "메시지",
"message_verified": "메시지가 성공적으로 검증되었습니다",
"messages": "메시지",
@@ -1374,4 +1377,4 @@
"zcash_card_missing_funds": "자금이 사라졌나요?",
"zcash_card_scan": "스캔",
"zcash_card_warning": "절차가 완료될 때까지 앱을 닫지 마십시오. 닫으면 이 과정을 처음부터 다시 시작해야 합니다."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb
index 288f3dc9..a5a7cf60 100644
--- a/res/values/strings_my.arb
+++ b/res/values/strings_my.arb
@@ -308,6 +308,8 @@
"descending": "အနိမ့်မှအမြင့်သို့",
"description": "ဖော်ပြချက်",
"destination_tag": "ဦးတည်ရာ Tag:",
+ "destination_tag_optional": "ဦးတည်ရာတဂ် (ချန်လှပ်ထားနိုင်သည်)",
+ "destination_tag_swap_disclaimer": "သင့်ရန်ပုံငွေများကို အကြွေးတင်ရန်အတွက် လက်ခံသူမှ လိုအပ်ပါသည်။ ပျောက်ဆုံးနေသော သို့မဟုတ် မှားယွင်းသော tag ဆိုသည်မှာ ဆုံးရှုံးသွားသော ရန်ပုံငွေများကို ဆိုလိုသည်။",
"deuro_about_deuro": "dEURO အကြောင်း",
"deuro_collect_interest": "ရယူ",
"deuro_reinvest_interest": "ပြန်လည်ရင်းနှီးမြှုပ်နှံရန်",
@@ -616,6 +618,7 @@
"memo": "မှတ်စု",
"memo_disclaimer": "ဤ memo ကို လက်ခံသူက မြင်နိုင်ပါမည်။",
"memo_optional": "Memo (ရွေးချယ်နိုင်သည်)",
+ "memo_swap_disclaimer": "သင့်ရန်ပုံငွေများကို အကြွေးတင်ရန်အတွက် လက်ခံသူမှ လိုအပ်ပါသည်။ မှတ်စုတို ပျောက်ဆုံးခြင်း သို့မဟုတ် မှားယွင်းခြင်းဆိုသည်မှာ ဆုံးရှုံးသွားသော ရန်ပုံငွေများကို ဆိုလိုသည်။",
"message": "မက်ဆေ့ချ်",
"message_verified": "မက်ဆေ့ချ်ကို အောင်မြင်စွာ အတည်ပြုပြီးပါပြီ",
"messages": "မက်ဆေ့ချ်များ",
@@ -1373,4 +1376,4 @@
"zcash_card_missing_funds": "ငွေကြေး ပျောက်ဆုံးနေပါသလား?",
"zcash_card_scan": "စကင်",
"zcash_card_warning": "လုပ်ငန်းစဉ် ပြီးဆုံးသည်အထိ အက်ပ်ကို မပိတ်ပါနှင့်။ ပိတ်လိုက်ပါက ဤလုပ်ငန်းစဉ်ကို အစမှ ပြန်လည်စတင်ရမည်ဖြစ်သည်။"
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb
index 12d1bb54..8acc1558 100644
--- a/res/values/strings_nl.arb
+++ b/res/values/strings_nl.arb
@@ -306,6 +306,8 @@
"descending": "Aflopend",
"description": "Beschrijving",
"destination_tag": "Bestemmingstag:",
+ "destination_tag_optional": "Bestemmingstag (optioneel)",
+ "destination_tag_swap_disclaimer": "Vereist door de ontvanger om uw geld te crediteren. Ontbrekende of verkeerde tag betekent verloren geld.",
"deuro_about_deuro": "Over dEURO",
"deuro_collect_interest": "Verzamelen",
"deuro_reinvest_interest": "Herinvesteren",
@@ -613,6 +615,7 @@
"memo": "Memo",
"memo_disclaimer": "Deze memo is zichtbaar voor de ontvanger",
"memo_optional": "Memo (optioneel)",
+ "memo_swap_disclaimer": "Vereist door de ontvanger om uw geld te crediteren. Ontbrekende of verkeerde memo betekent verloren geld.",
"message": "Bericht",
"message_verified": "Het bericht is succesvol geverifieerd",
"messages": "Berichten",
@@ -1371,4 +1374,4 @@
"zcash_card_missing_funds": "Fondsen ontbreken?",
"zcash_card_scan": "Scannen",
"zcash_card_warning": "Sluit de app niet voordat de procedure is voltooid. Als je dit wel doet, moet dit proces helemaal opnieuw worden gestart."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb
index 5389b181..e4f72081 100644
--- a/res/values/strings_pl.arb
+++ b/res/values/strings_pl.arb
@@ -308,6 +308,8 @@
"descending": "Malejąco",
"description": "Opis",
"destination_tag": "Tag docelowy:",
+ "destination_tag_optional": "Znacznik miejsca docelowego (opcjonalnie)",
+ "destination_tag_swap_disclaimer": "Wymagane przez odbiorcę w celu uznania Twoich środków. Brakujący lub błędny tag oznacza utratę środków.",
"deuro_about_deuro": "O dEURO",
"deuro_collect_interest": "Odbierz",
"deuro_reinvest_interest": "Reinwestuj",
@@ -615,6 +617,7 @@
"memo": "Memo",
"memo_disclaimer": "To memo będzie widoczne dla odbiorcy",
"memo_optional": "Memo (opcjonalne)",
+ "memo_swap_disclaimer": "Wymagane przez odbiorcę w celu uznania Twoich środków. Brakująca lub błędna notatka oznacza utratę środków.",
"message": "Wiadomość",
"message_verified": "Wiadomość została pomyślnie zweryfikowana",
"messages": "Wiadomości",
@@ -1372,4 +1375,4 @@
"zcash_card_missing_funds": "Brakuje środków?",
"zcash_card_scan": "Skanuj",
"zcash_card_warning": "Nie zamykaj aplikacji do czasu zakończenia procedury. Jeśli to zrobisz, proces będzie musiał rozpocząć się od nowa."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb
index 118cd47d..fd938d12 100644
--- a/res/values/strings_pt.arb
+++ b/res/values/strings_pt.arb
@@ -308,6 +308,8 @@
"descending": "Descendente",
"description": "Descrição",
"destination_tag": "Tag de destino:",
+ "destination_tag_optional": "Tag de destino (opcional)",
+ "destination_tag_swap_disclaimer": "Exigido pelo destinatário para creditar seus fundos. Etiqueta ausente ou errada significa perda de fundos.",
"deuro_about_deuro": "Sobre dEURO",
"deuro_collect_interest": "Coletar",
"deuro_reinvest_interest": "Reinvestir",
@@ -617,6 +619,7 @@
"memo": "Memo",
"memo_disclaimer": "Este memo ficará visível para o destinatário",
"memo_optional": "Memo (opcional)",
+ "memo_swap_disclaimer": "Exigido pelo destinatário para creditar seus fundos. Memorando ausente ou errado significa perda de fundos.",
"message": "Mensagem",
"message_verified": "A mensagem foi verificada com sucesso",
"messages": "Mensagens",
@@ -1376,4 +1379,4 @@
"zcash_card_missing_funds": "Fundos em falta?",
"zcash_card_scan": "Escanear",
"zcash_card_warning": "Não feche o aplicativo até que o procedimento seja concluído; se você fizer isso, esse processo precisará ser reiniciado do zero."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_pt_BR.arb b/res/values/strings_pt_BR.arb
index 2f5e17e3..1e178453 100644
--- a/res/values/strings_pt_BR.arb
+++ b/res/values/strings_pt_BR.arb
@@ -306,6 +306,8 @@
"descending": "Decrescente",
"description": "Descrição",
"destination_tag": "Tag de destino:",
+ "destination_tag_optional": "Tag de destino (opcional)",
+ "destination_tag_swap_disclaimer": "Exigido pelo destinatário para creditar seus fundos. Etiqueta ausente ou errada significa perda de fundos.",
"deuro_about_deuro": "Sobre dEURO",
"deuro_collect_interest": "Coletar",
"deuro_reinvest_interest": "Reinvestir",
@@ -612,6 +614,7 @@
"memo": "Memo",
"memo_disclaimer": "Este memo será visível para o destinatário",
"memo_optional": "Memo (opcional)",
+ "memo_swap_disclaimer": "Exigido pelo destinatário para creditar seus fundos. Memorando ausente ou errado significa perda de fundos.",
"message": "Mensagem",
"message_verified": "A mensagem foi verificada com sucesso",
"messages": "Mensagens",
@@ -1368,4 +1371,4 @@
"zcash_card_missing_funds": "Fundos ausentes?",
"zcash_card_scan": "Escanear",
"zcash_card_warning": "Não feche o app até que o procedimento seja concluído; caso contrário, este processo precisará ser reiniciado do zero."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb
index 828e899b..cd85cdfb 100644
--- a/res/values/strings_ru.arb
+++ b/res/values/strings_ru.arb
@@ -308,6 +308,8 @@
"descending": "По убыванию",
"description": "Описание",
"destination_tag": "Тег назначения:",
+ "destination_tag_optional": "Тег назначения (необязательно)",
+ "destination_tag_swap_disclaimer": "Требуется получателю для зачисления ваших средств. Отсутствие или неправильный тег означает потерю средств.",
"deuro_about_deuro": "О dEURO",
"deuro_collect_interest": "Собрать",
"deuro_reinvest_interest": "Реинвестировать",
@@ -616,6 +618,7 @@
"memo": "Мемо",
"memo_disclaimer": "Это примечание будет видно получателю",
"memo_optional": "Мемо (необязательно)",
+ "memo_swap_disclaimer": "Требуется получателю для зачисления ваших средств. Отсутствие или неправильная памятка означает потерю средств.",
"message": "Сообщение",
"message_verified": "Сообщение было успешно проверено",
"messages": "Сообщения",
@@ -1374,4 +1377,4 @@
"zcash_card_missing_funds": "Не хватает средств?",
"zcash_card_scan": "Сканировать",
"zcash_card_warning": "Не закрывайте приложение до завершения процедуры. Если вы это сделаете, процесс придется перезапустить с нуля."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb
index f0abd039..e2b41f44 100644
--- a/res/values/strings_th.arb
+++ b/res/values/strings_th.arb
@@ -308,6 +308,8 @@
"descending": "จากมากไปน้อย",
"description": "คำอธิบาย",
"destination_tag": "แท็กปลายทาง:",
+ "destination_tag_optional": "แท็กปลายทาง (ไม่บังคับ)",
+ "destination_tag_swap_disclaimer": "ผู้รับต้องการให้เครดิตเงินของคุณ แท็กที่หายไปหรือผิดหมายถึงสูญเสียเงิน",
"deuro_about_deuro": "เกี่ยวกับ dEURO",
"deuro_collect_interest": "รับ",
"deuro_reinvest_interest": "ลงทุนซ้ำ",
@@ -616,6 +618,7 @@
"memo": "บันทึก",
"memo_disclaimer": "บันทึกนี้จะมองเห็นได้โดยผู้รับ",
"memo_optional": "บันทึก (ไม่บังคับ)",
+ "memo_swap_disclaimer": "ผู้รับต้องการให้เครดิตเงินของคุณ บันทึกที่หายไปหรือผิดหมายถึงสูญเสียเงิน",
"message": "ข้อความ",
"message_verified": "ตรวจสอบข้อความสำเร็จแล้ว",
"messages": "ข้อความ",
@@ -1373,4 +1376,4 @@
"zcash_card_missing_funds": "ยอดเงินหายไป?",
"zcash_card_scan": "สแกน",
"zcash_card_warning": "อย่าปิดแอปจนกว่าขั้นตอนจะเสร็จสิ้น หากคุณปิดแอป กระบวนการนี้จะต้องเริ่มใหม่ตั้งแต่ต้น"
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb
index 71a87c25..98d6d91d 100644
--- a/res/values/strings_tl.arb
+++ b/res/values/strings_tl.arb
@@ -308,6 +308,8 @@
"descending": "Pababa",
"description": "Paglalarawan",
"destination_tag": "Destination tag:",
+ "destination_tag_optional": "Destination tag (opsyonal)",
+ "destination_tag_swap_disclaimer": "Kinakailangan ng tatanggap na ikredito ang iyong mga pondo. Ang nawawala o maling tag ay nangangahulugan ng mga nawalang pondo.",
"deuro_about_deuro": "Tungkol sa dEURO",
"deuro_collect_interest": "Kolektahin",
"deuro_reinvest_interest": "Muling i-invest",
@@ -616,6 +618,7 @@
"memo": "Memo",
"memo_disclaimer": "Makikita ng tatanggap ang memo na ito",
"memo_optional": "Memo (opsyonal)",
+ "memo_swap_disclaimer": "Kinakailangan ng tatanggap na ikredito ang iyong mga pondo. Ang nawawala o maling memo ay nangangahulugan ng nawalang pondo.",
"message": "Mensahe",
"message_verified": "Matagumpay na na-verify ang mensahe",
"messages": "Mga Mensahe",
@@ -1373,4 +1376,4 @@
"zcash_card_missing_funds": "Nawawalang pondo?",
"zcash_card_scan": "I-scan",
"zcash_card_warning": "Huwag isara ang app hanggang sa makumpleto ang proseso; kung gagawin mo ito, kakailanganing magsimula muli mula sa simula."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb
index 346b35d0..1f2a1219 100644
--- a/res/values/strings_tr.arb
+++ b/res/values/strings_tr.arb
@@ -308,6 +308,8 @@
"descending": "Azalan",
"description": "Açıklama",
"destination_tag": "Hedef etiketi:",
+ "destination_tag_optional": "Hedef etiketi (isteğe bağlı)",
+ "destination_tag_swap_disclaimer": "Alıcının paranızı yatırması için gereklidir. Eksik veya yanlış etiket, para kaybı anlamına gelir.",
"deuro_about_deuro": "dEURO hakkında",
"deuro_collect_interest": "Topla",
"deuro_reinvest_interest": "Yeniden yatır",
@@ -616,6 +618,7 @@
"memo": "Not",
"memo_disclaimer": "Bu memo alıcı tarafından görülebilecektir",
"memo_optional": "Memo (isteğe bağlı)",
+ "memo_swap_disclaimer": "Alıcının paranızı yatırması için gereklidir. Eksik veya yanlış not, para kaybı anlamına gelir.",
"message": "Mesaj",
"message_verified": "Mesaj başarıyla doğrulandı",
"messages": "Mesajlar",
@@ -1373,4 +1376,4 @@
"zcash_card_missing_funds": "Bakiye eksik mi?",
"zcash_card_scan": "Tara",
"zcash_card_warning": "İşlem tamamlanana kadar uygulamayı kapatmayın; aksi takdirde bu işlemin baştan yeniden başlatılması gerekecektir."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb
index 76922150..63ed3b1e 100644
--- a/res/values/strings_uk.arb
+++ b/res/values/strings_uk.arb
@@ -308,6 +308,8 @@
"descending": "За спаданням",
"description": "Опис",
"destination_tag": "Тег призначення:",
+ "destination_tag_optional": "Тег призначення (необов’язково)",
+ "destination_tag_swap_disclaimer": "Потрібний одержувачу для зарахування ваших коштів. Відсутній або неправильний тег означає втрату коштів.",
"deuro_about_deuro": "Про dEURO",
"deuro_collect_interest": "Зібрати",
"deuro_reinvest_interest": "Реінвестувати",
@@ -616,6 +618,7 @@
"memo": "Мемо",
"memo_disclaimer": "Ця примітка буде видима одержувачу",
"memo_optional": "Мемо (необов'язково)",
+ "memo_swap_disclaimer": "Потрібний одержувачу для зарахування ваших коштів. Відсутня або неправильна нотатка означає втрату коштів.",
"message": "Повідомлення",
"message_verified": "Повідомлення було успішно перевірено",
"messages": "Повідомлення",
@@ -1374,4 +1377,4 @@
"zcash_card_missing_funds": "Зникли кошти?",
"zcash_card_scan": "Сканувати",
"zcash_card_warning": "Не закривайте застосунок, доки процедура не завершиться. Якщо ви це зробите, цей процес потрібно буде перезапустити з нуля."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb
index 9285c8e7..b4307505 100644
--- a/res/values/strings_ur.arb
+++ b/res/values/strings_ur.arb
@@ -308,6 +308,8 @@
"descending": "نزولی",
"description": "تفصیل",
"destination_tag": "ڈیسٹینیشن ٹیگ:",
+ "destination_tag_optional": "منزل کا ٹیگ (اختیاری)",
+ "destination_tag_swap_disclaimer": "وصول کنندہ کے ذریعہ آپ کے فنڈز کو کریڈٹ کرنے کی ضرورت ہے۔ گمشدہ یا غلط ٹیگ کا مطلب ہے کھوئے ہوئے فنڈز۔",
"deuro_about_deuro": "dEURO کے بارے میں",
"deuro_collect_interest": "وصول کریں",
"deuro_reinvest_interest": "دوبارہ سرمایہ کاری کریں",
@@ -616,6 +618,7 @@
"memo": "میمو",
"memo_disclaimer": "یہ میمو وصول کنندہ کو نظر آئے گا۔",
"memo_optional": "میمو (اختیاری)",
+ "memo_swap_disclaimer": "وصول کنندہ کے ذریعہ آپ کے فنڈز کو کریڈٹ کرنے کی ضرورت ہے۔ گمشدہ یا غلط میمو کا مطلب ہے کھوئے ہوئے فنڈز۔",
"message": "پیغام",
"message_verified": "پیغام کی کامیابی سے تصدیق ہو گئی",
"messages": "پیغامات",
@@ -1375,4 +1378,4 @@
"zcash_card_missing_funds": "فنڈز غائب ہیں؟",
"zcash_card_scan": "اسکین کریں",
"zcash_card_warning": "طریقہ کار مکمل ہونے تک ایپ بند نہ کریں۔ اگر آپ ایسا کریں گے تو یہ عمل شروع سے دوبارہ شروع کرنا پڑے گا۔"
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb
index 5ce21b68..f53e3a8a 100644
--- a/res/values/strings_vi.arb
+++ b/res/values/strings_vi.arb
@@ -307,6 +307,8 @@
"descending": "Giảm dần",
"description": "Mô tả",
"destination_tag": "Thẻ đích:",
+ "destination_tag_optional": "Thẻ đích (tùy chọn)",
+ "destination_tag_swap_disclaimer": "Người nhận yêu cầu ghi có tiền của bạn. Thẻ bị thiếu hoặc sai có nghĩa là tiền bị mất.",
"deuro_about_deuro": "Giới thiệu về dEURO",
"deuro_collect_interest": "Thu",
"deuro_reinvest_interest": "Tái đầu tư",
@@ -615,6 +617,7 @@
"memo": "Ghi chú",
"memo_disclaimer": "Ghi chú này sẽ hiển thị cho người nhận",
"memo_optional": "Ghi chú (tùy chọn)",
+ "memo_swap_disclaimer": "Người nhận yêu cầu ghi có tiền của bạn. Bản ghi nhớ bị thiếu hoặc sai có nghĩa là tiền bị mất.",
"message": "Tin nhắn",
"message_verified": "Tin nhắn đã được xác minh thành công",
"messages": "Tin nhắn",
@@ -1370,4 +1373,4 @@
"zcash_card_missing_funds": "Thiếu tiền?",
"zcash_card_scan": "Quét",
"zcash_card_warning": "Không đóng ứng dụng cho đến khi quy trình hoàn tất; nếu bạn làm vậy, quy trình này sẽ phải bắt đầu lại từ đầu."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb
index 29ebbe6c..2039dd57 100644
--- a/res/values/strings_yo.arb
+++ b/res/values/strings_yo.arb
@@ -308,6 +308,8 @@
"descending": "Sísọ̀kalẹ̀",
"description": "Apejuwe",
"destination_tag": "Ami ìbùdó:",
+ "destination_tag_optional": "Aami ibi-afẹde (aṣayan)",
+ "destination_tag_swap_disclaimer": "Ti beere lọwọ olugba lati gbese awọn owo rẹ. Sonu tabi ti ko tọ tag tumo si sọnu owo.",
"deuro_about_deuro": "Nipa dEURO",
"deuro_collect_interest": "Gba",
"deuro_reinvest_interest": "Tun fi èrè padà sí i",
@@ -617,6 +619,7 @@
"memo": "Àkọsílẹ̀",
"memo_disclaimer": "Akọsilẹ yii yoo han si olugba",
"memo_optional": "Akọsilẹ (aṣayan)",
+ "memo_swap_disclaimer": "Ti beere lọwọ olugba lati gbese awọn owo rẹ. Pipadanu tabi akọsilẹ aṣiṣe tumọ si awọn owo ti o sọnu.",
"message": "Ifiranṣẹ",
"message_verified": "A ti jẹrisi ifiranṣẹ naa ni aṣeyọri",
"messages": "Awọn ifiranṣẹ",
@@ -1374,4 +1377,4 @@
"zcash_card_missing_funds": "Ṣe owó rẹ sọnù?",
"zcash_card_scan": "Ṣàwárí",
"zcash_card_warning": "Maṣe pa ohun elo naa titi ilana naa yoo fi pari; bí o bá ṣe bẹ́ẹ̀, ilana yìí yóò ní láti tún bẹ̀rẹ̀ láti ìbẹ̀rẹ̀."
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb
index 766d7973..1691da60 100644
--- a/res/values/strings_zh.arb
+++ b/res/values/strings_zh.arb
@@ -308,6 +308,8 @@
"descending": "降序",
"description": "描述",
"destination_tag": "目标标签:",
+ "destination_tag_optional": "目的地标签(可选)",
+ "destination_tag_swap_disclaimer": "收款人要求存入您的资金。标签丢失或错误意味着资金损失。",
"deuro_about_deuro": "关于 dEURO",
"deuro_collect_interest": "领取",
"deuro_reinvest_interest": "再投资",
@@ -616,6 +618,7 @@
"memo": "备注",
"memo_disclaimer": "此备注将对接收方可见",
"memo_optional": "备注(可选)",
+ "memo_swap_disclaimer": "收款人要求存入您的资金。备忘录丢失或错误意味着资金损失。",
"message": "消息",
"message_verified": "消息已成功验证",
"messages": "消息",
@@ -1373,4 +1376,4 @@
"zcash_card_missing_funds": "资金不见了?",
"zcash_card_scan": "扫描",
"zcash_card_warning": "在该过程完成之前请勿关闭应用程序,否则该过程将需要从头重新开始。"
-}
+}
\ No newline at end of file
diff --git a/res/values/strings_zh_tw.arb b/res/values/strings_zh_tw.arb
index c85a7b64..dd920063 100644
--- a/res/values/strings_zh_tw.arb
+++ b/res/values/strings_zh_tw.arb
@@ -259,6 +259,8 @@
"descending": "降序",
"description": "描述",
"destination_tag": "目的地標籤:",
+ "destination_tag_optional": "目的地標籤(可選)",
+ "destination_tag_swap_disclaimer": "收款人要求存入您的資金。標籤丟失或錯誤意味著資金損失。",
"deuro_about_deuro": "關於 dEURO",
"deuro_collect_interest": "領取",
"deuro_reinvest_interest": "再投資",
@@ -523,6 +525,7 @@
"max_amount": "最大: ${value}",
"max_value": "最大值:${value} ${currency}",
"memo": "備註",
+ "memo_swap_disclaimer": "收款人要求存入您的資金。備忘錄丟失或錯誤意味著資金損失。",
"message": "訊息",
"message_verified": "訊息已成功驗證",
"messages": "訊息",
@@ -1177,4 +1180,4 @@
"youCanGoBackToYourDapp": "您現在可以返回您的 dApp",
"your": "您的",
"yy": "YY"
-}
+}
\ No newline at end of file
Why this scored 28/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.