CW-1523-AnyPay Redesign (#3383)

* feat: Add network selector and compatible networks screen to send page for EVMs * feat: add redesigned payanything flow and handle cases for evms, solana and tron * feat: adding the swap part to the entire flow * refactor: update navigation and error handling in send and swap flows * adjust structuring and use the chain badge icons, also fix crypto and currency values not consistent on single network picker * fix: modify guard for non-evm chains and minor cleanup * use multipicker layout for receive section, streamline send to available balances and adjust colors as needed * handle btc case for picker, update style and images across * fix all pending issues with scanning qr and network handling for both evm and non evm, plus token and amount resolving * fix all pending issues with scanning qr and network handling for both evm and non evm, plus token and amount resolving * fix: expand fetch for tokens across networks and fix other issues regarding scanning from homepage * auto-reformat * fix conflict * handle evm qr scan from homepage and add guards for swap and switch flows * chore: Cleanup * chore: set estimated fee to 0 when switching wallet * fix merge conflicts * fix to review comments and reformatting for lints * fix: root cause for token bug reported * chore: cleanup * feat: add improved anypay swap screen which focuses on the receive amount fix: fiat input toggle erro (also present on prod) reformat: anypay related widgets * feat: add alert for unsupported networks in payment requests * fix: prevent rate and provider from showing until amount is calculated and loaded fix: remove send icon in rate widget and align to center fix: adjust network badge in swap confirm widget * feat: embed tokens for solana and tron in QR generated for swap from external * test: add unit tests for Tron, Solana, and ERC681 URI handling and detection * fix: review comments * fix: handle more edgecases * feat: enhance ERC681URI to support raw token amounts and decimals * refactor: streamline EVM chain ID retrieval in send page and recipient network row * fix: minor review comments --------- Co-authored-by: Robert Malikowski <malikowskirobert@gmail.com>

David Adegoke committed Aug 11, 2026 at 01:16 UTC 90194f713680d505c62c7bbb1f4b14390baa12a1
69 files changed +4514 -2662
cw_core/lib/currency_for_wallet_type.dart
+45
@@ -111,3 +111,48 @@ String getCryptoCurrencyIconForWalletListItem(WalletType type,
111
112 return walletTypeToCryptoCurrency(type, isTestnet: isTestnet, chainId: chainId).iconPath ?? "";
113 }
114 +
115 +String? symbolIconPathForWalletType(WalletType type) {
116 + const prefix = "assets/new-ui/card_icons/symbol_icons";
117 + switch (type) {
118 + case WalletType.monero:
119 + return "$prefix/xmr-symbol.svg";
120 + case WalletType.bitcoin:
121 + return "$prefix/btc-symbol.svg";
122 + case WalletType.litecoin:
123 + return "$prefix/ltc-symbol.svg";
124 + case WalletType.ethereum:
125 + return "$prefix/eth-symbol.svg";
126 + case WalletType.base:
127 + return "$prefix/base-symbol.svg";
128 + case WalletType.arbitrum:
129 + return "$prefix/arb-symbol.svg";
130 + case WalletType.bsc:
131 + return "$prefix/bnb-symbol.svg";
132 + case WalletType.bitcoinCash:
133 + return "$prefix/bch-symbol.svg";
134 + case WalletType.polygon:
135 + return "$prefix/pol-symbol.svg";
136 + case WalletType.solana:
137 + return "$prefix/sol-symbol.svg";
138 + case WalletType.tron:
139 + return "$prefix/trx-symbol.svg";
140 + case WalletType.zano:
141 + return "$prefix/zano-symbol.svg";
142 + case WalletType.decred:
143 + return "$prefix/dcr-symbol.svg";
144 + case WalletType.dogecoin:
145 + return "$prefix/doge-symbol.svg";
146 + case WalletType.zcash:
147 + return "$prefix/zec-symbol.svg";
148 + case WalletType.nano:
149 + return "$prefix/xno-symbol.svg";
150 + case WalletType.wownero:
151 + case WalletType.haven:
152 + case WalletType.banano:
153 + case WalletType.none:
154 + return null;
155 + }
156 +}
157 +
158 +bool isMonochromeSymbolIcon(String path) => path.contains("/symbol_icons/");
cw_core/lib/payment_uris.dart
+39 -21
@@ -254,6 +254,8 @@ class ERC681URI extends PaymentURI {
254 required super.address,
255 required super.amount,
256 required this.contractAddress,
257 + this.tokenDecimals = 18,
258 + this.rawTokenAmount,
259 });
260
261 factory ERC681URI.fromUri(Uri uri) {
@@ -261,15 +263,31 @@ class ERC681URI extends PaymentURI {
263 final chainId = _getChainID(uri.path);
264
265 final address = isContract ? uri.queryParameters["address"] ?? "" : targetAddress;
264 - final amountParam = isContract ? uri.queryParameters["uint256"] : uri.queryParameters["value"];
266
267 var formatedAmount = "";
268 + String? rawTokenAmount;
269
268 - if (amountParam != null) {
269 - final normalized = _normalizeToIntegerWei(amountParam);
270 - formatedAmount = formatFixed(BigInt.parse(normalized), 18);
271 - } else {
270 + if (isContract) {
271 formatedAmount = uri.queryParameters["amount"] ?? "";
272 + final uint256Param = uri.queryParameters["uint256"];
273 + if (uint256Param != null) {
274 + final raw = uint256Param.replaceAll(",", ".").trim();
275 + if (!_scientificPattern.hasMatch(raw) && raw.contains(".")) {
276 + if (formatedAmount.isEmpty) {
277 + formatedAmount = raw;
278 + }
279 + } else {
280 + rawTokenAmount = _normalizeToIntegerWei(raw);
281 + }
282 + }
283 + } else {
284 + final valueParam = uri.queryParameters["value"];
285 + if (valueParam != null) {
286 + final normalized = _normalizeToIntegerWei(valueParam);
287 + formatedAmount = formatFixed(BigInt.parse(normalized), 18);
288 + } else {
289 + formatedAmount = uri.queryParameters["amount"] ?? "";
290 + }
291 }
292
293 return ERC681URI(
@@ -277,11 +295,16 @@ class ERC681URI extends PaymentURI {
295 address: address,
296 amount: formatedAmount,
297 contractAddress: isContract ? targetAddress : null,
298 + rawTokenAmount: rawTokenAmount,
299 );
300 }
301
302 final int chainId;
303 final String? contractAddress;
304 + final int tokenDecimals;
305 + final String? rawTokenAmount;
306 +
307 + static final RegExp _scientificPattern = RegExp(r"^[+-]?(\d+\.?\d*|\d*\.?\d+)[eE][+-]?\d+$");
308
309 @override
310 String toString() {
@@ -302,8 +325,17 @@ class ERC681URI extends PaymentURI {
325
326 if (contractAddress != null) {
327 params["address"] = address;
328 + // only emit an atomic uint256 when it is unambiguous, either stored raw or 18 decimals,
329 + // old app versions divide any uint256 by 1e18 so other tokens rely on the amount param
330 + final uint256 = rawTokenAmount ??
331 + (tokenDecimals == 18 && amount.isNotEmpty
332 + ? _expandDecimal(amount.replaceAll(",", "."), 18)
333 + : null);
334 + if (uint256 != null && uint256.isNotEmpty) {
335 + params["uint256"] = uint256;
336 + }
337 if (amount.isNotEmpty) {
306 - params["uint256"] = _formatAmountForERC20(amount);
338 + params["amount"] = amount.replaceAll(",", ".");
339 }
340 } else {
341 if (amount.isNotEmpty) {
@@ -318,19 +350,6 @@ class ERC681URI extends PaymentURI {
350 return uri;
351 }
352
321 - /// Formats amount for ERC-20 token transfers (in atomic units)
322 - String _formatAmountForERC20(String amount) {
323 - try {
324 - // Convert decimal amount to BigInt (assuming 18 decimals)
325 - final amountDouble = double.parse(amount.replaceAll(",", "."));
326 - final amountBigInt = BigInt.from(amountDouble * 1e18);
327 - return amountBigInt.toString();
328 - } catch (e) {
329 - // Fallback to original amount if parsing fails
330 - return amount.replaceAll(",", ".");
331 - }
332 - }
333 -
353 /// Formats amount for native ETH payments (in wei using scientific notation)
354 String _formatAmountForNative(String amount) {
355 try {
@@ -374,8 +393,7 @@ class ERC681URI extends PaymentURI {
393 }
394
395 // Then we check if it's a scientific notation
377 - final sci = RegExp(r"^[+-]?(\d+\.?\d*|\d*\.?\d+)[eE][+-]?\d+$");
378 - if (sci.hasMatch(raw)) {
396 + if (_scientificPattern.hasMatch(raw)) {
397 final mantissaStr = raw.toLowerCase().split("e")[0];
398 final exp = int.parse(raw.toLowerCase().split("e")[1]);
399 return _expandDecimal(mantissaStr, exp);
cw_core/test/payment_uris_test.dart new
+222
@@ -0,0 +1,222 @@
1 +import "package:cw_core/payment_uris.dart";
2 +import "package:flutter_test/flutter_test.dart";
3 +
4 +void main() {
5 + group("TronURI", () {
6 + const address = "TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL";
7 + const contract = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
8 +
9 + test("includes the TRC20 contract as the token param", () {
10 + final uri = TronURI(amount: "1.5", address: address, contractAddress: contract);
11 +
12 + expect(uri.toString(), "tron:$address?amount=1.5&token=$contract");
13 + });
14 +
15 + test("omits the token param for native TRX", () {
16 + final uri = TronURI(amount: "1.5", address: address);
17 +
18 + expect(uri.toString(), "tron:$address?amount=1.5");
19 + expect(uri.toString().contains("token="), false);
20 + });
21 +
22 + test("includes the token param when there is no amount", () {
23 + final uri = TronURI(amount: "", address: address, contractAddress: contract);
24 +
25 + expect(uri.toString(), "tron:$address?token=$contract");
26 + });
27 +
28 + test("converts a comma decimal separator in the amount", () {
29 + final uri = TronURI(amount: "1,5", address: address);
30 +
31 + expect(uri.toString(), "tron:$address?amount=1.5");
32 + });
33 +
34 + test("emits a bare address without amount or contract", () {
35 + final uri = TronURI(amount: "", address: address);
36 +
37 + expect(uri.toString(), "tron:$address");
38 + });
39 + });
40 +
41 + group("SolanaURI", () {
42 + const address = "4Nd1mYvNQyJ8BDVXLgkvSGpVdQMZ3hxwVFkfwXNq6Wgk";
43 + const mint = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB";
44 +
45 + test("includes the SPL mint as the spl-token param", () {
46 + final uri = SolanaURI(amount: "2", address: address, contractAddress: mint);
47 +
48 + expect(uri.toString(), "solana:$address?amount=2&spl-token=$mint");
49 + });
50 +
51 + test("omits the spl-token param for native SOL", () {
52 + final uri = SolanaURI(amount: "2", address: address);
53 +
54 + expect(uri.toString(), "solana:$address?amount=2");
55 + expect(uri.toString().contains("spl-token="), false);
56 + });
57 +
58 + test("includes the spl-token param when there is no amount", () {
59 + final uri = SolanaURI(amount: "", address: address, contractAddress: mint);
60 +
61 + expect(uri.toString(), "solana:$address?spl-token=$mint");
62 + });
63 +
64 + test("converts a comma decimal separator in the amount", () {
65 + final uri = SolanaURI(amount: "0,5", address: address);
66 +
67 + expect(uri.toString(), "solana:$address?amount=0.5");
68 + });
69 +
70 + test("emits a bare address without amount or mint", () {
71 + final uri = SolanaURI(amount: "", address: address);
72 +
73 + expect(uri.toString(), "solana:$address");
74 + });
75 + });
76 +
77 + group("ERC681URI", () {
78 + const recipient = "0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6";
79 + const contract = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
80 +
81 + test("builds a plain native transfer on mainnet", () {
82 + final uri = ERC681URI(chainId: 1, address: recipient, amount: "", contractAddress: null);
83 +
84 + expect(uri.toString(), "ethereum:$recipient");
85 + });
86 +
87 + test("appends the chainId for non-mainnet native transfers", () {
88 + final uri = ERC681URI(chainId: 137, address: recipient, amount: "", contractAddress: null);
89 +
90 + expect(uri.toString(), "ethereum:$recipient@137");
91 + });
92 +
93 + test("emits the native amount in ERC-681 scientific notation", () {
94 + final uri = ERC681URI(chainId: 1, address: recipient, amount: "1", contractAddress: null);
95 +
96 + expect(uri.toString(), "ethereum:$recipient?value=1.0e18");
97 + });
98 +
99 + test("builds the transfer form for a token", () {
100 + final uri =
101 + ERC681URI(chainId: 137, address: recipient, amount: "", contractAddress: contract);
102 +
103 + expect(uri.toString(), "ethereum:$contract@137/transfer?address=$recipient");
104 + });
105 +
106 + test("parses the transfer form back into recipient, contract and chainId", () {
107 + final parsed = ERC681URI.fromUri(
108 + Uri.parse("ethereum:$contract@1/transfer?address=$recipient&uint256=1000000"),
109 + );
110 +
111 + expect(parsed.address, recipient);
112 + expect(parsed.contractAddress, contract);
113 + expect(parsed.chainId, 1);
114 + expect(parsed.rawTokenAmount, "1000000");
115 + expect(parsed.amount, "");
116 + });
117 +
118 + test("keeps the uint256 raw so the caller can apply the token decimals", () {
119 + final parsed = ERC681URI.fromUri(
120 + Uri.parse(
121 + "ethereum:0xdAC17F958D2ee523a2206206994597C13D831ec7@1/transfer?address=$recipient&uint256=1000000",
122 + ),
123 + );
124 +
125 + expect(parsed.rawTokenAmount, "1000000");
126 + expect(parsed.amount, "");
127 + });
128 +
129 + test("prefers the amount param over the uint256 when both are present", () {
130 + final parsed = ERC681URI.fromUri(
131 + Uri.parse(
132 + "ethereum:$contract@1/transfer?address=$recipient&uint256=1000000000000000000&amount=1",
133 + ),
134 + );
135 +
136 + expect(parsed.amount, "1");
137 + expect(parsed.rawTokenAmount, "1000000000000000000");
138 + });
139 +
140 + test("treats a uint256 with a decimal point as a display amount", () {
141 + final parsed = ERC681URI.fromUri(
142 + Uri.parse("ethereum:$contract@1/transfer?address=$recipient&uint256=1.5"),
143 + );
144 +
145 + expect(parsed.amount, "1.5");
146 + expect(parsed.rawTokenAmount, null);
147 + });
148 +
149 + test("parses a native transfer with chainId", () {
150 + final parsed = ERC681URI.fromUri(
151 + Uri.parse("ethereum:$recipient@137?value=2000000000000000000"),
152 + );
153 +
154 + expect(parsed.address, recipient);
155 + expect(parsed.contractAddress, null);
156 + expect(parsed.chainId, 137);
157 + expect(parsed.amount, "2");
158 + });
159 +
160 + test("emits the uint256 and the amount param for an 18 decimal token", () {
161 + final uri =
162 + ERC681URI(chainId: 137, address: recipient, amount: "1", contractAddress: contract);
163 +
164 + expect(
165 + uri.toString(),
166 + "ethereum:$contract@137/transfer?address=$recipient&uint256=1000000000000000000&amount=1",
167 + );
168 + });
169 +
170 + test("omits the uint256 for tokens that do not use 18 decimals", () {
171 + final uri = ERC681URI(
172 + chainId: 137,
173 + address: recipient,
174 + amount: "1.5",
175 + contractAddress: contract,
176 + tokenDecimals: 6,
177 + );
178 +
179 + expect(uri.toString(), "ethereum:$contract@137/transfer?address=$recipient&amount=1.5");
180 + });
181 +
182 + test("emits a stored raw token amount verbatim", () {
183 + final uri = ERC681URI(
184 + chainId: 1,
185 + address: recipient,
186 + amount: "",
187 + contractAddress: contract,
188 + tokenDecimals: 6,
189 + rawTokenAmount: "1000000",
190 + );
191 +
192 + expect(uri.toString(), "ethereum:$contract/transfer?address=$recipient&uint256=1000000");
193 + });
194 +
195 + test("parses a scientific notation value", () {
196 + final parsed = ERC681URI.fromUri(
197 + Uri.parse("ethereum:$recipient@1?value=2.014e18"),
198 + );
199 +
200 + expect(parsed.amount, "2.014");
201 + });
202 +
203 + test("parses a Cake style amount param", () {
204 + final parsed = ERC681URI.fromUri(
205 + Uri.parse("ethereum:$recipient?amount=1.5"),
206 + );
207 +
208 + expect(parsed.address, recipient);
209 + expect(parsed.amount, "1.5");
210 + expect(parsed.chainId, 1);
211 + });
212 +
213 + test("defaults to mainnet when the chainId is absent", () {
214 + final parsed = ERC681URI.fromUri(Uri.parse("ethereum:$recipient"));
215 +
216 + expect(parsed.address, recipient);
217 + expect(parsed.contractAddress, null);
218 + expect(parsed.chainId, 1);
219 + expect(parsed.amount, "");
220 + });
221 + });
222 +}
lib/new-ui/pages/send_page.dart
+582 -285
@@ -1,19 +1,27 @@
1 +import "package:cake_wallet/core/address_resolver/address_resolver_service.dart";
2 import "package:cake_wallet/core/address_resolver/parsed_address.dart";
3 import "package:cake_wallet/core/address_validator.dart";
4 import "package:cake_wallet/core/auth_service.dart";
5 import "package:cake_wallet/core/execution_state.dart";
6 import "package:cake_wallet/core/open_crypto_pay/open_cryptopay_service.dart";
7 +import "package:cake_wallet/core/universal_address_detector.dart";
8 import "package:cake_wallet/di.dart";
9 import "package:cake_wallet/entities/contact_record.dart";
10 import "package:cake_wallet/entities/priority_for_wallet_type.dart";
11 import "package:cake_wallet/evm/evm.dart";
10 -import "package:cake_wallet/exchange/trade.dart";
12 import "package:cake_wallet/generated/i18n.dart";
13 import "package:cake_wallet/main.dart";
14 import "package:cake_wallet/monero/monero.dart";
15 import "package:cake_wallet/new-ui/modal_navigator.dart";
16 import "package:cake_wallet/new-ui/pages/coin_control_page.dart";
17 +import "package:cake_wallet/new-ui/pages/swap_page.dart";
18 import "package:cake_wallet/new-ui/widgets/animated_dropdown.dart";
19 +import "package:cake_wallet/new-ui/widgets/anypay/evm_address_detected_sheet.dart";
20 +import "package:cake_wallet/new-ui/widgets/anypay/recipient_network_row.dart";
21 +import "package:cake_wallet/new-ui/widgets/anypay/select_recipient_network_sheet.dart";
22 +import "package:cake_wallet/new-ui/widgets/anypay/send_to_network_page.dart";
23 +import "package:cake_wallet/new-ui/widgets/anypay/swap_from_network_page.dart";
24 +import "package:cake_wallet/new-ui/widgets/anypay/switch_network_wallet_page.dart";
25 import "package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_args.dart";
26 import "package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_sheet.dart";
27 import "package:cake_wallet/new-ui/widgets/currency_picker/fiat_currency_picker_sheet.dart";
@@ -32,22 +40,21 @@ import "package:cake_wallet/new-ui/widgets/send_page/send_amount_input.dart";
40 import "package:cake_wallet/new-ui/widgets/send_page/send_confirm_sheet.dart";
41 import "package:cake_wallet/new-ui/widgets/send_page/send_memo_input.dart";
42 import "package:cake_wallet/new-ui/widgets/send_page/send_syncing_indicator.dart";
43 +import "package:cake_wallet/new-ui/widgets/swap_page/swap_from_send_args.dart";
44 import "package:cake_wallet/reactions/wallet_connect.dart";
45 import "package:cake_wallet/routes.dart" show Routes;
46 import "package:cake_wallet/src/screens/connect_device/connect_device_page.dart";
47 import "package:cake_wallet/src/widgets/alert_with_one_action.dart";
48 import "package:cake_wallet/src/widgets/bottom_sheet/info_bottom_sheet_widget.dart";
40 -import "package:cake_wallet/src/widgets/bottom_sheet/payment_confirmation_bottom_sheet.dart";
41 -import "package:cake_wallet/src/widgets/bottom_sheet/swap_confirmation_bottom_sheet.dart";
42 -import "package:cake_wallet/src/widgets/bottom_sheet/token_selection_bottom_sheet.dart";
43 -import "package:cake_wallet/src/widgets/bottom_sheet/wallet_switcher_bottom_sheet.dart";
49 import "package:cake_wallet/src/widgets/cake_image_widget.dart";
50 import "package:cake_wallet/src/widgets/new_list_row/list_item_regular_row_widget.dart";
51 import "package:cake_wallet/src/widgets/standard_checkbox.dart";
52 import "package:cake_wallet/store/app_store.dart";
53 import "package:cake_wallet/utils/payment_request.dart";
54 import "package:cake_wallet/utils/show_pop_up.dart";
55 +import "package:cake_wallet/utils/token_utilities.dart";
56 import "package:cake_wallet/view_model/contact_list/contact_list_view_model.dart";
57 +import "package:cake_wallet/view_model/exchange/exchange_view_model.dart";
58 import "package:cake_wallet/view_model/payment/payment_view_model.dart";
59 import "package:cake_wallet/view_model/send/output.dart";
60 import "package:cake_wallet/view_model/send/send_view_model.dart";
@@ -56,7 +63,9 @@ import "package:cake_wallet/view_model/wallet_switcher_view_model.dart";
63 import "package:cw_core/amount/amount_sanitizer.dart";
64 import "package:cw_core/amount/money.dart";
65 import "package:cw_core/crypto_currency.dart";
66 +import "package:cw_core/currency_for_wallet_type.dart";
67 import "package:cw_core/lnurl.dart";
68 +import "package:cw_core/payment_uris.dart";
69 import "package:cw_core/transaction_priority.dart";
70 import "package:cw_core/unspent_coin_type.dart";
71 import "package:cw_core/utils/print_verbose.dart";
@@ -236,42 +245,66 @@ class _NewSendPageState extends State<NewSendPage> {
245 }
246 });
247
239 - if (widget.initialPaymentRequest != null &&
240 - widget.sendViewModel.walletCurrencyName ==
241 - widget.initialPaymentRequest!.scheme.toLowerCase()) {
242 - _addressControllers[0].text = widget.initialPaymentRequest!.address;
243 - _amountControllers[0].text = widget.initialPaymentRequest!.amount;
244 - // _memoControllers[0].text = widget.initialPaymentRequest!.note;
245 - _applyNote(widget.initialPaymentRequest!.note, 0);
246 -
247 - final contractAddress = widget.initialPaymentRequest!.contractAddress;
248 - if (contractAddress != null && contractAddress.isNotEmpty) {
249 - WidgetsBinding.instance.addPostFrameCallback((_) {
250 - if (mounted) {
251 - widget.sendViewModel.fetchTokenForContractAddress(contractAddress);
252 - }
253 - });
254 - }
255 - }
248 + if (widget.initialPaymentRequest != null) {
249 + if (_isInitialRequestTypeSameAsCurrentWallet()) {
250 + _addressControllers[0].text = widget.initialPaymentRequest!.address;
251 + // _memoControllers[0].text = widget.initialPaymentRequest!.note;
252 + _applyNote(widget.initialPaymentRequest!.note, 0);
253 + final contractAddress = widget.initialPaymentRequest!.contractAddress;
254 + if (contractAddress != null && contractAddress.isNotEmpty) {
255 + WidgetsBinding.instance.addPostFrameCallback((_) async {
256 + if (!mounted) {
257 + return;
258 + }
259 + final token = await TokenUtilities.findTokenByAddress(
260 + walletType: widget.sendViewModel.wallet.type,
261 + address: contractAddress,
262 + );
263 + if (!mounted) {
264 + return;
265 + }
266
257 - /// if the current wallet doesn't match the one in the qr code
258 - if (widget.initialPaymentRequest != null &&
259 - widget.sendViewModel.walletCurrencyName !=
260 - widget.initialPaymentRequest!.scheme.toLowerCase()) {
261 - WidgetsBinding.instance.addPostFrameCallback(
262 - (timeStamp) {
263 - if (mounted) {
264 - final prefix = widget.initialPaymentRequest!.scheme.isNotEmpty
265 - ? "${widget.initialPaymentRequest!.scheme}:"
266 - : "";
267 - final amount = widget.initialPaymentRequest!.amount.isNotEmpty
268 - ? "?amount=${widget.initialPaymentRequest!.amount}"
269 - : "";
270 - final uri = prefix + widget.initialPaymentRequest!.address + amount;
271 - _handlePaymentFlow(uri, widget.initialPaymentRequest!);
272 - }
273 - },
274 - );
267 + if (token == null) {
268 + _showUnsupportedTokenAlert();
269 + return;
270 + }
271 + await widget.sendViewModel.fetchTokenForContractAddress(contractAddress);
272 + if (!mounted) {
273 + return;
274 + }
275 + _amountControllers[0].text =
276 + widget.initialPaymentRequest!.resolveTokenAmount(token) ?? "";
277 + });
278 + } else {
279 + _amountControllers[0].text = widget.initialPaymentRequest!.amount;
280 + }
281 + } else {
282 + WidgetsBinding.instance.addPostFrameCallback(
283 + (timeStamp) {
284 + if (mounted) {
285 + final paymentRequest = widget.initialPaymentRequest!;
286 + final scheme = paymentRequest.scheme.toLowerCase();
287 + final String uri;
288 + if (scheme.isEmpty || scheme == "lightning") {
289 + uri = paymentRequest.address;
290 + } else if (scheme == "ethereum") {
291 + uri = ERC681URI(
292 + address: paymentRequest.address,
293 + amount: paymentRequest.amount,
294 + contractAddress: paymentRequest.contractAddress,
295 + chainId: paymentRequest.chainId ?? _currentEvmChainIdOrMainnet(),
296 + rawTokenAmount: paymentRequest.rawTokenAmount,
297 + ).toString();
298 + } else {
299 + final amount =
300 + paymentRequest.amount.isNotEmpty ? "?amount=${paymentRequest.amount}" : "";
301 + uri = "${paymentRequest.scheme}:${paymentRequest.address}$amount";
302 + }
303 + _handlePaymentFlow(uri, paymentRequest);
304 + }
305 + },
306 + );
307 + }
308 }
309
310 _addressFocusNode.addListener(() async {
@@ -480,6 +513,12 @@ class _NewSendPageState extends State<NewSendPage> {
513 selectedCurrency:
514 widget.sendViewModel.selectedCryptoCurrency,
515 ),
516 + if (widget.sendViewModel.isEVMWallet &&
517 + _hasEvmRecipient(output))
518 + RecipientNetworkSelector(
519 + wallet: widget.sendViewModel.wallet,
520 + onTap: _presentRecipientNetworkPicker,
521 + ),
522 ],
523 ),
524 Column(
@@ -943,6 +982,7 @@ class _NewSendPageState extends State<NewSendPage> {
982 selected: widget.sendViewModel.selectedCryptoCurrency,
983 filterByNetwork: widget.sendViewModel.walletType,
984 balanceByAsset: balanceByAsset,
985 + useSingleNetworkLayout: true,
986 symbolResolver: widget.sendViewModel.amountParsingProxy.getCryptoSymbol,
987 onSelected: (currency) {
988 widget.sendViewModel.selectedCryptoCurrency = currency;
@@ -963,8 +1003,101 @@ class _NewSendPageState extends State<NewSendPage> {
1003 } catch (_) {}
1004 }
1005
1006 + static final RegExp _evmAddressRegExp = RegExp(r"^0x[0-9a-fA-F]{40}$");
1007 +
1008 + bool _hasEvmRecipient(Output output) {
1009 + final address = output.isParsedAddress ? output.extractedAddress : output.address;
1010 + return _evmAddressRegExp.hasMatch(address.trim());
1011 + }
1012 +
1013 + Future<void> _presentRecipientNetworkPicker(ChainInfo currentChain) async {
1014 + if (evm == null) {
1015 + return;
1016 + }
1017 +
1018 + final chains = evm!.getAllChains();
1019 + final networks = chains.map((chain) {
1020 + final walletType =
1021 + evm!.getWalletTypeByChainId(chain.chainId) ?? widget.sendViewModel.wallet.type;
1022 + return RecipientNetworkItem(
1023 + chainId: chain.chainId,
1024 + name: chain.name,
1025 + iconPath: symbolIconPathForWalletType(walletType) ?? "",
1026 + );
1027 + }).toList();
1028 +
1029 + final selectedChainId = await SelectRecipientNetworkSheet.show(
1030 + context: context,
1031 + networks: networks,
1032 + currentChainId: currentChain.chainId,
1033 + );
1034 +
1035 + if (selectedChainId == null || selectedChainId == currentChain.chainId) {
1036 + return;
1037 + }
1038 +
1039 + final target = chains.firstWhere(
1040 + (chain) => chain.chainId == selectedChainId,
1041 + orElse: () => currentChain,
1042 + );
1043 + if (target.chainId == currentChain.chainId) {
1044 + return;
1045 + }
1046 +
1047 + await _handleManualNetworkSelection(target);
1048 + }
1049 +
1050 + Future<void> _handleManualNetworkSelection(ChainInfo target) async {
1051 + final address = _addressControllers[_selectedOutput].text.trim();
1052 + final amount = _amountControllers[_selectedOutput].text;
1053 + final note = _memoControllers[_selectedOutput].text;
1054 + final paymentRequest = PaymentRequest(address, amount, note, "", null);
1055 + await _handleEvmNetworkFlow(target, paymentRequest);
1056 + }
1057 +
1058 + bool _isInitialRequestTypeSameAsCurrentWallet() {
1059 + final req = widget.initialPaymentRequest;
1060 + if (req == null) {
1061 + return false;
1062 + }
1063 +
1064 + final currentType = widget.sendViewModel.wallet.type;
1065 + if (evm != null && isEVMCompatibleChain(currentType)) {
1066 + final targetChainId = _evmTargetChainId(req);
1067 + if (targetChainId != null) {
1068 + return targetChainId == _currentEvmChainIdOrMainnet();
1069 + }
1070 + }
1071 + return widget.sendViewModel.walletCurrencyName == req.scheme.toLowerCase();
1072 + }
1073 +
1074 + int? _evmTargetChainId(PaymentRequest req) {
1075 + final scheme = req.scheme.toLowerCase();
1076 + if (scheme == "ethereum") {
1077 + if (req.chainId != null) {
1078 + return req.chainId;
1079 + }
1080 +
1081 + return _currentEvmChainIdOrMainnet();
1082 + }
1083 + try {
1084 + return getChainIdByCryptoCurrency(CryptoCurrency.fromString(scheme));
1085 + } catch (_) {
1086 + return null;
1087 + }
1088 + }
1089 +
1090 + int _currentEvmChainIdOrMainnet() {
1091 + final wallet = widget.sendViewModel.wallet;
1092 + if (evm != null && isEVMCompatibleChain(wallet.type)) {
1093 + return evm!.getSelectedChainId(wallet) ?? evm!.getChainIdByWalletType(wallet.type);
1094 + }
1095 + return 1;
1096 + }
1097 +
1098 Future<void> _handlePaymentFlow(String uri, PaymentRequest paymentRequest) async {
967 - if (uri.contains("@") || paymentRequest.address.contains("@")) {
1099 + final isEip681 = uri.toLowerCase().startsWith("ethereum:");
1100 + if (!isEip681 && (uri.contains("@") || paymentRequest.address.contains("@"))) {
1101 return;
1102 }
1103
@@ -1003,29 +1136,36 @@ class _NewSendPageState extends State<NewSendPage> {
1136 );
1137 break;
1138 case PaymentFlowType.evmNetworkSelection:
1006 - await _showTokenSelectionFlow(
1007 - widget.paymentViewModel,
1008 - widget.walletSwitcherViewModel,
1009 - paymentRequest,
1010 - fixedNetwork: result.walletType,
1011 - );
1139 + if (result.chainId != null && evm!.getChainInfoByChainId(result.chainId!) == null) {
1140 + _showUnsupportedNetworkAlert(result.chainId!);
1141 + return;
1142 + }
1143 +
1144 + final targetChainId =
1145 + paymentRequest.scheme.isNotEmpty ? _evmTargetChainId(paymentRequest) : null;
1146 + final targetChain =
1147 + targetChainId != null ? evm!.getChainInfoByChainId(targetChainId) : null;
1148 + final currentChainId = isEVMCompatibleChain(widget.sendViewModel.wallet.type)
1149 + ? _currentEvmChainIdOrMainnet()
1150 + : null;
1151 + final isCrossChain = targetChain != null && targetChain.chainId != currentChainId;
1152 +
1153 + if (isCrossChain) {
1154 + await _handleEvmNetworkFlow(targetChain, paymentRequest);
1155 + } else if (widget.sendViewModel.isEVMWallet) {
1156 + _applyPaymentRequest(paymentRequest);
1157 + } else {
1158 + await _showEvmNetworkPicker(paymentRequest, result.walletType);
1159 + }
1160 break;
1161 case PaymentFlowType.solanaTokenSelection:
1014 - await _showTokenSelectionFlow(
1015 - widget.paymentViewModel,
1016 - widget.walletSwitcherViewModel,
1017 - paymentRequest,
1018 - fixedNetwork: WalletType.solana,
1019 - );
1020 - break;
1162 case PaymentFlowType.tronTokenSelection:
1022 - await _showTokenSelectionFlow(
1163 + await _showPaymentConfirmation(
1164 widget.paymentViewModel,
1165 widget.walletSwitcherViewModel,
1166 paymentRequest,
1026 - fixedNetwork: WalletType.tron,
1167 + result,
1168 );
1028 -
1169 break;
1170 case PaymentFlowType.currentWalletCompatible:
1171 case PaymentFlowType.error:
@@ -1039,287 +1179,391 @@ class _NewSendPageState extends State<NewSendPage> {
1179 }
1180 }
1181
1042 - Future<void> _showPaymentConfirmation(
1043 - PaymentViewModel paymentViewModel,
1044 - WalletSwitcherViewModel walletSwitcherViewModel,
1045 - PaymentRequest paymentRequest,
1046 - PaymentFlowResult result,
1047 - ) async {
1048 - if (!context.mounted) {
1182 + void _showUnsupportedNetworkAlert(int chainId) {
1183 + if (!mounted) {
1184 return;
1185 }
1186
1052 - await showModalBottomSheet<void>(
1187 + showPopUp<void>(
1188 context: context,
1054 - isDismissible: true,
1055 - isScrollControlled: true,
1056 - builder: (context) => PaymentConfirmationBottomSheet(
1057 - paymentFlowResult: result,
1058 - paymentViewModel: paymentViewModel,
1059 - walletSwitcherViewModel: walletSwitcherViewModel,
1060 - paymentRequest: paymentRequest,
1061 - onSelectWallet: () => _handleSelectWallet(
1062 - paymentViewModel,
1063 - walletSwitcherViewModel,
1064 - paymentRequest,
1065 - result,
1066 - ),
1067 - onChangeWallet: () => _handleChangeWallet(
1068 - paymentViewModel,
1069 - walletSwitcherViewModel,
1070 - paymentRequest,
1071 - result,
1072 - ),
1073 - onSwap: (bottomSheetContext) =>
1074 - _handleSwapFlow(paymentViewModel, result, bottomSheetContext),
1075 - onSwitchNetwork: () => _handleSwitchNetwork(
1076 - paymentViewModel,
1077 - walletSwitcherViewModel,
1078 - paymentRequest,
1079 - result,
1080 - ),
1189 + builder: (context) => AlertWithOneAction(
1190 + alertTitle: S.of(context).error,
1191 + alertContent: S.of(context).unsupported_network_requested(chainId.toString()),
1192 + buttonText: S.of(context).ok,
1193 + buttonAction: () => Navigator.of(context).pop(),
1194 ),
1195 );
1196 }
1197
1085 - Future<void> _showTokenSelectionFlow(
1198 + Future<void> _showPaymentConfirmation(
1199 PaymentViewModel paymentViewModel,
1200 WalletSwitcherViewModel walletSwitcherViewModel,
1088 - PaymentRequest paymentRequest, {
1089 - WalletType? fixedNetwork,
1090 - }) async {
1091 - if (!context.mounted) {
1201 + PaymentRequest paymentRequest,
1202 + PaymentFlowResult result,
1203 + ) async {
1204 + if (!mounted || result.walletType == null) {
1205 return;
1206 }
1207
1095 - await showModalBottomSheet<void>(
1096 - context: context,
1097 - isDismissible: true,
1098 - isScrollControlled: true,
1099 - builder: (context) => TokenSelectionBottomSheet(
1100 - paymentViewModel: paymentViewModel,
1101 - paymentRequest: paymentRequest,
1102 - fixedNetwork: fixedNetwork,
1103 - onNext: (newResult) {
1104 - final selectedChainId = newResult.chainId;
1105 - final isCompatible =
1106 - selectedChainId == evm?.getSelectedChainId(widget.sendViewModel.wallet);
1107 -
1108 - if (isCompatible) {
1109 - widget.sendViewModel.setSelectedCryptoCurrency(
1110 - newResult.addressDetectionResult!.detectedCurrency!.title,
1111 - );
1112 - _applyPaymentRequest(paymentRequest);
1113 - } else {
1114 - _showPaymentConfirmation(
1115 - paymentViewModel,
1116 - walletSwitcherViewModel,
1208 + final destinationType = result.walletType!;
1209 + final isEvmTarget = isEVMCompatibleChain(destinationType);
1210 + final destinationChainId = result.chainId;
1211 + final destinationNetworkName = networkDisplayName(destinationType, destinationChainId);
1212 + final destinationNetworkIcon = symbolIconPathForWalletType(destinationType) ?? "";
1213 +
1214 + final currentType = widget.sendViewModel.wallet.type;
1215 + final currentChainId =
1216 + isEVMCompatibleChain(currentType) && evm != null ? _currentEvmChainIdOrMainnet() : null;
1217 + final currentNetworkName = networkDisplayName(currentType, currentChainId);
1218 + final currentNetworkIcon = symbolIconPathForWalletType(currentType) ?? "";
1219 +
1220 + final hasSingleWallet =
1221 + result.type == PaymentFlowType.singleWallet || result.wallets.length == 1;
1222 + final hasMultipleWallets =
1223 + result.type == PaymentFlowType.multipleWallets || result.wallets.length > 1;
1224 + final hasWallet = hasSingleWallet || hasMultipleWallets || result.wallet != null;
1225 +
1226 + final decisionTitle = isEvmTarget
1227 + ? S.of(context).send_to_network(destinationNetworkName)
1228 + : S.of(context).network_address_detected(destinationNetworkName);
1229 + final swapConfirmTitle = isEvmTarget
1230 + ? S.of(context).swap_from_network(currentNetworkName)
1231 + : S.of(context).network_address_detected(destinationNetworkName);
1232 + final swapConfirmPrimary = isEvmTarget
1233 + ? S.of(context).continue_to_swap
1234 + : S.of(context).swap_from_network(currentNetworkName);
1235 +
1236 + if (hasWallet) {
1237 + await Navigator.of(context).push<void>(
1238 + CupertinoPageRoute(
1239 + builder: (pageContext) => SendToNetworkPage(
1240 + title: decisionTitle,
1241 + destinationNetworkName: destinationNetworkName,
1242 + destinationIconPath: destinationNetworkIcon,
1243 + currentNetworkName: currentNetworkName,
1244 + onSwitchWallet: () => _onSwitchWalletSelected(
1245 + pageContext,
1246 + result,
1247 paymentRequest,
1118 - newResult,
1119 - );
1120 - }
1121 - },
1122 - ),
1123 - );
1248 + destinationNetworkName,
1249 + destinationNetworkIcon,
1250 + hasMultipleWallets,
1251 + ),
1252 + onSwap: () => _onSwapSelected(pageContext, result, paymentRequest),
1253 + ),
1254 + ),
1255 + );
1256 + } else {
1257 + await Navigator.of(context).push<void>(
1258 + CupertinoPageRoute(
1259 + builder: (pageContext) => SwapFromNetworkPage(
1260 + title: swapConfirmTitle,
1261 + primaryButtonText: swapConfirmPrimary,
1262 + primaryHasSwapIcon: !isEvmTarget,
1263 + destinationNetworkName: destinationNetworkName,
1264 + destinationNetworkIconPath: destinationNetworkIcon,
1265 + currentNetworkName: currentNetworkName,
1266 + currentNetworkIconPath: currentNetworkIcon,
1267 + onProceed: () => _onSwapSelected(pageContext, result, paymentRequest),
1268 + ),
1269 + ),
1270 + );
1271 + }
1272 }
1273
1126 - Future<void> _handleSelectWallet(
1127 - PaymentViewModel paymentViewModel,
1128 - WalletSwitcherViewModel walletSwitcherViewModel,
1274 + Future<void> _onSwapSelected(
1275 + BuildContext pageContext,
1276 + PaymentFlowResult result,
1277 PaymentRequest paymentRequest,
1278 + ) async {
1279 + await _handleSwapFlow(result, pageContext, paymentRequest);
1280 + }
1281 +
1282 + Future<void> _onSwitchWalletSelected(
1283 + BuildContext pageContext,
1284 PaymentFlowResult result,
1285 + PaymentRequest paymentRequest,
1286 + String destName,
1287 + String destIcon,
1288 + bool hasMultipleWallets,
1289 ) async {
1132 - Navigator.of(context).pop();
1290 + WalletInfo? destinationWalletInfo;
1291 + if (hasMultipleWallets) {
1292 + destinationWalletInfo = await SwitchNetworkWalletPage.push(
1293 + context: pageContext,
1294 + networkName: destName,
1295 + targetIconPath: destIcon,
1296 + wallets: result.wallets,
1297 + );
1298 + if (destinationWalletInfo == null) {
1299 + return;
1300 + }
1301 + } else {
1302 + destinationWalletInfo =
1303 + result.wallet ?? (result.wallets.isNotEmpty ? result.wallets.first : null);
1304 + }
1305
1134 - await showModalBottomSheet<WalletInfo>(
1135 - context: context,
1136 - isDismissible: true,
1137 - isScrollControlled: true,
1138 - builder: (dialogContext) => WalletSwitcherBottomSheet(
1139 - viewModel: walletSwitcherViewModel,
1140 - filterWalletType: paymentViewModel.detectedWalletType,
1141 - ),
1142 - );
1306 + if (destinationWalletInfo == null) {
1307 + return;
1308 + }
1309
1144 - final success = await walletSwitcherViewModel.switchToSelectedWallet();
1310 + // We may have awaited the wallet picker above, so make sure the decision page
1311 + // is still around before we reach into its navigator.
1312 + if (!pageContext.mounted) {
1313 + return;
1314 + }
1315 + if (Navigator.of(pageContext).canPop()) {
1316 + Navigator.of(pageContext).pop();
1317 + }
1318 + if (!mounted) {
1319 + return;
1320 + }
1321 + await _completeWalletSwitch(destinationWalletInfo, result, paymentRequest);
1322 + }
1323
1146 - if (success) {
1147 - if (isEVMCompatibleChain(widget.sendViewModel.wallet.type) && result.chainId != null) {
1148 - final appStore = getIt.get<AppStore>();
1149 - final node = appStore.settingsStore.getCurrentNode(
1150 - widget.sendViewModel.wallet.type,
1151 - chainId: result.chainId,
1152 - );
1153 - await evm!.selectChain(widget.sendViewModel.wallet, result.chainId!, node: node);
1324 + Future<void> _applyPaymentSelectingCurrency(
1325 + PaymentRequest paymentRequest,
1326 + CryptoCurrency? fallbackCurrency,
1327 + ) async {
1328 + String? amountOverride;
1329 + final contract = paymentRequest.contractAddress;
1330 + if (contract != null && contract.isNotEmpty) {
1331 + final token = await TokenUtilities.findTokenByAddress(
1332 + walletType: widget.sendViewModel.wallet.type,
1333 + address: contract,
1334 + );
1335 + if (!mounted) {
1336 + return;
1337 }
1338
1156 - await widget.sendViewModel.wallet.updateBalance();
1157 -
1158 - final detectedCurrency = result.addressDetectionResult!.detectedCurrency;
1159 - if (detectedCurrency != null) {
1160 - widget.sendViewModel.setSelectedCryptoCurrency(detectedCurrency.title);
1339 + if (token == null) {
1340 + _showUnsupportedTokenAlert();
1341 + return;
1342 }
1162 -
1163 - _applyPaymentRequest(paymentRequest);
1343 + await widget.sendViewModel.fetchTokenForContractAddress(contract);
1344 + amountOverride = paymentRequest.resolveTokenAmount(token);
1345 + } else if (fallbackCurrency != null) {
1346 + widget.sendViewModel.setSelectedCryptoCurrency(fallbackCurrency.title);
1347 + }
1348 + if (!mounted) {
1349 + return;
1350 }
1351 + _applyPaymentRequest(paymentRequest, amountOverride: amountOverride);
1352 }
1353
1167 - Future<void> _handleChangeWallet(
1168 - PaymentViewModel paymentViewModel,
1169 - WalletSwitcherViewModel walletSwitcherViewModel,
1170 - PaymentRequest paymentRequest,
1354 + Future<void> _completeWalletSwitch(
1355 + WalletInfo wallet,
1356 PaymentFlowResult result,
1357 + PaymentRequest paymentRequest,
1358 ) async {
1173 - if (mounted && Navigator.of(context).canPop()) {
1174 - Navigator.of(context).pop();
1359 + widget.walletSwitcherViewModel.selectWallet(wallet);
1360 + final success = await widget.walletSwitcherViewModel.switchToSelectedWallet();
1361 + if (!success) {
1362 + _showNetworkSwitchFailedAlert();
1363 + return;
1364 + }
1365 + if (!mounted) {
1366 + return;
1367 }
1368
1177 - if (result.type == PaymentFlowType.singleWallet && result.wallet != null) {
1178 - walletSwitcherViewModel.selectWallet(result.wallet!);
1179 - final success = await walletSwitcherViewModel.switchToSelectedWallet();
1180 - if (success) {
1181 - WidgetsBinding.instance.addPostFrameCallback((_) {
1182 - if (mounted) {
1183 - showModalBottomSheet<void>(
1184 - context: context,
1185 - isDismissible: false,
1186 - builder: (context) {
1187 - loadingBottomSheetContext = context;
1188 - return LoadingBottomSheet(
1189 - titleText: S.of(context).loading_your_wallet,
1190 - );
1191 - },
1192 - );
1369 + bool completedFlow = false;
1370 + WidgetsBinding.instance.addPostFrameCallback((_) {
1371 + if (!mounted || completedFlow) {
1372 + return;
1373 + }
1374 + showModalBottomSheet<void>(
1375 + context: context,
1376 + isDismissible: false,
1377 + builder: (BuildContext sheetContext) {
1378 + if (completedFlow) {
1379 + WidgetsBinding.instance.addPostFrameCallback((_) {
1380 + if (Navigator.canPop(sheetContext)) {
1381 + Navigator.of(sheetContext).pop();
1382 + }
1383 + });
1384 + return const SizedBox.shrink();
1385 }
1194 - });
1195 -
1196 - // If EVM wallet and chainId is specified, switch to that chain
1197 - if (isEVMCompatibleChain(widget.sendViewModel.wallet.type) && result.chainId != null) {
1198 - final appStore = getIt.get<AppStore>();
1199 - final node = appStore.settingsStore.getCurrentNode(
1200 - widget.sendViewModel.wallet.type,
1201 - chainId: result.chainId,
1202 - );
1203 - await evm!.selectChain(widget.sendViewModel.wallet, result.chainId!, node: node);
1204 - }
1386 + loadingBottomSheetContext = sheetContext;
1387 + return LoadingBottomSheet(titleText: S.of(sheetContext).loading_your_wallet);
1388 + },
1389 + );
1390 + });
1391
1206 - await Future.delayed(const Duration(seconds: 2));
1207 - if (loadingBottomSheetContext != null &&
1208 - loadingBottomSheetContext!.mounted &&
1209 - Navigator.canPop(loadingBottomSheetContext!)) {
1210 - Navigator.of(loadingBottomSheetContext!).pop();
1211 - }
1392 + bool chainSwitchFailed = false;
1393 + try {
1394 + if (evm != null &&
1395 + isEVMCompatibleChain(widget.sendViewModel.wallet.type) &&
1396 + result.chainId != null) {
1397 + final appStore = getIt.get<AppStore>();
1398 + final node = appStore.settingsStore
1399 + .getCurrentNode(widget.sendViewModel.wallet.type, chainId: result.chainId);
1400 + await evm!.selectChain(widget.sendViewModel.wallet, result.chainId!, node: node);
1401 + }
1402 + } catch (e, s) {
1403 + chainSwitchFailed = true;
1404 + printV("completeWalletSwitch failed: $e\n$s");
1405 + }
1406
1407 + if (!chainSwitchFailed) {
1408 + try {
1409 await widget.sendViewModel.wallet.updateBalance();
1214 - widget.sendViewModel
1215 - .setSelectedCryptoCurrency(result.addressDetectionResult!.detectedCurrency!.title);
1216 - _applyPaymentRequest(paymentRequest);
1410 + } catch (e) {
1411 + printV("balance refresh after network switch failed: $e");
1412 }
1218 - } else if (result.wallets.isNotEmpty && result.wallets.length == 1) {
1219 - walletSwitcherViewModel.selectWallet(result.wallets.first);
1220 - final success = await walletSwitcherViewModel.switchToSelectedWallet();
1221 - if (success) {
1222 - WidgetsBinding.instance.addPostFrameCallback((_) {
1223 - if (context.mounted) {
1224 - showModalBottomSheet<void>(
1225 - context: context,
1226 - isDismissible: false,
1227 - builder: (context) {
1228 - loadingBottomSheetContext = context;
1229 - return LoadingBottomSheet(
1230 - titleText: S.of(context).loading_your_wallet,
1231 - );
1232 - },
1233 - );
1234 - }
1235 - });
1236 -
1237 - // If EVM wallet and chainId is specified, switch to that chain
1238 - if (isEVMCompatibleChain(widget.sendViewModel.wallet.type) && result.chainId != null) {
1239 - final appStore = getIt.get<AppStore>();
1240 - final node = appStore.settingsStore.getCurrentNode(
1241 - widget.sendViewModel.wallet.type,
1242 - chainId: result.chainId,
1243 - );
1244 - await evm!.selectChain(widget.sendViewModel.wallet, result.chainId!, node: node);
1245 - }
1413 + }
1414
1247 - await Future.delayed(const Duration(seconds: 2));
1248 - if (loadingBottomSheetContext != null && loadingBottomSheetContext!.mounted) {
1249 - Navigator.of(loadingBottomSheetContext!).pop();
1250 - }
1415 + completedFlow = true;
1416 + if (loadingBottomSheetContext != null &&
1417 + loadingBottomSheetContext!.mounted &&
1418 + Navigator.canPop(loadingBottomSheetContext!)) {
1419 + Navigator.of(loadingBottomSheetContext!).pop();
1420 + }
1421 + loadingBottomSheetContext = null;
1422
1252 - await widget.sendViewModel.wallet.updateBalance();
1253 - widget.sendViewModel
1254 - .setSelectedCryptoCurrency(result.addressDetectionResult!.detectedCurrency!.title);
1255 - _applyPaymentRequest(paymentRequest);
1256 - }
1423 + if (!mounted) {
1424 + return;
1425 }
1426 +
1427 + if (chainSwitchFailed) {
1428 + _showNetworkSwitchFailedAlert();
1429 + return;
1430 + }
1431 +
1432 + await _applyPaymentSelectingCurrency(
1433 + paymentRequest,
1434 + result.addressDetectionResult?.detectedCurrency,
1435 + );
1436 }
1437
1260 - Future<void> _handleSwitchNetwork(
1261 - PaymentViewModel paymentViewModel,
1262 - WalletSwitcherViewModel walletSwitcherViewModel,
1438 + void _showNetworkSwitchFailedAlert() {
1439 + if (!mounted) {
1440 + return;
1441 + }
1442 +
1443 + showPopUp<void>(
1444 + context: context,
1445 + builder: (context) => AlertWithOneAction(
1446 + alertTitle: S.of(context).error,
1447 + alertContent: S.of(context).network_switch_failed,
1448 + buttonText: S.of(context).ok,
1449 + buttonAction: () => Navigator.of(context).pop(),
1450 + ),
1451 + );
1452 + }
1453 +
1454 + void _showUnsupportedTokenAlert() {
1455 + if (!mounted) {
1456 + return;
1457 + }
1458 +
1459 + showPopUp<void>(
1460 + context: context,
1461 + builder: (context) => AlertWithOneAction(
1462 + alertTitle: S.of(context).error,
1463 + alertContent: S.of(context).unsupported_token_requested,
1464 + buttonText: S.of(context).ok,
1465 + buttonAction: () => Navigator.of(context).pop(),
1466 + ),
1467 + );
1468 + }
1469 +
1470 + Future<void> _showEvmNetworkPicker(
1471 PaymentRequest paymentRequest,
1264 - PaymentFlowResult result,
1472 + WalletType? fixedNetwork,
1473 ) async {
1266 - if (result.type != PaymentFlowType.evmNetworkSelection || result.wallet == null) {
1474 + if (!mounted || evm == null || fixedNetwork == null || !isEVMCompatibleChain(fixedNetwork)) {
1475 return;
1476 }
1477
1270 - if (context.mounted && Navigator.of(context).canPop()) {
1271 - Navigator.of(context).pop();
1478 + final chains = evm!.getAllChains();
1479 + final networks = chains.map((chain) {
1480 + final walletType = evm!.getWalletTypeByChainId(chain.chainId) ?? fixedNetwork;
1481 + return RecipientNetworkItem(
1482 + chainId: chain.chainId,
1483 + name: chain.name,
1484 + iconPath: getCryptoCurrencyIconForWalletListItem(walletType, chainId: chain.chainId),
1485 + chainBadgeIconPath: symbolIconPathForWalletType(walletType),
1486 + );
1487 + }).toList();
1488 +
1489 + final selectedChainId =
1490 + await EvmAddressDetectedSheet.show(context: context, networks: networks);
1491 + if (!mounted || selectedChainId == null) {
1492 + return;
1493 }
1494
1274 - try {
1275 - WidgetsBinding.instance.addPostFrameCallback((_) {
1276 - if (context.mounted) {
1277 - showModalBottomSheet<void>(
1278 - context: context,
1279 - isDismissible: false,
1280 - builder: (context) {
1281 - loadingBottomSheetContext = context;
1282 - return LoadingBottomSheet(titleText: S.of(context).loading_your_wallet);
1283 - },
1284 - );
1285 - }
1286 - });
1495 + final target = chains.firstWhere(
1496 + (chain) => chain.chainId == selectedChainId,
1497 + orElse: () => chains.first,
1498 + );
1499 + await _handleEvmNetworkFlow(target, paymentRequest);
1500 + }
1501
1288 - await paymentViewModel.selectChain();
1502 + Future<void> _handleEvmNetworkFlow(ChainInfo target, PaymentRequest paymentRequest) async {
1503 + if (evm == null || !mounted) {
1504 + return;
1505 + }
1506
1290 - await Future.delayed(const Duration(seconds: 2));
1291 - if (loadingBottomSheetContext != null && loadingBottomSheetContext!.mounted) {
1292 - Navigator.of(loadingBottomSheetContext!).pop();
1293 - }
1507 + final targetType = evm!.getWalletTypeByChainId(target.chainId);
1508 + if (targetType == null) {
1509 + _showUnsupportedNetworkAlert(target.chainId);
1510 + return;
1511 + }
1512
1295 - await widget.sendViewModel.wallet.updateBalance();
1296 - final detectedCurrency = result.addressDetectionResult?.detectedCurrency;
1297 - if (detectedCurrency != null) {
1298 - widget.sendViewModel.setSelectedCryptoCurrency(detectedCurrency.title);
1299 - }
1300 - _applyPaymentRequest(paymentRequest);
1301 - } catch (e) {
1302 - if (loadingBottomSheetContext != null && loadingBottomSheetContext!.mounted) {
1303 - Navigator.of(loadingBottomSheetContext!).pop();
1304 - }
1305 - printV("Switch network error: $e");
1513 + final detection = AddressDetectionResult(
1514 + address: paymentRequest.address,
1515 + detectedWalletType: targetType,
1516 + detectedCurrency: target.currency,
1517 + chainId: target.chainId,
1518 + amount: paymentRequest.amount,
1519 + note: paymentRequest.note,
1520 + scheme: "",
1521 + isValid: true,
1522 + );
1523 + widget.paymentViewModel.applyManualEvmSelection(detection);
1524 +
1525 + final currentType = widget.sendViewModel.wallet.type;
1526 + final currentChainId = isEVMCompatibleChain(currentType) ? _currentEvmChainIdOrMainnet() : null;
1527 + if (currentChainId != null && target.chainId == currentChainId) {
1528 + await _applyPaymentSelectingCurrency(paymentRequest, target.currency);
1529 + return;
1530 }
1531 +
1532 + final compatibleWallets = await widget.paymentViewModel.getWalletsByType(targetType);
1533 + if (!mounted) {
1534 + return;
1535 + }
1536 +
1537 + final result = PaymentFlowResult.evmNetworkSelection(
1538 + detection,
1539 + compatibleWallets: compatibleWallets,
1540 + wallet: compatibleWallets.isNotEmpty ? compatibleWallets.first : null,
1541 + );
1542 +
1543 + await _showPaymentConfirmation(
1544 + widget.paymentViewModel,
1545 + widget.walletSwitcherViewModel,
1546 + paymentRequest,
1547 + result,
1548 + );
1549 }
1550
1309 - /// Apply payment request to current form
1310 - void _applyPaymentRequest(PaymentRequest paymentRequest) {
1551 + void _applyPaymentRequest(PaymentRequest paymentRequest, {String? amountOverride}) {
1552 if (widget.sendViewModel.usePayjoin) {
1553 widget.sendViewModel.payjoinUri = paymentRequest.pjUri;
1554 }
1555 _addressControllers[_selectedOutput].text = paymentRequest.address;
1315 - if (paymentRequest.amount.isNotEmpty) {
1556 + final amountToApply = amountOverride ?? paymentRequest.amount;
1557 + if (amountToApply.isNotEmpty) {
1558 try {
1559 _amountControllers[_selectedOutput].text =
1560 widget.sendViewModel.amountParsingProxy.getDisplayCryptoAmount(
1319 - paymentRequest.amount,
1561 + amountToApply,
1562 widget.sendViewModel.selectedCryptoCurrency,
1563 );
1322 - } catch (e) {}
1564 + } catch (e) {
1565 + printV('applyPaymentRequest: failed to parse amount "$amountToApply": $e');
1566 + }
1567 }
1568 // _memoControllers[_selectedOutput].text = paymentRequest.note;
1569
@@ -1327,24 +1571,77 @@ class _NewSendPageState extends State<NewSendPage> {
1571 }
1572
1573 Future<void> _handleSwapFlow(
1330 - PaymentViewModel paymentViewModel,
1574 PaymentFlowResult result,
1332 - BuildContext bottomSheetContext,
1575 + BuildContext presentContext,
1576 + PaymentRequest paymentRequest,
1577 ) async {
1334 - Navigator.of(bottomSheetContext).pop();
1578 + if (!mounted) {
1579 + return;
1580 + }
1581
1336 - await Future.delayed(const Duration(milliseconds: 100));
1582 + final destWalletType = result.walletType;
1583 + if (destWalletType == null) {
1584 + return;
1585 + }
1586
1338 - if (!mounted) {
1587 + CryptoCurrency? resolvedToken;
1588 + final contract = paymentRequest.contractAddress;
1589 + if (contract != null && contract.isNotEmpty) {
1590 + resolvedToken = await TokenUtilities.findTokenByAddress(
1591 + walletType: destWalletType,
1592 + address: contract,
1593 + );
1594 + }
1595 + if (!mounted || !presentContext.mounted) {
1596 return;
1597 }
1598
1342 - final bottomSheet = getIt.get<SwapConfirmationBottomSheet>(param1: result);
1343 - await showModalBottomSheet<Trade?>(
1344 - context: context,
1345 - isDismissible: true,
1346 - isScrollControlled: true,
1347 - builder: (context) => bottomSheet,
1599 + if (contract != null && contract.isNotEmpty && resolvedToken == null) {
1600 + _showUnsupportedTokenAlert();
1601 + return;
1602 + }
1603 +
1604 + final receiveCurrency = resolvedToken ??
1605 + result.detectedCurrency ??
1606 + walletTypeToCryptoCurrency(destWalletType, chainId: result.chainId);
1607 +
1608 + final receiveAmountValue = resolvedToken != null
1609 + ? paymentRequest.resolveTokenAmount(resolvedToken)
1610 + : (paymentRequest.amount.isNotEmpty ? paymentRequest.amount : null);
1611 + final receiveAmount =
1612 + receiveAmountValue != null ? Money.tryParse(receiveAmountValue, receiveCurrency) : null;
1613 +
1614 + final isFiatDisabled = widget.sendViewModel.isFiatDisabled;
1615 + final depositBalanceByAsset = <CryptoCurrency, CurrencyPickerBalance>{
1616 + for (final r in widget.sendViewModel.balanceViewModel.formattedBalances)
1617 + r.asset: CurrencyPickerBalance(
1618 + amount: "${r.availableBalance} ${r.asset.title}",
1619 + fiat: isFiatDisabled ? null : "${r.fiatAvailableBalanceRaw} ${r.fiatCurrency?.symbol}",
1620 + fiatValue: isFiatDisabled ? null : double.tryParse(r.fiatAvailableBalanceRaw),
1621 + ),
1622 + };
1623 +
1624 + final page = NewSwapPage(
1625 + getIt.get<ExchangeViewModel>(),
1626 + widget.authService,
1627 + getIt.get<AddressResolverService>(),
1628 + null,
1629 + walletSwitcherViewModel: widget.walletSwitcherViewModel,
1630 + fromSend: SwapFromSendArgs(
1631 + recipientAddress: result.addressDetectionResult?.address ?? "",
1632 + receiveCurrency: receiveCurrency,
1633 + targetWalletType: destWalletType,
1634 + depositBalanceByAsset: depositBalanceByAsset,
1635 + receiveAmount: receiveAmount,
1636 + ),
1637 + );
1638 + await Navigator.of(presentContext).push<void>(
1639 + CupertinoPageRoute(
1640 + builder: (context) => Material(
1641 + color: Theme.of(context).colorScheme.surface,
1642 + child: SafeArea(bottom: false, child: page),
1643 + ),
1644 + ),
1645 );
1646 }
1647
lib/new-ui/pages/swap_page.dart
+513 -891
@@ -1,59 +1,57 @@
1 -import 'package:cake_wallet/core/address_resolver/address_resolver_service.dart';
2 -import 'package:cake_wallet/core/address_validator.dart';
3 -import 'package:cake_wallet/core/amount_validator.dart';
4 -import 'package:cake_wallet/core/auth_service.dart';
5 -import 'package:cake_wallet/di.dart';
6 -import 'package:cake_wallet/entities/qr_scanner.dart';
7 -import 'package:cake_wallet/exchange/exchange_trade_state.dart';
8 -import 'package:cake_wallet/exchange/provider/chainflip_exchange_provider.dart';
9 -import 'package:cake_wallet/exchange/provider/thorchain_exchange.provider.dart';
10 -import 'package:cake_wallet/generated/i18n.dart';
11 -import 'package:cake_wallet/new-ui/widgets/keyboard_hide_overlay.dart';
12 -import 'package:cake_wallet/new-ui/widgets/modern_button.dart';
13 -import 'package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart';
14 -import 'package:cake_wallet/new-ui/widgets/send_page/fiat_amount_bar.dart';
15 -import 'package:cake_wallet/new-ui/widgets/send_page/send_memo_input.dart';
16 -import 'package:cake_wallet/new-ui/widgets/send_page/send_syncing_indicator.dart';
17 -import 'package:cake_wallet/new-ui/widgets/swap_page/provider_selector_page.dart';
18 -import 'package:cake_wallet/new-ui/widgets/swap_page/refund_address_modal.dart';
19 -import 'package:cake_wallet/new-ui/widgets/swap_page/swap_address_selection_modal.dart';
20 -import 'package:cake_wallet/new-ui/widgets/swap_page/swap_confirm_sheet.dart';
21 -import 'package:cake_wallet/new-ui/widgets/swap_page/swap_limit_popup.dart';
22 -import 'package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_args.dart';
23 -import 'package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_sheet.dart';
24 -import 'package:cake_wallet/new-ui/widgets/swap_page/swap_options_page.dart';
25 -import 'package:cake_wallet/src/screens/exchange/widgets/present_provider_picker.dart';
26 -import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
27 -import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
28 -import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
29 -import 'package:cake_wallet/src/widgets/primary_button.dart';
30 -import 'package:cake_wallet/utils/debounce.dart';
31 -import 'package:cake_wallet/utils/decimal_input_formatter.dart';
32 -import 'package:cake_wallet/utils/payment_request.dart';
33 -import 'package:cake_wallet/utils/permission_handler.dart';
34 -import 'package:cw_core/wallet_info.dart';
35 -import 'package:flutter/services.dart';
36 -import 'package:permission_handler/permission_handler.dart';
37 -import 'package:cake_wallet/utils/show_pop_up.dart';
38 -import 'package:cake_wallet/view_model/exchange/exchange_trade_view_model.dart';
39 -import 'package:cake_wallet/view_model/exchange/exchange_view_model.dart';
40 -import 'package:cake_wallet/view_model/wallet_switcher_view_model.dart';
41 -import 'package:cw_core/crypto_currency.dart';
42 -import 'package:cw_core/currencies_with_memo.dart';
43 -import 'package:cw_core/currency.dart';
44 -import 'package:cw_core/sync_status.dart';
45 -import 'package:cw_core/utils/print_verbose.dart';
46 -import 'package:cw_core/wallet_type.dart';
47 -import 'package:flutter/cupertino.dart';
48 -import 'package:flutter/material.dart';
49 -import 'package:flutter_mobx/flutter_mobx.dart';
50 -import 'package:mobx/mobx.dart';
51 -import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
1 +import "package:cake_wallet/core/address_resolver/address_resolver_service.dart";
2 +import "package:cake_wallet/core/address_validator.dart";
3 +import "package:cake_wallet/core/amount_validator.dart";
4 +import "package:cake_wallet/core/auth_service.dart";
5 +import "package:cake_wallet/di.dart";
6 +import "package:cake_wallet/exchange/exchange_trade_state.dart";
7 +import "package:cake_wallet/exchange/provider/chainflip_exchange_provider.dart";
8 +import "package:cake_wallet/exchange/provider/thorchain_exchange.provider.dart";
9 +import "package:cake_wallet/generated/i18n.dart";
10 +import "package:cake_wallet/new-ui/widgets/keyboard_hide_overlay.dart";
11 +import "package:cake_wallet/new-ui/widgets/modern_button.dart";
12 +import "package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart";
13 +import "package:cake_wallet/new-ui/widgets/send_page/send_syncing_indicator.dart";
14 +import "package:cake_wallet/new-ui/widgets/swap_page/anypay_swap_footer.dart";
15 +import "package:cake_wallet/new-ui/widgets/swap_page/provider_selector_page.dart";
16 +import "package:cake_wallet/new-ui/widgets/swap_page/swap_amount_box.dart";
17 +import "package:cake_wallet/new-ui/widgets/swap_page/swap_confirm_sheet.dart";
18 +import "package:cake_wallet/new-ui/widgets/swap_page/swap_from_send_args.dart";
19 +import "package:cake_wallet/new-ui/widgets/swap_page/swap_limit_popup.dart";
20 +import "package:cake_wallet/new-ui/widgets/swap_page/swap_options_page.dart";
21 +import "package:cake_wallet/new-ui/widgets/swap_page/swap_section_header.dart";
22 +import "package:cake_wallet/src/screens/exchange/widgets/present_provider_picker.dart";
23 +import "package:cake_wallet/src/widgets/alert_with_one_action.dart";
24 +import "package:cake_wallet/src/widgets/alert_with_two_actions.dart";
25 +import "package:cake_wallet/src/widgets/cake_image_widget.dart";
26 +import "package:cake_wallet/src/widgets/primary_button.dart";
27 +import "package:cake_wallet/utils/debounce.dart";
28 +import "package:cake_wallet/utils/payment_request.dart";
29 +import "package:cake_wallet/utils/show_pop_up.dart";
30 +import "package:cake_wallet/view_model/exchange/exchange_trade_view_model.dart";
31 +import "package:cake_wallet/view_model/exchange/exchange_view_model.dart";
32 +import "package:cake_wallet/view_model/wallet_switcher_view_model.dart";
33 +import "package:cw_core/crypto_currency.dart";
34 +import "package:cw_core/currency_for_wallet_type.dart";
35 +import "package:cw_core/sync_status.dart";
36 +import "package:cw_core/utils/print_verbose.dart";
37 +import "package:cw_core/wallet_type.dart";
38 +import "package:flutter/cupertino.dart";
39 +import "package:flutter/material.dart";
40 +import "package:flutter/services.dart";
41 +import "package:flutter_mobx/flutter_mobx.dart";
42 +import "package:mobx/mobx.dart";
43 +import "package:modal_bottom_sheet/modal_bottom_sheet.dart";
44
45 class NewSwapPage extends StatefulWidget {
46 NewSwapPage(
55 - this.exchangeViewModel, this.authService, this.adrResService, this.initialPaymentRequest,
56 - {required this.walletSwitcherViewModel, CryptoCurrency? initialCurrency}) {
47 + this.exchangeViewModel,
48 + this.authService,
49 + this.adrResService,
50 + this.initialPaymentRequest, {
51 + required this.walletSwitcherViewModel,
52 + CryptoCurrency? initialCurrency,
53 + this.fromSend,
54 + }) {
55 depositWalletName = exchangeViewModel.depositCurrency == CryptoCurrency.xmr
56 ? exchangeViewModel.wallet.name
57 : null;
@@ -70,6 +68,7 @@ class NewSwapPage extends StatefulWidget {
68 final AuthService authService;
69 final AddressResolverService adrResService;
70 final PaymentRequest? initialPaymentRequest;
71 + final SwapFromSendArgs? fromSend;
72 late final String? depositWalletName;
73 late final String? receiveWalletName;
74
@@ -85,8 +84,9 @@ class _NewSwapPageState extends State<NewSwapPage> {
84 final _depositAddressFocus = FocusNode();
85 final _receiveAmountFocus = FocusNode();
86 final _receiveAddressFocus = FocusNode();
88 - final _receiveAmountDebounce = Debounce(Duration(milliseconds: 500));
89 - Debounce _depositAmountDebounce = Debounce(Duration(milliseconds: 500));
87 + final _receiveAmountDebounce = Debounce(const Duration(milliseconds: 500));
88 + Debounce _depositAmountDebounce = Debounce(const Duration(milliseconds: 500));
89 + final List<ReactionDisposer> _disposers = [];
90
91 bool get _shouldWaitTillSynced =>
92 [CryptoCurrency.xmr, CryptoCurrency.btc, CryptoCurrency.ltc]
@@ -101,6 +101,10 @@ class _NewSwapPageState extends State<NewSwapPage> {
101 }
102
103 WidgetsBinding.instance.addPostFrameCallback((_) {
104 + if (!mounted) {
105 + return;
106 + }
107 +
108 // if (!widget.exchangeViewModel.decentralizedExchangesPromptDismissed) {
109 // showMaterialModalBottomSheet(
110 // context: context,
@@ -129,7 +133,10 @@ class _NewSwapPageState extends State<NewSwapPage> {
133 }
134 widget.exchangeViewModel.isFixedRateMode = false;
135 widget.exchangeViewModel.isSendAllEnabled = false;
132 - Future.delayed(Duration(milliseconds: 200)).then((_) {
136 + Future.delayed(const Duration(milliseconds: 200)).then((_) {
137 + if (!mounted) {
138 + return;
139 + }
140 if (double.tryParse(depositFiatAmountController.text) != null) {
141 widget.exchangeViewModel
142 .setDepositAmountFromFiat(fiatAmount: depositFiatAmountController.text);
@@ -138,16 +145,21 @@ class _NewSwapPageState extends State<NewSwapPage> {
145 });
146 });
147 receiveFiatAmountController.addListener(() {
141 - if (!receiveKey.currentState!.amountFocusNode.hasFocus) return;
148 + if (!receiveKey.currentState!.amountFocusNode.hasFocus) {
149 + return;
150 + }
151
152 widget.exchangeViewModel.enableFixedRateMode();
153 widget.exchangeViewModel.isSendAllEnabled = false;
145 - Future.delayed(Duration(milliseconds: 200)).then((_) {
154 + Future.delayed(const Duration(milliseconds: 200)).then((_) {
155 + if (!mounted) {
156 + return;
157 + }
158 if (double.tryParse(receiveFiatAmountController.text) != null) {
159 String text = receiveFiatAmountController.text;
160 if (text.contains(".")) {
149 - text = text.replaceAll(RegExp(r'0+$'), '');
150 - text = text.replaceAll(RegExp(r'\.$'), '');
161 + text = text.replaceAll(RegExp(r"0+$"), "");
162 + text = text.replaceAll(RegExp(r"\.$"), "");
163 }
164 widget.exchangeViewModel
165 .setReceiveAmountFromFiat(fiatAmount: receiveFiatAmountController.text);
@@ -155,97 +167,121 @@ class _NewSwapPageState extends State<NewSwapPage> {
167 }
168 });
169 });
158 - reaction((_) => widget.exchangeViewModel.isFixedRateMode, (val) {
159 - Future.delayed(Duration(seconds: 3)).then((_) {
170 + _disposers.add(reaction((_) => widget.exchangeViewModel.isFixedRateMode, (val) {
171 + Future.delayed(const Duration(seconds: 3)).then((_) {
172 if (val) {
161 - if (depositKey.currentState?.mounted == true)
173 + if (depositKey.currentState?.mounted == true) {
174 depositKey.currentState!.updateFiatAmount();
175 + }
176 } else {
164 - if (receiveKey.currentState?.mounted == true)
177 + if (receiveKey.currentState?.mounted == true) {
178 receiveKey.currentState!.updateFiatAmount();
179 + }
180 }
181 });
168 - });
182 + }));
183
170 - reaction((_) => widget.exchangeViewModel.depositAmount, (String amount) {
171 - if (depositKey.currentState!.amountFocusNode.hasFocus) return;
184 + _disposers.add(reaction((_) => widget.exchangeViewModel.depositAmount, (String amount) {
185 + if (depositKey.currentState!.amountFocusNode.hasFocus) {
186 + return;
187 + }
188
189 if (widget.exchangeViewModel.isSendAllEnabled) {
190 depositAmountController.text = S.of(context).all;
191 } else if (depositAmountController.text != amount && amount != S.of(context).all) {
192 depositAmountController.text = amount;
193 }
178 - });
194 + }));
195
196 _onCurrencyChange(
181 - widget.exchangeViewModel.receiveCurrency, widget.exchangeViewModel, receiveKey);
197 + widget.exchangeViewModel.receiveCurrency,
198 + widget.exchangeViewModel,
199 + receiveKey,
200 + );
201 _onCurrencyChange(
183 - widget.exchangeViewModel.depositCurrency, widget.exchangeViewModel, depositKey);
184 -
185 - reaction(
186 - (_) => widget.exchangeViewModel.wallet.name,
187 - (_) => _onWalletNameChange(
188 - widget.exchangeViewModel, widget.exchangeViewModel.receiveCurrency, receiveKey));
202 + widget.exchangeViewModel.depositCurrency,
203 + widget.exchangeViewModel,
204 + depositKey,
205 + );
206
190 - reaction(
191 - (_) => widget.exchangeViewModel.wallet.name,
192 - (_) => _onWalletNameChange(
193 - widget.exchangeViewModel, widget.exchangeViewModel.depositCurrency, depositKey));
207 + _disposers.add(reaction(
208 + (_) => widget.exchangeViewModel.wallet.name,
209 + (_) => _onWalletNameChange(
210 + widget.exchangeViewModel,
211 + widget.exchangeViewModel.receiveCurrency,
212 + receiveKey,
213 + ),
214 + ));
215 +
216 + _disposers.add(reaction(
217 + (_) => widget.exchangeViewModel.wallet.name,
218 + (_) => _onWalletNameChange(
219 + widget.exchangeViewModel,
220 + widget.exchangeViewModel.depositCurrency,
221 + depositKey,
222 + ),
223 + ));
224
195 - reaction(
225 + _disposers.add(reaction(
226 (_) => widget.exchangeViewModel.receiveCurrency,
227 (currency) => _onCurrencyChange(currency, widget.exchangeViewModel, receiveKey),
198 - );
228 + ));
229
200 - reaction(
230 + _disposers.add(reaction(
231 (_) => widget.exchangeViewModel.depositCurrency,
232 (currency) => _onCurrencyChange(currency, widget.exchangeViewModel, depositKey),
203 - );
233 + ));
234
205 - reaction((_) => widget.exchangeViewModel.depositAddress, (String address) {
235 + _disposers.add(reaction((_) => widget.exchangeViewModel.depositAddress, (String address) {
236 if (depositKey.currentState!.addressController.text != address) {
237 depositKey.currentState!.addressController.text = address;
238 }
209 - });
239 + }));
240
211 - reaction((_) => widget.exchangeViewModel.isDepositAddressEnabled, (isEnabled) {});
241 + _disposers
242 + .add(reaction((_) => widget.exchangeViewModel.isDepositAddressEnabled, (isEnabled) {}));
243
213 - reaction((_) => widget.exchangeViewModel.receiveAmount, (String amount) {
244 + _disposers.add(reaction((_) => widget.exchangeViewModel.receiveAmount, (String amount) {
245 if (receiveKey.currentState!.amountController.text != amount) {
246 receiveKey.currentState!.amountController.text = amount;
247 }
217 - });
248 + }));
249
219 - reaction((_) => widget.exchangeViewModel.receiveAddress, (String address) {
250 + _disposers.add(reaction((_) => widget.exchangeViewModel.receiveAddress, (String address) {
251 if (receiveKey.currentState!.addressController.text != address) {
252 receiveKey.currentState!.addressController.text = address;
253 }
223 - });
254 + }));
255
225 - reaction((_) => widget.exchangeViewModel.isReceiveAmountEditable,
226 - (bool isReceiveAmountEditable) {});
256 + _disposers.add(reaction(
257 + (_) => widget.exchangeViewModel.isReceiveAmountEditable,
258 + (bool isReceiveAmountEditable) {},
259 + ));
260
228 - reaction((_) => widget.exchangeViewModel.tradeState, (ExchangeTradeState state) {
261 + _disposers
262 + .add(reaction((_) => widget.exchangeViewModel.tradeState, (ExchangeTradeState state) {
263 if (state is TradeIsCreatedFailure) {
264 WidgetsBinding.instance.addPostFrameCallback((_) {
265 if (mounted) {
266 showPopUp<void>(
233 - context: context,
234 - builder: (BuildContext context) {
235 - return AlertWithOneAction(
236 - key: ValueKey('exchange_page_trade_creation_failure_dialog_key'),
237 - buttonKey:
238 - ValueKey('exchange_page_trade_creation_failure_dialog_button_key'),
239 - alertTitle: S.of(context).provider_error(state.title),
240 - alertContent: state.error,
241 - buttonText: S.of(context).ok,
242 - buttonAction: () => Navigator.of(context).pop());
243 - });
267 + context: context,
268 + builder: (BuildContext context) => AlertWithOneAction(
269 + key: const ValueKey("exchange_page_trade_creation_failure_dialog_key"),
270 + buttonKey:
271 + const ValueKey("exchange_page_trade_creation_failure_dialog_button_key"),
272 + alertTitle: S.of(context).provider_error(state.title),
273 + alertContent: state.error,
274 + buttonText: S.of(context).ok,
275 + buttonAction: () => Navigator.of(context).pop(),
276 + ),
277 + );
278 }
279 });
280 }
281 if (state is TradeIsCreatedSuccessfully) {
248 - if (widget.exchangeViewModel.tradeStarted) return;
282 + if (widget.exchangeViewModel.tradeStarted) {
283 + return;
284 + }
285 final receiveAmount = widget.exchangeViewModel.receiveAmount;
286 // FIXME we don't know why a reset is/was needed here, it messes up ui so i removed it
287 // widget.exchangeViewModel.reset();
@@ -263,27 +299,44 @@ class _NewSwapPageState extends State<NewSwapPage> {
299 receiveAmount: receiveAmount,
300 );
301 showMaterialModalBottomSheet(
266 - context: context, builder: (context) => page, backgroundColor: Colors.transparent);
302 + context: context,
303 + builder: (context) => page,
304 + backgroundColor: Colors.transparent,
305 + );
306 }
268 - });
307 + }));
308
270 - reaction((_) => widget.exchangeViewModel.bestRate, (double rate) {
309 + _disposers.add(reaction((_) => widget.exchangeViewModel.bestRate, (double rate) {
310 if (widget.exchangeViewModel.isFixedRateMode) {
311 widget.exchangeViewModel.changeReceiveAmount(amount: receiveAmountController.text);
312 } else {
313 printV("bestrate");
275 - if ((depositKey.currentState?._fiatInputMode ?? false) ||
314 + if ((depositKey.currentState?.fiatInputMode ?? false) ||
315 depositAmountController.text.isEmpty ||
277 - depositAmountController.text == S.current.all)
316 + depositAmountController.text == S.current.all) {
317 widget.exchangeViewModel
318 .changeDepositAmount(amount: widget.exchangeViewModel.depositAmount);
280 - else
319 + } else {
320 widget.exchangeViewModel.changeDepositAmount(amount: depositAmountController.text);
321 + }
322 }
283 - });
323 + }));
324 +
325 + _disposers.add(reaction((_) => widget.exchangeViewModel.forcedProviderRate, (double rate) {
326 + if (widget.exchangeViewModel.forcedProvider != null && rate == 0) {
327 + return;
328 + }
329 + if (widget.exchangeViewModel.isFixedRateMode) {
330 + widget.exchangeViewModel.changeReceiveAmount(amount: receiveAmountController.text);
331 + } else if (depositAmountController.text.isNotEmpty &&
332 + depositAmountController.text != S.current.all) {
333 + widget.exchangeViewModel.changeDepositAmount(amount: depositAmountController.text);
334 + }
335 + }));
336
337 depositAddressController.addListener(
286 - () => widget.exchangeViewModel.depositAddress = depositAddressController.text);
338 + () => widget.exchangeViewModel.depositAddress = depositAddressController.text,
339 + );
340
341 depositAmountController.addListener(() {
342 if (depositAmountController.text != widget.exchangeViewModel.depositAmount &&
@@ -295,8 +348,8 @@ class _NewSwapPageState extends State<NewSwapPage> {
348 .any((provider) => provider is ChainflipExchangeProvider);
349
350 _depositAmountDebounce = isThorChain || isChainflip
298 - ? Debounce(Duration(milliseconds: 1000))
299 - : Debounce(Duration(milliseconds: 500));
351 + ? Debounce(const Duration(milliseconds: 1000))
352 + : Debounce(const Duration(milliseconds: 500));
353
354 _depositAmountDebounce.run(() {
355 widget.exchangeViewModel.calculateBestRate();
@@ -315,7 +368,8 @@ class _NewSwapPageState extends State<NewSwapPage> {
368 });
369
370 receiveAddressController.addListener(
318 - () => widget.exchangeViewModel.receiveAddress = receiveAddressController.text);
371 + () => widget.exchangeViewModel.receiveAddress = receiveAddressController.text,
372 + );
373
374 receiveAmountController.addListener(() {
375 if (receiveAmountController.text != widget.exchangeViewModel.receiveAmount) {
@@ -331,8 +385,9 @@ class _NewSwapPageState extends State<NewSwapPage> {
385 }
386 });
387
334 - reaction((_) => widget.exchangeViewModel.wallet.walletAddresses.addressForExchange,
335 - (String address) {
388 + _disposers.add(
389 + reaction((_) => widget.exchangeViewModel.wallet.walletAddresses.addressForExchange,
390 + (String address) {
391 if (widget.exchangeViewModel.depositCurrency == CryptoCurrency.xmr) {
392 depositKey.currentState!.changeAddress(address: address);
393 }
@@ -340,7 +395,7 @@ class _NewSwapPageState extends State<NewSwapPage> {
395 // if (widget.exchangeViewModel.receiveCurrency == CryptoCurrency.xmr) {
396 // receiveKey.currentState!.changeAddress(address: address);
397 // }
343 - });
398 + }));
399
400 _depositAddressFocus.addListener(() async {
401 if (!_depositAddressFocus.hasFocus && depositAddressController.text.isNotEmpty) {
@@ -378,15 +433,33 @@ class _NewSwapPageState extends State<NewSwapPage> {
433 widget.exchangeViewModel.setCanonicalReceiveAmount(widget.initialPaymentRequest!.amount);
434 widget.exchangeViewModel.receiveAddress = widget.initialPaymentRequest!.address;
435 } catch (e) {
381 - printV('error: ${e.toString()}');
436 + printV("error: ${e.toString()}");
437 // TODO
438 }
439 }
440 +
441 + if (widget.fromSend != null) {
442 + widget.exchangeViewModel.changeReceiveCurrency(currency: widget.fromSend!.receiveCurrency);
443 + widget.exchangeViewModel.receiveAddress = widget.fromSend!.recipientAddress;
444 + widget.exchangeViewModel.depositAddress =
445 + widget.exchangeViewModel.wallet.walletAddresses.addressForExchange;
446 + widget.exchangeViewModel.enableFixedRateMode();
447 + final receiveAmount = widget.fromSend!.receiveAmount;
448 + if (receiveAmount != null) {
449 + widget.exchangeViewModel.setCanonicalReceiveAmount(receiveAmount.toString());
450 + }
451 + widget.exchangeViewModel.calculateBestRate();
452 + }
453 });
454 }
455
456 @override
457 void dispose() {
458 + for (final disposer in _disposers) {
459 + disposer();
460 + }
461 + _receiveAmountDebounce.cancel();
462 + _depositAmountDebounce.cancel();
463 _depositAmountFocus.dispose();
464 _depositAddressFocus.dispose();
465 _receiveAmountFocus.dispose();
@@ -395,23 +468,33 @@ class _NewSwapPageState extends State<NewSwapPage> {
468 super.dispose();
469 }
470
398 - void _onCurrencyChange(CryptoCurrency currency, ExchangeViewModel exchangeViewModel,
399 - GlobalKey<SwapAmountBoxState> key) {
471 + void _onCurrencyChange(
472 + CryptoCurrency currency,
473 + ExchangeViewModel exchangeViewModel,
474 + GlobalKey<SwapAmountBoxState> key,
475 + ) {
476 final isCurrentTypeWallet = exchangeViewModel.useSameWalletAddress(currency);
477
402 - if (key == depositKey && !isCurrentTypeWallet) exchangeViewModel.isSendFromExternal = true;
403 - if (key == depositKey && isCurrentTypeWallet) exchangeViewModel.isSendFromExternal = false;
478 + if (key == depositKey && !isCurrentTypeWallet) {
479 + exchangeViewModel.isSendFromExternal = true;
480 + }
481 + if (key == depositKey && isCurrentTypeWallet) {
482 + exchangeViewModel.isSendFromExternal = false;
483 + }
484
485 if (key == depositKey) {
486 key.currentState!.changeAddress(
487 address:
408 - isCurrentTypeWallet ? exchangeViewModel.wallet.walletAddresses.addressForExchange : '',
488 + isCurrentTypeWallet ? exchangeViewModel.wallet.walletAddresses.addressForExchange : "",
489 );
490 }
491 }
492
413 - void _onWalletNameChange(ExchangeViewModel exchangeViewModel, CryptoCurrency currency,
414 - GlobalKey<SwapAmountBoxState> key) {
493 + void _onWalletNameChange(
494 + ExchangeViewModel exchangeViewModel,
495 + CryptoCurrency currency,
496 + GlobalKey<SwapAmountBoxState> key,
497 + ) {
498 final isCurrentTypeWallet = exchangeViewModel.useSameWalletAddress(currency);
499
500 if (isCurrentTypeWallet) {
@@ -419,12 +502,15 @@ class _NewSwapPageState extends State<NewSwapPage> {
502 exchangeViewModel.wallet.walletAddresses.addressForExchange;
503 } else if (key.currentState!.addressController.text ==
504 exchangeViewModel.wallet.walletAddresses.addressForExchange) {
422 - key.currentState!.addressController.text = '';
505 + key.currentState!.addressController.text = "";
506 }
507 }
508
509 Future<String> fetchParsedAddress(
427 - BuildContext context, String domain, CryptoCurrency currency) async {
510 + BuildContext context,
511 + String domain,
512 + CryptoCurrency currency,
513 + ) async {
514 printV("$domain");
515 final parsedAddress = await widget.adrResService
516 .resolve(query: domain, wallet: widget.exchangeViewModel.wallet, currency: currency);
@@ -434,62 +520,78 @@ class _NewSwapPageState extends State<NewSwapPage> {
520 }
521
522 void _showFeeAlert(BuildContext context) async {
437 - await Future<void>.delayed(Duration(seconds: 1));
523 + await Future<void>.delayed(const Duration(seconds: 1));
524 if (!context.mounted) {
525 return;
526 }
527
528 final confirmed = await showPopUp<bool>(
443 - context: context,
444 - builder: (dialogContext) {
445 - return AlertWithTwoActions(
446 - alertTitle: S.of(context).low_fee,
447 - alertContent: S.of(context).low_fee_alert,
448 - leftButtonText: S.of(context).ignor,
449 - rightButtonText: S.of(context).use_suggested,
450 - actionLeftButton: () => Navigator.of(dialogContext).pop(false),
451 - actionRightButton: () => Navigator.of(dialogContext).pop(true));
452 - }) ??
529 + context: context,
530 + builder: (dialogContext) => AlertWithTwoActions(
531 + alertTitle: S.of(context).low_fee,
532 + alertContent: S.of(context).low_fee_alert,
533 + leftButtonText: S.of(context).ignor,
534 + rightButtonText: S.of(context).use_suggested,
535 + actionLeftButton: () => Navigator.of(dialogContext).pop(false),
536 + actionRightButton: () => Navigator.of(dialogContext).pop(true),
537 + ),
538 + ) ??
539 false;
540 if (confirmed) {
541 widget.exchangeViewModel.feesViewModel.setDefaultTransactionPriority();
542 }
543 }
544
459 - void disposeBestRateSync() => widget.exchangeViewModel.bestRateSync.cancel();
460 -
545 @override
546 Widget build(BuildContext context) {
547 + final colorScheme = Theme.of(context).colorScheme;
548 +
549 + final fromSend = widget.fromSend;
550 + final fromType = widget.exchangeViewModel.wallet.type;
551 + final fromName = walletTypeToString(fromType);
552 + final fromIcon = symbolIconPathForWalletType(fromType) ?? "";
553 +
554 + final targetType = fromSend?.targetWalletType;
555 + final toName = targetType != null ? walletTypeToString(targetType) : "";
556 + final toIcon = (targetType != null ? symbolIconPathForWalletType(targetType) : null) ?? "";
557 +
558 return KeyboardHideOverlay(
559 unfocusOnTap: true,
560 child: Container(
561 decoration: BoxDecoration(
467 - color: Theme.of(context).colorScheme.surface,
468 - borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
562 + color: colorScheme.surface,
563 + borderRadius: const BorderRadius.vertical(top: Radius.circular(16)),
564 ),
565 child: Column(
566 children: [
567 ModalTopBar(
473 - title: S.of(context).swap,
474 - leadingIcon: Icon(Icons.close),
568 + title:
569 + fromSend != null ? S.of(context).swap_from_network(fromName) : S.of(context).swap,
570 + leadingIcon: Icon(fromSend != null ? Icons.arrow_back_ios_new : Icons.close),
571 leadingSemanticLabel: S.of(context).close,
572 onLeadingPressed: Navigator.of(context).maybePop,
477 - trailingIcon: CakeImageWidget(
478 - imageUrl: "assets/new-ui/options.svg",
479 - colorFilter:
480 - ColorFilter.mode(Theme.of(context).colorScheme.primary, BlendMode.srcIn),
481 - ),
573 + trailingIcon: fromSend != null
574 + ? null
575 + : CakeImageWidget(
576 + imageUrl: "assets/new-ui/options.svg",
577 + colorFilter: ColorFilter.mode(colorScheme.primary, BlendMode.srcIn),
578 + ),
579 trailingSemanticLabel: S.of(context).configure,
580 onTrailingPressed: () {
484 - Navigator.of(context).push(CupertinoPageRoute(
581 + Navigator.of(context).push(
582 + CupertinoPageRoute(
583 builder: (context) => Material(
486 - child: SwapOptionsPage(exchangeViewModel: widget.exchangeViewModel))));
584 + child: SwapOptionsPage(exchangeViewModel: widget.exchangeViewModel),
585 + ),
586 + ),
587 + );
588 },
589 ),
590 + const SizedBox(height: 24),
591 Expanded(
592 child: SafeArea(
593 child: Padding(
492 - padding: const EdgeInsets.symmetric(horizontal: 18.0),
594 + padding: const EdgeInsets.symmetric(horizontal: 18),
595 child: Column(
596 mainAxisAlignment: MainAxisAlignment.spaceBetween,
597 mainAxisSize: MainAxisSize.max,
@@ -503,137 +605,211 @@ class _NewSwapPageState extends State<NewSwapPage> {
605 controller: ModalScrollController.of(context),
606 child: Column(
607 children: [
608 + if (fromSend != null)
609 + Padding(
610 + padding: const EdgeInsets.only(bottom: 12),
611 + child: SwapSectionHeader(
612 + label: S.of(context).from,
613 + networkName: fromName,
614 + networkIconPath: fromIcon,
615 + ),
616 + ),
617 Observer(
618 builder: (_) => SwapAmountBox(
619 isReceiverCard: false,
620 walletSwitcherViewModel: widget.walletSwitcherViewModel,
621 exchangeViewModel: widget.exchangeViewModel,
511 - onDispose: disposeBestRateSync,
622 hasAllAmount: widget.exchangeViewModel.hasAllAmount,
623 allAmount: widget.exchangeViewModel.hasAllAmount
624 ? () => widget.exchangeViewModel.enableSendAllAmount()
625 : null,
626 key: depositKey,
517 - title: S.of(context).send,
627 + title: fromSend != null ? "" : S.of(context).send,
628 + sourceSelectorMode: fromSend != null,
629 + walletName: fromSend != null
630 + ? widget.exchangeViewModel.wallet.name
631 + : null,
632 + balanceByAsset: fromSend?.depositBalanceByAsset,
633 + useSingleNetworkLayout: fromSend != null,
634 + filteredNetwork: fromSend != null
635 + ? widget.exchangeViewModel.wallet.type
636 + : null,
637 currency: widget.exchangeViewModel.depositCurrency,
638 useBaseUnit: widget.exchangeViewModel.useDepositBaseUnit,
639 hasRefundAddress: true,
640 currencies: widget.exchangeViewModel.depositCurrencies,
641 onCurrencySelected: (currency) {
523 - if (currency is CryptoCurrency) {
524 - widget.exchangeViewModel
525 - .changeDepositCurrency(currency: currency);
642 + if (currency is! CryptoCurrency) {
643 + return;
644 + }
645 + final vm = widget.exchangeViewModel;
646 + if (fromSend == null) {
647 + vm.changeDepositCurrency(currency: currency);
648 + return;
649 + }
650 + final keepReceive = vm.receiveAmount;
651 + vm.changeDepositCurrency(currency: currency);
652 + vm.enableFixedRateMode();
653 + if (keepReceive.isNotEmpty) {
654 + vm.changeReceiveAmount(amount: keepReceive);
655 + } else {
656 + vm.calculateBestRate();
657 }
658 },
528 - currencyValueValidator: (value) {
529 - return !widget.exchangeViewModel.isFixedRateMode &&
530 - value != S.of(context).all
531 - ? AmountValidator(
532 - isAutovalidate: true,
533 - currency: widget.exchangeViewModel.isFixedRateMode
534 - ? widget.exchangeViewModel.receiveCurrency
535 - : widget.exchangeViewModel.depositCurrency,
536 - minValue:
537 - widget.exchangeViewModel.limits.min.toString(),
538 - maxValue:
539 - widget.exchangeViewModel.limits.max.toString(),
540 - amountParsingProxy:
541 - widget.exchangeViewModel.amountParsingProxy,
542 - ).call(value)
543 - : null;
544 - },
659 + currencyValueValidator: (value) => !widget
660 + .exchangeViewModel.isFixedRateMode &&
661 + value != S.of(context).all
662 + ? AmountValidator(
663 + isAutovalidate: true,
664 + currency: widget.exchangeViewModel.isFixedRateMode
665 + ? widget.exchangeViewModel.receiveCurrency
666 + : widget.exchangeViewModel.depositCurrency,
667 + minValue:
668 + widget.exchangeViewModel.limits.min.toString(),
669 + maxValue:
670 + widget.exchangeViewModel.limits.max.toString(),
671 + amountParsingProxy:
672 + widget.exchangeViewModel.amountParsingProxy,
673 + ).call(value)
674 + : null,
675 addressTextFieldValidator: AddressValidator(
546 - type: widget.exchangeViewModel.depositCurrency),
676 + type: widget.exchangeViewModel.depositCurrency,
677 + ),
678 onPushPasteButton: (context) async {
548 - final clipboard = await Clipboard.getData('text/plain');
679 + final clipboard = await Clipboard.getData("text/plain");
680 widget.exchangeViewModel.depositAddress =
550 - clipboard?.text ?? '';
681 + clipboard?.text ?? "";
682
683 final domain = widget.exchangeViewModel.depositAddress;
684 widget.exchangeViewModel.depositAddress =
554 - await fetchParsedAddress(context, domain,
555 - widget.exchangeViewModel.depositCurrency);
685 + await fetchParsedAddress(
686 + context,
687 + domain,
688 + widget.exchangeViewModel.depositCurrency,
689 + );
690 },
691 onPushAddressBookButton: (context) async {
692 final domain = widget.exchangeViewModel.depositAddress;
693 widget.exchangeViewModel.depositAddress =
560 - await fetchParsedAddress(context, domain,
561 - widget.exchangeViewModel.depositCurrency);
694 + await fetchParsedAddress(
695 + context,
696 + domain,
697 + widget.exchangeViewModel.depositCurrency,
698 + );
699 },
700 ),
701 ),
702 SwapLimitPopup(exchangeViewModel: widget.exchangeViewModel),
566 - Padding(
567 - padding: const EdgeInsets.symmetric(vertical: 12.0),
568 - child: Stack(
569 - alignment: Alignment.center,
703 + if (fromSend != null)
704 + Column(
705 children: [
571 - Container(
572 - height: 1,
573 - width: double.infinity,
574 - color: Theme.of(context).colorScheme.surfaceContainerHigh,
575 - ),
576 - ModernButton.svg(
577 - size: 36,
578 - iconSize: 24,
579 - svgPath: "assets/new-ui/swap_amounts.svg",
580 - onPressed: widget.exchangeViewModel.reverseSwapDirection,
706 + const SizedBox(height: 24),
707 + Icon(
708 + Icons.arrow_downward,
709 + size: 24,
710 + color: colorScheme.onSurfaceVariant,
711 semanticLabel: S.of(context).swap_reverse_direction,
712 ),
713 + const SizedBox(height: 24),
714 ],
715 + )
716 + else
717 + Padding(
718 + padding: const EdgeInsets.symmetric(vertical: 12),
719 + child: Stack(
720 + alignment: Alignment.center,
721 + children: [
722 + Container(
723 + height: 1,
724 + width: double.infinity,
725 + color: colorScheme.surfaceContainerHigh,
726 + ),
727 + ModernButton.svg(
728 + size: 36,
729 + iconSize: 24,
730 + svgPath: "assets/new-ui/swap_amounts.svg",
731 + onPressed:
732 + widget.exchangeViewModel.reverseSwapDirection,
733 + ),
734 + ],
735 + ),
736 + ),
737 + if (fromSend != null)
738 + Padding(
739 + padding: const EdgeInsets.only(bottom: 12),
740 + child: SwapSectionHeader(
741 + label: S.of(context).to,
742 + networkName: toName,
743 + networkIconPath: toIcon,
744 + ),
745 ),
585 - ),
746 Observer(
747 builder: (_) => SwapAmountBox(
748 isReceiverCard: true,
749 walletSwitcherViewModel: widget.walletSwitcherViewModel,
750 exchangeViewModel: widget.exchangeViewModel,
591 - onDispose: disposeBestRateSync,
751 key: receiveKey,
593 - title: S.of(context).receive,
752 + title: fromSend != null ? "" : S.of(context).receive,
753 + filteredNetwork:
754 + fromSend != null ? fromSend.targetWalletType : null,
755 currencies: widget.exchangeViewModel.receiveCurrencies,
756 currency: widget.exchangeViewModel.receiveCurrency,
757 useBaseUnit: widget.exchangeViewModel.useReceiveBaseUnit,
758 onCurrencySelected: (currency) {
598 - if (currency is CryptoCurrency) {
599 - widget.exchangeViewModel
600 - .changeReceiveCurrency(currency: currency);
759 + if (currency is! CryptoCurrency) {
760 + return;
761 + }
762 + final vm = widget.exchangeViewModel;
763 + final keepAddress = vm.receiveAddress;
764 + vm.changeReceiveCurrency(currency: currency);
765 + if (fromSend != null) {
766 + if (keepAddress.isNotEmpty) {
767 + vm.receiveAddress = keepAddress;
768 + }
769 + vm.enableFixedRateMode();
770 + vm.calculateBestRate();
771 }
772 },
603 - currencyValueValidator: (value) {
604 - return widget.exchangeViewModel.isFixedRateMode
605 - ? AmountValidator(
606 - isAutovalidate: true,
607 - currency: widget.exchangeViewModel.receiveCurrency,
608 - minValue:
609 - widget.exchangeViewModel.limits.min.toString(),
610 - maxValue:
611 - widget.exchangeViewModel.limits.max.toString(),
612 - amountParsingProxy:
613 - widget.exchangeViewModel.amountParsingProxy,
614 - ).call(value)
615 - : null;
616 - },
773 + currencyValueValidator: (value) => widget
774 + .exchangeViewModel.isFixedRateMode
775 + ? AmountValidator(
776 + isAutovalidate: true,
777 + currency: widget.exchangeViewModel.receiveCurrency,
778 + minValue:
779 + widget.exchangeViewModel.limits.min.toString(),
780 + maxValue:
781 + widget.exchangeViewModel.limits.max.toString(),
782 + amountParsingProxy:
783 + widget.exchangeViewModel.amountParsingProxy,
784 + ).call(value)
785 + : null,
786 addressTextFieldValidator: AddressValidator(
618 - type: widget.exchangeViewModel.receiveCurrency),
787 + type: widget.exchangeViewModel.receiveCurrency,
788 + ),
789 onPushPasteButton: (context) async {
620 - final clipboard = await Clipboard.getData('text/plain');
790 + final clipboard = await Clipboard.getData("text/plain");
791 widget.exchangeViewModel.receiveAddress =
622 - clipboard?.text ?? '';
792 + clipboard?.text ?? "";
793
794 final domain = widget.exchangeViewModel.receiveAddress;
795 widget.exchangeViewModel.receiveAddress =
626 - await fetchParsedAddress(context, domain,
627 - widget.exchangeViewModel.receiveCurrency);
796 + await fetchParsedAddress(
797 + context,
798 + domain,
799 + widget.exchangeViewModel.receiveCurrency,
800 + );
801 },
802 onPushAddressBookButton: (context) async {
803 final domain = widget.exchangeViewModel.receiveAddress;
804 widget.exchangeViewModel.receiveAddress =
632 - await fetchParsedAddress(context, domain,
633 - widget.exchangeViewModel.receiveCurrency);
805 + await fetchParsedAddress(
806 + context,
807 + domain,
808 + widget.exchangeViewModel.receiveCurrency,
809 + );
810 },
811 ),
636 - )
812 + ),
813 ],
814 ),
815 ),
@@ -647,15 +823,18 @@ class _NewSwapPageState extends State<NewSwapPage> {
823 children: [
824 if (widget.exchangeViewModel.status is! SyncedSyncStatus)
825 SendSyncingIndicator(status: widget.exchangeViewModel.status),
650 - if (widget.exchangeViewModel.isFixedRateMode)
651 - Text(S.of(context).exchange_rate_is_fixed,
652 - style: TextStyle(
653 - color: Theme.of(context).colorScheme.onSurfaceVariant,
654 - fontSize: 12)),
655 - SwapProviderPreview(exchangeViewModel: widget.exchangeViewModel),
826 + if (fromSend == null && widget.exchangeViewModel.isFixedRateMode)
827 + Text(
828 + S.of(context).exchange_rate_is_fixed,
829 + style: TextStyle(color: colorScheme.onSurfaceVariant, fontSize: 12),
830 + ),
831 + if (fromSend != null)
832 + AnyPaySwapFooter(exchangeViewModel: widget.exchangeViewModel)
833 + else
834 + SwapProviderPreview(exchangeViewModel: widget.exchangeViewModel),
835 Observer(
836 builder: (_) => LoadingPrimaryButton(
658 - key: ValueKey('exchange_page_exchange_button_key'),
837 + key: const ValueKey("exchange_page_exchange_button_key"),
838 text: widget.exchangeViewModel.isAvailableInSelected
839 ? S.of(context).swap
840 : S.of(context).change_selected_exchanges,
@@ -667,15 +846,13 @@ class _NewSwapPageState extends State<NewSwapPage> {
846 if (_shouldWaitTillSynced) {
847 showPopUp<void>(
848 context: context,
670 - builder: (BuildContext context) {
671 - return AlertWithOneAction(
672 - alertTitle: S.of(context).exchange,
673 - alertContent:
674 - S.of(context).exchange_sync_alert_content,
675 - buttonText: S.of(context).ok,
676 - buttonAction: () => Navigator.of(context).pop(),
677 - );
678 - },
849 + builder: (BuildContext context) => AlertWithOneAction(
850 + alertTitle: S.of(context).exchange,
851 + alertContent:
852 + S.of(context).exchange_sync_alert_content,
853 + buttonText: S.of(context).ok,
854 + buttonAction: () => Navigator.of(context).pop(),
855 + ),
856 );
857 } else {
858 final check =
@@ -693,22 +870,22 @@ class _NewSwapPageState extends State<NewSwapPage> {
870 }
871 }
872 : () => PresentProviderPicker(
696 - exchangeViewModel: widget.exchangeViewModel)
697 - .presentProviderPicker(context),
698 - color: Theme.of(context).colorScheme.primary,
699 - textColor: Theme.of(context).colorScheme.onPrimary,
873 + exchangeViewModel: widget.exchangeViewModel,
874 + ).presentProviderPicker(context),
875 + color: colorScheme.primary,
876 + textColor: colorScheme.onPrimary,
877 isDisabled: _swapButtonDisabled(),
878 isLoading: widget.exchangeViewModel.tradeState is TradeIsCreating,
879 ),
880 ),
881 ],
882 ),
706 - )
883 + ),
884 ],
885 ),
886 ),
887 ),
711 - )
888 + ),
889 ],
890 ),
891 ),
@@ -716,673 +893,118 @@ class _NewSwapPageState extends State<NewSwapPage> {
893 }
894
895 bool _swapButtonDisabled() {
719 - if (widget.exchangeViewModel.selectedProviders.isEmpty) return true;
896 + if (widget.exchangeViewModel.selectedProviders.isEmpty) {
897 + return true;
898 + }
899
721 - if (widget.exchangeViewModel.receiveAddress.isEmpty) return true;
900 + if (widget.exchangeViewModel.receiveAddress.isEmpty) {
901 + return true;
902 + }
903
723 - if (widget.exchangeViewModel.status is! SyncedSyncStatus) return true;
904 + if (widget.exchangeViewModel.status is! SyncedSyncStatus) {
905 + return true;
906 + }
907
725 - if (widget.exchangeViewModel.depositAmount.isEmpty) return true;
908 + if (widget.exchangeViewModel.depositAmount.isEmpty) {
909 + return true;
910 + }
911
912 return false;
913 }
914 }
915
916 class SwapProviderPreview extends StatelessWidget {
732 - const SwapProviderPreview({super.key, required this.exchangeViewModel});
917 + const SwapProviderPreview({
918 + required this.exchangeViewModel,
919 + super.key,
920 + });
921
922 final ExchangeViewModel exchangeViewModel;
923
924 @override
737 - Widget build(BuildContext context) {
738 - return Observer(builder: (_) {
739 - if (exchangeViewModel.depositAmount.isEmpty) return SizedBox.shrink();
740 -
741 - final provider = exchangeViewModel.forcedProvider ?? exchangeViewModel.providerDisplay;
742 - final rate = exchangeViewModel.forcedProvider == null
743 - ? exchangeViewModel.bestRate
744 - : exchangeViewModel.forcedProviderRate;
745 -
746 - return GestureDetector(
747 - onTap: () {
748 - if (provider != null) {
749 - Navigator.of(context).push(CupertinoPageRoute(
750 - builder: (context) => Material(
751 - child: ProviderSelectorPage(exchangeViewModel: exchangeViewModel),
752 - ),
753 - ));
925 + Widget build(BuildContext context) => Observer(
926 + builder: (_) {
927 + final isFetchingDeposit =
928 + exchangeViewModel.isFixedRateMode && exchangeViewModel.receiveAmount.isNotEmpty;
929 + if (exchangeViewModel.depositAmount.isEmpty && !isFetchingDeposit) {
930 + return const SizedBox.shrink();
931 }
755 - },
756 - child: Container(
757 - height: 48,
758 - decoration: BoxDecoration(
759 - color: Theme.of(context).colorScheme.surfaceContainer,
760 - borderRadius: BorderRadius.circular(16),
761 - ),
762 - child: Padding(
763 - padding: const EdgeInsets.symmetric(horizontal: 12.0),
764 - child: Row(
765 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
766 - children: [
767 - Row(
768 - spacing: 12,
769 - children: [
770 - if (provider != null)
771 - CakeImageWidget(imageUrl: provider.description.image, width: 28, height: 28),
772 - if (provider == null) CupertinoActivityIndicator(),
773 - Text(
774 - provider?.title ?? "${S.of(context).finding_provider}...",
775 - style: TextStyle(
776 - fontSize: 14,
777 - fontWeight: FontWeight.w400,
778 - color: provider == null
779 - ? Theme.of(context).colorScheme.onSurfaceVariant
780 - : Theme.of(context).colorScheme.onSurface),
781 - )
782 - ],
783 - ),
784 - if (provider != null)
785 - Row(
786 - children: [
787 - Text(
788 - "1 ${exchangeViewModel.depositCurrency} ≈ ${rate.toStringAsFixed(6)} ${exchangeViewModel.receiveCurrency}",
789 - style: TextStyle(
790 - fontSize: 14,
791 - fontWeight: FontWeight.w400,
792 - color: Theme.of(context).colorScheme.onSurfaceVariant),
793 - ),
794 - CakeImageWidget(
795 - imageUrl: "assets/new-ui/chooser.svg",
796 - colorFilter: ColorFilter.mode(
797 - Theme.of(context).colorScheme.onSurfaceVariant, BlendMode.srcIn),
798 - )
799 - ],
800 - )
801 - ],
802 - ),
803 - ),
804 - ),
805 - );
806 - });
807 - }
808 -}
809 -
810 -class SwapAmountBox extends StatefulWidget {
811 - SwapAmountBox({
812 - Key? key,
813 - required this.currency,
814 - required this.currencies,
815 - required this.onCurrencySelected,
816 - this.currencyValueValidator,
817 - this.addressTextFieldValidator,
818 - this.title = '',
819 - this.hasRefundAddress = false,
820 - this.hasAllAmount = false,
821 - this.useBaseUnit = false,
822 - this.allAmount,
823 - this.onPushPasteButton,
824 - this.onPushAddressBookButton,
825 - this.onDispose,
826 - required this.exchangeViewModel,
827 - required this.isReceiverCard,
828 - required this.walletSwitcherViewModel,
829 - }) : super(key: key);
830 -
831 - final List<Currency> currencies;
832 - final Function(Currency) onCurrencySelected;
833 - final String title;
834 - final bool isReceiverCard;
835 - final Currency currency;
836 - final bool useBaseUnit;
837 - final bool hasRefundAddress;
838 - final FormFieldValidator<String>? currencyValueValidator;
839 - final FormFieldValidator<String>? addressTextFieldValidator;
840 - final FormFieldValidator<String> allAmountValidator = AllAmountValidator();
841 - final bool hasAllAmount;
842 - final VoidCallback? allAmount;
843 - final void Function(BuildContext context)? onPushPasteButton;
844 - final void Function(BuildContext context)? onPushAddressBookButton;
845 - final Function()? onDispose;
846 - final ExchangeViewModel exchangeViewModel;
847 - final WalletSwitcherViewModel walletSwitcherViewModel;
848 -
849 - @override
850 - State<SwapAmountBox> createState() => SwapAmountBoxState();
851 -}
852 -
853 -class SwapAmountBoxState extends State<SwapAmountBox> {
854 - final addressController = TextEditingController();
855 - final amountController = TextEditingController();
856 - final fiatAmountController = TextEditingController();
857 - final amountFocusNode = FocusNode();
858 - final memoController = TextEditingController();
859 - ReactionDisposer? _memoReactionDisposer;
860 - VoidCallback? _memoListener;
861 -
862 - @override
863 - void initState() {
864 - if (widget.isReceiverCard) {
865 - memoController.text = widget.exchangeViewModel.receiveAddressExtraId;
932
867 - _memoListener = () {
868 - if (widget.exchangeViewModel.receiveAddressExtraId != memoController.text) {
869 - widget.exchangeViewModel.receiveAddressExtraId = memoController.text;
870 - }
871 - };
872 - memoController.addListener(_memoListener!);
873 -
874 - _memoReactionDisposer =
875 - reaction((_) => widget.exchangeViewModel.receiveAddressExtraId, (String value) {
876 - if (memoController.text != value) {
877 - memoController.text = value;
878 - }
879 - });
880 - }
881 -
882 - super.initState();
883 - }
884 -
885 - @override
886 - void dispose() {
887 - if (_memoListener != null) {
888 - memoController.removeListener(_memoListener!);
889 - }
890 - _memoReactionDisposer?.call();
891 - memoController.dispose();
892 - super.dispose();
893 - }
894 -
895 - bool _fiatInputMode = false;
933 + final provider = exchangeViewModel.forcedProvider ?? exchangeViewModel.providerDisplay;
934 + final rate = exchangeViewModel.forcedProvider == null
935 + ? exchangeViewModel.bestRate
936 + : exchangeViewModel.forcedProviderRate;
937
897 - @override
898 - Widget build(BuildContext context) {
899 - final currencyToShow = (widget.currency is CryptoCurrency)
900 - ? widget.exchangeViewModel.amountParsingProxy
901 - .getCryptoSymbol(widget.currency as CryptoCurrency)
902 - : widget.currency.name.toUpperCase();
903 -
904 - final chainIconPath = (widget.currency is CryptoCurrency)
905 - ? _getCurrencyChainIconPath(widget.currency as CryptoCurrency)
906 - : null;
907 -
908 - return Column(
909 - spacing: 12,
910 - crossAxisAlignment: CrossAxisAlignment.start,
911 - children: [
912 - Text(
913 - widget.title,
914 - style: TextStyle(
915 - fontSize: 12,
916 - fontWeight: FontWeight.w500,
917 - color: Theme.of(context).colorScheme.onSurfaceVariant),
918 - ),
919 - Container(
920 - decoration: ShapeDecoration(
921 - color: Theme.of(context).colorScheme.surfaceContainer,
922 - shape: RoundedSuperellipseBorder(borderRadius: BorderRadius.circular(24))),
923 - child: Padding(
924 - padding: const EdgeInsets.all(16.0),
925 - child: Column(
926 - spacing: 12,
927 - children: [
928 - GestureDetector(
929 - behavior: HitTestBehavior.opaque,
930 - onTap: amountFocusNode.requestFocus,
931 - child: Row(
932 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
933 - spacing: 4,
934 - children: [
935 - Expanded(
936 - child: Row(
937 - spacing: 4,
938 - crossAxisAlignment: CrossAxisAlignment.center,
939 - children: [
940 - Flexible(
941 - child: IntrinsicWidth(
942 - child: TextFormField(
943 - keyboardType: TextInputType.numberWithOptions(
944 - signed: false,
945 - decimal: !widget.useBaseUnit,
946 - ),
947 - validator: _fiatInputMode ? null : widget.currencyValueValidator,
948 - controller:
949 - _fiatInputMode ? fiatAmountController : amountController,
950 - focusNode: amountFocusNode,
951 - style: TextStyle(
952 - fontSize: 28,
953 - color: Theme.of(context).colorScheme.onSurface,
954 - fontWeight: FontWeight.w400,
955 - ),
956 - decoration: InputDecoration(
957 - contentPadding: EdgeInsets.zero,
958 - isDense: true,
959 - hintText: "0",
960 - fillColor: Colors.transparent,
961 - hoverColor: Colors.transparent,
962 - focusedBorder: InputBorder.none,
963 - enabledBorder: InputBorder.none,
964 - ),
965 - inputFormatters: <TextInputFormatter>[
966 - DecimalInputFormatter(
967 - maxDecimals:
968 - widget.useBaseUnit ? 0 : widget.currency.decimals,
969 - ),
970 - ],
971 - ),
972 - ),
973 - ),
974 - if (_fiatInputMode)
975 - Center(
976 - child: Text(
977 - widget.exchangeViewModel.fiat.title,
978 - style: TextStyle(
979 - fontSize: 16,
980 - color: Theme.of(context).colorScheme.onSurfaceVariant,
981 - ),
982 - ),
983 - ),
984 - ],
985 - ),
986 - ),
987 - GestureDetector(
988 - onTap: _presentCurrencyPicker,
989 - child: Container(
990 - decoration: BoxDecoration(
991 - color: Theme.of(context).colorScheme.surface,
992 - borderRadius: BorderRadius.circular(999999),
993 - ),
994 - child: Padding(
995 - padding: const EdgeInsets.only(top: 4.0, bottom: 4, left: 4, right: 4),
996 - child: Row(
997 - mainAxisAlignment: MainAxisAlignment.center,
998 - children: [
999 - CakeImageWidget(
1000 - imageUrl: widget.currency.iconPath ?? "",
1001 - width: 28,
1002 - height: 28,
1003 - ),
1004 - const SizedBox(width: 10),
1005 - Text(
1006 - currencyToShow,
1007 - textAlign: TextAlign.center,
1008 - ),
1009 - if (chainIconPath != null && chainIconPath.isNotEmpty) ...[
1010 - SizedBox(width: 4),
1011 - CakeImageWidget(
1012 - imageUrl: chainIconPath,
1013 - width: 12,
1014 - height: 12,
1015 - colorFilter: ColorFilter.mode(
1016 - Theme.of(context).colorScheme.onSurfaceVariant,
1017 - BlendMode.srcIn,
1018 - ),
1019 - ),
1020 - const SizedBox(width: 6)
1021 - ] else
1022 - const SizedBox(width: 10),
1023 - Container(
1024 - width: 16,
1025 - height: 16,
1026 - decoration: BoxDecoration(
1027 - borderRadius: BorderRadius.circular(9999999999),
1028 - color: Theme.of(context).colorScheme.surfaceContainerHigh),
1029 - child: Padding(
1030 - padding: const EdgeInsets.all(4.0),
1031 - child: RotatedBox(
1032 - quarterTurns: 2,
1033 - child: CakeImageWidget(
1034 - imageUrl: "assets/new-ui/dropdown_arrow.svg",
1035 - width: 4,
1036 - height: 4,
1037 - colorFilter: ColorFilter.mode(
1038 - Theme.of(context).colorScheme.primary,
1039 - BlendMode.srcIn,
1040 - ),
1041 - ),
1042 - ),
1043 - ),
1044 - ),
1045 - const SizedBox(width: 4),
1046 - ],
1047 - ),
1048 - ),
1049 - ),
1050 - )
1051 - ],
938 + return GestureDetector(
939 + onTap: () {
940 + if (provider != null) {
941 + Navigator.of(context).push(
942 + CupertinoPageRoute(
943 + builder: (context) => Material(
944 + child: ProviderSelectorPage(exchangeViewModel: exchangeViewModel),
945 + ),
946 ),
1053 - ),
1054 - Observer(
1055 - builder: (_) {
1056 - final hasAllAmount = !(widget.isReceiverCard ||
1057 - widget.exchangeViewModel.isSendFromExternal ||
1058 - !widget.exchangeViewModel.hasAllAmount);
1059 -
1060 - return FiatAmountBar(
1061 - foregroundElementColor: Theme.of(context).colorScheme.surfaceContainerHigh,
1062 - textColor: Theme.of(context).colorScheme.onSurfaceVariant,
1063 - allAmountColor: hasAllAmount ? null : Colors.transparent,
1064 - allAmountTextColor:
1065 - hasAllAmount ? null : Theme.of(context).colorScheme.onSurfaceVariant,
1066 - fiatInputMode: _fiatInputMode,
1067 - allAmount: !hasAllAmount
1068 - ? widget.isReceiverCard
1069 - ? null
1070 - : widget.exchangeViewModel.balanceDisplay
1071 - : widget.exchangeViewModel.depositAvailableAmount,
1072 - onSwitchButtonPressed: () {
1073 - setState(() => _fiatInputMode = !_fiatInputMode);
1074 - if (_fiatInputMode) {
1075 - updateFiatAmount();
1076 - } else {
1077 - amountController.text = widget.exchangeViewModel.depositAmount;
1078 - }
1079 - },
1080 - onAllButtonPressed: () {
1081 - setState(() {
1082 - _fiatInputMode = false;
1083 - });
1084 - widget.allAmount?.call();
1085 - },
1086 - cryptoAmount: widget.isReceiverCard
1087 - ? widget.exchangeViewModel.roundedReceiveAmount(6)
1088 - : widget.exchangeViewModel.roundedDepositAmount(6),
1089 - fiatAmount: widget.isReceiverCard
1090 - ? widget.exchangeViewModel.roundedReceiveAmountFiat(6)
1091 - : widget.exchangeViewModel.roundedDepositAmountFiat(6),
1092 - cryptoCurrencySymbol: currencyToShow,
1093 - fiatCurrencySymbol: widget.exchangeViewModel.fiat.symbol,
1094 - );
1095 - },
1096 - ),
1097 - Observer(
1098 - builder: (_) {
1099 - final addressEmpty = (widget.isReceiverCard &&
1100 - widget.exchangeViewModel.receiveAddress.isEmpty) ||
1101 - (!widget.isReceiverCard && widget.exchangeViewModel.depositAddress.isEmpty);
1102 - final addressPickerText = widget.isReceiverCard
1103 - ? (addressEmpty ? S.of(context).select_receiver : S.of(context).to)
1104 - : S.of(context).from;
1105 - final addressDescription = widget.isReceiverCard
1106 - ? widget.exchangeViewModel.receiveAddressDisplayName ??
1107 - _middleTruncate(widget.exchangeViewModel.receiveAddress, 8, 8)
1108 - : widget.exchangeViewModel.isSendFromExternal
1109 - ? S.of(context).external
1110 - : widget.exchangeViewModel.wallet.name;
1111 - return Row(
1112 - spacing: 8,
947 + );
948 + }
949 + },
950 + child: Container(
951 + height: 48,
952 + decoration: BoxDecoration(
953 + color: Theme.of(context).colorScheme.surfaceContainer,
954 + borderRadius: BorderRadius.circular(16),
955 + ),
956 + child: Padding(
957 + padding: const EdgeInsets.symmetric(horizontal: 12),
958 + child: Row(
959 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
960 + children: [
961 + Row(
962 + spacing: 12,
963 children: [
1114 - Flexible(
1115 - child: GestureDetector(
1116 - onTap: _presentWalletPicker,
1117 - child: Container(
1118 - height: 36,
1119 - decoration: BoxDecoration(
1120 - color: (addressEmpty && widget.isReceiverCard)
1121 - ? Theme.of(context).colorScheme.primary
1122 - : Theme.of(context).colorScheme.surfaceContainerHigh,
1123 - borderRadius: BorderRadius.circular(9999)),
1124 - child: Padding(
1125 - padding: const EdgeInsets.symmetric(horizontal: 12.0),
1126 - child: Observer(
1127 - builder: (_) => Row(
1128 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
1129 - children: [
1130 - Row(
1131 - spacing: 8,
1132 - mainAxisSize: MainAxisSize.max,
1133 - children: [
1134 - Text(
1135 - addressPickerText,
1136 - style: TextStyle(
1137 - fontSize: 12,
1138 - fontWeight: FontWeight.w500,
1139 - color: (addressEmpty && widget.isReceiverCard)
1140 - ? Theme.of(context).colorScheme.onPrimary
1141 - : Theme.of(context).colorScheme.onSurface),
1142 - ),
1143 - Text(
1144 - addressDescription,
1145 - style: TextStyle(
1146 - fontSize: 12,
1147 - fontWeight: FontWeight.w500,
1148 - color: Theme.of(context).colorScheme.primary),
1149 - )
1150 - ],
1151 - ),
1152 - RotatedBox(
1153 - quarterTurns: 2,
1154 - child: CakeImageWidget(
1155 - imageUrl: "assets/new-ui/dropdown_arrow.svg",
1156 - colorFilter: ColorFilter.mode(
1157 - (addressEmpty && widget.isReceiverCard)
1158 - ? Theme.of(context).colorScheme.onPrimary
1159 - : Theme.of(context).colorScheme.onSurface,
1160 - BlendMode.srcIn,
1161 - ),
1162 - ),
1163 - )
1164 - ],
1165 - ),
1166 - ),
1167 - ),
1168 - ),
964 + if (provider != null)
965 + CakeImageWidget(
966 + imageUrl: provider.description.image,
967 + width: 28,
968 + height: 28,
969 ),
1170 - ),
1171 - if (!widget.isReceiverCard &&
1172 - widget.exchangeViewModel.isSendFromExternal &&
1173 - widget.exchangeViewModel.depositAddress.isEmpty)
1174 - ModernButton.svg(
1175 - svgPath: "assets/new-ui/refund_address.svg",
1176 - onPressed: askForRefundAddress,
1177 - size: 36,
1178 - iconSize: 18,
1179 - backgroundColor: Theme.of(context).colorScheme.surfaceContainerHighest,
1180 - semanticLabel: S.of(context).refund_address,
970 + if (provider == null) const CupertinoActivityIndicator(),
971 + Text(
972 + provider?.title ?? "${S.of(context).finding_provider}...",
973 + style: TextStyle(
974 + fontSize: 14,
975 + fontWeight: FontWeight.w400,
976 + color: provider == null
977 + ? Theme.of(context).colorScheme.onSurfaceVariant
978 + : Theme.of(context).colorScheme.onSurface,
979 ),
1182 - if (widget.isReceiverCard &&
1183 - widget.exchangeViewModel.receiveAddress.isEmpty) ...[
1184 - ModernButton.svg(
1185 - svgPath: "assets/new-ui/paste.svg",
1186 - onPressed: () => widget.onPushPasteButton?.call(context),
1187 - size: 36,
1188 - iconSize: 20,
1189 - backgroundColor: Theme.of(context).colorScheme.surfaceContainerHighest,
1190 - semanticLabel: S.of(context).paste,
980 + ),
981 + ],
982 + ),
983 + if (provider != null)
984 + Row(
985 + children: [
986 + Text(
987 + "1 ${exchangeViewModel.depositCurrency} ≈ ${rate.toStringAsFixed(6)} ${exchangeViewModel.receiveCurrency}",
988 + style: TextStyle(
989 + fontSize: 14,
990 + fontWeight: FontWeight.w400,
991 + color: Theme.of(context).colorScheme.onSurfaceVariant,
992 + ),
993 ),
1192 - ModernButton.svg(
1193 - svgPath: "assets/new-ui/scan.svg",
1194 - onPressed: () => _presentQRScanner(context),
1195 - size: 36,
1196 - iconSize: 20,
1197 - backgroundColor: Theme.of(context).colorScheme.surfaceContainerHighest,
1198 - semanticLabel: S.of(context).scan,
994 + CakeImageWidget(
995 + imageUrl: "assets/new-ui/chooser.svg",
996 + colorFilter: ColorFilter.mode(
997 + Theme.of(context).colorScheme.onSurfaceVariant,
998 + BlendMode.srcIn,
999 + ),
1000 ),
1200 - ]
1201 - ],
1202 - );
1203 - },
1001 + ],
1002 + ),
1003 + ],
1004 ),
1205 - if (widget.isReceiverCard)
1206 - Observer(builder: (_) {
1207 - final selected = widget.exchangeViewModel.receiveCurrency;
1208 - final labelType = memoLabelTypeFor(selected);
1209 - if (labelType == null) return const SizedBox.shrink();
1210 -
1211 - final isDestinationTag = labelType == MemoLabelType.destinationTag;
1212 - final hint = isDestinationTag
1213 - ? S.of(context).destination_tag_optional
1214 - : S.of(context).memo_optional;
1215 - final disclaimer = isDestinationTag
1216 - ? S.of(context).destination_tag_swap_disclaimer
1217 - : S.of(context).memo_swap_disclaimer;
1218 -
1219 - return NewSendMemoInput(
1220 - memoController: memoController,
1221 - maxMemoLength: isDestinationTag ? 20 : 256,
1222 - memoLength: memoController.text.length,
1223 - hintText: hint,
1224 - disclaimerText: disclaimer,
1225 - );
1226 - }),
1227 - ],
1228 - ),
1229 - ),
1230 - ),
1231 - ],
1232 - );
1233 - }
1234 -
1235 - void changeAddress({required String address}) {
1236 - setState(() => addressController.text = _normalizeAddressFormat(address));
1237 - }
1238 -
1239 - void changeAmount({required String amount}) {
1240 - setState(() => amountController.text = amount);
1241 - }
1242 -
1243 - String _normalizeAddressFormat(String address) {
1244 - if (address.startsWith('bitcoincash:')) address = address.substring(12);
1245 - return address;
1246 - }
1247 -
1248 - void _presentCurrencyPicker() {
1249 - final rawCurrencies = widget.isReceiverCard
1250 - ? widget.exchangeViewModel.receiveCurrencies
1251 - : widget.exchangeViewModel.depositCurrencies;
1252 - final currencies = rawCurrencies.whereType<CryptoCurrency>().toList();
1253 - appendEvmDefaultTokens(currencies);
1254 - if (widget.exchangeViewModel.wallet.type == WalletType.bitcoin) {
1255 - currencies.sort((a, b) {
1256 - if (a == CryptoCurrency.btcln) return -1;
1257 - if (b == CryptoCurrency.btcln) return 1;
1258 - return 0;
1259 - });
1260 - }
1261 -
1262 - final selected = widget.isReceiverCard
1263 - ? widget.exchangeViewModel.receiveCurrency
1264 - : widget.exchangeViewModel.depositCurrency;
1265 -
1266 - CurrencyPickerSheet.show(
1267 - context: context,
1268 - args: CurrencyPickerArgs(
1269 - items: currencies,
1270 - selected: selected,
1271 - recentsSource: RecentsSource.trades,
1272 - onSelected: widget.onCurrencySelected,
1273 - symbolResolver: widget.exchangeViewModel.amountParsingProxy.getCryptoSymbol,
1274 - ),
1275 - );
1276 - }
1277 -
1278 - Future<void> _presentQRScanner(BuildContext context) async {
1279 - bool isCameraPermissionGranted =
1280 - await PermissionHandler.checkPermission(Permission.camera, context);
1281 - if (!isCameraPermissionGranted) return;
1282 - final code = await presentQRScanner(context);
1283 - if (code == null) return;
1284 - if (code.isEmpty) return;
1285 -
1286 - try {
1287 - final uri = Uri.parse(code);
1288 - widget.exchangeViewModel.receiveAddress = uri.path;
1289 - } catch (_) {}
1290 - }
1291 -
1292 - void _presentWalletPicker() async {
1293 - final res = await showMaterialModalBottomSheet(
1294 - context: context,
1295 - backgroundColor: Colors.transparent,
1296 - builder: (context) {
1297 - return ConstrainedBox(
1298 - constraints: BoxConstraints(
1299 - maxHeight: MediaQuery.of(context).size.height * 0.6,
1300 - ),
1301 - child: SwapAddressSelectionModal(
1302 - isSelectingReceiver: widget.isReceiverCard,
1303 - exchangeViewModel: widget.exchangeViewModel,
1005 + ),
1006 ),
1007 );
1306 - });
1307 - if (res != null && res is SwapAddressSelectionResult) {
1308 - if (widget.isReceiverCard) {
1309 - widget.exchangeViewModel.selectedAddressBookWallet = res.walletInfo;
1310 - widget.exchangeViewModel.receiveAddress = res.address!;
1311 - if (res.walletInfo?.name != null) {
1312 - if (res.accountName != null) {
1313 - widget.exchangeViewModel.receiveAddressDisplayName =
1314 - "${res.walletInfo!.name} → ${res.accountName}";
1315 - } else {
1316 - widget.exchangeViewModel.receiveAddressDisplayName = res.walletInfo!.name;
1317 - }
1318 - }
1319 - } else if (res.address == null || res.address!.isEmpty) {
1320 - widget.exchangeViewModel.isSendFromExternal = true;
1321 - askForRefundAddress();
1322 - } else {
1323 - widget.exchangeViewModel.isSendFromExternal = false;
1324 - switchToDepositWallet(res.walletInfo!.name);
1325 - }
1326 - }
1327 - }
1328 -
1329 - void switchToDepositWallet(String walletName) async {
1330 - final walletType = cryptoCurrencyOrTokenToWalletType(widget.exchangeViewModel.depositCurrency);
1331 - if (walletType == null) return;
1332 - final wallet = await WalletInfo.get(walletName, walletType);
1333 - if (wallet == null) return;
1334 - widget.exchangeViewModel.depositAddress = wallet.address;
1335 - addressController.text = _normalizeAddressFormat(wallet.address);
1336 - widget.walletSwitcherViewModel.selectWallet(wallet);
1337 - await widget.walletSwitcherViewModel.switchToSelectedWallet();
1338 - }
1339 -
1340 - void askForRefundAddress() async {
1341 - final refundAddress = await showModalBottomSheet(
1342 - context: context,
1343 - isScrollControlled: true,
1344 - backgroundColor: Colors.transparent,
1345 - builder: (context) => RefundAddressModal(
1346 - selectedCurrency: widget.exchangeViewModel.depositCurrency,
1347 - isFromWalletSelection: true,
1348 - ));
1349 - if (refundAddress != null && refundAddress is String) {
1350 - widget.exchangeViewModel.depositAddress = refundAddress;
1351 - } else {
1352 - widget.exchangeViewModel.depositAddress = "";
1353 - }
1354 - }
1355 -
1356 - void updateFiatAmount() {
1357 - final newText = widget.isReceiverCard
1358 - ? widget.exchangeViewModel.receiveAmountFiat
1359 - : widget.exchangeViewModel.depositAmountFiat;
1360 -
1361 - if (double.tryParse(fiatAmountController.text) != double.tryParse(newText)) {
1362 - if (newText == "0.00") {
1363 - fiatAmountController.text = "";
1364 - } else {
1365 - fiatAmountController.text =
1366 - newText.replaceAll(RegExp(r'(?<=\.\d*)0+$'), '').replaceAll(RegExp(r'\.$'), '');
1367 - }
1368 - }
1369 - }
1370 -
1371 - String _middleTruncate(String s, int head, int tail) {
1372 - if (s.length <= head + tail + 3) return s;
1373 - return s.substring(0, head) + '...' + s.substring(s.length - tail);
1374 - }
1375 -
1376 - String? _getCurrencyChainIconPath(CryptoCurrency curr) {
1377 - try {
1378 - if (curr.chainIconPath != null) return curr.chainIconPath!;
1379 -
1380 - if (curr.tag != null) {
1381 - final currencyFromTag = CryptoCurrency.fromString(curr.tag!);
1382 -
1383 - if (currencyFromTag.chainIconPath != null) return currencyFromTag.chainIconPath!;
1384 - }
1385 - } catch (_) {}
1386 - return null;
1387 - }
1008 + },
1009 + );
1010 }
lib/new-ui/widgets/anypay/evm_address_detected_sheet.dart new
+131
@@ -0,0 +1,131 @@
1 +import "package:cake_wallet/generated/i18n.dart";
2 +import "package:cake_wallet/new-ui/widgets/anypay/select_recipient_network_sheet.dart";
3 +import "package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart";
4 +import "package:cake_wallet/src/widgets/cake_image_widget.dart";
5 +import "package:flutter/material.dart";
6 +
7 +class EvmAddressDetectedSheet extends StatelessWidget {
8 + const EvmAddressDetectedSheet({super.key, required this.networks});
9 +
10 + final List<RecipientNetworkItem> networks;
11 +
12 + static Future<int?> show({
13 + required BuildContext context,
14 + required List<RecipientNetworkItem> networks,
15 + }) {
16 + return showModalBottomSheet<int>(
17 + context: context,
18 + isScrollControlled: true,
19 + useSafeArea: true,
20 + backgroundColor: Colors.transparent,
21 + builder: (_) => EvmAddressDetectedSheet(networks: networks),
22 + );
23 + }
24 +
25 + @override
26 + Widget build(BuildContext context) {
27 + final colors = Theme.of(context).colorScheme;
28 + return Container(
29 + decoration: BoxDecoration(
30 + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)),
31 + color: colors.surface,
32 + ),
33 + child: SafeArea(
34 + top: false,
35 + child: Column(
36 + children: [
37 + ModalTopBar(
38 + title: "",
39 + trailingIcon: const Icon(Icons.close),
40 + onTrailingPressed: () => Navigator.of(context).maybePop(),
41 + ),
42 + const SizedBox(height: 32),
43 + StackedNetworkIcons(iconPaths: networks.map((n) => n.iconPath).toList()),
44 + const SizedBox(height: 24),
45 + Text(
46 + S.of(context).evm_address_detected,
47 + textAlign: TextAlign.center,
48 + style: Theme.of(context)
49 + .textTheme
50 + .titleLarge
51 + ?.copyWith(fontSize: 20, fontWeight: FontWeight.w500, letterSpacing: -0.1),
52 + ),
53 + const SizedBox(height: 24),
54 + Padding(
55 + padding: const EdgeInsets.symmetric(horizontal: 32),
56 + child: Text(
57 + S.of(context).select_recipient_network_for_tx,
58 + textAlign: TextAlign.center,
59 + style: Theme.of(context)
60 + .textTheme
61 + .bodyMedium
62 + ?.copyWith(color: colors.onSurfaceVariant, letterSpacing: -0.07),
63 + ),
64 + ),
65 + const SizedBox(height: 64),
66 + Flexible(
67 + child: SingleChildScrollView(
68 + padding: const EdgeInsets.symmetric(horizontal: 16),
69 + child: NetworkListCard(
70 + rows: [
71 + for (final network in networks)
72 + RecipientNetworkListRow(
73 + item: network,
74 + imageOverride: network.chainBadgeIconPath,
75 + onTap: () => Navigator.of(context).pop(network.chainId),
76 + ),
77 + ],
78 + ),
79 + ),
80 + ),
81 + const SizedBox(height: 16),
82 + ],
83 + ),
84 + ),
85 + );
86 + }
87 +}
88 +
89 +class StackedNetworkIcons extends StatelessWidget {
90 + const StackedNetworkIcons({
91 + required this.iconPaths,
92 + this.size = 50,
93 + this.step = 34,
94 + });
95 +
96 + final List<String> iconPaths;
97 + final double size;
98 + final double step;
99 +
100 + @override
101 + Widget build(BuildContext context) {
102 + if (iconPaths.isEmpty) return const SizedBox.shrink();
103 +
104 + final colors = Theme.of(context).colorScheme;
105 + final width = size + (iconPaths.length - 1) * step;
106 +
107 + return SizedBox(
108 + height: size,
109 + width: width,
110 + child: Stack(
111 + children: [
112 + for (int i = 0; i < iconPaths.length; i++)
113 + Positioned(
114 + left: i * step,
115 + child: Container(
116 + width: size,
117 + height: size,
118 + padding: const EdgeInsets.all(2),
119 + decoration: BoxDecoration(
120 + shape: BoxShape.circle,
121 + color: colors.surfaceContainer,
122 + border: Border.all(color: colors.surface, width: 2),
123 + ),
124 + child: CakeImageWidget(imageUrl: iconPaths[i], fit: BoxFit.contain),
125 + ),
126 + ),
127 + ],
128 + ),
129 + );
130 + }
131 +}
lib/new-ui/widgets/anypay/recipient_network_row.dart new
+100
@@ -0,0 +1,100 @@
1 +import "package:cake_wallet/evm/evm.dart";
2 +import "package:cake_wallet/generated/i18n.dart";
3 +import "package:cake_wallet/src/widgets/cake_image_widget.dart";
4 +import "package:cw_core/currency_for_wallet_type.dart";
5 +import "package:cw_core/utils/print_verbose.dart";
6 +import "package:cw_core/wallet_base.dart";
7 +import "package:flutter/material.dart";
8 +
9 +class RecipientNetworkSelector extends StatelessWidget {
10 + const RecipientNetworkSelector({
11 + super.key,
12 + required this.wallet,
13 + required this.onTap,
14 + });
15 +
16 + final WalletBase wallet;
17 + final void Function(ChainInfo currentChain) onTap;
18 +
19 + @override
20 + Widget build(BuildContext context) {
21 + if (evm == null) return const SizedBox.shrink();
22 +
23 + final currentChainId =
24 + evm!.getSelectedChainId(wallet) ?? evm!.getChainIdByWalletType(wallet.type);
25 + final currentChain = evm!.getChainInfoByChainId(currentChainId);
26 + if (currentChain == null) {
27 + printV("RecipientNetworkSelector: no chain info for chainId $currentChainId");
28 + return const SizedBox.shrink();
29 + }
30 +
31 + return _RecipientNetworkRow(
32 + networkName: currentChain.name,
33 + networkIconPath: symbolIconPathForWalletType(wallet.type) ?? "",
34 + onTap: () => onTap(currentChain),
35 + );
36 + }
37 +}
38 +
39 +class _RecipientNetworkRow extends StatelessWidget {
40 + const _RecipientNetworkRow({
41 + required this.networkName,
42 + required this.networkIconPath,
43 + required this.onTap,
44 + });
45 +
46 + final String networkName;
47 + final String networkIconPath;
48 + final VoidCallback onTap;
49 +
50 + @override
51 + Widget build(BuildContext context) {
52 + final colors = Theme.of(context).colorScheme;
53 + return GestureDetector(
54 + onTap: onTap,
55 + child: Row(
56 + mainAxisSize: MainAxisSize.min,
57 + children: [
58 + Text(
59 + S.of(context).network_prefix_on,
60 + style: Theme.of(context)
61 + .textTheme
62 + .bodyMedium
63 + ?.copyWith(color: colors.onSurfaceVariant, letterSpacing: -0.07),
64 + ),
65 + const SizedBox(width: 12),
66 + CakeImageWidget(
67 + imageUrl: networkIconPath,
68 + width: 16,
69 + height: 16,
70 + fit: BoxFit.cover,
71 + color: isMonochromeSymbolIcon(networkIconPath) ? colors.primary : null,
72 + ),
73 + const SizedBox(width: 8),
74 + Text(
75 + networkName,
76 + style: Theme.of(context).textTheme.bodyMedium?.copyWith(
77 + fontWeight: FontWeight.w400,
78 + letterSpacing: -0.07,
79 + color: colors.primary,
80 + ),
81 + ),
82 + const SizedBox(width: 8),
83 + Container(
84 + width: 28,
85 + height: 28,
86 + decoration: BoxDecoration(
87 + color: colors.surfaceContainer,
88 + shape: BoxShape.circle,
89 + ),
90 + child: Icon(
91 + Icons.keyboard_arrow_down,
92 + size: 18,
93 + color: colors.onSurfaceVariant,
94 + ),
95 + ),
96 + ],
97 + ),
98 + );
99 + }
100 +}
lib/new-ui/widgets/anypay/select_recipient_network_sheet.dart new
+243
@@ -0,0 +1,243 @@
1 +import "package:cake_wallet/generated/i18n.dart";
2 +import "package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart";
3 +import "package:cake_wallet/src/widgets/cake_image_widget.dart";
4 +import "package:cw_core/currency_for_wallet_type.dart";
5 +import "package:flutter/material.dart";
6 +
7 +class RecipientNetworkItem {
8 + const RecipientNetworkItem({
9 + required this.chainId,
10 + required this.name,
11 + required this.iconPath,
12 + this.chainBadgeIconPath,
13 + });
14 +
15 + final int chainId;
16 + final String name;
17 + final String iconPath;
18 + final String? chainBadgeIconPath;
19 +}
20 +
21 +class SelectRecipientNetworkSheet extends StatelessWidget {
22 + const SelectRecipientNetworkSheet({
23 + super.key,
24 + required this.networks,
25 + required this.currentChainId,
26 + });
27 +
28 + final List<RecipientNetworkItem> networks;
29 + final int currentChainId;
30 +
31 + static Future<int?> show({
32 + required BuildContext context,
33 + required List<RecipientNetworkItem> networks,
34 + required int currentChainId,
35 + }) {
36 + return showModalBottomSheet<int>(
37 + context: context,
38 + isScrollControlled: true,
39 + useSafeArea: true,
40 + enableDrag: false,
41 + isDismissible: false,
42 + backgroundColor: Colors.transparent,
43 + builder: (_) => SelectRecipientNetworkSheet(
44 + networks: networks,
45 + currentChainId: currentChainId,
46 + ),
47 + );
48 + }
49 +
50 + @override
51 + Widget build(BuildContext context) {
52 + final colors = Theme.of(context).colorScheme;
53 +
54 + RecipientNetworkItem? current;
55 + final compatible = <RecipientNetworkItem>[];
56 + for (final network in networks) {
57 + if (network.chainId == currentChainId && current == null) {
58 + current = network;
59 + } else {
60 + compatible.add(network);
61 + }
62 + }
63 +
64 + return Container(
65 + decoration: BoxDecoration(
66 + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)),
67 + color: colors.surface,
68 + ),
69 + child: SafeArea(
70 + top: false,
71 + child: Column(
72 + children: [
73 + ModalTopBar(
74 + title: "",
75 + trailingIcon: const Icon(Icons.close),
76 + onTrailingPressed: () => Navigator.of(context).maybePop(),
77 + ),
78 + const SizedBox(height: 32),
79 + CakeImageWidget(
80 + imageUrl: "assets/new-ui/network_cube.svg",
81 + width: 75,
82 + height: 75,
83 + colorFilter: ColorFilter.mode(colors.onSurfaceVariant, BlendMode.srcIn),
84 + ),
85 + const SizedBox(height: 24),
86 + Text(
87 + S.of(context).select_recipient_network,
88 + textAlign: TextAlign.center,
89 + style: Theme.of(context)
90 + .textTheme
91 + .titleLarge
92 + ?.copyWith(fontSize: 20, fontWeight: FontWeight.w500, letterSpacing: -0.1),
93 + ),
94 + const SizedBox(height: 24),
95 + Padding(
96 + padding: const EdgeInsets.symmetric(horizontal: 32),
97 + child: Text(
98 + S.of(context).select_recipient_network_description,
99 + textAlign: TextAlign.center,
100 + style: Theme.of(context)
101 + .textTheme
102 + .bodyMedium
103 + ?.copyWith(color: colors.onSurfaceVariant, letterSpacing: -0.07),
104 + ),
105 + ),
106 + const SizedBox(height: 32),
107 + Flexible(
108 + child: SingleChildScrollView(
109 + padding: const EdgeInsets.symmetric(horizontal: 16),
110 + child: Column(
111 + crossAxisAlignment: CrossAxisAlignment.start,
112 + children: [
113 + if (current != null) ...[
114 + NetworkListCard(
115 + rows: [
116 + RecipientNetworkListRow(
117 + item: current,
118 + subtitle: S.of(context).current_network,
119 + onTap: () => Navigator.of(context).pop(current!.chainId),
120 + ),
121 + ],
122 + ),
123 + const SizedBox(height: 24),
124 + ],
125 + if (compatible.isNotEmpty) ...[
126 + Text(
127 + S.of(context).compatible_networks,
128 + style: Theme.of(context)
129 + .textTheme
130 + .bodySmall
131 + ?.copyWith(color: colors.onSurfaceVariant, letterSpacing: -0.06),
132 + ),
133 + const SizedBox(height: 12),
134 + NetworkListCard(
135 + rows: [
136 + for (final network in compatible)
137 + RecipientNetworkListRow(
138 + item: network,
139 + onTap: () => Navigator.of(context).pop(network.chainId),
140 + ),
141 + ],
142 + ),
143 + ],
144 + const SizedBox(height: 16),
145 + ],
146 + ),
147 + ),
148 + ),
149 + ],
150 + ),
151 + ),
152 + );
153 + }
154 +}
155 +
156 +class NetworkListCard extends StatelessWidget {
157 + const NetworkListCard({required this.rows});
158 +
159 + final List<Widget> rows;
160 +
161 + @override
162 + Widget build(BuildContext context) {
163 + final colors = Theme.of(context).colorScheme;
164 + return Container(
165 + decoration: BoxDecoration(
166 + color: colors.surfaceContainer,
167 + borderRadius: BorderRadius.circular(20),
168 + ),
169 + clipBehavior: Clip.antiAlias,
170 + child: Column(
171 + mainAxisSize: MainAxisSize.min,
172 + children: [
173 + for (var i = 0; i < rows.length; i++) ...[
174 + rows[i],
175 + if (i != rows.length - 1)
176 + Divider(
177 + height: 1,
178 + thickness: 1,
179 + color: colors.surfaceContainerHigh,
180 + indent: 48,
181 + endIndent: 12,
182 + ),
183 + ],
184 + ],
185 + ),
186 + );
187 + }
188 +}
189 +
190 +class RecipientNetworkListRow extends StatelessWidget {
191 + const RecipientNetworkListRow(
192 + {super.key, required this.item, required this.onTap, this.subtitle, this.imageOverride});
193 +
194 + final String? subtitle;
195 + final String? imageOverride;
196 + final VoidCallback onTap;
197 + final RecipientNetworkItem item;
198 +
199 + @override
200 + Widget build(BuildContext context) {
201 + final colors = Theme.of(context).colorScheme;
202 + return InkWell(
203 + onTap: onTap,
204 + child: Padding(
205 + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 14),
206 + child: Row(
207 + children: [
208 + CakeImageWidget(
209 + imageUrl: imageOverride ?? item.iconPath,
210 + width: 24,
211 + height: 24,
212 + fit: BoxFit.cover,
213 + color: isMonochromeSymbolIcon(imageOverride ?? item.iconPath) ? colors.primary : null,
214 + ),
215 + const SizedBox(width: 12),
216 + Expanded(
217 + child: Column(
218 + crossAxisAlignment: CrossAxisAlignment.start,
219 + spacing: 4,
220 + children: [
221 + Text(
222 + item.name,
223 + style: Theme.of(context)
224 + .textTheme
225 + .bodyMedium
226 + ?.copyWith(fontWeight: FontWeight.w400, letterSpacing: -0.07),
227 + ),
228 + if (subtitle != null)
229 + Text(
230 + subtitle!,
231 + style: Theme.of(context).textTheme.bodySmall?.copyWith(
232 + color: colors.onSurfaceVariant, letterSpacing: -0.06, fontSize: 12),
233 + ),
234 + ],
235 + ),
236 + ),
237 + Icon(Icons.chevron_right, size: 16, color: colors.onSurfaceVariant),
238 + ],
239 + ),
240 + ),
241 + );
242 + }
243 +}
lib/new-ui/widgets/anypay/send_to_network_page.dart new
+122
@@ -0,0 +1,122 @@
1 +import "package:cake_wallet/generated/i18n.dart";
2 +import "package:cake_wallet/new-ui/widgets/new_primary_button.dart";
3 +import "package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart";
4 +import "package:cake_wallet/src/widgets/cake_image_widget.dart";
5 +import "package:cw_core/currency_for_wallet_type.dart";
6 +import "package:flutter/material.dart";
7 +
8 +class SendToNetworkPage extends StatelessWidget {
9 + const SendToNetworkPage({
10 + required this.title,
11 + required this.destinationNetworkName,
12 + required this.destinationIconPath,
13 + required this.currentNetworkName,
14 + required this.onSwitchWallet,
15 + required this.onSwap,
16 + super.key,
17 + });
18 +
19 + final String title;
20 + final String destinationNetworkName;
21 + final String destinationIconPath;
22 + final String currentNetworkName;
23 + final VoidCallback onSwitchWallet;
24 + final VoidCallback onSwap;
25 +
26 + @override
27 + Widget build(BuildContext context) {
28 + final colors = Theme.of(context).colorScheme;
29 + return Material(
30 + color: colors.surface,
31 + child: SafeArea(
32 + child: Column(
33 + children: [
34 + ModalTopBar(
35 + title: "",
36 + leadingIcon: const Icon(Icons.arrow_back_ios_new),
37 + leadingSemanticLabel: S.of(context).seed_alert_back,
38 + onLeadingPressed: () => Navigator.of(context).maybePop(),
39 + trailingIcon: const Icon(Icons.close),
40 + trailingSemanticLabel: S.of(context).close,
41 + onTrailingPressed: () => Navigator.of(context).maybePop(),
42 + ),
43 + Expanded(
44 + child: Center(
45 + child: Padding(
46 + padding: const EdgeInsets.symmetric(horizontal: 24),
47 + child: Column(
48 + mainAxisSize: MainAxisSize.min,
49 + children: [
50 + CakeImageWidget(
51 + imageUrl: destinationIconPath,
52 + width: 75,
53 + height: 75,
54 + fit: BoxFit.contain,
55 + color: isMonochromeSymbolIcon(destinationIconPath) ? colors.primary : null,
56 + ),
57 + const SizedBox(height: 24),
58 + Text(
59 + title,
60 + textAlign: TextAlign.center,
61 + style: Theme.of(context).textTheme.titleLarge?.copyWith(
62 + fontSize: 20,
63 + fontWeight: FontWeight.w500,
64 + letterSpacing: -0.1,
65 + ),
66 + ),
67 + const SizedBox(height: 16),
68 + Text(
69 + S.of(context).send_to_network_description(
70 + destinationNetworkName,
71 + currentNetworkName,
72 + ),
73 + textAlign: TextAlign.center,
74 + style: Theme.of(context)
75 + .textTheme
76 + .bodyMedium
77 + ?.copyWith(color: colors.onSurfaceVariant, letterSpacing: -0.07),
78 + ),
79 + ],
80 + ),
81 + ),
82 + ),
83 + ),
84 + Padding(
85 + padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
86 + child: Column(
87 + mainAxisSize: MainAxisSize.min,
88 + children: [
89 + NewPrimaryButton(
90 + onPressed: onSwitchWallet,
91 + image: CakeImageWidget(
92 + imageUrl: "assets/new-ui/wallet_filled.svg",
93 + width: 24,
94 + height: 24,
95 + colorFilter: ColorFilter.mode(colors.onPrimary, BlendMode.srcIn),
96 + ),
97 + text: S.of(context).switch_to_x_wallet(destinationNetworkName),
98 + color: colors.primary,
99 + textColor: colors.onPrimary,
100 + ),
101 + const SizedBox(height: 12),
102 + NewPrimaryButton(
103 + onPressed: onSwap,
104 + image: CakeImageWidget(
105 + imageUrl: "assets/new-ui/swap_arrows.svg",
106 + width: 24,
107 + height: 24,
108 + colorFilter: ColorFilter.mode(colors.primary, BlendMode.srcIn),
109 + ),
110 + text: S.of(context).swap_from_network(currentNetworkName),
111 + color: colors.surfaceContainer,
112 + textColor: colors.primary,
113 + ),
114 + ],
115 + ),
116 + ),
117 + ],
118 + ),
119 + ),
120 + );
121 + }
122 +}
lib/new-ui/widgets/anypay/swap_from_network_page.dart new
+140
@@ -0,0 +1,140 @@
1 +import "package:cake_wallet/generated/i18n.dart";
2 +import "package:cake_wallet/new-ui/widgets/new_primary_button.dart";
3 +import "package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart";
4 +import "package:cake_wallet/src/widgets/cake_image_widget.dart";
5 +import "package:cw_core/currency_for_wallet_type.dart";
6 +import "package:flutter/material.dart";
7 +
8 +class SwapFromNetworkPage extends StatelessWidget {
9 + const SwapFromNetworkPage({
10 + required this.title,
11 + required this.primaryButtonText,
12 + required this.destinationNetworkName,
13 + required this.destinationNetworkIconPath,
14 + required this.currentNetworkName,
15 + required this.currentNetworkIconPath,
16 + required this.onProceed,
17 + super.key,
18 + this.primaryHasSwapIcon = false,
19 + });
20 +
21 + final String title;
22 + final String primaryButtonText;
23 + final bool primaryHasSwapIcon;
24 + final String destinationNetworkName;
25 + final String destinationNetworkIconPath;
26 + final String currentNetworkName;
27 + final String currentNetworkIconPath;
28 + final VoidCallback onProceed;
29 +
30 + @override
31 + Widget build(BuildContext context) {
32 + final colors = Theme.of(context).colorScheme;
33 + return Material(
34 + color: colors.surface,
35 + child: SafeArea(
36 + child: Column(
37 + children: [
38 + ModalTopBar(
39 + title: "",
40 + leadingIcon: const Icon(Icons.arrow_back_ios_new),
41 + leadingSemanticLabel: S.of(context).seed_alert_back,
42 + onLeadingPressed: () => Navigator.of(context).maybePop(),
43 + trailingIcon: const Icon(Icons.close),
44 + trailingSemanticLabel: S.of(context).close,
45 + onTrailingPressed: () => Navigator.of(context).maybePop(),
46 + ),
47 + Expanded(
48 + child: Center(
49 + child: Padding(
50 + padding: const EdgeInsets.symmetric(horizontal: 24),
51 + child: Column(
52 + mainAxisSize: MainAxisSize.min,
53 + children: [
54 + Row(
55 + mainAxisSize: MainAxisSize.min,
56 + spacing: 12,
57 + children: [
58 + CakeImageWidget(
59 + imageUrl: currentNetworkIconPath,
60 + width: 50,
61 + height: 50,
62 + fit: BoxFit.contain,
63 + color: isMonochromeSymbolIcon(currentNetworkIconPath)
64 + ? colors.primary
65 + : null,
66 + ),
67 + Icon(Icons.arrow_forward, color: colors.primary, size: 28),
68 + CakeImageWidget(
69 + imageUrl: destinationNetworkIconPath,
70 + width: 50,
71 + height: 50,
72 + fit: BoxFit.contain,
73 + color: isMonochromeSymbolIcon(destinationNetworkIconPath)
74 + ? colors.primary
75 + : null,
76 + ),
77 + ],
78 + ),
79 + const SizedBox(height: 24),
80 + Text(
81 + title,
82 + textAlign: TextAlign.center,
83 + style: Theme.of(context).textTheme.titleLarge?.copyWith(
84 + fontSize: 20,
85 + fontWeight: FontWeight.w500,
86 + letterSpacing: -0.1,
87 + ),
88 + ),
89 + const SizedBox(height: 16),
90 + Text(
91 + S.of(context).swap_from_network_description(
92 + destinationNetworkName,
93 + currentNetworkName,
94 + ),
95 + textAlign: TextAlign.center,
96 + style: Theme.of(context)
97 + .textTheme
98 + .bodyMedium
99 + ?.copyWith(color: colors.onSurfaceVariant, letterSpacing: -0.07),
100 + ),
101 + ],
102 + ),
103 + ),
104 + ),
105 + ),
106 + Padding(
107 + padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
108 + child: Column(
109 + mainAxisSize: MainAxisSize.min,
110 + children: [
111 + NewPrimaryButton(
112 + onPressed: onProceed,
113 + image: primaryHasSwapIcon
114 + ? CakeImageWidget(
115 + imageUrl: "assets/new-ui/swap_arrows.svg",
116 + width: 24,
117 + height: 24,
118 + colorFilter: ColorFilter.mode(colors.onPrimary, BlendMode.srcIn),
119 + )
120 + : null,
121 + text: primaryButtonText,
122 + color: colors.primary,
123 + textColor: colors.onPrimary,
124 + ),
125 + const SizedBox(height: 12),
126 + NewPrimaryButton(
127 + onPressed: () => Navigator.of(context).maybePop(),
128 + text: S.of(context).cancel,
129 + color: colors.surfaceContainer,
130 + textColor: colors.primary,
131 + ),
132 + ],
133 + ),
134 + ),
135 + ],
136 + ),
137 + ),
138 + );
139 + }
140 +}
lib/new-ui/widgets/anypay/switch_network_wallet_page.dart new
+108
@@ -0,0 +1,108 @@
1 +import "package:cake_wallet/generated/i18n.dart";
2 +import "package:cake_wallet/new-ui/widgets/receive_page/receive_top_bar.dart";
3 +import "package:cake_wallet/new-ui/widgets/send_page/l2_action_wallet_selector.dart";
4 +import "package:cake_wallet/src/widgets/cake_image_widget.dart";
5 +import "package:cw_core/currency_for_wallet_type.dart";
6 +import "package:cw_core/wallet_info.dart";
7 +import "package:flutter/cupertino.dart";
8 +import "package:flutter/material.dart";
9 +
10 +class SwitchNetworkWalletPage extends StatelessWidget {
11 + const SwitchNetworkWalletPage({
12 + required this.wallets,
13 + required this.networkName,
14 + required this.destinationIconPath,
15 + super.key,
16 + });
17 +
18 + final String networkName;
19 + final String destinationIconPath;
20 + final List<WalletInfo> wallets;
21 +
22 + static Future<WalletInfo?> push({
23 + required BuildContext context,
24 + required String networkName,
25 + required String targetIconPath,
26 + required List<WalletInfo> wallets,
27 + }) =>
28 + Navigator.of(context).push<WalletInfo>(
29 + CupertinoPageRoute(
30 + builder: (_) => SwitchNetworkWalletPage(
31 + networkName: networkName,
32 + destinationIconPath: targetIconPath,
33 + wallets: wallets,
34 + ),
35 + ),
36 + );
37 +
38 + @override
39 + Widget build(BuildContext context) {
40 + final colors = Theme.of(context).colorScheme;
41 + return Material(
42 + color: colors.surface,
43 + child: SafeArea(
44 + child: Column(
45 + mainAxisAlignment: MainAxisAlignment.center,
46 + children: [
47 + ModalTopBar(
48 + title: "",
49 + leadingIcon: const Icon(Icons.arrow_back_ios_new),
50 + leadingSemanticLabel: S.of(context).seed_alert_back,
51 + onLeadingPressed: () => Navigator.of(context).maybePop(),
52 + ),
53 + const SizedBox(height: 124),
54 + Row(
55 + mainAxisSize: MainAxisSize.min,
56 + mainAxisAlignment: MainAxisAlignment.center,
57 + children: [
58 + Icon(Icons.arrow_forward, color: colors.primary, size: 32),
59 + const SizedBox(width: 8),
60 + CakeImageWidget(
61 + imageUrl: destinationIconPath,
62 + width: 50,
63 + height: 50,
64 + fit: BoxFit.contain,
65 + color: isMonochromeSymbolIcon(destinationIconPath) ? colors.primary : null,
66 + ),
67 + ],
68 + ),
69 + const SizedBox(height: 24),
70 + Text(
71 + S.of(context).switch_to_x_wallet(networkName),
72 + textAlign: TextAlign.center,
73 + style: Theme.of(context)
74 + .textTheme
75 + .titleLarge
76 + ?.copyWith(fontSize: 20, fontWeight: FontWeight.w500, letterSpacing: -0.1),
77 + ),
78 + const SizedBox(height: 24),
79 + Text(
80 + S.of(context).select_compatible_wallet,
81 + textAlign: TextAlign.center,
82 + style: Theme.of(context)
83 + .textTheme
84 + .bodyMedium
85 + ?.copyWith(color: colors.onSurfaceVariant, letterSpacing: -0.07),
86 + ),
87 + const SizedBox(height: 24),
88 + Expanded(
89 + child: ListView.separated(
90 + padding: const EdgeInsets.symmetric(horizontal: 16),
91 + itemCount: wallets.length,
92 + separatorBuilder: (_, __) => const SizedBox(height: 12),
93 + itemBuilder: (_, index) {
94 + final wallet = wallets[index];
95 + return WalletRow(
96 + currencyIconPath: getCryptoCurrencyIconForWalletListItem(wallet.type),
97 + walletName: wallet.name,
98 + onTap: () => Navigator.of(context).pop(wallet),
99 + );
100 + },
101 + ),
102 + ),
103 + ],
104 + ),
105 + ),
106 + );
107 + }
108 +}
lib/new-ui/widgets/coins_page/assets_history/history_trade_tile.dart
+6 -1
@@ -117,7 +117,12 @@ class HistoryTradeTile extends StatelessWidget {
117 to!.title,
118 ),
119 if (toChainIcon?.isNotEmpty ?? false)
120 - CakeImageWidget(imageUrl: toChainIcon, width: 12, height: 12)
120 + CakeImageWidget(
121 + imageUrl: toChainIcon,
122 + width: 12,
123 + height: 12,
124 + color: Theme.of(context).colorScheme.onSurface,
125 + )
126 ],
127 ),
128 leadingIcon: _getLeadingStack(context),
lib/new-ui/widgets/currency_picker/currency_picker_args.dart
+74 -14
@@ -1,13 +1,18 @@
1 -import 'package:cake_wallet/evm/evm.dart';
2 -import 'package:cw_core/crypto_currency.dart';
3 -import 'package:cw_core/currency_for_wallet_type.dart';
4 -import 'package:cw_core/currency_groups.dart';
5 -import 'package:cw_core/wallet_type.dart';
1 +import "package:cake_wallet/evm/evm.dart";
2 +import "package:cw_core/crypto_currency.dart";
3 +import "package:cw_core/currency_for_wallet_type.dart";
4 +import "package:cw_core/currency_groups.dart";
5 +import "package:cw_core/erc20_token.dart";
6 +import "package:cw_core/spl_token.dart";
7 +import "package:cw_core/tron_token.dart";
8 +import "package:cw_core/wallet_type.dart";
9
10 String chainNameForCurrency(CryptoCurrency c) {
8 - if (c == CryptoCurrency.btcln) return 'Lightning';
11 + if (c == CryptoCurrency.btcln) {
12 + return "Lightning";
13 + }
14 final wt = cryptoCurrencyOrTokenToWalletType(c);
10 - return wt != null ? walletTypeToString(wt) : (c.tag ?? '');
15 + return wt != null ? walletTypeToString(wt) : (c.tag ?? "");
16 }
17
18 final Set<String> _stablecoinSymbols = {
@@ -27,19 +32,25 @@ const _kEvmDefaultTokenNatives = <CryptoCurrency>[
32 ];
33
34 void appendEvmDefaultTokens(List<CryptoCurrency> into) {
30 - if (evm == null) return;
35 + if (evm == null) {
36 + return;
37 + }
38 String keyFor(CryptoCurrency c) {
39 final wt = cryptoCurrencyOrTokenToWalletType(c);
33 - final chain = wt?.toString() ?? (c.tag ?? '').toUpperCase();
34 - return '${c.title.toUpperCase()}|$chain';
40 + final chain = wt?.toString() ?? (c.tag ?? "").toUpperCase();
41 + return "${c.title.toUpperCase()}|$chain";
42 }
43
44 final seen = <String>{for (final c in into) keyFor(c)};
45 for (final native in _kEvmDefaultTokenNatives) {
46 final chainId = getChainIdByCryptoCurrency(native);
40 - if (chainId == null) continue;
47 + if (chainId == null) {
48 + continue;
49 + }
50 for (final t in evm!.getDefaultTokensByChainId(chainId)) {
42 - if (seen.add(keyFor(t))) into.add(t);
51 + if (seen.add(keyFor(t))) {
52 + into.add(t);
53 + }
54 }
55 }
56 }
@@ -52,6 +63,55 @@ class CurrencyPickerBalance {
63 final double? fiatValue;
64 }
65
66 +String? _assetAddressKey(CryptoCurrency c) {
67 + if (c is Erc20Token) {
68 + return c.contractAddress.toLowerCase();
69 + }
70 + if (c is TronToken) {
71 + return c.contractAddress.toLowerCase();
72 + }
73 + if (c is SPLToken) {
74 + return c.mintAddress.toLowerCase();
75 + }
76 + return null;
77 +}
78 +
79 +CurrencyPickerBalance? balanceForAsset(
80 + Map<CryptoCurrency, CurrencyPickerBalance>? balances,
81 + CryptoCurrency asset,
82 +) {
83 + if (balances == null || balances.isEmpty) {
84 + return null;
85 + }
86 +
87 + final direct = balances[asset];
88 + if (direct != null) {
89 + return direct;
90 + }
91 +
92 + final addressKey = _assetAddressKey(asset);
93 + if (addressKey != null) {
94 + for (final entry in balances.entries) {
95 + if (_assetAddressKey(entry.key) == addressKey) {
96 + return entry.value;
97 + }
98 + }
99 + return null;
100 + }
101 +
102 + final title = asset.title.toUpperCase();
103 + CurrencyPickerBalance? byTitle;
104 + for (final entry in balances.entries) {
105 + if (entry.key.title.toUpperCase() == title) {
106 + if (byTitle != null) {
107 + return null;
108 + }
109 + byTitle = entry.value;
110 + }
111 + }
112 + return byTitle;
113 +}
114 +
115 enum RecentsSource { none, trades, orders }
116
117 class CurrencyPickerArgs {
@@ -63,6 +123,7 @@ class CurrencyPickerArgs {
123 required this.onSelected,
124 required this.symbolResolver,
125 this.recentsSource = RecentsSource.none,
126 + this.useSingleNetworkLayout = false,
127 });
128
129 final CryptoCurrency? selected;
@@ -72,6 +133,5 @@ class CurrencyPickerArgs {
133 final String Function(CryptoCurrency) symbolResolver;
134 final Map<CryptoCurrency, CurrencyPickerBalance>? balanceByAsset;
135 final RecentsSource recentsSource;
75 -
76 - bool get isPreFiltered => filterByNetwork != null;
136 + final bool useSingleNetworkLayout;
137 }
lib/new-ui/widgets/currency_picker/currency_picker_sheet.dart
+1 -1
@@ -47,7 +47,7 @@ class CurrencyPickerSheet extends StatelessWidget {
47 onLeadingPressed: () => Navigator.of(context).maybePop(),
48 ),
49 Expanded(
50 - child: args.isPreFiltered
50 + child: args.useSingleNetworkLayout
51 ? SingleNetworkCurrencyPicker(args: args)
52 : MultiNetworkCurrencyPicker(args: args),
53 ),
lib/new-ui/widgets/currency_picker/single_network_currency_picker.dart
+85 -49
@@ -1,17 +1,20 @@
1 -import 'package:cake_wallet/generated/i18n.dart';
2 -import 'package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_args.dart';
3 -import 'package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_list_container.dart';
4 -import 'package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_row.dart';
5 -import 'package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_search_field.dart';
6 -import 'package:cake_wallet/new-ui/widgets/currency_picker/picker_section_header.dart';
7 -import 'package:cake_wallet/reactions/wallet_utils.dart';
8 -import 'package:cw_core/crypto_currency.dart';
9 -import 'package:cw_core/currency_for_wallet_type.dart';
10 -import 'package:cw_core/wallet_type.dart';
11 -import 'package:flutter/material.dart';
1 +import "package:cake_wallet/generated/i18n.dart";
2 +import "package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_args.dart";
3 +import "package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_list_container.dart";
4 +import "package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_row.dart";
5 +import "package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_search_field.dart";
6 +import "package:cake_wallet/new-ui/widgets/currency_picker/picker_section_header.dart";
7 +import "package:cake_wallet/reactions/wallet_utils.dart";
8 +import "package:cw_core/crypto_currency.dart";
9 +import "package:cw_core/currency_for_wallet_type.dart";
10 +import "package:cw_core/wallet_type.dart";
11 +import "package:flutter/material.dart";
12
13 class SingleNetworkCurrencyPicker extends StatefulWidget {
14 - const SingleNetworkCurrencyPicker({super.key, required this.args});
14 + const SingleNetworkCurrencyPicker({
15 + required this.args,
16 + super.key,
17 + });
18
19 final CurrencyPickerArgs args;
20
@@ -41,24 +44,36 @@ class _SingleNetworkCurrencyPickerState extends State<SingleNetworkCurrencyPicke
44 Navigator.of(context).maybePop();
45 }
46
44 - double _fiatValueFor(CryptoCurrency c) => _args.balanceByAsset?[c]?.fiatValue ?? 0;
47 + CurrencyPickerBalance? _balanceFor(CryptoCurrency c) => balanceForAsset(_args.balanceByAsset, c);
48 +
49 + double _fiatValueFor(CryptoCurrency c) => _balanceFor(c)?.fiatValue ?? 0;
50
51 @override
52 Widget build(BuildContext context) {
53 final native = walletTypeToCryptoCurrency(_network);
54 final query = _searchController.text.trim();
50 - final tokens =
51 - _args.items.where((c) => c != native).where((c) => currencyMatchesQuery(c, query)).toList();
55 + final tokens = _args.items
56 + .where(
57 + (c) =>
58 + c != native &&
59 + cryptoCurrencyOrTokenToWalletType(c) == _network &&
60 + currencyMatchesQuery(c, query),
61 + )
62 + .toList();
63
64 final insertOrder = {for (var i = 0; i < tokens.length; i++) tokens[i]: i};
65 tokens.sort((a, b) {
66 final av = _fiatValueFor(a);
67 final bv = _fiatValueFor(b);
57 - if (bv != av) return bv.compareTo(av);
68 + if (bv != av) {
69 + return bv.compareTo(av);
70 + }
71 return (insertOrder[a] ?? 0).compareTo(insertOrder[b] ?? 0);
72 });
73 final nativeMatches = currencyMatchesQuery(native, query);
74
75 + final showSectionHeaders = _network != WalletType.bitcoin;
76 +
77 return Column(
78 mainAxisSize: MainAxisSize.max,
79 children: [
@@ -66,40 +81,61 @@ class _SingleNetworkCurrencyPickerState extends State<SingleNetworkCurrencyPicke
81 child: (nativeMatches || tokens.isNotEmpty)
82 ? ListView(
83 padding: const EdgeInsets.fromLTRB(16, 8, 16, 16),
69 - children: [
70 - if (nativeMatches) ...[
71 - PickerSectionHeader(title: S.of(context).picker_section_gas_token),
72 - CurrencyPickerListContainer(
73 - rows: [
74 - CurrencyPickerRow(
75 - currency: native,
76 - isSelected: _args.selected == native,
77 - trailing: _BalanceTrailing(balance: _args.balanceByAsset?[native]),
78 - onTap: () => _selectCurrency(native),
79 - ),
80 - ],
81 - ),
82 - const SizedBox(height: 16),
83 - ],
84 - if (tokens.isNotEmpty) ...[
85 - PickerSectionHeader(
86 - title: S
87 - .of(context)
88 - .picker_section_tokens_standard(tokenStandardFor(_network)),
89 - ),
90 - CurrencyPickerListContainer(
91 - rows: [
92 - for (final t in tokens)
93 - CurrencyPickerRow(
94 - currency: t,
95 - isSelected: _args.selected == t,
96 - trailing: _BalanceTrailing(balance: _args.balanceByAsset?[t]),
97 - onTap: () => _selectCurrency(t),
84 + children: showSectionHeaders
85 + ? [
86 + if (nativeMatches) ...[
87 + PickerSectionHeader(title: S.of(context).picker_section_gas_token),
88 + CurrencyPickerListContainer(
89 + rows: [
90 + CurrencyPickerRow(
91 + currency: native,
92 + isSelected: _args.selected == native,
93 + trailing: _BalanceTrailing(balance: _balanceFor(native)),
94 + onTap: () => _selectCurrency(native),
95 + ),
96 + ],
97 ),
98 + const SizedBox(height: 16),
99 + ],
100 + if (tokens.isNotEmpty) ...[
101 + PickerSectionHeader(
102 + title: S
103 + .of(context)
104 + .picker_section_tokens_standard(tokenStandardFor(_network)),
105 + ),
106 + CurrencyPickerListContainer(
107 + rows: [
108 + for (final t in tokens)
109 + CurrencyPickerRow(
110 + currency: t,
111 + isSelected: _args.selected == t,
112 + trailing: _BalanceTrailing(balance: _balanceFor(t)),
113 + onTap: () => _selectCurrency(t),
114 + ),
115 + ],
116 + ),
117 + ],
118 + ]
119 + : [
120 + CurrencyPickerListContainer(
121 + rows: [
122 + if (nativeMatches)
123 + CurrencyPickerRow(
124 + currency: native,
125 + isSelected: _args.selected == native,
126 + trailing: _BalanceTrailing(balance: _balanceFor(native)),
127 + onTap: () => _selectCurrency(native),
128 + ),
129 + for (final t in tokens)
130 + CurrencyPickerRow(
131 + currency: t,
132 + isSelected: _args.selected == t,
133 + trailing: _BalanceTrailing(balance: _balanceFor(t)),
134 + onTap: () => _selectCurrency(t),
135 + ),
136 + ],
137 + ),
138 ],
100 - ),
101 - ],
102 - ],
139 )
140 : Center(
141 child: Padding(
@@ -131,7 +167,7 @@ class _BalanceTrailing extends StatelessWidget {
167 @override
168 Widget build(BuildContext context) {
169 final colors = Theme.of(context).colorScheme;
134 - final amount = balance?.amount ?? '—';
170 + final amount = balance?.amount ?? "—";
171 final fiat = balance?.fiat;
172 return Column(
173 crossAxisAlignment: CrossAxisAlignment.end,
lib/new-ui/widgets/new_primary_button.dart
+36 -39
@@ -1,14 +1,13 @@
1 -import 'package:flutter/cupertino.dart';
2 -import 'package:flutter/material.dart';
3 -import 'package:flutter_svg/flutter_svg.dart';
1 +import "package:flutter/cupertino.dart";
2 +import "package:flutter/material.dart";
3
4 class NewPrimaryButton extends StatelessWidget {
5 const NewPrimaryButton({
6 required this.onPressed,
8 - this.image,
7 required this.text,
8 required this.color,
9 required this.textColor,
10 + this.image,
11 this.isLoading = false,
12 this.borderColor = Colors.transparent,
13 this.disabled = false,
@@ -18,48 +17,46 @@ class NewPrimaryButton extends StatelessWidget {
17 final VoidCallback onPressed;
18 final bool isLoading;
19 final bool disabled;
21 - final SvgPicture? image;
20 + final Widget? image;
21 final Color color;
22 final Color textColor;
23 final Color borderColor;
24 final String text;
25
26 @override
28 - Widget build(BuildContext context) {
29 - return SizedBox(
30 - height: 52.0,
31 - child: TextButton(
32 - onPressed: disabled ? null : onPressed,
33 - style: ButtonStyle(
34 - backgroundColor: WidgetStateProperty.all(
35 - disabled ? color.withAlpha(128) : color,
36 - ),
37 - shape: WidgetStateProperty.all<RoundedSuperellipseBorder>(
38 - RoundedSuperellipseBorder(
39 - borderRadius: BorderRadius.circular(18.0),
27 + Widget build(BuildContext context) => SizedBox(
28 + height: 52,
29 + child: TextButton(
30 + onPressed: disabled ? null : onPressed,
31 + style: ButtonStyle(
32 + backgroundColor: WidgetStateProperty.all(
33 + disabled ? color.withAlpha(128) : color,
34 + ),
35 + shape: WidgetStateProperty.all<RoundedSuperellipseBorder>(
36 + RoundedSuperellipseBorder(
37 + borderRadius: BorderRadius.circular(18),
38 + ),
39 ),
40 ),
41 + child: Center(
42 + child: isLoading
43 + ? const CupertinoActivityIndicator()
44 + : Row(
45 + spacing: 10,
46 + mainAxisSize: MainAxisSize.min,
47 + children: <Widget>[
48 + if (image != null) image!,
49 + Text(
50 + text,
51 + style: Theme.of(context).textTheme.bodyMedium?.copyWith(
52 + fontSize: 14,
53 + fontWeight: FontWeight.w600,
54 + color: textColor,
55 + ),
56 + ),
57 + ],
58 + ),
59 + ),
60 ),
43 - child: Center(
44 - child: isLoading
45 - ? CupertinoActivityIndicator()
46 - : Row(
47 - spacing: 10,
48 - mainAxisSize: MainAxisSize.min,
49 - children: <Widget>[
50 - if (image != null) image!,
51 - Text(
52 - text,
53 - style: Theme.of(context).textTheme.bodyMedium?.copyWith(
54 - fontSize: 14,
55 - fontWeight: FontWeight.w600,
56 - color: textColor,
57 - ),
58 - )
59 - ],
60 - ),
61 - ),
62 - ),
63 - );
64 - }
61 + );
62 }
lib/new-ui/widgets/swap_page/anypay_swap_footer.dart new
+106
@@ -0,0 +1,106 @@
1 +import "package:auto_size_text/auto_size_text.dart";
2 +import "package:cake_wallet/generated/i18n.dart";
3 +import "package:cake_wallet/new-ui/widgets/swap_page/provider_selector_page.dart";
4 +import "package:cake_wallet/src/widgets/cake_image_widget.dart";
5 +import "package:cake_wallet/view_model/exchange/exchange_view_model.dart";
6 +import "package:flutter/cupertino.dart";
7 +import "package:flutter/material.dart";
8 +import "package:flutter_mobx/flutter_mobx.dart";
9 +
10 +class AnyPaySwapFooter extends StatelessWidget {
11 + const AnyPaySwapFooter({required this.exchangeViewModel, super.key});
12 +
13 + final ExchangeViewModel exchangeViewModel;
14 +
15 + @override
16 + Widget build(BuildContext context) {
17 + final colors = Theme.of(context).colorScheme;
18 + final textTheme = Theme.of(context).textTheme;
19 + return Observer(
20 + builder: (_) {
21 + if (exchangeViewModel.depositAmount.isEmpty) {
22 + return const SizedBox.shrink();
23 + }
24 +
25 + final provider = exchangeViewModel.forcedProvider ?? exchangeViewModel.providerDisplay;
26 + final depositAmount = exchangeViewModel.depositAmount;
27 + final depositSymbol =
28 + exchangeViewModel.amountParsingProxy.getCryptoSymbol(exchangeViewModel.depositCurrency);
29 + final depositFiat = exchangeViewModel.roundedDepositAmountFiat(2);
30 + final showFiat = !exchangeViewModel.isFiatDisabled && depositFiat.isNotEmpty;
31 + return Row(
32 + children: [
33 + Expanded(
34 + child: Container(
35 + alignment: Alignment.center,
36 + height: 48,
37 + padding: const EdgeInsets.symmetric(horizontal: 16),
38 + decoration: BoxDecoration(
39 + borderRadius: BorderRadius.circular(18),
40 + border: Border.all(color: colors.primary),
41 + ),
42 + child: AutoSizeText.rich(
43 + TextSpan(
44 + children: [
45 + TextSpan(text: "$depositAmount $depositSymbol"),
46 + if (showFiat)
47 + TextSpan(
48 + text: " ≈ ${exchangeViewModel.fiat.symbol}$depositFiat",
49 + style: TextStyle(color: colors.onSurfaceVariant),
50 + ),
51 + ],
52 + ),
53 + maxLines: 1,
54 + minFontSize: 10,
55 + style: textTheme.bodySmall
56 + ?.copyWith(fontWeight: FontWeight.w500, letterSpacing: -0.06),
57 + ),
58 + ),
59 + ),
60 + const SizedBox(width: 12),
61 + GestureDetector(
62 + onTap: provider == null
63 + ? null
64 + : () => Navigator.of(context).push(
65 + CupertinoPageRoute<void>(
66 + builder: (context) => Material(
67 + child: ProviderSelectorPage(exchangeViewModel: exchangeViewModel),
68 + ),
69 + ),
70 + ),
71 + child: Container(
72 + height: 48,
73 + padding: const EdgeInsets.symmetric(horizontal: 12),
74 + decoration: BoxDecoration(
75 + color: colors.surfaceContainer,
76 + borderRadius: BorderRadius.circular(24),
77 + ),
78 + child: Row(
79 + mainAxisSize: MainAxisSize.min,
80 + children: [
81 + if (provider != null)
82 + CakeImageWidget(imageUrl: provider.description.image, width: 24, height: 24)
83 + else
84 + const CupertinoActivityIndicator(),
85 + const SizedBox(width: 8),
86 + Text(
87 + provider?.title ?? "${S.of(context).finding_provider}...",
88 + style: textTheme.bodyMedium?.copyWith(letterSpacing: -0.07),
89 + ),
90 + const SizedBox(width: 8),
91 + CakeImageWidget(
92 + imageUrl: "assets/new-ui/chooser.svg",
93 + width: 12,
94 + height: 12,
95 + colorFilter: ColorFilter.mode(colors.onSurfaceVariant, BlendMode.srcIn),
96 + ),
97 + ],
98 + ),
99 + ),
100 + ),
101 + ],
102 + );
103 + },
104 + );
105 + }
106 +}
lib/new-ui/widgets/swap_page/swap_amount_box.dart new
+789
@@ -0,0 +1,789 @@
1 +import "package:cake_wallet/core/amount_validator.dart";
2 +import "package:cake_wallet/entities/qr_scanner.dart";
3 +import "package:cake_wallet/generated/i18n.dart";
4 +import "package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_args.dart";
5 +import "package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_sheet.dart";
6 +import "package:cake_wallet/new-ui/widgets/modern_button.dart";
7 +import "package:cake_wallet/new-ui/widgets/send_page/fiat_amount_bar.dart";
8 +import "package:cake_wallet/new-ui/widgets/send_page/send_memo_input.dart";
9 +import "package:cake_wallet/new-ui/widgets/swap_page/refund_address_modal.dart";
10 +import "package:cake_wallet/new-ui/widgets/swap_page/swap_address_selection_modal.dart";
11 +import "package:cake_wallet/src/widgets/cake_image_widget.dart";
12 +import "package:cake_wallet/utils/decimal_input_formatter.dart";
13 +import "package:cake_wallet/utils/permission_handler.dart";
14 +import "package:cake_wallet/view_model/exchange/exchange_view_model.dart";
15 +import "package:cake_wallet/view_model/wallet_switcher_view_model.dart";
16 +import "package:cw_core/crypto_currency.dart";
17 +import "package:cw_core/currencies_with_memo.dart";
18 +import "package:cw_core/currency.dart";
19 +import "package:cw_core/wallet_info.dart";
20 +import "package:cw_core/wallet_type.dart";
21 +import "package:flutter/material.dart";
22 +import "package:flutter/services.dart";
23 +import "package:flutter_mobx/flutter_mobx.dart";
24 +import "package:mobx/mobx.dart" as mobx;
25 +import "package:modal_bottom_sheet/modal_bottom_sheet.dart";
26 +import "package:permission_handler/permission_handler.dart";
27 +
28 +class SwapAmountBox extends StatefulWidget {
29 + SwapAmountBox({
30 + required this.exchangeViewModel,
31 + required this.isReceiverCard,
32 + required this.walletSwitcherViewModel,
33 + required this.currency,
34 + required this.currencies,
35 + required this.onCurrencySelected,
36 + this.currencyValueValidator,
37 + this.addressTextFieldValidator,
38 + this.title = "",
39 + this.hasRefundAddress = false,
40 + this.hasAllAmount = false,
41 + this.useBaseUnit = false,
42 + this.allAmount,
43 + this.onPushPasteButton,
44 + this.onPushAddressBookButton,
45 + this.filteredNetwork,
46 + this.sourceSelectorMode = false,
47 + this.walletName,
48 + this.balanceByAsset,
49 + this.useSingleNetworkLayout = false,
50 + super.key,
51 + });
52 +
53 + final List<Currency> currencies;
54 + final Function(Currency) onCurrencySelected;
55 + final String title;
56 + final bool isReceiverCard;
57 + final Currency currency;
58 + final bool useBaseUnit;
59 + final bool hasRefundAddress;
60 + final FormFieldValidator<String>? currencyValueValidator;
61 + final FormFieldValidator<String>? addressTextFieldValidator;
62 + final FormFieldValidator<String> allAmountValidator = AllAmountValidator();
63 + final bool hasAllAmount;
64 + final VoidCallback? allAmount;
65 + final void Function(BuildContext context)? onPushPasteButton;
66 + final void Function(BuildContext context)? onPushAddressBookButton;
67 + final ExchangeViewModel exchangeViewModel;
68 + final WalletSwitcherViewModel walletSwitcherViewModel;
69 + final WalletType? filteredNetwork;
70 + final bool sourceSelectorMode;
71 + final String? walletName;
72 + final Map<CryptoCurrency, CurrencyPickerBalance>? balanceByAsset;
73 + final bool useSingleNetworkLayout;
74 +
75 + @override
76 + State<SwapAmountBox> createState() => SwapAmountBoxState();
77 +}
78 +
79 +class SwapAmountBoxState extends State<SwapAmountBox> {
80 + final addressController = TextEditingController();
81 + final amountController = TextEditingController();
82 + final fiatAmountController = TextEditingController();
83 + final amountFocusNode = FocusNode();
84 + final memoController = TextEditingController();
85 + mobx.ReactionDisposer? _memoReactionDisposer;
86 +
87 + @override
88 + void initState() {
89 + if (widget.isReceiverCard) {
90 + memoController.text = widget.exchangeViewModel.receiveAddressExtraId;
91 +
92 + memoController.addListener(() {
93 + if (widget.exchangeViewModel.receiveAddressExtraId != memoController.text) {
94 + widget.exchangeViewModel.receiveAddressExtraId = memoController.text;
95 + }
96 + });
97 +
98 + _memoReactionDisposer =
99 + mobx.reaction((_) => widget.exchangeViewModel.receiveAddressExtraId, (String value) {
100 + if (memoController.text != value) {
101 + memoController.text = value;
102 + }
103 + });
104 + }
105 +
106 + super.initState();
107 + }
108 +
109 + @override
110 + void dispose() {
111 + _memoReactionDisposer?.call();
112 + memoController.dispose();
113 + addressController.dispose();
114 + amountController.dispose();
115 + fiatAmountController.dispose();
116 + amountFocusNode.dispose();
117 + super.dispose();
118 + }
119 +
120 + bool _fiatInputMode = false;
121 +
122 + /// Whether the amount field is currently taking fiat input, the page's
123 + /// best-rate reaction needs this to know which controller holds the amount.
124 + bool get fiatInputMode => _fiatInputMode;
125 +
126 + CurrencyPickerBalance? _sourceBalance() {
127 + final selected = widget.currency;
128 + if (selected is! CryptoCurrency) {
129 + return null;
130 + }
131 + return balanceForAsset(widget.balanceByAsset, selected);
132 + }
133 +
134 + @override
135 + Widget build(BuildContext context) {
136 + final currencyToShow = (widget.currency is CryptoCurrency)
137 + ? widget.exchangeViewModel.amountParsingProxy
138 + .getCryptoSymbol(widget.currency as CryptoCurrency)
139 + : widget.currency.name.toUpperCase();
140 +
141 + final chainIconPath = (widget.currency is CryptoCurrency)
142 + ? _getCurrencyChainIconPath(widget.currency as CryptoCurrency)
143 + : null;
144 +
145 + final colors = Theme.of(context).colorScheme;
146 +
147 + if (widget.sourceSelectorMode) {
148 + final available = _sourceBalance()?.amount.split(" ").first ?? "—";
149 + return Column(
150 + spacing: 12,
151 + crossAxisAlignment: CrossAxisAlignment.start,
152 + children: [
153 + GestureDetector(
154 + onTap: _presentCurrencyPicker,
155 + child: Container(
156 + height: 52,
157 + padding: const EdgeInsets.symmetric(horizontal: 12),
158 + decoration: BoxDecoration(
159 + color: colors.surfaceContainer,
160 + borderRadius: BorderRadius.circular(18),
161 + ),
162 + child: Row(
163 + children: [
164 + CakeImageWidget(
165 + imageUrl: widget.currency.iconPath ?? "",
166 + width: 24,
167 + height: 24,
168 + ),
169 + const SizedBox(width: 8),
170 + Text(
171 + currencyToShow,
172 + style: Theme.of(context).textTheme.bodyLarge?.copyWith(letterSpacing: -0.08),
173 + ),
174 + if (chainIconPath != null && chainIconPath.isNotEmpty) ...[
175 + const SizedBox(width: 4),
176 + CakeImageWidget(
177 + imageUrl: chainIconPath,
178 + width: 12,
179 + height: 12,
180 + colorFilter: ColorFilter.mode(colors.onSurfaceVariant, BlendMode.srcIn),
181 + ),
182 + ],
183 + const Spacer(),
184 + CakeImageWidget(
185 + imageUrl: "assets/new-ui/chooser.svg",
186 + width: 12,
187 + height: 12,
188 + colorFilter: ColorFilter.mode(colors.onSurfaceVariant, BlendMode.srcIn),
189 + ),
190 + ],
191 + ),
192 + ),
193 + ),
194 + Padding(
195 + padding: const EdgeInsets.symmetric(horizontal: 16),
196 + child: Row(
197 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
198 + children: [
199 + Flexible(
200 + child: Row(
201 + mainAxisSize: MainAxisSize.min,
202 + children: [
203 + CakeImageWidget(
204 + imageUrl: "assets/new-ui/wallet_filled.svg",
205 + width: 16,
206 + height: 16,
207 + colorFilter: ColorFilter.mode(colors.onSurfaceVariant, BlendMode.srcIn),
208 + ),
209 + const SizedBox(width: 4),
210 + Flexible(
211 + child: Text(
212 + widget.walletName ?? "",
213 + overflow: TextOverflow.ellipsis,
214 + style: Theme.of(context).textTheme.bodySmall?.copyWith(
215 + fontWeight: FontWeight.w500,
216 + letterSpacing: -0.06,
217 + color: colors.onSurfaceVariant,
218 + ),
219 + ),
220 + ),
221 + ],
222 + ),
223 + ),
224 + const SizedBox(width: 8),
225 + Text(
226 + "${S.of(context).avl}: $available",
227 + style: Theme.of(context).textTheme.bodySmall?.copyWith(
228 + fontWeight: FontWeight.w500,
229 + letterSpacing: -0.06,
230 + color: colors.primary,
231 + ),
232 + ),
233 + ],
234 + ),
235 + ),
236 + ],
237 + );
238 + }
239 +
240 + return Column(
241 + spacing: 12,
242 + crossAxisAlignment: CrossAxisAlignment.start,
243 + children: [
244 + if (widget.title.isNotEmpty)
245 + Text(
246 + widget.title,
247 + style: TextStyle(
248 + fontSize: 12,
249 + fontWeight: FontWeight.w500,
250 + color: Theme.of(context).colorScheme.onSurfaceVariant,
251 + ),
252 + ),
253 + Container(
254 + decoration: ShapeDecoration(
255 + color: Theme.of(context).colorScheme.surfaceContainer,
256 + shape: RoundedSuperellipseBorder(borderRadius: BorderRadius.circular(24)),
257 + ),
258 + child: Padding(
259 + padding: const EdgeInsets.all(16),
260 + child: Column(
261 + spacing: 12,
262 + children: [
263 + GestureDetector(
264 + behavior: HitTestBehavior.opaque,
265 + onTap: amountFocusNode.requestFocus,
266 + child: Row(
267 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
268 + spacing: 4,
269 + children: [
270 + Expanded(
271 + child: Row(
272 + spacing: 4,
273 + crossAxisAlignment: CrossAxisAlignment.center,
274 + children: [
275 + Flexible(
276 + child: IntrinsicWidth(
277 + child: Observer(
278 + builder: (_) {
279 + final showFetching = !widget.isReceiverCard &&
280 + widget.exchangeViewModel.isFixedRateMode &&
281 + widget.exchangeViewModel.receiveAmount.isNotEmpty &&
282 + widget.exchangeViewModel.depositAmount.isEmpty;
283 + return TextFormField(
284 + keyboardType: TextInputType.numberWithOptions(
285 + signed: false,
286 + decimal: !widget.useBaseUnit,
287 + ),
288 + validator:
289 + _fiatInputMode ? null : widget.currencyValueValidator,
290 + controller:
291 + _fiatInputMode ? fiatAmountController : amountController,
292 + focusNode: amountFocusNode,
293 + style: TextStyle(
294 + fontSize: 28,
295 + color: Theme.of(context).colorScheme.onSurface,
296 + fontWeight: FontWeight.w400,
297 + ),
298 + decoration: InputDecoration(
299 + contentPadding: EdgeInsets.zero,
300 + isDense: true,
301 + hintText: showFetching ? S.of(context).fetching : "0",
302 + fillColor: Colors.transparent,
303 + hoverColor: Colors.transparent,
304 + focusedBorder: InputBorder.none,
305 + enabledBorder: InputBorder.none,
306 + ),
307 + inputFormatters: <TextInputFormatter>[
308 + DecimalInputFormatter(
309 + maxDecimals:
310 + widget.useBaseUnit ? 0 : widget.currency.decimals,
311 + ),
312 + ],
313 + );
314 + },
315 + ),
316 + ),
317 + ),
318 + if (_fiatInputMode)
319 + Center(
320 + child: Text(
321 + widget.exchangeViewModel.fiat.title,
322 + style: TextStyle(
323 + fontSize: 16,
324 + color: Theme.of(context).colorScheme.onSurfaceVariant,
325 + ),
326 + ),
327 + ),
328 + ],
329 + ),
330 + ),
331 + GestureDetector(
332 + onTap: _presentCurrencyPicker,
333 + child: Container(
334 + decoration: BoxDecoration(
335 + color: Theme.of(context).colorScheme.surface,
336 + borderRadius: BorderRadius.circular(999999),
337 + ),
338 + child: Padding(
339 + padding: const EdgeInsets.only(top: 4, bottom: 4, left: 4, right: 4),
340 + child: Row(
341 + mainAxisAlignment: MainAxisAlignment.center,
342 + children: [
343 + CakeImageWidget(
344 + imageUrl: widget.currency.iconPath ?? "",
345 + width: 28,
346 + height: 28,
347 + ),
348 + const SizedBox(width: 10),
349 + Text(
350 + currencyToShow,
351 + textAlign: TextAlign.center,
352 + ),
353 + if (chainIconPath != null && chainIconPath.isNotEmpty) ...[
354 + const SizedBox(width: 4),
355 + CakeImageWidget(
356 + imageUrl: chainIconPath,
357 + width: 12,
358 + height: 12,
359 + colorFilter: ColorFilter.mode(
360 + Theme.of(context).colorScheme.onSurfaceVariant,
361 + BlendMode.srcIn,
362 + ),
363 + ),
364 + const SizedBox(width: 6),
365 + ] else
366 + const SizedBox(width: 10),
367 + Container(
368 + width: 16,
369 + height: 16,
370 + decoration: BoxDecoration(
371 + borderRadius: BorderRadius.circular(9999999999),
372 + color: Theme.of(context).colorScheme.surfaceContainerHigh,
373 + ),
374 + child: Padding(
375 + padding: const EdgeInsets.all(4),
376 + child: RotatedBox(
377 + quarterTurns: 2,
378 + child: CakeImageWidget(
379 + imageUrl: "assets/new-ui/dropdown_arrow.svg",
380 + width: 4,
381 + height: 4,
382 + colorFilter: ColorFilter.mode(
383 + Theme.of(context).colorScheme.primary,
384 + BlendMode.srcIn,
385 + ),
386 + ),
387 + ),
388 + ),
389 + ),
390 + const SizedBox(width: 4),
391 + ],
392 + ),
393 + ),
394 + ),
395 + ),
396 + ],
397 + ),
398 + ),
399 + Observer(
400 + builder: (_) {
401 + final hasAllAmount = !(widget.isReceiverCard ||
402 + widget.exchangeViewModel.isSendFromExternal ||
403 + !widget.exchangeViewModel.hasAllAmount);
404 +
405 + return FiatAmountBar(
406 + foregroundElementColor: Theme.of(context).colorScheme.surfaceContainerHigh,
407 + textColor: Theme.of(context).colorScheme.onSurfaceVariant,
408 + allAmountColor: hasAllAmount ? null : Colors.transparent,
409 + allAmountTextColor:
410 + hasAllAmount ? null : Theme.of(context).colorScheme.onSurfaceVariant,
411 + fiatInputMode: _fiatInputMode,
412 + allAmount: !hasAllAmount
413 + ? widget.isReceiverCard
414 + ? null
415 + : widget.exchangeViewModel.balanceDisplay
416 + : widget.exchangeViewModel.depositAvailableAmount,
417 + onSwitchButtonPressed: () {
418 + setState(() => _fiatInputMode = !_fiatInputMode);
419 + if (_fiatInputMode) {
420 + updateFiatAmount();
421 + } else {
422 + amountController.text = widget.isReceiverCard
423 + ? widget.exchangeViewModel.receiveAmount
424 + : widget.exchangeViewModel.depositAmount;
425 + }
426 + },
427 + onAllButtonPressed: () {
428 + setState(() {
429 + _fiatInputMode = false;
430 + });
431 + widget.allAmount?.call();
432 + },
433 + cryptoAmount: widget.isReceiverCard
434 + ? widget.exchangeViewModel.roundedReceiveAmount(6)
435 + : widget.exchangeViewModel.roundedDepositAmount(6),
436 + fiatAmount: widget.isReceiverCard
437 + ? widget.exchangeViewModel.roundedReceiveAmountFiat(6)
438 + : widget.exchangeViewModel.roundedDepositAmountFiat(6),
439 + cryptoCurrencySymbol: currencyToShow,
440 + fiatCurrencySymbol: widget.exchangeViewModel.fiat.symbol,
441 + );
442 + },
443 + ),
444 + Observer(
445 + builder: (_) {
446 + final addressEmpty = (widget.isReceiverCard &&
447 + widget.exchangeViewModel.receiveAddress.isEmpty) ||
448 + (!widget.isReceiverCard && widget.exchangeViewModel.depositAddress.isEmpty);
449 + final addressPickerText = widget.isReceiverCard
450 + ? (addressEmpty ? S.of(context).select_receiver : S.of(context).to)
451 + : S.of(context).from;
452 + final addressDescription = widget.isReceiverCard
453 + ? widget.exchangeViewModel.receiveAddressDisplayName ??
454 + _middleTruncate(widget.exchangeViewModel.receiveAddress, 8, 8)
455 + : widget.exchangeViewModel.isSendFromExternal
456 + ? S.of(context).external
457 + : widget.exchangeViewModel.wallet.name;
458 + return Row(
459 + spacing: 8,
460 + children: [
461 + Flexible(
462 + child: GestureDetector(
463 + onTap: _presentWalletPicker,
464 + child: Container(
465 + height: 36,
466 + decoration: BoxDecoration(
467 + color: (addressEmpty && widget.isReceiverCard)
468 + ? Theme.of(context).colorScheme.primary
469 + : Theme.of(context).colorScheme.surfaceContainerHigh,
470 + borderRadius: BorderRadius.circular(9999),
471 + ),
472 + child: Padding(
473 + padding: const EdgeInsets.symmetric(horizontal: 12),
474 + child: Observer(
475 + builder: (_) => Row(
476 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
477 + children: [
478 + Row(
479 + spacing: 8,
480 + mainAxisSize: MainAxisSize.max,
481 + children: [
482 + Text(
483 + addressPickerText,
484 + style: TextStyle(
485 + fontSize: 12,
486 + fontWeight: FontWeight.w500,
487 + color: (addressEmpty && widget.isReceiverCard)
488 + ? Theme.of(context).colorScheme.onPrimary
489 + : Theme.of(context).colorScheme.onSurface,
490 + ),
491 + ),
492 + Text(
493 + addressDescription,
494 + style: TextStyle(
495 + fontSize: 12,
496 + fontWeight: FontWeight.w500,
497 + color: Theme.of(context).colorScheme.primary,
498 + ),
499 + ),
500 + ],
501 + ),
502 + RotatedBox(
503 + quarterTurns: 2,
504 + child: CakeImageWidget(
505 + imageUrl: "assets/new-ui/dropdown_arrow.svg",
506 + colorFilter: ColorFilter.mode(
507 + (addressEmpty && widget.isReceiverCard)
508 + ? Theme.of(context).colorScheme.onPrimary
509 + : Theme.of(context).colorScheme.onSurface,
510 + BlendMode.srcIn,
511 + ),
512 + ),
513 + ),
514 + ],
515 + ),
516 + ),
517 + ),
518 + ),
519 + ),
520 + ),
521 + if (!widget.isReceiverCard &&
522 + widget.exchangeViewModel.isSendFromExternal &&
523 + widget.exchangeViewModel.depositAddress.isEmpty)
524 + ModernButton.svg(
525 + svgPath: "assets/new-ui/refund_address.svg",
526 + onPressed: askForRefundAddress,
527 + size: 36,
528 + iconSize: 18,
529 + backgroundColor: Theme.of(context).colorScheme.surfaceContainerHighest,
530 + semanticLabel: S.of(context).refund_address,
531 + ),
532 + if (widget.isReceiverCard &&
533 + widget.exchangeViewModel.receiveAddress.isEmpty) ...[
534 + ModernButton.svg(
535 + svgPath: "assets/new-ui/paste.svg",
536 + onPressed: () => widget.onPushPasteButton?.call(context),
537 + size: 36,
538 + iconSize: 20,
539 + backgroundColor: Theme.of(context).colorScheme.surfaceContainerHighest,
540 + semanticLabel: S.of(context).paste,
541 + ),
542 + ModernButton.svg(
543 + svgPath: "assets/new-ui/scan.svg",
544 + onPressed: () => _presentQRScanner(context),
545 + size: 36,
546 + iconSize: 20,
547 + backgroundColor: Theme.of(context).colorScheme.surfaceContainerHighest,
548 + semanticLabel: S.of(context).scan,
549 + ),
550 + ],
551 + ],
552 + );
553 + },
554 + ),
555 + if (widget.isReceiverCard)
556 + Observer(
557 + builder: (_) {
558 + final selected = widget.exchangeViewModel.receiveCurrency;
559 + final labelType = memoLabelTypeFor(selected);
560 + if (labelType == null) {
561 + return const SizedBox.shrink();
562 + }
563 +
564 + final isDestinationTag = labelType == MemoLabelType.destinationTag;
565 + final hint = isDestinationTag
566 + ? S.of(context).destination_tag_optional
567 + : S.of(context).memo_optional;
568 + final disclaimer = isDestinationTag
569 + ? S.of(context).destination_tag_swap_disclaimer
570 + : S.of(context).memo_swap_disclaimer;
571 +
572 + return NewSendMemoInput(
573 + memoController: memoController,
574 + maxMemoLength: isDestinationTag ? 20 : 256,
575 + memoLength: memoController.text.length,
576 + hintText: hint,
577 + disclaimerText: disclaimer,
578 + );
579 + },
580 + ),
581 + ],
582 + ),
583 + ),
584 + ),
585 + ],
586 + );
587 + }
588 +
589 + void changeAddress({required String address}) {
590 + setState(() => addressController.text = _normalizeAddressFormat(address));
591 + }
592 +
593 + void changeAmount({required String amount}) {
594 + setState(() => amountController.text = amount);
595 + }
596 +
597 + String _normalizeAddressFormat(String address) {
598 + if (address.startsWith("bitcoincash:")) {
599 + address = address.substring(12);
600 + }
601 + return address;
602 + }
603 +
604 + void _presentCurrencyPicker() {
605 + final rawCurrencies = widget.isReceiverCard
606 + ? widget.exchangeViewModel.receiveCurrencies
607 + : widget.exchangeViewModel.depositCurrencies;
608 + final currencies = rawCurrencies.whereType<CryptoCurrency>().toList();
609 + final restrictToCurrentBalances = !widget.isReceiverCard &&
610 + widget.balanceByAsset != null &&
611 + widget.balanceByAsset!.isNotEmpty;
612 + if (!restrictToCurrentBalances) {
613 + appendEvmDefaultTokens(currencies);
614 + }
615 + if (widget.exchangeViewModel.wallet.type == WalletType.bitcoin) {
616 + currencies.sort((a, b) {
617 + if (a == CryptoCurrency.btcln) {
618 + return -1;
619 + }
620 + if (b == CryptoCurrency.btcln) {
621 + return 1;
622 + }
623 + return 0;
624 + });
625 + }
626 +
627 + List<CryptoCurrency> items = currencies;
628 + if (restrictToCurrentBalances) {
629 + final allowed = {
630 + for (final asset in widget.balanceByAsset!.keys) asset.title.toUpperCase(),
631 + };
632 + items = currencies.where((c) => allowed.contains(c.title.toUpperCase())).toList();
633 + }
634 +
635 + if (widget.isReceiverCard && widget.filteredNetwork != null) {
636 + final network = widget.filteredNetwork!;
637 + items = items.where((c) => cryptoCurrencyOrTokenToWalletType(c) == network).toList();
638 + }
639 +
640 + if (items.length <= 1) {
641 + return;
642 + }
643 +
644 + final selected = widget.isReceiverCard
645 + ? widget.exchangeViewModel.receiveCurrency
646 + : widget.exchangeViewModel.depositCurrency;
647 +
648 + CurrencyPickerSheet.show(
649 + context: context,
650 + args: CurrencyPickerArgs(
651 + items: items,
652 + selected: selected,
653 + filterByNetwork: widget.filteredNetwork,
654 + balanceByAsset: widget.balanceByAsset,
655 + useSingleNetworkLayout: widget.useSingleNetworkLayout,
656 + recentsSource: RecentsSource.trades,
657 + onSelected: widget.onCurrencySelected,
658 + symbolResolver: widget.exchangeViewModel.amountParsingProxy.getCryptoSymbol,
659 + ),
660 + );
661 + }
662 +
663 + Future<void> _presentQRScanner(BuildContext context) async {
664 + final isCameraPermissionGranted =
665 + await PermissionHandler.checkPermission(Permission.camera, context);
666 + if (!isCameraPermissionGranted) {
667 + return;
668 + }
669 + final code = await presentQRScanner(context);
670 + if (code == null) {
671 + return;
672 + }
673 + if (code.isEmpty) {
674 + return;
675 + }
676 +
677 + try {
678 + final uri = Uri.parse(code);
679 + widget.exchangeViewModel.receiveAddress = uri.path;
680 + } catch (_) {}
681 + }
682 +
683 + void _presentWalletPicker() async {
684 + final res = await showMaterialModalBottomSheet(
685 + context: context,
686 + backgroundColor: Colors.transparent,
687 + builder: (context) => ConstrainedBox(
688 + constraints: BoxConstraints(
689 + maxHeight: MediaQuery.of(context).size.height * 0.6,
690 + ),
691 + child: SwapAddressSelectionModal(
692 + isSelectingReceiver: widget.isReceiverCard,
693 + exchangeViewModel: widget.exchangeViewModel,
694 + ),
695 + ),
696 + );
697 + if (res != null && res is SwapAddressSelectionResult) {
698 + if (widget.isReceiverCard) {
699 + widget.exchangeViewModel.selectedAddressBookWallet = res.walletInfo;
700 + widget.exchangeViewModel.receiveAddress = res.address!;
701 + if (res.walletInfo?.name != null) {
702 + if (res.accountName != null) {
703 + widget.exchangeViewModel.receiveAddressDisplayName =
704 + "${res.walletInfo!.name} → ${res.accountName}";
705 + } else {
706 + widget.exchangeViewModel.receiveAddressDisplayName = res.walletInfo!.name;
707 + }
708 + }
709 + } else if (res.address == null || res.address!.isEmpty) {
710 + widget.exchangeViewModel.isSendFromExternal = true;
711 + askForRefundAddress();
712 + } else {
713 + widget.exchangeViewModel.isSendFromExternal = false;
714 + switchToDepositWallet(res.walletInfo!.name);
715 + }
716 + }
717 + }
718 +
719 + void switchToDepositWallet(String walletName) async {
720 + final walletType = cryptoCurrencyOrTokenToWalletType(widget.exchangeViewModel.depositCurrency);
721 + if (walletType == null) {
722 + return;
723 + }
724 + final wallet = await WalletInfo.get(walletName, walletType);
725 + if (wallet == null) {
726 + return;
727 + }
728 + widget.exchangeViewModel.depositAddress = wallet.address;
729 + addressController.text = _normalizeAddressFormat(wallet.address);
730 + widget.walletSwitcherViewModel.selectWallet(wallet);
731 + await widget.walletSwitcherViewModel.switchToSelectedWallet();
732 + }
733 +
734 + void askForRefundAddress() async {
735 + final refundAddress = await showModalBottomSheet(
736 + context: context,
737 + isScrollControlled: true,
738 + backgroundColor: Colors.transparent,
739 + builder: (context) => RefundAddressModal(
740 + selectedCurrency: widget.exchangeViewModel.depositCurrency,
741 + isFromWalletSelection: true,
742 + ),
743 + );
744 + if (refundAddress != null && refundAddress is String) {
745 + widget.exchangeViewModel.depositAddress = refundAddress;
746 + } else {
747 + widget.exchangeViewModel.depositAddress = "";
748 + }
749 + }
750 +
751 + void updateFiatAmount() {
752 + final newText = widget.isReceiverCard
753 + ? widget.exchangeViewModel.receiveAmountFiat
754 + : widget.exchangeViewModel.depositAmountFiat;
755 +
756 + if (double.tryParse(fiatAmountController.text) != double.tryParse(newText)) {
757 + if (newText == "0.00") {
758 + fiatAmountController.text = "";
759 + } else {
760 + fiatAmountController.text =
761 + newText.replaceAll(RegExp(r"(?<=\.\d*)0+$"), "").replaceAll(RegExp(r"\.$"), "");
762 + }
763 + }
764 + }
765 +
766 + String _middleTruncate(String s, int head, int tail) {
767 + if (s.length <= head + tail + 3) {
768 + return s;
769 + }
770 + return s.substring(0, head) + "..." + s.substring(s.length - tail);
771 + }
772 +
773 + String? _getCurrencyChainIconPath(CryptoCurrency curr) {
774 + try {
775 + if (curr.chainIconPath != null) {
776 + return curr.chainIconPath!;
777 + }
778 +
779 + if (curr.tag != null) {
780 + final currencyFromTag = CryptoCurrency.fromString(curr.tag!);
781 +
782 + if (currencyFromTag.chainIconPath != null) {
783 + return currencyFromTag.chainIconPath!;
784 + }
785 + }
786 + } catch (_) {}
787 + return null;
788 + }
789 +}
lib/new-ui/widgets/swap_page/swap_from_send_args.dart new
+20
@@ -0,0 +1,20 @@
1 +import "package:cake_wallet/new-ui/widgets/currency_picker/currency_picker_args.dart";
2 +import "package:cw_core/amount/money.dart";
3 +import "package:cw_core/crypto_currency.dart";
4 +import "package:cw_core/wallet_type.dart";
5 +
6 +class SwapFromSendArgs {
7 + const SwapFromSendArgs({
8 + required this.recipientAddress,
9 + required this.receiveCurrency,
10 + required this.targetWalletType,
11 + this.depositBalanceByAsset,
12 + this.receiveAmount,
13 + });
14 +
15 + final String recipientAddress;
16 + final CryptoCurrency receiveCurrency;
17 + final WalletType targetWalletType;
18 + final Map<CryptoCurrency, CurrencyPickerBalance>? depositBalanceByAsset;
19 + final Money? receiveAmount;
20 +}
lib/new-ui/widgets/swap_page/swap_section_header.dart new
+49
@@ -0,0 +1,49 @@
1 +import "package:cake_wallet/src/widgets/cake_image_widget.dart";
2 +import "package:cw_core/currency_for_wallet_type.dart";
3 +import "package:flutter/material.dart";
4 +
5 +class SwapSectionHeader extends StatelessWidget {
6 + const SwapSectionHeader({
7 + required this.label,
8 + required this.networkName,
9 + required this.networkIconPath,
10 + });
11 +
12 + final String label;
13 + final String networkName;
14 + final String networkIconPath;
15 +
16 + @override
17 + Widget build(BuildContext context) {
18 + final colors = Theme.of(context).colorScheme;
19 + final textTheme = Theme.of(context).textTheme;
20 + return Padding(
21 + padding: const EdgeInsets.symmetric(horizontal: 16),
22 + child: Row(
23 + children: [
24 + Text(
25 + label,
26 + style:
27 + textTheme.bodyMedium?.copyWith(fontWeight: FontWeight.w500, letterSpacing: -0.07),
28 + ),
29 + const SizedBox(width: 8),
30 + CakeImageWidget(
31 + imageUrl: networkIconPath,
32 + width: 16,
33 + height: 16,
34 + color: isMonochromeSymbolIcon(networkIconPath) ? colors.primary : null,
35 + ),
36 + const SizedBox(width: 4),
37 + Text(
38 + networkName,
39 + style: textTheme.bodyMedium?.copyWith(
40 + fontWeight: FontWeight.w500,
41 + letterSpacing: -0.07,
42 + color: colors.primary,
43 + ),
44 + ),
45 + ],
46 + ),
47 + );
48 + }
49 +}
lib/reactions/wallet_connect.dart
+11
@@ -21,6 +21,17 @@ String walletConnectCompatibleChainsLabel() {
21 return '$head, and ${names.last}';
22 }
23
24 +String networkDisplayName(WalletType type, int? chainId) {
25 + if (evm != null && isEVMCompatibleChain(type)) {
26 + final id = chainId ?? evm!.getChainIdByWalletType(type);
27 + final info = evm!.getChainInfoByChainId(id);
28 + if (info != null) {
29 + return info.name;
30 + }
31 + }
32 + return walletTypeToString(type);
33 +}
34 +
35 bool isEVMCompatibleChain(WalletType walletType) {
36 switch (walletType) {
37 case WalletType.polygon:
lib/src/widgets/bottom_sheet/token_selection_bottom_sheet.dart
+3 -3
@@ -381,7 +381,7 @@ class _TokenSelectionContentState extends State<_TokenSelectionContent> {
381 detectedWalletType: WalletType.solana,
382 detectedCurrency: selectedToken!,
383 isValid: true,
384 - amount: widget.paymentRequest.amount,
384 + amount: widget.paymentRequest.resolveTokenAmount(selectedToken!),
385 note: widget.paymentRequest.note,
386 scheme: widget.paymentRequest.scheme,
387 pjUri: widget.paymentRequest.pjUri,
@@ -398,7 +398,7 @@ class _TokenSelectionContentState extends State<_TokenSelectionContent> {
398 detectedWalletType: WalletType.tron,
399 detectedCurrency: selectedToken!,
400 isValid: true,
401 - amount: widget.paymentRequest.amount,
401 + amount: widget.paymentRequest.resolveTokenAmount(selectedToken!),
402 note: widget.paymentRequest.note,
403 scheme: widget.paymentRequest.scheme,
404 pjUri: widget.paymentRequest.pjUri,
@@ -415,7 +415,7 @@ class _TokenSelectionContentState extends State<_TokenSelectionContent> {
415 detectedWalletType: selectedNetwork!,
416 detectedCurrency: selectedToken!,
417 isValid: true,
418 - amount: widget.paymentRequest.amount,
418 + amount: widget.paymentRequest.resolveTokenAmount(selectedToken!),
419 note: widget.paymentRequest.note,
420 scheme: widget.paymentRequest.scheme,
421 pjUri: widget.paymentRequest.pjUri,
lib/src/widgets/new_list_row/list_item_regular_row_widget.dart
+22 -10
@@ -89,16 +89,28 @@ class ListItemRegularRowWidget extends StatelessWidget {
89 children: [
90 leadingIcon!,
91 Positioned(
92 - right: -3,
93 - bottom: -3,
94 - child: CakeImageWidget(
95 - imageUrl: badgeIconPath!,
96 - width: badgeIconSize ?? 10,
97 - height: badgeIconSize ?? 10,
98 - errorWidget: leadingIconErrorWidget,
99 - colorFilter: iconColor == null
100 - ? null
101 - : ColorFilter.mode(iconColor!, BlendMode.srcIn),
92 + right: -2,
93 + bottom: -2,
94 + child: Container(
95 + width: 16,
96 + height: 16,
97 + decoration: BoxDecoration(
98 + borderRadius: BorderRadius.circular(6),
99 + border: Border.all(
100 + color: theme.colorScheme.surfaceContainerHigh,
101 + width: 2,
102 + ),
103 + color: theme.colorScheme.onSurface,
104 + ),
105 + padding: const EdgeInsets.all(2),
106 + child: CakeImageWidget(
107 + imageUrl: badgeIconPath!,
108 + width: badgeIconSize ?? 12,
109 + height: badgeIconSize ?? 12,
110 + fit: BoxFit.cover,
111 + color: theme.colorScheme.surface,
112 + errorWidget: leadingIconErrorWidget,
113 + ),
114 ),
115 ),
116 ],
lib/utils/debounce.dart
+5
@@ -11,4 +11,9 @@ class Debounce {
11 _timer?.cancel();
12 _timer = Timer(duration, action);
13 }
14 +
15 + void cancel() {
16 + _timer?.cancel();
17 + _timer = null;
18 + }
19 }
lib/utils/payment_request.dart
+80 -27
@@ -1,25 +1,41 @@
1 -import 'package:cw_core/amount/amount_sanitizer.dart';
2 -import 'package:cw_core/amount/money.dart';
3 -import 'package:cw_core/crypto_currency.dart';
4 -import 'package:cw_core/lnurl.dart';
5 -import 'package:cw_core/payment_uris.dart';
6 -import 'package:cake_wallet/nano/nano.dart';
1 +import "package:cake_wallet/nano/nano.dart";
2 +import "package:cw_core/amount/amount_sanitizer.dart";
3 +import "package:cw_core/amount/money.dart";
4 +import "package:cw_core/crypto_currency.dart";
5 +import "package:cw_core/format_fixed.dart";
6 +import "package:cw_core/lnurl.dart";
7 +import "package:cw_core/payment_uris.dart";
8 +import "package:cw_core/utils/print_verbose.dart";
9
10 class PaymentRequest {
9 - PaymentRequest(this.address, this.amount, this.note, this.scheme, this.pjUri,
10 - {this.callbackUrl, this.callbackMessage, this.contractAddress});
11 + PaymentRequest(
12 + this.address,
13 + this.amount,
14 + this.note,
15 + this.scheme,
16 + this.pjUri, {
17 + this.callbackUrl,
18 + this.callbackMessage,
19 + this.contractAddress,
20 + this.chainId,
21 + this.rawTokenAmount,
22 + });
23
24 factory PaymentRequest.fromString(String input) {
25 try {
26 return PaymentRequest.fromBolt11(input);
27 } catch (_) {
16 - return PaymentRequest.fromUri(Uri.parse(input));
28 + try {
29 + return PaymentRequest.fromUri(Uri.parse(input));
30 + } catch (_) {
31 + return PaymentRequest(input, "", "", "", null);
32 + }
33 }
34 }
35
36 factory PaymentRequest.fromBolt11(String invoice) {
37 final amount = getBolt11Amount(invoice) ?? Money.zero(CryptoCurrency.btcln);
22 - return PaymentRequest(invoice, amount.toString(), '', 'lightning', null);
38 + return PaymentRequest(invoice, amount.toString(), "", "lightning", null);
39 }
40
41 factory PaymentRequest.fromUri(Uri? uri) {
@@ -32,13 +48,15 @@ class PaymentRequest {
48 String? callbackMessage;
49 String? pjUri;
50 String? contractAddress;
51 + int? chainId;
52 + String? rawTokenAmount;
53
54 if (uri != null) {
37 - if (uri.queryParameters['pj'] != null) {
55 + if (uri.queryParameters["pj"] != null) {
56 pjUri = uri.toString();
57 }
58
41 - address = uri.queryParameters['address'] ?? uri.path;
59 + address = uri.queryParameters["address"] ?? uri.path;
60 try {
61 final lnAmount = getBolt11Amount(uri.path) ?? Money.zero(CryptoCurrency.btcln);
62
@@ -47,27 +65,30 @@ class PaymentRequest {
65 }
66 } catch (_) {}
67 if (amount.isEmpty) {
50 - amount = uri.queryParameters['tx_amount'] ?? uri.queryParameters['amount'] ?? "";
68 + amount = uri.queryParameters["tx_amount"] ?? uri.queryParameters["amount"] ?? "";
69 }
52 - note = uri.queryParameters['tx_description'] ?? uri.queryParameters['message'] ?? "";
70 + note = uri.queryParameters["tx_description"] ?? uri.queryParameters["message"] ?? "";
71 scheme = uri.scheme;
54 - callbackUrl = uri.queryParameters['callback'];
55 - callbackMessage = uri.queryParameters['callbackMessage'];
56 - walletType = uri.queryParameters['type'];
72 + callbackUrl = uri.queryParameters["callback"];
73 + callbackMessage = uri.queryParameters["callbackMessage"];
74 + walletType = uri.queryParameters["type"];
75
76 if (scheme == "ethereum") {
77 final paymentUri = ERC681URI.fromUri(uri);
78 + final hasExplicitChainId = uri.path.contains("@");
79
80 address = paymentUri.address;
81 amount = paymentUri.amount;
82 contractAddress = paymentUri.contractAddress;
83 + chainId = hasExplicitChainId ? paymentUri.chainId : null;
84 + rawTokenAmount = paymentUri.rawTokenAmount;
85 } else if (scheme == "tron") {
65 - final token = uri.queryParameters['token'];
86 + final token = uri.queryParameters["token"];
87 if (token != null && token.isNotEmpty) {
88 contractAddress = token;
89 }
90 } else if (scheme == "solana") {
70 - final splToken = uri.queryParameters['spl-token'];
91 + final splToken = uri.queryParameters["spl-token"];
92 if (splToken != null && splToken.isNotEmpty) {
93 contractAddress = splToken;
94 }
@@ -99,6 +120,8 @@ class PaymentRequest {
120 callbackUrl: callbackUrl,
121 callbackMessage: callbackMessage,
122 contractAddress: contractAddress,
123 + chainId: chainId,
124 + rawTokenAmount: rawTokenAmount,
125 );
126 }
127
@@ -110,23 +133,53 @@ class PaymentRequest {
133 final String? callbackUrl;
134 final String? callbackMessage;
135 final String? contractAddress;
136 + final int? chainId;
137 + final String? rawTokenAmount;
138 +
139 + String? resolveTokenAmount(CryptoCurrency token) {
140 + if (amount.isNotEmpty) {
141 + return amount;
142 + }
143 +
144 + if (rawTokenAmount == null || rawTokenAmount!.isEmpty) {
145 + return null;
146 + }
147 +
148 + final raw = BigInt.tryParse(rawTokenAmount!);
149 + if (raw == null) {
150 + return null;
151 + }
152 +
153 + // 1e9 whole tokens is beyond any real payment, so a larger result means the QR
154 + // came from an old app version that encoded with 18 decimals regardless of token.
155 + if (token.decimals != 18 && raw > BigInt.from(10).pow(token.decimals + 9)) {
156 + printV("resolveTokenAmount: reading $rawTokenAmount with legacy 18 decimals");
157 + return formatFixed(raw, 18);
158 + }
159 +
160 + return formatFixed(raw, token.decimals);
161 + }
162
163 /// Checks if the amount string is already in a usable format (e.g., "123.45") and doesn't need to be converted from raw format.
164 ///
165 /// This was causing an error for us when we scan Nano QRs with amounts in them, the amounts are already in usable format so when the parsing was done, it returns 0 wrongly.
166 static bool _isAlreadyUsableAmount(String amount) {
118 - if (amount.isEmpty) return false;
167 + if (amount.isEmpty) {
168 + return false;
169 + }
170
171 final parsed = double.tryParse(amount.sanitized());
121 - if (parsed == null) return false;
122 -
123 - // Check if the amount contains a decimal point and is a reasonable number,
124 - // it's likely already in usable format rather than raw format
125 - // Raw amounts are typically very large integers without decimal points
126 - if (amount.contains('.') && parsed > 0 && parsed < 1000000000) return true;
172 + if (parsed == null) {
173 + return false;
174 + }
175 + if (amount.contains(".") && parsed > 0 && parsed < 1000000000) {
176 + return true;
177 + }
178
179 // If it's a small integer (less than 1 billion), it's likely already usable
129 - if (parsed == parsed.toInt() && parsed < 1000000000) return true;
180 + if (parsed == parsed.toInt() && parsed < 1000000000) {
181 + return true;
182 + }
183
184 return false;
185 }
lib/utils/token_utilities.dart
+44 -7
@@ -222,6 +222,24 @@ class TokenUtilities {
222 return null;
223 }
224
225 + static String? findSolanaTokenMint(CryptoCurrency currency) {
226 + if (currency is SPLToken) return currency.mintAddress;
227 +
228 + for (final token in loadDefaultSolTokensForSwap()) {
229 + if (_matchesCurrency(token, currency)) return token.mintAddress;
230 + }
231 + return null;
232 + }
233 +
234 + static String? findTronTokenContract(CryptoCurrency currency) {
235 + if (currency is TronToken) return currency.contractAddress;
236 +
237 + for (final token in loadDefaultTronTokensForSwap()) {
238 + if (_matchesCurrency(token, currency)) return token.contractAddress;
239 + }
240 + return null;
241 + }
242 +
243 static bool isNativeToken(CryptoCurrency currency) {
244 final title = currency.title.toLowerCase();
245 final tag = currency.tag?.toLowerCase();
@@ -289,9 +307,7 @@ class TokenUtilities {
307 final allTokens = <CryptoCurrency>[baseCurrency];
308 final addedAddresses = <String>{};
309
292 - // Handle EVM networks
310 if (isEVMCompatibleChain(network)) {
294 - // First, collect all user tokens
311 final userTokens = await _getUserTokensForNetwork(baseCurrency);
312 for (final token in userTokens) {
313 if (token is Erc20Token) {
@@ -302,7 +318,17 @@ class TokenUtilities {
318 }
319 }
320
305 - // Then add tokens from CryptoCurrency.all that don't duplicate user tokens
321 + if (evm != null) {
322 + final chainId = evm!.getChainIdByWalletType(network);
323 + for (final token in evm!.getDefaultTokensByChainId(chainId)) {
324 + final address = token.contractAddress.toLowerCase();
325 + if (addedAddresses.add(address)) {
326 + allTokens.add(token);
327 + }
328 + }
329 + }
330 +
331 + // Add tokens from CryptoCurrency.all that don't duplicate user tokens
332 for (final currency in CryptoCurrency.all) {
333 // Match by tag for POL/BASE, match by title==tag for ETH
334 final matches = (baseCurrency.tag == null && baseCurrency.title == currency.tag) ||
@@ -320,10 +346,7 @@ class TokenUtilities {
346 }
347 }
348 }
323 - }
324 -
325 - // Handle Solana network
326 - else if (network == WalletType.solana) {
349 + } else if (network == WalletType.solana) {
350 final userSolTokens = await loadAllUniqueSolTokens();
351 for (final token in userSolTokens) {
352 final mintAddress = token.mintAddress.toLowerCase();
@@ -332,6 +355,13 @@ class TokenUtilities {
355 }
356 }
357
358 + for (final token in loadDefaultSolTokensForSwap()) {
359 + final mintAddress = token.mintAddress.toLowerCase();
360 + if (addedAddresses.add(mintAddress)) {
361 + allTokens.add(token);
362 + }
363 + }
364 +
365 for (final currency in CryptoCurrency.all) {
366 if (currency.tag?.toLowerCase() == 'sol') {
367 if (currency is SPLToken) {
@@ -356,6 +386,13 @@ class TokenUtilities {
386 }
387 }
388
389 + for (final token in loadDefaultTronTokensForSwap()) {
390 + final contractAddress = token.contractAddress.toLowerCase();
391 + if (addedAddresses.add(contractAddress)) {
392 + allTokens.add(token);
393 + }
394 + }
395 +
396 for (final currency in CryptoCurrency.all) {
397 if (currency.tag?.toLowerCase() == 'trx') {
398 if (currency is TronToken) {
lib/view_model/exchange/exchange_trade_view_model.dart
+11 -2
@@ -448,9 +448,17 @@ abstract class ExchangeTradeViewModelBase with Store {
448 case WalletType.bsc:
449 return _createERC681URI(fromCurrency, inputAddress, amount);
450 case WalletType.solana:
451 - return SolanaURI(amount: amount, address: inputAddress);
451 + return SolanaURI(
452 + amount: amount,
453 + address: inputAddress,
454 + contractAddress: TokenUtilities.findSolanaTokenMint(fromCurrency),
455 + );
456 case WalletType.tron:
453 - return TronURI(amount: amount, address: inputAddress);
457 + return TronURI(
458 + amount: amount,
459 + address: inputAddress,
460 + contractAddress: TokenUtilities.findTronTokenContract(fromCurrency),
461 + );
462 case WalletType.monero:
463 return MoneroURI(address: inputAddress, amount: amount);
464 case WalletType.wownero:
@@ -494,6 +502,7 @@ abstract class ExchangeTradeViewModelBase with Store {
502 address: address,
503 amount: amount,
504 contractAddress: erc20Token.contractAddress,
505 + tokenDecimals: erc20Token.decimal,
506 );
507 }
508 return null;
lib/view_model/payment/payment_view_model.dart
+11 -3
@@ -146,6 +146,13 @@ abstract class PaymentViewModelBase with Store {
146 await evm!.selectChain(appStore.wallet!, detectedChainId!, node: node);
147 }
148
149 + void applyManualEvmSelection(AddressDetectionResult detection) {
150 + runInAction(() {
151 + _lastDetectionResult = detection;
152 + detectedWalletType = detection.detectedWalletType;
153 + });
154 + }
155 +
156 Future<List<WalletInfo>> getWalletsByType(WalletType walletType) async {
157 return (await WalletInfo.getAll()).where((wallet) => wallet.type == walletType).toList();
158 }
@@ -245,7 +252,8 @@ class PaymentFlowResult {
252 if (chainId == null && addressDetectionResult.detectedCurrency != null) {
253 chainId = getChainIdByCryptoCurrency(addressDetectionResult.detectedCurrency!);
254 }
248 - if (chainId == null) {
255 +
256 + if (chainId == null && isEVMCompatibleChain(wallet.type)) {
257 chainId = evm?.getChainIdByWalletType(wallet.type);
258 }
259
@@ -267,7 +275,7 @@ class PaymentFlowResult {
275 if (chainId == null && addressDetectionResult.detectedCurrency != null) {
276 chainId = getChainIdByCryptoCurrency(addressDetectionResult.detectedCurrency!);
277 }
270 - if (chainId == null) {
278 + if (chainId == null && isEVMCompatibleChain(wallets.first.type)) {
279 chainId = evm?.getChainIdByWalletType(wallets.first.type);
280 }
281
@@ -289,7 +297,7 @@ class PaymentFlowResult {
297 if (chainId == null && addressDetectionResult.detectedCurrency != null) {
298 chainId = getChainIdByCryptoCurrency(addressDetectionResult.detectedCurrency!);
299 }
292 - if (chainId == null) {
300 + if (chainId == null && isEVMCompatibleChain(walletType)) {
301 chainId = evm?.getChainIdByWalletType(walletType);
302 }
303
lib/view_model/send/output.dart
+1
@@ -263,6 +263,7 @@ abstract class OutputBase with Store {
263 void updateWallet(
264 WalletBase<Balance, TransactionHistoryBase<TransactionInfo>, TransactionInfo> newWallet) {
265 _wallet = newWallet;
266 + estimatedFee = Money.zero(cryptoCurrencyHandler());
267 }
268
269 @action
lib/view_model/send/send_view_model.dart
+4 -1
@@ -138,9 +138,12 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
138 return null;
139 }, (_) async {
140 // When chain changes, update currencies and selected currency
141 + final selectionAtChainChange = selectedCryptoCurrency;
142 await Future.delayed(const Duration(milliseconds: 100));
143 currencies = wallet.balance.keys.toList();
143 - selectedCryptoCurrency = wallet.currency;
144 + if (selectedCryptoCurrency == selectionAtChainChange) {
145 + selectedCryptoCurrency = wallet.currency;
146 + }
147 updateSendingBalance();
148 });
149 }
lib/view_model/wallet_address_list/wallet_address_list_view_model.dart
+3 -1
@@ -218,11 +218,13 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
218 @computed
219 PaymentURI get uri {
220 if (tokenCurrency != null && isEVMCompatibleChain(wallet.type)) {
221 + final erc20Token = tokenCurrency! as Erc20Token;
222 return ERC681URI(
223 chainId: wallet.chainId ?? 1,
224 address: wallet.walletAddresses.address,
225 amount: _amount,
225 - contractAddress: (tokenCurrency! as Erc20Token).contractAddress,
226 + contractAddress: erc20Token.contractAddress,
227 + tokenDecimals: erc20Token.decimal,
228 );
229 }
230 if (tokenCurrency is TronToken && wallet.type == WalletType.tron) {
res/pictures/card_icons/symbol_icons/bnb-symbol.svg
+1 -1
@@ -1,3 +1,3 @@
1 <svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg">
2 -<path d="M11.7838 8.47366L22.0463 2.5L32.3088 8.47366L28.5358 10.6805L22.0463 6.91366L15.5568 10.6805L11.7838 8.47366ZM32.3088 16.0073L28.5358 13.8005L22.0463 17.5673L15.5568 13.8005L11.7838 16.0073V20.421L18.2733 24.1878V31.7214L22.0463 33.9283L25.8193 31.7214V24.1878L32.3088 20.421V16.0073ZM32.3088 27.9547V23.541L28.5358 25.7478V30.1615L32.3088 27.9547ZM34.9876 29.5146L28.4982 33.2815V37.6951L38.7606 31.7214V19.7742L34.9876 21.981V29.5146ZM31.2147 12.2405L34.9876 14.4473V18.861L38.7606 16.6542V12.2405L34.9876 10.0337L31.2147 12.2405ZM18.2733 34.8795V39.2932L22.0463 41.5L25.8193 39.2932V34.8795L22.0463 37.0863L18.2733 34.8795ZM11.7838 27.9547L15.5568 30.1615V25.7478L11.7838 23.541V27.9547ZM18.2733 12.2405L22.0463 14.4473L25.8193 12.2405L22.0463 10.0337L18.2733 12.2405ZM9.105 14.4473L12.878 12.2405L9.105 10.0337L5.33203 12.2405V16.6542L9.105 18.861V14.4473ZM9.105 21.981L5.33203 19.7742V31.7214L15.5945 37.6951V33.2815L9.105 29.5146V21.981Z" fill="white"/>
2 +<path d="M11.7848 8.47366L22.0473 2.5L32.3098 8.47366L28.5368 10.6805L22.0473 6.91366L15.5578 10.6805L11.7848 8.47366ZM32.3098 16.0073L28.5368 13.8005L22.0473 17.5673L15.5578 13.8005L11.7848 16.0073V20.421L18.2743 24.1878V31.7214L22.0473 33.9283L25.8203 31.7214V24.1878L32.3098 20.421V16.0073ZM32.3098 27.9547V23.541L28.5368 25.7478V30.1615L32.3098 27.9547ZM34.9886 29.5146L28.4991 33.2815V37.6951L38.7616 31.7214V19.7742L34.9886 21.981V29.5146ZM31.2156 12.2405L34.9886 14.4473V18.861L38.7616 16.6542V12.2405L34.9886 10.0337L31.2156 12.2405ZM18.2743 34.8795V39.2932L22.0473 41.5L25.8203 39.2932V34.8795L22.0473 37.0863L18.2743 34.8795ZM11.7848 27.9547L15.5578 30.1615V25.7478L11.7848 23.541V27.9547ZM18.2743 12.2405L22.0473 14.4473L25.8203 12.2405L22.0473 10.0337L18.2743 12.2405ZM9.10597 14.4473L12.8789 12.2405L9.10597 10.0337L5.33301 12.2405V16.6542L9.10597 18.861V14.4473ZM9.10597 21.981L5.33301 19.7742V31.7214L15.5955 37.6951V33.2815L9.10597 29.5146V21.981Z" fill="white"/>
3 </svg>
res/pictures/network_cube.svg new
+3
@@ -0,0 +1,3 @@
1 +<svg width="75" height="75" viewBox="0 0 75 75" fill="none" xmlns="http://www.w3.org/2000/svg">
2 +<path d="M35.1562 61.1543V38.8465L15.625 27.5363V49.3035C15.625 49.4634 15.6651 49.6137 15.7453 49.7543C15.8255 49.8944 15.9456 50.0145 16.1055 50.1145L35.1562 61.1543ZM39.8438 61.1543L58.8945 50.1145C59.0544 50.0145 59.1745 49.8944 59.2547 49.7543C59.3349 49.6137 59.375 49.4634 59.375 49.3035V27.5363L39.8438 38.8465V61.1543ZM37.5 34.8082L56.7969 23.6543L37.9805 12.7707C37.8206 12.6707 37.6604 12.6207 37.5 12.6207C37.3396 12.6207 37.1794 12.6707 37.0195 12.7707L18.2031 23.6543L37.5 34.8082ZM13.7625 54.2309C12.8729 53.7184 12.1797 53.0335 11.6828 52.1762C11.1859 51.3184 10.9375 50.3767 10.9375 49.3512V25.6496C10.9375 24.6241 11.1859 23.6824 11.6828 22.8246C12.1797 21.9673 12.8729 21.2824 13.7625 20.7699L34.6758 8.73242C35.5648 8.2194 36.5063 7.96289 37.5 7.96289C38.4937 7.96289 39.4352 8.2194 40.3242 8.73242L61.2375 20.7699C62.1271 21.2824 62.8203 21.9673 63.3172 22.8246C63.8141 23.6824 64.0625 24.6241 64.0625 25.6496V49.3512C64.0625 50.3767 63.8141 51.3184 63.3172 52.1762C62.8203 53.0335 62.1271 53.7184 61.2375 54.2309L40.3242 66.2684C39.4352 66.7814 38.4937 67.0379 37.5 67.0379C36.5063 67.0379 35.5648 66.7814 34.6758 66.2684L13.7625 54.2309Z" fill="#8C9FBB"/>
3 +</svg>
res/pictures/swap_arrows.svg new
+4
@@ -0,0 +1,4 @@
1 +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2 +<path d="M21.375 10.8292C21.0884 8.76693 20.1317 6.85611 18.6523 5.39108C17.1729 3.92604 15.2528 2.98806 13.1879 2.72161C11.123 2.45517 9.02768 2.87505 7.22485 3.91657C5.42201 4.95809 4.01162 6.56347 3.21094 8.48542M2.625 3.79792V8.48542H7.3125" stroke="#91B0FF" stroke-width="1.6875" stroke-linecap="round" stroke-linejoin="round"/>
3 +<path d="M2.625 13.1719C2.91159 15.2341 3.86828 17.1449 5.34769 18.61C6.8271 20.075 8.74716 21.013 10.8121 21.2794C12.877 21.5459 14.9723 21.126 16.7752 20.0845C18.578 19.043 19.9884 17.4376 20.7891 15.5156M21.375 20.2031V15.5156H16.6875" stroke="#91B0FF" stroke-width="1.6875" stroke-linecap="round" stroke-linejoin="round"/>
4 +</svg>
res/pictures/wallet_filled.svg new
+3
@@ -0,0 +1,3 @@
1 +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2 +<path d="M14.2804 2.04688C16.3023 2.04688 17.3133 2.04689 18.0855 2.44039C18.7648 2.78652 19.3171 3.33881 19.6633 4.01812C19.837 4.359 19.9339 4.74639 19.9881 5.24669C19.6684 5.23766 19.3206 5.23618 18.9474 5.23595H16.5969C15.9461 5.23595 15.4751 5.23271 15.0594 5.28743C12.3594 5.64291 10.2346 7.76758 9.87916 10.4676C9.82444 10.8833 9.82768 11.3544 9.82768 12.0052C9.82768 12.656 9.82444 13.1271 9.87916 13.5427C10.2346 16.2427 12.3594 18.3675 15.0594 18.7229C15.4751 18.7777 15.9461 18.7744 16.5969 18.7744H18.9474C19.3206 18.7742 19.6684 18.7726 19.9881 18.7635C19.9339 19.2639 19.837 19.6513 19.6633 19.9922C19.3171 20.6715 18.7648 21.2238 18.0855 21.5699C17.3133 21.9634 16.3023 21.9634 14.2804 21.9634H7.72173C5.69979 21.9634 4.68883 21.9634 3.91655 21.5699C3.23724 21.2238 2.68495 20.6715 2.33883 19.9922C1.94534 19.2199 1.94531 18.209 1.94531 16.187V7.82329C1.94531 5.80135 1.94533 4.79039 2.33883 4.01812C2.68495 3.33881 3.23724 2.78652 3.91655 2.44039C4.68883 2.04689 5.69979 2.04688 7.72173 2.04688H14.2804ZM18.6653 6.74022C20.2457 6.74022 21.0358 6.74022 21.634 7.05994C22.1063 7.31238 22.4932 7.69919 22.7456 8.17148C23.0653 8.76964 23.0653 9.55987 23.0653 11.1402V12.8701C23.0653 14.4505 23.0653 15.2407 22.7456 15.8388C22.4932 16.3111 22.1063 16.6979 21.634 16.9504C21.0358 17.2701 20.2457 17.2701 18.6653 17.2701H16.5969C15.8983 17.2701 15.549 17.2701 15.2558 17.2315C13.2307 16.9649 11.6372 15.3714 11.3706 13.3463C11.332 13.0531 11.3319 12.7038 11.3319 12.0052C11.3319 11.3066 11.332 10.9573 11.3706 10.664C11.6372 8.63896 13.2307 7.04542 15.2558 6.77881C15.549 6.74021 15.8983 6.74022 16.5969 6.74022H18.6653ZM15.8448 10.4708C15.014 10.4708 14.3406 11.1443 14.3405 11.9751C14.3405 12.8059 15.014 13.4793 15.8448 13.4793C16.6756 13.4793 17.3491 12.8059 17.3491 11.9751C17.3491 11.1443 16.6756 10.4708 15.8448 10.4708Z" fill="#002860"/>
3 +</svg>
res/values/strings_ar.arb
+21 -36
@@ -94,6 +94,7 @@
94 "available_balance": "الرصيد المتاح",
95 "available_balance_description": "يشير “Available Balance” أو “Confirmed Balance” إلى الأموال التي يمكن إنفاقها فورًا. إذا ظهرت الأموال في الرصيد السفلي ولكن ليس في الرصيد العلوي، فعليك الانتظار بضع دقائق حتى تحصل الأموال الواردة على المزيد من تأكيدات الشبكة. بعد حصولها على المزيد من التأكيدات، ستصبح قابلة للإنفاق.",
96 "avg_savings": "متوسط التوفير",
97 + "avl": "AVL",
98 "awaitDAppProcessing": "يرجى الانتظار حتى ينتهي الـ dApp من المعالجة.",
99 "awaiting_payment_confirmation": "بانتظار تأكيد الدفع",
100 "background_sync": "المزامنة في الخلفية",
@@ -219,6 +220,7 @@
220 "color_theme": "سمة الألوان",
221 "coming_soon_tag": "قريبًا",
222 "commit_transaction_amount_fee": "تأكيد المعاملة\nالمبلغ: ${amount}\nالرسوم: ${fee}",
223 + "compatible_networks": "الشبكات المتوافقة",
224 "compatible_services": "الخدمات المتوافقة",
225 "compatible_services_desc": "استخدم أداة المسح لقراءة الأنواع التالية من رموز QR المدعومة في Cake Wallet:",
226 "configure": "تهيئة",
@@ -258,6 +260,7 @@
260 "contact_support": "اتصل بالدعم",
261 "contacts": "جهات الاتصال",
262 "continue_text": "متابعة",
263 + "continue_to_swap": "الاستمرار في المبادلة",
264 "contract_address": "عنوان العقد الذكي",
265 "contract_warning": "تم وضع علامة على عنوان هذا العقد على أنه قد يكون احتياليًا. يُرجى المتابعة بحذر.",
266 "contractName": "اسم العقد",
@@ -286,6 +289,7 @@
289 "creation_date": "تاريخ الإنشاء",
290 "crypto_addresses": "عناوين العملات المشفرة",
291 "csv_nothing_to_export": "لا يوجد شيء للتصدير",
292 + "current_network": "الشبكة الحالية",
293 "current_swap": "المبادلة الحالية",
294 "current_wallet": "المحفظة الحالية",
295 "custom": "مخصص",
@@ -443,6 +447,7 @@
447 "etherscan_history": "سجل Etherscan",
448 "event": "حدث",
449 "events": "الأحداث",
450 + "evm_address_detected": "تم اكتشاف عنوان EVM",
451 "evm_ecosystem_description": "إذا لزم الأمر، عدّل الشبكة والرمز المميّز الذي ترغب في استخدامه لهذا الدفع.",
452 "exchange": "تبادل",
453 "exchange_extra_info": "يرجى عدم نسيان تحديد المذكرة أو المعرّف الإضافي عند إرسال هذه المعاملة إلى منصة التداول لإجراء عملية التبادل",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "جميع أحدث النماذج (GPT-5.3، Claude 4.6).\nبدون اشتراك، ادفع بالعملات المشفرة.",
670 "narrow": "ضيق",
671 "network": "الشبكة",
672 + "network_address_detected": "تم اكتشاف عنوان ${network}.",
673 + "network_prefix_on": "على",
674 + "network_switch_failed": "فشل التبديل إلى الشبكة المطلوبة. لم يتم تطبيق الدفع، يرجى المحاولة مرة أخرى.",
675 "networks": "الشبكات",
676 "new_first_wallet_text": "الحفاظ على أمان عملاتك المشفرة سهل للغاية",
677 "new_node_testing": "اختبار العقدة الجديدة",
@@ -971,6 +979,7 @@
979 "select_asset": "حدد الأصول",
980 "select_backup_file": "حدد ملف النسخ الاحتياطي",
981 "select_buy_provider_notice": "حدّد مزوّد الشراء أعلاه. يمكنك تخطّي هذه الشاشة عبر تعيين مزوّد الشراء الافتراضي في إعدادات التطبيق.",
982 + "select_compatible_wallet": "اختر واحدة من محفظتك المتوافقة",
983 "select_destination": "يرجى تحديد وجهة ملف النسخ الاحتياطي.",
984 "select_fiat_currency_title": "حدد العملة",
985 "select_hw_account_below": "يرجى تحديد الحساب المراد استعادته أدناه:",
@@ -980,6 +989,9 @@
989 "select_network_title": "حدد الشبكة",
990 "select_other_wallet": "اختر محفظة أخرى",
991 "select_receiver": "حدد المستلم",
992 + "select_recipient_network": "حدد شبكة المستلمين",
993 + "select_recipient_network_description": "تتوافق الشبكات المتعددة مع عنوان المستلم المقدم",
994 + "select_recipient_network_for_tx": "حدد شبكة المستلم لهذه المعاملة",
995 "select_sell_provider_notice": "اختر مزوّد البيع أعلاه. يمكنك تخطّي هذه الشاشة بتعيين مزوّد البيع الافتراضي في إعدادات التطبيق.",
996 "select_token": "اختر التوكن",
997 "select_your_country": "يرجى اختيار بلدك",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "القوالب",
1025 "send_title": "إرسال",
1026 "send_to": "إرسال إلى",
1027 + "send_to_network": "أرسل إلى ${network}",
1028 + "send_to_network_description": "هل ترغب في التبديل إلى محفظة ${network} الخاصة بك أو استبدال أموال ${currentNetwork} الخاصة بك بهذه الدفعة؟",
1029 "send_to_this_address": "أرسل ${currency} ${tag} إلى هذا العنوان",
1030 "send_xmr": "إرسال XMR",
1031 "send_your_wallet": "محفظتك",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "روابط الدعم الأخرى",
1145 "supported": "مدعوم",
1146 "swap": "مبادلة",
1147 + "swap_from_network": "التبديل من ${network}",
1148 + "swap_from_network_description": "لإرسال الأموال إلى شبكة ${targetNetwork}، ستحتاج إلى مبادلة أموالك ${currentNetwork}. هل تريد المتابعة؟",
1149 "swap_id": "معرّف المبادلة",
1150 "swap_provider_initial_desc": "اختر نوع مزوّد المبادلة الذي تفضّل استخدامه عند إجراء المبادلة داخل التطبيق",
1151 "swap_providers": "مزودو المبادلة",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "لن يستغرق هذا وقتًا طويلًا. لا تغادر هذه الشاشة وإلا فقد تُفقد الأموال المُسحوبة.",
1154 "swipe_to_bridge": "اسحب لإجراء الجسر",
1155 "swipe_to_send": "اسحب للإرسال",
1156 + "switch_to_x_wallet": "قم بالتبديل إلى محفظة ${network}.",
1157 "switch_wallet": "تبديل المحفظة",
1158 "switchToETHWallet": "يرجى التبديل إلى محفظة Ethereum والمحاولة مرة أخرى",
1159 "switchToWCCompatibleWallet": "يرجى التبديل إلى محفظة متوافقة مع WalletConnect والمحاولة مرة أخرى (${chains}).",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "تفاصيل العملات غير المُنفَقة",
1321 "unspent_coins_title": "العملات غير المُنفَقة",
1322 "unsupported_asset": "لا ندعم هذا الإجراء لهذا الأصل. يُرجى إنشاء محفظة لأصل مدعوم أو التبديل إلى محفظة من نوع أصل مدعوم.",
1323 + "unsupported_network_requested": "طلب الدفع هذا مخصص لشبكة لا ندعمها (معرف السلسلة ${chainId}).",
1324 + "unsupported_token_requested": "طلب الدفع هذا مخصص لرمز مميز لم نتمكن من تحديده على الشبكة المحددة.",
1325 "uptime": "مدة التشغيل",
1326 "upto": "حتى ${value}",
1327 "usb": "USB",
@@ -1450,39 +1469,5 @@
1469 "zcash_card_enable_later": "يمكنك دائمًا تفعيل هذه البطاقة لاحقًا من الإعدادات",
1470 "zcash_card_missing_funds": "هل أموالك مفقودة؟",
1471 "zcash_card_scan": "مسح",
1453 - "zcash_card_warning": "لا تُغلق التطبيق حتى يكتمل الإجراء، لأنك إن فعلت ذلك فستحتاج هذه العملية إلى البدء من جديد من البداية.",
1454 - "are_you_sure_exit": "هل أنت متأكد أنك تريد الخروج؟",
1455 - "available": "متاح",
1456 - "bridging": "جسر العملات",
1457 - "compatible_services": "الخدمات المتوافقة",
1458 - "compatible_services_desc": "استخدم أداة المسح لقراءة الأنواع التالية من رموز QR المدعومة في Cake Wallet:",
1459 - "crypto_addresses": "عناوين العملات المشفرة",
1460 - "delete_this_node": "حذف هذه العقدة",
1461 - "device_confirmation": "تأكيد الجهاز",
1462 - "favorite_token": "التوكن المفضل",
1463 - "favorite_token_desc": "سيظهر رصيد التوكن المفضل على بطاقة الرصيد.",
1464 - "gallery": "المعرض",
1465 - "hww_exit_desc": "سيؤدي هذا إلى إنهاء عملية الإقران الجارية مع جهازك الصلب",
1466 - "input": "إدخال",
1467 - "manual_input": "إدخال يدوي",
1468 - "networks": "الشبكات",
1469 - "node_share_desc": "امسح رمز QR هذا من شاشة المسح لاستيراد هذه العقدة.",
1470 - "nodes_desc": "إدارة العقد الموجودة أو إضافة عقدة مخصصة.",
1471 - "ocp_desc": "ادفع بالعملات المشفرة في المتاجر",
1472 - "pairing_code": "رمز الإقران",
1473 - "pairing_code_desc_1": "سيعرض جهازك رمز إقران.",
1474 - "pairing_code_desc_2": "أدخله هنا للمتابعة",
1475 - "pairing_error": "خطأ في الإقران",
1476 - "passphrase_view_keys": "عبارة المرور",
1477 - "payment_invoices": "فواتير الدفع",
1478 - "save_contact": "حفظ جهة الاتصال",
1479 - "share_this_node": "مشاركة هذه العقدة",
1480 - "show_combined_balance": "إظهار الرصيد المجمّع",
1481 - "swipe_to_bridge": "اسحب لإجراء الجسر",
1482 - "this_can_take_few_seconds": "قد يستغرق هذا بضع ثوانٍ",
1483 - "username_check_your_network": "تعذّر التحقق من اسم المستخدم. يُرجى التحقق من اتصالك بالشبكة.",
1484 - "verifying_code": "جارٍ التحقق من الرمز",
1485 - "wallet_balance": "رصيد المحفظة",
1486 - "wc_desc": "اتصل بسهولة بتطبيقات DApps",
1487 - "yes_exit": "نعم. اخرج"
1488 -}
1472 + "zcash_card_warning": "لا تُغلق التطبيق حتى يكتمل الإجراء، لأنك إن فعلت ذلك فستحتاج هذه العملية إلى البدء من جديد من البداية."
1473 +}
\ No newline at end of file
res/values/strings_bg.arb
+21 -36
@@ -94,6 +94,7 @@
94 "available_balance": "Наличен баланс",
95 "available_balance_description": "„Наличният баланс“ или „Потвърденият баланс“ са средства, които могат да бъдат изразходвани веднага. Ако средствата се появяват в долния баланс, но не и в горния, трябва да изчакате няколко минути, докато входящите средства получат повече мрежови потвърждения. След като получат повече потвърждения, те ще могат да бъдат изразходвани.",
96 "avg_savings": "Средни спестявания",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Моля, изчакайте dApp да завърши обработката.",
99 "awaiting_payment_confirmation": "В очакване на потвърждение на плащането",
100 "background_sync": "Фонова синхронизация",
@@ -219,6 +220,7 @@
220 "color_theme": "Цветова тема",
221 "coming_soon_tag": "Очаквайте скоро",
222 "commit_transaction_amount_fee": "Потвърдете транзакцията\nСума: ${amount}\nТакса: ${fee}",
223 + "compatible_networks": "Съвместими мрежи",
224 "compatible_services": "Съвместими услуги",
225 "compatible_services_desc": "Използвайте инструмента за сканиране, за да четете следните типове QR кодове, поддържани в Cake Wallet:",
226 "configure": "Конфигуриране",
@@ -258,6 +260,7 @@
260 "contact_support": "Свържете се с поддръжката",
261 "contacts": "Контакти",
262 "continue_text": "Продължи",
263 + "continue_to_swap": "Продължете към размяната",
264 "contract_address": "Адрес на договора",
265 "contract_warning": "Този адрес на смарт договора е маркиран като потенциално измамен. Моля, продължете с повишено внимание.",
266 "contractName": "Име на контракта",
@@ -286,6 +289,7 @@
289 "creation_date": "Дата на създаване",
290 "crypto_addresses": "Крипто адреси",
291 "csv_nothing_to_export": "Няма какво да се експортира",
292 + "current_network": "Текуща мрежа",
293 "current_swap": "Текущ суап",
294 "current_wallet": "Текущ портфейл",
295 "custom": "По избор",
@@ -443,6 +447,7 @@
447 "etherscan_history": "История в Etherscan",
448 "event": "Събитие",
449 "events": "Събития",
450 + "evm_address_detected": "Открит е EVM адрес",
451 "evm_ecosystem_description": "Ако е необходимо, променете мрежата и токена, които искате да използвате за това плащане.",
452 "exchange": "Обмен",
453 "exchange_extra_info": "Моля, не забравяйте да посочите Memo или Extra ID при изпращане на тази транзакция за обмен",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Всички най-нови модели (GPT-5.3, Claude 4.6).\\nБез абонамент, плащайте с крипто.",
670 "narrow": "Тесен",
671 "network": "Мрежа",
672 + "network_address_detected": "Открит адрес на ${network}",
673 + "network_prefix_on": "на",
674 + "network_switch_failed": "Неуспешно превключване към заявената мрежа. Плащането не е приложено, моля опитайте отново.",
675 "networks": "Мрежи",
676 "new_first_wallet_text": "Да пазите криптовалутата си в безопасност е лесно като парче торта",
677 "new_node_testing": "Тестване на нов възел",
@@ -971,6 +979,7 @@
979 "select_asset": "Изберете Актив",
980 "select_backup_file": "Изберете файл с резервно копие",
981 "select_buy_provider_notice": "Изберете доставчик за покупка по‑горе. Можете да пропуснете този екран, като зададете доставчик за покупка по подразбиране в настройките на приложението.",
982 + "select_compatible_wallet": "Изберете един от вашите съвместими портфейли",
983 "select_destination": "Моля, изберете местоположение за файла с резервно копие.",
984 "select_fiat_currency_title": "Изберете Валута",
985 "select_hw_account_below": "Моля, изберете кой акаунт да възстановите по-долу:",
@@ -980,6 +989,9 @@
989 "select_network_title": "Изберете Мрежа",
990 "select_other_wallet": "Изберете друг портфейл",
991 "select_receiver": "Изберете получател",
992 + "select_recipient_network": "Изберете мрежа на получател",
993 + "select_recipient_network_description": "Множество мрежи са съвместими с предоставения адрес на получател",
994 + "select_recipient_network_for_tx": "Изберете мрежата на получателя на тази транзакция",
995 "select_sell_provider_notice": "Изберете доставчик за продажба по-горе. Можете да пропуснете този екран, като зададете доставчик за продажба по подразбиране в настройките на приложението.",
996 "select_token": "Изберете токен",
997 "select_your_country": "Моля, изберете държавата си",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "Шаблони",
1025 "send_title": "Изпрати",
1026 "send_to": "Изпрати до",
1027 + "send_to_network": "Изпрати до ${network}",
1028 + "send_to_network_description": "Искате ли да преминете към своя портфейл ${network} или да размените средствата си в ${currentNetwork} за това плащане?",
1029 "send_to_this_address": "Изпратете ${currency} ${tag}на този адрес",
1030 "send_xmr": "Изпрати XMR",
1031 "send_your_wallet": "Вашият портфейл",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "Други връзки за поддръжка",
1145 "supported": "Поддържано",
1146 "swap": "Суап",
1147 + "swap_from_network": "Размяна от ${network}",
1148 + "swap_from_network_description": "За да изпратите средства към мрежата ${targetNetwork}, ще трябва да размените своите средства в ${currentNetwork}. Искате ли да продължите?",
1149 "swap_id": "ID на суап",
1150 "swap_provider_initial_desc": "Изберете типа доставчик за суап, който предпочитате да използвате при суапване в",
1151 "swap_providers": "Доставчици за суап",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "Това не би трябвало да отнеме много време. НЕ НАПУСКАЙТЕ ТОЗИ ЕКРАН, ИНАЧЕ ИЗМЕТЕНИТЕ СРЕДСТВА МОГАТ ДА БЪДАТ ЗАГУБЕНИ.",
1154 "swipe_to_bridge": "Плъзнете, за да прехвърлите",
1155 "swipe_to_send": "Плъзнете, за да изпратите",
1156 + "switch_to_x_wallet": "Преминете към ${network} Wallet",
1157 "switch_wallet": "Превключване на портфейл",
1158 "switchToETHWallet": "Моля, превключете към портфейл за Ethereum и опитайте отново",
1159 "switchToWCCompatibleWallet": "Моля, превключете към портфейл, съвместим с WalletConnect, и опитайте отново (${chains}).",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "Подробности за неизразходваните монети",
1321 "unspent_coins_title": "Неизразходвани монети",
1322 "unsupported_asset": "Не поддържаме това действие за този актив. Моля, създайте или превключете към портфейл с поддържан тип актив.",
1323 + "unsupported_network_requested": "Тази заявка за плащане е за мрежа, която не поддържаме (идентификатор на верига ${chainId}).",
1324 + "unsupported_token_requested": "Тази заявка за плащане е за токен, който не можахме да идентифицираме в избраната мрежа.",
1325 "uptime": "Време на работа",
1326 "upto": "до ${value}",
1327 "usb": "USB",
@@ -1450,39 +1469,5 @@
1469 "zcash_card_enable_later": "Винаги можете да активирате тази карта по-късно в настройките",
1470 "zcash_card_missing_funds": "Липсват средства?",
1471 "zcash_card_scan": "Сканирай",
1453 - "zcash_card_warning": "Не затваряйте приложението, докато процедурата не приключи. Ако го направите, процесът ще трябва да започне отначало.",
1454 - "are_you_sure_exit": "Сигурни ли сте, че искате да излезете?",
1455 - "available": "Налично",
1456 - "bridging": "Прехвърляне",
1457 - "compatible_services": "Съвместими услуги",
1458 - "compatible_services_desc": "Използвайте инструмента за сканиране, за да четете следните типове QR кодове, поддържани в Cake Wallet:",
1459 - "crypto_addresses": "Крипто адреси",
1460 - "delete_this_node": "Изтриване на този възел",
1461 - "device_confirmation": "Потвърждение от устройството",
1462 - "favorite_token": "Любим токен",
1463 - "favorite_token_desc": "Балансът на любимия токен ще се показва на картата с баланса.",
1464 - "gallery": "Галерия",
1465 - "hww_exit_desc": "Това ще прекрати текущия процес на сдвояване с вашето хардуерно устройство",
1466 - "input": "Вход",
1467 - "manual_input": "Ръчно въвеждане",
1468 - "networks": "Мрежи",
1469 - "node_share_desc": "Сканирайте този QR код от екрана за сканиране, за да импортирате този възел.",
1470 - "nodes_desc": "Управлявайте съществуващите възли или добавете персонализиран.",
1471 - "ocp_desc": "Плащайте с крипто в магазини",
1472 - "pairing_code": "Код за сдвояване",
1473 - "pairing_code_desc_1": "Вашето устройство ще покаже код за сдвояване.",
1474 - "pairing_code_desc_2": "Въведете го тук, за да продължите",
1475 - "pairing_error": "Грешка при сдвояване",
1476 - "passphrase_view_keys": "Парола за достъп",
1477 - "payment_invoices": "Фактури за плащане",
1478 - "save_contact": "Запазване на контакт",
1479 - "share_this_node": "Споделяне на този възел",
1480 - "show_combined_balance": "Показване на общия баланс",
1481 - "swipe_to_bridge": "Плъзнете, за да прехвърлите",
1482 - "this_can_take_few_seconds": "Това може да отнеме няколко секунди",
1483 - "username_check_your_network": "Неуспешна проверка на потребителското име. Моля, проверете мрежовата си връзка.",
1484 - "verifying_code": "Проверка на кода",
1485 - "wallet_balance": "Баланс на портфейла",
1486 - "wc_desc": "Свържете се лесно с dApps",
1487 - "yes_exit": "Да. Изход"
1488 -}
1472 + "zcash_card_warning": "Не затваряйте приложението, докато процедурата не приключи. Ако го направите, процесът ще трябва да започне отначало."
1473 +}
\ No newline at end of file
res/values/strings_cs.arb
+21 -36
@@ -94,6 +94,7 @@
94 "available_balance": "Dostupný zůstatek",
95 "available_balance_description": "„Dostupný zůstatek“ nebo „Potvrzený zůstatek“ jsou prostředky, které lze okamžitě utratit. Pokud se prostředky zobrazují ve spodním zůstatku, ale ne v horním, musíte několik minut počkat, než příchozí prostředky získají více síťových potvrzení. Jakmile získají více potvrzení, bude možné je utratit.",
96 "avg_savings": "Prům. úspora",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Počkejte prosím, až dApp dokončí zpracování.",
99 "awaiting_payment_confirmation": "Čeká se na potvrzení platby",
100 "background_sync": "Synchronizace na pozadí",
@@ -219,6 +220,7 @@
220 "color_theme": "Barevné téma",
221 "coming_soon_tag": "Již brzy",
222 "commit_transaction_amount_fee": "Potvrdit transakci\nČástka: ${amount}\nPoplatek: ${fee}",
223 + "compatible_networks": "Kompatibilní sítě",
224 "compatible_services": "Kompatibilní služby",
225 "compatible_services_desc": "Pomocí nástroje pro skenování načtěte následující typy QR kódů podporované v Cake Wallet:",
226 "configure": "Konfigurovat",
@@ -258,6 +260,7 @@
260 "contact_support": "Kontaktovat podporu",
261 "contacts": "Kontakty",
262 "continue_text": "Pokračovat",
263 + "continue_to_swap": "Pokračujte na Swap",
264 "contract_address": "Adresa kontraktu",
265 "contract_warning": "Tato adresa kontraktu byla označena jako potenciálně podvodná. Postupujte prosím opatrně.",
266 "contractName": "Název kontraktu",
@@ -286,6 +289,7 @@
289 "creation_date": "Datum vytvoření",
290 "crypto_addresses": "Krypto adresy",
291 "csv_nothing_to_export": "Není co exportovat",
292 + "current_network": "Aktuální síť",
293 "current_swap": "Aktuální swap",
294 "current_wallet": "Aktuální peněženka",
295 "custom": "Vlastní",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Historie Etherscanu",
448 "event": "Událost",
449 "events": "Události",
450 + "evm_address_detected": "Zjištěna adresa EVM",
451 "evm_ecosystem_description": "V případě potřeby upravte síť a token, které chcete pro tuto platbu použít.",
452 "exchange": "Směnárna",
453 "exchange_extra_info": "Při odesílání této transakce pro směnu prosím nezapomeňte zadat Memo nebo Extra ID",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Všechny nejnovější modely (GPT-5.3, Claude 4.6).\nBez předplatného, plaťte kryptem.",
670 "narrow": "Úzké",
671 "network": "Síť",
672 + "network_address_detected": "Zjištěna adresa ${network}",
673 + "network_prefix_on": "na",
674 + "network_switch_failed": "Přepnutí na požadovanou síť se nezdařilo. Platba nebyla připsána, zkuste to prosím znovu.",
675 "networks": "Sítě",
676 "new_first_wallet_text": "Udržet vaše krypto v bezpečí je hračka",
677 "new_node_testing": "Testování nového uzlu",
@@ -971,6 +979,7 @@
979 "select_asset": "Vyberte aktivum",
980 "select_backup_file": "Vybrat záložní soubor",
981 "select_buy_provider_notice": "Vyberte výše poskytovatele pro nákup. Tuto obrazovku můžete přeskočit nastavením výchozího poskytovatele pro nákup v nastavení aplikace.",
982 + "select_compatible_wallet": "Vyberte jednu z kompatibilních peněženek",
983 "select_destination": "Vyberte prosím umístění pro soubor zálohy.",
984 "select_fiat_currency_title": "Vyberte měnu",
985 "select_hw_account_below": "Vyberte prosím níže účet, který chcete obnovit:",
@@ -980,6 +989,9 @@
989 "select_network_title": "Vyberte síť",
990 "select_other_wallet": "Vyberte jinou peněženku",
991 "select_receiver": "Vyberte příjemce",
992 + "select_recipient_network": "Vyberte Síť příjemce",
993 + "select_recipient_network_description": "Se zadanou adresou příjemce je kompatibilních více sítí",
994 + "select_recipient_network_for_tx": "Vyberte síť příjemce této transakce",
995 "select_sell_provider_notice": "Vyberte výše poskytovatele prodeje. Tuto obrazovku můžete přeskočit nastavením výchozího poskytovatele prodeje v nastavení aplikace.",
996 "select_token": "Vyberte token",
997 "select_your_country": "Vyberte prosím svou zemi",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "Šablony",
1025 "send_title": "Odeslat",
1026 "send_to": "Odeslat na",
1027 + "send_to_network": "Odeslat do ${network}",
1028 + "send_to_network_description": "Chcete přejít na svou peněženku ${network} nebo vyměnit své prostředky ${currentNetwork} za tuto platbu?",
1029 "send_to_this_address": "Odeslat ${currency} ${tag}na tuto adresu",
1030 "send_xmr": "Odeslat XMR",
1031 "send_your_wallet": "Vaše peněženka",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "Další odkazy na podporu",
1145 "supported": "Podporováno",
1146 "swap": "Směnit",
1147 + "swap_from_network": "Swap z ${network}",
1148 + "swap_from_network_description": "Chcete-li poslat prostředky do sítě ${targetNetwork}, budete muset své prostředky ${currentNetwork} vyměnit. Chcete pokračovat?",
1149 "swap_id": "ID směny",
1150 "swap_provider_initial_desc": "Vyberte typ poskytovatele swapu, kterého chcete používat při swapování v",
1151 "swap_providers": "Poskytovatelé swapu",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "To by nemělo trvat dlouho. NEOPUŠTĚJTE TUTO OBRAZOVKU, JINAK MOHOU BÝT PŘESUNUTÉ PROSTŘEDKY ZTRACENY.",
1154 "swipe_to_bridge": "Přemostění přejetím prstem",
1155 "swipe_to_send": "Přejeďte pro odeslání",
1156 + "switch_to_x_wallet": "Přepněte na peněženku ${network}",
1157 "switch_wallet": "Přepnout peněženku",
1158 "switchToETHWallet": "Přepněte na peněženku Ethereum a zkuste to znovu",
1159 "switchToWCCompatibleWallet": "Přepněte prosím na peněženku kompatibilní s WalletConnect a zkuste to znovu (${chains}).",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "Podrobnosti o neutracených mincích",
1321 "unspent_coins_title": "Neutratné mince",
1322 "unsupported_asset": "Tuto akci pro toto aktivum nepodporujeme. Vytvořte nebo přepněte na peněženku podporovaného typu aktiva.",
1323 + "unsupported_network_requested": "Tento požadavek na platbu je pro síť, kterou nepodporujeme (ID řetězce ${chainId}).",
1324 + "unsupported_token_requested": "Tato žádost o platbu se týká tokenu, který jsme ve vybrané síti nedokázali identifikovat.",
1325 "uptime": "Doba provozu",
1326 "upto": "až do ${value}",
1327 "usb": "USB",
@@ -1450,39 +1469,5 @@
1469 "zcash_card_enable_later": "Tuto kartu můžete kdykoli později povolit v nastavení",
1470 "zcash_card_missing_funds": "Chybějící prostředky?",
1471 "zcash_card_scan": "Skenovat",
1453 - "zcash_card_warning": "Nezavírejte aplikaci, dokud se postup nedokončí. Pokud tak učiníte, bude nutné tento proces spustit znovu od začátku.",
1454 - "are_you_sure_exit": "Opravdu chcete ukončit aplikaci?",
1455 - "available": "Dostupné",
1456 - "bridging": "Přemostění",
1457 - "compatible_services": "Kompatibilní služby",
1458 - "compatible_services_desc": "Pomocí nástroje pro skenování načtěte následující typy QR kódů podporované v Cake Wallet:",
1459 - "crypto_addresses": "Krypto adresy",
1460 - "delete_this_node": "Smazat tento uzel",
1461 - "device_confirmation": "Potvrzení na zařízení",
1462 - "favorite_token": "Oblíbený token",
1463 - "favorite_token_desc": "Zůstatek oblíbeného tokenu se zobrazí na kartě zůstatku.",
1464 - "gallery": "Galerie",
1465 - "hww_exit_desc": "Tímto ukončíte probíhající proces párování s vaším hardwarovým zařízením",
1466 - "input": "Vstup",
1467 - "manual_input": "Ruční zadání",
1468 - "networks": "Sítě",
1469 - "node_share_desc": "Naskenováním tohoto QR kódu na obrazovce skenování tento uzel importujete.",
1470 - "nodes_desc": "Spravujte stávající uzly nebo přidejte vlastní.",
1471 - "ocp_desc": "Plaťte kryptem v obchodech",
1472 - "pairing_code": "Párovací kód",
1473 - "pairing_code_desc_1": "Vaše zařízení zobrazí párovací kód.",
1474 - "pairing_code_desc_2": "Zadejte ho zde a pokračujte",
1475 - "pairing_error": "Chyba párování",
1476 - "passphrase_view_keys": "Přístupová fráze",
1477 - "payment_invoices": "Platební faktury",
1478 - "save_contact": "Uložit kontakt",
1479 - "share_this_node": "Sdílet tento uzel",
1480 - "show_combined_balance": "Zobrazit souhrnný zůstatek",
1481 - "swipe_to_bridge": "Přemostění přejetím prstem",
1482 - "this_can_take_few_seconds": "Může to trvat několik sekund",
1483 - "username_check_your_network": "Nelze ověřit uživatelské jméno. Zkontrolujte prosím připojení k síti.",
1484 - "verifying_code": "Ověřování kódu",
1485 - "wallet_balance": "Zůstatek peněženky",
1486 - "wc_desc": "Snadno se připojte k dApps",
1487 - "yes_exit": "Ano. Ukončit"
1488 -}
1472 + "zcash_card_warning": "Nezavírejte aplikaci, dokud se postup nedokončí. Pokud tak učiníte, bude nutné tento proces spustit znovu od začátku."
1473 +}
\ No newline at end of file
res/values/strings_de.arb
+42 -20
@@ -97,6 +97,7 @@
97 "available_balance": "Verfügbares Guthaben",
98 "available_balance_description": "Der „Verfügbare Kontostand“ bzw. „Bestätigter Kontostand“ sind Guthaben, die sofort ausgegeben werden können. Wenn Guthaben im unteren Kontostand angezeigt wird, aber nicht im oberen, müssen Sie ein paar Minuten warten, bis die eingehenden Gelder weitere Netzwerkbestätigungen erhalten. Sobald sie mehr Bestätigungen haben, können sie ausgegeben werden.",
99 "avg_savings": "Durchschn. Ersparnis",
100 + "avl": "Avl",
101 "awaitDAppProcessing": "Bitte warten Sie, bis die dApp die Verarbeitung abgeschlossen hat.",
102 "awaiting_payment_confirmation": "Warten auf Zahlungsbestätigung",
103 "background_sync": "Hintergrund-Synchronisierung",
@@ -223,6 +224,7 @@
224 "color_theme": "Farbschema",
225 "coming_soon_tag": "Demnächst verfügbar",
226 "commit_transaction_amount_fee": "Transaktion bestätigen\nBetrag: ${amount}\nGebühr: ${fee}",
227 + "compatible_networks": "Kompatible Netzwerke",
228 "compatible_services": "Kompatible Dienste",
229 "compatible_services_desc": "Verwenden Sie das Scan-Tool, um die folgenden von Cake Wallet unterstützten QR-Code-Typen zu lesen:",
230 "configure": "Konfigurieren",
@@ -262,6 +264,7 @@
264 "contact_support": "Support kontaktieren",
265 "contacts": "Kontakte",
266 "continue_text": "Weiter",
267 + "continue_to_swap": "Weiter tauschen",
268 "contract_address": "Vertragsadresse",
269 "contract_warning": "Diese Vertragsadresse wurde als potenziell betrügerisch gekennzeichnet. Bitte gehen Sie mit Vorsicht vor.",
270 "contractName": "Vertragsname",
@@ -290,6 +293,7 @@
293 "creation_date": "Erstellungsdatum",
294 "crypto_addresses": "Krypto-Adressen",
295 "csv_nothing_to_export": "Nichts zum Exportieren",
296 + "current_network": "Aktuelles Netzwerk",
297 "current_swap": "Aktueller Swap",
298 "current_wallet": "Aktuelle Wallet",
299 "custom": "Benutzerdefiniert",
@@ -378,6 +382,7 @@
382 "donation_link_details": "Details zum Spendenlink",
383 "done": "Fertig",
384 "duress_pin_description": "Dadurch wird eine Notfall-PIN eingerichtet, eine erweiterte Funktion, die von den meisten Nutzern nicht verwendet werden sollte. Diese PIN sollte nur verwendet werden, wenn Sie in Gefahr sind. Nachdem Sie diese PIN verwendet haben, werden alle Ihre Wallets gelöscht. Stellen Sie daher bitte sicher, dass alle Ihre Seeds gesichert sind, bevor Sie sie verwenden.",
385 + "duress_PIN_set_up_successfully": "Die Notfall-PIN wurde erfolgreich eingerichtet",
386 "durres_PIN": "Notfall-PIN",
387 "durres_PIN_set_up_successfully": "Die Notfall-PIN wurde erfolgreich eingerichtet",
388 "e_sign_consent": "Einwilligung zur E-Signatur",
@@ -448,6 +453,7 @@
453 "etherscan_history": "Etherscan-Verlauf",
454 "event": "Ereignis",
455 "events": "Ereignisse",
456 + "evm_address_detected": "EVM-Adresse erkannt",
457 "evm_ecosystem_description": "Ändern Sie bei Bedarf das Netzwerk und den Token, den Sie für diese Zahlung verwenden möchten.",
458 "exchange": "Swap",
459 "exchange_extra_info": "Bitte vergessen Sie nicht, beim Senden dieser Transaktion für den Swap das Memo oder die Extra-ID anzugeben.",
@@ -528,6 +534,7 @@
534 "got_it": "Alles klar",
535 "gross_balance": "Bruttosaldo",
536 "group_by_type": "Nach Typ gruppieren",
537 + "hardware_wallet": "Hardware-Wallet",
538 "haven_app": "Haven von Cake Wallet",
539 "haven_app_wallet_text": "Eine großartige Wallet für Haven",
540 "help": "Hilfe",
@@ -543,11 +550,13 @@
550 "how_to_connect": "So verbinden Sie sich",
551 "how_to_use": "So verwenden Sie",
552 "how_to_use_card": "So verwenden Sie diese Karte",
546 - "hww_exit_desc": "Dadurch wird der laufende Kopplungsvorgang mit Ihrer Hardware-Wallet beendet.",
553 + "hww_exit_desc": "Dadurch wird der laufende Kopplungsvorgang mit Ihrem Hardware-Gerät beendet",
554 "i_understand": "Ich verstehe",
555 "icon_style": "Symbolstil",
556 "id": "ID: ",
550 - "if_you_dont_see_your_device": "Wenn Sie Ihr Gerät oben nicht sehen, stellen Sie bitte sicher, dass Ihr Gerät eingeschaltet und entsperrt ist!",
557 + "if_you_dont_see_your_device": "Wenn Sie Ihr Gerät oben nicht sehen, stellen Sie bitte sicher, dass Ihr Ledger eingeschaltet und entsperrt ist!",
558 + "ignor": "Ignorieren",
559 + "ignore": "Ignorieren",
560 "import": "Importieren",
561 "importNFTs": "NFTs importieren",
562 "in_store": "Im Geschäft",
@@ -555,6 +564,7 @@
564 "incorrect_seed": "Der eingegebene Text ist ungültig.",
565 "incorrect_seed_option": "Falsch. Bitte versuchen Sie es erneut",
566 "incorrect_seed_option_back": "Falsch. Bitte stellen Sie sicher, dass Ihr Seed korrekt gespeichert ist, und versuchen Sie es erneut.",
567 + "info": "Info",
568 "infobox_auto_address": "Ihre Empfangsadresse wird jedes Mal gewechselt, wenn Sie eine Transaktion erhalten",
569 "infobox_multichain": "Mit dieser Adresse können Sie beliebige Token oder Sammlerstücke im folgenden Netzwerk empfangen:",
570 "infobox_rotation": "Ihre Empfangsadresse wird jedes Mal rotiert, wenn Sie diesen Bildschirm schließen und erneut öffnen",
@@ -569,6 +579,7 @@
579 "invalid_input": "Ungültige Eingabe",
580 "invalid_password": "Ungültiges Passwort",
581 "invoice_details": "Rechnungsdetails",
582 + "is_currently_being_migrated": "wird derzeit migriert",
583 "is_percentage": "ist",
584 "keys": "Schlüssel",
585 "label": "Etikett",
@@ -587,6 +598,7 @@
598 "lightning_deposit_desc": "Wenn Sie auf Lightning einzahlen, tauschen Sie Ihre On-Chain-Bitcoins aus dieser Wallet in Ihr Lightning-Konto.",
599 "lightning_deposit_disclaimer": "Das neue Lightning-Guthaben ist erst verfügbar, wenn die Bitcoin-Transaktion vollständig bestätigt ist.",
600 "lightning_external_disclaimer": "Schließen Sie diese Seite erst, nachdem Sie das Guthaben gesendet haben. Andernfalls wird die Einzahlung nicht fortgesetzt.",
601 + "lightning_mode": "Lightning-Modus",
602 "lightning_username_desc": "Empfangen Sie Lightning-Zahlungen ganz einfach mit einem Lightning-Benutzernamen, indem Sie unten einen benutzerdefinierten Namen wählen oder einen zufällig generierten verwenden.",
603 "lightning_username_desc_completed": "Mit diesem Benutzernamen können Sie Zahlungen von jeder Lightning-Wallet empfangen.",
604 "lightning_username_setup_later": "Wenn Sie es jetzt überspringen, können Sie dies später in den Einstellungen einrichten.",
@@ -617,7 +629,9 @@
629 "login": "Anmelden",
630 "logout": "Abmelden",
631 "long_press_edit_address": "Lange drücken, um die Adresse zu bearbeiten",
632 + "long_press_hide_balance": "Halten Sie die Karte gedrückt, um das Guthaben auszublenden",
633 "long_press_show_balance": "Drücken Sie lange auf die Karte, um den Kontostand anzuzeigen",
634 + "long_press_to_copy": "Zum Kopieren gedrückt halten",
635 "low_fee": "Niedrige Gebühr",
636 "low_fee_alert": "Sie verwenden derzeit eine niedrige Priorität für Netzwerkgebühren. Dies kann zu langen Wartezeiten, abweichenden Kursen oder abgebrochenen Trades führen. Wir empfehlen, für ein besseres Erlebnis eine höhere Gebühr festzulegen.",
637 "made_easy": "leicht gemacht",
@@ -642,6 +656,7 @@
656 "messages": "Nachrichten",
657 "method": "Methode",
658 "methods": "Methoden",
659 + "migrating_to_ironwood": "Migration zu Ironwood läuft",
660 "min_amount": "Min.: ${value}",
661 "min_value": "Min.: ${value} ${currency}",
662 "mining": "Mining",
@@ -671,6 +686,9 @@
686 "nanogpt_subtitle": "Alle neuesten Modelle (GPT-5.3, Claude 4.6).\nKein Abonnement – bezahlen Sie mit Krypto.",
687 "narrow": "Schmal",
688 "network": "Netzwerk",
689 + "network_address_detected": "${network}-Adresse erkannt",
690 + "network_prefix_on": "An",
691 + "network_switch_failed": "Der Wechsel zum angeforderten Netzwerk ist fehlgeschlagen. Die Zahlung wurde nicht angewendet. Bitte versuchen Sie es erneut.",
692 "networks": "Netzwerke",
693 "new_first_wallet_text": "Ihre Kryptowährungen sicher aufzubewahren ist ein Kinderspiel",
694 "new_node_testing": "Testen des neuen Nodes",
@@ -725,6 +743,8 @@
743 "onramper_option_description": "Kaufen Sie schnell Kryptowährungen mit vielen Zahlungsmethoden. In den meisten Ländern verfügbar. Spreads und Gebühren variieren.",
744 "open_gift_card": "Geschenkkarte öffnen",
745 "open_wallet": "Wallet öffnen",
746 + "opens_externally": "Wird extern geöffnet",
747 + "opens_in_browser": "Wird im Browser geöffnet",
748 "optional_description": "Optionale Beschreibung",
749 "optional_email_hint": "Optionale E-Mail-Adresse für Benachrichtigungen an den Zahlungsempfänger",
750 "optional_name": "Optionaler Name des Empfängers",
@@ -747,8 +767,8 @@
767 "pairing_error": "Kopplungsfehler",
768 "pairingInvalidEvent": "Ungültiges Pairing-Ereignis",
769 "passphrase": "Passphrase (Optional)",
750 - "passphrase_raw": "Passphrase",
770 "passphrase_entry": "Passphrase-Eingabe",
771 + "passphrase_raw": "Passphrase",
772 "passphrase_view_keys": "Passphrase",
773 "passphrases_doesnt_match": "Passphrasen stimmen nicht überein, bitte versuchen Sie es erneut",
774 "password": "Passwort",
@@ -796,6 +816,7 @@
816 "please_fill_totp": "Bitte geben Sie den 8-stelligen Code ein, der auf Ihrem anderen Gerät angezeigt wird",
817 "please_make_selection": "Bitte treffen Sie unten eine Auswahl, um Ihre Wallet zu erstellen oder wiederherzustellen.",
818 "please_reference_document": "Bitte beachten Sie die untenstehenden Dokumente für weitere Informationen.",
819 + "Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.",
820 "please_select": "Bitte auswählen:",
821 "please_select_backup_file": "Bitte wählen Sie eine Sicherungsdatei aus und geben Sie das Sicherungskennwort ein.",
822 "please_try_to_connect_to_another_node": "Bitte versuchen Sie, eine Verbindung zu einem anderen Node herzustellen",
@@ -836,6 +857,7 @@
857 "qr_code_format_note": "Verschiedene QR-Code-Formate werden von unterschiedlichen Hardware-Wallets im Bitcoin-Bereich verwendet",
858 "qr_fullscreen": "Tippen Sie, um den QR-Code im Vollbildmodus zu öffnen",
859 "qr_instruction": "Verwenden Sie diese Adresse, um ein beliebiges Token oder Sammlerstück zu empfangen auf",
860 + "qr_parts_scanned": "QR-Code-Teile gescannt: ${scanned} von ${total}",
861 "qr_payment_amount": "Dieser QR-Code enthält einen Zahlungsbetrag. Möchten Sie den aktuellen Wert überschreiben?",
862 "quantity": "Menge",
863 "question_to_disable_2fa": "Sind Sie sicher, dass Sie Cake 2FA deaktivieren möchten? Ein 2FA-Code wird nicht mehr benötigt, um auf die Wallet und bestimmte Funktionen zuzugreifen.",
@@ -847,6 +869,7 @@
869 "receiving": "Empfangen",
870 "recieving": "Empfangen",
871 "recipient_address": "Empfängeradresse",
872 + "recipient_number": "Empfänger ${number}",
873 "reconnect": "Erneut verbinden",
874 "reconnect_alert_text": "Sind Sie sicher, dass Sie die Verbindung erneut herstellen möchten?",
875 "reconnect_your_hardware_wallet": "Hardware-Wallet erneut verbinden",
@@ -915,8 +938,8 @@
938 "restore_wallet_name": "Wallet-Name",
939 "restore_wallet_restore_description": "Beschreibung der Wallet-Wiederherstellung",
940 "resync_device": "Gerät erneut synchronisieren",
918 - "resync_device_desc": "Cake Wallet muss gelegentlich erneut mit dem Gerät synchronisiert werden, damit das Guthaben aktuell bleibt.",
941 "resync_device_cancel_warning_desc": "Dadurch wird die laufende Synchronisierung mit Ihrer Hardware-Wallet beendet.",
942 + "resync_device_desc": "Cake Wallet muss gelegentlich erneut mit dem Gerät synchronisiert werden, damit das Guthaben aktuell bleibt.",
943 "return_address_desc": "Im seltenen Fall eines fehlgeschlagenen Swaps können unsere Partner Ihre Zahlung automatisch an die angegebene Rückerstattungsadresse erstatten.",
944 "return_address_desc_external": "Da Sie „Von extern senden“ ausgewählt haben, legen Sie bitte unten manuell eine Erstattungsadresse fest.",
945 "robinhood_option_description": "Kaufen und übertragen Sie sofort mit Ihrer Debitkarte, Ihrem Bankkonto oder Ihrem Robinhood-Guthaben. Nur USA.",
@@ -986,6 +1009,7 @@
1009 "select_asset": "Wählen Sie Asset aus",
1010 "select_backup_file": "Backup-Datei auswählen",
1011 "select_buy_provider_notice": "Wählen Sie oben einen Kaufanbieter aus. Sie können diesen Bildschirm überspringen, indem Sie Ihren Standard-Kaufanbieter in den App-Einstellungen festlegen.",
1012 + "select_compatible_wallet": "Wählen Sie eine Ihrer kompatiblen Geldbörsen aus",
1013 "select_destination": "Bitte wählen Sie das Ziel für die Backup-Datei aus.",
1014 "select_fiat_currency_title": "Wählen Sie Währung aus",
1015 "select_hw_account_below": "Bitte wählen Sie unten aus, welches Konto wiederhergestellt werden soll:",
@@ -995,6 +1019,9 @@
1019 "select_network_title": "Wählen Sie Netzwerk",
1020 "select_other_wallet": "Anderes Wallet auswählen",
1021 "select_receiver": "Empfänger auswählen",
1022 + "select_recipient_network": "Wählen Sie Empfängernetzwerk aus",
1023 + "select_recipient_network_description": "Mehrere Netzwerke sind mit der angegebenen Empfängeradresse kompatibel",
1024 + "select_recipient_network_for_tx": "Wählen Sie das Netzwerk des Empfängers dieser Transaktion aus",
1025 "select_sell_provider_notice": "Wählen Sie oben einen Verkaufsanbieter aus. Sie können diesen Bildschirm überspringen, indem Sie in den App-Einstellungen Ihren Standard-Verkaufsanbieter festlegen.",
1026 "select_token": "Token auswählen",
1027 "select_your_country": "Bitte wählen Sie Ihr Land aus",
@@ -1027,6 +1054,8 @@
1054 "send_templates": "Vorlagen",
1055 "send_title": "Senden",
1056 "send_to": "Senden an",
1057 + "send_to_network": "An ${network} senden",
1058 + "send_to_network_description": "Möchten Sie zu Ihrem ${network}-Wallet wechseln oder Ihr ${currentNetwork}-Guthaben für diese Zahlung eintauschen?",
1059 "send_to_this_address": "Senden Sie ${currency} ${tag} an diese Adresse",
1060 "send_xmr": "XMR senden",
1061 "send_your_wallet": "Ihre Wallet",
@@ -1087,6 +1116,7 @@
1116 "show_balance_toast": "Lange drücken, um den Kontostand auszublenden oder anzuzeigen",
1117 "show_combined_balance": "Kombinierten Kontostand anzeigen",
1118 "show_details": "Details anzeigen",
1119 + "show_full_address": "Vollständige Adresse anzeigen",
1120 "show_hidden_addresses": "Versteckte Adressen anzeigen",
1121 "show_keys": "Seed/Schlüssel anzeigen",
1122 "show_market_place": "Marktplatz anzeigen",
@@ -1129,6 +1159,7 @@
1159 "sort_by": "Sortieren nach",
1160 "spend_key_private": "Spend-Key (privat)",
1161 "spend_key_public": "Spend-Key (öffentlich)",
1162 + "standard": "Standard",
1163 "starting_tor_proxy": "Tor-Proxy wird gestartet",
1164 "status": "Status: ",
1165 "step": "Schritt",
@@ -1146,6 +1177,8 @@
1177 "support_title_other_links": "Weitere Support-Links",
1178 "supported": "Unterstützt",
1179 "swap": "Swap",
1180 + "swap_from_network": "Von ${network} tauschen",
1181 + "swap_from_network_description": "Um Gelder an das ${targetNetwork}-Netzwerk zu senden, müssen Sie Ihre ${currentNetwork}-Gelder austauschen. Möchten Sie fortfahren?",
1182 "swap_id": "Swap-ID",
1183 "swap_provider_initial_desc": "Wählen Sie die Art des Swap-Anbieters aus, die Sie beim Tauschen bevorzugen.",
1184 "swap_providers": "Swap-Anbieter",
@@ -1156,6 +1189,7 @@
1189 "swipe_to_send": "Zum Senden wischen",
1190 "switch_camera": "Kamera wechseln",
1191 "switch_input_currency": "Zwischen Krypto- und Fiat-Eingabe wechseln",
1192 + "switch_to_x_wallet": "Wechseln Sie zum ${network} Wallet",
1193 "switch_wallet": "Wallet wechseln",
1194 "switchToETHWallet": "Bitte wechseln Sie zu einer Ethereum-Wallet und versuchen Sie es erneut",
1195 "switchToWCCompatibleWallet": "Bitte wechseln Sie zu einer WalletConnect-kompatiblen Wallet und versuchen Sie es erneut (${chains}).",
@@ -1206,6 +1240,7 @@
1240 "to_lightning": "zu Lightning",
1241 "to_on_chain": "zu On-Chain",
1242 "today": "Heute",
1243 + "token": "Token",
1244 "token_already_exists": "Token ist bereits vorhanden",
1245 "token_decimal": "Token-Dezimalstelle (z. B.: USDT)",
1246 "token_name": "Token-Name (z. B.: Tether)",
@@ -1327,6 +1362,8 @@
1362 "unspent_coins_details_title": "Details zu nicht ausgegebenen Coins",
1363 "unspent_coins_title": "Nicht ausgegebene Coins",
1364 "unsupported_asset": "Wir unterstützen diese Aktion für dieses Asset nicht. Bitte erstellen Sie eine Wallet mit einem unterstützten Asset-Typ oder wechseln Sie zu einer Wallet mit einem unterstützten Asset-Typ.",
1365 + "unsupported_network_requested": "Diese Zahlungsanforderung bezieht sich auf ein Netzwerk, das wir nicht unterstützen (Ketten-ID ${chainId}).",
1366 + "unsupported_token_requested": "Diese Zahlungsanforderung bezieht sich auf einen Token, den wir im ausgewählten Netzwerk nicht identifizieren konnten.",
1367 "uptime": "Betriebszeit",
1368 "upto": "bis zu ${value}",
1369 "usb": "USB",
@@ -1475,23 +1512,8 @@
1512 "zcash_card_missing_funds": "Fehlendes Guthaben?",
1513 "zcash_card_scan": "Scannen",
1514 "zcash_card_warning": "Schließen Sie die App nicht, bis der Vorgang abgeschlossen ist. Andernfalls muss der Vorgang von Grund auf neu gestartet werden.",
1478 - "hardware_wallet": "Hardware-Wallet",
1479 - "ignor": "Ignorieren",
1480 - "info": "Info",
1481 - "is_currently_being_migrated": "wird derzeit migriert",
1482 - "lightning_mode": "Lightning-Modus",
1483 - "long_press_hide_balance": "Halten Sie die Karte gedrückt, um das Guthaben auszublenden",
1484 - "long_press_to_copy": "Zum Kopieren gedrückt halten",
1485 - "migrating_to_ironwood": "Migration zu Ironwood läuft",
1486 - "opens_externally": "Wird extern geöffnet",
1487 - "opens_in_browser": "Wird im Browser geöffnet",
1488 - "qr_parts_scanned": "QR-Code-Teile gescannt: ${scanned} von ${total}",
1489 - "recipient_number": "Empfänger ${number}",
1490 - "show_full_address": "Vollständige Adresse anzeigen",
1491 - "standard": "Standard",
1492 - "token": "Token",
1515 "zcash_network_upgrade": "Zcash-Netzwerk-Upgrade",
1516 "zcash_network_upgrade_desc_1": "Das Zcash-Netzwerk wurde auf Ironwood aktualisiert. Damit Ihr Guthaben wieder ausgegeben werden kann, muss es migriert werden. Die Migration erfolgt automatisch und unter Wahrung Ihrer Privatsphäre. Sie beginnt, sobald Sie Ihre Zcash-Wallet öffnen.",
1517 "zcash_network_upgrade_desc_2": "Nach Abschluss der Migration wird Ihr verfügbares Guthaben wieder wie gewohnt angezeigt und Sie können Zcash wieder normal senden und empfangen.",
1518 "zcash_network_upgrade_desc_3": "Bitte lassen Sie Ihre Zcash-Wallet vollständig synchronisieren und anschließend die App geöffnet, bis die Migration abgeschlossen ist. Dies kann je nach Guthaben einige Minuten dauern."
1497 -}
1519 +}
\ No newline at end of file
res/values/strings_en.arb
+21 -2
@@ -97,6 +97,7 @@
97 "available_balance": "Available Balance",
98 "available_balance_description": "The “Available Balance” or “Confirmed Balance” are funds that can be spent immediately. If funds appear in the lower balance but not the top balance, then you must wait a few minutes for the incoming funds to get more network confirmations. After they get more confirmations, they will be spendable.",
99 "avg_savings": "Avg. Savings",
100 + "avl": "Avl",
101 "awaitDAppProcessing": "Kindly wait for the dApp to finish processing.",
102 "awaiting_payment_confirmation": "Awaiting Payment Confirmation",
103 "background_sync": "Background sync",
@@ -223,6 +224,7 @@
224 "color_theme": "Color theme",
225 "coming_soon_tag": "Coming Soon",
226 "commit_transaction_amount_fee": "Commit transaction\nAmount: ${amount}\nFee: ${fee}",
227 + "compatible_networks": "Compatible Networks",
228 "compatible_services": "Compatible Services",
229 "compatible_services_desc": "Use the Scan tool to read the following types of QR codes supported on Cake Wallet:",
230 "configure": "Configure",
@@ -262,6 +264,7 @@
264 "contact_support": "Contact Support",
265 "contacts": "Contacts",
266 "continue_text": "Continue",
267 + "continue_to_swap": "Continue to Swap",
268 "contract_address": "Contract Address",
269 "contract_warning": "This contract address has been flagged as potentially fraudulent. Please proceed with caution.",
270 "contractName": "Contract Name",
@@ -290,6 +293,7 @@
293 "creation_date": "Creation Date",
294 "crypto_addresses": "Crypto Addresses",
295 "csv_nothing_to_export": "Nothing to export",
296 + "current_network": "Current Network",
297 "current_swap": "Current Swap",
298 "current_wallet": "Current wallet",
299 "custom": "Custom",
@@ -448,6 +452,7 @@
452 "etherscan_history": "Etherscan history",
453 "event": "Event",
454 "events": "Events",
455 + "evm_address_detected": "EVM Address Detected",
456 "evm_ecosystem_description": "If necessary, modify the network and token you would like to use for this payment.",
457 "exchange": "Exchange",
458 "exchange_extra_info": "Please don’t forget to specify the Memo or Extra ID while sending this transaction for the exchange",
@@ -679,6 +684,9 @@
684 "nanogpt_subtitle": "All the newest models (GPT-5.3, Claude 4.6).\\nNo subscription, pay with crypto.",
685 "narrow": "Narrow",
686 "network": "Network",
687 + "network_address_detected": "${network} Address Detected",
688 + "network_prefix_on": "on",
689 + "network_switch_failed": "Failed to switch to the requested network. The payment was not applied, please try again.",
690 "networks": "Networks",
691 "new_first_wallet_text": "Keeping your crypto safe is a piece of cake",
692 "new_node_testing": "New node testing",
@@ -733,8 +741,8 @@
741 "onramper_option_description": "Quickly buy crypto with many payment methods. Available in most countries. Spreads and fees vary.",
742 "open_gift_card": "Open Gift Card",
743 "open_wallet": "Open Wallet",
736 - "opens_in_browser": "Opens in browser",
744 "opens_externally": "Opens externally",
745 + "opens_in_browser": "Opens in browser",
746 "optional_description": "Optional description",
747 "optional_email_hint": "Optional payee notification email",
748 "optional_name": "Optional recipient name",
@@ -927,8 +935,8 @@
935 "restore_wallet_name": "Wallet name",
936 "restore_wallet_restore_description": "Wallet restore description",
937 "resync_device": "Resync device",
930 - "resync_device_desc": "Balance updating requires occasional resyncing Cake Wallet with the device.",
938 "resync_device_cancel_warning_desc": "This will end the ongoing sync process with your hardware device",
939 + "resync_device_desc": "Balance updating requires occasional resyncing Cake Wallet with the device.",
940 "return_address_desc": "In the rare case of a failed swap, our partners can automatically refund your payment to the provided refund address.",
941 "return_address_desc_external": "Since you chose Send From External, please set a refund address manually below.",
942 "robinhood_option_description": "Buy and transfer instantly using your debit card, bank account, or Robinhood balance. USA only.",
@@ -998,6 +1006,7 @@
1006 "select_asset": "Select Asset",
1007 "select_backup_file": "Select backup file",
1008 "select_buy_provider_notice": "Select a buy provider above. You can skip this screen by setting your default buy provider in app settings.",
1009 + "select_compatible_wallet": "Select one of your compatible wallets",
1010 "select_destination": "Please select destination for the backup file.",
1011 "select_fiat_currency_title": "Select Currency",
1012 "select_hw_account_below": "Please select which account to restore below:",
@@ -1007,6 +1016,9 @@
1016 "select_network_title": "Select Network",
1017 "select_other_wallet": "Select other Wallet",
1018 "select_receiver": "Select Receiver",
1019 + "select_recipient_network": "Select Recipient Network",
1020 + "select_recipient_network_description": "Multiple networks are compatible with the provided recipient address",
1021 + "select_recipient_network_for_tx": "Select the network of the Recipient to this transaction",
1022 "select_sell_provider_notice": "Select a sell provider above. You can skip this screen by setting your default sell provider in app settings.",
1023 "select_token": "Select Token",
1024 "select_your_country": "Please select your country",
@@ -1039,6 +1051,8 @@
1051 "send_templates": "Templates",
1052 "send_title": "Send",
1053 "send_to": "Send to",
1054 + "send_to_network": "Send to ${network}",
1055 + "send_to_network_description": "Would you like to switch to your ${network} wallet or swap your ${currentNetwork} funds for this payment?",
1056 "send_to_this_address": "Send ${currency} ${tag}to this address",
1057 "send_xmr": "Send XMR",
1058 "send_your_wallet": "Your wallet",
@@ -1160,6 +1174,8 @@
1174 "support_title_other_links": "Other support links",
1175 "supported": "Supported",
1176 "swap": "Swap",
1177 + "swap_from_network": "Swap from ${network}",
1178 + "swap_from_network_description": "To send funds to the ${targetNetwork} network, you will need to swap your ${currentNetwork} funds. Do you want to proceed?",
1179 "swap_id": "Swap ID",
1180 "swap_provider_initial_desc": "Select the type of swap provider you prefer to use when swapping in",
1181 "swap_providers": "Swap providers",
@@ -1170,6 +1186,7 @@
1186 "swipe_to_send": "Swipe to send",
1187 "switch_camera": "Switch camera",
1188 "switch_input_currency": "Switch between crypto and fiat entry",
1189 + "switch_to_x_wallet": "Switch to ${network} Wallet",
1190 "switch_wallet": "Switch Wallet",
1191 "switchToETHWallet": "Please switch to an Ethereum wallet and try again",
1192 "switchToWCCompatibleWallet": "Please switch to a WalletConnect compatible wallet and try again (${chains}).",
@@ -1342,6 +1359,8 @@
1359 "unspent_coins_details_title": "Unspent coins details",
1360 "unspent_coins_title": "Unspent coins",
1361 "unsupported_asset": "We don't support this action for this asset. Please create or switch to a wallet of a supported asset type.",
1362 + "unsupported_network_requested": "This payment request is for a network we don't support (chain ID ${chainId}).",
1363 + "unsupported_token_requested": "This payment request is for a token we couldn't identify on the selected network.",
1364 "uptime": "Uptime",
1365 "upto": "up to ${value}",
1366 "usb": "USB",
res/values/strings_es.arb
+21 -36
@@ -94,6 +94,7 @@
94 "available_balance": "Saldo disponible",
95 "available_balance_description": "El “Saldo Disponible” o “Saldo Confirmado” son fondos que pueden gastarse de inmediato. Si los fondos aparecen en el saldo inferior pero no en el saldo superior, deberás esperar unos minutos a que los fondos entrantes obtengan más confirmaciones de la red. Una vez que tengan más confirmaciones, podrás gastarlos.",
96 "avg_savings": "Ahorro prom.",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Espere a que la dApp termine de procesar.",
99 "awaiting_payment_confirmation": "En espera de confirmación de pago",
100 "background_sync": "Sincronización en segundo plano",
@@ -219,6 +220,7 @@
220 "color_theme": "Tema de color",
221 "coming_soon_tag": "Próximamente",
222 "commit_transaction_amount_fee": "Confirmar transacción\nCantidad: ${amount}\nComisión: ${fee}",
223 + "compatible_networks": "Redes compatibles",
224 "compatible_services": "Servicios compatibles",
225 "compatible_services_desc": "Usa la herramienta Escanear para leer los siguientes tipos de códigos QR compatibles con Cake Wallet:",
226 "configure": "Configurar",
@@ -258,6 +260,7 @@
260 "contact_support": "Contactar con soporte",
261 "contacts": "Contactos",
262 "continue_text": "Continuar",
263 + "continue_to_swap": "Continuar intercambiando",
264 "contract_address": "Dirección del contrato",
265 "contract_warning": "Esta dirección de contrato ha sido marcada como potencialmente fraudulenta. Por favor, proceda con precaución.",
266 "contractName": "Nombre del contrato",
@@ -286,6 +289,7 @@
289 "creation_date": "Fecha de creación",
290 "crypto_addresses": "Direcciones cripto",
291 "csv_nothing_to_export": "No hay nada que exportar",
292 + "current_network": "Red actual",
293 "current_swap": "Intercambio actual",
294 "current_wallet": "Cartera actual",
295 "custom": "Personalizado",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Historial de Etherscan",
448 "event": "Evento",
449 "events": "Eventos",
450 + "evm_address_detected": "Dirección EVM detectada",
451 "evm_ecosystem_description": "Si es necesario, modifica la red y el token que deseas usar para este pago.",
452 "exchange": "Intercambio",
453 "exchange_extra_info": "Por favor, no olvide especificar el Memo o el ID adicional al enviar esta transacción para el exchange.",
@@ -665,6 +670,9 @@
670 "nanogpt_subtitle": "Todos los modelos más recientes (GPT-5.3, Claude 4.6).\nSin suscripción, paga con cripto.",
671 "narrow": "Estrecho",
672 "network": "Red",
673 + "network_address_detected": "${network} dirección detectada",
674 + "network_prefix_on": "en",
675 + "network_switch_failed": "No se pudo cambiar a la red solicitada. El pago no se aplicó, inténtelo nuevamente.",
676 "networks": "Redes",
677 "new_first_wallet_text": "Mantener tus criptomonedas seguras es pan comido",
678 "new_node_testing": "Prueba de nuevo nodo",
@@ -973,6 +981,7 @@
981 "select_asset": "Seleccionar activo",
982 "select_backup_file": "Seleccionar archivo de copia de seguridad",
983 "select_buy_provider_notice": "Selecciona un proveedor de compra arriba. Puedes omitir esta pantalla configurando tu proveedor de compra predeterminado en los ajustes de la aplicación.",
984 + "select_compatible_wallet": "Seleccione una de sus billeteras compatibles",
985 "select_destination": "Selecciona el destino del archivo de copia de seguridad.",
986 "select_fiat_currency_title": "Seleccionar moneda",
987 "select_hw_account_below": "Por favor, selecciona la cuenta que deseas restaurar a continuación:",
@@ -982,6 +991,9 @@
991 "select_network_title": "Seleccionar red",
992 "select_other_wallet": "Seleccionar otra billetera",
993 "select_receiver": "Seleccionar destinatario",
994 + "select_recipient_network": "Seleccionar red de destinatarios",
995 + "select_recipient_network_description": "Varias redes son compatibles con la dirección del destinatario proporcionada",
996 + "select_recipient_network_for_tx": "Seleccione la red del Destinatario de esta transacción",
997 "select_sell_provider_notice": "Selecciona un proveedor de venta arriba. Puedes omitir esta pantalla configurando tu proveedor de venta predeterminado en los ajustes de la aplicación.",
998 "select_token": "Seleccionar token",
999 "select_your_country": "Por favor, selecciona tu país",
@@ -1014,6 +1026,8 @@
1026 "send_templates": "Plantillas",
1027 "send_title": "Enviar",
1028 "send_to": "Enviar a",
1029 + "send_to_network": "Enviar a ${network}",
1030 + "send_to_network_description": "¿Le gustaría cambiar a su billetera ${network} o intercambiar sus fondos de ${currentNetwork} por este pago?",
1031 "send_to_this_address": "Enviar ${currency} ${tag}a esta dirección",
1032 "send_xmr": "Enviar XMR",
1033 "send_your_wallet": "Tu billetera",
@@ -1132,6 +1146,8 @@
1146 "support_title_other_links": "Otros enlaces de soporte",
1147 "supported": "Compatible",
1148 "swap": "Intercambiar",
1149 + "swap_from_network": "Intercambiar desde ${network}",
1150 + "swap_from_network_description": "Para enviar fondos a la red ${targetNetwork}, deberá intercambiar sus fondos de ${currentNetwork}. ¿Quieres continuar?",
1151 "swap_id": "ID de intercambio",
1152 "swap_provider_initial_desc": "Seleccione el tipo de proveedor de intercambio que prefiere usar al intercambiar",
1153 "swap_providers": "Proveedores de intercambio",
@@ -1139,6 +1155,7 @@
1155 "sweeping_wallet_alert": "Esto no debería tardar mucho. NO SALGAS DE ESTA PANTALLA O LOS FONDOS BARRIDOS PODRÍAN PERDERSE.",
1156 "swipe_to_bridge": "Desliza para transferir entre cadenas",
1157 "swipe_to_send": "Desliza para enviar",
1158 + "switch_to_x_wallet": "Cambiar a ${network} Wallet",
1159 "switch_wallet": "Cambiar cartera",
1160 "switchToETHWallet": "Por favor, cambia a una billetera de Ethereum y vuelve a intentarlo.",
1161 "switchToWCCompatibleWallet": "Cambie a una billetera compatible con WalletConnect e inténtelo nuevamente (${chains}).",
@@ -1305,6 +1322,8 @@
1322 "unspent_coins_details_title": "Detalles de monedas sin gastar",
1323 "unspent_coins_title": "Monedas no gastadas",
1324 "unsupported_asset": "No se admite esta acción para este activo. Por favor, crea o cambia a una billetera de un tipo de activo compatible.",
1325 + "unsupported_network_requested": "Esta solicitud de pago es para una red que no admitimos (ID de cadena ${chainId}).",
1326 + "unsupported_token_requested": "Esta solicitud de pago es para un token que no pudimos identificar en la red seleccionada.",
1327 "uptime": "Tiempo de actividad",
1328 "upto": "hasta ${value}",
1329 "usb": "USB",
@@ -1453,39 +1472,5 @@
1472 "zcash_card_enable_later": "Siempre puedes habilitar esta tarjeta más adelante en la configuración",
1473 "zcash_card_missing_funds": "¿Faltan fondos?",
1474 "zcash_card_scan": "Escanear",
1456 - "zcash_card_warning": "No cierre la aplicación hasta que se complete el procedimiento; si lo hace, este proceso deberá reiniciarse desde cero.",
1457 - "are_you_sure_exit": "¿Seguro que quieres salir?",
1458 - "available": "Disponible",
1459 - "bridging": "Transfiriendo entre cadenas",
1460 - "compatible_services": "Servicios compatibles",
1461 - "compatible_services_desc": "Usa la herramienta Escanear para leer los siguientes tipos de códigos QR compatibles con Cake Wallet:",
1462 - "crypto_addresses": "Direcciones cripto",
1463 - "delete_this_node": "Eliminar este nodo",
1464 - "device_confirmation": "Confirmación del dispositivo",
1465 - "favorite_token": "Token favorito",
1466 - "favorite_token_desc": "El saldo del token favorito se mostrará en la tarjeta de saldo.",
1467 - "gallery": "Galería",
1468 - "hww_exit_desc": "Esto finalizará el proceso de emparejamiento en curso con tu dispositivo de hardware",
1469 - "input": "Entrada",
1470 - "manual_input": "Entrada manual",
1471 - "networks": "Redes",
1472 - "node_share_desc": "Escanea este código QR desde la pantalla Escanear para importar este nodo.",
1473 - "nodes_desc": "Administra los nodos existentes o añade uno personalizado.",
1474 - "ocp_desc": "Paga con cripto en tiendas",
1475 - "pairing_code": "Código de emparejamiento",
1476 - "pairing_code_desc_1": "Tu dispositivo mostrará un código de emparejamiento.",
1477 - "pairing_code_desc_2": "Introdúcelo aquí para continuar",
1478 - "pairing_error": "Error de emparejamiento",
1479 - "passphrase_view_keys": "Frase de contraseña",
1480 - "payment_invoices": "Facturas de pago",
1481 - "save_contact": "Guardar contacto",
1482 - "share_this_node": "Compartir este nodo",
1483 - "show_combined_balance": "Mostrar saldo combinado",
1484 - "swipe_to_bridge": "Desliza para transferir entre cadenas",
1485 - "this_can_take_few_seconds": "Esto puede tardar unos segundos",
1486 - "username_check_your_network": "No se pudo verificar el nombre de usuario. Comprueba tu conexión de red.",
1487 - "verifying_code": "Verificando código",
1488 - "wallet_balance": "Saldo de la cartera",
1489 - "wc_desc": "Conéctate fácilmente a dApps",
1490 - "yes_exit": "Sí. Salir"
1491 -}
1475 + "zcash_card_warning": "No cierre la aplicación hasta que se complete el procedimiento; si lo hace, este proceso deberá reiniciarse desde cero."
1476 +}
\ No newline at end of file
res/values/strings_fa.arb
+21 -39
@@ -94,6 +94,7 @@
94 "available_balance": "موجودی در دسترس",
95 "available_balance_description": "«موجودی قابل‌دسترس» یا «موجودی تأییدشده» وجوهی هستند که می‌توان بلافاصله خرج کرد.\nاگر وجوه در موجودی پایین‌تر ظاهر شوند اما در موجودی بالا نباشند، باید چند دقیقه صبر کنید تا وجوه ورودی تأییدهای شبکه بیشتری دریافت کنند.\nپس از دریافت تأییدهای بیشتر، قابل خرج کردن خواهند بود.",
96 "avg_savings": "میانگین صرفه‌جویی",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "لطفاً منتظر بمانید تا پردازش dApp به پایان برسد.",
99 "awaiting_payment_confirmation": "در انتظار تأیید پرداخت",
100 "background_sync": "همگام‌سازی در پس‌زمینه",
@@ -219,6 +220,7 @@
220 "color_theme": "تم رنگ",
221 "coming_soon_tag": "به‌زودی",
222 "commit_transaction_amount_fee": "ثبت تراکنش\nمقدار: ${amount}\nکارمزد: ${fee}",
223 + "compatible_networks": "شبکه های سازگار",
224 "compatible_services": "سرویس‌های سازگار",
225 "compatible_services_desc": "از ابزار اسکن برای خواندن انواع کدهای QR زیر که در Cake Wallet پشتیبانی می‌شوند استفاده کنید:",
226 "configure": "پیکربندی",
@@ -258,6 +260,7 @@
260 "contact_support": "تماس با پشتیبانی",
261 "contacts": "مخاطبین",
262 "continue_text": "ادامه",
263 + "continue_to_swap": "به Swap ادامه دهید",
264 "contract_address": "آدرس قرارداد",
265 "contract_warning": "این آدرس قرارداد به‌عنوان کلاهبرداری احتمالی علامت‌گذاری شده است.\nلطفاً با احتیاط ادامه دهید.",
266 "contractName": "نام قرارداد",
@@ -286,6 +289,7 @@
289 "creation_date": "تاریخ ایجاد",
290 "crypto_addresses": "آدرس‌های رمزارز",
291 "csv_nothing_to_export": "چیزی برای صدور وجود ندارد",
292 + "current_network": "شبکه فعلی",
293 "current_swap": "سواپ فعلی",
294 "current_wallet": "کیف پول فعلی",
295 "custom": "سفارشی",
@@ -443,6 +447,7 @@
447 "etherscan_history": "تاریخچه Etherscan",
448 "event": "رویداد",
449 "events": "رویدادها",
450 + "evm_address_detected": "آدرس EVM شناسایی شد",
451 "evm_ecosystem_description": "در صورت نیاز، شبکه و توکنی را که می‌خواهید برای این پرداخت استفاده کنید تغییر دهید.",
452 "exchange": "تبدیل",
453 "exchange_extra_info": "لطفاً فراموش نکنید هنگام ارسال این تراکنش برای تبادل، Memo یا Extra ID را مشخص کنید",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "همه جدیدترین مدل‌ها (GPT-5.3, Claude 4.6).\nبدون اشتراک، پرداخت با کریپتو.",
670 "narrow": "باریک",
671 "network": "شبکه",
672 + "network_address_detected": "آدرس ${network} شناسایی شد",
673 + "network_prefix_on": "در",
674 + "network_switch_failed": "تغییر به شبکه درخواستی انجام نشد. پرداخت اعمال نشد، لطفاً دوباره امتحان کنید.",
675 "networks": "شبکه‌ها",
676 "new_first_wallet_text": "امن نگه داشتن رمزارزهای شما مثل آب خوردن است",
677 "new_node_testing": "آزمایش نود جدید",
@@ -971,6 +979,7 @@
979 "select_asset": "Asset را انتخاب کنید",
980 "select_backup_file": "فایل پشتیبان را انتخاب کنید",
981 "select_buy_provider_notice": "یک ارائه‌دهنده خرید را در بالا انتخاب کنید.\nمی‌توانید با تنظیم ارائه‌دهنده خرید پیش‌فرض در تنظیمات برنامه، این صفحه را رد کنید.",
982 + "select_compatible_wallet": "یکی از کیف پول های سازگار خود را انتخاب کنید",
983 "select_destination": "لطفاً مقصد فایل پشتیبان را انتخاب کنید.",
984 "select_fiat_currency_title": "ارز را انتخاب کنید",
985 "select_hw_account_below": "لطفاً حسابی را که می‌خواهید بازیابی کنید، در زیر انتخاب کنید:",
@@ -980,6 +989,9 @@
989 "select_network_title": "Network را انتخاب کنید",
990 "select_other_wallet": "کیف پول دیگری را انتخاب کنید",
991 "select_receiver": "گیرنده را انتخاب کنید",
992 + "select_recipient_network": "شبکه گیرنده را انتخاب کنید",
993 + "select_recipient_network_description": "چندین شبکه با آدرس گیرنده ارائه شده سازگار هستند",
994 + "select_recipient_network_for_tx": "شبکه گیرنده این تراکنش را انتخاب کنید",
995 "select_sell_provider_notice": "یک ارائه‌دهنده فروش را در بالا انتخاب کنید.\nمی‌توانید با تنظیم ارائه‌دهنده فروش پیش‌فرض خود در تنظیمات برنامه، این صفحه را رد کنید.",
996 "select_token": "انتخاب توکن",
997 "select_your_country": "لطفاً کشور خود را انتخاب کنید",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "قالب‌ها",
1025 "send_title": "ارسال",
1026 "send_to": "ارسال به",
1027 + "send_to_network": "ارسال به ${network}",
1028 + "send_to_network_description": "آیا می خواهید به کیف پول ${network} خود تغییر دهید یا وجوه ${currentNetwork} خود را با این پرداخت عوض کنید؟",
1029 "send_to_this_address": "${currency} ${tag}را به این آدرس ارسال کنید",
1030 "send_xmr": "ارسال XMR",
1031 "send_your_wallet": "کیف پول شما",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "سایر لینک‌های پشتیبانی",
1145 "supported": "پشتیبانی‌شده",
1146 "swap": "سواپ",
1147 + "swap_from_network": "تعویض از ${network}",
1148 + "swap_from_network_description": "برای ارسال وجوه به شبکه ${targetNetwork}، باید وجوه ${currentNetwork} خود را مبادله کنید. آیا می خواهید ادامه دهید؟",
1149 "swap_id": "شناسهٔ سواپ",
1150 "swap_provider_initial_desc": "نوع ارائه‌دهندهٔ سواپ را که ترجیح می‌دهید هنگام سواپ از آن استفاده کنید، انتخاب کنید",
1151 "swap_providers": "ارائه‌دهندگان سواپ",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "این کار نباید طول بکشد.\nاین صفحه را ترک نکنید، وگرنه ممکن است وجوه انتقال‌یافته از دست برود.",
1154 "swipe_to_bridge": "برای پل‌زدن، انگشت خود را بکشید",
1155 "swipe_to_send": "برای ارسال، انگشت خود را بکشید",
1156 + "switch_to_x_wallet": "به کیف پول ${network} بروید",
1157 "switch_wallet": "تعویض کیف پول",
1158 "switchToETHWallet": "لطفاً به کیف پول اتریوم تغییر دهید و دوباره تلاش کنید",
1159 "switchToWCCompatibleWallet": "لطفاً به یک کیف پول سازگار با WalletConnect بروید و دوباره امتحان کنید (${chains}).",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "جزئیات کوین‌های خرج‌نشده",
1321 "unspent_coins_title": "کوین‌های خرج‌نشده",
1322 "unsupported_asset": "ما از انجام این اقدام برای این دارایی پشتیبانی نمی‌کنیم.\nلطفاً یک کیف پول از نوع داراییِ پشتیبانی‌شده ایجاد کنید یا به کیف پولی با نوع داراییِ پشتیبانی‌شده تغییر دهید.",
1323 + "unsupported_network_requested": "این درخواست پرداخت برای شبکه‌ای است که ما پشتیبانی نمی‌کنیم (شناسه زنجیره ${chainId}).",
1324 + "unsupported_token_requested": "این درخواست پرداخت برای رمزی است که نتوانستیم در شبکه انتخابی شناسایی کنیم.",
1325 "uptime": "زمان فعالیت",
1326 "upto": "تا ${value}",
1327 "usb": "USB",
@@ -1450,42 +1469,5 @@
1469 "zcash_card_enable_later": "می‌توانید همیشه این کارت را بعداً در تنظیمات فعال کنید",
1470 "zcash_card_missing_funds": "موجودی گم شده؟",
1471 "zcash_card_scan": "اسکن",
1453 - "zcash_card_warning": "تا زمانی که این فرایند کامل نشده است، برنامه را نبندید؛ در غیر این صورت، این فرایند باید از ابتدا دوباره شروع شود.",
1454 - "are_you_sure_exit": "آیا مطمئن هستید که می‌خواهید خارج شوید؟",
1455 - "available": "در دسترس",
1456 - "bitcoin_lightning_deposit": "واریز",
1457 - "bitcoin_lightning_withdraw": "برداشت",
1458 - "bridging": "در حال پل‌زدن",
1459 - "compatible_services": "سرویس‌های سازگار",
1460 - "compatible_services_desc": "از ابزار اسکن برای خواندن انواع کدهای QR زیر که در Cake Wallet پشتیبانی می‌شوند استفاده کنید:",
1461 - "crypto_addresses": "آدرس‌های رمزارز",
1462 - "delete_this_node": "حذف این نود",
1463 - "device_confirmation": "تأیید دستگاه",
1464 - "favorite_token": "توکن موردعلاقه",
1465 - "favorite_token_desc": "موجودی توکن موردعلاقه روی کارت موجودی نمایش داده می‌شود.",
1466 - "gallery": "گالری",
1467 - "hww_exit_desc": "این کار، فرایند جفت‌سازی در حال انجام با دستگاه سخت‌افزاری شما را پایان می‌دهد",
1468 - "input": "ورودی",
1469 - "manual_input": "ورود دستی",
1470 - "networks": "شبکه‌ها",
1471 - "node_share_desc": "برای وارد کردن این نود، این کد QR را از صفحهٔ اسکن اسکن کنید.",
1472 - "nodes_desc": "نودهای موجود را مدیریت کنید یا یک نود سفارشی اضافه کنید.",
1473 - "ocp_desc": "پرداخت با رمزارز در فروشگاه‌ها",
1474 - "pairing_code": "کد جفت‌سازی",
1475 - "pairing_code_desc_1": "دستگاه شما یک کد جفت‌سازی نمایش می‌دهد.",
1476 - "pairing_code_desc_2": "برای ادامه، اینجا وارد کنید",
1477 - "pairing_error": "خطای جفت‌سازی",
1478 - "payment_invoices": "صورتحساب‌های پرداخت",
1479 - "save_contact": "ذخیره مخاطب",
1480 - "share_this_node": "اشتراک‌گذاری این نود",
1481 - "show_combined_balance": "نمایش موجودی ترکیبی",
1482 - "swipe_to_bridge": "برای پل‌زدن، انگشت خود را بکشید",
1483 - "this_can_take_few_seconds": "این ممکن است چند ثانیه طول بکشد",
1484 - "tx_retry_message": "هنگام پردازش تراکنش خطایی رخ داد. لطفاً تراکنش را دوباره تلاش کنید.",
1485 - "use_blink_protection": "استفاده از محافظت Blink",
1486 - "username_check_your_network": "بررسی نام کاربری امکان‌پذیر نیست. لطفاً اتصال شبکهٔ خود را بررسی کنید.",
1487 - "verifying_code": "در حال تأیید کد",
1488 - "wallet_balance": "موجودی کیف پول",
1489 - "wc_desc": "به‌راحتی به dAppها متصل شوید",
1490 - "yes_exit": "بله. خروج"
1491 -}
1472 + "zcash_card_warning": "تا زمانی که این فرایند کامل نشده است، برنامه را نبندید؛ در غیر این صورت، این فرایند باید از ابتدا دوباره شروع شود."
1473 +}
\ No newline at end of file
res/values/strings_fr.arb
+21 -36
@@ -94,6 +94,7 @@
94 "available_balance": "Solde disponible",
95 "available_balance_description": "Le « Solde disponible » ou le « Solde confirmé » correspond aux fonds que vous pouvez dépenser immédiatement. Si des fonds apparaissent dans le solde inférieur mais pas dans le solde supérieur, vous devez attendre quelques minutes pour que les fonds entrants obtiennent davantage de confirmations sur le réseau. Une fois qu’ils auront reçu plus de confirmations, ils pourront être dépensés.",
96 "avg_savings": "Économies moy.",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Veuillez patienter pendant que la dApp termine le traitement.",
99 "awaiting_payment_confirmation": "En attente de confirmation du paiement",
100 "background_sync": "Synchronisation en arrière-plan",
@@ -219,6 +220,7 @@
220 "color_theme": "Thème de couleur",
221 "coming_soon_tag": "Bientôt disponible",
222 "commit_transaction_amount_fee": "Confirmer la transaction\nMontant : ${amount}\nFrais : ${fee}",
223 + "compatible_networks": "Réseaux compatibles",
224 "compatible_services": "Services compatibles",
225 "compatible_services_desc": "Utilisez l'outil Scan pour lire les types de codes QR suivants pris en charge par Cake Wallet :",
226 "configure": "Configurer",
@@ -258,6 +260,7 @@
260 "contact_support": "Contacter le support",
261 "contacts": "Contacts",
262 "continue_text": "Continuer",
263 + "continue_to_swap": "Continuer à échanger",
264 "contract_address": "Adresse du contrat",
265 "contract_warning": "Cette adresse de contrat a été signalée comme potentiellement frauduleuse. Veuillez procéder avec prudence.",
266 "contractName": "Nom du contrat",
@@ -286,6 +289,7 @@
289 "creation_date": "Date de création",
290 "crypto_addresses": "Adresses crypto",
291 "csv_nothing_to_export": "Nothing to export",
292 + "current_network": "Réseau actuel",
293 "current_swap": "Swap en cours",
294 "current_wallet": "Portefeuille actuel",
295 "custom": "Personnalisé",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Historique Etherscan",
448 "event": "Événement",
449 "events": "Événements",
450 + "evm_address_detected": "Adresse EVM détectée",
451 "evm_ecosystem_description": "Si nécessaire, modifiez le réseau et le jeton que vous souhaitez utiliser pour ce paiement.",
452 "exchange": "Échange",
453 "exchange_extra_info": "N’oubliez pas de spécifier le mémo ou l’ID supplémentaire lors de l’envoi de cette transaction pour l’échange",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Tous les modèles les plus récents (GPT-5.3, Claude 4.6).\nPas d'abonnement, payez en crypto.",
670 "narrow": "Étroit",
671 "network": "Réseau",
672 + "network_address_detected": "Adresse ${network} détectée",
673 + "network_prefix_on": "sur",
674 + "network_switch_failed": "Échec du basculement vers le réseau demandé. Le paiement n'a pas été appliqué, veuillez réessayer.",
675 "networks": "Réseaux",
676 "new_first_wallet_text": "Garder vos cryptos en sécurité, c'est du gâteau",
677 "new_node_testing": "Test d’un nouveau nœud",
@@ -971,6 +979,7 @@
979 "select_asset": "Sélectionnez l'actif",
980 "select_backup_file": "Sélectionner le fichier de sauvegarde",
981 "select_buy_provider_notice": "Sélectionnez un prestataire d'achat ci-dessus. Vous pouvez ignorer cet écran en définissant votre prestataire d'achat par défaut dans les paramètres de l'application.",
982 + "select_compatible_wallet": "Sélectionnez l'un de vos portefeuilles compatibles",
983 "select_destination": "Veuillez sélectionner l’emplacement du fichier de sauvegarde.",
984 "select_fiat_currency_title": "Sélectionnez la devise",
985 "select_hw_account_below": "Veuillez sélectionner ci-dessous le compte à restaurer :",
@@ -980,6 +989,9 @@
989 "select_network_title": "Sélectionnez le réseau",
990 "select_other_wallet": "Sélectionner un autre portefeuille",
991 "select_receiver": "Sélectionner le destinataire",
992 + "select_recipient_network": "Sélectionnez le réseau destinataire",
993 + "select_recipient_network_description": "Plusieurs réseaux sont compatibles avec l'adresse du destinataire fournie",
994 + "select_recipient_network_for_tx": "Sélectionnez le réseau du Destinataire de cette transaction",
995 "select_sell_provider_notice": "Sélectionnez un prestataire de vente ci-dessus. Vous pouvez ignorer cet écran en définissant votre prestataire de vente par défaut dans les paramètres de l'application.",
996 "select_token": "Sélectionner un jeton",
997 "select_your_country": "Veuillez sélectionner votre pays",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "Modèles",
1025 "send_title": "Envoyer",
1026 "send_to": "Envoyer à",
1027 + "send_to_network": "Envoyer à ${network}",
1028 + "send_to_network_description": "Souhaitez-vous passer à votre portefeuille ${network} ou échanger vos fonds ${currentNetwork} contre ce paiement ?",
1029 "send_to_this_address": "Envoyer ${currency} ${tag}vers cette adresse",
1030 "send_xmr": "Envoyer des XMR",
1031 "send_your_wallet": "Votre portefeuille",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "Autres liens d’assistance",
1145 "supported": "Pris en charge",
1146 "swap": "Swap",
1147 + "swap_from_network": "Échanger depuis ${network}",
1148 + "swap_from_network_description": "Pour envoyer des fonds vers le réseau ${targetNetwork}, vous devrez échanger vos fonds ${currentNetwork}. Voulez-vous continuer ?",
1149 "swap_id": "ID d’échange",
1150 "swap_provider_initial_desc": "Sélectionnez le type de fournisseur de swap que vous préférez utiliser lors d’un swap",
1151 "swap_providers": "Fournisseurs de swap",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "Cela ne devrait pas prendre longtemps. NE QUITTEZ PAS CET ÉCRAN, SINON LES FONDS BALAYÉS RISQUENT D’ÊTRE PERDUS.",
1154 "swipe_to_bridge": "Glissez pour transférer (bridge)",
1155 "swipe_to_send": "Faites glisser pour envoyer",
1156 + "switch_to_x_wallet": "Passer au portefeuille ${network}",
1157 "switch_wallet": "Changer de portefeuille",
1158 "switchToETHWallet": "Veuillez passer à un portefeuille Ethereum et réessayer",
1159 "switchToWCCompatibleWallet": "Veuillez passer à un portefeuille compatible WalletConnect et réessayer (${chains}).",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "Détails des coins non dépensés",
1321 "unspent_coins_title": "Coins non dépensés",
1322 "unsupported_asset": "Nous ne prenons pas en charge cette action pour cet actif. Veuillez créer ou passer à un portefeuille d’un type d’actif pris en charge.",
1323 + "unsupported_network_requested": "Cette demande de paiement concerne un réseau que nous ne prenons pas en charge (ID de chaîne ${chainId}).",
1324 + "unsupported_token_requested": "Cette demande de paiement concerne un token que nous n'avons pas pu identifier sur le réseau sélectionné.",
1325 "uptime": "Temps de disponibilité",
1326 "upto": "jusqu’à ${value}",
1327 "usb": "USB",
@@ -1450,39 +1469,5 @@
1469 "zcash_card_enable_later": "Vous pouvez toujours activer cette carte plus tard dans les paramètres",
1470 "zcash_card_missing_funds": "Fonds manquants ?",
1471 "zcash_card_scan": "Scanner",
1453 - "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.",
1454 - "are_you_sure_exit": "Êtes-vous sûr de vouloir quitter ?",
1455 - "available": "Disponible",
1456 - "bridging": "Transfert inter-chaînes",
1457 - "compatible_services": "Services compatibles",
1458 - "compatible_services_desc": "Utilisez l'outil Scan pour lire les types de codes QR suivants pris en charge par Cake Wallet :",
1459 - "crypto_addresses": "Adresses crypto",
1460 - "delete_this_node": "Supprimer ce nœud",
1461 - "device_confirmation": "Confirmation sur l'appareil",
1462 - "favorite_token": "Jeton favori",
1463 - "favorite_token_desc": "Le solde du jeton favori s'affichera sur la carte de solde.",
1464 - "gallery": "Galerie",
1465 - "hww_exit_desc": "Cela mettra fin au processus de jumelage en cours avec votre appareil matériel",
1466 - "input": "Entrée",
1467 - "manual_input": "Saisie manuelle",
1468 - "networks": "Réseaux",
1469 - "node_share_desc": "Scannez ce code QR depuis l'écran Scan pour importer ce nœud.",
1470 - "nodes_desc": "Gérez les nœuds existants ou ajoutez-en un personnalisé.",
1471 - "ocp_desc": "Payez avec des cryptos en magasin",
1472 - "pairing_code": "Code de jumelage",
1473 - "pairing_code_desc_1": "Votre appareil affichera un code de jumelage.",
1474 - "pairing_code_desc_2": "Saisissez-le ici pour continuer",
1475 - "pairing_error": "Erreur de jumelage",
1476 - "passphrase_view_keys": "Phrase secrète",
1477 - "payment_invoices": "Factures de paiement",
1478 - "save_contact": "Enregistrer le contact",
1479 - "share_this_node": "Partager ce nœud",
1480 - "show_combined_balance": "Afficher le solde combiné",
1481 - "swipe_to_bridge": "Glissez pour transférer (bridge)",
1482 - "this_can_take_few_seconds": "Cela peut prendre quelques secondes",
1483 - "username_check_your_network": "Impossible de vérifier le nom d'utilisateur. Veuillez vérifier votre connexion réseau.",
1484 - "verifying_code": "Vérification du code",
1485 - "wallet_balance": "Solde du portefeuille",
1486 - "wc_desc": "Connectez-vous facilement aux dApps",
1487 - "yes_exit": "Oui. Quitter"
1488 -}
1472 + "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."
1473 +}
\ No newline at end of file
res/values/strings_gn.arb
+21 -296
@@ -94,6 +94,7 @@
94 "available_balance": "Saldo ojepurukuaáva",
95 "available_balance_description": "Pe “Available Balance” térã “Confirmed Balance” ha'e umi fondo ikatúva reipuru pya'e. Umi fondo ojehecháramo pe saldo yvýpe ha ndaha'éi pe saldo yvate gotyo, upéicharõ eha'arõ sapy'ami hag̃ua umi fondo og̃uahẽva ohupytyve hag̃ua confirmación de red. Oguerekóvo hetave confirmación, ikatúta reipuru.",
96 "avg_savings": "Ñongatu mbytegua",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Eha'arõmi pe dApp omohu'ã hag̃ua hembiapo.",
99 "awaiting_payment_confirmation": "Oha’arõ hína ñemoañete jehepyme’ẽ",
100 "background_sync": "Ñembojuehe tapykuegua",
@@ -219,6 +220,7 @@
220 "color_theme": "Téma sa'y",
221 "coming_soon_tag": "Og̃uahẽ pototáma",
222 "commit_transaction_amount_fee": "Emoneĩ ñembohasa\nMboheta: ${amount}\nHepyme’ẽ: ${fee}",
223 + "compatible_networks": "Redes Ojogueraháva",
224 "compatible_services": "Servicio-kuéra Ojokupytýva",
225 "compatible_services_desc": "Eipuru pe Scan tembiporu emoñe'ẽ hag̃ua ko'ã QR código Cake Wallet oipytyvõva:",
226 "configure": "Configurar",
@@ -259,6 +261,7 @@
261 "contact_support": "Eñe’ẽ Support ndive",
262 "contacts": "Contactos",
263 "continue_text": "Eku'e",
264 + "continue_to_swap": "Esegíkena eintercambia",
265 "contract_address": "Contrato Kundaharape",
266 "contract_warning": "Ko contrato dirección ojehechakuaa hag̃ua ikatuha haʼe peteĩ ñembotavy térã mba’e vai. Eñangareko porãke.",
267 "contractName": "Contrato réra",
@@ -287,6 +290,7 @@
290 "creation_date": "Arange ojejapo hague",
291 "crypto_addresses": "Cripto Kundaharape-kuéra",
292 "csv_nothing_to_export": "Nothing to export",
293 + "current_network": "Red ko’áĝagua",
294 "current_swap": "Intercambio ko'ág̃a",
295 "current_wallet": "Billetera actual",
296 "custom": "Mboavopyre",
@@ -445,6 +449,7 @@
449 "etherscan_history": "Etherscan rembiasakue",
450 "event": "Tembiaporã",
451 "events": "Tembiaporã",
452 + "evm_address_detected": "EVM Dirección Ojejuhúva",
453 "evm_ecosystem_description": "Tekotevẽramo, emoambue pe red ha token reipuruséva ko jehepyme'ẽme g̃uarã.",
454 "exchange": "Mbojopyru",
455 "exchange_extra_info": "Anike nde resarái emombe'u hag̃ua pe Memo térã Extra ID emondóvo ko transacción intercambio-rã",
@@ -667,6 +672,9 @@
672 "nanogpt_subtitle": "Opaite umi modelo ipyahuvéva (GPT-5.3, Claude 4.6).\nNdaipóri suscripción, ehepyme’ẽ cripto rupive.",
673 "narrow": "Poʼi",
674 "network": "Red",
675 + "network_address_detected": "${network} Dirección Ojejuhúva",
676 + "network_prefix_on": "pe",
677 + "network_switch_failed": "Ndojehechái oñembohasa hag̃ua red ojejerurévape. Pe pago ndojejapóikuri, eñeha’ã jey.",
678 "networks": "Red-kuéra",
679 "new_first_wallet_text": "Eñangareko hag̃ua nde criptomoneda rehe ha'e peteĩ mba'e ndahasýiva",
680 "new_node_testing": "Ñeha’ã nodo pyahu",
@@ -977,6 +985,7 @@
985 "select_asset": "Eiporavo Activo",
986 "select_backup_file": "Eiporavo marandurenda ñongatupyre",
987 "select_buy_provider_notice": "Eiporavo peteĩ jogua-me’ẽha yvate. Ikatu rehasapa ko pantalla emoĩvo nde jogua-me’ẽha ijypykuéramo ñembohekorã aplicación-pe.",
988 + "select_compatible_wallet": "Eiporavo peteĩva ne billetera ojogueraháva",
989 "select_destination": "Eiporavo moõpa oñeñongatúta marandurenda backup.",
990 "select_fiat_currency_title": "Eiporavo Moneda",
991 "select_hw_account_below": "Eiporavo mávapa cuenta emoĩporã jeýta iguýpe:",
@@ -986,6 +995,9 @@
995 "select_network_title": "Eiporavo Red",
996 "select_other_wallet": "Eiporavo ambue billetera",
997 "select_receiver": "Eiporavo Mbyhyha",
998 + "select_recipient_network": "Eiporavo Red de Recipientes rehegua",
999 + "select_recipient_network_description": "Heta red ojoaju pe dirección receptor oñemeꞌeva ndive",
1000 + "select_recipient_network_for_tx": "Eiporavo red Recipiente rehegua ko tembiaporãme",
1001 "select_sell_provider_notice": "Eiporavo yvate peteĩ ñemuha. Ikatu rehasa hag̃ua ko pantalla emoĩvo nde ñemuha ijypykuéramo umi ñemboheko hag̃ua aplicación-pe.",
1002 "select_token": "Eiporavo Token",
1003 "select_your_country": "Eiporavo ne tetã",
@@ -1018,6 +1030,8 @@
1030 "send_templates": "Plantillas",
1031 "send_title": "Emondo",
1032 "send_to": "Emondo hag̃ua",
1033 + "send_to_network": "Emondo ${network}-pe.",
1034 + "send_to_network_description": "¿Embohasase nde ${network} billetera-pe térã rembohasase nde ${currentNetwork} viru ko jehepyme’ẽ rehe?",
1035 "send_to_this_address": "Emondo ${currency} ${tag}ko dirección-pe",
1036 "send_xmr": "Emondo XMR",
1037 "send_your_wallet": "Nde billetera",
@@ -1136,6 +1150,8 @@
1150 "support_title_other_links": "Ambue juaju pytyvõ rehegua",
1151 "supported": "Ojepytyvõva",
1152 "swap": "Swap",
1153 + "swap_from_network": "Embohasa ${network} guive.",
1154 + "swap_from_network_description": "Emondo hag̃ua viru ${targetNetwork} red-pe, tekotevẽta rembohasa ne ${currentNetwork} viru. ¿Reprocedese piko?",
1155 "swap_id": "ID ñemoambue rehegua",
1156 "swap_provider_initial_desc": "Eiporavo mba’eichagua swap puruhára reipuruséva rembojopyru hag̃ua swap jave.",
1157 "swap_providers": "Proveedor-kuéra intercambio rehegua",
@@ -1143,6 +1159,7 @@
1159 "sweeping_wallet_alert": "Kóva ndoguerahámo’ãi heta aravo. ANI REHEJA KO PANTALLA, térã umi fondo oñemopotĩva ikatu okañy.",
1160 "swipe_to_bridge": "Embosyryry embridge hag̃ua",
1161 "swipe_to_send": "Emoinge hag̃ua emondo hag̃ua.",
1162 + "switch_to_x_wallet": "Embohasa ${network} Wallet-pe",
1163 "switch_wallet": "Emoambue Billetera",
1164 "switchToETHWallet": "Ikatúpa emoambue peteĩ billetera Ethereum-pe ha eha’ãjey.",
1165 "switchToWCCompatibleWallet": "Embohasa peteĩ billetera WalletConnect ndive ha eñeha’ã jey (${chains}).",
@@ -1310,6 +1327,8 @@
1327 "unspent_coins_details_title": "Marandu viru ndojepurukuaáiva rehegua",
1328 "unspent_coins_title": "Viru noñemongu'éiva",
1329 "unsupported_asset": "Ndoroipytyvõi ko tembiapo ko activo-pe g̃uarã. Ikatúpiko emoheñói térã emoambue peteĩ billetera peteĩ activo ojehepytyvõva hag̃ua.",
1330 + "unsupported_network_requested": "Ko mba’ejerure jehepyme’ẽ rehegua ha’e peteĩ red ndoroipytyvõivape g̃uarã (ID cadena ${chainId}).",
1331 + "unsupported_token_requested": "Ko mba’ejerure jehepyme’ẽ rehegua ha’e peteĩ token ndaikatúiva jahechakuaa red ojeporavóvape.",
1332 "uptime": "Ara oĩ hag̃ua",
1333 "upto": "peve ${value}",
1334 "usb": "USB",
@@ -1459,299 +1478,5 @@
1478 "zcash_card_enable_later": "Ikatu emboguata hag̃ua ko tarjeta ag̃ave, ñembohekorãme.",
1479 "zcash_card_missing_funds": "¿Nde fondo okañy?",
1480 "zcash_card_scan": "Escanear",
1462 - "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.",
1463 - "accent_color": "Sa'y acento",
1464 - "add_passphrase": "Embojoapy Passphrase",
1465 - "add_passphrase_warning_text": "Emoinge passphrase ramo añoite reipuru ra'ekue peteĩ ko billetera-pe yma. Remoingéramo passphrase hekope'ỹva térã ndereipuruiva'ekue passphrase ko billetera-pe, ndahecha mo'ãi mba'eve nde viru oĩva térã rembiasakue.",
1466 - "add_token": "Embojoapy Token",
1467 - "added_message_for_ata_error": "Ehecha porãke eguereko hetakue SOL saldo emohu'ã hag̃ua ne transacción.",
1468 - "alert_notice": "Marandu",
1469 - "all_coins": "Opaite Moneda",
1470 - "appearance": "Jehechaha",
1471 - "approve_request": "Emoneĩ Jerure",
1472 - "approve_tokens": "Emoneĩ token-kuéra",
1473 - "arbiscan_history": "ArbiScan rembiasakue",
1474 - "are_you_sure_exit": "¿Reime añetehápe resẽse?",
1475 - "available": "Oĩva",
1476 - "background_sync": "Ñembojuehe tapykuegua",
1477 - "background_sync_on_battery_low": "Embojuehe batería sa'ív>ramo",
1478 - "background_sync_on_charging": "Embojuehe oñembohyru jave añoite",
1479 - "background_sync_on_device_idle": "Embojuehe pe mba'e'oka ojepuru'ỹrõ añoite",
1480 - "background_sync_on_unmetered_network": "Oñeikotevẽ ñanduti ndojehepyme'ẽiva (unmetered)",
1481 - "basescan_history": "BaseScan rembiasakue",
1482 - "bitcoin_lightning_deposit": "Depósito",
1483 - "bitcoin_lightning_withdraw": "Ñeguenohẽ",
1484 - "block_height": "Bloque yvate (block height)",
1485 - "bridging": "Bridging",
1486 - "buy_sell_pair_is_not_supported_warning": "Ko par moneda rehegua ndojepytyvõi mavave me'ẽhágui pe jehepyme'ẽrã ojeporavóvape. Eiporavo ambue par térã eha'ã emoambue pe jehepyme'ẽrã.",
1487 - "cake_pay_card_email_delivered_message": "Ne tarjeta regalo og̃uahẽta correo rupive umi ñemoañete tekotevẽva rire.",
1488 - "cake_seeds_save_disclaimer": "Eñongatúke ko'ã ñe'ẽ peteĩ tenda hekorosãvape! Reikotevẽta ko'ã ñe'ẽ emoĩporã jey hag̃ua ne billetera peteĩ mba'e'oka pyahúpe.",
1489 - "cakepay_confirm_no_vpn": "Amoneĩ ndaipuruiha Proxy térã VPN",
1490 - "cakepay_confirm_purchase": "Emoneĩ Jejogua",
1491 - "cakepay_confirm_terms_agreed": "Amoneĩ umi término ha condición ojehechaukáva ko'ápe:",
1492 - "cakepay_confirm_voided_refund": "Aikũmby umi ñeha'ã reñemboguevi hag̃ua peteĩ tetã jejokopyrégui omboguéta oimeraẽ reembolso",
1493 - "cakepay_ios_not_available": "Ñembyasy, ko tarjeta regalo ndaipóri iOS-pe. Ikatu rejogua Android-pe térã ore web rupive.",
1494 - "chain_id": "Chain ID",
1495 - "change_selected_exchanges": "Emoambue umi Intercambio Ojeporavóva",
1496 - "change_selected_pair": "Emoambue Par Ojeporavóva",
1497 - "choose_a_payment_method": "Eiporavo peteĩ jehepyme'ẽrã",
1498 - "choose_a_provider": "Eiporavo peteĩ me'ẽha",
1499 - "choose_qr_code_format": "Eiporavo QR Code Formáto",
1500 - "choose_qr_code_format_note": "Eiporavo pe formáto hekopegua ne hardware wallet-pe g̃uarã:",
1501 - "choose_wallet_group": "Eiporavo Billetera Atyrã (Wallet Group)",
1502 - "collection_address": "Colección Kundaharape",
1503 - "collection_description": "Colección Ñemombe'u",
1504 - "collection_name": "Colección Téra",
1505 - "coming_soon_tag": "Og̃uahẽ pototáma",
1506 - "compatible_services": "Servicio-kuéra Ojokupytýva",
1507 - "compatible_services_desc": "Eipuru pe Scan tembiporu emoñe'ẽ hag̃ua ko'ã QR código Cake Wallet oipytyvõva:",
1508 - "confirm_passphrase": "Emoneĩ passphrase",
1509 - "confirm_transaction": "Emoneĩ transacción",
1510 - "connect_hw_info_step_1": "Ehecha porã ne mba'e'oka hendyha (ON).",
1511 - "connect_hw_info_step_2": "Emyendy Bluetooth mokõive mba'e'okápe ha embojoaju pe teléfono guive, TÉRÃ embojoaju ne mba'e'okakuéra peteĩ cable USB rupive.",
1512 - "connect_hw_info_step_3": "Eipe'a ne mba'e'oka ha eho pe cripto app reipotávape.",
1513 - "connect_hw_info_step_4": "Eiporavo ne mba'e'oka Cake Wallet-pe ha eku'ejey pe ñembosako'i ndive.",
1514 - "connect_your_hardware_wallet_ble": "Embojoaju ne hardware wallet Bluetooth rupive",
1515 - "connect_your_hardware_wallet_usb": "Embojoaju ne hardware wallet USB rupive",
1516 - "connected": "Oñembojoaju",
1517 - "contact_name_exists": "Oĩma peteĩ contacto ko téra reheve. Eiporavo ambue téra.",
1518 - "contract_address": "Contrato Kundaharape",
1519 - "copy_payjoin_address": "Emonguatia Payjoin Kundaharape",
1520 - "copy_payjoin_url": "Emonguatia Payjoin URL",
1521 - "corrupted_seed_notice": "Ko billetera marandurenda oñembyai ha ndaikatúi ojepe'a. Ehecha pe seed, eñongatu, ha emoĩporã jey pe billetera.\n\nPe tepykue nandíramo, pe seed ndaikatúi oñemoĩporã hekopete.",
1522 - "create_new_seed": "Emoheñói Seed Pyahu",
1523 - "crypto_addresses": "Cripto Kundaharape-kuéra",
1524 - "customBackgroundDescription": "Eguerekóma peteĩ background ne mba'éva.\\nReipota emyengovia térã embogue?",
1525 - "decred_info_card_details": "Decred oipuru peteĩ ñembojuehe descentralizado ha oñangarekóva tekoñemíre, 'SPV' hérava, ohóva hi'are vyterei peteĩ Bitcoin billetera tee-gui. Reikuaave hag̃ua, eikutu iguýpe.",
1526 - "decred_info_title": "Ñembojuehe Decred-pe",
1527 - "delete_this_node": "Embogue ko nodo",
1528 - "deuro_about_deuro": "dEURO rehegua",
1529 - "deuro_collect_interest": "Embyaty",
1530 - "deuro_reinvest_interest": "Einvertí jey",
1531 - "deuro_savings": "dEuro Ñongatu",
1532 - "deuro_savings_add": "Depósito",
1533 - "deuro_savings_approve_app": "Emoneĩ App",
1534 - "deuro_savings_approve_app_description": "Eheja pe dEURO smart contract oñangareko ne dEURO token-kuérare ñongatúpe g̃uarã, ha katu ndaikatumo'ãi omondo térã ohupyty ne dEURO.",
1535 - "deuro_savings_available_to_add": "Ojepurukuaáva embojoapy hag̃ua",
1536 - "deuro_savings_available_to_remove": "Ojepurukuaáva eipe'a hag̃ua",
1537 - "deuro_savings_balance": "Ñongatu Saldo",
1538 - "deuro_savings_balance_tooltip": "Kóva ohechauka ne ñongatu saldo ko'ag̃agua, ohupytýva interés ára ohasávo. Ikatu redepositá térã reguenohẽ ne dEURO oimeraẽ ára.",
1539 - "deuro_savings_collect_interest": "Embyaty interés",
1540 - "deuro_savings_collect_interest_tooltip": "Kóva ohechauka ne interés rehupytýmava, ikatúva embyaty ne dEURO saldo-pe oimeraẽ ára.",
1541 - "deuro_savings_remove": "Ñeguenohẽ",
1542 - "deuro_savings_set_approval": "Emoĩ ñemoneĩ",
1543 - "deuro_savings_subtitle": "Eg̃ana 10% peve interés ne dEuro Stablecoin rehe",
1544 - "deuro_savings_welcome_description": "dEURO ha'e peteĩ stablecoin descentralizado ha colateralizado, ojoajúva Euro-re — hekorosã, ojepuruporãva, ha noñembyaikuaáiva oraculo-re ojejerovia'ỹre. 1 dEURO = 1 EURO.",
1545 - "deuro_tooltip_no_eth": "Emboguata hag̃ua dEURO, tekotevẽ ereko ETH ne billetera-pe.",
1546 - "deuro_tx_commited_content": "Ikatu ohasa mokõi-mbohapy segundo pe transacción oñemoneĩ ha ojehechauka hag̃ua pantalla-pe",
1547 - "device_confirmation": "Mba'e'oka Ñemoneĩ",
1548 - "device_is_signing": "Pe mba'e'oka oñemboheraguapýhína",
1549 - "disable_automatic_exchange_status_updates": "Embogue Intercambio Tekotee Ñembohekopyahu Ijeheguíva",
1550 - "disable_exchange_option": "Embogue Intercambio jeporavorã",
1551 - "disable_tor": "Embogue Tor",
1552 - "disable_trade_option": "Embogue ñemu jeporavorã",
1553 - "done": "Oĩmbáma",
1554 - "enable": "Emboguata",
1555 - "enable_auto_node_switching": "Emboguata Nodo Ñemoambue Ijeheguíva",
1556 - "enable_builtin_tor": "Emboguata Tor oñembojoajupyréva",
1557 - "enable_for_auto_switching": "Emboguata Ñemoambue Ijehegui-rã",
1558 - "enable_mempool_api": "Mempool API hepyme'ẽ ha arange hekopeguáva g̃uarã",
1559 - "error_while_processing": "Oiko peteĩ jejavy oñeprocesa aja",
1560 - "establishing_tor_connection": "Oñemboheko hína Tor jeikeha",
1561 - "eta": "ETA",
1562 - "ethereum_ecosystem": "Ethereum Ecosistema",
1563 - "evm_ecosystem_description": "Tekotevẽramo, emoambue pe red ha token reipuruséva ko jehepyme'ẽme g̃uarã.",
1564 - "exchange_extra_info": "Anike nde resarái emombe'u hag̃ua pe Memo térã Extra ID emondóvo ko transacción intercambio-rã",
1565 - "exchange_trade_result_confirm": "Eikutúvo emondo Cake Wallet guive, remondóta ${fetchingLabel} ${from} ne billetera hérava ${walletName} guive pe kundaharape ojehechaukáva yvýpe. Térã ikatu remondo ne billetera okapegua guive pe kundaharape/QR código oĩva 'send from external wallet' kuatiarogue-pe.\n\nEikutúke oimeraẽ botõ resegí hag̃ua térã ejevy emoambue hag̃ua umi monto.",
1566 - "export_logs": "Emondo registro-kuéra",
1567 - "export_outputs": "Emondo outputs",
1568 - "extend_session": "Embotuichave Sesión",
1569 - "favorite_token": "Token ojehayhúva",
1570 - "favorite_token_desc": "Pe token ojehayhúva saldo ojehechaukáta pe saldo tarjeta-pe.",
1571 - "fee_less_than_min": "Pe hepyme'ẽ ojeporavóva michĩve pe mínimo-gui; embohetave pe hepyme'ẽ ikatu hag̃ua remondo pe transacción",
1572 - "fee_rate": "Hepyme'ẽ tasa",
1573 - "file_saved": "Marandurenda oñeñongatúma",
1574 - "from": "Guive",
1575 - "frozen_balance": "Saldo Oñembotýva",
1576 - "gallery": "Galería",
1577 - "gas_exceeds_allowance": "Pe gas oikotevẽva transacción rupi ohasa pe ñemoneĩ (allowance).",
1578 - "gas_price": "Gas repy",
1579 - "generating_transaction": "Oñemoheñói hína transacción",
1580 - "hidden_addresses": "Kundaharape Kañymby-kuéra",
1581 - "hide": "Mokañy",
1582 - "how_to_connect": "Mba'éichapa Oñembojoaju",
1583 - "hww_exit_desc": "Kóva omboty pe joaju oikóva ne hardware mba'e'oka ndive",
1584 - "incorrect_seed_option": "Hekope'ỹ. Eha'ã jey",
1585 - "incorrect_seed_option_back": "Hekope'ỹ. Ehecha porãke ne seed oñeñongatu hekopete ha eha'ã jey.",
1586 - "input": "Jeikeha (input)",
1587 - "insufficient_funds_for_tx": "Ndaipóri viru he'íva emohu'ã hag̃ua pe transacción.",
1588 - "insufficientFundsForRentErrorReceiver": "Pe ohupytýva cuenta ndoguerekói SOL he'íva ohepyme'ẽ hag̃ua pe renta. Ejerure pe ohupytývape ombojoapy hetave SOL icuenta-pe.",
1589 - "keys": "Llave-kuéra",
1590 - "legacy": "Legacy",
1591 - "litecoin_enable_mweb_sync": "Emboguata MWEB jeheka (scanning)",
1592 - "litecoin_mweb": "MWEB",
1593 - "litecoin_mweb_allow_coins": "Eheja MWEB moneda-kuéra",
1594 - "litecoin_mweb_always_scan": "Emoĩ MWEB ojeheka katuete hag̃ua",
1595 - "litecoin_mweb_description": "MWEB ha'e peteĩ protocolo pyahu ogerúva transacción ipya'eve, hepyve'ỹva ha tekoñemívéva Litecoin-pe",
1596 - "litecoin_mweb_dismiss": "Mboyke",
1597 - "litecoin_mweb_display_card": "Ehechauka MWEB tarjeta",
1598 - "litecoin_mweb_enable": "Emboguata MWEB",
1599 - "litecoin_mweb_enable_later": "Ikatu eiporavo emboguata jey MWEB Display Settings guýpe.",
1600 - "litecoin_mweb_logs": "MWEB Logs",
1601 - "litecoin_mweb_node": "MWEB Nodo",
1602 - "litecoin_mweb_pegin": "Peg In",
1603 - "litecoin_mweb_pegout": "Peg Out",
1604 - "litecoin_mweb_scanning": "MWEB Jeheka",
1605 - "litecoin_mweb_settings": "MWEB ñemboheko",
1606 - "litecoin_mweb_warning": "MWEB jeporu ñepyrũrã omboguejýta ~600MB datos, ha ikatu ohupyty 30 aravo'i peve ñanduti pya'ekue heuti. Ko datos ñepyrũrã omboguejy peteĩ jeýnte ha oĩta opaite Litecoin billetera-pe g̃uarã",
1607 - "litecoin_what_is_mweb": "¿Mba'épa MWEB?",
1608 - "made_easy": "hasy'ỹre",
1609 - "manual_input": "Jeikeha pópe (manual)",
1610 - "messages": "Marandu-kuéra",
1611 - "method": "Mba'éichapa",
1612 - "mint_address": "Mint Kundaharape",
1613 - "moralis_nft_error": "Oiko peteĩ jejavy oñembyaty aja umi NFT. Ehecha porãke ne ñanduti joaju ha eha'ã jey.",
1614 - "multiple_addresses_detected": "Heta kundaharape ojejuhu",
1615 - "mweb_confirmed": "MWEB Oñemoañetéva",
1616 - "mweb_unconfirmed": "MWEB Noñemoañetéiva",
1617 - "networks": "Red-kuéra",
1618 - "new_tag": "Pyahu",
1619 - "new_transactions_notifications": "Emondo marandu'i umi transacción pyahúre",
1620 - "no_extra_detail": "Ndaipóri mba'ekuaarã adicional",
1621 - "no_providers_available": "Ndaipóri me'ẽha oĩva",
1622 - "node_share_desc": "Emoñe'ẽ ko QR código pe Scan kuatiarogue-gui egueru hag̃ua ko nodo.",
1623 - "nodes_desc": "Emohenda umi nodo oĩva térã embojoapy peteĩ ne mba'éva.",
1624 - "notification_permission_denied": "Pe marandu'i ñemoneĩ oñemboty opaite g̃uarãma; emboguata po rupi ñembohekópe",
1625 - "ocp_desc": "Ehepyme'ẽ cripto-pe ñemuhakuérape",
1626 - "oled_mode": "OLED modo",
1627 - "open_wallet": "Eipe'a Billetera",
1628 - "overshot": "Ohasa hetave (overshot)",
1629 - "pairing_code": "Pairing Código",
1630 - "pairing_code_desc_1": "Ne mba'e'oka ohechaukáta peteĩ pairing código.",
1631 - "pairing_code_desc_2": "Emoinge ko'ápe resegí hag̃ua",
1632 - "pairing_error": "Pairing Jejavy",
1633 - "passphrase_view_keys": "Passphrase",
1634 - "passphrases_doesnt_match": "Umi passphrase ndojojái, eha'ã jey",
1635 - "payjoin_card_content": "Payjoin ha'e peteĩ tembiapoite pyahu oñangarekóva tekoñemíre ha oñongatúva hepyme'ẽ Bitcoin-pe.",
1636 - "payjoin_details": "Payjoin mba'ekuaarã",
1637 - "payjoin_enabled": "Payjoin oñemboguatáva",
1638 - "payjoin_enabling_popup_content": "Ikatu emyendy/embogue Payjoin Menú → Privacy → Use Payjoin guýpe upéi.",
1639 - "payjoin_enabling_popup_title": "Payjoin Ñemboguata",
1640 - "payjoin_request_awaiting_tx": "Oha'arõ Transacción",
1641 - "payjoin_request_in_progress": "Oikohína",
1642 - "payjoin_unavailable": "Payjoin ndojepurukuaái",
1643 - "payjoin_unavailable_sheet_content": "Peteĩ Payjoin transacción ohupyty hag̃ua tekotevẽ ereko Bitcoin oĩmbáva reipuru hag̃ua.\n\nNe billetera oguerekóvo viru, Payjoin oñemboguatáta ijeheguíva.",
1644 - "payjoin_unavailable_sheet_title": "¿Mba'érepa Payjoin ndojepurukuaái?",
1645 - "payment_invoices": "Jehepyme'ẽ Kuatiañemuhã-kuéra",
1646 - "payment_made_easy": "Jehepyme'ẽ hasy'ỹre",
1647 - "payments": "Jehepyme'ẽ-kuéra",
1648 - "please_choose_one": "Eiporavo peteĩ",
1649 - "potential_scam": "Ñembotavyrã (Potential Scam)",
1650 - "primary_address": "Kundaharape Mba'eguasu (primary)",
1651 - "processing": "Oñeprocesahína",
1652 - "processing_signed_tx": "Oñeprocesahína transacción oñemboheraguapýva",
1653 - "qr_code_format": "QR Code Formáto",
1654 - "qr_code_format_body": "BCUR (Blockchain Commons Uniform Resources) ha'e pe estándar industria-pegua, ha ojokupyty hetave Bitcoin hardware wallet-kuéra ndive, ha ojeporavova'erã hetavéva puruhárape g̃uarã. BBQR (Better Bitcoin QR) ha'e peteĩ formáto ojepurúva COLDCARD hardware wallet-kuérape añoite, imodelo Q guive.",
1655 - "qr_code_format_note": "Hardware wallet-kuéra iñambuéva oipuru QR código formáto iñambuéva Bitcoin ñe'ãme",
1656 - "qr_instruction": "Eipuru ko kundaharape ehupyty hag̃ua oimeraẽ token térã coleccionable ko'ápe:",
1657 - "reconnect_your_hardware_wallet": "Embojoaju jey ne Hardware Wallet",
1658 - "replace": "Emyengovia",
1659 - "requested": "Ojejeruréva",
1660 - "required_passphrase": "Passphrase",
1661 - "restore": "Emoĩporã jey",
1662 - "restore_description_from_cupcake": "Embojoaju ore irũ app air-gapped ndive, oñemohendáva ambue teléfono-pe.",
1663 - "restore_existing_wallet": "Emoĩporã jey Billetera Oĩmava",
1664 - "restore_title_from_cupcake": "Cupcake App",
1665 - "save_contact": "Eñongatu Contacto",
1666 - "security": "Tekorosã",
1667 - "seed_display_path": "Menú → Security and Backup → Show key/seeds",
1668 - "seed_position_question_one": "¿Mba'épa pe",
1669 - "seed_position_question_two": "ñe'ẽ ne seed-gui?",
1670 - "seed_verified": "Seed Ojehechajeýva",
1671 - "seed_verified_subtext": "Ikatu reipuru ne seed oñeñongatúva upéi emoĩporã jey hag̃ua ko billetera oñembyai térã ne mba'e'oka okañy ramo.\n\nIkatu rehecha jey ko seed ko'águi:",
1672 - "seedtype_alert_content": "Seed ñembohasa ambue billetera ndive ikatúnte BIP39 SeedType reheve.",
1673 - "seedtype_alert_title": "SeedType Marandu",
1674 - "select_a_wallet": "Eiporavo peteĩ billetera",
1675 - "select_hw_account_below": "Eiporavo mávapa cuenta emoĩporã jeýta iguýpe:",
1676 - "select_manufacturer_title": "Eiporavo Fabricante",
1677 - "select_network": "Eiporavo Red",
1678 - "select_token": "Eiporavo Token",
1679 - "select_your_country": "Eiporavo ne tetã",
1680 - "selected_trocador_provider": "Trocador me'ẽha ojeporavóva",
1681 - "send_change_to_you": "Ñemoambue, ndéve:",
1682 - "send_from_cake_wallet": "Emondo Cake Wallet guive",
1683 - "send_from_external_wallet": "Emondo Billetera Okapegua guive",
1684 - "send_payjoin": "Emondo Payjoin",
1685 - "set_a_pin": "Emoĩ peteĩ PIN",
1686 - "set_up_a_wallet": "Embosako'i peteĩ Billetera",
1687 - "share_this_node": "Emoherakuã ko nodo",
1688 - "shared_seed_wallet_groups": "Billetera Atyrã Seed Ojoja'ekuéva",
1689 - "show": "Hechauka",
1690 - "show_address_book_popup": "Ehechauka Address Book popup",
1691 - "show_balance": "Eipoko Puku Ehechauka hag̃ua Saldo",
1692 - "show_balance_toast": "Eipoko puku emokañy térã ehechauka hag̃ua saldo",
1693 - "show_combined_balance": "Ehechauka saldo ojembyatypyréva",
1694 - "sign_all": "Emboheraguapy Opaite",
1695 - "sign_one": "Emboheraguapy Peteĩ",
1696 - "silent_payment": "Silent Payment",
1697 - "silent_payments_logs": "Silent Payment Logs",
1698 - "single_seed_wallets_group": "Billetera Seed Peteĩva",
1699 - "solana_create_associated_token_account_exception": "Jejavy oñemoheñói aja pe associated token account pe ohupytýva kundaharapépe.",
1700 - "solana_no_associated_token_account_exception": "Ndaipóri associated token account ko kundaharapépe.",
1701 - "solana_sign_native_transaction_rent_exception": "Ndaikatúi oñemohu'ã pe transacción. Ndaipóri SOL hembýva pe renta-rã pe transacción rire. Embohetave ne SOL saldo térã emomichĩ pe SOL remondóva.",
1702 - "solana_sign_spl_token_transaction_rent_exception": "Ndaikatúi oñemohu'ã pe transacción. Ndaipóri SOL hembýva pe renta-rã pe transacción rire. Embohetave ne SOL saldo.",
1703 - "starting_tor_proxy": "Oñepyrũhína Tor proxy",
1704 - "step": "Pa'ũ (step)",
1705 - "success": "Oiko porã",
1706 - "supported": "Ojepytyvõva",
1707 - "swap": "Swap",
1708 - "swipe_to_bridge": "Embosyryry embridge hag̃ua",
1709 - "switch_wallet": "Emoambue Billetera",
1710 - "sync_status_attempting_scan": "OÑEHA'Ã ESCANEO",
1711 - "sync_status_display_mode": "Ñembojuehe Tekotee Jehechauka",
1712 - "sync_status_display_mode_blocks": "Ehechauka Bloque Hembýva",
1713 - "sync_status_display_mode_eta": "Ehechauka ETA",
1714 - "synchronizing": "Oñembojuehehína",
1715 - "this_can_take_few_seconds": "Kóva ikatu ohupyty mbovymi segundo",
1716 - "this_pair_is_not_supported_warning": "Ko par ndojokupytýi umi intercambio ojeporavóva ko'ag̃agua ndive. Eiporavo ambue intercambio.",
1717 - "to": "Peve (To)",
1718 - "token_already_exists": "Pe token oĩma",
1719 - "tokens_strong_warning": "¡Anive remondo token ko kundaharapépe!",
1720 - "tor_connection_timeout": "Tor jeikeha ohasáma aravo",
1721 - "tor_experimental": "Kóva ha'e peteĩ tembiapoite experimental, ndaha'éi opaite joaju Cake Wallet guive oipytyvõ Tor ruteo — oĩ joaju oipurúva clearnet; ruteo hag̃ua opaite app tráfico eipuru Tor VPN modo ndive.",
1722 - "transaction_cost": "Transacción Repykue",
1723 - "transport_type": "Transporte Mba'eichagua",
1724 - "try_again": "Eha'ã jey",
1725 - "tx_commit_failed_no_peers": "Pe transacción ndaikatúi oñemyasãi, eha'ã jey peteĩ segundo-pe",
1726 - "unrestricted_background_service": "Servicio tapykuegua ñemboaty'ỹ (unrestricted)",
1727 - "unrestricted_background_service_notice": "Emboguata hag̃ua ñembojuehe tapykuegua tekotevẽ emboguata servicio tapykuegua ñemboaty'ỹ",
1728 - "use_device_theme": "Eipuru Mba'e'oka Téma",
1729 - "use_payjoin": "Eipuru Payjoin",
1730 - "user_rejected_method": "Puruhára ombotove pe método",
1731 - "username_check_your_network": "Ndaikatúi ojehechajey pe puruhára réra. Ehecha ne ñanduti joaju.",
1732 - "verify_seed": "Ehechajey Seed",
1733 - "verifying_code": "Oñehechajeýhína Código",
1734 - "wallet": "Billetera",
1735 - "wallet_balance": "Billetera Saldo",
1736 - "wallet_group": "Billetera Atyrã (Wallet Group)",
1737 - "wallet_group_description_existing_seed": "Reiporavo reipuru hag̃ua peteĩ seed oĩmava ko billetera-pe. Ikatu rehechajey jey pe seed reikotevẽrõ emoneĩ térã rehai.",
1738 - "wallet_group_description_four": "emoheñói hag̃ua peteĩ billetera seed ipyahúva reheve.",
1739 - "wallet_group_description_one": "Cake Wallet-pe, ikatu emoheñói peteĩ",
1740 - "wallet_group_description_open_wallet": "Ndaupéichairõ, ikatu eku'ejey eipe'a hag̃ua pe billetera",
1741 - "wallet_group_description_three": "ehecha hag̃ua umi billetera ha/térã billetera atyrã kuatiarogue. Térã eiporavo",
1742 - "wallet_group_description_two": "eiporavóvo peteĩ billetera oĩmava emoherakuã hag̃ua peteĩ seed hendive. Peteĩteĩ billetera atyrã ikatu oguereko peteĩ billetera moneda mba'eichagua-pe.\n\nIkatu eiporavo",
1743 - "wallet_group_description_view_seed": "Ikatu rehecha jey ko seed ko'águi",
1744 - "wallet_group_empty_state_text_one": "Ndereguerekóiramoguáicha mavave billetera atyrã ojokupytýva.\n\nEikutu",
1745 - "wallet_group_empty_state_text_two": "iguýpe emoheñói hag̃ua peteĩ pyahu.",
1746 - "wallet_has_passphrase": "Ko billetera oguereko peteĩ passphrase",
1747 - "wallet_list_edit_group_name": "Embosako'i Atyrã Téra",
1748 - "wc_desc": "Embojoaju hasy'ỹre DApp-kuérandi",
1749 - "website": "Website",
1750 - "welcome_subtitle_new_wallet": "Reñepyrũségui pyahúgui, eikutu Create New Wallet iguýpe ha reñepyrũta.",
1751 - "welcome_subtitle_restore_wallet": "Ereko ramo peteĩ billetera oĩmava regueruséva Cake-pe, eiporavónte Restore Existing Wallet ha rohechaukáta ndéve mba'éichapa.",
1752 - "what_is_payjoin": "¿Mba'épa Payjoin?",
1753 - "yes_exit": "Hẽe. Esẽ",
1754 - "you_will_receive_estimated_amount": "Rehupytýta (jehaipyre)",
1755 - "youCanGoBackToYourDapp": "Ikatúma rejevy ne dApp-pe",
1756 - "your": "Nde"
1757 -}
1481 + "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."
1482 +}
\ No newline at end of file
res/values/strings_ha.arb
+21 -36
@@ -94,6 +94,7 @@
94 "available_balance": "Ma’aunin da ake da shi",
95 "available_balance_description": "“Ma'aunin da ake da shi” ko “Tabbataccen Ma'auni” su ne kuɗaɗen da za a iya kashewa nan take. Idan kuɗaɗe sun bayyana a ƙananan ma'auni amma ba a babban ma'auni ba, to dole ne ku jira 'yan mintoci kaɗan domin kuɗaɗen da ke shigowa su sami ƙarin tabbaci daga hanyar sadarwa. Bayan sun sami ƙarin tabbaci, za a iya kashe su.",
96 "avg_savings": "Matsakaitan Ajiya",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Da fatan za a jira dApp ya kammala sarrafawa.",
99 "awaiting_payment_confirmation": "Ana jiran Tabbacin Biyan Kuɗi",
100 "background_sync": "Aiki tare a bango",
@@ -219,6 +220,7 @@
220 "color_theme": "Jigon launi",
221 "coming_soon_tag": "Zai zo nan ba da jimawa ba",
222 "commit_transaction_amount_fee": "Tabbatar da ma'amala\nAdadi: ${amount}\nKuɗi: ${fee}",
223 + "compatible_networks": "Hanyoyin sadarwa masu jituwa",
224 "compatible_services": "Sabis masu jituwa",
225 "compatible_services_desc": "Yi amfani da kayan aikin Scan don karanta nau'ikan QR code masu zuwa da Cake Wallet ke goyon baya:",
226 "configure": "Saita",
@@ -258,6 +260,7 @@
260 "contact_support": "Tuntuɓi Tallafi",
261 "contacts": "Abokan hulɗa",
262 "continue_text": "Ci gaba",
263 + "continue_to_swap": "Ci gaba don Musanya",
264 "contract_address": "Adireshin kwantiragi",
265 "contract_warning": "An yi wa wannan adireshin kwangila alama a matsayin mai yiwuwar zamba. Da fatan za a ci gaba da taka tsantsan.",
266 "contractName": "Sunan Yarjejeniya",
@@ -286,6 +289,7 @@
289 "creation_date": "Ranar ƙirƙira",
290 "crypto_addresses": "Adiresoshin crypto",
291 "csv_nothing_to_export": "Babu abin da za a fitar",
292 + "current_network": "Yanar Gizo na Yanzu",
293 "current_swap": "Musayar Yanzu",
294 "current_wallet": "Walit na yanzu",
295 "custom": "Na musamman",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Tarihin Etherscan",
448 "event": "Taron",
449 "events": "Abubuwan da suka faru",
450 + "evm_address_detected": "An Gano Adireshin EVM",
451 "evm_ecosystem_description": "Idan ya zama dole, gyara hanyar sadarwa da token ɗin da kake son amfani da su don wannan biyan.",
452 "exchange": "Musanya",
453 "exchange_extra_info": "Don Allah kar ku manta ku saka Memo ko Extra ID yayin aika wannan ma'amala domin musayar",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Duk sabbin samfura (GPT-5.3, Claude 4.6).\nBabu biyan kuɗin rajista, biya da crypto.",
670 "narrow": "Kunkuntar",
671 "network": "Hanyar sadarwa",
672 + "network_address_detected": "An gano adireshin ${network}",
673 + "network_prefix_on": "kan",
674 + "network_switch_failed": "An kasa canzawa zuwa cibiyar sadarwar da ake nema. Ba a yi amfani da kuɗin ba, da fatan za a sake gwadawa.",
675 "networks": "Hanyoyin sadarwa",
676 "new_first_wallet_text": "Kare kuɗin crypto ɗinka cikin aminci abu ne mai sauƙi",
677 "new_node_testing": "Gwajin sabon node",
@@ -973,6 +981,7 @@
981 "select_asset": "Zaɓi Kadari",
982 "select_backup_file": "Zaɓi fayil ɗin ajiyar baya",
983 "select_buy_provider_notice": "Zaɓi mai ba da sabis na saye a sama. Za ka iya tsallake wannan allon ta hanyar saita tsohon mai ba da sabis na saye a cikin saitunan manhaja.",
984 + "select_compatible_wallet": "Zaɓi ɗaya daga cikin walat ɗin ku masu jituwa",
985 "select_destination": "Da fatan za a zaɓi wurin da za a ajiye fayil ɗin madadin.",
986 "select_fiat_currency_title": "Zaɓi Kuɗi",
987 "select_hw_account_below": "Da fatan za a zaɓi asusun da za a maido a ƙasa:",
@@ -982,6 +991,9 @@
991 "select_network_title": "Zaɓi hanyar sadarwa",
992 "select_other_wallet": "Zaɓi wata Wallet",
993 "select_receiver": "Zaɓi Mai karɓa",
994 + "select_recipient_network": "Zaɓi Cibiyar Sadarwar Mai karɓa",
995 + "select_recipient_network_description": "Cibiyoyin sadarwa da yawa sun dace da adireshin mai karɓa da aka bayar",
996 + "select_recipient_network_for_tx": "Zaɓi hanyar sadarwar mai karɓa zuwa wannan ma'amala",
997 "select_sell_provider_notice": "Zaɓi mai ba da sabis na sayarwa a sama. Kuna iya tsallake wannan allon ta saita tsohon mai ba da sabis na sayarwa a cikin saitunan app.",
998 "select_token": "Zaɓi Token",
999 "select_your_country": "Da fatan zaɓi ƙasarku",
@@ -1014,6 +1026,8 @@
1026 "send_templates": "Samfuri",
1027 "send_title": "Aika",
1028 "send_to": "Aika zuwa",
1029 + "send_to_network": "Aika zuwa ${network}",
1030 + "send_to_network_description": "Kuna so ku canza zuwa jakar kuɗin ku na ${network} ko musanya kuɗin ku ${currentNetwork} don wannan biyan?",
1031 "send_to_this_address": "Aika ${currency} ${tag} zuwa wannan adireshin",
1032 "send_xmr": "Aika XMR",
1033 "send_your_wallet": "Walatin ku",
@@ -1132,6 +1146,8 @@
1146 "support_title_other_links": "Sauran hanyoyin samun tallafi",
1147 "supported": "Ana goyon baya",
1148 "swap": "Musanya",
1149 + "swap_from_network": "Musanya daga ${network}",
1150 + "swap_from_network_description": "Don aika kuɗi zuwa cibiyar sadarwar ${targetNetwork}, kuna buƙatar musanya kuɗin ku ${currentNetwork}. Kuna son ci gaba?",
1151 "swap_id": "ID na Musanya",
1152 "swap_provider_initial_desc": "Zaɓi nau'in mai ba da sabis na musanyawa da ka fi so ka yi amfani da shi lokacin musanyawa",
1153 "swap_providers": "Masu samar da Swap",
@@ -1139,6 +1155,7 @@
1155 "sweeping_wallet_alert": "Wannan bai kamata ya ɗauki lokaci mai tsawo ba. KADA KA BAR WANNAN ALLON KO KUDADEN DA AKA KWASO NA IYA ɓACEWA.",
1156 "swipe_to_bridge": "Zame don gada",
1157 "swipe_to_send": "Zame don aikawa",
1158 + "switch_to_x_wallet": "Canja zuwa ${network} Wallet",
1159 "switch_wallet": "Canja Wallet",
1160 "switchToETHWallet": "Da fatan za a koma zuwa walat ɗin Ethereum kuma a sake gwadawa",
1161 "switchToWCCompatibleWallet": "Da fatan za a canza zuwa WalletConnect mai dacewa da walat kuma a sake gwadawa (${chains}).",
@@ -1305,6 +1322,8 @@
1322 "unspent_coins_details_title": "Cikakkun bayanan tsabar kuɗi da ba a kashe ba",
1323 "unspent_coins_title": "Tsabar kuɗi da ba a kashe ba",
1324 "unsupported_asset": "Ba mu goyi bayan wannan aikin ga wannan kadara ba. Da fatan za a ƙirƙiri ko canza zuwa walat na nau'in kadara da ake tallafawa.",
1325 + "unsupported_network_requested": "Wannan buƙatar biyan kuɗi don hanyar sadarwar da ba mu tallafawa (Chain ID ${chainId}).",
1326 + "unsupported_token_requested": "Wannan buƙatar biyan kuɗi don alamar da ba za mu iya tantancewa ba akan hanyar sadarwar da aka zaɓa.",
1327 "uptime": "Lokacin aiki",
1328 "upto": "har zuwa ${value}",
1329 "usb": "USB",
@@ -1453,39 +1472,5 @@
1472 "zcash_card_enable_later": "Kuna iya kunna wannan katin daga baya a cikin saituna.",
1473 "zcash_card_missing_funds": "Kuɗi sun ɓace?",
1474 "zcash_card_scan": "Duba",
1456 - "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.",
1457 - "are_you_sure_exit": "Kun tabbata kuna so ku fita?",
1458 - "available": "Akwai",
1459 - "bridging": "Ana gada",
1460 - "compatible_services": "Sabis masu jituwa",
1461 - "compatible_services_desc": "Yi amfani da kayan aikin Scan don karanta nau'ikan QR code masu zuwa da Cake Wallet ke goyon baya:",
1462 - "crypto_addresses": "Adiresoshin crypto",
1463 - "delete_this_node": "Share wannan node",
1464 - "device_confirmation": "Tabbatarwa ta na'ura",
1465 - "favorite_token": "Token da aka fi so",
1466 - "favorite_token_desc": "Ma'aunin token da aka fi so zai bayyana a katin ma'auni.",
1467 - "gallery": "Hoton gallery",
1468 - "hww_exit_desc": "Wannan zai kawo ƙarshen aikin haɗawa (pairing) da ke gudana da na'urarka ta hardware",
1469 - "input": "Shigarwa",
1470 - "manual_input": "Shigarwa da hannu",
1471 - "networks": "Hanyoyin sadarwa",
1472 - "node_share_desc": "Duba wannan QR code daga allon Scan don shigo da wannan node.",
1473 - "nodes_desc": "Sarrafa nododi da ke akwai ko ƙara naka na musamman.",
1474 - "ocp_desc": "Biya da crypto a shaguna",
1475 - "pairing_code": "Lambar haɗawa (pairing)",
1476 - "pairing_code_desc_1": "Na'urarka za ta nuna lambar haɗawa (pairing).",
1477 - "pairing_code_desc_2": "Shigar da ita a nan don ci gaba",
1478 - "pairing_error": "Kuskuren haɗawa (pairing)",
1479 - "passphrase_view_keys": "Passphrase",
1480 - "payment_invoices": "Daftarin biyan kuɗi",
1481 - "save_contact": "Ajiye Tuntuɓa",
1482 - "share_this_node": "Raba wannan node",
1483 - "show_combined_balance": "Nuna haɗaɗɗen ma'auni",
1484 - "swipe_to_bridge": "Zame don gada",
1485 - "this_can_take_few_seconds": "Wannan na iya ɗaukar 'yan daƙiƙu kaɗan",
1486 - "username_check_your_network": "An kasa duba sunan mai amfani. Da fatan za a duba haɗin cibiyar sadarwarka.",
1487 - "verifying_code": "Ana tabbatar da lamba",
1488 - "wallet_balance": "Ma'aunin walat",
1489 - "wc_desc": "Haɗa da DApps cikin sauƙi",
1490 - "yes_exit": "Eh. Fita"
1491 -}
1475 + "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."
1476 +}
\ No newline at end of file
res/values/strings_hi.arb
+21 -36
@@ -94,6 +94,7 @@
94 "available_balance": "उपलब्ध शेष राशि",
95 "available_balance_description": "“Available Balance” या “Confirmed Balance” वे धनराशि हैं जिन्हें तुरंत खर्च किया जा सकता है। यदि फंड नीचे वाले बैलेंस में दिखाई देते हैं, लेकिन ऊपर वाले बैलेंस में नहीं, तो आने वाले फंड को नेटवर्क पर और अधिक पुष्टिकरण मिलने के लिए आपको कुछ मिनट इंतज़ार करना होगा। अधिक पुष्टिकरण मिलने के बाद, वे खर्च करने योग्य हो जाएंगे।",
96 "avg_savings": "औसत बचत",
97 + "avl": "अवल",
98 "awaitDAppProcessing": "कृपया dApp की प्रोसेसिंग पूरी होने तक प्रतीक्षा करें।",
99 "awaiting_payment_confirmation": "भुगतान पुष्टि की प्रतीक्षा में",
100 "background_sync": "बैकग्राउंड सिंक",
@@ -219,6 +220,7 @@
220 "color_theme": "रंग थीम",
221 "coming_soon_tag": "जल्द आ रहा है",
222 "commit_transaction_amount_fee": "लेन-देन कमिट करें\nराशि: ${amount}\nशुल्क: ${fee}",
223 + "compatible_networks": "संगत नेटवर्क",
224 "compatible_services": "संगत सेवाएँ",
225 "compatible_services_desc": "Cake Wallet पर समर्थित निम्न प्रकार के QR कोड पढ़ने के लिए स्कैन टूल का उपयोग करें:",
226 "configure": "कॉन्फ़िगर करें",
@@ -258,6 +260,7 @@
260 "contact_support": "सपोर्ट से संपर्क करें",
261 "contacts": "संपर्क",
262 "continue_text": "जारी रखें",
263 + "continue_to_swap": "स्वैप करना जारी रखें",
264 "contract_address": "कॉन्ट्रैक्ट पता",
265 "contract_warning": "इस कॉन्ट्रैक्ट पते को संभावित रूप से धोखाधड़ी वाला चिह्नित किया गया है। कृपया सावधानी बरतते हुए आगे बढ़ें।",
266 "contractName": "कॉन्ट्रैक्ट का नाम",
@@ -286,6 +289,7 @@
289 "creation_date": "निर्माण तिथि",
290 "crypto_addresses": "क्रिप्टो पते",
291 "csv_nothing_to_export": "निर्यात करने के लिए कुछ नहीं है",
292 + "current_network": "वर्तमान नेटवर्क",
293 "current_swap": "वर्तमान स्वैप",
294 "current_wallet": "वर्तमान वॉलेट",
295 "custom": "कस्टम",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Etherscan इतिहास",
448 "event": "इवेंट",
449 "events": "इवेंट्स",
450 + "evm_address_detected": "ईवीएम एड्रेस का पता चला",
451 "evm_ecosystem_description": "यदि आवश्यक हो, तो इस भुगतान के लिए आप जिस नेटवर्क और टोकन का उपयोग करना चाहते हैं, उसे संशोधित करें।",
452 "exchange": "एक्सचेंज",
453 "exchange_extra_info": "कृपया एक्सचेंज के लिए यह लेनदेन भेजते समय मेमो या अतिरिक्त ID निर्दिष्ट करना न भूलें",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "सभी नवीनतम मॉडल (GPT-5.3, Claude 4.6)।\nकोई सब्सक्रिप्शन नहीं, क्रिप्टो से भुगतान करें।",
670 "narrow": "संकीर्ण",
671 "network": "नेटवर्क",
672 + "network_address_detected": "${network} पता मिला",
673 + "network_prefix_on": "पर",
674 + "network_switch_failed": "अनुरोधित नेटवर्क पर स्विच करने में विफल. भुगतान लागू नहीं हुआ, कृपया पुनः प्रयास करें।",
675 "networks": "नेटवर्क",
676 "new_first_wallet_text": "अपने क्रिप्टो को सुरक्षित रखना बहुत आसान है",
677 "new_node_testing": "नए नोड का परीक्षण",
@@ -973,6 +981,7 @@
981 "select_asset": "संपत्ति का चयन करें",
982 "select_backup_file": "बैकअप फ़ाइल चुनें",
983 "select_buy_provider_notice": "ऊपर किसी खरीद प्रदाता का चयन करें। आप ऐप सेटिंग्स में अपना डिफ़ॉल्ट खरीद प्रदाता सेट करके इस स्क्रीन को छोड़ सकते हैं।",
984 + "select_compatible_wallet": "अपने संगत वॉलेट में से एक का चयन करें",
985 "select_destination": "कृपया बैकअप फ़ाइल के लिए गंतव्य चुनें।",
986 "select_fiat_currency_title": "मुद्रा चुनें",
987 "select_hw_account_below": "कृपया नीचे पुनर्स्थापित करने के लिए खाता चुनें:",
@@ -982,6 +991,9 @@
991 "select_network_title": "नेटवर्क चुनें",
992 "select_other_wallet": "अन्य वॉलेट चुनें",
993 "select_receiver": "प्राप्तकर्ता चुनें",
994 + "select_recipient_network": "प्राप्तकर्ता नेटवर्क का चयन करें",
995 + "select_recipient_network_description": "एकाधिक नेटवर्क दिए गए प्राप्तकर्ता पते के साथ संगत हैं",
996 + "select_recipient_network_for_tx": "इस लेनदेन के प्राप्तकर्ता के नेटवर्क का चयन करें",
997 "select_sell_provider_notice": "ऊपर किसी विक्रय प्रदाता का चयन करें। आप ऐप सेटिंग्स में अपना डिफ़ॉल्ट विक्रय प्रदाता सेट करके इस स्क्रीन को छोड़ सकते हैं।",
998 "select_token": "टोकन चुनें",
999 "select_your_country": "कृपया अपना देश चुनें",
@@ -1014,6 +1026,8 @@
1026 "send_templates": "टेम्पलेट्स",
1027 "send_title": "भेजें",
1028 "send_to": "को भेजें",
1029 + "send_to_network": "${network} पर भेजें",
1030 + "send_to_network_description": "क्या आप इस भुगतान के लिए अपने ${network} वॉलेट पर स्विच करना चाहेंगे या अपने ${currentNetwork} फंड को स्वैप करना चाहेंगे?",
1031 "send_to_this_address": "इस पते पर ${currency} ${tag}भेजें",
1032 "send_xmr": "XMR भेजें",
1033 "send_your_wallet": "आपका वॉलेट",
@@ -1132,6 +1146,8 @@
1146 "support_title_other_links": "अन्य सहायता लिंक",
1147 "supported": "समर्थित",
1148 "swap": "स्वैप",
1149 + "swap_from_network": "${network} से स्वैप करें",
1150 + "swap_from_network_description": "${targetNetwork} नेटवर्क पर फंड भेजने के लिए, आपको अपने ${currentNetwork} फंड को स्वैप करना होगा। क्या आपकी आगे बढ़ने की इच्छा है?",
1151 "swap_id": "स्वैप आईडी",
1152 "swap_provider_initial_desc": "स्वैप करते समय आप जिस प्रकार के स्वैप प्रदाता का उपयोग करना पसंद करते हैं, उसका चयन करें",
1153 "swap_providers": "स्वैप प्रदाता",
@@ -1139,6 +1155,7 @@
1155 "sweeping_wallet_alert": "इसमें ज़्यादा समय नहीं लगना चाहिए। इस स्क्रीन को न छोड़ें, वरना स्वीप किए गए फंड खो सकते हैं।",
1156 "swipe_to_bridge": "ब्रिज करने के लिए स्वाइप करें",
1157 "swipe_to_send": "भेजने के लिए स्वाइप करें",
1158 + "switch_to_x_wallet": "${network} वॉलेट पर स्विच करें",
1159 "switch_wallet": "वॉलेट बदलें",
1160 "switchToETHWallet": "कृपया Ethereum वॉलेट पर स्विच करें और फिर से प्रयास करें",
1161 "switchToWCCompatibleWallet": "कृपया वॉलेटकनेक्ट संगत वॉलेट पर स्विच करें और पुनः प्रयास करें (${chains})।",
@@ -1305,6 +1322,8 @@
1322 "unspent_coins_details_title": "अव्ययित कॉइन्स का विवरण",
1323 "unspent_coins_title": "अव्ययित सिक्के",
1324 "unsupported_asset": "हम इस एसेट के लिए इस कार्रवाई का समर्थन नहीं करते हैं। कृपया समर्थित एसेट प्रकार का वॉलेट बनाएं या उस पर स्विच करें।",
1325 + "unsupported_network_requested": "यह भुगतान अनुरोध उस नेटवर्क के लिए है जिसका हम समर्थन नहीं करते (चेन आईडी ${chainId})।",
1326 + "unsupported_token_requested": "यह भुगतान अनुरोध एक टोकन के लिए है जिसे हम चयनित नेटवर्क पर नहीं पहचान सके।",
1327 "uptime": "अपटाइम",
1328 "upto": "${value} तक",
1329 "usb": "USB",
@@ -1452,39 +1471,5 @@
1471 "zcash_card_enable_later": "आप इस कार्ड को बाद में सेटिंग्स में कभी भी सक्षम कर सकते हैं",
1472 "zcash_card_missing_funds": "फंड गायब हैं?",
1473 "zcash_card_scan": "स्कैन",
1455 - "zcash_card_warning": "प्रक्रिया पूरी होने तक ऐप बंद न करें। यदि आप ऐसा करते हैं, तो यह प्रक्रिया शुरू से फिर से शुरू करनी होगी।",
1456 - "are_you_sure_exit": "क्या आप वाकई बाहर निकलना चाहते हैं?",
1457 - "available": "उपलब्ध",
1458 - "bridging": "ब्रिजिंग",
1459 - "compatible_services": "संगत सेवाएँ",
1460 - "compatible_services_desc": "Cake Wallet पर समर्थित निम्न प्रकार के QR कोड पढ़ने के लिए स्कैन टूल का उपयोग करें:",
1461 - "crypto_addresses": "क्रिप्टो पते",
1462 - "delete_this_node": "इस नोड को हटाएँ",
1463 - "device_confirmation": "डिवाइस पुष्टिकरण",
1464 - "favorite_token": "पसंदीदा टोकन",
1465 - "favorite_token_desc": "पसंदीदा टोकन का बैलेंस बैलेंस कार्ड पर दिखाई देगा।",
1466 - "gallery": "गैलरी",
1467 - "hww_exit_desc": "इससे आपके हार्डवेयर डिवाइस के साथ चल रही पेयरिंग प्रक्रिया समाप्त हो जाएगी",
1468 - "input": "इनपुट",
1469 - "manual_input": "मैन्युअल इनपुट",
1470 - "networks": "नेटवर्क",
1471 - "node_share_desc": "इस नोड को आयात करने के लिए स्कैन स्क्रीन से इस QR कोड को स्कैन करें।",
1472 - "nodes_desc": "मौजूदा नोड्स प्रबंधित करें या एक कस्टम नोड जोड़ें।",
1473 - "ocp_desc": "स्टोर में क्रिप्टो से भुगतान करें",
1474 - "pairing_code": "पेयरिंग कोड",
1475 - "pairing_code_desc_1": "आपका डिवाइस एक पेयरिंग कोड दिखाएगा।",
1476 - "pairing_code_desc_2": "जारी रखने के लिए यहाँ दर्ज करें",
1477 - "pairing_error": "पेयरिंग त्रुटि",
1478 - "passphrase_view_keys": "पासफ़्रेज़",
1479 - "payment_invoices": "भुगतान इनवॉइस",
1480 - "save_contact": "संपर्क सहेजें",
1481 - "share_this_node": "इस नोड को साझा करें",
1482 - "show_combined_balance": "संयुक्त बैलेंस दिखाएँ",
1483 - "swipe_to_bridge": "ब्रिज करने के लिए स्वाइप करें",
1484 - "this_can_take_few_seconds": "इसमें कुछ सेकंड लग सकते हैं",
1485 - "username_check_your_network": "उपयोगकर्ता नाम जाँचने में असमर्थ। कृपया अपना नेटवर्क कनेक्शन जाँचें।",
1486 - "verifying_code": "कोड सत्यापित किया जा रहा है",
1487 - "wallet_balance": "वॉलेट बैलेंस",
1488 - "wc_desc": "DApps से आसानी से कनेक्ट करें",
1489 - "yes_exit": "हाँ। बाहर निकलें"
1490 -}
1474 + "zcash_card_warning": "प्रक्रिया पूरी होने तक ऐप बंद न करें। यदि आप ऐसा करते हैं, तो यह प्रक्रिया शुरू से फिर से शुरू करनी होगी।"
1475 +}
\ No newline at end of file
res/values/strings_hr.arb
+21 -36
@@ -94,6 +94,7 @@
94 "available_balance": "Raspoloživo stanje",
95 "available_balance_description": "“Dostupno stanje” ili “Potvrđeno stanje” su sredstva koja možete odmah potrošiti. Ako se sredstva prikazuju u donjem stanju, ali ne i u gornjem, morate pričekati nekoliko minuta da dolazna sredstva dobiju više mrežnih potvrda. Nakon što dobiju više potvrda, moći ćete ih potrošiti.",
96 "avg_savings": "Prosj. ušteda",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Molimo pričekajte da dApp završi s obradom.",
99 "awaiting_payment_confirmation": "Čeka se potvrda plaćanja",
100 "background_sync": "Sinkronizacija u pozadini",
@@ -219,6 +220,7 @@
220 "color_theme": "Tema boja",
221 "coming_soon_tag": "Uskoro",
222 "commit_transaction_amount_fee": "Potvrdi transakciju\nIznos: ${amount}\nNaknada: ${fee}",
223 + "compatible_networks": "Kompatibilne mreže",
224 "compatible_services": "Kompatibilne usluge",
225 "compatible_services_desc": "Upotrijebite alat Skeniraj za čitanje sljedećih vrsta QR kodova podržanih u Cake Walletu:",
226 "configure": "Konfiguriraj",
@@ -258,6 +260,7 @@
260 "contact_support": "Kontaktirajte podršku",
261 "contacts": "Kontakti",
262 "continue_text": "Nastavi",
263 + "continue_to_swap": "Nastavite na zamjenu",
264 "contract_address": "Adresa pametnog ugovora",
265 "contract_warning": "Ova adresa ugovora označena je kao potencijalno prijevarna. Molimo nastavite s oprezom.",
266 "contractName": "Naziv ugovora",
@@ -286,6 +289,7 @@
289 "creation_date": "Datum izrade",
290 "crypto_addresses": "Kripto adrese",
291 "csv_nothing_to_export": "Nema ničega za izvoz",
292 + "current_network": "Trenutna mreža",
293 "current_swap": "Trenutna zamjena",
294 "current_wallet": "Trenutni novčanik",
295 "custom": "Prilagođeno",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Povijest na Etherscanu",
448 "event": "Događaj",
449 "events": "Događaji",
450 + "evm_address_detected": "Otkrivena EVM adresa",
451 "evm_ecosystem_description": "Ako je potrebno, promijenite mrežu i token koji želite koristiti za ovo plaćanje.",
452 "exchange": "Razmjena",
453 "exchange_extra_info": "Molimo ne zaboravite navesti Memo ili Extra ID prilikom slanja ove transakcije na razmjenu",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Svi najnoviji modeli (GPT-5.3, Claude 4.6).\nBez pretplate, plaćajte kriptom.",
670 "narrow": "Usko",
671 "network": "Mreža",
672 + "network_address_detected": "Otkrivena ${network} adresa",
673 + "network_prefix_on": "na",
674 + "network_switch_failed": "Nije uspjelo prebacivanje na traženu mrežu. Plaćanje nije primijenjeno, pokušajte ponovno.",
675 "networks": "Mreže",
676 "new_first_wallet_text": "Čuvanje vaše kriptovalute sigurnom je mačji kašalj",
677 "new_node_testing": "Testiranje novog noda",
@@ -971,6 +979,7 @@
979 "select_asset": "Odaberite sredstvo",
980 "select_backup_file": "Odaberite datoteku sigurnosne kopije",
981 "select_buy_provider_notice": "Odaberite gore pružatelja usluge kupnje. Ovaj zaslon možete preskočiti postavljanjem zadanog pružatelja usluge kupnje u postavkama aplikacije.",
982 + "select_compatible_wallet": "Odaberite jedan od svojih kompatibilnih novčanika",
983 "select_destination": "Molimo odaberite odredište za datoteku sigurnosne kopije.",
984 "select_fiat_currency_title": "Odaberite Valutu",
985 "select_hw_account_below": "Molimo odaberite račun koji želite vratiti u nastavku:",
@@ -980,6 +989,9 @@
989 "select_network_title": "Odaberite mrežu",
990 "select_other_wallet": "Odaberite drugi novčanik",
991 "select_receiver": "Odaberite primatelja",
992 + "select_recipient_network": "Odaberite mrežu primatelja",
993 + "select_recipient_network_description": "Višestruke mreže su kompatibilne s navedenom adresom primatelja",
994 + "select_recipient_network_for_tx": "Odaberite mrežu primatelja ove transakcije",
995 "select_sell_provider_notice": "Odaberite pružatelja usluge prodaje iznad. Ovaj zaslon možete preskočiti tako da u postavkama aplikacije postavite zadanog pružatelja usluge prodaje.",
996 "select_token": "Odaberite token",
997 "select_your_country": "Molimo odaberite svoju zemlju",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "Predlošci",
1025 "send_title": "Pošalji",
1026 "send_to": "Pošalji na",
1027 + "send_to_network": "Pošalji na ${network}",
1028 + "send_to_network_description": "Želite li se prebaciti na svoj ${network} novčanik ili zamijeniti svoja ${currentNetwork} sredstva za ovo plaćanje?",
1029 "send_to_this_address": "Pošaljite ${currency} ${tag} na ovu adresu",
1030 "send_xmr": "Pošalji XMR",
1031 "send_your_wallet": "Tvoj novčanik",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "Ostale poveznice za podršku",
1145 "supported": "Podržano",
1146 "swap": "Zamijeni",
1147 + "swap_from_network": "Zamjena s ${network}",
1148 + "swap_from_network_description": "Za slanje sredstava na ${targetNetwork} mrežu, morat ćete zamijeniti svoja ${currentNetwork} sredstva. Želite li nastaviti?",
1149 "swap_id": "ID zamjene",
1150 "swap_provider_initial_desc": "Odaberite vrstu pružatelja zamjene koju želite koristiti pri zamjeni",
1151 "swap_providers": "Pružatelji usluga zamjene",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "Ovo ne bi trebalo dugo trajati. NE NAPUŠTAJTE OVAJ ZASLON ILI PREBAČENA SREDSTVA MOGU BITI IZGUBLJENA.",
1154 "swipe_to_bridge": "Prijeđite prstom za premošćivanje",
1155 "swipe_to_send": "Prijeđite prstom za slanje",
1156 + "switch_to_x_wallet": "Prebacite se na ${network} novčanik",
1157 "switch_wallet": "Prebaci novčanik",
1158 "switchToETHWallet": "Molimo prebacite se na Ethereum novčanik i pokušajte ponovno",
1159 "switchToWCCompatibleWallet": "Prebacite se na novčanik kompatibilan s WalletConnectom i pokušajte ponovno (${chains}).",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "Detalji nepotrošenih novčića",
1321 "unspent_coins_title": "Nepotrošeni novčići",
1322 "unsupported_asset": "Ne podržavamo ovu radnju za ovu imovinu. Izradite ili se prebacite na novčanik podržane vrste imovine.",
1323 + "unsupported_network_requested": "Ovaj zahtjev za plaćanje je za mrežu koju ne podržavamo (ID lanca ${chainId}).",
1324 + "unsupported_token_requested": "Ovaj zahtjev za plaćanje odnosi se na token koji nismo mogli identificirati na odabranoj mreži.",
1325 "uptime": "Vrijeme neprekidnog rada",
1326 "upto": "do ${value}",
1327 "usb": "USB",
@@ -1450,39 +1469,5 @@
1469 "zcash_card_enable_later": "Ovu karticu uvijek možete omogućiti kasnije u postavkama",
1470 "zcash_card_missing_funds": "Nedostaju sredstva?",
1471 "zcash_card_scan": "Skeniraj",
1453 - "zcash_card_warning": "Ne zatvarajte aplikaciju dok se postupak ne dovrši; ako to učinite, postupak će se morati ponovno pokrenuti ispočetka.",
1454 - "are_you_sure_exit": "Jeste li sigurni da želite izaći?",
1455 - "available": "Dostupno",
1456 - "bridging": "Premošćivanje",
1457 - "compatible_services": "Kompatibilne usluge",
1458 - "compatible_services_desc": "Upotrijebite alat Skeniraj za čitanje sljedećih vrsta QR kodova podržanih u Cake Walletu:",
1459 - "crypto_addresses": "Kripto adrese",
1460 - "delete_this_node": "Izbriši ovaj čvor",
1461 - "device_confirmation": "Potvrda uređaja",
1462 - "favorite_token": "Omiljeni token",
1463 - "favorite_token_desc": "Stanje omiljenog tokena prikazat će se na kartici stanja.",
1464 - "gallery": "Galerija",
1465 - "hww_exit_desc": "Ovo će prekinuti tekući postupak uparivanja s vašim hardverskim uređajem",
1466 - "input": "Unos",
1467 - "manual_input": "Ručni unos",
1468 - "networks": "Mreže",
1469 - "node_share_desc": "Skenirajte ovaj QR kod sa zaslona Skeniraj da biste uvezli ovaj čvor.",
1470 - "nodes_desc": "Upravljajte postojećim čvorovima ili dodajte prilagođeni.",
1471 - "ocp_desc": "Plaćajte kriptovalutom u trgovinama",
1472 - "pairing_code": "Kod za uparivanje",
1473 - "pairing_code_desc_1": "Vaš će uređaj prikazati kod za uparivanje.",
1474 - "pairing_code_desc_2": "Unesite ga ovdje za nastavak",
1475 - "pairing_error": "Pogreška pri uparivanju",
1476 - "passphrase_view_keys": "Lozinka",
1477 - "payment_invoices": "Računi za plaćanje",
1478 - "save_contact": "Spremi kontakt",
1479 - "share_this_node": "Podijeli ovaj čvor",
1480 - "show_combined_balance": "Prikaži kombinirano stanje",
1481 - "swipe_to_bridge": "Prijeđite prstom za premošćivanje",
1482 - "this_can_take_few_seconds": "Ovo može potrajati nekoliko sekundi",
1483 - "username_check_your_network": "Nije moguće provjeriti korisničko ime. Provjerite mrežnu vezu.",
1484 - "verifying_code": "Provjera koda",
1485 - "wallet_balance": "Stanje novčanika",
1486 - "wc_desc": "Jednostavno se povežite s DApp-ovima",
1487 - "yes_exit": "Da. Izađi"
1488 -}
1472 + "zcash_card_warning": "Ne zatvarajte aplikaciju dok se postupak ne dovrši; ako to učinite, postupak će se morati ponovno pokrenuti ispočetka."
1473 +}
\ No newline at end of file
res/values/strings_hy.arb
+21 -39
@@ -94,6 +94,7 @@
94 "available_balance": "Հասանելի մնացորդ",
95 "available_balance_description": "«Հասանելի մնացորդը» կամ «Հաստատված մնացորդը» միջոցներ են, որոնք կարելի է անմիջապես ծախսել։ Եթե միջոցները երևում են ստորին մնացորդում, բայց ոչ վերևի մնացորդում, ապա պետք է մի քանի րոպե սպասեք, մինչև մուտքագրվող միջոցները ստանան ավելի շատ ցանցային հաստատումներ։ Ավելի շատ հաստատումներ ստանալուց հետո դրանք հնարավոր կլինի ծախսել։",
96 "avg_savings": "Միջին խնայողություն",
97 + "avl": "Ավլ",
98 "awaitDAppProcessing": "Խնդրում ենք սպասել, մինչև dApp-ը ավարտի մշակումը։",
99 "awaiting_payment_confirmation": "Սպասում է վճարման հաստատմանը",
100 "background_sync": "Ֆոնային համաժամացում",
@@ -219,6 +220,7 @@
220 "color_theme": "Գունային թեմա",
221 "coming_soon_tag": "Շուտով",
222 "commit_transaction_amount_fee": "Հաստատել գործարքը\nԳումար՝ ${amount}\nՄիջնորդավճար՝ ${fee}",
223 + "compatible_networks": "Համատեղելի ցանցեր",
224 "compatible_services": "Համատեղելի ծառայություններ",
225 "compatible_services_desc": "Օգտագործեք Սկանավորման գործիքը՝ Cake Wallet-ի կողմից աջակցվող QR կոդերի հետևյալ տեսակները կարդալու համար՝",
226 "configure": "Կարգավորել",
@@ -258,6 +260,7 @@
260 "contact_support": "Կապ հաստատել աջակցման ծառայության հետ",
261 "contacts": "Կոնտակտներ",
262 "continue_text": "Շարունակել",
263 + "continue_to_swap": "Շարունակեք փոխանակել",
264 "contract_address": "Պայմանագրի հասցե",
265 "contract_warning": "Այս պայմանագրի հասցեն նշվել է որպես հնարավոր խարդախ։ Խնդրում ենք շարունակել զգուշությամբ։",
266 "contractName": "Պայմանագրի անուն",
@@ -286,6 +289,7 @@
289 "creation_date": "Ստեղծման ամսաթիվ",
290 "crypto_addresses": "Կրիպտո հասցեներ",
291 "csv_nothing_to_export": "Արտահանելու ոչինչ չկա",
292 + "current_network": "Ընթացիկ ցանց",
293 "current_swap": "Ընթացիկ փոխանակում",
294 "current_wallet": "Ընթացիկ դրամապանակ",
295 "custom": "Հատուկ",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Etherscan-ի պատմություն",
448 "event": "Միջոցառում",
449 "events": "Միջոցառումներ",
450 + "evm_address_detected": "Հայտնաբերվել է EVM հասցե",
451 "evm_ecosystem_description": "Անհրաժեշտության դեպքում փոխեք ցանցը և թոքենը, որը ցանկանում եք օգտագործել այս վճարման համար։",
452 "exchange": "Փոխանակում",
453 "exchange_extra_info": "Խնդրում ենք մի մոռացեք նշել Memo-ն կամ Extra ID-ն՝ այս գործարքը փոխանակման համար ուղարկելիս",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Բոլոր ամենանոր մոդելները (GPT-5.3, Claude 4.6).\nԱռանց բաժանորդագրության՝ վճարեք կրիպտոարժույթով։",
670 "narrow": "Նեղ",
671 "network": "Ցանց",
672 + "network_address_detected": "Հայտնաբերվել է ${network} հասցե",
673 + "network_prefix_on": "վրա",
674 + "network_switch_failed": "Չհաջողվեց անցնել պահանջվող ցանցին: Վճարումը չի կիրառվել, խնդրում ենք կրկին փորձել:",
675 "networks": "Ցանցեր",
676 "new_first_wallet_text": "Ձեր կրիպտոն անվտանգ պահելը շատ հեշտ է",
677 "new_node_testing": "Նոր հանգույցի փորձարկում",
@@ -971,6 +979,7 @@
979 "select_asset": "Ընտրեք Ակտիվ",
980 "select_backup_file": "Ընտրել պահուստային ֆայլը",
981 "select_buy_provider_notice": "Վերևում ընտրեք գնման մատակարար։ Դուք կարող եք բաց թողնել այս էկրանը՝ հավելվածի կարգավորումներում սահմանելով ձեր լռելայն գնման մատակարարը։",
982 + "select_compatible_wallet": "Ընտրեք ձեր համատեղելի դրամապանակներից մեկը",
983 "select_destination": "Խնդրում ենք ընտրել պահուստային ֆայլի նպատակակետը։",
984 "select_fiat_currency_title": "Ընտրեք արժույթ",
985 "select_hw_account_below": "Խնդրում ենք ներքևում ընտրել, թե որ հաշիվը վերականգնել․",
@@ -980,6 +989,9 @@
989 "select_network_title": "Ընտրեք Ցանց",
990 "select_other_wallet": "Ընտրեք այլ դրամապանակ",
991 "select_receiver": "Ընտրեք ստացողին",
992 + "select_recipient_network": "Ընտրեք Ստացողի ցանց",
993 + "select_recipient_network_description": "Մի քանի ցանցեր համատեղելի են տրամադրված ստացողի հասցեի հետ",
994 + "select_recipient_network_for_tx": "Ընտրեք այս գործարքի Ստացողի ցանցը",
995 "select_sell_provider_notice": "Վերևում ընտրեք վաճառքի մատակարար։ Դուք կարող եք բաց թողնել այս էկրանը՝ հավելվածի կարգավորումներում սահմանելով ձեր լռելայն վաճառքի մատակարարին։",
996 "select_token": "Ընտրեք թոքեն",
997 "select_your_country": "Խնդրում ենք ընտրել ձեր երկիրը",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "Կաղապարներ",
1025 "send_title": "Ուղարկել",
1026 "send_to": "Ուղարկել՝",
1027 + "send_to_network": "Ուղարկել ${network}",
1028 + "send_to_network_description": "Ցանկանու՞մ եք անցնել ձեր ${network} դրամապանակին կամ փոխանակել ձեր ${currentNetwork} միջոցները այս վճարման համար:",
1029 "send_to_this_address": "Ուղարկել ${currency} ${tag} այս հասցեին",
1030 "send_xmr": "Ուղարկել XMR",
1031 "send_your_wallet": "Ձեր դրամապանակը",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "Այլ աջակցության հղումներ",
1145 "supported": "Աջակցվող",
1146 "swap": "Փոխանակում",
1147 + "swap_from_network": "Փոխանակում ${network}-ից",
1148 + "swap_from_network_description": "${targetNetwork} ցանցին գումար ուղարկելու համար դուք պետք է փոխեք ձեր ${currentNetwork} միջոցները: Ցանկանու՞մ եք շարունակել:",
1149 "swap_id": "Փոխանակման ID",
1150 "swap_provider_initial_desc": "Ընտրեք փոխանակման մատակարարի տեսակը, որը նախընտրում եք օգտագործել փոխանակում կատարելիս",
1151 "swap_providers": "Փոխանակման մատակարարներ",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "Սա երկար չի տևի։ ՄԻ ԼՔԵՔ ԱՅՍ ԷԿՐԱՆԸ, ՀԱԿԱՌԱԿ ԴԵՊՔՈՒՄ ՄԱՔՐՎՈՂ ՄԻՋՈՑՆԵՐԸ ԿԱՐՈՂ ԵՆ ԿՈՐՉԵԼ։",
1154 "swipe_to_bridge": "Սահեցրեք՝ կամրջելու համար",
1155 "swipe_to_send": "Ուղարկելու համար սահեցրեք",
1156 + "switch_to_x_wallet": "Անցեք ${network} Wallet-ին",
1157 "switch_wallet": "Փոխել դրամապանակը",
1158 "switchToETHWallet": "Խնդրում ենք անցնել Ethereum դրամապանակի և կրկին փորձել",
1159 "switchToWCCompatibleWallet": "Խնդրում ենք անցնել WalletConnect-ի համատեղելի դրամապանակին և նորից փորձել (${chains}):",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "Չծախսված մետաղադրամների մանրամասները",
1321 "unspent_coins_title": "Չծախսված մետաղադրամներ",
1322 "unsupported_asset": "Մենք չենք աջակցում այս գործողությունը տվյալ ակտիվի համար։ Խնդրում ենք ստեղծել կամ անցնել աջակցվող ակտիվի տեսակի դրամապանակի։",
1323 + "unsupported_network_requested": "Այս վճարման հարցումը նախատեսված է մի ցանցի համար, որը մենք չենք աջակցում (շղթայի ID ${chainId}):",
1324 + "unsupported_token_requested": "Վճարման այս հարցումը մի նշան է, որը մենք չկարողացանք նույնականացնել ընտրված ցանցում:",
1325 "uptime": "Աշխատանքի ժամանակ",
1326 "upto": "մինչև ${value}",
1327 "usb": "USB",
@@ -1450,42 +1469,5 @@
1469 "zcash_card_enable_later": "Դուք միշտ կարող եք ավելի ուշ ակտիվացնել այս քարտը կարգավորումներում",
1470 "zcash_card_missing_funds": "Միջոցները բացակա՞յում են",
1471 "zcash_card_scan": "Սկանավորել",
1453 - "zcash_card_warning": "Մի փակեք հավելվածը մինչև ընթացակարգի ավարտը, քանի որ հակառակ դեպքում այս գործընթացը պետք է վերագործարկվի զրոյից։",
1454 - "are_you_sure_exit": "Վստա՞հ եք, որ ցանկանում եք դուրս գալ։",
1455 - "available": "Հասանելի",
1456 - "bridging": "Կամրջում",
1457 - "compatible_services": "Համատեղելի ծառայություններ",
1458 - "compatible_services_desc": "Օգտագործեք Սկանավորման գործիքը՝ Cake Wallet-ի կողմից աջակցվող QR կոդերի հետևյալ տեսակները կարդալու համար՝",
1459 - "crypto_addresses": "Կրիպտո հասցեներ",
1460 - "delete_this_node": "Ջնջել այս հանգույցը",
1461 - "device_confirmation": "Սարքի հաստատում",
1462 - "favorite_token": "Նախընտրած թոքեն",
1463 - "favorite_token_desc": "Նախընտրած թոքենի մնացորդը կցուցադրվի մնացորդի քարտի վրա։",
1464 - "gallery": "Պատկերասրահ",
1465 - "hww_exit_desc": "Սա կդադարեցնի ձեր ապարատային սարքի հետ ընթացիկ զուգակցման գործընթացը",
1466 - "input": "Մուտք",
1467 - "manual_input": "Ձեռքով մուտքագրում",
1468 - "networks": "Ցանցեր",
1469 - "no_providers_available": "Մատակարարներ չկան",
1470 - "node_share_desc": "Սկանավորեք այս QR կոդը Սկանավորման էկրանից՝ այս հանգույցը ներմուծելու համար։",
1471 - "nodes_desc": "Կառավարեք առկա հանգույցները կամ ավելացրեք անհատական հանգույց։",
1472 - "ocp_desc": "Վճարեք կրիպտոյով խանութներում",
1473 - "pairing_code": "Զուգակցման կոդ",
1474 - "pairing_code_desc_1": "Ձեր սարքը ցույց կտա զուգակցման կոդ։",
1475 - "pairing_code_desc_2": "Մուտքագրեք այստեղ՝ շարունակելու համար",
1476 - "pairing_error": "Զուգակցման սխալ",
1477 - "passphrase_view_keys": "Գաղտնաբառային արտահայտություն",
1478 - "payment_invoices": "Վճարման հաշիվ-ապրանքագրեր",
1479 - "save_contact": "Պահպանել կոնտակտը",
1480 - "selected_trocador_provider": "ընտրված Trocador մատակարար",
1481 - "share_this_node": "Կիսվել այս հանգույցով",
1482 - "show_combined_balance": "Ցուցադրել համակցված մնացորդը",
1483 - "swipe_to_bridge": "Սահեցրեք՝ կամրջելու համար",
1484 - "this_can_take_few_seconds": "Սա կարող է տևել մի քանի վայրկյան",
1485 - "username_check_your_network": "Չհաջողվեց ստուգել օգտանունը։ Խնդրում ենք ստուգել ձեր ցանցային կապը։",
1486 - "verifying_code": "Կոդի ստուգում",
1487 - "wallet_balance": "Դրամապանակի մնացորդ",
1488 - "wc_action_approve": "Հաստատել",
1489 - "wc_desc": "Հեշտությամբ միացեք DApps-երին",
1490 - "yes_exit": "Այո։ Դուրս գալ"
1491 -}
1472 + "zcash_card_warning": "Մի փակեք հավելվածը մինչև ընթացակարգի ավարտը, քանի որ հակառակ դեպքում այս գործընթացը պետք է վերագործարկվի զրոյից։"
1473 +}
\ No newline at end of file
res/values/strings_id.arb
+21 -37
@@ -94,6 +94,7 @@
94 "available_balance": "Saldo Tersedia",
95 "available_balance_description": "“Saldo Tersedia” atau “Saldo Terkonfirmasi” adalah dana yang dapat langsung dibelanjakan. Jika dana muncul di saldo bawah tetapi tidak di saldo atas, maka Anda harus menunggu beberapa menit agar dana masuk mendapatkan konfirmasi jaringan tambahan. Setelah mendapatkan lebih banyak konfirmasi, dana tersebut akan dapat dibelanjakan.",
96 "avg_savings": "Rata-rata Penghematan",
97 + "avl": "Rata-rata",
98 "awaitDAppProcessing": "Mohon tunggu hingga dApp selesai memproses.",
99 "awaiting_payment_confirmation": "Menunggu Konfirmasi Pembayaran",
100 "background_sync": "Sinkronisasi latar belakang",
@@ -219,6 +220,7 @@
220 "color_theme": "Tema warna",
221 "coming_soon_tag": "Segera hadir",
222 "commit_transaction_amount_fee": "Konfirmasi transaksi\nJumlah: ${amount}\nBiaya: ${fee}",
223 + "compatible_networks": "Jaringan yang Kompatibel",
224 "compatible_services": "Layanan yang Kompatibel",
225 "compatible_services_desc": "Gunakan alat Pindai untuk membaca jenis kode QR berikut yang didukung di Cake Wallet:",
226 "configure": "Konfigurasi",
@@ -258,6 +260,7 @@
260 "contact_support": "Hubungi Dukungan",
261 "contacts": "Kontak",
262 "continue_text": "Lanjutkan",
263 + "continue_to_swap": "Lanjutkan ke Tukar",
264 "contract_address": "Alamat Kontrak",
265 "contract_warning": "Alamat kontrak ini telah ditandai sebagai berpotensi penipuan. Harap lanjutkan dengan hati-hati.",
266 "contractName": "Nama Kontrak",
@@ -286,6 +289,7 @@
289 "creation_date": "Tanggal Pembuatan",
290 "crypto_addresses": "Alamat Kripto",
291 "csv_nothing_to_export": "Tidak ada yang dapat diekspor",
292 + "current_network": "Jaringan Saat Ini",
293 "current_swap": "Swap Saat Ini",
294 "current_wallet": "Dompet saat ini",
295 "custom": "Kustom",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Riwayat Etherscan",
448 "event": "Acara",
449 "events": "Acara",
450 + "evm_address_detected": "Alamat EVM Terdeteksi",
451 "evm_ecosystem_description": "Jika perlu, ubah jaringan dan token yang ingin Anda gunakan untuk pembayaran ini.",
452 "exchange": "Tukar",
453 "exchange_extra_info": "Harap jangan lupa untuk menyertakan Memo atau Extra ID saat mengirim transaksi ini untuk penukaran",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Semua model terbaru (GPT-5.3, Claude 4.6).\nTanpa langganan, bayar dengan kripto.",
670 "narrow": "Sempit",
671 "network": "Jaringan",
672 + "network_address_detected": "Alamat ${network} terdeteksi",
673 + "network_prefix_on": "pada",
674 + "network_switch_failed": "Gagal beralih ke jaringan yang diminta. Pembayaran tidak diterapkan, silakan coba lagi.",
675 "networks": "Jaringan",
676 "new_first_wallet_text": "Menjaga kripto Anda tetap aman itu semudah membalik telapak tangan",
677 "new_node_testing": "Pengujian node baru",
@@ -974,6 +982,7 @@
982 "select_asset": "Pilih Aset",
983 "select_backup_file": "Pilih file cadangan",
984 "select_buy_provider_notice": "Pilih penyedia beli di atas. Anda dapat melewati layar ini dengan mengatur penyedia beli default Anda di pengaturan aplikasi.",
985 + "select_compatible_wallet": "Pilih salah satu dompet Anda yang kompatibel",
986 "select_destination": "Silakan pilih lokasi tujuan untuk file cadangan.",
987 "select_fiat_currency_title": "Pilih Mata Uang",
988 "select_hw_account_below": "Silakan pilih akun yang akan dipulihkan di bawah ini:",
@@ -983,6 +992,9 @@
992 "select_network_title": "Pilih Jaringan",
993 "select_other_wallet": "Pilih Wallet lain",
994 "select_receiver": "Pilih Penerima",
995 + "select_recipient_network": "Pilih Jaringan Penerima",
996 + "select_recipient_network_description": "Beberapa jaringan kompatibel dengan alamat penerima yang diberikan",
997 + "select_recipient_network_for_tx": "Pilih jaringan Penerima transaksi ini",
998 "select_sell_provider_notice": "Pilih penyedia jual di atas. Anda dapat melewati layar ini dengan mengatur penyedia jual default Anda di pengaturan aplikasi.",
999 "select_token": "Pilih Token",
1000 "select_your_country": "Silakan pilih negara Anda",
@@ -1015,6 +1027,8 @@
1027 "send_templates": "Templat",
1028 "send_title": "Kirim",
1029 "send_to": "Kirim ke",
1030 + "send_to_network": "Kirim ke ${network}",
1031 + "send_to_network_description": "Apakah Anda ingin beralih ke dompet ${network} atau menukar dana ${currentNetwork} Anda dengan pembayaran ini?",
1032 "send_to_this_address": "Kirim ${currency} ${tag}ke alamat ini",
1033 "send_xmr": "Kirim XMR",
1034 "send_your_wallet": "Dompet Anda",
@@ -1133,6 +1147,8 @@
1147 "support_title_other_links": "Tautan dukungan lainnya",
1148 "supported": "Didukung",
1149 "swap": "Tukar",
1150 + "swap_from_network": "Tukar dari ${network}",
1151 + "swap_from_network_description": "Untuk mengirim dana ke jaringan ${targetNetwork}, Anda perlu menukar dana ${currentNetwork} Anda. Apakah Anda ingin melanjutkan?",
1152 "swap_id": "ID Swap",
1153 "swap_provider_initial_desc": "Pilih jenis penyedia swap yang Anda inginkan untuk digunakan saat melakukan swap",
1154 "swap_providers": "Penyedia swap",
@@ -1140,6 +1156,7 @@
1156 "sweeping_wallet_alert": "Ini seharusnya tidak memakan waktu lama. JANGAN TINGGALKAN LAYAR INI ATAU DANA YANG DISAPU DAPAT HILANG.",
1157 "swipe_to_bridge": "Geser untuk menjembatani",
1158 "swipe_to_send": "Geser untuk mengirim",
1159 + "switch_to_x_wallet": "Beralih ke Dompet ${network}",
1160 "switch_wallet": "Ganti Wallet",
1161 "switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi",
1162 "switchToWCCompatibleWallet": "Silakan beralih ke dompet yang kompatibel dengan WalletConnect dan coba lagi (${chains}).",
@@ -1306,6 +1323,8 @@
1323 "unspent_coins_details_title": "Rincian koin yang belum dibelanjakan",
1324 "unspent_coins_title": "Koin yang belum dibelanjakan",
1325 "unsupported_asset": "Kami tidak mendukung tindakan ini untuk aset ini. Harap buat atau beralih ke dompet dengan jenis aset yang didukung.",
1326 + "unsupported_network_requested": "Permintaan pembayaran ini ditujukan untuk jaringan yang tidak kami dukung (ID rantai ${chainId}).",
1327 + "unsupported_token_requested": "Permintaan pembayaran ini ditujukan untuk token yang tidak dapat kami identifikasi pada jaringan yang dipilih.",
1328 "uptime": "Waktu aktif",
1329 "upto": "hingga ${value}",
1330 "usb": "USB",
@@ -1453,40 +1472,5 @@
1472 "zcash_card_enable_later": "Anda selalu dapat mengaktifkan kartu ini nanti di pengaturan",
1473 "zcash_card_missing_funds": "Dana hilang?",
1474 "zcash_card_scan": "Pindai",
1456 - "zcash_card_warning": "Jangan tutup aplikasi sampai prosedur selesai. Jika Anda melakukannya, proses ini harus dimulai ulang dari awal.",
1457 - "are_you_sure_exit": "Apakah Anda yakin ingin keluar?",
1458 - "available": "Tersedia",
1459 - "bridging": "Menjembatani",
1460 - "compatible_services": "Layanan yang Kompatibel",
1461 - "compatible_services_desc": "Gunakan alat Pindai untuk membaca jenis kode QR berikut yang didukung di Cake Wallet:",
1462 - "crypto_addresses": "Alamat Kripto",
1463 - "delete_this_node": "Hapus node ini",
1464 - "device_confirmation": "Konfirmasi Perangkat",
1465 - "favorite_token": "Token favorit",
1466 - "favorite_token_desc": "Saldo token favorit akan ditampilkan di kartu saldo.",
1467 - "gallery": "Galeri",
1468 - "hww_exit_desc": "Ini akan mengakhiri proses pairing yang sedang berlangsung dengan perangkat keras Anda",
1469 - "input": "Input",
1470 - "manual_input": "Input Manual",
1471 - "networks": "Jaringan",
1472 - "node_share_desc": "Pindai kode QR ini dari layar Pindai untuk mengimpor node ini.",
1473 - "nodes_desc": "Kelola node yang ada atau tambahkan node kustom.",
1474 - "ocp_desc": "Bayar dengan kripto di toko",
1475 - "pairing_code": "Kode Pairing",
1476 - "pairing_code_desc_1": "Perangkat Anda akan menampilkan kode pairing.",
1477 - "pairing_code_desc_2": "Masukkan di sini untuk melanjutkan",
1478 - "pairing_error": "Kesalahan Pairing",
1479 - "passphrase_view_keys": "Frasa sandi",
1480 - "payment_invoices": "Faktur Pembayaran",
1481 - "save_contact": "Simpan Kontak",
1482 - "share_this_node": "Bagikan node ini",
1483 - "show_combined_balance": "Tampilkan saldo gabungan",
1484 - "swipe_to_bridge": "Geser untuk menjembatani",
1485 - "this_can_take_few_seconds": "Ini dapat memakan waktu beberapa detik",
1486 - "username_check_your_network": "Tidak dapat memeriksa nama pengguna. Silakan periksa koneksi jaringan Anda.",
1487 - "verifying_code": "Memverifikasi Kode",
1488 - "wallet_balance": "Saldo Dompet",
1489 - "wc_action_approve": "Setujui",
1490 - "wc_desc": "Hubungkan dengan mudah ke DApps",
1491 - "yes_exit": "Ya. Keluar"
1492 -}
1475 + "zcash_card_warning": "Jangan tutup aplikasi sampai prosedur selesai. Jika Anda melakukannya, proses ini harus dimulai ulang dari awal."
1476 +}
\ No newline at end of file
res/values/strings_it.arb
+21 -38
@@ -94,6 +94,7 @@
94 "available_balance": "Saldo disponibile",
95 "available_balance_description": "Il “Saldo disponibile” o “Saldo confermato” sono fondi che possono essere spesi immediatamente. Se i fondi compaiono nel saldo in basso ma non in quello in alto, devi attendere qualche minuto affinché i fondi in arrivo ottengano ulteriori conferme di rete. Dopo aver ricevuto più conferme, saranno spendibili.",
96 "avg_savings": "Risparmio medio",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Attendi che la dApp completi l'elaborazione.",
99 "awaiting_payment_confirmation": "In attesa di conferma del pagamento",
100 "background_sync": "Sincronizzazione in background",
@@ -219,6 +220,7 @@
220 "color_theme": "Tema colore",
221 "coming_soon_tag": "Prossimamente",
222 "commit_transaction_amount_fee": "Conferma transazione\nImporto: ${amount}\nCommissione: ${fee}",
223 + "compatible_networks": "Reti compatibili",
224 "compatible_services": "Servizi compatibili",
225 "compatible_services_desc": "Usa lo strumento Scansione per leggere i seguenti tipi di codici QR supportati su Cake Wallet:",
226 "configure": "Configura",
@@ -258,6 +260,7 @@
260 "contact_support": "Contatta l'assistenza",
261 "contacts": "Contatti",
262 "continue_text": "Continua",
263 + "continue_to_swap": "Continua a scambiare",
264 "contract_address": "Indirizzo del contratto",
265 "contract_warning": "Questo indirizzo del contratto è stato segnalato come potenzialmente fraudolento. Procedi con cautela.",
266 "contractName": "Nome del contratto",
@@ -286,6 +289,7 @@
289 "creation_date": "Data di creazione",
290 "crypto_addresses": "Indirizzi crypto",
291 "csv_nothing_to_export": "Niente da esportare",
292 + "current_network": "Rete attuale",
293 "current_swap": "Scambio in corso",
294 "current_wallet": "Portafoglio corrente",
295 "custom": "Personalizzato",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Cronologia di Etherscan",
448 "event": "Evento",
449 "events": "Eventi",
450 + "evm_address_detected": "Rilevato indirizzo EVM",
451 "evm_ecosystem_description": "Se necessario, modifica la rete e il token che desideri utilizzare per questo pagamento.",
452 "exchange": "Scambio",
453 "exchange_extra_info": "Non dimenticare di specificare il Memo o l'ID extra durante l'invio di questa transazione per l'exchange",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Tutti i modelli più recenti (GPT-5.3, Claude 4.6).\nNessun abbonamento, paga con cripto.",
670 "narrow": "Stretto",
671 "network": "Rete",
672 + "network_address_detected": "Indirizzo ${network} rilevato",
673 + "network_prefix_on": "SU",
674 + "network_switch_failed": "Impossibile passare alla rete richiesta. Il pagamento non è stato applicato, riprova.",
675 "networks": "Reti",
676 "new_first_wallet_text": "Tenere al sicuro le tue crypto è un gioco da ragazzi",
677 "new_node_testing": "Test di un nuovo nodo",
@@ -972,6 +980,7 @@
980 "select_asset": "Seleziona Risorsa",
981 "select_backup_file": "Seleziona il file di backup",
982 "select_buy_provider_notice": "Seleziona un provider di acquisto qui sopra. Puoi saltare questa schermata impostando il provider di acquisto predefinito nelle impostazioni dell'app.",
983 + "select_compatible_wallet": "Seleziona uno dei tuoi portafogli compatibili",
984 "select_destination": "Seleziona la destinazione per il file di backup.",
985 "select_fiat_currency_title": "Seleziona Valuta",
986 "select_hw_account_below": "Seleziona l'account da ripristinare qui sotto:",
@@ -981,6 +990,9 @@
990 "select_network_title": "Seleziona Rete",
991 "select_other_wallet": "Seleziona un altro Wallet",
992 "select_receiver": "Seleziona destinatario",
993 + "select_recipient_network": "Seleziona Rete destinatari",
994 + "select_recipient_network_description": "Più reti sono compatibili con l'indirizzo del destinatario fornito",
995 + "select_recipient_network_for_tx": "Seleziona la rete del destinatario di questa transazione",
996 "select_sell_provider_notice": "Seleziona un provider di vendita qui sopra. Puoi saltare questa schermata impostando il provider di vendita predefinito nelle impostazioni dell'app.",
997 "select_token": "Seleziona token",
998 "select_your_country": "Seleziona il tuo Paese",
@@ -1013,6 +1025,8 @@
1025 "send_templates": "Modelli",
1026 "send_title": "Invia",
1027 "send_to": "Invia a",
1028 + "send_to_network": "Invia a ${network}",
1029 + "send_to_network_description": "Desideri passare al tuo portafoglio ${network} o scambiare i tuoi fondi ${currentNetwork} per questo pagamento?",
1030 "send_to_this_address": "Invia ${currency} ${tag}a questo indirizzo",
1031 "send_xmr": "Invia XMR",
1032 "send_your_wallet": "Il tuo portafoglio",
@@ -1131,6 +1145,8 @@
1145 "support_title_other_links": "Altri link di supporto",
1146 "supported": "Supportato",
1147 "swap": "Swap",
1148 + "swap_from_network": "Scambia da ${network}",
1149 + "swap_from_network_description": "Per inviare fondi alla rete ${targetNetwork}, dovrai scambiare i tuoi fondi ${currentNetwork}. Vuoi procedere?",
1150 "swap_id": "ID swap",
1151 "swap_provider_initial_desc": "Seleziona il tipo di fornitore di swap che preferisci utilizzare quando effettui uno swap in",
1152 "swap_providers": "Provider di swap",
@@ -1138,6 +1154,7 @@
1154 "sweeping_wallet_alert": "Questo non dovrebbe richiedere molto tempo. NON LASCIARE QUESTA SCHERMATA O I FONDI SPOSTATI POTREBBERO ANDARE PERSI.",
1155 "swipe_to_bridge": "Scorri per il bridge",
1156 "swipe_to_send": "Scorri per inviare",
1157 + "switch_to_x_wallet": "Passa a ${network} Wallet",
1158 "switch_wallet": "Cambia wallet",
1159 "switchToETHWallet": "Passa a un wallet Ethereum e riprova",
1160 "switchToWCCompatibleWallet": "Passa a un portafoglio compatibile con WalletConnect e riprova (${chains}).",
@@ -1304,6 +1321,8 @@
1321 "unspent_coins_details_title": "Dettagli delle monete non spese",
1322 "unspent_coins_title": "Monete non spese",
1323 "unsupported_asset": "Non supportiamo questa azione per questo asset. Crea o passa a un wallet di un tipo di asset supportato.",
1324 + "unsupported_network_requested": "Questa richiesta di pagamento riguarda una rete che non supportiamo (ID catena ${chainId}).",
1325 + "unsupported_token_requested": "Questa richiesta di pagamento riguarda un token che non siamo riusciti a identificare sulla rete selezionata.",
1326 "uptime": "Tempo di attività",
1327 "upto": "fino a ${value}",
1328 "usb": "USB",
@@ -1453,41 +1472,5 @@
1472 "zcash_card_enable_later": "Puoi sempre abilitare questa carta in seguito nelle impostazioni",
1473 "zcash_card_missing_funds": "Fondi mancanti?",
1474 "zcash_card_scan": "Scansiona",
1456 - "zcash_card_warning": "Non chiudere l'app finché la procedura non è completata, altrimenti sarà necessario riavviare il processo da zero.",
1457 - "are_you_sure_exit": "Sei sicuro di voler uscire?",
1458 - "available": "Disponibile",
1459 - "bridging": "Bridging in corso",
1460 - "compatible_services": "Servizi compatibili",
1461 - "compatible_services_desc": "Usa lo strumento Scansione per leggere i seguenti tipi di codici QR supportati su Cake Wallet:",
1462 - "crypto_addresses": "Indirizzi crypto",
1463 - "delete_this_node": "Elimina questo nodo",
1464 - "device_confirmation": "Conferma sul dispositivo",
1465 - "favorite_token": "Token preferito",
1466 - "favorite_token_desc": "Il saldo del token preferito verrà mostrato sulla scheda del saldo.",
1467 - "gallery": "Galleria",
1468 - "hww_exit_desc": "Questo terminerà il processo di associazione in corso con il tuo dispositivo hardware",
1469 - "input": "Input",
1470 - "manual_input": "Inserimento manuale",
1471 - "networks": "Reti",
1472 - "node_share_desc": "Scansiona questo codice QR dalla schermata Scansione per importare questo nodo.",
1473 - "nodes_desc": "Gestisci i nodi esistenti o aggiungine uno personalizzato.",
1474 - "ocp_desc": "Paga con crypto nei negozi",
1475 - "pairing_code": "Codice di associazione",
1476 - "pairing_code_desc_1": "Il tuo dispositivo mostrerà un codice di associazione.",
1477 - "pairing_code_desc_2": "Inseriscilo qui per continuare",
1478 - "pairing_error": "Errore di associazione",
1479 - "passphrase_view_keys": "Passphrase",
1480 - "payment_invoices": "Fatture di pagamento",
1481 - "recieving": "Ricezione",
1482 - "save_contact": "Salva contatto",
1483 - "share_this_node": "Condividi questo nodo",
1484 - "show_combined_balance": "Mostra saldo combinato",
1485 - "swipe_to_bridge": "Scorri per il bridge",
1486 - "this_can_take_few_seconds": "Questo può richiedere alcuni secondi",
1487 - "username_check_your_network": "Impossibile verificare il nome utente. Controlla la tua connessione di rete.",
1488 - "verifying_code": "Verifica del codice in corso",
1489 - "wallet_balance": "Saldo del wallet",
1490 - "wc_action_approve": "Approva",
1491 - "wc_desc": "Connettiti facilmente alle dApp",
1492 - "yes_exit": "Sì. Esci"
1493 -}
1475 + "zcash_card_warning": "Non chiudere l'app finché la procedura non è completata, altrimenti sarà necessario riavviare il processo da zero."
1476 +}
\ No newline at end of file
res/values/strings_ja.arb
+21 -38
@@ -94,6 +94,7 @@
94 "available_balance": "利用可能残高",
95 "available_balance_description": "「利用可能な残高」または「承認済み残高」は、すぐに使用できる資金です。下の残高には表示されているのに上の残高に表示されない場合は、受信した資金がネットワークでさらに承認(確認)されるまで数分待つ必要があります。承認数が増えると、使用できるようになります。",
96 "avg_savings": "平均節約額",
97 + "avl": "アヴル",
98 "awaitDAppProcessing": "dAppの処理が完了するまでお待ちください。",
99 "awaiting_payment_confirmation": "支払いの確認待ち",
100 "background_sync": "バックグラウンド同期",
@@ -219,6 +220,7 @@
220 "color_theme": "カラーテーマ",
221 "coming_soon_tag": "近日公開",
222 "commit_transaction_amount_fee": "トランザクションを確定\n金額: ${amount}\n手数料: ${fee}",
223 + "compatible_networks": "互換性のあるネットワーク",
224 "compatible_services": "対応サービス",
225 "compatible_services_desc": "スキャンツールを使用して、Cake Walletで対応している以下の種類のQRコードを読み取れます:",
226 "configure": "設定",
@@ -258,6 +260,7 @@
260 "contact_support": "サポートに連絡",
261 "contacts": "連絡先",
262 "continue_text": "続行",
263 + "continue_to_swap": "スワップを続ける",
264 "contract_address": "コントラクトアドレス",
265 "contract_warning": "このコントラクトアドレスは、不正の可能性があるとしてフラグが付けられています。注意して進めてください。",
266 "contractName": "コントラクト名",
@@ -286,6 +289,7 @@
289 "creation_date": "作成日",
290 "crypto_addresses": "暗号資産アドレス",
291 "csv_nothing_to_export": "エクスポートするものがありません",
292 + "current_network": "現在のネットワーク",
293 "current_swap": "現在のスワップ",
294 "current_wallet": "現在のウォレット",
295 "custom": "カスタム",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Etherscanの履歴",
448 "event": "イベント",
449 "events": "イベント",
450 + "evm_address_detected": "EVMアドレスが検出されました",
451 "evm_ecosystem_description": "必要に応じて、この支払いに使用するネットワークとトークンを変更してください。",
452 "exchange": "交換",
453 "exchange_extra_info": "交換のためにこのトランザクションを送信する際は、メモまたは追加IDの指定をお忘れなく",
@@ -665,6 +670,9 @@
670 "nanogpt_subtitle": "すべての最新モデル(GPT-5.3、Claude 4.6)。\nサブスクリプション不要、暗号資産で支払い。",
671 "narrow": "狭い",
672 "network": "ネットワーク",
673 + "network_address_detected": "${network}アドレスが検出されました",
674 + "network_prefix_on": "の上",
675 + "network_switch_failed": "要求されたネットワークへの切り替えに失敗しました。支払いは適用されませんでした。もう一度お試しください。",
676 "networks": "ネットワーク",
677 "new_first_wallet_text": "暗号資産を安全に守るのはお手のものです",
678 "new_node_testing": "新しいノードのテスト",
@@ -972,6 +980,7 @@
980 "select_asset": "アセットの選択",
981 "select_backup_file": "バックアップファイルを選択",
982 "select_buy_provider_notice": "上の購入プロバイダーを選択してください。アプリ設定でデフォルトの購入プロバイダーを設定すると、この画面をスキップできます。",
983 + "select_compatible_wallet": "互換性のあるウォレットのいずれかを選択してください",
984 "select_destination": "バックアップファイルの保存先を選択してください。",
985 "select_fiat_currency_title": "通貨の選択",
986 "select_hw_account_below": "以下から復元するアカウントを選択してください:",
@@ -981,6 +990,9 @@
990 "select_network_title": "ネットワークの選択",
991 "select_other_wallet": "他のウォレットを選択",
992 "select_receiver": "受信者を選択",
993 + "select_recipient_network": "受信者ネットワークの選択",
994 + "select_recipient_network_description": "指定された受信者アドレスと互換性のある複数のネットワーク",
995 + "select_recipient_network_for_tx": "このトランザクションの受信者のネットワークを選択します",
996 "select_sell_provider_notice": "上記の売却プロバイダーを選択してください。アプリの設定でデフォルトの売却プロバイダーを設定すると、この画面をスキップできます。",
997 "select_token": "トークンを選択",
998 "select_your_country": "国を選択してください",
@@ -1013,6 +1025,8 @@
1025 "send_templates": "テンプレート",
1026 "send_title": "送信",
1027 "send_to": "送信先",
1028 + "send_to_network": "${network}に送信",
1029 + "send_to_network_description": "${network} ウォレットに切り替えるか、この支払いのために ${currentNetwork} 資金を交換しますか?",
1030 "send_to_this_address": "このアドレスに${currency} ${tag}を送信",
1031 "send_xmr": "XMRを送信",
1032 "send_your_wallet": "あなたのウォレット",
@@ -1131,6 +1145,8 @@
1145 "support_title_other_links": "その他のサポートリンク",
1146 "supported": "サポート済み",
1147 "swap": "スワップ",
1148 + "swap_from_network": "${network} からのスワップ",
1149 + "swap_from_network_description": "${targetNetwork} ネットワークに資金を送金するには、${currentNetwork} の資金を交換する必要があります。続行しますか?",
1150 "swap_id": "スワップID",
1151 "swap_provider_initial_desc": "スワップイン時に使用するスワッププロバイダーの種類を選択してください",
1152 "swap_providers": "スワッププロバイダー",
@@ -1138,6 +1154,7 @@
1154 "sweeping_wallet_alert": "すぐに完了します。この画面から離れないでください。離れると、スイープした資金が失われる可能性があります。",
1155 "swipe_to_bridge": "スワイプしてブリッジ",
1156 "swipe_to_send": "スワイプして送信",
1157 + "switch_to_x_wallet": "${network} ウォレットに切り替える",
1158 "switch_wallet": "ウォレットを切り替える",
1159 "switchToETHWallet": "Ethereumウォレットに切り替えて、もう一度お試しください",
1160 "switchToWCCompatibleWallet": "WalletConnect と互換性のあるウォレットに切り替えて、もう一度お試しください (${chains})。",
@@ -1304,6 +1321,8 @@
1321 "unspent_coins_details_title": "未使用コインの詳細",
1322 "unspent_coins_title": "未使用コイン",
1323 "unsupported_asset": "このアセットではこの操作はサポートされていません。サポートされているアセットタイプのウォレットを作成するか、対応するウォレットに切り替えてください。",
1324 + "unsupported_network_requested": "この支払いリクエストは、当社がサポートしていないネットワーク (チェーン ID ${chainId}) に対するものです。",
1325 + "unsupported_token_requested": "この支払いリクエストは、選択したネットワーク上で識別できなかったトークンに対するものです。",
1326 "uptime": "稼働時間",
1327 "upto": "${value}まで",
1328 "usb": "USB",
@@ -1451,41 +1470,5 @@
1470 "zcash_card_enable_later": "このカードは後から設定でいつでも有効にできます",
1471 "zcash_card_missing_funds": "資金が見当たりませんか?",
1472 "zcash_card_scan": "スキャン",
1454 - "zcash_card_warning": "手順が完了するまでアプリを閉じないでください。閉じると、このプロセスを最初からやり直す必要があります。",
1455 - "are_you_sure_exit": "終了してもよろしいですか?",
1456 - "available": "利用可能",
1457 - "bridging": "ブリッジ中",
1458 - "compatible_services": "対応サービス",
1459 - "compatible_services_desc": "スキャンツールを使用して、Cake Walletで対応している以下の種類のQRコードを読み取れます:",
1460 - "crypto_addresses": "暗号資産アドレス",
1461 - "delete_this_node": "このノードを削除",
1462 - "device_confirmation": "デバイスでの確認",
1463 - "favorite_token": "お気に入りのトークン",
1464 - "favorite_token_desc": "お気に入りのトークンの残高が残高カードに表示されます。",
1465 - "gallery": "ギャラリー",
1466 - "hww_exit_desc": "ハードウェアデバイスとの進行中のペアリング処理を終了します",
1467 - "input": "入力",
1468 - "manual_input": "手動入力",
1469 - "networks": "ネットワーク",
1470 - "node_share_desc": "このノードをインポートするには、スキャン画面でこのQRコードをスキャンしてください。",
1471 - "nodes_desc": "既存のノードを管理するか、カスタムノードを追加します。",
1472 - "ocp_desc": "店舗で暗号資産を使って支払う",
1473 - "pairing_code": "ペアリングコード",
1474 - "pairing_code_desc_1": "デバイスにペアリングコードが表示されます。",
1475 - "pairing_code_desc_2": "続行するにはここに入力してください",
1476 - "pairing_error": "ペアリングエラー",
1477 - "passphrase_view_keys": "パスフレーズ",
1478 - "payment_invoices": "支払い請求書",
1479 - "recieving": "受信中",
1480 - "save_contact": "連絡先を保存",
1481 - "share_this_node": "このノードを共有",
1482 - "show_combined_balance": "合計残高を表示",
1483 - "swipe_to_bridge": "スワイプしてブリッジ",
1484 - "this_can_take_few_seconds": "数秒かかる場合があります",
1485 - "username_check_your_network": "ユーザー名を確認できません。ネットワーク接続を確認してください。",
1486 - "verifying_code": "コードを確認中",
1487 - "wallet_balance": "ウォレット残高",
1488 - "wc_action_approve": "承認",
1489 - "wc_desc": "dApp に簡単に接続",
1490 - "yes_exit": "はい。終了する"
1491 -}
1473 + "zcash_card_warning": "手順が完了するまでアプリを閉じないでください。閉じると、このプロセスを最初からやり直す必要があります。"
1474 +}
\ No newline at end of file
res/values/strings_ko.arb
+21 -37
@@ -94,6 +94,7 @@
94 "available_balance": "사용 가능 잔액",
95 "available_balance_description": "“사용 가능 잔액” 또는 “확정 잔액”은 즉시 사용할 수 있는 자금입니다. 자금이 아래 잔액에는 표시되지만 위 잔액에는 표시되지 않는 경우, 입금된 자금이 네트워크에서 더 많은 컨펌(확인)을 받을 때까지 몇 분 정도 기다려야 합니다. 더 많은 컨펌을 받은 후에는 사용할 수 있습니다.",
96 "avg_savings": "평균 절감액",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "dApp의 처리가 완료될 때까지 잠시 기다려 주세요.",
99 "awaiting_payment_confirmation": "결제 확인을 기다리는 중",
100 "background_sync": "백그라운드 동기화",
@@ -219,6 +220,7 @@
220 "color_theme": "색상 테마",
221 "coming_soon_tag": "출시 예정",
222 "commit_transaction_amount_fee": "트랜잭션 제출\n금액: ${amount}\n수수료: ${fee}",
223 + "compatible_networks": "호환 가능한 네트워크",
224 "compatible_services": "호환 서비스",
225 "compatible_services_desc": "스캔 도구를 사용하여 Cake Wallet에서 지원하는 다음 유형의 QR 코드를 읽으세요:",
226 "configure": "설정",
@@ -258,6 +260,7 @@
260 "contact_support": "지원팀에 문의하기",
261 "contacts": "연락처",
262 "continue_text": "계속",
263 + "continue_to_swap": "계속해서 교환하세요",
264 "contract_address": "컨트랙트 주소",
265 "contract_warning": "이 컨트랙트 주소는 잠재적인 사기 가능성이 있는 것으로 표시되었습니다. 주의하여 진행해 주세요.",
266 "contractName": "컨트랙트 이름",
@@ -286,6 +289,7 @@
289 "creation_date": "생성일",
290 "crypto_addresses": "암호화폐 주소",
291 "csv_nothing_to_export": "내보낼 항목이 없습니다",
292 + "current_network": "현재 네트워크",
293 "current_swap": "현재 스왑",
294 "current_wallet": "현재 지갑",
295 "custom": "사용자 지정",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Etherscan 기록",
448 "event": "이벤트",
449 "events": "이벤트",
450 + "evm_address_detected": "EVM 주소가 감지되었습니다",
451 "evm_ecosystem_description": "필요한 경우 이 결제에 사용할 네트워크와 토큰을 변경하세요.",
452 "exchange": "교환",
453 "exchange_extra_info": "교환을 위해 이 거래를 전송할 때 메모 또는 Extra ID를 반드시 입력해 주세요.",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "최신 모델 모두(GPT-5.3, Claude 4.6).\n구독 없이 암호화폐로 결제.",
670 "narrow": "좁게",
671 "network": "네트워크",
672 + "network_address_detected": "${network} 주소가 감지되었습니다",
673 + "network_prefix_on": "~에",
674 + "network_switch_failed": "요청한 네트워크로 전환하지 못했습니다. 결제가 적용되지 않았습니다. 다시 시도해 주세요.",
675 "networks": "네트워크",
676 "new_first_wallet_text": "암호화폐를 안전하게 지키는 건 식은 죽 먹기예요",
677 "new_node_testing": "새 노드 테스트",
@@ -971,6 +979,7 @@
979 "select_asset": "자산 선택",
980 "select_backup_file": "백업 파일 선택",
981 "select_buy_provider_notice": "위에서 구매 제공업체를 선택하세요. 앱 설정에서 기본 구매 제공업체를 설정하면 이 화면을 건너뛸 수 있습니다.",
982 + "select_compatible_wallet": "호환되는 지갑 중 하나를 선택하세요",
983 "select_destination": "백업 파일의 저장 위치를 선택해 주세요.",
984 "select_fiat_currency_title": "통화 선택",
985 "select_hw_account_below": "아래에서 복구할 계정을 선택해 주세요:",
@@ -980,6 +989,9 @@
989 "select_network_title": "네트워크 선택",
990 "select_other_wallet": "다른 Wallet 선택",
991 "select_receiver": "수신자 선택",
992 + "select_recipient_network": "수신자 네트워크 선택",
993 + "select_recipient_network_description": "제공된 수신자 주소와 여러 네트워크가 호환됩니다.",
994 + "select_recipient_network_for_tx": "이 거래에 대한 수신자의 네트워크를 선택하세요.",
995 "select_sell_provider_notice": "위에서 판매 제공업체를 선택하세요. 앱 설정에서 기본 판매 제공업체를 설정하면 이 화면을 건너뛸 수 있습니다.",
996 "select_token": "토큰 선택",
997 "select_your_country": "국가를 선택해 주세요",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "템플릿",
1025 "send_title": "보내기",
1026 "send_to": "받는 주소",
1027 + "send_to_network": "${network}로 보내기",
1028 + "send_to_network_description": "${network} 지갑으로 전환하시겠습니까, 아니면 ${currentNetwork} 자금을 이 결제로 바꾸시겠습니까?",
1029 "send_to_this_address": "이 주소로 ${currency} ${tag} 보내기",
1030 "send_xmr": "XMR 보내기",
1031 "send_your_wallet": "내 지갑",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "기타 지원 링크",
1145 "supported": "지원됨",
1146 "swap": "스왑",
1147 + "swap_from_network": "${network}에서 교체",
1148 + "swap_from_network_description": "${targetNetwork} 네트워크로 자금을 보내려면 ${currentNetwork} 자금을 교환해야 합니다. 계속하시겠습니까?",
1149 "swap_id": "스왑 ID",
1150 "swap_provider_initial_desc": "스왑 인할 때 사용하려는 스왑 제공자 유형을 선택하세요.",
1151 "swap_providers": "스왑 제공업체",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "오래 걸리지 않습니다. 이 화면을 떠나지 마세요. 그렇지 않으면 스윕된 자금이 손실될 수 있습니다.",
1154 "swipe_to_bridge": "스와이프하여 브리지",
1155 "swipe_to_send": "밀어서 보내기",
1156 + "switch_to_x_wallet": "${network} 월렛으로 전환",
1157 "switch_wallet": "지갑 전환",
1158 "switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도하세요",
1159 "switchToWCCompatibleWallet": "WalletConnect 호환 지갑으로 전환한 후 다시 시도하세요(${chains}).",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "미사용 코인 상세 정보",
1321 "unspent_coins_title": "미사용 코인",
1322 "unsupported_asset": "이 자산에서는 이 작업을 지원하지 않습니다. 지원되는 자산 유형의 지갑을 생성하거나 해당 지갑으로 전환하세요.",
1323 + "unsupported_network_requested": "이 결제 요청은 당사가 지원하지 않는 네트워크(체인 ID ${chainId})에 대한 것입니다.",
1324 + "unsupported_token_requested": "이 결제 요청은 선택한 네트워크에서 식별할 수 없는 토큰에 대한 것입니다.",
1325 "uptime": "가동 시간",
1326 "upto": "${value}까지",
1327 "usb": "USB",
@@ -1450,40 +1469,5 @@
1469 "zcash_card_enable_later": "설정에서 언제든지 나중에 이 카드를 활성화할 수 있습니다.",
1470 "zcash_card_missing_funds": "자금이 사라졌나요?",
1471 "zcash_card_scan": "스캔",
1453 - "zcash_card_warning": "절차가 완료될 때까지 앱을 닫지 마십시오. 닫으면 이 과정을 처음부터 다시 시작해야 합니다.",
1454 - "are_you_sure_exit": "정말 종료하시겠습니까?",
1455 - "available": "사용 가능",
1456 - "bridging": "브리징",
1457 - "compatible_services": "호환 서비스",
1458 - "compatible_services_desc": "스캔 도구를 사용하여 Cake Wallet에서 지원하는 다음 유형의 QR 코드를 읽으세요:",
1459 - "crypto_addresses": "암호화폐 주소",
1460 - "delete_this_node": "이 노드 삭제",
1461 - "device_confirmation": "기기 확인",
1462 - "favorite_token": "즐겨찾는 토큰",
1463 - "favorite_token_desc": "즐겨찾는 토큰의 잔액이 잔액 카드에 표시됩니다.",
1464 - "gallery": "갤러리",
1465 - "hww_exit_desc": "하드웨어 기기와 진행 중인 페어링 과정을 종료합니다",
1466 - "input": "입력",
1467 - "manual_input": "수동 입력",
1468 - "networks": "네트워크",
1469 - "node_share_desc": "이 노드를 가져오려면 스캔 화면에서 이 QR 코드를 스캔하세요.",
1470 - "nodes_desc": "기존 노드를 관리하거나 사용자 지정 노드를 추가하세요.",
1471 - "ocp_desc": "매장에서 암호화폐로 결제",
1472 - "pairing_code": "페어링 코드",
1473 - "pairing_code_desc_1": "기기에 페어링 코드가 표시됩니다.",
1474 - "pairing_code_desc_2": "계속하려면 여기에 입력하세요",
1475 - "pairing_error": "페어링 오류",
1476 - "payment_invoices": "결제 청구서",
1477 - "recieving": "수신 중",
1478 - "save_contact": "연락처 저장",
1479 - "share_this_node": "이 노드 공유",
1480 - "show_combined_balance": "합산 잔액 표시",
1481 - "swipe_to_bridge": "스와이프하여 브리지",
1482 - "this_can_take_few_seconds": "몇 초 정도 걸릴 수 있습니다",
1483 - "username_check_your_network": "사용자 이름을 확인할 수 없습니다. 네트워크 연결을 확인해 주세요.",
1484 - "verifying_code": "코드 확인 중",
1485 - "wallet_balance": "지갑 잔액",
1486 - "wc_action_approve": "승인",
1487 - "wc_desc": "DApp에 손쉽게 연결",
1488 - "yes_exit": "예. 종료"
1489 -}
1472 + "zcash_card_warning": "절차가 완료될 때까지 앱을 닫지 마십시오. 닫으면 이 과정을 처음부터 다시 시작해야 합니다."
1473 +}
\ No newline at end of file
res/values/strings_my.arb
+21 -38
@@ -94,6 +94,7 @@
94 "available_balance": "ရရှိနိုင်သော လက်ကျန်",
95 "available_balance_description": "“Available Balance” သို့မဟုတ် “Confirmed Balance” သည် ချက်ချင်းသုံးစွဲနိုင်သော လက်ကျန်ငွေဖြစ်သည်။ လက်ကျန်အောက်ပိုင်းတွင်သာ ဝင်လာသော်လည်း အပေါ်ပိုင်းလက်ကျန်တွင် မပေါ်သေးပါက ကွန်ယက်အတည်ပြုချက် (network confirmations) ပိုမိုရရှိရန် မိနစ်အနည်းငယ် စောင့်ရပါမည်။ အတည်ပြုချက်များ ပိုမိုရရှိပြီးနောက် ထိုငွေများကို သုံးစွဲနိုင်ပါလိမ့်မည်။",
96 "avg_savings": "ပျမ်းမျှ ချွေတာမှု",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "ကျေးဇူးပြု၍ dApp ၏ စီမံဆောင်ရွက်မှု ပြီးဆုံးသည်အထိ စောင့်ပါ။",
99 "awaiting_payment_confirmation": "ငွေပေးချေမှု အတည်ပြုချက်ကို စောင့်ဆိုင်းနေသည်",
100 "background_sync": "နောက်ခံတွင် ထပ်တူပြုခြင်း",
@@ -219,6 +220,7 @@
220 "color_theme": "အရောင်အပြင်အဆင်",
221 "coming_soon_tag": "မကြာမီလာမည်",
222 "commit_transaction_amount_fee": "ငွေလွှဲမှုကို အတည်ပြုပါ\nပမာဏ: ${amount}\nအခကြေးငွေ: ${fee}",
223 + "compatible_networks": "လိုက်ဖက်သောကွန်ရက်များ",
224 "compatible_services": "တွဲဖက်အသုံးပြုနိုင်သော ဝန်ဆောင်မှုများ",
225 "compatible_services_desc": "Cake Wallet တွင် ပံ့ပိုးထားသော အောက်ပါ QR ကုဒ်အမျိုးအစားများကို ဖတ်ရန် Scan tool ကို အသုံးပြုပါ:",
226 "configure": "ပြင်ဆင်ရန်",
@@ -258,6 +260,7 @@
260 "contact_support": "အကူအညီပံ့ပိုးမှုကို ဆက်သွယ်ပါ",
261 "contacts": "အဆက်အသွယ်များ",
262 "continue_text": "ဆက်လက်လုပ်ဆောင်ရန်",
263 + "continue_to_swap": "Swap သို့ ဆက်သွားပါ။",
264 "contract_address": "ကွန်ထရက် လိပ်စာ",
265 "contract_warning": "ဤကွန်ထရက်လိပ်စာကို လိမ်လည်မှုဖြစ်နိုင်ခြေရှိသည်ဟု သတိပေးအလံတင်ထားပါသည်။ ကျေးဇူးပြု၍ သတိဖြင့် ဆက်လက်လုပ်ဆောင်ပါ။",
266 "contractName": "ကွန်ထရက်အမည်",
@@ -286,6 +289,7 @@
289 "creation_date": "ဖန်တီးသည့်နေ့စွဲ",
290 "crypto_addresses": "Crypto လိပ်စာများ",
291 "csv_nothing_to_export": "ထုတ်ယူရန် မရှိပါ",
292 + "current_network": "လက်ရှိကွန်ရက်",
293 "current_swap": "လက်ရှိ Swap",
294 "current_wallet": "လက်ရှိ Wallet",
295 "custom": "စိတ်ကြိုက်",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Etherscan မှတ်တမ်း",
448 "event": "အဖြစ်အပျက်",
449 "events": "ဖြစ်ရပ်များ",
450 + "evm_address_detected": "EVM လိပ်စာကို ရှာတွေ့ထားသည်။",
451 "evm_ecosystem_description": "လိုအပ်ပါက ဤငွေပေးချေမှုအတွက် သင်အသုံးပြုလိုသည့် ကွန်ရက်နှင့် တိုကင်ကို ပြင်ဆင်ပါ။",
452 "exchange": "လဲလှယ်",
453 "exchange_extra_info": "လဲလှယ်မှုအတွက် ဤငွေပေးငွေယူကို ပို့နေစဉ် Memo သို့မဟုတ် Extra ID ကို သတ်မှတ်ပေးရန် မမေ့ပါနှင့်",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "နောက်ဆုံးပေါ်မော်ဒယ်များအားလုံး (GPT-5.3, Claude 4.6)။\nစာရင်းသွင်းမှုမလို၊ crypto ဖြင့်ပေးချေပါ။",
670 "narrow": "ကျဉ်း",
671 "network": "ကွန်ရက်",
672 + "network_address_detected": "${network} လိပ်စာကို တွေ့ရှိသည်",
673 + "network_prefix_on": "on",
674 + "network_switch_failed": "တောင်းဆိုထားသောကွန်ရက်သို့ ပြောင်း၍မရပါ။ ငွေပေးချေမှုကို မသက်ရောက်ပါ၊ ထပ်စမ်းကြည့်ပါ။",
675 "networks": "ကွန်ရက်များ",
676 "new_first_wallet_text": "သင့်ရဲ့ crypto ကို လုံခြုံအောင် ထိန်းသိမ်းတာက လွယ်လွယ်ကူကူပါပဲ",
677 "new_node_testing": "နိုဒ်အသစ် စမ်းသပ်ခြင်း",
@@ -971,6 +979,7 @@
979 "select_asset": "ပိုင်ဆိုင်မှုကို ရွေးပါ။",
980 "select_backup_file": "အရန်ကူးဖိုင်ကို ရွေးပါ",
981 "select_buy_provider_notice": "အပေါ်တွင်ရှိသော ဝယ်ယူမှု ပံ့ပိုးသူကို ရွေးချယ်ပါ။ App settings တွင် သင့်မူလ ဝယ်ယူမှု ပံ့ပိုးသူကို သတ်မှတ်ထားခြင်းဖြင့် ဤစခရင်ကို ကျော်သွားနိုင်သည်။",
982 + "select_compatible_wallet": "သင့်နှင့်လိုက်ဖက်သော ပိုက်ဆံအိတ်များထဲမှ တစ်ခုကို ရွေးပါ။",
983 "select_destination": "အရန်ကူးဖိုင်အတွက် သိမ်းဆည်းမည့်နေရာကို ရွေးချယ်ပါ။",
984 "select_fiat_currency_title": "ငွေကြေးကို ရွေးပါ။",
985 "select_hw_account_below": "အောက်တွင် ပြန်လည်ရယူရန် မည်သည့်အကောင့်ကို ရွေးချယ်မည်ကို ကျေးဇူးပြု၍ ရွေးပါ။",
@@ -980,6 +989,9 @@
989 "select_network_title": "Network ကို ရွေးပါ။",
990 "select_other_wallet": "အခြား Wallet ကို ရွေးချယ်ပါ",
991 "select_receiver": "လက်ခံသူကို ရွေးချယ်ပါ",
992 + "select_recipient_network": "လက်ခံသူကွန်ရက်ကို ရွေးပါ။",
993 + "select_recipient_network_description": "ကွန်ရက်များစွာသည် ပေးထားသော လက်ခံသူလိပ်စာနှင့် တွဲဖက်အသုံးပြုနိုင်ပါသည်။",
994 + "select_recipient_network_for_tx": "ဤလွှဲပြောင်းမှုအတွက် လက်ခံသူ၏ ကွန်ရက်ကို ရွေးပါ။",
995 "select_sell_provider_notice": "အထက်တွင်ရှိသော အရောင်းဝန်ဆောင်မှုပေးသူကို ရွေးပါ။ အက်ပ်ဆက်တင်များတွင် သင်၏ မူလ အရောင်းဝန်ဆောင်မှုပေးသူကို သတ်မှတ်ထားခြင်းဖြင့် ဤစခရင်ကို ကျော်နိုင်သည်။",
996 "select_token": "တိုကင်ကို ရွေးချယ်ပါ",
997 "select_your_country": "ကျေးဇူးပြု၍ သင့်နိုင်ငံကို ရွေးချယ်ပါ",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "တမ်းပလိတ်များ",
1025 "send_title": "ပို့ရန်",
1026 "send_to": "သို့ ပို့ရန်",
1027 + "send_to_network": "${network} သို့ ပို့ပါ",
1028 + "send_to_network_description": "သင့် ${network} ပိုက်ဆံအိတ်သို့ ပြောင်းလိုပါသလား သို့မဟုတ် ဤပေးချေမှုအတွက် သင်၏ ${currentNetwork} ရန်ပုံငွေများကို လဲလှယ်လိုပါသလား။",
1029 "send_to_this_address": "${currency} ${tag}ကို ဤလိပ်စာသို့ ပို့ပါ",
1030 "send_xmr": "XMR ပို့ရန်",
1031 "send_your_wallet": "သင့်ဝေါလက်",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "အခြားအကူအညီလင့်များ",
1145 "supported": "ပံ့ပိုးထားသည်",
1146 "swap": "Swap",
1147 + "swap_from_network": "${network} မှ လဲလှယ်ရန်",
1148 + "swap_from_network_description": "${targetNetwork} ကွန်ရက်သို့ ရန်ပုံငွေများ ပေးပို့ရန်၊ သင်သည် သင်၏ ${currentNetwork} ရန်ပုံငွေများကို လဲလှယ်ရန် လိုအပ်ပါမည်။ ရှေ့ဆက်လိုပါသလား။",
1149 "swap_id": "Swap ID",
1150 "swap_provider_initial_desc": "Swap လုပ်ရာတွင် သင်အသုံးပြုလိုသည့် swap provider အမျိုးအစားကို ရွေးချယ်ပါ။",
1151 "swap_providers": "Swap ဝန်ဆောင်မှုပေးသူများ",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "ဒါက ကြာကြာမခံသင့်ပါဘူး။ ဒီစခရင်ကနေ မထွက်ပါနဲ့၊ မဟုတ်ရင် sweep လုပ်ထားတဲ့ ရန်ပုံငွေတွေ ပျောက်ဆုံးနိုင်ပါတယ်။",
1154 "swipe_to_bridge": "Bridge လုပ်ရန် ပွတ်ဆွဲပါ",
1155 "swipe_to_send": "ပို့ရန် ပွတ်ဆွဲပါ",
1156 + "switch_to_x_wallet": "${network} Wallet သို့ပြောင်းပါ။",
1157 "switch_wallet": "ပိုက်ဆံအိတ် ပြောင်းရန်",
1158 "switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်မံကြိုးစားကြည့်ပါ။",
1159 "switchToWCCompatibleWallet": "ကျေးဇူးပြု၍ WalletConnect တွဲဖက်သုံးနိုင်သော ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ (${chains})။",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "မသုံးရသေးသော ကွိုင်များ၏ အသေးစိတ်",
1321 "unspent_coins_title": "မသုံးရသေးသော ကွိုင်များ",
1322 "unsupported_asset": "ဤပိုင်ဆိုင်မှုအတွက် ဤလုပ်ဆောင်ချက်ကို ကျွန်ုပ်တို့ မပံ့ပိုးပါ။ ကျေးဇူးပြု၍ ပံ့ပိုးထားသော ပိုင်ဆိုင်မှုအမျိုးအစားရှိ ပိုက်ဆံအိတ်ကို ဖန်တီးပါ သို့မဟုတ် ထိုအမျိုးအစားရှိ ပိုက်ဆံအိတ်သို့ ပြောင်းပါ။",
1323 + "unsupported_network_requested": "ဤငွေပေးချေမှုတောင်းဆိုမှုသည် ကျွန်ုပ်တို့မပံ့ပိုးနိုင်သော ကွန်ရက်တစ်ခုအတွက်ဖြစ်သည် (ကွင်းဆက် ID ${chainId})။",
1324 + "unsupported_token_requested": "ဤငွေပေးချေမှု တောင်းဆိုချက်သည် ရွေးချယ်ထားသော ကွန်ရက်တွင် ကျွန်ုပ်တို့ မဖော်ထုတ်နိုင်သော တိုကင်တစ်ခုအတွက် ဖြစ်ပါသည်။",
1325 "uptime": "လည်ပတ်ချိန်",
1326 "upto": "${value} အထိ",
1327 "usb": "USB",
@@ -1450,41 +1469,5 @@
1469 "zcash_card_enable_later": "သင်သည် ဤကတ်ကို ဆက်တင်များတွင် နောက်မှ အချိန်မရွေး ဖွင့်နိုင်ပါသည်။",
1470 "zcash_card_missing_funds": "ငွေကြေး ပျောက်ဆုံးနေပါသလား?",
1471 "zcash_card_scan": "စကင်",
1453 - "zcash_card_warning": "လုပ်ငန်းစဉ် ပြီးဆုံးသည်အထိ အက်ပ်ကို မပိတ်ပါနှင့်။ ပိတ်လိုက်ပါက ဤလုပ်ငန်းစဉ်ကို အစမှ ပြန်လည်စတင်ရမည်ဖြစ်သည်။",
1454 - "are_you_sure_exit": "ထွက်လိုသည်မှာ သေချာပါသလား။",
1455 - "available": "ရရှိနိုင်သည်",
1456 - "bridging": "Bridge လုပ်နေသည်",
1457 - "compatible_services": "တွဲဖက်အသုံးပြုနိုင်သော ဝန်ဆောင်မှုများ",
1458 - "compatible_services_desc": "Cake Wallet တွင် ပံ့ပိုးထားသော အောက်ပါ QR ကုဒ်အမျိုးအစားများကို ဖတ်ရန် Scan tool ကို အသုံးပြုပါ:",
1459 - "crypto_addresses": "Crypto လိပ်စာများ",
1460 - "delete_this_node": "ဤ node ကို ဖျက်ပါ",
1461 - "device_confirmation": "စက်ပစ္စည်း အတည်ပြုခြင်း",
1462 - "favorite_token": "အကြိုက်ဆုံး တိုကင်",
1463 - "favorite_token_desc": "အကြိုက်ဆုံး တိုကင်၏ လက်ကျန်ကို လက်ကျန် ကတ်ပေါ်တွင် ပြသပါမည်။",
1464 - "gallery": "ပြခန်း",
1465 - "hww_exit_desc": "၎င်းသည် သင့်ဟာ့ဒ်ဝဲ စက်ပစ္စည်းနှင့် ဆက်လက်လုပ်ဆောင်နေသော တွဲချိတ်မှု လုပ်ငန်းစဉ်ကို ရပ်တန့်စေမည်ဖြစ်သည်။",
1466 - "input": "ထည့်သွင်းမှု",
1467 - "manual_input": "လက်ဖြင့် ထည့်သွင်းခြင်း",
1468 - "networks": "ကွန်ရက်များ",
1469 - "node_share_desc": "ဤ node ကို တင်သွင်းရန် Scan စခရင်မှ ဤ QR ကုဒ်ကို စကင်ဖတ်ပါ။",
1470 - "nodes_desc": "ရှိပြီးသား node များကို စီမံပါ သို့မဟုတ် စိတ်ကြိုက်တစ်ခု ထည့်ပါ။",
1471 - "ocp_desc": "ဆိုင်များတွင် crypto ဖြင့် ပေးချေပါ",
1472 - "pairing_code": "တွဲချိတ်ကုဒ်",
1473 - "pairing_code_desc_1": "သင့်စက်ပစ္စည်းသည် တွဲချိတ်ကုဒ်တစ်ခုကို ပြသပါမည်။",
1474 - "pairing_code_desc_2": "ဆက်လက်လုပ်ဆောင်ရန် ဤနေရာတွင် ထည့်ပါ",
1475 - "pairing_error": "တွဲချိတ်မှု အမှား",
1476 - "passphrase_view_keys": "Passphrase",
1477 - "payment_invoices": "ငွေပေးချေမှု ငွေတောင်းခံလွှာများ",
1478 - "recieving": "လက်ခံနေသည်",
1479 - "save_contact": "အဆက်အသွယ်ကို သိမ်းဆည်းပါ",
1480 - "share_this_node": "ဤ node ကို မျှဝေပါ",
1481 - "show_combined_balance": "ပေါင်းစပ်လက်ကျန်ကို ပြပါ",
1482 - "swipe_to_bridge": "Bridge လုပ်ရန် ပွတ်ဆွဲပါ",
1483 - "this_can_take_few_seconds": "၎င်းသည် စက္ကန့်အနည်းငယ် ကြာနိုင်ပါသည်",
1484 - "username_check_your_network": "အသုံးပြုသူအမည်ကို စစ်ဆေး၍ မရပါ။ ကျေးဇူးပြု၍ သင့်ကွန်ရက်ချိတ်ဆက်မှုကို စစ်ဆေးပါ။",
1485 - "verifying_code": "ကုဒ်ကို စိစစ်နေသည်",
1486 - "wallet_balance": "ပိုက်ဆံအိတ် လက်ကျန်",
1487 - "wc_action_approve": "အတည်ပြု",
1488 - "wc_desc": "dApp များသို့ လွယ်ကူစွာ ချိတ်ဆက်ပါ",
1489 - "yes_exit": "ဟုတ်ကဲ့။ ထွက်ပါ"
1490 -}
1472 + "zcash_card_warning": "လုပ်ငန်းစဉ် ပြီးဆုံးသည်အထိ အက်ပ်ကို မပိတ်ပါနှင့်။ ပိတ်လိုက်ပါက ဤလုပ်ငန်းစဉ်ကို အစမှ ပြန်လည်စတင်ရမည်ဖြစ်သည်။"
1473 +}
\ No newline at end of file
res/values/strings_nl.arb
+21 -41
@@ -94,6 +94,7 @@
94 "available_balance": "Beschikbaar saldo",
95 "available_balance_description": "Het “Beschikbare saldo” of “Bevestigde saldo” zijn fondsen die direct kunnen worden uitgegeven. Als fondsen in het lagere saldo verschijnen maar niet in het bovenste saldo, dan moet je een paar minuten wachten tot de inkomende fondsen meer netwerkbevestigingen krijgen. Daarna kan het worden uitgegeven.",
96 "avg_savings": "Gem. besparingen",
97 + "avl": "Gem",
98 "awaitDAppProcessing": "Wacht tot de dApp klaar is met verwerken.",
99 "awaiting_payment_confirmation": "In afwachting van betalingsbevestiging",
100 "background_sync": "Synchronisatie op de achtergrond",
@@ -219,6 +220,7 @@
220 "color_theme": "Kleurthema",
221 "coming_soon_tag": "Binnenkort",
222 "commit_transaction_amount_fee": "Bevestig transactie\nBedrag: ${amount}\nKosten: ${fee}",
223 + "compatible_networks": "Compatibele netwerken",
224 "compatible_services": "Compatibele services",
225 "compatible_services_desc": "Gebruik de Scan-tool om de volgende soorten QR-codes te lezen die door Cake Wallet worden ondersteund:",
226 "configure": "Configureren",
@@ -258,6 +260,7 @@
260 "contact_support": "Contact opnemen met support",
261 "contacts": "Contacten",
262 "continue_text": "Doorgaan",
263 + "continue_to_swap": "Ga door met wisselen",
264 "contract_address": "Contractadres",
265 "contract_warning": "Dit contractadres is gemarkeerd als mogelijk frauduleus. Ga alsjeblieft voorzichtig te werk.",
266 "contractName": "Contractnaam",
@@ -286,6 +289,7 @@
289 "creation_date": "Aanmaakdatum",
290 "crypto_addresses": "Crypto-adressen",
291 "csv_nothing_to_export": "Niets om te exporteren",
292 + "current_network": "Huidig ​​netwerk",
293 "current_swap": "Huidige swap",
294 "current_wallet": "Huidige wallet",
295 "custom": "Aangepast",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Etherscan-geschiedenis",
448 "event": "Gebeurtenis",
449 "events": "Gebeurtenissen",
450 + "evm_address_detected": "EVM-adres gedetecteerd",
451 "evm_ecosystem_description": "Wijzig indien nodig het netwerk en het token dat je voor deze betaling wilt gebruiken.",
452 "exchange": "Exchange",
453 "exchange_extra_info": "Vergeet niet om de Memo of Extra ID op te geven tijdens het verzenden van deze transactie voor de exchange",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Alle nieuwste modellen (GPT-5.3, Claude 4.6).\nGeen abonnement, betaal met crypto.",
670 "narrow": "Smal",
671 "network": "Netwerk",
672 + "network_address_detected": "${network}-adres gedetecteerd",
673 + "network_prefix_on": "op",
674 + "network_switch_failed": "Kan niet overschakelen naar het gevraagde netwerk. De betaling is niet toegepast. Probeer het opnieuw.",
675 "networks": "Netwerken",
676 "new_first_wallet_text": "Je crypto veilig houden is een fluitje van een cent",
677 "new_node_testing": "Nieuwe node testen",
@@ -971,6 +979,7 @@
979 "select_asset": "Selecteer Activa",
980 "select_backup_file": "Selecteer een back-upbestand",
981 "select_buy_provider_notice": "Selecteer hierboven een koopprovider. Je kunt dit scherm overslaan door je standaard koopprovider in te stellen in app-instellingen.",
982 + "select_compatible_wallet": "Selecteer een van uw compatibele portemonnees",
983 "select_destination": "Selecteer de bestemming voor het back-upbestand.",
984 "select_fiat_currency_title": "Selecteer Valuta",
985 "select_hw_account_below": "Selecteer hieronder welk account je wilt herstellen:",
@@ -980,6 +989,9 @@
989 "select_network_title": "Selecteer Netwerk",
990 "select_other_wallet": "Selecteer een andere wallet",
991 "select_receiver": "Selecteer ontvanger",
992 + "select_recipient_network": "Selecteer Ontvangersnetwerk",
993 + "select_recipient_network_description": "Meerdere netwerken zijn compatibel met het opgegeven ontvangersadres",
994 + "select_recipient_network_for_tx": "Selecteer het netwerk van de ontvanger van deze transactie",
995 "select_sell_provider_notice": "Selecteer hierboven een verkoopaanbieder. Je kunt dit scherm overslaan door je standaardverkoopprovider in te stellen in de app-instellingen.",
996 "select_token": "Selecteer Token",
997 "select_your_country": "Selecteer je land",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "Sjablonen",
1025 "send_title": "Stuur",
1026 "send_to": "Verzenden naar",
1027 + "send_to_network": "Verzenden naar ${network}",
1028 + "send_to_network_description": "Wilt u overstappen naar uw ${network}-portemonnee of uw ${currentNetwork}-tegoed inruilen voor deze betaling?",
1029 "send_to_this_address": "Stuur ${currency} ${tag}naar dit adres",
1030 "send_xmr": "Verstuur XMR",
1031 "send_your_wallet": "Je wallet",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "Andere supportlinks",
1145 "supported": "Ondersteund",
1146 "swap": "Swap",
1147 + "swap_from_network": "Wissel van ${network}",
1148 + "swap_from_network_description": "Om geld naar het ${targetNetwork} netwerk te sturen, moet u uw ${currentNetwork} geld omwisselen. Wilt u doorgaan?",
1149 "swap_id": "Swap-ID",
1150 "swap_provider_initial_desc": "Selecteer het type swapprovider dat je wilt gebruiken bij het swappen",
1151 "swap_providers": "Swapproviders",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "Dit duurt niet lang. VERLAAT DIT SCHERM NIET, ANDERS KUNNEN DE FONDSEN VERLOREN GAAN.",
1154 "swipe_to_bridge": "Veeg om te bridgen",
1155 "swipe_to_send": "Swipe om te verzenden",
1156 + "switch_to_x_wallet": "Schakel over naar ${network} Wallet",
1157 "switch_wallet": "Wissel van wallet",
1158 "switchToETHWallet": "Schakel over naar een Ethereum-wallet en probeer het opnieuw",
1159 "switchToWCCompatibleWallet": "Schakel over naar een WalletConnect-compatibele wallet en probeer het opnieuw (${chains}).",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "Details van niet-uitgegeven saldo",
1321 "unspent_coins_title": "Niet-uitgegeven saldo",
1322 "unsupported_asset": "We ondersteunen deze actie niet voor deze coin. Maak een wallet van een ondersteund activatype aan of schakel ernaar over.",
1323 + "unsupported_network_requested": "Dit betalingsverzoek is voor een netwerk dat we niet ondersteunen (keten-ID ${chainId}).",
1324 + "unsupported_token_requested": "Dit betalingsverzoek betreft een token dat we niet konden identificeren op het geselecteerde netwerk.",
1325 "uptime": "Uptime",
1326 "upto": "tot ${value}",
1327 "usb": "USB",
@@ -1451,44 +1470,5 @@
1470 "zcash_card_enable_later": "Je kunt deze kaart later altijd inschakelen via de instellingen",
1471 "zcash_card_missing_funds": "Fondsen ontbreken?",
1472 "zcash_card_scan": "Scannen",
1454 - "zcash_card_warning": "Sluit de app niet voordat de procedure is voltooid. Als je dit wel doet, moet dit proces helemaal opnieuw worden gestart.",
1455 - "are_you_sure_exit": "Weet je zeker dat je wilt afsluiten?",
1456 - "assets": "Activa",
1457 - "available": "Beschikbaar",
1458 - "bridging": "Bridgen",
1459 - "choose_wallet": "Kies wallet",
1460 - "compatible_services": "Compatibele services",
1461 - "compatible_services_desc": "Gebruik de Scan-tool om de volgende soorten QR-codes te lezen die door Cake Wallet worden ondersteund:",
1462 - "crypto_addresses": "Crypto-adressen",
1463 - "delete_this_node": "Deze node verwijderen",
1464 - "device_confirmation": "Apparaatbevestiging",
1465 - "favorite_token": "Favoriete token",
1466 - "favorite_token_desc": "Het saldo van de favoriete token wordt op de saldokaart weergegeven.",
1467 - "gallery": "Galerij",
1468 - "hww_exit_desc": "Hiermee wordt het lopende koppelingsproces met je hardware-apparaat beëindigd",
1469 - "input": "Invoer",
1470 - "litecoin_mweb_display": "Toon MWEB op startscherm",
1471 - "manual_input": "Handmatige invoer",
1472 - "networks": "Netwerken",
1473 - "node_share_desc": "Scan deze QR-code vanaf het Scan-scherm om deze node te importeren.",
1474 - "nodes_desc": "Beheer bestaande nodes of voeg een aangepaste toe.",
1475 - "ocp_desc": "Betaal met crypto in winkels",
1476 - "pairing_code": "Koppelingscode",
1477 - "pairing_code_desc_1": "Je apparaat toont een koppelingscode.",
1478 - "pairing_code_desc_2": "Voer deze hier in om door te gaan",
1479 - "pairing_error": "Koppelingsfout",
1480 - "passphrase_view_keys": "Wachtwoordzin",
1481 - "payment_invoices": "Betalingsfacturen",
1482 - "recieving": "Bezig met ontvangen",
1483 - "save_contact": "Contact opslaan",
1484 - "share_this_node": "Deel deze node",
1485 - "show_combined_balance": "Toon gecombineerd saldo",
1486 - "swipe_to_bridge": "Veeg om te bridgen",
1487 - "this_can_take_few_seconds": "Dit kan een paar seconden duren",
1488 - "username_check_your_network": "Kan gebruikersnaam niet controleren. Controleer je netwerkverbinding.",
1489 - "verifying_code": "Code verifiëren",
1490 - "wallet_balance": "Walletsaldo",
1491 - "wc_action_approve": "Goedkeuren",
1492 - "wc_desc": "Maak eenvoudig verbinding met dApps",
1493 - "yes_exit": "Ja. Afsluiten"
1494 -}
1473 + "zcash_card_warning": "Sluit de app niet voordat de procedure is voltooid. Als je dit wel doet, moet dit proces helemaal opnieuw worden gestart."
1474 +}
\ No newline at end of file
res/values/strings_pl.arb
+21 -39
@@ -94,6 +94,7 @@
94 "available_balance": "Dostępne saldo",
95 "available_balance_description": "„Dostępne saldo” lub „Potwierdzone saldo” to środki, które można wydać od razu. Jeśli środki pojawiają się w dolnym saldzie, ale nie w górnym, musisz poczekać kilka minut, aż przychodzące środki uzyskają więcej potwierdzeń sieci. Gdy uzyskają więcej potwierdzeń, będzie można je wydać.",
96 "avg_savings": "Śr. oszczędności",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Proszę poczekać, aż dApp zakończy przetwarzanie.",
99 "awaiting_payment_confirmation": "Oczekiwanie na potwierdzenie płatności",
100 "background_sync": "Synchronizacja w tle",
@@ -219,6 +220,7 @@
220 "color_theme": "Motyw kolorystyczny",
221 "coming_soon_tag": "Wkrótce",
222 "commit_transaction_amount_fee": "Zatwierdź transakcję\nKwota: ${amount}\nOpłata: ${fee}",
223 + "compatible_networks": "Kompatybilne sieci",
224 "compatible_services": "Zgodne usługi",
225 "compatible_services_desc": "Użyj narzędzia Skanuj, aby odczytać następujące typy kodów QR obsługiwane w Cake Wallet:",
226 "configure": "Konfiguruj",
@@ -258,6 +260,7 @@
260 "contact_support": "Skontaktuj się z pomocą techniczną",
261 "contacts": "Kontakty",
262 "continue_text": "Kontynuuj",
263 + "continue_to_swap": "Kontynuuj Zamień",
264 "contract_address": "Adres kontraktu",
265 "contract_warning": "Ten adres kontraktu został oznaczony jako potencjalnie oszukańczy. Prosimy zachować ostrożność.",
266 "contractName": "Nazwa kontraktu",
@@ -286,6 +289,7 @@
289 "creation_date": "Data utworzenia",
290 "crypto_addresses": "Adresy krypto",
291 "csv_nothing_to_export": "Brak danych do eksportu",
292 + "current_network": "Bieżąca sieć",
293 "current_swap": "Bieżący swap",
294 "current_wallet": "Bieżący portfel",
295 "custom": "Niestandardowy",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Historia w Etherscan",
448 "event": "Zdarzenie",
449 "events": "Zdarzenia",
450 + "evm_address_detected": "Wykryto adres EVM",
451 "evm_ecosystem_description": "W razie potrzeby zmień sieć i token, których chcesz użyć do tej płatności.",
452 "exchange": "Wymiana",
453 "exchange_extra_info": "Proszę nie zapomnieć podać Memo lub Extra ID podczas wysyłania tej transakcji do wymiany",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Wszystkie najnowsze modele (GPT-5.3, Claude 4.6).\nBez subskrypcji, płać kryptowalutą.",
670 "narrow": "Wąski",
671 "network": "Sieć",
672 + "network_address_detected": "Wykryto adres ${network}",
673 + "network_prefix_on": "NA",
674 + "network_switch_failed": "Nie udało się przełączyć na żądaną sieć. Płatność nie została zastosowana. Spróbuj ponownie.",
675 "networks": "Sieci",
676 "new_first_wallet_text": "Bezpieczne przechowywanie Twoich kryptowalut to bułka z masłem",
677 "new_node_testing": "Testowanie nowego węzła",
@@ -971,6 +979,7 @@
979 "select_asset": "Wybierz Zasób",
980 "select_backup_file": "Wybierz plik kopii zapasowej",
981 "select_buy_provider_notice": "Wybierz powyżej dostawcę zakupu. Możesz pominąć ten ekran, ustawiając domyślnego dostawcę zakupu w ustawieniach aplikacji.",
982 + "select_compatible_wallet": "Wybierz jeden ze swoich kompatybilnych portfeli",
983 "select_destination": "Wybierz miejsce docelowe dla pliku kopii zapasowej.",
984 "select_fiat_currency_title": "Wybierz walutę",
985 "select_hw_account_below": "Wybierz poniżej konto do przywrócenia:",
@@ -980,6 +989,9 @@
989 "select_network_title": "Wybierz sieć",
990 "select_other_wallet": "Wybierz inny portfel",
991 "select_receiver": "Wybierz odbiorcę",
992 + "select_recipient_network": "Wybierz Sieć odbiorców",
993 + "select_recipient_network_description": "Z podanym adresem odbiorcy jest kompatybilnych wiele sieci",
994 + "select_recipient_network_for_tx": "Wybierz sieć Odbiorcy tej transakcji",
995 "select_sell_provider_notice": "Wybierz powyżej dostawcę sprzedaży. Możesz pominąć ten ekran, ustawiając domyślnego dostawcę sprzedaży w ustawieniach aplikacji.",
996 "select_token": "Wybierz token",
997 "select_your_country": "Wybierz swój kraj",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "Szablony",
1025 "send_title": "Wyślij",
1026 "send_to": "Wyślij do",
1027 + "send_to_network": "Wyślij do ${network}",
1028 + "send_to_network_description": "Czy chcesz przejść na portfel ${network} lub zamienić środki ${currentNetwork} na tę płatność?",
1029 "send_to_this_address": "Wyślij ${currency} ${tag}na ten adres",
1030 "send_xmr": "Wyślij XMR",
1031 "send_your_wallet": "Twój portfel",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "Inne linki wsparcia",
1145 "supported": "Obsługiwane",
1146 "swap": "Swap",
1147 + "swap_from_network": "Zamień z ${network}",
1148 + "swap_from_network_description": "Aby wysłać środki do sieci ${targetNetwork}, musisz wymienić swoje środki ${currentNetwork}. Czy chcesz kontynuować?",
1149 "swap_id": "ID wymiany",
1150 "swap_provider_initial_desc": "Wybierz typ dostawcy swapów, którego wolisz używać podczas swapowania w",
1151 "swap_providers": "Dostawcy wymiany",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "To nie powinno zająć dużo czasu. NIE OPUSZCZAJ TEGO EKRANU, W PRZECIWNYM RAZIE ZAMIATANE ŚRODKI MOGĄ ZOSTAĆ UTRACONE.",
1154 "swipe_to_bridge": "Przesuń, aby zmostkować",
1155 "swipe_to_send": "Przesuń, aby wysłać",
1156 + "switch_to_x_wallet": "Przełącz na portfel ${network}",
1157 "switch_wallet": "Przełącz portfel",
1158 "switchToETHWallet": "Przełącz się na portfel Ethereum i spróbuj ponownie",
1159 "switchToWCCompatibleWallet": "Przełącz się na portfel zgodny z WalletConnect i spróbuj ponownie (${chains}).",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "Szczegóły niewydanych monet",
1321 "unspent_coins_title": "Niewydane monety",
1322 "unsupported_asset": "Nie obsługujemy tej czynności dla tego aktywa. Utwórz lub przełącz się na portfel obsługiwanego typu aktywów.",
1323 + "unsupported_network_requested": "To żądanie płatności dotyczy sieci, której nie obsługujemy (identyfikator łańcucha ${chainId}).",
1324 + "unsupported_token_requested": "To żądanie płatności dotyczy tokena, którego nie mogliśmy zidentyfikować w wybranej sieci.",
1325 "uptime": "Czas działania",
1326 "upto": "do ${value}",
1327 "usb": "USB",
@@ -1450,42 +1469,5 @@
1469 "zcash_card_enable_later": "Zawsze możesz włączyć tę kartę później w ustawieniach",
1470 "zcash_card_missing_funds": "Brakuje środków?",
1471 "zcash_card_scan": "Skanuj",
1453 - "zcash_card_warning": "Nie zamykaj aplikacji do czasu zakończenia procedury. Jeśli to zrobisz, proces będzie musiał rozpocząć się od nowa.",
1454 - "are_you_sure_exit": "Czy na pewno chcesz wyjść?",
1455 - "available": "Dostępne",
1456 - "bridging": "Mostkowanie",
1457 - "compatible_services": "Zgodne usługi",
1458 - "compatible_services_desc": "Użyj narzędzia Skanuj, aby odczytać następujące typy kodów QR obsługiwane w Cake Wallet:",
1459 - "crypto_addresses": "Adresy krypto",
1460 - "delete_this_node": "Usuń ten węzeł",
1461 - "device_confirmation": "Potwierdzenie na urządzeniu",
1462 - "evm_ecosystem_description": "W razie potrzeby zmień sieć i token, których chcesz użyć do tej płatności.",
1463 - "favorite_token": "Ulubiony token",
1464 - "favorite_token_desc": "Saldo ulubionego tokena będzie wyświetlane na karcie salda.",
1465 - "gallery": "Galeria",
1466 - "hww_exit_desc": "Spowoduje to zakończenie trwającego procesu parowania z Twoim urządzeniem sprzętowym",
1467 - "input": "Dane wejściowe",
1468 - "manual_input": "Wprowadzanie ręczne",
1469 - "networks": "Sieci",
1470 - "node_share_desc": "Zeskanuj ten kod QR z ekranu Skanuj, aby zaimportować ten węzeł.",
1471 - "nodes_desc": "Zarządzaj istniejącymi węzłami lub dodaj własny.",
1472 - "ocp_desc": "Płać kryptowalutą w sklepach",
1473 - "pairing_code": "Kod parowania",
1474 - "pairing_code_desc_1": "Twoje urządzenie wyświetli kod parowania.",
1475 - "pairing_code_desc_2": "Wprowadź go tutaj, aby kontynuować",
1476 - "pairing_error": "Błąd parowania",
1477 - "passphrase_view_keys": "Fraza hasła",
1478 - "payment_invoices": "Faktury płatności",
1479 - "recieving": "Odbieranie",
1480 - "save_contact": "Zapisz kontakt",
1481 - "share_this_node": "Udostępnij ten węzeł",
1482 - "show_combined_balance": "Pokaż łączne saldo",
1483 - "swipe_to_bridge": "Przesuń, aby zmostkować",
1484 - "this_can_take_few_seconds": "To może potrwać kilka sekund",
1485 - "username_check_your_network": "Nie można sprawdzić nazwy użytkownika. Sprawdź połączenie sieciowe.",
1486 - "verifying_code": "Weryfikowanie kodu",
1487 - "wallet_balance": "Saldo portfela",
1488 - "wc_action_approve": "Zatwierdź",
1489 - "wc_desc": "Łatwo łącz się z aplikacjami dApp",
1490 - "yes_exit": "Tak. Wyjdź"
1491 -}
1472 + "zcash_card_warning": "Nie zamykaj aplikacji do czasu zakończenia procedury. Jeśli to zrobisz, proces będzie musiał rozpocząć się od nowa."
1473 +}
\ No newline at end of file
res/values/strings_pt.arb
+21 -38
@@ -94,6 +94,7 @@
94 "available_balance": "Saldo disponível",
95 "available_balance_description": "O “Saldo Disponível” ou “Saldo Confirmado” são fundos que podem ser gastos imediatamente. Se os fundos aparecerem no saldo inferior, mas não no saldo superior, você deve aguardar alguns minutos para que os fundos recebidos obtenham mais confirmações na rede. Depois que tiverem mais confirmações, eles poderão ser gastos.",
96 "avg_savings": "Poupança média",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Por favor, aguarde o dApp concluir o processamento.",
99 "awaiting_payment_confirmation": "Aguardando confirmação do pagamento",
100 "background_sync": "Sincronização em segundo plano",
@@ -219,6 +220,7 @@
220 "color_theme": "Tema de cores",
221 "coming_soon_tag": "Em breve",
222 "commit_transaction_amount_fee": "Confirmar transação\nValor: ${amount}\nTaxa: ${fee}",
223 + "compatible_networks": "Redes Compatíveis",
224 "compatible_services": "Serviços compatíveis",
225 "compatible_services_desc": "Use a ferramenta de digitalização para ler os seguintes tipos de códigos QR suportados na Cake Wallet:",
226 "configure": "Configurar",
@@ -258,6 +260,7 @@
260 "contact_support": "Contactar o Suporte",
261 "contacts": "Contatos",
262 "continue_text": "Continuar",
263 + "continue_to_swap": "Continuar para trocar",
264 "contract_address": "Endereço do contrato",
265 "contract_warning": "Este endereço de contrato foi sinalizado como potencialmente fraudulento. Prossiga com cautela.",
266 "contractName": "Nome do contrato",
@@ -286,6 +289,7 @@
289 "creation_date": "Data de criação",
290 "crypto_addresses": "Endereços de cripto",
291 "csv_nothing_to_export": "Nada para exportar",
292 + "current_network": "Rede atual",
293 "current_swap": "Troca atual",
294 "current_wallet": "Carteira atual",
295 "custom": "Personalizado",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Histórico do Etherscan",
448 "event": "Evento",
449 "events": "Eventos",
450 + "evm_address_detected": "Endereço EVM detectado",
451 "evm_ecosystem_description": "Se necessário, altere a rede e o token que você gostaria de usar para este pagamento.",
452 "exchange": "Câmbio",
453 "exchange_extra_info": "Por favor, não se esqueça de especificar o Memo ou o ID extra ao enviar esta transação para a exchange",
@@ -665,6 +670,9 @@
670 "nanogpt_subtitle": "Todos os modelos mais recentes (GPT-5.3, Claude 4.6).\nSem assinatura, pague com cripto.",
671 "narrow": "Estreito",
672 "network": "Rede",
673 + "network_address_detected": "Endereço ${network} detectado",
674 + "network_prefix_on": "sobre",
675 + "network_switch_failed": "Falha ao mudar para a rede solicitada. O pagamento não foi aplicado, tente novamente.",
676 "networks": "Redes",
677 "new_first_wallet_text": "Manter suas criptos seguras é moleza",
678 "new_node_testing": "Teste de novo nó",
@@ -973,6 +981,7 @@
981 "select_asset": "Selecione Ativo",
982 "select_backup_file": "Selecionar arquivo de backup",
983 "select_buy_provider_notice": "Selecione um provedor de compra acima. Você pode pular esta tela definindo seu provedor de compra padrão nas configurações do app.",
984 + "select_compatible_wallet": "Selecione uma de suas carteiras compatíveis",
985 "select_destination": "Selecione o destino para o arquivo de backup.",
986 "select_fiat_currency_title": "Selecione a moeda",
987 "select_hw_account_below": "Selecione abaixo qual conta restaurar:",
@@ -982,6 +991,9 @@
991 "select_network_title": "Selecione Rede",
992 "select_other_wallet": "Selecionar outra carteira",
993 "select_receiver": "Selecionar destinatário",
994 + "select_recipient_network": "Selecione a rede do destinatário",
995 + "select_recipient_network_description": "Várias redes são compatíveis com o endereço do destinatário fornecido",
996 + "select_recipient_network_for_tx": "Selecione a rede do destinatário desta transação",
997 "select_sell_provider_notice": "Selecione um provedor de venda acima. Você pode pular esta tela definindo seu provedor de venda padrão nas configurações do aplicativo.",
998 "select_token": "Selecionar token",
999 "select_your_country": "Por favor, selecione seu país",
@@ -1014,6 +1026,8 @@
1026 "send_templates": "Modelos",
1027 "send_title": "Enviar",
1028 "send_to": "Enviar para",
1029 + "send_to_network": "Enviar para ${network}",
1030 + "send_to_network_description": "Gostaria de mudar para sua carteira ${network} ou trocar seus fundos ${currentNetwork} por este pagamento?",
1031 "send_to_this_address": "Envie ${currency} ${tag} para este endereço",
1032 "send_xmr": "Enviar XMR",
1033 "send_your_wallet": "Sua carteira",
@@ -1132,6 +1146,8 @@
1146 "support_title_other_links": "Outros links de suporte",
1147 "supported": "Suportado",
1148 "swap": "Swap",
1149 + "swap_from_network": "Trocar de ${network}",
1150 + "swap_from_network_description": "Para enviar fundos para a rede ${targetNetwork}, você precisará trocar seus fundos ${currentNetwork}. Você quer prosseguir?",
1151 "swap_id": "ID da troca",
1152 "swap_provider_initial_desc": "Selecione o tipo de provedor de swap que você prefere usar ao fazer swaps em",
1153 "swap_providers": "Provedores de swap",
@@ -1139,6 +1155,7 @@
1155 "sweeping_wallet_alert": "Isso não deve demorar muito. NÃO SAIA DESTA TELA OU OS FUNDOS VARRIDOS PODEM SER PERDIDOS.",
1156 "swipe_to_bridge": "Deslize para fazer bridge",
1157 "swipe_to_send": "Deslize para enviar",
1158 + "switch_to_x_wallet": "Mudar para a carteira ${network}",
1159 "switch_wallet": "Alternar carteira",
1160 "switchToETHWallet": "Por favor, mude para uma carteira Ethereum e tente novamente",
1161 "switchToWCCompatibleWallet": "Mude para uma carteira compatível com WalletConnect e tente novamente (${chains}).",
@@ -1305,6 +1322,8 @@
1322 "unspent_coins_details_title": "Detalhes das moedas não gastas",
1323 "unspent_coins_title": "Moedas não gastas",
1324 "unsupported_asset": "Não oferecemos suporte a esta ação para este ativo. Crie ou alterne para uma carteira de um tipo de ativo compatível.",
1325 + "unsupported_network_requested": "Esta solicitação de pagamento é para uma rede não compatível (ID da cadeia ${chainId}).",
1326 + "unsupported_token_requested": "Esta solicitação de pagamento refere-se a um token que não conseguimos identificar na rede selecionada.",
1327 "uptime": "Tempo de atividade",
1328 "upto": "até ${value}",
1329 "usb": "USB",
@@ -1453,41 +1472,5 @@
1472 "zcash_card_enable_later": "Você sempre pode ativar este cartão mais tarde nas configurações",
1473 "zcash_card_missing_funds": "Fundos em falta?",
1474 "zcash_card_scan": "Escanear",
1456 - "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.",
1457 - "are_you_sure_exit": "Tem a certeza de que pretende sair?",
1458 - "available": "Disponível",
1459 - "bridging": "A fazer bridge",
1460 - "compatible_services": "Serviços compatíveis",
1461 - "compatible_services_desc": "Use a ferramenta de digitalização para ler os seguintes tipos de códigos QR suportados na Cake Wallet:",
1462 - "crypto_addresses": "Endereços de cripto",
1463 - "delete_this_node": "Eliminar este nó",
1464 - "device_confirmation": "Confirmação no dispositivo",
1465 - "favorite_token": "Token favorito",
1466 - "favorite_token_desc": "O saldo do token favorito será apresentado no cartão de saldo.",
1467 - "gallery": "Galeria",
1468 - "hww_exit_desc": "Isto irá terminar o processo de emparelhamento em curso com o seu dispositivo de hardware",
1469 - "input": "Entrada",
1470 - "manual_input": "Introdução manual",
1471 - "networks": "Redes",
1472 - "node_share_desc": "Digitalize este código QR a partir do ecrã de digitalização para importar este nó.",
1473 - "nodes_desc": "Faça a gestão dos nós existentes ou adicione um personalizado.",
1474 - "ocp_desc": "Pague com cripto em lojas",
1475 - "pairing_code": "Código de emparelhamento",
1476 - "pairing_code_desc_1": "O seu dispositivo irá mostrar um código de emparelhamento.",
1477 - "pairing_code_desc_2": "Introduza-o aqui para continuar",
1478 - "pairing_error": "Erro de emparelhamento",
1479 - "passphrase_view_keys": "Frase-senha",
1480 - "payment_invoices": "Faturas de pagamento",
1481 - "recieving": "A receber",
1482 - "save_contact": "Guardar contacto",
1483 - "share_this_node": "Partilhar este nó",
1484 - "show_combined_balance": "Mostrar saldo combinado",
1485 - "swipe_to_bridge": "Deslize para fazer bridge",
1486 - "this_can_take_few_seconds": "Isto pode demorar alguns segundos",
1487 - "username_check_your_network": "Não foi possível verificar o nome de utilizador. Verifique a sua ligação de rede.",
1488 - "verifying_code": "A verificar o código",
1489 - "wallet_balance": "Saldo da carteira",
1490 - "wc_action_approve": "Aprovar",
1491 - "wc_desc": "Ligue-se facilmente a DApps",
1492 - "yes_exit": "Sim. Sair"
1493 -}
1475 + "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."
1476 +}
\ No newline at end of file
res/values/strings_pt_BR.arb
+19
@@ -249,6 +249,7 @@
249 "contact_support": "Contatar o Suporte",
250 "contacts": "Contatos",
251 "continue_text": "Continuar",
252 + "continue_to_swap": "Continuar para trocar",
253 "contract_address": "Endereço do contrato",
254 "contract_warning": "Este endereço de contrato foi sinalizado como potencialmente fraudulento. Prossiga com cautela.",
255 "contractName": "Nome do Contrato",
@@ -275,6 +276,7 @@
276 "creating_new_wallet": "Criando nova carteira",
277 "creating_new_wallet_error": "Erro: ${description}",
278 "creation_date": "Data de criação",
279 + "current_network": "Rede atual",
280 "current_swap": "Swap atual",
281 "current_wallet": "Carteira atual",
282 "custom": "Personalizado",
@@ -430,6 +432,7 @@
432 "etherscan_history": "Histórico do Etherscan",
433 "event": "Evento",
434 "events": "Eventos",
435 + "evm_address_detected": "Endereço EVM detectado",
436 "evm_ecosystem_description": "Se necessário, modifique a rede e o token que deseja usar para este pagamento.",
437 "exchange": "Câmbio",
438 "exchange_extra_info": "Por favor, não se esqueça de especificar o Memo ou Extra ID ao enviar esta transação para a exchange",
@@ -644,6 +647,10 @@
647 "nanogpt_subtitle": "Todos os modelos mais recentes (GPT-5.3, Claude 4.6).\nSem assinatura, pague com cripto.",
648 "narrow": "Estreito",
649 "network": "Rede",
650 + "network_address_detected": "Endereço ${network} detectado",
651 + "network_prefix_on": "na",
652 + "network_switch_failed": "Falha ao mudar para a rede solicitada. O pagamento não foi aplicado, tente novamente.",
653 + "unsupported_token_requested": "Este pedido de pagamento é para um token que não conseguimos identificar na rede selecionada.",
654 "new_first_wallet_text": "Manter sua cripto segura é moleza",
655 "new_node_testing": "Teste de novo nó",
656 "new_subaddress_create": "Criar",
@@ -932,7 +939,11 @@
939 "select_manufacturer_title": "Selecionar fabricante",
940 "select_network": "Selecionar rede",
941 "select_other_wallet": "Selecionar outra carteira",
942 + "select_compatible_wallet": "Selecione uma de suas carteiras compatíveis",
943 "select_receiver": "Selecionar destinatário",
944 + "select_recipient_network": "Selecione a rede do destinatário",
945 + "select_recipient_network_description": "Várias redes são compatíveis com o endereço do destinatário fornecido",
946 + "select_recipient_network_for_tx": "Selecione a rede do destinatário desta transação",
947 "select_sell_provider_notice": "Selecione um provedor de venda acima. Você pode pular esta tela definindo seu provedor de venda padrão nas configurações do aplicativo.",
948 "select_token": "Selecionar token",
949 "select_your_country": "Por favor, selecione seu país",
@@ -965,6 +976,8 @@
976 "send_templates": "Modelos",
977 "send_title": "Enviar",
978 "send_to": "Enviar para",
979 + "send_to_network": "Enviar para ${network}",
980 + "send_to_network_description": "Gostaria de mudar para sua carteira ${network} ou trocar seus fundos ${currentNetwork} por este pagamento?",
981 "send_to_this_address": "Enviar ${currency} ${tag} para este endereço",
982 "send_xmr": "Enviar XMR",
983 "send_your_wallet": "Sua carteira",
@@ -1081,12 +1094,15 @@
1094 "support_title_other_links": "Outros links de suporte",
1095 "supported": "Compatível",
1096 "swap": "Swap",
1097 + "swap_from_network": "Trocar de ${network}",
1098 + "swap_from_network_description": "Para enviar fundos para a rede ${targetNetwork}, você precisará trocar seus fundos ${currentNetwork}. Você quer prosseguir?",
1099 "swap_id": "ID do Swap",
1100 "swap_provider_initial_desc": "Selecione o tipo de provedor de swap que você prefere usar ao realizar swaps",
1101 "swap_providers": "Provedores de swap",
1102 "sweeping_wallet": "Carteira em varredura",
1103 "sweeping_wallet_alert": "Isso não deve demorar muito. NÃO SAIA DESTA TELA OU OS FUNDOS VARRIDOS PODERÃO SER PERDIDOS.",
1104 "swipe_to_send": "Deslize para enviar",
1105 + "switch_to_x_wallet": "Mudar para a carteira ${network}",
1106 "switch_wallet": "Alternar carteira",
1107 "switchToETHWallet": "Por favor, mude para uma carteira Ethereum e tente novamente",
1108 "switchToWCCompatibleWallet": "Mude para uma carteira compatível com WalletConnect e tente novamente (${chains}).",
@@ -1251,6 +1267,7 @@
1267 "unspent_coins_details_title": "Detalhes de moedas não gastas",
1268 "unspent_coins_title": "Moedas não gastas",
1269 "unsupported_asset": "Não oferecemos suporte a esta ação para este ativo. Crie ou mude para uma carteira de um tipo de ativo compatível.",
1270 + "unsupported_network_requested": "Esta solicitação de pagamento é para uma rede não compatível (ID da cadeia ${chainId}).",
1271 "uptime": "Tempo de atividade",
1272 "upto": "até ${value}",
1273 "usb": "USB",
@@ -1396,7 +1413,9 @@
1413 "add_a_note": "Adicionar uma nota",
1414 "are_you_sure_exit": "Tem certeza de que deseja sair?",
1415 "available": "Disponível",
1416 + "avl": "Avl",
1417 "bridging": "Realizando bridge",
1418 + "compatible_networks": "Redes Compatíveis",
1419 "compatible_services": "Serviços compatíveis",
1420 "compatible_services_desc": "Use a ferramenta Escanear para ler os seguintes tipos de QR code suportados na Cake Wallet:",
1421 "connections_desc": "Gerencie conexões com serviços e APIs de terceiros.",
res/values/strings_ru.arb
+21 -38
@@ -94,6 +94,7 @@
94 "available_balance": "Доступный баланс",
95 "available_balance_description": "«Доступный баланс» или «Подтверждённый баланс» — это средства, которые можно потратить сразу. Если средства отображаются в нижнем балансе, но не в верхнем, значит, нужно подождать несколько минут, пока входящие средства получат больше подтверждений сети. После получения дополнительных подтверждений их можно будет потратить.",
96 "avg_savings": "Средняя экономия",
97 + "avl": "Авл",
98 "awaitDAppProcessing": "Пожалуйста, подождите, пока dApp завершит обработку.",
99 "awaiting_payment_confirmation": "Ожидание подтверждения платежа",
100 "background_sync": "Фоновая синхронизация",
@@ -219,6 +220,7 @@
220 "color_theme": "Цветовая тема",
221 "coming_soon_tag": "Скоро",
222 "commit_transaction_amount_fee": "Подтвердить транзакцию\nСумма: ${amount}\nКомиссия: ${fee}",
223 + "compatible_networks": "Совместимые сети",
224 "compatible_services": "Совместимые сервисы",
225 "compatible_services_desc": "Используйте инструмент сканирования, чтобы считывать следующие типы QR-кодов, поддерживаемые в Cake Wallet:",
226 "configure": "Настроить",
@@ -258,6 +260,7 @@
260 "contact_support": "Связаться со службой поддержки",
261 "contacts": "Контакты",
262 "continue_text": "Продолжить",
263 + "continue_to_swap": "Продолжить обмен",
264 "contract_address": "Адрес контракта",
265 "contract_warning": "Этот адрес контракта был отмечен как потенциально мошеннический. Пожалуйста, действуйте с осторожностью.",
266 "contractName": "Название контракта",
@@ -286,6 +289,7 @@
289 "creation_date": "Дата создания",
290 "crypto_addresses": "Криптоадреса",
291 "csv_nothing_to_export": "Нечего экспортировать",
292 + "current_network": "Текущая сеть",
293 "current_swap": "Текущий обмен",
294 "current_wallet": "Текущий кошелёк",
295 "custom": "Пользовательский",
@@ -443,6 +447,7 @@
447 "etherscan_history": "История Etherscan",
448 "event": "Событие",
449 "events": "События",
450 + "evm_address_detected": "Обнаружен адрес EVM",
451 "evm_ecosystem_description": "При необходимости измените сеть и токен, которые вы хотите использовать для этого платежа.",
452 "exchange": "Обмен",
453 "exchange_extra_info": "Пожалуйста, не забудьте указать Memo или Extra ID при отправке этой транзакции для обмена",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Все новейшие модели (GPT-5.3, Claude 4.6).\nБез подписки, оплата криптовалютой.",
670 "narrow": "Узкий",
671 "network": "Сеть",
672 + "network_address_detected": "Обнаружен адрес ${network}",
673 + "network_prefix_on": "на",
674 + "network_switch_failed": "Не удалось переключиться на запрошенную сеть. Платеж не был применен, попробуйте еще раз.",
675 "networks": "Сети",
676 "new_first_wallet_text": "Хранить вашу криптовалюту в безопасности — проще простого",
677 "new_node_testing": "Тестирование новой ноды",
@@ -972,6 +980,7 @@
980 "select_asset": "Выберите актив",
981 "select_backup_file": "Выберите файл резервной копии",
982 "select_buy_provider_notice": "Выберите выше провайдера для покупки. Вы можете пропустить этот экран, установив провайдера покупки по умолчанию в настройках приложения.",
983 + "select_compatible_wallet": "Выберите один из совместимых кошельков",
984 "select_destination": "Пожалуйста, выберите место назначения для файла резервной копии.",
985 "select_fiat_currency_title": "Выберите валюту",
986 "select_hw_account_below": "Пожалуйста, выберите ниже, какую учетную запись восстановить:",
@@ -981,6 +990,9 @@
990 "select_network_title": "Выберите сеть",
991 "select_other_wallet": "Выбрать другой кошелек",
992 "select_receiver": "Выберите получателя",
993 + "select_recipient_network": "Выберите сеть получателя",
994 + "select_recipient_network_description": "Несколько сетей совместимы с указанным адресом получателя.",
995 + "select_recipient_network_for_tx": "Выберите сеть Получателя для этой транзакции.",
996 "select_sell_provider_notice": "Выберите провайдера для продажи выше. Вы можете пропустить этот экран, установив провайдера для продажи по умолчанию в настройках приложения.",
997 "select_token": "Выберите токен",
998 "select_your_country": "Пожалуйста, выберите вашу страну",
@@ -1013,6 +1025,8 @@
1025 "send_templates": "Шаблоны",
1026 "send_title": "Отправить",
1027 "send_to": "Отправить на",
1028 + "send_to_network": "Отправить в ${network}",
1029 + "send_to_network_description": "Хотели бы вы переключиться на свой кошелек ${network} или обменять свои средства ${currentNetwork} на этот платеж?",
1030 "send_to_this_address": "Отправить ${currency} ${tag}на этот адрес",
1031 "send_xmr": "Отправить XMR",
1032 "send_your_wallet": "Ваш кошелёк",
@@ -1131,6 +1145,8 @@
1145 "support_title_other_links": "Другие ссылки поддержки",
1146 "supported": "Поддерживается",
1147 "swap": "Обмен",
1148 + "swap_from_network": "Обмен от ${network}",
1149 + "swap_from_network_description": "Чтобы отправить средства в сеть ${targetNetwork}, вам необходимо обменять свои средства ${currentNetwork}. Хотите продолжить?",
1150 "swap_id": "ID обмена",
1151 "swap_provider_initial_desc": "Выберите тип провайдера свопа, который вы предпочитаете использовать при свопе в",
1152 "swap_providers": "Провайдеры обмена",
@@ -1138,6 +1154,7 @@
1154 "sweeping_wallet_alert": "Это не должно занять много времени. НЕ ПОКИДАЙТЕ ЭТОТ ЭКРАН, ИНАЧЕ ПЕРЕНЕСЁННЫЕ СРЕДСТВА МОГУТ БЫТЬ ПОТЕРЯНЫ.",
1155 "swipe_to_bridge": "Проведите, чтобы выполнить перенос через мост",
1156 "swipe_to_send": "Проведите, чтобы отправить",
1157 + "switch_to_x_wallet": "Переключитесь на кошелек ${network}",
1158 "switch_wallet": "Переключить кошелёк",
1159 "switchToETHWallet": "Пожалуйста, переключитесь на кошелёк Ethereum и повторите попытку",
1160 "switchToWCCompatibleWallet": "Пожалуйста, переключитесь на кошелек, совместимый с WalletConnect, и повторите попытку (${chains}).",
@@ -1304,6 +1321,8 @@
1321 "unspent_coins_details_title": "Сведения о неизрасходованных монетах",
1322 "unspent_coins_title": "Непотраченные монеты",
1323 "unsupported_asset": "Мы не поддерживаем это действие для этого актива. Пожалуйста, создайте или переключитесь на кошелек поддерживаемого типа актива.",
1324 + "unsupported_network_requested": "Этот запрос платежа предназначен для сети, которую мы не поддерживаем (идентификатор цепочки ${chainId}).",
1325 + "unsupported_token_requested": "Этот запрос платежа предназначен для токена, который мы не смогли идентифицировать в выбранной сети.",
1326 "uptime": "Время работы",
1327 "upto": "до ${value}",
1328 "usb": "USB",
@@ -1451,41 +1470,5 @@
1470 "zcash_card_enable_later": "Вы всегда можете включить эту карту позже в настройках",
1471 "zcash_card_missing_funds": "Не хватает средств?",
1472 "zcash_card_scan": "Сканировать",
1454 - "zcash_card_warning": "Не закрывайте приложение до завершения процедуры. Если вы это сделаете, процесс придется перезапустить с нуля.",
1455 - "are_you_sure_exit": "Вы уверены, что хотите выйти?",
1456 - "available": "Доступно",
1457 - "bridging": "Перенос через мост",
1458 - "compatible_services": "Совместимые сервисы",
1459 - "compatible_services_desc": "Используйте инструмент сканирования, чтобы считывать следующие типы QR-кодов, поддерживаемые в Cake Wallet:",
1460 - "crypto_addresses": "Криптоадреса",
1461 - "delete_this_node": "Удалить этот узел",
1462 - "device_confirmation": "Подтверждение на устройстве",
1463 - "favorite_token": "Избранный токен",
1464 - "favorite_token_desc": "Баланс избранного токена будет отображаться на карточке баланса.",
1465 - "gallery": "Галерея",
1466 - "hww_exit_desc": "Это завершит текущий процесс сопряжения с вашим аппаратным устройством",
1467 - "input": "Вход",
1468 - "manual_input": "Ручной ввод",
1469 - "networks": "Сети",
1470 - "node_share_desc": "Отсканируйте этот QR-код на экране сканирования, чтобы импортировать этот узел.",
1471 - "nodes_desc": "Управляйте существующими узлами или добавьте пользовательский.",
1472 - "ocp_desc": "Платите криптовалютой в магазинах",
1473 - "pairing_code": "Код сопряжения",
1474 - "pairing_code_desc_1": "Ваше устройство покажет код сопряжения.",
1475 - "pairing_code_desc_2": "Введите его здесь, чтобы продолжить",
1476 - "pairing_error": "Ошибка сопряжения",
1477 - "passphrase_view_keys": "Парольная фраза",
1478 - "payment_invoices": "Платёжные счета",
1479 - "recieving": "Получение",
1480 - "save_contact": "Сохранить контакт",
1481 - "share_this_node": "Поделиться этим узлом",
1482 - "show_combined_balance": "Показать объединённый баланс",
1483 - "swipe_to_bridge": "Проведите, чтобы выполнить перенос через мост",
1484 - "this_can_take_few_seconds": "Это может занять несколько секунд",
1485 - "username_check_your_network": "Не удалось проверить имя пользователя. Пожалуйста, проверьте подключение к сети.",
1486 - "verifying_code": "Проверка кода",
1487 - "wallet_balance": "Баланс кошелька",
1488 - "wc_action_approve": "Одобрить",
1489 - "wc_desc": "Легко подключайтесь к dApps",
1490 - "yes_exit": "Да. Выйти"
1491 -}
1473 + "zcash_card_warning": "Не закрывайте приложение до завершения процедуры. Если вы это сделаете, процесс придется перезапустить с нуля."
1474 +}
\ No newline at end of file
res/values/strings_th.arb
+21 -38
@@ -94,6 +94,7 @@
94 "available_balance": "ยอดคงเหลือที่ใช้ได้",
95 "available_balance_description": "“ยอดคงเหลือที่ใช้ได้” หรือ “ยอดคงเหลือที่ยืนยันแล้ว” คือเงินที่สามารถใช้จ่ายได้ทันที หากเงินปรากฏในยอดคงเหลือด้านล่างแต่ไม่ปรากฏในยอดคงเหลือด้านบน คุณต้องรอสักครู่เพื่อให้เงินที่เข้ามาได้รับการยืนยันจากเครือข่ายเพิ่มขึ้น เมื่อได้รับการยืนยันมากขึ้นแล้ว เงินนั้นจะสามารถใช้จ่ายได้",
96 "avg_savings": "การประหยัดเฉลี่ย",
97 + "avl": "เฉลี่ย",
98 "awaitDAppProcessing": "โปรดรอให้ dApp ประมวลผลให้เสร็จสิ้น",
99 "awaiting_payment_confirmation": "กำลังรอการยืนยันการชำระเงิน",
100 "background_sync": "ซิงค์ข้อมูลเบื้องหลัง",
@@ -219,6 +220,7 @@
220 "color_theme": "ธีมสี",
221 "coming_soon_tag": "เร็ว ๆ นี้",
222 "commit_transaction_amount_fee": "ยืนยันธุรกรรม\nจำนวน: ${amount}\nค่าธรรมเนียม: ${fee}",
223 + "compatible_networks": "เครือข่ายที่เข้ากันได้",
224 "compatible_services": "บริการที่รองรับ",
225 "compatible_services_desc": "ใช้เครื่องมือสแกนเพื่ออ่าน QR Code ประเภทต่อไปนี้ที่ Cake Wallet รองรับ:",
226 "configure": "ตั้งค่า",
@@ -258,6 +260,7 @@
260 "contact_support": "ติดต่อฝ่ายสนับสนุน",
261 "contacts": "ผู้ติดต่อ",
262 "continue_text": "ดำเนินการต่อ",
263 + "continue_to_swap": "สลับสับเปลี่ยนกันต่อไป",
264 "contract_address": "ที่อยู่สัญญา",
265 "contract_warning": "ที่อยู่สัญญานี้ถูกตั้งค่าสถานะว่าอาจเป็นการฉ้อโกง โปรดดำเนินการด้วยความระมัดระวัง",
266 "contractName": "ชื่อคอนแทรกต์",
@@ -286,6 +289,7 @@
289 "creation_date": "วันที่สร้าง",
290 "crypto_addresses": "ที่อยู่คริปโต",
291 "csv_nothing_to_export": "ไม่มีข้อมูลให้ส่งออก",
292 + "current_network": "เครือข่ายปัจจุบัน",
293 "current_swap": "การสวอปปัจจุบัน",
294 "current_wallet": "กระเป๋าเงินปัจจุบัน",
295 "custom": "กำหนดเอง",
@@ -443,6 +447,7 @@
447 "etherscan_history": "ประวัติ Etherscan",
448 "event": "อีเวนต์",
449 "events": "เหตุการณ์",
450 + "evm_address_detected": "ตรวจพบที่อยู่ EVM",
451 "evm_ecosystem_description": "หากจำเป็น ให้แก้ไขเครือข่ายและโทเค็นที่คุณต้องการใช้สำหรับการชำระเงินนี้",
452 "exchange": "แลกเปลี่ยน",
453 "exchange_extra_info": "โปรดอย่าลืมระบุ Memo หรือ Extra ID ขณะส่งธุรกรรมนี้เพื่อทำการแลกเปลี่ยน",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "โมเดลใหม่ล่าสุดทั้งหมด (GPT-5.3, Claude 4.6)\nไม่ต้องสมัครสมาชิก จ่ายด้วยคริปโต",
670 "narrow": "แคบ",
671 "network": "เครือข่าย",
672 + "network_address_detected": "ตรวจพบที่อยู่ ${network}",
673 + "network_prefix_on": "บน",
674 + "network_switch_failed": "ไม่สามารถสลับไปยังเครือข่ายที่ร้องขอได้ การชำระเงินไม่ได้ใช้ โปรดลองอีกครั้ง",
675 "networks": "เครือข่าย",
676 "new_first_wallet_text": "การเก็บคริปโตของคุณให้ปลอดภัยเป็นเรื่องง่ายเหมือนปอกกล้วยเข้าปาก",
677 "new_node_testing": "การทดสอบโหนดใหม่",
@@ -971,6 +979,7 @@
979 "select_asset": "เลือกสินทรัพย์",
980 "select_backup_file": "เลือกไฟล์สำรองข้อมูล",
981 "select_buy_provider_notice": "เลือกผู้ให้บริการซื้อด้านบน คุณสามารถข้ามหน้าจอนี้ได้โดยตั้งค่าผู้ให้บริการซื้อเริ่มต้นในการตั้งค่าแอป",
982 + "select_compatible_wallet": "เลือกกระเป๋าสตางค์ที่เข้ากันได้ของคุณ",
983 "select_destination": "โปรดเลือกปลายทางสำหรับไฟล์สำรองข้อมูล",
984 "select_fiat_currency_title": "เลือกสกุลเงิน",
985 "select_hw_account_below": "โปรดเลือกบัญชีที่จะกู้คืนด้านล่าง:",
@@ -980,6 +989,9 @@
989 "select_network_title": "เลือกเครือข่าย",
990 "select_other_wallet": "เลือก Wallet อื่น",
991 "select_receiver": "เลือกผู้รับ",
992 + "select_recipient_network": "เลือกเครือข่ายผู้รับ",
993 + "select_recipient_network_description": "หลายเครือข่ายเข้ากันได้กับที่อยู่ผู้รับที่ให้ไว้",
994 + "select_recipient_network_for_tx": "เลือกเครือข่ายของผู้รับการทำธุรกรรมนี้",
995 "select_sell_provider_notice": "เลือกผู้ให้บริการขายด้านบน คุณสามารถข้ามหน้าจอนี้ได้โดยตั้งค่าผู้ให้บริการขายเริ่มต้นในการตั้งค่าแอป",
996 "select_token": "เลือกโทเค็น",
997 "select_your_country": "โปรดเลือกประเทศของคุณ",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "เทมเพลต",
1025 "send_title": "ส่ง",
1026 "send_to": "ส่งไปยัง",
1027 + "send_to_network": "ส่งไปที่ ${network}",
1028 + "send_to_network_description": "คุณต้องการเปลี่ยนไปใช้กระเป๋าเงิน ${network} ของคุณหรือแลกเปลี่ยนเงิน ${currentNetwork} ของคุณสำหรับการชำระเงินนี้หรือไม่?",
1029 "send_to_this_address": "ส่ง ${currency} ${tag}ไปยังที่อยู่นี้",
1030 "send_xmr": "ส่ง XMR",
1031 "send_your_wallet": "กระเป๋าเงินของคุณ",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "ลิงก์ฝ่ายสนับสนุนอื่น ๆ",
1145 "supported": "รองรับ",
1146 "swap": "สวอป",
1147 + "swap_from_network": "สลับจาก ${network}",
1148 + "swap_from_network_description": "หากต้องการส่งเงินไปยังเครือข่าย ${targetNetwork} คุณจะต้องสลับเงิน ${currentNetwork} ของคุณ คุณต้องการดำเนินการต่อหรือไม่?",
1149 "swap_id": "รหัส Swap",
1150 "swap_provider_initial_desc": "เลือกประเภทผู้ให้บริการ Swap ที่คุณต้องการใช้เมื่อทำการ Swap",
1151 "swap_providers": "ผู้ให้บริการสวอป",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "การดำเนินการนี้ใช้เวลาไม่นาน ห้ามออกจากหน้าจอนี้ มิฉะนั้นเงินที่กวาดอาจสูญหาย",
1154 "swipe_to_bridge": "ปัดเพื่อบริดจ์",
1155 "swipe_to_send": "ปัดเพื่อส่ง",
1156 + "switch_to_x_wallet": "เปลี่ยนไปใช้กระเป๋าเงิน ${network}",
1157 "switch_wallet": "สลับกระเป๋าเงิน",
1158 "switchToETHWallet": "โปรดสลับไปยังกระเป๋าเงิน Ethereum แล้วลองอีกครั้ง",
1159 "switchToWCCompatibleWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงินที่รองรับ WalletConnect แล้วลองอีกครั้ง (${chains})",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "รายละเอียดเหรียญที่ยังไม่ได้ใช้",
1321 "unspent_coins_title": "เหรียญที่ยังไม่ได้ใช้",
1322 "unsupported_asset": "เราไม่รองรับการดำเนินการนี้สำหรับสินทรัพย์นี้ โปรดสร้างหรือสลับไปยังกระเป๋าเงินของประเภทสินทรัพย์ที่รองรับ",
1323 + "unsupported_network_requested": "คำขอการชำระเงินนี้ใช้สำหรับเครือข่ายที่เราไม่รองรับ (รหัสเชน ${chainId})",
1324 + "unsupported_token_requested": "คำขอการชำระเงินนี้ใช้สำหรับโทเค็นที่เราไม่สามารถระบุได้ในเครือข่ายที่เลือก",
1325 "uptime": "ระยะเวลาทำงาน",
1326 "upto": "สูงสุด ${value}",
1327 "usb": "USB",
@@ -1450,41 +1469,5 @@
1469 "zcash_card_enable_later": "คุณสามารถเปิดใช้งานการ์ดนี้ได้เสมอในภายหลังในการตั้งค่า",
1470 "zcash_card_missing_funds": "ยอดเงินหายไป?",
1471 "zcash_card_scan": "สแกน",
1453 - "zcash_card_warning": "อย่าปิดแอปจนกว่าขั้นตอนจะเสร็จสิ้น หากคุณปิดแอป กระบวนการนี้จะต้องเริ่มใหม่ตั้งแต่ต้น",
1454 - "are_you_sure_exit": "คุณแน่ใจหรือไม่ว่าต้องการออก?",
1455 - "available": "พร้อมใช้งาน",
1456 - "bridging": "กำลังบริดจ์",
1457 - "compatible_services": "บริการที่รองรับ",
1458 - "compatible_services_desc": "ใช้เครื่องมือสแกนเพื่ออ่าน QR Code ประเภทต่อไปนี้ที่ Cake Wallet รองรับ:",
1459 - "crypto_addresses": "ที่อยู่คริปโต",
1460 - "delete_this_node": "ลบโหนดนี้",
1461 - "device_confirmation": "การยืนยันบนอุปกรณ์",
1462 - "favorite_token": "โทเค็นโปรด",
1463 - "favorite_token_desc": "ยอดคงเหลือของโทเค็นโปรดจะแสดงบนการ์ดยอดคงเหลือ",
1464 - "gallery": "แกลเลอรี",
1465 - "hww_exit_desc": "การดำเนินการนี้จะสิ้นสุดกระบวนการจับคู่กับอุปกรณ์ฮาร์ดแวร์ของคุณที่กำลังดำเนินอยู่",
1466 - "input": "อินพุต",
1467 - "manual_input": "ป้อนข้อมูลด้วยตนเอง",
1468 - "networks": "เครือข่าย",
1469 - "node_share_desc": "สแกน QR Code นี้จากหน้าจอสแกนเพื่อนำเข้าโหนดนี้",
1470 - "nodes_desc": "จัดการโหนดที่มีอยู่หรือเพิ่มโหนดแบบกำหนดเอง",
1471 - "ocp_desc": "ชำระเงินด้วยคริปโตในร้านค้า",
1472 - "pairing_code": "รหัสจับคู่",
1473 - "pairing_code_desc_1": "อุปกรณ์ของคุณจะแสดงรหัสจับคู่",
1474 - "pairing_code_desc_2": "ป้อนที่นี่เพื่อดำเนินการต่อ",
1475 - "pairing_error": "เกิดข้อผิดพลาดในการจับคู่",
1476 - "passphrase_view_keys": "วลีรหัสผ่าน",
1477 - "payment_invoices": "ใบแจ้งหนี้การชำระเงิน",
1478 - "recieving": "กำลังรับ",
1479 - "save_contact": "บันทึกผู้ติดต่อ",
1480 - "share_this_node": "แชร์โหนดนี้",
1481 - "show_combined_balance": "แสดงยอดคงเหลือรวม",
1482 - "swipe_to_bridge": "ปัดเพื่อบริดจ์",
1483 - "this_can_take_few_seconds": "การดำเนินการนี้อาจใช้เวลาสักครู่",
1484 - "username_check_your_network": "ไม่สามารถตรวจสอบชื่อผู้ใช้ได้ โปรดตรวจสอบการเชื่อมต่อเครือข่ายของคุณ",
1485 - "verifying_code": "กำลังตรวจสอบรหัส",
1486 - "wallet_balance": "ยอดคงเหลือในกระเป๋าเงิน",
1487 - "wc_action_approve": "อนุมัติ",
1488 - "wc_desc": "เชื่อมต่อกับ DApps ได้อย่างง่ายดาย",
1489 - "yes_exit": "ใช่ ออก"
1490 -}
1472 + "zcash_card_warning": "อย่าปิดแอปจนกว่าขั้นตอนจะเสร็จสิ้น หากคุณปิดแอป กระบวนการนี้จะต้องเริ่มใหม่ตั้งแต่ต้น"
1473 +}
\ No newline at end of file
res/values/strings_tl.arb
+21 -38
@@ -94,6 +94,7 @@
94 "available_balance": "Magagamit na Balanse",
95 "available_balance_description": "Ang “Magagamit na Balanse” o “Nakumpirmang Balanse” ay mga pondong maaari nang gastusin kaagad. Kung lumalabas ang mga pondo sa mas mababang balanse ngunit wala sa itaas na balanse, kailangan mong maghintay ng ilang minuto para makakuha ng mas maraming kumpirmasyon sa network ang mga papasok na pondo. Kapag nakakuha na sila ng mas maraming kumpirmasyon, maaari na silang gastusin.",
96 "avg_savings": "Avg. Matitipid",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Mangyaring maghintay hanggang matapos ang pagproseso ng dApp.",
99 "awaiting_payment_confirmation": "Naghihintay ng Kumpirmasyon ng Pagbabayad",
100 "background_sync": "Pag-sync sa background",
@@ -219,6 +220,7 @@
220 "color_theme": "Tema ng kulay",
221 "coming_soon_tag": "Paparating na",
222 "commit_transaction_amount_fee": "I-commit ang transaksyon\nHalaga: ${amount}\nBayad: ${fee}",
223 + "compatible_networks": "Mga Katugmang Network",
224 "compatible_services": "Mga Katugmang Serbisyo",
225 "compatible_services_desc": "Gamitin ang Scan tool upang basahin ang mga sumusunod na uri ng QR code na sinusuportahan sa Cake Wallet:",
226 "configure": "I-configure",
@@ -258,6 +260,7 @@
260 "contact_support": "Makipag-ugnayan sa Suporta",
261 "contacts": "Mga Contact",
262 "continue_text": "Magpatuloy",
263 + "continue_to_swap": "Magpatuloy sa Swap",
264 "contract_address": "Address ng Kontrata",
265 "contract_warning": "Na-flag ang address ng kontratang ito bilang posibleng mapanlinlang. Mangyaring magpatuloy nang may pag-iingat.",
266 "contractName": "Pangalan ng Kontrata",
@@ -286,6 +289,7 @@
289 "creation_date": "Petsa ng Paglikha",
290 "crypto_addresses": "Mga Crypto Address",
291 "csv_nothing_to_export": "Walang i-e-export",
292 + "current_network": "Kasalukuyang Network",
293 "current_swap": "Kasalukuyang Swap",
294 "current_wallet": "Kasalukuyang wallet",
295 "custom": "Pasadya",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Kasaysayan ng Etherscan",
448 "event": "Kaganapan",
449 "events": "Mga Kaganapan",
450 + "evm_address_detected": "Natukoy ang EVM Address",
451 "evm_ecosystem_description": "Kung kinakailangan, baguhin ang network at token na gusto mong gamitin para sa pagbabayad na ito.",
452 "exchange": "Palitan",
453 "exchange_extra_info": "Mangyaring huwag kalimutang tukuyin ang Memo o Extra ID habang ipinapadala ang transaksyong ito para sa palitan",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Lahat ng pinakabagong modelo (GPT-5.3, Claude 4.6).\nWalang subscription, magbayad gamit ang crypto.",
670 "narrow": "Makitid",
671 "network": "Network",
672 + "network_address_detected": "Natukoy ang ${network} address",
673 + "network_prefix_on": "sa",
674 + "network_switch_failed": "Nabigong lumipat sa hiniling na network. Hindi nailapat ang pagbabayad, pakisubukang muli.",
675 "networks": "Mga Network",
676 "new_first_wallet_text": "Ang pagpapanatiling ligtas ng iyong crypto ay kasingdali ng pagkain ng keyk",
677 "new_node_testing": "Pagsusuri ng bagong node",
@@ -971,6 +979,7 @@
979 "select_asset": "Piliin ang Asset",
980 "select_backup_file": "Piliin ang backup file",
981 "select_buy_provider_notice": "Pumili ng provider para bumili sa itaas. Maaari mong laktawan ang screen na ito sa pamamagitan ng pagtatakda ng iyong default na provider para bumili sa mga setting ng app.",
982 + "select_compatible_wallet": "Pumili ng isa sa iyong mga katugmang wallet",
983 "select_destination": "Mangyaring piliin ang patutunguhan ng backup file.",
984 "select_fiat_currency_title": "Piliin ang Pera",
985 "select_hw_account_below": "Mangyaring piliin sa ibaba kung aling account ang ire-restore:",
@@ -980,6 +989,9 @@
989 "select_network_title": "Piliin ang Network",
990 "select_other_wallet": "Pumili ng iba pang Wallet",
991 "select_receiver": "Piliin ang Tatanggap",
992 + "select_recipient_network": "Piliin ang Recipient Network",
993 + "select_recipient_network_description": "Ang maramihang mga network ay tugma sa ibinigay na address ng tatanggap",
994 + "select_recipient_network_for_tx": "Piliin ang network ng Tatanggap sa transaksyong ito",
995 "select_sell_provider_notice": "Pumili ng sell provider sa itaas. Maaari mong laktawan ang screen na ito sa pamamagitan ng pagtatakda ng iyong default na sell provider sa mga setting ng app.",
996 "select_token": "Pumili ng Token",
997 "select_your_country": "Mangyaring piliin ang iyong bansa",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "Mga Template",
1025 "send_title": "Ipadala",
1026 "send_to": "Ipadala sa",
1027 + "send_to_network": "Ipadala sa ${network}",
1028 + "send_to_network_description": "Gusto mo bang lumipat sa iyong ${network} wallet o palitan ang iyong ${currentNetwork} na pondo para sa pagbabayad na ito?",
1029 "send_to_this_address": "Ipadala ang ${currency} ${tag}sa address na ito",
1030 "send_xmr": "Magpadala ng XMR",
1031 "send_your_wallet": "Iyong wallet",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "Iba pang mga link sa suporta",
1145 "supported": "Sinusuportahan",
1146 "swap": "Swap",
1147 + "swap_from_network": "Magpalit mula sa ${network}",
1148 + "swap_from_network_description": "Upang magpadala ng mga pondo sa network ng ${targetNetwork}, kakailanganin mong palitan ang iyong mga pondo sa ${currentNetwork}. Gusto mo bang magpatuloy?",
1149 "swap_id": "Swap ID",
1150 "swap_provider_initial_desc": "Piliin ang uri ng swap provider na mas gusto mong gamitin kapag nagsa-swap",
1151 "swap_providers": "Mga provider ng swap",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "Hindi ito dapat magtagal. HUWAG UMALIS SA SCREEN NA ITO O MAARING MAWALA ANG MGA NA-SWEEP NA PONDO.",
1154 "swipe_to_bridge": "Mag-swipe para mag-bridge",
1155 "swipe_to_send": "I-swipe para magpadala",
1156 + "switch_to_x_wallet": "Lumipat sa ${network} Wallet",
1157 "switch_wallet": "Lumipat ng Wallet",
1158 "switchToETHWallet": "Mangyaring lumipat sa isang Ethereum wallet at subukang muli",
1159 "switchToWCCompatibleWallet": "Mangyaring lumipat sa isang WalletConnect na katugmang wallet at subukang muli (${chains}).",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "Mga detalye ng mga hindi nagastos na coin",
1321 "unspent_coins_title": "Mga hindi nagastos na coin",
1322 "unsupported_asset": "Hindi namin sinusuportahan ang aksyong ito para sa asset na ito. Mangyaring gumawa o lumipat sa isang wallet na may suportadong uri ng asset.",
1323 + "unsupported_network_requested": "Ang kahilingan sa pagbabayad na ito ay para sa isang network na hindi namin sinusuportahan (chain ID ${chainId}).",
1324 + "unsupported_token_requested": "Ang kahilingan sa pagbabayad na ito ay para sa isang token na hindi namin matukoy sa napiling network.",
1325 "uptime": "Uptime",
1326 "upto": "hanggang ${value}",
1327 "usb": "USB",
@@ -1450,41 +1469,5 @@
1469 "zcash_card_enable_later": "Maaari mo itong paganahin anumang oras sa ibang pagkakataon sa mga setting",
1470 "zcash_card_missing_funds": "Nawawalang pondo?",
1471 "zcash_card_scan": "I-scan",
1453 - "zcash_card_warning": "Huwag isara ang app hanggang sa makumpleto ang proseso; kung gagawin mo ito, kakailanganing magsimula muli mula sa simula.",
1454 - "are_you_sure_exit": "Sigurado ka bang gusto mong lumabas?",
1455 - "available": "Available",
1456 - "bridging": "Bina-bridge",
1457 - "compatible_services": "Mga Katugmang Serbisyo",
1458 - "compatible_services_desc": "Gamitin ang Scan tool upang basahin ang mga sumusunod na uri ng QR code na sinusuportahan sa Cake Wallet:",
1459 - "crypto_addresses": "Mga Crypto Address",
1460 - "delete_this_node": "Tanggalin ang node na ito",
1461 - "device_confirmation": "Kumpirmasyon sa Device",
1462 - "favorite_token": "Paboritong token",
1463 - "favorite_token_desc": "Ipapakita ang balanse ng paboritong token sa balance card.",
1464 - "gallery": "Gallery",
1465 - "hww_exit_desc": "Tatapusin nito ang kasalukuyang proseso ng pagpa-pair sa iyong hardware device",
1466 - "input": "Input",
1467 - "manual_input": "Manu-manong Paglalagay",
1468 - "networks": "Mga Network",
1469 - "node_share_desc": "I-scan ang QR code na ito mula sa Scan screen upang i-import ang node na ito.",
1470 - "nodes_desc": "Pamahalaan ang mga umiiral na node o magdagdag ng custom.",
1471 - "ocp_desc": "Magbayad gamit ang crypto sa mga tindahan",
1472 - "pairing_code": "Pairing Code",
1473 - "pairing_code_desc_1": "Magpapakita ang iyong device ng isang pairing code.",
1474 - "pairing_code_desc_2": "Ilagay dito upang magpatuloy",
1475 - "pairing_error": "Error sa Pagpa-pair",
1476 - "passphrase_view_keys": "Passphrase",
1477 - "payment_invoices": "Mga Invoice ng Pagbabayad",
1478 - "recieving": "Tumatanggap",
1479 - "save_contact": "I-save ang Contact",
1480 - "share_this_node": "Ibahagi ang node na ito",
1481 - "show_combined_balance": "Ipakita ang pinagsamang balanse",
1482 - "swipe_to_bridge": "Mag-swipe para mag-bridge",
1483 - "this_can_take_few_seconds": "Maaaring tumagal ito ng ilang segundo",
1484 - "username_check_your_network": "Hindi ma-check ang username. Pakisuri ang iyong koneksyon sa network.",
1485 - "verifying_code": "Vine-verify ang Code",
1486 - "wallet_balance": "Balanse ng Wallet",
1487 - "wc_action_approve": "Aprubahan",
1488 - "wc_desc": "Madaling kumonekta sa mga DApp",
1489 - "yes_exit": "Oo. Lumabas"
1490 -}
1472 + "zcash_card_warning": "Huwag isara ang app hanggang sa makumpleto ang proseso; kung gagawin mo ito, kakailanganing magsimula muli mula sa simula."
1473 +}
\ No newline at end of file
res/values/strings_tr.arb
+21 -38
@@ -94,6 +94,7 @@
94 "available_balance": "Kullanılabilir Bakiye",
95 "available_balance_description": "“Kullanılabilir Bakiye” veya “Onaylanmış Bakiye”, hemen harcanabilen fonlardır. Fonlar alt bakiyede görünüp üst bakiyede görünmüyorsa, gelen fonların ağda daha fazla onay alması için birkaç dakika beklemeniz gerekir. Daha fazla onay aldıktan sonra harcanabilir olacaktır.",
96 "avg_savings": "Ort. Tasarruf",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Lütfen dApp'in işlemi tamamlamasını bekleyin.",
99 "awaiting_payment_confirmation": "Ödeme onayı bekleniyor",
100 "background_sync": "Arka planda senkronizasyon",
@@ -219,6 +220,7 @@
220 "color_theme": "Renk teması",
221 "coming_soon_tag": "Yakında",
222 "commit_transaction_amount_fee": "İşlemi onayla\nTutar: ${amount}\nÜcret: ${fee}",
223 + "compatible_networks": "Uyumlu Ağlar",
224 "compatible_services": "Uyumlu Hizmetler",
225 "compatible_services_desc": "Cake Wallet'ta desteklenen aşağıdaki QR kodu türlerini okumak için Tarama aracını kullanın:",
226 "configure": "Yapılandır",
@@ -258,6 +260,7 @@
260 "contact_support": "Destek ile İletişime Geçin",
261 "contacts": "Kişiler",
262 "continue_text": "Devam et",
263 + "continue_to_swap": "Değiştirmeye Devam Et",
264 "contract_address": "Sözleşme Adresi",
265 "contract_warning": "Bu sözleşme adresi potansiyel olarak dolandırıcılık amaçlı olarak işaretlenmiştir. Lütfen dikkatli ilerleyin.",
266 "contractName": "Sözleşme Adı",
@@ -286,6 +289,7 @@
289 "creation_date": "Oluşturulma Tarihi",
290 "crypto_addresses": "Kripto Adresleri",
291 "csv_nothing_to_export": "Dışa aktarılacak bir şey yok",
292 + "current_network": "Mevcut Ağ",
293 "current_swap": "Mevcut Takas",
294 "current_wallet": "Geçerli cüzdan",
295 "custom": "Özel",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Etherscan geçmişi",
448 "event": "Etkinlik",
449 "events": "Etkinlikler",
450 + "evm_address_detected": "EVM Adresi Algılandı",
451 "evm_ecosystem_description": "Gerekirse bu ödeme için kullanmak istediğiniz ağı ve token’ı değiştirin.",
452 "exchange": "Takas",
453 "exchange_extra_info": "Bu işlemi borsaya gönderirken lütfen Memo veya Extra ID belirtmeyi unutmayın.",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "En yeni modellerin tümü (GPT-5.3, Claude 4.6).\nAbonelik yok, kripto ile ödeyin.",
670 "narrow": "Dar",
671 "network": "Ağ",
672 + "network_address_detected": "${network} adresi algılandı",
673 + "network_prefix_on": "Açık",
674 + "network_switch_failed": "İstenilen ağa geçiş yapılamadı. Ödeme uygulanmadı, lütfen tekrar deneyin.",
675 "networks": "Ağlar",
676 "new_first_wallet_text": "Kriptonuzu güvende tutmak çocuk oyuncağı",
677 "new_node_testing": "Yeni düğüm testi",
@@ -971,6 +979,7 @@
979 "select_asset": "Varlık Seç",
980 "select_backup_file": "Yedekleme dosyasını seç",
981 "select_buy_provider_notice": "Yukarıdan bir satın alma sağlayıcısı seçin. Uygulama ayarlarında varsayılan satın alma sağlayıcınızı belirleyerek bu ekranı atlayabilirsiniz.",
982 + "select_compatible_wallet": "Uyumlu cüzdanlarınızdan birini seçin",
983 "select_destination": "Lütfen yedekleme dosyası için bir hedef seçin.",
984 "select_fiat_currency_title": "Para Birimi Seçin",
985 "select_hw_account_below": "Lütfen aşağıdan geri yüklenecek hesabı seçin:",
@@ -980,6 +989,9 @@
989 "select_network_title": "Ağ Seçin",
990 "select_other_wallet": "Başka bir Cüzdan seçin",
991 "select_receiver": "Alıcı Seçin",
992 + "select_recipient_network": "Alıcı Ağını Seçin",
993 + "select_recipient_network_description": "Sağlanan alıcı adresiyle birden fazla ağ uyumludur",
994 + "select_recipient_network_for_tx": "Bu işlemin Alıcısının ağını seçin",
995 "select_sell_provider_notice": "Yukarıdan bir satış sağlayıcısı seçin. Uygulama ayarlarında varsayılan satış sağlayıcınızı belirleyerek bu ekranı atlayabilirsiniz.",
996 "select_token": "Token Seç",
997 "select_your_country": "Lütfen ülkenizi seçin",
@@ -1012,6 +1024,8 @@
1024 "send_templates": "Şablonlar",
1025 "send_title": "Gönder",
1026 "send_to": "Şuraya gönder",
1027 + "send_to_network": "${network}'a gönder",
1028 + "send_to_network_description": "Bu ödeme için ${network} cüzdanınıza geçmek veya ${currentNetwork} paranızı takas etmek ister misiniz?",
1029 "send_to_this_address": "${currency} ${tag}bu adrese gönder",
1030 "send_xmr": "XMR Gönder",
1031 "send_your_wallet": "Cüzdanınız",
@@ -1130,6 +1144,8 @@
1144 "support_title_other_links": "Diğer destek bağlantıları",
1145 "supported": "Desteklenen",
1146 "swap": "Takas",
1147 + "swap_from_network": "${network}'tan takas yapın",
1148 + "swap_from_network_description": "${targetNetwork} ağına para göndermek için ${currentNetwork} paranızı değiştirmeniz gerekecektir. Devam etmek istiyor musunuz?",
1149 "swap_id": "Swap Kimliği",
1150 "swap_provider_initial_desc": "Swap yaparken kullanmayı tercih ettiğiniz swap sağlayıcı türünü seçin",
1151 "swap_providers": "Takas sağlayıcıları",
@@ -1137,6 +1153,7 @@
1153 "sweeping_wallet_alert": "Bu uzun sürmemeli. BU EKRANDAN AYRILMAYIN, AKSİ TAKDİRDE SÜPÜRÜLEN FONLAR KAYBOLABİLİR.",
1154 "swipe_to_bridge": "Köprülemek için kaydırın",
1155 "swipe_to_send": "Göndermek için kaydırın",
1156 + "switch_to_x_wallet": "${network} Cüzdan'a geçin",
1157 "switch_wallet": "Cüzdan Değiştir",
1158 "switchToETHWallet": "Lütfen bir Ethereum cüzdanına geçin ve tekrar deneyin",
1159 "switchToWCCompatibleWallet": "Lütfen WalletConnect uyumlu bir cüzdana geçin ve tekrar deneyin (${chains}).",
@@ -1303,6 +1320,8 @@
1320 "unspent_coins_details_title": "Harcanmamış coin detayları",
1321 "unspent_coins_title": "Harcanmamış coinler",
1322 "unsupported_asset": "Bu varlık için bu eylemi desteklemiyoruz. Lütfen desteklenen bir varlık türüne sahip bir cüzdan oluşturun veya o cüzdana geçiş yapın.",
1323 + "unsupported_network_requested": "Bu ödeme isteği, desteklemediğimiz bir ağ içindir (zincir kimliği ${chainId}).",
1324 + "unsupported_token_requested": "Bu ödeme isteği, seçilen ağda tanımlayamadığımız bir jeton için.",
1325 "uptime": "Çalışma süresi",
1326 "upto": "${value} değerine kadar",
1327 "usb": "USB",
@@ -1450,41 +1469,5 @@
1469 "zcash_card_enable_later": "Bu kartı daha sonra ayarlardan her zaman etkinleştirebilirsiniz",
1470 "zcash_card_missing_funds": "Bakiye eksik mi?",
1471 "zcash_card_scan": "Tara",
1453 - "zcash_card_warning": "İşlem tamamlanana kadar uygulamayı kapatmayın; aksi takdirde bu işlemin baştan yeniden başlatılması gerekecektir.",
1454 - "are_you_sure_exit": "Çıkmak istediğinizden emin misiniz?",
1455 - "available": "Kullanılabilir",
1456 - "bridging": "Köprüleniyor",
1457 - "compatible_services": "Uyumlu Hizmetler",
1458 - "compatible_services_desc": "Cake Wallet'ta desteklenen aşağıdaki QR kodu türlerini okumak için Tarama aracını kullanın:",
1459 - "crypto_addresses": "Kripto Adresleri",
1460 - "delete_this_node": "Bu düğümü sil",
1461 - "device_confirmation": "Cihaz Onayı",
1462 - "favorite_token": "Favori token",
1463 - "favorite_token_desc": "Favori token'ın bakiyesi bakiye kartında gösterilecektir.",
1464 - "gallery": "Galeri",
1465 - "hww_exit_desc": "Bu, donanım cihazınızla devam eden eşleştirme işlemini sonlandıracaktır",
1466 - "input": "Girdi",
1467 - "manual_input": "Manuel Giriş",
1468 - "networks": "Ağlar",
1469 - "node_share_desc": "Bu düğümü içe aktarmak için bu QR kodunu Tarama ekranından tarayın.",
1470 - "nodes_desc": "Mevcut düğümleri yönetin veya özel bir düğüm ekleyin.",
1471 - "ocp_desc": "Mağazalarda kripto ile ödeme yapın",
1472 - "pairing_code": "Eşleştirme Kodu",
1473 - "pairing_code_desc_1": "Cihazınız bir eşleştirme kodu gösterecektir.",
1474 - "pairing_code_desc_2": "Devam etmek için buraya girin",
1475 - "pairing_error": "Eşleştirme Hatası",
1476 - "passphrase_view_keys": "Parola",
1477 - "payment_invoices": "Ödeme Faturaları",
1478 - "recieving": "Alınıyor",
1479 - "save_contact": "Kişiyi Kaydet",
1480 - "share_this_node": "Bu düğümü paylaş",
1481 - "show_combined_balance": "Birleşik bakiyeyi göster",
1482 - "swipe_to_bridge": "Köprülemek için kaydırın",
1483 - "this_can_take_few_seconds": "Bu birkaç saniye sürebilir",
1484 - "username_check_your_network": "Kullanıcı adı kontrol edilemedi. Lütfen ağ bağlantınızı kontrol edin.",
1485 - "verifying_code": "Kod doğrulanıyor",
1486 - "wallet_balance": "Cüzdan Bakiyesi",
1487 - "wc_action_approve": "Onayla",
1488 - "wc_desc": "DApp'lere kolayca bağlanın",
1489 - "yes_exit": "Evet. Çık"
1490 -}
1472 + "zcash_card_warning": "İşlem tamamlanana kadar uygulamayı kapatmayın; aksi takdirde bu işlemin baştan yeniden başlatılması gerekecektir."
1473 +}
\ No newline at end of file
res/values/strings_uk.arb
+21 -38
@@ -94,6 +94,7 @@
94 "available_balance": "Доступний баланс",
95 "available_balance_description": "«Доступний баланс» або «Підтверджений баланс» — це кошти, які можна витратити негайно. Якщо кошти відображаються в нижньому балансі, але не у верхньому, потрібно зачекати кілька хвилин, доки вхідні кошти отримають більше підтверджень мережі. Після отримання додаткових підтверджень їх можна буде витратити.",
96 "avg_savings": "Сер. заощадження",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Будь ласка, зачекайте, доки dApp завершить обробку.",
99 "awaiting_payment_confirmation": "Очікування підтвердження платежу",
100 "background_sync": "Фонова синхронізація",
@@ -219,6 +220,7 @@
220 "color_theme": "Колірна тема",
221 "coming_soon_tag": "Скоро",
222 "commit_transaction_amount_fee": "Підтвердити транзакцію\nСума: ${amount}\nКомісія: ${fee}",
223 + "compatible_networks": "Сумісні мережі",
224 "compatible_services": "Сумісні сервіси",
225 "compatible_services_desc": "Скористайтеся інструментом сканування, щоб зчитати такі типи QR-кодів, які підтримує Cake Wallet:",
226 "configure": "Налаштувати",
@@ -258,6 +260,7 @@
260 "contact_support": "Звернутися до підтримки",
261 "contacts": "Контакти",
262 "continue_text": "Продовжити",
263 + "continue_to_swap": "Продовжуйте обмінюватися",
264 "contract_address": "Адреса контракту",
265 "contract_warning": "Цю адресу контракту позначено як потенційно шахрайську. Будь ласка, дійте з обережністю.",
266 "contractName": "Назва контракту",
@@ -286,6 +289,7 @@
289 "creation_date": "Дата створення",
290 "crypto_addresses": "Криптоадреси",
291 "csv_nothing_to_export": "Nothing to export",
292 + "current_network": "Поточна мережа",
293 "current_swap": "Поточний своп",
294 "current_wallet": "Поточний гаманець",
295 "custom": "Власний",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Історія Etherscan",
448 "event": "Подія",
449 "events": "Події",
450 + "evm_address_detected": "Виявлено адресу EVM",
451 "evm_ecosystem_description": "За потреби змініть мережу та токен, які ви хочете використовувати для цього платежу.",
452 "exchange": "Обмін",
453 "exchange_extra_info": "Будь ласка, не забудьте вказати Memo або Extra ID під час надсилання цієї транзакції для обміну",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "Усі найновіші моделі (GPT-5.3, Claude 4.6).\nБез підписки, оплата криптовалютою.",
670 "narrow": "Вузький",
671 "network": "Мережа",
672 + "network_address_detected": "Виявлено адресу ${network}",
673 + "network_prefix_on": "на",
674 + "network_switch_failed": "Не вдалося переключитися на потрібну мережу. Платіж не застосовано, спробуйте ще раз.",
675 "networks": "Мережі",
676 "new_first_wallet_text": "Зберігати вашу криптовалюту в безпеці — простіше простого",
677 "new_node_testing": "Тестування нового вузла",
@@ -972,6 +980,7 @@
980 "select_asset": "Виберіть актив",
981 "select_backup_file": "Виберіть файл резервної копії",
982 "select_buy_provider_notice": "Виберіть вище постачальника для купівлі. Ви можете пропустити цей екран, встановивши постачальника для купівлі за замовчуванням у налаштуваннях застосунку.",
983 + "select_compatible_wallet": "Виберіть один із сумісних гаманців",
984 "select_destination": "Будь ласка, виберіть місце призначення для файлу резервної копії.",
985 "select_fiat_currency_title": "Виберіть валюту",
986 "select_hw_account_below": "Будь ласка, виберіть нижче, який обліковий запис відновити:",
@@ -981,6 +990,9 @@
990 "select_network_title": "Виберіть мережу",
991 "select_other_wallet": "Виберіть інший гаманець",
992 "select_receiver": "Виберіть одержувача",
993 + "select_recipient_network": "Виберіть Мережа одержувачів",
994 + "select_recipient_network_description": "Кілька мереж сумісні з наданою адресою одержувача",
995 + "select_recipient_network_for_tx": "Виберіть мережу одержувача цієї транзакції",
996 "select_sell_provider_notice": "Виберіть вище провайдера для продажу. Ви можете пропустити цей екран, встановивши провайдера для продажу за замовчуванням у налаштуваннях застосунку.",
997 "select_token": "Виберіть токен",
998 "select_your_country": "Будь ласка, виберіть свою країну",
@@ -1013,6 +1025,8 @@
1025 "send_templates": "Шаблони",
1026 "send_title": "Надіслати",
1027 "send_to": "Надіслати на",
1028 + "send_to_network": "Надіслати до ${network}",
1029 + "send_to_network_description": "Бажаєте перейти на гаманець ${network} або обміняти кошти ${currentNetwork} на цей платіж?",
1030 "send_to_this_address": "Надіслати ${currency} ${tag}на цю адресу",
1031 "send_xmr": "Надіслати XMR",
1032 "send_your_wallet": "Ваш гаманець",
@@ -1131,6 +1145,8 @@
1145 "support_title_other_links": "Інші посилання підтримки",
1146 "supported": "Підтримується",
1147 "swap": "Обмін",
1148 + "swap_from_network": "Обмін із ${network}",
1149 + "swap_from_network_description": "Щоб надіслати кошти в мережу ${targetNetwork}, вам потрібно буде обміняти кошти ${currentNetwork}. Ви бажаєте продовжити?",
1150 "swap_id": "ID обміну",
1151 "swap_provider_initial_desc": "Виберіть тип провайдера свопу, який ви бажаєте використовувати під час обміну",
1152 "swap_providers": "Провайдери обміну",
@@ -1138,6 +1154,7 @@
1154 "sweeping_wallet_alert": "Це не повинно зайняти багато часу. НЕ ЗАЛИШАЙТЕ ЦЕЙ ЕКРАН, ІНАКШЕ ЗМЕТЕНІ КОШТИ МОЖУТЬ БУТИ ВТРАЧЕНІ.",
1155 "swipe_to_bridge": "Проведіть, щоб перенести між мережами",
1156 "swipe_to_send": "Проведіть, щоб надіслати",
1157 + "switch_to_x_wallet": "Перейдіть на гаманець ${network}",
1158 "switch_wallet": "Перемкнути гаманець",
1159 "switchToETHWallet": "Будь ласка, перемкніться на гаманець Ethereum і спробуйте ще раз",
1160 "switchToWCCompatibleWallet": "Перейдіть на гаманець, сумісний з WalletConnect, і повторіть спробу (${chains}).",
@@ -1304,6 +1321,8 @@
1321 "unspent_coins_details_title": "Деталі невитрачених монет",
1322 "unspent_coins_title": "Невитрачені монети",
1323 "unsupported_asset": "Ми не підтримуємо цю дію для цього активу. Будь ласка, створіть або перемкніться на гаманець підтримуваного типу активів.",
1324 + "unsupported_network_requested": "Цей платіжний запит стосується мережі, яку ми не підтримуємо (ідентифікатор мережі ${chainId}).",
1325 + "unsupported_token_requested": "Цей платіжний запит стосується токена, який ми не змогли ідентифікувати у вибраній мережі.",
1326 "uptime": "Час безвідмовної роботи",
1327 "upto": "до ${value}",
1328 "usb": "USB",
@@ -1451,41 +1470,5 @@
1470 "zcash_card_enable_later": "Ви завжди можете ввімкнути цю картку пізніше в налаштуваннях",
1471 "zcash_card_missing_funds": "Зникли кошти?",
1472 "zcash_card_scan": "Сканувати",
1454 - "zcash_card_warning": "Не закривайте застосунок, доки процедура не завершиться. Якщо ви це зробите, цей процес потрібно буде перезапустити з нуля.",
1455 - "are_you_sure_exit": "Ви впевнені, що хочете вийти?",
1456 - "available": "Доступно",
1457 - "bridging": "Перенесення між мережами",
1458 - "compatible_services": "Сумісні сервіси",
1459 - "compatible_services_desc": "Скористайтеся інструментом сканування, щоб зчитати такі типи QR-кодів, які підтримує Cake Wallet:",
1460 - "crypto_addresses": "Криптоадреси",
1461 - "delete_this_node": "Видалити цей вузол",
1462 - "device_confirmation": "Підтвердження на пристрої",
1463 - "favorite_token": "Улюблений токен",
1464 - "favorite_token_desc": "Баланс улюбленого токена відображатиметься на картці балансу.",
1465 - "gallery": "Галерея",
1466 - "hww_exit_desc": "Це завершить поточний процес сполучення з вашим апаратним пристроєм",
1467 - "input": "Введення",
1468 - "manual_input": "Ручне введення",
1469 - "networks": "Мережі",
1470 - "node_share_desc": "Відскануйте цей QR-код на екрані сканування, щоб імпортувати цей вузол.",
1471 - "nodes_desc": "Керуйте наявними вузлами або додайте власний.",
1472 - "ocp_desc": "Розплачуйтеся криптовалютою в магазинах",
1473 - "pairing_code": "Код сполучення",
1474 - "pairing_code_desc_1": "Ваш пристрій покаже код сполучення.",
1475 - "pairing_code_desc_2": "Введіть його тут, щоб продовжити",
1476 - "pairing_error": "Помилка сполучення",
1477 - "passphrase_view_keys": "Парольна фраза",
1478 - "payment_invoices": "Платіжні інвойси",
1479 - "recieving": "Отримання",
1480 - "save_contact": "Зберегти контакт",
1481 - "share_this_node": "Поділитися цим вузлом",
1482 - "show_combined_balance": "Показати сукупний баланс",
1483 - "swipe_to_bridge": "Проведіть, щоб перенести між мережами",
1484 - "this_can_take_few_seconds": "Це може зайняти кілька секунд",
1485 - "username_check_your_network": "Не вдалося перевірити ім’я користувача. Будь ласка, перевірте підключення до мережі.",
1486 - "verifying_code": "Перевірка коду",
1487 - "wallet_balance": "Баланс гаманця",
1488 - "wc_action_approve": "Схвалити",
1489 - "wc_desc": "Легко підключайтеся до dApp",
1490 - "yes_exit": "Так. Вийти"
1491 -}
1473 + "zcash_card_warning": "Не закривайте застосунок, доки процедура не завершиться. Якщо ви це зробите, цей процес потрібно буде перезапустити з нуля."
1474 +}
\ No newline at end of file
res/values/strings_ur.arb
+21 -38
@@ -94,6 +94,7 @@
94 "available_balance": "دستیاب بیلنس",
95 "available_balance_description": "”دستیاب بیلنس” یا ”تصدیق شدہ بیلنس” وہ فنڈز ہیں جنہیں فوراً خرچ کیا جا سکتا ہے۔ اگر فنڈز نیچے والے بیلنس میں نظر آئیں لیکن اوپر والے بیلنس میں نہیں، تو آپ کو آنے والے فنڈز کے مزید نیٹ ورک کنفرمیشنز حاصل ہونے کے لیے چند منٹ انتظار کرنا ہوگا۔ جب انہیں مزید کنفرمیشنز مل جائیں گی تو وہ خرچ کے قابل ہو جائیں گے۔",
96 "avg_savings": "اوسط بچت",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "براہِ کرم dApp کی پروسیسنگ مکمل ہونے تک انتظار کریں۔",
99 "awaiting_payment_confirmation": "ادائیگی کی تصدیق کا انتظار ہے",
100 "background_sync": "پسِ منظر ہم آہنگی",
@@ -219,6 +220,7 @@
220 "color_theme": "رنگ تھیم",
221 "coming_soon_tag": "جلد آ رہا ہے",
222 "commit_transaction_amount_fee": "لین دین کی تصدیق کریں\nرقم: ${amount}\nفیس: ${fee}",
223 + "compatible_networks": "ہم آہنگ نیٹ ورکس",
224 "compatible_services": "موافق سروسز",
225 "compatible_services_desc": "Cake Wallet پر معاون درج ذیل اقسام کے QR کوڈز پڑھنے کے لیے Scan ٹول استعمال کریں:",
226 "configure": "ترتیب دیں",
@@ -258,6 +260,7 @@
260 "contact_support": "سپورٹ سے رابطہ کریں",
261 "contacts": "رابطے",
262 "continue_text": "جاری رکھیں",
263 + "continue_to_swap": "تبادلہ کرنا جاری رکھیں",
264 "contract_address": "کنٹریکٹ ایڈریس",
265 "contract_warning": "اس کنٹریکٹ ایڈریس کو ممکنہ طور پر فراڈ قرار دیا گیا ہے۔ براہِ کرم احتیاط کے ساتھ آگے بڑھیں۔",
266 "contractName": "معاہدے کا نام",
@@ -286,6 +289,7 @@
289 "creation_date": "تخلیق کی تاریخ",
290 "crypto_addresses": "کرپٹو ایڈریسز",
291 "csv_nothing_to_export": "ایکسپورٹ کرنے کے لیے کچھ نہیں ہے",
292 + "current_network": "موجودہ نیٹ ورک",
293 "current_swap": "موجودہ سواپ",
294 "current_wallet": "موجودہ والیٹ",
295 "custom": "حسبِ ضرورت",
@@ -443,6 +447,7 @@
447 "etherscan_history": "ایتھرسکین کی تاریخ",
448 "event": "ایونٹ",
449 "events": "تقریبات",
450 + "evm_address_detected": "ای وی ایم ایڈریس کا پتہ چلا",
451 "evm_ecosystem_description": "اگر ضروری ہو تو، اس ادائیگی کے لیے آپ جس نیٹ ورک اور ٹوکن کو استعمال کرنا چاہتے ہیں، اس میں ترمیم کریں۔",
452 "exchange": "ایکسچینج",
453 "exchange_extra_info": "براہِ کرم ایکسچینج کے لیے یہ ٹرانزیکشن بھیجتے وقت میمو یا اضافی ID ضرور درج کرنا نہ بھولیں",
@@ -664,6 +669,9 @@
669 "nanogpt_subtitle": "تمام جدید ترین ماڈلز (GPT-5.3، Claude 4.6)۔\nکوئی سبسکرپشن نہیں، کرپٹو کے ساتھ ادائیگی کریں۔",
670 "narrow": "تنگ",
671 "network": "نیٹ ورک",
672 + "network_address_detected": "${network} ایڈریس کا پتہ چلا",
673 + "network_prefix_on": "پر",
674 + "network_switch_failed": "درخواست کردہ نیٹ ورک پر سوئچ کرنے میں ناکام۔ ادائیگی لاگو نہیں ہوئی، براہ کرم دوبارہ کوشش کریں۔",
675 "networks": "نیٹ ورکس",
676 "new_first_wallet_text": "اپنے کرپٹو کو محفوظ رکھنا بہت آسان ہے",
677 "new_node_testing": "نئے نوڈ کی جانچ",
@@ -973,6 +981,7 @@
981 "select_asset": "اثاثہ منتخب کریں۔",
982 "select_backup_file": "بیک اپ فائل منتخب کریں",
983 "select_buy_provider_notice": "اوپر خریداری فراہم کنندہ منتخب کریں۔ آپ ایپ کی ترتیبات میں اپنا ڈیفالٹ خریداری فراہم کنندہ سیٹ کر کے اس اسکرین کو چھوڑ سکتے ہیں۔",
984 + "select_compatible_wallet": "اپنے ہم آہنگ بٹوے میں سے ایک کو منتخب کریں۔",
985 "select_destination": "براہِ کرم بیک اپ فائل کے لیے منزل منتخب کریں۔",
986 "select_fiat_currency_title": "کرنسی کا انتخاب کریں۔",
987 "select_hw_account_below": "براہ کرم نیچے بحال کرنے کے لیے اکاؤنٹ منتخب کریں:",
@@ -982,6 +991,9 @@
991 "select_network_title": "نیٹ ورک کو منتخب کریں۔",
992 "select_other_wallet": "دوسرا والیٹ منتخب کریں",
993 "select_receiver": "وصول کنندہ منتخب کریں",
994 + "select_recipient_network": "وصول کنندہ نیٹ ورک کو منتخب کریں۔",
995 + "select_recipient_network_description": "متعدد نیٹ ورک فراہم کردہ وصول کنندہ کے پتے کے ساتھ مطابقت رکھتے ہیں۔",
996 + "select_recipient_network_for_tx": "اس لین دین کے لیے وصول کنندہ کا نیٹ ورک منتخب کریں۔",
997 "select_sell_provider_notice": "اوپر کسی سیل فراہم کنندہ کو منتخب کریں۔ آپ ایپ کی سیٹنگز میں اپنا ڈیفالٹ سیل فراہم کنندہ سیٹ کر کے اس اسکرین کو چھوڑ سکتے ہیں۔",
998 "select_token": "ٹوکن منتخب کریں",
999 "select_your_country": "براہ کرم اپنا ملک منتخب کریں",
@@ -1014,6 +1026,8 @@
1026 "send_templates": "ٹیمپلیٹس",
1027 "send_title": "بھیجیں",
1028 "send_to": "کو بھیجیں",
1029 + "send_to_network": "${network} کو بھیجیں",
1030 + "send_to_network_description": "کیا آپ اس ادائیگی کے لیے اپنے ${network} والیٹ پر جانا چاہتے ہیں یا اپنے ${currentNetwork} فنڈز کو تبدیل کرنا چاہتے ہیں؟",
1031 "send_to_this_address": "${currency} ${tag}اس پتے پر بھیجیں",
1032 "send_xmr": "XMR بھیجیں",
1033 "send_your_wallet": "آپ کا والیٹ",
@@ -1132,6 +1146,8 @@
1146 "support_title_other_links": "دیگر سپورٹ لنکس",
1147 "supported": "معاونت یافتہ",
1148 "swap": "سویپ",
1149 + "swap_from_network": "${network} سے تبدیل کریں",
1150 + "swap_from_network_description": "${targetNetwork} نیٹ ورک پر فنڈز بھیجنے کے لیے، آپ کو اپنے ${currentNetwork} فنڈز کو تبدیل کرنے کی ضرورت ہوگی۔ کیا آپ آگے بڑھنا چاہتے ہیں؟",
1151 "swap_id": "سواپ آئی ڈی",
1152 "swap_provider_initial_desc": "سواپ کرتے وقت استعمال کے لیے اپنی پسند کے سواپ فراہم کنندہ کی قسم منتخب کریں",
1153 "swap_providers": "سویپ فراہم کنندگان",
@@ -1139,6 +1155,7 @@
1155 "sweeping_wallet_alert": "اس میں زیادہ وقت نہیں لگنا چاہیے۔ اس اسکرین کو مت چھوڑیں، ورنہ سویپ کیے گئے فنڈز ضائع ہو سکتے ہیں۔",
1156 "swipe_to_bridge": "برج کرنے کے لیے سوائپ کریں",
1157 "swipe_to_send": "بھیجنے کے لیے سوائپ کریں",
1158 + "switch_to_x_wallet": "${network} والیٹ پر سوئچ کریں۔",
1159 "switch_wallet": "والیٹ تبدیل کریں",
1160 "switchToETHWallet": "براہِ کرم Ethereum والیٹ پر سوئچ کریں اور دوبارہ کوشش کریں",
1161 "switchToWCCompatibleWallet": "براہ کرم WalletConnect کے موافق والیٹ پر سوئچ کریں اور دوبارہ کوشش کریں (${chains})۔",
@@ -1305,6 +1322,8 @@
1322 "unspent_coins_details_title": "غیر خرچ شدہ کوائنز کی تفصیلات",
1323 "unspent_coins_title": "غیر خرچ شدہ سکے",
1324 "unsupported_asset": "ہم اس اثاثے کے لیے اس کارروائی کی حمایت نہیں کرتے۔ براہِ کرم کسی معاون اثاثہ قسم کا والیٹ بنائیں یا اس پر سوئچ کریں۔",
1325 + "unsupported_network_requested": "یہ ادائیگی کی درخواست ایک ایسے نیٹ ورک کے لیے ہے جسے ہم سپورٹ نہیں کرتے ہیں (چین ID ${chainId})۔",
1326 + "unsupported_token_requested": "یہ ادائیگی کی درخواست ایک ٹوکن کے لیے ہے جسے ہم منتخب نیٹ ورک پر شناخت نہیں کر سکے۔",
1327 "uptime": "اپ ٹائم",
1328 "upto": "${value} تک",
1329 "usb": "USB",
@@ -1452,41 +1471,5 @@
1471 "zcash_card_enable_later": "آپ اس کارڈ کو بعد میں بھی ترتیبات میں فعال کر سکتے ہیں",
1472 "zcash_card_missing_funds": "فنڈز غائب ہیں؟",
1473 "zcash_card_scan": "اسکین کریں",
1455 - "zcash_card_warning": "طریقہ کار مکمل ہونے تک ایپ بند نہ کریں۔ اگر آپ ایسا کریں گے تو یہ عمل شروع سے دوبارہ شروع کرنا پڑے گا۔",
1456 - "are_you_sure_exit": "کیا آپ واقعی باہر جانا چاہتے ہیں؟",
1457 - "available": "دستیاب",
1458 - "bridging": "برجنگ",
1459 - "compatible_services": "موافق سروسز",
1460 - "compatible_services_desc": "Cake Wallet پر معاون درج ذیل اقسام کے QR کوڈز پڑھنے کے لیے Scan ٹول استعمال کریں:",
1461 - "crypto_addresses": "کرپٹو ایڈریسز",
1462 - "delete_this_node": "یہ نوڈ حذف کریں",
1463 - "device_confirmation": "ڈیوائس کی تصدیق",
1464 - "favorite_token": "پسندیدہ ٹوکن",
1465 - "favorite_token_desc": "پسندیدہ ٹوکن کا بیلنس بیلنس کارڈ پر دکھایا جائے گا۔",
1466 - "gallery": "گیلری",
1467 - "hww_exit_desc": "اس سے آپ کے ہارڈ ویئر ڈیوائس کے ساتھ جاری پیئرنگ کا عمل ختم ہو جائے گا",
1468 - "input": "ان پٹ",
1469 - "manual_input": "دستی اندراج",
1470 - "networks": "نیٹ ورکس",
1471 - "node_share_desc": "اس نوڈ کو امپورٹ کرنے کے لیے Scan اسکرین سے یہ QR کوڈ اسکین کریں۔",
1472 - "nodes_desc": "موجودہ نوڈز کا نظم کریں یا ایک کسٹم نوڈ شامل کریں۔",
1473 - "ocp_desc": "اسٹورز میں کرپٹو سے ادائیگی کریں",
1474 - "pairing_code": "پیئرنگ کوڈ",
1475 - "pairing_code_desc_1": "آپ کا ڈیوائس ایک پیئرنگ کوڈ دکھائے گا۔",
1476 - "pairing_code_desc_2": "جاری رکھنے کے لیے یہاں درج کریں",
1477 - "pairing_error": "پیئرنگ کی خرابی",
1478 - "passphrase_view_keys": "پاس فریز",
1479 - "payment_invoices": "ادائیگی کے انوائسز",
1480 - "recieving": "وصولی",
1481 - "save_contact": "رابطہ محفوظ کریں",
1482 - "share_this_node": "یہ نوڈ شیئر کریں",
1483 - "show_combined_balance": "مجموعی بیلنس دکھائیں",
1484 - "swipe_to_bridge": "برج کرنے کے لیے سوائپ کریں",
1485 - "this_can_take_few_seconds": "اس میں چند سیکنڈ لگ سکتے ہیں",
1486 - "username_check_your_network": "صارف نام چیک کرنے سے قاصر۔ براہِ کرم اپنا نیٹ ورک کنکشن چیک کریں۔",
1487 - "verifying_code": "کوڈ کی تصدیق کی جا رہی ہے",
1488 - "wallet_balance": "والیٹ بیلنس",
1489 - "wc_action_approve": "منظور کریں",
1490 - "wc_desc": "DApps سے آسانی سے کنیکٹ کریں",
1491 - "yes_exit": "ہاں۔ باہر جائیں"
1492 -}
1474 + "zcash_card_warning": "طریقہ کار مکمل ہونے تک ایپ بند نہ کریں۔ اگر آپ ایسا کریں گے تو یہ عمل شروع سے دوبارہ شروع کرنا پڑے گا۔"
1475 +}
\ No newline at end of file
res/values/strings_vi.arb
+21 -42
@@ -94,6 +94,7 @@
94 "available_balance": "Số dư khả dụng",
95 "available_balance_description": "“Số dư khả dụng” hoặc “Số dư đã xác nhận” là số tiền có thể chi tiêu ngay lập tức. Nếu tiền xuất hiện ở số dư phía dưới nhưng không xuất hiện ở số dư phía trên, thì bạn phải đợi vài phút để khoản tiền đến có thêm xác nhận từ mạng. Sau khi có thêm xác nhận, chúng sẽ có thể chi tiêu.",
96 "avg_savings": "Tiết kiệm TB",
97 + "avl": "trung bình",
98 "awaitDAppProcessing": "Vui lòng đợi dApp xử lý xong.",
99 "awaiting_payment_confirmation": "Đang chờ xác nhận thanh toán",
100 "background_sync": "Đồng bộ hóa nền",
@@ -219,6 +220,7 @@
220 "color_theme": "Chủ đề màu",
221 "coming_soon_tag": "Sắp ra mắt",
222 "commit_transaction_amount_fee": "Xác nhận giao dịch\nSố tiền: ${amount}\nPhí: ${fee}",
223 + "compatible_networks": "Mạng tương thích",
224 "compatible_services": "Dịch vụ tương thích",
225 "compatible_services_desc": "Sử dụng công cụ Quét để đọc các loại mã QR sau được hỗ trợ trên Cake Wallet:",
226 "configure": "Cấu hình",
@@ -259,6 +261,7 @@
261 "contact_support": "Liên hệ bộ phận hỗ trợ",
262 "contacts": "Danh bạ",
263 "continue_text": "Tiếp tục",
264 + "continue_to_swap": "Tiếp tục trao đổi",
265 "contract_address": "Địa chỉ hợp đồng",
266 "contract_warning": "Địa chỉ hợp đồng này đã bị gắn cờ là có khả năng lừa đảo. Vui lòng thận trọng khi tiếp tục.",
267 "contractName": "Tên hợp đồng",
@@ -287,6 +290,7 @@
290 "creation_date": "Ngày tạo",
291 "crypto_addresses": "Địa chỉ tiền điện tử",
292 "csv_nothing_to_export": "Không có gì để xuất",
293 + "current_network": "Mạng hiện tại",
294 "current_swap": "Hoán đổi hiện tại",
295 "current_wallet": "Ví hiện tại",
296 "custom": "Tùy chỉnh",
@@ -444,6 +448,7 @@
448 "etherscan_history": "Lịch sử Etherscan",
449 "event": "Sự kiện",
450 "events": "Sự kiện",
451 + "evm_address_detected": "Đã phát hiện địa chỉ EVM",
452 "evm_ecosystem_description": "Nếu cần, hãy thay đổi mạng và token bạn muốn sử dụng cho khoản thanh toán này.",
453 "exchange": "Trao đổi",
454 "exchange_extra_info": "Vui lòng đừng quên nhập Memo hoặc Extra ID khi gửi giao dịch này để thực hiện trao đổi",
@@ -665,6 +670,9 @@
670 "nanogpt_subtitle": "Tất cả các mô hình mới nhất (GPT-5.3, Claude 4.6).\nKhông cần đăng ký, thanh toán bằng crypto.",
671 "narrow": "Hẹp",
672 "network": "Mạng",
673 + "network_address_detected": "Đã phát hiện địa chỉ ${network}",
674 + "network_prefix_on": "TRÊN",
675 + "network_switch_failed": "Không thể chuyển sang mạng được yêu cầu. Thanh toán chưa được áp dụng, vui lòng thử lại.",
676 "networks": "Mạng",
677 "new_first_wallet_text": "Giữ tiền điện tử của bạn an toàn dễ như ăn bánh",
678 "new_node_testing": "Thử nghiệm nút mới",
@@ -972,6 +980,7 @@
980 "select_asset": "Chọn tài sản",
981 "select_backup_file": "Chọn tệp sao lưu",
982 "select_buy_provider_notice": "Chọn nhà cung cấp mua ở trên. Bạn có thể bỏ qua màn hình này bằng cách đặt nhà cung cấp mua mặc định trong phần cài đặt ứng dụng.",
983 + "select_compatible_wallet": "Chọn một trong những ví tương thích của bạn",
984 "select_destination": "Vui lòng chọn vị trí lưu tệp sao lưu.",
985 "select_fiat_currency_title": "Chọn tiền tệ",
986 "select_hw_account_below": "Vui lòng chọn tài khoản cần khôi phục bên dưới:",
@@ -981,6 +990,9 @@
990 "select_network_title": "Chọn mạng",
991 "select_other_wallet": "Chọn ví khác",
992 "select_receiver": "Chọn người nhận",
993 + "select_recipient_network": "Chọn mạng người nhận",
994 + "select_recipient_network_description": "Nhiều mạng tương thích với địa chỉ người nhận được cung cấp",
995 + "select_recipient_network_for_tx": "Chọn mạng của Người nhận cho giao dịch này",
996 "select_sell_provider_notice": "Chọn nhà cung cấp bán ở trên. Bạn có thể bỏ qua màn hình này bằng cách đặt nhà cung cấp bán mặc định trong cài đặt ứng dụng.",
997 "select_token": "Chọn token",
998 "select_your_country": "Vui lòng chọn quốc gia của bạn",
@@ -1013,6 +1025,8 @@
1025 "send_templates": "Mẫu",
1026 "send_title": "Gửi",
1027 "send_to": "Gửi đến",
1028 + "send_to_network": "Gửi tới ${network}",
1029 + "send_to_network_description": "Bạn có muốn chuyển sang ví ${network} của mình hoặc đổi số tiền ${currentNetwork} của mình để lấy khoản thanh toán này không?",
1030 "send_to_this_address": "Gửi ${currency} ${tag}tới địa chỉ này",
1031 "send_xmr": "Gửi XMR",
1032 "send_your_wallet": "Ví của bạn",
@@ -1131,6 +1145,8 @@
1145 "support_title_other_links": "Các liên kết hỗ trợ khác",
1146 "supported": "Được hỗ trợ",
1147 "swap": "Hoán đổi",
1148 + "swap_from_network": "Hoán đổi từ ${network}",
1149 + "swap_from_network_description": "Để gửi tiền đến mạng ${targetNetwork}, bạn sẽ cần hoán đổi số tiền ${currentNetwork} của mình. Bạn có muốn tiếp tục không?",
1150 "swap_id": "ID Swap",
1151 "swap_provider_initial_desc": "Chọn loại nhà cung cấp hoán đổi mà bạn muốn sử dụng khi hoán đổi trong ứng dụng",
1152 "swap_providers": "Nhà cung cấp hoán đổi",
@@ -1138,6 +1154,7 @@
1154 "sweeping_wallet_alert": "Việc này sẽ không mất nhiều thời gian. KHÔNG RỜI KHỎI MÀN HÌNH NÀY, NẾU KHÔNG SỐ TIỀN ĐÃ QUÉT CÓ THỂ BỊ MẤT.",
1155 "swipe_to_bridge": "Vuốt để bắc cầu",
1156 "swipe_to_send": "Vuốt để gửi",
1157 + "switch_to_x_wallet": "Chuyển sang Ví ${network}",
1158 "switch_wallet": "Chuyển đổi ví",
1159 "switchToETHWallet": "Vui lòng chuyển sang ví Ethereum và thử lại",
1160 "switchToWCCompatibleWallet": "Vui lòng chuyển sang ví tương thích với WalletConnect và thử lại (${chains}).",
@@ -1304,6 +1321,8 @@
1321 "unspent_coins_details_title": "Chi tiết coin chưa chi tiêu",
1322 "unspent_coins_title": "Các coin chưa sử dụng",
1323 "unsupported_asset": "Chúng tôi không hỗ trợ hành động này cho tài sản này. Vui lòng tạo hoặc chuyển sang ví thuộc loại tài sản được hỗ trợ.",
1324 + "unsupported_network_requested": "Yêu cầu thanh toán này dành cho mạng mà chúng tôi không hỗ trợ (ID chuỗi ${chainId}).",
1325 + "unsupported_token_requested": "Yêu cầu thanh toán này dành cho mã thông báo mà chúng tôi không thể xác định trên mạng đã chọn.",
1326 "uptime": "Thời gian hoạt động",
1327 "upto": "tối đa ${value}",
1328 "usb": "USB",
@@ -1451,45 +1470,5 @@
1470 "zcash_card_enable_later": "Bạn luôn có thể bật thẻ này sau trong phần cài đặt",
1471 "zcash_card_missing_funds": "Thiếu tiền?",
1472 "zcash_card_scan": "Quét",
1454 - "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.",
1455 - "are_you_sure_exit": "Bạn có chắc chắn muốn thoát không?",
1456 - "available": "Khả dụng",
1457 - "bridging": "Đang bắc cầu",
1458 - "choose_a_payment_method": "Chọn phương thức thanh toán",
1459 - "choose_a_provider": "Chọn nhà cung cấp",
1460 - "compatible_services": "Dịch vụ tương thích",
1461 - "compatible_services_desc": "Sử dụng công cụ Quét để đọc các loại mã QR sau được hỗ trợ trên Cake Wallet:",
1462 - "crypto_addresses": "Địa chỉ tiền điện tử",
1463 - "delete_this_node": "Xóa node này",
1464 - "device_confirmation": "Xác nhận trên thiết bị",
1465 - "favorite_token": "Token yêu thích",
1466 - "favorite_token_desc": "Số dư của token yêu thích sẽ hiển thị trên thẻ số dư.",
1467 - "gallery": "Thư viện ảnh",
1468 - "hww_exit_desc": "Thao tác này sẽ kết thúc quá trình ghép nối đang diễn ra với thiết bị phần cứng của bạn",
1469 - "input": "Đầu vào",
1470 - "manual_input": "Nhập thủ công",
1471 - "networks": "Mạng",
1472 - "no_providers_available": "Không có nhà cung cấp nào khả dụng",
1473 - "node_share_desc": "Quét mã QR này từ màn hình Quét để nhập node này.",
1474 - "nodes_desc": "Quản lý các node hiện có hoặc thêm một node tùy chỉnh.",
1475 - "ocp_desc": "Thanh toán bằng tiền điện tử tại cửa hàng",
1476 - "pairing_code": "Mã ghép nối",
1477 - "pairing_code_desc_1": "Thiết bị của bạn sẽ hiển thị một mã ghép nối.",
1478 - "pairing_code_desc_2": "Nhập vào đây để tiếp tục",
1479 - "pairing_error": "Lỗi ghép nối",
1480 - "passphrase_view_keys": "Cụm mật khẩu",
1481 - "payment_invoices": "Hóa đơn thanh toán",
1482 - "recieving": "Đang nhận",
1483 - "save_contact": "Lưu liên hệ",
1484 - "selected_trocador_provider": "nhà cung cấp Trocador đã chọn",
1485 - "share_this_node": "Chia sẻ node này",
1486 - "show_combined_balance": "Hiển thị số dư tổng hợp",
1487 - "swipe_to_bridge": "Vuốt để bắc cầu",
1488 - "this_can_take_few_seconds": "Việc này có thể mất vài giây",
1489 - "username_check_your_network": "Không thể kiểm tra tên người dùng. Vui lòng kiểm tra kết nối mạng của bạn.",
1490 - "verifying_code": "Đang xác minh mã",
1491 - "wallet_balance": "Số dư ví",
1492 - "wc_action_approve": "Phê duyệt",
1493 - "wc_desc": "Dễ dàng kết nối với các dApp",
1494 - "yes_exit": "Có. Thoát"
1495 -}
1473 + "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."
1474 +}
\ No newline at end of file
res/values/strings_yo.arb
+21 -38
@@ -94,6 +94,7 @@
94 "available_balance": "Ìwọ̀ntúnwọ̀nsì tó wà",
95 "available_balance_description": "“Iwọntunwọnsi Wa” tabi “Iwọntunwọnsi Ti a Jẹ́rìí” jẹ́ àwọn owó tí o lè na lẹ́sẹ̀kẹsẹ. Bí àwọn owó bá hàn ní iwọntunwọnsi ìsàlẹ̀ ṣùgbọ́n kì í hàn ní iwọntunwọnsi òkè, nígbà náà o gbọdọ̀ dúró fún ìṣẹ́jú díẹ̀ kí àwọn owó tí ń wọlé lè gba ìjẹ́rìí nẹ́tíwọ́ọ̀kì púpọ̀ síi. Lẹ́yìn tí wọ́n bá ti gba ìjẹ́rìí púpọ̀ síi, o lè na wọ́n.",
96 "avg_savings": "Ìpamọ́ àpapọ̀",
97 + "avl": "Avl",
98 "awaitDAppProcessing": "Jọ̀wọ́, dúró kí dApp parí ìṣiṣẹ́.",
99 "awaiting_payment_confirmation": "Ń dúró de ìmúdájú ìsanwó",
100 "background_sync": "Ìbámuṣiṣẹ́pọ̀ abẹ́lẹ̀",
@@ -219,6 +220,7 @@
220 "color_theme": "Àkòrí àwọ̀",
221 "coming_soon_tag": "N bọ laipẹ",
222 "commit_transaction_amount_fee": "Fọwọ́sí ìdúnàdúrà\nIye: ${amount}\nOwó ìdúnàdúrà: ${fee}",
223 + "compatible_networks": "Awọn nẹtiwọki ibaramu",
224 "compatible_services": "Àwọn Iṣẹ́ Tó Bámu",
225 "compatible_services_desc": "Lo irinṣẹ́ Scan láti ka àwọn irú kóòdù QR wọ̀nyí tí a ṣe àtìlẹ́yìn fún lórí Cake Wallet:",
226 "configure": "Ṣètò",
@@ -258,6 +260,7 @@
260 "contact_support": "Kan si Atilẹ́yìn",
261 "contacts": "Awọn olubasọrọ",
262 "continue_text": "Tẹ̀síwájú",
263 + "continue_to_swap": "Tesiwaju lati Yipada",
264 "contract_address": "Adirẹsi Kọ́ńtrákì",
265 "contract_warning": "A ti samisi adirẹsi adehun yii gẹ́gẹ́ bí ẹni pé ó lè jẹ́ ìtanrànjẹ. Jọwọ tẹ̀síwájú pẹ̀lú ìṣọ́ra.",
266 "contractName": "Orúkọ ìdéhùn",
@@ -286,6 +289,7 @@
289 "creation_date": "Ọjọ́ ìdásílẹ̀",
290 "crypto_addresses": "Àwọn Àdírẹ́sì Crypto",
291 "csv_nothing_to_export": "Kò sí ohunkóhun láti gbé jáde",
292 + "current_network": "Nẹtiwọọki lọwọlọwọ",
293 "current_swap": "Swap lọwọlọwọ",
294 "current_wallet": "Apamọwọ lọwọlọwọ",
295 "custom": "Àdàkọ",
@@ -444,6 +448,7 @@
448 "etherscan_history": "Itan Etherscan",
449 "event": "Ìṣẹ̀lẹ̀",
450 "events": "Awọn iṣẹlẹ",
451 + "evm_address_detected": "Adirẹsi EVM ti rii",
452 "evm_ecosystem_description": "Tí ó bá jẹ́ dandan, yí nẹ́tíwọ́ọ̀kì àti tóókẹ́n tí o fẹ́ lò fún ìsanwó yìí padà.",
453 "exchange": "Paṣipaarọ",
454 "exchange_extra_info": "Jọwọ má ṣe gbàgbé láti sọ Memo tàbí Extra ID nígbà tí o bá ń rán ìdúnàdúrà yìí fún paṣipaarọ",
@@ -665,6 +670,9 @@
670 "nanogpt_subtitle": "Gbogbo àwọn àwòṣe tuntun jùlọ (GPT-5.3, Claude 4.6).\nKò sí ìforúkọsílẹ̀, sanwó pẹ̀lú crypto.",
671 "narrow": "Dín",
672 "network": "Nẹ́tíwọ́ọ̀kì",
673 + "network_address_detected": "A ti rí àdírẹ́sì ${network}",
674 + "network_prefix_on": "lori",
675 + "network_switch_failed": "Kuna lati yipada si nẹtiwọki ti o beere. Owo sisan ko lo, jọwọ gbiyanju lẹẹkansi.",
676 "networks": "Àwọn Nẹ́tíwọ́ọ̀kì",
677 "new_first_wallet_text": "Mímú kíríptò rẹ láàbò rọrùn bíi akara oyinbo",
678 "new_node_testing": "Ìdánwò node tuntun",
@@ -972,6 +980,7 @@
980 "select_asset": "Yan dukia",
981 "select_backup_file": "Yan faili afẹ́yinti",
982 "select_buy_provider_notice": "Yan olupese rira loke. O le foju iboju yii kọja nipa ṣiṣeto olupese rira aiyipada rẹ ninu awọn eto app.",
983 + "select_compatible_wallet": "Yan ọkan ninu awọn apamọwọ ibaramu rẹ",
984 "select_destination": "Jọwọ yan ibi ìpamọ́ fún fáìlì afẹ́yinti.",
985 "select_fiat_currency_title": "Yan Owo",
986 "select_hw_account_below": "Jọwọ yan àkántì tí o fẹ́ mú padà ní isalẹ:",
@@ -981,6 +990,9 @@
990 "select_network_title": "Yan Nẹtiwọọki",
991 "select_other_wallet": "Yan Apamọwọ mìíràn",
992 "select_receiver": "Yan Olùgbà",
993 + "select_recipient_network": "Yan Nẹtiwọọki olugba",
994 + "select_recipient_network_description": "Awọn nẹtiwọki pupọ wa ni ibamu pẹlu adirẹsi olugba ti a pese",
995 + "select_recipient_network_for_tx": "Yan nẹtiwọki ti Olugba si iṣowo yii",
996 "select_sell_provider_notice": "Yan olupese tita kan loke. O le foju iboju yii kọja nipa tito olupese tita aiyipada rẹ ninu awọn eto app.",
997 "select_token": "Yan Tókẹ́n",
998 "select_your_country": "Jọwọ yan orílẹ̀-èdè rẹ",
@@ -1013,6 +1025,8 @@
1025 "send_templates": "Àwọn àdàkọ",
1026 "send_title": "Ránṣẹ́",
1027 "send_to": "Firanṣẹ sí",
1028 + "send_to_network": "Firanṣẹ si ${network}",
1029 + "send_to_network_description": "Ṣe o fẹ yipada si apamọwọ ${network} rẹ tabi paarọ awọn owo ${currentNetwork} rẹ fun sisanwo yii?",
1030 "send_to_this_address": "Fi ${currency} ${tag}ránṣẹ́ sí àdírẹ́sì yìí",
1031 "send_xmr": "Ránṣẹ́ XMR",
1032 "send_your_wallet": "Àpamọ́wọ́ rẹ",
@@ -1131,6 +1145,8 @@
1145 "support_title_other_links": "Awọn ọna asopọ atilẹyin míì",
1146 "supported": "Ti a ṣe atilẹyin",
1147 "swap": "Paṣipaarọ",
1148 + "swap_from_network": "Yipada lati ${network}",
1149 + "swap_from_network_description": "Lati fi owo ranṣẹ si nẹtiwọki ${targetNetwork}, iwọ yoo nilo lati paarọ awọn owo ${currentNetwork} rẹ. Ṣe o fẹ tẹsiwaju?",
1150 "swap_id": "ID Swap",
1151 "swap_provider_initial_desc": "Yan iru olupese swap ti o fẹ́ lò nígbà tí o bá ń swap sínú",
1152 "swap_providers": "Awọn olupese swap",
@@ -1138,6 +1154,7 @@
1154 "sweeping_wallet_alert": "Eyi kò yẹ kí ó pẹ́. MÁ ṢE KÚRÒ LÓRÍ IBÓJÚ YÌÍ TÁBÍ OWÓ TÍ A TI SWEEP LÈ SỌ́NÙ.",
1155 "swipe_to_bridge": "Fà láti so ìjápọ̀",
1156 "swipe_to_send": "Ra lati fi ránṣẹ́",
1157 + "switch_to_x_wallet": "Yipada si ${network} Apamọwọ",
1158 "switch_wallet": "Yí apamọwọ padà",
1159 "switchToETHWallet": "Jọwọ yipada sí apamọwọ Ethereum kí o sì tún gbìyànjú lẹ́ẹ̀kansi",
1160 "switchToWCCompatibleWallet": "Jọwọ yipada si apamọwọ ibaramu WalletConnect ki o tun gbiyanju lẹẹkansi (${chains}).",
@@ -1304,6 +1321,8 @@
1321 "unspent_coins_details_title": "Àlàyé àwọn owó ẹyọ tí a kò tíì ná",
1322 "unspent_coins_title": "Àwọn owó ẹyọ tí a kò tíì na",
1323 "unsupported_asset": "A ko ṣe atilẹyin ìṣe yìí fún dukia yìí. Jọwọ ṣẹda tàbí yípadà sí apamọwọ ti iru dukia tí a ṣe atilẹyin.",
1324 + "unsupported_network_requested": "Ibeere isanwo yii jẹ fun netiwọki ti a ko ṣe atilẹyin (ID pq ${chainId}).",
1325 + "unsupported_token_requested": "Ibeere isanwo yii jẹ fun ami-ami ti a ko le ṣe idanimọ lori nẹtiwọọki ti o yan.",
1326 "uptime": "Akoko tí ó ti ń ṣiṣẹ́",
1327 "upto": "títí dé ${value}",
1328 "usb": "USB",
@@ -1451,41 +1470,5 @@
1470 "zcash_card_enable_later": "O le ma a mu kaadi yii ṣiṣẹ nigbamii ninu awọn eto",
1471 "zcash_card_missing_funds": "Ṣe owó rẹ sọnù?",
1472 "zcash_card_scan": "Ṣàwárí",
1454 - "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ẹ̀.",
1455 - "are_you_sure_exit": "Ṣé ó dá ọ lójú pé o fẹ́ jáde?",
1456 - "available": "Ó wà",
1457 - "bridging": "Ríré ìjápọ̀",
1458 - "compatible_services": "Àwọn Iṣẹ́ Tó Bámu",
1459 - "compatible_services_desc": "Lo irinṣẹ́ Scan láti ka àwọn irú kóòdù QR wọ̀nyí tí a ṣe àtìlẹ́yìn fún lórí Cake Wallet:",
1460 - "crypto_addresses": "Àwọn Àdírẹ́sì Crypto",
1461 - "delete_this_node": "Pa nódù yìí rẹ́",
1462 - "device_confirmation": "Ìjẹ́rìísí Ẹrọ",
1463 - "favorite_token": "Tóókẹ́nì àyànfẹ́",
1464 - "favorite_token_desc": "Ìwọ̀ntúnwọ̀nsì tóókẹ́nì àyànfẹ́ náà yóò hàn lórí kaadi ìwọ̀ntúnwọ̀nsì.",
1465 - "gallery": "Àwòrán-ìkójọ",
1466 - "hww_exit_desc": "Eyi yóò parí ìlànà ìsopọ̀ tí ń lọ lọ́wọ́ pẹ̀lú ẹrọ hardware rẹ",
1467 - "input": "Ìwọlé",
1468 - "manual_input": "Ìwọlé Pẹ̀lú Ọwọ́",
1469 - "networks": "Àwọn Nẹ́tíwọ́ọ̀kì",
1470 - "node_share_desc": "Ṣe àyẹ̀wò kóòdù QR yìí láti ojú Scan láti gbé nódù yìí wọlé.",
1471 - "nodes_desc": "Ṣàkóso àwọn nódù tó wà tẹ́lẹ̀ tàbí ṣàfikún ọ̀kan tí ara rẹ.",
1472 - "ocp_desc": "Sanwó pẹ̀lú crypto ní àwọn ilé ìtajà",
1473 - "pairing_code": "Kóòdù Ìsopọ̀",
1474 - "pairing_code_desc_1": "Ẹrọ rẹ yóò ṣàfihàn kóòdù ìsopọ̀ kan.",
1475 - "pairing_code_desc_2": "Tẹ̀ ẹ́ sílẹ̀ níbí láti tẹ̀síwájú",
1476 - "pairing_error": "Àṣìṣe Ìsopọ̀",
1477 - "passphrase_view_keys": "Gbolóhùn aṣínà",
1478 - "payment_invoices": "Àwọn Ìwé Ìsanwó",
1479 - "recieving": "Gbigba",
1480 - "save_contact": "Fi Olùbáṣepọ̀ Pamọ́",
1481 - "share_this_node": "Pín nódù yìí",
1482 - "show_combined_balance": "Ṣàfihàn ìwọ̀ntúnwọ̀nsì àpapọ̀",
1483 - "swipe_to_bridge": "Fà láti so ìjápọ̀",
1484 - "this_can_take_few_seconds": "Eyi lè gba ìṣẹ́jú-aaya díẹ̀",
1485 - "username_check_your_network": "Kò lè ṣàyẹ̀wò orúkọ olumulo. Jọ̀wọ́ ṣàyẹ̀wò ìsopọ̀ nẹ́tíwọ́ọ̀kì rẹ.",
1486 - "verifying_code": "Ń ṣàyẹ̀wò Kóòdù",
1487 - "wallet_balance": "Ìwọ̀ntúnwọ̀nsì Apamọwọ",
1488 - "wc_action_approve": "Fọwọ́sí",
1489 - "wc_desc": "So pọ̀ mọ́ àwọn DApp ní rọrùn",
1490 - "yes_exit": "Bẹ́ẹ̀ni. Jáde"
1491 -}
1473 + "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ẹ̀."
1474 +}
\ No newline at end of file
res/values/strings_zh.arb
+19
@@ -94,6 +94,7 @@
94 "available_balance": "可用余额",
95 "available_balance_description": "“可用余额”或“确认余额”是指可立即花费的资金。如果资金显示在下方余额中但未显示在上方余额中,则需要等待几分钟,让转入资金获得更多网络确认。获得更多确认后,这些资金即可花费。",
96 "avg_savings": "平均节省",
97 + "avl": "平均",
98 "awaitDAppProcessing": "请稍候,等待 dApp 完成处理。",
99 "awaiting_payment_confirmation": "等待支付确认",
100 "background_sync": "后台同步",
@@ -219,6 +220,7 @@
220 "color_theme": "颜色主题",
221 "coming_soon_tag": "即将推出",
222 "commit_transaction_amount_fee": "提交交易\n金额:${amount}\n手续费:${fee}",
223 + "compatible_networks": "兼容网络",
224 "compatible_services": "兼容的服务",
225 "compatible_services_desc": "使用扫描工具读取 Cake Wallet 支持的以下类型二维码:",
226 "configure": "配置",
@@ -258,6 +260,7 @@
260 "contact_support": "联系支持团队",
261 "contacts": "联系人",
262 "continue_text": "继续",
263 + "continue_to_swap": "继续交换",
264 "contract_address": "合约地址",
265 "contract_warning": "该合约地址已被标记为可能存在欺诈风险。请谨慎操作。",
266 "contractName": "合约名称",
@@ -286,6 +289,7 @@
289 "creation_date": "创建日期",
290 "crypto_addresses": "加密货币地址",
291 "csv_nothing_to_export": "无可导出的内容",
292 + "current_network": "当前网络",
293 "current_swap": "当前兑换",
294 "current_wallet": "当前钱包",
295 "custom": "自定义",
@@ -443,6 +447,7 @@
447 "etherscan_history": "Etherscan 历史记录",
448 "event": "事件",
449 "events": "事件",
450 + "evm_address_detected": "检测到 EVM 地址",
451 "evm_ecosystem_description": "如有需要,请修改您要用于此付款的网络和代币。",
452 "exchange": "兑换",
453 "exchange_extra_info": "为兑换发送此交易时,请不要忘记填写 Memo 或 Extra ID",
@@ -665,6 +670,9 @@
670 "nanogpt_subtitle": "所有最新模型(GPT-5.3、Claude 4.6)。\n无需订阅,用加密货币支付。",
671 "narrow": "窄",
672 "network": "网络",
673 + "network_address_detected": "检测到 ${network} 地址",
674 + "network_prefix_on": "在",
675 + "network_switch_failed": "无法切换到请求的网络。付款未成功,请重试。",
676 "networks": "网络",
677 "new_first_wallet_text": "让您的加密货币安全无忧,轻而易举",
678 "new_node_testing": "新节点测试",
@@ -972,6 +980,7 @@
980 "select_asset": "选择资产",
981 "select_backup_file": "选择备份文件",
982 "select_buy_provider_notice": "请在上方选择一个买入服务提供商。您可以在应用设置中设置默认买入服务提供商,以跳过此屏幕。",
983 + "select_compatible_wallet": "选择您的兼容钱包之一",
984 "select_destination": "请选择备份文件的保存位置。",
985 "select_fiat_currency_title": "选择货币",
986 "select_hw_account_below": "请在下方选择要恢复的账户:",
@@ -981,6 +990,9 @@
990 "select_network_title": "选择网络",
991 "select_other_wallet": "选择其他钱包",
992 "select_receiver": "选择收款方",
993 + "select_recipient_network": "选择收件人网络",
994 + "select_recipient_network_description": "多个网络与提供的收件人地址兼容",
995 + "select_recipient_network_for_tx": "选择此交易的接收方网络",
996 "select_sell_provider_notice": "请选择上方的出售服务提供商。您可以在应用设置中设置默认的出售服务提供商,以跳过此屏幕。",
997 "select_token": "选择代币",
998 "select_your_country": "请选择您的国家",
@@ -1013,6 +1025,8 @@
1025 "send_templates": "模板",
1026 "send_title": "发送",
1027 "send_to": "发送至",
1028 + "send_to_network": "发送至${network}",
1029 + "send_to_network_description": "您想切换到您的 ${network} 钱包或用您的 ${currentNetwork} 资金来支付这笔付款吗?",
1030 "send_to_this_address": "将 ${currency} ${tag}发送到此地址",
1031 "send_xmr": "发送 XMR",
1032 "send_your_wallet": "你的钱包",
@@ -1131,6 +1145,8 @@
1145 "support_title_other_links": "其他支持链接",
1146 "supported": "支持的",
1147 "swap": "兑换",
1148 + "swap_from_network": "从 ${network} 进行交换",
1149 + "swap_from_network_description": "要将资金发送到 ${targetNetwork} 网络,您需要交换您的 ${currentNetwork} 资金。您想继续吗?",
1150 "swap_id": "兑换 ID",
1151 "swap_provider_initial_desc": "选择您在换入时偏好使用的兑换服务提供商类型",
1152 "swap_providers": "兑换服务提供商",
@@ -1138,6 +1154,7 @@
1154 "sweeping_wallet_alert": "这应该不会花很长时间。请勿离开此屏幕,否则被归集的资金可能会丢失。",
1155 "swipe_to_bridge": "滑动以跨链桥接",
1156 "swipe_to_send": "滑动以发送",
1157 + "switch_to_x_wallet": "切换到${network}钱包",
1158 "switch_wallet": "切换钱包",
1159 "switchToETHWallet": "请切换到以太坊钱包后重试",
1160 "switchToWCCompatibleWallet": "请切换到兼容 WalletConnect 的钱包后重试 (${chains})。",
@@ -1304,6 +1321,8 @@
1321 "unspent_coins_details_title": "未花费币详情",
1322 "unspent_coins_title": "未花费币",
1323 "unsupported_asset": "我们不支持对该资产执行此操作。请创建或切换到受支持的资产类型的钱包。",
1324 + "unsupported_network_requested": "此付款请求适用于我们不支持的网络(链 ID ${chainId})。",
1325 + "unsupported_token_requested": "此付款请求针对我们无法在所选网络上识别的令牌。",
1326 "uptime": "正常运行时间",
1327 "upto": "最高可达 ${value}",
1328 "usb": "USB",
test/core/universal_address_detector_test.dart
+84
@@ -269,5 +269,89 @@ void main() {
269 expect(result.errorMessage, 'Unable to detect valid cryptocurrency address');
270 });
271 });
272 +
273 + group("EVM chainId URI Detection", () {
274 + const recipient = "0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6";
275 + const contract = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
276 +
277 + test("detects the polygon network from an ERC-681 chainId", () {
278 + const uri = "ethereum:$recipient@137?value=1.0e18";
279 + final result = UniversalAddressDetector.detectAddress(uri);
280 +
281 + expect(result.isValid, true);
282 + expect(result.detectedWalletType, WalletType.polygon);
283 + expect(result.chainId, 137);
284 + expect(result.address, recipient);
285 + expect(result.amount, "1");
286 + });
287 +
288 + test("detects the base network from an ERC-681 chainId", () {
289 + const uri = "ethereum:$recipient@8453";
290 + final result = UniversalAddressDetector.detectAddress(uri);
291 +
292 + expect(result.isValid, true);
293 + expect(result.detectedWalletType, WalletType.base);
294 + expect(result.chainId, 8453);
295 + expect(result.address, recipient);
296 + });
297 +
298 + test("extracts the recipient from an ERC-681 token transfer URI", () {
299 + const uri = "ethereum:$contract@1/transfer?address=$recipient&uint256=1000000";
300 + final result = UniversalAddressDetector.detectAddress(uri);
301 +
302 + expect(result.isValid, true);
303 + expect(result.detectedWalletType, WalletType.ethereum);
304 + expect(result.chainId, 1);
305 + expect(result.address, recipient);
306 + });
307 +
308 + test("preserves an unsupported chainId so routing can reject it", () {
309 + const uri = "ethereum:$recipient@999999";
310 + final result = UniversalAddressDetector.detectAddress(uri);
311 +
312 + expect(result.isValid, true);
313 + expect(result.detectedWalletType, WalletType.ethereum);
314 + expect(result.chainId, 999999);
315 + expect(result.address, recipient);
316 + });
317 + });
318 +
319 + group("Token URI Detection", () {
320 + test("detects a Solana pay URI with an spl-token param", () {
321 + const address = "4Nd1mYvNQyJ8BDVXLgkvSGpVdQMZ3hxwVFkfwXNq6Wgk";
322 + const uri =
323 + "solana:$address?amount=1.5&spl-token=Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB";
324 + final result = UniversalAddressDetector.detectAddress(uri);
325 +
326 + expect(result.isValid, true);
327 + expect(result.detectedCurrency, CryptoCurrency.sol);
328 + expect(result.detectedWalletType, WalletType.solana);
329 + expect(result.address, address);
330 + expect(result.amount, "1.5");
331 + });
332 +
333 + test("detects a Tron URI with a token param", () {
334 + const address = "TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL";
335 + const uri = "tron:$address?amount=2&token=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
336 + final result = UniversalAddressDetector.detectAddress(uri);
337 +
338 + expect(result.isValid, true);
339 + expect(result.detectedCurrency, CryptoCurrency.trx);
340 + expect(result.detectedWalletType, WalletType.tron);
341 + expect(result.address, address);
342 + expect(result.amount, "2");
343 + });
344 +
345 + test("detects a bare Solana URI without params", () {
346 + const address = "4Nd1mYvNQyJ8BDVXLgkvSGpVdQMZ3hxwVFkfwXNq6Wgk";
347 + const uri = "solana:$address";
348 + final result = UniversalAddressDetector.detectAddress(uri);
349 +
350 + expect(result.isValid, true);
351 + expect(result.detectedWalletType, WalletType.solana);
352 + expect(result.address, address);
353 + expect(result.amount, "");
354 + });
355 + });
356 });
357 }
test/utils/payment_request_test.dart
+61 -8
@@ -1,16 +1,18 @@
1 -import 'package:cake_wallet/utils/payment_request.dart';
2 -import 'package:flutter_test/flutter_test.dart';
1 +import "package:cake_wallet/utils/payment_request.dart";
2 +import "package:cw_core/erc20_token.dart";
3 +import "package:flutter_test/flutter_test.dart";
4
5 void main() {
5 - group('PaymentRequest', () {
6 - group('Ethereum URIs', () {
7 - test("extract address and amount from EIP681 Uri with contract", () {
6 + group("PaymentRequest", () {
7 + group("Ethereum URIs", () {
8 + test("extract address and raw token amount from EIP681 Uri with contract", () {
9 final uri = Uri.parse(
10 "ethereum:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174@1/transfer?address=0xCfc1650da7C961FD82998e7e30ca5f699D0aBf41&uint256=2000000000000000000");
11 final paymentRequest = PaymentRequest.fromUri(uri);
12
13 expect(paymentRequest.address, "0xCfc1650da7C961FD82998e7e30ca5f699D0aBf41");
13 - expect(paymentRequest.amount, "2");
14 + expect(paymentRequest.amount, "");
15 + expect(paymentRequest.rawTokenAmount, "2000000000000000000");
16 });
17
18 test("extract address and amount from EIP681 Uri", () {
@@ -39,13 +41,14 @@ void main() {
41 expect(paymentRequest.amount, "");
42 });
43
42 - test("extract address and amount from EIP681 Uri with contract and no chainId", () {
44 + test("extract address and raw token amount from EIP681 Uri with contract and no chainId", () {
45 final uri = Uri.parse(
46 "ethereum:0x1234567890abcdef1234567890abcdef12345678/transfer?address=0xabcdef1234567890abcdef1234567890abcdef12&uint256=1000000000000000000");
47 final paymentRequest = PaymentRequest.fromUri(uri);
48
49 expect(paymentRequest.address, "0xabcdef1234567890abcdef1234567890abcdef12");
48 - expect(paymentRequest.amount, "1");
50 + expect(paymentRequest.amount, "");
51 + expect(paymentRequest.rawTokenAmount, "1000000000000000000");
52 });
53
54 test("extract address from minimal EIP681 Uri", () {
@@ -56,5 +59,55 @@ void main() {
59 expect(paymentRequest.amount, "");
60 });
61 });
62 +
63 + group("resolveTokenAmount", () {
64 + final usdt = Erc20Token(
65 + name: "Tether",
66 + symbol: "USDT",
67 + contractAddress: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
68 + decimal: 6,
69 + );
70 + final dai = Erc20Token(
71 + name: "Dai",
72 + symbol: "DAI",
73 + contractAddress: "0x6B175474E89094C44Da98b954EedeAC495271d0F",
74 + decimal: 18,
75 + );
76 +
77 + test("converts the raw uint256 using the token decimals", () {
78 + final uri = Uri.parse(
79 + "ethereum:0xdAC17F958D2ee523a2206206994597C13D831ec7@1/transfer?address=0xCfc1650da7C961FD82998e7e30ca5f699D0aBf41&uint256=1000000");
80 + final paymentRequest = PaymentRequest.fromUri(uri);
81 +
82 + expect(paymentRequest.resolveTokenAmount(usdt), "1");
83 + });
84 +
85 + test("converts an 18 decimal raw amount unchanged", () {
86 + final paymentRequest =
87 + PaymentRequest("addr", "", "", "ethereum", null, rawTokenAmount: "1500000000000000000");
88 +
89 + expect(paymentRequest.resolveTokenAmount(dai), "1.5");
90 + });
91 +
92 + test("falls back to the legacy 18 decimal reading for implausibly large amounts", () {
93 + final paymentRequest = PaymentRequest("addr", "", "", "ethereum", null,
94 + rawTokenAmount: "50000000000000000000");
95 +
96 + expect(paymentRequest.resolveTokenAmount(usdt), "50");
97 + });
98 +
99 + test("prefers the decimal amount over the raw token amount", () {
100 + final paymentRequest =
101 + PaymentRequest("addr", "2.5", "", "ethereum", null, rawTokenAmount: "1000000");
102 +
103 + expect(paymentRequest.resolveTokenAmount(usdt), "2.5");
104 + });
105 +
106 + test("returns null when there is no amount at all", () {
107 + final paymentRequest = PaymentRequest("addr", "", "", "ethereum", null);
108 +
109 + expect(paymentRequest.resolveTokenAmount(usdt), null);
110 + });
111 + });
112 });
113 }
test/utils/token_utilities_test.dart new
+84
@@ -0,0 +1,84 @@
1 +import "package:cake_wallet/utils/token_utilities.dart";
2 +import "package:cw_core/crypto_currency.dart";
3 +import "package:cw_core/erc20_token.dart";
4 +import "package:cw_core/spl_token.dart";
5 +import "package:cw_core/tron_token.dart";
6 +import "package:flutter_test/flutter_test.dart";
7 +
8 +void main() {
9 + group("TokenUtilities", () {
10 + group("findTronTokenContract", () {
11 + test("returns the contract from a TronToken instance", () {
12 + final token = TronToken(
13 + name: "Test Token",
14 + symbol: "TST",
15 + contractAddress: "TContractAddress123",
16 + decimal: 6,
17 + );
18 +
19 + expect(TokenUtilities.findTronTokenContract(token), "TContractAddress123");
20 + });
21 +
22 + test("resolves a bare currency from the default token list", () {
23 + expect(
24 + TokenUtilities.findTronTokenContract(CryptoCurrency.usdttrc20),
25 + "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
26 + );
27 + });
28 +
29 + test("returns null for native TRX", () {
30 + expect(TokenUtilities.findTronTokenContract(CryptoCurrency.trx), null);
31 + });
32 +
33 + test("does not resolve a token from another network", () {
34 + expect(TokenUtilities.findTronTokenContract(CryptoCurrency.usdtSol), null);
35 + });
36 + });
37 +
38 + group("findSolanaTokenMint", () {
39 + test("returns the mint from an SPLToken instance", () {
40 + final token = SPLToken(
41 + name: "Test Token",
42 + symbol: "TST",
43 + mintAddress: "MintAddress123",
44 + decimal: 6,
45 + mint: "tst",
46 + );
47 +
48 + expect(TokenUtilities.findSolanaTokenMint(token), "MintAddress123");
49 + });
50 +
51 + test("resolves a bare currency from the default token list", () {
52 + expect(
53 + TokenUtilities.findSolanaTokenMint(CryptoCurrency.usdtSol),
54 + "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
55 + );
56 + });
57 +
58 + test("returns null for native SOL", () {
59 + expect(TokenUtilities.findSolanaTokenMint(CryptoCurrency.sol), null);
60 + });
61 +
62 + test("does not resolve a token from another network", () {
63 + expect(TokenUtilities.findSolanaTokenMint(CryptoCurrency.usdttrc20), null);
64 + });
65 + });
66 +
67 + group("findErc20TokenForSwap", () {
68 + test("returns the same instance for an Erc20Token", () {
69 + final token = Erc20Token(
70 + name: "Test Token",
71 + symbol: "TST",
72 + contractAddress: "0x0000000000000000000000000000000000000001",
73 + decimal: 18,
74 + );
75 +
76 + expect(TokenUtilities.findErc20TokenForSwap(token), same(token));
77 + });
78 +
79 + test("returns null for native ETH", () {
80 + expect(TokenUtilities.findErc20TokenForSwap(CryptoCurrency.eth), null);
81 + });
82 + });
83 + });
84 +}